webcit_before_automake is now the trunk
authorArt Cancro <ajc@citadel.org>
Tue, 2 May 2006 14:36:00 +0000 (14:36 +0000)
committerArt Cancro <ajc@citadel.org>
Tue, 2 May 2006 14:36:00 +0000 (14:36 +0000)
1249 files changed:
webcit/.cvsignore [new file with mode: 0644]
webcit/COPYING.txt [new file with mode: 0644]
webcit/Doxyfile [new file with mode: 0644]
webcit/Makefile.in [new file with mode: 0644]
webcit/README.txt [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/bootstrap [new file with mode: 0755]
webcit/buildpackages [new file with mode: 0755]
webcit/calendar.c [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.h [new file with mode: 0644]
webcit/config.rpath [new file with mode: 0755]
webcit/config.sub [new file with mode: 0755]
webcit/configure.in [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/debian/README.Debian [new file with mode: 0644]
webcit/debian/changelog [new file with mode: 0644]
webcit/debian/citadel-webcit-apache.config [new file with mode: 0644]
webcit/debian/citadel-webcit-apache.postinst [new file with mode: 0644]
webcit/debian/citadel-webcit-apache.postrm [new file with mode: 0644]
webcit/debian/citadel-webcit-apache.postrm.debhelper [new file with mode: 0644]
webcit/debian/citadel-webcit-apache.substvars [new file with mode: 0644]
webcit/debian/citadel-webcit-apache.templates [new file with mode: 0644]
webcit/debian/citadel-webcit.config [new file with mode: 0755]
webcit/debian/citadel-webcit.postinst [new file with mode: 0644]
webcit/debian/citadel-webcit.postrm [new file with mode: 0644]
webcit/debian/citadel-webcit.postrm.debhelper [new file with mode: 0644]
webcit/debian/citadel-webcit.substvars [new file with mode: 0644]
webcit/debian/citadel-webcit.templates [new file with mode: 0644]
webcit/debian/compat [new file with mode: 0644]
webcit/debian/control [new file with mode: 0644]
webcit/debian/copyright [new file with mode: 0644]
webcit/debian/dirs [new file with mode: 0644]
webcit/debian/docs [new file with mode: 0644]
webcit/debian/rules [new file with mode: 0755]
webcit/debian/webcit.substvars [new file with mode: 0644]
webcit/doxygen_groups.c [new file with mode: 0644]
webcit/event.c [new file with mode: 0644]
webcit/floors.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/groupdav.h [new file with mode: 0644]
webcit/groupdav_delete.c [new file with mode: 0644]
webcit/groupdav_get.c [new file with mode: 0644]
webcit/groupdav_main.c [new file with mode: 0644]
webcit/groupdav_options.c [new file with mode: 0644]
webcit/groupdav_propfind.c [new file with mode: 0644]
webcit/groupdav_put.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/iconbar.c [new file with mode: 0644]
webcit/inetconf.c [new file with mode: 0644]
webcit/install-sh [new file with mode: 0755]
webcit/listsub.c [new file with mode: 0644]
webcit/locate_host.c [new file with mode: 0644]
webcit/mainmenu.c [new file with mode: 0644]
webcit/messages.c [new file with mode: 0644]
webcit/mime_parser.c [new file with mode: 0644]
webcit/mime_parser.h [new file with mode: 0644]
webcit/missing [new file with mode: 0755]
webcit/mkinstalldirs [new file with mode: 0755]
webcit/netconf.c [new file with mode: 0644]
webcit/notes.c [new file with mode: 0644]
webcit/packageversion [new file with mode: 0644]
webcit/paging.c [new file with mode: 0644]
webcit/po/Makefile.in [new file with mode: 0644]
webcit/po/create-pot.sh [new file with mode: 0644]
webcit/po/de.po [new file with mode: 0644]
webcit/po/en_GB.po [new file with mode: 0644]
webcit/po/es.po [new file with mode: 0644]
webcit/po/it.po [new file with mode: 0644]
webcit/po/webcit.pot [new file with mode: 0644]
webcit/preferences.c [new file with mode: 0644]
webcit/roomops.c [new file with mode: 0644]
webcit/rss.c [new file with mode: 0644]
webcit/serv_func.c [new file with mode: 0644]
webcit/setup.c [new file with mode: 0644]
webcit/setup_wizard.c [new file with mode: 0644]
webcit/siteconfig.c [new file with mode: 0644]
webcit/snprintf.c [new file with mode: 0644]
webcit/static/BubbleTooltips.js [new file with mode: 0644]
webcit/static/activeuser_24x.gif [new file with mode: 0644]
webcit/static/addevent_24x.gif [new file with mode: 0644]
webcit/static/addnewcontact_24x.gif [new file with mode: 0644]
webcit/static/advanpage2_32x.gif [new file with mode: 0644]
webcit/static/advanpage2_48x.gif [new file with mode: 0644]
webcit/static/beginbox.html [new file with mode: 0644]
webcit/static/beginbox_nt.html [new file with mode: 0644]
webcit/static/bgcolor.gif [new file with mode: 0644]
webcit/static/blackdot.gif [new file with mode: 0644]
webcit/static/blank.gif [new file with mode: 0644]
webcit/static/body-background.gif [new file with mode: 0644]
webcit/static/bold.gif [new file with mode: 0644]
webcit/static/bt.css [new file with mode: 0644]
webcit/static/bt.gif [new file with mode: 0644]
webcit/static/calarea_16x.gif [new file with mode: 0644]
webcit/static/calarea_32x.gif [new file with mode: 0644]
webcit/static/calarea_48x.gif [new file with mode: 0644]
webcit/static/centre.gif [new file with mode: 0644]
webcit/static/chatframeset.html [new file with mode: 0644]
webcit/static/chatrooms_16x.gif [new file with mode: 0644]
webcit/static/chatrooms_32x.gif [new file with mode: 0644]
webcit/static/chatrooms_48x.gif [new file with mode: 0644]
webcit/static/citadel-logo.gif [new file with mode: 0644]
webcit/static/citadelchat_16x.gif [new file with mode: 0644]
webcit/static/citadelchat_24x.gif [new file with mode: 0644]
webcit/static/citadelchat_32x.gif [new file with mode: 0644]
webcit/static/citadelchat_48x.gif [new file with mode: 0644]
webcit/static/controls.js [new file with mode: 0644]
webcit/static/copy.gif [new file with mode: 0644]
webcit/static/cut.gif [new file with mode: 0644]
webcit/static/diskette_24x.gif [new file with mode: 0644]
webcit/static/down_pointer.gif [new file with mode: 0644]
webcit/static/dragdrop.js [new file with mode: 0644]
webcit/static/effects.js [new file with mode: 0644]
webcit/static/empty.html [new file with mode: 0644]
webcit/static/endbox.html [new file with mode: 0644]
webcit/static/enternewnote_24x.gif [new file with mode: 0644]
webcit/static/error.gif [new file with mode: 0644]
webcit/static/favicon.ico [new file with mode: 0644]
webcit/static/folder_closed.gif [new file with mode: 0644]
webcit/static/folder_open.gif [new file with mode: 0644]
webcit/static/head.html [new file with mode: 0644]
webcit/static/hr.gif [new file with mode: 0644]
webcit/static/hyperlink.gif [new file with mode: 0644]
webcit/static/image.gif [new file with mode: 0644]
webcit/static/inactiveuser_24x.gif [new file with mode: 0644]
webcit/static/indent.gif [new file with mode: 0644]
webcit/static/instant_messenger.html [new file with mode: 0644]
webcit/static/italic.gif [new file with mode: 0644]
webcit/static/justifyfull.gif [new file with mode: 0644]
webcit/static/lastnode.gif [new file with mode: 0644]
webcit/static/left_just.gif [new file with mode: 0644]
webcit/static/line.gif [new file with mode: 0644]
webcit/static/list.gif [new file with mode: 0644]
webcit/static/login.html [new file with mode: 0644]
webcit/static/logoff_32x.gif [new file with mode: 0644]
webcit/static/markngo_24x.gif [new file with mode: 0644]
webcit/static/menubar.html [new file with mode: 0644]
webcit/static/minus.gif [new file with mode: 0644]
webcit/static/minus_last.gif [new file with mode: 0644]
webcit/static/minus_last_no_root.gif [new file with mode: 0644]
webcit/static/minus_no_root.gif [new file with mode: 0644]
webcit/static/minus_nolines.gif [new file with mode: 0644]
webcit/static/monthview2_24x.gif [new file with mode: 0644]
webcit/static/nanotree.js [new file with mode: 0644]
webcit/static/newmess2_24x.gif [new file with mode: 0644]
webcit/static/newmess3_24x.gif [new file with mode: 0644]
webcit/static/newstartpage.html [new file with mode: 0644]
webcit/static/nextdate_32x.gif [new file with mode: 0644]
webcit/static/niftyCorners.css [new file with mode: 0644]
webcit/static/niftycube.js [new file with mode: 0644]
webcit/static/nocookies.html [new file with mode: 0644]
webcit/static/numbered_list.gif [new file with mode: 0644]
webcit/static/outdent.gif [new file with mode: 0644]
webcit/static/page.gif [new file with mode: 0644]
webcit/static/page16x16.gif [new file with mode: 0644]
webcit/static/palette.htm [new file with mode: 0644]
webcit/static/paste.gif [new file with mode: 0644]
webcit/static/plus.gif [new file with mode: 0644]
webcit/static/plus_last.gif [new file with mode: 0644]
webcit/static/plus_last_no_root.gif [new file with mode: 0644]
webcit/static/plus_no_root.gif [new file with mode: 0644]
webcit/static/plus_nolines.gif [new file with mode: 0644]
webcit/static/prevdate_32x.gif [new file with mode: 0644]
webcit/static/privatemess_16x.gif [new file with mode: 0644]
webcit/static/privatemess_32x.gif [new file with mode: 0644]
webcit/static/privatemess_48x.gif [new file with mode: 0644]
webcit/static/prototype.js [new file with mode: 0644]
webcit/static/readallmess3_24x.gif [new file with mode: 0644]
webcit/static/redo.gif [new file with mode: 0644]
webcit/static/right_just.gif [new file with mode: 0644]
webcit/static/robots.txt [new file with mode: 0644]
webcit/static/roombanner.html [new file with mode: 0644]
webcit/static/rte.css [new file with mode: 0644]
webcit/static/savecontact_16x.gif [new file with mode: 0644]
webcit/static/savecontact_32x.gif [new file with mode: 0644]
webcit/static/savecontact_48x.gif [new file with mode: 0644]
webcit/static/scriptaculous.js [new file with mode: 0644]
webcit/static/skipthisroom_24x.gif [new file with mode: 0644]
webcit/static/sort_none.gif [new file with mode: 0644]
webcit/static/spellcheck.gif [new file with mode: 0644]
webcit/static/square.gif [new file with mode: 0644]
webcit/static/storenotes_16x.gif [new file with mode: 0644]
webcit/static/storenotes_32x.gif [new file with mode: 0644]
webcit/static/storenotes_48x.gif [new file with mode: 0644]
webcit/static/summscreen_32x.gif [new file with mode: 0644]
webcit/static/summscreen_48x.gif [new file with mode: 0644]
webcit/static/t.gif [new file with mode: 0644]
webcit/static/t_no_root.gif [new file with mode: 0644]
webcit/static/taskday2_24x.gif [new file with mode: 0644]
webcit/static/taskmanag_16x.gif [new file with mode: 0644]
webcit/static/taskmanag_24x.gif [new file with mode: 0644]
webcit/static/taskmanag_32x.gif [new file with mode: 0644]
webcit/static/taskmanag_48x.gif [new file with mode: 0644]
webcit/static/textcolor.gif [new file with mode: 0644]
webcit/static/trailing.html [new file with mode: 0644]
webcit/static/underline.gif [new file with mode: 0644]
webcit/static/undo.gif [new file with mode: 0644]
webcit/static/ungoto2_24x.gif [new file with mode: 0644]
webcit/static/unittest.js [new file with mode: 0644]
webcit/static/up_pointer.gif [new file with mode: 0644]
webcit/static/usermanag_32x.gif [new file with mode: 0644]
webcit/static/usermanag_48x.gif [new file with mode: 0644]
webcit/static/util.js [new file with mode: 0644]
webcit/static/viewcontacts_16x.gif [new file with mode: 0644]
webcit/static/viewcontacts_24x.gif [new file with mode: 0644]
webcit/static/viewcontacts_32x.gif [new file with mode: 0644]
webcit/static/viewcontacts_48x.gif [new file with mode: 0644]
webcit/static/viewnotes_24x.gif [new file with mode: 0644]
webcit/static/wclib.js [new file with mode: 0644]
webcit/static/webcit-tinymce.css [new file with mode: 0644]
webcit/static/webcit.css [new file with mode: 0644]
webcit/static/week_view.gif [new file with mode: 0644]
webcit/static/white.gif [new file with mode: 0644]
webcit/static/xml_button.gif [new file with mode: 0644]
webcit/static/year_view.gif [new file with mode: 0644]
webcit/subst.c [new file with mode: 0644]
webcit/summary.c [new file with mode: 0644]
webcit/sysmsgs.c [new file with mode: 0644]
webcit/tabs.c [new file with mode: 0644]
webcit/tcp_sockets.c [new file with mode: 0644]
webcit/tiny_mce/blank.htm [new file with mode: 0644]
webcit/tiny_mce/langs/ar.js [new file with mode: 0644]
webcit/tiny_mce/langs/ca.js [new file with mode: 0644]
webcit/tiny_mce/langs/cs.js [new file with mode: 0644]
webcit/tiny_mce/langs/cy.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/fa.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/fr_ca.js [new file with mode: 0644]
webcit/tiny_mce/langs/he.js [new file with mode: 0644]
webcit/tiny_mce/langs/hu.js [new file with mode: 0644]
webcit/tiny_mce/langs/is.js [new file with mode: 0644]
webcit/tiny_mce/langs/it.js [new file with mode: 0644]
webcit/tiny_mce/langs/ja.js [new file with mode: 0644]
webcit/tiny_mce/langs/ko.js [new file with mode: 0644]
webcit/tiny_mce/langs/nb.js [new file with mode: 0644]
webcit/tiny_mce/langs/nl.js [new file with mode: 0644]
webcit/tiny_mce/langs/nn.js [new file with mode: 0644]
webcit/tiny_mce/langs/pl.js [new file with mode: 0644]
webcit/tiny_mce/langs/pt.js [new file with mode: 0644]
webcit/tiny_mce/langs/pt_br.js [new file with mode: 0644]
webcit/tiny_mce/langs/readme.txt [new file with mode: 0644]
webcit/tiny_mce/langs/ru.js [new file with mode: 0644]
webcit/tiny_mce/langs/ru_KOI8-R.js [new file with mode: 0644]
webcit/tiny_mce/langs/ru_UTF-8.js [new file with mode: 0644]
webcit/tiny_mce/langs/sk.js [new file with mode: 0644]
webcit/tiny_mce/langs/sv.js [new file with mode: 0644]
webcit/tiny_mce/langs/th.js [new file with mode: 0644]
webcit/tiny_mce/langs/zh_cn.js [new file with mode: 0644]
webcit/tiny_mce/langs/zh_tw.js [new file with mode: 0644]
webcit/tiny_mce/langs/zh_tw_utf8.js [new file with mode: 0644]
webcit/tiny_mce/license.txt [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/images/template.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/_template/langs/da.js [new file with mode: 0644]
webcit/tiny_mce/plugins/_template/langs/de.js [new file with mode: 0644]
webcit/tiny_mce/plugins/_template/langs/en.js [new file with mode: 0644]
webcit/tiny_mce/plugins/_template/langs/es.js [new file with mode: 0644]
webcit/tiny_mce/plugins/_template/langs/fr.js [new file with mode: 0644]
webcit/tiny_mce/plugins/_template/langs/fr_ca.js [new file with mode: 0644]
webcit/tiny_mce/plugins/_template/langs/he.js [new file with mode: 0644]
webcit/tiny_mce/plugins/_template/langs/hu.js [new file with mode: 0644]
webcit/tiny_mce/plugins/_template/langs/is.js [new file with mode: 0644]
webcit/tiny_mce/plugins/_template/langs/nb.js [new file with mode: 0644]
webcit/tiny_mce/plugins/_template/langs/nl.js [new file with mode: 0644]
webcit/tiny_mce/plugins/_template/langs/nn.js [new file with mode: 0644]
webcit/tiny_mce/plugins/_template/langs/pl.js [new file with mode: 0644]
webcit/tiny_mce/plugins/_template/langs/pt_br.js [new file with mode: 0644]
webcit/tiny_mce/plugins/_template/langs/ru.js [new file with mode: 0644]
webcit/tiny_mce/plugins/_template/langs/ru_KOI8-R.js [new file with mode: 0644]
webcit/tiny_mce/plugins/_template/langs/ru_UTF-8.js [new file with mode: 0644]
webcit/tiny_mce/plugins/_template/langs/zh_cn.js [new file with mode: 0644]
webcit/tiny_mce/plugins/_template/langs/zh_tw.js [new file with mode: 0644]
webcit/tiny_mce/plugins/_template/langs/zh_tw_utf8.js [new file with mode: 0644]
webcit/tiny_mce/plugins/_template/popup.htm [new file with mode: 0644]
webcit/tiny_mce/plugins/_template/readme.txt [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/images/advhr.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/jscripts/rule.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/cs.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/cy.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/da.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/de.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/en.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/es.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/fa.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/fi.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/fr.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/fr_ca.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/he.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/hu.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/is.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/nb.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/nl.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/nn.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/pl.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/pt_br.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/ru.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/ru_KOI8-R.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/ru_UTF-8.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/sk.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/sv.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/zh_cn.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/zh_tw.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/langs/zh_tw_utf8.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advhr/readme.txt [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/images/sample.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/jscripts/functions.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/cs.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/cy.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/da.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/de.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/en.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/es.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/fa.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/fa_ca.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/fr.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/fr_ca.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/he.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/hu.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/is.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/ko.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/nb.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/nl.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/nn.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/pl.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/pt_br.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/ru.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/ru_KOI8-R.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/ru_UTF-8.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/sk.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/sv.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/zh_cn.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/zh_tw.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/langs/zh_tw_utf8.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advimage/readme.txt [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/jscripts/functions.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/cs.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/cy.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/da.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/de.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/en.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/es.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/fa.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/fr.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/fr_ca.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/he.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/hu.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/is.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/ko.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/nb.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/nl.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/nn.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/pl.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/pt_br.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/ru.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/ru_KOI8-R.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/ru_UTF-8.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/sk.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/sv.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/zh_cn.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/zh_tw.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/langs/zh_tw_utf8.js [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/link.htm [new file with mode: 0644]
webcit/tiny_mce/plugins/advlink/readme.txt [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/cs.js [new file with mode: 0644]
webcit/tiny_mce/plugins/autosave/langs/cy.js [new file with mode: 0644]
webcit/tiny_mce/plugins/autosave/langs/da.js [new file with mode: 0644]
webcit/tiny_mce/plugins/autosave/langs/de.js [new file with mode: 0644]
webcit/tiny_mce/plugins/autosave/langs/en.js [new file with mode: 0644]
webcit/tiny_mce/plugins/autosave/langs/es.js [new file with mode: 0644]
webcit/tiny_mce/plugins/autosave/langs/fr.js [new file with mode: 0644]
webcit/tiny_mce/plugins/autosave/langs/he.js [new file with mode: 0644]
webcit/tiny_mce/plugins/autosave/langs/hu.js [new file with mode: 0644]
webcit/tiny_mce/plugins/autosave/langs/is.js [new file with mode: 0644]
webcit/tiny_mce/plugins/autosave/langs/nb.js [new file with mode: 0644]
webcit/tiny_mce/plugins/autosave/langs/nl.js [new file with mode: 0644]
webcit/tiny_mce/plugins/autosave/langs/nn.js [new file with mode: 0644]
webcit/tiny_mce/plugins/autosave/langs/pl.js [new file with mode: 0644]
webcit/tiny_mce/plugins/autosave/langs/pt_br.js [new file with mode: 0644]
webcit/tiny_mce/plugins/autosave/langs/ru.js [new file with mode: 0644]
webcit/tiny_mce/plugins/autosave/langs/ru_KOI8-R.js [new file with mode: 0644]
webcit/tiny_mce/plugins/autosave/langs/ru_UTF-8.js [new file with mode: 0644]
webcit/tiny_mce/plugins/autosave/langs/sk.js [new file with mode: 0644]
webcit/tiny_mce/plugins/autosave/langs/sv.js [new file with mode: 0644]
webcit/tiny_mce/plugins/autosave/langs/zh_cn.js [new file with mode: 0644]
webcit/tiny_mce/plugins/autosave/langs/zh_tw.js [new file with mode: 0644]
webcit/tiny_mce/plugins/autosave/langs/zh_tw_utf8.js [new file with mode: 0644]
webcit/tiny_mce/plugins/autosave/readme.txt [new file with mode: 0644]
webcit/tiny_mce/plugins/contextmenu/css/contextmenu.css [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/contextmenu/images/spacer.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/contextmenu/readme.txt [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/directionality/images/ltr.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/directionality/images/rtl.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/directionality/langs/cs.js [new file with mode: 0644]
webcit/tiny_mce/plugins/directionality/langs/cy.js [new file with mode: 0644]
webcit/tiny_mce/plugins/directionality/langs/da.js [new file with mode: 0644]
webcit/tiny_mce/plugins/directionality/langs/de.js [new file with mode: 0644]
webcit/tiny_mce/plugins/directionality/langs/en.js [new file with mode: 0644]
webcit/tiny_mce/plugins/directionality/langs/es.js [new file with mode: 0644]
webcit/tiny_mce/plugins/directionality/langs/fr.js [new file with mode: 0644]
webcit/tiny_mce/plugins/directionality/langs/fr_ca.js [new file with mode: 0644]
webcit/tiny_mce/plugins/directionality/langs/he.js [new file with mode: 0644]
webcit/tiny_mce/plugins/directionality/langs/hu.js [new file with mode: 0644]
webcit/tiny_mce/plugins/directionality/langs/is.js [new file with mode: 0644]
webcit/tiny_mce/plugins/directionality/langs/nb.js [new file with mode: 0644]
webcit/tiny_mce/plugins/directionality/langs/nl.js [new file with mode: 0644]
webcit/tiny_mce/plugins/directionality/langs/nn.js [new file with mode: 0644]
webcit/tiny_mce/plugins/directionality/langs/pl.js [new file with mode: 0644]
webcit/tiny_mce/plugins/directionality/langs/pt_br.js [new file with mode: 0644]
webcit/tiny_mce/plugins/directionality/langs/ru.js [new file with mode: 0644]
webcit/tiny_mce/plugins/directionality/langs/ru_KOI8-R.js [new file with mode: 0644]
webcit/tiny_mce/plugins/directionality/langs/ru_UTF-8.js [new file with mode: 0644]
webcit/tiny_mce/plugins/directionality/langs/sk.js [new file with mode: 0644]
webcit/tiny_mce/plugins/directionality/langs/sv.js [new file with mode: 0644]
webcit/tiny_mce/plugins/directionality/langs/zh_cn.js [new file with mode: 0644]
webcit/tiny_mce/plugins/directionality/langs/zh_tw.js [new file with mode: 0644]
webcit/tiny_mce/plugins/directionality/langs/zh_tw_utf8.js [new file with mode: 0644]
webcit/tiny_mce/plugins/directionality/readme.txt [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/images/emotions.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/images/readme.txt [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/images/smiley-cool.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/images/smiley-cry.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/images/smiley-embarassed.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/images/smiley-foot-in-mouth.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/images/smiley-frown.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/images/smiley-innocent.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/images/smiley-kiss.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/images/smiley-laughing.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/images/smiley-money-mouth.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/images/smiley-sealed.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/images/smiley-smile.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/images/smiley-surprised.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/images/smiley-tongue-out.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/images/smiley-undecided.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/images/smiley-wink.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/images/smiley-yell.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/jscripts/functions.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/cs.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/cy.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/da.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/de.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/el.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/en.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/es.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/fa.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/fr.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/fr_ca.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/he.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/hu.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/is.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/it.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/ko.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/nb.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/nl.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/nn.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/pl.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/pt_br.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/ru.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/ru_KOI8-R.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/ru_UTF-8.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/sk.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/sv.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/zh_cn.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/zh_tw.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/langs/zh_tw_utf8.js [new file with mode: 0644]
webcit/tiny_mce/plugins/emotions/readme.txt [new file with mode: 0644]
webcit/tiny_mce/plugins/flash/css/content.css [new file with mode: 0644]
webcit/tiny_mce/plugins/flash/css/flash.css [new file with mode: 0644]
webcit/tiny_mce/plugins/flash/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/flash/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/flash/flash.htm [new file with mode: 0644]
webcit/tiny_mce/plugins/flash/images/flash.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/flash/jscripts/flash.js [new file with mode: 0644]
webcit/tiny_mce/plugins/flash/langs/cs.js [new file with mode: 0644]
webcit/tiny_mce/plugins/flash/langs/cy.js [new file with mode: 0644]
webcit/tiny_mce/plugins/flash/langs/da.js [new file with mode: 0644]
webcit/tiny_mce/plugins/flash/langs/de.js [new file with mode: 0644]
webcit/tiny_mce/plugins/flash/langs/en.js [new file with mode: 0644]
webcit/tiny_mce/plugins/flash/langs/es.js [new file with mode: 0644]
webcit/tiny_mce/plugins/flash/langs/fa.js [new file with mode: 0644]
webcit/tiny_mce/plugins/flash/langs/fr.js [new file with mode: 0644]
webcit/tiny_mce/plugins/flash/langs/fr_ca.js [new file with mode: 0644]
webcit/tiny_mce/plugins/flash/langs/he.js [new file with mode: 0644]
webcit/tiny_mce/plugins/flash/langs/hu.js [new file with mode: 0644]
webcit/tiny_mce/plugins/flash/langs/is.js [new file with mode: 0644]
webcit/tiny_mce/plugins/flash/langs/nb.js [new file with mode: 0644]
webcit/tiny_mce/plugins/flash/langs/nl.js [new file with mode: 0644]
webcit/tiny_mce/plugins/flash/langs/nn.js [new file with mode: 0644]
webcit/tiny_mce/plugins/flash/langs/pl.js [new file with mode: 0644]
webcit/tiny_mce/plugins/flash/langs/pt_br.js [new file with mode: 0644]
webcit/tiny_mce/plugins/flash/langs/ru.js [new file with mode: 0644]
webcit/tiny_mce/plugins/flash/langs/ru_KOI8-R.js [new file with mode: 0644]
webcit/tiny_mce/plugins/flash/langs/ru_UTF-8.js [new file with mode: 0644]
webcit/tiny_mce/plugins/flash/langs/sk.js [new file with mode: 0644]
webcit/tiny_mce/plugins/flash/langs/sv.js [new file with mode: 0644]
webcit/tiny_mce/plugins/flash/langs/zh_cn.js [new file with mode: 0644]
webcit/tiny_mce/plugins/flash/langs/zh_tw.js [new file with mode: 0644]
webcit/tiny_mce/plugins/flash/langs/zh_tw_utf8.js [new file with mode: 0644]
webcit/tiny_mce/plugins/flash/readme.txt [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/fullscreen/images/fullscreen.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/fullscreen/langs/cs.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullscreen/langs/cy.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullscreen/langs/da.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullscreen/langs/de.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullscreen/langs/en.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullscreen/langs/es.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullscreen/langs/fr.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullscreen/langs/fr_ca.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullscreen/langs/he.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullscreen/langs/hu.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullscreen/langs/is.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullscreen/langs/nb.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullscreen/langs/nl.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullscreen/langs/nn.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullscreen/langs/pl.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullscreen/langs/pt_br.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullscreen/langs/ru.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullscreen/langs/ru_KOI8-R.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullscreen/langs/ru_UTF-8.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullscreen/langs/sk.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullscreen/langs/sv.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullscreen/langs/zh_cn.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullscreen/langs/zh_tw.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullscreen/langs/zh_tw_utf8.js [new file with mode: 0644]
webcit/tiny_mce/plugins/fullscreen/readme.txt [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/iespell/images/iespell.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/iespell/langs/cs.js [new file with mode: 0644]
webcit/tiny_mce/plugins/iespell/langs/cy.js [new file with mode: 0644]
webcit/tiny_mce/plugins/iespell/langs/da.js [new file with mode: 0644]
webcit/tiny_mce/plugins/iespell/langs/de.js [new file with mode: 0644]
webcit/tiny_mce/plugins/iespell/langs/el.js [new file with mode: 0644]
webcit/tiny_mce/plugins/iespell/langs/en.js [new file with mode: 0644]
webcit/tiny_mce/plugins/iespell/langs/es.js [new file with mode: 0644]
webcit/tiny_mce/plugins/iespell/langs/fr.js [new file with mode: 0644]
webcit/tiny_mce/plugins/iespell/langs/fr_ca.js [new file with mode: 0644]
webcit/tiny_mce/plugins/iespell/langs/he.js [new file with mode: 0644]
webcit/tiny_mce/plugins/iespell/langs/hu.js [new file with mode: 0644]
webcit/tiny_mce/plugins/iespell/langs/is.js [new file with mode: 0644]
webcit/tiny_mce/plugins/iespell/langs/it.js [new file with mode: 0644]
webcit/tiny_mce/plugins/iespell/langs/ko.js [new file with mode: 0644]
webcit/tiny_mce/plugins/iespell/langs/nb.js [new file with mode: 0644]
webcit/tiny_mce/plugins/iespell/langs/nl.js [new file with mode: 0644]
webcit/tiny_mce/plugins/iespell/langs/nn.js [new file with mode: 0644]
webcit/tiny_mce/plugins/iespell/langs/pl.js [new file with mode: 0644]
webcit/tiny_mce/plugins/iespell/langs/pt_br.js [new file with mode: 0644]
webcit/tiny_mce/plugins/iespell/langs/ru.js [new file with mode: 0644]
webcit/tiny_mce/plugins/iespell/langs/ru_KOI8-R.js [new file with mode: 0644]
webcit/tiny_mce/plugins/iespell/langs/ru_UTF-8.js [new file with mode: 0644]
webcit/tiny_mce/plugins/iespell/langs/sk.js [new file with mode: 0644]
webcit/tiny_mce/plugins/iespell/langs/sv.js [new file with mode: 0644]
webcit/tiny_mce/plugins/iespell/langs/zh_cn.js [new file with mode: 0644]
webcit/tiny_mce/plugins/iespell/langs/zh_tw.js [new file with mode: 0644]
webcit/tiny_mce/plugins/iespell/langs/zh_tw_utf8.js [new file with mode: 0644]
webcit/tiny_mce/plugins/iespell/readme.txt [new file with mode: 0644]
webcit/tiny_mce/plugins/inlinepopups/css/inlinepopup.css [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/images/spacer.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/inlinepopups/images/window_close.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/inlinepopups/images/window_maximize.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/inlinepopups/images/window_minimize.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/inlinepopups/images/window_resize.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/inlinepopups/jscripts/mcwindows.js [new file with mode: 0644]
webcit/tiny_mce/plugins/inlinepopups/readme.txt [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/insertdatetime/images/insertdate.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/insertdatetime/images/inserttime.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/insertdatetime/langs/cs.js [new file with mode: 0644]
webcit/tiny_mce/plugins/insertdatetime/langs/cy.js [new file with mode: 0644]
webcit/tiny_mce/plugins/insertdatetime/langs/da.js [new file with mode: 0644]
webcit/tiny_mce/plugins/insertdatetime/langs/de.js [new file with mode: 0644]
webcit/tiny_mce/plugins/insertdatetime/langs/el.js [new file with mode: 0644]
webcit/tiny_mce/plugins/insertdatetime/langs/en.js [new file with mode: 0644]
webcit/tiny_mce/plugins/insertdatetime/langs/es.js [new file with mode: 0644]
webcit/tiny_mce/plugins/insertdatetime/langs/fa.js [new file with mode: 0644]
webcit/tiny_mce/plugins/insertdatetime/langs/fi.js [new file with mode: 0644]
webcit/tiny_mce/plugins/insertdatetime/langs/fr.js [new file with mode: 0644]
webcit/tiny_mce/plugins/insertdatetime/langs/fr_ca.js [new file with mode: 0644]
webcit/tiny_mce/plugins/insertdatetime/langs/he.js [new file with mode: 0644]
webcit/tiny_mce/plugins/insertdatetime/langs/hu.js [new file with mode: 0644]
webcit/tiny_mce/plugins/insertdatetime/langs/is.js [new file with mode: 0644]
webcit/tiny_mce/plugins/insertdatetime/langs/it.js [new file with mode: 0644]
webcit/tiny_mce/plugins/insertdatetime/langs/ko.js [new file with mode: 0644]
webcit/tiny_mce/plugins/insertdatetime/langs/nb.js [new file with mode: 0644]
webcit/tiny_mce/plugins/insertdatetime/langs/nl.js [new file with mode: 0644]
webcit/tiny_mce/plugins/insertdatetime/langs/nn.js [new file with mode: 0644]
webcit/tiny_mce/plugins/insertdatetime/langs/pl.js [new file with mode: 0644]
webcit/tiny_mce/plugins/insertdatetime/langs/pt_br.js [new file with mode: 0644]
webcit/tiny_mce/plugins/insertdatetime/langs/ru.js [new file with mode: 0644]
webcit/tiny_mce/plugins/insertdatetime/langs/ru_KOI8-R.js [new file with mode: 0644]
webcit/tiny_mce/plugins/insertdatetime/langs/ru_UTF-8.js [new file with mode: 0644]
webcit/tiny_mce/plugins/insertdatetime/langs/sk.js [new file with mode: 0644]
webcit/tiny_mce/plugins/insertdatetime/langs/sv.js [new file with mode: 0644]
webcit/tiny_mce/plugins/insertdatetime/langs/zh_cn.js [new file with mode: 0644]
webcit/tiny_mce/plugins/insertdatetime/langs/zh_tw.js [new file with mode: 0644]
webcit/tiny_mce/plugins/insertdatetime/langs/zh_tw_utf8.js [new file with mode: 0644]
webcit/tiny_mce/plugins/insertdatetime/readme.txt [new file with mode: 0644]
webcit/tiny_mce/plugins/noneditable/css/noneditable.css [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/noneditable/readme.txt [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/blank.htm [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/css/blank.css [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/css/pasteword.css [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/images/pastetext.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/images/pasteword.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/images/selectall.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/jscripts/pastetext.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/jscripts/pasteword.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/cs.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/cy.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/da.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/de.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/en.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/es.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/fi.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/fr.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/fr_ca.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/he.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/hu.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/is.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/nb.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/nl.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/nn.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/pl.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/pt_br.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/ru.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/ru_KOI8-R.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/ru_UTF-8.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/sk.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/sv.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/zh_cn.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/zh_tw.js [new file with mode: 0644]
webcit/tiny_mce/plugins/paste/langs/zh_tw_utf8.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/paste/readme.txt [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/images/preview.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/preview/langs/cs.js [new file with mode: 0644]
webcit/tiny_mce/plugins/preview/langs/cy.js [new file with mode: 0644]
webcit/tiny_mce/plugins/preview/langs/da.js [new file with mode: 0644]
webcit/tiny_mce/plugins/preview/langs/de.js [new file with mode: 0644]
webcit/tiny_mce/plugins/preview/langs/el.js [new file with mode: 0644]
webcit/tiny_mce/plugins/preview/langs/en.js [new file with mode: 0644]
webcit/tiny_mce/plugins/preview/langs/es.js [new file with mode: 0644]
webcit/tiny_mce/plugins/preview/langs/fa.js [new file with mode: 0644]
webcit/tiny_mce/plugins/preview/langs/fr.js [new file with mode: 0644]
webcit/tiny_mce/plugins/preview/langs/fr_ca.js [new file with mode: 0644]
webcit/tiny_mce/plugins/preview/langs/he.js [new file with mode: 0644]
webcit/tiny_mce/plugins/preview/langs/hu.js [new file with mode: 0644]
webcit/tiny_mce/plugins/preview/langs/is.js [new file with mode: 0644]
webcit/tiny_mce/plugins/preview/langs/it.js [new file with mode: 0644]
webcit/tiny_mce/plugins/preview/langs/ko.js [new file with mode: 0644]
webcit/tiny_mce/plugins/preview/langs/nb.js [new file with mode: 0644]
webcit/tiny_mce/plugins/preview/langs/nl.js [new file with mode: 0644]
webcit/tiny_mce/plugins/preview/langs/nn.js [new file with mode: 0644]
webcit/tiny_mce/plugins/preview/langs/pl.js [new file with mode: 0644]
webcit/tiny_mce/plugins/preview/langs/pt.js [new file with mode: 0644]
webcit/tiny_mce/plugins/preview/langs/pt_br.js [new file with mode: 0644]
webcit/tiny_mce/plugins/preview/langs/ru.js [new file with mode: 0644]
webcit/tiny_mce/plugins/preview/langs/ru_KOI8-R.js [new file with mode: 0644]
webcit/tiny_mce/plugins/preview/langs/ru_UTF-8.js [new file with mode: 0644]
webcit/tiny_mce/plugins/preview/langs/sk.js [new file with mode: 0644]
webcit/tiny_mce/plugins/preview/langs/sv.js [new file with mode: 0644]
webcit/tiny_mce/plugins/preview/langs/zh_cn.js [new file with mode: 0644]
webcit/tiny_mce/plugins/preview/langs/zh_tw.js [new file with mode: 0644]
webcit/tiny_mce/plugins/preview/langs/zh_tw_utf8.js [new file with mode: 0644]
webcit/tiny_mce/plugins/preview/readme.txt [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/print/images/print.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/print/langs/cs.js [new file with mode: 0644]
webcit/tiny_mce/plugins/print/langs/cy.js [new file with mode: 0644]
webcit/tiny_mce/plugins/print/langs/da.js [new file with mode: 0644]
webcit/tiny_mce/plugins/print/langs/de.js [new file with mode: 0644]
webcit/tiny_mce/plugins/print/langs/en.js [new file with mode: 0644]
webcit/tiny_mce/plugins/print/langs/es.js [new file with mode: 0644]
webcit/tiny_mce/plugins/print/langs/fa.js [new file with mode: 0644]
webcit/tiny_mce/plugins/print/langs/fi.js [new file with mode: 0644]
webcit/tiny_mce/plugins/print/langs/fr.js [new file with mode: 0644]
webcit/tiny_mce/plugins/print/langs/fr_ca.js [new file with mode: 0644]
webcit/tiny_mce/plugins/print/langs/he.js [new file with mode: 0644]
webcit/tiny_mce/plugins/print/langs/hu.js [new file with mode: 0644]
webcit/tiny_mce/plugins/print/langs/is.js [new file with mode: 0644]
webcit/tiny_mce/plugins/print/langs/nb.js [new file with mode: 0644]
webcit/tiny_mce/plugins/print/langs/nl.js [new file with mode: 0644]
webcit/tiny_mce/plugins/print/langs/nn.js [new file with mode: 0644]
webcit/tiny_mce/plugins/print/langs/pl.js [new file with mode: 0644]
webcit/tiny_mce/plugins/print/langs/pt_br.js [new file with mode: 0644]
webcit/tiny_mce/plugins/print/langs/ru.js [new file with mode: 0644]
webcit/tiny_mce/plugins/print/langs/ru_KOI8-R.js [new file with mode: 0644]
webcit/tiny_mce/plugins/print/langs/ru_UTF-8.js [new file with mode: 0644]
webcit/tiny_mce/plugins/print/langs/sk.js [new file with mode: 0644]
webcit/tiny_mce/plugins/print/langs/sv.js [new file with mode: 0644]
webcit/tiny_mce/plugins/print/langs/zh_cn.js [new file with mode: 0644]
webcit/tiny_mce/plugins/print/langs/zh_tw.js [new file with mode: 0644]
webcit/tiny_mce/plugins/print/langs/zh_tw_utf8.js [new file with mode: 0644]
webcit/tiny_mce/plugins/print/readme.txt [new file with mode: 0644]
webcit/tiny_mce/plugins/readme.txt [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/save/images/save.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/save/langs/cs.js [new file with mode: 0644]
webcit/tiny_mce/plugins/save/langs/cy.js [new file with mode: 0644]
webcit/tiny_mce/plugins/save/langs/da.js [new file with mode: 0644]
webcit/tiny_mce/plugins/save/langs/de.js [new file with mode: 0644]
webcit/tiny_mce/plugins/save/langs/en.js [new file with mode: 0644]
webcit/tiny_mce/plugins/save/langs/es.js [new file with mode: 0644]
webcit/tiny_mce/plugins/save/langs/fa.js [new file with mode: 0644]
webcit/tiny_mce/plugins/save/langs/fi.js [new file with mode: 0644]
webcit/tiny_mce/plugins/save/langs/fr.js [new file with mode: 0644]
webcit/tiny_mce/plugins/save/langs/fr_ca.js [new file with mode: 0644]
webcit/tiny_mce/plugins/save/langs/he.js [new file with mode: 0644]
webcit/tiny_mce/plugins/save/langs/hu.js [new file with mode: 0644]
webcit/tiny_mce/plugins/save/langs/is.js [new file with mode: 0644]
webcit/tiny_mce/plugins/save/langs/nb.js [new file with mode: 0644]
webcit/tiny_mce/plugins/save/langs/nl.js [new file with mode: 0644]
webcit/tiny_mce/plugins/save/langs/nn.js [new file with mode: 0644]
webcit/tiny_mce/plugins/save/langs/pl.js [new file with mode: 0644]
webcit/tiny_mce/plugins/save/langs/pt_br.js [new file with mode: 0644]
webcit/tiny_mce/plugins/save/langs/ru.js [new file with mode: 0644]
webcit/tiny_mce/plugins/save/langs/ru_KOI8-R.js [new file with mode: 0644]
webcit/tiny_mce/plugins/save/langs/ru_UTF-8.js [new file with mode: 0644]
webcit/tiny_mce/plugins/save/langs/sk.js [new file with mode: 0644]
webcit/tiny_mce/plugins/save/langs/sv.js [new file with mode: 0644]
webcit/tiny_mce/plugins/save/langs/zh_cn.js [new file with mode: 0644]
webcit/tiny_mce/plugins/save/langs/zh_tw.js [new file with mode: 0644]
webcit/tiny_mce/plugins/save/langs/zh_tw_utf8.js [new file with mode: 0644]
webcit/tiny_mce/plugins/save/readme.txt [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/images/replace.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/images/search.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/jscripts/replace.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/jscripts/search.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/cs.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/cy.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/da.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/de.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/en.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/es.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/fa.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/fi.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/fr.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/fr_ca.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/he.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/hu.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/is.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/nb.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/nl.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/nn.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/pl.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/pt_br.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/ru.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/ru_KOI8-R.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/ru_UTF-8.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/sk.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/sv.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/zh_cn.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/zh_tw.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/langs/zh_tw_utf8.js [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/readme.txt [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/replace.htm [new file with mode: 0644]
webcit/tiny_mce/plugins/searchreplace/search.htm [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/images/buttons.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/table/images/table.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/table/images/table_cell_props.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/table/images/table_delete.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/table/images/table_delete_col.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/table/images/table_delete_row.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/table/images/table_insert_col_after.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/table/images/table_insert_col_before.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/table/images/table_insert_row_after.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/table/images/table_insert_row_before.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/table/images/table_merge_cells.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/table/images/table_row_props.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/table/images/table_split_cells.gif [new file with mode: 0644]
webcit/tiny_mce/plugins/table/jscripts/cell.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/jscripts/merge_cells.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/jscripts/row.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/jscripts/table.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/ar.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/cs.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/cy.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/da.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/de.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/el.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/en.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/es.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/fa.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/fi.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/fr.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/fr_ca.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/he.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/hu.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/is.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/it.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/ja.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/ko.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/nb.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/nl.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/nn.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/pl.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/pt.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/pt_br.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/readme.txt [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/ru.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/ru_KOI8-R.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/ru_UTF-8.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/sk.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/sv.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/tw.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/zh_cn.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/zh_tw.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/langs/zh_tw_utf8.js [new file with mode: 0644]
webcit/tiny_mce/plugins/table/merge_cells.htm [new file with mode: 0644]
webcit/tiny_mce/plugins/table/readme.txt [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/zoom/editor_plugin.js [new file with mode: 0644]
webcit/tiny_mce/plugins/zoom/editor_plugin_src.js [new file with mode: 0644]
webcit/tiny_mce/plugins/zoom/langs/es.js [new file with mode: 0644]
webcit/tiny_mce/plugins/zoom/langs/fr.js [new file with mode: 0644]
webcit/tiny_mce/plugins/zoom/langs/he.js [new file with mode: 0644]
webcit/tiny_mce/plugins/zoom/langs/pt_br.js [new file with mode: 0644]
webcit/tiny_mce/plugins/zoom/langs/ru.js [new file with mode: 0644]
webcit/tiny_mce/plugins/zoom/langs/ru_KOI8-R.js [new file with mode: 0644]
webcit/tiny_mce/plugins/zoom/langs/ru_UTF-8.js [new file with mode: 0644]
webcit/tiny_mce/plugins/zoom/langs/zh_tw.js [new file with mode: 0644]
webcit/tiny_mce/plugins/zoom/langs/zh_tw_utf8.js [new file with mode: 0644]
webcit/tiny_mce/plugins/zoom/readme.txt [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/css/editor_content.css [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/css/editor_popup.css [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/css/editor_ui.css [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/cs/about.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/cs/common_buttons.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/cs/images/insert_image_window.png [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/cs/images/insert_link_window.png [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/cs/images/insert_table_window.png [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/cs/index.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/cs/insert_image_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/cs/insert_link_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/cs/insert_table_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/cs/style.css [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/da/about.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/da/common_buttons.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/da/create_accessible_content.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/da/images/insert_anchor_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/da/images/insert_image_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/da/images/insert_link_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/da/images/insert_table_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/da/index.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/da/insert_anchor_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/da/insert_image_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/da/insert_link_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/da/insert_table_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/da/style.css [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/de/about.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/de/common_buttons.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/de/images/insert_image_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/de/images/insert_link_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/de/index.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/de/insert_image_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/de/insert_link_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/de/style.css [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/en/about.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/en/common_buttons.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/en/create_accessible_content.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/en/images/insert_anchor_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/en/images/insert_image_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/en/images/insert_link_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/en/images/insert_table_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/en/index.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/en/insert_anchor_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/en/insert_image_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/en/insert_link_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/en/insert_table_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/en/style.css [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/es/about.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/es/common_buttons.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/es/images/insert_image_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/es/images/insert_link_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/es/images/insert_table_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/es/index.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/es/insert_image_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/es/insert_link_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/es/insert_table_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/es/style.css [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/fi/about.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/fi/common_buttons.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/fi/images/insert_image_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/fi/images/insert_link_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/fi/images/insert_table_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/fi/index.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/fi/insert_image_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/fi/insert_link_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/fi/insert_table_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/fi/style.css [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/fr/about.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/fr/common_buttons.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/fr/images/insert_image_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/fr/images/insert_link_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/fr/images/insert_table_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/fr/index.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/fr/insert_image_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/fr/insert_link_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/fr/insert_table_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/fr/style.css [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/fr_ca/about.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/fr_ca/common_buttons.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/fr_ca/images/insert_anchor_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/fr_ca/images/insert_image_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/fr_ca/images/insert_link_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/fr_ca/images/insert_table_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/fr_ca/index.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/fr_ca/insert_anchor_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/fr_ca/insert_image_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/fr_ca/insert_link_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/fr_ca/insert_table_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/fr_ca/style.css [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/hu/about.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/hu/common_buttons.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/hu/images/insert_image_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/hu/images/insert_link_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/hu/index.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/hu/insert_image_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/hu/insert_link_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/hu/style.css [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/images/table.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/images/table_delete_col.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/images/table_delete_row.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/images/table_insert_col_after.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/images/table_insert_col_before.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/images/table_insert_row_after.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/images/table_insert_row_before.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/it/about.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/it/common_buttons.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/it/images/insert_anchor_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/it/images/insert_image_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/it/images/insert_link_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/it/images/insert_table_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/it/index.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/it/insert_anchor_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/it/insert_image_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/it/insert_link_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/it/insert_table_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/it/style.css [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nb/about.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nb/common_buttons.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nb/images/insert_anchor_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nb/images/insert_image_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nb/images/insert_link_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nb/images/insert_table_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nb/index.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nb/insert_anchor_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nb/insert_image_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nb/insert_link_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nb/insert_table_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nb/style.css [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nl/about.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nl/common_buttons.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nl/images/html_source_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nl/images/insert_anchor_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nl/images/insert_image_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nl/images/insert_link_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nl/images/insert_specchar_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nl/images/insert_table_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nl/index.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nl/insert_anchor_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nl/insert_image_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nl/insert_link_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nl/insert_specchar_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nl/insert_table_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nl/style.css [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nn/about.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nn/common_buttons.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nn/images/html_source_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nn/images/insert_anchor_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nn/images/insert_image_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nn/images/insert_link_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nn/images/insert_specchar_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nn/images/insert_table_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nn/index.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nn/insert_anchor_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nn/insert_image_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nn/insert_link_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nn/insert_table_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/nn/style.css [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/pl/about.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/pl/common_buttons.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/pl/images/insert_anchor_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/pl/images/insert_image_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/pl/images/insert_link_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/pl/images/insert_table_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/pl/index.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/pl/insert_anchor_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/pl/insert_image_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/pl/insert_link_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/pl/insert_table_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/pl/style.css [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/sk/about.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/sk/common_buttons.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/sk/images/insert_image_window.png [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/sk/images/insert_link_window.png [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/sk/images/insert_table_window.png [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/sk/index.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/sk/insert_image_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/sk/insert_link_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/sk/insert_table_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/sk/style.css [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/sv/about.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/sv/common_buttons.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/sv/images/insert_anchor_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/sv/images/insert_image_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/sv/images/insert_link_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/sv/images/insert_table_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/sv/index.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/sv/insert_anchor_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/sv/insert_image_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/sv/insert_link_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/sv/insert_table_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/sv/style.css [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/zh_cn/about.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/zh_cn/common_buttons.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/zh_cn/images/insert_anchor_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/zh_cn/images/insert_image_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/zh_cn/images/insert_link_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/zh_cn/images/insert_table_window.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/zh_cn/index.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/zh_cn/insert_anchor_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/zh_cn/insert_image_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/zh_cn/insert_link_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/zh_cn/insert_table_button.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/docs/zh_cn/style.css [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/images/anchor.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/anchor_symbol.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/backcolor.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/bold.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/bold_de_se.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/bold_es.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/bold_fr.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/bold_ru.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/bold_tw.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/browse.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/bullist.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/buttons.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/cancel_button_bg.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/charmap.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/cleanup.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/close.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/code.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/color.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/copy.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/custom_1.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/cut.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/forecolor.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/help.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/hr.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/image.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/indent.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/insert_button_bg.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/italic.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/italic_de_se.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/italic_es.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/italic_ru.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/italic_tw.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/justifycenter.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/justifyfull.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/justifyleft.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/justifyright.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/link.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/newdocument.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/numlist.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/opacity.png [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/outdent.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/paste.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/redo.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/removeformat.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/spacer.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/statusbar_resize.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/strikethrough.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/sub.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/sup.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/table.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/table_delete_col.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/table_delete_row.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/table_insert_col_after.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/table_insert_col_before.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/table_insert_row_after.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/table_insert_row_before.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/underline.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/underline_es.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/underline_fr.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/underline_ru.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/underline_tw.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/undo.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/unlink.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/visualaid.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/xp/tab_bg.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/xp/tab_end.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/xp/tab_sel_bg.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/xp/tab_sel_end.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/images/xp/tabs_bg.gif [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/jscripts/about.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/jscripts/anchor.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/jscripts/charmap.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/jscripts/color_picker.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/jscripts/image.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/jscripts/link.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/jscripts/source_editor.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/ar.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/ca.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/cy.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/de.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/en.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/fa.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/fr.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/fr_ca.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/he.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/is.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/ja.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/ko.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/nb.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/nl.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/nn.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/pl.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/pt.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/pt_br.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/readme.txt [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/ru.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/ru_KOI8-R.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/ru_UTF-8.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/sk.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/sv.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/tw.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_tw.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/langs/zh_tw_utf8.js [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/link.htm [new file with mode: 0644]
webcit/tiny_mce/themes/advanced/source_editor.htm [new file with mode: 0644]
webcit/tiny_mce/themes/simple/css/editor_content.css [new file with mode: 0644]
webcit/tiny_mce/themes/simple/css/editor_popup.css [new file with mode: 0644]
webcit/tiny_mce/themes/simple/css/editor_ui.css [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/images/bold.gif [new file with mode: 0644]
webcit/tiny_mce/themes/simple/images/bold_de_se.gif [new file with mode: 0644]
webcit/tiny_mce/themes/simple/images/bold_fr.gif [new file with mode: 0644]
webcit/tiny_mce/themes/simple/images/bold_ru.gif [new file with mode: 0644]
webcit/tiny_mce/themes/simple/images/bold_tw.gif [new file with mode: 0644]
webcit/tiny_mce/themes/simple/images/bullist.gif [new file with mode: 0644]
webcit/tiny_mce/themes/simple/images/cleanup.gif [new file with mode: 0644]
webcit/tiny_mce/themes/simple/images/italic.gif [new file with mode: 0644]
webcit/tiny_mce/themes/simple/images/italic_de_se.gif [new file with mode: 0644]
webcit/tiny_mce/themes/simple/images/italic_ru.gif [new file with mode: 0644]
webcit/tiny_mce/themes/simple/images/italic_tw.gif [new file with mode: 0644]
webcit/tiny_mce/themes/simple/images/numlist.gif [new file with mode: 0644]
webcit/tiny_mce/themes/simple/images/redo.gif [new file with mode: 0644]
webcit/tiny_mce/themes/simple/images/spacer.gif [new file with mode: 0644]
webcit/tiny_mce/themes/simple/images/strikethrough.gif [new file with mode: 0644]
webcit/tiny_mce/themes/simple/images/underline.gif [new file with mode: 0644]
webcit/tiny_mce/themes/simple/images/underline_fr.gif [new file with mode: 0644]
webcit/tiny_mce/themes/simple/images/underline_ru.gif [new file with mode: 0644]
webcit/tiny_mce/themes/simple/images/underline_tw.gif [new file with mode: 0644]
webcit/tiny_mce/themes/simple/images/undo.gif [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/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/tools.c [new file with mode: 0644]
webcit/useredit.c [new file with mode: 0644]
webcit/userlist.c [new file with mode: 0644]
webcit/vcard.c [new file with mode: 0644]
webcit/vcard.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]

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/COPYING.txt b/webcit/COPYING.txt
new file mode 100644 (file)
index 0000000..045e201
--- /dev/null
@@ -0,0 +1,271 @@
+GNU GENERAL PUBLIC LICENSE
+
+Version 2, June 1991
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+Preamble
+
+The licenses for most software are designed to take away your freedom to
+share and change it. By contrast, the GNU General Public License is intended
+to guarantee your freedom to share and change free software--to make sure
+the software is free for all its users. This General Public License applies
+to most of the Free Software Foundation's software and to any other program
+whose authors commit to using it. (Some other Free Software Foundation
+software is covered by the GNU Library General Public License instead.) You
+can apply it to your programs, too.
+
+When we speak of free software, we are referring to freedom, not price. Our
+General Public Licenses are designed to make sure that you have the freedom
+to distribute copies of free software (and charge for this service if you
+wish), that you receive source code or can get it if you want it, that you
+can change the software or use pieces of it in new free programs; and that
+you know you can do these things.
+
+To protect your rights, we need to make restrictions that forbid anyone to
+deny you these rights or to ask you to surrender the rights. These
+restrictions translate to certain responsibilities for you if you distribute
+copies of the software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether gratis or
+for a fee, you must give the recipients all the rights that you have. You
+must make sure that they, too, receive or can get the source code. And you
+must show them these terms so they know their rights.
+
+We protect your rights with two steps: (1) copyright the software, and (2)
+offer you this license which gives you legal permission to copy, distribute
+and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain that
+everyone understands that there is no warranty for this free software. If
+the software is modified by someone else and passed on, we want its
+recipients to know that what they have is not the original, so that any
+problems introduced by others will not reflect on the original authors'
+reputations.
+
+Finally, any free program is threatened constantly by software patents. We
+wish to avoid the danger that redistributors of a free program will
+individually obtain patent licenses, in effect making the program
+proprietary. To prevent this, we have made it clear that any patent must be
+licensed for everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and modification
+follow.
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+0. This License applies to any program or other work which contains a notice
+placed by the copyright holder saying it may be distributed under the terms
+of this General Public License. The "Program", below, refers to any such
+program or work, and a "work based on the Program" means either the Program
+or any derivative work under copyright law: that is to say, a work
+containing the Program or a portion of it, either verbatim or with
+modifications and/or translated into another language. (Hereinafter,
+translation is included without limitation in the term "modification".) Each
+licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not covered
+by this License; they are outside its scope. The act of running the Program
+is not restricted, and the output from the Program is covered only if its
+contents constitute a work based on the Program (independent of having been
+made by running the Program). Whether that is true depends on what the
+Program does.
+
+1. You may copy and distribute verbatim copies of the Program's source code
+as you receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice and
+disclaimer of warranty; keep intact all the notices that refer to this
+License and to the absence of any warranty; and give any other recipients of
+the Program a copy of this License along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and you
+may at your option offer warranty protection in exchange for a fee.
+
+2. You may modify your copy or copies of the Program or any portion of it,
+thus forming a work based on the Program, and copy and distribute such
+modifications or work under the terms of Section 1 above, provided that you
+also meet all of these conditions:
+
+   * a) You must cause the modified files to carry prominent notices stating
+     that you changed the files and the date of any change.
+
+   * b) You must cause any work that you distribute or publish, that in
+     whole or in part contains or is derived from the Program or any part
+     thereof, to be licensed as a whole at no charge to all third parties
+     under the terms of this License.
+
+   * c) If the modified program normally reads commands interactively when
+     run, you must cause it, when started running for such interactive use
+     in the most ordinary way, to print or display an announcement including
+     an appropriate copyright notice and a notice that there is no warranty
+     (or else, saying that you provide a warranty) and that users may
+     redistribute the program under these conditions, and telling the user
+     how to view a copy of this License. (Exception: if the Program itself
+     is interactive but does not normally print such an announcement, your
+     work based on the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If identifiable
+sections of that work are not derived from the Program, and can be
+reasonably considered independent and separate works in themselves, then
+this License, and its terms, do not apply to those sections when you
+distribute them as separate works. But when you distribute the same sections
+as part of a whole which is a work based on the Program, the distribution of
+the whole must be on the terms of this License, whose permissions for other
+licensees extend to the entire whole, and thus to each and every part
+regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest your
+rights to work written entirely by you; rather, the intent is to exercise
+the right to control the distribution of derivative or collective works
+based on the Program.
+
+In addition, mere aggregation of another work not based on the Program with
+the Program (or with a work based on the Program) on a volume of a storage
+or distribution medium does not bring the other work under the scope of this
+License.
+
+3. You may copy and distribute the Program (or a work based on it, under
+Section 2) in object code or executable form under the terms of Sections 1
+and 2 above provided that you also do one of the following:
+
+   * a) Accompany it with the complete corresponding machine-readable source
+     code, which must be distributed under the terms of Sections 1 and 2
+     above on a medium customarily used for software interchange; or,
+
+   * b) Accompany it with a written offer, valid for at least three years,
+     to give any third party, for a charge no more than your cost of
+     physically performing source distribution, a complete machine-readable
+     copy of the corresponding source code, to be distributed under the
+     terms of Sections 1 and 2 above on a medium customarily used for
+     software interchange; or,
+
+   * c) Accompany it with the information you received as to the offer to
+     distribute corresponding source code. (This alternative is allowed only
+     for noncommercial distribution and only if you received the program in
+     object code or executable form with such an offer, in accord with
+     Subsection b above.)
+
+The source code for a work means the preferred form of the work for making
+modifications to it. For an executable work, complete source code means all
+the source code for all modules it contains, plus any associated interface
+definition files, plus the scripts used to control compilation and
+installation of the executable. However, as a special exception, the source
+code distributed need not include anything that is normally distributed (in
+either source or binary form) with the major components (compiler, kernel,
+and so on) of the operating system on which the executable runs, unless that
+component itself accompanies the executable.
+
+If distribution of executable or object code is made by offering access to
+copy from a designated place, then offering equivalent access to copy the
+source code from the same place counts as distribution of the source code,
+even though third parties are not compelled to copy the source along with
+the object code.
+
+4. You may not copy, modify, sublicense, or distribute the Program except as
+expressly provided under this License. Any attempt otherwise to copy,
+modify, sublicense or distribute the Program is void, and will automatically
+terminate your rights under this License. However, parties who have received
+copies, or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+5. You are not required to accept this License, since you have not signed
+it. However, nothing else grants you permission to modify or distribute the
+Program or its derivative works. These actions are prohibited by law if you
+do not accept this License. Therefore, by modifying or distributing the
+Program (or any work based on the Program), you indicate your acceptance of
+this License to do so, and all its terms and conditions for copying,
+distributing or modifying the Program or works based on it.
+
+6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the original
+licensor to copy, distribute or modify the Program subject to these terms
+and conditions. You may not impose any further restrictions on the
+recipients' exercise of the rights granted herein. You are not responsible
+for enforcing compliance by third parties to this License.
+
+7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot distribute so
+as to satisfy simultaneously your obligations under this License and any
+other pertinent obligations, then as a consequence you may not distribute
+the Program at all. For example, if a patent license would not permit
+royalty-free redistribution of the Program by all those who receive copies
+directly or indirectly through you, then the only way you could satisfy both
+it and this License would be to refrain entirely from distribution of the
+Program.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply and
+the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any patents
+or other property right claims or to contest validity of any such claims;
+this section has the sole purpose of protecting the integrity of the free
+software distribution system, which is implemented by public license
+practices. Many people have made generous contributions to the wide range of
+software distributed through that system in reliance on consistent
+application of that system; it is up to the author/donor to decide if he or
+she is willing to distribute software through any other system and a
+licensee cannot impose that choice.
+
+This section is intended to make thoroughly clear what is believed to be a
+consequence of the rest of this License.
+
+8. If the distribution and/or use of the Program is restricted in certain
+countries either by patents or by copyrighted interfaces, the original
+copyright holder who places the Program under this License may add an
+explicit geographical distribution limitation excluding those countries, so
+that distribution is permitted only in or among countries not thus excluded.
+In such case, this License incorporates the limitation as if written in the
+body of this License.
+
+9. The Free Software Foundation may publish revised and/or new versions of
+the General Public License from time to time. Such new versions will be
+similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+10. If you wish to incorporate parts of the Program into other free programs
+whose distribution conditions are different, write to the author to ask for
+permission. For software which is copyrighted by the Free Software
+Foundation, write to the Free Software Foundation; we sometimes make
+exceptions for this. Our decision will be guided by the two goals of
+preserving the free status of all derivatives of our free software and of
+promoting the sharing and reuse of software generally.
+
+NO WARRANTY
+
+11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR
+THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO
+THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM
+PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR
+CORRECTION.
+
+12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO
+LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR
+THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+END OF TERMS AND CONDITIONS
diff --git a/webcit/Doxyfile b/webcit/Doxyfile
new file mode 100644 (file)
index 0000000..65f044b
--- /dev/null
@@ -0,0 +1,1239 @@
+# Doxyfile 1.4.6
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+#       TAG = value [value, ...]
+# For lists items can also be appended using:
+#       TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
+# by quotes) that should identify the project.
+
+PROJECT_NAME           = webcit
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
+# This could be handy for archiving the generated documentation or 
+# if some version control system is used.
+
+PROJECT_NUMBER         = 6.70
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
+# base path where the generated documentation will be put. 
+# If a relative path is entered, it will be relative to the location 
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = doxygen
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
+# 4096 sub-directories (in 2 levels) under the output directory of each output 
+# format and will distribute the generated files over these directories. 
+# Enabling this option can be useful when feeding doxygen a huge amount of 
+# source files, where putting all generated files in the same directory would 
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS         = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
+# documentation generated by doxygen is written. Doxygen will use this 
+# information to generate all constant output in the proper language. 
+# The default language is English, other supported languages are: 
+# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, 
+# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, 
+# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, 
+# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, 
+# Swedish, and Ukrainian.
+
+OUTPUT_LANGUAGE        = English
+
+# This tag can be used to specify the encoding used in the generated output. 
+# The encoding is not always determined by the language that is chosen, 
+# but also whether or not the output is meant for Windows or non-Windows users. 
+# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES 
+# forces the Windows encoding (this is the default for the Windows binary), 
+# whereas setting the tag to NO uses a Unix-style encoding (the default for 
+# all platforms other than Windows).
+
+USE_WINDOWS_ENCODING   = NO
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
+# include brief member descriptions after the members that are listed in 
+# the file and class documentation (similar to JavaDoc). 
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
+# the brief description of a member or function before the detailed description. 
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator 
+# that is used to form the text in various listings. Each string 
+# in this list, if found as the leading text of the brief description, will be 
+# stripped from the text and the result after processing the whole list, is 
+# used as the annotated text. Otherwise, the brief description is used as-is. 
+# If left blank, the following values are used ("$name" is automatically 
+# replaced with the name of the entity): "The $name class" "The $name widget" 
+# "The $name file" "is" "provides" "specifies" "contains" 
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF       = 
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
+# Doxygen will generate a detailed section even if there is only a brief 
+# description.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
+# inherited members of a class in the documentation of that class as if those 
+# members were ordinary class members. Constructors, destructors and assignment 
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
+# path before files name in the file list and in the header files. If set 
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES        = YES
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
+# can be used to strip a user-defined part of the path. Stripping is 
+# only done if one of the specified strings matches the left-hand part of 
+# the path. The tag can be used to show relative paths in the file list. 
+# If left blank the directory from which doxygen is run is used as the 
+# path to strip.
+
+STRIP_FROM_PATH        = 
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
+# the path mentioned in the documentation of a class, which tells 
+# the reader which header file to include in order to use a class. 
+# If left blank only the name of the header file containing the class 
+# definition is used. Otherwise one should specify the include paths that 
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH    = 
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
+# (but less readable) file names. This can be useful is your file systems 
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
+# will interpret the first line (until the first dot) of a JavaDoc-style 
+# comment as the brief description. If set to NO, the JavaDoc 
+# comments will behave just like the Qt-style comments (thus requiring an 
+# explicit @brief command for a brief description.
+
+JAVADOC_AUTOBRIEF      = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
+# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
+# comments) as a brief description. This used to be the default behaviour. 
+# The new default is to treat a multi-line C++ comment block as a detailed 
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the DETAILS_AT_TOP tag is set to YES then Doxygen 
+# will output the detailed description near the top, like JavaDoc.
+# If set to NO, the detailed description appears after the member 
+# documentation.
+
+DETAILS_AT_TOP         = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
+# member inherits the documentation from any documented member that it 
+# re-implements.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
+# a new page for each member. If set to NO, the documentation of a member will 
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE               = 8
+
+# This tag can be used to specify a number of aliases that acts 
+# as commands in the documentation. An alias has the form "name=value". 
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
+# put the command \sideeffect (or @sideeffect) in the documentation, which 
+# will result in a user-defined paragraph with heading "Side Effects:". 
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES                = 
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
+# sources only. Doxygen will then generate output that is more tailored for C. 
+# For instance, some of the names that are used will be different. The list 
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C  = YES
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java 
+# sources only. Doxygen will then generate output that is more tailored for Java. 
+# For instance, namespaces will be presented as packages, qualified scopes 
+# will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to 
+# include (a tag file for) the STL sources as input, then you should 
+# set this tag to YES in order to let doxygen match functions declarations and 
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 
+# func(std::string) {}). This also make the inheritance and collaboration 
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
+# tag is set to YES, then doxygen will reuse the documentation of the first 
+# member in the group (if any) for the other members of the group. By default 
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
+# the same type (for instance a group of public functions) to be put as a 
+# subgroup of that type (e.g. under the Public Functions section). Set it to 
+# NO to prevent subgrouping. Alternatively, this can be done per class using 
+# the \nosubgrouping command.
+
+SUBGROUPING            = YES
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
+# documentation are documented, even if no documentation was available. 
+# Private class members and static file members will be hidden unless 
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL            = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
+# will be included in the documentation.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file 
+# will be included in the documentation.
+
+EXTRACT_STATIC         = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
+# defined locally in source files will be included in the documentation. 
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When set to YES local 
+# methods, which are defined in the implementation section but not in 
+# the interface are included in the documentation. 
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
+# undocumented members of documented classes, files or namespaces. 
+# If set to NO (the default) these members will be included in the 
+# various overviews, but no documentation section is generated. 
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
+# undocumented classes that are normally visible in the class hierarchy. 
+# If set to NO (the default) these classes will be included in the various 
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
+# friend (class|struct|union) declarations. 
+# If set to NO (the default) these declarations will be included in the 
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
+# documentation blocks found inside the body of a function. 
+# If set to NO (the default) these blocks will be appended to the 
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation 
+# that is typed after a \internal command is included. If the tag is set 
+# to NO (the default) then the documentation will be excluded. 
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
+# file names in lower-case letters. If set to YES upper-case letters are also 
+# allowed. This is useful if you have classes or files whose names only differ 
+# in case and if your file system supports case sensitive file names. Windows 
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES       = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
+# will show members with their full class and namespace scopes in the 
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
+# will put a list of the files that are included by a file in the documentation 
+# of that file.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
+# is inserted in the documentation for inline members.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
+# will sort the (detailed) documentation of file and class members 
+# alphabetically by member name. If set to NO the members will appear in 
+# declaration order.
+
+SORT_MEMBER_DOCS       = NO 
+#!
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
+# brief documentation of file, namespace and class members alphabetically 
+# by member name. If set to NO (the default) the members will appear in 
+# declaration order.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
+# sorted by fully-qualified names, including namespaces. If set to 
+# NO (the default), the class list will be sorted only by class name, 
+# not including the namespace part. 
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the 
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or 
+# disable (NO) the todo list. This list is created by putting \todo 
+# commands in the documentation.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or 
+# disable (NO) the test list. This list is created by putting \test 
+# commands in the documentation.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or 
+# disable (NO) the bug list. This list is created by putting \bug 
+# commands in the documentation.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
+# disable (NO) the deprecated list. This list is created by putting 
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional 
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS       = 
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
+# the initial value of a variable or define consists of for it to appear in 
+# the documentation. If the initializer consists of more lines than specified 
+# here it will be hidden. Use a value of 0 to hide initializers completely. 
+# The appearance of the initializer of individual variables and defines in the 
+# documentation can be controlled using \showinitializer or \hideinitializer 
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
+# at the bottom of the documentation of classes and structs. If set to YES the 
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES        = YES
+
+# If the sources in your project are distributed over multiple directories 
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES       = NO
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
+# doxygen should invoke to get the current version for each file (typically from the 
+# version control system). Doxygen will invoke the program by executing (via 
+# popen()) the command <command> <input-file>, where <command> is the value of 
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file 
+# provided by doxygen. Whatever the program writes to standard output 
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER    = 
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated 
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are 
+# generated by doxygen. Possible values are YES and NO. If left blank 
+# NO is used.
+
+WARNINGS               = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
+# potential errors in the documentation, such as not documenting some 
+# parameters in a documented function, or documenting parameters that 
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for 
+# functions that are documented, but have no documentation for their parameters 
+# or return value. If set to NO (the default) doxygen will only warn about 
+# wrong or incomplete parameter documentation, but not about the absence of 
+# documentation.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that 
+# doxygen can produce. The string should contain the $file, $line, and $text 
+# tags, which will be replaced by the file and line number from which the 
+# warning originated and the warning text. Optionally the format may contain 
+# $version, which will be replaced by the version of the file (if it could 
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning 
+# and error messages should be written. If left blank the output is written 
+# to stderr.
+
+WARN_LOGFILE           = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain 
+# documented source files. You may enter file names like "myfile.cpp" or 
+# directories like "/usr/src/myproject". Separate the files or directories 
+# with spaces.
+
+INPUT                  = 
+
+# If the value of the INPUT tag contains directories, you can use the 
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank the following patterns are tested: 
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx 
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
+
+FILE_PATTERNS          =  *.c and *.h
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
+# should be searched for input files as well. Possible values are YES and NO. 
+# If left blank NO is used.
+
+RECURSIVE              = NO
+
+# The EXCLUDE tag can be used to specify files and/or directories that should 
+# excluded from the INPUT source files. This way you can easily exclude a 
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE                =
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or 
+# directories that are symbolic links (a Unix filesystem feature) are excluded 
+# from the input.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the 
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
+# certain files from those directories. Note that the wildcards are matched 
+# against the file with absolute path, so to exclude all test directories 
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       = 
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or 
+# directories that contain example code fragments that are included (see 
+# the \include command).
+
+EXAMPLE_PATH           = 
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank all files are included.
+
+EXAMPLE_PATTERNS       = 
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
+# searched for input files to be used with the \include or \dontinclude 
+# commands irrespective of the value of the RECURSIVE tag. 
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or 
+# directories that contain image that are included in the documentation (see 
+# the \image command).
+
+IMAGE_PATH             = 
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should 
+# invoke to filter for each input file. Doxygen will invoke the filter program 
+# by executing (via popen()) the command <filter> <input-file>, where <filter> 
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
+# input file. Doxygen will then use the output that the filter program writes 
+# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
+# ignored.
+
+INPUT_FILTER           = 
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
+# basis.  Doxygen will compare the file name with each pattern and apply the 
+# filter if there is a match.  The filters are a list of the form: 
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER 
+# is applied to all files.
+
+FILTER_PATTERNS        = 
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
+# INPUT_FILTER) will be used to filter the input files when producing source 
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
+# be generated. Documented entities will be cross-referenced with these sources. 
+# Note: To get rid of all source code in the generated output, make sure also 
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER         = yes
+
+# Setting the INLINE_SOURCES tag to YES will include the body 
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES         = no
+#!yes
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
+# doxygen to hide any special comment blocks from generated source code 
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES (the default) 
+# then for each documented function all documented 
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES (the default) 
+# then for each documented function all documented entities 
+# called/used by that function will be listed.
+
+REFERENCES_RELATION    = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code 
+# will point to the HTML generated by the htags(1) tool instead of doxygen 
+# built-in source browser. The htags tool is part of GNU's global source 
+# tagging system (see http://www.gnu.org/software/global/global.html). You 
+# will need version 4.8.6 or higher.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
+# will generate a verbatim copy of the header file for each class for 
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
+# of all compounds will be generated. Enable this if the project 
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX     = NO
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all 
+# classes will be put under the same header in the alphabetical index. 
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX          = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
+# generate HTML output.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard header.
+
+HTML_HEADER            = 
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard footer.
+
+HTML_FOOTER            = 
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
+# style sheet that is used by each HTML page. It can be used to 
+# fine-tune the look of the HTML output. If the tag is left blank doxygen 
+# will generate a default style sheet. Note that doxygen will try to copy 
+# the style sheet file to the HTML output directory, so don't put your own 
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET        = 
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
+# files or namespaces will be aligned in HTML using tables. If set to 
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS     = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
+# will be generated that can be used as input for tools like the 
+# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) 
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
+# be used to specify the file name of the resulting .chm file. You 
+# can add a path in front of the file if the result should not be 
+# written to the html output directory.
+
+CHM_FILE               = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
+# be used to specify the location (absolute path including file name) of 
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION           = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
+# controls if a separate .chi index file is generated (YES) or that 
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI           = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
+# controls whether a binary table of contents is generated (YES) or a 
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members 
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND             = NO
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
+# top of each HTML page. The value NO (the default) enables the index and 
+# the value YES disables it.
+
+DISABLE_INDEX          = NO
+
+# This tag can be used to set the number of enum values (range [1..20]) 
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
+# generated containing a tree-like index structure (just like the one that 
+# is generated for HTML Help). For this to work a browser that supports 
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, 
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are 
+# probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW      = no
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
+# used to set the initial width (in pixels) of the frame in which the tree 
+# is shown.
+
+TREEVIEW_WIDTH         = 250
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
+# generate Latex output.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
+# invoked. If left blank `latex' will be used as the default command name.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
+# generate index for LaTeX. If left blank `makeindex' will be used as the 
+# default command name.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
+# LaTeX documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used 
+# by the printer. Possible values are: a4, a4wide, letter, legal and 
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE             = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES         = 
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
+# the generated latex document. The header should contain everything until 
+# the first chapter. If it is left blank doxygen will generate a 
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER           = 
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
+# contain links (just like the HTML output) instead of page references 
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS         = NO
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
+# plain latex in the generated Makefile. Set this option to YES to get a 
+# higher quality PDF documentation.
+
+USE_PDFLATEX           = NO
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
+# command to the generated LaTeX files. This will instruct LaTeX to keep 
+# running if errors occur, instead of asking the user for help. 
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE        = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
+# include the index chapters (such as File Index, Compound Index, etc.) 
+# in the output.
+
+LATEX_HIDE_INDICES     = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
+# The RTF output is optimized for Word 97 and may not look very pretty with 
+# other RTF readers or editors.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
+# RTF documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
+# will contain hyperlink fields. The RTF file will 
+# contain links (just like the HTML output) instead of page references. 
+# This makes the output suitable for online browsing using WORD or other 
+# programs which support those fields. 
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's 
+# config file, i.e. a series of assignments. You only have to provide 
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE    = 
+
+# Set optional variables used in the generation of an rtf document. 
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE    = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
+# generate man pages
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to 
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
+# then it will generate one additional man file for each entity 
+# documented in the real man page(s). These additional files 
+# only source the real man page, but without them the man command 
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will 
+# generate an XML file that captures the structure of 
+# the code including all documentation.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_SCHEMA             = 
+
+# The XML_DTD tag can be used to specify an XML DTD, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_DTD                = 
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
+# dump the program listings (including syntax highlighting 
+# and cross-referencing information) to the XML output. Note that 
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
+# generate an AutoGen Definitions (see autogen.sf.net) file 
+# that captures the structure of the code including all 
+# documentation. Note that this feature is still experimental 
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
+# generate a Perl module file that captures the structure of 
+# the code including all documentation. Note that this 
+# feature is still experimental and incomplete at the 
+# moment.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
+# nicely formatted so it can be parsed by a human reader.  This is useful 
+# if you want to understand what is going on.  On the other hand, if this 
+# tag is set to NO the size of the Perl module output will be much smaller 
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file 
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
+# This is useful so different doxyrules.make files included by the same 
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
+# evaluate all C-preprocessor directives found in the sources and include 
+# files.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
+# names in the source code. If set to NO (the default) only conditional 
+# compilation will be performed. Macro expansion can be done in a controlled 
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION        = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
+# then the macro expansion is limited to the macros specified with the 
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that 
+# contain include files that are not input files but should be processed by 
+# the preprocessor.
+
+INCLUDE_PATH           = 
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
+# patterns (like *.h and *.hpp) to filter out the header-files in the 
+# directories. If left blank, the patterns specified with FILE_PATTERNS will 
+# be used.
+
+INCLUDE_FILE_PATTERNS  = 
+
+# The PREDEFINED tag can be used to specify one or more macro names that 
+# are defined before the preprocessor is started (similar to the -D option of 
+# gcc). The argument of the tag is a list of macros of the form: name 
+# or name=definition (no spaces). If the definition and the = are 
+# omitted =1 is assumed. To prevent a macro definition from being 
+# undefined via #undef or recursively expanded use the := operator 
+# instead of the = operator.
+
+PREDEFINED             =  WEBCIT_WITH_CALENDAR_SERVICE HAVE_OPENSSL ENABLE_NLS HAVE_ICONV HAVE_ZLIB
+
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
+# this tag can be used to specify a list of macro names that should be expanded. 
+# The macro definition that is found in the sources will be used. 
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED      = 
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
+# doxygen's preprocessor will remove all function-like macros that are alone 
+# on a line, have an all uppercase name, and do not end with a semicolon. Such 
+# function macros are typically used for boiler-plate code, and will confuse 
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles. 
+# Optionally an initial location of the external documentation 
+# can be added for each tagfile. The format of a tag file without 
+# this location is as follows: 
+#   TAGFILES = file1 file2 ... 
+# Adding location for the tag files is done as follows: 
+#   TAGFILES = file1=loc1 "file2 = loc2" ... 
+# where "loc1" and "loc2" can be relative or absolute paths or 
+# URLs. If a location is present for each tag, the installdox tool 
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen 
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES               = 
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE       = 
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
+# in the class index. If set to NO only the inherited external classes 
+# will be listed.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
+# in the modules index. If set to NO, only the current project's groups will 
+# be listed.
+
+EXTERNAL_GROUPS        = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script 
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
+# or super classes. Setting the tag to NO turns the diagrams off. Note that 
+# this option is superseded by the HAVE_DOT option below. This is only a 
+# fallback. It is recommended to install and use dot, since it yields more 
+# powerful graphs.
+
+CLASS_DIAGRAMS         = YES
+
+# If set to YES, the inheritance and collaboration graphs will hide 
+# inheritance and usage relations if the target is undocumented 
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
+# available from the path. This tool is part of Graphviz, a graph visualization 
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT               = NO
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect inheritance relations. Setting this tag to YES will force the 
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH            = NO
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect implementation dependencies (inheritance, containment, and 
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
+# collaboration diagrams in a style similar to the OMG's Unified Modeling 
+# Language.
+
+UML_LOOK               = YES
+
+# If set to YES, the inheritance and collaboration graphs will show the 
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
+# tags are set to YES then doxygen will generate a graph for each documented 
+# file showing the direct and indirect include dependencies of the file with 
+# other documented files.
+
+INCLUDE_GRAPH          = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
+# documented header file showing the documented files that directly or 
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will 
+# generate a call dependency graph for every global function or class method. 
+# Note that enabling this option will significantly increase the time of a run. 
+# So in most cases it will be better to enable call graphs for selected 
+# functions only using the \callgraph command.
+
+CALL_GRAPH             = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
+# then doxygen will show the dependencies a directory has on other directories 
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT       = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be 
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH               = 
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that 
+# contain dot files that are included in the documentation (see the 
+# \dotfile command).
+
+DOTFILE_DIRS           = 
+
+# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width 
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than 
+# this value, doxygen will try to truncate the graph, so that it fits within 
+# the specified constraint. Beware that most browsers cannot cope with very 
+# large images.
+
+MAX_DOT_GRAPH_WIDTH    = 1024
+
+# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height 
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than 
+# this value, doxygen will try to truncate the graph, so that it fits within 
+# the specified constraint. Beware that most browsers cannot cope with very 
+# large images.
+
+MAX_DOT_GRAPH_HEIGHT   = 1024
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
+# graphs generated by dot. A depth value of 3 means that only nodes reachable 
+# from the root by following a path via at most 3 edges will be shown. Nodes 
+# that lay further from the root node will be omitted. Note that setting this 
+# option to 1 or 2 may greatly reduce the computation time needed for large 
+# code bases. Also note that a graph may be further truncated if the graph's 
+# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH 
+# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), 
+# the graph is not depth-constrained.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
+# background. This is disabled by default, which results in a white background. 
+# Warning: Depending on the platform used, enabling this option may lead to 
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to 
+# read).
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
+# files in one run (i.e. multiple -o and -T options on the command line). This 
+# makes dot run faster, but since only newer versions of dot (>1.8.10) 
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
+# generate a legend page explaining the meaning of the various boxes and 
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
+# remove the intermediate dot files that are used to generate 
+# the various graphs.
+
+DOT_CLEANUP            = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be 
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE           = NO
diff --git a/webcit/Makefile.in b/webcit/Makefile.in
new file mode 100644 (file)
index 0000000..fc8032c
--- /dev/null
@@ -0,0 +1,133 @@
+# $Id$
+
+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@
+srcdir=@srcdir@
+prefix=@prefix@
+top_builddir=`pwd`
+
+LIB_SUBDIRS=
+PROG_SUBDIRS=@PROG_SUBDIRS@
+SUBDIRS=$(LIB_SUBDIRS) $(PROG_SUBDIRS) 
+
+# End of configuration section
+
+all: all-progs-recursive webserver setup
+
+
+.SUFFIXES: .cpp .c .o
+
+clean:
+       rm -f *.o webcit webserver
+       rm -fr locale/*
+
+distclean: clean
+       rm -f Makefile config.cache config.log config.status \
+               po/Makefile \
+               $(srcdir)/TAGS
+
+setup: setup.o tools.o
+       $(CC) setup.o tools.o \
+       $(LIBOBJS) $(LIBS) $(LDFLAGS) $(SETUP_LIBS) -o setup
+
+webserver: webserver.o context_loop.o tools.o ical_dezonify.o \
+       cookie_conversion.o locate_host.o floors.o summary.o \
+       webcit.o auth.o tcp_sockets.o mainmenu.o serv_func.o who.o \
+       roomops.o messages.o userlist.o paging.o sysmsgs.o useredit.o \
+       vcard.o vcard_edit.o preferences.o html2html.o listsub.o \
+       mime_parser.o graphics.o netconf.o siteconfig.o subst.o rss.o \
+       calendar.o calendar_tools.o calendar_view.o event.o \
+       availability.o iconbar.o crypto.o inetconf.o notes.o wiki.o \
+       groupdav_main.o groupdav_get.o groupdav_propfind.o fmt_date.o \
+       groupdav_options.o autocompletion.o gettext.o tabs.o \
+       groupdav_delete.o groupdav_put.o http_datestring.o setup_wizard.o \
+       $(LIBOBJS)
+       $(CC) webserver.o context_loop.o tools.o cookie_conversion.o \
+       webcit.o auth.o tcp_sockets.o mainmenu.o serv_func.o who.o listsub.o \
+       roomops.o messages.o userlist.o paging.o sysmsgs.o useredit.o \
+       locate_host.o siteconfig.o subst.o vcard.o vcard_edit.o floors.o \
+       mime_parser.o graphics.o netconf.o preferences.o html2html.o rss.o \
+       summary.o calendar.o calendar_tools.o calendar_view.o event.o wiki.o \
+       availability.o ical_dezonify.o iconbar.o crypto.o inetconf.o notes.o \
+       groupdav_main.o groupdav_get.o groupdav_propfind.o groupdav_delete.o \
+       groupdav_options.o autocompletion.o tabs.o \
+       groupdav_put.o http_datestring.o setup_wizard.o fmt_date.o \
+       gettext.o \
+       $(LIBOBJS) $(LIBS) $(LDFLAGS) -o webserver
+
+.c.o:
+       $(CC) $(CFLAGS) $(DEFS) -c $(PTHREAD_DEFS) -DWEBCITDIR=\"$(prefix)\" -DLOCALEDIR=\"$(prefix)/locale\" $<
+
+.cpp.o:
+       $(CC) $(CFLAGS) $(DEFS) -c $(PTHREAD_DEFS) -DWEBCITDIR=\"$(prefix)\" -DLOCALEDIR=\"$(prefix)/locale\"  $<
+
+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.in
+       cd $(srcdir) && $(AUTOCONF)
+
+install:
+       test -d $(root)$(prefix) || mkdir $(root)$(prefix)
+       test -d $(root)$(prefix)/static || mkdir $(root)$(prefix)/static
+       for i in `find tiny_mce -type d | grep -v .svn` \
+               ; do \
+               test -d $(root)$(prefix)/$$i || mkdir $(root)$(prefix)/$$i; \
+       done
+       for i in `find locale -type d | grep -v .svn` \
+               ; do \
+               test -d $(root)$(prefix)/$$i || mkdir $(root)$(prefix)/$$i; \
+       done
+       for i in \
+               webserver \
+               setup \
+               `find static -type f | grep -v .svn` \
+               `find tiny_mce -type f | grep -v .svn` \
+               `find locale -type f | grep -v .svn` \
+               ; do \
+               $(INSTALL) $$i $(root)$(prefix)/$$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..9ffbe4d
--- /dev/null
@@ -0,0 +1,299 @@
+                        WEBCIT for the Citadel System
+                               version 6.82
+   Copyright (C) 1996-2006 by the authors.  Portions written by:
+       Art Cancro
+       Nathan Bryant
+       Alessandro Fulciniti
+       Wilifried Goesgens
+       Nick Grossman
+       Andru Luvisi
+       Dave Lindquist
+       Martin Mouritzen
+
+   This program is open source software released under the terms of the GNU
+   General Public License, version 2.  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.
+
+   WebCit bundles the Nifty Corners library, written by Alessandro Fulciniti
+   [http://cerca.html.it/cgi-bin/cerca.cgi?q=nifty+corners].  This component
+   is licensed to you under the terms of the GNU General Public License.
+
+
+   The Citadel logo was designed by Lisa Aurigemma.
+
+ INTRODUCTION
+ ------------
+ Citadel is a sophisticated groupware and BBS package which allows multiple
+users to simultaneously access the system using a variety of user interfaces.
+This package (WebCit) is a "middleware" package which presents an HTML/HTTP
+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
+ ------------
+ Unline 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 replace your Apache 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, in the more likely situation that you have Apache
+or some other web server listening on port 80, you must run WebCit on another
+port.  The default is 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: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 line to inittab 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/webserver
+ Several command-line options are also available.  Here's the usage for
+the "webserver" program:
+  
+ webserver [-i ip_addr] [-p http_port] [-s] [-t tracefile]
+           [-c] [-f] [remotehost [remoteport]]
+   *or*
+ webserver [-i ip_addr] [-p http_port] [-s] [-t tracefile]
+           [-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.
+  -> 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 2000.
+     
+  -> tracefile: where you want WebCit to log to.  This can be a file, a
+     virtual console, or /dev/null to suppress logging altogether.
+  -> 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 "-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.
+ CALENDAR SERVICE
+ ----------------
+ WebCit contains support for calendaring and scheduling.  In order to use it
+you must have libical v0.24 (or newer) on your system.  You must also be
+running a Citadel server with calendaring support.  The calendar service will
+be automatically configured and installed if your host system supports it.
+ 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:
+
+<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:
+
+<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
+# 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>
+
+  
+ ADVANCED CONFIGURE 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-staticdir defines where webcit should locate and search its templates and images. If you
+want to go with a different installation location then the point at which it is accessed at runtime, 
+you can use --with-staticrundir. This option is meant to ease your needs if you're going
+to install the static files as 'examples' in a location like /usr/share/doc/webcit/examples, 
+and enable the user to copy them over to another dir (like /var/lib/citadel/www), where 
+they're accessed at runtime. (The debian instatll scripts provided with this package 
+do this to preserve user changes to the template system, see debian/citadel-webcit.postinstall)
+
+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)
+
+
+ CONCLUSION
+ ----------
+ That's all you need to know to get started.  If you have any questions or
+comments, please visit UNCENSORED! BBS, the home of Citadel, at
+uncensored.citadel.org.
+
+
diff --git a/webcit/auth.c b/webcit/auth.c
new file mode 100644 (file)
index 0000000..0f594e1
--- /dev/null
@@ -0,0 +1,562 @@
+/*
+ * $Id$
+ */
+/**
+ *
+ * \defgroup WebcitAuth WebcitAuth; Handles authentication of users to a Citadel server.
+ * \ingroup CitadelConfig
+ */
+
+/*@{*/
+#include "webcit.h"
+
+
+
+/**
+ * \brief  user states
+ * the plain text states of a user. filled in at \ function TODO initialize_ax_defs()
+ * due to NLS
+ */
+char *axdefs[7]; 
+
+void initialize_axdefs(void) {
+       axdefs[0] = _("Deleted");       /*!0: an erased user */
+       axdefs[1] = _("New User");      /*!1: a new user */
+       axdefs[2] = _("Problem User");  /*!2: a trouble maker */
+       axdefs[3] = _("Local User");    /*!3: user with normal privileges */
+       axdefs[4] = _("Network User");  /*!4: a user that may access network resources */
+       axdefs[5] = _("Preferred User");/*!5: a moderator */
+       axdefs[6] = _("Aide");          /*!6: chief */
+}
+
+
+
+
+/** 
+ * \brief Display the login screen
+ * \param mesg The error message if last attempt failed.
+ */
+void display_login(char *mesg)
+{
+       char buf[SIZ];
+
+       output_headers(1, 1, 2, 0, 0, 0);
+       wprintf("<div style=\"position:absolute; top:20px; left:20px; right:20px\">\n");
+
+       if (mesg != NULL) if (strlen(mesg) > 0) {
+               stresc(buf, mesg, 0, 0);
+               svprintf("mesg", WCS_STRING, "%s", buf);
+       }
+
+       svprintf("LOGIN_INSTRUCTIONS", WCS_STRING,
+               _("<ul>"
+               "<li><b>If you already have an account on %s</b>, "
+               "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.<br />"
+               "</ul>"),
+               serv_info.serv_humannode
+       );
+
+       svprintf("USERNAME_BOX", WCS_STRING, "%s", _("User name:"));
+       svprintf("PASSWORD_BOX", WCS_STRING, "%s", _("Password:"));
+       svprintf("LANGUAGE_BOX", WCS_STRING, "%s", _("Language:"));
+       svprintf("LOGIN_BUTTON", WCS_STRING, "%s", _("Login"));
+       svprintf("NEWUSER_BUTTON", WCS_STRING, "%s", _("New User"));
+       svprintf("EXIT_BUTTON", WCS_STRING, "%s", _("Exit"));
+       svprintf("hello", WCS_SERVCMD, "MESG hello");
+       svprintf("BOXTITLE", WCS_STRING, _("%s - powered by Citadel"),
+               serv_info.serv_humannode);
+       svcallback("DO_LANGUAGE_BOX", offer_languages);
+       if (serv_info.serv_newuser_disabled) {
+               svprintf("NEWUSER_BUTTON_PRE", WCS_STRING, "<div style=\"display:none;\">");
+               svprintf("NEWUSER_BUTTON_POST", WCS_STRING, "</div>");
+       }
+       else {
+               svprintf("NEWUSER_BUTTON_PRE", WCS_STRING, "");
+               svprintf("NEWUSER_BUTTON_POST", WCS_STRING, "");
+       }
+
+       do_template("login");
+
+       wDumpContent(2);
+}
+
+
+
+
+/** \brief 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.
+ *
+ * \param user the username
+ * \param pass his password
+ * \param serv_response The parameters returned from a Citadel USER or NEWU command
+ */
+void become_logged_in(char *user, char *pass, char *serv_response)
+{
+       char buf[SIZ];
+
+       WC->logged_in = 1;
+       extract_token(WC->wc_fullname, &serv_response[4], 0, '|', sizeof WC->wc_fullname);
+       safestrncpy(WC->wc_username, user, sizeof WC->wc_username);
+       safestrncpy(WC->wc_password, pass, sizeof WC->wc_password);
+       WC->axlevel = extract_int(&serv_response[4], 1);
+       if (WC->axlevel >= 6) {
+               WC->is_aide = 1;
+       }
+
+       load_preferences();
+
+       serv_puts("CHEK");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '2') {
+               WC->new_mail = extract_int(&buf[4], 0);
+               WC->need_regi = extract_int(&buf[4], 1);
+               WC->need_vali = extract_int(&buf[4], 2);
+               extract_token(WC->cs_inet_email, &buf[4], 3, '|', sizeof WC->cs_inet_email);
+       }
+
+       get_preference("current_iconbar", buf, sizeof buf);
+       WC->current_iconbar = atoi(buf);
+
+       get_preference("floordiv_expanded", WC->floordiv_expanded, sizeof WC->floordiv_expanded);
+}
+
+
+/** 
+ * \brief Login Checks
+ * the logics to detect invalid passwords not to get on citservers nerves
+ */
+void do_login(void)
+{
+       char buf[SIZ];
+
+       if (strlen(bstr("language")) > 0) {
+               set_selected_language(bstr("language"));
+               go_selected_language();
+       }
+
+       if (strlen(bstr("exit_action")) > 0) {
+               do_logout();
+               return;
+       }
+       if (strlen(bstr("login_action")) > 0) {
+               serv_printf("USER %s", bstr("name"));
+               serv_getln(buf, sizeof buf);
+               if (buf[0] == '3') {
+                       serv_printf("PASS %s", bstr("pass"));
+                       serv_getln(buf, sizeof buf);
+                       if (buf[0] == '2') {
+                               become_logged_in(bstr("name"),
+                                                bstr("pass"), buf);
+                       } else {
+                               display_login(&buf[4]);
+                               return;
+                       }
+               } else {
+                       display_login(&buf[4]);
+                       return;
+               }
+       }
+       if (strlen(bstr("newuser_action")) > 0) {
+               if (strlen(bstr("pass")) == 0) {
+                       display_login(_("Blank passwords are not allowed."));
+                       return;
+               }
+               serv_printf("NEWU %s", bstr("name"));
+               serv_getln(buf, sizeof buf);
+               if (buf[0] == '2') {
+                       become_logged_in(bstr("name"), bstr("pass"), buf);
+                       serv_printf("SETP %s", bstr("pass"));
+                       serv_getln(buf, sizeof buf);
+               } else {
+                       display_login(&buf[4]);
+                       return;
+               }
+       }
+       if (WC->logged_in) {
+               if (WC->need_regi) {
+                       display_reg(1);
+               } else {
+                       do_welcome();
+               }
+       } else {
+               display_login(_("Your password was not accepted."));
+       }
+
+}
+
+/**
+ * \brief display the user a welcome screen. 
+ * if this is the first time login, and the web based setup is enabled, 
+ * lead the user through the setup routines
+ */
+void do_welcome(void)
+{
+       char buf[SIZ];
+#ifdef XXX_NOT_FINISHED_YET_XXX
+       FILE *fp;
+       int i;
+
+       /**
+        * See if we have to run the first-time setup wizard
+        */
+       if (WC->is_aide) {
+               if (!setup_wizard) {
+                       sprintf(wizard_filename, "setupwiz.%s.%s",
+                               ctdlhost, ctdlport);
+                       for (i=0; i<strlen(wizard_filename); ++i) {
+                               if (    (wizard_filename[i]==' ')
+                                       || (wizard_filename[i] == '/')
+                               ) {
+                                       wizard_filename[i] = '_';
+                               }
+                       }
+       
+                       fp = fopen(wizard_filename, "r");
+                       if (fp != NULL) {
+                               fgets(buf, sizeof buf, fp);
+                               buf[strlen(buf)-1] = 0;
+                               fclose(fp);
+                               if (atoi(buf) == serv_info.serv_rev_level) {
+                                       setup_wizard = 1; /**< already run */
+                               }
+                       }
+               }
+
+               if (!setup_wizard) {
+                       http_redirect("setup_wizard");
+               }
+       }
+#endif
+
+       /**
+        * Go to the user's preferred start page
+        */
+       get_preference("startpage", buf, sizeof buf);
+       if (strlen(buf)==0) {
+               safestrncpy(buf, "dotskip&room=_BASEROOM_", sizeof buf);
+               set_preference("startpage", buf, 1);
+       }
+       if (buf[0] == '/') {
+               strcpy(buf, &buf[1]);
+       }
+       http_redirect(buf);
+}
+
+
+/**
+ * Disconnect from the Citadel server, and end this WebCit session
+ */
+void end_webcit_session(void) {
+       char buf[256];
+
+       if (WC->logged_in) {
+               sprintf(buf, "%d", WC->current_iconbar);
+               set_preference("current_iconbar", buf, 0);
+               set_preference("floordiv_expanded", WC->floordiv_expanded, 1);
+       }
+
+       serv_puts("QUIT");
+       WC->killthis = 1;
+       /* close() of citadel socket will be done by do_housekeeping() */
+}
+
+/** 
+ * execute the logout
+ */
+void do_logout(void)
+{
+       char buf[SIZ];
+
+       safestrncpy(WC->wc_username, "", sizeof WC->wc_username);
+       safestrncpy(WC->wc_password, "", sizeof WC->wc_password);
+       safestrncpy(WC->wc_roomname, "", sizeof WC->wc_roomname);
+       safestrncpy(WC->wc_fullname, "", sizeof WC->wc_fullname);
+
+       /** Calling output_headers() this way causes the cookies to be un-set */
+       output_headers(1, 1, 0, 1, 0, 0);
+
+       wprintf("<center>");
+       serv_puts("MESG goodbye");
+       serv_getln(buf, sizeof buf);
+
+       if (WC->serv_sock >= 0) {
+               if (buf[0] == '1') {
+                       fmout("CENTER");
+               } else {
+                       wprintf("Goodbye\n");
+               }
+       }
+       else {
+               wprintf(_("This program was unable to connect or stay "
+                       "connected to the Citadel server.  Please report "
+                       "this problem to your system administrator.")
+               );
+       }
+
+       wprintf("<hr /><a href=\".\">");
+       wprintf(_("Log in again"));
+       wprintf("</A>&nbsp;&nbsp;&nbsp;"
+               "<a href=\"javascript:window.close();\">");
+       wprintf(_("Close window"));
+       wprintf("</a></center>\n");
+       wDumpContent(2);
+       end_webcit_session();
+}
+
+
+/* *
+ * validate new users
+ */
+void validate(void)
+{
+       char cmd[SIZ];
+       char user[SIZ];
+       char buf[SIZ];
+       int a;
+
+       output_headers(1, 1, 2, 0, 0, 0);
+       wprintf("<div id=\"banner\">\n"
+               "<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>"
+               "<SPAN CLASS=\"titlebar\">");
+       wprintf(_("Validate new users"));
+       wprintf("</SPAN></TD></TR></TABLE>\n</div>\n<div id=\"content\">\n");
+
+       /** If the user just submitted a validation, process it... */
+       safestrncpy(buf, bstr("user"), sizeof buf);
+       if (strlen(buf) > 0) {
+               if (strlen(bstr("axlevel")) > 0) {
+                       serv_printf("VALI %s|%s", buf, bstr("axlevel"));
+                       serv_getln(buf, sizeof buf);
+                       if (buf[0] != '2') {
+                               wprintf("<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') {
+               wprintf("<b>");
+               wprintf(_("No users require validation at this time."));
+               wprintf("</b><br />\n");
+               wDumpContent(1);
+               return;
+       }
+       if (buf[0] != '3') {
+               wprintf("<b>%s</b><br />\n", &buf[4]);
+               wDumpContent(1);
+               return;
+       }
+
+       wprintf("<div class=\"fix_scrollbar_bug\">"
+               "<table border=0 width=100%% bgcolor=\"#ffffff\"><tr><td>\n");
+       wprintf("<center>");
+
+       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)
+                               wprintf("#%s<br /><H1>%s</H1>",
+                                       buf, &cmd[4]);
+                       if (a == 2)
+                               wprintf("PW: %s<br />\n", buf);
+                       if (a == 3)
+                               wprintf("%s<br />\n", buf);
+                       if (a == 4)
+                               wprintf("%s<br />\n", buf);
+                       if (a == 5)
+                               wprintf("%s, ", buf);
+                       if (a == 6)
+                               wprintf("%s ", buf);
+                       if (a == 7)
+                               wprintf("%s<br />\n", buf);
+                       if (a == 8)
+                               wprintf("%s<br />\n", buf);
+                       if (a == 9)
+                               wprintf(_("Current access level: %d (%s)\n"),
+                                       atoi(buf), axdefs[atoi(buf)]);
+               } while (strcmp(buf, "000"));
+       } else {
+               wprintf("<H1>%s</H1>%s<br />\n", user, &cmd[4]);
+       }
+
+       wprintf("<hr />");
+       wprintf(_("Select access level for this user:"));
+       wprintf("<br />\n");
+       for (a = 0; a <= 6; ++a) {
+               wprintf("<a href=\"validate&user=");
+               urlescputs(user);
+               wprintf("&axlevel=%d\">%s</A>&nbsp;&nbsp;&nbsp;\n",
+                       a, axdefs[a]);
+       }
+       wprintf("<br />\n");
+
+       wprintf("</CENTER>\n");
+       wprintf("</td></tr></table></div>\n");
+       wDumpContent(1);
+}
+
+
+
+/** 
+ * \brief 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.)
+ * \param during_login are we just in the login phase?
+ */
+void display_reg(int during_login)
+{
+       long vcard_msgnum;
+
+       if (goto_config_room() != 0) {
+               if (during_login) do_welcome();
+               else display_main_menu();
+               return;
+       }
+
+       vcard_msgnum = locate_user_vcard(WC->wc_fullname, -1);
+       if (vcard_msgnum < 0L) {
+               if (during_login) do_welcome();
+               else display_main_menu();
+               return;
+       }
+
+       if (during_login) {
+               do_edit_vcard(vcard_msgnum, "1", "do_welcome");
+       }
+       else {
+               do_edit_vcard(vcard_msgnum, "1", "display_main_menu");
+       }
+
+}
+
+
+
+
+/** 
+ * display form for changing your password
+ */
+void display_changepw(void)
+{
+       char buf[SIZ];
+
+       output_headers(1, 1, 2, 0, 0, 0);
+       wprintf("<div id=\"banner\">\n"
+               "<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>"
+               "<SPAN CLASS=\"titlebar\">");
+       wprintf(_("Change your password"));
+       wprintf("</SPAN>"
+               "</TD></TR></TABLE>\n"
+               "</div>\n<div id=\"content\">\n"
+       );
+
+       if (strlen(WC->ImportantMessage) > 0) {
+               do_template("beginbox_nt");
+               wprintf("<SPAN CLASS=\"errormsg\">"
+                       "%s</SPAN><br />\n", WC->ImportantMessage);
+               do_template("endbox");
+               safestrncpy(WC->ImportantMessage, "", sizeof WC->ImportantMessage);
+       }
+
+       wprintf("<div class=\"fix_scrollbar_bug\">"
+               "<table border=0 width=100%% bgcolor=\"#ffffff\"><tr><td>\n");
+
+       wprintf("<CENTER><br />");
+       serv_puts("MESG changepw");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '1') {
+               fmout("CENTER");
+       }
+
+       wprintf("<form name=\"changepwform\" action=\"changepw\" method=\"post\">\n");
+       wprintf("<CENTER>"
+               "<table border=\"0\" cellspacing=\"5\" cellpadding=\"5\" "
+               "BGCOLOR=\"#EEEEEE\">"
+               "<TR><TD>");
+       wprintf(_("Enter new password:"));
+       wprintf("</TD>\n");
+       wprintf("<TD><INPUT TYPE=\"password\" NAME=\"newpass1\" VALUE=\"\" MAXLENGTH=\"20\"></TD></TR>\n");
+       wprintf("<TR><TD>");
+       wprintf(_("Enter it again to confirm:"));
+       wprintf("</TD>\n");
+       wprintf("<TD><INPUT TYPE=\"password\" NAME=\"newpass2\" VALUE=\"\" MAXLENGTH=\"20\"></TD></TR>\n");
+
+       wprintf("</TABLE><br />\n");
+       wprintf("<INPUT type=\"submit\" name=\"change_action\" value=\"%s\">", _("Change password"));
+       wprintf("&nbsp;");
+       wprintf("<INPUT type=\"submit\" name=\"cancel_action\" value=\"%s\">\n", _("Cancel"));
+       wprintf("</form></center>\n");
+       wprintf("</td></tr></table></div>\n");
+       wDumpContent(1);
+}
+
+/**
+ * \brief change password
+ * if passwords match, propagate it to citserver.
+ */
+void changepw(void)
+{
+       char buf[SIZ];
+       char newpass1[32], newpass2[32];
+
+       if (strlen(bstr("change_action")) == 0) {
+               safestrncpy(WC->ImportantMessage, 
+                       _("Cancelled.  Password was not changed."),
+                       sizeof WC->ImportantMessage);
+               display_main_menu();
+               return;
+       }
+
+       safestrncpy(newpass1, bstr("newpass1"), sizeof newpass1);
+       safestrncpy(newpass2, bstr("newpass2"), sizeof newpass2);
+
+       if (strcasecmp(newpass1, newpass2)) {
+               safestrncpy(WC->ImportantMessage, 
+                       _("They don't match.  Password was not changed."),
+                       sizeof WC->ImportantMessage);
+               display_changepw();
+               return;
+       }
+
+       if (strlen(newpass1) == 0) {
+               safestrncpy(WC->ImportantMessage, 
+                       _("Blank passwords are not allowed."),
+                       sizeof WC->ImportantMessage);
+               display_changepw();
+               return;
+       }
+
+       serv_printf("SETP %s", newpass1);
+       serv_getln(buf, sizeof buf);
+       sprintf(WC->ImportantMessage, "%s", &buf[4]);
+       if (buf[0] == '2') {
+               safestrncpy(WC->wc_password, buf, sizeof WC->wc_password);
+               display_main_menu();
+       }
+       else {
+               display_changepw();
+       }
+}
+
+
+
+/** @} */
diff --git a/webcit/autocompletion.c b/webcit/autocompletion.c
new file mode 100644 (file)
index 0000000..0b9373e
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * $Id$
+ *//**
+ * \defgroup AjaxAutoCompletion ajax-powered autocompletion...
+ * \ingroup ClientPower
+ */
+
+/*@{*/
+#include "webcit.h"
+
+/**
+ * \brief Recipient autocompletion results
+ * \param partial the account to search for ??????
+ */
+void recp_autocomplete(char *partial) {
+       char buf[1024];
+       char name[128];
+
+       output_headers(0, 0, 0, 0, 0, 0);
+
+       wprintf("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",
+               SERVER);
+       begin_burst();
+
+       wprintf("<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);
+                       wprintf("<li>");
+                       escputs(name);
+                       wprintf("</li>");
+               }
+       }
+
+       wprintf("</ul>");
+
+       wprintf("\r\n\r\n");
+       wDumpContent(0);
+}
+
+
+/** @} */
diff --git a/webcit/availability.c b/webcit/availability.c
new file mode 100644 (file)
index 0000000..0c1198a
--- /dev/null
@@ -0,0 +1,262 @@
+/*
+ * $Id$
+ */
+/**
+ *
+ * \defgroup CalendarAv  Check attendee availability for scheduling a meeting.
+ * \ingroup Calendaring
+ */
+/*@{*/
+
+
+#include "webcit.h"
+#include "webserver.h"
+
+/** only available if we have calendaring */
+#ifdef WEBCIT_WITH_CALENDAR_SERVICE
+
+
+
+/**
+ * \brief verify users avaiability
+ * Utility function to fetch a VFREEBUSY type of thing for
+ * any specified user.
+ * \param who string of the user to search
+ */
+icalcomponent *get_freebusy_for_user(char *who) {
+       char buf[SIZ];
+       char *serialized_fb = NULL;
+       icalcomponent *fb = NULL;
+
+       serv_printf("ICAL freebusy|%s", who);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '1') {
+               serialized_fb = read_server_text();
+       }
+
+       if (serialized_fb == NULL) {
+               return NULL;
+       }
+       
+       fb = icalcomponent_new_from_string(serialized_fb);
+       free(serialized_fb);
+       if (fb == NULL) {
+               return NULL;
+       }
+
+       return(fb);
+}
+
+
+
+
+/**
+ * \brief Check if dates are overlapping
+ * 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.  Better yet, put it in a library.)
+ * \param t1start date one start
+ * \param t1end  date one end
+ * \param t2start date one start
+ * \param t2end date two end
+ * \returns nonzero if they do.
+ */
+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);
+
+       /** First, check for all-day events */
+       if (t1start.is_date) {
+               if (!icaltime_compare_date_only(t1start, t2start)) {
+                       return(1);
+               }
+               if (!icaltime_is_null_time(t2end)) {
+                       if (!icaltime_compare_date_only(t1start, t2end)) {
+                               return(1);
+                       }
+               }
+       }
+
+       if (t2start.is_date) {
+               if (!icaltime_compare_date_only(t2start, t1start)) {
+                       return(1);
+               }
+               if (!icaltime_is_null_time(t1end)) {
+                       if (!icaltime_compare_date_only(t2start, t1end)) {
+                               return(1);
+                       }
+               }
+       }
+
+       /** Now check for overlaps using date *and* time. */
+
+       /** First, bail out if either event 1 or event 2 is missing end time. */
+       if (icaltime_is_null_time(t1end)) return(0);
+       if (icaltime_is_null_time(t2end)) return(0);
+
+       /** If event 1 ends before event 2 starts, we're in the clear. */
+       if (icaltime_compare(t1end, t2start) <= 0) return(0);
+
+       /** If event 2 ends before event 1 starts, we're also ok. */
+       if (icaltime_compare(t2end, t1start) <= 0) return(0);
+
+       /** Otherwise, they overlap. */
+       return(1);
+}
+
+
+
+/*
+ * \brief dig availability on citserver
+ * 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.  
+ * \param attendee_string name of the attendee
+ * \param event_start starttime of the event to check
+ * \param event_end endtime of the event to check
+ * \return 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);
+}
+
+
+
+
+/**
+ * \brief check attendees availability
+ * Check the availability of all attendees for an event (when possible)
+ * and annotate accordingly.
+ * \param 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];
+
+       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)) {
+
+               strcpy(attendee_string, icalproperty_get_attendee(attendee));
+               if (!strncasecmp(attendee_string, "MAILTO:", 7)) {
+
+                       /** screen name or email address */
+                       strcpy(attendee_string, &attendee_string[7]);
+                       striplt(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);
+
+               }
+       }
+
+}
+
+
+#endif /* WEBCIT_WITH_CALENDAR_SERVICE */
+
+/** @} */
diff --git a/webcit/bootstrap b/webcit/bootstrap
new file mode 100755 (executable)
index 0000000..bf42772
--- /dev/null
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+autoconf
diff --git a/webcit/buildpackages b/webcit/buildpackages
new file mode 100755 (executable)
index 0000000..a2a7a60
--- /dev/null
@@ -0,0 +1,56 @@
+#!/bin/bash
+
+WEBCIT_VERSION=`grep "THIS IS" ChangeLog  |head -n 1|sed "s;.* ;;"`
+PACKAGE_VERSION=`cat packageversion`
+DATE=`date '+%a, %d %b %Y %H:%I:00 %z'`
+ACTUAL_DIR=`pwd`
+
+if echo "$ACTUAL_DIR" |grep -q "$WEBCIT_VERSION"; then
+       echo "directory ($ACTUAL_DIR) naming scheme seems right. nothing done."
+else
+       done=false
+       if test -L "$ACTUAL_DIR"; then 
+               SYMLINK_=`pwd`
+               SYMLINK=`ls -l $SYMLINK_|sed "s;.*-> ;;"`
+               if ls -l $SYMLINK_|grep -q "$WEBCIT_VERSION"; then
+                       done=true
+               fi
+       else
+               SYMLINK=`pwd|sed "s;.*/;;"`
+       fi
+       if test "$done" = "false"; then 
+               cd ..
+               mv -- $SYMLINK "webcit-$WEBCIT_VERSION"
+               ln -s "webcit-$WEBCIT_VERSION" webcit
+               cd "webcit-$WEBCIT_VERSION"
+       else
+               cd "../webcit-$WEBCIT_VERSION"
+       fi
+       
+fi
+./bootstrap
+case $1 in
+       debian)
+               cat debian/files_preview | sed \
+                       -e "s;@WEBCIT_VERSION@;${WEBCIT_VERSION};" \
+                       -e "s;@PACKAGE_VERSION@;${PACKAGE_VERSION};" \
+                       > debian/files
+               if grep -q "$WEBCIT_VERSION" debian/changelog; then
+                       echo rebuilding package.
+               else
+                       echo "webcit (${WEBCIT_VERSION}-${PACKAGE_VERSION}) unstable; urgency=low
+       
+  * update to actual Webcit SVN. many new features. see Packages changelog.
+
+ -- Wilfried Goesgens <w.goesgens@chaosindustries.de>  $DATE
+       " >/tmp/webcit_changelog
+                       cat debian/changelog >>/tmp/webcit_changelog
+                       mv /tmp/webcit_changelog debian/changelog
+                       
+               fi
+               fakeroot dpkg-buildpackage
+       ;;
+       *)
+               echo "Not yet implemented. we have: debian "
+               ;;
+esac
\ No newline at end of file
diff --git a/webcit/calendar.c b/webcit/calendar.c
new file mode 100644 (file)
index 0000000..5353dfa
--- /dev/null
@@ -0,0 +1,1008 @@
+/*
+ * $Id$
+ */
+/**
+ * \defgroup calav Functions which handle calendar objects and their processing/display.
+ * \ingroup Calendaring
+ */
+/* @{ */
+
+#include "webcit.h"
+#include "webserver.h"
+
+#ifndef WEBCIT_WITH_CALENDAR_SERVICE
+
+/**
+ * \brief get around non existing types
+ * Handler stubs for builds with no calendar library available
+ * \param part_source dummy pointer to the source
+ * \param msgnum number of the mesage in the db
+ * \param cal_partnum number of the calendar part
+ */
+void cal_process_attachment(char *part_source, long msgnum, char *cal_partnum) {
+
+       wprintf(_("<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")
+       );
+
+}
+
+/**
+ * \brief say we can't display calendar items
+ * \param msgnum number of the mesage in our db
+ */
+void display_calendar(long msgnum) {
+       wprintf(_("<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"));
+}
+
+/**
+ * \brief say we can't display task items
+ * \param msgnum number of the mesage in our db
+ */
+void display_task(long msgnum) {
+       wprintf(_("<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"));
+}
+/** ok, we have calendaring available */
+#else /* WEBCIT_WITH_CALENDAR_SERVICE */
+
+
+/******   End of handler stubs.  Everything below this line is real.   ******/
+
+
+
+
+/**
+ * \brief Process a calendar object
+ * ...at this point it's already been deserialized by cal_process_attachment()
+ * \param cal teh calendar object
+ * \param recursion_level call stack depth ??????
+ * \param msgnum number of the mesage in our db
+ * \param cal_partnum of the calendar object ???? 
+ */
+void cal_process_object(icalcomponent *cal,
+                       int recursion_level,
+                       long msgnum,
+                       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;
+
+       /** Leading HTML for the display of this object */
+       if (recursion_level == 0) {
+               wprintf("<CENTER><TABLE border=0>\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) {
+               the_method = icalproperty_get_method(method);
+               switch(the_method) {
+                   case ICAL_METHOD_REQUEST:
+                       wprintf("<tr><td colspan=\"2\">\n"
+                               "<img align=\"center\" "
+                               "src=\"static/calarea_48x.gif\">"
+                               "&nbsp;&nbsp;"  
+                               "<B>");
+                       wprintf(_("Meeting invitation"));
+                       wprintf("</B></TD></TR>\n");
+                       break;
+                   case ICAL_METHOD_REPLY:
+                       wprintf("<TR><TD COLSPAN=2>\n"
+                               "<IMG ALIGN=CENTER "
+                               "src=\"static/calarea_48x.gif\">"
+                               "&nbsp;&nbsp;"  
+                               "<B>");
+                       wprintf(_("Attendee's reply to your invitation"));
+                       wprintf("</B></TD></TR>\n");
+                       break;
+                   case ICAL_METHOD_PUBLISH:
+                       wprintf("<TR><TD COLSPAN=2>\n"
+                               "<IMG ALIGN=CENTER "
+                               "src=\"static/calarea_48x.gif\">"
+                               "&nbsp;&nbsp;"  
+                               "<B>");
+                       wprintf(_("Published event"));
+                       wprintf("</B></TD></TR>\n");
+                       break;
+                   default:
+                       wprintf("<TR><TD COLSPAN=2>");
+                       wprintf(_("This is an unknown type of calendar item."));
+                       wprintf("</TD></TR>\n");
+                       break;
+               }
+       }
+
+       p = icalcomponent_get_first_property(cal, ICAL_SUMMARY_PROPERTY);
+       if (p != NULL) {
+               wprintf("<TR><TD><B>");
+               wprintf(_("Summary:"));
+               wprintf("</B></TD><TD>");
+               escputs((char *)icalproperty_get_comment(p));
+               wprintf("</TD></TR>\n");
+       }
+
+       p = icalcomponent_get_first_property(cal, ICAL_LOCATION_PROPERTY);
+       if (p != NULL) {
+               wprintf("<TR><TD><B>");
+               wprintf(_("Location:"));
+               wprintf("</B></TD><TD>");
+               escputs((char *)icalproperty_get_comment(p));
+               wprintf("</TD></TR>\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);
+                               wprintf("<TR><TD><B>");
+                               wprintf(_("Date:"));
+                               wprintf("</B></TD><TD>%s</TD></TR>", d_str);
+                       }
+                       else {
+                               tt = icaltime_as_timet(t);
+                               fmt_date(buf, tt, 0);
+                               wprintf("<TR><TD><B>");
+                               wprintf(_("Starting date/time:"));
+                               wprintf("</B></TD><TD>%s</TD></TR>", buf);
+                       }
+               }
+       
+               p = icalcomponent_get_first_property(cal, ICAL_DTEND_PROPERTY);
+               if (p != NULL) {
+                       t = icalproperty_get_dtend(p);
+                       tt = icaltime_as_timet(t);
+                       fmt_date(buf, tt, 0);
+                       wprintf("<TR><TD><B>");
+                       wprintf(_("Ending date/time:"));
+                       wprintf("</B></TD><TD>%s</TD></TR>", buf);
+               }
+
+       }
+
+       p = icalcomponent_get_first_property(cal, ICAL_DESCRIPTION_PROPERTY);
+       if (p != NULL) {
+               wprintf("<TR><TD><B>");
+               wprintf(_("Description:"));
+               wprintf("</B></TD><TD>");
+               escputs((char *)icalproperty_get_comment(p));
+               wprintf("</TD></TR>\n");
+       }
+
+       /** 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)) {
+               wprintf("<TR><TD><B>");
+               wprintf(_("Attendee:"));
+               wprintf("</B></TD><TD>");
+               safestrncpy(buf, icalproperty_get_attendee(p), sizeof buf);
+               if (!strncasecmp(buf, "MAILTO:", 7)) {
+
+                       /** screen name or email address */
+                       strcpy(buf, &buf[7]);
+                       striplt(buf);
+                       escputs(buf);
+                       wprintf(" ");
+
+                       /** participant status */
+                       partstat_as_string(buf, p);
+                       escputs(buf);
+               }
+               wprintf("</TD></TR>\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(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 */
+               lprintf(9, "Checking server calendar for conflicts...\n");
+               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);
+                               }
+
+                               wprintf("<TR><TD><B><I>%s</I></B></TD><td>",
+                                       (is_update ?
+                                               _("Update:") :
+                                               _("CONFLICT:")
+                                       )
+                               );
+                               escputs(conflict_message);
+                               wprintf("</TD></TR>\n");
+                       }
+               }
+               lprintf(9, "...done.\n");
+
+               /** Display the Accept/Decline buttons */
+               wprintf("<tr><td>%s</td>"
+                       "<td><font size=+1>"
+                       "<a href=\"respond_to_request?msgnum=%ld&cal_partnum=%s&sc=Accept\">%s</a>"
+                       " | "
+                       "<a href=\"respond_to_request?msgnum=%ld&cal_partnum=%s&sc=Tentative\">%s</a>"
+                       " | "
+                       "<a href=\"respond_to_request?msgnum=%ld&cal_partnum=%s&sc=Decline\">%s</a>"
+                       "</FONT></TD></TR>\n",
+                       _("How would you like to respond to this invitation?"),
+                       msgnum, cal_partnum, _("Accept"),
+                       msgnum, cal_partnum, _("Tentative"),
+                       msgnum, cal_partnum, _("Decline")
+               );
+
+       }
+
+       /** If this is a REPLY, display update button */
+       if (the_method == ICAL_METHOD_REPLY) {
+
+               /** \todo  In the future, if we want to validate this object before \
+                * continuing, we can do it this way:
+               serv_printf("ICAL whatever|%ld|%s|", msgnum, cal_partnum);
+               serv_getln(buf, sizeof buf);
+               }
+                ***********/
+
+               /** Display the update buttons */
+               wprintf("<TR><TD>"
+                       "%s"
+                       "</td><td><font size=+1>"
+                       "<a href=\"handle_rsvp?msgnum=%ld&cal_partnum=%s&sc=Update\">%s</a>"
+                       " | "
+                       "<a href=\"handle_rsvp?msgnum=%ld&cal_partnum=%s&sc=Ignore\">%s</a>"
+                       "</font>"
+                       "</TD></TR>\n",
+                       _("Click <i>Update</i> to accept this reply and update your calendar."),
+                       msgnum, cal_partnum, _("Update"),
+                       msgnum, cal_partnum, _("Ignore")
+               );
+
+       }
+
+       /** Trailing HTML for the display of this object */
+       if (recursion_level == 0) {
+
+               wprintf("</TR></TABLE></CENTER>\n");
+       }
+}
+
+
+/**
+ * \brief process calendar mail atachment
+ * Deserialize a calendar object in a message so it can be processed.
+ * (This is the main entry point for these things)
+ * \param part_source the part of the message we want to parse
+ * \param msgnum number of the mesage in our db
+ * \param cal_partnum the number of the calendar item
+ */
+void cal_process_attachment(char *part_source, long msgnum, char *cal_partnum) {
+       icalcomponent *cal;
+
+       cal = icalcomponent_new_from_string(part_source);
+
+       if (cal == NULL) {
+               wprintf(_("There was an error parsing this calendar item."));
+               wprintf("<br />\n");
+               return;
+       }
+
+       ical_dezonify(cal);
+       cal_process_object(cal, 0, msgnum, cal_partnum);
+
+       /* Free the memory we obtained from libical's constructor */
+       icalcomponent_free(cal);
+}
+
+
+
+
+/**
+ * \brief accept/decline meeting
+ * Respond to a meeting request
+ */
+void respond_to_request(void) {
+       char buf[SIZ];
+
+       output_headers(1, 1, 2, 0, 0, 0);
+
+       wprintf("<div id=\"banner\">\n");
+       wprintf("<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>"
+               "<SPAN CLASS=\"titlebar\">");
+       wprintf(_("Respond to meeting request"));
+       wprintf("</SPAN>"
+               "</TD></TR></TABLE>\n"
+       );
+       wprintf("</div>\n<div id=\"content\">\n");
+
+       serv_printf("ICAL respond|%s|%s|%s|",
+               bstr("msgnum"),
+               bstr("cal_partnum"),
+               bstr("sc")
+       );
+       serv_getln(buf, sizeof buf);
+
+       if (buf[0] == '2') {
+               wprintf("<TABLE BORDER=0><TR><TD>"
+                       "<img src=\"static/calarea_48x.gif\" ALIGN=CENTER>"
+                       "</TD><TD>"
+               );
+               if (!strcasecmp(bstr("sc"), "accept")) {
+                       wprintf(_("You have accepted this meeting invitation.  "
+                               "It has been entered into your calendar.")
+                       );
+               } else if (!strcasecmp(bstr("sc"), "tentative")) {
+                       wprintf(_("You have tentatively accepted this meeting invitation.  "
+                               "It has been 'pencilled in' to your calendar.")
+                       );
+               } else if (!strcasecmp(bstr("sc"), "decline")) {
+                       wprintf(_("You have declined this meeting invitation.  "
+                               "It has <b>not</b> been entered into your calendar.")
+                       );
+               }
+               wprintf(" ");
+               wprintf(_("A reply has been sent to the meeting organizer."));
+               wprintf("</TD></TR></TABLE>\n");
+       } else {
+               wprintf("<img src=\"static/error.gif\" ALIGN=CENTER>"
+                       "%s\n", &buf[4]);
+       }
+
+       wprintf("<a href=\"dotskip?room=");
+       urlescputs(WC->wc_roomname);
+       wprintf("\"><br />");
+       wprintf(_("Return to messages"));
+       wprintf("</A><br />\n");
+
+       wDumpContent(1);
+}
+
+
+
+/**
+ * \brief Handle an incoming RSVP
+ */
+void handle_rsvp(void) {
+       char buf[SIZ];
+
+       output_headers(1, 1, 2, 0, 0, 0);
+
+       wprintf("<div id=\"banner\">\n");
+       wprintf("<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>"
+               "<SPAN CLASS=\"titlebar\">");
+       wprintf(_("Update your calendar with this RSVP"));
+       wprintf("</SPAN>"
+               "</TD></TR></TABLE>\n"
+               "</div>\n<div id=\"content\">\n"
+       );
+
+       serv_printf("ICAL handle_rsvp|%s|%s|%s|",
+               bstr("msgnum"),
+               bstr("cal_partnum"),
+               bstr("sc")
+       );
+       serv_getln(buf, sizeof buf);
+
+       if (buf[0] == '2') {
+               wprintf("<TABLE BORDER=0><TR><TD>"
+                       "<img src=\"static/calarea_48x.gif\" ALIGN=CENTER>"
+                       "</TD><TD>"
+               );
+               if (!strcasecmp(bstr("sc"), "update")) {
+                       wprintf(_("Your calendar has been updated to reflect this RSVP."));
+               } else if (!strcasecmp(bstr("sc"), "ignore")) {
+                       wprintf(_("You have chosen to ignore this RSVP. "
+                               "Your calendar has <b>not</b> been updated.")
+                       );
+               }
+               wprintf("</TD></TR></TABLE>\n"
+               );
+       } else {
+               wprintf("<img src=\"static/error.gif\" ALIGN=CENTER>"
+                       "%s\n", &buf[4]);
+       }
+
+       wprintf("<a href=\"dotskip?room=");
+       urlescputs(WC->wc_roomname);
+       wprintf("\"><br />");
+       wprintf(_("Return to messages"));
+       wprintf("</A><br />\n");
+
+       wDumpContent(1);
+}
+
+
+
+/*@}*/
+/*-----------------------------------------------------------------------**/
+
+
+
+/**
+ * \defgroup MsgDisplayHandlers Display handlers for message reading 
+ * \ingroup Calendaring
+ */
+
+/*@{*/
+
+
+
+/**
+ * \brief get items, keep them.
+ * If we're reading calendar items, just store them for now.  We have to
+ * sort and re-output them later when we draw the calendar.
+ * \param cal Our calendar to process
+ * \param msgnum number of the mesage in our db
+ */
+void display_individual_cal(icalcomponent *cal, long msgnum) {
+
+       WC->num_cal += 1;
+
+       WC->disp_cal = realloc(WC->disp_cal,
+                       (sizeof(struct disp_cal) * WC->num_cal) );
+       WC->disp_cal[WC->num_cal - 1].cal = icalcomponent_new_clone(cal);
+
+       WC->disp_cal[WC->num_cal - 1].cal_msgnum = msgnum;
+}
+
+
+
+/*
+ * \brief edit a task
+ * Display a task by itself (for editing)
+ * \param supplied_vtodo the todo item we want to edit
+ * \param msgnum number of the mesage in our db
+ */
+void display_edit_individual_task(icalcomponent *supplied_vtodo, long msgnum) {
+       icalcomponent *vtodo;
+       icalproperty *p;
+       struct icaltimetype t;
+       time_t now;
+       int created_new_vtodo = 0;
+
+       now = time(NULL);
+
+       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) {
+                       display_edit_individual_task(
+                               icalcomponent_get_first_component(
+                                       vtodo, ICAL_VTODO_COMPONENT
+                               ), msgnum
+                       );
+                       return;
+               }
+       }
+       else {
+               vtodo = icalcomponent_new(ICAL_VTODO_COMPONENT);
+               created_new_vtodo = 1;
+       }
+
+       output_headers(1, 1, 2, 0, 0, 0);
+       wprintf("<div id=\"banner\">\n"
+               "<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR>"
+               "<TD><img src=\"static/taskmanag_48x.gif\"></TD>"
+               "<td><SPAN CLASS=\"titlebar\">");
+       wprintf(_("Edit task"));
+       wprintf("</SPAN>"
+               "</TD></TR></TABLE>\n"
+               "</div>\n<div id=\"content\">\n"
+       );
+
+       wprintf("<div class=\"fix_scrollbar_bug\">"
+               "<table border=0 width=100%% bgcolor=\"#ffffff\"><tr><td>");
+       
+       wprintf("<FORM METHOD=\"POST\" action=\"save_task\">\n");
+       wprintf("<INPUT TYPE=\"hidden\" NAME=\"msgnum\" VALUE=\"%ld\">\n",
+               msgnum);
+
+       wprintf("<TABLE border=0>\n");
+
+       wprintf("<TR><TD>");
+       wprintf(_("Summary:"));
+       wprintf("</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));
+       }
+       wprintf("\"></TD></TR>\n");
+
+       wprintf("<TR><TD>");
+       wprintf(_("Start date:"));
+       wprintf("</TD><TD>");
+       p = icalcomponent_get_first_property(vtodo, ICAL_DTSTART_PROPERTY);
+       if (p != NULL) {
+               t = icalproperty_get_dtstart(p);
+       }
+       else {
+               t = icaltime_from_timet(now, 0);
+       }
+       display_icaltimetype_as_webform(&t, "dtstart");
+       wprintf("</TD></TR>\n");
+
+       wprintf("<TR><TD>");
+       wprintf(_("Due date:"));
+       wprintf("</TD><TD>");
+       p = icalcomponent_get_first_property(vtodo, ICAL_DUE_PROPERTY);
+       if (p != NULL) {
+               t = icalproperty_get_due(p);
+       }
+       else {
+               t = icaltime_from_timet(now, 0);
+       }
+       display_icaltimetype_as_webform(&t, "due");
+       wprintf("</TD></TR>\n");
+       wprintf("<TR><TD>");
+       wprintf(_("Description:"));
+       wprintf("</TD><TD>");
+       wprintf("<TEXTAREA NAME=\"description\" wrap=soft "
+               "ROWS=10 COLS=80 WIDTH=80>\n"
+       );
+       p = icalcomponent_get_first_property(vtodo, ICAL_DESCRIPTION_PROPERTY);
+       if (p != NULL) {
+               escputs((char *)icalproperty_get_comment(p));
+       }
+       wprintf("</TEXTAREA></TD></TR></TABLE>\n");
+
+       wprintf("<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"
+               "</CENTER>\n",
+               _("Save"),
+               _("Delete"),
+               _("Cancel")
+       );
+
+       wprintf("</FORM>\n");
+
+       wprintf("</td></tr></table></div>\n");
+       wDumpContent(1);
+
+       if (created_new_vtodo) {
+               icalcomponent_free(vtodo);
+       }
+}
+
+/*
+ * \brief Save an edited task
+ * \param supplied_vtodo the task to save
+ * \param msgnum number of the mesage in our db
+ */
+void save_individual_task(icalcomponent *supplied_vtodo, long msgnum) {
+       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
+                       );
+                       return;
+               }
+       }
+       else {
+               vtodo = icalcomponent_new(ICAL_VTODO_COMPONENT);
+               created_new_vtodo = 1;
+       }
+
+       if (strlen(bstr("save_button")) > 0) {
+
+               /** 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);
+               }
+               icalcomponent_add_property(vtodo,
+                       icalproperty_new_summary(bstr("summary")));
+               
+               while (prop = icalcomponent_get_first_property(vtodo,
+                     ICAL_DESCRIPTION_PROPERTY), prop != NULL) {
+                       icalcomponent_remove_property(vtodo, prop);
+                       icalproperty_free(prop);
+               }
+               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);
+               }
+               icaltime_from_webform(&t, "dtstart");
+               icalcomponent_add_property(vtodo,
+                       icalproperty_new_dtstart(t)
+               );
+       
+               while (prop = icalcomponent_get_first_property(vtodo,
+                     ICAL_DUE_PROPERTY), prop != NULL) {
+                       icalcomponent_remove_property(vtodo, prop);
+                       icalproperty_free(prop);
+               }
+               icaltime_from_webform(&t, "due");
+               icalcomponent_add_property(vtodo,
+                       icalproperty_new_due(t)
+               );
+
+               /** Give this task a UID if it doesn't have one. */
+               lprintf(9, "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 */
+               lprintf(9, "Increment the sequence ID\n");
+               while (prop = icalcomponent_get_first_property(vtodo,
+                     ICAL_SEQUENCE_PROPERTY), (prop != NULL) ) {
+                       i = icalproperty_get_sequence(prop);
+                       lprintf(9, "Sequence was %d\n", i);
+                       if (i > sequence) sequence = i;
+                       icalcomponent_remove_property(vtodo, prop);
+                       icalproperty_free(prop);
+               }
+               ++sequence;
+               lprintf(9, "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.
+                */
+               lprintf(9, "Encapsulating into 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 (strlen(bstr("delete_button")) > 0) {
+               delete_existing = 1;
+       }
+
+       if ( (delete_existing) && (msgnum > 0L) ) {
+               serv_printf("DELE %ld", atol(bstr("msgnum")));
+               serv_getln(buf, sizeof buf);
+       }
+
+       if (created_new_vtodo) {
+               icalcomponent_free(vtodo);
+       }
+
+       /** Go back to the task list */
+       readloop("readfwd");
+}
+
+
+
+/**
+ * \brief generic item handler
+ * Code common to all 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.
+ * \param mimetype mimetyp of our object
+ * \param which_kind sort of ical type
+ * \param msgnum number of the mesage in our db
+ * \param callback a funcion \todo
+ *
+ */
+void display_using_handler(long msgnum,
+                       char *mimetype,
+                       icalcomponent_kind which_kind,
+                       void (*callback)(icalcomponent *, long)
+       ) {
+       char buf[SIZ];
+       char mime_partnum[SIZ];
+       char mime_filename[SIZ];
+       char mime_content_type[SIZ];
+       char mime_disposition[SIZ];
+       int mime_length;
+       char relevant_partnum[SIZ];
+       char *relevant_source = NULL;
+       icalcomponent *cal, *c;
+
+       sprintf(buf, "MSG0 %ld|1", msgnum);     /* ask for headers only */
+       serv_puts(buf);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '1') return;
+
+       while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+               if (!strncasecmp(buf, "part=", 5)) {
+                       extract_token(mime_filename, &buf[5], 1, '|', sizeof mime_filename);
+                       extract_token(mime_partnum, &buf[5], 2, '|', sizeof mime_partnum);
+                       extract_token(mime_disposition, &buf[5], 3, '|', sizeof mime_disposition);
+                       extract_token(mime_content_type, &buf[5], 4, '|', sizeof mime_content_type);
+                       mime_length = extract_int(&buf[5], 5);
+
+                       if (!strcasecmp(mime_content_type, "text/calendar")) {
+                               strcpy(relevant_partnum, mime_partnum);
+                       }
+
+               }
+       }
+
+       if (strlen(relevant_partnum) > 0) {
+               relevant_source = load_mimepart(msgnum, relevant_partnum);
+               if (relevant_source != NULL) {
+
+                       cal = icalcomponent_new_from_string(relevant_source);
+                       if (cal != NULL) {
+
+                               ical_dezonify(cal);
+
+                               /** Simple components of desired type */
+                               if (icalcomponent_isa(cal) == which_kind) {
+                                       callback(cal, msgnum);
+                               }
+
+                               /** 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);
+                               }
+                               icalcomponent_free(cal);
+                       }
+                       free(relevant_source);
+               }
+       }
+
+}
+
+/**
+ * \brief display whole calendar
+ * \param msgnum number of the mesage in our db
+ */
+void display_calendar(long msgnum) {
+       display_using_handler(msgnum, "text/calendar",
+                               ICAL_VEVENT_COMPONENT,
+                               display_individual_cal);
+}
+
+/**
+ * \brief display whole taksview
+ * \param msgnum number of the mesage in our db
+ */
+void display_task(long msgnum) {
+       display_using_handler(msgnum, "text/calendar",
+                               ICAL_VTODO_COMPONENT,
+                               display_individual_cal);
+}
+
+/**
+ * \brief display the editor component for a task
+ */
+void display_edit_task(void) {
+       long msgnum = 0L;
+
+       /** Force change the room if we have to */
+       if (strlen(bstr("taskrm")) > 0) {
+               gotoroom(bstr("taskrm"));
+       }
+
+       msgnum = atol(bstr("msgnum"));
+       if (msgnum > 0L) {
+               /** existing task */
+               display_using_handler(msgnum, "text/calendar",
+                               ICAL_VTODO_COMPONENT,
+                               display_edit_individual_task);
+       }
+       else {
+               /** new task */
+               display_edit_individual_task(NULL, 0L);
+       }
+}
+
+/**
+ *\brief save an edited task
+ */
+void save_task(void) {
+       long msgnum = 0L;
+
+       msgnum = atol(bstr("msgnum"));
+       if (msgnum > 0L) {
+               display_using_handler(msgnum, "text/calendar",
+                               ICAL_VTODO_COMPONENT,
+                               save_individual_task);
+       }
+       else {
+               save_individual_task(NULL, 0L);
+       }
+}
+
+/**
+ * \brief display the editor component for an event
+ */
+void display_edit_event(void) {
+       long msgnum = 0L;
+
+       msgnum = atol(bstr("msgnum"));
+       if (msgnum > 0L) {
+               /* existing event */
+               display_using_handler(msgnum, "text/calendar",
+                               ICAL_VEVENT_COMPONENT,
+                               display_edit_individual_event);
+       }
+       else {
+               /* new event */
+               display_edit_individual_event(NULL, 0L);
+       }
+}
+
+/**
+ * \brief save an edited event
+ */
+void save_event(void) {
+       long msgnum = 0L;
+
+       msgnum = atol(bstr("msgnum"));
+
+       if (msgnum > 0L) {
+               display_using_handler(msgnum, "text/calendar",
+                               ICAL_VEVENT_COMPONENT,
+                               save_individual_event);
+       }
+       else {
+               save_individual_event(NULL, 0L);
+       }
+}
+
+
+
+
+
+/**
+ * \brief freebusy display (for client software)
+ * \param req dunno. ?????
+ */
+void do_freebusy(char *req) {
+       char who[SIZ];
+       char buf[SIZ];
+       char *fb;
+
+       extract_token(who, req, 1, ' ', sizeof who);
+       if (!strncasecmp(who, "/freebusy/", 10)) {
+               strcpy(who, &who[10]);
+       }
+       unescape_input(who);
+
+       if ( (!strcasecmp(&who[strlen(who)-4], ".vcf"))
+          || (!strcasecmp(&who[strlen(who)-4], ".ifb"))
+          || (!strcasecmp(&who[strlen(who)-4], ".vfb")) ) {
+               who[strlen(who)-4] = 0;
+       }
+
+       lprintf(9, "freebusy requested for <%s>\n", who);
+       serv_printf("ICAL freebusy|%s", who);
+       serv_getln(buf, sizeof buf);
+
+       if (buf[0] != '1') {
+               wprintf("HTTP/1.1 404 %s\n", &buf[4]);
+               output_headers(0, 0, 0, 0, 0, 0);
+               wprintf("Content-Type: text/plain\r\n");
+               wprintf("\r\n");
+               wprintf("%s\n", &buf[4]);
+               return;
+       }
+
+       fb = read_server_text();
+       http_transmit_thing(fb, strlen(fb), "text/calendar", 0);
+       free(fb);
+}
+
+
+
+#endif /* WEBCIT_WITH_CALENDAR_SERVICE */
+
+
+/*@}*/
diff --git a/webcit/calendar_tools.c b/webcit/calendar_tools.c
new file mode 100644 (file)
index 0000000..d62cb82
--- /dev/null
@@ -0,0 +1,302 @@
+/*
+ * $Id$
+ */
+/**
+ * \defgroup MiscCal Miscellaneous functions which handle calendar components.
+ * \ingroup Calendaring
+ */
+/*@{*/
+#include "webcit.h"
+#include "webserver.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"
+};
+
+#ifdef WEBCIT_WITH_CALENDAR_SERVICE
+
+/**
+ * \brief display and edit date/time
+ * 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.
+ *
+ * \todo 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.
+ * \param t the time we want to parse
+ * \param prefix ???? \todo
+ */
+
+
+void display_icaltimetype_as_webform(struct icaltimetype *t, char *prefix) {
+       int i;
+       time_t now;
+       struct tm tm_now;
+       int this_year;
+       time_t tt;
+       struct tm tm;
+       const int span = 10;
+       int all_day_event = 0;
+       time_t monthselect_time;
+       struct tm monthselect_tm;
+       char monthselect_str[32];
+       char calhourformat[16];
+
+       get_preference("calhourformat", calhourformat, sizeof calhourformat);
+
+       now = time(NULL);
+       localtime_r(&now, &tm_now);
+       this_year = tm_now.tm_year + 1900;
+
+       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);
+       }
+
+       wprintf(_("Month: "));
+       wprintf("<SELECT NAME=\"%s_month\" SIZE=\"1\">\n", prefix);
+       for (i=0; i<=11; ++i) {
+               monthselect_time = 1137997451 + (i * 2592000);
+               localtime_r(&monthselect_time, &monthselect_tm);
+               wc_strftime(monthselect_str, sizeof monthselect_str, "%B", &monthselect_tm);
+               wprintf("<OPTION %s VALUE=\"%d\">%s</OPTION>\n",
+                       ((tm.tm_mon == i) ? "SELECTED" : ""),
+                       i+1,
+                       monthselect_str
+               );
+       }
+       wprintf("</SELECT>\n");
+
+       wprintf(_("Day: "));
+       wprintf("<SELECT NAME=\"%s_day\" SIZE=\"1\">\n", prefix);
+       for (i=1; i<=31; ++i) {
+               wprintf("<OPTION %s VALUE=\"%d\">%d</OPTION>\n",
+                       ((tm.tm_mday == i) ? "SELECTED" : ""),
+                       i, i
+               );
+       }
+       wprintf("</SELECT>\n");
+
+       wprintf(_("Year: "));
+       wprintf("<SELECT NAME=\"%s_year\" SIZE=\"1\">\n", prefix);
+       if ((this_year - t->year) > span) {
+               wprintf("<OPTION SELECTED VALUE=\"%d\">%d</OPTION>\n",
+                       t->year, t->year);
+       }
+       for (i=(this_year-span); i<=(this_year+span); ++i) {
+               wprintf("<OPTION %s VALUE=\"%d\">%d</OPTION>\n",
+                       ((t->year == i) ? "SELECTED" : ""),
+                       i, i
+               );
+       }
+       if ((t->year - this_year) > span) {
+               wprintf("<OPTION SELECTED VALUE=\"%d\">%d</OPTION>\n",
+                       t->year, t->year);
+       }
+       wprintf("</SELECT>\n");
+
+       wprintf(_("Hour: "));
+       wprintf("<SELECT NAME=\"%s_hour\" SIZE=\"1\">\n", prefix);
+       for (i=0; i<=23; ++i) {
+
+               if (!strcasecmp(calhourformat, "24")) {
+                       wprintf("<OPTION %s VALUE=\"%d\">%d</OPTION>\n",
+                               ((tm.tm_hour == i) ? "SELECTED" : ""),
+                               i, i
+                       );
+               }
+               else {
+                       wprintf("<OPTION %s VALUE=\"%d\">%s</OPTION>\n",
+                               ((tm.tm_hour == i) ? "SELECTED" : ""),
+                               i, hourname[i]
+                       );
+               }
+
+       }
+       wprintf("</SELECT>\n");
+
+       wprintf(_("Minute: "));
+       wprintf("<SELECT NAME=\"%s_minute\" SIZE=\"1\">\n", prefix);
+       for (i=0; i<=59; ++i) {
+               if ( (i % 5 == 0) || (tm.tm_min == i) ) {
+                       wprintf("<OPTION %s VALUE=\"%d\">:%02d</OPTION>\n",
+                               ((tm.tm_min == i) ? "SELECTED" : ""),
+                               i, i
+                       );
+               }
+       }
+       wprintf("</SELECT>\n");
+}
+
+/**
+ *\brief Get time from form
+ * get the time back from the user and convert it into internal structs.
+ * \param t our time element
+ * \param prefix whats that\todo ????
+ */
+void icaltime_from_webform(struct icaltimetype *t, char *prefix) {
+       char vname[32];
+        time_t tt;
+        struct tm tm;
+       struct icaltimetype t2;
+
+        tt = time(NULL);
+        localtime_r(&tt, &tm);
+
+        sprintf(vname, "%s_month", prefix);     tm.tm_mon = atoi(bstr(vname)) - 1;
+        sprintf(vname, "%s_day", prefix);       tm.tm_mday = atoi(bstr(vname));
+        sprintf(vname, "%s_year", prefix);      tm.tm_year = atoi(bstr(vname)) - 1900;
+        sprintf(vname, "%s_hour", prefix);      tm.tm_hour = atoi(bstr(vname));
+        sprintf(vname, "%s_minute", prefix);    tm.tm_min = atoi(bstr(vname));
+
+        tt = mktime(&tm);
+        t2 = icaltime_from_timet(tt, 0);
+       memcpy(t, &t2, sizeof(struct icaltimetype));
+}
+
+/**
+ *\brief Get time from form
+ * get the time back from the user and convert it into internal structs.
+ * \param t our time element
+ * \param prefix whats that\todo ????
+ */
+
+void icaltime_from_webform_dateonly(struct icaltimetype *t, char *prefix) {
+       char vname[32];
+
+       memset(t, 0, sizeof(struct icaltimetype));
+
+        sprintf(vname, "%s_month", prefix);     t->month = atoi(bstr(vname));
+        sprintf(vname, "%s_day", prefix);       t->day = atoi(bstr(vname));
+        sprintf(vname, "%s_year", prefix);      t->year = atoi(bstr(vname));
+       t->is_utc = 1;
+       t->is_date = 1;
+}
+
+
+/**
+ * \brief Render PAPSTAT
+ * Render a PARTSTAT parameter as a string (and put it in parentheses)
+ * \param buf the string to put it to
+ * \param attendee the attendee to textify
+ */
+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;
+       }
+}
+
+
+/**
+ * \brief embedd
+ * Utility function to encapsulate a subcomponent into a full VCALENDAR
+ * \param subcomp the component to encapsulate
+ * \returns the meta object ???
+ */
+icalcomponent *ical_encapsulate_subcomponent(icalcomponent *subcomp) {
+       icalcomponent *encaps;
+
+       /* lprintf(9, "ical_encapsulate_subcomponent() called\n"); */
+
+       if (subcomp == NULL) {
+               lprintf(3, "ERROR: called with NULL argument!\n");
+               return NULL;
+       }
+
+       /**
+        * If we're already looking at a full VCALENDAR component,
+        * don't bother ... just return itself.
+        */
+       if (icalcomponent_isa(subcomp) == ICAL_VCALENDAR_COMPONENT) {
+               return subcomp;
+       }
+
+       /** Encapsulate the VEVENT component into a complete VCALENDAR */
+       encaps = icalcomponent_new(ICAL_VCALENDAR_COMPONENT);
+       if (encaps == NULL) {
+               lprintf(3, "%s:%d: Error - could not allocate component!\n",
+                       __FILE__, __LINE__);
+               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"));
+
+       /** Encapsulate the subcomponent inside */
+       /* lprintf(9, "Doing the encapsulation\n"); */
+       icalcomponent_add_component(encaps, subcomp);
+
+       /** Convert all timestamps to UTC so we don't have to deal with
+        * stupid VTIMEZONE crap.
+        */
+       ical_dezonify(encaps);
+
+       /** Return the object we just created. */
+       return(encaps);
+}
+
+
+
+
+#endif
+/*@}*/
diff --git a/webcit/calendar_view.c b/webcit/calendar_view.c
new file mode 100644 (file)
index 0000000..798579c
--- /dev/null
@@ -0,0 +1,1071 @@
+/*
+ * $Id$
+ */
+/**
+ * \defgroup CalHtmlHandles Handles the HTML display of calendar items.
+ * \ingroup Calendaring
+ */
+/*@{*/
+#include "webcit.h"
+#include "webserver.h"
+
+#ifndef WEBCIT_WITH_CALENDAR_SERVICE
+
+/**\brief stub for non-libical builds */
+void do_calendar_view(void) {
+       wprintf("<center><i>");
+       wprintf(_("The calendar view is not available."));
+       wprintf("</i></center><br />\n");
+}
+
+/**\brief stub for non-libical builds */
+void do_tasks_view(void) {     
+       wprintf("<center><I>");
+       wprintf(_("The tasks view is not available."));
+       wprintf("</i></center><br />\n");
+}
+
+#else  /* WEBCIT_WITH_CALENDAR_SERVICE */
+
+/****************************************************************************/
+
+/**
+ * \brief Display one day of a whole month view of a calendar
+ * \param thetime the month we want to see 
+ */
+void calendar_month_view_display_events(time_t thetime) {
+       int i;
+       time_t event_tt;
+       struct tm event_tm;
+       struct tm today_tm;
+       icalproperty *p = NULL;
+       icalproperty *q = NULL;
+       struct icaltimetype t;
+       int month, day, year;
+       int all_day_event = 0;
+       time_t tt;
+       char buf[256];
+
+       if (WC->num_cal == 0) {
+               wprintf("<br /><br /><br />\n");
+               return;
+       }
+
+       localtime_r(&thetime, &today_tm);
+       month = today_tm.tm_mon + 1;
+       day = today_tm.tm_mday;
+       year = today_tm.tm_year + 1900;
+
+       for (i=0; i<(WC->num_cal); ++i) {
+               p = icalcomponent_get_first_property(WC->disp_cal[i].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;
+
+                       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(
+                                                       WC->disp_cal[i].cal,
+                                                       ICAL_SUMMARY_PROPERTY);
+                               if (p != NULL) {
+
+                                       if (all_day_event) {
+                                               wprintf("<table border=0 cellpadding=2><TR>"
+                                                       "<td bgcolor=\"#CCCCDD\">"
+                                               );
+                                       }
+
+                                       wprintf("<font size=-1>"
+                                               "<a href=\"display_edit_event?"
+                                               "msgnum=%ld&calview=%s&year=%s&month=%s&day=%s\""
+                                               " btt_tooltext=\"",
+                                               WC->disp_cal[i].cal_msgnum,
+                                               bstr("calview"),
+                                               bstr("year"),
+                                               bstr("month"),
+                                               bstr("day")
+                                       );
+
+                                       wprintf("<i>%s</i> ", _("Summary:"));
+                                       escputs((char *)icalproperty_get_comment(p));
+                                       wprintf("<br />");
+
+                                       q = icalcomponent_get_first_property(
+                                                       WC->disp_cal[i].cal,
+                                                       ICAL_LOCATION_PROPERTY);
+                                       if (q) {
+                                               wprintf("<i>%s</i> ", _("Location:"));
+                                               escputs((char *)icalproperty_get_comment(q));
+                                               wprintf("<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(WC->disp_cal[i].cal) == ICAL_VEVENT_COMPONENT) {
+                               
+                                               q = icalcomponent_get_first_property(WC->disp_cal[i].cal,
+                                                                               ICAL_DTSTART_PROPERTY);
+                                               if (q != NULL) {
+                                                       t = icalproperty_get_dtstart(q);
+                               
+                                                       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);
+                                                               wprintf("<i>%s</i> %s<br>",
+                                                                       _("Date:"), d_str);
+                                                       }
+                                                       else {
+                                                               tt = icaltime_as_timet(t);
+                                                               fmt_date(buf, tt, 1);
+                                                               wprintf("<i>%s</i> %s<br>",
+                                                                       _("Starting date/time:"), buf);
+                                                       }
+                                               }
+                                       
+                                               q = icalcomponent_get_first_property(WC->disp_cal[i].cal,
+                                                                                       ICAL_DTEND_PROPERTY);
+                                               if (q != NULL) {
+                                                       t = icalproperty_get_dtend(q);
+                                                       tt = icaltime_as_timet(t);
+                                                       fmt_date(buf, tt, 1);
+                                                       wprintf("<i>%s</i> %s<br>",
+                                                               _("Ending date/time:"), buf);
+                                               }
+                                       }
+
+                                       q = icalcomponent_get_first_property(
+                                                       WC->disp_cal[i].cal,
+                                                       ICAL_DESCRIPTION_PROPERTY);
+                                       if (q) {
+                                               wprintf("<i>%s</i> ", _("Notes:"));
+                                               escputs((char *)icalproperty_get_comment(q));
+                                               wprintf("<br />");
+                                       }
+
+                                       wprintf("\">");
+                                       escputs((char *)
+                                               icalproperty_get_comment(p));
+                                       wprintf("</a></font><br />\n");
+
+                                       if (all_day_event) {
+                                               wprintf("</td></tr></table>");
+                                       }
+
+                               }
+
+                       }
+
+
+               }
+       }
+}
+
+
+/**
+ * \brief Display one day of a whole month view of a calendar
+ * \param thetime the month we want to see 
+ */
+void calendar_month_view_brief_events(time_t thetime, const char *daycolor) {
+       int i;
+       time_t event_tt;
+       time_t event_tts;
+       time_t event_tte;
+       struct tm event_tms;
+       struct tm event_tme;
+       struct tm today_tm;
+       icalproperty *p;
+       icalproperty *e;
+       struct icaltimetype t;
+       int month, day, year;
+       int all_day_event = 0;
+       char calhourformat[16];
+       char *timeformat;
+
+       get_preference("calhourformat", calhourformat, sizeof calhourformat);
+       if (!strcasecmp(calhourformat, "24"))   timeformat="%k:%M";
+       else timeformat="%I:%M %p";
+
+       localtime_r(&thetime, &today_tm);
+       month = today_tm.tm_mon + 1;
+       day = today_tm.tm_mday;
+       year = today_tm.tm_year + 1900;
+
+       for (i=0; i<(WC->num_cal); ++i) {
+               p = icalcomponent_get_first_property(WC->disp_cal[i].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(
+                                                       WC->disp_cal[i].cal,
+                                                       ICAL_SUMMARY_PROPERTY);
+                               e = icalcomponent_get_first_property(
+                                                       WC->disp_cal[i].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;
+                                       wprintf("<tr><td bgcolor='%s'>%i:%2i</td><td bgcolor='%s'>"
+                                                       "<font size=-1>"
+                                                       "<a href=\"display_edit_event?msgnum=%ld&calview=%s&year=%s&month=%s&day=%s\">",
+                                                       daycolor,
+                                                       hours, minutes,
+                                                       daycolor,
+                                                       WC->disp_cal[i].cal_msgnum,
+                                                       bstr("calview"),
+                                                       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);
+
+                                       wprintf("</a></font></td>"
+                                                       "<td bgcolor='%s'>%s</td><td bgcolor='%s'>%s</td></tr>",
+                                                       daycolor,
+                                                       sbuf,
+                                                       daycolor,
+                                                       ebuf);
+                                       
+                               }
+                               
+                       }
+                       
+                       
+               }
+       }
+}
+
+
+/**
+ * \brief view one month. pretty view
+ * \param year the year
+ * \param month the month
+ * \param day the actual day we want to see
+ */
+void calendar_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;
+       time_t colheader_time;
+       struct tm colheader_tm;
+       char colheader_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) */
+       wprintf("<div class=\"fix_scrollbar_bug\">"
+               "<table width=100%% border=0 cellpadding=0 cellspacing=0 "
+               "bgcolor=#204B78><TR><TD>\n");
+
+       wprintf("<table width=100%% border=0 cellpadding=0 cellspacing=0><tr>\n");
+
+       wprintf("<td align=center>");
+
+       localtime_r(&previous_month, &tm);
+       wprintf("<a href=\"readfwd?calview=month&year=%d&month=%d&day=1\">",
+               (int)(tm.tm_year)+1900, tm.tm_mon + 1);
+       wprintf("<img align=middle src=\"static/prevdate_32x.gif\" border=0></A>\n");
+
+       wc_strftime(colheader_label, sizeof colheader_label, "%B", &starting_tm);
+       wprintf("&nbsp;&nbsp;"
+               "<font size=+1 color=\"#FFFFFF\">"
+               "%s %d"
+               "</font>"
+               "&nbsp;&nbsp;", colheader_label, year);
+
+       localtime_r(&next_month, &tm);
+       wprintf("<a href=\"readfwd?calview=month&year=%d&month=%d&day=1\">",
+               (int)(tm.tm_year)+1900, tm.tm_mon + 1);
+       wprintf("<img align=middle src=\"static/nextdate_32x.gif\" border=0></A>\n");
+
+       wprintf("</td></tr></table>\n");
+
+       /** Inner table (the real one) */
+       wprintf("<table width=100%% border=0 cellpadding=1 cellspacing=1 "
+               "bgcolor=#204B78 id=\"inner_month\"><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);
+               wprintf("<td align=center width=14%%>"
+                       "<font color=\"#FFFFFF\">%s</font></th>", colheader_label);
+
+       }
+       wprintf("</tr>\n");
+
+       /** Now do 35 days */
+       for (i = 0; i < 35; ++i) {
+               localtime_r(&thetime, &tm);
+
+               /** Before displaying Sunday, start a new row */
+               if ((i % 7) == 0) {
+                       wprintf("<tr>");
+               }
+
+               wprintf("<td bgcolor=\"#%s\" width=14%% height=60 align=left valign=top><b>",
+                       ((tm.tm_mon != month-1) ? "DDDDDD" :
+                       ((tm.tm_wday==0 || tm.tm_wday==6) ? "EEEECC" :
+                       "FFFFFF"))
+               );
+               if ((i==0) || (tm.tm_mday == 1)) {
+                       wc_strftime(colheader_label, sizeof colheader_label, "%B", &tm);
+                       wprintf("%s ", colheader_label);
+               }
+               wprintf("<a href=\"readfwd?calview=day&year=%d&month=%d&day=%d\">"
+                       "%d</a></b><br />",
+                       tm.tm_year + 1900,
+                       tm.tm_mon + 1,
+                       tm.tm_mday,
+                       tm.tm_mday);
+
+               /** put the data here, stupid */
+               calendar_month_view_display_events(thetime);
+
+               wprintf("</td>");
+
+               /** After displaying Saturday, end the row */
+               if ((i % 7) == 6) {
+                       wprintf("</tr>\n");
+               }
+
+               thetime += (time_t)86400;               /** ahead 24 hours */
+       }
+
+       wprintf("</table>"                      /** end of inner table */
+               "</td></tr></table>"            /** end of outer table */
+               "</div>\n");
+
+       /**
+        * Initialize the bubble tooltips.
+        *
+        * Yes, this is as stupid as it looks.  Instead of just making the call
+        * to btt_enableTooltips() straight away, we have to create a timer event
+        * and let it initialize as an event after 1 millisecond.  This is to
+        * work around a bug in Internet Explorer that causes it to crash if we
+        * manipulate the innerHTML of various DOM nodes while the page is still
+        * being rendered.  See http://www.shaftek.org/blog/archives/000212.html
+        * for more information.
+        */ 
+       wprintf("<script type=\"text/javascript\" src=\"static/BubbleTooltips.js\"></script>\n"
+               "<script type=\"text/javascript\">"
+               " setTimeout(\"btt_enableTooltips('inner_month')\", 1); "
+               "</script>\n"
+       );
+}
+
+/**
+ * \brief view one month. brief view
+ * \param year the year
+ * \param month the month
+ * \param day the actual day we want to see
+ */
+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) */
+       wprintf("<div class=\"fix_scrollbar_bug\">"
+               "<table width=100%% border=0 cellpadding=0 cellspacing=0 "
+               "bgcolor=#204B78><TR><TD>\n");
+
+       wprintf("<table width=100%% border=0 cellpadding=0 cellspacing=0><tr>\n");
+
+       wprintf("<td align=center>");
+
+       localtime_r(&previous_month, &tm);
+       wprintf("<a href=\"readfwd?calview=month&year=%d&month=%d&day=1\">",
+               (int)(tm.tm_year)+1900, tm.tm_mon + 1);
+       wprintf("<img align=middle src=\"static/prevdate_32x.gif\" border=0></A>\n");
+
+       wc_strftime(month_label, sizeof month_label, "%B", &tm);
+       wprintf("&nbsp;&nbsp;"
+               "<font size=+1 color=\"#FFFFFF\">"
+               "%s %d"
+               "</font>"
+               "&nbsp;&nbsp;", month_label, year);
+
+       localtime_r(&next_month, &tm);
+       wprintf("<a href=\"readfwd?calview=month&year=%d&month=%d&day=1\">",
+               (int)(tm.tm_year)+1900, tm.tm_mon + 1);
+       wprintf("<img align=middle src=\"static/nextdate_32x.gif\" border=0></A>\n");
+
+       wprintf("</td></tr></table>\n");
+
+       /** Inner table (the real one) */
+       wprintf("<table width=100%% border=0 cellpadding=1 cellspacing=1 "
+               "bgcolor=#EEEECC><TR>");
+       wprintf("</tr>\n");
+       wprintf("<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);
+                       wprintf("<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);
+               wprintf("<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) {
+                       wprintf("</td></tr></table>\n");
+               }
+
+               thetime += (time_t)86400;               /** ahead 24 hours */
+       }
+
+       wprintf("</table>"                      /** end of inner table */
+               "</td></tr></table>"            /** end of outer table */
+               "</div>\n");
+}
+
+/** 
+ * \brief view one week
+ * this should view just one week, but it's not here yet.
+ * \todo ny implemented
+ * \param year the year
+ * \param month the month
+ * \param day the day which we want to see the week around
+ */
+void calendar_week_view(int year, int month, int day) {
+       wprintf("<center><i>week view FIXME</i></center><br />\n");
+}
+
+
+/**
+ * \brief display one day
+ * Display events for a particular hour of a particular day.
+ * (Specify hour < 0 to show "all day" events)
+ * \param year the year
+ * \param month the month
+ * \param day the day
+ * \param hour the hour we want to start displaying?????
+ */
+void calendar_day_view_display_events(int year, int month,
+                                       int day, int hour) {
+       int i;
+       icalproperty *p;
+       struct icaltimetype t;
+       time_t event_tt;
+       struct tm *event_tm;
+       int all_day_event = 0;
+
+       if (WC->num_cal == 0) {
+               // \todo FIXME wprintf("<br /><br /><br />\n");
+               return;
+       }
+
+       for (i=0; i<(WC->num_cal); ++i) {
+               p = icalcomponent_get_first_property(WC->disp_cal[i].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;
+                       }
+
+                       if (all_day_event) {
+                               event_tm = gmtime(&event_tt);
+                       }
+                       else {
+                               event_tm = localtime(&event_tt);
+                       }
+
+                       if ((event_tm->tm_year == (year-1900))
+                          && (event_tm->tm_mon == (month-1))
+                          && (event_tm->tm_mday == day)
+                          && ( ((event_tm->tm_hour == hour)&&(!t.is_date)) || ((hour<0)&&(t.is_date)) )
+                          ) {
+
+
+                               p = icalcomponent_get_first_property(
+                                                       WC->disp_cal[i].cal,
+                                                       ICAL_SUMMARY_PROPERTY);
+                               if (p != NULL) {
+
+                                       if (all_day_event) {
+                                               wprintf("<table border=1 cellpadding=2><TR>"
+                                                       "<td bgcolor=\"#CCCCCC\">"
+                                               );
+                                       }
+
+                                       wprintf("<font size=-1>"
+                                               "<a href=\"display_edit_event?msgnum=%ld&calview=day&year=%d&month=%d&day=%d\">",
+                                               WC->disp_cal[i].cal_msgnum,
+                                               year, month, day
+                                       );
+                                       escputs((char *)
+                                               icalproperty_get_comment(p));
+                                       wprintf("</a></font><br />\n");
+
+                                       if (all_day_event) {
+                                               wprintf("</td></tr></table>");
+                                       }
+                               }
+
+                       }
+
+
+               }
+       }
+}
+
+
+/**
+ * \brief view one day
+ * \param year the year
+ * \param month the month 
+ * \param day the day we want to display
+ */
+void calendar_day_view(int year, int month, int day) {
+       int hour;
+       struct icaltimetype today, yesterday, tomorrow;
+       char calhourformat[16];
+       int daystart = 8;
+       int dayend = 17;
+       char daystart_str[16], dayend_str[16];
+       struct tm d_tm;
+       char d_str[128];
+
+       get_preference("calhourformat", calhourformat, sizeof calhourformat);
+       get_preference("daystart", daystart_str, sizeof daystart_str);
+       if (strlen(daystart_str) > 0) daystart = atoi(daystart_str);
+       get_preference("dayend", dayend_str, sizeof dayend_str);
+       if (strlen(dayend_str) > 0) dayend = atoi(dayend_str);
+       
+
+       /** 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);
+
+
+       /** Outer table (to get the background color) */
+       wprintf("<div class=\"fix_scrollbar_bug\">"
+               "<table width=100%% border=0 cellpadding=0 cellspacing=0 "
+               "bgcolor=#204B78><tr><td>\n");
+
+       /** Inner table (the real one) */
+       wprintf("<table width=100%% border=0 cellpadding=1 cellspacing=1 "
+               "bgcolor=#204B78><tr>\n");
+
+       /** Innermost table (contains hours etc.) */
+       wprintf("<td width=80%%>"
+               "<table width=100%% border=0 cellpadding=1 cellspacing=1 "
+               "bgcolor=#204B78>\n");
+
+       /** Display events before 8:00 (hour=-1 is all-day events) */
+       wprintf("<tr>"
+               "<td bgcolor=\"#CCCCDD\" valign=middle width=10%%></td>"
+               "<td bgcolor=\"#FFFFFF\" valign=top>");
+       for (hour = (-1); hour <= (daystart-1); ++hour) {
+               calendar_day_view_display_events(year, month, day, hour);
+       }
+       wprintf("</td></tr>\n");
+
+       /** Now the middle of the day... */     
+       for (hour = daystart; hour <= dayend; ++hour) { /* could do HEIGHT=xx */
+               wprintf("<tr height=30><td bgcolor=\"#CCCCDD\" align=middle "
+                       "valign=middle width=10%%>");
+               wprintf("<a href=\"display_edit_event?msgnum=0"
+                       "&year=%d&month=%d&day=%d&hour=%d&minute=0\">",
+                       year, month, day, hour
+               );
+
+               if (!strcasecmp(calhourformat, "24")) {
+                       wprintf("%2d:00</a> ", hour);
+               }
+               else {
+                       wprintf("%d:00%s</a> ",
+                               (hour <= 12 ? hour : hour-12),
+                               (hour < 12 ? "am" : "pm")
+                       );
+               }
+
+               wprintf("</td><td bgcolor=\"#FFFFFF\" valign=top>");
+
+               /* put the data here, stupid */
+               calendar_day_view_display_events(year, month, day, hour);
+
+               wprintf("</td></tr>\n");
+       }
+
+       /** Display events after 5:00... */
+       wprintf("<tr>"
+               "<td bgcolor=\"#CCCCDD\" valign=middle width=10%%></td>"
+               "<td bgcolor=\"#FFFFFF\" valign=top>");
+       for (hour = (dayend+1); hour <= 23; ++hour) {
+               calendar_day_view_display_events(year, month, day, hour);
+       }
+       wprintf("</td></tr>\n");
+
+
+       wprintf("</table>"                      /* end of innermost table */
+               "</td>"
+       );
+
+       wprintf("<td width=20%% valign=top>");  /* begin stuff-on-the-right */
+
+
+       /** Begin todays-date-with-left-and-right-arrows */
+       wprintf("<table border=0 width=100%% "
+               "cellspacing=0 cellpadding=0 bgcolor=\"#FFFFFF\">\n");
+       wprintf("<tr>");
+
+       /** Left arrow */       
+       wprintf("<td align=center>");
+       wprintf("<a href=\"readfwd?calview=day&year=%d&month=%d&day=%d\">",
+               yesterday.year, yesterday.month, yesterday.day);
+       wprintf("<img align=middle src=\"static/prevdate_32x.gif\" border=0></A>");
+       wprintf("</td>");
+
+       /** 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;
+       wc_strftime(d_str, sizeof d_str,
+               "<td align=center>"
+               "<font size=+2>%B</font><br />"
+               "<font size=+3>%d</font><br />"
+               "<font size=+2>%Y</font><br />"
+               "</td>",
+               &d_tm
+       );
+       wprintf("%s", d_str);
+
+       /** Right arrow */
+       wprintf("<td align=center>");
+       wprintf("<a href=\"readfwd?calview=day&year=%d&month=%d&day=%d\">",
+               tomorrow.year, tomorrow.month, tomorrow.day);
+       wprintf("<img align=middle src=\"static/nextdate_32x.gif\""
+               " border=0></A>\n");
+       wprintf("</td>");
+
+       wprintf("</tr></table>\n");
+       /** End todays-date-with-left-and-right-arrows */
+
+       /** \todo In the future we might want to put a month-o-matic here */
+
+       wprintf("</font></center>\n");
+
+       wprintf("</td>");                       /** end stuff-on-the-right */
+
+
+
+       wprintf("</tr></table>"                 /** end of inner table */
+               "</td></tr></table></div>"      /** end of outer table */
+       );
+
+
+
+}
+
+/**
+ * \brief Display today's events.
+ */
+void calendar_summary_view(void) {
+       int i;
+       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];
+
+       if (WC->num_cal == 0) {
+               return;
+       }
+
+       now = time(NULL);
+       localtime_r(&now, &today_tm);
+
+       for (i=0; i<(WC->num_cal); ++i) {
+               p = icalcomponent_get_first_property(WC->disp_cal[i].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, 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(
+                                                       WC->disp_cal[i].cal,
+                                                       ICAL_SUMMARY_PROPERTY);
+                               if (p != NULL) {
+                                       escputs((char *)
+                                               icalproperty_get_comment(p));
+                                       wprintf(" (%s)<br />\n", timestring);
+                               }
+                       }
+               }
+       }
+       free_calendar_buffer();
+}
+
+
+/**
+ * \brief clean up ical memory
+ * \todo this could get troubel with future ical versions
+ */
+void free_calendar_buffer(void) {
+       int i;
+       if (WC->num_cal) for (i=0; i<(WC->num_cal); ++i) {
+               icalcomponent_free(WC->disp_cal[i].cal);
+       }
+       WC->num_cal = 0;
+       free(WC->disp_cal);
+       WC->disp_cal = NULL;
+}
+
+
+
+/**
+ * \brief do the whole calendar page
+ * view any part of the calender. decide which way, etc.
+ */
+void do_calendar_view(void) {
+       time_t now;
+       struct tm tm;
+       int year, month, day;
+       char calview[SIZ];
+
+       /** In case no date was specified, go with today */
+       now = time(NULL);
+       localtime_r(&now, &tm);
+       year = tm.tm_year + 1900;
+       month = tm.tm_mon + 1;
+       day = tm.tm_mday;
+
+       /** Now see if a date was specified */
+       if (strlen(bstr("year")) > 0) year = atoi(bstr("year"));
+       if (strlen(bstr("month")) > 0) month = atoi(bstr("month"));
+       if (strlen(bstr("day")) > 0) day = atoi(bstr("day"));
+
+       /** How would you like that cooked? */
+       if (strlen(bstr("calview")) > 0) {
+               strcpy(calview, bstr("calview"));
+       }
+       else {
+               strcpy(calview, "month");
+       }
+
+       /** Display the selected view */
+       if (!strcasecmp(calview, "day")) {
+               calendar_day_view(year, month, day);
+       }
+       else if (!strcasecmp(calview, "week")) {
+               calendar_week_view(year, month, day);
+       }
+       else {
+               if (WC->wc_view == VIEW_CALBRIEF) {
+                       calendar_brief_month_view(year, month, day);
+               }
+               else {
+                       calendar_month_view(year, month, day);
+               }
+       }
+
+       /** Free the calendar stuff */
+       free_calendar_buffer();
+
+}
+
+
+/**
+ * \brief get task due date
+ * Helper function for do_tasks_view().  
+ * \param vtodo a task to get the due date
+ * \return the date/time due.
+ */
+time_t get_task_due_date(icalcomponent *vtodo) {
+       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
+                       )
+               );
+       }
+
+       p = icalcomponent_get_first_property(vtodo, ICAL_DUE_PROPERTY);
+       if (p != NULL) {
+               return(icaltime_as_timet(icalproperty_get_due(p)));
+       }
+       else {
+               return(0L);
+       }
+}
+
+
+/**
+ * \brief Compare the due dates of two tasks (this is for sorting)
+ * \param task1 first task to compare
+ * \param task2 second task to compare
+ */
+int task_due_cmp(const void *task1, const void *task2) {
+       time_t t1;
+       time_t t2;
+
+       t1 =  get_task_due_date(((struct disp_cal *)task1)->cal);
+       t2 =  get_task_due_date(((struct disp_cal *)task2)->cal);
+
+       if (t1 < t2) return(-1);
+       if (t1 > t2) return(1);
+       return(0);
+}
+
+
+
+
+/**
+ * \brief do the whole task view stuff
+ */
+void do_tasks_view(void) {
+       int i;
+       time_t due;
+       int bg = 0;
+       char buf[SIZ];
+       icalproperty *p;
+
+       wprintf("<div class=\"fix_scrollbar_bug\">"
+               "<table border=0 cellspacing=0 width=100%% bgcolor=\"#FFFFFF\">\n<tr>\n"
+               "<th>");
+       wprintf(_("Name of task"));
+       wprintf("</th><th>");
+       wprintf(_("Date due"));
+       wprintf("</th></tr>\n"
+       );
+
+       /** Sort them if necessary */
+       if (WC->num_cal > 1) {
+               qsort(WC->disp_cal,
+                       WC->num_cal,
+                       sizeof(struct disp_cal),
+                       task_due_cmp
+               );
+       }
+
+       if (WC->num_cal) for (i=0; i<(WC->num_cal); ++i) {
+
+               bg = 1 - bg;
+               wprintf("<tr bgcolor=\"#%s\"><td>",
+                       (bg ? "DDDDDD" : "FFFFFF")
+               );
+
+               p = icalcomponent_get_first_property(WC->disp_cal[i].cal,
+                                                       ICAL_SUMMARY_PROPERTY);
+               wprintf("<a href=\"display_edit_task?msgnum=%ld&taskrm=",
+                       WC->disp_cal[i].cal_msgnum );
+               urlescputs(WC->wc_roomname);
+               wprintf("\">");
+               wprintf("<img align=middle "
+                       "src=\"static/taskmanag_16x.gif\" border=0>&nbsp;");
+               if (p != NULL) {
+                       escputs((char *)icalproperty_get_comment(p));
+               }
+               wprintf("</a>\n");
+               wprintf("</td>\n");
+
+               due = get_task_due_date(WC->disp_cal[i].cal);
+               fmt_date(buf, due, 0);
+               wprintf("<td><font");
+               if (due < time(NULL)) {
+                       wprintf(" color=\"#FF0000\"");
+               }
+               wprintf(">%s</font></td></tr>\n", buf);
+       }
+
+       wprintf("</table></div>\n");
+
+       /** Free the list */
+       free_calendar_buffer();
+
+}
+
+#endif /* WEBCIT_WITH_CALENDAR_SERVICE */
+
+/** @} */
diff --git a/webcit/config.guess b/webcit/config.guess
new file mode 100755 (executable)
index 0000000..4fc21ec
--- /dev/null
@@ -0,0 +1,1391 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+
+timestamp='2003-01-30'
+
+# 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 2 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, write to the Free Software
+# 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.
+
+# Originally written by Per Bothner <per@bothner.com>.
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -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 (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+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 0 ;;
+    --version | -v )
+       echo "$version" ; exit 0 ;;
+    --help | --h* | -h )
+       echo "$usage"; exit 0 ;;
+    -- )     # 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
+
+trap 'exit 1' 1 2 15
+
+# 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.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int x;" > $dummy.c ;
+       for c in cc gcc c89 c99 ; do
+         if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+            CC_FOR_BUILD="$c"; 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) >/dev/null 2>&1 ; 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
+
+# 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 tupples: *-*-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=`(/sbin/$sysctl 2>/dev/null || \
+           /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+       case "${UNAME_MACHINE_ARCH}" in
+           armeb) machine=armeb-unknown ;;
+           arm*) machine=arm-unknown ;;
+           sh3el) machine=shl-unknown ;;
+           sh3eb) machine=sh-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.
+       case "${UNAME_MACHINE_ARCH}" in
+           arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+               eval $set_cc_for_build
+               if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+                       | grep __ELF__ >/dev/null
+               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
+       # 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/[-_].*/\./'`
+               ;;
+       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}"
+       exit 0 ;;
+    amiga:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    arc:OpenBSD:*:*)
+       echo mipsel-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    hp300:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mac68k:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    macppc:OpenBSD:*:*)
+       echo powerpc-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mvme68k:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mvme88k:OpenBSD:*:*)
+       echo m88k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mvmeppc:OpenBSD:*:*)
+       echo powerpc-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    pmax:OpenBSD:*:*)
+       echo mipsel-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    sgi:OpenBSD:*:*)
+       echo mipseb-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    sun3:OpenBSD:*:*)
+       echo m68k-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    wgrisc:OpenBSD:*:*)
+       echo mipsel-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    *:OpenBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    *:MicroBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-microbsd${UNAME_RELEASE}
+       exit 0 ;;
+    alpha:OSF1:*:*)
+       if test $UNAME_RELEASE = "V4.0"; then
+               UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+       fi
+       # 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 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/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+       exit 0 ;;
+    Alpha\ *:Windows_NT*:*)
+       # How do we know it's Interix rather than the generic POSIX subsystem?
+       # Should we change UNAME_MACHINE based on the output of uname instead
+       # of the specific Alpha model?
+       echo alpha-pc-interix
+       exit 0 ;;
+    21064:Windows_NT:50:3)
+       echo alpha-dec-winnt3.5
+       exit 0 ;;
+    Amiga*:UNIX_System_V:4.0:*)
+       echo m68k-unknown-sysv4
+       exit 0;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+       echo ${UNAME_MACHINE}-unknown-amigaos
+       exit 0 ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+       echo ${UNAME_MACHINE}-unknown-morphos
+       exit 0 ;;
+    *:OS/390:*:*)
+       echo i370-ibm-openedition
+       exit 0 ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+       echo arm-acorn-riscix${UNAME_RELEASE}
+       exit 0;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+       echo hppa1.1-hitachi-hiuxmpp
+       exit 0;;
+    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 0 ;;
+    NILE*:*:*:dcosx)
+       echo pyramid-pyramid-svr4
+       exit 0 ;;
+    DRS?6000:UNIX_SV:4.2*:7*)
+       case `/usr/bin/uname -p` in
+           sparc) echo sparc-icl-nx7 && exit 0 ;;
+       esac ;;
+    sun4H:SunOS:5.*:*)
+       echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+       echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    i86pc:SunOS:5.*:*)
+       echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    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 0 ;;
+    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 0 ;;
+    sun3*:SunOS:*:*)
+       echo m68k-sun-sunos${UNAME_RELEASE}
+       exit 0 ;;
+    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 0 ;;
+    aushp:SunOS:*:*)
+       echo sparc-auspex-sunos${UNAME_RELEASE}
+       exit 0 ;;
+    # 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 0 ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+       echo m68k-atari-mint${UNAME_RELEASE}
+        exit 0 ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+        echo m68k-atari-mint${UNAME_RELEASE}
+       exit 0 ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+        echo m68k-milan-mint${UNAME_RELEASE}
+        exit 0 ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+        echo m68k-hades-mint${UNAME_RELEASE}
+        exit 0 ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+        echo m68k-unknown-mint${UNAME_RELEASE}
+        exit 0 ;;
+    powerpc:machten:*:*)
+       echo powerpc-apple-machten${UNAME_RELEASE}
+       exit 0 ;;
+    RISC*:Mach:*:*)
+       echo mips-dec-mach_bsd4.3
+       exit 0 ;;
+    RISC*:ULTRIX:*:*)
+       echo mips-dec-ultrix${UNAME_RELEASE}
+       exit 0 ;;
+    VAX*:ULTRIX*:*:*)
+       echo vax-dec-ultrix${UNAME_RELEASE}
+       exit 0 ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+       echo clipper-intergraph-clix${UNAME_RELEASE}
+       exit 0 ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+       eval $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 \
+         && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+         && exit 0
+       echo mips-mips-riscos${UNAME_RELEASE}
+       exit 0 ;;
+    Motorola:PowerMAX_OS:*:*)
+       echo powerpc-motorola-powermax
+       exit 0 ;;
+    Motorola:*:4.3:PL8-*)
+       echo powerpc-harris-powermax
+       exit 0 ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+       echo powerpc-harris-powermax
+       exit 0 ;;
+    Night_Hawk:Power_UNIX:*:*)
+       echo powerpc-harris-powerunix
+       exit 0 ;;
+    m88k:CX/UX:7*:*)
+       echo m88k-harris-cxux7
+       exit 0 ;;
+    m88k:*:4*:R4*)
+       echo m88k-motorola-sysv4
+       exit 0 ;;
+    m88k:*:3*:R3*)
+       echo m88k-motorola-sysv3
+       exit 0 ;;
+    AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`/usr/bin/uname -p`
+       if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+       then
+           if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+              [ ${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 0 ;;
+    M88*:DolphinOS:*:*)        # DolphinOS (SVR3)
+       echo m88k-dolphin-sysv3
+       exit 0 ;;
+    M88*:*:R3*:*)
+       # Delta 88k system running SVR3
+       echo m88k-motorola-sysv3
+       exit 0 ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+       echo m88k-tektronix-sysv3
+       exit 0 ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+       echo m68k-tektronix-bsd
+       exit 0 ;;
+    *:IRIX*:*:*)
+       echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+       exit 0 ;;
+    ????????: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 0 ;;              # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+       echo i386-ibm-aix
+       exit 0 ;;
+    ia64:AIX:*:*)
+       if [ -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 0 ;;
+    *:AIX:2:3)
+       if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+               eval $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
+               $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0
+               echo rs6000-ibm-aix3.2.5
+       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 0 ;;
+    *:AIX:*:[45])
+       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 [ -x /usr/bin/oslevel ] ; then
+               IBM_REV=`/usr/bin/oslevel`
+       else
+               IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+       fi
+       echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+       exit 0 ;;
+    *:AIX:*:*)
+       echo rs6000-ibm-aix
+       exit 0 ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+       echo romp-ibm-bsd4.4
+       exit 0 ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+       echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+       exit 0 ;;                           # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+       echo rs6000-bull-bosx
+       exit 0 ;;
+    DPX/2?00:B.O.S.:*:*)
+       echo m68k-bull-sysv3
+       exit 0 ;;
+    9000/[34]??:4.3bsd:1.*:*)
+       echo m68k-hp-bsd
+       exit 0 ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+       echo m68k-hp-bsd4.4
+       exit 0 ;;
+    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 [ -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 [ "${HP_ARCH}" = "" ]; then
+                   eval $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 [ ${HP_ARCH} = "hppa2.0w" ]
+       then
+           # avoid double evaluation of $set_cc_for_build
+           test -n "$CC_FOR_BUILD" || eval $set_cc_for_build
+           if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null
+           then
+               HP_ARCH="hppa2.0w"
+           else
+               HP_ARCH="hppa64"
+           fi
+       fi
+       echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+       exit 0 ;;
+    ia64:HP-UX:*:*)
+       HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+       echo ia64-hp-hpux${HPUX_REV}
+       exit 0 ;;
+    3050*:HI-UX:*:*)
+       eval $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 && $dummy && exit 0
+       echo unknown-hitachi-hiuxwe2
+       exit 0 ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+       echo hppa1.1-hp-bsd
+       exit 0 ;;
+    9000/8??:4.3bsd:*:*)
+       echo hppa1.0-hp-bsd
+       exit 0 ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+       echo hppa1.0-hp-mpeix
+       exit 0 ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+       echo hppa1.1-hp-osf
+       exit 0 ;;
+    hp8??:OSF1:*:*)
+       echo hppa1.0-hp-osf
+       exit 0 ;;
+    i*86:OSF1:*:*)
+       if [ -x /usr/sbin/sysversion ] ; then
+           echo ${UNAME_MACHINE}-unknown-osf1mk
+       else
+           echo ${UNAME_MACHINE}-unknown-osf1
+       fi
+       exit 0 ;;
+    parisc*:Lites*:*:*)
+       echo hppa1.1-hp-lites
+       exit 0 ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+       echo c1-convex-bsd
+        exit 0 ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+       if getsysinfo -f scalar_acc
+       then echo c32-convex-bsd
+       else echo c2-convex-bsd
+       fi
+        exit 0 ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+       echo c34-convex-bsd
+        exit 0 ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+       echo c38-convex-bsd
+        exit 0 ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+       echo c4-convex-bsd
+        exit 0 ;;
+    CRAY*Y-MP:*:*:*)
+       echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit 0 ;;
+    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 0 ;;
+    CRAY*TS:*:*:*)
+       echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit 0 ;;
+    CRAY*T3E:*:*:*)
+       echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit 0 ;;
+    CRAY*SV1:*:*:*)
+       echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+       exit 0 ;;
+    *:UNICOS/mp:*:*)
+       echo nv1-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' 
+       exit 0 ;;
+    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 0 ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+       echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+       exit 0 ;;
+    sparc*:BSD/OS:*:*)
+       echo sparc-unknown-bsdi${UNAME_RELEASE}
+       exit 0 ;;
+    *:BSD/OS:*:*)
+       echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+       exit 0 ;;
+    *:FreeBSD:*:*)
+       # Determine whether the default compiler uses glibc.
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+       #include <features.h>
+       #if __GLIBC__ >= 2
+       LIBC=gnu
+       #else
+       LIBC=
+       #endif
+EOF
+       eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
+       echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC}
+       exit 0 ;;
+    i*:CYGWIN*:*)
+       echo ${UNAME_MACHINE}-pc-cygwin
+       exit 0 ;;
+    i*:MINGW*:*)
+       echo ${UNAME_MACHINE}-pc-mingw32
+       exit 0 ;;
+    i*:PW*:*)
+       echo ${UNAME_MACHINE}-pc-pw32
+       exit 0 ;;
+    x86:Interix*:3*)
+       echo i586-pc-interix3
+       exit 0 ;;
+    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+       echo i${UNAME_MACHINE}-pc-mks
+       exit 0 ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+       # How do we know it's Interix rather than the generic POSIX subsystem?
+       # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+       # UNAME_MACHINE based on the output of uname instead of i386?
+       echo i586-pc-interix
+       exit 0 ;;
+    i*:UWIN*:*)
+       echo ${UNAME_MACHINE}-pc-uwin
+       exit 0 ;;
+    p*:CYGWIN*:*)
+       echo powerpcle-unknown-cygwin
+       exit 0 ;;
+    prep*:SunOS:5.*:*)
+       echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    *:GNU:*:*)
+       echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+       exit 0 ;;
+    i*86:Minix:*:*)
+       echo ${UNAME_MACHINE}-pc-minix
+       exit 0 ;;
+    arm*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit 0 ;;
+    ia64:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit 0 ;;
+    m68*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit 0 ;;
+    mips:Linux:*:*)
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+       #undef CPU
+       #undef mips
+       #undef mipsel
+       #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+       CPU=mipsel
+       #else
+       #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+       CPU=mips
+       #else
+       CPU=
+       #endif
+       #endif
+EOF
+       eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
+       test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0
+       ;;
+    mips64:Linux:*:*)
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+       #undef CPU
+       #undef mips64
+       #undef mips64el
+       #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+       CPU=mips64el
+       #else
+       #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+       CPU=mips64
+       #else
+       CPU=
+       #endif
+       #endif
+EOF
+       eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=`
+       test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0
+       ;;
+    ppc:Linux:*:*)
+       echo powerpc-unknown-linux-gnu
+       exit 0 ;;
+    ppc64:Linux:*:*)
+       echo powerpc64-unknown-linux-gnu
+       exit 0 ;;
+    alpha:Linux:*:*)
+       case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` 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 ld.so.1 >/dev/null
+       if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+       echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+       exit 0 ;;
+    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-gnu ;;
+         PA8*) echo hppa2.0-unknown-linux-gnu ;;
+         *)    echo hppa-unknown-linux-gnu ;;
+       esac
+       exit 0 ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+       echo hppa64-unknown-linux-gnu
+       exit 0 ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+       echo ${UNAME_MACHINE}-ibm-linux
+       exit 0 ;;
+    sh*:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit 0 ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+       echo ${UNAME_MACHINE}-unknown-linux-gnu
+       exit 0 ;;
+    x86_64:Linux:*:*)
+       echo x86_64-unknown-linux-gnu
+       exit 0 ;;
+    i*86:Linux:*:*)
+       # The BFD linker knows what the default object file format is, so
+       # first see if it will tell us. cd to the root directory to prevent
+       # problems with other programs or directories called `ld' in the path.
+       # Set LC_ALL=C to ensure ld outputs messages in English.
+       ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
+                        | sed -ne '/supported targets:/!d
+                                   s/[         ][      ]*/ /g
+                                   s/.*supported targets: *//
+                                   s/ .*//
+                                   p'`
+        case "$ld_supported_targets" in
+         elf32-i386)
+               TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+               ;;
+         a.out-i386-linux)
+               echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+               exit 0 ;;
+         coff-i386)
+               echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+               exit 0 ;;
+         "")
+               # Either a pre-BFD a.out linker (linux-gnuoldld) or
+               # one that does not give us useful --help.
+               echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+               exit 0 ;;
+       esac
+       # Determine whether the default compiler is a.out or elf
+       eval $set_cc_for_build
+       sed 's/^        //' << EOF >$dummy.c
+       #include <features.h>
+       #ifdef __ELF__
+       # ifdef __GLIBC__
+       #  if __GLIBC__ >= 2
+       LIBC=gnu
+       #  else
+       LIBC=gnulibc1
+       #  endif
+       # else
+       LIBC=gnulibc1
+       # endif
+       #else
+       #ifdef __INTEL_COMPILER
+       LIBC=gnu
+       #else
+       LIBC=gnuaout
+       #endif
+       #endif
+EOF
+       eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=`
+       test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0
+       test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
+       ;;
+    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 0 ;;
+    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 0 ;;
+    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 0 ;;
+    i*86:XTS-300:*:STOP)
+       echo ${UNAME_MACHINE}-unknown-stop
+       exit 0 ;;
+    i*86:atheos:*:*)
+       echo ${UNAME_MACHINE}-unknown-atheos
+       exit 0 ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
+       echo i386-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    i*86:*DOS:*:*)
+       echo ${UNAME_MACHINE}-pc-msdosdjgpp
+       exit 0 ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V: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 0 ;;
+    i*86:*:5:[78]*)
+       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 0 ;;
+    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 0 ;;
+    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 i386.
+       echo i386-pc-msdosdjgpp
+        exit 0 ;;
+    Intel:Mach:3*:*)
+       echo i386-pc-mach3
+       exit 0 ;;
+    paragon:*:*:*)
+       echo i860-intel-osf1
+       exit 0 ;;
+    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 0 ;;
+    mini*:CTIX:SYS*5:*)
+       # "miniframe"
+       echo m68010-convergent-sysv
+       exit 0 ;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+       echo m68k-convergent-sysv
+       exit 0 ;;
+    M680?0:D-NIX:5.3:*)
+       echo m68k-diab-dnix
+       exit 0 ;;
+    M68*:*:R3V[567]*:*)
+       test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+    3[34]??:*: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)
+       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 0
+       /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+         && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && echo i486-ncr-sysv4 && exit 0 ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+       echo m68k-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    mc68030:UNIX_System_V:4.*:*)
+       echo m68k-atari-sysv4
+       exit 0 ;;
+    TSUNAMI:LynxOS:2.*:*)
+       echo sparc-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    rs6000:LynxOS:2.*:*)
+       echo rs6000-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
+       echo powerpc-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    SM[BE]S:UNIX_SV:*:*)
+       echo mips-dde-sysv${UNAME_RELEASE}
+       exit 0 ;;
+    RM*:ReliantUNIX-*:*:*)
+       echo mips-sni-sysv4
+       exit 0 ;;
+    RM*:SINIX-*:*:*)
+       echo mips-sni-sysv4
+       exit 0 ;;
+    *: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 0 ;;
+    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                      # says <Richard.M.Bartel@ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit 0 ;;
+    *:UNIX_System_V:4*:FTX*)
+       # From Gerald Hewes <hewes@openmarket.com>.
+       # How about differentiating between stratus architectures? -djm
+       echo hppa1.1-stratus-sysv4
+       exit 0 ;;
+    *:*:*:FTX*)
+       # From seanf@swdc.stratus.com.
+       echo i860-stratus-sysv4
+       exit 0 ;;
+    *:VOS:*:*)
+       # From Paul.Green@stratus.com.
+       echo hppa1.1-stratus-vos
+       exit 0 ;;
+    mc68*:A/UX:*:*)
+       echo m68k-apple-aux${UNAME_RELEASE}
+       exit 0 ;;
+    news*:NEWS-OS:6*:*)
+       echo mips-sony-newsos6
+       exit 0 ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+       if [ -d /usr/nec ]; then
+               echo mips-nec-sysv${UNAME_RELEASE}
+       else
+               echo mips-unknown-sysv${UNAME_RELEASE}
+       fi
+        exit 0 ;;
+    BeBox:BeOS:*:*)    # BeOS running on hardware made by Be, PPC only.
+       echo powerpc-be-beos
+       exit 0 ;;
+    BeMac:BeOS:*:*)    # BeOS running on Mac or Mac clone, PPC only.
+       echo powerpc-apple-beos
+       exit 0 ;;
+    BePC:BeOS:*:*)     # BeOS running on Intel PC compatible.
+       echo i586-pc-beos
+       exit 0 ;;
+    SX-4:SUPER-UX:*:*)
+       echo sx4-nec-superux${UNAME_RELEASE}
+       exit 0 ;;
+    SX-5:SUPER-UX:*:*)
+       echo sx5-nec-superux${UNAME_RELEASE}
+       exit 0 ;;
+    SX-6:SUPER-UX:*:*)
+       echo sx6-nec-superux${UNAME_RELEASE}
+       exit 0 ;;
+    Power*:Rhapsody:*:*)
+       echo powerpc-apple-rhapsody${UNAME_RELEASE}
+       exit 0 ;;
+    *:Rhapsody:*:*)
+       echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+       exit 0 ;;
+    *:Darwin:*:*)
+       case `uname -p` in
+           *86) UNAME_PROCESSOR=i686 ;;
+           powerpc) UNAME_PROCESSOR=powerpc ;;
+       esac
+       echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+       exit 0 ;;
+    *: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 0 ;;
+    *:QNX:*:4*)
+       echo i386-pc-qnx
+       exit 0 ;;
+    NSR-[DGKLNPTVW]:NONSTOP_KERNEL:*:*)
+       echo nsr-tandem-nsk${UNAME_RELEASE}
+       exit 0 ;;
+    *:NonStop-UX:*:*)
+       echo mips-compaq-nonstopux
+       exit 0 ;;
+    BS2000:POSIX*:*:*)
+       echo bs2000-siemens-sysv
+       exit 0 ;;
+    DS/*:UNIX_System_V:*:*)
+       echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+       exit 0 ;;
+    *:Plan9:*:*)
+       # "uname -m" is not consistent, so use $cputype instead. 386
+       # is converted to i386 for consistency with other x86
+       # operating systems.
+       if test "$cputype" = "386"; then
+           UNAME_MACHINE=i386
+       else
+           UNAME_MACHINE="$cputype"
+       fi
+       echo ${UNAME_MACHINE}-unknown-plan9
+       exit 0 ;;
+    *:TOPS-10:*:*)
+       echo pdp10-unknown-tops10
+       exit 0 ;;
+    *:TENEX:*:*)
+       echo pdp10-unknown-tenex
+       exit 0 ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+       echo pdp10-dec-tops20
+       exit 0 ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+       echo pdp10-xkl-tops20
+       exit 0 ;;
+    *:TOPS-20:*:*)
+       echo pdp10-unknown-tops20
+       exit 0 ;;
+    *:ITS:*:*)
+       echo pdp10-unknown-its
+       exit 0 ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#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 (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#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
+    printf ("vax-dec-ultrix\n"); exit (0);
+# 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 && $dummy && exit 0
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+       echo c1-convex-bsd
+       exit 0 ;;
+    c2*)
+       if getsysinfo -f scalar_acc
+       then echo c32-convex-bsd
+       else echo c2-convex-bsd
+       fi
+       exit 0 ;;
+    c34*)
+       echo c34-convex-bsd
+       exit 0 ;;
+    c38*)
+       echo c38-convex-bsd
+       exit 0 ;;
+    c4*)
+       echo c4-convex-bsd
+       exit 0 ;;
+    esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+    ftp://ftp.gnu.org/pub/gnu/config/
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches@gnu.org> in order to provide the needed
+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
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/webcit/config.h b/webcit/config.h
new file mode 100644 (file)
index 0000000..ca205a3
--- /dev/null
@@ -0,0 +1,10 @@
+/**
+ *     Ugly hack to make the non-automake build work without source changes
+ */
+
+#define _GNU_SOURCE
+#define EDITORDIR      WEBCITDIR "/tiny_mce"
+#define RUNDIR         WEBCITDIR
+#define BASEDIR                WEBCITDIR
+#define DATADIR                WEBCITDIR
+#define PREFIX         WEBCITDIR
diff --git a/webcit/config.rpath b/webcit/config.rpath
new file mode 100755 (executable)
index 0000000..4db13e5
--- /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 as published by
+#   the Free Software Foundation; either version 2 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, write to the Free Software
+#   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..5f94062
--- /dev/null
@@ -0,0 +1,1489 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+
+timestamp='2003-02-03'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# 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 2 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, write to the Free Software
+# 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.
+
+# Please send patches to <config-patches@gnu.org>.  Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# 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.
+
+# 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
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -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 (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
+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 0 ;;
+    --version | -v )
+       echo "$version" ; exit 0 ;;
+    --help | --h* | -h )
+       echo "$usage"; exit 0 ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )        # Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit 0;;
+
+    * )
+       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
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+       -sun*os*)
+               # Prevent following clause from handling this invalid input.
+               ;;
+       -dec* | -mips* | -sequent* | -encore* | -pc532* | -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)
+               os=
+               basic_machine=$1
+               ;;
+       -sim | -cisco | -oki | -wec | -winbond)
+               os=
+               basic_machine=$1
+               ;;
+       -scout)
+               ;;
+       -wrs)
+               os=-vxworks
+               basic_machine=$1
+               ;;
+       -chorusos*)
+               os=-chorusos
+               basic_machine=$1
+               ;;
+       -chorusrdb)
+               os=-chorusrdb
+               basic_machine=$1
+               ;;
+       -hiux*)
+               os=-hiuxwe2
+               ;;
+       -sco5)
+               os=-sco3.2v5
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco4)
+               os=-sco3.2v4
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco3.2.[4-9]*)
+               os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco3.2v[4-9]*)
+               # Don't forget version if it is 3.2v4 or newer.
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco*)
+               os=-sco3.2v2
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -udk*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -isc)
+               os=-isc2.2
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -clix*)
+               basic_machine=clipper-intergraph
+               ;;
+       -isc*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -lynx*)
+               os=-lynxos
+               ;;
+       -ptx*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+               ;;
+       -windowsnt*)
+               os=`echo $os | sed -e 's/windowsnt/winnt/'`
+               ;;
+       -psos*)
+               os=-psos
+               ;;
+       -mint | -mint[0-9]*)
+               basic_machine=m68k-atari
+               os=-mint
+               ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+       # Recognize the basic CPU types without company name.
+       # Some are omitted here because they have special meanings below.
+       1750a | 580 \
+       | a29k \
+       | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+       | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+       | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+       | clipper \
+       | d10v | d30v | dlx | dsp16xx \
+       | fr30 | frv \
+       | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+       | i370 | i860 | i960 | ia64 \
+       | ip2k \
+       | m32r | m68000 | m68k | m88k | mcore \
+       | mips | mipsbe | mipseb | mipsel | mipsle \
+       | mips16 \
+       | mips64 | mips64el \
+       | mips64vr | mips64vrel \
+       | mips64orion | mips64orionel \
+       | mips64vr4100 | mips64vr4100el \
+       | mips64vr4300 | mips64vr4300el \
+       | mips64vr5000 | mips64vr5000el \
+       | mipsisa32 | mipsisa32el \
+       | mipsisa32r2 | mipsisa32r2el \
+       | mipsisa64 | mipsisa64el \
+       | mipsisa64sb1 | mipsisa64sb1el \
+       | mipsisa64sr71k | mipsisa64sr71kel \
+       | mipstx39 | mipstx39el \
+       | mn10200 | mn10300 \
+       | msp430 \
+       | ns16k | ns32k \
+       | openrisc | or32 \
+       | pdp10 | pdp11 | pj | pjl \
+       | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+       | pyramid \
+       | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
+       | sh64 | sh64le \
+       | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \
+       | strongarm \
+       | tahoe | thumb | tic80 | tron \
+       | v850 | v850e \
+       | we32k \
+       | x86 | xscale | xstormy16 | xtensa \
+       | z8k)
+               basic_machine=$basic_machine-unknown
+               ;;
+       m6811 | m68hc11 | m6812 | m68hc12)
+               # Motorola 68HC11/12.
+               basic_machine=$basic_machine-unknown
+               os=-none
+               ;;
+       m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+               ;;
+
+       # 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)
+         basic_machine=$basic_machine-pc
+         ;;
+       # Object if more than one company name word.
+       *-*-*)
+               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+               exit 1
+               ;;
+       # Recognize the basic CPU types with company name.
+       580-* \
+       | a29k-* \
+       | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+       | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+       | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+       | arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+       | avr-* \
+       | bs2000-* \
+       | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+       | clipper-* | cydra-* \
+       | d10v-* | d30v-* | dlx-* \
+       | elxsi-* \
+       | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
+       | h8300-* | h8500-* \
+       | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+       | i*86-* | i860-* | i960-* | ia64-* \
+       | ip2k-* \
+       | m32r-* \
+       | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+       | m88110-* | m88k-* | mcore-* \
+       | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+       | mips16-* \
+       | mips64-* | mips64el-* \
+       | mips64vr-* | mips64vrel-* \
+       | mips64orion-* | mips64orionel-* \
+       | mips64vr4100-* | mips64vr4100el-* \
+       | mips64vr4300-* | mips64vr4300el-* \
+       | mips64vr5000-* | mips64vr5000el-* \
+       | mipsisa32-* | mipsisa32el-* \
+       | mipsisa32r2-* | mipsisa32r2el-* \
+       | mipsisa64-* | mipsisa64el-* \
+       | mipsisa64sb1-* | mipsisa64sb1el-* \
+       | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+       | mipstx39-* | mipstx39el-* \
+       | msp430-* \
+       | none-* | np1-* | nv1-* | ns16k-* | ns32k-* \
+       | orion-* \
+       | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+       | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+       | pyramid-* \
+       | romp-* | rs6000-* \
+       | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \
+       | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+       | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \
+       | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \
+       | tahoe-* | thumb-* \
+       | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+       | tron-* \
+       | v850-* | v850e-* | vax-* \
+       | we32k-* \
+       | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \
+       | xtensa-* \
+       | ymp-* \
+       | z8k-*)
+               ;;
+       # Recognize the various machine names and aliases which stand
+       # for a CPU type and a company and sometimes even an OS.
+       386bsd)
+               basic_machine=i386-unknown
+               os=-bsd
+               ;;
+       3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+               basic_machine=m68000-att
+               ;;
+       3b*)
+               basic_machine=we32k-att
+               ;;
+       a29khif)
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+       adobe68k)
+               basic_machine=m68010-adobe
+               os=-scout
+               ;;
+       alliant | fx80)
+               basic_machine=fx80-alliant
+               ;;
+       altos | altos3068)
+               basic_machine=m68k-altos
+               ;;
+       am29k)
+               basic_machine=a29k-none
+               os=-bsd
+               ;;
+       amdahl)
+               basic_machine=580-amdahl
+               os=-sysv
+               ;;
+       amiga | amiga-*)
+               basic_machine=m68k-unknown
+               ;;
+       amigaos | amigados)
+               basic_machine=m68k-unknown
+               os=-amigaos
+               ;;
+       amigaunix | amix)
+               basic_machine=m68k-unknown
+               os=-sysv4
+               ;;
+       apollo68)
+               basic_machine=m68k-apollo
+               os=-sysv
+               ;;
+       apollo68bsd)
+               basic_machine=m68k-apollo
+               os=-bsd
+               ;;
+       aux)
+               basic_machine=m68k-apple
+               os=-aux
+               ;;
+       balance)
+               basic_machine=ns32k-sequent
+               os=-dynix
+               ;;
+       c90)
+               basic_machine=c90-cray
+               os=-unicos
+               ;;
+       convex-c1)
+               basic_machine=c1-convex
+               os=-bsd
+               ;;
+       convex-c2)
+               basic_machine=c2-convex
+               os=-bsd
+               ;;
+       convex-c32)
+               basic_machine=c32-convex
+               os=-bsd
+               ;;
+       convex-c34)
+               basic_machine=c34-convex
+               os=-bsd
+               ;;
+       convex-c38)
+               basic_machine=c38-convex
+               os=-bsd
+               ;;
+       cray | j90)
+               basic_machine=j90-cray
+               os=-unicos
+               ;;
+       crds | unos)
+               basic_machine=m68k-crds
+               ;;
+       cris | cris-* | etrax*)
+               basic_machine=cris-axis
+               ;;
+       da30 | da30-*)
+               basic_machine=m68k-da30
+               ;;
+       decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+               basic_machine=mips-dec
+               ;;
+       decsystem10* | dec10*)
+               basic_machine=pdp10-dec
+               os=-tops10
+               ;;
+       decsystem20* | dec20*)
+               basic_machine=pdp10-dec
+               os=-tops20
+               ;;
+       delta | 3300 | motorola-3300 | motorola-delta \
+             | 3300-motorola | delta-motorola)
+               basic_machine=m68k-motorola
+               ;;
+       delta88)
+               basic_machine=m88k-motorola
+               os=-sysv3
+               ;;
+       dpx20 | dpx20-*)
+               basic_machine=rs6000-bull
+               os=-bosx
+               ;;
+       dpx2* | dpx2*-bull)
+               basic_machine=m68k-bull
+               os=-sysv3
+               ;;
+       ebmon29k)
+               basic_machine=a29k-amd
+               os=-ebmon
+               ;;
+       elxsi)
+               basic_machine=elxsi-elxsi
+               os=-bsd
+               ;;
+       encore | umax | mmax)
+               basic_machine=ns32k-encore
+               ;;
+       es1800 | OSE68k | ose68k | ose | OSE)
+               basic_machine=m68k-ericsson
+               os=-ose
+               ;;
+       fx2800)
+               basic_machine=i860-alliant
+               ;;
+       genix)
+               basic_machine=ns32k-ns
+               ;;
+       gmicro)
+               basic_machine=tron-gmicro
+               os=-sysv
+               ;;
+       go32)
+               basic_machine=i386-pc
+               os=-go32
+               ;;
+       h3050r* | hiux*)
+               basic_machine=hppa1.1-hitachi
+               os=-hiuxwe2
+               ;;
+       h8300hms)
+               basic_machine=h8300-hitachi
+               os=-hms
+               ;;
+       h8300xray)
+               basic_machine=h8300-hitachi
+               os=-xray
+               ;;
+       h8500hms)
+               basic_machine=h8500-hitachi
+               os=-hms
+               ;;
+       harris)
+               basic_machine=m88k-harris
+               os=-sysv3
+               ;;
+       hp300-*)
+               basic_machine=m68k-hp
+               ;;
+       hp300bsd)
+               basic_machine=m68k-hp
+               os=-bsd
+               ;;
+       hp300hpux)
+               basic_machine=m68k-hp
+               os=-hpux
+               ;;
+       hp3k9[0-9][0-9] | hp9[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               ;;
+       hp9k2[0-9][0-9] | hp9k31[0-9])
+               basic_machine=m68000-hp
+               ;;
+       hp9k3[2-9][0-9])
+               basic_machine=m68k-hp
+               ;;
+       hp9k6[0-9][0-9] | hp6[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               ;;
+       hp9k7[0-79][0-9] | hp7[0-79][0-9])
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k78[0-9] | hp78[0-9])
+               # FIXME: really hppa2.0-hp
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+               # FIXME: really hppa2.0-hp
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k8[0-9][13679] | hp8[0-9][13679])
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k8[0-9][0-9] | hp8[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               ;;
+       hppa-next)
+               os=-nextstep3
+               ;;
+       hppaosf)
+               basic_machine=hppa1.1-hp
+               os=-osf
+               ;;
+       hppro)
+               basic_machine=hppa1.1-hp
+               os=-proelf
+               ;;
+       i370-ibm* | ibm*)
+               basic_machine=i370-ibm
+               ;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+       i*86v32)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv32
+               ;;
+       i*86v4*)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv4
+               ;;
+       i*86v)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv
+               ;;
+       i*86sol2)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-solaris2
+               ;;
+       i386mach)
+               basic_machine=i386-mach
+               os=-mach
+               ;;
+       i386-vsta | vsta)
+               basic_machine=i386-unknown
+               os=-vsta
+               ;;
+       iris | iris4d)
+               basic_machine=mips-sgi
+               case $os in
+                   -irix*)
+                       ;;
+                   *)
+                       os=-irix4
+                       ;;
+               esac
+               ;;
+       isi68 | isi)
+               basic_machine=m68k-isi
+               os=-sysv
+               ;;
+       m88k-omron*)
+               basic_machine=m88k-omron
+               ;;
+       magnum | m3230)
+               basic_machine=mips-mips
+               os=-sysv
+               ;;
+       merlin)
+               basic_machine=ns32k-utek
+               os=-sysv
+               ;;
+       mingw32)
+               basic_machine=i386-pc
+               os=-mingw32
+               ;;
+       miniframe)
+               basic_machine=m68000-convergent
+               ;;
+       *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+               basic_machine=m68k-atari
+               os=-mint
+               ;;
+       mips3*-*)
+               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+               ;;
+       mips3*)
+               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+               ;;
+       mmix*)
+               basic_machine=mmix-knuth
+               os=-mmixware
+               ;;
+       monitor)
+               basic_machine=m68k-rom68k
+               os=-coff
+               ;;
+       morphos)
+               basic_machine=powerpc-unknown
+               os=-morphos
+               ;;
+       msdos)
+               basic_machine=i386-pc
+               os=-msdos
+               ;;
+       mvs)
+               basic_machine=i370-ibm
+               os=-mvs
+               ;;
+       ncr3000)
+               basic_machine=i486-ncr
+               os=-sysv4
+               ;;
+       netbsd386)
+               basic_machine=i386-unknown
+               os=-netbsd
+               ;;
+       netwinder)
+               basic_machine=armv4l-rebel
+               os=-linux
+               ;;
+       news | news700 | news800 | news900)
+               basic_machine=m68k-sony
+               os=-newsos
+               ;;
+       news1000)
+               basic_machine=m68030-sony
+               os=-newsos
+               ;;
+       news-3600 | risc-news)
+               basic_machine=mips-sony
+               os=-newsos
+               ;;
+       necv70)
+               basic_machine=v70-nec
+               os=-sysv
+               ;;
+       next | m*-next )
+               basic_machine=m68k-next
+               case $os in
+                   -nextstep* )
+                       ;;
+                   -ns2*)
+                     os=-nextstep2
+                       ;;
+                   *)
+                     os=-nextstep3
+                       ;;
+               esac
+               ;;
+       nh3000)
+               basic_machine=m68k-harris
+               os=-cxux
+               ;;
+       nh[45]000)
+               basic_machine=m88k-harris
+               os=-cxux
+               ;;
+       nindy960)
+               basic_machine=i960-intel
+               os=-nindy
+               ;;
+       mon960)
+               basic_machine=i960-intel
+               os=-mon960
+               ;;
+       nonstopux)
+               basic_machine=mips-compaq
+               os=-nonstopux
+               ;;
+       np1)
+               basic_machine=np1-gould
+               ;;
+       nv1)
+               basic_machine=nv1-cray
+               os=-unicosmp
+               ;;
+       nsr-tandem)
+               basic_machine=nsr-tandem
+               ;;
+       op50n-* | op60c-*)
+               basic_machine=hppa1.1-oki
+               os=-proelf
+               ;;
+       or32 | or32-*)
+               basic_machine=or32-unknown
+               os=-coff
+               ;;
+       OSE68000 | ose68000)
+               basic_machine=m68000-ericsson
+               os=-ose
+               ;;
+       os68k)
+               basic_machine=m68k-none
+               os=-os68k
+               ;;
+       pa-hitachi)
+               basic_machine=hppa1.1-hitachi
+               os=-hiuxwe2
+               ;;
+       paragon)
+               basic_machine=i860-intel
+               os=-osf
+               ;;
+       pbd)
+               basic_machine=sparc-tti
+               ;;
+       pbb)
+               basic_machine=m68k-tti
+               ;;
+       pc532 | pc532-*)
+               basic_machine=ns32k-pc532
+               ;;
+       pentium | p5 | k5 | k6 | nexgen | viac3)
+               basic_machine=i586-pc
+               ;;
+       pentiumpro | p6 | 6x86 | athlon | athlon_*)
+               basic_machine=i686-pc
+               ;;
+       pentiumii | pentium2)
+               basic_machine=i686-pc
+               ;;
+       pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+               basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentiumpro-* | p6-* | 6x86-* | athlon-*)
+               basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentiumii-* | pentium2-*)
+               basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pn)
+               basic_machine=pn-gould
+               ;;
+       power)  basic_machine=power-ibm
+               ;;
+       ppc)    basic_machine=powerpc-unknown
+               ;;
+       ppc-*)  basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ppcle | powerpclittle | ppc-le | powerpc-little)
+               basic_machine=powerpcle-unknown
+               ;;
+       ppcle-* | powerpclittle-*)
+               basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ppc64)  basic_machine=powerpc64-unknown
+               ;;
+       ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+               basic_machine=powerpc64le-unknown
+               ;;
+       ppc64le-* | powerpc64little-*)
+               basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ps2)
+               basic_machine=i386-ibm
+               ;;
+       pw32)
+               basic_machine=i586-unknown
+               os=-pw32
+               ;;
+       rom68k)
+               basic_machine=m68k-rom68k
+               os=-coff
+               ;;
+       rm[46]00)
+               basic_machine=mips-siemens
+               ;;
+       rtpc | rtpc-*)
+               basic_machine=romp-ibm
+               ;;
+       s390 | s390-*)
+               basic_machine=s390-ibm
+               ;;
+       s390x | s390x-*)
+               basic_machine=s390x-ibm
+               ;;
+       sa29200)
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+       sb1)
+               basic_machine=mipsisa64sb1-unknown
+               ;;
+       sb1el)
+               basic_machine=mipsisa64sb1el-unknown
+               ;;
+       sequent)
+               basic_machine=i386-sequent
+               ;;
+       sh)
+               basic_machine=sh-hitachi
+               os=-hms
+               ;;
+       sparclite-wrs | simso-wrs)
+               basic_machine=sparclite-wrs
+               os=-vxworks
+               ;;
+       sps7)
+               basic_machine=m68k-bull
+               os=-sysv2
+               ;;
+       spur)
+               basic_machine=spur-unknown
+               ;;
+       st2000)
+               basic_machine=m68k-tandem
+               ;;
+       stratus)
+               basic_machine=i860-stratus
+               os=-sysv4
+               ;;
+       sun2)
+               basic_machine=m68000-sun
+               ;;
+       sun2os3)
+               basic_machine=m68000-sun
+               os=-sunos3
+               ;;
+       sun2os4)
+               basic_machine=m68000-sun
+               os=-sunos4
+               ;;
+       sun3os3)
+               basic_machine=m68k-sun
+               os=-sunos3
+               ;;
+       sun3os4)
+               basic_machine=m68k-sun
+               os=-sunos4
+               ;;
+       sun4os3)
+               basic_machine=sparc-sun
+               os=-sunos3
+               ;;
+       sun4os4)
+               basic_machine=sparc-sun
+               os=-sunos4
+               ;;
+       sun4sol2)
+               basic_machine=sparc-sun
+               os=-solaris2
+               ;;
+       sun3 | sun3-*)
+               basic_machine=m68k-sun
+               ;;
+       sun4)
+               basic_machine=sparc-sun
+               ;;
+       sun386 | sun386i | roadrunner)
+               basic_machine=i386-sun
+               ;;
+       sv1)
+               basic_machine=sv1-cray
+               os=-unicos
+               ;;
+       symmetry)
+               basic_machine=i386-sequent
+               os=-dynix
+               ;;
+       t3e)
+               basic_machine=alphaev5-cray
+               os=-unicos
+               ;;
+       t90)
+               basic_machine=t90-cray
+               os=-unicos
+               ;;
+        tic4x | c4x*)
+               basic_machine=tic4x-unknown
+               os=-coff
+               ;;
+       tic54x | c54x*)
+               basic_machine=tic54x-unknown
+               os=-coff
+               ;;
+       tic55x | c55x*)
+               basic_machine=tic55x-unknown
+               os=-coff
+               ;;
+       tic6x | c6x*)
+               basic_machine=tic6x-unknown
+               os=-coff
+               ;;
+       tx39)
+               basic_machine=mipstx39-unknown
+               ;;
+       tx39el)
+               basic_machine=mipstx39el-unknown
+               ;;
+       toad1)
+               basic_machine=pdp10-xkl
+               os=-tops20
+               ;;
+       tower | tower-32)
+               basic_machine=m68k-ncr
+               ;;
+       udi29k)
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+       ultra3)
+               basic_machine=a29k-nyu
+               os=-sym1
+               ;;
+       v810 | necv810)
+               basic_machine=v810-nec
+               os=-none
+               ;;
+       vaxv)
+               basic_machine=vax-dec
+               os=-sysv
+               ;;
+       vms)
+               basic_machine=vax-dec
+               os=-vms
+               ;;
+       vpp*|vx|vx-*)
+               basic_machine=f301-fujitsu
+               ;;
+       vxworks960)
+               basic_machine=i960-wrs
+               os=-vxworks
+               ;;
+       vxworks68)
+               basic_machine=m68k-wrs
+               os=-vxworks
+               ;;
+       vxworks29k)
+               basic_machine=a29k-wrs
+               os=-vxworks
+               ;;
+       w65*)
+               basic_machine=w65-wdc
+               os=-none
+               ;;
+       w89k-*)
+               basic_machine=hppa1.1-winbond
+               os=-proelf
+               ;;
+       xps | xps100)
+               basic_machine=xps100-honeywell
+               ;;
+       ymp)
+               basic_machine=ymp-cray
+               os=-unicos
+               ;;
+       z8k-*-coff)
+               basic_machine=z8k-unknown
+               os=-sim
+               ;;
+       none)
+               basic_machine=none-none
+               os=-none
+               ;;
+
+# 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)
+               basic_machine=hppa1.1-winbond
+               ;;
+       op50n)
+               basic_machine=hppa1.1-oki
+               ;;
+       op60c)
+               basic_machine=hppa1.1-oki
+               ;;
+       romp)
+               basic_machine=romp-ibm
+               ;;
+       rs6000)
+               basic_machine=rs6000-ibm
+               ;;
+       vax)
+               basic_machine=vax-dec
+               ;;
+       pdp10)
+               # there are many clones, so DEC is not a safe bet
+               basic_machine=pdp10-unknown
+               ;;
+       pdp11)
+               basic_machine=pdp11-dec
+               ;;
+       we32k)
+               basic_machine=we32k-att
+               ;;
+       sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele)
+               basic_machine=sh-unknown
+               ;;
+       sh64)
+               basic_machine=sh64-unknown
+               ;;
+       sparc | sparcv9 | sparcv9b)
+               basic_machine=sparc-sun
+               ;;
+       cydra)
+               basic_machine=cydra-cydrome
+               ;;
+       orion)
+               basic_machine=orion-highlevel
+               ;;
+       orion105)
+               basic_machine=clipper-highlevel
+               ;;
+       mac | mpw | mac-mpw)
+               basic_machine=m68k-apple
+               ;;
+       pmac | pmac-mpw)
+               basic_machine=powerpc-apple
+               ;;
+       *-unknown)
+               # Make sure to match an already-canonicalized machine name.
+               ;;
+       *)
+               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+               exit 1
+               ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+       *-digital*)
+               basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+               ;;
+       *-commodore*)
+               basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+               ;;
+       *)
+               ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+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.
+       -solaris1 | -solaris1.*)
+               os=`echo $os | sed -e 's|solaris1|sunos4|'`
+               ;;
+       -solaris)
+               os=-solaris2
+               ;;
+       -svr4*)
+               os=-sysv4
+               ;;
+       -unixware*)
+               os=-sysv4.2uw
+               ;;
+       -gnu/linux*)
+               os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+               ;;
+       # First accept the basic system types.
+       # The portable systems comes first.
+       # Each alternative MUST END IN A *, to match a version number.
+       # -sysv* is not here because it comes later, after sysvr4.
+       -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+             | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+             | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+             | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+             | -aos* \
+             | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+             | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+             | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
+             | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+             | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+             | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+             | -chorusos* | -chorusrdb* \
+             | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+             | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
+             | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+             | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+             | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+             | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+             | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+             | -powermax* | -dnix* | -microbsd*)
+       # Remember, each alternative MUST END IN *, to match a version number.
+               ;;
+       -qnx*)
+               case $basic_machine in
+                   x86-* | i*86-*)
+                       ;;
+                   *)
+                       os=-nto$os
+                       ;;
+               esac
+               ;;
+       -nto-qnx*)
+               ;;
+       -nto*)
+               os=`echo $os | sed -e 's|nto|nto-qnx|'`
+               ;;
+       -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+             | -windows* | -osx | -abug | -netware* | -os9* | -beos* \
+             | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+               ;;
+       -mac*)
+               os=`echo $os | sed -e 's|mac|macos|'`
+               ;;
+       -linux*)
+               os=`echo $os | sed -e 's|linux|linux-gnu|'`
+               ;;
+       -sunos5*)
+               os=`echo $os | sed -e 's|sunos5|solaris2|'`
+               ;;
+       -sunos6*)
+               os=`echo $os | sed -e 's|sunos6|solaris3|'`
+               ;;
+       -opened*)
+               os=-openedition
+               ;;
+       -wince*)
+               os=-wince
+               ;;
+       -osfrose*)
+               os=-osfrose
+               ;;
+       -osf*)
+               os=-osf
+               ;;
+       -utek*)
+               os=-bsd
+               ;;
+       -dynix*)
+               os=-bsd
+               ;;
+       -acis*)
+               os=-aos
+               ;;
+       -atheos*)
+               os=-atheos
+               ;;
+       -386bsd)
+               os=-bsd
+               ;;
+       -ctix* | -uts*)
+               os=-sysv
+               ;;
+       -nova*)
+               os=-rtmk-nova
+               ;;
+       -ns2 )
+               os=-nextstep2
+               ;;
+       -nsk*)
+               os=-nsk
+               ;;
+       # Preserve the version number of sinix5.
+       -sinix5.*)
+               os=`echo $os | sed -e 's|sinix|sysv|'`
+               ;;
+       -sinix*)
+               os=-sysv4
+               ;;
+       -triton*)
+               os=-sysv3
+               ;;
+       -oss*)
+               os=-sysv3
+               ;;
+       -svr4)
+               os=-sysv4
+               ;;
+       -svr3)
+               os=-sysv3
+               ;;
+       -sysvr4)
+               os=-sysv4
+               ;;
+       # This must come after -sysvr4.
+       -sysv*)
+               ;;
+       -ose*)
+               os=-ose
+               ;;
+       -es1800*)
+               os=-ose
+               ;;
+       -xenix)
+               os=-xenix
+               ;;
+       -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+               os=-mint
+               ;;
+       -aros*)
+               os=-aros
+               ;;
+       -kaos*)
+               os=-kaos
+               ;;
+       -none)
+               ;;
+       *)
+               # Get rid of the `-' at the beginning of $os.
+               os=`echo $os | sed 's/[^-]*-//'`
+               echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+               exit 1
+               ;;
+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.
+
+case $basic_machine in
+       *-acorn)
+               os=-riscix1.2
+               ;;
+       arm*-rebel)
+               os=-linux
+               ;;
+       arm*-semi)
+               os=-aout
+               ;;
+       # 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
+               # This also exists in the configure program, but was not the
+               # default.
+               # os=-sunos4
+               ;;
+       m68*-cisco)
+               os=-aout
+               ;;
+       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
+               ;;
+       *-be)
+               os=-beos
+               ;;
+       *-ibm)
+               os=-aix
+               ;;
+       *-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
+               ;;
+       *-next)
+               os=-nextstep3
+               ;;
+       *-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
+               ;;
+       *)
+               os=-none
+               ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+       *-unknown)
+               case $os in
+                       -riscix*)
+                               vendor=acorn
+                               ;;
+                       -sunos*)
+                               vendor=sun
+                               ;;
+                       -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
+                               ;;
+                       -mvs* | -opened*)
+                               vendor=ibm
+                               ;;
+                       -ptx*)
+                               vendor=sequent
+                               ;;
+                       -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
+               basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+               ;;
+esac
+
+echo $basic_machine$os
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/webcit/configure.in b/webcit/configure.in
new file mode 100644 (file)
index 0000000..6a863d8
--- /dev/null
@@ -0,0 +1,365 @@
+dnl Process this file with autoconf to produce a configure script.
+dnl $Id$
+AC_INIT(webserver.c)
+
+
+PACKAGE=webcit
+VERSION=6.72
+AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE")
+AC_DEFINE_UNQUOTED(VERSION, "$VERSION")
+AC_SUBST(PACKAGE)
+AC_SUBST(VERSION)
+
+AC_SUBST(PROG_SUBDIRS)
+AC_CANONICAL_HOST
+AC_PROG_INSTALL
+AC_CHECK_PROG(AUTOCONF, autoconf)
+AC_CHECK_PROG(SED, sed, sed, no)
+AC_PREFIX_DEFAULT(/usr/local/webcit)
+
+AC_ARG_WITH(with_libical, [  --with-libical          use libical calendaring library])
+AC_ARG_WITH(with_zlib,    [  --with-zlib             use zlib compression if present])
+AC_ARG_WITH(with_newt,    [  --with-newt             use newt window library])
+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'
+       ;;
+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*)
+                       CFLAGS="$CFLAGS -Wall -Wno-char-subscripts"
+               ;;
+               *)
+                       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_HEADERS(fcntl.h limits.h sys/time.h unistd.h)
+
+
+
+
+dnl Checks for typedefs, structures, and compiler characteristics.
+AC_C_CONST
+AC_TYPE_OFF_T
+AC_TYPE_SIZE_T
+dnl AC_HEADER_TIME
+
+dnl Checks for library functions.
+AC_TYPE_SIGNAL
+dnl AC_FUNC_VPRINTF
+dnl AC_CHECK_FUNCS(strerror)
+AC_REPLACE_FUNCS(snprintf)
+
+dnl Checks for the libical calendaring library.
+if test "x$with_libical" != xno ; then
+        AC_CHECK_HEADERS(ical.h,
+                [AC_CHECK_LIB(ical, icalcomponent_new,
+                        [ok_libical=yes],,
+        )])
+fi
+
+if test "x$ok_libical" = xyes ; then
+
+       AC_TRY_RUN(
+               [
+#include <ical.h>
+main() {
+        int major, minor, v;
+        sscanf(ICAL_VERSION, "%d.%d", &major, &minor);
+        v = 100*major + minor;
+        printf("libical version: %i\n", v);
+        if (v >= 24) {
+                printf("This version is ok.\n");
+               return(0);
+       }
+       printf("libical 0.24 or newer required.\n");
+       printf("Citadel will be built without calendar support.\n");
+       return(1);
+}
+               ], 
+               [
+                       LIBS="-lical $LIBS"
+                       AC_DEFINE(HAVE_LIBICAL)
+               ]
+       )
+fi
+
+
+
+dnl Checks for the zlib compression library.
+if test "x$with_zlib" != xno ; then
+        AC_CHECK_HEADERS(zlib.h,
+                [AC_CHECK_LIB(z, zlibVersion,
+                        [ok_zlib=yes],,
+        )])
+fi
+
+if test "x$ok_zlib" = xyes ; then
+        LIBS="-lz $LIBS"
+        AC_DEFINE(HAVE_ZLIB)
+fi
+
+dnl Checks for the newt window library.
+if test "x$with_newt" != xno ; then
+       AC_CHECK_HEADERS(newt.h,
+               [AC_CHECK_LIB(newt, newtInit,
+                       [ok_newt=yes],,
+       )])
+fi
+
+if test "x$ok_newt" = xyes ; then
+       SETUP_LIBS="-lnewt $SETUP_LIBS"
+       AC_DEFINE(HAVE_NEWT)
+fi
+
+# 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)
+               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 Here is the check for a usable iconv
+
+AC_ARG_ENABLE(iconv,
+       [  --disable-iconv         do not use iconv charset conversion],
+       ok_iconv=no, ok_iconv=yes)
+
+if test "$ok_nls" != "no"; then
+       AC_MSG_RESULT(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,
+               ok_iconv=no
+       )
+fi
+
+if test "$ok_iconv" != "no"; then
+       AC_MSG_RESULT(WebCit will be built with character set conversion.)
+       AC_DEFINE(HAVE_ICONV)
+else
+       AC_MSG_RESULT(WebCit will be built without character set conversion.)
+fi
+
+
+
+dnl Here is the check for libintl etc.
+
+AC_ARG_ENABLE(nls,
+       [  --disable-nls           do not use Native Language Support],
+       ok_nls=no, ok_nls=yes)
+
+if test "$ok_nls" != "no"; then
+       AC_MSG_RESULT(Checking for per-thread NLS support...)
+       AC_TRY_RUN([
+                #define _GNU_SOURCE
+                #include <libintl.h>
+                #include <locale.h>
+                #include <time.h>
+                main() {
+                        char *foo = NULL;
+                        char baz[32];
+                       struct tm *tm;
+                        uselocale(LC_GLOBAL_LOCALE);
+                        foo = gettext("bar");
+                       if (0) {
+                               strftime_l(baz, sizeof baz, "%c", tm, LC_GLOBAL_LOCALE);
+                       }
+                        exit(0);
+               }
+       ],
+               ok_uselocale=yes,
+               ok_uselocale=no
+       )
+       ok_nls=$ok_uselocale
+fi
+
+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)
+       PROG_SUBDIRS="$PROG_SUBDIRS po"
+else
+       AC_MSG_RESULT(WebCit will be built without national language support.)
+fi
+
+AC_SUBST(SETUP_LIBS)
+
+AC_OUTPUT(Makefile po/Makefile )
+
+echo ------------------------------------------------------------------------
+echo 'zlib compression:                ' $ok_zlib
+echo 'Calendar support:                ' $ok_libical
+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..e276383
--- /dev/null
@@ -0,0 +1,493 @@
+/*
+ * $Id$
+ */
+/**
+ * \defgroup WebServerII some of the webserver stuff.
+ * 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.
+ * \ingroup WebcitHttpServer 
+ *
+ */
+/*@{*/
+#include "webcit.h"
+#include "webserver.h"
+
+/** Only one thread may manipulate SessionList at a time... */
+pthread_mutex_t SessionListMutex;
+
+struct wcsession *SessionList = NULL; /**< our sessions ????*/
+
+pthread_key_t MyConKey;         /**< TSD key for MySession() */
+
+
+/**
+ * \brief free the memory used for viewing atachments
+ * \param sess the session object to destroy
+ */
+void free_attachments(struct wcsession *sess) {
+       struct wc_attachment *att;
+
+       while (sess->first_attachment != NULL) {
+               att = sess->first_attachment;
+               sess->first_attachment = sess->first_attachment->next;
+               free(att->data);
+               free(att);
+       }
+}
+
+/**
+ * \brief what??????
+ */
+void do_housekeeping(void)
+{
+       struct wcsession *sptr, *ss;
+       struct wcsession *sessions_to_kill = NULL;
+       int num_sessions = 0;
+       static int num_threads = MIN_WORKER_THREADS;
+
+       /**
+        * Lock the session list, moving any candidates for euthanasia into
+        * a separate list.
+        */
+       pthread_mutex_lock(&SessionListMutex);
+       num_sessions = 0;
+       for (sptr = SessionList; sptr != NULL; sptr = sptr->next) {
+               ++num_sessions;
+
+               /** Kill idle sessions */
+               if ((time(NULL) - (sptr->lastreq)) >
+                  (time_t) WEBCIT_TIMEOUT) {
+                       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;
+               }
+       }
+       pthread_mutex_unlock(&SessionListMutex);
+
+       /**
+        * Now free up and destroy the culled sessions.
+        */
+       while (sessions_to_kill != NULL) {
+               lprintf(3, "Destroying session %d\n", sessions_to_kill->wc_session);
+               pthread_mutex_lock(&sessions_to_kill->SessionMutex);
+               close(sessions_to_kill->serv_sock);
+               close(sessions_to_kill->chat_sock);
+               if (sessions_to_kill->preferences != NULL) {
+                       free(sessions_to_kill->preferences);
+               }
+               if (sessions_to_kill->cache_fold != NULL) {
+                       free(sessions_to_kill->cache_fold);
+               }
+               free_attachments(sessions_to_kill);
+               free_march_list(sessions_to_kill);
+               pthread_mutex_unlock(&sessions_to_kill->SessionMutex);
+               sptr = sessions_to_kill->next;
+               free(sessions_to_kill);
+               sessions_to_kill = sptr;
+               --num_sessions;
+       }
+
+       /**
+        * If there are more sessions than threads, then we should spawn
+        * more threads ... up to a predefined maximum.
+        */
+       while ( (num_sessions > num_threads)
+             && (num_threads <= MAX_WORKER_THREADS) ) {
+               spawn_another_worker_thread();
+               ++num_threads;
+               lprintf(3, "There are %d sessions and %d threads active.\n",
+                       num_sessions, num_threads);
+       }
+}
+
+
+/**
+ * \brief Wake up occasionally and clean house
+ */
+void housekeeping_loop(void)
+{
+       while (1) {
+               sleeeeeeeeeep(HOUSEKEEPING);
+               do_housekeeping();
+       }
+}
+
+
+/**
+ * \brief Create a Session id
+ * Generate a unique WebCit session ID (which is not the same thing as the
+ * Citadel session ID).
+ *
+ * \todo FIXME ... ensure that session number is truly unique
+ *
+ */
+int GenerateSessionID(void)
+{
+       static int seq = (-1);
+
+       if (seq < 0) {
+               seq = (int) time(NULL);
+       }
+               
+       return ++seq;
+}
+
+
+/**
+ * \brief Collapse multiple cookies on one line
+ * \param sock a socket?
+ * \param buf some bunch of chars?
+ * \param hold hold what?
+ */
+int req_gets(int sock, char *buf, char *hold)
+{
+       int a;
+
+       if (strlen(hold) == 0) {
+               strcpy(buf, "");
+               a = client_getln(sock, buf, SIZ);
+               if (a<1) return(-1);
+       } else {
+               safestrncpy(buf, hold, SIZ);
+       }
+       strcpy(hold, "");
+
+       if (!strncasecmp(buf, "Cookie: ", 8)) {
+               for (a = 0; a < strlen(buf); ++a)
+                       if (buf[a] == ';') {
+                               sprintf(hold, "Cookie: %s", &buf[a + 1]);
+                               buf[a] = 0;
+                               while (isspace(hold[8]))
+                                       strcpy(&hold[8], &hold[9]);
+                               return(0);
+                       }
+       }
+
+       return(0);
+}
+
+/**
+ * \brief close some fd for some reason???
+ * \param fd the fd to close??????
+ * lingering_close() a`la Apache. see
+ * http://www.apache.org/docs/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);
+       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);
+}
+
+
+
+/**
+ * \brief      sanity requests
+ *             Check for bogus requests coming from brain-dead Windows boxes.
+ *
+ * \param      http_cmd        The HTTP request to check
+ */
+int is_bogus(char *http_cmd) {
+       char *url;
+
+       url = strstr(http_cmd, " ");
+       if (url == NULL) return(1);
+       ++url;
+
+       /** Worms and trojans and viruses, oh my! */
+       if (!strncasecmp(url, "/scripts/root.exe", 17)) return(2);
+       if (!strncasecmp(url, "/c/winnt", 8)) return(2);
+       if (!strncasecmp(url, "/MSADC/", 7)) return(2);
+
+       /** Broken Microsoft DAV implementation */
+       if (!strncasecmp(url, "/_vti", 5)) return(3);
+
+       return(0);      /* probably ok */
+}
+
+
+
+/**
+ * \brief 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.
+ * \param sock the socket we will put our answer to
+ */
+void context_loop(int sock)
+{
+       struct httprequest *req = NULL;
+       struct httprequest *last = NULL;
+       struct httprequest *hptr;
+       char buf[SIZ], hold[SIZ];
+       int desired_session = 0;
+       int got_cookie = 0;
+       int gzip_ok = 0;
+       struct wcsession *TheSession, *sptr;
+       char httpauth_string[1024];
+       char httpauth_user[1024];
+       char httpauth_pass[1024];
+       char accept_language[256];
+       char *ptr = NULL;
+       int session_is_new = 0;
+
+       strcpy(httpauth_string, "");
+       strcpy(httpauth_user, DEFAULT_HTTPAUTH_USER);
+       strcpy(httpauth_pass, DEFAULT_HTTPAUTH_PASS);
+
+       /**
+        * Find out what it is that the web browser is asking for
+        */
+       memset(hold, 0, sizeof(hold));
+       do {
+               if (req_gets(sock, buf, hold) < 0) return;
+
+               /**
+                * Can we compress?
+                */
+               if (!strncasecmp(buf, "Accept-encoding:", 16)) {
+                       if (strstr(&buf[16], "gzip")) {
+                               gzip_ok = 1;
+                       }
+               }
+
+               /**
+                * Browser-based sessions use cookies for session authentication
+                */
+               if (!strncasecmp(buf, "Cookie: webcit=", 15)) {
+                       cookie_to_stuff(&buf[15], &desired_session,
+                               NULL, 0, NULL, 0, NULL, 0);
+                       got_cookie = 1;
+               }
+
+               /**
+                * GroupDAV-based sessions use HTTP authentication
+                */
+               if (!strncasecmp(buf, "Authorization: Basic ", 21)) {
+                       CtdlDecodeBase64(httpauth_string, &buf[21], strlen(&buf[21]));
+                       extract_token(httpauth_user, httpauth_string, 0, ':', sizeof httpauth_user);
+                       extract_token(httpauth_pass, httpauth_string, 1, ':', sizeof httpauth_pass);
+               }
+
+               if (!strncasecmp(buf, "If-Modified-Since: ", 19)) {
+                       if_modified_since = httpdate_to_timestamp(&buf[19]);
+               }
+
+               if (!strncasecmp(buf, "Accept-Language: ", 17)) {
+                       safestrncpy(accept_language, &buf[17], sizeof accept_language);
+               }
+
+               /**
+                * Read in the request
+                */
+               hptr = (struct httprequest *)
+                       malloc(sizeof(struct httprequest));
+               if (req == NULL)
+                       req = hptr;
+               else
+                       last->next = hptr;
+               hptr->next = NULL;
+               last = hptr;
+
+               safestrncpy(hptr->line, buf, sizeof hptr->line);
+
+       } while (strlen(buf) > 0);
+
+       /**
+        * 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.
+        */
+       
+       ptr = strstr(req->line, " /webcit ");   /*< Handle "/webcit" */
+       if (ptr != NULL) {
+               strcpy(ptr+2, ptr+8);
+       }
+
+       ptr = strstr(req->line, " /webcit");    /*< Handle "/webcit/" */
+       if (ptr != NULL) {
+               strcpy(ptr+1, ptr+8);
+       }
+
+       /** Begin parsing the request. */
+
+       safestrncpy(buf, req->line, sizeof buf);
+       lprintf(5, "HTTP: %s\n", buf);
+
+       /** Check for bogus requests */
+       if (is_bogus(buf)) {
+               strcpy(req->line, "GET /404 HTTP/1.1");
+               strcpy(buf, "GET /404 HTTP/1.1");
+       }
+
+       /**
+        * Strip out the method, leaving the URL up front...
+        */
+       remove_token(buf, 0, ' ');
+       if (buf[1]==' ') buf[1]=0;
+
+       /**
+        * While we're at it, gracefully handle requests for the
+        * robots.txt and favicon.ico files.
+        */
+       if (!strncasecmp(buf, "/robots.txt", 11)) {
+               strcpy(req->line, "GET /static/robots.txt"
+                               "?force_close_session=yes HTTP/1.1");
+       }
+       else if (!strncasecmp(buf, "/favicon.ico", 12)) {
+               strcpy(req->line, "GET /static/favicon.ico");
+       }
+
+       /**
+        * These are the URL's which may be executed without a
+        * session cookie already set.  If it's not one of these,
+        * force the session to close because cookies are
+        * probably disabled on the client browser.
+        */
+       else if ( (strcmp(buf, "/"))
+               && (strncasecmp(buf, "/listsub", 8))
+               && (strncasecmp(buf, "/freebusy", 9))
+               && (strncasecmp(buf, "/do_logout", 10))
+               && (strncasecmp(buf, "/groupdav", 9))
+               && (strncasecmp(buf, "/static", 7))
+               && (strncasecmp(buf, "/rss", 4))
+               && (strncasecmp(buf, "/404", 4))
+               && (got_cookie == 0)) {
+               strcpy(req->line, "GET /static/nocookies.html"
+                               "?force_close_session=yes HTTP/1.1");
+       }
+
+       /**
+        * See if there's an existing session open with the desired ID or user/pass
+        */
+       TheSession = NULL;
+
+       if (TheSession == NULL) {
+               pthread_mutex_lock(&SessionListMutex);
+               for (sptr = SessionList; sptr != NULL; sptr = sptr->next) {
+
+                       /** If HTTP-AUTH, look for a session with matching credentials */
+                       if ( (strlen(httpauth_user) > 0)
+                          &&(!strcasecmp(sptr->httpauth_user, httpauth_user))
+                          &&(!strcasecmp(sptr->httpauth_pass, httpauth_pass)) ) {
+                               TheSession = sptr;
+                       }
+
+                       /** If cookie-session, look for a session with matching session ID */
+                       if ( (desired_session != 0) && (sptr->wc_session == desired_session)) {
+                               TheSession = sptr;
+                       }
+
+               }
+               pthread_mutex_unlock(&SessionListMutex);
+       }
+
+       /**
+        * Create a new session if we have to
+        */
+       if (TheSession == NULL) {
+               lprintf(3, "Creating a new session\n");
+               TheSession = (struct wcsession *)
+                       malloc(sizeof(struct wcsession));
+               memset(TheSession, 0, sizeof(struct wcsession));
+               TheSession->serv_sock = (-1);
+               TheSession->chat_sock = (-1);
+               TheSession->wc_session = GenerateSessionID();
+               strcpy(TheSession->httpauth_user, httpauth_user);
+               strcpy(TheSession->httpauth_pass, httpauth_pass);
+               pthread_mutex_init(&TheSession->SessionMutex, NULL);
+               pthread_mutex_lock(&SessionListMutex);
+               TheSession->next = SessionList;
+               SessionList = TheSession;
+               pthread_mutex_unlock(&SessionListMutex);
+               session_is_new = 1;
+       }
+
+       /**
+        * A future improvement might be to check the session integrity
+        * at this point before continuing.
+        */
+
+       /**
+        * Bind to the session and perform the transaction
+        */
+       pthread_mutex_lock(&TheSession->SessionMutex);          /*< bind */
+       pthread_setspecific(MyConKey, (void *)TheSession);
+       TheSession->http_sock = sock;
+       TheSession->lastreq = time(NULL);                       /*< log */
+       TheSession->gzip_ok = gzip_ok;
+#ifdef ENABLE_NLS
+       if (session_is_new) {
+               httplang_to_locale(accept_language);
+       }
+       go_selected_language();                         /*< set locale */
+#endif
+       session_loop(req);                              /*< do transaction */
+#ifdef ENABLE_NLS
+       stop_selected_language();                       /*< unset locale */
+#endif
+       pthread_mutex_unlock(&TheSession->SessionMutex);        /*< unbind */
+
+       /** Free the request buffer */
+       while (req != NULL) {
+               hptr = req->next;
+               free(req);
+               req = hptr;
+       }
+
+       /**
+        * Free up any session-local substitution variables which
+        * were set during this transaction
+        */
+       clear_local_substs();
+}
+/*@}*/
diff --git a/webcit/cookie_conversion.c b/webcit/cookie_conversion.c
new file mode 100644 (file)
index 0000000..24e29ce
--- /dev/null
@@ -0,0 +1,98 @@
+/*
+ * $Id$
+ */
+/**
+ * \defgroup CookieConversion Grep Cookies
+ * Utility functions which convert the HTTP cookie format we use to and
+ * from user/password/room strings.
+ *
+ * \ingroup WebcitHttpServer 
+ */
+/*@{*/
+#include "webcit.h"
+
+
+#define TRUE  1    /**< for sure? */
+#define FALSE 0    /**< nope. */
+
+typedef unsigned char byte;          /**< Byte type */
+
+/**
+ * \brief find cookie
+ * Pack all session info into one easy-to-digest cookie. Healthy and delicious!
+ * \param cookie cookie string to create???
+ * \param session the session we want to convert into a cookie
+ * \param user the user to be associated with the cookie
+ * \param pass his passphrase
+ * \param room the room he wants to enter
+ */
+void stuff_to_cookie(char *cookie, int session,
+               char *user, char *pass, char *room)
+{
+       char buf[SIZ];
+       int i;
+
+       sprintf(buf, "%d|%s|%s|%s|", session, user, pass, room);
+       strcpy(cookie, "");
+       for (i=0; i<strlen(buf); ++i) {
+               sprintf(&cookie[i*2], "%02X", buf[i]);
+       }
+}
+
+/**
+ * \brief      Convert unpacked hex string to an integer
+ * \param      in      Input hex string
+ * \param      len     the length of the string
+ * \return     the corrosponding integer value
+ */
+int xtoi(char *in, size_t len)
+{
+       int val = 0;
+       char c = 0;
+       while (isxdigit((byte) *in) && (len-- > 0))
+       {
+               c = *in++;
+               val <<= 4;
+               val += isdigit((unsigned char)c)
+               ? (c - '0')
+               : (tolower((unsigned char)c) - 'a' + 10);
+       }
+       return val;
+}
+
+/**
+ * \brief Extract all that fun stuff out of the cookie.
+ * \param cookie the cookie string
+ * \param session the corrosponding session to return
+ * \param user the user string
+ * \param user_len the user stringlength
+ * \param pass the passphrase
+ * \param pass_len length of the passphrase string 
+ * \param room the room he is in
+ * \param room_len the length of the room string
+ */
+void cookie_to_stuff(char *cookie, int *session,
+               char *user, size_t user_len,
+               char *pass, size_t pass_len,
+               char *room, size_t room_len)
+{
+       char buf[SIZ];
+       int i, len;
+
+       strcpy(buf, "");
+       len = strlen(cookie) * 2 ;
+       for (i=0; i<len; ++i) {
+               buf[i] = xtoi(&cookie[i*2], 2);
+               buf[i+1] = 0;
+       }
+
+       if (session != NULL)
+               *session = extract_int(buf, 0);
+       if (user != NULL)
+               extract_token(user, buf, 1, '|', user_len);
+       if (pass != NULL)
+               extract_token(pass, buf, 2, '|', pass_len);
+       if (room != NULL)
+               extract_token(room, buf, 3, '|', room_len);
+}
+/*@}*/
diff --git a/webcit/crypto.c b/webcit/crypto.c
new file mode 100644 (file)
index 0000000..77ba894
--- /dev/null
@@ -0,0 +1,521 @@
+/*
+ * $Id$
+ */
+/**
+ * \defgroup https  Provides HTTPS, when the OpenSSL library is available.
+ * \ingroup WebcitHttpServer 
+ */
+
+/*@{*/
+#include "config.h"
+#ifdef HAVE_OPENSSL
+
+#include "webcit.h"
+#include "webserver.h"
+/** \todo dirify */
+/** where to find the keys */
+#define        CTDL_CRYPTO_DIR         "./keys" 
+#define CTDL_KEY_PATH          CTDL_CRYPTO_DIR "/citadel.key" /**< the key */
+#define CTDL_CSR_PATH          CTDL_CRYPTO_DIR "/citadel.csr" /**< the csr file */
+#define CTDL_CER_PATH          CTDL_CRYPTO_DIR "/citadel.cer" /**< the cer file */
+#define SIGN_DAYS              365 /**< how long our certificate should live */
+
+SSL_CTX *ssl_ctx;              /**< SSL context */
+pthread_mutex_t **SSLCritters; /**< Things needing locking */
+
+pthread_key_t ThreadSSL;       /**< Per-thread SSL context */
+
+/**
+ * \brief what?????
+ * \return thread id??? 
+ */
+static unsigned long id_callback(void)
+{
+       return (unsigned long) pthread_self();
+}
+
+/**
+ * \brief initialize ssl engine
+ * load certs and initialize openssl internals
+ */
+void init_ssl(void)
+{
+       SSL_METHOD *ssl_method;
+       RSA *rsa=NULL;
+       X509_REQ *req = NULL;
+       X509 *cer = NULL;
+       EVP_PKEY *pk = NULL;
+       EVP_PKEY *req_pkey = NULL;
+       X509_NAME *name = NULL;
+       FILE *fp;
+       char buf[SIZ];
+
+       if (!access("/var/run/egd-pool", F_OK))
+               RAND_egd("/var/run/egd-pool");
+
+       if (!RAND_status()) {
+               lprintf(3,
+                       "PRNG not adequately seeded, won't do SSL/TLS\n");
+               return;
+       }
+       SSLCritters =
+           malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t *));
+       if (!SSLCritters) {
+               lprintf(1, "citserver: can't allocate memory!!\n");
+               /* Nothing's been initialized, just die */
+               exit(1);
+       } else {
+               int a;
+
+               for (a = 0; a < CRYPTO_num_locks(); a++) {
+                       SSLCritters[a] = malloc(sizeof(pthread_mutex_t));
+                       if (!SSLCritters[a]) {
+                               lprintf(1,
+                                       "citserver: can't allocate memory!!\n");
+                               /** Nothing's been initialized, just die */
+                               exit(1);
+                       }
+                       pthread_mutex_init(SSLCritters[a], NULL);
+               }
+       }
+
+       /**
+        * Initialize SSL transport layer
+        */
+       SSL_library_init();
+       SSL_load_error_strings();
+       ssl_method = SSLv23_server_method();
+       if (!(ssl_ctx = SSL_CTX_new(ssl_method))) {
+               lprintf(3, "SSL_CTX_new failed: %s\n",
+                       ERR_reason_error_string(ERR_get_error()));
+               return;
+       }
+
+       CRYPTO_set_locking_callback(ssl_lock);
+       CRYPTO_set_id_callback(id_callback);
+
+       /**
+        * Get our certificates in order. \todo dirify. this is a setup job.
+        * First, create the key/cert directory if it's not there already...
+        */
+       mkdir(CTDL_CRYPTO_DIR, 0700);
+
+       /**
+        * Before attempting to generate keys/certificates, first try
+        * link to them from the Citadel server if it's on the same host.
+        * We ignore any error return because it either meant that there
+        * was nothing in Citadel to link from (in which case we just
+        * generate new files) or the target files already exist (which
+        * is not fatal either). \todo dirify
+        */
+       if (!strcasecmp(ctdlhost, "uds")) {
+               sprintf(buf, "%s/keys/citadel.key", ctdlport);
+               symlink(buf, CTDL_KEY_PATH);
+               sprintf(buf, "%s/keys/citadel.csr", ctdlport);
+               symlink(buf, CTDL_CSR_PATH);
+               sprintf(buf, "%s/keys/citadel.cer", ctdlport);
+               symlink(buf, CTDL_CER_PATH);
+       }
+
+       /**
+        * If we still don't have a private key, generate one.
+        */
+       if (access(CTDL_KEY_PATH, R_OK) != 0) {
+               lprintf(5, "Generating RSA key pair.\n");
+               rsa = RSA_generate_key(1024,    /**< modulus size */
+                                       65537,  /**< exponent */
+                                       NULL,   /**< no callback */
+                                       NULL);  /**< no callback */
+               if (rsa == NULL) {
+                       lprintf(3, "Key generation failed: %s\n",
+                               ERR_reason_error_string(ERR_get_error()));
+               }
+               if (rsa != NULL) {
+                       fp = fopen(CTDL_KEY_PATH, "w");
+                       if (fp != NULL) {
+                               chmod(CTDL_KEY_PATH, 0600);
+                               if (PEM_write_RSAPrivateKey(fp, /**< the file */
+                                                       rsa,    /**< the key */
+                                                       NULL,   /**< no enc */
+                                                       NULL,   /**< no passphr */
+                                                       0,      /**< no passphr */
+                                                       NULL,   /**< no callbk */
+                                                       NULL    /**< no callbk */
+                               ) != 1) {
+                                       lprintf(3, "Cannot write key: %s\n",
+                                               ERR_reason_error_string(ERR_get_error()));
+                                       unlink(CTDL_KEY_PATH);
+                               }
+                               fclose(fp);
+                       }
+                       RSA_free(rsa);
+               }
+       }
+
+       /**
+        * Generate a CSR if we don't have one.
+        */
+       if (access(CTDL_CSR_PATH, R_OK) != 0) {
+               lprintf(5, "Generating a certificate signing request.\n");
+
+               /**
+                * Read our key from the file.  No, we don't just keep this
+                * in memory from the above key-generation function, because
+                * there is the possibility that the key was already on disk
+                * and we didn't just generate it now.
+                */
+               fp = fopen(CTDL_KEY_PATH, "r");
+               if (fp) {
+                       rsa = PEM_read_RSAPrivateKey(fp, NULL, NULL, NULL);
+                       fclose(fp);
+               }
+
+               if (rsa) {
+
+                       /** Create a public key from the private key */
+                       if (pk=EVP_PKEY_new(), pk != NULL) {
+                               EVP_PKEY_assign_RSA(pk, rsa);
+                               if (req = X509_REQ_new(), req != NULL) {
+
+                                       /** Set the public key */
+                                       X509_REQ_set_pubkey(req, pk);
+                                       X509_REQ_set_version(req, 0L);
+
+                                       name = X509_REQ_get_subject_name(req);
+
+                                       /** Tell it who we are */
+
+                                       /* \todo whats this?
+                                       X509_NAME_add_entry_by_txt(name, "C",
+                                               MBSTRING_ASC, "US", -1, -1, 0);
+
+                                       X509_NAME_add_entry_by_txt(name, "ST",
+                                               MBSTRING_ASC, "New York", -1, -1, 0);
+
+                                       X509_NAME_add_entry_by_txt(name, "L",
+                                               MBSTRING_ASC, "Mount Kisco", -1, -1, 0);
+                                       */
+
+                                       X509_NAME_add_entry_by_txt(name, "O",
+                                               MBSTRING_ASC, "FIXME.FIXME.org", -1, -1, 0);
+
+                                       X509_NAME_add_entry_by_txt(name, "OU",
+                                               MBSTRING_ASC, "Citadel server", -1, -1, 0);
+
+                                       X509_NAME_add_entry_by_txt(name, "CN",
+                                               MBSTRING_ASC, "FIXME.FIXME.org", -1, -1, 0);
+                               
+                                       X509_REQ_set_subject_name(req, name);
+
+                                       /** Sign the CSR */
+                                       if (!X509_REQ_sign(req, pk, EVP_md5())) {
+                                               lprintf(3, "X509_REQ_sign(): error\n");
+                                       }
+                                       else {
+                                               /** Write it to disk. */        
+                                               fp = fopen(CTDL_CSR_PATH, "w");
+                                               if (fp != NULL) {
+                                                       chmod(CTDL_CSR_PATH, 0600);
+                                                       PEM_write_X509_REQ(fp, req);
+                                                       fclose(fp);
+                                               }
+                                       }
+
+                                       X509_REQ_free(req);
+                               }
+                       }
+
+                       RSA_free(rsa);
+               }
+
+               else {
+                       lprintf(3, "Unable to read private key.\n");
+               }
+       }
+
+
+
+       /**
+        * Generate a self-signed certificate if we don't have one.
+        */
+       if (access(CTDL_CER_PATH, R_OK) != 0) {
+               lprintf(5, "Generating a self-signed certificate.\n");
+
+               /** Same deal as before: always read the key from disk because
+                * it may or may not have just been generated.
+                */
+               fp = fopen(CTDL_KEY_PATH, "r");
+               if (fp) {
+                       rsa = PEM_read_RSAPrivateKey(fp, NULL, NULL, NULL);
+                       fclose(fp);
+               }
+
+               /** This also holds true for the CSR. */
+               req = NULL;
+               cer = NULL;
+               pk = NULL;
+               if (rsa) {
+                       if (pk=EVP_PKEY_new(), pk != NULL) {
+                               EVP_PKEY_assign_RSA(pk, rsa);
+                       }
+
+                       fp = fopen(CTDL_CSR_PATH, "r");
+                       if (fp) {
+                               req = PEM_read_X509_REQ(fp, NULL, NULL, NULL);
+                               fclose(fp);
+                       }
+
+                       if (req) {
+                               if (cer = X509_new(), cer != NULL) {
+
+                                       ASN1_INTEGER_set(X509_get_serialNumber(cer), 0);
+                                       X509_set_issuer_name(cer, req->req_info->subject);
+                                       X509_set_subject_name(cer, req->req_info->subject);
+                                       X509_gmtime_adj(X509_get_notBefore(cer), 0);
+                                       X509_gmtime_adj(X509_get_notAfter(cer),(long)60*60*24*SIGN_DAYS);
+
+                                       req_pkey = X509_REQ_get_pubkey(req);
+                                       X509_set_pubkey(cer, req_pkey);
+                                       EVP_PKEY_free(req_pkey);
+                                       
+                                       /** Sign the cert */
+                                       if (!X509_sign(cer, pk, EVP_md5())) {
+                                               lprintf(3, "X509_sign(): error\n");
+                                       }
+                                       else {
+                                               /** Write it to disk. */        
+                                               fp = fopen(CTDL_CER_PATH, "w");
+                                               if (fp != NULL) {
+                                                       chmod(CTDL_CER_PATH, 0600);
+                                                       PEM_write_X509(fp, cer);
+                                                       fclose(fp);
+                                               }
+                                       }
+                                       X509_free(cer);
+                               }
+                       }
+
+                       RSA_free(rsa);
+               }
+       }
+
+       /**
+        * Now try to bind to the key and certificate.
+        * Note that we use SSL_CTX_use_certificate_chain_file() which allows
+        * the certificate file to contain intermediate certificates.
+        */
+       SSL_CTX_use_certificate_chain_file(ssl_ctx, CTDL_CER_PATH);
+       SSL_CTX_use_PrivateKey_file(ssl_ctx, CTDL_KEY_PATH, SSL_FILETYPE_PEM);
+       if ( !SSL_CTX_check_private_key(ssl_ctx) ) {
+               lprintf(3, "Cannot install certificate: %s\n",
+                               ERR_reason_error_string(ERR_get_error()));
+       }
+       
+}
+
+
+/**
+ * \brief starts SSL/TLS encryption for the current session.
+ * \param sock the socket connection
+ * \return Zero if the SSL/TLS handshake succeeded, non-zero otherwise.
+ */
+int starttls(int sock) {
+       int retval, bits, alg_bits;
+       SSL *newssl;
+
+       pthread_setspecific(ThreadSSL, NULL);
+
+       if (!ssl_ctx) {
+               return(1);
+       }
+       if (!(newssl = SSL_new(ssl_ctx))) {
+               lprintf(3, "SSL_new failed: %s\n",
+                               ERR_reason_error_string(ERR_get_error()));
+               return(2);
+       }
+       if (!(SSL_set_fd(newssl, sock))) {
+               lprintf(3, "SSL_set_fd failed: %s\n",
+                       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;
+
+               errval = SSL_get_error(newssl, retval);
+               lprintf(3, "SSL_accept failed: %s\n",
+                       ERR_reason_error_string(ERR_get_error()));
+               SSL_free(newssl);
+               newssl = NULL;
+               return(4);
+       }
+       BIO_set_close(newssl->rbio, BIO_NOCLOSE);
+       bits =
+           SSL_CIPHER_get_bits(SSL_get_current_cipher(newssl),
+                               &alg_bits);
+       lprintf(5, "SSL/TLS using %s on %s (%d of %d bits)\n",
+               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);
+       return(0);
+}
+
+
+
+/**
+ * \brief shuts down the TLS connection
+ *
+ * WARNING:  This may make your session vulnerable to a known plaintext
+ * attack in the current implmentation.
+ */
+void endtls(void)
+{
+       SSL_CTX *ctx = NULL;
+
+       if (THREADSSL == NULL) return;
+
+       lprintf(5, "Ending SSL/TLS\n");
+       SSL_shutdown(THREADSSL);
+       ctx = SSL_get_SSL_CTX(THREADSSL);
+       if (ctx != NULL) {
+               SSL_CTX_free(ctx);
+       }
+       SSL_free(THREADSSL);
+       pthread_setspecific(ThreadSSL, NULL);
+}
+
+
+/**
+ * \brief callback for OpenSSL mutex locks
+ * \param mode which mode??????
+ * \param n  how many???
+ * \param file which filename ???
+ * \param line what line????
+ */
+void ssl_lock(int mode, int n, const char *file, int line)
+{
+       if (mode & CRYPTO_LOCK)
+               pthread_mutex_lock(SSLCritters[n]);
+       else
+               pthread_mutex_unlock(SSLCritters[n]);
+}
+
+/**
+ * \brief Send binary data to the client encrypted.
+ * \param buf chars to send to the client
+ * \param nbytes how many chars
+ */
+void client_write_ssl(char *buf, int nbytes)
+{
+       int retval;
+       int nremain;
+       char junk[1];
+
+       if (THREADSSL == NULL) return;
+
+       nremain = nbytes;
+
+       while (nremain > 0) {
+               if (SSL_want_write(THREADSSL)) {
+                       if ((SSL_read(THREADSSL, junk, 0)) < 1) {
+                               lprintf(9, "SSL_read in client_write: %s\n",
+                                               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) {
+                               sleep(1);
+                               continue;
+                       }
+                       lprintf(9, "SSL_write got error %ld, ret %d\n", errval, retval);
+                       if (retval == -1) {
+                               lprintf(9, "errno is %d\n", errno);
+                       }
+                       endtls();
+                       return;
+               }
+               nremain -= retval;
+       }
+}
+
+
+/**
+ * \brief read data from the encrypted layer.
+ * \param buf charbuffer to read to 
+ * \param bytes how many
+ * \param timeout how long should we wait?
+ * \returns what???
+ */
+int client_read_ssl(char *buf, int bytes, int timeout)
+{
+#if 0
+       fd_set rfds;
+       struct timeval tv;
+       int retval;
+       int s;
+#endif
+       int len, rlen;
+       char junk[1];
+
+       if (THREADSSL == NULL) return(0);
+
+       len = 0;
+       while (len < bytes) {
+#if 0
+               /**
+                * This code is disabled because we don't need it when
+                * using blocking reads (which we are). -IO
+                */
+               FD_ZERO(&rfds);
+               s = BIO_get_fd(THREADSSL->rbio, NULL);
+               FD_SET(s, &rfds);
+               tv.tv_sec = timeout;
+               tv.tv_usec = 0;
+
+               retval = select(s + 1, &rfds, NULL, NULL, &tv);
+
+               if (FD_ISSET(s, &rfds) == 0) {
+                       return (0);
+               }
+
+#endif
+               if (SSL_want_read(THREADSSL)) {
+                       if ((SSL_write(THREADSSL, junk, 0)) < 1) {
+                               lprintf(9, "SSL_write in client_read: %s\n", ERR_reason_error_string(ERR_get_error()));
+                       }
+               }
+               rlen = SSL_read(THREADSSL, &buf[len], bytes - len);
+               if (rlen < 1) {
+                       long errval;
+
+                       errval = SSL_get_error(THREADSSL, rlen);
+                       if (errval == SSL_ERROR_WANT_READ ||
+                           errval == SSL_ERROR_WANT_WRITE) {
+                               sleep(1);
+                               continue;
+                       }
+                       lprintf(9, "SSL_read got error %ld\n", errval);
+                       endtls();
+                       return (0);
+               }
+               len += rlen;
+       }
+       return (1);
+}
+
+
+#endif                         /* HAVE_OPENSSL */
+/*@}*/
diff --git a/webcit/debian/README.Debian b/webcit/debian/README.Debian
new file mode 100644 (file)
index 0000000..6e63ba4
--- /dev/null
@@ -0,0 +1,6 @@
+webcit for Debian
+-----------------
+
+<possible notes regarding this package - if none, delete this file>
+
+ -- Wilfried Goesgens <willi@jordy.home.net>, Mon, 25 Jul 2005 12:46:10 +0200
diff --git a/webcit/debian/changelog b/webcit/debian/changelog
new file mode 100644 (file)
index 0000000..81ab049
--- /dev/null
@@ -0,0 +1,18 @@
+webcit (6.71-2) unstable; urgency=low
+       
+  * update to actual Webcit SVN. many new features. see Packages changelog.
+
+ -- Wilfried Goesgens <w.goesgens@chaosindustries.de>  Sat, 21 Jan 2006 19:07:00 +0100
+       
+webcit (6.31-2) unstable; urgency=low
+       
+  * update to actual Citadel SVN. many new features. see Packages changelog.
+
+ -- Wilfried Goesgens <w.goesgens@chaosindustries.de>  Tue, 01 Nov 2005 18:06:00 +0100
+       
+webcit (6.21-1) unstable; urgency=low
+
+  * Initial release Closes: #nnnn  (nnnn is the bug number of your ITP)
+
+ -- Wilfried Goesgens <willi@jordy.home.net>  Mon, 25 Jul 2005 12:46:10 +0200
+
diff --git a/webcit/debian/citadel-webcit-apache.config b/webcit/debian/citadel-webcit-apache.config
new file mode 100644 (file)
index 0000000..6050001
--- /dev/null
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+PACKAGE="citadel"
+SOURCE="citadel"
+VERSION="4:2.6.4-pl3-1"
+
+. /usr/share/debconf/confmodule
+db_version 2.0 || [ 0 -lt 30 ]
+
+# Package maintainer's commands follow:
+if test -n "$2"; then
+ if test "`echo $2 | sed -e 's/[.-]//g'`" -lt 127 \
+         -o $1 = reconfigure
+ then
+        db_input medium citadel/reconfigure-webserver || true
+        db_go
+# End of package maintainer's commands
+ fi
+fi
+exit 0
diff --git a/webcit/debian/citadel-webcit-apache.postinst b/webcit/debian/citadel-webcit-apache.postinst
new file mode 100644 (file)
index 0000000..0d3edb9
--- /dev/null
@@ -0,0 +1,100 @@
+#! /bin/sh
+# postinst.skeleton
+# Skeleton maintainer script showing all the possible cases.
+# Written by Charles Briscoe-Smith, March-June 1998.  Public Domain.
+
+# Abort if any command returns an error value
+set -e
+. /usr/share/debconf/confmodule
+
+
+uninclude() {
+       if [ ! -a /etc/$server/conf.d/webcit     ]; then
+               if [ -f /etc/$server/httpd.conf \
+                       -a -f /usr/share/wwwconfig-common/apache-uninclude_all.sh ]
+               then
+                       includefile=$1
+                       . /usr/share/wwwconfig-common/apache-uninclude_all.sh
+               fi
+       fi
+}
+
+
+case "$1" in
+  configure)
+    # Configure this package.  If the package must prompt the user for
+    # information, do it here.
+               . /usr/share/debconf/confmodule
+               db_version 2.0
+               db_get "citadel/baseurl" && baseurl="$RET"
+               if echo "$baseurl"|grep -q "http"; then
+                       if echo "$baseurl"|grep -q "https"; then
+                               HOSTNAME=    ServerName `echo "$baseurl" |sed "s;https://\(.*\)/.*;\1;"`
+                               BASEURL=`echo "$baseurl" |sed "s;http://.*\..*/.*;\1;"`
+                       else
+                               HOSTNAME=    ServerName `echo "$baseurl" |sed "s;https://\(.*\)/.*;\1;"`
+                               BASEURL=`echo "$baseurl" |sed "s;https://.*\..*/.*;\1;"`
+                       fi
+               else
+                       HOSTNAME="ServerName *"
+                       BASEURL="$baseurl"
+               fi
+               echo "
+<VirtualHost *>
+${SERVERNAME}
+       DocumentRoot /var/www/
+#    ProxyPass /dotskip http://127.0.0.1:2000/dotskip
+#    ProxyPassReverse /dotskip http://127.0.0.1:2000/dotskip
+    ProxyPass /webcit/ http://127.0.0.1:2000/
+    ProxyPassReverse /webcit/ http://127.0.0.1:2000/
+    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/
+</VirtualHost>
+" >/tmp/apache.conf
+        ucf /tmp/apache.conf /etc/citadel/apache.conf
+               db_get "citadel/webserver" && webserver="$RET"
+               case "$webserver" in
+                       Apache)         webservers="apache";;
+                       Apache-SSL)     webservers="apache-ssl";;
+                       Apache-Perl)    webservers="apache-perl";;
+                       Apache2)                
+                               webservers="apache2"
+                               a2enmod proxy
+                               ;;
+                       
+                       *)                              webservers="";;
+               esac
+               
+               
+               
+               for server in $webservers; do
+                       test -d /etc/$server || continue
+                       
+                       if [ -n "$2" ]; then
+                               uninclude 
+                       fi
+                       
+                       if [ ! -e /etc/$server/conf.d/webcit ]
+                               then
+                               ln -s /etc/citadel/apache.conf /etc/$server/conf.d/webcit
+                       fi
+                       restart=$server
+                       servers=$webservers
+                       . /usr/share/wwwconfig-common/restart.sh
+               done
+
+               ;;
+
+       abort-upgrade|abort-remove|abort-deconfigure)
+
+       ;;
+
+       *)
+               echo "postinst called with unknown argument \`$1'" >&2
+               exit 1
+       ;;
+esac
+
+exit 0
diff --git a/webcit/debian/citadel-webcit-apache.postrm b/webcit/debian/citadel-webcit-apache.postrm
new file mode 100644 (file)
index 0000000..de0073f
--- /dev/null
@@ -0,0 +1,89 @@
+#! /bin/sh
+# postrm.skeleton
+# Skeleton maintainer script showing all the possible cases.
+# Written by Charles Briscoe-Smith, March-June 1998.  Public Domain.
+. /usr/share/debconf/confmodule
+
+# Abort if any command returns an error value
+set -e
+
+# This script is called twice during the removal of the package; once
+# after the removal of the package's files from the system, and as
+# the final step in the removal of this package, after the package's
+# conffiles have been removed.
+
+# Ensure the menu system is updated
+: [ ! -x /usr/bin/update-menus ] || /usr/bin/update-menus
+
+case "$1" in
+  remove)
+    # This package is being removed, but its configuration has not yet
+    # been purged.
+       
+    ;;
+  purge)
+    # This package has previously been removed and is now having
+    # its configuration purged from the system.
+       # remove the gunzipped setup executable.
+       db_purge 'citadel/webserver'
+       db_purge 'citadel/baseurl'
+       ### TODO: remove citadel from inittab!
+    ;;
+  disappear)
+    if test "$2" != overwriter; then
+      echo "$0: undocumented call to \`postrm $*'" 1>&2
+      exit 0
+    fi
+    # This package has been completely overwritten by package $3
+    # (version $4).  All our files are already gone from the system.
+    # This is a special case: neither "prerm remove" nor "postrm remove"
+    # have been called, because dpkg didn't know that this package would
+    # disappear until this stage.
+    :
+
+    ;;
+  upgrade)
+    # About to upgrade FROM THIS VERSION to version $2 of this package.
+    # "prerm upgrade" has been called for this version, and "preinst
+    # upgrade" has been called for the new version.  Last chance to
+    # clean up.
+    :
+
+    ;;
+  failed-upgrade)
+    # About to upgrade from version $2 of this package TO THIS VERSION.
+    # "prerm upgrade" has been called for the old version, and "preinst
+    # upgrade" has been called for this version.  This is only used if
+    # the previous version's "postrm upgrade" couldn't handle it and
+    # returned non-zero. (Fix old postrm bugs here.)
+    :
+
+    ;;
+  abort-install)
+    # Back out of an attempt to install this package.  Undo the effects of
+    # "preinst install...".  There are two sub-cases.
+    :
+
+    if test "${2+set}" = set; then
+      # When the install was attempted, version $2's configuration
+      # files were still on the system.  Undo the effects of "preinst
+      # install $2".
+      :
+
+    else
+      # We were being installed from scratch.  Undo the effects of
+      # "preinst install".
+      :
+
+    fi ;;
+  abort-upgrade)
+    # Back out of an attempt to upgrade this package from version $2
+    # TO THIS VERSION.  Undo the effects of "preinst upgrade $2".
+    :
+
+    ;;
+  *) echo "$0: didn't understand being called with \`$1'" 1>&2
+     exit 0;;
+esac
+
+exit 0
diff --git a/webcit/debian/citadel-webcit-apache.postrm.debhelper b/webcit/debian/citadel-webcit-apache.postrm.debhelper
new file mode 100644 (file)
index 0000000..bc035b9
--- /dev/null
@@ -0,0 +1,6 @@
+# Automatically added by dh_installdebconf
+if [ "$1" = purge ] && [ -e /usr/share/debconf/confmodule ]; then
+       . /usr/share/debconf/confmodule
+       db_purge
+fi
+# End automatically added section
diff --git a/webcit/debian/citadel-webcit-apache.substvars b/webcit/debian/citadel-webcit-apache.substvars
new file mode 100644 (file)
index 0000000..a8fe3cf
--- /dev/null
@@ -0,0 +1 @@
+misc:Depends=debconf (>= 0.5) | debconf-2.0
diff --git a/webcit/debian/citadel-webcit-apache.templates b/webcit/debian/citadel-webcit-apache.templates
new file mode 100644 (file)
index 0000000..1fae6ef
--- /dev/null
@@ -0,0 +1,21 @@
+
+Template: citadel/webserver
+Type: multiselect
+Choices: Apache, Apache-SSL, Apache-Perl, Apache2, None
+Default: Apache2
+Description: Select Server
+  Integrates Citadel with your Webserver.
+  Please select one or more Webservers, you want webcit to
+  be visible under. Webcit can run under any Proxy enabled
+  Webserver but this automatic configuration process only 
+  supports Apache servers.
+
+Template: citadel/baseurl
+Type: string
+Default: /webcit
+Description: HTTP Location
+  Please specify the way you want to make Webcit visible 
+  through your Webserver. Just enter a path, if you want 
+  to make it visible under that path at any of your vhosts.
+  Alternate enter a FQDN of the VHost you want to use, like
+  http://webcit.yoursite.net
\ No newline at end of file
diff --git a/webcit/debian/citadel-webcit.config b/webcit/debian/citadel-webcit.config
new file mode 100755 (executable)
index 0000000..9b01a75
--- /dev/null
@@ -0,0 +1,19 @@
+#!/bin/sh
+set -e
+
+. /usr/share/debconf/confmodule
+
+if test -n "$2"; then
+ if test "`echo $2 | sed -e 's/[.-]//g'`" -lt 127 \
+         -o $1 = reconfigure
+ then
+       db_input high citadel/WebcitHttpPort
+       db_input high citadel/WebcitHttpsPort
+       db_input high citadel/WebcitInstallnote
+       db_go
+ fi
+fi
+
+
+
+exit 0
diff --git a/webcit/debian/citadel-webcit.postinst b/webcit/debian/citadel-webcit.postinst
new file mode 100644 (file)
index 0000000..b38eea2
--- /dev/null
@@ -0,0 +1,196 @@
+#! /bin/sh
+# postinst.skeleton
+# Skeleton maintainer script showing all the possible cases.
+# Written by Charles Briscoe-Smith, March-June 1998.  Public Domain.
+
+# Abort if any command returns an error value
+set -e
+. /usr/share/debconf/confmodule
+
+# This script is called as the last step of the installation of the
+# package.  All the package's files are in place, dpkg has already done
+# its automatic conffile handling, and all the packages we depend of
+# are already fully installed and configured.
+
+# The following idempotent stuff doesn't generally need protecting
+# against being run in the abort-* cases.
+
+#### Install info files into the dir file
+###: install-info --quiet --section "section pattern" "Section Title" \
+###:              --description="Name of the document" /usr/info/foo.info
+###
+#### Create stub directories under /usr/local
+###: if test ! -d /usr/local/lib/foo; then
+###:   if test ! -d /usr/local/lib; then
+###:     if mkdir /usr/local/lib; then
+###:       chown root.staff /usr/local/lib || true
+###:       chmod 2775 /usr/local/lib || true
+###:     fi
+###:   fi
+###:   if mkdir /usr/local/lib/foo; then
+###:     chown root.staff /usr/local/lib/foo || true
+###:     chmod 2775 /usr/local/lib/foo || true
+###:   fi
+###: fi
+###
+#### Ensure the menu system is updated
+###: [ ! -x /usr/bin/update-menus ] || /usr/bin/update-menus
+###
+#### Arrange for a daemon to be started at system boot time
+###: update-rc.d foo default >/dev/null
+###
+case "$1" in
+  configure)
+    # Configure this package.  If the package must prompt the user for
+    # information, do it here.
+    
+       mkdir -p /var/lib/citadel/www/static
+    # Activate menu-methods script
+    #: chmod a+x /etc/menu-methods/foo
+
+    # Update ld.so cache
+    #: ldconfig
+
+    # Make our version of a program available
+    #: update-alternatives \
+    #:       --install /usr/bin/program program /usr/bin/alternative 50 \
+    #:       --slave /usr/share/man/man1/program.1.gz program.1.gz \
+    #:               /usr/share/man/man1/alternative.1.gz
+
+    # Tell ucf that the file in /usr/share/foo is the latest
+    # maintainer version, and let it handle how to manage the real
+    # confuguration file in /etc. This is how a static configuration
+    # file can be handled:
+       rm -f /tmp/md5sums
+       touch /tmp/md5sums
+       cd /var/lib/citadel/www/; 
+       for i in `find -type f `; do 
+               md5sum "$i" >>/tmp/md5sums
+       done
+
+       cd /usr/share/doc/citadel-webcit/examples/
+       # if target dirs don't exist, create them.
+       for i in `find -type d` ; do 
+               if test ! -d /var/lib/citadel/www/$i; then
+                       mkdir -p /var/lib/citadel/www/$i 
+               fi
+       done
+
+       gunzip -c md5sums  > /tmp/newsums
+       if diff /tmp/newsums /tmp/md5sums >/dev/null; then
+               echo ''>/dev/null
+       else
+               cd /usr/share/doc/citadel-webcit/examples/
+               for i in `cat /tmp/newsums |sed "s;.* \./;;"`; do 
+                       if test -f $i.gz; then 
+                               j=`basename $i|sed -e "s;.gz;;" `
+                               gunzip -c  "/usr/share/doc/citadel-webcit/examples$REL_PATH/$i" >"/tmp/$j"
+                               i=`dirname $i`/$j
+                       else
+                               j=`basename $i`
+                               cp "/usr/share/doc/citadel-webcit/examples/$i" "/tmp"
+                       fi
+                       if test -f /var/lib/citadel/www/$i; then
+                               origsum=`grep "$i" /tmp/md5sums |sed "s; .*;;"`
+                               newsum=`grep "$i" /tmp/newsums |sed "s; .*;;"`
+                               if test -z "$origsum"; then
+                                       ucf "/tmp/$j" "/var/lib/citadel/www/$i"
+                               else
+                                       if test "$origsum" != "$newsum"; then
+                                               ucf "/tmp/$j" "/var/lib/citadel/www/$i"
+                                       fi
+                               fi
+                       else
+                               ucf "/tmp/$j" "/var/lib/citadel/www/$i"
+                       fi
+                       rm -f "/tmp/$j"
+               done
+       fi
+       rm -f /tmp/newsums /tmp/md5sums
+       if test ! -d /var/lib/citadel/keys; then
+               mkdir -p /var/lib/citadel/keys
+       fi
+       if test ! -d /var/run/citadel/keys; then
+               mkdir -p /var/run/citadel/keys
+       fi
+
+       db_get citadel/WebcitHttpPort && http_port="$RET"
+       db_get citadel/WebcitHttpsPort && https_port="$RET"     
+       set >/tmp/testfoo
+       echo "aplying your settings"
+       if grep -q "webserver" /etc/inittab; then
+               echo "/usr/sbin
+Yes
+$http_port
+$https_port
+No
+127.0.0.1
+504
+"|/usr/lib/citadel-webcit/setup -q
+               echo "/usr/sbin
+Yes
+$http_port
+$https_port
+No
+127.0.0.1
+504
+/usr/lib/citadel-webcit/setup -q" >>/tmp/foo
+       else 
+               echo "/usr/sbin
+" |/usr/lib/citadel-webcit/setup -q
+
+       fi
+
+    #### There are three sub-cases:
+    ###if test "${2+set}" != set; then
+    ###  # We're being installed by an ancient dpkg which doesn't remember
+    ###  # which version was most recently configured, or even whether
+    ###  # there is a most recently configured version.
+    ###  :
+       ###
+    ###elif test -z "$2" -o "$2" = "<unknown>"; then
+    ###  # The package has not ever been configured on this system, or was
+    ###  # purged since it was last configured.
+    ###  :
+       ###
+    ###else
+    ###  # Version $2 is the most recently configured version of this
+    ###  # package.
+    ###  :
+       ###
+    ###fi 
+       ;;
+  abort-upgrade)
+    # Back out of an attempt to upgrade this package FROM THIS VERSION
+    # to version $2.  Undo the effects of "prerm upgrade $2".
+    #:
+
+    ;;
+  abort-remove)
+    ###if test "$2" != in-favour; then
+    ###  echo "$0: undocumented call to \`postinst $*'" 1>&2
+    ###  exit 0
+    ###fi
+    #### Back out of an attempt to remove this package, which was due to
+    #### a conflict with package $3 (version $4).  Undo the effects of
+    #### "prerm remove in-favour $3 $4".
+    ###:
+
+    ;;
+  abort-deconfigure)
+    ###if test "$2" != in-favour -o "$5" != removing; then
+    ###  echo "$0: undocumented call to \`postinst $*'" 1>&2
+    ###  exit 0
+    ###fi
+    #### Back out of an attempt to deconfigure this package, which was
+    #### due to package $6 (version $7) which we depend on being removed
+    #### to make way for package $3 (version $4).  Undo the effects of
+    #### "prerm deconfigure in-favour $3 $4 removing $6 $7".
+    ###:
+
+    ;;
+  *) echo "$0: didn't understand being called with '$1'" 1>&2
+     exit 0;;
+esac
+
+exit 0
diff --git a/webcit/debian/citadel-webcit.postrm b/webcit/debian/citadel-webcit.postrm
new file mode 100644 (file)
index 0000000..63e9d9f
--- /dev/null
@@ -0,0 +1,110 @@
+#! /bin/sh
+# postrm.skeleton
+# Skeleton maintainer script showing all the possible cases.
+# Written by Charles Briscoe-Smith, March-June 1998.  Public Domain.
+
+# Abort if any command returns an error value
+set -e
+. /usr/share/debconf/confmodule
+
+# This script is called twice during the removal of the package; once
+# after the removal of the package's files from the system, and as
+# the final step in the removal of this package, after the package's
+# conffiles have been removed.
+
+# Ensure the menu system is updated
+: [ ! -x /usr/bin/update-menus ] || /usr/bin/update-menus
+
+case "$1" in
+  remove)
+    # This package is being removed, but its configuration has not yet
+    # been purged.
+    # TODO:  remove from inittab.
+
+    # Remove diversion
+    #: dpkg-divert --package foo --remove --rename \
+    #:             --divert /usr/bin/other.real /usr/bin/other
+
+    # ldconfig is NOT needed during removal of a library, only during
+    # installation
+
+    ;;
+  purge)
+    # This package has previously been removed and is now having
+    # its configuration purged from the system.
+       # remove the gunzipped setup executable.
+    # we mimic dpkg as closely as possible, so we remove configuration
+    # files with dpkg backup extensions too:
+    ### Some of the following is from Tore Anderson:
+       if test -d /var/lib/citadel/www/static; then 
+               cd /var/lib/citadel/www/static; for i in *; do 
+                       i=`echo $i|sed "s;.gz;;"`
+                       ucf --purge "/var/lib/citadel/www/static/$i"
+                       rm -f "/var/lib/citadel/www/static/$i"
+               done
+       fi
+       #rmdir /var/lib/citadel/www/static
+       echo "/var/lib/citadel/www/keys not removed. "
+       db_purge 'citadel/WebcitHttpsPort'
+       db_purge 'citadel/WebcitHttpPort'
+       db_purge 'citade/WebcitInstallnote'
+       ### TODO: remove citadel from inittab!
+    ;;
+  disappear)
+    if test "$2" != overwriter; then
+      echo "$0: undocumented call to \`postrm $*'" 1>&2
+      exit 0
+    fi
+    # This package has been completely overwritten by package $3
+    # (version $4).  All our files are already gone from the system.
+    # This is a special case: neither "prerm remove" nor "postrm remove"
+    # have been called, because dpkg didn't know that this package would
+    # disappear until this stage.
+    :
+
+    ;;
+  upgrade)
+    # About to upgrade FROM THIS VERSION to version $2 of this package.
+    # "prerm upgrade" has been called for this version, and "preinst
+    # upgrade" has been called for the new version.  Last chance to
+    # clean up.
+    :
+
+    ;;
+  failed-upgrade)
+    # About to upgrade from version $2 of this package TO THIS VERSION.
+    # "prerm upgrade" has been called for the old version, and "preinst
+    # upgrade" has been called for this version.  This is only used if
+    # the previous version's "postrm upgrade" couldn't handle it and
+    # returned non-zero. (Fix old postrm bugs here.)
+    :
+
+    ;;
+  abort-install)
+    # Back out of an attempt to install this package.  Undo the effects of
+    # "preinst install...".  There are two sub-cases.
+    :
+
+    if test "${2+set}" = set; then
+      # When the install was attempted, version $2's configuration
+      # files were still on the system.  Undo the effects of "preinst
+      # install $2".
+      :
+
+    else
+      # We were being installed from scratch.  Undo the effects of
+      # "preinst install".
+      :
+
+    fi ;;
+  abort-upgrade)
+    # Back out of an attempt to upgrade this package from version $2
+    # TO THIS VERSION.  Undo the effects of "preinst upgrade $2".
+    :
+
+    ;;
+  *) echo "$0: didn't understand being called with \`$1'" 1>&2
+     exit 0;;
+esac
+
+exit 0
diff --git a/webcit/debian/citadel-webcit.postrm.debhelper b/webcit/debian/citadel-webcit.postrm.debhelper
new file mode 100644 (file)
index 0000000..bc035b9
--- /dev/null
@@ -0,0 +1,6 @@
+# Automatically added by dh_installdebconf
+if [ "$1" = purge ] && [ -e /usr/share/debconf/confmodule ]; then
+       . /usr/share/debconf/confmodule
+       db_purge
+fi
+# End automatically added section
diff --git a/webcit/debian/citadel-webcit.substvars b/webcit/debian/citadel-webcit.substvars
new file mode 100644 (file)
index 0000000..d062172
--- /dev/null
@@ -0,0 +1,2 @@
+misc:Depends=debconf (>= 0.5) | debconf-2.0
+shlibs:Depends=libc6 (>= 2.3.5-1), libssl0.9.8 (>= 0.9.8a-1), zlib1g (>= 1:1.2.1)
diff --git a/webcit/debian/citadel-webcit.templates b/webcit/debian/citadel-webcit.templates
new file mode 100644 (file)
index 0000000..1208a94
--- /dev/null
@@ -0,0 +1,24 @@
+Template: citadel/WebcitHttpPort
+Type: string
+Default: 2000
+Description: Webcit HTTP Port
+  Select the Port, which the plain HTTP webcit server should listen on.
+
+
+Template: citadel/WebcitHttpsPort
+Type: string
+Default: 443
+Description: WebCit HTTPS port
+  Select the Port, which the SSL HTTP webcit server should listen on.
+
+
+Template: citadel/WebcitInstallnote
+Type: note
+Description: Citadel/UX
+  Citadel-webcit will be running soon. Log into it with your citadel
+  Administrator user, and do the fine setup. Log in as the user you 
+  specified as the Administrator, and
+  review the Points under the Administration menu. If you have further
+  questions review www.citadel.org, specialy the FAQ and Documentation
+  section.
+
diff --git a/webcit/debian/compat b/webcit/debian/compat
new file mode 100644 (file)
index 0000000..b8626c4
--- /dev/null
@@ -0,0 +1 @@
+4
diff --git a/webcit/debian/control b/webcit/debian/control
new file mode 100644 (file)
index 0000000..9ff8715
--- /dev/null
@@ -0,0 +1,23 @@
+Source: webcit
+Section: unknown
+Priority: optional
+Maintainer: Wilfried Goesgens <willi@jordy.home.net>
+Build-Depends: debhelper (>= 4.0.0), libical-dev
+Standards-Version: 3.6.1
+
+Package: citadel-webcit
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}, citadel-server, debconf
+Description: Webcit, the Webfrontend to the Citadel.
+ WebCit puts a web-based front end on Citadel, allowing 
+ users to access the system from any web browser. And 
+ although you can use any browser, we recommend using 
+ FireFox, simply the best web browser on the market. 
+ It's the best, it's secure, and it's free, so if you 
+ haven't switched yet, why not do so now? 
+
+Package: citadel-webcit-apache
+Architecture: any
+Depends: citadel-webcit, apache2 | httpd, debconf
+Description: Integrates Webcit with your local Apache
+
diff --git a/webcit/debian/copyright b/webcit/debian/copyright
new file mode 100644 (file)
index 0000000..edfb01f
--- /dev/null
@@ -0,0 +1,10 @@
+This package was debianized by Wilfried Goesgens <dothebart@uncensored.citadel.org> on
+Mon, 25 Jul 2005 12:46:10 +0200.
+
+It was downloaded from citadel.org
+
+Copyright Holder: Copyright ©1987-2005 by the Citadel development team, see http://easyinstall.citadel.org/citadel/docs/citadel.html
+
+License: GPL
+
+see http://www.gnu.org/copyleft/gpl.html or /usr/share/common-licenses/GPL
diff --git a/webcit/debian/dirs b/webcit/debian/dirs
new file mode 100644 (file)
index 0000000..ca882bb
--- /dev/null
@@ -0,0 +1,2 @@
+usr/bin
+usr/sbin
diff --git a/webcit/debian/docs b/webcit/debian/docs
new file mode 100644 (file)
index 0000000..6e9fe65
--- /dev/null
@@ -0,0 +1,3 @@
+COPYING.txt
+README.txt
+README.txt
diff --git a/webcit/debian/rules b/webcit/debian/rules
new file mode 100755 (executable)
index 0000000..d3d67d6
--- /dev/null
@@ -0,0 +1,125 @@
+#!/usr/bin/make -f
+# -*- makefile -*-
+# Sample debian/rules that uses debhelper.
+# This file was originally written by Joey Hess and Craig Small.
+# As a special exception, when this file is copied by dh-make into a
+# dh-make output file, you may use that output file without restriction.
+# This special exception was added by Craig Small in version 0.37 of dh-make.
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+
+
+
+CFLAGS = -Wall -g -ggdb
+
+ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
+       CFLAGS += -O0
+else
+       CFLAGS += -O0 -ggdb
+endif
+
+configure: configure-stamp
+configure-stamp:
+       dh_testdir
+       CFLAGS="$(CFLAGS)" ./configure \
+               --host=$(DEB_HOST_GNU_TYPE) \
+               --build=$(DEB_BUILD_GNU_TYPE) \
+               --prefix=/var/lib/citadel/www/ \
+               --with-sysconfdir=/etc/citadel \
+               --with-spooldir=/var/spool/citadel \
+               --with-datadir=/var/lib/citadel \
+               --with-rundir=/var/run/citadel \
+               --with-ical --with-db --with-ldap --with-zlib --with-ssl --with-libiconf --with-newt --with-included-gettext
+
+       touch configure-stamp
+
+
+build: build-stamp
+
+build-stamp: configure-stamp 
+       dh_testdir
+
+       # Add here commands to compile the package.
+       $(MAKE)
+       #docbook-to-man debian/webcit.sgml > webcit.1
+
+       touch build-stamp
+
+clean:
+       dh_testdir
+       dh_testroot
+       rm -f build-stamp configure-stamp
+
+       # Add here commands to clean up after the build process.
+       -$(MAKE) clean
+
+       dh_clean 
+
+install: build
+       dh_testdir
+       dh_testroot
+       dh_clean -k 
+       dh_installdirs
+
+# Add here commands to install the package into debian/webcit.
+       root=$(CURDIR)/debian/webcit/
+       mkdir -p $(CURDIR)/debian/webcit/var/lib/citadel/www/
+       export root=$(CURDIR)/debian/webcit; $(MAKE) install DESTDIR=$(CURDIR)/debian/webcit/
+       mkdir -p $(CURDIR)/debian/citadel-webcit/usr/share/doc/citadel-webcit/examples
+       mkdir -p $(CURDIR)/debian/citadel-webcit/usr/share/doc/citadel-webcit/contrib
+       mkdir -p $(CURDIR)/debian/citadel-webcit/usr/sbin
+       mkdir -p $(CURDIR)/debian/citadel-webcit/usr/lib/citadel-webcit/ 
+       mv $(CURDIR)/debian/webcit/var/lib/citadel/www/static \
+               $(CURDIR)/debian/citadel-webcit/usr/share/doc/citadel-webcit/examples/
+       mv $(CURDIR)/debian/webcit/var/lib/citadel/www/tiny_mce \
+               $(CURDIR)/debian/citadel-webcit/usr/share/doc/citadel-webcit/examples/
+# locale -> /usr/share/locale
+       mv $(CURDIR)/debian/webcit/var/lib/citadel/www/locale \
+               $(CURDIR)/debian/citadel-webcit/usr/share/locale
+       cd $(CURDIR)/debian/citadel-webcit/usr/share/doc/citadel-webcit/examples/; \
+                               md5sum `find -type f |grep -v md5sums `>md5sums; 
+       mv $(CURDIR)/debian/webcit/var/lib/citadel/www/setup \
+               $(CURDIR)/debian/citadel-webcit/usr/lib/citadel-webcit/
+       mv $(CURDIR)/debian/webcit/var/lib/citadel/www/webserver \
+               $(CURDIR)/debian/citadel-webcit/usr/sbin/
+
+
+# Build architecture-independent files here.
+binary-indep: build install
+# We have nothing to do by default.
+
+# Build architecture-dependent files here.
+binary-arch: build install
+       dh_testdir
+       dh_testroot
+       dh_installchangelogs ChangeLog
+       dh_installdocs
+       dh_installexamples
+#      dh_install
+#      dh_installmenu
+       dh_installdebconf       
+#      dh_installlogrotate
+#      dh_installemacsen
+#      dh_installpam
+#      dh_installmime
+#      dh_installinit
+#      dh_installcron
+#      dh_installinfo
+       dh_installman
+       dh_link
+       dh_strip
+       dh_compress
+       dh_fixperms
+#      dh_perl
+#      dh_python
+#      dh_makeshlibs
+       dh_installdeb
+       dh_shlibdeps
+       dh_gencontrol
+       dh_md5sums
+       dh_builddeb
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install configure
diff --git a/webcit/debian/webcit.substvars b/webcit/debian/webcit.substvars
new file mode 100644 (file)
index 0000000..3c1d183
--- /dev/null
@@ -0,0 +1 @@
+shlibs:Depends=libc6 (>= 2.3.2.ds1-21), libssl0.9.7, zlib1g (>= 1:1.2.1)
diff --git a/webcit/doxygen_groups.c b/webcit/doxygen_groups.c
new file mode 100644 (file)
index 0000000..3fed3e6
--- /dev/null
@@ -0,0 +1,109 @@
+/*
+ * ok, hacky, but gets us nice groups. so we define sub parts to join from other 
+ * files here. NO CODE IN HERE! This is comment shouldn't appear in doxygen.
+ * we have: 
+ * CitadelConfig; WebcitDisplayItems; WebcitHttpServer; WebcitHttpServerGDav;
+ * ClientPower; Calendaring; MenuInfrastructure; CitadelCommunitacion;
+ * VCards
+ * WebcitHttpServerRSS; tools;
+ */
+
+
+/**
+ * \defgroup CitadelConfig Configuration Mechanisms
+ * \brief Functions about configuring citadel / webcit
+ */
+
+/*@{*/
+/*@}*/
+
+/**
+ * \defgroup tools  Utility Functions
+ * \brief Functions that aren't related to webcit topics
+ */
+
+/*@{*/
+/*@}*/
+
+
+/**
+ * \defgroup WebcitDisplayItems Display some mime types through webcit
+ * \brief Functions that format mime types into HTML to the user
+ */
+
+/*@{*/
+/*@}*/
+
+/**
+ * \defgroup WebcitHttpServer the Webserver part
+ * \brief Functions that run the HTTP-Deamon
+ */
+
+/*@{*/
+/*@}*/
+
+/**
+ * \defgroup WebcitHttpServerGDav Groupdav Mechanisms
+ * \ingroup WebcitHttpServer
+ * \brief Functions that handle groupdav requests
+ */
+/*@{*/
+/*@}*/
+
+
+/**
+ * \defgroup WebcitHttpServerRSS RSS Mechanisms
+ * \ingroup WebcitHttpServer
+ * \brief Functions that handle RSS requests
+ */
+
+/*@{*/
+/*@}*/
+
+/**
+ * \defgroup ClientPower Client powered Functionality
+ * \brief Functions that spawn things on the webbrowser
+ */
+
+/*@{*/
+/*@}*/
+
+/**
+ * \defgroup Calendaring Calendaring background
+ * \brief Functions that make the Business-logic of the calendaring items
+ * \ingroup WebcitDisplayItems
+ */
+
+/*@{*/
+/*@}*/
+
+/**
+ * \defgroup VCards showing / editing VCards
+ * \brief Functions that make the Business-logic of the vcard stuff
+ * \ingroup WebcitDisplayItems
+ */
+
+/*@{*/
+/*@}*/
+
+/**
+ * \defgroup MenuInfrastructure Things that guide you through the webcit parts
+ * \brief Functions that display menues, trees etc. to connect the parts of the 
+ *        ui to a whole thing
+ * \ingroup WebcitDisplayItems
+ */
+
+/*@{*/
+/*@}*/
+
+/**
+ * \defgroup CitadelCommunitacion Talk to the citadel server
+ * \brief Functions that talk to the citadel server and process reviewed entities
+ * \ingroup WebcitDisplayItems
+ */
+
+/*@{*/
+/*@}*/
+
+
+
diff --git a/webcit/event.c b/webcit/event.c
new file mode 100644 (file)
index 0000000..94fac68
--- /dev/null
@@ -0,0 +1,721 @@
+/*
+ * $Id$
+ */
+/**
+ * \defgroup EditCal Editing calendar events.
+ * \ingroup Calendaring
+ */
+/*@{*/
+#include "webcit.h"
+#include "webserver.h"
+
+
+#ifdef WEBCIT_WITH_CALENDAR_SERVICE
+
+/**
+ * \brief Display an event by itself (for editing)
+ * \param supplied_vevent the event to edit
+ * \param msgnum reference on the citserver
+ */
+void display_edit_individual_event(icalcomponent *supplied_vevent, long msgnum) {
+       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;
+       int sequence = 0;
+
+       now = time(NULL);
+       strcpy(organizer_string, "");
+       strcpy(attendee_string, "");
+
+       if (supplied_vevent != NULL) {
+               vevent = supplied_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
+                       );
+                       return;
+               }
+       }
+       else {
+               vevent = icalcomponent_new(ICAL_VEVENT_COMPONENT);
+               created_new_vevent = 1;
+       }
+
+       /** Learn the sequence */
+       p = icalcomponent_get_first_property(vevent, ICAL_SEQUENCE_PROPERTY);
+       if (p != NULL) {
+               sequence = icalproperty_get_sequence(p);
+       }
+
+       /** Begin output */
+       output_headers(1, 1, 2, 0, 0, 0);
+       wprintf("<div id=\"banner\">\n"
+               "<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>"
+               "<SPAN CLASS=\"titlebar\">");
+       wprintf(_("Add or edit an event"));
+       wprintf("</SPAN>"
+               "</TD></TR></TABLE>\n"
+               "</div>\n<div id=\"content\">\n"
+       );
+
+       wprintf("<script type=\"text/javascript\">"
+               "function grey_all_day() { "
+                       "if (document.EventForm.alldayevent.checked) {"
+                               "document.EventForm.dtstart_hour.value='0';"
+                               "document.EventForm.dtstart_hour.disabled = true;"
+                               "document.EventForm.dtstart_minute.value='0';"
+                               "document.EventForm.dtstart_minute.disabled = true;"
+                               "document.EventForm.dtend_hour.value='0';"
+                               "document.EventForm.dtend_hour.disabled = true;"
+                               "document.EventForm.dtend_minute.value='0';"
+                               "document.EventForm.dtend_minute.disabled = true;"
+                               "document.EventForm.dtend_month.disabled = true;"
+                               "document.EventForm.dtend_day.disabled = true;"
+                               "document.EventForm.dtend_year.disabled = true;"
+                       "}"
+                       "else {"
+                               "document.EventForm.dtstart_hour.disabled = false;"
+                               "document.EventForm.dtstart_minute.disabled = false;"
+                               "document.EventForm.dtend_hour.disabled = false;"
+                               "document.EventForm.dtend_minute.disabled = false;"
+                               "document.EventForm.dtend_month.disabled = false;"
+                               "document.EventForm.dtend_day.disabled = false;"
+                               "document.EventForm.dtend_year.disabled = false;"
+                       "}"
+               "}"
+               "</script>\n"
+       );
+
+
+       wprintf("<div class=\"fix_scrollbar_bug\">"
+               "<table border=0 width=100%% bgcolor=\"#ffffff\"><tr><td>\n");
+
+       /************************************************************
+        * Uncomment this to see the UID in calendar events for debugging
+       wprintf("UID == ");
+       p = icalcomponent_get_first_property(vevent, ICAL_UID_PROPERTY);
+       if (p != NULL) {
+               escputs((char *)icalproperty_get_comment(p));
+       }
+       wprintf("<br />\n");
+       wprintf("SEQUENCE == %d<br />\n", sequence);
+       *************************************************************/
+
+       wprintf("<FORM NAME=\"EventForm\" METHOD=\"POST\" action=\"save_event\">\n");
+
+       wprintf("<INPUT TYPE=\"hidden\" NAME=\"msgnum\" VALUE=\"%ld\">\n",
+               msgnum);
+       wprintf("<INPUT TYPE=\"hidden\" NAME=\"calview\" VALUE=\"%s\">\n",
+               bstr("calview"));
+       wprintf("<INPUT TYPE=\"hidden\" NAME=\"year\" VALUE=\"%s\">\n",
+               bstr("year"));
+       wprintf("<INPUT TYPE=\"hidden\" NAME=\"month\" VALUE=\"%s\">\n",
+               bstr("month"));
+       wprintf("<INPUT TYPE=\"hidden\" NAME=\"day\" VALUE=\"%s\">\n",
+               bstr("day"));
+
+       /** Put it in a borderless table so it lines up nicely */
+       wprintf("<TABLE border=0 width=100%%>\n");
+
+       wprintf("<TR><TD><B>");
+       wprintf(_("Summary"));
+       wprintf("</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));
+       }
+       wprintf("\"></TD></TR>\n");
+
+       wprintf("<TR><TD><B>");
+       wprintf(_("Location"));
+       wprintf("</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));
+       }
+       wprintf("\"></TD></TR>\n");
+
+       wprintf("<TR><TD><B>");
+       wprintf(_("Start"));
+       wprintf("</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 (strlen(bstr("year")) > 0) {
+                       tm_now.tm_year = atoi(bstr("year")) - 1900;
+                       tm_now.tm_mon = atoi(bstr("month")) - 1;
+                       tm_now.tm_mday = atoi(bstr("day"));
+               }
+               if (strlen(bstr("hour")) > 0) {
+                       tm_now.tm_hour = atoi(bstr("hour"));
+                       tm_now.tm_min = atoi(bstr("minute"));
+                       tm_now.tm_sec = 0;
+               }
+               else {
+                       tm_now.tm_hour = 9;
+                       tm_now.tm_min = 0;
+                       tm_now.tm_sec = 0;
+               }
+
+               t_start = icaltime_from_timet_with_zone(
+                       mktime(&tm_now),
+                       ((!strcasecmp(bstr("alldayevent"), "yes")) ? 1 : 0),
+                       icaltimezone_get_utc_timezone()
+               );
+               t_start.is_utc = 1;
+
+       }
+       display_icaltimetype_as_webform(&t_start, "dtstart");
+
+       wprintf("<INPUT TYPE=\"checkbox\" NAME=\"alldayevent\" "
+               "VALUE=\"yes\" onClick=\"grey_all_day();\""
+               " %s >%s",
+               (t_start.is_date ? "CHECKED" : "" ),
+               _("All day event")
+       );
+
+       wprintf("</TD></TR>\n");
+
+       /**
+        * 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).
+        * Otherwise extract or create it.
+        */
+       wprintf("<TR><TD><B>");
+       wprintf(_("End"));
+       wprintf("</B></TD><TD>\n");
+       if (t_start.is_date) {
+               t_end = t_start;
+       }
+       else {
+               p = icalcomponent_get_first_property(vevent,
+                                                       ICAL_DTEND_PROPERTY);
+               if (p != NULL) {
+                       t_end = icalproperty_get_dtend(p);
+               }
+               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); */
+               }
+       }
+       display_icaltimetype_as_webform(&t_end, "dtend");
+       wprintf("</TD></TR>\n");
+
+       wprintf("<TR><TD><B>");
+       wprintf(_("Notes"));
+       wprintf("</B></TD><TD>\n"
+               "<TEXTAREA NAME=\"description\" wrap=soft "
+               "ROWS=5 COLS=80 WIDTH=80>\n"
+       );
+       p = icalcomponent_get_first_property(vevent, ICAL_DESCRIPTION_PROPERTY);
+       if (p != NULL) {
+               escputs((char *)icalproperty_get_comment(p));
+       }
+       wprintf("</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", 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]);
+                       striplt(organizer_string);
+                       serv_printf("ISME %s", organizer_string);
+                       serv_getln(buf, sizeof buf);
+                       if (buf[0] == '2') {
+                               organizer_is_me = 1;
+                       }
+               }
+       }
+
+       wprintf("<TR><TD><B>");
+       wprintf(_("Organizer"));
+       wprintf("</B></TD><TD>");
+       escputs(organizer_string);
+       if (organizer_is_me) {
+               wprintf(" <FONT SIZE=-1><I>");
+               wprintf(_("(you are the organizer)"));
+               wprintf("</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.
+        */
+       wprintf("<INPUT TYPE=\"hidden\" NAME=\"organizer\" VALUE=\"");
+       escputs(organizer_string);
+       wprintf("\">");
+
+       wprintf("</TD></TR>\n");
+
+       /** Transparency */
+       wprintf("<TR><TD><B>");
+       wprintf(_("Show time as:"));
+       wprintf("</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;
+       }
+
+       wprintf("<INPUT TYPE=\"radio\" NAME=\"transp\" VALUE=\"transparent\"");
+       if (v != NULL) if (icalvalue_get_transp(v) == ICAL_TRANSP_TRANSPARENT)
+               wprintf(" CHECKED");
+       wprintf(">");
+       wprintf(_("Free"));
+       wprintf("&nbsp;&nbsp;");
+
+       wprintf("<INPUT TYPE=\"radio\" NAME=\"transp\" VALUE=\"opaque\"");
+       if (v != NULL) if (icalvalue_get_transp(v) == ICAL_TRANSP_OPAQUE)
+               wprintf(" CHECKED");
+       wprintf(">");
+       wprintf(_("Busy"));
+
+       wprintf("</TD></TR>\n");
+
+       /** Attendees */
+       wprintf("<TR><TD><B>");
+       wprintf(_("Attendees"));
+       wprintf("</B><br />"
+               "<FONT SIZE=-2>");
+       wprintf(_("(One per line)"));
+       wprintf("</FONT></TD><TD>"
+               "<TEXTAREA %s NAME=\"attendees\" wrap=soft "
+               "ROWS=3 COLS=80 WIDTH=80>\n",
+               (organizer_is_me ? "" : "DISABLED ")
+       );
+       i = 0;
+       for (attendee = icalcomponent_get_first_property(vevent, ICAL_ATTENDEE_PROPERTY);
+           attendee != NULL;
+           attendee = icalcomponent_get_next_property(vevent, ICAL_ATTENDEE_PROPERTY)) {
+               strcpy(attendee_string, icalproperty_get_attendee(attendee));
+               if (!strncasecmp(attendee_string, "MAILTO:", 7)) {
+
+                       /** screen name or email address */
+                       strcpy(attendee_string, &attendee_string[7]);
+                       striplt(attendee_string);
+                       if (i++) wprintf("\n");
+                       escputs(attendee_string);
+                       wprintf(" ");
+
+                       /** participant status */
+                       partstat_as_string(buf, attendee);
+                       escputs(buf);
+               }
+       }
+       wprintf("</TEXTAREA></TD></TR>\n");
+
+       /** Done with properties. */
+       wprintf("</TABLE>\n<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=\"check_button\" "
+                               "VALUE=\"%s\">\n"
+               "&nbsp;&nbsp;"
+               "<INPUT TYPE=\"submit\" NAME=\"cancel_button\" VALUE=\"%s\">\n"
+               "</CENTER>\n",
+               _("Save"),
+               _("Delete"),
+               _("Check attendee availability"),
+               _("Cancel")
+       );
+
+       wprintf("</FORM>\n");
+       
+       wprintf("</td></tr></table></div>\n");
+       wprintf("<script type=\"text/javascript\">"
+               "grey_all_day();"
+               "</script>\n"
+       );
+       wDumpContent(1);
+
+       if (created_new_vevent) {
+               icalcomponent_free(vevent);
+       }
+}
+
+/**
+ * \brief Save an edited event
+ * \param supplied_vevent the event to save
+ * \param msgnum the index on the citserver
+ */
+void save_individual_event(icalcomponent *supplied_vevent, long msgnum) {
+       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;
+       int foundit;
+       char form_attendees[SIZ];
+       char organizer_string[SIZ];
+       int sequence = 0;
+       enum icalproperty_transp formtransp = ICAL_TRANSP_NONE;
+
+       if (supplied_vevent != NULL) {
+               vevent = supplied_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
+                       );
+                       return;
+               }
+       }
+       else {
+               vevent = icalcomponent_new(ICAL_VEVENT_COMPONENT);
+               created_new_vevent = 1;
+       }
+
+       if ( (strlen(bstr("save_button")) > 0)
+          || (strlen(bstr("check_button")) > 0) ) {
+
+               /** 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);
+               }
+               icalcomponent_add_property(vevent,
+                       icalproperty_new_summary(bstr("summary")));
+
+               while (prop = icalcomponent_get_first_property(vevent,
+                     ICAL_LOCATION_PROPERTY), prop != NULL) {
+                       icalcomponent_remove_property(vevent, prop);
+                       icalproperty_free(prop);
+               }
+               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);
+               }
+               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 (!strcmp(bstr("alldayevent"), "yes")) {
+                       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");
+               }
+
+               /**
+                * The following odd-looking snippet of code looks like it
+                * takes some unnecessary steps.  It is done this way because
+                * libical incorrectly turns an "all day event" into a normal
+                * event starting at midnight (i.e. it serializes as date/time
+                * instead of just date) unless icalvalue_new_date() is used.
+                * So we force it, if this is an all day event.
+                */
+               prop = icalproperty_new_dtstart(event_start);
+               if (all_day_event) {
+                       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 == 0) {
+                       icaltime_from_webform(&t, "dtend");     
+                       icalcomponent_add_property(vevent,
+                               icalproperty_new_dtend(icaltime_normalize(t)
+                               )
+                       );
+               }
+
+               /** See if transparency is indicated */
+               if (strlen(bstr("transp")) > 0) {
+                       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);
+                       }
+
+                       lprintf(9, "adding new property...\n");
+                       icalcomponent_add_property(vevent, icalproperty_new_transp(formtransp));
+                       lprintf(9, "...added it.\n");
+               }
+
+               /** Give this event a UID if it doesn't have one. */
+               lprintf(9, "Give this event a UID if it doesn't have one.\n");
+               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 */
+               lprintf(9, "Increment the sequence ID\n");
+               while (prop = icalcomponent_get_first_property(vevent,
+                     ICAL_SEQUENCE_PROPERTY), (prop != NULL) ) {
+                       i = icalproperty_get_sequence(prop);
+                       lprintf(9, "Sequence was %d\n", i);
+                       if (i > sequence) sequence = i;
+                       icalcomponent_remove_property(vevent, prop);
+                       icalproperty_free(prop);
+               }
+               ++sequence;
+               lprintf(9, "New sequence is %d.  Adding...\n", 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
+                */
+               lprintf(9, "Setting the organizer...\n");
+               strcpy(buf, bstr("organizer"));
+               if ( (icalcomponent_get_first_property(vevent,
+                  ICAL_ORGANIZER_PROPERTY) == NULL) 
+                  && (strlen(buf) > 0) ) {
+
+                       /** 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
+                */
+               lprintf(9, "Add any new attendees\n");
+
+               /* First, strip out the parenthesized partstats.  */
+               strcpy(form_attendees, bstr("attendees"));
+               stripout(form_attendees, '(', ')');
+
+               /** Now iterate! */
+               for (i=0; i<num_tokens(form_attendees, '\n'); ++i) {
+                       extract_token(buf, form_attendees, i, '\n', sizeof buf);
+                       striplt(buf);
+                       if (strlen(buf) > 0) {
+                               lprintf(9, "Attendee: <%s>\n", 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)) {
+                                       if (!strcasecmp(attendee_string,
+                                          icalproperty_get_attendee(attendee)))
+                                               ++foundit;
+                               }
+
+
+                               if (foundit == 0) {
+                                       icalcomponent_add_property(vevent,
+                                               icalproperty_new_attendee(attendee_string)
+                                       );
+                               }
+                       }
+               }
+
+               /**
+                * Remove any attendees *not* listed in the web form
+                */
+STARTOVER:     lprintf(9, "Remove unlisted attendees\n");
+               for (attendee = icalcomponent_get_first_property(vevent, ICAL_ATTENDEE_PROPERTY); attendee != NULL; attendee = icalcomponent_get_next_property(vevent, ICAL_ATTENDEE_PROPERTY)) {
+                       strcpy(attendee_string, icalproperty_get_attendee(attendee));
+                       if (!strncasecmp(attendee_string, "MAILTO:", 7)) {
+                               strcpy(attendee_string, &attendee_string[7]);
+                               striplt(attendee_string);
+                               foundit = 0;
+                               for (i=0; i<num_tokens(form_attendees, '\n'); ++i) {
+                                       extract_token(buf, form_attendees, i, '\n', sizeof buf);
+                                       striplt(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.
+                */
+               lprintf(9, "Encapsulating into full VCALENDAR component\n");
+               encaps = ical_encapsulate_subcomponent(icalcomponent_new_clone(vevent));
+
+               /** If the user clicked 'Save' then save it to the server. */
+               lprintf(9, "Serializing it for saving\n");
+               if ( (encaps != NULL) && (strlen(bstr("save_button")) > 0) ) {
+                       serv_puts("ENT0 1|||4|||1|");
+                       serv_getln(buf, sizeof buf);
+                       if (buf[0] == '8') {
+                               serv_puts("Content-type: text/calendar");
+                               serv_puts("");
+                               serv_puts(icalcomponent_as_ical_string(encaps));
+                               serv_puts("000");
+                       }
+                       while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+                               lprintf(9, "ENT0 REPLY: %s\n", buf);
+                       }
+                       icalcomponent_free(encaps);
+               }
+
+               /** Or, check attendee availability if the user asked for that. */
+               if ( (encaps != NULL) && (strlen(bstr("check_button")) > 0) ) {
+
+                       /** 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);
+
+                       icalcomponent_free(encaps);
+               }
+
+       }
+
+       /**
+        * If the user clicked 'Delete' then delete it.
+        */
+       lprintf(9, "Checking to see if we have to delete an old event\n");
+       if ( (strlen(bstr("delete_button")) > 0) && (msgnum > 0L) ) {
+               serv_printf("DELE %ld", atol(bstr("msgnum")));
+               serv_getln(buf, sizeof buf);
+       }
+
+       if (created_new_vevent) {
+               icalcomponent_free(vevent);
+       }
+
+       /** If this was a save or deelete, go back to the calendar view. */
+       if (strlen(bstr("check_button")) == 0) {
+               readloop("readfwd");
+       }
+}
+
+
+#endif /* WEBCIT_WITH_CALENDAR_SERVICE */
+
+/*@}*/
diff --git a/webcit/floors.c b/webcit/floors.c
new file mode 100644 (file)
index 0000000..d919285
--- /dev/null
@@ -0,0 +1,198 @@
+/*
+ * $Id$
+ */
+/**
+ * \defgroup AdminFloor Administrative screens for floor maintenance
+ * \ingroup CitadelConfig
+ */
+/*@{*/
+
+#include "webcit.h"
+#include "webserver.h"
+
+
+
+
+/**
+ * \brief Display floor config
+ * Display floor configuration.  If prepend_html is not NULL, its contents
+ * will be displayed at the top of the screen.
+ * \param prepend_html pagetitle to prepend
+ */
+void display_floorconfig(char *prepend_html)
+{
+       char buf[SIZ];
+
+       int floornum;
+       char floorname[SIZ];
+       int refcount;
+
+        output_headers(1, 1, 2, 0, 0, 0);
+        wprintf("<div id=\"banner\">\n"
+                "<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>"
+                "<SPAN CLASS=\"titlebar\">");
+       wprintf(_("Add/change/delete floors"));
+       wprintf("</SPAN>"
+                "</TD></TR></TABLE>\n"
+                "</div>\n<div id=\"content\">\n"
+        );
+                                                                                                                             
+       if (prepend_html != NULL) {
+               wprintf("<br /><b><i>");
+               client_write(prepend_html, strlen(prepend_html));
+               wprintf("</i></b><br /><br />\n");
+       }
+
+       serv_printf("LFLR");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '1') {
+               wprintf("<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#770000\"><TR><TD>");
+               wprintf("<SPAN CLASS=\"titlebar\">");
+               wprintf(_("Error"));
+               wprintf("</SPAN>\n");
+               wprintf("</TD></TR></TABLE>\n");
+               wprintf("%s<br />\n", &buf[4]);
+               wDumpContent(1);
+               return;
+       }
+
+       wprintf("<div class=\"fix_scrollbar_bug\">"
+               "<TABLE BORDER=1 WIDTH=100%% bgcolor=\"#ffffff\">\n"
+               "<TR><TH>");
+       wprintf(_("Floor number"));
+       wprintf("</TH><TH>");
+       wprintf(_("Floor name"));
+       wprintf("</TH><TH>");
+       wprintf(_("Number of rooms"));
+       wprintf("</TH><TH>");
+       wprintf(_("Floor CSS"));
+       wprintf("</TH></TR>\n");
+
+       while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+               floornum = extract_int(buf, 0);
+               extract_token(floorname, buf, 1, '|', sizeof floorname);
+               refcount = extract_int(buf, 2);
+
+               wprintf("<TR><TD><TABLE border=0><TR><TD>%d", floornum);
+               if (refcount == 0) {
+                       wprintf("</TD><TD>"
+                               "<a href=\"delete_floor?floornum=%d\">"
+                               "<FONT SIZE=-1>", floornum);
+                       wprintf(_("(delete floor)"));
+                       wprintf("</A></FONT><br />");
+               }
+               wprintf("<FONT SIZE=-1>"
+                       "<a href=\"display_editfloorpic&"
+                       "which_floor=%d\">", floornum);
+               wprintf(_("(edit graphic)"));
+               wprintf("</A></TD></TR></TABLE>");
+               wprintf("</TD>");
+
+               wprintf("<TD>"
+                       "<FORM METHOD=\"POST\" action=\"rename_floor\">"
+                       "<INPUT TYPE=\"hidden\" NAME=\"floornum\" "
+                       "VALUE=\"%d\">"
+                       "<INPUT TYPE=\"text\" NAME=\"floorname\" "
+                       "VALUE=\"%s\" MAXLENGTH=\"250\">\n",
+                       floornum, floorname);
+               wprintf("<INPUT TYPE=\"SUBMIT\" NAME=\"sc\" "
+                       "VALUE=\"%s\">"
+                       "</FORM></TD>", _("Change name"));
+
+               wprintf("<TD>%d</TD>\n", refcount);
+
+               wprintf("<TD>"
+                       "<FORM METHOD=\"POST\" action=\"set_floor_css\">"
+                       "<INPUT TYPE=\"hidden\" NAME=\"floornum\" "
+                       "VALUE=\"%d\">"
+                       "<INPUT TYPE=\"text\" NAME=\"floorcss\" "
+                       "VALUE=\"%s\" MAXLENGTH=\"250\">\n",
+                       floornum, floorname);
+               wprintf("<INPUT TYPE=\"SUBMIT\" NAME=\"sc\" "
+                       "VALUE=\"%s\">"
+                       "</FORM></TD>", _("Change CSS"));
+
+               wprintf("</TR>\n");
+       }
+
+       wprintf("<TR><TD>&nbsp;</TD>"
+               "<TD><FORM METHOD=\"POST\" action=\"create_floor\">"
+               "<INPUT TYPE=\"text\" NAME=\"floorname\" "
+               "MAXLENGTH=\"250\">\n"
+               "<INPUT TYPE=\"SUBMIT\" NAME=\"sc\" "
+               "VALUE=\"%s\">"
+               "</FORM></TD>"
+               "<TD>&nbsp;</TD></TR>\n", _("Create new floor"));
+
+       wprintf("</table></div>\n");
+       wDumpContent(1);
+}
+
+
+/**
+ * \brief delete the actual floor
+ */
+void delete_floor(void) {
+       int floornum;
+       char buf[SIZ];
+       char message[SIZ];
+
+       floornum = atoi(bstr("floornum"));
+
+       serv_printf("KFLR %d|1", floornum);
+       serv_getln(buf, sizeof buf);
+
+       if (buf[0] == '2') {
+               sprintf(message, _("Floor has been deleted."));
+       }
+       else {
+               sprintf(message, "%s", &buf[4]);
+       }
+
+       display_floorconfig(message);
+}
+
+/**
+ * \brief tart creating a new floor
+ */
+void create_floor(void) {
+       char buf[SIZ];
+       char message[SIZ];
+       char floorname[SIZ];
+
+       strcpy(floorname, bstr("floorname"));
+
+       serv_printf("CFLR %s|1", floorname);
+       serv_getln(buf, sizeof buf);
+
+       if (buf[0] == '2') {
+               sprintf(message, _("New floor has been created."));
+       } else {
+               sprintf(message, "%s", &buf[4]);
+       }
+
+       display_floorconfig(message);
+}
+
+/**
+ * \brief rename this floor
+ */
+void rename_floor(void) {
+       int floornum;
+       char buf[SIZ];
+       char message[SIZ];
+       char floorname[SIZ];
+
+       floornum = atoi(bstr("floornum"));
+       strcpy(floorname, bstr("floorname"));
+
+       serv_printf("EFLR %d|%s", floornum, floorname);
+       serv_getln(buf, sizeof buf);
+
+       sprintf(message, "%s", &buf[4]);
+
+       display_floorconfig(message);
+}
+
+
+/*@}*/
diff --git a/webcit/fmt_date.c b/webcit/fmt_date.c
new file mode 100644 (file)
index 0000000..2c7c9f6
--- /dev/null
@@ -0,0 +1,225 @@
+/*
+ * $Id$
+ */
+/**
+ * \defgroup FormatDates Miscellaneous routines formating dates
+ * \ingroup Calendaring
+ */
+/*@{*/
+#include "webcit.h"
+#include "webserver.h"
+
+typedef unsigned char byte; /**< a byte. */
+
+#define FALSE 0 /**< no. */
+#define TRUE 1 /**< yes. */
+
+/**
+ * \brief      Wrapper around strftime() or strftime_l()
+ *             depending upon how our build is configured.
+ *
+ * \param      s       String target buffer
+ * \param      max     Maximum size of string target buffer
+ * \param      format  strftime() format
+ * \param      tm      Input date/time
+ */
+size_t wc_strftime(char *s, size_t max, const char *format, const struct tm *tm)
+{
+#ifdef ENABLE_NLS
+       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
+}
+
+
+/**
+ * \brief Format a date/time stamp for output 
+ * \param buf the output buffer
+ * \param thetime time to convert to string 
+ * \param brief do we want compact view?????
+ */
+void fmt_date(char *buf, time_t thetime, int brief)
+{
+       struct tm tm;
+       struct tm today_tm;
+       time_t today_timet;
+       int hour;
+       char calhourformat[16];
+
+       get_preference("calhourformat", calhourformat, sizeof calhourformat);
+
+       today_timet = time(NULL);
+       localtime_r(&today_timet, &today_tm);
+
+       localtime_r(&thetime, &tm);
+       hour = tm.tm_hour;
+       if (hour == 0)
+               hour = 12;
+       else if (hour > 12)
+               hour = hour - 12;
+
+       buf[0] = 0;
+
+       if (brief) {
+
+               /** If date == today, show only the time */
+               if ((tm.tm_year == today_tm.tm_year)
+                 &&(tm.tm_mon == today_tm.tm_mon)
+                 &&(tm.tm_mday == today_tm.tm_mday)) {
+                       wc_strftime(buf, 32, "%l:%M%p", &tm);
+               }
+               /** Otherwise, for messages up to 6 months old, show the
+                * month and day, and the time */
+               else if (today_timet - thetime < 15552000) {
+                       wc_strftime(buf, 32, "%b %d %l:%M%p", &tm);
+               }
+               /** older than 6 months, show only the date */
+               else {
+                       wc_strftime(buf, 32, "%b %d %Y", &tm);
+               }
+       }
+       else {
+               wc_strftime(buf, 32, "%c", &tm);
+       }
+}
+
+
+/**
+ * \brief Format TIME ONLY for output 
+ * \param buf the output buffer
+ * \param thetime time to format into buf
+ */
+void fmt_time(char *buf, time_t thetime)
+{
+       struct tm *tm;
+       int hour;
+       char calhourformat[16];
+
+       get_preference("calhourformat", calhourformat, sizeof calhourformat);
+
+       buf[0] = 0;
+       tm = localtime(&thetime);
+       hour = tm->tm_hour;
+       if (hour == 0)
+               hour = 12;
+       else if (hour > 12)
+               hour = hour - 12;
+
+       if (!strcasecmp(calhourformat, "24")) {
+               sprintf(buf, "%2d:%02d",
+                       tm->tm_hour, tm->tm_min
+               );
+       }
+       else {
+               sprintf(buf, "%d:%02d%s",
+                       hour, tm->tm_min, ((tm->tm_hour > 12) ? "pm" : "am")
+               );
+       }
+}
+
+
+
+
+/**
+ * \brief Break down the timestamp used in HTTP headers
+ * Should read rfc1123 and rfc850 dates OK
+ * \todo FIXME won't read asctime
+ * Doesn't understand timezone, but we only should be using GMT/UTC anyway
+ * \param buf time to parse
+ * \return the time found in buf
+ */
+time_t httpdate_to_timestamp(char *buf)
+{
+       time_t t = 0;
+       struct tm tt;
+       char *c;
+       char tz[256];
+
+       /** Skip day of week, to number */
+       for (c = buf; *c != ' '; c++)
+               ;
+       c++;
+
+       /* 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 */
+       /** First, change to UTC */
+       if (getenv("TZ"))
+               sprintf(tz, "TZ=%s", getenv("TZ"));
+       else
+               strcpy(tz, "TZ=");
+       putenv("TZ=UTC");
+       tzset();
+       t = mktime(&tt);
+       putenv(tz);
+       tzset();
+       return t;
+}
+
+
+
+
+/*@}*/
diff --git a/webcit/gettext.c b/webcit/gettext.c
new file mode 100644 (file)
index 0000000..b7f0a78
--- /dev/null
@@ -0,0 +1,300 @@
+/*
+ * $Id
+ */
+/**
+ * \defgroup LocaleHeaderParser Parse the browser http locale headers and set the NLS stuff.
+ * \ingroup WebcitHttpServer 
+ */
+/*@{*/
+#include "webcit.h"
+#include "webserver.h"
+
+#ifdef ENABLE_NLS
+
+#define NUM_LANGS 6 /**< how many different locales do we know? */
+#define SEARCH_LANG 20 /**< how many langs should we parse? */
+
+/** actual supported locales */
+char *AvailLang[NUM_LANGS] = {
+       "C",
+       "en_US",
+       "de_DE",
+       "it_IT",
+       "es_ES",
+       "en_GB"
+};
+
+locale_t wc_locales[NUM_LANGS]; /**< here we keep the parsed stuff */
+
+/** 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;
+
+/* \brief parse browser locale header 
+ * seems as most browsers just do a one after coma 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 
+ * \param LocaleString the string from the browser http headers
+ */
+
+void httplang_to_locale(char *LocaleString)
+{
+       LangStruct wanted_locales[SEARCH_LANG];
+       LangStruct *ls;
+
+       int i = 0;
+       int j = 0;
+       size_t len = strlen(LocaleString);
+       long prio;
+       int av;
+       int nBest;
+       int nParts;
+       char *search = (char *) malloc(len);
+       
+       memcpy(search, LocaleString, len);
+       search[len] = '\0';
+       nParts=num_tokens(search,',');
+       for (i=0; ((i<nParts)&&(i<SEARCH_LANG)); i++)
+        {
+                       char buf[16];
+                       char sbuf[16];
+                       char lbuf[16];
+                       int blen;
+                       
+                       ls=&wanted_locales[i];
+
+                       extract_token(&buf[0],search, i,',',16);
+                       /** we are searching, if this list item has something like ;q=n*/
+                       if (num_tokens(&buf[0],'=')>1) {
+                               int sbuflen, k;
+                               extract_token(&sbuf[0],&buf[0], 1,'=',16);
+                               sbuflen=strlen(&sbuf[0]);
+                               for (k=0; k<sbuflen; k++) if (sbuf[k]=='.') sbuf[k]='0';
+                               ls->priority=atol(&sbuf[0]);
+                       }
+                       else {
+                               ls->priority=1000;
+                       }
+                       /** get the locale part */
+                       extract_token(&sbuf[0],&buf[0],0,';',16);
+                       /** get the lang part, which should be allways there */
+                       extract_token(&ls->lang[0],&sbuf[0],0,'-',16);
+                       /** get the area code if any. */
+                       if (num_tokens(&sbuf[0],'-')>1) {
+                               extract_token(&ls->region[0],&sbuf[0],1,'-',16);
+                       }
+                       else { /** no ara code? use lang code */
+                               blen=strlen(&ls->lang[0]);
+                               memcpy(&ls->region[0], ls->lang,blen);
+                               ls->region[blen]='\0';
+                       } /** area codes are uppercase */
+                       blen=strlen(&ls->region[0]);
+                       for (j=0; j<blen; j++)
+                               {
+                                       int chars=toupper(ls->region[j]);
+                                       ls->region[j]=(char)chars;/** \todo ?! */
+                               }
+                       sprintf(&lbuf[0],"%s_%s",&ls->lang[0],&ls->region[0]);
+                       
+                       /** check if we have this lang */
+                       ls->availability=1;
+                       ls->selectedlang=-1;
+                       for (j=0; j<NUM_LANGS; j++) {
+                               int result;
+                               /** match against the LANG part */
+                               result=strcasecmp(&ls->lang[0], AvailLang[j]);
+                               if ((result<0)&&(result<ls->availability)){
+                                       ls->availability=result;
+                                       ls->selectedlang=j;
+                               }
+                               /** match against lang and locale */
+                               if (0==strcasecmp(&lbuf[0], AvailLang[j])){
+                                       ls->availability=0;
+                                       ls->selectedlang=j;
+                                       j=NUM_LANGS;
+                               }
+                       }
+        }
+       
+       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;
+       WC->selected_language=nBest;
+       lprintf(9, "language found: %s\n", AvailLang[WC->selected_language]);
+       if (search != NULL) {
+               free(search);
+       }
+}
+
+/* TODO: we skip the language weightening so far. */
+/* 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 */
+//void httplang_to_locale(char *LocaleString)
+//{
+//     char selected_locale[16];
+//     int i, j;
+//     char lang[64];
+//     int num_accept = 0;
+//
+//     lprintf(9, "languageAccept: %s\n", LocaleString);
+//
+//     strcpy(selected_locale, "C");
+//     num_accept = num_tokens(LocaleString, ',');
+//
+//     for (i=num_accept-1; i>=0; --i) {
+//             extract_token(lang, LocaleString, i, ',', sizeof lang);
+//
+//             /* Strip out the weights; we don't use them.  Also convert
+//              * hyphens to underscores.
+//              */
+//             for (j=0; j<strlen(lang); ++j) {
+//                     if (lang[j] == '-') lang[j] = '_';
+//                     if (lang[j] == ';') lang[j] = 0;
+//             }
+//
+//             for (j=0; j<NUM_LANGS; ++j) {
+//                     if (!strncasecmp(lang, AvailLang[j], strlen(lang))) {
+//                             strcpy(selected_locale, AvailLang[j]);
+//                     }
+//             }
+//     }
+//
+//     lprintf(9, "language found: %s\n", selected_locale);
+//     set_selected_language(selected_locale);
+//}
+
+
+/**
+ * \brief show the language chooser on the login dialog
+ * depending on the browser locale change the sequence of the 
+ * language chooser.
+ */
+void offer_languages(void) {
+       int i;
+
+       wprintf("<select name=\"language\" size=\"1\">\n");
+
+       for (i=0; i < NUM_LANGS; ++i) {
+               wprintf("<option %s value=%s>%s</option>\n",
+                       ((WC->selected_language == i) ? "selected" : ""),
+                       AvailLang[i],
+                       AvailLang[i]
+               );
+       }
+
+       wprintf("</select>\n");
+}
+
+/**
+ * \brief Set the selected language for this session.
+ * \param lang the locale to set.
+ */
+void set_selected_language(char *lang) {
+       int i;
+
+       for (i=0; i<NUM_LANGS; ++i) {
+               if (!strcasecmp(lang, AvailLang[i])) {
+                       WC->selected_language = i;
+               }
+       }
+}
+
+/**
+ * \brief Activate the selected language for this session.
+ */
+void go_selected_language(void) {
+       if (WC->selected_language < 0) return;
+       uselocale(wc_locales[WC->selected_language]);   /** switch locales */
+       textdomain(textdomain(NULL));                   /** clear the cache */
+}
+
+/**
+ * \brief Deactivate the selected language for this session.
+ */
+void stop_selected_language(void) {
+       uselocale(LC_GLOBAL_LOCALE);                    /** switch locales */
+       textdomain(textdomain(NULL));                   /** clear the cache */
+}
+
+
+/**
+ * \brief Create a locale_t for each available language
+ */
+void initialize_locales(void) {
+       int i;
+       locale_t Empty_Locale;
+       char buf[32];
+
+       /* create default locale */
+       Empty_Locale = newlocale(LC_ALL_MASK, NULL, NULL);
+
+       for (i = 0; i < NUM_LANGS; ++i) {
+               if (i == 0) {
+                       sprintf(buf, "%s", AvailLang[i]);       // locale 0 (C) is ascii, not utf-8
+               }
+               else {
+                       sprintf(buf, "%s.UTF8", AvailLang[i]);
+               }
+               wc_locales[i] = newlocale(
+                       (LC_MESSAGES_MASK|LC_TIME_MASK),
+                       buf,
+                       (((i > 0) && (wc_locales[0] != NULL)) ? wc_locales[0] : Empty_Locale)
+               );
+               if (wc_locales[i] == NULL) {
+                       lprintf(1, "Error configuring locale for %s: %s\n",
+                               buf,
+                               strerror(errno)
+                       );
+               }
+               else {
+                       lprintf(3, "Configured available locale: %s\n", buf);
+               }
+       }
+}
+
+
+#else  /* ENABLE_NLS */
+/** \brief dummy for non NLS enabled systems */
+void offer_languages(void) {
+       wprintf("English (US)");
+}
+
+/** \brief dummy for non NLS enabled systems */
+void set_selected_language(char *lang) {
+}
+
+/** \brief dummy for non NLS enabled systems */
+void go_selected_language(void) {
+}
+
+/** \brief dummy for non NLS enabled systems */
+void stop_selected_language(void) {
+}
+
+#endif /* ENABLE_NLS */
+
+
+/*@}*/
diff --git a/webcit/graphics.c b/webcit/graphics.c
new file mode 100644 (file)
index 0000000..00f256b
--- /dev/null
@@ -0,0 +1,116 @@
+/*
+ * $Id$
+ *
+ * Handles HTTP upload of graphics files into the system.
+ * \ingroup WebcitHttpServer
+ */
+
+#include "webcit.h"
+
+void display_graphics_upload(char *description, char *check_cmd, char *uplurl)
+{
+       char buf[SIZ];
+
+       serv_puts(check_cmd);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '2') {
+               strcpy(WC->ImportantMessage, &buf[4]);
+               display_main_menu();
+               return;
+       }
+       output_headers(1, 1, 0, 0, 0, 0);
+
+       output_headers(1, 1, 2, 0, 0, 0);
+       wprintf("<div id=\"banner\">\n"
+               "<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>"
+               "<SPAN CLASS=\"titlebar\">");
+       wprintf(_("Image upload"));
+       wprintf("</SPAN>"
+               "</TD></TR></TABLE>\n"
+               "</div>\n<div id=\"content\">\n"
+       );
+
+       wprintf("<div class=\"fix_scrollbar_bug\">"
+               "<table border=0 width=100%% bgcolor=\"#ffffff\"><tr><td>\n");
+
+       wprintf("<CENTER>\n");
+
+       wprintf("<FORM ENCTYPE=\"multipart/form-data\" action=\"%s\" "
+               "METHOD=\"POST\" NAME=\"graphicsupload\">\n", uplurl);
+
+       wprintf("<INPUT TYPE=\"hidden\" NAME=\"which_room\" VALUE=\"");
+       urlescputs(bstr("which_room"));
+       wprintf("\">\n");
+
+       wprintf(_("You can upload any image directly from your computer, "
+               "as long as it is in GIF format (JPEG, PNG, etc. won't "
+               "work)."));
+       wprintf("<br /><br />\n");
+
+       wprintf(_("Please select a file to upload:"));
+       wprintf("<br /><br />\n");
+       wprintf("<INPUT TYPE=\"FILE\" NAME=\"filename\" SIZE=\"35\">\n");
+       wprintf("<br /><br />");
+       wprintf("<INPUT TYPE=\"SUBMIT\" NAME=\"upload_button\" VALUE=\"%s\">\n", _("Upload"));
+       wprintf("&nbsp;");
+       wprintf("<INPUT TYPE=\"RESET\" VALUE=\"%s\">\n", _("Reset form"));
+       wprintf("&nbsp;");
+       wprintf("<INPUT TYPE=\"SUBMIT\" NAME=\"cancel_button\" VALUE=\"%s\">\n", _("Cancel"));
+       wprintf("</FORM>\n");
+       wprintf("</CENTER>\n");
+       wprintf("</td></tr></table></div>\n");
+       wDumpContent(1);
+}
+
+void do_graphics_upload(char *upl_cmd)
+{
+       char buf[SIZ];
+       int bytes_remaining;
+       int pos = 0;
+       int thisblock;
+
+       if (strlen(bstr("cancel_button")) > 0) {
+               strcpy(WC->ImportantMessage,
+                       _("Graphics upload has been cancelled."));
+               display_main_menu();
+               return;
+       }
+
+       if (WC->upload_length == 0) {
+               strcpy(WC->ImportantMessage,
+                       _("You didn't upload a file."));
+               display_main_menu();
+               return;
+       }
+       serv_puts(upl_cmd);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '2') {
+               strcpy(WC->ImportantMessage, &buf[4]);
+               display_main_menu();
+               return;
+       }
+       bytes_remaining = WC->upload_length;
+       while (bytes_remaining) {
+               thisblock = ((bytes_remaining > 4096) ? 4096 : bytes_remaining);
+               serv_printf("WRIT %d", thisblock);
+               serv_getln(buf, sizeof buf);
+               if (buf[0] != '7') {
+                       strcpy(WC->ImportantMessage, &buf[4]);
+                       serv_puts("UCLS 0");
+                       serv_getln(buf, sizeof buf);
+                       display_main_menu();
+                       return;
+               }
+               thisblock = extract_int(&buf[4], 0);
+               serv_write(&WC->upload[pos], thisblock);
+               pos = pos + thisblock;
+               bytes_remaining = bytes_remaining - thisblock;
+       }
+
+       serv_puts("UCLS 1");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != 'x') {
+               display_success(&buf[4]);
+               return;
+       }
+}
diff --git a/webcit/groupdav.h b/webcit/groupdav.h
new file mode 100644 (file)
index 0000000..2a933ad
--- /dev/null
@@ -0,0 +1,14 @@
+/* $Id$ */
+
+void groupdav_common_headers(void);
+void groupdav_main(struct httprequest *, char *, int, char *);
+void groupdav_get(char *);
+void groupdav_put(char *, char *, char *, char *, int);
+void groupdav_delete(char *, char *);
+void groupdav_propfind(char *, int, char *, char *);
+void groupdav_options(char *);
+long locate_message_by_uid(char *);
+void groupdav_folder_list(void);
+void euid_escapize(char *, char *);
+void euid_unescapize(char *, char *);
+void groupdav_identify_host(void);
diff --git a/webcit/groupdav_delete.c b/webcit/groupdav_delete.c
new file mode 100644 (file)
index 0000000..2d44b8f
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+ * $Id$
+ *
+ * Handles GroupDAV DELETE requests.
+ *
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+#include "groupdav.h"
+
+
+/*
+ * The pathname is always going to be /groupdav/room_name/euid
+ */
+void groupdav_delete(char *dav_pathname, char *dav_ifmatch) {
+       char dav_roomname[SIZ];
+       char dav_uid[SIZ];
+       long dav_msgnum = (-1);
+       char buf[SIZ];
+       int n = 0;
+
+       /* First, break off the "/groupdav/" prefix */
+       remove_token(dav_pathname, 0, '/');
+       remove_token(dav_pathname, 0, '/');
+
+       /* Now extract the message euid */
+       n = num_tokens(dav_pathname, '/');
+       extract_token(dav_uid, dav_pathname, n-1, '/', sizeof dav_uid);
+       remove_token(dav_pathname, n-1, '/');
+
+       /* What's left is the room name.  Remove trailing slashes. */
+       if (dav_pathname[strlen(dav_pathname)-1] == '/') {
+               dav_pathname[strlen(dav_pathname)-1] = 0;
+       }
+       strcpy(dav_roomname, dav_pathname);
+
+       /* Go to the correct room. */
+       if (strcasecmp(WC->wc_roomname, dav_roomname)) {
+               gotoroom(dav_roomname);
+       }
+       if (strcasecmp(WC->wc_roomname, dav_roomname)) {
+               wprintf("HTTP/1.1 404 not found\r\n");
+               groupdav_common_headers();
+               wprintf("Content-Length: 0\r\n\r\n");
+               return;
+       }
+
+       dav_msgnum = locate_message_by_uid(dav_uid);
+
+       /*
+        * If no item exists with the requested uid ... simple error.
+        */
+       if (dav_msgnum < 0L) {
+               wprintf("HTTP/1.1 404 Not Found\r\n");
+               groupdav_common_headers();
+               wprintf("Content-Length: 0\r\n\r\n");
+               return;
+       }
+
+       /*
+        * It's there ... check the ETag and make sure it matches
+        * the message number.
+        */
+       if (strlen(dav_ifmatch) > 0) {
+               if (atol(dav_ifmatch) != dav_msgnum) {
+                       wprintf("HTTP/1.1 412 Precondition Failed\r\n");
+                       groupdav_common_headers();
+                       wprintf("Content-Length: 0\r\n\r\n");
+                       return;
+               }
+       }
+
+       /*
+        * Ok, attempt to delete the item.
+        */
+       serv_printf("DELE %ld", dav_msgnum);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '2') {
+               wprintf("HTTP/1.1 204 No Content\r\n"); /* success */
+               groupdav_common_headers();
+               wprintf("Content-Length: 0\r\n\r\n");
+       }
+       else {
+               wprintf("HTTP/1.1 403 Forbidden\r\n");  /* access denied */
+               groupdav_common_headers();
+               wprintf("Content-Length: 0\r\n\r\n");
+       }
+       return;
+}
diff --git a/webcit/groupdav_get.c b/webcit/groupdav_get.c
new file mode 100644 (file)
index 0000000..d773fe2
--- /dev/null
@@ -0,0 +1,143 @@
+/*
+ * $Id$
+ *
+ * Handles GroupDAV GET requests.
+ *
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+#include "groupdav.h"
+
+
+/*
+ * Fetch the entire contents of the room as one big ics file.
+ * This is for "webcal://" type access.
+ */    
+void groupdav_get_big_ics(void) {
+       char buf[1024];
+
+       serv_puts("ICAL getics");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '1') {
+               wprintf("HTTP/1.1 404 not found\r\n");
+               groupdav_common_headers();
+               wprintf(
+                       "Content-Type: text/plain\r\n"
+                       "\r\n"
+                       "%s\r\n",
+                       &buf[4]
+               );
+               return;
+       }
+
+       wprintf("HTTP/1.1 200 OK\r\n");
+       groupdav_common_headers();
+       wprintf("Content-type: text/calendar; charset=UTF-8\r\n");
+       begin_burst();
+       while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+               wprintf("%s\r\n", buf);
+       }
+       end_burst();
+}
+
+
+/*
+ * The pathname is always going to take one of two formats:
+ * /groupdav/room_name/euid    (GroupDAV)
+ * /groupdav/room_name         (webcal)
+ */
+void groupdav_get(char *dav_pathname) {
+       char dav_roomname[1024];
+       char dav_uid[1024];
+       long dav_msgnum = (-1);
+       char buf[1024];
+       int in_body = 0;
+       int found_content_type = 0;
+
+       if (num_tokens(dav_pathname, '/') < 3) {
+               wprintf("HTTP/1.1 404 not found\r\n");
+               groupdav_common_headers();
+               wprintf(
+                       "Content-Type: text/plain\r\n"
+                       "\r\n"
+                       "The object you requested was not found.\r\n"
+               );
+               return;
+       }
+
+       extract_token(dav_roomname, dav_pathname, 2, '/', sizeof dav_roomname);
+       extract_token(dav_uid, dav_pathname, 3, '/', sizeof dav_uid);
+       if ((!strcasecmp(dav_uid, "ics")) || (!strcasecmp(dav_uid, "calendar.ics"))) {
+               strcpy(dav_uid, "");
+       }
+
+       /* Go to the correct room. */
+       if (strcasecmp(WC->wc_roomname, dav_roomname)) {
+               gotoroom(dav_roomname);
+       }
+       if (strcasecmp(WC->wc_roomname, dav_roomname)) {
+               wprintf("HTTP/1.1 404 not found\r\n");
+               groupdav_common_headers();
+               wprintf(
+                       "Content-Type: text/plain\r\n"
+                       "\r\n"
+                       "There is no folder called \"%s\" on this server.\r\n",
+                       dav_roomname
+               );
+               return;
+       }
+
+       /** GET on the collection itself returns an ICS of the entire collection.
+        */
+       if (!strcasecmp(dav_uid, "")) {
+               groupdav_get_big_ics();
+               return;
+       }
+
+       dav_msgnum = locate_message_by_uid(dav_uid);
+       serv_printf("MSG2 %ld", dav_msgnum);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '1') {
+               wprintf("HTTP/1.1 404 not found\r\n");
+               groupdav_common_headers();
+               wprintf(
+                       "Content-Type: text/plain\r\n"
+                       "\r\n"
+                       "Object \"%s\" was not found in the \"%s\" folder.\r\n",
+                       dav_uid,
+                       dav_roomname
+               );
+               return;
+       }
+
+       wprintf("HTTP/1.1 200 OK\r\n");
+       groupdav_common_headers();
+       wprintf("etag: \"%ld\"\r\n", dav_msgnum);
+       while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+               if (in_body) {
+                       wprintf("%s\r\n", buf);
+               }
+               else if (!strncasecmp(buf, "Date: ", 6)) {
+                       wprintf("%s\r\n", buf);
+               }
+               else if (!strncasecmp(buf, "Content-type: ", 14)) {
+                       wprintf("%s", buf);
+                       if (bmstrcasestr(buf, "charset=")) {
+                               wprintf("%s\r\n", buf);
+                       }
+                       else {
+                               wprintf("%s;charset=UTF-8\r\n", buf);
+                       }
+                       found_content_type = 1;
+               }
+               else if ((strlen(buf) == 0) && (in_body == 0)) {
+                       if (!found_content_type) {
+                               wprintf("Content-type: text/plain\r\n");
+                       }
+                       in_body = 1;
+                       begin_burst();
+               }
+       }
+       end_burst();
+}
diff --git a/webcit/groupdav_main.c b/webcit/groupdav_main.c
new file mode 100644 (file)
index 0000000..ca31fe2
--- /dev/null
@@ -0,0 +1,246 @@
+/*
+ * $Id$
+ *
+ * Entry point for GroupDAV functions
+ *
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+#include "groupdav.h"
+
+
+/*
+ * 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 groupdav_common_headers(void) {
+       wprintf(
+               "Server: %s / %s\r\n"
+               "Connection: close\r\n",
+               SERVER, serv_info.serv_software
+       );
+}
+
+
+
+/*
+ * string conversion function
+ */
+void euid_escapize(char *target, char *source) {
+       int i;
+       int target_length = 0;
+
+       strcpy(target, "");
+       for (i=0; i<strlen(source); ++i) {
+               if ( (isalnum(source[i])) || (source[i]=='-') || (source[i]=='_') ) {
+                       target[target_length] = source[i];
+                       target[++target_length] = 0;
+               }
+               else {
+                       sprintf(&target[target_length], "=%02X", source[i]);
+                       target_length += 3;
+               }
+       }
+}
+
+/*
+ * string conversion function
+ */
+void euid_unescapize(char *target, char *source) {
+       int a, b;
+       char hex[3];
+       int target_length = 0;
+
+       strcpy(target, "");
+
+       for (a = 0; a < strlen(source); ++a) {
+               if (source[a] == '=') {
+                       hex[0] = source[a + 1];
+                       hex[1] = source[a + 2];
+                       hex[2] = 0;
+                       b = 0;
+                       sscanf(hex, "%02x", &b);
+                       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 groupdav_main(struct httprequest *req,
+                       char *dav_content_type,
+                       int dav_content_length,
+                       char *dav_content
+) {
+       struct httprequest *rptr;
+       char dav_method[256];
+       char dav_pathname[256];
+       char dav_ifmatch[256];
+       int dav_depth;
+       char *ds;
+       int i;
+
+       strcpy(dav_method, "");
+       strcpy(dav_pathname, "");
+       strcpy(dav_ifmatch, "");
+       dav_depth = 0;
+
+       for (rptr=req; rptr!=NULL; rptr=rptr->next) {
+               if (!strncasecmp(rptr->line, "Host: ", 6)) {
+                       if (strlen(WC->http_host) == 0) {
+                               safestrncpy(WC->http_host, &rptr->line[6],
+                                       sizeof WC->http_host);
+                       }
+                }
+               if (!strncasecmp(rptr->line, "If-Match: ", 10)) {
+                        safestrncpy(dav_ifmatch, &rptr->line[10],
+                               sizeof dav_ifmatch);
+                }
+               if (!strncasecmp(rptr->line, "Depth: ", 7)) {
+                       if (!strcasecmp(&rptr->line[7], "infinity")) {
+                               dav_depth = 32767;
+                       }
+                       else if (!strcmp(&rptr->line[7], "0")) {
+                               dav_depth = 0;
+                       }
+                       else if (!strcmp(&rptr->line[7], "1")) {
+                               dav_depth = 1;
+                       }
+                }
+       }
+
+       if (!WC->logged_in) {
+               wprintf("HTTP/1.1 401 Unauthorized\r\n");
+               groupdav_common_headers();
+               wprintf("WWW-Authenticate: Basic realm=\"%s\"\r\n",
+                       serv_info.serv_humannode);
+               wprintf("Content-Length: 0\r\n\r\n");
+               return;
+       }
+
+       extract_token(dav_method, req->line, 0, ' ', sizeof dav_method);
+       extract_token(dav_pathname, req->line, 1, ' ', sizeof dav_pathname);
+       unescape_input(dav_pathname);
+
+       /* If the request does not begin with "/groupdav", prepend it.  If
+        * we happen to introduce a double-slash, that's ok; we'll strip it
+        * in the next step.
+        * 
+        * (THIS IS DISABLED BECAUSE WE ARE NOW TRYING TO DO REAL DAV.)
+        *
+       if (strncasecmp(dav_pathname, "/groupdav", 9)) {
+               char buf[512];
+               snprintf(buf, sizeof buf, "/groupdav/%s", dav_pathname);
+               safestrncpy(dav_pathname, buf, sizeof dav_pathname);
+       }
+        *
+        */
+       
+       /* Remove any stray double-slashes in pathname */
+       while (ds=strstr(dav_pathname, "//"), ds != NULL) {
+               strcpy(ds, ds+1);
+       }
+
+       /*
+        * 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.
+        */
+       if (strlen(dav_ifmatch) > 0) {
+               striplt(dav_ifmatch);
+               if (dav_ifmatch[0] == '\"') {
+                       strcpy(dav_ifmatch, &dav_ifmatch[1]);
+                       for (i=0; i<strlen(dav_ifmatch); ++i) {
+                               if (dav_ifmatch[i] == '\"') {
+                                       dav_ifmatch[i] = 0;
+                               }
+                       }
+               }
+               if (!strcmp(dav_ifmatch, "*")) {
+                       strcpy(dav_ifmatch, "");
+               }
+       }
+
+       /*
+        * The OPTIONS method is not required by GroupDAV.  This is an
+        * experiment to determine what might be involved in supporting
+        * other variants of DAV in the future.
+        */
+       if (!strcasecmp(dav_method, "OPTIONS")) {
+               groupdav_options(dav_pathname);
+               return;
+       }
+
+       /*
+        * The PROPFIND method is basically used to list all objects in a
+        * room, or to list all relevant rooms on the server.
+        */
+       if (!strcasecmp(dav_method, "PROPFIND")) {
+               groupdav_propfind(dav_pathname, dav_depth,
+                               dav_content_type, dav_content);
+               return;
+       }
+
+       /*
+        * The GET method is used for fetching individual items.
+        */
+       if (!strcasecmp(dav_method, "GET")) {
+               groupdav_get(dav_pathname);
+               return;
+       }
+
+       /*
+        * The PUT method is used to add or modify items.
+        */
+       if (!strcasecmp(dav_method, "PUT")) {
+               groupdav_put(dav_pathname, dav_ifmatch,
+                               dav_content_type, dav_content,
+                               dav_content_length);
+               return;
+       }
+
+       /*
+        * The DELETE method kills, maims, and destroys.
+        */
+       if (!strcasecmp(dav_method, "DELETE")) {
+               groupdav_delete(dav_pathname, dav_ifmatch);
+               return;
+       }
+
+       /*
+        * Couldn't find what we were looking for.  Die in a car fire.
+        */
+       wprintf("HTTP/1.1 501 Method not implemented\r\n");
+       groupdav_common_headers();
+       wprintf("Content-Type: text/plain\r\n"
+               "\r\n"
+               "GroupDAV method \"%s\" is not implemented.\r\n",
+               dav_method
+       );
+}
+
+
+/*
+ * Output our host prefix for globally absolute URL's.
+ */  
+void groupdav_identify_host(void) {
+       if (strlen(WC->http_host) > 0) {
+               wprintf("%s://%s",
+                       (is_https ? "https" : "http"),
+                       WC->http_host);
+       }
+}
diff --git a/webcit/groupdav_options.c b/webcit/groupdav_options.c
new file mode 100644 (file)
index 0000000..b92b794
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+ * $Id$
+ *
+ * Handles DAV OPTIONS requests (experimental -- not required by GroupDAV)
+ *
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+#include "groupdav.h"
+
+/*
+ * The pathname is always going to be /groupdav/room_name/msg_num
+ */
+void groupdav_options(char *dav_pathname) {
+       char dav_roomname[256];
+       char dav_uid[256];
+       long dav_msgnum = (-1);
+       char datestring[256];
+       time_t now;
+
+       now = time(NULL);
+       http_datestring(datestring, sizeof datestring, now);
+
+       extract_token(dav_roomname, dav_pathname, 2, '/', sizeof dav_roomname);
+       extract_token(dav_uid, dav_pathname, 3, '/', sizeof dav_uid);
+
+       /*
+        * If the room name is blank, the client is doing a top-level OPTIONS.
+        */
+       if (strlen(dav_roomname) == 0) {
+               wprintf("HTTP/1.1 200 OK\r\n");
+               groupdav_common_headers();
+               wprintf("Date: %s\r\n", datestring);
+               wprintf("DAV: 1\r\n");
+               wprintf("Allow: OPTIONS, PROPFIND\r\n");
+               wprintf("\r\n");
+               return;
+       }
+
+       /* Go to the correct room. */
+       if (strcasecmp(WC->wc_roomname, dav_roomname)) {
+               gotoroom(dav_roomname);
+       }
+
+       if (strcasecmp(WC->wc_roomname, dav_roomname)) {
+               wprintf("HTTP/1.1 404 not found\r\n");
+               groupdav_common_headers();
+               wprintf("Date: %s\r\n", datestring);
+               wprintf(
+                       "Content-Type: text/plain\r\n"
+                       "\r\n"
+                       "There is no folder called \"%s\" on this server.\r\n",
+                       dav_roomname
+               );
+               return;
+       }
+
+       /* If dav_uid is non-empty, client is requesting an OPTIONS on
+        * a specific item in the room.
+        */
+       if (strlen(dav_uid) > 0) {
+
+               dav_msgnum = locate_message_by_uid(dav_uid);
+               if (dav_msgnum < 0) {
+                       wprintf("HTTP/1.1 404 not found\r\n");
+                       groupdav_common_headers();
+                       wprintf(
+                               "Content-Type: text/plain\r\n"
+                               "\r\n"
+                               "Object \"%s\" was not found in the \"%s\" folder.\r\n",
+                               dav_uid,
+                               dav_roomname
+                       );
+                       return;
+               }
+
+               wprintf("HTTP/1.1 200 OK\r\n");
+               groupdav_common_headers();
+               wprintf("Date: %s\r\n", datestring);
+               wprintf("DAV: 1\r\n");
+               wprintf("Allow: OPTIONS, PROPFIND, GET, PUT, DELETE\r\n");
+               wprintf("\r\n");
+               return;
+       }
+
+       /*
+        * We got to this point, which means that the client is requesting
+        * an OPTIONS on the room itself.
+        */
+       wprintf("HTTP/1.1 200 OK\r\n");
+       groupdav_common_headers();
+       wprintf("Date: %s\r\n", datestring);
+       wprintf("DAV: 1\r\n");
+       wprintf("Allow: OPTIONS, PROPFIND, GET, PUT\r\n");
+       wprintf("\r\n");
+}
diff --git a/webcit/groupdav_propfind.c b/webcit/groupdav_propfind.c
new file mode 100644 (file)
index 0000000..8e6154d
--- /dev/null
@@ -0,0 +1,438 @@
+/*
+ * $Id$
+ *
+ * Handles GroupDAV PROPFIND requests.
+ *
+ * A few notes about our XML output:
+ *
+ * --> Yes, we are spewing tags directly instead of using an XML library.
+ *     If you would like to rewrite this using libxml2, code it up and submit
+ *     a patch.  Whining 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.
+ *
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+#include "groupdav.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(char *uid) {
+       char buf[256];
+       char decoded_uid[1024];
+       long retval = (-1L);
+
+       /* Decode the uid */
+       euid_unescapize(decoded_uid, uid);
+
+/**************  THE NEW WAY ***********************/
+       serv_printf("EUID %s", decoded_uid);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '2') {
+               retval = atol(&buf[4]);
+       }
+/***************************************************/
+
+/**************  THE OLD WAY ***********************
+       serv_puts("MSGS ALL|0|1");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '8') {
+               serv_printf("exti|%s", decoded_uid);
+               serv_puts("000");
+               while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+                       retval = atol(buf);
+               }
+       }
+ ***************************************************/
+
+       return(retval);
+}
+
+
+
+/*
+ * List rooms (or "collections" in DAV terminology) which contain
+ * interesting groupware objects.
+ */
+void groupdav_collection_list(char *dav_pathname, int dav_depth)
+{
+       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 (!strcmp(dav_pathname, "/")) {
+               starting_point = 0;
+       }
+       else if (!strcasecmp(dav_pathname, "/groupdav")) {
+               starting_point = 1;
+       }
+       else if (!strcasecmp(dav_pathname, "/groupdav/")) {
+               starting_point = 1;
+       }
+       else if ( (!strncasecmp(dav_pathname, "/groupdav/", 10)) && (strlen(dav_pathname) > 10) ) {
+               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.
+        */
+       wprintf("HTTP/1.0 207 Multi-Status\r\n");
+       groupdav_common_headers();
+       wprintf("Date: %s\r\n", datestring);
+       wprintf("Content-type: text/xml\r\n");
+       wprintf("Content-encoding: identity\r\n");
+
+       begin_burst();
+
+       wprintf("<?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) {
+               wprintf("<response>");
+                       wprintf("<href>");
+                               groupdav_identify_host();
+                               wprintf("/");
+                       wprintf("</href>");
+                       wprintf("<propstat>");
+                               wprintf("<status>HTTP/1.1 200 OK</status>");
+                               wprintf("<prop>");
+                                       wprintf("<displayname>/</displayname>");
+                                       wprintf("<resourcetype><collection/></resourcetype>");
+                                       wprintf("<getlastmodified>");
+                                               escputs(datestring);
+                                       wprintf("</getlastmodified>");
+                               wprintf("</prop>");
+                       wprintf("</propstat>");
+               wprintf("</response>");
+       }
+
+       /**
+        *      If the client is requesting "/groupdav", show a /groupdav subdirectory.
+        */
+       if ((starting_point + dav_depth) >= 1) {
+               wprintf("<response>");
+                       wprintf("<href>");
+                               groupdav_identify_host();
+                               wprintf("/groupdav");
+                       wprintf("</href>");
+                       wprintf("<propstat>");
+                               wprintf("<status>HTTP/1.1 200 OK</status>");
+                               wprintf("<prop>");
+                                       wprintf("<displayname>GroupDAV</displayname>");
+                                       wprintf("<resourcetype><collection/></resourcetype>");
+                                       wprintf("<getlastmodified>");
+                                               escputs(datestring);
+                                       wprintf("</getlastmodified>");
+                               wprintf("</prop>");
+                       wprintf("</propstat>");
+               wprintf("</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) ) {
+                       is_groupware_collection = 1;
+               }
+               else {
+                       is_groupware_collection = 0;
+               }
+
+               if ( (is_groupware_collection) && ((starting_point + dav_depth) >= 2) ) {
+                       wprintf("<response>");
+
+                       wprintf("<href>");
+                       groupdav_identify_host();
+                       wprintf("/groupdav/");
+                       urlescputs(roomname);
+                       wprintf("/</href>");
+
+                       wprintf("<propstat>");
+                       wprintf("<status>HTTP/1.1 200 OK</status>");
+                       wprintf("<prop>");
+                       wprintf("<displayname>");
+                       escputs(roomname);
+                       wprintf("</displayname>");
+                       wprintf("<resourcetype><collection/>");
+
+                       switch(view) {
+                               case VIEW_CALENDAR:
+                                       wprintf("<G:vevent-collection />");
+                                       break;
+                               case VIEW_TASKS:
+                                       wprintf("<G:vtodo-collection />");
+                                       break;
+                               case VIEW_ADDRESSBOOK:
+                                       wprintf("<G:vcard-collection />");
+                                       break;
+                       }
+
+                       wprintf("</resourcetype>");
+                       wprintf("<getlastmodified>");
+                               escputs(datestring);
+                       wprintf("</getlastmodified>");
+                       wprintf("</prop>");
+                       wprintf("</propstat>");
+                       wprintf("</response>");
+               }
+       }
+       wprintf("</multistatus>\n");
+
+       end_burst();
+}
+
+
+
+/*
+ * The pathname is always going to be /groupdav/room_name/msg_num
+ */
+void groupdav_propfind(char *dav_pathname, int dav_depth, char *dav_content_type, char *dav_content) {
+       char dav_roomname[256];
+       char dav_uid[256];
+       char msgnum[256];
+       long dav_msgnum = (-1);
+       char buf[256];
+       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);
+
+       extract_token(dav_roomname, dav_pathname, 2, '/', sizeof dav_roomname);
+       extract_token(dav_uid, dav_pathname, 3, '/', sizeof dav_uid);
+
+       /*
+        * If the room name is blank, the client is requesting a
+        * folder list.
+        */
+       if (strlen(dav_roomname) == 0) {
+               groupdav_collection_list(dav_pathname, dav_depth);
+               return;
+       }
+
+       /* Go to the correct room. */
+       if (strcasecmp(WC->wc_roomname, dav_roomname)) {
+               gotoroom(dav_roomname);
+       }
+       if (strcasecmp(WC->wc_roomname, dav_roomname)) {
+               wprintf("HTTP/1.1 404 not found\r\n");
+               groupdav_common_headers();
+               wprintf("Date: %s\r\n", datestring);
+               wprintf(
+                       "Content-Type: text/plain\r\n"
+                       "\r\n"
+                       "There is no folder called \"%s\" on this server.\r\n",
+                       dav_roomname
+               );
+               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.
+        */
+       if (strlen(dav_uid) > 0) {
+
+               dav_msgnum = locate_message_by_uid(dav_uid);
+               if (dav_msgnum < 0) {
+                       wprintf("HTTP/1.1 404 not found\r\n");
+                       groupdav_common_headers();
+                       wprintf(
+                               "Content-Type: text/plain\r\n"
+                               "\r\n"
+                               "Object \"%s\" was not found in the \"%s\" folder.\r\n",
+                               dav_uid,
+                               dav_roomname
+                       );
+                       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.
+                */
+               wprintf("HTTP/1.0 207 Multi-Status\r\n");
+               groupdav_common_headers();
+               wprintf("Date: %s\r\n", datestring);
+               wprintf("Content-type: text/xml\r\n");
+               wprintf("Content-encoding: identity\r\n");
+       
+               begin_burst();
+       
+               wprintf("<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+                       "<multistatus xmlns=\"DAV:\">"
+               );
+
+               wprintf("<response>");
+
+               wprintf("<href>");
+               groupdav_identify_host();
+               wprintf("/groupdav/");
+               urlescputs(WC->wc_roomname);
+               euid_escapize(encoded_uid, dav_uid);
+               wprintf("/%s", encoded_uid);
+               wprintf("</href>");
+               wprintf("<propstat>");
+               wprintf("<status>HTTP/1.1 200 OK</status>");
+               wprintf("<prop><getetag>\"%ld\"</getetag></prop>", dav_msgnum);
+               wprintf("</propstat>");
+
+               wprintf("</response>\n");
+               wprintf("</multistatus>\n");
+               end_burst();
+               return;
+       }
+
+
+       /*
+        * We got to this point, which means that the client is requesting
+        * a 'collection' (i.e. a list of all items in the room).
+        *
+        * 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.
+        */
+       wprintf("HTTP/1.0 207 Multi-Status\r\n");
+       groupdav_common_headers();
+       wprintf("Date: %s\r\n", datestring);
+       wprintf("Content-type: text/xml\r\n");
+       wprintf("Content-encoding: identity\r\n");
+
+       begin_burst();
+
+       wprintf("<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+               "<multistatus xmlns=\"DAV:\" xmlns:G=\"http://groupdav.org/\">"
+       );
+
+
+       /** Transmit the collection resource (FIXME check depth and starting point) */
+       wprintf("<response>");
+
+       wprintf("<href>");
+               groupdav_identify_host();
+               wprintf("/groupdav/");
+               urlescputs(WC->wc_roomname);
+       wprintf("</href>");
+
+       wprintf("<propstat>");
+       wprintf("<status>HTTP/1.1 200 OK</status>");
+       wprintf("<prop>");
+       wprintf("<displayname>");
+       escputs(WC->wc_roomname);
+       wprintf("</displayname>");
+       wprintf("<resourcetype><collection/>");
+
+       switch(WC->wc_default_view) {
+               case VIEW_CALENDAR:
+                       wprintf("<G:vevent-collection />");
+                       break;
+               case VIEW_TASKS:
+                       wprintf("<G:vtodo-collection />");
+                       break;
+               case VIEW_ADDRESSBOOK:
+                       wprintf("<G:vcard-collection />");
+                       break;
+       }
+
+       wprintf("</resourcetype>");
+       /* FIXME get the mtime
+       wprintf("<getlastmodified>");
+               escputs(datestring);
+       wprintf("</getlastmodified>");
+       */
+       wprintf("</prop>");
+       wprintf("</propstat>");
+       wprintf("</response>");
+
+       /** Transmit the collection listing (FIXME check depth and starting point) */
+
+       serv_puts("MSGS ALL");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '1') while (serv_getln(msgnum, sizeof msgnum), strcmp(msgnum, "000")) {
+               msgs = realloc(msgs, ++num_msgs * sizeof(long));
+               msgs[num_msgs-1] = atol(msgnum);
+       }
+
+       if (num_msgs > 0) for (i=0; i<num_msgs; ++i) {
+
+               strcpy(uid, "");
+               serv_printf("MSG0 %ld|3", msgs[i]);
+               serv_getln(buf, sizeof buf);
+               if (buf[0] == '1') while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+                       if (!strncasecmp(buf, "exti=", 5)) {
+                               strcpy(uid, &buf[5]);
+                       }
+               }
+
+               if (strlen(uid) > 0) {
+                       wprintf("<response>");
+                               wprintf("<href>");
+                                       groupdav_identify_host();
+                                       wprintf("/groupdav/");
+                                       urlescputs(WC->wc_roomname);
+                                       euid_escapize(encoded_uid, uid);
+                                       wprintf("/%s", encoded_uid);
+                               wprintf("</href>");
+                               wprintf("<propstat>");
+                                       wprintf("<status>HTTP/1.1 200 OK</status>");
+                                       wprintf("<prop>");
+                                               wprintf("<getetag>\"%ld\"</getetag>", msgs[i]);
+                                       wprintf("</prop>");
+                               wprintf("</propstat>");
+                       wprintf("</response>");
+               }
+       }
+
+       wprintf("</multistatus>\n");
+       end_burst();
+
+       if (msgs != NULL) {
+               free(msgs);
+       }
+}
diff --git a/webcit/groupdav_put.c b/webcit/groupdav_put.c
new file mode 100644 (file)
index 0000000..21eaefb
--- /dev/null
@@ -0,0 +1,205 @@
+/*
+ * $Id$
+ *
+ * Handles GroupDAV PUT requests.
+ *
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+#include "groupdav.h"
+
+
+/*
+ * This function is for uploading an ENTIRE calendar, not just one
+ * component.  This would be for webcal:// 'publish' operations, not
+ * for GroupDAV.
+ */
+void groupdav_put_bigics(char *dav_content, int dav_content_length)
+{
+       char buf[1024];
+
+       serv_puts("ICAL putics");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '4') {
+               wprintf("HTTP/1.1 502 Bad Gateway\r\n");
+               groupdav_common_headers();
+               wprintf("Content-type: text/plain\r\n"
+                       "\r\n"
+                       "%s\r\n", &buf[4]
+               );
+               return;
+       }
+
+       serv_write(dav_content, dav_content_length);
+       serv_printf("\n000");
+
+       /* Report success and not much else. */
+       wprintf("HTTP/1.1 204 No Content\r\n");
+       lprintf(9, "HTTP/1.1 204 No Content\r\n");
+       groupdav_common_headers();
+       wprintf("Content-Length: 0\r\n\r\n");
+}
+
+
+
+/*
+ * The pathname is always going to take one of two formats:
+ * /groupdav/room_name/euid    (GroupDAV)
+ * /groupdav/room_name         (webcal)
+ */
+void groupdav_put(char *dav_pathname, char *dav_ifmatch,
+               char *dav_content_type, char *dav_content,
+               int dav_content_length
+) {
+       char dav_roomname[1024];
+       char dav_uid[1024];
+       long new_msgnum = (-2L);
+       long old_msgnum = (-1L);
+       char buf[SIZ];
+       int n = 0;
+
+       if (num_tokens(dav_pathname, '/') < 3) {
+               wprintf("HTTP/1.1 404 not found\r\n");
+               groupdav_common_headers();
+               wprintf(
+                       "Content-Type: text/plain\r\n"
+                       "\r\n"
+                       "The object you requested was not found.\r\n"
+               );
+               return;
+       }
+
+       extract_token(dav_roomname, dav_pathname, 2, '/', sizeof dav_roomname);
+       extract_token(dav_uid, dav_pathname, 3, '/', sizeof dav_uid);
+       if ((!strcasecmp(dav_uid, "ics")) || (!strcasecmp(dav_uid, "calendar.ics"))) {
+               strcpy(dav_uid, "");
+       }
+
+       /* Go to the correct room. */
+       if (strcasecmp(WC->wc_roomname, dav_roomname)) {
+               gotoroom(dav_roomname);
+       }
+       if (strcasecmp(WC->wc_roomname, dav_roomname)) {
+               wprintf("HTTP/1.1 404 not found\r\n");
+               groupdav_common_headers();
+               wprintf(
+                       "Content-Type: text/plain\r\n"
+                       "\r\n"
+                       "There is no folder called \"%s\" on this server.\r\n",
+                       dav_roomname
+               );
+               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 (strlen(dav_ifmatch) > 0) {
+               lprintf(9, "dav_ifmatch: %s\n", dav_ifmatch);
+               old_msgnum = locate_message_by_uid(dav_uid);
+               lprintf(9, "old_msgnum:  %ld\n", old_msgnum);
+               if (atol(dav_ifmatch) != old_msgnum) {
+                       wprintf("HTTP/1.1 412 Precondition Failed\r\n");
+                       lprintf(9, "HTTP/1.1 412 Precondition Failed (ifmatch=%ld, old_msgnum=%ld)\r\n",
+                               atol(dav_ifmatch), old_msgnum);
+                       groupdav_common_headers();
+                       wprintf("Content-Length: 0\r\n\r\n");
+                       return;
+               }
+       }
+
+       /** PUT on the collection itself uploads an ICS of the entire collection.
+        */
+       if (!strcasecmp(dav_uid, "")) {
+               groupdav_put_bigics(dav_content, dav_content_length);
+               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') {
+               wprintf("HTTP/1.1 502 Bad Gateway\r\n");
+               groupdav_common_headers();
+               wprintf("Content-type: text/plain\r\n"
+                       "\r\n"
+                       "%s\r\n", &buf[4]
+               );
+               return;
+       }
+
+       /* Send the content to the Citadel server */
+       serv_printf("Content-type: %s\n\n", dav_content_type);
+       serv_puts(dav_content);
+       serv_puts("\n000");
+
+       /* Fetch the reply from the Citadel server */
+       n = 0;
+       strcpy(dav_uid, "");
+       while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+               switch(n++) {
+                       case 0: new_msgnum = atol(buf);
+                               break;
+                       case 1: lprintf(9, "new_msgnum=%ld (%s)\n", new_msgnum, buf);
+                               break;
+                       case 2: strcpy(dav_uid, buf);
+                               break;
+                       default:
+                               break;
+               }
+       }
+
+       /* Tell the client what happened. */
+
+       /* Citadel failed in some way? */
+       if (new_msgnum < 0L) {
+               wprintf("HTTP/1.1 502 Bad Gateway\r\n");
+               groupdav_common_headers();
+               wprintf("Content-type: text/plain\r\n"
+                       "\r\n"
+                       "new_msgnum is %ld\r\n"
+                       "\r\n", new_msgnum
+               );
+               return;
+       }
+
+       /* We created this item for the first time. */
+       if (old_msgnum < 0L) {
+               wprintf("HTTP/1.1 201 Created\r\n");
+               lprintf(9, "HTTP/1.1 201 Created\r\n");
+               groupdav_common_headers();
+               wprintf("etag: \"%ld\"\r\n", new_msgnum);
+               wprintf("Content-Length: 0\r\n");
+               wprintf("Location: ");
+               groupdav_identify_host();
+               wprintf("/groupdav/");
+               urlescputs(dav_roomname);
+               wprintf("/%s\r\n", dav_uid);
+               wprintf("\r\n");
+               return;
+       }
+
+       /* We modified an existing item. */
+       wprintf("HTTP/1.1 204 No Content\r\n");
+       lprintf(9, "HTTP/1.1 204 No Content\r\n");
+       groupdav_common_headers();
+       wprintf("etag: \"%ld\"\r\n", new_msgnum);
+       wprintf("Content-Length: 0\r\n\r\n");
+
+       /* 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);
+
+       return;
+}
diff --git a/webcit/html2html.c b/webcit/html2html.c
new file mode 100644 (file)
index 0000000..ca8804c
--- /dev/null
@@ -0,0 +1,374 @@
+/*
+ * $Id$
+ */
+/**
+ * \defgroup HTML2HTML Output an HTML message, modifying it slightly to make sure it plays nice
+ * with the rest of our web framework.
+ * \ingroup WebcitHttpServer
+ */
+/*@{*/
+#include "webcit.h"
+#include "vcard.h"
+#include "webserver.h"
+
+
+/**
+ * \brief      Strip surrounding single or double quotes from a string.
+ *
+ * \param s    String to be stripped.
+ */
+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]);
+       }
+}
+
+
+/**
+ * \brief Check to see if a META tag has overridden the declared MIME character set.
+ *
+ * \param charset              Character set name (left unchanged if we don't do anything)
+ * \param meta_http_equiv      Content of the "http-equiv" portion of the META tag
+ * \param 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);
+       striplt(buf);
+       if (!strncasecmp(buf, "charset=", 8)) {
+               strcpy(charset, &buf[8]);
+       }
+}
+
+
+
+/**
+ * \brief Sanitize and enhance an HTML message for display.
+ *        Also convert weird character sets to UTF-8 if necessary.
+ *
+ * \param supplied_charset the input charset as declared in the MIME headers
+ */
+void output_html(char *supplied_charset, int treat_as_wiki) {
+       char buf[SIZ];
+       char *msg;
+       char *ptr;
+       char *msgstart;
+       char *msgend;
+       char *converted_msg;
+       int buffer_length = 1;
+       int line_length = 0;
+       int content_length = 0;
+       int output_length = 0;
+       char new_window[SIZ];
+       int brak = 0;
+       int alevel = 0;
+       int i;
+       int linklen;
+       char charset[128];
+#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
+
+       safestrncpy(charset, supplied_charset, sizeof charset);
+       msg = strdup("");
+       sprintf(new_window, "<a target=\"%s\" href=", TARGET);
+
+       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) {
+                       wprintf("<b>");
+                       wprintf(_("realloc() error! couldn't get %d bytes: %s"),
+                               buffer_length + 1,
+                               strerror(errno));
+                       wprintf("</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;
+       }
+
+       /** Do a first pass to isolate the message body */
+       ptr = msg;
+       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;
+                               striplt(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)) ) {
+                       ptr = strchr(ptr, '>');
+                       if ((ptr == NULL) || (ptr >= msgend)) break;
+                       ++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);
+       }
+
+       /** Convert foreign character sets to UTF-8 if necessary. */
+#ifdef HAVE_ICONV
+       if ( (strcasecmp(charset, "us-ascii"))
+          && (strcasecmp(charset, "UTF-8"))
+          && (strcasecmp(charset, ""))
+       ) {
+               lprintf(9, "Converting %s to UTF-8\n", charset);
+               ic = ctdl_iconv_open("UTF-8", charset);
+               if (ic == (iconv_t)(-1) ) {
+                       lprintf(5, "%s:%d iconv_open() failed: %s\n",
+                               __FILE__, __LINE__, strerror(errno));
+               }
+       }
+       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);
+       }
+#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.
+        */
+
+       /** Now go through the message, parsing tags as necessary. */
+       converted_msg = malloc(content_length);
+       strcpy(converted_msg, "");
+       ptr = msg;
+       msgend = strchr(msg, 0);
+       while (ptr < msgend) {
+
+               /**
+                * 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;
+                       converted_msg = realloc(converted_msg, content_length);
+                       sprintf(&converted_msg[output_length],
+                               "<a href=\"display_enter"
+                               "?force_room=_MAIL_&recp=");
+                       output_length += 47;
+                       ptr = &ptr[16];
+                       ++alevel;
+               }
+               /** Make external links open in a separate window */
+               else if (!strncasecmp(ptr, "<a href=\"", 9)) {
+                       ++alevel;
+                       if ( ((strchr(ptr, ':') < strchr(ptr, '/')))
+                            &&  ((strchr(ptr, '/') < strchr(ptr, '>'))) 
+                            ) {
+                               /* open external links to new window */
+                               content_length += 64;
+                               converted_msg = realloc(converted_msg, content_length);
+                               sprintf(&converted_msg[output_length], new_window);
+                               output_length += strlen(new_window);
+                               ptr = &ptr[8];
+                       }
+                       else if ( (treat_as_wiki) && (strncasecmp(ptr, "<a href=\"wiki?", 14)) ) {
+                               content_length += 64;
+                               converted_msg = realloc(converted_msg, content_length);
+                               sprintf(&converted_msg[output_length], "<a href=\"wiki?page=");
+                               output_length += 19;
+                               ptr = &ptr[9];
+                       }
+                       else {
+                               sprintf(&converted_msg[output_length], "<a href=\"");
+                               output_length += 9;
+                               ptr = &ptr[9];
+                       }
+               }
+               /**
+                * 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))) {
+                               linklen = 0;
+                               /** Find the end of the link */
+                               for (i=0; i<=strlen(ptr); ++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]==']')
+                                       ) linklen = i;
+                                       if (linklen > 0) break;
+                               }
+                               if (linklen > 0) {
+                                       content_length += (32 + linklen);
+                                       converted_msg = realloc(converted_msg, content_length);
+                                       sprintf(&converted_msg[output_length], new_window);
+                                       output_length += strlen(new_window);
+                                       converted_msg[output_length] = '\"';
+                                       converted_msg[++output_length] = 0;
+                                       for (i=0; i<linklen; ++i) {
+                                               converted_msg[output_length] = ptr[i];
+                                               converted_msg[++output_length] = 0;
+                                       }
+                                       sprintf(&converted_msg[output_length], "\">");
+                                       output_length += 2;
+                                       for (i=0; i<linklen; ++i) {
+                                               converted_msg[output_length] = *ptr++;
+                                               converted_msg[++output_length] = 0;
+                                       }
+                                       sprintf(&converted_msg[output_length], "</A>");
+                                       output_length += 4;
+                               }
+               }
+               else {
+                       /**
+                        * 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 == '<') ++brak;
+                       if (*ptr == '>') --brak;
+                       if (!strncasecmp(ptr, "</A>", 3)) --alevel;
+                       converted_msg[output_length] = *ptr++;
+                       converted_msg[++output_length] = 0;
+               }
+       }
+
+       /**     uncomment these two lines to override conversion        */
+       /**     memcpy(converted_msg, msg, content_length);             */
+       /**     output_length = content_length;                         */
+
+       /** Output our big pile of markup */
+       client_write(converted_msg, output_length);
+
+       /** A little trailing vertical whitespace... */
+       wprintf("<br /><br />\n");
+
+       /** Now give back the memory */
+       free(converted_msg);
+       free(msg);
+}
+
+/*@}*/
diff --git a/webcit/http_datestring.c b/webcit/http_datestring.c
new file mode 100644 (file)
index 0000000..33f5784
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * $Id$
+ */
+/**
+ * \defgroup HTTPDateTime Function to generate HTTP-compliant textual time/date stamp
+ * (This module was lifted directly from the Citadel server source)
+ *
+ * \ingroup WebcitHttpServer
+ */
+/*@{*/
+#include "webcit.h"
+
+/** 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
+       );
+}
+
+
+/*@}*/
diff --git a/webcit/ical_dezonify.c b/webcit/ical_dezonify.c
new file mode 100644 (file)
index 0000000..c2042fd
--- /dev/null
@@ -0,0 +1,171 @@
+/* 
+ * $Id$ 
+ */
+/**
+ * \defgroup IcalDezonify normalize ical dates to UTC
+ * 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.
+ *
+ * \ingroup Calendaring
+ */
+/*@{*/
+
+#include "webcit.h"
+#include "webserver.h"
+
+
+#ifdef WEBCIT_WITH_CALENDAR_SERVICE
+
+
+/**
+ * \brief 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.
+ * \param cal dunno ???
+ * \param rcal dunno ???
+ * \param prop dunno ???
+ */
+void ical_dezonify_backend(icalcomponent *cal,
+                       icalcomponent *rcal,
+                       icalproperty *prop) {
+
+       icaltimezone *t = NULL;
+       icalparameter *param;
+       const char *tzid;
+       struct icaltimetype TheTime;
+
+       /** 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) {
+                       t = icalcomponent_get_timezone(cal, tzid);
+               }
+
+       }
+
+       /** 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;
+       }
+
+       /** Do the conversion. */
+       if (t != NULL) {
+               icaltimezone_convert_time(&TheTime,
+                                       t,
+                                       icaltimezone_get_utc_timezone()
+               );
+       }
+       TheTime.is_utc = 1;
+       icalproperty_remove_parameter_by_kind(prop, ICAL_TZID_PARAMETER);
+
+       /** 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);
+       }
+}
+
+
+/**
+ * \brief Recursive portion of ical_dezonify()
+ * \param cal dunno ???
+ * \param rcal dunno ???
+ */
+void ical_dezonify_recur(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_recur(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);
+               }
+       }
+}
+
+
+/**
+ * \brief Convert all DTSTART and DTEND properties in all subcomponents to UTC.
+ * This function will search any VTIMEZONE subcomponents to learn the
+ * relevant timezone information.
+ * \param cal item to process
+ */
+void ical_dezonify(icalcomponent *cal) {
+       icalcomponent *vt = NULL;
+
+       /** Convert all times to UTC */
+       ical_dezonify_recur(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);
+       }
+
+}
+
+
+#endif /* WEBCIT_WITH_CALENDAR_SERVICE */
+/*@}*/
diff --git a/webcit/iconbar.c b/webcit/iconbar.c
new file mode 100644 (file)
index 0000000..75b32a0
--- /dev/null
@@ -0,0 +1,774 @@
+/*
+ * $Id$
+ */
+/**
+ * \defgroup IconBar Displays and customizes the iconbar.
+ * \ingroup MenuInfrastructure
+ */
+/*@{*/
+#include "webcit.h"
+
+
+/** Values for ib_displayas */
+#define IB_PICTEXT     0 /**< picture and text */
+#define IB_PICONLY     1 /**< just a picture */
+#define IB_TEXTONLY    2 /**< just text */
+
+
+/**
+ * \brief draw the icon bar?????
+ */
+void do_selected_iconbar(void) {
+       if (WC->current_iconbar == current_iconbar_roomlist) {
+               do_iconbar_roomlist();
+       }
+       else {
+               do_iconbar();
+       }
+}
+
+/**
+ * \brief draw the icon bar???
+ */
+void do_iconbar(void) {
+       char iconbar[SIZ];
+       char buf[SIZ];
+       char key[SIZ], value[SIZ];
+       int i;
+
+       WC->current_iconbar = current_iconbar_menu;
+
+       /**
+        * 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.
+        */
+       int ib_displayas = 0;   /**< pictures and text, pictures, text */
+       int ib_logo = 0;        /**< Site logo */
+       int ib_summary = 1;     /**< Summary page icon */
+       int ib_inbox = 1;       /**< Inbox icon */
+       int ib_calendar = 1;    /**< Calendar icon */
+       int ib_contacts = 1;    /**< Contacts icon */
+       int ib_notes = 1;       /**< Notes icon */
+       int ib_tasks = 1;       /**< Tasks icon */
+       int ib_rooms = 1;       /**< Rooms icon */
+       int ib_users = 1;       /**< Users icon */
+       int ib_chat = 1;        /**< Chat icon */
+       int ib_advanced = 1;    /**< Advanced Options icon */
+       int ib_citadel = 1;     /**< 'Powered by Citadel' logo */
+       /*
+        */
+
+       get_preference("iconbar", iconbar, sizeof iconbar);
+       for (i=0; i<num_tokens(iconbar, ','); ++i) {
+               extract_token(buf, iconbar, i, ',', sizeof buf);
+               extract_token(key, buf, 0, '=', sizeof key);
+               extract_token(value, buf, 1, '=', sizeof value);
+
+               if (!strcasecmp(key, "ib_displayas")) ib_displayas = atoi(value);
+               if (!strcasecmp(key, "ib_logo")) ib_logo = atoi(value);
+               if (!strcasecmp(key, "ib_summary")) ib_summary = atoi(value);
+               if (!strcasecmp(key, "ib_inbox")) ib_inbox = atoi(value);
+               if (!strcasecmp(key, "ib_calendar")) ib_calendar = atoi(value);
+               if (!strcasecmp(key, "ib_contacts")) ib_contacts = atoi(value);
+               if (!strcasecmp(key, "ib_notes")) ib_notes = atoi(value);
+               if (!strcasecmp(key, "ib_tasks")) ib_tasks = atoi(value);
+               if (!strcasecmp(key, "ib_rooms")) ib_rooms = atoi(value);
+               if (!strcasecmp(key, "ib_users")) ib_users = atoi(value);
+               if (!strcasecmp(key, "ib_chat")) ib_chat = atoi(value);
+               if (!strcasecmp(key, "ib_advanced")) ib_advanced = atoi(value);
+               if (!strcasecmp(key, "ib_citadel")) ib_citadel = atoi(value);
+       }
+
+       wprintf("<div id=\"button\">\n"
+               "<ul>\n"
+       );
+
+       if (ib_logo) {
+               wprintf("<li>");
+               if (ib_displayas != IB_TEXTONLY) {
+                       wprintf("<IMG BORDER=\"0\" WIDTH=\"120\" "
+                               "src=\"image&name=hello\" ALT=\"&nbsp;\">\n"
+                       );
+               }
+               wprintf("</li>\n");
+       }
+
+       if (ib_citadel) if (ib_displayas != IB_TEXTONLY) wprintf(
+               "<li><div align=\"center\">"
+               "<a href=\"http://www.citadel.org\" "
+               "title=\"%s\" target=\"aboutcit\">"
+               "<img border=\"0\" "
+               "src=\"static/citadel-logo.gif\" ALT=\"%s\"></a>"
+               "</div></li>\n",
+               _("Find out more about Citadel"),
+               _("CITADEL")
+       );
+
+       wprintf("<li><div align=\"center\"><a href=\"javascript:switch_to_room_list()\">");
+       wprintf(_("switch to room list"));
+       wprintf("</a></div>");
+
+       if (ib_summary) {
+               wprintf("<li><a href=\"summary\" "
+                       "TITLE=\"%s\" "
+                       ">", _("Your summary page")
+               );
+               if (ib_displayas != IB_TEXTONLY) {
+                       wprintf("<IMG BORDER=\"0\" WIDTH=\"32\" HEIGHT=\"32\" "
+                               "src=\"static/summscreen_32x.gif\">");
+               }
+               if (ib_displayas != IB_PICONLY) {
+                       wprintf(_("Summary"));
+               }
+               wprintf("</A></li>\n");
+       }
+
+       if (ib_inbox) {
+               wprintf("<li>"
+                       "<a href=\"dotgoto?room=_MAIL_\" "
+                       "TITLE=\"%s\" "
+                       ">",
+                       _("Go to your email inbox")
+               );
+               if (ib_displayas != IB_TEXTONLY) {
+                       wprintf("<IMG BORDER=\"0\" WIDTH=\"32\" HEIGHT=\"32\" "
+                               "src=\"static/privatemess_32x.gif\">");
+               }
+               if (ib_displayas != IB_PICONLY) {
+                       wprintf(_("Mail"));
+                       if (WC->new_mail != WC->remember_new_mail) {
+/*
+                               if (WC->new_mail > 0) {
+                                       wprintf(" <b>(%d)</b>", WC->new_mail);
+                               }
+*/
+                               WC->remember_new_mail = WC->new_mail;
+                       }
+               }
+               wprintf("</A></li>\n");
+       }
+
+       if (ib_calendar) {
+               wprintf("<li>"
+                       "<a href=\"dotgoto?room=_CALENDAR_\" "
+                       "TITLE=\"%s\" "
+                       ">",
+                       _("Go to your personal calendar")
+               );
+               if (ib_displayas != IB_TEXTONLY) {
+                       wprintf("<IMG BORDER=\"0\" WIDTH=\"32\" HEIGHT=\"32\" "
+                       "src=\"static/calarea_32x.gif\">");
+               }
+               if (ib_displayas != IB_PICONLY) {
+                       wprintf(_("Calendar"));
+               }
+               wprintf("</A></li>\n");
+       }
+
+       if (ib_contacts) {
+               wprintf("<li>"
+                       "<a href=\"dotgoto?room=_CONTACTS_\" "
+                       "TITLE=\"%s\" "
+                       ">",
+                       _("Go to your personal address book")
+               );
+               if (ib_displayas != IB_TEXTONLY) {
+                       wprintf("<IMG BORDER=\"0\" WIDTH=\"32\" HEIGHT=\"32\" "
+                       "src=\"static/viewcontacts_32x.gif\">");
+               }
+               if (ib_displayas != IB_PICONLY) {
+                       wprintf(_("Contacts"));
+               }
+               wprintf("</A></li>\n");
+       }
+
+       if (ib_notes) {
+               wprintf("<li>"
+                       "<a href=\"dotgoto?room=_NOTES_\" "
+                       "TITLE=\"%s\" "
+                       ">",
+                       _("Go to your personal notes")
+               );
+               if (ib_displayas != IB_TEXTONLY) {
+                       wprintf("<IMG BORDER=\"0\" WIDTH=\"32\" HEIGHT=\"32\" "
+                       "src=\"static/storenotes_32x.gif\">");
+               }
+               if (ib_displayas != IB_PICONLY) {
+                       wprintf(_("Notes"));
+               }
+               wprintf("</A></li>\n");
+       }
+
+       if (ib_tasks)  {
+               wprintf("<li>"
+                       "<a href=\"dotgoto?room=_TASKS_\" "
+                       "TITLE=\"%s\" "
+                       ">",
+                       _("Go to your personal task list")
+               );
+               if (ib_displayas != IB_TEXTONLY) {
+                       wprintf("<IMG BORDER=\"0\" WIDTH=\"32\" HEIGHT=\"32\" "
+                       "src=\"static/taskmanag_32x.gif\">");
+               }
+               if (ib_displayas != IB_PICONLY) {
+                       wprintf(_("Tasks"));
+               }
+               wprintf("</A></li>\n");
+       }
+
+       if (ib_rooms) {
+               wprintf("<li>"
+                       "<a href=\"knrooms\" TITLE=\"%s\" >",
+                       _("List all of your accessible rooms")
+               );
+               if (ib_displayas != IB_TEXTONLY) {
+                       wprintf("<IMG BORDER=\"0\" WIDTH=\"32\" HEIGHT=\"32\" "
+                       "src=\"static/chatrooms_32x.gif\">");
+               }
+               if (ib_displayas != IB_PICONLY) {
+                       wprintf(_("Rooms"));
+               }
+               wprintf("</A></li>\n");
+       }
+
+       if (ib_users) {
+               wprintf("<li>"
+                       "<a href=\"who\" TITLE=\"%s\" "
+                       ">",
+                       _("See who is online right now")
+               );
+               if (ib_displayas != IB_TEXTONLY) {
+                       wprintf("<IMG BORDER=\"0\" WIDTH=\"32\" HEIGHT=\"32\" "
+                       "src=\"static/usermanag_32x.gif\">");
+               }
+               if (ib_displayas != IB_PICONLY) {
+                       wprintf(_("Who is online?"));
+               }
+               wprintf("</A></li>\n");
+       }
+
+       if (ib_chat) {
+               wprintf("<li>"
+                       "<a href=\"#\" onClick=\"window.open('chat', "
+                       "'ctdl_chat_window', "
+                       "'toolbar=no,location=no,directories=no,copyhistory=no,"
+                       "status=no,scrollbars=yes,resizable=yes');\""
+                       ">"
+               );
+               if (ib_displayas != IB_TEXTONLY) {
+                       wprintf("<IMG BORDER=\"0\" WIDTH=\"32\" HEIGHT=\"32\" "
+                       "src=\"static/citadelchat_32x.gif\">");
+               }
+               if (ib_displayas != IB_PICONLY) {
+                       wprintf(_("Chat"));
+               }
+               wprintf("</A></li>\n");
+       }
+
+       if (ib_advanced) {
+               wprintf("<li>"
+                       "<a href=\"display_main_menu\" "
+                       "TITLE=\"%s\" "
+                       ">",
+                       _("Advanced Options Menu: Advanced Room commands, Account Info, and Chat")
+               );
+               if (ib_displayas != IB_TEXTONLY) {
+                       wprintf("<IMG BORDER=\"0\" WIDTH=\"32\" HEIGHT=\"32\" "
+                       "src=\"static/advanpage2_32x.gif\">");
+               }
+               if (ib_displayas != IB_PICONLY) {
+                       wprintf(_("Advanced"));
+               }
+               wprintf("</A></li>\n");
+       }
+
+       if ((WC->axlevel >= 6) || (WC->is_room_aide)) {
+               wprintf("<li>"
+                       "<a href=\"display_aide_menu\" "
+                       "TITLE=\"%s\" "
+                       ">",
+                       _("Room and system administration functions")
+               );
+               if (ib_displayas != IB_TEXTONLY) {
+                       wprintf("<IMG BORDER=\"0\" WIDTH=\"32\" HEIGHT=\"32\" "
+                       "src=\"static/advanpage2_32x.gif\">");
+               }
+               if (ib_displayas != IB_PICONLY) {
+                       wprintf(_("Administration"));
+               }
+               wprintf("</A></li>\n");
+       }
+
+       wprintf("<li>"
+               "<a href=\"termquit\" TITLE=\"%s\" "
+               "onClick=\"return confirm('%s');\">",
+               _("Log off"),
+               _("Log off now?")
+               
+       );
+       if (ib_displayas != IB_TEXTONLY) {
+       wprintf("<IMG BORDER=\"0\" WIDTH=\"32\" HEIGHT=\"32\" "
+               "src=\"static/logoff_32x.gif\">");
+       }
+       if (ib_displayas != IB_PICONLY) {
+               wprintf(_("Log off"));
+       }
+       wprintf("</A></li>\n");
+
+       wprintf(
+               "<li><div align=\"center\">"
+               "<a href=\"display_customize_iconbar\" "
+               "TITLE=\"%s\" "
+               ">%s"
+               "</A></div></li>\n",
+               _("Customize this menu"),
+               _("customize this menu")
+       );
+
+       wprintf("</ul></div>\n");
+}
+
+
+/**
+ * \brief roomtree view of the iconbar
+ * If the user has toggled the icon bar over to a room list, here's where
+ * we generate its innerHTML...
+ */
+void do_iconbar_roomlist(void) {
+       char iconbar[SIZ];
+       char buf[SIZ];
+       char key[SIZ], value[SIZ];
+       int i;
+
+       WC->current_iconbar = current_iconbar_roomlist;
+
+       /**
+        * 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.
+        */
+       int ib_displayas = 0;   /* pictures and text, pictures, text */
+       int ib_logo = 0;        /* Site logo */
+       int ib_citadel = 1;     /* 'Powered by Citadel' logo */
+       /*
+        */
+
+       get_preference("iconbar", iconbar, sizeof iconbar);
+       for (i=0; i<num_tokens(iconbar, ','); ++i) {
+               extract_token(buf, iconbar, i, ',', sizeof buf);
+               extract_token(key, buf, 0, '=', sizeof key);
+               extract_token(value, buf, 1, '=', sizeof value);
+
+               if (!strcasecmp(key, "ib_displayas")) ib_displayas = atoi(value);
+               if (!strcasecmp(key, "ib_logo")) ib_logo = atoi(value);
+               if (!strcasecmp(key, "ib_citadel")) ib_citadel = atoi(value);
+       }
+
+       wprintf("<div id=\"button\">\n"
+               "<ul>\n"
+       );
+
+       if (ib_logo) {
+               wprintf("<li>");
+               if (ib_displayas != IB_TEXTONLY) {
+                       wprintf("<IMG BORDER=\"0\" WIDTH=\"120\" "
+                               "src=\"image&name=hello\" ALT=\"&nbsp;\">\n"
+                       );
+               }
+               wprintf("</li>\n");
+       }
+
+       if (ib_citadel) if (ib_displayas != IB_TEXTONLY) wprintf(
+               "<li><div align=\"center\">"
+               "<a href=\"http://www.citadel.org\" "
+               "title=\"%s\" target=\"aboutcit\">"
+               "<img border=\"0\" "
+               "src=\"static/citadel-logo.gif\" ALT=\"%s\"></a>"
+               "</div></li>\n",
+               _("Find out more about Citadel"),
+               _("CITADEL")
+       );
+
+       wprintf("<li><div align=\"center\"><a href=\"javascript:switch_to_menu_buttons()\">");
+       wprintf(_("switch to menu"));
+       wprintf("</a></div>");
+
+       wprintf("<li>"
+               "<a href=\"termquit\" TITLE=\"%s\" "
+               "onClick=\"return confirm('%s');\">",
+               _("Log off"),
+               _("Log off now?")
+               
+       );
+       if (ib_displayas != IB_TEXTONLY) {
+       wprintf("<IMG BORDER=\"0\" WIDTH=\"32\" HEIGHT=\"32\" "
+               "src=\"static/logoff_32x.gif\">");
+       }
+       if (ib_displayas != IB_PICONLY) {
+               wprintf(_("Log off"));
+       }
+       wprintf("</A></li>\n");
+
+       wprintf("</ul></div>\n");
+
+       /** embed the room list */
+       list_all_rooms_by_floor("iconbar");
+
+       wprintf("</div>\n");
+}
+
+
+/**
+ * \brief display a customized version of the iconbar
+ */
+void display_customize_iconbar(void) {
+       char iconbar[SIZ];
+       char buf[SIZ];
+       char key[SIZ], value[SIZ];
+       int i;
+       int bar = 0;
+
+       /**
+        * 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.
+        */
+       int ib_displayas = IB_PICTEXT;  /**< pictures and text, pictures, text */
+       int ib_logo = 0;        /**< Site logo */
+       int ib_summary = 1;     /**< Summary page icon */
+       int ib_inbox = 1;       /**< Inbox icon */
+       int ib_calendar = 1;    /**< Calendar icon */
+       int ib_contacts = 1;    /**< Contacts icon */
+       int ib_notes = 1;       /**< Notes icon */
+       int ib_tasks = 1;       /**< Tasks icon */
+       int ib_rooms = 1;       /**< Rooms icon */
+       int ib_users = 1;       /**< Users icon */
+       int ib_chat = 1;        /**< Chat icon */
+       int ib_advanced = 1;    /**< Advanced Options icon */
+       int ib_citadel = 1;     /**< 'Powered by Citadel' logo */
+       /*
+        */
+
+       get_preference("iconbar", iconbar, sizeof iconbar);
+       for (i=0; i<num_tokens(iconbar, ','); ++i) {
+               extract_token(buf, iconbar, i, ',', sizeof buf);
+               extract_token(key, buf, 0, '=', sizeof key);
+               extract_token(value, buf, 1, '=', sizeof value);
+
+               if (!strcasecmp(key, "ib_displayas")) ib_displayas = atoi(value);
+               if (!strcasecmp(key, "ib_logo")) ib_logo = atoi(value);
+               if (!strcasecmp(key, "ib_summary")) ib_summary = atoi(value);
+               if (!strcasecmp(key, "ib_inbox")) ib_inbox = atoi(value);
+               if (!strcasecmp(key, "ib_calendar")) ib_calendar = atoi(value);
+               if (!strcasecmp(key, "ib_contacts")) ib_contacts = atoi(value);
+               if (!strcasecmp(key, "ib_notes")) ib_notes = atoi(value);
+               if (!strcasecmp(key, "ib_tasks")) ib_tasks = atoi(value);
+               if (!strcasecmp(key, "ib_rooms")) ib_rooms = atoi(value);
+               if (!strcasecmp(key, "ib_users")) ib_users = atoi(value);
+               if (!strcasecmp(key, "ib_chat")) ib_chat = atoi(value);
+               if (!strcasecmp(key, "ib_advanced")) ib_advanced = atoi(value);
+               if (!strcasecmp(key, "ib_citadel")) ib_citadel = atoi(value);
+       }
+
+       output_headers(1, 1, 2, 0, 0, 0);
+       wprintf("<div id=\"banner\">\n"
+               "<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>"
+               "<SPAN CLASS=\"titlebar\">");
+       wprintf(_("Customize the icon bar"));
+       wprintf("</SPAN>"
+               "</TD></TR></TABLE>\n"
+               "</div>\n<div id=\"content\">\n"
+       );
+
+       wprintf("<div class=\"fix_scrollbar_bug\">"
+               "<table border=0 width=100%% bgcolor=\"#ffffff\"><tr><td>");
+
+       wprintf("<FORM METHOD=\"POST\" action=\"commit_iconbar\">\n");
+
+       wprintf("<CENTER>");
+       wprintf(_("Display icons as:"));
+       wprintf(" ");
+       for (i=0; i<=2; ++i) {
+               wprintf("<INPUT TYPE=\"radio\" NAME=\"ib_displayas\" VALUE=\"%d\"", i);
+               if (ib_displayas == i) wprintf(" CHECKED");
+               wprintf(">");
+               if (i == IB_PICTEXT)    wprintf(_("pictures and text"));
+               if (i == IB_PICONLY)    wprintf(_("pictures only"));
+               if (i == IB_TEXTONLY)   wprintf(_("text only"));
+               wprintf("\n");
+       }
+       wprintf("<br /><br />\n");
+
+       wprintf(_("Select the icons you would like to see displayed "
+               "in the 'icon bar' menu on the left side of the "
+               "screen."));
+       wprintf("</CENTER><br />\n");
+
+       wprintf("<TABLE border=0 cellspacing=0 cellpadding=3 width=100%%>\n");
+
+       wprintf("<TR BGCOLOR=%s><TD>"
+               "<INPUT TYPE=\"checkbox\" NAME=\"ib_logo\" VALUE=\"yes\" %s>"
+               "</TD><TD>"
+               "<IMG BORDER=\"0\" WIDTH=\"48\" "
+               "src=\"image&name=hello\" ALT=\"&nbsp;\">"
+               "</TD><TD>"
+               "<B>%s</B><br />"
+               "%s"
+               "</TD></TR>\n",
+               ((bar = 1 - bar), (bar ? "\"#CCCCCC\"" : "\"#FFFFFF\"")),
+               (ib_logo ? "CHECKED" : ""),
+               _("Site logo"),
+               _("An icon describing this site")
+       );
+
+       wprintf("<TR bgcolor=%s><TD>"
+               "<INPUT TYPE=\"checkbox\" NAME=\"ib_summary\" VALUE=\"yes\" %s>"
+               "</TD><TD>"
+               "<IMG BORDER=\"0\" WIDTH=\"48\" HEIGHT=\"48\" "
+               "src=\"static/summscreen_48x.gif\" ALT=\"&nbsp;\">"
+               "</TD><TD>"
+               "<B>%s</B><br />"
+               "%s"
+               "</TD></TR>\n",
+               ((bar = 1 - bar), (bar ? "\"#CCCCCC\"" : "\"#FFFFFF\"")),
+               (ib_summary ? "CHECKED" : ""),
+               _("Summary"),
+               _("Your summary page")
+       );
+
+       wprintf("<TR bgcolor=%s><TD>"
+               "<INPUT TYPE=\"checkbox\" NAME=\"ib_inbox\" VALUE=\"yes\" %s>"
+               "</TD><TD>"
+               "<IMG BORDER=\"0\" WIDTH=\"48\" HEIGHT=\"48\" "
+               "src=\"static/privatemess_48x.gif\" ALT=\"&nbsp;\">"
+               "</TD><TD>"
+               "<B>%s</B><br />"
+               "%s"
+               "</TD></TR>\n",
+               ((bar = 1 - bar), (bar ? "\"#CCCCCC\"" : "\"#FFFFFF\"")),
+               (ib_inbox ? "CHECKED" : ""),
+               _("Mail (inbox)"),
+               _("A shortcut to your email Inbox")
+       );
+
+       wprintf("<TR bgcolor=%s><TD>"
+               "<INPUT TYPE=\"checkbox\" NAME=\"ib_contacts\" "
+               "VALUE=\"yes\" %s>"
+               "</TD><TD>"
+               "<IMG BORDER=\"0\" WIDTH=\"48\" HEIGHT=\"48\" "
+               "src=\"static/viewcontacts_48x.gif\" ALT=\"&nbsp;\">"
+               "</TD><TD>"
+               "<B>%s</B><br />"
+               "%s"
+               "</TD></TR>\n",
+               ((bar = 1 - bar), (bar ? "\"#CCCCCC\"" : "\"#FFFFFF\"")),
+               (ib_contacts ? "CHECKED" : ""),
+               _("Contacts"),
+               _("Your personal address book")
+       );
+
+       wprintf("<TR bgcolor=%s><TD>"
+               "<INPUT TYPE=\"checkbox\" NAME=\"ib_notes\" "
+               "VALUE=\"yes\" %s>"
+               "</TD><TD>"
+               "<IMG BORDER=\"0\" WIDTH=\"48\" HEIGHT=\"48\" "
+               "src=\"static/storenotes_48x.gif\" ALT=\"&nbsp;\">"
+               "</TD><TD>"
+               "<B>%s</B><br />"
+               "%s"
+               "</TD></TR>\n",
+               ((bar = 1 - bar), (bar ? "\"#CCCCCC\"" : "\"#FFFFFF\"")),
+               (ib_notes ? "CHECKED" : ""),
+               _("Notes"),
+               _("Your personal notes")
+       );
+
+#ifdef WEBCIT_WITH_CALENDAR_SERVICE
+       wprintf("<TR bgcolor=%s><TD>"
+               "<INPUT TYPE=\"checkbox\" NAME=\"ib_calendar\" "
+               "VALUE=\"yes\" %s>"
+               "</TD><TD>"
+               "<IMG BORDER=\"0\" WIDTH=\"48\" HEIGHT=\"48\" "
+               "src=\"static/calarea_48x.gif\" ALT=\"&nbsp;\">"
+               "</TD><TD>"
+               "<B>%s</B><br />"
+               "%s"
+               "</TD></TR>\n",
+               ((bar = 1 - bar), (bar ? "\"#CCCCCC\"" : "\"#FFFFFF\"")),
+               (ib_calendar ? "CHECKED" : ""),
+               _("Calendar"),
+               _("A shortcut to your personal calendar")
+       );
+
+       wprintf("<TR bgcolor=%s><TD>"
+               "<INPUT TYPE=\"checkbox\" NAME=\"ib_tasks\" VALUE=\"yes\" %s>"
+               "</TD><TD>"
+               "<IMG BORDER=\"0\" WIDTH=\"48\" HEIGHT=\"48\" "
+               "src=\"static/taskmanag_48x.gif\" ALT=\"&nbsp;\">"
+               "</TD><TD>"
+               "<B>%s</B><br />"
+               "%s"
+               "</TD></TR>\n",
+               ((bar = 1 - bar), (bar ? "\"#CCCCCC\"" : "\"#FFFFFF\"")),
+               (ib_tasks ? "CHECKED" : ""),
+               _("Tasks"),
+               _("A shortcut to your personal task list")
+       );
+#endif /* WEBCIT_WITH_CALENDAR_SERVICE */
+
+       wprintf("<TR bgcolor=%s><TD>"
+               "<INPUT TYPE=\"checkbox\" NAME=\"ib_rooms\" VALUE=\"yes\" %s>"
+               "</TD><TD>"
+               "<IMG BORDER=\"0\" WIDTH=\"48\" HEIGHT=\"48\" "
+               "src=\"static/chatrooms_48x.gif\" ALT=\"&nbsp;\">"
+               "</TD><TD>"
+               "<B>%s</B><br />"
+               "%s"
+               "</TD></TR>\n",
+               ((bar = 1 - bar), (bar ? "\"#CCCCCC\"" : "\"#FFFFFF\"")),
+               (ib_rooms ? "CHECKED" : ""),
+               _("Rooms"),
+               _("Clicking this icon displays a list of all accessible "
+               "rooms (or folders) available.")
+       );
+
+       wprintf("<TR bgcolor=%s><TD>"
+               "<INPUT TYPE=\"checkbox\" NAME=\"ib_users\" VALUE=\"yes\" %s>"
+               "</TD><TD>"
+               "<IMG BORDER=\"0\" WIDTH=\"48\" HEIGHT=\"48\" "
+               "src=\"static/usermanag_48x.gif\" ALT=\"&nbsp;\">"
+               "</TD><TD>"
+               "<B>%s</B><br />"
+               "%s"
+               "</TD></TR>\n",
+               ((bar = 1 - bar), (bar ? "\"#CCCCCC\"" : "\"#FFFFFF\"")),
+               (ib_users ? "CHECKED" : ""),
+               _("Who is online?"),
+               _("Clicking this icon displays a list of all users "
+               "currently logged in.")
+       );
+
+       wprintf("<TR bgcolor=%s><TD>"
+               "<INPUT TYPE=\"checkbox\" NAME=\"ib_chat\" VALUE=\"yes\" %s>"
+               "</TD><TD>"
+               "<IMG BORDER=\"0\" WIDTH=\"48\" HEIGHT=\"48\" "
+               "src=\"static/citadelchat_48x.gif\" ALT=\"&nbsp;\">"
+               "</TD><TD>"
+               "<B>%s</B><br />"
+               "%s"
+               "</TD></TR>\n",
+               ((bar = 1 - bar), (bar ? "\"#CCCCCC\"" : "\"#FFFFFF\"")),
+               (ib_chat ? "CHECKED" : ""),
+               _("Chat"),
+               _("Clicking this icon enters real-time chat mode "
+               "with other users in the same room.")
+               
+       );
+
+       wprintf("<TR bgcolor=%s><TD>"
+               "<INPUT TYPE=\"checkbox\" NAME=\"ib_advanced\" "
+               "VALUE=\"yes\" %s>"
+               "</TD><TD>"
+               "<IMG BORDER=\"0\" WIDTH=\"48\" HEIGHT=\"48\" "
+               "src=\"static/advanpage2_48x.gif\" ALT=\"&nbsp;\">"
+               "</TD><TD>"
+               "<B>%s</B><br />"
+               "%s"
+               "</TD></TR>\n",
+               ((bar = 1 - bar), (bar ? "\"#CCCCCC\"" : "\"#FFFFFF\"")),
+               (ib_advanced ? "CHECKED" : ""),
+               _("Advanced options"),
+               _("Access to the complete menu of Citadel functions.")
+
+       );
+
+       wprintf("<TR bgcolor=%s><TD>"
+               "<INPUT TYPE=\"checkbox\" NAME=\"ib_citadel\" "
+               "VALUE=\"yes\" %s>"
+               "</TD><TD>"
+               "<IMG BORDER=\"0\" WIDTH=\"48\" HEIGHT=\"48\" "
+               "src=\"static/citadel-logo.gif\" ALT=\"&nbsp;\">"
+               "</TD><TD>"
+               "<B>%s</B><br />"
+               "%s"
+               "</TD></TR>\n",
+               ((bar = 1 - bar), (bar ? "\"#CCCCCC\"" : "\"#FFFFFF\"")),
+               (ib_citadel ? "CHECKED" : ""),
+               _("Citadel logo"),
+               _("Displays the 'Powered by Citadel' icon")
+       );
+
+       wprintf("</TABLE><br />\n"
+               "<CENTER>"
+               "<INPUT TYPE=\"submit\" NAME=\"ok_button\" VALUE=\"%s\">"
+               "&nbsp;"
+               "<INPUT TYPE=\"submit\" NAME=\"cancel_button\" VALUE=\"%s\">"
+               "</CENTER></FORM>\n",
+               _("Save changes"),
+               _("Cancel")
+       );
+
+       wprintf("</td></tr></table></div>\n");
+       wDumpContent(2);
+}
+
+/**
+ * \brief commit the changes of an edited iconbar ????
+ */
+void commit_iconbar(void) {
+       char iconbar[SIZ];
+       int i;
+
+       char *boxen[] = {
+               "ib_logo",
+               "ib_summary",
+               "ib_inbox",
+               "ib_calendar",
+               "ib_contacts",
+               "ib_notes",
+               "ib_tasks",
+               "ib_rooms",
+               "ib_users",
+               "ib_chat",
+               "ib_advanced",
+               "ib_logoff",
+               "ib_citadel"
+       };
+
+       if (strlen(bstr("ok_button")) == 0) {
+               display_main_menu();
+               return;
+       }
+
+       sprintf(iconbar, "ib_displayas=%d", atoi(bstr("ib_displayas")));
+
+       for (i=0; i<(sizeof(boxen)/sizeof(char *)); ++i) {
+               sprintf(&iconbar[strlen(iconbar)], ",%s=", boxen[i]);
+               if (!strcasecmp(bstr(boxen[i]), "yes")) {
+                       sprintf(&iconbar[strlen(iconbar)], "1");
+               }
+               else {
+                       sprintf(&iconbar[strlen(iconbar)], "0");
+               }
+       }
+
+       set_preference("iconbar", iconbar, 1);
+
+       output_headers(1, 1, 0, 0, 0, 0);
+       wprintf(
+               "<center><table border=1 bgcolor=\"#ffffff\"><tr><td>"
+               "<img src=\"static/advanpage2_48x.gif\">"
+               "&nbsp;");
+       wprintf(_("Your icon bar has been updated.  Please select any of its "
+               "choices to continue."));
+       wprintf("</td></tr></table>\n");
+       wDumpContent(2);
+}
+
+
+
+/*@}*/
diff --git a/webcit/inetconf.c b/webcit/inetconf.c
new file mode 100644 (file)
index 0000000..85f9815
--- /dev/null
@@ -0,0 +1,202 @@
+/* 
+ * $Id$
+ */
+/**
+ * \defgroup InetCfg Functions which handle Internet domain configuration etc.
+ * \ingroup CitadelConfig
+ */
+/*@{*/
+#include "webcit.h"
+
+
+/**
+ * \brief display the inet config dialog 
+ */
+void display_inetconf(void)
+{
+       char buf[SIZ];
+       char ename[SIZ];
+       char etype[SIZ];
+       int i;
+       int which;
+
+       enum {
+               ic_localhost,
+               ic_directory,
+               ic_gwdom,
+               ic_smarthost,
+               ic_rbl,
+               ic_spamass,
+               ic_max
+       };
+       char *ic_spec[ic_max];
+       char *ic_misc;
+       char *ic_keyword[ic_max];
+       char *ic_boxtitle[ic_max];
+       char *ic_desc[ic_max];
+
+       ic_keyword[0] = _("localhost");
+       ic_keyword[1] = _("directory");
+       ic_keyword[2] = _("gatewaydomain");
+       ic_keyword[3] = _("smarthost");
+       ic_keyword[4] = _("rbl");
+       ic_keyword[5] = _("spamassassin");
+
+       ic_boxtitle[0] = _("Local host aliases");
+       ic_boxtitle[1] = _("Directory domains");
+       ic_boxtitle[2] = _("Gateway domains");
+       ic_boxtitle[3] = _("Smart hosts");
+       ic_boxtitle[4] = _("RBL hosts");
+       ic_boxtitle[5] = _("SpamAssassin hosts");
+
+       ic_desc[0] = _("(domains for which this host receives mail)");
+       ic_desc[1] = _("(domains mapped with the Global Address Book)");
+       ic_desc[2] = _("(domains whose subdomains match Citadel hosts)");
+       ic_desc[3] = _("(if present, forward all outbound mail to one of these hosts)");
+       ic_desc[4] = _("(hosts running a Realtime Blackhole List)");
+       ic_desc[5] = _("(hosts running the SpamAssassin service)");
+
+       for (i=0; i<ic_max; ++i) {
+               ic_spec[i] = strdup("");
+       }
+       ic_misc = strdup("");
+
+       serv_printf("CONF GETSYS|application/x-citadel-internet-config");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '1') while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+
+               extract_token(ename, buf, 0, '|', sizeof ename);
+               extract_token(etype, buf, 1, '|', sizeof etype);
+               which = (-1);
+               for (i=0; i<ic_max; ++i) {
+                       if (!strcasecmp(etype, ic_keyword[i])) {
+                               which = i;
+                       }
+               }
+
+               if (which >= 0) {
+                       ic_spec[which] = realloc(ic_spec[which], strlen(ic_spec[which]) + strlen(ename) + 2);
+                       if (strlen(ic_spec[which]) > 0) strcat(ic_spec[which], "\n");
+                       strcat(ic_spec[which], ename);
+               }
+               else {
+                       ic_misc = realloc(ic_misc, strlen(ic_misc) + strlen(buf) + 2);
+                       if (strlen(ic_misc) > 0) strcat(ic_misc, "\n");
+                       strcat(ic_misc, buf);
+               }
+
+       }
+
+       output_headers(1, 1, 2, 0, 0, 0);
+       wprintf("<div id=\"banner\">\n");
+       wprintf("<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>");
+       wprintf("<SPAN CLASS=\"titlebar\">");
+       wprintf(_("Internet configuration"));
+       wprintf("</SPAN>\n");
+       wprintf("</TD></TR></TABLE>\n");
+       wprintf("</div>\n<div id=\"content\">\n");
+
+       wprintf("<div class=\"fix_scrollbar_bug\">"
+               "<table border=0 width=100%%><tr><td valign=top>\n");
+       for (which=0; which<ic_max; ++which) {
+               if (which == (ic_max / 2)) {
+                       wprintf("</TD><TD VALIGN=TOP>");
+               }
+               svprintf("BOXTITLE", WCS_STRING, ic_boxtitle[which]);
+               do_template("beginbox");
+               wprintf("<span class=\"menudesc\">");
+               escputs(ic_desc[which]);
+               wprintf("</span><br />");
+               wprintf("<TABLE border=0 cellspacing=0 cellpadding=0 width=100%%>\n");
+               if (strlen(ic_spec[which]) > 0) {
+                       for (i=0; i<num_tokens(ic_spec[which], '\n'); ++i) {
+                               wprintf("<TR><TD ALIGN=LEFT>");
+                               extract_token(buf, ic_spec[which], i, '\n', sizeof buf);
+                               escputs(buf);
+                               wprintf("</TD><TD ALIGN=RIGHT>"
+                                       "<a href=\"save_inetconf?oper=delete&ename=");
+                               escputs(buf);
+                               wprintf("&etype=%s\" ", ic_keyword[which]);
+                               wprintf("onClick=\"return confirm('%s');\">",
+                                       _("Delete this entry?"));
+                               wprintf("<font size=-1>");
+                               wprintf(_("(Delete)"));
+                               wprintf("</font></a></TD></TR>\n");
+                       }
+               }
+               wprintf("<FORM METHOD=\"POST\" action=\"save_inetconf\">\n"
+                       "<TR><TD>"
+                       "<INPUT TYPE=\"text\" NAME=\"ename\" MAXLENGTH=\"64\">"
+                       "<INPUT TYPE=\"hidden\" NAME=\"etype\" VALUE=\"%s\">", ic_keyword[which]);
+               wprintf("</TD><TD ALIGN=RIGHT>"
+                       "<INPUT TYPE=\"submit\" NAME=\"oper\" VALUE=\"Add\">"
+                       "</TD></TR></TABLE></FORM>\n");
+               do_template("endbox");
+       }
+       wprintf("</td></tr></table></div>\n");
+       wDumpContent(1);
+
+       for (i=0; i<ic_max; ++i) {
+               free(ic_spec[i]);
+       }
+       free(ic_misc);
+}
+
+
+/**
+ * \brief save changes to the inet config
+ */
+void save_inetconf(void) {
+       char *buf;
+       char *ename;
+       char *etype;
+       char *newconfig;
+
+       buf = malloc(SIZ);
+       ename = malloc(SIZ);
+       etype = malloc(SIZ);
+       newconfig = malloc(65536);
+
+       strcpy(newconfig, "");
+       serv_printf("CONF GETSYS|application/x-citadel-internet-config");
+       serv_getln(buf, SIZ);
+       if (buf[0] == '1') while (serv_getln(buf, SIZ), strcmp(buf, "000")) {
+               extract_token(ename, buf, 0, '|', SIZ);
+               extract_token(etype, buf, 1, '|', SIZ);
+               if (strlen(buf) == 0) {
+                       /** skip blank lines */
+               }
+               else if ((!strcasecmp(ename, bstr("ename")))
+                  &&   (!strcasecmp(etype, bstr("etype")))
+                  &&   (!strcasecmp(bstr("oper"), "delete"))
+               ) {
+                       sprintf(WC->ImportantMessage, _("%s has been deleted."), ename);
+               }
+               else {
+                       if (strlen(newconfig) > 0) strcat(newconfig, "\n");
+                       strcat(newconfig, buf);
+               }
+       }
+
+       serv_printf("CONF PUTSYS|application/x-citadel-internet-config");
+       serv_getln(buf, SIZ);
+       if (buf[0] == '4') {
+               serv_puts(newconfig);
+               if (!strcasecmp(bstr("oper"), "add")) {
+                       serv_printf("%s|%s", bstr("ename"), bstr("etype") );
+                       sprintf(WC->ImportantMessage, "%s added.", bstr("ename"));
+               }
+               serv_puts("000");
+       }
+       
+       display_inetconf();
+
+       free(buf);
+       free(ename);
+       free(etype);
+       free(newconfig);
+}
+
+
+
+/*@}*/
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/listsub.c b/webcit/listsub.c
new file mode 100644 (file)
index 0000000..3f7e9cf
--- /dev/null
@@ -0,0 +1,234 @@
+/*
+ * $Id$
+ */
+/**
+ * \defgroup ListSubForms Web forms for handling mailing list subscribe/unsubscribe requests.
+ * \ingroup WebcitDisplayItems
+ */
+
+/*@{*/
+#include "webcit.h"
+
+
+
+/**
+ * \brief List subscription handling
+ */
+void do_listsub(void)
+{
+       char cmd[256];
+       char room[256];
+       char token[256];
+       char email[256];
+       char subtype[256];
+       char escaped_email[256];
+       char escaped_room[256];
+
+       char buf[SIZ];
+       int self;
+       char sroom[SIZ];
+
+       strcpy(WC->wc_fullname, "");
+       strcpy(WC->wc_username, "");
+       strcpy(WC->wc_password, "");
+       strcpy(WC->wc_roomname, "");
+
+       output_headers(1, 0, 0, 1, 1, 0);
+       begin_burst();
+
+       wprintf("<HTML><HEAD>\n"
+               "<meta name=\"MSSmartTagsPreventParsing\" content=\"TRUE\" />\n"
+               "<link href=\"static/webcit.css\" rel=\"stylesheet\" type=\"text/css\">\n"
+               "<TITLE>\n"
+       );
+       wprintf(_("List subscription"));
+       wprintf("</TITLE></HEAD><BODY>\n");
+
+       strcpy(cmd, bstr("cmd"));
+       strcpy(room, bstr("room"));
+       strcpy(token, bstr("token"));
+       strcpy(email, bstr("email"));
+       strcpy(subtype, bstr("subtype"));
+
+       wprintf("<CENTER>"
+               "<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>"
+               "<SPAN CLASS=\"titlebar\">");
+       wprintf(_("List subscribe/unsubscribe"));
+       wprintf("</SPAN></TD></TR></TABLE><br />\n");
+
+       /**
+        * Subscribe command
+        */
+       if (!strcasecmp(cmd, "subscribe")) {
+               serv_printf("SUBS subscribe|%s|%s|%s|%s://%s/listsub",
+                       room,
+                       email,
+                       subtype,
+                       (is_https ? "https" : "http"),
+                       WC->http_host
+               );
+               serv_getln(buf, sizeof buf);
+               if (buf[0] == '2') {
+                       stresc(escaped_email, email, 0, 0);
+                       stresc(escaped_room, room, 0, 0);
+
+                       wprintf("<CENTER><H1>");
+                       wprintf(_("Confirmation request sent"));
+                       wprintf("</H1>");
+                       wprintf(_("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"),
+                               escaped_email, escaped_room);
+                       wprintf("<a href=\"listsub\">%s</A></CENTER>\n", _("Go back..."));
+               }
+               else {
+                       wprintf("<FONT SIZE=+1><B>ERROR: %s</B>"
+                               "</FONT><br /><br />\n",
+                               &buf[4]);
+                       goto FORM;
+               }
+       }
+
+       /**
+        * Unsubscribe command
+        */
+       else if (!strcasecmp(cmd, "unsubscribe")) {
+               serv_printf("SUBS unsubscribe|%s|%s|%s://%s/listsub",
+                       room,
+                       email,
+                       (is_https ? "https" : "http"),
+                       WC->http_host
+               );
+               serv_getln(buf, sizeof buf);
+               if (buf[0] == '2') {
+                       wprintf("<CENTER><H1>Confirmation request sent</H1>"
+                               "You are unsubscribing <TT>");
+                       escputs(email);
+                       wprintf("</TT> from the &quot;");
+                       escputs(room);
+                       wprintf("&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 />\n"
+                               "<a href=\"listsub\">Back...</A></CENTER>\n"
+                       );
+               }
+               else {
+                       wprintf("<FONT SIZE=+1><B>ERROR: %s</B>"
+                               "</FONT><br /><br />\n",
+                               &buf[4]);
+                       goto FORM;
+               }
+       }
+
+       /**
+        * Confirm command
+        */
+       else if (!strcasecmp(cmd, "confirm")) {
+               serv_printf("SUBS confirm|%s|%s",
+                       room,
+                       token
+               );
+               serv_getln(buf, sizeof buf);
+               if (buf[0] == '2') {
+                       wprintf("<CENTER><H1>Confirmation successful!</H1>");
+               }
+               else {
+                       wprintf("<CENTER><H1>Confirmation failed.</H1>"
+                               "This could mean one of two things:<UL>\n"
+                               "<LI>You waited too long to confirm your "
+                               "subscribe/unsubscribe request (the "
+                               "confirmation link is only valid for three "
+                               "days)\n<LI>You have <i>already</i> "
+                               "successfully confirmed your "
+                               "subscribe/unsubscribe request and are "
+                               "attempting to do it again.</UL>\n"
+                               "The error returned by the server was: "
+                       );
+               }
+               wprintf("%s</CENTER><br />\n", &buf[4]);
+       }
+
+       /**
+        * Any other (invalid) command causes the form to be displayed
+        */
+       else {
+FORM:          wprintf("<FORM METHOD=\"POST\" action=\"listsub\">\n"
+                       "<TABLE BORDER=0>\n"
+               );
+
+               wprintf("<TR><TD>Name of list</TD><TD>"
+                       "<SELECT NAME=\"room\" SIZE=1>\n");
+
+               serv_puts("LPRM");
+               serv_getln(buf, sizeof buf);
+               if (buf[0] == '1') {
+                       while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+                               extract_token(sroom, buf, 0, '|', sizeof sroom);
+                               self = extract_int(buf, 4) & QR2_SELFLIST ;
+                               if (self) {
+                                       wprintf("<OPTION VALUE=\"");
+                                       escputs(sroom);
+                                       wprintf("\">");
+                                       escputs(sroom);
+                                       wprintf("</OPTION>\n");
+                               }
+                       }
+               }
+               wprintf("</SELECT>"
+                       "</TD></TR>\n");
+
+               wprintf("<TR><TD>Your e-mail address</TD><TD>"
+                       "<INPUT TYPE=\"text\" NAME=\"email\" "
+                       "VALUE=\""
+               );
+               escputs(email);
+               wprintf("\" MAXLENGTH=128></TD></TR>\n");
+
+               wprintf("</TABLE>"
+                       "(If subscribing) preferred format: "
+                       "<INPUT TYPE=\"radio\" NAME=\"subtype\""
+                       "VALUE=\"list\">One message at a time&nbsp; "
+                       "<INPUT TYPE=\"radio\" NAME=\"subtype\""
+                       "VALUE=\"digest\" CHECKED>Digest format&nbsp; "
+                       "<br />\n"
+                       "<INPUT TYPE=\"submit\" NAME=\"cmd\""
+                       " VALUE=\"subscribe\">\n"
+                       "<INPUT TYPE=\"submit\" NAME=\"cmd\""
+                       " VALUE=\"unsubscribe\">\n"
+                       "</FORM>\n"
+               );
+
+               wprintf("<br />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 />\n"
+               );
+
+       }
+
+       wprintf("</BODY></HTML>\n");
+       wDumpContent(0);
+       end_webcit_session();
+}
+
+
+
+/*@}*/
diff --git a/webcit/locate_host.c b/webcit/locate_host.c
new file mode 100644 (file)
index 0000000..7b58699
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * $Id$
+ */
+/**
+ * \defgroup Hostlookup Examine a socket and determine the name/address of the originating host.
+ * \ingroup WebcitHttpServer
+ */
+/*@{*/
+
+#include "webcit.h"
+
+/**
+ * \brief get a hostname 
+ * \todo buffersize?
+ * \param tbuf the returnbuffer
+ * \param client_socket the sock fd where the client is connected
+ */
+void locate_host(char *tbuf, int client_socket)
+{
+       struct sockaddr_in cs;
+       struct hostent *ch;
+       socklen_t len;
+       char *i;
+       int a1, a2, a3, a4;
+
+       len = sizeof(cs);
+       if (getpeername(client_socket, (struct sockaddr *) &cs, &len) < 0) {
+               strcpy(tbuf, "<unknown>");
+               return;
+       }
+       if ((ch = gethostbyaddr((char *) &cs.sin_addr, sizeof(cs.sin_addr),
+                               AF_INET)) == NULL) {
+               i = (char *) &cs.sin_addr;
+               a1 = ((*i++) & 0xff);
+               a2 = ((*i++) & 0xff);
+               a3 = ((*i++) & 0xff);
+               a4 = ((*i++) & 0xff);
+               sprintf(tbuf, "%d.%d.%d.%d", a1, a2, a3, a4);
+               return;
+       }
+       safestrncpy(tbuf, ch->h_name, 64);
+}
+
+/*@}*/
diff --git a/webcit/mainmenu.c b/webcit/mainmenu.c
new file mode 100644 (file)
index 0000000..3f66e6d
--- /dev/null
@@ -0,0 +1,400 @@
+/*
+ * $Id$
+ */
+/**
+ * \defgroup DispAdvancedMenu Displays the "advanced" (main) menu.
+ * \ingroup MenuInfrastructure
+ *
+ */
+/*@{*/
+#include "webcit.h"
+
+/**
+ * \brief The Main Menu
+ */
+void display_main_menu(void)
+{
+       output_headers(1, 1, 1, 0, 0, 0);
+
+       wprintf("<div class=\"fix_scrollbar_bug\">"
+               "<TABLE WIDTH=100%%>"
+               "<TR><TD COLSPAN=2>\n");
+
+       svprintf("BOXTITLE", WCS_STRING, _("Basic commands"));
+       do_template("beginbox");
+
+       wprintf("\n"
+               "<TABLE border=0 cellspacing=1 cellpadding=1 width=100%%>"
+               "<TR>"
+               "<TD>");        /**< start of first column */
+
+       wprintf("<a href=\"knrooms\"><span class=\"mainmenu\">");
+       wprintf(_("List known rooms"));
+       wprintf("</span></A><br /><span class=\"menudesc\">");
+       wprintf(_("Where can I go from here?"));
+       wprintf("</span><br />\n");
+
+       wprintf("<a href=\"gotonext\">"
+               "<span class=\"mainmenu\">");
+       wprintf(_("Goto next room"));
+       wprintf("</span></A><br />"
+               "<span class=\"menudesc\">");
+       wprintf(_("...with <EM>unread</EM> messages"));
+       wprintf("</span><br />\n");
+
+       wprintf("<a href=\"skip\">"
+               "<span class=\"mainmenu\">");
+       wprintf(_("Skip to next room"));
+       wprintf("</span></a><br />"
+               "<span class=\"menudesc\">");
+       wprintf(_("(come back here later)"));
+       wprintf("</span>\n");
+
+       if ((strlen(WC->ugname) > 0) && (strcasecmp(WC->ugname, WC->wc_roomname))) {
+               wprintf("<br />"
+                       "<a href=\"ungoto\">"
+                       "<span class=\"mainmenu\">");
+               wprintf(_("Ungoto"));
+               wprintf("</span></A><br />"
+                       "<span class=\"menudesc\">");
+               wprintf(_("(oops! Back to %s)"), WC->ugname);
+               wprintf("</span>\n");
+       }
+
+       wprintf("</TD><TD>\n"); /* start of second column */
+
+       wprintf("<a href=\"readnew\">"
+               "<span class=\"mainmenu\">");
+       wprintf(_("Read new messages"));
+       wprintf("</span></A><br />"
+               "<span class=\"menudesc\">");
+       wprintf(_("...in this room"));
+       wprintf("</span><br />\n");
+
+       wprintf("<a href=\"readfwd\">"
+               "<span class=\"mainmenu\">");
+       wprintf(_("Read all messages"));
+       wprintf("</span></A><br />"
+               "<span class=\"menudesc\">");
+       wprintf(_("...old <EM>and</EM> new"));
+       wprintf("</span><br />\n");
+
+       wprintf("<a href=\"display_enter\">"
+               "<span class=\"mainmenu\">");
+       wprintf(_("Enter a message"));
+       wprintf("</span></A><br />"
+               "<span class=\"menudesc\">");
+       wprintf(_("(post in this room)"));
+       wprintf("</span>\n");
+
+       wprintf("</TD><TD>");   /* start of third column */
+
+       wprintf("<a href=\"summary\">"
+               "<span class=\"mainmenu\">");
+       wprintf(_("Summary page"));
+       wprintf("</span></A><br />"
+               "<span class=\"menudesc\">");
+       wprintf(_("Summary of my account"));
+       wprintf("</span><br />\n");
+
+       wprintf("<a href=\"userlist\">\n"
+               "<span class=\"mainmenu\">");
+       wprintf(_("User list"));
+       wprintf("</span></A><br />"
+               "<span class=\"menudesc\">");
+       wprintf(_("(all registered users)"));
+       wprintf("</span><br />\n");
+
+       wprintf("<a href=\"termquit\" TARGET=\"_top\">"
+               "<span class=\"mainmenu\">");
+       wprintf(_("Log off"));
+       wprintf("</span></A><br />"
+               "<span class=\"menudesc\">");
+       wprintf(_("Bye!"));
+       wprintf("</span>\n");
+
+       wprintf("</TD></TR></TABLE>\n");
+       do_template("endbox");
+
+       wprintf("</TD></TR>"
+               "<TR VALIGN=TOP><TD>");
+
+       svprintf("BOXTITLE", WCS_STRING, _("Your info"));
+       do_template("beginbox");
+
+       wprintf("<a href=\"display_preferences\">"
+               "<span class=\"mainmenu\">");
+       wprintf(_("Change your preferences and settings"));
+       wprintf("</span><br />\n");
+
+       wprintf("<a href=\"display_reg\">"
+               "<span class=\"mainmenu\">");
+       wprintf(_("Update your contact information"));
+       wprintf("</span><br />\n");
+
+       wprintf("<a href=\"display_changepw\">"
+               "<span class=\"mainmenu\">");
+       wprintf(_("Change your password"));
+       wprintf("</span></A><br />\n");
+
+       wprintf("<a href=\"display_editbio\">"
+               "<span class=\"mainmenu\">");
+       wprintf(_("Enter your 'bio'"));
+       wprintf("</span></a><br />\n");
+
+       wprintf("<a href=\"display_editpic\">"
+               "<span class=\"mainmenu\">");
+       wprintf(_("Edit your online photo"));
+       wprintf("</span></a>\n");
+
+       do_template("endbox");
+
+       wprintf("</TD><TD>");
+
+       svprintf("BOXTITLE", WCS_STRING, _("Advanced room commands"));
+       do_template("beginbox");
+
+       if ((WC->axlevel >= 6) || (WC->is_room_aide)) {
+               wprintf("<a href=\"display_editroom\">"
+                       "<span class=\"mainmenu\">");
+               wprintf(_("Edit or delete this room"));
+               wprintf("</span></A><br />\n");
+       }
+
+       wprintf("<a href=\"display_private\">"
+               "<span class=\"mainmenu\">");
+       wprintf(_("Go to a 'hidden' room"));
+       wprintf("</span></A><br />\n");
+
+       wprintf("<a href=\"display_entroom\">"
+               "<span class=\"mainmenu\">");
+       wprintf(_("Create a new room"));
+       wprintf("</span></A><br />\n");
+
+       wprintf("<a href=\"display_zap\">"
+               "<span class=\"mainmenu\">");
+       wprintf(_("Zap (forget) this room (%s)"), WC->wc_roomname);
+       wprintf("</span></A><br />\n");
+
+       wprintf("<a href=\"zapped_list\">"
+               "<span class=\"mainmenu\">");
+       wprintf(_("List all forgotten rooms"));
+       wprintf("</span></A>\n");
+
+       do_template("endbox");
+
+       wprintf("</td></tr></table></div>");
+       wDumpContent(2);
+}
+
+
+/**
+ * \brief System administration menu
+ */
+void display_aide_menu(void)
+{
+       output_headers(1, 1, 2, 0, 0, 0);
+       wprintf("<div id=\"banner\">\n"
+               "<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>"
+               "<SPAN CLASS=\"titlebar\">");
+       wprintf(_("System Administration Menu"));
+       wprintf("</SPAN>"
+               "</TD></TR></TABLE>\n"
+               "</div>\n<div id=\"content\">\n"
+       );
+
+       wprintf("<div class=\"fix_scrollbar_bug\">"
+               "<table border=0 width=100%%><tr valign=top><td>");
+
+       svprintf("BOXTITLE", WCS_STRING, _("Global Configuration"));
+       do_template("beginbox");
+
+       wprintf("<a href=\"display_siteconfig\">"
+               "<span class=\"mainmenu\">");
+       wprintf(_("Edit site-wide configuration"));
+       wprintf("</span></A><br />\n");
+
+       wprintf("<a href=\"display_inetconf\">"
+               "<span class=\"mainmenu\">");
+       wprintf(_("Domain names and Internet mail configuration"));
+       wprintf("</span></a><br />\n");
+
+       wprintf("<a href=\"display_netconf\">"
+               "<span class=\"mainmenu\">");
+       wprintf(_("Configure replication with other Citadel servers"));
+       wprintf("</span></A>\n");
+
+       do_template("endbox");
+
+       wprintf("</td><td>");
+
+       svprintf("BOXTITLE", WCS_STRING, _("User account management"));
+       do_template("beginbox");
+
+       wprintf("<a href=\"select_user_to_edit\">"
+               "<span class=\"mainmenu\">");
+       wprintf(_("Add, change, delete user accounts"));
+       wprintf("</span></A><br />\n");
+
+       wprintf("<a href=\"validate\">"
+               "<span class=\"mainmenu\">");
+       wprintf(_("Validate new users"));
+       wprintf("</span></A><br />\n");
+
+       do_template("endbox");
+
+       svprintf("BOXTITLE", WCS_STRING, _("Rooms and Floors"));
+       do_template("beginbox");
+
+       wprintf("<a href=\"display_floorconfig\">"
+               "<span class=\"mainmenu\">");
+       wprintf(_("Add, change, or delete floors"));
+       wprintf("</span></A>\n");
+
+       do_template("endbox");
+
+       wprintf("</td></tr></table></div>");
+       wDumpContent(2);
+}
+
+
+
+
+
+/**
+ * \brief Display the screen to enter a generic server command
+ */
+void display_generic(void)
+{
+       output_headers(1, 1, 2, 0, 0, 0);
+       wprintf("<div id=\"banner\">\n"
+               "<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>"
+               "<SPAN CLASS=\"titlebar\">");
+       wprintf(_("Enter a server command"));
+       wprintf("</SPAN></TD></TR></TABLE>\n"
+               "</div>\n<div id=\"content\">\n"
+       );
+
+       wprintf("<div class=\"fix_scrollbar_bug\">"
+               "<table border=0 width=100%% bgcolor=\"#ffffff\"><tr><td>\n");
+
+       wprintf("<CENTER>");
+       wprintf(_("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."));
+       wprintf("<br />\n");
+
+       wprintf("<FORM METHOD=\"POST\" action=\"do_generic\">\n");
+
+       wprintf(_("Enter command:"));
+       wprintf("<br /><INPUT TYPE=\"text\" NAME=\"g_cmd\" SIZE=80 MAXLENGTH=\"250\"><br />\n");
+
+       wprintf(_("Command input (if requesting SEND_LISTING transfer mode):"));
+       wprintf("<br /><TEXTAREA NAME=\"g_input\" ROWS=10 COLS=80 WIDTH=80></TEXTAREA><br />\n");
+
+       wprintf("<FONT SIZE=-2>");
+       wprintf(_("Detected host header is %s://%s"), (is_https ? "https" : "http"), WC->http_host);
+       wprintf("</FONT>\n");
+       wprintf("<INPUT TYPE=\"submit\" NAME=\"sc_button\" VALUE=\"%s\">", _("Send command"));
+       wprintf("&nbsp;");
+       wprintf("<INPUT TYPE=\"submit\" NAME=\"cancel_button\" VALUE=\"%s\"><br />\n", _("Cancel"));
+
+       wprintf("</FORM></CENTER>\n");
+       wprintf("</td></tr></table></div>\n");
+       wDumpContent(1);
+}
+
+/**
+ * \brief Interactive window to perform generic Citadel server commands.
+ */
+void do_generic(void)
+{
+       char buf[SIZ];
+       char gcontent[SIZ];
+       char *junk;
+       size_t len;
+
+       if (strlen(bstr("sc_button")) == 0) {
+               display_main_menu();
+               return;
+       }
+
+       output_headers(1, 1, 0, 0, 0, 0);
+
+       serv_printf("%s", bstr("g_cmd"));
+       serv_getln(buf, sizeof buf);
+
+       svprintf("BOXTITLE", WCS_STRING, _("Server command results"));
+       do_template("beginbox");
+
+       wprintf("<TABLE border=0><TR><TD>Command:</TD><TD><TT>");
+       escputs(bstr("g_cmd"));
+       wprintf("</TT></TD></TR><TR><TD>Result:</TD><TD><TT>");
+       escputs(buf);
+       wprintf("</TT></TD></TR></TABLE><br />\n");
+
+       if (buf[0] == '8') {
+               serv_printf("\n\n000");
+       }
+       if ((buf[0] == '1') || (buf[0] == '8')) {
+               while (serv_getln(gcontent, sizeof gcontent), strcmp(gcontent, "000")) {
+                       escputs(gcontent);
+                       wprintf("<br />\n");
+               }
+               wprintf("000");
+       }
+       if (buf[0] == '4') {
+               text_to_server(bstr("g_input"));
+               serv_puts("000");
+       }
+       if (buf[0] == '6') {
+               len = atol(&buf[4]);
+               junk = malloc(len);
+               serv_read(junk, len);
+               free(junk);
+       }
+       if (buf[0] == '7') {
+               len = atol(&buf[4]);
+               junk = malloc(len);
+               memset(junk, 0, len);
+               serv_write(junk, len);
+               free(junk);
+       }
+       wprintf("<hr />");
+       wprintf("<a href=\"display_generic\">Enter another command</A><br />\n");
+       wprintf("<a href=\"display_advanced\">Return to menu</A>\n");
+       do_template("endbox");
+       wDumpContent(1);
+}
+
+
+/**
+ * \brief Display the menubar.  
+ * \param as_single_page Set to display HTML headers and footers -- otherwise it's assumed
+ * that the menubar is being embedded in another page.
+ */
+void display_menubar(int as_single_page) {
+
+       if (as_single_page) {
+               output_headers(0, 0, 0, 0, 0, 0);
+               wprintf("<HTML>\n"
+                       "<HEAD>\n"
+                       "<TITLE>MenuBar</TITLE>\n"
+                       "<STYLE TYPE=\"text/css\">\n"
+                       "BODY   { text-decoration: none; }\n"
+                       "</STYLE>\n"
+                       "</HEAD>\n");
+               do_template("background");
+       }
+
+       do_template("menubar");
+
+       if (as_single_page) {
+               wDumpContent(2);
+       }
+
+
+}
+
+
+/*@}*/
diff --git a/webcit/messages.c b/webcit/messages.c
new file mode 100644 (file)
index 0000000..cfce5f9
--- /dev/null
@@ -0,0 +1,3182 @@
+/*
+ * $Id$
+ */
+/**
+ * \defgroup MsgDisp Functions which deal with the fetching and displaying of messages.
+ * \ingroup WebcitDisplayItems
+ *
+ */
+/*@{*/
+#include "webcit.h"
+#include "vcard.h"
+#include "webserver.h"
+#include "groupdav.h"
+
+#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 */
+
+/**
+ * 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)
+ */
+struct addrbookent {
+       char ab_name[64]; /**< name string */
+       long ab_msgnum;   /**< message number of address book entry */
+};
+
+
+
+#ifdef HAVE_ICONV
+
+/**
+ * \brief      Wrapper around iconv_open()
+ *             Our version adds aliases for non-standard Microsoft charsets
+ *              such as 'MS950', aliasing them to names like 'CP950'
+ *
+ * \param      tocode          Target encoding
+ * \param      fromcode        Source encoding
+ */
+iconv_t ctdl_iconv_open(const char *tocode, const char *fromcode)
+{
+       iconv_t ic = (iconv_t)(-1) ;
+       ic = iconv_open(tocode, fromcode);
+       if (ic == (iconv_t)(-1) ) {
+               char alias_fromcode[64];
+               if ( (strlen(fromcode) == 5) && (!strncasecmp(fromcode, "MS", 2)) ) {
+                       safestrncpy(alias_fromcode, fromcode, sizeof alias_fromcode);
+                       alias_fromcode[0] = 'C';
+                       alias_fromcode[1] = 'P';
+                       ic = iconv_open(tocode, alias_fromcode);
+               }
+       }
+       return(ic);
+}
+
+
+/**
+ * \brief  Handle subjects with RFC2047 encoding
+ *  such as:
+ * =?koi8-r?B?78bP0s3Mxc7JxSDXz9rE1dvO2c3JINvB0sHNySDP?=
+ * \param buf the stringbuffer to process
+ */
+void utf8ify_rfc822_string(char *buf) {
+       char *start, *end;
+       char newbuf[1024];
+       char charset[128];
+       char encoding[16];
+       char istr[1024];
+       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 *isav;                     /**< Saved pointer to input buffer */
+       char *osav;                     /**< Saved pointer to output buffer */
+       int passes = 0;
+       int i;
+       int illegal_non_rfc2047_encoding = 0;
+
+       /** Sometimes, badly formed messages contain strings which were simply
+        *  written out directly in some foreign character set instead of
+        *  using RFC2047 encoding.  This is illegal but we will attempt to
+        *  handle it anyway by converting from a user-specified default
+        *  charset to UTF-8 if we see any nonprintable characters.
+        */
+       for (i=0; i<strlen(buf); ++i) {
+               if ((buf[i] < 32) || (buf[i] > 126)) {
+                       illegal_non_rfc2047_encoding = 1;
+               }
+       }
+       if (illegal_non_rfc2047_encoding) {
+               char default_header_charset[128];
+               get_preference("default_header_charset", default_header_charset, sizeof default_header_charset);
+               if ( (strcasecmp(default_header_charset, "UTF-8")) && (strcasecmp(default_header_charset, "us-ascii")) ) {
+                       ic = ctdl_iconv_open("UTF-8", default_header_charset);
+                       if (ic != (iconv_t)(-1) ) {
+                               ibuf = malloc(1024);
+                               isav = ibuf;
+                               safestrncpy(ibuf, buf, 1024);
+                               ibuflen = strlen(ibuf);
+                               obuflen = 1024;
+                               obuf = (char *) malloc(obuflen);
+                               osav = obuf;
+                               iconv(ic, &ibuf, &ibuflen, &obuf, &obuflen);
+                               osav[1024-obuflen] = 0;
+                               strcpy(buf, osav);
+                               free(osav);
+                               iconv_close(ic);
+                               free(isav);
+                       }
+               }
+       }
+
+       /** Now we handle foreign character sets properly encoded
+        *  in RFC2047 format.
+        */
+       while (start=strstr(buf, "=?"), end=strstr(buf, "?="),
+               ((start != NULL) && (end != NULL) && (end > start)) )
+       {
+               extract_token(charset, start, 1, '?', sizeof charset);
+               extract_token(encoding, start, 2, '?', sizeof encoding);
+               extract_token(istr, start, 3, '?', sizeof istr);
+
+               ibuf = malloc(1024);
+               isav = ibuf;
+               if (!strcasecmp(encoding, "B")) {       /**< base64 */
+                       ibuflen = CtdlDecodeBase64(ibuf, istr, strlen(istr));
+               }
+               else if (!strcasecmp(encoding, "Q")) {  /**< quoted-printable */
+                       ibuflen = CtdlDecodeQuotedPrintable(ibuf, istr, strlen(istr));
+               }
+               else {
+                       strcpy(ibuf, istr);             /**< unknown encoding */
+                       ibuflen = strlen(istr);
+               }
+
+               ic = ctdl_iconv_open("UTF-8", charset);
+               if (ic != (iconv_t)(-1) ) {
+                       obuflen = 1024;
+                       obuf = (char *) malloc(obuflen);
+                       osav = obuf;
+                       iconv(ic, &ibuf, &ibuflen, &obuf, &obuflen);
+                       osav[1024-obuflen] = 0;
+
+                       end = start;
+                       end++;
+                       strcpy(start, "");
+                       remove_token(end, 0, '?');
+                       remove_token(end, 0, '?');
+                       remove_token(end, 0, '?');
+                       remove_token(end, 0, '?');
+                       strcpy(end, &end[1]);
+
+                       snprintf(newbuf, sizeof newbuf, "%s%s%s", buf, osav, end);
+                       strcpy(buf, newbuf);
+                       free(osav);
+                       iconv_close(ic);
+               }
+               else {
+                       end = start;
+                       end++;
+                       strcpy(start, "");
+                       remove_token(end, 0, '?');
+                       remove_token(end, 0, '?');
+                       remove_token(end, 0, '?');
+                       remove_token(end, 0, '?');
+                       strcpy(end, &end[1]);
+
+                       snprintf(newbuf, sizeof newbuf, "%s(unreadable)%s", buf, end);
+                       strcpy(buf, newbuf);
+               }
+
+               free(isav);
+
+               /**
+                * Since spammers will go to all sorts of absurd lengths to get their
+                * messages through, there are LOTS of corrupt headers out there.
+                * So, prevent a really badly formed RFC2047 header from throwing
+                * this function into an infinite loop.
+                */
+               ++passes;
+               if (passes > 20) return;
+       }
+
+}
+#endif
+
+
+
+
+/**
+ * \brief      RFC2047-encode a header field if necessary.
+ *             If no non-ASCII characters are found, the string
+ *             will be copied verbatim without encoding.
+ *
+ * \param      target          Target buffer.
+ * \param      maxlen          Maximum size of target buffer.
+ * \param      source          Source string to be encoded.
+ */
+void rfc2047encode(char *target, int maxlen, char *source)
+{
+       int need_to_encode = 0;
+       int i;
+       unsigned char ch;
+
+       if (target == NULL) return;
+
+       for (i=0; i<strlen(source); ++i) {
+               if ((source[i] < 32) || (source[i] > 126)) {
+                       need_to_encode = 1;
+               }
+       }
+
+       if (!need_to_encode) {
+               safestrncpy(target, source, maxlen);
+               return;
+       }
+
+       strcpy(target, "=?UTF-8?Q?");
+       for (i=0; i<strlen(source); ++i) {
+               ch = (unsigned char) source[i];
+               if ((ch < 32) || (ch > 126) || (ch == 61)) {
+                       sprintf(&target[strlen(target)], "=%02X", ch);
+               }
+               else {
+                       sprintf(&target[strlen(target)], "%c", ch);
+               }
+       }
+       
+       strcat(target, "?=");
+}
+
+
+
+
+/**
+ * \brief Look for URL's embedded in a buffer and make them linkable.  We use a
+ * target window in order to keep the BBS session in its own window.
+ * \param buf the message buffer
+ */
+void url(char *buf)
+{
+
+       int pos;
+       int start, end;
+       char ench;
+       char urlbuf[SIZ];
+       char outbuf[1024];
+
+       start = (-1);
+       end = strlen(buf);
+       ench = 0;
+
+       for (pos = 0; pos < strlen(buf); ++pos) {
+               if (!strncasecmp(&buf[pos], "http://", 7))
+                       start = pos;
+               if (!strncasecmp(&buf[pos], "ftp://", 6))
+                       start = pos;
+       }
+
+       if (start < 0)
+               return;
+
+       if ((start > 0) && (buf[start - 1] == '<'))
+               ench = '>';
+       if ((start > 0) && (buf[start - 1] == '['))
+               ench = ']';
+       if ((start > 0) && (buf[start - 1] == '('))
+               ench = ')';
+       if ((start > 0) && (buf[start - 1] == '{'))
+               ench = '}';
+
+       for (pos = strlen(buf); pos > start; --pos) {
+               if ((buf[pos] == ' ') || (buf[pos] == ench))
+                       end = pos;
+       }
+
+       strncpy(urlbuf, &buf[start], end - start);
+       urlbuf[end - start] = 0;
+
+       strncpy(outbuf, buf, start);
+       sprintf(&outbuf[start], "%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);
+       strcat(outbuf, &buf[end]);
+       if ( strlen(outbuf) < 250 )
+               strcpy(buf, outbuf);
+}
+
+
+/**
+ * \brief Turn a vCard "n" (name) field into something displayable.
+ * \param name the name field to convert
+ */
+void vcard_n_prettyize(char *name)
+{
+       char *original_name;
+       int i;
+
+       original_name = strdup(name);
+       for (i=0; i<5; ++i) {
+               if (strlen(original_name) > 0) {
+                       if (original_name[strlen(original_name)-1] == ' ') {
+                               original_name[strlen(original_name)-1] = 0;
+                       }
+                       if (original_name[strlen(original_name)-1] == ';') {
+                               original_name[strlen(original_name)-1] = 0;
+                       }
+               }
+       }
+       strcpy(name, "");
+       for (i=0; i<strlen(original_name); ++i) {
+               if (original_name[i] == ';') {
+                       strcat(name, ", ");
+               }
+               else {
+                       name[strlen(name)+1] = 0;
+                       name[strlen(name)] = original_name[i];
+               }
+       }
+       free(original_name);
+}
+
+
+
+
+/**
+ * \brief preparse a vcard name
+ * display_vcard() calls this after parsing the textual vCard into
+ * our 'struct vCard' data object.
+ * This gets called instead of display_parsed_vcard() if we are only looking
+ * to extract the person's name instead of displaying the card.
+ * \param v the vcard to retrieve the name from
+ * \param storename where to put the name at
+ */
+void fetchname_parsed_vcard(struct vCard *v, char *storename) {
+       char *name;
+
+       strcpy(storename, "");
+
+       name = vcard_get_prop(v, "n", 1, 0, 0);
+       if (name != NULL) {
+               strcpy(storename, name);
+               /* vcard_n_prettyize(storename); */
+       }
+
+}
+
+
+
+/**
+ * \brief html print a vcard
+ * display_vcard() calls this after parsing the textual vCard into
+ * our 'struct vCard' data object.
+ *
+ * Set 'full' to nonzero to display the full card, otherwise it will only
+ * show a summary line.
+ *
+ * This code is a bit ugly, so perhaps an explanation is due: we do this
+ * in two passes through the vCard fields.  On the first pass, we process
+ * fields we understand, and then render them in a pretty fashion at the
+ * end.  Then we make a second pass, outputting all the fields we don't
+ * understand in a simple two-column name/value format.
+ * \param v the vCard to display
+ * \param full display all items of the vcard?
+ */
+void display_parsed_vcard(struct vCard *v, int full) {
+       int i, j;
+       char buf[SIZ];
+       char *name;
+       int is_qp = 0;
+       int is_b64 = 0;
+       char *thisname, *thisvalue;
+       char firsttoken[SIZ];
+       int pass;
+
+       char fullname[SIZ];
+       char title[SIZ];
+       char org[SIZ];
+       char phone[SIZ];
+       char mailto[SIZ];
+
+       strcpy(fullname, "");
+       strcpy(phone, "");
+       strcpy(mailto, "");
+       strcpy(title, "");
+       strcpy(org, "");
+
+       if (!full) {
+               wprintf("<TD>");
+               name = vcard_get_prop(v, "fn", 1, 0, 0);
+               if (name != NULL) {
+                       escputs(name);
+               }
+               else if (name = vcard_get_prop(v, "n", 1, 0, 0), name != NULL) {
+                       strcpy(fullname, name);
+                       vcard_n_prettyize(fullname);
+                       escputs(fullname);
+               }
+               else {
+                       wprintf("&nbsp;");
+               }
+               wprintf("</TD>");
+               return;
+       }
+
+       wprintf("<div align=center><table bgcolor=#aaaaaa width=50%%>");
+       for (pass=1; pass<=2; ++pass) {
+
+               if (v->numprops) for (i=0; i<(v->numprops); ++i) {
+
+                       thisname = strdup(v->prop[i].name);
+                       extract_token(firsttoken, thisname, 0, ';', sizeof firsttoken);
+       
+                       for (j=0; j<num_tokens(thisname, ';'); ++j) {
+                               extract_token(buf, thisname, j, ';', sizeof buf);
+                               if (!strcasecmp(buf, "encoding=quoted-printable")) {
+                                       is_qp = 1;
+                                       remove_token(thisname, j, ';');
+                               }
+                               if (!strcasecmp(buf, "encoding=base64")) {
+                                       is_b64 = 1;
+                                       remove_token(thisname, j, ';');
+                               }
+                       }
+       
+                       if (is_qp) {
+                               thisvalue = malloc(strlen(v->prop[i].value) + 50);
+                               j = CtdlDecodeQuotedPrintable(
+                                       thisvalue, v->prop[i].value,
+                                       strlen(v->prop[i].value) );
+                               thisvalue[j] = 0;
+                       }
+                       else if (is_b64) {
+                               thisvalue = malloc(strlen(v->prop[i].value) + 50);
+                               CtdlDecodeBase64(
+                                       thisvalue, v->prop[i].value,
+                                       strlen(v->prop[i].value) );
+                       }
+                       else {
+                               thisvalue = strdup(v->prop[i].value);
+                       }
+       
+                       /** Various fields we may encounter ***/
+       
+                       /** N is name, but only if there's no FN already there */
+                       if (!strcasecmp(firsttoken, "n")) {
+                               if (strlen(fullname) == 0) {
+                                       strcpy(fullname, thisvalue);
+                                       vcard_n_prettyize(fullname);
+                               }
+                       }
+       
+                       /** FN (full name) is a true 'display name' field */
+                       else if (!strcasecmp(firsttoken, "fn")) {
+                               strcpy(fullname, thisvalue);
+                       }
+
+                       /** title */
+                       else if (!strcasecmp(firsttoken, "title")) {
+                               strcpy(title, thisvalue);
+                       }
+       
+                       /** organization */
+                       else if (!strcasecmp(firsttoken, "org")) {
+                               strcpy(org, thisvalue);
+                       }
+       
+                       else if (!strcasecmp(firsttoken, "email")) {
+                               if (strlen(mailto) > 0) strcat(mailto, "<br />");
+                               strcat(mailto,
+                                       "<a href=\"display_enter"
+                                       "?force_room=_MAIL_?recp=");
+
+                               urlesc(&mailto[strlen(mailto)], fullname);
+                               urlesc(&mailto[strlen(mailto)], " <");
+                               urlesc(&mailto[strlen(mailto)], thisvalue);
+                               urlesc(&mailto[strlen(mailto)], ">");
+
+                               strcat(mailto, "\">");
+                               stresc(&mailto[strlen(mailto)], thisvalue, 1, 1);
+                               strcat(mailto, "</A>");
+                       }
+                       else if (!strcasecmp(firsttoken, "tel")) {
+                               if (strlen(phone) > 0) strcat(phone, "<br />");
+                               strcat(phone, thisvalue);
+                               for (j=0; j<num_tokens(thisname, ';'); ++j) {
+                                       extract_token(buf, thisname, j, ';', sizeof buf);
+                                       if (!strcasecmp(buf, "tel"))
+                                               strcat(phone, "");
+                                       else if (!strcasecmp(buf, "work"))
+                                               strcat(phone, _(" (work)"));
+                                       else if (!strcasecmp(buf, "home"))
+                                               strcat(phone, _(" (home)"));
+                                       else if (!strcasecmp(buf, "cell"))
+                                               strcat(phone, _(" (cell)"));
+                                       else {
+                                               strcat(phone, " (");
+                                               strcat(phone, buf);
+                                               strcat(phone, ")");
+                                       }
+                               }
+                       }
+                       else if (!strcasecmp(firsttoken, "adr")) {
+                               if (pass == 2) {
+                                       wprintf("<TR><TD>");
+                                       wprintf(_("Address:"));
+                                       wprintf("</TD><TD>");
+                                       for (j=0; j<num_tokens(thisvalue, ';'); ++j) {
+                                               extract_token(buf, thisvalue, j, ';', sizeof buf);
+                                               if (strlen(buf) > 0) {
+                                                       escputs(buf);
+                                                       if (j<3) wprintf("<br />");
+                                                       else wprintf(" ");
+                                               }
+                                       }
+                                       wprintf("</TD></TR>\n");
+                               }
+                       }
+                       else if (!strcasecmp(firsttoken, "version")) {
+                               /* ignore */
+                       }
+                       else if (!strcasecmp(firsttoken, "rev")) {
+                               /* ignore */
+                       }
+                       else if (!strcasecmp(firsttoken, "label")) {
+                               /* ignore */
+                       }
+                       else {
+
+                               /*** Don't show extra fields.  They're ugly.
+                               if (pass == 2) {
+                                       wprintf("<TR><TD>");
+                                       escputs(thisname);
+                                       wprintf("</TD><TD>");
+                                       escputs(thisvalue);
+                                       wprintf("</TD></TR>\n");
+                               }
+                               ***/
+                       }
+       
+                       free(thisname);
+                       free(thisvalue);
+               }
+       
+               if (pass == 1) {
+                       wprintf("<TR BGCOLOR=\"#AAAAAA\">"
+                       "<TD COLSPAN=2 BGCOLOR=\"#FFFFFF\">"
+                       "<IMG ALIGN=CENTER src=\"static/viewcontacts_48x.gif\">"
+                       "<FONT SIZE=+1><B>");
+                       escputs(fullname);
+                       wprintf("</B></FONT>");
+                       if (strlen(title) > 0) {
+                               wprintf("<div align=right>");
+                               escputs(title);
+                               wprintf("</div>");
+                       }
+                       if (strlen(org) > 0) {
+                               wprintf("<div align=right>");
+                               escputs(org);
+                               wprintf("</div>");
+                       }
+                       wprintf("</TD></TR>\n");
+               
+                       if (strlen(phone) > 0) {
+                               wprintf("<tr><td>");
+                               wprintf(_("Telephone:"));
+                               wprintf("</td><td>%s</td></tr>\n", phone);
+                       }
+                       if (strlen(mailto) > 0) {
+                               wprintf("<tr><td>");
+                               wprintf(_("E-mail:"));
+                               wprintf("</td><td>%s</td></tr>\n", mailto);
+                       }
+               }
+
+       }
+
+       wprintf("</table></div>\n");
+}
+
+
+
+/**
+ * \brief  Display a textual vCard
+ * (Converts to a vCard object and then calls the actual display function)
+ * Set 'full' to nonzero to display the whole card instead of a one-liner.
+ * Or, if "storename" is non-NULL, just store the person's name in that
+ * buffer instead of displaying the card at all.
+ * \param vcard_source the buffer containing the vcard text
+ * \param alpha what???
+ * \param full should we usse all lines?
+ * \param storename where to store???
+ */
+void display_vcard(char *vcard_source, char alpha, int full, char *storename) {
+       struct vCard *v;
+       char *name;
+       char buf[SIZ];
+       char this_alpha = 0;
+
+       v = vcard_load(vcard_source);
+       if (v == NULL) return;
+
+       name = vcard_get_prop(v, "n", 1, 0, 0);
+       if (name != NULL) {
+               strcpy(buf, name);
+               this_alpha = buf[0];
+       }
+
+       if (storename != NULL) {
+               fetchname_parsed_vcard(v, storename);
+       }
+       else if (       (alpha == 0)
+                       || ((isalpha(alpha)) && (tolower(alpha) == tolower(this_alpha)) )
+                       || ((!isalpha(alpha)) && (!isalpha(this_alpha)))
+               ) {
+               display_parsed_vcard(v, full);
+       }
+
+       vcard_free(v);
+}
+
+
+/**
+ * \brief I wanna SEE that message!  
+ * \param msgnum the citadel number of the message to display
+ * \param printable_view are we doing a print view?
+ * \param section Optional for encapsulated message/rfc822 submessage)
+ */
+void read_message(long msgnum, int printable_view, char *section) {
+       char buf[SIZ];
+       char mime_partnum[256];
+       char mime_filename[256];
+       char mime_content_type[256];
+       char mime_charset[256];
+       char mime_disposition[256];
+       int mime_length;
+       char mime_http[SIZ];
+       char mime_submessages[256];
+       char m_subject[256];
+       char m_cc[1024];
+       char from[256];
+       char node[256];
+       char rfca[256];
+       char reply_to[512];
+       char reply_all[4096];
+       char now[64];
+       int format_type = 0;
+       int nhdr = 0;
+       int bq = 0;
+       int i = 0;
+       char vcard_partnum[256];
+       char cal_partnum[256];
+       char *part_source = 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
+
+       strcpy(from, "");
+       strcpy(node, "");
+       strcpy(rfca, "");
+       strcpy(reply_to, "");
+       strcpy(reply_all, "");
+       strcpy(vcard_partnum, "");
+       strcpy(cal_partnum, "");
+       strcpy(mime_http, "");
+       strcpy(mime_content_type, "text/plain");
+       strcpy(mime_charset, "us-ascii");
+       strcpy(mime_submessages, "");
+
+       serv_printf("MSG4 %ld|%s", msgnum, section);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '1') {
+               wprintf("<STRONG>");
+               wprintf(_("ERROR:"));
+               wprintf("</STRONG> %s<br />\n", &buf[4]);
+               return;
+       }
+
+       /** begin everythingamundo table */
+       if (!printable_view) {
+               wprintf("<div class=\"fix_scrollbar_bug\">\n");
+               wprintf("<table width=100%% border=1 cellspacing=0 "
+                       "cellpadding=0><TR><TD>\n");
+       }
+
+       /** begin message header table */
+       wprintf("<table width=100%% border=0 cellspacing=0 "
+               "cellpadding=1 bgcolor=\"#CCCCCC\"><tr><td>\n");
+
+       wprintf("<span class=\"message_header\">");
+       strcpy(m_subject, "");
+       strcpy(m_cc, "");
+
+       while (serv_getln(buf, sizeof buf), strcasecmp(buf, "text")) {
+               if (!strcmp(buf, "000")) {
+                       wprintf("<i>");
+                       wprintf(_("unexpected end of message"));
+                       wprintf("</i><br /><br />\n");
+                       wprintf("</span>\n");
+                       return;
+               }
+               if (!strncasecmp(buf, "nhdr=yes", 8))
+                       nhdr = 1;
+               if (nhdr == 1)
+                       buf[0] = '_';
+               if (!strncasecmp(buf, "type=", 5))
+                       format_type = atoi(&buf[5]);
+               if (!strncasecmp(buf, "from=", 5)) {
+                       strcpy(from, &buf[5]);
+                       wprintf(_("from "));
+                       wprintf("<a href=\"showuser?who=");
+#ifdef HAVE_ICONV
+                       utf8ify_rfc822_string(from);
+#endif
+                       urlescputs(from);
+                       wprintf("\">");
+                       escputs(from);
+                       wprintf("</a> ");
+               }
+               if (!strncasecmp(buf, "subj=", 5)) {
+                       safestrncpy(m_subject, &buf[5], sizeof m_subject);
+               }
+               if (!strncasecmp(buf, "cccc=", 5)) {
+                       safestrncpy(m_cc, &buf[5], sizeof m_cc);
+                       if (strlen(reply_all) > 0) {
+                               strcat(reply_all, ", ");
+                       }
+                       safestrncpy(&reply_all[strlen(reply_all)], &buf[5],
+                               (sizeof reply_all - strlen(reply_all)) );
+               }
+               if ((!strncasecmp(buf, "hnod=", 5))
+                   && (strcasecmp(&buf[5], serv_info.serv_humannode))) {
+                       wprintf("(%s) ", &buf[5]);
+               }
+               if ((!strncasecmp(buf, "room=", 5))
+                   && (strcasecmp(&buf[5], WC->wc_roomname))
+                   && (strlen(&buf[5])>0) ) {
+                       wprintf(_("in "));
+                       wprintf("%s&gt; ", &buf[5]);
+               }
+               if (!strncasecmp(buf, "rfca=", 5)) {
+                       strcpy(rfca, &buf[5]);
+                       wprintf("&lt;");
+                       escputs(rfca);
+                       wprintf("&gt; ");
+               }
+
+               if (!strncasecmp(buf, "node=", 5)) {
+                       strcpy(node, &buf[5]);
+                       if ( ((WC->room_flags & QR_NETWORK)
+                       || ((strcasecmp(&buf[5], serv_info.serv_nodename)
+                       && (strcasecmp(&buf[5], serv_info.serv_fqdn)))))
+                       && (strlen(rfca)==0)
+                       ) {
+                               wprintf("@%s ", &buf[5]);
+                       }
+               }
+               if (!strncasecmp(buf, "rcpt=", 5)) {
+                       wprintf(_("to "));
+                       if (strlen(reply_all) > 0) {
+                               strcat(reply_all, ", ");
+                       }
+                       safestrncpy(&reply_all[strlen(reply_all)], &buf[5],
+                               (sizeof reply_all - strlen(reply_all)) );
+#ifdef HAVE_ICONV
+                       utf8ify_rfc822_string(&buf[5]);
+#endif
+                       escputs(&buf[5]);
+                       wprintf(" ");
+               }
+               if (!strncasecmp(buf, "time=", 5)) {
+                       fmt_date(now, atol(&buf[5]), 0);
+                       wprintf("%s ", now);
+               }
+
+               if (!strncasecmp(buf, "part=", 5)) {
+                       extract_token(mime_filename, &buf[5], 1, '|', sizeof mime_filename);
+                       extract_token(mime_partnum, &buf[5], 2, '|', sizeof mime_partnum);
+                       extract_token(mime_disposition, &buf[5], 3, '|', sizeof mime_disposition);
+                       extract_token(mime_content_type, &buf[5], 4, '|', sizeof mime_content_type);
+                       mime_length = extract_int(&buf[5], 5);
+
+                       if (!strcasecmp(mime_content_type, "message/rfc822")) {
+                               if (strlen(mime_submessages) > 0) {
+                                       strcat(mime_submessages, "|");
+                               }
+                               strcat(mime_submessages, mime_partnum);
+                       }
+                       else if ((!strcasecmp(mime_disposition, "inline"))
+                          && (!strncasecmp(mime_content_type, "image/", 6)) ){
+                               snprintf(&mime_http[strlen(mime_http)],
+                                       (sizeof(mime_http) - strlen(mime_http) - 1),
+                                       "<img src=\"mimepart/%ld/%s/%s\">",
+                                       msgnum, mime_partnum, mime_filename);
+                       }
+                       else if ( (!strcasecmp(mime_disposition, "attachment")) 
+                            || (!strcasecmp(mime_disposition, "inline")) ) {
+                               snprintf(&mime_http[strlen(mime_http)],
+                                       (sizeof(mime_http) - strlen(mime_http) - 1),
+                                       "<img src=\"static/diskette_24x.gif\" "
+                                       "border=0 align=middle>\n"
+                                       "%s (%s, %d bytes) [ "
+                                       "<a href=\"mimepart/%ld/%s/%s\""
+                                       "target=\"wc.%ld.%s\">%s</a>"
+                                       " | "
+                                       "<a href=\"mimepart_download/%ld/%s/%s\">%s</a>"
+                                       " ]<br />\n",
+                                       mime_filename,
+                                       mime_content_type, mime_length,
+                                       msgnum, mime_partnum, mime_filename,
+                                       msgnum, mime_partnum,
+                                       _("View"),
+                                       msgnum, mime_partnum, mime_filename,
+                                       _("Download")
+                               );
+                       }
+
+                       /** begin handler prep ***/
+                       if (!strcasecmp(mime_content_type, "text/x-vcard")) {
+                               strcpy(vcard_partnum, mime_partnum);
+                       }
+
+                       if (!strcasecmp(mime_content_type, "text/calendar")) {
+                               strcpy(cal_partnum, mime_partnum);
+                       }
+
+                       /** end handler prep ***/
+
+               }
+
+       }
+
+       /** Generate a reply-to address */
+       if (strlen(rfca) > 0) {
+               strcpy(reply_to, rfca);
+       }
+       else {
+               if ( (strlen(node) > 0)
+                  && (strcasecmp(node, serv_info.serv_nodename))
+                  && (strcasecmp(node, serv_info.serv_humannode)) ) {
+                       snprintf(reply_to, sizeof(reply_to), "%s @ %s",
+                               from, node);
+               }
+               else {
+                       snprintf(reply_to, sizeof(reply_to), "%s", from);
+               }
+       }
+
+       if (nhdr == 1) {
+               wprintf("****");
+       }
+
+       wprintf("</span>");
+#ifdef HAVE_ICONV
+       utf8ify_rfc822_string(m_cc);
+       utf8ify_rfc822_string(m_subject);
+#endif
+       if (strlen(m_cc) > 0) {
+               wprintf("<br />"
+                       "<span class=\"message_subject\">");
+               wprintf(_("CC:"));
+               wprintf(" ");
+               escputs(m_cc);
+               wprintf("</span>");
+       }
+       if (strlen(m_subject) > 0) {
+               wprintf("<br />"
+                       "<span class=\"message_subject\">");
+               wprintf(_("Subject:"));
+               wprintf(" ");
+               escputs(m_subject);
+               wprintf("</span>");
+       }
+       wprintf("</td>\n");
+
+       /** start msg buttons */
+       if (!printable_view) {
+               wprintf("<td align=right><span class=\"msgbuttons\">\n");
+
+               /** Reply */
+               if ( (WC->wc_view == VIEW_MAILBOX) || (WC->wc_view == VIEW_BBS) ) {
+                       wprintf("<a href=\"display_enter");
+                       if (WC->is_mailbox) {
+                               wprintf("?replyquote=%ld", msgnum);
+                       }
+                       wprintf("?recp=");
+                       urlescputs(reply_to);
+                       if (strlen(m_subject) > 0) {
+                               wprintf("?subject=");
+                               if (strncasecmp(m_subject, "Re:", 3)) wprintf("Re:%20");
+                               urlescputs(m_subject);
+                       }
+                       wprintf("\">[%s]</a> ", _("Reply"));
+               }
+
+               /** ReplyQuoted */
+               if ( (WC->wc_view == VIEW_MAILBOX) || (WC->wc_view == VIEW_BBS) ) {
+                       if (!WC->is_mailbox) {
+                               wprintf("<a href=\"display_enter");
+                               wprintf("?replyquote=%ld", msgnum);
+                               wprintf("?recp=");
+                               urlescputs(reply_to);
+                               if (strlen(m_subject) > 0) {
+                                       wprintf("?subject=");
+                                       if (strncasecmp(m_subject, "Re:", 3)) wprintf("Re:%20");
+                                       urlescputs(m_subject);
+                               }
+                               wprintf("\">[%s]</a> ", _("ReplyQuoted"));
+                       }
+               }
+
+               /** ReplyAll */
+               if (WC->wc_view == VIEW_MAILBOX) {
+                       wprintf("<a href=\"display_enter");
+                       wprintf("?replyquote=%ld", msgnum);
+                       wprintf("?recp=");
+                       urlescputs(reply_to);
+                       wprintf("?cc=");
+                       urlescputs(reply_all);
+                       if (strlen(m_subject) > 0) {
+                               wprintf("?subject=");
+                               if (strncasecmp(m_subject, "Re:", 3)) wprintf("Re:%20");
+                               urlescputs(m_subject);
+                       }
+                       wprintf("\">[%s]</a> ", _("ReplyAll"));
+               }
+
+               /** Forward */
+               if (WC->wc_view == VIEW_MAILBOX) {
+                       wprintf("<a href=\"display_enter?fwdquote=%ld?subject=", msgnum);
+                       if (strncasecmp(m_subject, "Fwd:", 4)) wprintf("Fwd:%20");
+                       urlescputs(m_subject);
+                       wprintf("\">[%s]</a> ", _("Forward"));
+               }
+
+               /** If this is one of my own rooms, or if I'm an Aide or Room Aide, I can move/delete */
+               if ( (WC->is_room_aide) || (WC->is_mailbox) ) {
+                       /** Move */
+                       wprintf("<a href=\"confirm_move_msg?msgid=%ld\">[%s]</a> ",
+                               msgnum, _("Move"));
+       
+                       /** Delete */
+                       wprintf("<a href=\"delete_msg?msgid=%ld\" "
+                               "onClick=\"return confirm('%s');\">"
+                               "[%s]</a> ", msgnum, _("Delete this message?"), _("Delete")
+                       );
+               }
+
+               /** Headers */
+               wprintf("<a href=\"#\" onClick=\"window.open('msgheaders/%ld', 'headers%ld', 'toolbar=no,location=no,directories=no,copyhistory=no,status=yes,scrollbars=yes,resizable=yes,width=600,height=400'); \" >"
+                       "[%s]</a>", msgnum, msgnum, _("Headers"));
+
+
+               /** Print */
+               wprintf("<a href=\"#\" onClick=\"window.open('printmsg/%ld', 'print%ld', 'toolbar=no,location=no,directories=no,copyhistory=no,status=yes,scrollbars=yes,resizable=yes,width=600,height=400'); \" >"
+                       "[%s]</a>", msgnum, msgnum, _("Print"));
+
+               wprintf("</span></td>");
+       }
+
+       wprintf("</tr></table>\n");
+
+       /** Begin body */
+       wprintf("<table border=0 width=100%% bgcolor=\"#FFFFFF\" "
+               "cellpadding=1 cellspacing=0><tr><td>");
+
+       /**
+        * Learn the content type
+        */
+       strcpy(mime_content_type, "text/plain");
+       while (serv_getln(buf, sizeof buf), (strlen(buf) > 0)) {
+               if (!strcmp(buf, "000")) {
+                       wprintf("<i>");
+                       wprintf(_("unexpected end of message"));
+                       wprintf("</i><br /><br />\n");
+                       goto ENDBODY;
+               }
+               if (!strncasecmp(buf, "Content-type: ", 14)) {
+                       safestrncpy(mime_content_type, &buf[14],
+                               sizeof(mime_content_type));
+                       for (i=0; i<strlen(mime_content_type); ++i) {
+                               if (!strncasecmp(&mime_content_type[i], "charset=", 8)) {
+                                       safestrncpy(mime_charset, &mime_content_type[i+8],
+                                               sizeof mime_charset);
+                               }
+                       }
+                       for (i=0; i<strlen(mime_content_type); ++i) {
+                               if (mime_content_type[i] == ';') {
+                                       mime_content_type[i] = 0;
+                               }
+                       }
+                       for (i=0; i<strlen(mime_charset); ++i) {
+                               if (mime_charset[i] == ';') {
+                                       mime_charset[i] = 0;
+                               }
+                       }
+               }
+       }
+
+       /** Set up a character set conversion if we need to (and if we can) */
+#ifdef HAVE_ICONV
+       if (strchr(mime_charset, ';')) strcpy(strchr(mime_charset, ';'), "");
+       if ( (strcasecmp(mime_charset, "us-ascii"))
+          && (strcasecmp(mime_charset, "UTF-8"))
+          && (strcasecmp(mime_charset, ""))
+       ) {
+               ic = ctdl_iconv_open("UTF-8", mime_charset);
+               if (ic == (iconv_t)(-1) ) {
+                       lprintf(5, "%s:%d iconv_open(UTF-8, %s) failed: %s\n",
+                               __FILE__, __LINE__, mime_charset, strerror(errno));
+               }
+       }
+#endif
+
+       /** Messages in legacy Citadel variformat get handled thusly... */
+       if (!strcasecmp(mime_content_type, "text/x-citadel-variformat")) {
+               fmout("JUSTIFY");
+       }
+
+       /** Boring old 80-column fixed format text gets handled this way... */
+       else if ( (!strcasecmp(mime_content_type, "text/plain"))
+               || (!strcasecmp(mime_content_type, "text")) ) {
+               while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+                       if (buf[strlen(buf)-1] == '\n') buf[strlen(buf)-1] = 0;
+                       if (buf[strlen(buf)-1] == '\r') buf[strlen(buf)-1] = 0;
+
+#ifdef HAVE_ICONV
+                       if (ic != (iconv_t)(-1) ) {
+                               ibuf = buf;
+                               ibuflen = strlen(ibuf);
+                               obuflen = SIZ;
+                               obuf = (char *) malloc(obuflen);
+                               osav = obuf;
+                               iconv(ic, &ibuf, &ibuflen, &obuf, &obuflen);
+                               osav[SIZ-obuflen] = 0;
+                               safestrncpy(buf, osav, sizeof buf);
+                               free(osav);
+                       }
+#endif
+
+                       while ((strlen(buf) > 0) && (isspace(buf[strlen(buf) - 1])))
+                               buf[strlen(buf) - 1] = 0;
+                       if ((bq == 0) &&
+                       ((!strncmp(buf, ">", 1)) || (!strncmp(buf, " >", 2)) )) {
+                               wprintf("<blockquote>");
+                               bq = 1;
+                       } else if ((bq == 1) &&
+                               (strncmp(buf, ">", 1)) && (strncmp(buf, " >", 2)) ) {
+                               wprintf("</blockquote>");
+                               bq = 0;
+                       }
+                       wprintf("<tt>");
+                       url(buf);
+                       escputs(buf);
+                       wprintf("</tt><br />\n");
+               }
+               wprintf("</i><br />");
+       }
+
+       else /** HTML is fun, but we've got to strip it first */
+       if (!strcasecmp(mime_content_type, "text/html")) {
+               output_html(mime_charset, (WC->wc_view == VIEW_WIKI ? 1 : 0));
+       }
+
+       /** Unknown weirdness */
+       else {
+               wprintf(_("I don't know how to display %s"), mime_content_type);
+               wprintf("<br />\n", mime_content_type);
+               while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { }
+       }
+
+       /** If there are attached submessages, display them now... */
+       if ( (strlen(mime_submessages) > 0) && (!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 */
+                       wprintf("<blockquote>");
+                       read_message(msgnum, 1, buf);
+                       wprintf("</blockquote>");
+               }
+       }
+
+
+       /** Afterwards, offer links to download attachments 'n' such */
+       if ( (strlen(mime_http) > 0) && (!section[0]) ) {
+               wprintf("%s", mime_http);
+       }
+
+       /** Handler for vCard parts */
+       if (strlen(vcard_partnum) > 0) {
+               part_source = load_mimepart(msgnum, vcard_partnum);
+               if (part_source != NULL) {
+
+                       /** If it's my vCard I can edit it */
+                       if (    (!strcasecmp(WC->wc_roomname, USERCONFIGROOM))
+                               || (!strcasecmp(&WC->wc_roomname[11], USERCONFIGROOM))
+                               || (WC->wc_view == VIEW_ADDRESSBOOK)
+                       ) {
+                               wprintf("<a href=\"edit_vcard?"
+                                       "msgnum=%ld?partnum=%s\">",
+                                       msgnum, vcard_partnum);
+                               wprintf("[%s]</a>", _("edit"));
+                       }
+
+                       /** In all cases, display the full card */
+                       display_vcard(part_source, 0, 1, NULL);
+               }
+       }
+
+       /** Handler for calendar parts */
+       if (strlen(cal_partnum) > 0) {
+               part_source = load_mimepart(msgnum, cal_partnum);
+               if (part_source != NULL) {
+                       cal_process_attachment(part_source,
+                                               msgnum, cal_partnum);
+               }
+       }
+
+       if (part_source) {
+               free(part_source);
+               part_source = NULL;
+       }
+
+ENDBODY:
+       wprintf("</td></tr></table>\n");
+
+       /** end everythingamundo table */
+       if (!printable_view) {
+               wprintf("</td></tr></table>\n");
+               wprintf("</div><br />\n");
+       }
+
+#ifdef HAVE_ICONV
+       if (ic != (iconv_t)(-1) ) {
+               iconv_close(ic);
+       }
+#endif
+}
+
+
+
+/**
+ * \brief Unadorned HTML output of an individual message, suitable
+ * for placing in a hidden iframe, for printing, or whatever
+ *
+ * \param msgnum_as_string Message number, as a string instead of as a long int
+ */
+void embed_message(char *msgnum_as_string) {
+       long msgnum = 0L;
+
+       msgnum = atol(msgnum_as_string);
+       begin_ajax_response();
+       read_message(msgnum, 0, "");
+       end_ajax_response();
+}
+
+
+/**
+ * \brief Printable view of a message
+ *
+ * \param msgnum_as_string Message number, as a string instead of as a long int
+ */
+void print_message(char *msgnum_as_string) {
+       long msgnum = 0L;
+
+       msgnum = atol(msgnum_as_string);
+       output_headers(0, 0, 0, 0, 0, 0);
+
+       wprintf("Content-type: text/html\r\n"
+               "Server: %s\r\n"
+               "Connection: close\r\n",
+               SERVER);
+       begin_burst();
+
+       wprintf("\r\n\r\n<html>\n"
+               "<head><title>Printable view</title></head>\n"
+               "<body onLoad=\" window.print(); window.close(); \">\n"
+       );
+       
+       read_message(msgnum, 1, "");
+
+       wprintf("\n</body></html>\n\n");
+       wDumpContent(0);
+}
+
+
+
+/**
+ * \brief Display a message's headers
+ *
+ * \param msgnum_as_string Message number, as a string instead of as a long int
+ */
+void display_headers(char *msgnum_as_string) {
+       long msgnum = 0L;
+       char buf[1024];
+
+       msgnum = atol(msgnum_as_string);
+       output_headers(0, 0, 0, 0, 0, 0);
+
+       wprintf("Content-type: text/plain\r\n"
+               "Server: %s\r\n"
+               "Connection: close\r\n",
+               SERVER);
+       begin_burst();
+
+       serv_printf("MSG2 %ld|3", msgnum);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '1') {
+               while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+                       wprintf("%s\n", buf);
+               }
+       }
+
+       wDumpContent(0);
+}
+
+
+
+/**
+ * \brief Read message in simple, JavaScript-embeddable form for 'forward'
+ *        or 'reply quoted' operations.
+ *
+ * NOTE: it is VITALLY IMPORTANT that we output no single-quotes or linebreaks
+ *       in this function.  Doing so would throw a JavaScript error in the
+ *       'supplied text' argument to the editor.
+ *
+ * \param msgnum Message number of the message we want to quote
+ * \param forward_attachments Nonzero if we want attachments to be forwarded
+ */
+void pullquote_message(long msgnum, int forward_attachments, int include_headers) {
+       char buf[SIZ];
+       char mime_partnum[256];
+       char mime_filename[256];
+       char mime_content_type[256];
+       char mime_charset[256];
+       char mime_disposition[256];
+       int mime_length;
+       char *attachments = NULL;
+       char *ptr = NULL;
+       int num_attachments = 0;
+       struct wc_attachment *att, *aptr;
+       char m_subject[256];
+       char from[256];
+       char node[256];
+       char rfca[256];
+       char reply_to[512];
+       char now[256];
+       int format_type = 0;
+       int nhdr = 0;
+       int bq = 0;
+       int i = 0;
+#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
+
+       strcpy(from, "");
+       strcpy(node, "");
+       strcpy(rfca, "");
+       strcpy(reply_to, "");
+       strcpy(mime_content_type, "text/plain");
+       strcpy(mime_charset, "us-ascii");
+
+       serv_printf("MSG4 %ld", msgnum);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '1') {
+               wprintf(_("ERROR:"));
+               wprintf("%s<br />", &buf[4]);
+               return;
+       }
+
+       strcpy(m_subject, "");
+
+       while (serv_getln(buf, sizeof buf), strcasecmp(buf, "text")) {
+               if (!strcmp(buf, "000")) {
+                       wprintf(_("unexpected end of message"));
+                       return;
+               }
+               if (include_headers) {
+                       if (!strncasecmp(buf, "nhdr=yes", 8))
+                               nhdr = 1;
+                       if (nhdr == 1)
+                               buf[0] = '_';
+                       if (!strncasecmp(buf, "type=", 5))
+                               format_type = atoi(&buf[5]);
+                       if (!strncasecmp(buf, "from=", 5)) {
+                               strcpy(from, &buf[5]);
+                               wprintf(_("from "));
+#ifdef HAVE_ICONV
+                               utf8ify_rfc822_string(from);
+#endif
+                               msgescputs(from);
+                       }
+                       if (!strncasecmp(buf, "subj=", 5)) {
+                               strcpy(m_subject, &buf[5]);
+                       }
+                       if ((!strncasecmp(buf, "hnod=", 5))
+                           && (strcasecmp(&buf[5], serv_info.serv_humannode))) {
+                               wprintf("(%s) ", &buf[5]);
+                       }
+                       if ((!strncasecmp(buf, "room=", 5))
+                           && (strcasecmp(&buf[5], WC->wc_roomname))
+                           && (strlen(&buf[5])>0) ) {
+                               wprintf(_("in "));
+                               wprintf("%s&gt; ", &buf[5]);
+                       }
+                       if (!strncasecmp(buf, "rfca=", 5)) {
+                               strcpy(rfca, &buf[5]);
+                               wprintf("&lt;");
+                               msgescputs(rfca);
+                               wprintf("&gt; ");
+                       }
+       
+                       if (!strncasecmp(buf, "node=", 5)) {
+                               strcpy(node, &buf[5]);
+                               if ( ((WC->room_flags & QR_NETWORK)
+                               || ((strcasecmp(&buf[5], serv_info.serv_nodename)
+                               && (strcasecmp(&buf[5], serv_info.serv_fqdn)))))
+                               && (strlen(rfca)==0)
+                               ) {
+                                       wprintf("@%s ", &buf[5]);
+                               }
+                       }
+                       if (!strncasecmp(buf, "rcpt=", 5)) {
+                               wprintf(_("to "));
+                               wprintf("%s ", &buf[5]);
+                       }
+                       if (!strncasecmp(buf, "time=", 5)) {
+                               fmt_date(now, atol(&buf[5]), 0);
+                               wprintf("%s ", now);
+                       }
+               }
+
+               /**
+                * Save attachment info for later.  We can't start downloading them
+                * yet because we're in the middle of a server transaction.
+                */
+               if (!strncasecmp(buf, "part=", 5)) {
+                       ptr = malloc( (strlen(buf) + ((attachments != NULL) ? strlen(attachments) : 0)) ) ;
+                       if (ptr != NULL) {
+                               ++num_attachments;
+                               sprintf(ptr, "%s%s\n",
+                                       ((attachments != NULL) ? attachments : ""),
+                                       &buf[5]
+                               );
+                               free(attachments);
+                               attachments = ptr;
+                               lprintf(9, "attachments=<%s>\n", attachments);
+                       }
+               }
+
+       }
+
+       if (include_headers) {
+               wprintf("<br>");
+
+#ifdef HAVE_ICONV
+               utf8ify_rfc822_string(m_subject);
+#endif
+               if (strlen(m_subject) > 0) {
+                       wprintf(_("Subject:"));
+                       wprintf(" ");
+                       msgescputs(m_subject);
+                       wprintf("<br />");
+               }
+
+               /**
+                * Begin body
+                */
+               wprintf("<br />");
+       }
+
+       /**
+        * Learn the content type
+        */
+       strcpy(mime_content_type, "text/plain");
+       while (serv_getln(buf, sizeof buf), (strlen(buf) > 0)) {
+               if (!strcmp(buf, "000")) {
+                       wprintf(_("unexpected end of message"));
+                       goto ENDBODY;
+               }
+               if (!strncasecmp(buf, "Content-type: ", 14)) {
+                       safestrncpy(mime_content_type, &buf[14],
+                               sizeof(mime_content_type));
+                       for (i=0; i<strlen(mime_content_type); ++i) {
+                               if (!strncasecmp(&mime_content_type[i], "charset=", 8)) {
+                                       safestrncpy(mime_charset, &mime_content_type[i+8],
+                                               sizeof mime_charset);
+                               }
+                       }
+                       for (i=0; i<strlen(mime_content_type); ++i) {
+                               if (mime_content_type[i] == ';') {
+                                       mime_content_type[i] = 0;
+                               }
+                       }
+                       for (i=0; i<strlen(mime_charset); ++i) {
+                               if (mime_charset[i] == ';') {
+                                       mime_charset[i] = 0;
+                               }
+                       }
+               }
+       }
+
+       /** Set up a character set conversion if we need to (and if we can) */
+#ifdef HAVE_ICONV
+       if ( (strcasecmp(mime_charset, "us-ascii"))
+          && (strcasecmp(mime_charset, "UTF-8"))
+          && (strcasecmp(mime_charset, ""))
+       ) {
+               ic = ctdl_iconv_open("UTF-8", mime_charset);
+               if (ic == (iconv_t)(-1) ) {
+                       lprintf(5, "%s:%d iconv_open(%s, %s) failed: %s\n",
+                               __FILE__, __LINE__, "UTF-8", mime_charset, strerror(errno));
+               }
+       }
+#endif
+
+       /** Messages in legacy Citadel variformat get handled thusly... */
+       if (!strcasecmp(mime_content_type, "text/x-citadel-variformat")) {
+               pullquote_fmout();
+       }
+
+       /* Boring old 80-column fixed format text gets handled this way... */
+       else if (!strcasecmp(mime_content_type, "text/plain")) {
+               while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+                       if (buf[strlen(buf)-1] == '\n') buf[strlen(buf)-1] = 0;
+                       if (buf[strlen(buf)-1] == '\r') buf[strlen(buf)-1] = 0;
+
+#ifdef HAVE_ICONV
+                       if (ic != (iconv_t)(-1) ) {
+                               ibuf = buf;
+                               ibuflen = strlen(ibuf);
+                               obuflen = SIZ;
+                               obuf = (char *) malloc(obuflen);
+                               osav = obuf;
+                               iconv(ic, &ibuf, &ibuflen, &obuf, &obuflen);
+                               osav[SIZ-obuflen] = 0;
+                               safestrncpy(buf, osav, sizeof buf);
+                               free(osav);
+                       }
+#endif
+
+                       while ((strlen(buf) > 0) && (isspace(buf[strlen(buf) - 1])))
+                               buf[strlen(buf) - 1] = 0;
+                       if ((bq == 0) &&
+                       ((!strncmp(buf, ">", 1)) || (!strncmp(buf, " >", 2)) )) {
+                               wprintf("<blockquote>");
+                               bq = 1;
+                       } else if ((bq == 1) &&
+                               (strncmp(buf, ">", 1)) && (strncmp(buf, " >", 2)) ) {
+                               wprintf("</blockquote>");
+                               bq = 0;
+                       }
+                       wprintf("<tt>");
+                       url(buf);
+                       msgescputs(buf);
+                       wprintf("</tt><br />");
+               }
+               wprintf("</i><br />");
+       }
+
+       /** HTML just gets escaped and stuffed back into the editor */
+       else if (!strcasecmp(mime_content_type, "text/html")) {
+               while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+                       strcat(buf, "\n");
+                       msgescputs(buf);
+               }
+       }
+
+       /** Unknown weirdness ... don't know how to handle this content type */
+       else {
+               while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) { }
+       }
+
+ENDBODY:
+       /** end of body handler */
+
+       /*
+        * If there were attachments, we have to download them and insert them
+        * into the attachment chain for the forwarded message we are composing.
+        */
+       if ( (forward_attachments) && (num_attachments) ) {
+               for (i=0; i<num_attachments; ++i) {
+                       extract_token(buf, attachments, i, '\n', sizeof buf);
+                       extract_token(mime_filename, buf, 1, '|', sizeof mime_filename);
+                       extract_token(mime_partnum, buf, 2, '|', sizeof mime_partnum);
+                       extract_token(mime_disposition, buf, 3, '|', sizeof mime_disposition);
+                       extract_token(mime_content_type, buf, 4, '|', sizeof mime_content_type);
+                       mime_length = extract_int(buf, 5);
+
+                       /*
+                        * tracing  ... uncomment if necessary
+                        *
+                        */
+                       lprintf(9, "fwd filename: %s\n", mime_filename);
+                       lprintf(9, "fwd partnum : %s\n", mime_partnum);
+                       lprintf(9, "fwd conttype: %s\n", mime_content_type);
+                       lprintf(9, "fwd dispose : %s\n", mime_disposition);
+                       lprintf(9, "fwd length  : %d\n", mime_length);
+
+                       if ( (!strcasecmp(mime_disposition, "inline"))
+                          || (!strcasecmp(mime_disposition, "attachment")) ) {
+               
+                               /* Create an attachment struct from this mime part... */
+                               att = malloc(sizeof(struct wc_attachment));
+                               memset(att, 0, sizeof(struct wc_attachment));
+                               att->length = mime_length;
+                               strcpy(att->content_type, mime_content_type);
+                               strcpy(att->filename, mime_filename);
+                               att->next = NULL;
+                               att->data = load_mimepart(msgnum, mime_partnum);
+               
+                               /* And add it to the list. */
+                               if (WC->first_attachment == NULL) {
+                                       WC->first_attachment = att;
+                               }
+                               else {
+                                       aptr = WC->first_attachment;
+                                       while (aptr->next != NULL) aptr = aptr->next;
+                                       aptr->next = att;
+                               }
+                       }
+
+               }
+       }
+
+#ifdef HAVE_ICONV
+       if (ic != (iconv_t)(-1) ) {
+               iconv_close(ic);
+       }
+#endif
+
+       if (attachments != NULL) {
+               free(attachments);
+       }
+}
+
+/**
+ * \brief Display one row in the mailbox summary view
+ *
+ * \param num The row number to be displayed
+ */
+void display_summarized(int num) {
+       char datebuf[64];
+
+       wprintf("<tr id=\"m%ld\" style=\"width:100%%;font-weight:%s;background-color:#ffffff\" "
+               "onMouseDown=\"CtdlMoveMsgMouseDown(event,%ld)\">",
+               WC->summ[num].msgnum,
+               (WC->summ[num].is_new ? "bold" : "normal"),
+               WC->summ[num].msgnum
+       );
+
+       wprintf("<td width=%d%%>", SUBJ_COL_WIDTH_PCT);
+       escputs(WC->summ[num].subj);
+       wprintf("</td>");
+
+       wprintf("<td width=%d%%>", SENDER_COL_WIDTH_PCT);
+       escputs(WC->summ[num].from);
+       wprintf("</td>");
+
+       wprintf("<td width=%d%%>", DATE_PLUS_BUTTONS_WIDTH_PCT);
+       fmt_date(datebuf, WC->summ[num].date, 1);       /* brief */
+       escputs(datebuf);
+       wprintf("</td>");
+
+       wprintf("</tr>\n");
+}
+
+
+
+/**
+ * \brief display the adressbook overview
+ * \param msgnum the citadel message number
+ * \param alpha what????
+ */
+void display_addressbook(long msgnum, char alpha) {
+       char buf[SIZ];
+       char mime_partnum[SIZ];
+       char mime_filename[SIZ];
+       char mime_content_type[SIZ];
+       char mime_disposition[SIZ];
+       int mime_length;
+       char vcard_partnum[SIZ];
+       char *vcard_source = NULL;
+       struct message_summary summ;
+
+       memset(&summ, 0, sizeof(summ));
+       safestrncpy(summ.subj, _("(no subject)"), sizeof summ.subj);
+
+       sprintf(buf, "MSG0 %ld|1", msgnum);     /* ask for headers only */
+       serv_puts(buf);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '1') return;
+
+       while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+               if (!strncasecmp(buf, "part=", 5)) {
+                       extract_token(mime_filename, &buf[5], 1, '|', sizeof mime_filename);
+                       extract_token(mime_partnum, &buf[5], 2, '|', sizeof mime_partnum);
+                       extract_token(mime_disposition, &buf[5], 3, '|', sizeof mime_disposition);
+                       extract_token(mime_content_type, &buf[5], 4, '|', sizeof mime_content_type);
+                       mime_length = extract_int(&buf[5], 5);
+
+                       if (!strcasecmp(mime_content_type, "text/x-vcard")) {
+                               strcpy(vcard_partnum, mime_partnum);
+                       }
+
+               }
+       }
+
+       if (strlen(vcard_partnum) > 0) {
+               vcard_source = load_mimepart(msgnum, vcard_partnum);
+               if (vcard_source != NULL) {
+
+                       /** Display the summary line */
+                       display_vcard(vcard_source, alpha, 0, NULL);
+
+                       /** If it's my vCard I can edit it */
+                       if (    (!strcasecmp(WC->wc_roomname, USERCONFIGROOM))
+                               || (!strcasecmp(&WC->wc_roomname[11], USERCONFIGROOM))
+                               || (WC->wc_view == VIEW_ADDRESSBOOK)
+                       ) {
+                               wprintf("<a href=\"edit_vcard?"
+                                       "msgnum=%ld?partnum=%s\">",
+                                       msgnum, vcard_partnum);
+                               wprintf("[%s]</a>", _("edit"));
+                       }
+
+                       free(vcard_source);
+               }
+       }
+
+}
+
+
+
+/**
+ * \brief  If it's an old "Firstname Lastname" style record, try to convert it.
+ * \param namebuf name to analyze, reverse if nescessary
+ */
+void lastfirst_firstlast(char *namebuf) {
+       char firstname[SIZ];
+       char lastname[SIZ];
+       int i;
+
+       if (namebuf == NULL) return;
+       if (strchr(namebuf, ';') != NULL) return;
+
+       i = num_tokens(namebuf, ' ');
+       if (i < 2) return;
+
+       extract_token(lastname, namebuf, i-1, ' ', sizeof lastname);
+       remove_token(namebuf, i-1, ' ');
+       strcpy(firstname, namebuf);
+       sprintf(namebuf, "%s; %s", lastname, firstname);
+}
+
+/**
+ * \brief fetch what??? name
+ * \param msgnum the citadel message number
+ * \param namebuf where to put the name in???
+ */
+void fetch_ab_name(long msgnum, char *namebuf) {
+       char buf[SIZ];
+       char mime_partnum[SIZ];
+       char mime_filename[SIZ];
+       char mime_content_type[SIZ];
+       char mime_disposition[SIZ];
+       int mime_length;
+       char vcard_partnum[SIZ];
+       char *vcard_source = NULL;
+       int i;
+       struct message_summary summ;
+
+       if (namebuf == NULL) return;
+       strcpy(namebuf, "");
+
+       memset(&summ, 0, sizeof(summ));
+       safestrncpy(summ.subj, "(no subject)", sizeof summ.subj);
+
+       sprintf(buf, "MSG0 %ld|1", msgnum);     /** ask for headers only */
+       serv_puts(buf);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '1') return;
+
+       while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+               if (!strncasecmp(buf, "part=", 5)) {
+                       extract_token(mime_filename, &buf[5], 1, '|', sizeof mime_filename);
+                       extract_token(mime_partnum, &buf[5], 2, '|', sizeof mime_partnum);
+                       extract_token(mime_disposition, &buf[5], 3, '|', sizeof mime_disposition);
+                       extract_token(mime_content_type, &buf[5], 4, '|', sizeof mime_content_type);
+                       mime_length = extract_int(&buf[5], 5);
+
+                       if (!strcasecmp(mime_content_type, "text/x-vcard")) {
+                               strcpy(vcard_partnum, mime_partnum);
+                       }
+
+               }
+       }
+
+       if (strlen(vcard_partnum) > 0) {
+               vcard_source = load_mimepart(msgnum, vcard_partnum);
+               if (vcard_source != NULL) {
+
+                       /* Grab the name off the card */
+                       display_vcard(vcard_source, 0, 0, namebuf);
+
+                       free(vcard_source);
+               }
+       }
+
+       lastfirst_firstlast(namebuf);
+       striplt(namebuf);
+       for (i=0; i<strlen(namebuf); ++i) {
+               if (namebuf[i] != ';') return;
+       }
+       strcpy(namebuf, _("(no name)"));
+}
+
+
+
+/**
+ * \brief Record compare function for sorting address book indices
+ * \param ab1 adressbook one
+ * \param ab2 adressbook two
+ */
+int abcmp(const void *ab1, const void *ab2) {
+       return(strcasecmp(
+               (((const struct addrbookent *)ab1)->ab_name),
+               (((const struct addrbookent *)ab2)->ab_name)
+       ));
+}
+
+
+/**
+ * \brief Helper function for do_addrbook_view()
+ * Converts a name into a three-letter tab label
+ * \param tabbuf the tabbuffer to add name to
+ * \param name the name to add to the tabbuffer
+ */
+void nametab(char *tabbuf, char *name) {
+       stresc(tabbuf, name, 0, 0);
+       tabbuf[0] = toupper(tabbuf[0]);
+       tabbuf[1] = tolower(tabbuf[1]);
+       tabbuf[2] = tolower(tabbuf[2]);
+       tabbuf[3] = 0;
+}
+
+
+/**
+ * \brief Render the address book using info we gathered during the scan
+ * \param addrbook the addressbook to render
+ * \param num_ab the number of the addressbook
+ */
+void do_addrbook_view(struct addrbookent *addrbook, int num_ab) {
+       int i = 0;
+       int displayed = 0;
+       int bg = 0;
+       static int NAMESPERPAGE = 60;
+       int num_pages = 0;
+       int page = 0;
+       int tabfirst = 0;
+       char tabfirst_label[SIZ];
+       int tablast = 0;
+       char tablast_label[SIZ];
+
+       if (num_ab == 0) {
+               wprintf("<br /><br /><br /><div align=\"center\"><i>");
+               wprintf(_("This address book is empty."));
+               wprintf("</i></div>\n");
+               return;
+       }
+
+       if (num_ab > 1) {
+               qsort(addrbook, num_ab, sizeof(struct addrbookent), abcmp);
+       }
+
+       num_pages = num_ab / NAMESPERPAGE;
+
+       page = atoi(bstr("page"));
+
+       wprintf("Page: ");
+       for (i=0; i<=num_pages; ++i) {
+               if (i != page) {
+                       wprintf("<a href=\"readfwd?page=%d\">", i);
+               }
+               else {
+                       wprintf("<B>");
+               }
+               tabfirst = i * NAMESPERPAGE;
+               tablast = tabfirst + NAMESPERPAGE - 1;
+               if (tablast > (num_ab - 1)) tablast = (num_ab - 1);
+               nametab(tabfirst_label, addrbook[tabfirst].ab_name);
+               nametab(tablast_label, addrbook[tablast].ab_name);
+               wprintf("[%s&nbsp;-&nbsp;%s]",
+                       tabfirst_label, tablast_label
+               );
+               if (i != page) {
+                       wprintf("</A>\n");
+               }
+               else {
+                       wprintf("</B>\n");
+               }
+       }
+       wprintf("<br />\n");
+
+       wprintf("<table border=0 cellspacing=0 "
+               "cellpadding=3 width=100%%>\n"
+       );
+
+       for (i=0; i<num_ab; ++i) {
+
+               if ((i / NAMESPERPAGE) == page) {
+
+                       if ((displayed % 4) == 0) {
+                               if (displayed > 0) {
+                                       wprintf("</tr>\n");
+                               }
+                               bg = 1 - bg;
+                               wprintf("<tr bgcolor=\"#%s\">",
+                                       (bg ? "DDDDDD" : "FFFFFF")
+                               );
+                       }
+       
+                       wprintf("<td>");
+       
+                       wprintf("<a href=\"readfwd?startmsg=%ld&is_singlecard=1",
+                               addrbook[i].ab_msgnum);
+                       wprintf("?maxmsgs=1?summary=0?alpha=%s\">", bstr("alpha"));
+                       vcard_n_prettyize(addrbook[i].ab_name);
+                       escputs(addrbook[i].ab_name);
+                       wprintf("</a></td>\n");
+                       ++displayed;
+               }
+       }
+
+       wprintf("</tr></table>\n");
+}
+
+
+
+/**
+ * \brief load message pointers from the server
+ * \param servcmd the citadel command to send to the citserver
+ * \param with_headers what headers???
+ */
+int load_msg_ptrs(char *servcmd, int with_headers)
+{
+       char buf[1024];
+       time_t datestamp;
+       char fullname[128];
+       char nodename[128];
+       char inetaddr[128];
+       char subject[256];
+       int nummsgs;
+       int maxload = 0;
+
+       int num_summ_alloc = 0;
+
+       if (WC->summ != NULL) {
+               free(WC->summ);
+               WC->num_summ = 0;
+               WC->summ = NULL;
+       }
+       num_summ_alloc = 100;
+       WC->num_summ = 0;
+       WC->summ = malloc(num_summ_alloc * sizeof(struct message_summary));
+
+       nummsgs = 0;
+       maxload = sizeof(WC->msgarr) / sizeof(long) ;
+       serv_puts(servcmd);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '1') {
+               return (nummsgs);
+       }
+       while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+               if (nummsgs < maxload) {
+                       WC->msgarr[nummsgs] = extract_long(buf, 0);
+                       datestamp = extract_long(buf, 1);
+                       extract_token(fullname, buf, 2, '|', sizeof fullname);
+                       extract_token(nodename, buf, 3, '|', sizeof nodename);
+                       extract_token(inetaddr, buf, 4, '|', sizeof inetaddr);
+                       extract_token(subject, buf, 5, '|', sizeof subject);
+                       ++nummsgs;
+
+                       if (with_headers) {
+                               if (nummsgs > num_summ_alloc) {
+                                       num_summ_alloc *= 2;
+                                       WC->summ = realloc(WC->summ,
+                                               num_summ_alloc * sizeof(struct message_summary));
+                               }
+                               ++WC->num_summ;
+
+                               memset(&WC->summ[nummsgs-1], 0, sizeof(struct message_summary));
+                               WC->summ[nummsgs-1].msgnum = WC->msgarr[nummsgs-1];
+                               safestrncpy(WC->summ[nummsgs-1].subj,
+                                       _("(no subject)"), sizeof WC->summ[nummsgs-1].subj);
+                               if (strlen(fullname) > 0) {
+                                       safestrncpy(WC->summ[nummsgs-1].from,
+                                               fullname, sizeof WC->summ[nummsgs-1].from);
+                               }
+                               if (strlen(subject) > 0) {
+                               safestrncpy(WC->summ[nummsgs-1].subj, subject,
+                                       sizeof WC->summ[nummsgs-1].subj);
+                               }
+#ifdef HAVE_ICONV
+                               /** Handle subjects with RFC2047 encoding */
+                               utf8ify_rfc822_string(WC->summ[nummsgs-1].subj);
+#endif
+                               if (strlen(WC->summ[nummsgs-1].subj) > 75) {
+                                       strcpy(&WC->summ[nummsgs-1].subj[72], "...");
+                               }
+
+                               if (strlen(nodename) > 0) {
+                                       if ( ((WC->room_flags & QR_NETWORK)
+                                          || ((strcasecmp(nodename, serv_info.serv_nodename)
+                                          && (strcasecmp(nodename, serv_info.serv_fqdn)))))
+                                       ) {
+                                               strcat(WC->summ[nummsgs-1].from, " @ ");
+                                               strcat(WC->summ[nummsgs-1].from, nodename);
+                                       }
+                               }
+
+                               WC->summ[nummsgs-1].date = datestamp;
+       
+#ifdef HAVE_ICONV
+                               /** Handle senders with RFC2047 encoding */
+                               utf8ify_rfc822_string(WC->summ[nummsgs-1].from);
+#endif
+                               if (strlen(WC->summ[nummsgs-1].from) > 25) {
+                                       strcpy(&WC->summ[nummsgs-1].from[22], "...");
+                               }
+                       }
+               }
+       }
+       return (nummsgs);
+}
+
+/**
+ * \brief qsort() compatible function to compare two longs in descending order.
+ *
+ * \param s1 first number to compare 
+ * \param s2 second number to compare
+ */
+int longcmp_r(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);
+}
+
+/**
+ * \brief qsort() compatible function to compare two message summary structs by ascending subject.
+ *
+ * \param s1 first item to compare 
+ * \param s2 second item to compare
+ */
+int summcmp_subj(const void *s1, const void *s2) {
+       struct message_summary *summ1;
+       struct message_summary *summ2;
+       
+       summ1 = (struct message_summary *)s1;
+       summ2 = (struct message_summary *)s2;
+       return strcasecmp(summ1->subj, summ2->subj);
+}
+
+/**
+ * \brief qsort() compatible function to compare two message summary structs by descending subject.
+ *
+ * \param s1 first item to compare 
+ * \param s2 second item to compare
+ */
+int summcmp_rsubj(const void *s1, const void *s2) {
+       struct message_summary *summ1;
+       struct message_summary *summ2;
+       
+       summ1 = (struct message_summary *)s1;
+       summ2 = (struct message_summary *)s2;
+       return strcasecmp(summ2->subj, summ1->subj);
+}
+
+/**
+ * \brief qsort() compatible function to compare two message summary structs by ascending sender.
+ *
+ * \param s1 first item to compare 
+ * \param s2 second item to compare
+ */
+int summcmp_sender(const void *s1, const void *s2) {
+       struct message_summary *summ1;
+       struct message_summary *summ2;
+       
+       summ1 = (struct message_summary *)s1;
+       summ2 = (struct message_summary *)s2;
+       return strcasecmp(summ1->from, summ2->from);
+}
+
+/**
+ * \brief qsort() compatible function to compare two message summary structs by descending sender.
+ *
+ * \param s1 first item to compare 
+ * \param s2 second item to compare
+ */
+int summcmp_rsender(const void *s1, const void *s2) {
+       struct message_summary *summ1;
+       struct message_summary *summ2;
+       
+       summ1 = (struct message_summary *)s1;
+       summ2 = (struct message_summary *)s2;
+       return strcasecmp(summ2->from, summ1->from);
+}
+
+/**
+ * \brief qsort() compatible function to compare two message summary structs by ascending date.
+ *
+ * \param s1 first item to compare 
+ * \param s2 second item to compare
+ */
+int summcmp_date(const void *s1, const void *s2) {
+       struct message_summary *summ1;
+       struct message_summary *summ2;
+       
+       summ1 = (struct message_summary *)s1;
+       summ2 = (struct message_summary *)s2;
+
+       if (summ1->date < summ2->date) return -1;
+       else if (summ1->date > summ2->date) return +1;
+       else return 0;
+}
+
+/**
+ * \brief qsort() compatible function to compare two message summary structs by descending date.
+ *
+ * \param s1 first item to compare 
+ * \param s2 second item to compare
+ */
+int summcmp_rdate(const void *s1, const void *s2) {
+       struct message_summary *summ1;
+       struct message_summary *summ2;
+       
+       summ1 = (struct message_summary *)s1;
+       summ2 = (struct message_summary *)s2;
+
+       if (summ1->date < summ2->date) return +1;
+       else if (summ1->date > summ2->date) return -1;
+       else return 0;
+}
+
+
+
+/**
+ * \brief command loop for reading messages
+ *
+ * \param oper Set to "readnew" or "readold" or "readfwd" or "headers"
+ */
+void readloop(char *oper)
+{
+       char cmd[SIZ];
+       char buf[SIZ];
+       char old_msgs[SIZ];
+       int a, b;
+       int nummsgs;
+       long startmsg;
+       int maxmsgs;
+       long *displayed_msgs = NULL;
+       int num_displayed = 0;
+       int is_summary = 0;
+       int is_addressbook = 0;
+       int is_singlecard = 0;
+       int is_calendar = 0;
+       int is_tasks = 0;
+       int is_notes = 0;
+       int is_bbview = 0;
+       int lo, hi;
+       int lowest_displayed = (-1);
+       int highest_displayed = 0;
+       struct addrbookent *addrbook = NULL;
+       int num_ab = 0;
+       char *sortby = NULL;
+       char sortpref_name[128];
+       char sortpref_value[128];
+       char *subjsort_button;
+       char *sendsort_button;
+       char *datesort_button;
+       int bbs_reverse = 0;
+
+       if (WC->wc_view == VIEW_WIKI) {
+               sprintf(buf, "wiki?room=%s?page=home", WC->wc_roomname);
+               http_redirect(buf);
+               return;
+       }
+
+       startmsg = atol(bstr("startmsg"));
+       maxmsgs = atoi(bstr("maxmsgs"));
+       is_summary = atoi(bstr("summary"));
+       if (maxmsgs == 0) maxmsgs = DEFAULT_MAXMSGS;
+
+       snprintf(sortpref_name, sizeof sortpref_name, "sort %s", WC->wc_roomname);
+       get_preference(sortpref_name, sortpref_value, sizeof sortpref_value);
+
+       sortby = bstr("sortby");
+       if ( (strlen(sortby) > 0) && (strcasecmp(sortby, sortpref_value)) ) {
+               set_preference(sortpref_name, sortby, 1);
+       }
+       if (strlen(sortby) == 0) sortby = sortpref_value;
+
+       /** mailbox sort */
+       if (strlen(sortby) == 0) sortby = "rdate";
+
+       /** message board sort */
+       if (!strcasecmp(sortby, "reverse")) {
+               bbs_reverse = 1;
+       }
+       else {
+               bbs_reverse = 0;
+       }
+
+       output_headers(1, 1, 1, 0, 0, 0);
+
+       /**
+        * When in summary mode, always show ALL messages instead of just
+        * new or old.  Otherwise, show what the user asked for.
+        */
+       if (!strcmp(oper, "readnew")) {
+               strcpy(cmd, "MSGS NEW");
+       }
+       else if (!strcmp(oper, "readold")) {
+               strcpy(cmd, "MSGS OLD");
+       }
+       else {
+               strcpy(cmd, "MSGS ALL");
+       }
+
+       if ((WC->wc_view == VIEW_MAILBOX) && (maxmsgs > 1)) {
+               is_summary = 1;
+               strcpy(cmd, "MSGS ALL");
+       }
+
+       if ((WC->wc_view == VIEW_ADDRESSBOOK) && (maxmsgs > 1)) {
+               is_addressbook = 1;
+               strcpy(cmd, "MSGS ALL");
+               maxmsgs = 9999999;
+       }
+
+       if (is_summary) {
+               strcpy(cmd, "MSGS ALL|||1");    /**< fetch header summary */
+               startmsg = 1;
+               maxmsgs = 9999999;
+       }
+
+       /**
+        * Are we doing a summary view?  If so, we need to know old messages
+        * and new messages, so we can do that pretty boldface thing for the
+        * new messages.
+        */
+       strcpy(old_msgs, "");
+       if (is_summary) {
+               serv_puts("GTSN");
+               serv_getln(buf, sizeof buf);
+               if (buf[0] == '2') {
+                       strcpy(old_msgs, &buf[4]);
+               }
+       }
+
+       is_singlecard = atoi(bstr("is_singlecard"));
+
+       if (WC->wc_default_view == VIEW_CALENDAR) {             /**< calendar */
+               is_calendar = 1;
+               strcpy(cmd, "MSGS ALL");
+               maxmsgs = 32767;
+       }
+       if (WC->wc_default_view == VIEW_TASKS) {                /**< tasks */
+               is_tasks = 1;
+               strcpy(cmd, "MSGS ALL");
+               maxmsgs = 32767;
+       }
+       if (WC->wc_default_view == VIEW_NOTES) {                /**< notes */
+               is_notes = 1;
+               strcpy(cmd, "MSGS ALL");
+               maxmsgs = 32767;
+       }
+
+       if (is_notes) {
+               wprintf("<div align=center>%s</div>\n", _("Click on any note to edit it."));
+               wprintf("<div id=\"new_notes_here\"></div>\n");
+       }
+
+       nummsgs = load_msg_ptrs(cmd, is_summary);
+       if (nummsgs == 0) {
+
+               if ((!is_tasks) && (!is_calendar) && (!is_notes) && (!is_addressbook)) {
+                       wprintf("<em>");
+                       if (!strcmp(oper, "readnew")) {
+                               wprintf(_("No new messages."));
+                       } else if (!strcmp(oper, "readold")) {
+                               wprintf(_("No old messages."));
+                       } else {
+                               wprintf(_("No messages here."));
+                       }
+                       wprintf("</em>\n");
+               }
+
+               goto DONE;
+       }
+
+       if (is_summary) {
+               for (a = 0; a < nummsgs; ++a) {
+                       /** Are you a new message, or an old message? */
+                       if (is_summary) {
+                               if (is_msg_in_mset(old_msgs, WC->msgarr[a])) {
+                                       WC->summ[a].is_new = 0;
+                               }
+                               else {
+                                       WC->summ[a].is_new = 1;
+                               }
+                       }
+               }
+       }
+
+       if (startmsg == 0L) {
+               if (bbs_reverse) {
+                       startmsg = WC->msgarr[(nummsgs >= maxmsgs) ? (nummsgs - maxmsgs) : 0];
+               }
+               else {
+                       startmsg = WC->msgarr[0];
+               }
+       }
+
+       if (is_summary) {
+               if (!strcasecmp(sortby, "subject")) {
+                       qsort(WC->summ, WC->num_summ,
+                               sizeof(struct message_summary), summcmp_subj);
+               }
+               else if (!strcasecmp(sortby, "rsubject")) {
+                       qsort(WC->summ, WC->num_summ,
+                               sizeof(struct message_summary), summcmp_rsubj);
+               }
+               else if (!strcasecmp(sortby, "sender")) {
+                       qsort(WC->summ, WC->num_summ,
+                               sizeof(struct message_summary), summcmp_sender);
+               }
+               else if (!strcasecmp(sortby, "rsender")) {
+                       qsort(WC->summ, WC->num_summ,
+                               sizeof(struct message_summary), summcmp_rsender);
+               }
+               else if (!strcasecmp(sortby, "date")) {
+                       qsort(WC->summ, WC->num_summ,
+                               sizeof(struct message_summary), summcmp_date);
+               }
+               else if (!strcasecmp(sortby, "rdate")) {
+                       qsort(WC->summ, WC->num_summ,
+                               sizeof(struct message_summary), summcmp_rdate);
+               }
+       }
+
+       if (!strcasecmp(sortby, "subject")) {
+               subjsort_button = "<a href=\"readfwd?startmsg=1?maxmsgs=9999999?summary=1?sortby=rsubject\"><img border=\"0\" src=\"static/down_pointer.gif\" /></a>" ;
+       }
+       else if (!strcasecmp(sortby, "rsubject")) {
+               subjsort_button = "<a href=\"readfwd?startmsg=1?maxmsgs=9999999?summary=1?sortby=subject\"><img border=\"0\" src=\"static/up_pointer.gif\" /></a>" ;
+       }
+       else {
+               subjsort_button = "<a href=\"readfwd?startmsg=1?maxmsgs=9999999?summary=1?sortby=subject\"><img border=\"0\" src=\"static/sort_none.gif\" /></a>" ;
+       }
+
+       if (!strcasecmp(sortby, "sender")) {
+               sendsort_button = "<a href=\"readfwd?startmsg=1?maxmsgs=9999999?summary=1?sortby=rsender\"><img border=\"0\" src=\"static/down_pointer.gif\" /></a>" ;
+       }
+       else if (!strcasecmp(sortby, "rsender")) {
+               sendsort_button = "<a href=\"readfwd?startmsg=1?maxmsgs=9999999?summary=1?sortby=sender\"><img border=\"0\" src=\"static/up_pointer.gif\" /></a>" ;
+       }
+       else {
+               sendsort_button = "<a href=\"readfwd?startmsg=1?maxmsgs=9999999?summary=1?sortby=sender\"><img border=\"0\" src=\"static/sort_none.gif\" /></a>" ;
+       }
+
+       if (!strcasecmp(sortby, "date")) {
+               datesort_button = "<a href=\"readfwd?startmsg=1?maxmsgs=9999999?summary=1?sortby=rdate\"><img border=\"0\" src=\"static/down_pointer.gif\" /></a>" ;
+       }
+       else if (!strcasecmp(sortby, "rdate")) {
+               datesort_button = "<a href=\"readfwd?startmsg=1?maxmsgs=9999999?summary=1?sortby=date\"><img border=\"0\" src=\"static/up_pointer.gif\" /></a>" ;
+       }
+       else {
+               datesort_button = "<a href=\"readfwd?startmsg=1?maxmsgs=9999999?summary=1?sortby=rdate\"><img border=\"0\" src=\"static/sort_none.gif\" /></a>" ;
+       }
+
+       if (is_summary) {
+               wprintf("</div>\n");            /** end of 'content' div */
+
+               wprintf("<script language=\"javascript\" type=\"text/javascript\">"
+                       " document.onkeydown = CtdlMsgListKeyPress;     "
+                       " if (document.layers) {                        "
+                       "       document.captureEvents(Event.KEYPRESS); "
+                       " }                                             "
+                       "</script>\n"
+               );
+
+               /** note that Date and Delete are now in the same column */
+               wprintf("<div id=\"message_list_hdr\">"
+                       "<div class=\"fix_scrollbar_bug\">"
+                       "<table cellspacing=0 style=\"width:100%%\">"
+                       "<tr>"
+               );
+               wprintf("<td width=%d%%><b><i>%s</i></b> %s</td>"
+                       "<td width=%d%%><b><i>%s</i></b> %s</td>"
+                       "<td width=%d%%><b><i>%s</i></b> %s"
+                       "&nbsp;"
+                       "<input type=\"submit\" name=\"delete_button\" style=\"font-size:6pt\" "
+                       " onClick=\"CtdlDeleteSelectedMessages(event)\" "
+                       " value=\"%s\">"
+                       "</td>"
+                       "</tr>\n"
+                       ,
+                       SUBJ_COL_WIDTH_PCT,
+                       _("Subject"),   subjsort_button,
+                       SENDER_COL_WIDTH_PCT,
+                       _("Sender"),    sendsort_button,
+                       DATE_PLUS_BUTTONS_WIDTH_PCT,
+                       _("Date"),      datesort_button,
+                       _("Delete")
+               );
+               wprintf("</table></div></div>\n");
+
+               wprintf("<div id=\"message_list\">"
+
+                       "<div class=\"fix_scrollbar_bug\">\n"
+
+                       "<table class=\"mailbox_summary\" id=\"summary_headers\" rules=rows "
+                       "cellspacing=0 style=\"width:100%%;-moz-user-select:none;\">"
+               );
+       }
+
+       for (a = 0; a < nummsgs; ++a) {
+               if ((WC->msgarr[a] >= startmsg) && (num_displayed < maxmsgs)) {
+
+                       /** Display the message */
+                       if (is_summary) {
+                               display_summarized(a);
+                       }
+                       else if (is_addressbook) {
+                               fetch_ab_name(WC->msgarr[a], buf);
+                               ++num_ab;
+                               addrbook = realloc(addrbook,
+                                       (sizeof(struct addrbookent) * num_ab) );
+                               safestrncpy(addrbook[num_ab-1].ab_name, buf,
+                                       sizeof(addrbook[num_ab-1].ab_name));
+                               addrbook[num_ab-1].ab_msgnum = WC->msgarr[a];
+                       }
+                       else if (is_calendar) {
+                               display_calendar(WC->msgarr[a]);
+                       }
+                       else if (is_tasks) {
+                               display_task(WC->msgarr[a]);
+                       }
+                       else if (is_notes) {
+                               display_note(WC->msgarr[a]);
+                       }
+                       else {
+                               if (displayed_msgs == NULL) {
+                                       displayed_msgs = malloc(sizeof(long) *
+                                                               (maxmsgs<nummsgs ? maxmsgs : nummsgs));
+                               }
+                               displayed_msgs[num_displayed] = WC->msgarr[a];
+                       }
+
+                       if (lowest_displayed < 0) lowest_displayed = a;
+                       highest_displayed = a;
+
+                       ++num_displayed;
+               }
+       }
+
+       /**
+        * Set the "is_bbview" variable if it appears that we are looking at
+        * a classic bulletin board view.
+        */
+       if ((!is_tasks) && (!is_calendar) && (!is_addressbook)
+             && (!is_notes) && (!is_singlecard) && (!is_summary)) {
+               is_bbview = 1;
+       }
+
+       /** Output loop */
+       if (displayed_msgs != NULL) {
+               if (bbs_reverse) {
+                       qsort(displayed_msgs, num_displayed, sizeof(long), longcmp_r);
+               }
+
+               /** if we do a split bbview in the future, begin messages div here */
+
+               for (a=0; a<num_displayed; ++a) {
+                       read_message(displayed_msgs[a], 0, "");
+               }
+
+               /** if we do a split bbview in the future, end messages div here */
+
+               free(displayed_msgs);
+               displayed_msgs = NULL;
+       }
+
+       if (is_summary) {
+               wprintf("</table>"
+                       "</div>\n");                    /**< end of 'fix_scrollbar_bug' div */
+               wprintf("</div>");                      /**< end of 'message_list' div */
+
+               /** Here's the grab-it-to-resize-the-message-list widget */
+               wprintf("<div id=\"resize_msglist\" "
+                       "onMouseDown=\"CtdlResizeMsgListMouseDown(event)\">"
+                       "<div class=\"fix_scrollbar_bug\">"
+                       "<table width=100%% border=3 cellspacing=0 "
+                       "bgcolor=\"#cccccc\" "
+                       "cellpadding=0><TR><TD> </td></tr></table>"
+                       "</div></div>\n"
+               );
+
+               wprintf("<div id=\"preview_pane\">");   /**< The preview pane will initially be empty */
+       }
+
+       /**
+        * Bump these because although we're thinking in zero base, the user
+        * is a drooling idiot and is thinking in one base.
+        */
+       ++lowest_displayed;
+       ++highest_displayed;
+
+       /**
+        * If we're not currently looking at ALL requested
+        * messages, then display the selector bar
+        */
+       if (is_bbview) {
+               /** begin bbview scroller */
+               wprintf("<form name=\"msgomatic\">");
+               wprintf(_("Reading #"), lowest_displayed, highest_displayed);
+
+               wprintf("<select name=\"whichones\" size=\"1\" "
+                       "OnChange=\"location.href=msgomatic.whichones.options"
+                       "[selectedIndex].value\">\n");
+
+               if (bbs_reverse) {
+                       for (b=nummsgs-1; b>=0; b = b - maxmsgs) {
+                               hi = b + 1;
+                               lo = b - maxmsgs + 2;
+                               if (lo < 1) lo = 1;
+                               wprintf("<option %s value="
+                                       "\"%s"
+                                       "?startmsg=%ld"
+                                       "?maxmsgs=%d"
+                                       "?summary=%d\">"
+                                       "%d-%d</option> \n",
+                                       ((WC->msgarr[lo-1] == startmsg) ? "selected" : ""),
+                                       oper,
+                                       WC->msgarr[lo-1],
+                                       maxmsgs,
+                                       is_summary,
+                                       hi, lo);
+                       }
+               }
+               else {
+                       for (b=0; b<nummsgs; b = b + maxmsgs) {
+                               lo = b + 1;
+                               hi = b + maxmsgs + 1;
+                               if (hi > nummsgs) hi = nummsgs;
+                               wprintf("<option %s value="
+                                       "\"%s"
+                                       "?startmsg=%ld"
+                                       "?maxmsgs=%d"
+                                       "?summary=%d\">"
+                                       "%d-%d</option> \n",
+                                       ((WC->msgarr[b] == startmsg) ? "selected" : ""),
+                                       oper,
+                                       WC->msgarr[lo-1],
+                                       maxmsgs,
+                                       is_summary,
+                                       lo, hi);
+                       }
+               }
+
+               wprintf("<option value=\"%s?startmsg=%ld"
+                       "?maxmsgs=9999999?summary=%d\">"
+                       "ALL"
+                       "</option> ",
+                       oper,
+                       WC->msgarr[0], is_summary);
+
+               wprintf("</select> ");
+               wprintf(_("of %d messages."), nummsgs);
+
+               /** forward/reverse */
+               wprintf("&nbsp;<select name=\"direction\" size=\"1\" "
+                       "OnChange=\"location.href=msgomatic.direction.options"
+                       "[selectedIndex].value\">\n"
+               );
+
+               wprintf("<option %s value=\"%s?sortby=forward\">oldest to newest</option>\n",
+                       (bbs_reverse ? "" : "selected"),
+                       oper
+               );
+       
+               wprintf("<option %s value=\"%s?sortby=reverse\">newest to oldest</option>\n",
+                       (bbs_reverse ? "selected" : ""),
+                       oper
+               );
+       
+               wprintf("</select></form>\n");
+               /** end bbview scroller */
+       }
+
+DONE:
+       if (is_tasks) {
+               do_tasks_view();        /** Render the task list */
+       }
+
+       if (is_calendar) {
+               do_calendar_view();     /** Render the calendar */
+       }
+
+       if (is_addressbook) {
+               do_addrbook_view(addrbook, num_ab);     /** Render the address book */
+       }
+
+       /** Note: wDumpContent() will output one additional </div> tag. */
+       wDumpContent(1);
+       if (addrbook != NULL) free(addrbook);
+
+       /** free the summary */
+       if (WC->summ != NULL) {
+               free(WC->summ);
+               WC->num_summ = 0;
+               WC->summ = NULL;
+       }
+}
+
+
+/**
+ * \brief Back end for post_message()
+ * ... this is where the actual message gets transmitted to the server.
+ */
+void post_mime_to_server(void) {
+       char boundary[SIZ];
+       int is_multipart = 0;
+       static int seq = 0;
+       struct wc_attachment *att;
+       char *encoded;
+       size_t encoded_length;
+
+       /** RFC2045 requires this, and some clients look for it... */
+       serv_puts("MIME-Version: 1.0");
+
+       /** If there are attachments, we have to do multipart/mixed */
+       if (WC->first_attachment != NULL) {
+               is_multipart = 1;
+       }
+
+       if (is_multipart) {
+               sprintf(boundary, "=_Citadel_Multipart_%s_%04x%04x",
+                       serv_info.serv_fqdn,
+                       getpid(),
+                       ++seq
+               );
+
+               /** Remember, serv_printf() appends an extra newline */
+               serv_printf("Content-type: multipart/mixed; "
+                       "boundary=\"%s\"\n", boundary);
+               serv_printf("This is a multipart message in MIME format.\n");
+               serv_printf("--%s", 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(bstr("msgtext"));     /** Transmit message in quoted-printable encoding */
+       serv_puts("</body></html>\r\n");
+       
+       if (is_multipart) {
+
+               /** Add in the attachments */
+               for (att = WC->first_attachment; att!=NULL; att=att->next) {
+
+                       encoded_length = ((att->length * 150) / 100);
+                       encoded = malloc(encoded_length);
+                       if (encoded == NULL) break;
+                       CtdlEncodeBase64(encoded, att->data, att->length);
+
+                       serv_printf("--%s", boundary);
+                       serv_printf("Content-type: %s", att->content_type);
+                       serv_printf("Content-disposition: attachment; "
+                               "filename=\"%s\"", att->filename);
+                       serv_puts("Content-transfer-encoding: base64");
+                       serv_puts("");
+                       serv_write(encoded, strlen(encoded));
+                       serv_puts("");
+                       serv_puts("");
+                       free(encoded);
+               }
+               serv_printf("--%s--", boundary);
+       }
+
+       serv_puts("000");
+}
+
+
+/**
+ * \brief 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)
+{
+       char buf[1024];
+       char encoded_subject[1024];
+       static long dont_post = (-1L);
+       struct wc_attachment *att, *aptr;
+       int is_anonymous = 0;
+
+       if (!strcasecmp(bstr("is_anonymous"), "yes")) {
+               is_anonymous = 1;
+       }
+
+       if (WC->upload_length > 0) {
+
+               /** There's an attachment.  Save it to this struct... */
+               att = malloc(sizeof(struct wc_attachment));
+               memset(att, 0, sizeof(struct wc_attachment));
+               att->length = WC->upload_length;
+               strcpy(att->content_type, WC->upload_content_type);
+               strcpy(att->filename, WC->upload_filename);
+               att->next = NULL;
+
+               /** And add it to the list. */
+               if (WC->first_attachment == NULL) {
+                       WC->first_attachment = att;
+               }
+               else {
+                       aptr = WC->first_attachment;
+                       while (aptr->next != NULL) aptr = aptr->next;
+                       aptr->next = att;
+               }
+
+               /**
+                * 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.
+                */
+               while (num_tokens(att->filename, '/') > 1) {
+                       remove_token(att->filename, 0, '/');
+               }
+               while (num_tokens(att->filename, '\\') > 1) {
+                       remove_token(att->filename, 0, '\\');
+               }
+
+               /**
+                * Transfer control of this memory from the upload struct
+                * to the attachment struct.
+                */
+               att->data = WC->upload;
+               WC->upload_length = 0;
+               WC->upload = NULL;
+               display_enter();
+               return;
+       }
+
+       if (strlen(bstr("cancel_button")) > 0) {
+               sprintf(WC->ImportantMessage, 
+                       _("Cancelled.  Message was not posted."));
+       } else if (strlen(bstr("attach_button")) > 0) {
+               display_enter();
+               return;
+       } else if (atol(bstr("postseq")) == dont_post) {
+               sprintf(WC->ImportantMessage, 
+                       _("Automatically cancelled because you have already "
+                       "saved this message."));
+       } else {
+               rfc2047encode(encoded_subject, sizeof encoded_subject, bstr("subject"));
+               sprintf(buf, "ENT0 1|%s|%d|4|%s|||%s|%s|%s",
+                       bstr("recp"),
+                       is_anonymous,
+                       encoded_subject,
+                       bstr("cc"),
+                       bstr("bcc"),
+                       bstr("wikipage")
+               );
+               serv_puts(buf);
+               serv_getln(buf, sizeof buf);
+               if (buf[0] == '4') {
+                       post_mime_to_server();
+                       if ( (strlen(bstr("recp")) > 0)
+                          || (strlen(bstr("cc")) > 0)
+                          || (strlen(bstr("bcc")) > 0)
+                       ) {
+                               sprintf(WC->ImportantMessage, _("Message has been sent.\n"));
+                       }
+                       else {
+                               sprintf(WC->ImportantMessage, _("Message has been posted.\n"));
+                       }
+                       dont_post = atol(bstr("postseq"));
+               } else {
+                       sprintf(WC->ImportantMessage, "%s", &buf[4]);
+                       display_enter();
+                       return;
+               }
+       }
+
+       free_attachments(WC);
+
+       /**
+        *  We may have been supplied with instructions regarding the location
+        *  to which we must return after posting.  If found, go there.
+        */
+       if (strlen(bstr("return_to")) > 0) {
+               http_redirect(bstr("return_to"));
+       }
+       /**
+        *  If we were editing a page in a wiki room, go to that page now.
+        */
+       else if (strlen(bstr("wikipage")) > 0) {
+               snprintf(buf, sizeof buf, "wiki?page=%s", bstr("wikipage"));
+               http_redirect(buf);
+       }
+       /**
+        *  Otherwise, just go to the "read messages" loop.
+        */
+       else {
+               readloop("readnew");
+       }
+}
+
+
+
+
+/**
+ * \brief display the message entry screen
+ */
+void display_enter(void)
+{
+       char buf[SIZ];
+       char ebuf[SIZ];
+       long now;
+       struct wc_attachment *att;
+       int recipient_required = 0;
+       int recipient_bad = 0;
+       int i;
+       int is_anonymous = 0;
+       long existing_page = (-1L);
+
+       if (strlen(bstr("force_room")) > 0) {
+               gotoroom(bstr("force_room"));
+       }
+
+       if (!strcasecmp(bstr("is_anonymous"), "yes")) {
+               is_anonymous = 1;
+       }
+
+       /**
+        * Are we perhaps in an address book view?  If so, then an "enter
+        * message" command really means "add new entry."
+        */
+       if (WC->wc_default_view == VIEW_ADDRESSBOOK) {
+               do_edit_vcard(-1, "", "");
+               return;
+       }
+
+#ifdef WEBCIT_WITH_CALENDAR_SERVICE
+       /**
+        * Are we perhaps in a calendar room?  If so, then an "enter
+        * message" command really means "add new calendar item."
+        */
+       if (WC->wc_default_view == VIEW_CALENDAR) {
+               display_edit_event();
+               return;
+       }
+
+       /**
+        * Are we perhaps in a tasks view?  If so, then an "enter
+        * message" command really means "add new task."
+        */
+       if (WC->wc_default_view == VIEW_TASKS) {
+               display_edit_task();
+               return;
+       }
+#endif
+
+       /**
+        * Otherwise proceed normally.
+        * Do a custom room banner with no navbar...
+        */
+       output_headers(1, 1, 2, 0, 0, 0);
+       wprintf("<div id=\"banner\">\n");
+       embed_room_banner(NULL, navbar_none);
+       wprintf("</div>\n");
+       wprintf("<div id=\"content\">\n"
+               "<div class=\"fix_scrollbar_bug\">"
+               "<table width=100%% border=0 bgcolor=\"#ffffff\"><tr><td>");
+
+       /** First test to see whether this is a room that requires recipients to be entered */
+       serv_puts("ENT0 0");
+       serv_getln(buf, sizeof buf);
+       if (!strncmp(buf, "570", 3)) {          /** 570 means that we need a recipient here */
+               recipient_required = 1;
+       }
+       else if (buf[0] != '2') {               /** Any other error means that we cannot continue */
+               wprintf("<em>%s</em><br />\n", &buf[4]);
+               goto DONE;
+       }
+
+       /** Now check our actual recipients if there are any */
+       if (recipient_required) {
+               sprintf(buf, "ENT0 0|%s|%d|0||||%s|%s|%s", bstr("recp"), is_anonymous,
+                       bstr("cc"), bstr("bcc"), bstr("wikipage"));
+               serv_puts(buf);
+               serv_getln(buf, sizeof buf);
+
+               if (!strncmp(buf, "570", 3)) {  /** 570 means we have an invalid recipient listed */
+                       if (strlen(bstr("recp")) + strlen(bstr("cc")) + strlen(bstr("bcc")) > 0) {
+                               recipient_bad = 1;
+                       }
+               }
+               else if (buf[0] != '2') {       /** Any other error means that we cannot continue */
+                       wprintf("<em>%s</em><br />\n", &buf[4]);
+                       goto DONE;
+               }
+       }
+
+       /** If we got this far, we can display the message entry screen. */
+
+       now = time(NULL);
+       fmt_date(buf, now, 0);
+       strcat(&buf[strlen(buf)], _(" <I>from</I> "));
+       stresc(&buf[strlen(buf)], WC->wc_fullname, 1, 1);
+
+       /* Don't need this anymore, it's in the input box below
+       if (strlen(bstr("recp")) > 0) {
+               strcat(&buf[strlen(buf)], _(" <I>to</I> "));
+               stresc(&buf[strlen(buf)], bstr("recp"), 1, 1);
+       }
+       */
+
+       strcat(&buf[strlen(buf)], _(" <I>in</I> "));
+       stresc(&buf[strlen(buf)], WC->wc_roomname, 1, 1);
+
+       /** begin message entry screen */
+       wprintf("<form "
+               "enctype=\"multipart/form-data\" "
+               "method=\"POST\" "
+               "accept-charset=\"UTF-8\" "
+               "action=\"post\" "
+               "name=\"enterform\""
+               ">\n");
+       wprintf("<input type=\"hidden\" name=\"postseq\" value=\"%ld\">\n", now);
+       if (WC->wc_view == VIEW_WIKI) {
+               wprintf("<input type=\"hidden\" name=\"wikipage\" value=\"%s\">\n", bstr("wikipage"));
+       }
+       wprintf("<input type=\"hidden\" name=\"return_to\" value=\"%s\">\n", bstr("return_to"));
+
+       wprintf("<img src=\"static/newmess3_24x.gif\" align=middle alt=\" \">");
+       wprintf("%s\n", buf);   /** header bar */
+       if (WC->room_flags & QR_ANONOPT) {
+               wprintf("&nbsp;"
+                       "<input type=\"checkbox\" name=\"is_anonymous\" value=\"yes\" %s>",
+                               (is_anonymous ? "checked" : "")
+               );
+               wprintf("Anonymous");
+       }
+       wprintf("<br>\n");      /** header bar */
+
+       wprintf("<table border=\"0\" width=\"100%%\">\n");
+       if (recipient_required) {
+
+               wprintf("<tr><td>");
+               wprintf("<font size=-1>");
+               wprintf(_("To:"));
+               wprintf("</font>");
+               wprintf("</td><td>"
+                       "<input autocomplete=\"off\" type=\"text\" name=\"recp\" id=\"recp_id\" value=\"");
+               escputs(bstr("recp"));
+               wprintf("\" size=50 maxlength=1000 />");
+               wprintf("<div class=\"auto_complete\" id=\"recp_name_choices\"></div>");
+               wprintf("</td><td></td></tr>\n");
+
+               wprintf("<tr><td>");
+               wprintf("<font size=-1>");
+               wprintf(_("CC:"));
+               wprintf("</font>");
+               wprintf("</td><td>"
+                       "<input autocomplete=\"off\" type=\"text\" name=\"cc\" id=\"cc_id\" value=\"");
+               escputs(bstr("cc"));
+               wprintf("\" size=50 maxlength=1000 />");
+               wprintf("<div class=\"auto_complete\" id=\"cc_name_choices\"></div>");
+               wprintf("</td><td></td></tr>\n");
+
+               wprintf("<tr><td>");
+               wprintf("<font size=-1>");
+               wprintf(_("BCC:"));
+               wprintf("</font>");
+               wprintf("</td><td>"
+                       "<input autocomplete=\"off\" type=\"text\" name=\"bcc\" id=\"bcc_id\" value=\"");
+               escputs(bstr("bcc"));
+               wprintf("\" size=50 maxlength=1000 />");
+               wprintf("<div class=\"auto_complete\" id=\"bcc_name_choices\"></div>");
+               wprintf("</td><td></td></tr>\n");
+
+               /** Initialize the autocomplete ajax helpers (found in wclib.js) */
+               wprintf("<script type=\"text/javascript\">      \n"
+                       " activate_entmsg_autocompleters();     \n"
+                       "</script>                              \n"
+               );
+       }
+
+       wprintf("<tr><td>");
+       wprintf("<font size=-1>");
+       wprintf(_("Subject (optional):"));
+       wprintf("</font>");
+       wprintf("</td><td>"
+               "<input type=\"text\" name=\"subject\" value=\"");
+       escputs(bstr("subject"));
+       wprintf("\" size=50 maxlength=70></td><td>\n");
+
+       wprintf("<input type=\"submit\" name=\"send_button\" value=\"");
+       if (recipient_required) {
+               wprintf(_("Send message"));
+       } else {
+               wprintf(_("Post message"));
+       }
+       wprintf("\">&nbsp;"
+               "<input type=\"submit\" name=\"cancel_button\" value=\"%s\">\n", _("Cancel"));
+       wprintf("</td></tr></table>\n");
+
+       wprintf("<center>");
+
+       wprintf("<textarea name=\"msgtext\" cols=\"80\" rows=\"15\">");
+
+       /** If we're continuing from a previous edit, put our partially-composed message back... */
+       msgescputs(bstr("msgtext"));
+
+       /* If we're forwarding a message, insert it here... */
+       if (atol(bstr("fwdquote")) > 0L) {
+               wprintf("<br><div align=center><i>");
+               wprintf(_("--- forwarded message ---"));
+               wprintf("</i></div><br>");
+               pullquote_message(atol(bstr("fwdquote")), 1, 1);
+       }
+
+       /** If we're replying quoted, insert the quote here... */
+       else if (atol(bstr("replyquote")) > 0L) {
+               wprintf("<br>"
+                       "<blockquote>");
+               pullquote_message(atol(bstr("replyquote")), 0, 1);
+               wprintf("</blockquote><br>");
+       }
+
+       /** If we're editing a wiki page, insert the existing page here... */
+       else if (WC->wc_view == VIEW_WIKI) {
+               safestrncpy(buf, bstr("wikipage"), sizeof buf);
+               str_wiki_index(buf);
+               existing_page = locate_message_by_uid(buf);
+               if (existing_page >= 0L) {
+                       pullquote_message(existing_page, 1, 0);
+               }
+       }
+
+       /** Insert our signature if appropriate... */
+       if ( (WC->is_mailbox) && (strcmp(bstr("sig_inserted"), "yes")) ) {
+               get_preference("use_sig", buf, sizeof buf);
+               if (!strcasecmp(buf, "yes")) {
+                       get_preference("signature", ebuf, sizeof ebuf);
+                       euid_unescapize(buf, ebuf);
+                       wprintf("<br>--<br>");
+                       for (i=0; i<strlen(buf); ++i) {
+                               if (buf[i] == '\n') {
+                                       wprintf("<br>");
+                               }
+                               else if (buf[i] == '<') {
+                                       wprintf("&lt;");
+                               }
+                               else if (buf[i] == '>') {
+                                       wprintf("&gt;");
+                               }
+                               else if (buf[i] == '&') {
+                                       wprintf("&amp;");
+                               }
+                               else if (buf[i] == '\"') {
+                                       wprintf("&quot;");
+                               }
+                               else if (buf[i] == '\'') {
+                                       wprintf("&#39;");
+                               }
+                               else if (isprint(buf[i])) {
+                                       wprintf("%c", buf[i]);
+                               }
+                       }
+               }
+       }
+
+       wprintf("</textarea>");
+       wprintf("</center><br />\n");
+
+       /**
+        * The following script embeds the TinyMCE richedit control, and automatically
+        * transforms the textarea into a richedit textarea.
+        */
+       wprintf(
+               "<script language=\"javascript\" type=\"text/javascript\" src=\"tiny_mce/tiny_mce.js\"></script>\n"
+               "<script language=\"javascript\" type=\"text/javascript\">"
+               "tinyMCE.init({"
+               "       mode : \"textareas\", width : \"100%%\", browsers : \"msie,gecko\", "
+               "       theme : \"advanced\", plugins : \"iespell\", "
+               "       theme_advanced_buttons1 : \"bold, italic, underline, strikethrough, justifyleft, justifycenter, justifyright, justifyfull, bullist, numlist, cut, copy, paste, link, image, help, forecolor, iespell, code\", "
+               "       theme_advanced_buttons2 : \"\", "
+               "       theme_advanced_buttons3 : \"\", "
+               "       content_css : \"static/webcit-tinymce.css\" "
+               "});"
+               "</script>\n"
+       );
+
+
+       /** Enumerate any attachments which are already in place... */
+       wprintf("<img src=\"static/diskette_24x.gif\" border=0 "
+               "align=middle height=16 width=16> ");
+       wprintf(_("Attachments:"));
+       wprintf(" ");
+       wprintf("<select name=\"which_attachment\" size=1>");
+       for (att = WC->first_attachment; att != NULL; att = att->next) {
+               wprintf("<option value=\"");
+               urlescputs(att->filename);
+               wprintf("\">");
+               escputs(att->filename);
+               /* wprintf(" (%s, %d bytes)",att->content_type,att->length); */
+               wprintf("</option>\n");
+       }
+       wprintf("</select>");
+
+       /** Now offer the ability to attach additional files... */
+       wprintf("&nbsp;&nbsp;&nbsp;");
+       wprintf(_("Attach file:"));
+       wprintf(" <input NAME=\"attachfile\" "
+               "SIZE=16 TYPE=\"file\">\n&nbsp;&nbsp;"
+               "<input type=\"submit\" name=\"attach_button\" value=\"%s\">\n", _("Add"));
+
+       /** Seth asked for these to be at the top *and* bottom... */
+       wprintf("<input type=\"submit\" name=\"send_button\" value=\"");
+       if (recipient_required) {
+               wprintf(_("Send message"));
+       } else {
+               wprintf(_("Post message"));
+       }
+       wprintf("\">&nbsp;"
+               "<input type=\"submit\" name=\"cancel_button\" value=\"%s\">\n", _("Cancel"));
+
+       /** Make sure we only insert our signature once */
+       if (strcmp(bstr("sig_inserted"), "yes")) {
+               wprintf("<INPUT TYPE=\"hidden\" NAME=\"sig_inserted\" VALUE=\"yes\">\n");
+       }
+
+       wprintf("</form>\n");
+
+       wprintf("</td></tr></table></div>\n");
+DONE:  wDumpContent(1);
+}
+
+
+
+/**
+ * \brief delete a message
+ */
+void delete_msg(void)
+{
+       long msgid;
+       char buf[SIZ];
+
+       msgid = atol(bstr("msgid"));
+
+       if (WC->wc_is_trash) {  /** 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);
+       }
+
+       serv_getln(buf, sizeof buf);
+       sprintf(WC->ImportantMessage, "%s", &buf[4]);
+
+       readloop("readnew");
+}
+
+
+/**
+ * \brief move a message to another folder
+ */
+void move_msg(void)
+{
+       long msgid;
+       char buf[SIZ];
+
+       msgid = atol(bstr("msgid"));
+
+       if (strlen(bstr("move_button")) > 0) {
+               sprintf(buf, "MOVE %ld|%s", msgid, bstr("target_room"));
+               serv_puts(buf);
+               serv_getln(buf, sizeof buf);
+               sprintf(WC->ImportantMessage, "%s", &buf[4]);
+       } else {
+               sprintf(WC->ImportantMessage, (_("The message was not moved.")));
+       }
+
+       readloop("readnew");
+}
+
+
+
+
+
+/**
+ * \brief Confirm move of a message
+ */
+void confirm_move_msg(void)
+{
+       long msgid;
+       char buf[SIZ];
+       char targ[SIZ];
+
+       msgid = atol(bstr("msgid"));
+
+
+       output_headers(1, 1, 2, 0, 0, 0);
+       wprintf("<div id=\"banner\">\n");
+       wprintf("<TABLE WIDTH=100%% BORDER=0><TR><TD>");
+       wprintf("<SPAN CLASS=\"titlebar\">");
+       wprintf(_("Confirm move of message"));
+       wprintf("</SPAN>\n");
+       wprintf("</TD></TR></TABLE>\n");
+       wprintf("</div>\n<div id=\"content\">\n");
+
+       wprintf("<CENTER>");
+
+       wprintf(_("Move this message to:"));
+       wprintf("<br />\n");
+
+       wprintf("<form METHOD=\"POST\" action=\"move_msg\">\n");
+       wprintf("<INPUT TYPE=\"hidden\" NAME=\"msgid\" VALUE=\"%s\">\n", bstr("msgid"));
+
+       wprintf("<SELECT NAME=\"target_room\" SIZE=5>\n");
+       serv_puts("LKRA");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '1') {
+               while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+                       extract_token(targ, buf, 0, '|', sizeof targ);
+                       wprintf("<OPTION>");
+                       escputs(targ);
+                       wprintf("\n");
+               }
+       }
+       wprintf("</SELECT>\n");
+       wprintf("<br />\n");
+
+       wprintf("<INPUT TYPE=\"submit\" NAME=\"move_button\" VALUE=\"%s\">", _("Move"));
+       wprintf("&nbsp;");
+       wprintf("<INPUT TYPE=\"submit\" NAME=\"cancel_button\" VALUE=\"%s\">", _("Cancel"));
+       wprintf("</form></CENTER>\n");
+
+       wprintf("</CENTER>\n");
+       wDumpContent(1);
+}
+
+
+/*@}*/
diff --git a/webcit/mime_parser.c b/webcit/mime_parser.c
new file mode 100644 (file)
index 0000000..02edd1c
--- /dev/null
@@ -0,0 +1,662 @@
+/*
+ * $Id$
+ */
+/**
+ * \defgroup MIME This is the MIME parser for Citadel.
+ *
+ * Copyright (c) 1998-2005 by Art Cancro
+ * This code is distributed under the terms of the GNU General Public License.
+ * \ingroup WebcitHttpServer
+ */
+/*@{*/
+#include "webcit.h"
+#include "webserver.h"
+#include "mime_parser.h"
+
+/**
+ * \brief get mime key
+ * \param target where to put the mime buffer at???
+ * \param source where to extract the mimetype from
+ * \param key what???
+ */
+void extract_key(char *target, char *source, char *key)
+{
+       int a, b;
+
+       strcpy(target, source);
+       for (a = 0; a < strlen(target); ++a) {
+               if ((!strncasecmp(&target[a], key, strlen(key)))
+                   && (target[a + strlen(key)] == '=')) {
+                       strcpy(target, &target[a + strlen(key) + 1]);
+                       if (target[0] == 34)
+                               strcpy(target, &target[1]);
+                       for (b = 0; b < strlen(target); ++b)
+                               if (target[b] == 34)
+                                       target[b] = 0;
+                       return;
+               }
+       }
+       strcpy(target, "");
+}
+
+
+/**
+ * \brief For non-multipart messages, we need to generate a quickie partnum of "1"
+ * to return to callback functions.  Some callbacks demand it.
+ * \param supplied_partnum partnum to convert
+ * \return the converted num
+ */
+char *fixed_partnum(char *supplied_partnum) {
+       if (supplied_partnum == NULL) return "1";
+       if (strlen(supplied_partnum)==0) return "1";
+       return supplied_partnum;
+}
+
+
+
+/**
+ * \brief Convert "quoted-printable" to binary.  Returns number of bytes decoded.
+ * \param decoded the buffer with the decoded output
+ * \param encoded the encoded string to decode
+ * \param sourcelen length of the decoded buffer
+ */
+int CtdlDecodeQuotedPrintable(char *decoded, char *encoded, int sourcelen) {
+       char buf[SIZ];
+       int buf_length = 0;
+       int soft_line_break = 0;
+       unsigned int ch;
+       int decoded_length = 0;
+       int i;
+
+       decoded[0] = 0;
+       decoded_length = 0;
+       buf[0] = 0;
+       buf_length = 0;
+
+       for (i = 0; i < sourcelen; ++i) {
+
+               buf[buf_length++] = encoded[i];
+
+               if ( (encoded[i] == '\n')
+                  || (encoded[i] == 0)
+                  || (i == (sourcelen-1)) ) {
+                       buf[buf_length++] = 0;
+
+                       /*** begin -- process one line ***/
+
+                       if (buf[strlen(buf)-1] == '\n') {
+                               buf[strlen(buf)-1] = 0;
+                       }
+                       if (buf[strlen(buf)-1] == '\r') {
+                               buf[strlen(buf)-1] = 0;
+                       }
+                       while (isspace(buf[strlen(buf)-1])) {
+                               buf[strlen(buf)-1] = 0;
+                       }
+                       soft_line_break = 0;
+
+                       while (strlen(buf) > 0) {
+                               if (!strcmp(buf, "=")) {
+                                       soft_line_break = 1;
+                                       strcpy(buf, "");
+                               } else if ((strlen(buf)>=3) && (buf[0]=='=')) {
+                                       sscanf(&buf[1], "%02x", &ch);
+                                       decoded[decoded_length++] = ch;
+                                       strcpy(buf, &buf[3]);
+                               } else {
+                                       decoded[decoded_length++] = buf[0];
+                                       strcpy(buf, &buf[1]);
+                               }
+                       }
+                       if (soft_line_break == 0) {
+                               decoded[decoded_length++] = '\r';
+                               decoded[decoded_length++] = '\n';
+                       }
+                       buf_length = 0;
+                       /*** end -- process one line ***/
+               }
+       }
+
+       decoded[decoded_length++] = 0;
+       return(decoded_length);
+}
+
+/**
+ * \brief fully decode a message
+ * Given a message or message-part body and a length, handle any necessary
+ * decoding and pass the request up the stack.
+ * \param partnum todo ?????
+ * \param part_start todo
+ * \param length todo
+ * \param content_type todo
+ * \param charset todo
+ * \param encoding todo
+ * \param disposition todo
+ * \param name todo
+ * \param filename todo
+ * \param CallBack todo
+ * \param PreMultiPartCallBack todo
+ * \param PostMultiPartCallBack todo
+ * \param userdata todo
+ * \param dont_decode todo
+ */
+void mime_decode(char *partnum,
+                char *part_start, size_t length,
+                char *content_type, char *charset, char *encoding,
+                char *disposition,
+                char *name, char *filename,
+                void (*CallBack)
+                 (char *cbname,
+                  char *cbfilename,
+                  char *cbpartnum,
+                  char *cbdisp,
+                  void *cbcontent,
+                  char *cbtype,
+                  char *cbcharset,
+                  size_t cblength,
+                  char *cbencoding,
+                  void *cbuserdata),
+                void (*PreMultiPartCallBack)
+                 (char *cbname,
+                  char *cbfilename,
+                  char *cbpartnum,
+                  char *cbdisp,
+                  void *cbcontent,
+                  char *cbtype,
+                  char *cbcharset,
+                  size_t cblength,
+                  char *cbencoding,
+                  void *cbuserdata),
+                void (*PostMultiPartCallBack)
+                 (char *cbname,
+                  char *cbfilename,
+                  char *cbpartnum,
+                  char *cbdisp,
+                  void *cbcontent,
+                  char *cbtype,
+                  char *cbcharset,
+                  size_t cblength,
+                  char *cbencoding,
+                  void *cbuserdata),
+                 void *userdata,
+                 int dont_decode
+)
+{
+
+       char *decoded;
+       size_t bytes_decoded = 0;
+
+       /* Some encodings aren't really encodings */
+       if (!strcasecmp(encoding, "7bit"))
+               strcpy(encoding, "");
+       if (!strcasecmp(encoding, "8bit"))
+               strcpy(encoding, "");
+       if (!strcasecmp(encoding, "binary"))
+               strcpy(encoding, "");
+
+       /* If this part is not encoded, send as-is */
+       if ( (strlen(encoding) == 0) || (dont_decode)) {
+               if (CallBack != NULL) {
+                       CallBack(name, filename, fixed_partnum(partnum),
+                               disposition, part_start,
+                               content_type, charset, length, encoding, userdata);
+                       }
+               return;
+       }
+       
+       if ((strcasecmp(encoding, "base64"))
+           && (strcasecmp(encoding, "quoted-printable"))) {
+               return;
+       }
+       /**
+        * Allocate a buffer for the decoded data.  The output buffer is the
+        * same size as the input buffer; this assumes that the decoded data
+        * will never be larger than the encoded data.  This is a safe
+        * assumption with base64, uuencode, and quoted-printable.
+        */
+       decoded = malloc(length+2048);
+       if (decoded == NULL) {
+               return;
+       }
+
+       if (!strcasecmp(encoding, "base64")) {
+               bytes_decoded = CtdlDecodeBase64(decoded, part_start, length);
+       }
+       else if (!strcasecmp(encoding, "quoted-printable")) {
+               bytes_decoded = CtdlDecodeQuotedPrintable(decoded,
+                                                       part_start, length);
+       }
+
+       if (bytes_decoded > 0) if (CallBack != NULL) {
+               CallBack(name, filename, fixed_partnum(partnum),
+                       disposition, decoded,
+                       content_type, charset, bytes_decoded, "binary", userdata);
+       }
+
+       free(decoded);
+}
+
+/**
+ * \brief Break out the components of a multipart message
+ * (This function expects to be fed HEADERS + CONTENT)
+ * Note: NULL can be supplied as content_end; in this case, the message is
+ * considered to have ended when the parser encounters a 0x00 byte.
+ * \param partnum todo
+ * \param content_start todo ?????
+ * \param content_end todo
+ * \param CallBack todo
+ * \param PreMultiPartCallBack
+ * \param PostMultiPartCallBack
+ * \param userdata todo
+ * \param dont_decode todo
+ */
+void the_mime_parser(char *partnum,
+                    char *content_start, char *content_end,
+                    void (*CallBack)
+                     (char *cbname,
+                      char *cbfilename,
+                      char *cbpartnum,
+                      char *cbdisp,
+                      void *cbcontent,
+                      char *cbtype,
+                      char *cbcharset,
+                      size_t cblength,
+                      char *cbencoding,
+                      void *cbuserdata),
+                    void (*PreMultiPartCallBack)
+                     (char *cbname,
+                      char *cbfilename,
+                      char *cbpartnum,
+                      char *cbdisp,
+                      void *cbcontent,
+                      char *cbtype,
+                      char *cbcharset,
+                      size_t cblength,
+                      char *cbencoding,
+                      void *cbuserdata),
+                    void (*PostMultiPartCallBack)
+                     (char *cbname,
+                      char *cbfilename,
+                      char *cbpartnum,
+                      char *cbdisp,
+                      void *cbcontent,
+                      char *cbtype,
+                      char *cbcharset,
+                      size_t cblength,
+                      char *cbencoding,
+                      void *cbuserdata),
+                     void *userdata,
+                     int dont_decode
+)
+{
+
+       char *ptr;
+       char *srch = NULL;
+       char *part_start, *part_end = NULL;
+       char buf[SIZ];
+       char *header;
+       char *boundary;
+       char *startary;
+       size_t startary_len = 0;
+       char *endary;
+       char *next_boundary;
+       char *content_type;
+       char *charset;
+       size_t content_length;
+       char *encoding;
+       char *disposition;
+       char *name = NULL;
+       char *content_type_name;
+       char *content_disposition_name;
+       char *filename;
+       int is_multipart;
+       int part_seq = 0;
+       int i;
+       size_t length;
+       char nested_partnum[SIZ];
+
+       ptr = content_start;
+       content_length = 0;
+
+       boundary = malloc(SIZ);
+       memset(boundary, 0, SIZ);
+
+       startary = malloc(SIZ);
+       memset(startary, 0, SIZ);
+
+       endary = malloc(SIZ);
+       memset(endary, 0, SIZ);
+
+       header = malloc(SIZ);
+       memset(header, 0, SIZ);
+
+       content_type = malloc(SIZ);
+       memset(content_type, 0, SIZ);
+
+       charset = malloc(SIZ);
+       memset(charset, 0, SIZ);
+
+       encoding = malloc(SIZ);
+       memset(encoding, 0, SIZ);
+
+       content_type_name = malloc(SIZ);
+       memset(content_type_name, 0, SIZ);
+
+       content_disposition_name = malloc(SIZ);
+       memset(content_disposition_name, 0, SIZ);
+
+       filename = malloc(SIZ);
+       memset(filename, 0, SIZ);
+
+       disposition = malloc(SIZ);
+       memset(disposition, 0, SIZ);
+
+       /** If the caller didn't supply an endpointer, generate one by measure */
+       if (content_end == NULL) {
+               content_end = &content_start[strlen(content_start)];
+       }
+
+       /** Learn interesting things from the headers */
+       strcpy(header, "");
+       do {
+               ptr = memreadline(ptr, buf, SIZ);
+               if (ptr >= content_end) {
+                       goto end_parser;
+               }
+
+               for (i = 0; i < strlen(buf); ++i) {
+                       if (isspace(buf[i])) {
+                               buf[i] = ' ';
+                       }
+               }
+
+               if (!isspace(buf[0])) {
+                       if (!strncasecmp(header, "Content-type: ", 14)) {
+                               strcpy(content_type, &header[14]);
+                               extract_key(content_type_name, content_type, "name");
+                               extract_key(charset, content_type, "charset");
+                               /** Deal with weird headers */
+                               if (strchr(content_type, ' '))
+                                       *(strchr(content_type, ' ')) = '\0';
+                               if (strchr(content_type, ';'))
+                                       *(strchr(content_type, ';')) = '\0';
+                       }
+                       if (!strncasecmp(header, "Content-Disposition: ", 21)) {
+                               strcpy(disposition, &header[21]);
+                               extract_key(content_disposition_name, disposition, "name");
+                               extract_key(filename, disposition, "filename");
+                       }
+                       if (!strncasecmp(header, "Content-length: ", 16)) {
+                               content_length = (size_t) atol(&header[16]);
+                       }
+                       if (!strncasecmp(header,
+                                     "Content-transfer-encoding: ", 27))
+                               strcpy(encoding, &header[27]);
+                       if (strlen(boundary) == 0)
+                               extract_key(boundary, header, "boundary");
+                       strcpy(header, "");
+               }
+               if ((strlen(header) + strlen(buf) + 2) < SIZ)
+                       strcat(header, buf);
+       } while ((strlen(buf) > 0) && (*ptr != 0));
+
+       if (strchr(disposition, ';'))
+               *(strchr(disposition, ';')) = '\0';
+       striplt(disposition);
+       if (strchr(content_type, ';'))
+               *(strchr(content_type, ';')) = '\0';
+       striplt(content_type);
+
+       if (strlen(boundary) > 0) {
+               is_multipart = 1;
+       } else {
+               is_multipart = 0;
+       }
+
+       /** If this is a multipart message, then recursively process it */
+       part_start = NULL;
+       if (is_multipart) {
+
+               /** Tell the client about this message's multipartedness */
+               if (PreMultiPartCallBack != NULL) {
+                       PreMultiPartCallBack("", "", partnum, "",
+                               NULL, content_type, charset,
+                               0, encoding, userdata);
+               }
+
+               /** Figure out where the boundaries are */
+               snprintf(startary, SIZ, "--%s", boundary);
+               snprintf(endary, SIZ, "--%s--", boundary);
+               startary_len = strlen(startary);
+
+               part_start = NULL;
+               do {
+                       next_boundary = NULL;
+                       for (srch=ptr; srch<content_end; ++srch) {
+                               if (!memcmp(srch, startary, startary_len)) {
+                                       next_boundary = srch;
+                                       srch = content_end;
+                               }
+                       }
+
+                       if ( (part_start != NULL) && (next_boundary != NULL) ) {
+                               part_end = next_boundary;
+                               --part_end;
+
+                               if (strlen(partnum) > 0) {
+                                       snprintf(nested_partnum,
+                                                sizeof nested_partnum,
+                                                "%s.%d", partnum,
+                                                ++part_seq);
+                               }
+                               else {
+                                       snprintf(nested_partnum,
+                                                sizeof nested_partnum,
+                                                "%d", ++part_seq);
+                               }
+                               the_mime_parser(nested_partnum,
+                                           part_start, part_end,
+                                               CallBack,
+                                               PreMultiPartCallBack,
+                                               PostMultiPartCallBack,
+                                               userdata,
+                                               dont_decode);
+                       }
+
+                       if (next_boundary != NULL) {
+                               /**
+                                * If we pass out of scope, don't attempt to
+                                * read past the end boundary. */
+                               if (!strcmp(next_boundary, endary)) {
+                                       ptr = content_end;
+                               }
+                               else {
+                                       /** Set up for the next part. */
+                                       part_start = strstr(next_boundary, "\n");
+                                       ++part_start;
+                                       ptr = part_start;
+                               }
+                       }
+                       else {
+                               /** Invalid end of multipart.  Bail out! */
+                               ptr = content_end;
+                       }
+               } while ( (ptr < content_end) && (next_boundary != NULL) );
+
+               if (PostMultiPartCallBack != NULL) {
+                       PostMultiPartCallBack("", "", partnum, "", NULL,
+                               content_type, charset, 0, encoding, userdata);
+               }
+               goto end_parser;
+       }
+
+       /** If it's not a multipart message, then do something with it */
+       if (!is_multipart) {
+               part_start = ptr;
+               length = 0;
+               while (ptr < content_end) {
+                       ++ptr;
+                       ++length;
+               }
+               part_end = content_end;
+               /** fix an off-by-one error */
+               --part_end;
+               --length;
+               
+               /** Truncate if the header told us to */
+               if ( (content_length > 0) && (length > content_length) ) {
+                       length = content_length;
+               }
+
+               /**
+                * Sometimes the "name" field is tacked on to Content-type,
+                * and sometimes it's tacked on to Content-disposition.  Use
+                * whichever one we have.
+                */
+               if (strlen(content_disposition_name) > strlen(content_type_name)) {
+                       name = content_disposition_name;
+               }
+               else {
+                       name = content_type_name;
+               }
+       
+               /*
+               lprintf(9, "mime_decode part=%s, len=%d, type=%s, charset=%s, encoding=%s\n",
+                       partnum, length, content_type, charset, encoding);
+               */
+
+               /**
+                * Ok, we've got a non-multipart part here, so do something with it.
+                */
+               mime_decode(partnum,
+                       part_start, length,
+                       content_type, charset, encoding, disposition,
+                       name, filename,
+                       CallBack, NULL, NULL,
+                       userdata, dont_decode
+               );
+
+               /**
+                * Now if it's an encapsulated message/rfc822 then we have to recurse into it
+                */
+               if (!strcasecmp(content_type, "message/rfc822")) {
+
+                       if (PreMultiPartCallBack != NULL) {
+                               PreMultiPartCallBack("", "", partnum, "",
+                                       NULL, content_type, charset,
+                                       0, encoding, userdata);
+                       }
+                       if (CallBack != NULL) {
+                               if (strlen(partnum) > 0) {
+                                       snprintf(nested_partnum,
+                                                sizeof nested_partnum,
+                                                "%s.%d", partnum,
+                                                ++part_seq);
+                               }
+                               else {
+                                       snprintf(nested_partnum,
+                                                sizeof nested_partnum,
+                                                "%d", ++part_seq);
+                               }
+                               the_mime_parser(nested_partnum,
+                                       part_start, part_end,
+                                       CallBack,
+                                       PreMultiPartCallBack,
+                                       PostMultiPartCallBack,
+                                       userdata,
+                                       dont_decode
+                               );
+                       }
+                       if (PostMultiPartCallBack != NULL) {
+                               PostMultiPartCallBack("", "", partnum, "", NULL,
+                                       content_type, charset, 0, encoding, userdata);
+                       }
+
+
+               }
+
+       }
+
+end_parser:    /** free the buffers!  end the oppression!! */
+       free(boundary);
+       free(startary);
+       free(endary);   
+       free(header);
+       free(content_type);
+       free(charset);
+       free(encoding);
+       free(content_type_name);
+       free(content_disposition_name);
+       free(filename);
+       free(disposition);
+}
+
+
+
+/**
+ * \brief Entry point for the MIME parser.
+ * (This function expects to be fed HEADERS + CONTENT)
+ * Note: NULL can be supplied as content_end; in this case, the message is
+ * considered to have ended when the parser encounters a 0x00 byte.
+ * \param content_start todo ?????????
+ * \param content_end todo 
+ * \param CallBack todo
+ * \param PreMultiPartCallBack todo
+ * \param PostMultiPartCallBack todo
+ * \param userdata todo
+ * \param dont_decode todo
+ */
+void mime_parser(char *content_start,
+               char *content_end,
+
+                void (*CallBack)
+                 (char *cbname,
+                  char *cbfilename,
+                  char *cbpartnum,
+                  char *cbdisp,
+                  void *cbcontent,
+                  char *cbtype,
+                  char *cbcharset,
+                  size_t cblength,
+                  char *cbencoding,
+                  void *cbuserdata),
+
+                void (*PreMultiPartCallBack)
+                 (char *cbname,
+                  char *cbfilename,
+                  char *cbpartnum,
+                  char *cbdisp,
+                  void *cbcontent,
+                  char *cbtype,
+                  char *cbcharset,
+                  size_t cblength,
+                  char *cbencoding,
+                  void *cbuserdata),
+
+                void (*PostMultiPartCallBack)
+                 (char *cbname,
+                  char *cbfilename,
+                  char *cbpartnum,
+                  char *cbdisp,
+                  void *cbcontent,
+                  char *cbtype,
+                  char *cbcharset,
+                  size_t cblength,
+                  char *cbencoding,
+                  void *cbuserdata),
+
+                 void *userdata,
+                 int dont_decode
+)
+{
+
+       the_mime_parser("", content_start, content_end,
+                       CallBack,
+                       PreMultiPartCallBack,
+                       PostMultiPartCallBack,
+                       userdata, dont_decode);
+}
+
+
+
+/*@}*/
diff --git a/webcit/mime_parser.h b/webcit/mime_parser.h
new file mode 100644 (file)
index 0000000..b82cd68
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * $Id$
+ *
+ */
+
+/*
+ * Here's a bunch of stupid magic to make the MIME parser portable between
+ * Citadel and WebCit.
+ */
+#ifndef SIZ
+#define SIZ    4096
+#endif
+
+
+/* 
+ * Declarations for functions in the parser
+ */
+
+void extract_key(char *target, char *source, char *key);
+
+void mime_parser(char *content_start, char *content_end,
+               void (*CallBack)
+                       (char *cbname,
+                       char *cbfilename,
+                       char *cbpartnum,
+                       char *cbdisp,
+                       void *cbcontent,
+                       char *cbtype,
+                       char *cbcharset,
+                       size_t cblength,
+                       char *cbencoding,
+                       void *cbuserdata),
+               void (*PreMultiPartCallBack)
+                       (char *cbname,
+                       char *cbfilename,
+                       char *cbpartnum,
+                       char *cbdisp,
+                       void *cbcontent,
+                       char *cbtype,
+                       char *cbcharset,
+                       size_t cblength,
+                       char *cbencoding,
+                       void *cbuserdata),
+               void (*PostMultiPartCallBack)
+                       (char *cbname,
+                       char *cbfilename,
+                       char *cbpartnum,
+                       char *cbdisp,
+                       void *cbcontent,
+                       char *cbtype,
+                       char *cbcharset,
+                       size_t cblength,
+                       char *cbencoding,
+                       void *cbuserdata),
+               void *userdata,
+               int dont_decode
+               );
diff --git a/webcit/missing b/webcit/missing
new file mode 100755 (executable)
index 0000000..cbe2b0e
--- /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 as published by
+# 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.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 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/netconf.c b/webcit/netconf.c
new file mode 100644 (file)
index 0000000..f380296
--- /dev/null
@@ -0,0 +1,320 @@
+/* 
+ * $Id$
+ */
+/**
+ * \defgroup NetShareConf Functions which handle network and sharing configuration.
+ *
+ * \ingroup CitadelConfig
+ */
+/*@{*/
+#include "webcit.h"
+
+/**
+ * \brief edit a network node
+ */
+void edit_node(void) {
+       char buf[SIZ];
+       char node[SIZ];
+       char cnode[SIZ];
+       FILE *fp;
+
+       if (strlen(bstr("ok_button")) > 0) {
+               strcpy(node, bstr("node") );
+               fp = tmpfile();
+               if (fp != NULL) {
+                       serv_puts("CONF getsys|application/x-citadel-ignet-config");
+                       serv_getln(buf, sizeof buf);
+                       if (buf[0] == '1') {
+                               while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+                                       extract_token(cnode, buf, 0, '|', sizeof cnode);
+                                       if (strcasecmp(node, cnode)) {
+                                               fprintf(fp, "%s\n", buf);
+                                       }
+                               }
+                       fprintf(fp, "%s|%s|%s|%s\n", 
+                               bstr("node"),
+                               bstr("secret"),
+                               bstr("host"),
+                               bstr("port") );
+                       }
+                       rewind(fp);
+
+                       serv_puts("CONF putsys|application/x-citadel-ignet-config");
+                       serv_getln(buf, sizeof buf);
+                       if (buf[0] == '4') {
+                               while (fgets(buf, sizeof buf, fp) != NULL) {
+                                       buf[strlen(buf)-1] = 0;
+                                       serv_puts(buf);
+                               }
+                               serv_puts("000");
+                       }
+                       fclose(fp);
+               }
+       }
+
+       display_netconf();
+}
+
+
+/**
+ * \brief add a node
+ */
+void display_add_node(void)
+{
+       output_headers(1, 1, 2, 0, 0, 0);
+       wprintf("<div id=\"banner\">\n");
+       wprintf("<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>");
+       wprintf("<SPAN CLASS=\"titlebar\">");
+       wprintf(_("Add a new node"));
+       wprintf("</SPAN>");
+       wprintf("</TD></TR></TABLE>\n");
+       wprintf("</div>\n<div id=\"content\">\n");
+
+       wprintf("<FORM METHOD=\"POST\" action=\"edit_node\">\n");
+       wprintf("<CENTER><TABLE border=0>\n");
+       wprintf("<TR><TD>%s</TD>", _("Node name"));
+       wprintf("<TD><INPUT TYPE=\"text\" NAME=\"node\" MAXLENGTH=\"16\"></TD></TR>\n");
+       wprintf("<TR><TD>%s</TD>", _("Shared secret"));
+       wprintf("<TD><INPUT TYPE=\"password\" NAME=\"secret\" MAXLENGTH=\"16\"></TD></TR>\n");
+       wprintf("<TR><TD>%s</TD>", _("Host or IP address"));
+       wprintf("<TD><INPUT TYPE=\"text\" NAME=\"host\" MAXLENGTH=\"64\"></TD></TR>\n");
+       wprintf("<TR><TD>%s</TD>", _("Port number"));
+       wprintf("<TD><INPUT TYPE=\"text\" NAME=\"port\" MAXLENGTH=\"8\"></TD></TR>\n");
+       wprintf("</TABLE><br />");
+               wprintf("<INPUT TYPE=\"submit\" NAME=\"ok_button\" VALUE=\"%s\">", _("Add node"));
+       wprintf("&nbsp;");
+               wprintf("<INPUT TYPE=\"submit\" NAME=\"cancel_button\" VALUE=\"%s\">", _("Cancel"));
+       wprintf("</CENTER></FORM>\n");
+
+       wDumpContent(1);
+}
+
+/**
+ * \brief modify an existing node
+ */
+void display_edit_node(void)
+{
+       char buf[512];
+       char node[256];
+       char cnode[256];
+       char csecret[256];
+       char chost[256];
+       char cport[256];
+
+       strcpy(node, bstr("node"));
+
+       output_headers(1, 1, 2, 0, 0, 0);
+       wprintf("<div id=\"banner\">\n");
+       wprintf("<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>");
+       wprintf("<SPAN CLASS=\"titlebar\">");
+       wprintf(_("Edit node configuration for "));
+       escputs(node);
+       wprintf("</SPAN>\n");
+       wprintf("</TD></TR></TABLE>\n");
+       wprintf("</div>\n<div id=\"content\">\n");
+
+       serv_puts("CONF getsys|application/x-citadel-ignet-config");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '1') {
+               while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+                       extract_token(cnode, buf, 0, '|', sizeof cnode);
+                       extract_token(csecret, buf, 1, '|', sizeof csecret);
+                       extract_token(chost, buf, 2, '|', sizeof chost);
+                       extract_token(cport, buf, 3, '|', sizeof cport);
+
+                       if (!strcasecmp(node, cnode)) {
+                               wprintf("<FORM METHOD=\"POST\" action=\"edit_node\">\n");
+                               wprintf("<CENTER><TABLE border=0>\n");
+                               wprintf("<TR><TD>");
+                               wprintf(_("Node name"));
+                               wprintf("</TD>");
+                               wprintf("<TD><INPUT TYPE=\"text\" NAME=\"node\" MAXLENGTH=\"16\" VALUE=\"%s\"></TD></TR>\n", cnode);
+                               wprintf("<TR><TD>");
+                               wprintf(_("Shared secret"));
+                               wprintf("</TD>");
+                               wprintf("<TD><INPUT TYPE=\"password\" NAME=\"secret\" MAXLENGTH=\"16\" VALUE=\"%s\"></TD></TR>\n", csecret);
+                               wprintf("<TR><TD>");
+                               wprintf(_("Host or IP address"));
+                               wprintf("</TD>");
+                               wprintf("<TD><INPUT TYPE=\"text\" NAME=\"host\" MAXLENGTH=\"64\" VALUE=\"%s\"></TD></TR>\n", chost);
+                               wprintf("<TR><TD>");
+                               wprintf(_("Port number"));
+                               wprintf("</TD>");
+                               wprintf("<TD><INPUT TYPE=\"text\" NAME=\"port\" MAXLENGTH=\"8\" VALUE=\"%s\"></TD></TR>\n", cport);
+                               wprintf("</TABLE><br />");
+                               wprintf("<INPUT TYPE=\"submit\" NAME=\"ok_button\" VALUE=\"%s\">",
+                                       _("Save changes"));
+                               wprintf("&nbsp;");
+                               wprintf("<INPUT TYPE=\"submit\" NAME=\"cancel_button\" VALUE=\"%s\">",
+                                       _("Cancel"));
+                               wprintf("</CENTER></FORM>\n");
+                       }
+
+               }
+       }
+
+       else {          /** command error getting configuration */
+               wprintf("%s<br />\n", &buf[4]);
+       }
+
+       wDumpContent(1);
+}
+
+
+/**
+ * \brief display all configured nodes
+ */
+void display_netconf(void)
+{
+       char buf[SIZ];
+       char node[SIZ];
+
+       output_headers(1, 1, 2, 0, 0, 0);
+       wprintf("<div id=\"banner\">\n");
+       wprintf("<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>");
+       wprintf("<SPAN CLASS=\"titlebar\">");
+       wprintf(_("Network configuration"));
+       wprintf("</SPAN>\n");
+       wprintf("</TD></TR></TABLE>\n");
+       wprintf("</div>\n<div id=\"content\">\n");
+
+       wprintf("<CENTER>");
+       wprintf("<a href=\"display_add_node\">");
+       wprintf(_("Add a new node"));
+       wprintf("</A><br />\n");
+       wprintf("</CENTER>");
+
+       wprintf("<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>");
+       wprintf("<SPAN CLASS=\"titlebar\">");
+       wprintf(_("Currently configured nodes"));
+       wprintf("</SPAN>\n");
+       wprintf("</TD></TR></TABLE>\n");
+       serv_puts("CONF getsys|application/x-citadel-ignet-config");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '1') {
+               wprintf("<CENTER><TABLE border=0>\n");
+               while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+                       extract_token(node, buf, 0, '|', sizeof node);
+                       wprintf("<TR><TD><FONT SIZE=+1>");
+                       escputs(node);
+                       wprintf("</FONT></TD>");
+                       wprintf("<TD><a href=\"display_edit_node&node=");
+                       urlescputs(node);
+                       wprintf("\">");
+                       wprintf(_("(Edit)"));
+                       wprintf("</A></TD>");
+                       wprintf("<TD><a href=\"display_confirm_delete_node&node=");
+                       urlescputs(node);
+                       wprintf("\">");
+                       wprintf(_("(Delete)"));
+                       wprintf("</A></TD>");
+                       wprintf("</TR>\n");
+               }
+               wprintf("</TABLE></CENTER>\n");
+       }
+       wDumpContent(1);
+}
+
+/**
+ * \brief display the dialog to verify the deletion
+ */
+void display_confirm_delete_node(void)
+{
+       char node[SIZ];
+
+       output_headers(1, 1, 2, 0, 0, 0);
+       wprintf("<div id=\"banner\">\n");
+       wprintf("<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>");
+       wprintf("<SPAN CLASS=\"titlebar\">");
+       wprintf(_("Confirm delete"));
+       wprintf("</SPAN>\n");
+       wprintf("</TD></TR></TABLE>\n");
+       wprintf("</div>\n<div id=\"content\">\n");
+
+       strcpy(node, bstr("node"));
+       wprintf("<CENTER>");
+       wprintf(_("Are you sure you want to delete "));
+       wprintf("<FONT SIZE=+1>");
+       escputs(node);
+       wprintf("</FONT>?<br />\n");
+       wprintf("<a href=\"delete_node&node=");
+       urlescputs(node);
+       wprintf("\">");
+       wprintf(_("Yes"));
+       wprintf("</A>&nbsp;&nbsp;&nbsp;");
+       wprintf("<a href=\"display_netconf\">");
+       wprintf(_("No"));
+       wprintf("</A><br />\n");
+       wDumpContent(1);
+}
+
+/**
+ * \brief actually delete the node
+ */
+void delete_node(void)
+{
+       char buf[SIZ];
+       char node[SIZ];
+       char cnode[SIZ];
+       FILE *fp;
+
+       strcpy(node, bstr("node") );
+       fp = tmpfile();
+       if (fp != NULL) {
+               serv_puts("CONF getsys|application/x-citadel-ignet-config");
+               serv_getln(buf, sizeof buf);
+               if (buf[0] == '1') {
+                       while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+                               extract_token(cnode, buf, 0, '|', sizeof cnode);
+                               if (strcasecmp(node, cnode)) {
+                                       fprintf(fp, "%s\n", buf);
+                               }
+                       }
+               }
+               rewind(fp);
+
+               serv_puts("CONF putsys|application/x-citadel-ignet-config");
+               serv_getln(buf, sizeof buf);
+               if (buf[0] == '4') {
+                       while (fgets(buf, sizeof buf, fp) != NULL) {
+                               buf[strlen(buf)-1] = 0;
+                               serv_puts(buf);
+                       }
+                       serv_puts("000");
+               }
+               fclose(fp);
+       }
+
+       display_netconf();
+}
+
+/**
+ * \brief add a new node
+ */
+void add_node(void)
+{
+       char node[SIZ];
+       char buf[SIZ];
+
+       strcpy(node, bstr("node"));
+
+       if (strlen(bstr("add_button")) > 0)  {
+               sprintf(buf, "NSET addnode|%s", node);
+               serv_puts(buf);
+               serv_getln(buf, sizeof buf);
+               if (buf[0] == '1') {
+                       output_headers(1, 1, 0, 0, 0, 0);
+                       server_to_text();
+                       wprintf("<a href=\"display_netconf\">");
+                       wprintf(_("Back to menu"));
+                       wprintf("</A>\n");
+                       wDumpContent(1);
+               } else {
+                       strcpy(WC->ImportantMessage, &buf[4]);
+                       display_netconf();
+               }
+       }
+}
+
+
+/*@}*/
diff --git a/webcit/notes.c b/webcit/notes.c
new file mode 100644 (file)
index 0000000..137480a
--- /dev/null
@@ -0,0 +1,134 @@
+/*
+ * $Id$
+ */
+/**
+ * \defgroup StickyNotes Functions which handle "sticky notes"
+ * \ingroup WebcitDisplayItems
+ */
+/*@{*/
+#include "webcit.h"
+#include "groupdav.h"
+#include "webserver.h"
+
+/**
+ * \brief display sticky notes
+ * \param msgnum the citadel mesage number
+ */
+void display_note(long msgnum)
+{
+       char buf[SIZ];
+       char notetext[SIZ];
+       char display_notetext[SIZ];
+       char eid[128];
+       int in_text = 0;
+       int i;
+
+       wprintf("<IMG ALIGN=MIDDLE src=\"static/storenotes_48x.gif\">\n");
+
+       serv_printf("MSG0 %ld", msgnum);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '1') {
+               wprintf("%s<br />\n", &buf[4]);
+               return;
+       }
+
+       strcpy(notetext, "");
+       strcpy(eid, "");
+       while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+
+               /** Fill the buffer */
+               if ( (in_text) && (strlen(notetext) < SIZ-256) ) {
+                       strcat(notetext, buf);
+               }
+
+               if ( (!in_text) && (!strncasecmp(buf, "exti=", 5)) ) {
+                       safestrncpy(eid, &buf[5], sizeof eid);
+               }
+
+               if ( (!in_text) && (!strcasecmp(buf, "text")) ) {
+                       in_text = 1;
+               }
+       }
+
+       /** Now sanitize the buffer */
+       for (i=0; i<strlen(notetext); ++i) {
+               if (isspace(notetext[i])) notetext[i] = ' ';
+       }
+
+       /** Make it HTML-happy and print it. */
+       stresc(display_notetext, notetext, 0, 0);
+       if (strlen(eid) > 0) {
+               wprintf("<span id=\"note%s\">%s</span><br />\n", eid, display_notetext);
+       }
+       else {
+               wprintf("<span id=\"note%ld\">%s</span><br />\n", msgnum, display_notetext);
+       }
+
+       /** Offer in-place editing. */
+       if (strlen(eid) > 0) {
+               wprintf("<script type=\"text/javascript\">"
+                       " new Ajax.InPlaceEditor('note%s', 'updatenote?eid=%s', {rows:5,cols:72}); "
+                       "</script>\n",
+                       eid,
+                       eid
+               );
+       }
+}
+
+
+/**
+ * \brief  This gets called by the Ajax.InPlaceEditor when we save a note.
+ */
+void updatenote(void)
+{
+       char buf[SIZ];
+       char notetext[SIZ];
+       char display_notetext[SIZ];
+       long msgnum;
+       int in_text = 0;
+       int i;
+
+       serv_printf("ENT0 1||0|0||||||%s", bstr("eid"));
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '4') {
+               text_to_server(bstr("value"));
+               serv_puts("000");
+       }
+
+       begin_ajax_response();
+       msgnum = locate_message_by_uid(bstr("eid"));
+       if (msgnum >= 0L) {
+               serv_printf("MSG0 %ld", msgnum);
+               serv_getln(buf, sizeof buf);
+               if (buf[0] == '1') {
+                       while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+               
+                               /** Fill the buffer */
+                               if ( (in_text) && (strlen(notetext) < SIZ-256) ) {
+                                       strcat(notetext, buf);
+                               }
+               
+                               if ( (!in_text) && (!strcasecmp(buf, "text")) ) {
+                                       in_text = 1;
+                               }
+                       }
+                       /** Now sanitize the buffer */
+                       for (i=0; i<strlen(notetext); ++i) {
+                               if (isspace(notetext[i])) notetext[i] = ' ';
+                       }
+               
+                       /** Make it HTML-happy and print it. */
+                       stresc(display_notetext, notetext, 0, 0);
+                       wprintf("%s\n", display_notetext);
+               }
+       }
+       else {
+               wprintf("%s", _("An error has occurred."));
+       }
+
+       end_ajax_response();
+}
+
+
+
+/*@}*/
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..1bc28e4
--- /dev/null
@@ -0,0 +1,499 @@
+/*
+ * $Id$
+ */
+/**
+ * \defgroup PageFunc Functions which implement the chat and paging facilities.
+ * \ingroup ClientPower
+ */
+/*@{*/
+#include "webcit.h"
+
+/**
+ * \brief display the form for paging (x-messaging) another user
+ */
+void display_page(void)
+{
+       char recp[SIZ];
+
+       strcpy(recp, bstr("recp"));
+
+        output_headers(1, 1, 2, 0, 0, 0);
+        wprintf("<div id=\"banner\">\n"
+                "<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>"
+                "<SPAN CLASS=\"titlebar\">");
+       wprintf(_("Send instant message"));
+       wprintf("</SPAN>"
+                "</TD></TR></TABLE>\n"
+                "</div>\n<div id=\"content\">\n"
+        );
+                                                                                                                             
+        wprintf("<div class=\"fix_scrollbar_bug\">"
+               "<table border=0 width=100%% bgcolor=\"#ffffff\"><tr><td>\n");
+
+       wprintf(_("Send an instant message to: "));
+       escputs(recp);
+       wprintf("<br>\n");
+
+       wprintf("<FORM METHOD=\"POST\" action=\"page_user\">\n");
+
+       wprintf("<TABLE border=0 width=100%%><TR><TD>\n");
+
+       wprintf("<INPUT TYPE=\"hidden\" NAME=\"recp\" VALUE=\"");
+       escputs(recp);
+       wprintf("\">\n");
+
+       wprintf(_("Enter message text:"));
+       wprintf("<br />");
+
+       wprintf("<TEXTAREA NAME=\"msgtext\" wrap=soft ROWS=5 COLS=40 "
+               "WIDTH=40></TEXTAREA>\n");
+
+       wprintf("</TD></TR></TABLE><br />\n");
+
+       wprintf("<INPUT TYPE=\"submit\" NAME=\"send_button\" VALUE=\"%s\">", _("Send message"));
+       wprintf("<br /><a href=\"javascript:window.close();\"%s</A>\n", _("Cancel"));
+
+       wprintf("</FORM></CENTER>\n");
+       wprintf("</td></tr></table></div>\n");
+       wDumpContent(1);
+}
+
+/**
+ * \brief page another user
+ */
+void page_user(void)
+{
+       char recp[256];
+       char buf[256];
+
+       safestrncpy(recp, bstr("recp"), sizeof recp);
+
+       if (strlen(bstr("send_button")) == 0) {
+               safestrncpy(WC->ImportantMessage,
+                       _("Message was not sent."),
+                       sizeof WC->ImportantMessage
+               );
+       } else {
+               serv_printf("SEXP %s|-", recp);
+               serv_getln(buf, sizeof buf);
+
+               if (buf[0] == '4') {
+                       text_to_server(bstr("msgtext"));
+                       serv_puts("000");
+                       stresc(buf, recp, 0, 0);
+                       snprintf(WC->ImportantMessage,
+                               sizeof WC->ImportantMessage,
+                               "%s%s.",
+                               _("Message has been sent to "),
+                               buf
+                       );
+               }
+               else {
+                       safestrncpy(WC->ImportantMessage, &buf[4], sizeof WC->ImportantMessage);
+               }
+       }
+
+       who();
+}
+
+
+
+/**
+ * \brief multiuser chat
+ */
+void do_chat(void)
+{
+       char buf[SIZ];
+
+       /** First, check to make sure we're still allowed in this room. */
+       serv_printf("GOTO %s", WC->wc_roomname);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '2') {
+               smart_goto("_BASEROOM_");
+               return;
+       }
+
+       /**
+        * If the chat socket is still open from a previous chat,
+        * close it -- because it might be stale or in the wrong room.
+        */
+       if (WC->chat_sock < 0) {
+               close(WC->chat_sock);
+               WC->chat_sock = (-1);
+       }
+
+       /**
+        * WebCit Chat works by having transmit, receive, and refresh
+        * frames.  Load the frameset.  (This isn't AJAX but the headers
+        * output by begin_ajax_response() happen to be the ones we need.)
+        */
+       begin_ajax_response();
+       do_template("chatframeset");
+       end_ajax_response();
+       return;
+}
+
+
+/**
+ * \brief 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.
+ */
+void page_popup(void)
+{
+       char buf[SIZ];
+
+       /** JavaScript function to alert the user that popups are probably blocked */
+       wprintf("<script type=\"text/javascript\">      "
+               "function PopUpFailed() {       "
+               " alert(\"%s\");        "
+               "}      "
+               "</script>\n",
+               _("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.")
+       );
+
+       /** First, do the check as part of our page load. */
+       serv_puts("NOOP");
+       serv_getln(buf, sizeof buf);
+       if (buf[3] == '*') {
+               if ((time(NULL) - WC->last_pager_check) > 60) {
+                       wprintf("<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>"
+                       );      
+               }
+       }
+
+       /** Then schedule it to happen again a minute from now if the user is idle. */
+       wprintf("<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: Math.random(), "
+               "   onSuccess: HandleSslp } );  "
+               " }     "
+               " new PeriodicalExecuter(CheckPager, 30);       "
+               "</script>      "
+       );
+}
+
+
+
+/**
+ * \brief Support function for chat
+ * make sure the chat socket is connected
+ * and in chat mode.
+ */
+int setup_chat_socket(void) {
+       char buf[SIZ];
+       int i;
+       int good_chatmode = 0;
+
+       if (WC->chat_sock < 0) {
+
+               if (!strcasecmp(ctdlhost, "uds")) {
+                       /** unix domain socket */
+                       sprintf(buf, "%s/citadel.socket", ctdlport);
+                       WC->chat_sock = uds_connectsock(buf);
+               }
+               else {
+                       /** tcp socket */
+                       WC->chat_sock = tcp_connectsock(ctdlhost, ctdlport);
+               }
+
+               if (WC->chat_sock < 0) {
+                       return(errno);
+               }
+
+               /** Temporarily swap the serv and chat sockets during chat talk */
+               i = WC->serv_sock;
+               WC->serv_sock = WC->chat_sock;
+               WC->chat_sock = i;
+
+               serv_getln(buf, sizeof buf);
+               if (buf[0] == '2') {
+                       serv_printf("USER %s", WC->wc_username);
+                       serv_getln(buf, sizeof buf);
+                       if (buf[0] == '3') {
+                               serv_printf("PASS %s", WC->wc_password);
+                               serv_getln(buf, sizeof buf);
+                               if (buf[0] == '2') {
+                                       serv_printf("GOTO %s", WC->wc_roomname);
+                                       serv_getln(buf, sizeof buf);
+                                       if (buf[0] == '2') {
+                                               serv_puts("CHAT");
+                                               serv_getln(buf, sizeof buf);
+                                               if (buf[0] == '8') {
+                                                       good_chatmode = 1;
+                                               }
+                                       }
+                               }
+                       }
+               }
+
+               /** Unswap the sockets. */
+               i = WC->serv_sock;
+               WC->serv_sock = WC->chat_sock;
+               WC->chat_sock = i;
+
+               if (!good_chatmode) close(WC->serv_sock);
+
+       }
+       return(0);
+}
+
+
+
+/**
+ * \brief Receiving side of the chat window.  
+ * This is implemented in a
+ * tiny hidden IFRAME that just does JavaScript writes to
+ * other frames whenever it refreshes and finds new data.
+ */
+void chat_recv(void) {
+       int i;
+       struct pollfd pf;
+       int got_data = 0;
+       int end_chat_now = 0;
+       char buf[SIZ];
+       char cl_user[SIZ];
+       char cl_text[SIZ];
+       char *output_data = NULL;
+
+       output_headers(0, 0, 0, 0, 0, 0);
+
+       wprintf("Content-type: text/html; charset=utf-8\n");
+       wprintf("\n");
+       wprintf("<html>\n"
+               "<head>\n"
+               "<meta http-equiv=\"refresh\" content=\"3\" />\n"
+               "</head>\n"
+
+               "<body bgcolor=\"#FFFFFF\">\n"
+       );
+
+       if (setup_chat_socket() != 0) {
+               wprintf(_("An error occurred while setting up the chat socket."));
+               wprintf("</BODY></HTML>\n");
+               wDumpContent(0);
+               return;
+       }
+
+       /**
+        * See if there is any chat data waiting.
+        */
+       output_data = strdup("");
+       do {
+               got_data = 0;
+               pf.fd = WC->chat_sock;
+               pf.events = POLLIN;
+               pf.revents = 0;
+               if (poll(&pf, 1, 1) > 0) if (pf.revents & POLLIN) {
+                       ++got_data;
+
+                       /** Temporarily swap the serv and chat sockets during chat talk */
+                       i = WC->serv_sock;
+                       WC->serv_sock = WC->chat_sock;
+                       WC->chat_sock = i;
+       
+                       serv_getln(buf, sizeof buf);
+
+                       if (!strcmp(buf, "000")) {
+                               strcpy(buf, ":|");
+                               strcat(buf, _("Now exiting chat mode."));
+                               end_chat_now = 1;
+                       }
+                       
+                       /** Unswap the sockets. */
+                       i = WC->serv_sock;
+                       WC->serv_sock = WC->chat_sock;
+                       WC->chat_sock = i;
+
+                       /** Append our output data */
+                       output_data = realloc(output_data, strlen(output_data) + strlen(buf) + 4);
+                       strcat(output_data, buf);
+                       strcat(output_data, "\n");
+               }
+
+       } while ( (got_data) && (!end_chat_now) );
+
+       if (end_chat_now) {
+               close(WC->chat_sock);
+               WC->chat_sock = (-1);
+               wprintf("<img src=\"static/blank.gif\" onLoad=\"parent.window.close();\">\n");
+       }
+
+       if (strlen(output_data) > 0) {
+
+               if (output_data[strlen(output_data)-1] == '\n') {
+                       output_data[strlen(output_data)-1] = 0;
+               }
+
+               /** Output our fun to the other frame. */
+               wprintf("<img src=\"static/blank.gif\" WIDTH=1 HEIGHT=1\n"
+                       "onLoad=\" \n"
+               );
+
+               for (i=0; i<num_tokens(output_data, '\n'); ++i) {
+                       extract_token(buf, output_data, i, '\n', sizeof buf);
+                       extract_token(cl_user, buf, 0, '|', sizeof cl_user);
+                       extract_token(cl_text, buf, 1, '|', sizeof cl_text);
+
+                       if (strcasecmp(cl_text, "NOOP")) {
+
+                               wprintf("parent.chat_transcript.document.write('");
+       
+                               if (strcasecmp(cl_user, WC->last_chat_user)) {
+                                       wprintf("<TABLE border=0 WIDTH=100%% "
+                                               "CELLSPACING=1 CELLPADDING=0 "
+                                               "BGCOLOR=&quot;#FFFFFF&quot;>"
+                                               "<TR><TD></TR></TD></TABLE>"
+                                       );
+       
+                               }
+
+                               wprintf("<TABLE border=0 WIDTH=100%% "
+                                       "CELLSPACING=0 CELLPADDING=0 "
+                                       "BGCOLOR=&quot;#EEEEEE&quot;>");
+       
+                               wprintf("<TR><TD>");
+       
+                               if (!strcasecmp(cl_user, ":")) {
+                                       wprintf("<I>");
+                               }
+
+                               if (strcasecmp(cl_user, WC->last_chat_user)) {
+                                       wprintf("<B>");
+       
+                                       if (!strcasecmp(cl_user, WC->wc_fullname)) {
+                                               wprintf("<FONT COLOR=&quot;#FF0000&quot;>");
+                                       }
+                                       else {
+                                               wprintf("<FONT COLOR=&quot;#0000FF&quot;>");
+                                       }
+                                       jsescputs(cl_user);
+       
+                                       wprintf("</FONT>: </B>");
+                               }
+                               else {
+                                       wprintf("&nbsp;&nbsp;&nbsp;");
+                               }
+                               jsescputs(cl_text);
+                               if (!strcasecmp(cl_user, ":")) {
+                                       wprintf("</I>");
+                               }
+
+                               wprintf("</TD></TR></TABLE>");
+                               wprintf("'); \n");
+
+                               strcpy(WC->last_chat_user, cl_user);
+                       }
+               }
+
+               wprintf("parent.chat_transcript.scrollTo(999999,999999);\">\n");
+       }
+
+       free(output_data);
+
+       wprintf("</BODY></HTML>\n");
+       wDumpContent(0);
+}
+
+
+/**
+ * \brief sending side of the chat window
+ */
+void chat_send(void) {
+       int i;
+       char send_this[SIZ];
+       char buf[SIZ];
+
+       output_headers(0, 0, 0, 0, 0, 0);
+       wprintf("Content-type: text/html; charset=utf-8\n");
+       wprintf("\n");
+       wprintf("<HTML>"
+               "<BODY onLoad=\"document.chatsendform.send_this.focus();\" >"
+       );
+
+       if (bstr("send_this") != NULL) {
+               strcpy(send_this, bstr("send_this"));
+       }
+       else {
+               strcpy(send_this, "");
+       }
+
+       if (strlen(bstr("help_button")) > 0) {
+               strcpy(send_this, "/help");
+       }
+
+       if (strlen(bstr("list_button")) > 0) {
+               strcpy(send_this, "/who");
+       }
+
+       if (strlen(bstr("exit_button")) > 0) {
+               strcpy(send_this, "/quit");
+       }
+
+       if (setup_chat_socket() != 0) {
+               wprintf(_("An error occurred while setting up the chat socket."));
+               wprintf("</BODY></HTML>\n");
+               wDumpContent(0);
+               return;
+       }
+
+       /** Temporarily swap the serv and chat sockets during chat talk */
+       i = WC->serv_sock;
+       WC->serv_sock = WC->chat_sock;
+       WC->chat_sock = i;
+
+       while (strlen(send_this) > 0) {
+               if (strlen(send_this) < 67) {
+                       serv_puts(send_this);
+                       strcpy(send_this, "");
+               }
+               else {
+                       for (i=55; i<67; ++i) {
+                               if (send_this[i] == ' ') break;
+                       }
+                       strncpy(buf, send_this, i);
+                       buf[i] = 0;
+                       strcpy(send_this, &send_this[i]);
+                       serv_puts(buf);
+               }
+       }
+
+       /** Unswap the sockets. */
+       i = WC->serv_sock;
+       WC->serv_sock = WC->chat_sock;
+       WC->chat_sock = i;
+
+       wprintf("<FORM METHOD=\"POST\" action=\"chat_send\" NAME=\"chatsendform\">\n");
+       wprintf("<INPUT TYPE=\"text\" SIZE=\"80\" MAXLENGTH=\"%d\" "
+               "NAME=\"send_this\">\n", SIZ-10);
+       wprintf("<br />");
+       wprintf("<INPUT TYPE=\"submit\" NAME=\"send_button\" VALUE=\"%s\">\n", _("Send"));
+       wprintf("<INPUT TYPE=\"submit\" NAME=\"help_button\" VALUE=\"%s\">\n", _("Help"));
+       wprintf("<INPUT TYPE=\"submit\" NAME=\"list_button\" VALUE=\"%s\">\n", _("List users"));
+       wprintf("<INPUT TYPE=\"submit\" NAME=\"exit_button\" VALUE=\"%s\">\n", _("Exit"));
+       wprintf("</FORM>\n");
+
+       wprintf("</BODY></HTML>\n");
+       wDumpContent(0);
+}
+
+/*@}*/
diff --git a/webcit/po/Makefile.in b/webcit/po/Makefile.in
new file mode 100644 (file)
index 0000000..9fd91d3
--- /dev/null
@@ -0,0 +1,20 @@
+all: ../locale/de/LC_MESSAGES/webcit.mo \
+       ../locale/it/LC_MESSAGES/webcit.mo \
+       ../locale/en_GB/LC_MESSAGES/webcit.mo
+
+../locale/de/LC_MESSAGES/webcit.mo: de.po
+       [ -d ../locale/de/LC_MESSAGES ] || mkdir -p ../locale/de/LC_MESSAGES
+       msgfmt de.po -o ../locale/de/LC_MESSAGES/webcit.mo
+
+../locale/it/LC_MESSAGES/webcit.mo: it.po
+       [ -d ../locale/it/LC_MESSAGES ] || mkdir -p ../locale/it/LC_MESSAGES
+       msgfmt it.po -o ../locale/it/LC_MESSAGES/webcit.mo
+
+../locale/es/LC_MESSAGES/webcit.mo: es.po
+       [ -d ../locale/es/LC_MESSAGES ] || mkdir -p ../locale/es/LC_MESSAGES
+       msgfmt es.po -o ../locale/es/LC_MESSAGES/webcit.mo
+
+../locale/en_GB/LC_MESSAGES/webcit.mo: en_GB.po
+       [ -d ../locale/en_GB/LC_MESSAGES ] || mkdir -p ../locale/en_GB/LC_MESSAGES
+       msgfmt en_GB.po -o ../locale/en_GB/LC_MESSAGES/webcit.mo
+
diff --git a/webcit/po/create-pot.sh b/webcit/po/create-pot.sh
new file mode 100644 (file)
index 0000000..df6cfb9
--- /dev/null
@@ -0,0 +1,14 @@
+#!/bin/bash
+
+echo Updating webcit.pot from strings in the source code ...
+xgettext \
+       --copyright-holder='The Citadel Project - http://www.citadel.org' \
+       -k_ \
+       -o webcit.pot \
+       ../*.c
+
+for x in *.po
+do
+       echo Merging webcit.pot into $x ...
+       msgmerge $x webcit.pot -o $x
+done
diff --git a/webcit/po/de.po b/webcit/po/de.po
new file mode 100644 (file)
index 0000000..c0ce2da
--- /dev/null
@@ -0,0 +1,2930 @@
+# translation of de.po to Deutsch
+# Wilfried Goesgens <w.goesgens@chaosindustries.de>, 2005, 2006.
+# German localization
+# Copyright (C) 2005 By wilfried Goesgens
+# This file is distributed under the GPL
+# FIRST AUTHOR <willi@chaosindustries.de> 2005
+# "äöäö
+msgid ""
+msgstr ""
+"Project-Id-Version: de\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-02-13 21:49+0100\n"
+"PO-Revision-Date: 2006-02-05 17:56+0100\n"
+"Last-Translator: Wilfried Goesgens <w.goesgens@chaosindustries.de>\n"
+"Language-Team: Deutsch <room_citadel_devel@uncensored.citadel.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.1\n"
+
+#: ../auth.c:23
+msgid "Deleted"
+msgstr "gelöscht"
+
+#: ../auth.c:24 ../auth.c:72
+msgid "New User"
+msgstr "Neuer Benutzer"
+
+#: ../auth.c:25
+msgid "Problem User"
+msgstr "Problematischer Benutzer"
+
+#: ../auth.c:26
+msgid "Local User"
+msgstr "Lokaler Benutzer"
+
+#: ../auth.c:27
+msgid "Network User"
+msgstr "Netzwerk Benutzer"
+
+#: ../auth.c:28
+msgid "Preferred User"
+msgstr "nur Privilegierte Benutzer"
+
+#: ../auth.c:29
+msgid "Aide"
+msgstr "Verantwortlicher"
+
+#: ../auth.c:52
+#, c-format
+msgid ""
+"<ul><li><b>If you already have an account on %s</b>, 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.<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>"
+
+#: ../auth.c:68 ../who.c:263
+msgid "User name:"
+msgstr "Benutzername:"
+
+#: ../auth.c:69
+msgid "Password:"
+msgstr "Passwort:"
+
+#: ../auth.c:70
+msgid "Language:"
+msgstr "Sprache:"
+
+#: ../auth.c:71
+msgid "Login"
+msgstr "Anmelden"
+
+#: ../auth.c:73 ../paging.c:510
+msgid "Exit"
+msgstr "Ende"
+
+#: ../auth.c:75
+#, c-format
+msgid "%s - powered by Citadel"
+msgstr "%s - mit Citadel-Technologie"
+
+#: ../auth.c:166 ../auth.c:534
+msgid "Blank passwords are not allowed."
+msgstr "Leere Passwörter sind nicht zulässig."
+
+#: ../auth.c:187
+msgid "Your password was not accepted."
+msgstr "Ihr Passwort wurde nicht akzeptiert"
+
+#: ../auth.c:295
+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."
+
+#: ../auth.c:302
+msgid "Log in again"
+msgstr "Erneut Anmelden"
+
+#: ../auth.c:305
+msgid "Close window"
+msgstr "Fenster Schließen"
+
+#: ../auth.c:326 ../mainmenu.c:241
+msgid "Validate new users"
+msgstr "Neue Benutzer überprüfen"
+
+#: ../auth.c:346
+msgid "No users require validation at this time."
+msgstr "Keine Benutzer müssen zu dieser Zeit validiert werden"
+
+#: ../auth.c:387
+#, c-format
+msgid "Current access level: %d (%s)\n"
+msgstr "Aktuelle Berechtigungen: %d (%s)\n"
+
+#: ../auth.c:395
+msgid "Select access level for this user:"
+msgstr "Berechtigungen dieses Benutzers"
+
+#: ../auth.c:458 ../mainmenu.c:137
+msgid "Change your password"
+msgstr "Ändern Sie Ihr Passwort"
+
+#: ../auth.c:487
+msgid "Enter new password:"
+msgstr "Bitte geben Sie ein neues Passwort ein"
+
+#: ../auth.c:491
+msgid "Enter it again to confirm:"
+msgstr "Nocheinmal zur Verifizierung:"
+
+#: ../auth.c:496
+msgid "Change password"
+msgstr "Passwort ändern"
+
+#: ../auth.c:498 ../calendar.c:616 ../event.c:390 ../graphics.c:58
+#: ../iconbar.c:712 ../mainmenu.c:300 ../messages.c:2894 ../messages.c:3015
+#: ../messages.c:3103 ../netconf.c:86 ../netconf.c:149 ../paging.c:58
+#: ../preferences.c:389 ../roomops.c:1285 ../roomops.c:1613 ../roomops.c:2046
+#: ../roomops.c:2195 ../roomops.c:2259 ../siteconfig.c:564 ../sysmsgs.c:59
+#: ../useredit.c:381 ../vcard_edit.c:336 ../who.c:273
+msgid "Cancel"
+msgstr "Abbruch"
+
+#: ../auth.c:515
+msgid "Cancelled.  Password was not changed."
+msgstr "Abgebrochen. Passwort wurde nicht gesetzt."
+
+#: ../auth.c:526
+msgid "They don't match.  Password was not changed."
+msgstr "Die Passwörter stimmen nicht überein. Passwort nicht geändert"
+
+#: ../availability.c:140
+msgid "availability unknown"
+msgstr "Verfügbarkeit unbekannt"
+
+#: ../availability.c:161
+msgid "free"
+msgstr "frei"
+
+#: ../availability.c:171
+msgid "BUSY"
+msgstr "BESCHÄFTIGT"
+
+#: ../calendar.c:24
+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 eine Version des Citadel-Web-Services "
+"mit unterstützung für Kalender.</I><br />\n"
+
+#: ../calendar.c:38
+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 Fehlerweil ihr "
+"WebCit System ohne Kalenderunterstützung installiert wurde.Bitte wenden Sie "
+"sich an Ihren Systemadministrator.</i><br />\n"
+
+#: ../calendar.c:50
+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 Fehlerweil ihr WebCit "
+"System ohne Kalenderunterstützung installiert wurde.Bitte wenden Sie sich an "
+"Ihren Systemadministrator.</i><br />\n"
+
+#: ../calendar.c:107
+msgid "Meeting invitation"
+msgstr "Einladung für ein Treffen"
+
+#: ../calendar.c:116
+msgid "Attendee's reply to your invitation"
+msgstr "Antwort des Teilnehmers auf Ihre Einladung"
+
+#: ../calendar.c:125
+msgid "Published event"
+msgstr "Öffentliches Ereignis"
+
+#: ../calendar.c:130
+msgid "This is an unknown type of calendar item."
+msgstr "Dies ist ein unbekanntes Kalender-Datum"
+
+#: ../calendar.c:139 ../calendar.c:560
+msgid "Summary:"
+msgstr "Zusammenfassung:"
+
+#: ../calendar.c:148
+msgid "Location:"
+msgstr "Ort:"
+
+#: ../calendar.c:174
+msgid "Date:"
+msgstr "Datum:"
+
+#: ../calendar.c:181
+msgid "Starting date/time:"
+msgstr "Startzeit/Datum:"
+
+#: ../calendar.c:192
+msgid "Ending date/time:"
+msgstr "Endzeit/Datum:"
+
+#: ../calendar.c:201 ../calendar.c:596
+msgid "Description:"
+msgstr "Beschreibung"
+
+#: ../calendar.c:210
+msgid "Attendee:"
+msgstr "Teilnehmer"
+
+#: ../calendar.c:250
+#, c-format
+msgid "This is an update of '%s' which is already in your calendar."
+msgstr "Dies ist ein Update von '%s', das schon in Ihrem Kalender ist."
+
+#: ../calendar.c:254
+#, 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:259
+msgid "Update:"
+msgstr "Update:"
+
+#: ../calendar.c:260
+msgid "CONFLICT:"
+msgstr "KONFLIKT:"
+
+#: ../calendar.c:278
+msgid "How would you like to respond to this invitation?"
+msgstr ""
+
+#: ../calendar.c:279
+msgid "Accept"
+msgstr "Annehmen"
+
+#: ../calendar.c:280
+msgid "Tentative"
+msgstr "Vorläufig"
+
+#: ../calendar.c:281
+msgid "Decline"
+msgstr "Ablehnen"
+
+#: ../calendar.c:305
+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:306
+msgid "Update"
+msgstr "Aktualisieren"
+
+#: ../calendar.c:307
+msgid "Ignore"
+msgstr "Ignorieren"
+
+#: ../calendar.c:334
+msgid "There was an error parsing this calendar item."
+msgstr "Ein Kalenderdatum konnte nicht verarbeitet werden."
+
+#: ../calendar.c:361
+msgid "Respond to meeting request"
+msgstr "Auf Anfrage zum Treffen antworten"
+
+#: ../calendar.c:380
+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:384
+msgid ""
+"You have tentatively accepted this meeting invitation.  It has been "
+"'pencilled in' to your calendar."
+msgstr ""
+"Sie haben diese Einladung vorläufig angenommen. Es wurde in Ihrem Kalender "
+"vorgemerkt."
+
+#: ../calendar.c:388
+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:393
+msgid "A reply has been sent to the meeting organizer."
+msgstr "Eine Antwort wurde an den Organisator versendet."
+
+#: ../calendar.c:403 ../calendar.c:457
+msgid "Return to messages"
+msgstr "Zurück zur Nachricht"
+
+#: ../calendar.c:422
+msgid "Update your calendar with this RSVP"
+msgstr "Dieses u.A.w.g. in Ihren Kalender übernehmen"
+
+#: ../calendar.c:441
+msgid "Your calendar has been updated to reflect this RSVP."
+msgstr "u.A.w.g. wurde eingetragen."
+
+#: ../calendar.c:443
+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:544
+msgid "Edit task"
+msgstr "Aufgabe bearbeiten"
+
+#: ../calendar.c:571
+msgid "Start date:"
+msgstr "Anfangsdatum:"
+
+#: ../calendar.c:584
+msgid "Due date:"
+msgstr "Fälligkeitsdatum:"
+
+#: ../calendar.c:614 ../event.c:387
+msgid "Save"
+msgstr "Speichern"
+
+#: ../calendar.c:615 ../event.c:388 ../messages.c:903 ../messages.c:2281
+msgid "Delete"
+msgstr "Löschen"
+
+#: ../calendar_tools.c:73
+msgid "Month: "
+msgstr "Monat: "
+
+#: ../calendar_tools.c:87
+msgid "Day: "
+msgstr "Tag: "
+
+#: ../calendar_tools.c:97
+msgid "Year: "
+msgstr "Jahr: "
+
+#: ../calendar_tools.c:115
+msgid "Hour: "
+msgstr "Stunde: "
+
+#: ../calendar_tools.c:135
+msgid "Minute: "
+msgstr "Minute: "
+
+#: ../calendar_tools.c:204
+msgid "(status unknown)"
+msgstr "(Zustand unbekannt)"
+
+#: ../calendar_tools.c:220
+msgid "(needs action)"
+msgstr "(zu bearbeiten)"
+
+#: ../calendar_tools.c:223
+msgid "(accepted)"
+msgstr "(Angenommen)"
+
+#: ../calendar_tools.c:226
+msgid "(declined)"
+msgstr "(Abgelehnt)"
+
+#: ../calendar_tools.c:229
+msgid "(tenative)"
+msgstr "(Vorläufig)"
+
+#: ../calendar_tools.c:232
+msgid "(delegated)"
+msgstr "(abgesendet)"
+
+#: ../calendar_tools.c:235
+msgid "(completed)"
+msgstr "(Vollständig)"
+
+#: ../calendar_tools.c:238
+msgid "(in process)"
+msgstr "(in Bearbeitung)"
+
+#: ../calendar_tools.c:241
+msgid "(none)"
+msgstr "(keine)"
+
+#: ../calendar_view.c:17
+msgid "The calendar view is not available."
+msgstr "Die Kalenderdarstellung ist nicht verfügbar."
+
+#: ../calendar_view.c:24
+msgid "The tasks view is not available."
+msgstr "Die Aufgabendarstellung ist nicht verfügbar."
+
+#: ../calendar_view.c:435
+msgid "Week"
+msgstr "Woche"
+
+#: ../calendar_view.c:437
+msgid "Hours"
+msgstr "Stunden"
+
+#: ../calendar_view.c:438 ../messages.c:2276
+msgid "Subject"
+msgstr "Betreff"
+
+#: ../calendar_view.c:439 ../event.c:164
+msgid "Start"
+msgstr "Anfang"
+
+#: ../calendar_view.c:440 ../event.c:218
+msgid "End"
+msgstr "Ende"
+
+#: ../calendar_view.c:930
+msgid "Name of task"
+msgstr "Name der Aufgaben"
+
+#: ../calendar_view.c:932
+msgid "Date due"
+msgstr "Fälligkeitsdatum"
+
+#: ../event.c:76 ../paging.c:78
+msgid "Add or edit an event"
+msgstr "Ereignis hinzufügen oder ändern"
+
+#: ../event.c:142 ../iconbar.c:123 ../iconbar.c:539
+msgid "Summary"
+msgstr "Zusammenfassung"
+
+#: ../event.c:153
+msgid "Location"
+msgstr "Ort"
+
+#: ../event.c:207
+msgid "All day event"
+msgstr "Ganztägiger Termin"
+
+#: ../event.c:246 ../iconbar.c:199 ../iconbar.c:586
+msgid "Notes"
+msgstr "Notiz"
+
+#: ../event.c:288
+msgid "Organizer"
+msgstr "Organisator"
+
+#: ../event.c:293
+msgid "(you are the organizer)"
+msgstr "(Sie sind der Organisator)"
+
+#: ../event.c:311
+msgid "Show time as:"
+msgstr "Zeit anzeigen als:"
+
+#: ../event.c:333
+msgid "Free"
+msgstr "Frei"
+
+#: ../event.c:340
+msgid "Busy"
+msgstr "Besetzt"
+
+#: ../event.c:346
+msgid "Attendees"
+msgstr "Teilnehmer"
+
+#: ../event.c:349
+msgid "(One per line)"
+msgstr "(einen pro Zeile)"
+
+#: ../event.c:389
+msgid "Check attendee availability"
+msgstr "Teilnehmer Verfügbarkeit überprüfen"
+
+#: ../floors.c:34
+msgid "Add/change/delete floors"
+msgstr "Etage Neu/Ändern/Löschen"
+
+#: ../floors.c:51 ../siteconfig.c:49 ../vcard_edit.c:78 ../wiki.c:66
+#: ../wiki.c:76
+msgid "Error"
+msgstr "Fehler"
+
+#: ../floors.c:62
+msgid "Floor number"
+msgstr "Etage Nummer"
+
+#: ../floors.c:64
+msgid "Floor name"
+msgstr "Etagen Name"
+
+#: ../floors.c:66
+msgid "Number of rooms"
+msgstr "Zahl der Räume"
+
+#: ../floors.c:68
+msgid "Floor CSS"
+msgstr "Etagen CSS"
+
+#: ../floors.c:81
+msgid "(delete floor)"
+msgstr "(Etage Löschen)"
+
+#: ../floors.c:87
+msgid "(edit graphic)"
+msgstr "(Bild verändern)"
+
+#: ../floors.c:100
+msgid "Change name"
+msgstr "Namen Ändern"
+
+#: ../floors.c:113
+msgid "Change CSS"
+msgstr "CSS Ändern"
+
+#: ../floors.c:125
+msgid "Create new floor"
+msgstr "Neue Etage"
+
+#: ../floors.c:146
+#, c-format
+msgid "Floor has been deleted."
+msgstr "Etage gelöscht."
+
+#: ../floors.c:169
+#, c-format
+msgid "New floor has been created."
+msgstr "Eine neue Etage wurde generiert."
+
+#: ../graphics.c:27
+msgid "Image upload"
+msgstr "Bild Hochgeladen"
+
+#: ../graphics.c:45
+msgid ""
+"You can upload any image directly from your computer, as long as it is in "
+"GIF format (JPEG, PNG, etc. won't work)."
+msgstr ""
+"Sie können ein Bild direkt von ihrem Computer hochladen. Es muss im GIF-"
+"Format sein (JPEG, PNG etc funktionieren nicht)."
+
+#: ../graphics.c:50
+msgid "Please select a file to upload:"
+msgstr "Bitte geben Sie eine Datei zum hochladen an:"
+
+#: ../graphics.c:54
+msgid "Upload"
+msgstr "Hochladen"
+
+#: ../graphics.c:56
+msgid "Reset form"
+msgstr "Formular Löschen"
+
+#: ../graphics.c:74
+msgid "Graphics upload has been cancelled."
+msgstr "Bild hochladen abgebrochen."
+
+#: ../graphics.c:81
+msgid "You didn't upload a file."
+msgstr "Sie haben keine Datei hochgeladen."
+
+#: ../html2html.c:109
+#, c-format
+msgid "realloc() error! couldn't get %d bytes: %s"
+msgstr "realloc() Fehler! Konnte %d Bytes nicht allozieren: %s"
+
+#: ../iconbar.c:105 ../iconbar.c:391
+msgid "Find out more about Citadel"
+msgstr "Mehr über Citadel herausfinden"
+
+#: ../iconbar.c:106 ../iconbar.c:392
+msgid "CITADEL"
+msgstr "CITADEL"
+
+#: ../iconbar.c:110
+msgid "switch to room list"
+msgstr "Auf Raumliste wechseln"
+
+#: ../iconbar.c:116 ../iconbar.c:540
+msgid "Your summary page"
+msgstr "Meine Übersichtsseite"
+
+#: ../iconbar.c:133
+msgid "Go to your email inbox"
+msgstr "Zum Posteingang"
+
+#: ../iconbar.c:140
+msgid "Mail"
+msgstr "Posteingang"
+
+#: ../iconbar.c:158
+msgid "Go to your personal calendar"
+msgstr "Zu Ihrem persönlichen Kalender"
+
+#: ../iconbar.c:165 ../iconbar.c:603 ../roomops.c:22
+msgid "Calendar"
+msgstr "Kalender"
+
+#: ../iconbar.c:175
+msgid "Go to your personal address book"
+msgstr "Zu Ihrem persönlichen Adressbuch"
+
+#: ../iconbar.c:182 ../iconbar.c:570
+msgid "Contacts"
+msgstr "Adressen"
+
+#: ../iconbar.c:192
+msgid "Go to your personal notes"
+msgstr "Zu Ihren persönlichen Notizen"
+
+#: ../iconbar.c:209
+msgid "Go to your personal task list"
+msgstr "Zu Ihrer persönlichen Aufgabenliste"
+
+#: ../iconbar.c:216 ../iconbar.c:618 ../summary.c:109
+msgid "Tasks"
+msgstr "Aufgaben"
+
+#: ../iconbar.c:224
+msgid "List all of your accessible rooms"
+msgstr "Alle zugänglichen Räume auflisten"
+
+#: ../iconbar.c:231 ../iconbar.c:634
+msgid "Rooms"
+msgstr "Räume"
+
+#: ../iconbar.c:240
+msgid "See who is online right now"
+msgstr "Sehen Sie, wer gerade angemeldet ist"
+
+#: ../iconbar.c:247 ../iconbar.c:650
+msgid "Who is online?"
+msgstr "Wer ist da?"
+
+#: ../iconbar.c:265 ../iconbar.c:666
+msgid "Chat"
+msgstr "Chat"
+
+#: ../iconbar.c:275
+msgid "Advanced Options Menu: Advanced Room commands, Account Info, and Chat"
+msgstr ""
+"Erweiterte Optionen Menü: Spezielle Raumkommandos, Benutzerdaten Bearbeiten, "
+"Chatten"
+
+#: ../iconbar.c:282
+msgid "Advanced"
+msgstr "Erweitert"
+
+#: ../iconbar.c:292
+msgid "Room and system administration functions"
+msgstr "Räume und Verwaltung"
+
+#: ../iconbar.c:299 ../roomops.c:1002
+msgid "Administration"
+msgstr "Verwaltung"
+
+#: ../iconbar.c:307 ../iconbar.c:316 ../iconbar.c:402 ../iconbar.c:411
+#: ../mainmenu.c:110
+msgid "Log off"
+msgstr "Abmelden"
+
+#: ../iconbar.c:308 ../iconbar.c:403
+msgid "Log off now?"
+msgstr "Jetzt abmelden?"
+
+#: ../iconbar.c:326
+msgid "Customize this menu"
+msgstr "Dieses Menü bearbeiten"
+
+#: ../iconbar.c:327
+msgid "customize this menu"
+msgstr "Dieses Menü Bearbeiten"
+
+#: ../iconbar.c:396
+msgid "switch to menu"
+msgstr "Zurück zum Menü"
+
+#: ../iconbar.c:481
+msgid "Customize the icon bar"
+msgstr "Diese Icon-Leiste bearbeiten"
+
+#: ../iconbar.c:493
+msgid "Display icons as:"
+msgstr "Icons anzeigen als:"
+
+#: ../iconbar.c:499
+msgid "pictures and text"
+msgstr "Bilder und Text"
+
+#: ../iconbar.c:500
+msgid "pictures only"
+msgstr "Nur Bilder"
+
+#: ../iconbar.c:501
+msgid "text only"
+msgstr "Nur Text"
+
+#: ../iconbar.c:506
+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, die sie auf der Leiste links angezeigt haben möchten "
+"anwählen"
+
+#: ../iconbar.c:524
+msgid "Site logo"
+msgstr "Seiten Logo"
+
+#: ../iconbar.c:525
+msgid "An icon describing this site"
+msgstr "Ein Icon, das Ihre Seite beschreibt"
+
+#: ../iconbar.c:554
+msgid "Mail (inbox)"
+msgstr "Posteingang"
+
+#: ../iconbar.c:555
+msgid "A shortcut to your email Inbox"
+msgstr "Eine Abkürzung zu Ihrem Posteingang"
+
+#: ../iconbar.c:571
+msgid "Your personal address book"
+msgstr "Ihr eigenes Adressbuch"
+
+#: ../iconbar.c:587
+msgid "Your personal notes"
+msgstr "Ihre Notizen"
+
+#: ../iconbar.c:604
+msgid "A shortcut to your personal calendar"
+msgstr "Eine Abkürzung zu Ihrem Kalender"
+
+#: ../iconbar.c:619
+msgid "A shortcut to your personal task list"
+msgstr "Eine Abkürzung zu Ihrer Aufgabenliste"
+
+#: ../iconbar.c:635
+msgid ""
+"Clicking this icon displays a list of all accessible rooms (or folders) "
+"available."
+msgstr "Liste aller verfügbaren Räume (oder Verzeichnisse) auflisten."
+
+#: ../iconbar.c:651
+msgid "Clicking this icon displays a list of all users currently logged in."
+msgstr "Wer ist gerade angemeldet?"
+
+#: ../iconbar.c:667
+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"
+
+#: ../iconbar.c:684
+msgid "Advanced options"
+msgstr "Erweiterte Optionen"
+
+#: ../iconbar.c:685
+msgid "Access to the complete menu of Citadel functions."
+msgstr "Zugriff zu allen Citadel-Menü-Funktionen"
+
+#: ../iconbar.c:701
+msgid "Citadel logo"
+msgstr "Citadel Logo"
+
+#: ../iconbar.c:702
+msgid "Displays the 'Powered by Citadel' icon"
+msgstr "Den Citadel-Brand anzeigen"
+
+#: ../iconbar.c:711 ../netconf.c:146 ../roomops.c:1284 ../roomops.c:1611
+#: ../siteconfig.c:562 ../sysmsgs.c:57 ../useredit.c:381 ../vcard_edit.c:335
+msgid "Save changes"
+msgstr "Änderungen übernehmen"
+
+#: ../iconbar.c:766
+msgid ""
+"Your icon bar has been updated.  Please select any of its choices to "
+"continue."
+msgstr "Ihre Icon-Leiste wurde geändert. Klicken Sie ein Icon zum fortfahren."
+
+#: ../inetconf.c:38
+msgid "localhost"
+msgstr "Diese Maschine"
+
+#: ../inetconf.c:39
+msgid "directory"
+msgstr "Verzeichnis"
+
+#: ../inetconf.c:40
+msgid "gatewaydomain"
+msgstr "Tor zur Außenwelt"
+
+#: ../inetconf.c:41
+msgid "smarthost"
+msgstr "Smarthost"
+
+#: ../inetconf.c:42
+msgid "rbl"
+msgstr "Blacklisten"
+
+#: ../inetconf.c:43
+msgid "spamassassin"
+msgstr "SpammAssassin"
+
+#: ../inetconf.c:45
+msgid "Local host aliases"
+msgstr "Andere Namen für diese Maschine"
+
+#: ../inetconf.c:46
+msgid "Directory domains"
+msgstr "Verzeichnis Namen"
+
+#: ../inetconf.c:47
+msgid "Gateway domains"
+msgstr "Übergangs Domains"
+
+#: ../inetconf.c:48
+msgid "Smart hosts"
+msgstr "Smart Hosts"
+
+#: ../inetconf.c:49
+msgid "RBL hosts"
+msgstr "Blacklist-Maschinen"
+
+#: ../inetconf.c:50
+msgid "SpamAssassin hosts"
+msgstr "SpamAssassin Maschinen"
+
+#: ../inetconf.c:52
+msgid "(domains for which this host receives mail)"
+msgstr "(Domäne für die diese Maschine Mail bekommt)"
+
+#: ../inetconf.c:53
+msgid "(domains mapped with the Global Address Book)"
+msgstr "(Domäne, auf die das öffentliche Adressbuch zeigt)"
+
+#: ../inetconf.c:54
+msgid "(domains whose subdomains match Citadel hosts)"
+msgstr "(Domänen, deren Unterdomänen diese Citadel-Maschinen treffen)"
+
+#: ../inetconf.c:55
+msgid "(if present, forward all outbound mail to one of these hosts)"
+msgstr ""
+"(wenn gesetzt, alle zu versendende Mail über diese Maschine verschicken)"
+
+#: ../inetconf.c:56
+msgid "(hosts running a Realtime Blackhole List)"
+msgstr "(Maschinen, von denen Echtzeit-Blackliste zu beziehen sind)"
+
+#: ../inetconf.c:57
+msgid "(hosts running the SpamAssassin service)"
+msgstr "(Maschine, auf der Ihr SpamAssessin läuft)"
+
+#: ../inetconf.c:94
+msgid "Internet configuration"
+msgstr "Internet Konfiguration"
+
+#: ../inetconf.c:121
+msgid "Delete this entry?"
+msgstr "Eintrag Löschen?"
+
+#: ../inetconf.c:123 ../netconf.c:209
+msgid "(Delete)"
+msgstr "(Löschen)"
+
+#: ../inetconf.c:173
+#, c-format
+msgid "%s has been deleted."
+msgstr "%s wurde gelöscht."
+
+#: ../listsub.c:44
+msgid "List subscription"
+msgstr "Listen Teilnehmer"
+
+#: ../listsub.c:56
+msgid "List subscribe/unsubscribe"
+msgstr "Liste abonnieren/abmelden"
+
+#: ../listsub.c:76
+msgid "Confirmation request sent"
+msgstr "Anfrage bestätigt"
+
+#: ../listsub.c:78
+#, c-format
+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 zum bestätigen der Anmeldung zugeschickt. Dieser zusätzliche "
+"Schritt ist zu Ihrem eigenen Schutz, Damit niemand Sie auf eine Liste ohne "
+"Ihre Zustimmung anmelden kann.<br />\n"
+
+#: ../listsub.c:91
+msgid "Go back..."
+msgstr "Zurück..."
+
+#: ../mainmenu.c:23
+msgid "Basic commands"
+msgstr "Einfache Kommandos"
+
+#: ../mainmenu.c:32
+msgid "List known rooms"
+msgstr "Bekannte Räume aufzählen"
+
+#: ../mainmenu.c:34
+msgid "Where can I go from here?"
+msgstr "Wo komme ich von hier aus hin?"
+
+#: ../mainmenu.c:39 ../roomops.c:646
+msgid "Goto next room"
+msgstr "Zum nächsten Raum"
+
+#: ../mainmenu.c:42
+msgid "...with <EM>unread</EM> messages"
+msgstr "... mit <EM>ungelesenen</EM Meldungen"
+
+#: ../mainmenu.c:47
+msgid "Skip to next room"
+msgstr "Weiter zum nächsten Raum"
+
+#: ../mainmenu.c:50
+msgid "(come back here later)"
+msgstr "(später zurückkehren)"
+
+#: ../mainmenu.c:57 ../roomops.c:450
+msgid "Ungoto"
+msgstr "Zurück"
+
+#: ../mainmenu.c:60
+#, c-format
+msgid "(oops! Back to %s)"
+msgstr "(Hoppla! Zurück zu %s)"
+
+#: ../mainmenu.c:68 ../roomops.c:459
+msgid "Read new messages"
+msgstr "Neue Beiträge"
+
+#: ../mainmenu.c:71
+msgid "...in this room"
+msgstr "... in diesem Raum"
+
+#: ../mainmenu.c:76 ../roomops.c:559
+msgid "Read all messages"
+msgstr "Alle Beiträge"
+
+#: ../mainmenu.c:79
+msgid "...old <EM>and</EM> new"
+msgstr "... alte <EM>und</EM> neue"
+
+#: ../mainmenu.c:84 ../roomops.c:621
+msgid "Enter a message"
+msgstr "Beitrag verfassen"
+
+#: ../mainmenu.c:87
+msgid "(post in this room)"
+msgstr "(Beitrag in diesen Raum stellen)"
+
+#: ../mainmenu.c:94
+msgid "Summary page"
+msgstr "Übersichtsseite"
+
+#: ../mainmenu.c:97
+msgid "Summary of my account"
+msgstr "Meine Citadele"
+
+#: ../mainmenu.c:102
+msgid "User list"
+msgstr "Benutzerliste"
+
+#: ../mainmenu.c:105
+msgid "(all registered users)"
+msgstr "(alle Benutzer)"
+
+#: ../mainmenu.c:113
+msgid "Bye!"
+msgstr "Auf Wiedersehen!"
+
+#: ../mainmenu.c:122
+msgid "Your info"
+msgstr "Ihre Biographie"
+
+#: ../mainmenu.c:127
+msgid "Change your preferences and settings"
+msgstr "Ihre persönlichen Einstellungen Ändern"
+
+#: ../mainmenu.c:132
+msgid "Update your contact information"
+msgstr "Ihre Kontaktinformationen Ändern"
+
+#: ../mainmenu.c:142
+msgid "Enter your 'bio'"
+msgstr "Ihr Lebenslauf eingeben"
+
+#: ../mainmenu.c:147
+msgid "Edit your online photo"
+msgstr "Ihr Photo ändern"
+
+#: ../mainmenu.c:154
+msgid "Advanced room commands"
+msgstr "Erweiterte Raum Kommandos"
+
+#: ../mainmenu.c:160
+msgid "Edit or delete this room"
+msgstr "Diesen Raum bearbeiten oder Löschen"
+
+#: ../mainmenu.c:166
+msgid "Go to a 'hidden' room"
+msgstr "In einen 'versteckten' Raum gehen"
+
+#: ../mainmenu.c:171 ../roomops.c:1942
+msgid "Create a new room"
+msgstr "Einen neuen Raum erzeugen"
+
+#: ../mainmenu.c:176
+#, c-format
+msgid "Zap (forget) this room (%s)"
+msgstr "Diesen Raum vergessen (%s)"
+
+#: ../mainmenu.c:181
+msgid "List all forgotten rooms"
+msgstr "Alle vergessenen Räume auflisten"
+
+#: ../mainmenu.c:200
+msgid "System Administration Menu"
+msgstr "System Administrator Menü"
+
+#: ../mainmenu.c:209
+msgid "Global Configuration"
+msgstr "Globale Konfiguration"
+
+#: ../mainmenu.c:214
+msgid "Edit site-wide configuration"
+msgstr "Systemvorgaben bearbeiten"
+
+#: ../mainmenu.c:219
+msgid "Domain names and Internet mail configuration"
+msgstr "Domänenname und Internetmail Konfiguration"
+
+#: ../mainmenu.c:224
+msgid "Configure replication with other Citadel servers"
+msgstr "Die Replikation mit anderen Citadellen Konfigurieren"
+
+#: ../mainmenu.c:231
+msgid "User account management"
+msgstr "Benutzer verwalten"
+
+#: ../mainmenu.c:236
+msgid "Add, change, delete user accounts"
+msgstr "Benutzer Bearbeiten/Löschen/Anlegen "
+
+#: ../mainmenu.c:246
+msgid "Rooms and Floors"
+msgstr "Räume und Etagen"
+
+#: ../mainmenu.c:251
+msgid "Add, change, or delete floors"
+msgstr "Etagen Bearbeiten/Löschen/Hinzufügen"
+
+#: ../mainmenu.c:273
+msgid "Enter a server command"
+msgstr "Ein Server-Kommando eingeben"
+
+#: ../mainmenu.c:282
+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 nützen sein"
+
+#: ../mainmenu.c:289
+msgid "Enter command:"
+msgstr "Kommando Eingeben:"
+
+#: ../mainmenu.c:292
+msgid "Command input (if requesting SEND_LISTING transfer mode):"
+msgstr "Kommando Eingabe (wenn sie SEND_LISTING Transfer-Modus anfordern):"
+
+#: ../mainmenu.c:296
+#, c-format
+msgid "Detected host header is %s://%s"
+msgstr "Erkannte Maschinen Kopfzeile ist %s://%s"
+
+#: ../mainmenu.c:298
+msgid "Send command"
+msgstr "Kommando Senden"
+
+#: ../mainmenu.c:327
+msgid "Server command results"
+msgstr "Server Kommando Ergebnisse"
+
+#: ../messages.c:444
+msgid " (work)"
+msgstr " (Firma)"
+
+#: ../messages.c:446
+msgid " (home)"
+msgstr " (Privat)"
+
+#: ../messages.c:448
+msgid " (cell)"
+msgstr " (Handy)"
+
+#: ../messages.c:459 ../vcard_edit.c:252
+msgid "Address:"
+msgstr "Adresse:"
+
+#: ../messages.c:519
+msgid "Telephone:"
+msgstr "Telefon"
+
+#: ../messages.c:524
+msgid "E-mail:"
+msgstr "Email:"
+
+#: ../messages.c:632 ../messages.c:1229
+msgid "ERROR:"
+msgstr "FEHLER"
+
+#: ../messages.c:655 ../messages.c:932 ../messages.c:1238 ../messages.c:1341
+msgid "unexpected end of message"
+msgstr "unerwartetes Meldungsende"
+
+#: ../messages.c:668 ../messages.c:1250
+msgid "from "
+msgstr "von "
+
+#: ../messages.c:696 ../messages.c:1266
+msgid "in "
+msgstr "in "
+
+#: ../messages.c:717 ../messages.c:1287
+msgid "to "
+msgstr "an "
+
+#: ../messages.c:770
+msgid "View"
+msgstr "Anzeigen"
+
+#: ../messages.c:772
+msgid "Download"
+msgstr "Herunterladen"
+
+#: ../messages.c:819 ../messages.c:2851
+msgid "CC:"
+msgstr "CC:"
+
+#: ../messages.c:827 ../messages.c:1323
+msgid "Subject:"
+msgstr "Betreff:"
+
+#: ../messages.c:851 ../rss.c:28
+msgid "Reply"
+msgstr "Antworten"
+
+#: ../messages.c:866
+msgid "ReplyQuoted"
+msgstr "Antworten&amp;Zitieren"
+
+#: ../messages.c:883
+msgid "ReplyAll"
+msgstr "AntwortenAnAlle"
+
+#: ../messages.c:891
+msgid "Forward"
+msgstr "Weiterleiten"
+
+#: ../messages.c:898 ../messages.c:3101
+msgid "Move"
+msgstr "Verschieben"
+
+#: ../messages.c:903
+msgid "Delete this message?"
+msgstr "Diese Nachricht Löschen?"
+
+#: ../messages.c:909
+msgid "Headers"
+msgstr "Kopfzeilen"
+
+#: ../messages.c:914
+msgid "Print"
+msgstr "Drucken"
+
+#: ../messages.c:1025
+#, c-format
+msgid "I don't know how to display %s"
+msgstr "Kann %s nicht darstellen"
+
+#: ../messages.c:1060 ../messages.c:1587
+msgid "edit"
+msgstr "bearbeiten"
+
+#: ../messages.c:1550 ../messages.c:1859
+msgid "(no subject)"
+msgstr "(kein Betreff)"
+
+#: ../messages.c:1678
+msgid "(no name)"
+msgstr "(kein Name)"
+
+#: ../messages.c:1730
+msgid "This address book is empty."
+msgstr "Dieses Adressbuch ist leer."
+
+#: ../messages.c:2156
+msgid "No new messages."
+msgstr "Keine neue Nachricht."
+
+#: ../messages.c:2158
+msgid "No old messages."
+msgstr "Keine alte Nachricht"
+
+#: ../messages.c:2160
+msgid "No messages here."
+msgstr "Keine Beiträge hier"
+
+#: ../messages.c:2278
+msgid "Sender"
+msgstr "Absender"
+
+#: ../messages.c:2280
+msgid "Date"
+msgstr "Datum"
+
+#: ../messages.c:2295
+msgid "Click on any note to edit it."
+msgstr "Auf eine Notiz klicken zum editieren"
+
+#: ../messages.c:2398
+msgid "Reading #"
+msgstr "Lese #"
+
+#: ../messages.c:2451
+#, c-format
+msgid "of %d messages."
+msgstr "von %d Nachrichten"
+
+#: ../messages.c:2635
+#, c-format
+msgid "Cancelled.  Message was not posted."
+msgstr "Abgebrochen. Beitrag wurde nicht eingereicht."
+
+#: ../messages.c:2641
+#, c-format
+msgid "Automatically cancelled because you have already saved this message."
+msgstr ""
+"Automatisch abgebrochen, weil Sie diesen Beitrag schon gespeichert haben."
+
+#: ../messages.c:2660
+#, c-format
+msgid "Message has been sent.\n"
+msgstr "Nachricht wurde gesendet.\n"
+
+#: ../messages.c:2663
+#, c-format
+msgid "Message has been posted.\n"
+msgstr "Beitrag wurde gesendet.\n"
+
+#: ../messages.c:2797
+msgid " <I>from</I> "
+msgstr " <I>von</I> "
+
+#: ../messages.c:2807
+msgid " <I>in</I> "
+msgstr " <I>in</i> "
+
+#: ../messages.c:2840
+msgid "To:"
+msgstr "An:"
+
+#: ../messages.c:2862
+msgid "BCC:"
+msgstr "BCC:"
+
+#: ../messages.c:2880
+msgid "Subject (optional):"
+msgstr "Betreff (optional):"
+
+#: ../messages.c:2889 ../messages.c:3010 ../paging.c:57
+msgid "Send message"
+msgstr "Meldung senden"
+
+#: ../messages.c:2891 ../messages.c:3012
+msgid "Post message"
+msgstr "Beitrag einreichen"
+
+#: ../messages.c:2907
+msgid "--- forwarded message ---"
+msgstr "--- Weitergeleitete Nachricht ---"
+
+#: ../messages.c:2987
+msgid "Attachments:"
+msgstr "Anhänge:"
+
+#: ../messages.c:3002
+msgid "Attach file:"
+msgstr "Datei anhängen:"
+
+#: ../messages.c:3005 ../roomops.c:1477 ../roomops.c:1507
+msgid "Add"
+msgstr "Hinzufügen"
+
+#: ../messages.c:3074
+msgid "Confirm move of message"
+msgstr "Verschieben bestätigen"
+
+#: ../messages.c:3081
+msgid "Move this message to:"
+msgstr "Meldung verschieben nach:"
+
+#: ../messages.c:3127
+#, c-format
+msgid "The message was not moved."
+msgstr "Die Meldung wurde nicht verschoben."
+
+#: ../netconf.c:68 ../netconf.c:183
+msgid "Add a new node"
+msgstr "Neuen Knoten hinzufügen"
+
+#: ../netconf.c:75 ../netconf.c:129 ../siteconfig.c:112
+#, c-format
+msgid "Node name"
+msgstr "Name des Knotens"
+
+#: ../netconf.c:77 ../netconf.c:133
+msgid "Shared secret"
+msgstr "Gemeinsames Passwort"
+
+#: ../netconf.c:79 ../netconf.c:137
+msgid "Host or IP address"
+msgstr "Maschinenname oder IP-Adresse"
+
+#: ../netconf.c:81 ../netconf.c:141
+msgid "Port number"
+msgstr "Portnummer"
+
+#: ../netconf.c:84
+msgid "Add node"
+msgstr "Knoten Hinzufügen"
+
+#: ../netconf.c:110
+msgid "Edit node configuration for "
+msgstr "Knoten Konfiguration bearbeiten"
+
+#: ../netconf.c:176
+msgid "Network configuration"
+msgstr "Netzwerk Konfiguration"
+
+#: ../netconf.c:189
+msgid "Currently configured nodes"
+msgstr "Schon konfigurierte Knoten"
+
+#: ../netconf.c:204
+msgid "(Edit)"
+msgstr "(Bearbeiten)"
+
+#: ../netconf.c:229
+msgid "Confirm delete"
+msgstr "Löschen bestätigen"
+
+#: ../netconf.c:236
+msgid "Are you sure you want to delete "
+msgstr "wirklich Löschen?"
+
+#: ../netconf.c:243
+msgid "Yes"
+msgstr "Ja"
+
+#: ../netconf.c:246
+msgid "No"
+msgstr "Nein"
+
+#: ../netconf.c:309
+msgid "Back to menu"
+msgstr "Zurück zum Menü"
+
+#: ../notes.c:126
+msgid "An error has occurred."
+msgstr "Ein Fehler ist aufgetreten."
+
+#: ../paging.c:24
+msgid "Send instant message"
+msgstr "Kurznachricht senden"
+
+#: ../paging.c:33
+msgid "Send an instant message to: "
+msgstr "Kurznachricht senden an: "
+
+#: ../paging.c:49
+msgid "Enter message text:"
+msgstr "Nachrichtentext eingeben:"
+
+#: ../paging.c:89
+msgid "Message was not sent."
+msgstr "Kurznachricht nicht gesendet."
+
+#: ../paging.c:99
+msgid "Message has been sent to "
+msgstr "Kurznachricht gesendet an "
+
+#: ../paging.c:110
+msgid "[ close window ]"
+msgstr "[ Fenster Schließen ]"
+
+#: ../paging.c:170
+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 gibt eine neue.Kurznachricht für dich, aber das Chatfenster konnte sich "
+"nicht oöfnen. Vermutlich hat dein Browser einen Popup Blocker aktiviert. "
+"Wenn du Kurznachrichten erhalten willst, musst du Popups von diese Seite "
+"erlauben."
+
+#: ../paging.c:309 ../paging.c:471
+msgid "An error occurred while setting up the chat socket."
+msgstr "Ein Fehler trat auf beim verbinden des Chat-Sockets."
+
+#: ../paging.c:336
+msgid "Now exiting chat mode."
+msgstr "Beende den Chat-Modus."
+
+#: ../paging.c:507
+msgid "Send"
+msgstr "Absenden"
+
+#: ../paging.c:508
+msgid "Help"
+msgstr "Hilfe"
+
+#: ../paging.c:509
+msgid "List users"
+msgstr "Benutzer auflisten"
+
+#: ../preferences.c:205
+msgid "Preferences and settings"
+msgstr "Einstellungen"
+
+#: ../preferences.c:226
+msgid "Room list view"
+msgstr "Raumlisten Anzeige"
+
+#: ../preferences.c:232
+msgid "Tree (folders) view"
+msgstr "Baum (Verzeichnis) Anzeige"
+
+#: ../preferences.c:238
+msgid "Table (rooms) view"
+msgstr "Tabelle (Raum) anzeige"
+
+#: ../preferences.c:249
+msgid "Calendar hour format"
+msgstr "Kalender Uhrzeitsformat"
+
+#: ../preferences.c:255
+msgid "12 hour (am/pm)"
+msgstr "12 Stunden (AM/PM)"
+
+#: ../preferences.c:261
+msgid "24 hour"
+msgstr "24 Stunden"
+
+#: ../preferences.c:272
+msgid "Calendar day view begins at:"
+msgstr "Kalender Tagesübersicht beginnt bei:"
+
+#: ../preferences.c:301
+msgid "Calendar day view ends at:"
+msgstr "Kalender Tagesübersicht endet bei:"
+
+#: ../preferences.c:330
+msgid "Attach signature to email messages?"
+msgstr "Emails Signieren?"
+
+#: ../preferences.c:348
+msgid "No signature"
+msgstr "Keine Signatur"
+
+#: ../preferences.c:354
+msgid "Use this signature:"
+msgstr "Diese Signatur benutzen"
+
+#: ../preferences.c:378
+msgid "Default character set for email headers:"
+msgstr ""
+
+#: ../preferences.c:388
+msgid "Change"
+msgstr "Ändern"
+
+#: ../preferences.c:407
+msgid "Cancelled.  No settings were changed."
+msgstr "Abgebrochen. Keine Änderung wurde gespeichert."
+
+#: ../roomops.c:19
+msgid "Bulletin Board"
+msgstr "Forum"
+
+#: ../roomops.c:20
+msgid "Mail Folder"
+msgstr "Mail Übersicht"
+
+#: ../roomops.c:21
+msgid "Address Book"
+msgstr "Adresse:"
+
+#: ../roomops.c:23
+msgid "Task List"
+msgstr "Aufgaben Liste"
+
+#: ../roomops.c:24
+msgid "Notes List"
+msgstr "Notizen"
+
+#: ../roomops.c:25
+msgid "Wiki"
+msgstr "Wiki"
+
+#: ../roomops.c:26
+msgid "Calendar List"
+msgstr "Kalender Liste"
+
+#: ../roomops.c:258
+msgid "Zapped (forgotten) rooms"
+msgstr "Raum Vergessen"
+
+#: ../roomops.c:264
+msgid "Click on any room to un-zap it and goto that room.\n"
+msgstr "Auf einen beliebigen vergessenen Raum klicken um ihn zu betreten\n"
+
+#: ../roomops.c:358
+msgid "View as:"
+msgstr "Anzeigen als:"
+
+#: ../roomops.c:429
+#, c-format
+msgid "%d new of %d messages"
+msgstr "%d neu von %d Nachrichten"
+
+#: ../roomops.c:473
+msgid "View contacts"
+msgstr "Kontakte Anzeigen"
+
+#: ../roomops.c:484
+msgid "Day view"
+msgstr "Tages Übersicht"
+
+#: ../roomops.c:493
+msgid "Month view"
+msgstr "Monats Übersicht"
+
+#: ../roomops.c:504
+#, fuzzy
+msgid "Calendar list"
+msgstr "Kalender Liste"
+
+#: ../roomops.c:515
+msgid "View tasks"
+msgstr "Aufgaben anzeigen"
+
+#: ../roomops.c:526
+msgid "View notes"
+msgstr "Nachrichten anzeigen"
+
+#: ../roomops.c:537
+msgid "View message list"
+msgstr "Aktualisieren"
+
+#: ../roomops.c:548
+msgid "Wiki home"
+msgstr "Wiki Startseite"
+
+#: ../roomops.c:573
+msgid "Add new contact"
+msgstr "Neuen Kontakt hinzufügen"
+
+#: ../roomops.c:583
+msgid "Add new event"
+msgstr "Neuen Termin hinzufügen"
+
+#: ../roomops.c:592
+msgid "Add new task"
+msgstr "Neue Aufgabe"
+
+#: ../roomops.c:601
+msgid "Add new note"
+msgstr "Neue Notiz"
+
+#: ../roomops.c:612
+msgid "Edit this page"
+msgstr "Diese Seite bearbeiten"
+
+#: ../roomops.c:634
+msgid ""
+"Leave all messages marked as unread, go to next room with unread messages"
+msgstr ""
+"Alle Beiträge ungelesen lassen, und in den nächsten Raum mit ungelesenen "
+"Nachrichten gehen"
+
+#: ../roomops.c:635
+msgid "Skip this room"
+msgstr "Raum Überspringen"
+
+#: ../roomops.c:645
+msgid "Mark all messages as read, go to next room with unread messages"
+msgstr ""
+"Alle Nachrichten als ungelesen markieren, und in den nächsten Raum mit "
+"ungelesenen Nachrichten gehen"
+
+#: ../roomops.c:1018
+msgid "Configuration"
+msgstr "Konfiguration"
+
+#: ../roomops.c:1034
+msgid "Message expire policy"
+msgstr "Nachrichten Gültigkeitsvorgabe"
+
+#: ../roomops.c:1050
+msgid "Access controls"
+msgstr "Zugangs-Kontrolle"
+
+#: ../roomops.c:1066
+msgid "Sharing"
+msgstr "Teilen"
+
+#: ../roomops.c:1082
+msgid "Mailing list service"
+msgstr "Mailinglisten Service"
+
+#: ../roomops.c:1104
+msgid "Are you sure you want to delete this room?"
+msgstr "Sind Sie sicher, das Sie diesen Raum löschen wollen?"
+
+#: ../roomops.c:1106
+msgid "Delete this room"
+msgstr "Raum Löschen"
+
+#: ../roomops.c:1109
+msgid "Set or change the icon for this room's banner"
+msgstr "Das Bannersymbol des Raums ändern"
+
+#: ../roomops.c:1112
+msgid "Edit this room's Info file"
+msgstr "Die Infodatei dieses Raums ändern"
+
+#: ../roomops.c:1121 ../roomops.c:1954
+msgid "Name of room: "
+msgstr "Name des Raums: "
+
+#: ../roomops.c:1128 ../roomops.c:1958
+msgid "Resides on floor: "
+msgstr "Ist in der Etage: "
+
+#: ../roomops.c:1142 ../roomops.c:2000
+msgid "Type of room:"
+msgstr "Raum-Typ:"
+
+#: ../roomops.c:1149
+msgid "Public room"
+msgstr "Öffentlicher Raum"
+
+#: ../roomops.c:1157
+msgid "Private - guess name"
+msgstr "Privat - Namen raten"
+
+#: ../roomops.c:1164
+msgid "Private - require password:"
+msgstr "Privat - Passwort nötig"
+
+#: ../roomops.c:1174 ../roomops.c:2031
+msgid "Private - invitation only"
+msgstr "Privat - nur mit Einladung"
+
+#: ../roomops.c:1178
+msgid "If private, cause current users to forget room"
+msgstr "Wenn Privat, sollen aktuelle Benutzer den Raum Vergessen?"
+
+#: ../roomops.c:1186
+msgid "Preferred users only"
+msgstr "nur Privilegierte Benutzer"
+
+#: ../roomops.c:1192
+msgid "Read-only room"
+msgstr "Nicht Schreibbarer Raum"
+
+#: ../roomops.c:1199
+msgid "File directory room"
+msgstr "Dateiverzeichnis Raum"
+
+#: ../roomops.c:1202
+msgid "Directory name: "
+msgstr "Verzeichnisname:  "
+
+#: ../roomops.c:1210
+msgid "Uploading allowed"
+msgstr "Hochladen erlaubt"
+
+#: ../roomops.c:1216
+msgid "Downloading allowed"
+msgstr "Herunterladen erlaubt"
+
+#: ../roomops.c:1222
+msgid "Visible directory"
+msgstr "Sichtbares Verzeichnis"
+
+#: ../roomops.c:1231
+msgid "Network shared room"
+msgstr "Netzwerk öffentlicher Raum"
+
+#: ../roomops.c:1237
+msgid "Permanent (does not auto-purge)"
+msgstr "Permanent (kein automatisches Löschen"
+
+#: ../roomops.c:1242
+msgid "Anonymous messages"
+msgstr "Anonyme Nachrichten"
+
+#: ../roomops.c:1250
+msgid "No anonymous messages"
+msgstr "Keine anonyme Nachrichten"
+
+#: ../roomops.c:1256
+msgid "All messages are anonymous"
+msgstr "Alle Nachrichten sind Anonym"
+
+#: ../roomops.c:1262
+msgid "Prompt user when entering messages"
+msgstr "Benutzer fragen, wenn er die Nachricht eingibt"
+
+#: ../roomops.c:1268
+msgid "Room aide: "
+msgstr "Raumverantwortlicher: "
+
+#: ../roomops.c:1340
+msgid "Shared with"
+msgstr "Geteilt mit"
+
+#: ../roomops.c:1343
+msgid "Not shared with"
+msgstr "Nicht geteilt mit"
+
+#: ../roomops.c:1348 ../roomops.c:1393
+msgid "Remote node name"
+msgstr "Entfernter Knotenname"
+
+#: ../roomops.c:1350 ../roomops.c:1395
+msgid "Remote room name"
+msgstr "Entfernter Raumname"
+
+#: ../roomops.c:1352 ../roomops.c:1397
+msgid "Actions"
+msgstr "Aktionen"
+
+#: ../roomops.c:1385
+msgid "Unshare"
+msgstr "Freigabe Wiederrufen"
+
+#: ../roomops.c:1422
+msgid "Share"
+msgstr "Freigabe"
+
+#: ../roomops.c:1430
+msgid "Notes:"
+msgstr "Notizen:"
+
+#: ../roomops.c:1431
+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. "
+"<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.</UL></I><br />\n"
+msgstr ""
+"Wenn man einen Raum zwischen zwei Knoten synchronisiert, muss er an beiden "
+"Knoten freigegeben werden. Einen Knoten an eine Freigabe anbinden sendet "
+"lediglich die Nachrichten zum anderen Knoten, und nicht umgekehrt, sprich "
+"Nachrichten vom anderen Knoten werden nicht übermittelt. <LI>Wenn der andere "
+"Knoten einen anderen Namen für den Raum verwendet, muss er den hiesigen "
+"Raumnamen hier auch konfigurieren..</UL></I><br />\n"
+
+#: ../roomops.c:1452
+msgid ""
+"<i>The contents of this room are being mailed <b>as individual messages</b> "
+"to the following list recipients:</i><br /><br />\n"
+msgstr ""
+"<i>Der Inhalt dieses Raums wird per Email als <b>einzelne Nachricht</b> an "
+"die Folgenden Empfänger versendet:</i><br /><br />\n"
+
+#: ../roomops.c:1469 ../roomops.c:1499
+msgid "(remove)"
+msgstr "(Löschen)"
+
+#: ../roomops.c:1482
+msgid ""
+"<i>The contents of this room are being mailed <b>in digest form</b> to the "
+"following list recipients:</i><br /><br />\n"
+msgstr ""
+"<i> Der Inhalt dieses Raums wird als <b>Tageszusammenfassung</b> an die "
+"folgende Liste versendet:</i><br /><br />\n"
+
+#: ../roomops.c:1513
+msgid ""
+"This room is configured to allow self-service subscribe/unsubscribe requests."
+msgstr "Dieser Raum erlaubt Benutzergesteuertes Abonnieren."
+
+#: ../roomops.c:1516
+msgid "Click to disable."
+msgstr "Klicken zum Abschalten"
+
+#: ../roomops.c:1518
+msgid "The URL for subscribe/unsubscribe is: "
+msgstr "Die URL zum Ab/Bestellen ist: "
+
+#: ../roomops.c:1524
+msgid ""
+"This room is <i>not</i> configured to allow self-service subscribe/"
+"unsubscribe requests."
+msgstr ""
+"Dieser Raum ist <i>nicht</> für Benutzergesteuertes Abonieren freigegeben"
+
+#: ../roomops.c:1528
+msgid "Click to enable."
+msgstr "Klicken zum Anschalten"
+
+#: ../roomops.c:1557
+msgid "Message expire policy for this room"
+msgstr "Nachrichten Verfallsvorgabe für diesen Raum"
+
+#: ../roomops.c:1563
+msgid "Use the default policy for this floor"
+msgstr "Die Vorgaberichtlinie dieser Etage verwenden "
+
+#: ../roomops.c:1567 ../roomops.c:1594 ../siteconfig.c:501 ../siteconfig.c:526
+#, c-format
+msgid "Never automatically expire messages"
+msgstr "Nachrichten nie automatisch löschen"
+
+#: ../roomops.c:1571 ../roomops.c:1598 ../siteconfig.c:505 ../siteconfig.c:530
+#, c-format
+msgid "Expire by message count"
+msgstr "Nachrichten nach Anzahl löschen"
+
+#: ../roomops.c:1575 ../roomops.c:1602 ../siteconfig.c:509 ../siteconfig.c:534
+#, c-format
+msgid "Expire by message age"
+msgstr "Lösche Nachrichten älter als"
+
+#: ../roomops.c:1577 ../roomops.c:1604 ../siteconfig.c:511 ../siteconfig.c:536
+#, c-format
+msgid "Number of messages or days: "
+msgstr "Anzahl der Nachrichten pro Tag: "
+
+#: ../roomops.c:1584
+msgid "Message expire policy for this floor"
+msgstr "Nachrichten Verfallsvorgabe für diese Etage"
+
+#: ../roomops.c:1590
+msgid "Use the system default"
+msgstr "Die Systemvorgabe benutzen"
+
+#: ../roomops.c:1665 ../roomops.c:3037
+msgid "Cancelled.  Changes were not saved."
+msgstr "Abgebrochen. Änderungen wurden nicht übernommen."
+
+#: ../roomops.c:1804
+msgid "Your changes have been saved."
+msgstr "Ihre Änderungen wurden gespeichert"
+
+#: ../roomops.c:1836
+#, c-format
+msgid "<B><I>User %s kicked out of room %s.</I></B>\n"
+msgstr "<B><I>Benutzer %s des Raums %s verbannt</I></B>\n"
+
+#: ../roomops.c:1850
+#, c-format
+msgid "<B><I>User %s invited to room %s.</I></B>\n"
+msgstr "<B><I>Benutzer %s in den Raum %s eingeladen.</I></B>\n"
+
+#: ../roomops.c:1878
+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 ""
+"Die folgenden Benutzer haben Zugang zu diesem Raum.  Um einen Benutzer von "
+"der Zugriffsliste zu löschen, ihn in der Liste anwählen und 'Bannen' drücken"
+
+#: ../roomops.c:1898
+msgid "Kick"
+msgstr "Bannen"
+
+#: ../roomops.c:1902
+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"
+
+#: ../roomops.c:1908
+msgid "Invite:"
+msgstr "Einladen:"
+
+#: ../roomops.c:1913
+msgid "Invite"
+msgstr "Einladen"
+
+#: ../roomops.c:1977
+msgid "Default view for room: "
+msgstr "Vorgabe Ansicht für diesen Raum: "
+
+#: ../roomops.c:2009
+msgid "Public (automatically appears to everyone)"
+msgstr "Öffentlich (Raum zugänglich für jeden)"
+
+#: ../roomops.c:2016
+msgid "Private - hidden (accessible to anyone who knows its name)"
+msgstr "Privat - versteckt (zugänglich für jeden der den Namen weiß)"
+
+#: ../roomops.c:2023
+msgid "Private - require password: "
+msgstr "Privat - erfordert Passwort: "
+
+#: ../roomops.c:2039
+msgid "Personal (mailbox for you only)"
+msgstr "Persönlich (Briefkasten, nur für Sie)"
+
+#: ../roomops.c:2044
+msgid "Create new room"
+msgstr "Neuer Raum"
+
+#: ../roomops.c:2112
+msgid "Cancelled.  No new room was created."
+msgstr "Abgebrochen. Keinen neuen Raum erzeugt."
+
+#: ../roomops.c:2155
+msgid "Go to a hidden room"
+msgstr "Zu einem versteckten Raum gehen"
+
+#: ../roomops.c:2166
+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 mit den regulären Räumen gelistet."
+
+#: ../roomops.c:2178
+msgid "Enter room name:"
+msgstr "Raumname eingeben:"
+
+#: ../roomops.c:2185
+msgid "Enter room password:"
+msgstr "Raumpasswort eingeben:"
+
+#: ../roomops.c:2194
+msgid "Go there"
+msgstr "Betreten"
+
+#: ../roomops.c:2247
+msgid "Zap (forget/unsubscribe) the current room"
+msgstr "den aktuellen Raum vergessen (vergessen/abmelden)"
+
+#: ../roomops.c:2252
+#, c-format
+msgid ""
+"If you select this option, <em>%s</em> will disappear from your room list.  "
+"Is this what you wish to do?<br />\n"
+msgstr ""
+"Wenn Sie diese Option wählen, wird <em>%s</em>aus der Raumliste "
+"verschwinden.   Wollen Sie das wirklich tun?<br />\n"
+
+#: ../roomops.c:2257
+msgid "Zap this room"
+msgstr "Raum vergessen"
+
+#: ../roomops.c:2987 ../roomops.c:2993
+msgid "Room list"
+msgstr "Raumlisten Anzeige"
+
+#: ../roomops.c:2990
+msgid "Folder list"
+msgstr "Ordner Liste"
+
+#: ../rss.c:34
+msgid "Email"
+msgstr "Email"
+
+#: ../rss.c:73
+msgid "Not logged in"
+msgstr "Nicht angemeldet"
+
+#: ../rss.c:92
+msgid "Error retrieving RSS feed: couldn't find messages\n"
+msgstr "Fehler beim laden des RSS-feeds: konnte die Meldung nicht finden\n"
+
+#: ../siteconfig.c:38
+msgid "Site configuration"
+msgstr "Standortskonfiguration"
+
+#: ../siteconfig.c:61
+msgid "General"
+msgstr "Allgemein"
+
+#: ../siteconfig.c:62
+msgid "Access"
+msgstr "Zugang"
+
+#: ../siteconfig.c:63
+msgid "Network"
+msgstr "Netzwerk"
+
+#: ../siteconfig.c:64
+msgid "Tuning"
+msgstr "Feinabstimmung"
+
+#: ../siteconfig.c:65
+msgid "Directory"
+msgstr "Verzeichnisdienste"
+
+#: ../siteconfig.c:66
+msgid "Auto-purger"
+msgstr "Automatischer Nachrichtenlöscher"
+
+#: ../siteconfig.c:67
+msgid "Indexing/Journaling"
+msgstr "Indizierung/Protokollierung"
+
+#: ../siteconfig.c:71
+msgid "General site configuration items"
+msgstr "Allgemeine Standortskonfiguration"
+
+#: ../siteconfig.c:75
+msgid "Access controls and site policy settings"
+msgstr "Zugangskontrolle und Vorgabewerte"
+
+#: ../siteconfig.c:79
+msgid "Network services"
+msgstr "Netzwerk Dienste"
+
+#: ../siteconfig.c:80 ../siteconfig.c:90
+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"
+
+#: ../siteconfig.c:85
+msgid "Advanced server fine-tuning controls"
+msgstr "Erweiterte Server Einstellungen"
+
+#: ../siteconfig.c:89
+msgid "Configure the LDAP connector for Citadel"
+msgstr "LDAP Verzeichnis Anbindung des Servers konfigurieren"
+
+#: ../siteconfig.c:95
+msgid "Configure automatic expiry of old messages"
+msgstr "Automatischer Verfall alter Nachrichten konfigurieren"
+
+#: ../siteconfig.c:96
+msgid "These settings may be overridden on a per-floor or per-room basis."
+msgstr "Diese Einstellungen können auf Etagen- / Raum-Basis aufgehoben werden."
+
+#: ../siteconfig.c:100
+msgid "Indexing and Journaling"
+msgstr "Indizierung und Protokollierung"
+
+#: ../siteconfig.c:101
+msgid "Warning: these facilities are resource intensive."
+msgstr "Warnung: Diese Dienste sind Ressourcen intensiv"
+
+#: ../siteconfig.c:119
+#, c-format
+msgid "Fully qualified domain name"
+msgstr "FQDN"
+
+#: ../siteconfig.c:126
+#, c-format
+msgid "Human-readable node name"
+msgstr "Menschenlesbarer Knotenname"
+
+#: ../siteconfig.c:133
+#, c-format
+msgid "Telephone number"
+msgstr "Telefonnummer"
+
+#: ../siteconfig.c:140
+#, c-format
+msgid "Automatically grant room-aide status to users who create private rooms"
+msgstr ""
+"Automatisch dem Raumerzeuger administrative Rechte an dem neuen Raum geben"
+
+#: ../siteconfig.c:148
+#, c-format
+msgid "Server connection idle timeout (in seconds)"
+msgstr "ungenutzte Verbindungen trennen nach: (in Sekunden)"
+
+#: ../siteconfig.c:155
+#, c-format
+msgid "Initial access level for new users"
+msgstr "Netzzugangsberechtigung für neue Nutzer"
+
+#: ../siteconfig.c:169
+#, c-format
+msgid "Require registration for new users"
+msgstr "Anmeldung für neue Benutzer Erforderlich"
+
+#: ../siteconfig.c:177
+#, c-format
+msgid "Quarantine messages from problem users"
+msgstr "Meldungen Problematischer Nutzer moderieren"
+
+#: ../siteconfig.c:185
+#, c-format
+msgid "Name of quarantine room"
+msgstr "Name des moderierungs Raums"
+
+#: ../siteconfig.c:192
+#, c-format
+msgid "Paginator prompt (for text mode clients)"
+msgstr "Eingabeaufforderung (nur Für Textclients)"
+
+#: ../siteconfig.c:199
+#, c-format
+msgid "Restrict access to Internet mail"
+msgstr "Zugang zu Internet Mail limitieren"
+
+#: ../siteconfig.c:207
+#, c-format
+msgid "Geographic location of this system"
+msgstr "Geographische Position dieses Systems"
+
+#: ../siteconfig.c:214
+#, c-format
+msgid "Name of system administrator"
+msgstr "Name des Verwalters"
+
+#: ../siteconfig.c:221
+#, c-format
+msgid "Maximum concurrent sessions (0 = no limit)"
+msgstr "Maximale Anzahl gleichzeitiger Verbindungen (0 = kein Limit)"
+
+#: ../siteconfig.c:228
+#, c-format
+msgid "Default user purge time (days)"
+msgstr "Automatisch inaktive Nutzer löschen nach (Tage)"
+
+#: ../siteconfig.c:235
+#, c-format
+msgid "Default room purge time (days)"
+msgstr "Automatische Raum Löschung nach (Tage)"
+
+#: ../siteconfig.c:242
+#, c-format
+msgid "Name of room to log pages"
+msgstr "Name des Raums zum Loggen von Kurznachrichten"
+
+#: ../siteconfig.c:249
+#, c-format
+msgid "Access level required to create rooms"
+msgstr "Zugangsberechtigung um Räume zu erzeugen"
+
+#: ../siteconfig.c:263
+#, c-format
+msgid "Maximum message length"
+msgstr "Maximale Nachrichten Länge"
+
+#: ../siteconfig.c:270
+#, c-format
+msgid "Minimum number of worker threads"
+msgstr "Minimale Anzahl Server-Threads"
+
+#: ../siteconfig.c:277
+#, c-format
+msgid "Maximum number of worker threads"
+msgstr "Maximale Anzahl Server-Threads"
+
+#: ../siteconfig.c:284
+#, c-format
+msgid "POP3 listener port (-1 to disable)"
+msgstr "POP3 Server Port (-1 zum abschalten)"
+
+#: ../siteconfig.c:291
+#, c-format
+msgid "SMTP MTA port (-1 to disable)"
+msgstr "SMTP MTA Server Port (-1 zum abschalten)"
+
+#: ../siteconfig.c:298
+#, c-format
+msgid "Correct forged From: lines during authenticated SMTP"
+msgstr "'From:' Kopfzeilen bei authentifizierten SMTP korrigieren"
+
+#: ../siteconfig.c:306
+#, c-format
+msgid "Allow aides to zap (forget) rooms"
+msgstr "Moderatoren erlauben Räume zu Vergessen"
+
+#: ../siteconfig.c:314
+#, c-format
+msgid "IMAP listener port (-1 to disable)"
+msgstr "IMAP4 Server Port (-1 zum abschalten)"
+
+#: ../siteconfig.c:321
+#, c-format
+msgid "Network run frequency (in seconds)"
+msgstr "Knoten Synchronisierunsfrequenz (in Sekunden)"
+
+#: ../siteconfig.c:328
+#, c-format
+msgid "Disable self-service user account creation"
+msgstr "Erzeugen von Accounts am Anmeldeprompt verbieten"
+
+#: ../siteconfig.c:336
+#, c-format
+msgid "Hour to run database auto-purge"
+msgstr "Zeit, an der die Raumsäuberungen laufen sollen"
+
+#: ../siteconfig.c:352
+#, c-format
+msgid "Host name of LDAP server (blank to disable)"
+msgstr "Hostname des LDAP Verzeichnisserver (leer zum Abschalten)"
+
+#: ../siteconfig.c:359
+#, c-format
+msgid "Port number of LDAP server (blank to disable)"
+msgstr "Port des LDAP Verzeichnisservers (leer zum Abschalten)"
+
+#: ../siteconfig.c:366
+#, c-format
+msgid "Base DN"
+msgstr "Base DN im Verzeichnisserver"
+
+#: ../siteconfig.c:373
+#, c-format
+msgid "Bind DN"
+msgstr "Bind DN im Verzeichnisserver"
+
+#: ../siteconfig.c:380
+#, c-format
+msgid "Password for bind DN"
+msgstr "Passwort für die Bind DN am Verzeichnisserver"
+
+#: ../siteconfig.c:388
+#, c-format
+msgid "Server IP address (0.0.0.0 for 'any')"
+msgstr "Server IP-Adresse (0.0.0.0 um alle zu binden)"
+
+#: ../siteconfig.c:395
+#, c-format
+msgid "SMTP MSA port (-1 to disable)"
+msgstr "SMTP MSA Serverport (-1 zum abschalten)"
+
+#: ../siteconfig.c:402
+#, c-format
+msgid "IMAP over SSL port (-1 to disable)"
+msgstr "IMAP-SSL Serverport (-1 zum abschalten)"
+
+#: ../siteconfig.c:409
+#, c-format
+msgid "POP3 over SSL port (-1 to disable)"
+msgstr "POP3s Serverport (-1 zum Abschalten)"
+
+#: ../siteconfig.c:416
+#, c-format
+msgid "SMTP over SSL port (-1 to disable)"
+msgstr "SMTPS Serverport (-1 zum Abschalten)"
+
+#: ../siteconfig.c:423
+#, c-format
+msgid "Enable full text index"
+msgstr "Volltext Indexdienst anschalten"
+
+#: ../siteconfig.c:431
+#, c-format
+msgid "Automatically delete committed database logs"
+msgstr "Automatisch die Datenbanktransferlogs löschen"
+
+#: ../siteconfig.c:439
+#, c-format
+msgid "Instantly expunge deleted messages in IMAP"
+msgstr "Löschen via IMAP nicht cachen?"
+
+#: ../siteconfig.c:447
+#, c-format
+msgid "Allow unauthenticated SMTP clients to spoof this site's domains"
+msgstr "Mail Relaying anschalten (nicht empfohlen bei öffentlichen Servern)"
+
+#: ../siteconfig.c:455
+#, c-format
+msgid "Perform journaling of email messages"
+msgstr "Email Nachrichten Protokollieren"
+
+#: ../siteconfig.c:463
+#, c-format
+msgid "Perform journaling of non-email messages"
+msgstr "Nicht-Mail Nachrichten Protokollieren"
+
+#: ../siteconfig.c:471
+#, c-format
+msgid "Email destination of journalized messages"
+msgstr "Email Adresse für die Protokollnachrichten"
+
+#: ../siteconfig.c:497
+#, c-format
+msgid "Default message expire policy for public rooms"
+msgstr ""
+"Vorgabewerte für die Gültigkeitsdauer von Nachrichten in öffentlichen Räumen"
+
+#: ../siteconfig.c:518
+#, c-format
+msgid "Default message expire policy for private mailboxes"
+msgstr ""
+"Vorgabewerte für die Gültigkeitsdauer von Nachrichten in privaten Mailboxen"
+
+#: ../siteconfig.c:522
+#, c-format
+msgid "Same policy as public rooms"
+msgstr "Die selben Werte wie in öffentlichen Räumen"
+
+#: ../siteconfig.c:644
+msgid "Your system configuration has been updated."
+msgstr "Ihre Systemkonfiguration wurde Übernommen"
+
+#: ../subst.c:216
+msgid "ERROR: could not open template "
+msgstr "FEHLER: konnte Template nicht öffnen"
+
+#: ../summary.c:35
+msgid "(nothing)"
+msgstr "(Nichts)"
+
+#: ../summary.c:50
+msgid "Messages"
+msgstr "Nachrichten"
+
+#: ../summary.c:87
+msgid "Who's&nbsp;online&nbsp;now"
+msgstr "Wer ist gerade angemeldet"
+
+#: ../summary.c:122
+msgid "(None)"
+msgstr "(Keine)"
+
+#: ../summary.c:135
+msgid "(This server does not support task lists)"
+msgstr "(Dieser Server unterstützt keine Aufgabenlisten)"
+
+#: ../summary.c:151
+msgid "Today&nbsp;on&nbsp;your&nbsp;calendar"
+msgstr "Heute&nbsp;auf&nbsp;ihrem&nbsp;Kalender"
+
+#: ../summary.c:164
+msgid "(Nothing)"
+msgstr "(Nichts)"
+
+#: ../summary.c:176
+msgid "(This server does not support calendars)"
+msgstr "(Dieser Server unterstützt keine Kalender)"
+
+#: ../summary.c:188
+msgid "About&nbsp;this&nbsp;server"
+msgstr "Über&nbsp;diesen&nbsp;Server"
+
+#: ../summary.c:192
+#, c-format
+msgid ""
+"You are connected to %s, running %s with %s, and located in %s.  Your system "
+"administrator is %s."
+msgstr ""
+"Sie sind Angemeldet auf %s, mit %s über %s, in %s.  Ihr Systemverwalter ist %"
+"s"
+
+#: ../summary.c:259
+#, c-format
+msgid "Summary page for %s"
+msgstr "Zusammenfassung für %s"
+
+#: ../sysmsgs.c:40
+#, c-format
+msgid "Edit %s"
+msgstr "%s editieren"
+
+#: ../sysmsgs.c:44
+#, c-format
+msgid ""
+"Enter %s below.  Text is formatted to the reader's screen width.  To defeat "
+"the formatting, indent a line at least one space."
+msgstr ""
+"%s eingeben. Der Text wird auf dem Schirm des Lesers formatiert. Die Zeile "
+"um mindestens einen Leerschritt einrücken um das Formatieren abzuschalten."
+
+#: ../sysmsgs.c:79
+#, c-format
+msgid "Cancelled.  %s was not saved."
+msgstr "Abgebrochen.   %s wurde nicht gespeichert."
+
+#: ../sysmsgs.c:98
+#, c-format
+msgid "%s has been saved."
+msgstr "%s wurde gespeichert."
+
+#: ../useredit.c:31
+msgid "Edit or delete users"
+msgstr "Benutzer Bearbeiten/Löschen"
+
+#: ../useredit.c:40
+msgid "Add users"
+msgstr "Neuer Benutzer"
+
+#: ../useredit.c:43
+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 "
+"eintragenund 'Anlegen' Klicken"
+
+#: ../useredit.c:48
+msgid "New user: "
+msgstr "Neuer Benutzer: "
+
+#: ../useredit.c:51
+msgid "Create"
+msgstr "Anlegen"
+
+#: ../useredit.c:57
+msgid "Edit or Delete users"
+msgstr "Benutzer Bearbeiten/Löschen"
+
+#: ../useredit.c:60
+msgid ""
+"To edit an existing user account, select the user name from the list and "
+"click 'Edit'."
+msgstr ""
+"Einen vorhandenen Benutzer aus der Liste auswählen zum modifizieren, und "
+"dann 'Bearbeiten' Klicken"
+
+#: ../useredit.c:83
+msgid "Edit configuration"
+msgstr "Konfiguration Bearbeiten"
+
+#: ../useredit.c:84
+msgid "Edit address book entry"
+msgstr "Adressbuch Eintrag bearbeiten"
+
+#: ../useredit.c:86
+msgid "Delete user"
+msgstr "Benutzer Löschen"
+
+#: ../useredit.c:86
+msgid "Delete this user?"
+msgstr "Diesen Benutzer löschen?"
+
+#: ../useredit.c:204
+msgid ""
+"An error occurred while trying to create or edit this address book entry."
+msgstr "Fehler beim Erzeugen / Editieren dieses Adressbuch-Eintrags"
+
+#: ../useredit.c:283
+msgid "Edit user account: "
+msgstr "Benutzer Bearbeiten : "
+
+#: ../useredit.c:303
+msgid "Password"
+msgstr "Passwort"
+
+#: ../useredit.c:310
+msgid "Permission to send Internet mail"
+msgstr "Zugang zu Internet Mail reglementieren"
+
+#: ../useredit.c:319
+msgid "Number of logins"
+msgstr "Anzahl der Anmeldungen"
+
+#: ../useredit.c:326
+msgid "Messages submitted"
+msgstr "Nachricht abgeschickt"
+
+#: ../useredit.c:333
+msgid "Access level"
+msgstr "Zugangsberechtigung"
+
+#: ../useredit.c:347
+msgid "User ID number"
+msgstr "Benutzer ID"
+
+#: ../useredit.c:355
+msgid "Date and time of last login"
+msgstr "Datum der letzten Anmeldung"
+
+#: ../useredit.c:370
+msgid "Auto-purge after this many days"
+msgstr "Automatisch löschen nach n Tagen"
+
+#: ../useredit.c:402
+msgid "Changes were not saved."
+msgstr "Änderungen verworfen."
+
+#: ../useredit.c:486
+#, c-format
+msgid "A new user has been created."
+msgstr "Ein neuer Benutzer wurde angelegt."
+
+#: ../userlist.c:48
+#, c-format
+msgid "User list for %s"
+msgstr "Benutzerliste für %s"
+
+#: ../userlist.c:66
+#, fuzzy
+msgid "User Name"
+msgstr "Benutzername"
+
+#: ../userlist.c:67
+#, fuzzy
+msgid "Number"
+msgstr "November"
+
+#: ../userlist.c:68
+#, fuzzy
+msgid "Access Level"
+msgstr "Zugangsberechtigung"
+
+#: ../userlist.c:69
+#, fuzzy
+msgid "Last Login"
+msgstr "Anmelden"
+
+#: ../userlist.c:70
+msgid "Total Logins"
+msgstr ""
+
+#: ../userlist.c:71
+#, fuzzy
+msgid "Total Posts"
+msgstr "Diese Maschine"
+
+#: ../userlist.c:129
+msgid "User profile"
+msgstr "Benutzerprofil"
+
+#: ../userlist.c:165
+#, c-format
+msgid "Click here to send an instant message to %s"
+msgstr "Hier klicken um eine Kurznachricht an %s zu senden"
+
+#: ../vcard_edit.c:184
+msgid "Edit contact information"
+msgstr "Kontaktdaten bearbeiten"
+
+#: ../vcard_edit.c:200
+msgid "Prefix"
+msgstr "Anrede"
+
+#: ../vcard_edit.c:200
+msgid "First"
+msgstr "Vorname"
+
+#: ../vcard_edit.c:200
+msgid "Middle"
+msgstr "Mittelinitial"
+
+#: ../vcard_edit.c:200
+msgid "Last"
+msgstr "Nachname"
+
+#: ../vcard_edit.c:200
+msgid "Suffix"
+msgstr "Zähler"
+
+#: ../vcard_edit.c:221
+msgid "Display name:"
+msgstr "Namen anzeigen:"
+
+#: ../vcard_edit.c:228
+msgid "Title:"
+msgstr "Titel:"
+
+#: ../vcard_edit.c:235
+msgid "Organization:"
+msgstr "Organisation:"
+
+#: ../vcard_edit.c:246
+msgid "PO box:"
+msgstr "Postfach:"
+
+#: ../vcard_edit.c:262
+msgid "City:"
+msgstr "Stadt:"
+
+#: ../vcard_edit.c:268
+msgid "State:"
+msgstr "Bundesland:"
+
+#: ../vcard_edit.c:274
+msgid "ZIP code:"
+msgstr "Postleitzahl:"
+
+#: ../vcard_edit.c:280
+msgid "Country:"
+msgstr "Land:"
+
+#: ../vcard_edit.c:290
+msgid "Home telephone:"
+msgstr "Telefon:"
+
+#: ../vcard_edit.c:296
+msgid "Work telephone:"
+msgstr "Telefon/Büro:"
+
+#: ../vcard_edit.c:307
+msgid "Primary Internet e-mail address"
+msgstr "Erste Email-Adresse"
+
+#: ../vcard_edit.c:314
+msgid "Internet e-mail aliases"
+msgstr "Internet Email Aliase"
+
+#: ../webcit.c:685
+#, c-format
+msgid "An error occurred while retrieving this part: %s\n"
+msgstr "Ein Fehler trat in diesem Teil auf: %s\n"
+
+#: ../webcit.c:771
+msgid "Make this my start page"
+msgstr "Als Startseite setzen"
+
+#: ../webcit.c:790
+msgid "You no longer have a start page selected."
+msgstr "Startseite gelöscht"
+
+#: ../webcit.c:826
+msgid "Authorization Required"
+msgstr "Authentifizierung benötigt"
+
+#: ../webcit.c:828
+#, 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:1247
+#, 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"
+
+#: ../webcit.c:1484 ../webcit.c:1486
+msgid "Room info"
+msgstr "Raum Info"
+
+#: ../webcit.c:1489 ../webcit.c:1491
+msgid "Your bio"
+msgstr "Ihre Biographie"
+
+#: ../webcit.c:1499
+msgid "your photo"
+msgstr "Ihr Photo"
+
+#: ../webcit.c:1505
+msgid "the icon for this room"
+msgstr "Das Symbol für diesen Raum "
+
+#: ../webcit.c:1519
+msgid "the icon for this floor"
+msgstr "Das Symbol für diese Etage"
+
+#: ../who.c:27
+msgid "User name"
+msgstr "Benutzername"
+
+#: ../who.c:28
+msgid "Room"
+msgstr "Raum"
+
+#: ../who.c:29
+msgid "From host"
+msgstr "Client DNS Name / IP"
+
+#: ../who.c:62
+msgid "(kill)"
+msgstr "(beenden)"
+
+#: ../who.c:65
+msgid "(edit)"
+msgstr "(bearbeiten)"
+
+#: ../who.c:141
+msgid "Do you really want to kill this session?"
+msgstr "Wollen sie diese Sitzung wirklich beenden?"
+
+#: ../who.c:151
+#, c-format
+msgid "Users currently on %s"
+msgstr "Angemeldete Benutzer auf %s"
+
+#: ../who.c:166
+#, c-format
+msgid ""
+"Click on a name to read user info.  Click on %s to send an instant message "
+"to that user."
+msgstr ""
+"Auf den Namen klicken um die Benutzerdaten einzusehen. Auf %s Klicken um ihm "
+"eine Kurznachricht zu senden."
+
+#: ../who.c:228
+msgid "Edit your session display"
+msgstr "Sitzungsparameter Bearbeiten"
+
+#: ../who.c:232
+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 ""
+"Dieser Dialog erlaubt Ihnen, die in der Benutzerübersicht angezeigten Texte "
+"zu verändern.Um die Defaultwerte wiederherzustellen bei leerem Feld den "
+"'Raumname setzen' Knopf drücken"
+
+#: ../who.c:244
+msgid "Room name:"
+msgstr "Raumname:"
+
+#: ../who.c:249
+msgid "Change room name"
+msgstr "Raumname setzen"
+
+#: ../who.c:253
+msgid "Host name:"
+msgstr "Rechnername:"
+
+#: ../who.c:258
+msgid "Change host name"
+msgstr "Rechnername setzen"
+
+#: ../who.c:268
+msgid "Change user name"
+msgstr "Benutzername ändern"
+
+#: ../wiki.c:64
+#, c-format
+msgid "There is no room called '%s'."
+msgstr "Es gibt keinen Raum mit dem Namen '%s'."
+
+#: ../wiki.c:74
+#, c-format
+msgid "'%s' is not a Wiki room."
+msgstr "'%s' ist kein Wiki Raum."
+
+#: ../wiki.c:100
+#, c-format
+msgid "There is no page called '%s' here."
+msgstr "Es gibt keine Seite mit Namen '%s' hier."
+
+#: ../wiki.c:102
+msgid ""
+"Select the 'Edit this page' link in the room banner if you would like to "
+"create this page."
+msgstr ""
+"Wähle den 'Diese Seite editieren' Link in dem Raum-Banner, wenn du diesen "
+"Raum erzeugen möchtest."
+
+#~ msgid "Jan"
+#~ msgstr "Jan"
+
+#~ msgid "Feb"
+#~ msgstr "Feb"
+
+#~ msgid "Mar"
+#~ msgstr "Mär"
+
+#~ msgid "Apr"
+#~ msgstr "Apr"
+
+#~ msgid "May"
+#~ msgstr "Mai"
+
+#~ msgid "Jun"
+#~ msgstr "Jun"
+
+#~ msgid "Jul"
+#~ msgstr "Jul"
+
+#~ msgid "Aug"
+#~ msgstr "Aug"
+
+#~ msgid "Sep"
+#~ msgstr "Sep"
+
+#~ msgid "Oct"
+#~ msgstr "Okt"
+
+#~ msgid "Nov"
+#~ msgstr "Nov"
+
+#~ msgid "Dec"
+#~ msgstr "Dez"
+
+#~ msgid "Sunday"
+#~ msgstr "Sonntag"
+
+#~ msgid "Monday"
+#~ msgstr "Montag"
+
+#~ msgid "Tuesday"
+#~ msgstr "Dienstag"
+
+#~ msgid "Wednesday"
+#~ msgstr "Mittwoch"
+
+#~ msgid "Thursday"
+#~ msgstr "Donnerstag"
+
+#~ msgid "Friday"
+#~ msgstr "Freitag"
+
+#~ msgid "Saturday"
+#~ msgstr "Samstag"
+
+#~ msgid "January"
+#~ msgstr "Januar"
+
+#~ msgid "February"
+#~ msgstr "Februar"
+
+#~ msgid "March"
+#~ msgstr "März"
+
+#~ msgid "April"
+#~ msgstr "April"
+
+#~ msgid "June"
+#~ msgstr "Juni"
+
+#~ msgid "July"
+#~ msgstr "Juli"
+
+#~ msgid "August"
+#~ msgstr "August"
+
+#~ msgid "September"
+#~ msgstr "September"
+
+#~ msgid "October"
+#~ msgstr "Oktober"
+
+#~ msgid "December"
+#~ msgstr "Dezember"
+
+#~ msgid ""
+#~ "<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>"
+#~ msgstr ""
+#~ "<TR><TH>Benutzername</TH><TH>Anzahl</TH><TH>Berechtigung</TH><TH>Letzte "
+#~ "Anmeldung</TH><TH>Anzahl Anmeldungen</TH><TH>Anzahl verfasste Beiträge</"
+#~ "TH></TR>"
diff --git a/webcit/po/en_GB.po b/webcit/po/en_GB.po
new file mode 100644 (file)
index 0000000..f6faf07
--- /dev/null
@@ -0,0 +1,2727 @@
+# WebCit messages for UK English
+# Copyright (C) 2006 The Citadel Project - http://www.citadel.org
+# This file is distributed under the GNU General Public License
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: WebCit 6.71\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-02-13 21:49+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: David Given <dg@cowlark.com>\n"
+"Language-Team: LANGUAGE <en_GB@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../auth.c:23
+msgid "Deleted"
+msgstr ""
+
+#: ../auth.c:24 ../auth.c:72
+msgid "New User"
+msgstr ""
+
+#: ../auth.c:25
+msgid "Problem User"
+msgstr ""
+
+#: ../auth.c:26
+msgid "Local User"
+msgstr ""
+
+#: ../auth.c:27
+msgid "Network User"
+msgstr ""
+
+#: ../auth.c:28
+msgid "Preferred User"
+msgstr ""
+
+#: ../auth.c:29
+msgid "Aide"
+msgstr ""
+
+#: ../auth.c:52
+#, c-format
+msgid ""
+"<ul><li><b>If you already have an account on %s</b>, 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.<br /></ul>"
+msgstr ""
+
+#: ../auth.c:68 ../who.c:263
+msgid "User name:"
+msgstr ""
+
+#: ../auth.c:69
+msgid "Password:"
+msgstr ""
+
+#: ../auth.c:70
+msgid "Language:"
+msgstr ""
+
+#: ../auth.c:71
+msgid "Login"
+msgstr ""
+
+#: ../auth.c:73 ../paging.c:510
+msgid "Exit"
+msgstr ""
+
+#: ../auth.c:75
+#, c-format
+msgid "%s - powered by Citadel"
+msgstr ""
+
+#: ../auth.c:166 ../auth.c:534
+msgid "Blank passwords are not allowed."
+msgstr ""
+
+#: ../auth.c:187
+msgid "Your password was not accepted."
+msgstr ""
+
+#: ../auth.c:295
+msgid ""
+"This program was unable to connect or stay connected to the Citadel server.  "
+"Please report this problem to your system administrator."
+msgstr ""
+
+#: ../auth.c:302
+msgid "Log in again"
+msgstr ""
+
+#: ../auth.c:305
+msgid "Close window"
+msgstr ""
+
+#: ../auth.c:326 ../mainmenu.c:241
+msgid "Validate new users"
+msgstr ""
+
+#: ../auth.c:346
+msgid "No users require validation at this time."
+msgstr ""
+
+#: ../auth.c:387
+#, c-format
+msgid "Current access level: %d (%s)\n"
+msgstr ""
+
+#: ../auth.c:395
+msgid "Select access level for this user:"
+msgstr ""
+
+#: ../auth.c:458 ../mainmenu.c:137
+msgid "Change your password"
+msgstr ""
+
+#: ../auth.c:487
+msgid "Enter new password:"
+msgstr ""
+
+#: ../auth.c:491
+msgid "Enter it again to confirm:"
+msgstr ""
+
+#: ../auth.c:496
+msgid "Change password"
+msgstr ""
+
+#: ../auth.c:498 ../calendar.c:616 ../event.c:390 ../graphics.c:58
+#: ../iconbar.c:712 ../mainmenu.c:300 ../messages.c:2894 ../messages.c:3015
+#: ../messages.c:3103 ../netconf.c:86 ../netconf.c:149 ../paging.c:58
+#: ../preferences.c:389 ../roomops.c:1285 ../roomops.c:1613 ../roomops.c:2046
+#: ../roomops.c:2195 ../roomops.c:2259 ../siteconfig.c:564 ../sysmsgs.c:59
+#: ../useredit.c:381 ../vcard_edit.c:336 ../who.c:273
+msgid "Cancel"
+msgstr ""
+
+#: ../auth.c:515
+msgid "Cancelled.  Password was not changed."
+msgstr ""
+
+#: ../auth.c:526
+msgid "They don't match.  Password was not changed."
+msgstr ""
+
+#: ../availability.c:140
+msgid "availability unknown"
+msgstr ""
+
+#: ../availability.c:161
+msgid "free"
+msgstr ""
+
+#: ../availability.c:171
+msgid "BUSY"
+msgstr ""
+
+#: ../calendar.c:24
+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 ""
+
+#: ../calendar.c:38
+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 ""
+
+#: ../calendar.c:50
+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 ""
+
+#: ../calendar.c:107
+msgid "Meeting invitation"
+msgstr ""
+
+#: ../calendar.c:116
+msgid "Attendee's reply to your invitation"
+msgstr ""
+
+#: ../calendar.c:125
+msgid "Published event"
+msgstr ""
+
+#: ../calendar.c:130
+msgid "This is an unknown type of calendar item."
+msgstr ""
+
+#: ../calendar.c:139 ../calendar.c:560
+msgid "Summary:"
+msgstr ""
+
+#: ../calendar.c:148
+msgid "Location:"
+msgstr ""
+
+#: ../calendar.c:174
+msgid "Date:"
+msgstr ""
+
+#: ../calendar.c:181
+msgid "Starting date/time:"
+msgstr ""
+
+#: ../calendar.c:192
+msgid "Ending date/time:"
+msgstr ""
+
+#: ../calendar.c:201 ../calendar.c:596
+msgid "Description:"
+msgstr ""
+
+#: ../calendar.c:210
+msgid "Attendee:"
+msgstr ""
+
+#: ../calendar.c:250
+#, c-format
+msgid "This is an update of '%s' which is already in your calendar."
+msgstr ""
+
+#: ../calendar.c:254
+#, c-format
+msgid "This event would conflict with '%s' which is already in your calendar."
+msgstr ""
+
+#: ../calendar.c:259
+msgid "Update:"
+msgstr ""
+
+#: ../calendar.c:260
+msgid "CONFLICT:"
+msgstr ""
+
+#: ../calendar.c:278
+msgid "How would you like to respond to this invitation?"
+msgstr ""
+
+#: ../calendar.c:279
+msgid "Accept"
+msgstr ""
+
+#: ../calendar.c:280
+msgid "Tentative"
+msgstr ""
+
+#: ../calendar.c:281
+msgid "Decline"
+msgstr ""
+
+#: ../calendar.c:305
+msgid "Click <i>Update</i> to accept this reply and update your calendar."
+msgstr ""
+
+#: ../calendar.c:306
+msgid "Update"
+msgstr ""
+
+#: ../calendar.c:307
+msgid "Ignore"
+msgstr ""
+
+#: ../calendar.c:334
+msgid "There was an error parsing this calendar item."
+msgstr ""
+
+#: ../calendar.c:361
+msgid "Respond to meeting request"
+msgstr ""
+
+#: ../calendar.c:380
+msgid ""
+"You have accepted this meeting invitation.  It has been entered into your "
+"calendar."
+msgstr ""
+
+#: ../calendar.c:384
+msgid ""
+"You have tentatively accepted this meeting invitation.  It has been "
+"'pencilled in' to your calendar."
+msgstr ""
+
+#: ../calendar.c:388
+msgid ""
+"You have declined this meeting invitation.  It has <b>not</b> been entered "
+"into your calendar."
+msgstr ""
+
+#: ../calendar.c:393
+msgid "A reply has been sent to the meeting organizer."
+msgstr "A reply has been sent to the meeting organiser."
+
+#: ../calendar.c:403 ../calendar.c:457
+msgid "Return to messages"
+msgstr ""
+
+#: ../calendar.c:422
+msgid "Update your calendar with this RSVP"
+msgstr ""
+
+#: ../calendar.c:441
+msgid "Your calendar has been updated to reflect this RSVP."
+msgstr ""
+
+#: ../calendar.c:443
+msgid ""
+"You have chosen to ignore this RSVP. Your calendar has <b>not</b> been "
+"updated."
+msgstr ""
+
+#: ../calendar.c:544
+msgid "Edit task"
+msgstr ""
+
+#: ../calendar.c:571
+msgid "Start date:"
+msgstr ""
+
+#: ../calendar.c:584
+msgid "Due date:"
+msgstr ""
+
+#: ../calendar.c:614 ../event.c:387
+msgid "Save"
+msgstr ""
+
+#: ../calendar.c:615 ../event.c:388 ../messages.c:903 ../messages.c:2281
+msgid "Delete"
+msgstr ""
+
+#: ../calendar_tools.c:73
+msgid "Month: "
+msgstr ""
+
+#: ../calendar_tools.c:87
+msgid "Day: "
+msgstr ""
+
+#: ../calendar_tools.c:97
+msgid "Year: "
+msgstr ""
+
+#: ../calendar_tools.c:115
+msgid "Hour: "
+msgstr ""
+
+#: ../calendar_tools.c:135
+msgid "Minute: "
+msgstr ""
+
+#: ../calendar_tools.c:204
+msgid "(status unknown)"
+msgstr ""
+
+#: ../calendar_tools.c:220
+msgid "(needs action)"
+msgstr ""
+
+#: ../calendar_tools.c:223
+msgid "(accepted)"
+msgstr ""
+
+#: ../calendar_tools.c:226
+msgid "(declined)"
+msgstr ""
+
+#: ../calendar_tools.c:229
+msgid "(tenative)"
+msgstr ""
+
+#: ../calendar_tools.c:232
+msgid "(delegated)"
+msgstr ""
+
+#: ../calendar_tools.c:235
+msgid "(completed)"
+msgstr ""
+
+#: ../calendar_tools.c:238
+msgid "(in process)"
+msgstr ""
+
+#: ../calendar_tools.c:241
+msgid "(none)"
+msgstr ""
+
+#: ../calendar_view.c:17
+msgid "The calendar view is not available."
+msgstr ""
+
+#: ../calendar_view.c:24
+msgid "The tasks view is not available."
+msgstr ""
+
+#: ../calendar_view.c:435
+msgid "Week"
+msgstr ""
+
+#: ../calendar_view.c:437
+msgid "Hours"
+msgstr ""
+
+#: ../calendar_view.c:438 ../messages.c:2276
+msgid "Subject"
+msgstr ""
+
+#: ../calendar_view.c:439 ../event.c:164
+msgid "Start"
+msgstr ""
+
+#: ../calendar_view.c:440 ../event.c:218
+msgid "End"
+msgstr ""
+
+#: ../calendar_view.c:930
+msgid "Name of task"
+msgstr ""
+
+#: ../calendar_view.c:932
+msgid "Date due"
+msgstr ""
+
+#: ../event.c:76 ../paging.c:78
+msgid "Add or edit an event"
+msgstr ""
+
+#: ../event.c:142 ../iconbar.c:123 ../iconbar.c:539
+msgid "Summary"
+msgstr ""
+
+#: ../event.c:153
+msgid "Location"
+msgstr ""
+
+#: ../event.c:207
+msgid "All day event"
+msgstr ""
+
+#: ../event.c:246 ../iconbar.c:199 ../iconbar.c:586
+msgid "Notes"
+msgstr ""
+
+#: ../event.c:288
+msgid "Organizer"
+msgstr "Organiser"
+
+#: ../event.c:293
+msgid "(you are the organizer)"
+msgstr "(you are the organiser)"
+
+#: ../event.c:311
+msgid "Show time as:"
+msgstr ""
+
+#: ../event.c:333
+msgid "Free"
+msgstr ""
+
+#: ../event.c:340
+msgid "Busy"
+msgstr ""
+
+#: ../event.c:346
+msgid "Attendees"
+msgstr ""
+
+#: ../event.c:349
+msgid "(One per line)"
+msgstr ""
+
+#: ../event.c:389
+msgid "Check attendee availability"
+msgstr ""
+
+#: ../floors.c:34
+msgid "Add/change/delete floors"
+msgstr ""
+
+#: ../floors.c:51 ../siteconfig.c:49 ../vcard_edit.c:78 ../wiki.c:66
+#: ../wiki.c:76
+msgid "Error"
+msgstr ""
+
+#: ../floors.c:62
+msgid "Floor number"
+msgstr ""
+
+#: ../floors.c:64
+msgid "Floor name"
+msgstr ""
+
+#: ../floors.c:66
+msgid "Number of rooms"
+msgstr ""
+
+#: ../floors.c:68
+msgid "Floor CSS"
+msgstr ""
+
+#: ../floors.c:81
+msgid "(delete floor)"
+msgstr ""
+
+#: ../floors.c:87
+msgid "(edit graphic)"
+msgstr ""
+
+#: ../floors.c:100
+msgid "Change name"
+msgstr ""
+
+#: ../floors.c:113
+msgid "Change CSS"
+msgstr ""
+
+#: ../floors.c:125
+msgid "Create new floor"
+msgstr ""
+
+#: ../floors.c:146
+#, c-format
+msgid "Floor has been deleted."
+msgstr ""
+
+#: ../floors.c:169
+#, c-format
+msgid "New floor has been created."
+msgstr ""
+
+#: ../graphics.c:27
+msgid "Image upload"
+msgstr ""
+
+#: ../graphics.c:45
+msgid ""
+"You can upload any image directly from your computer, as long as it is in "
+"GIF format (JPEG, PNG, etc. won't work)."
+msgstr ""
+
+#: ../graphics.c:50
+msgid "Please select a file to upload:"
+msgstr ""
+
+#: ../graphics.c:54
+msgid "Upload"
+msgstr ""
+
+#: ../graphics.c:56
+msgid "Reset form"
+msgstr ""
+
+#: ../graphics.c:74
+msgid "Graphics upload has been cancelled."
+msgstr ""
+
+#: ../graphics.c:81
+msgid "You didn't upload a file."
+msgstr ""
+
+#: ../html2html.c:109
+#, c-format
+msgid "realloc() error! couldn't get %d bytes: %s"
+msgstr ""
+
+#: ../iconbar.c:105 ../iconbar.c:391
+msgid "Find out more about Citadel"
+msgstr ""
+
+#: ../iconbar.c:106 ../iconbar.c:392
+msgid "CITADEL"
+msgstr ""
+
+#: ../iconbar.c:110
+msgid "switch to room list"
+msgstr ""
+
+#: ../iconbar.c:116 ../iconbar.c:540
+msgid "Your summary page"
+msgstr ""
+
+#: ../iconbar.c:133
+msgid "Go to your email inbox"
+msgstr ""
+
+#: ../iconbar.c:140
+msgid "Mail"
+msgstr ""
+
+#: ../iconbar.c:158
+msgid "Go to your personal calendar"
+msgstr ""
+
+#: ../iconbar.c:165 ../iconbar.c:603 ../roomops.c:22
+msgid "Calendar"
+msgstr ""
+
+#: ../iconbar.c:175
+msgid "Go to your personal address book"
+msgstr ""
+
+#: ../iconbar.c:182 ../iconbar.c:570
+msgid "Contacts"
+msgstr ""
+
+#: ../iconbar.c:192
+msgid "Go to your personal notes"
+msgstr ""
+
+#: ../iconbar.c:209
+msgid "Go to your personal task list"
+msgstr ""
+
+#: ../iconbar.c:216 ../iconbar.c:618 ../summary.c:109
+msgid "Tasks"
+msgstr ""
+
+#: ../iconbar.c:224
+msgid "List all of your accessible rooms"
+msgstr ""
+
+#: ../iconbar.c:231 ../iconbar.c:634
+msgid "Rooms"
+msgstr ""
+
+#: ../iconbar.c:240
+msgid "See who is online right now"
+msgstr ""
+
+#: ../iconbar.c:247 ../iconbar.c:650
+msgid "Who is online?"
+msgstr ""
+
+#: ../iconbar.c:265 ../iconbar.c:666
+msgid "Chat"
+msgstr ""
+
+#: ../iconbar.c:275
+msgid "Advanced Options Menu: Advanced Room commands, Account Info, and Chat"
+msgstr ""
+
+#: ../iconbar.c:282
+msgid "Advanced"
+msgstr ""
+
+#: ../iconbar.c:292
+msgid "Room and system administration functions"
+msgstr ""
+
+#: ../iconbar.c:299 ../roomops.c:1002
+msgid "Administration"
+msgstr ""
+
+#: ../iconbar.c:307 ../iconbar.c:316 ../iconbar.c:402 ../iconbar.c:411
+#: ../mainmenu.c:110
+msgid "Log off"
+msgstr ""
+
+#: ../iconbar.c:308 ../iconbar.c:403
+msgid "Log off now?"
+msgstr ""
+
+#: ../iconbar.c:326
+msgid "Customize this menu"
+msgstr "Customise this menu"
+
+#: ../iconbar.c:327
+msgid "customize this menu"
+msgstr "customise this menu"
+
+#: ../iconbar.c:396
+msgid "switch to menu"
+msgstr ""
+
+#: ../iconbar.c:481
+msgid "Customize the icon bar"
+msgstr "Customise the icon bar"
+
+#: ../iconbar.c:493
+msgid "Display icons as:"
+msgstr ""
+
+#: ../iconbar.c:499
+msgid "pictures and text"
+msgstr ""
+
+#: ../iconbar.c:500
+msgid "pictures only"
+msgstr ""
+
+#: ../iconbar.c:501
+msgid "text only"
+msgstr ""
+
+#: ../iconbar.c:506
+msgid ""
+"Select the icons you would like to see displayed in the 'icon bar' menu on "
+"the left side of the screen."
+msgstr ""
+
+#: ../iconbar.c:524
+msgid "Site logo"
+msgstr ""
+
+#: ../iconbar.c:525
+msgid "An icon describing this site"
+msgstr ""
+
+#: ../iconbar.c:554
+msgid "Mail (inbox)"
+msgstr ""
+
+#: ../iconbar.c:555
+msgid "A shortcut to your email Inbox"
+msgstr ""
+
+#: ../iconbar.c:571
+msgid "Your personal address book"
+msgstr ""
+
+#: ../iconbar.c:587
+msgid "Your personal notes"
+msgstr ""
+
+#: ../iconbar.c:604
+msgid "A shortcut to your personal calendar"
+msgstr ""
+
+#: ../iconbar.c:619
+msgid "A shortcut to your personal task list"
+msgstr ""
+
+#: ../iconbar.c:635
+msgid ""
+"Clicking this icon displays a list of all accessible rooms (or folders) "
+"available."
+msgstr ""
+
+#: ../iconbar.c:651
+msgid "Clicking this icon displays a list of all users currently logged in."
+msgstr ""
+
+#: ../iconbar.c:667
+msgid ""
+"Clicking this icon enters real-time chat mode with other users in the same "
+"room."
+msgstr ""
+
+#: ../iconbar.c:684
+msgid "Advanced options"
+msgstr ""
+
+#: ../iconbar.c:685
+msgid "Access to the complete menu of Citadel functions."
+msgstr ""
+
+#: ../iconbar.c:701
+msgid "Citadel logo"
+msgstr ""
+
+#: ../iconbar.c:702
+msgid "Displays the 'Powered by Citadel' icon"
+msgstr ""
+
+#: ../iconbar.c:711 ../netconf.c:146 ../roomops.c:1284 ../roomops.c:1611
+#: ../siteconfig.c:562 ../sysmsgs.c:57 ../useredit.c:381 ../vcard_edit.c:335
+msgid "Save changes"
+msgstr ""
+
+#: ../iconbar.c:766
+msgid ""
+"Your icon bar has been updated.  Please select any of its choices to "
+"continue."
+msgstr ""
+
+#: ../inetconf.c:38
+msgid "localhost"
+msgstr ""
+
+#: ../inetconf.c:39
+msgid "directory"
+msgstr ""
+
+#: ../inetconf.c:40
+msgid "gatewaydomain"
+msgstr ""
+
+#: ../inetconf.c:41
+msgid "smarthost"
+msgstr ""
+
+#: ../inetconf.c:42
+msgid "rbl"
+msgstr ""
+
+#: ../inetconf.c:43
+msgid "spamassassin"
+msgstr ""
+
+#: ../inetconf.c:45
+msgid "Local host aliases"
+msgstr ""
+
+#: ../inetconf.c:46
+msgid "Directory domains"
+msgstr ""
+
+#: ../inetconf.c:47
+msgid "Gateway domains"
+msgstr ""
+
+#: ../inetconf.c:48
+msgid "Smart hosts"
+msgstr ""
+
+#: ../inetconf.c:49
+msgid "RBL hosts"
+msgstr ""
+
+#: ../inetconf.c:50
+msgid "SpamAssassin hosts"
+msgstr ""
+
+#: ../inetconf.c:52
+msgid "(domains for which this host receives mail)"
+msgstr ""
+
+#: ../inetconf.c:53
+msgid "(domains mapped with the Global Address Book)"
+msgstr ""
+
+#: ../inetconf.c:54
+msgid "(domains whose subdomains match Citadel hosts)"
+msgstr ""
+
+#: ../inetconf.c:55
+msgid "(if present, forward all outbound mail to one of these hosts)"
+msgstr ""
+
+#: ../inetconf.c:56
+msgid "(hosts running a Realtime Blackhole List)"
+msgstr ""
+
+#: ../inetconf.c:57
+msgid "(hosts running the SpamAssassin service)"
+msgstr ""
+
+#: ../inetconf.c:94
+msgid "Internet configuration"
+msgstr ""
+
+#: ../inetconf.c:121
+msgid "Delete this entry?"
+msgstr ""
+
+#: ../inetconf.c:123 ../netconf.c:209
+msgid "(Delete)"
+msgstr ""
+
+#: ../inetconf.c:173
+#, c-format
+msgid "%s has been deleted."
+msgstr ""
+
+#: ../listsub.c:44
+msgid "List subscription"
+msgstr ""
+
+#: ../listsub.c:56
+msgid "List subscribe/unsubscribe"
+msgstr ""
+
+#: ../listsub.c:76
+msgid "Confirmation request sent"
+msgstr ""
+
+#: ../listsub.c:78
+#, c-format
+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 ""
+
+#: ../listsub.c:91
+msgid "Go back..."
+msgstr ""
+
+#: ../mainmenu.c:23
+msgid "Basic commands"
+msgstr ""
+
+#: ../mainmenu.c:32
+msgid "List known rooms"
+msgstr ""
+
+#: ../mainmenu.c:34
+msgid "Where can I go from here?"
+msgstr ""
+
+#: ../mainmenu.c:39 ../roomops.c:646
+msgid "Goto next room"
+msgstr ""
+
+#: ../mainmenu.c:42
+msgid "...with <EM>unread</EM> messages"
+msgstr ""
+
+#: ../mainmenu.c:47
+msgid "Skip to next room"
+msgstr ""
+
+#: ../mainmenu.c:50
+msgid "(come back here later)"
+msgstr ""
+
+#: ../mainmenu.c:57 ../roomops.c:450
+msgid "Ungoto"
+msgstr ""
+
+#: ../mainmenu.c:60
+#, c-format
+msgid "(oops! Back to %s)"
+msgstr ""
+
+#: ../mainmenu.c:68 ../roomops.c:459
+msgid "Read new messages"
+msgstr ""
+
+#: ../mainmenu.c:71
+msgid "...in this room"
+msgstr ""
+
+#: ../mainmenu.c:76 ../roomops.c:559
+msgid "Read all messages"
+msgstr ""
+
+#: ../mainmenu.c:79
+msgid "...old <EM>and</EM> new"
+msgstr ""
+
+#: ../mainmenu.c:84 ../roomops.c:621
+msgid "Enter a message"
+msgstr ""
+
+#: ../mainmenu.c:87
+msgid "(post in this room)"
+msgstr ""
+
+#: ../mainmenu.c:94
+msgid "Summary page"
+msgstr ""
+
+#: ../mainmenu.c:97
+msgid "Summary of my account"
+msgstr ""
+
+#: ../mainmenu.c:102
+msgid "User list"
+msgstr ""
+
+#: ../mainmenu.c:105
+msgid "(all registered users)"
+msgstr ""
+
+#: ../mainmenu.c:113
+msgid "Bye!"
+msgstr ""
+
+#: ../mainmenu.c:122
+msgid "Your info"
+msgstr ""
+
+#: ../mainmenu.c:127
+msgid "Change your preferences and settings"
+msgstr ""
+
+#: ../mainmenu.c:132
+msgid "Update your contact information"
+msgstr ""
+
+#: ../mainmenu.c:142
+msgid "Enter your 'bio'"
+msgstr ""
+
+#: ../mainmenu.c:147
+msgid "Edit your online photo"
+msgstr ""
+
+#: ../mainmenu.c:154
+msgid "Advanced room commands"
+msgstr ""
+
+#: ../mainmenu.c:160
+msgid "Edit or delete this room"
+msgstr ""
+
+#: ../mainmenu.c:166
+msgid "Go to a 'hidden' room"
+msgstr ""
+
+#: ../mainmenu.c:171 ../roomops.c:1942
+msgid "Create a new room"
+msgstr ""
+
+#: ../mainmenu.c:176
+#, c-format
+msgid "Zap (forget) this room (%s)"
+msgstr ""
+
+#: ../mainmenu.c:181
+msgid "List all forgotten rooms"
+msgstr ""
+
+#: ../mainmenu.c:200
+msgid "System Administration Menu"
+msgstr ""
+
+#: ../mainmenu.c:209
+msgid "Global Configuration"
+msgstr ""
+
+#: ../mainmenu.c:214
+msgid "Edit site-wide configuration"
+msgstr ""
+
+#: ../mainmenu.c:219
+msgid "Domain names and Internet mail configuration"
+msgstr ""
+
+#: ../mainmenu.c:224
+msgid "Configure replication with other Citadel servers"
+msgstr ""
+
+#: ../mainmenu.c:231
+msgid "User account management"
+msgstr ""
+
+#: ../mainmenu.c:236
+msgid "Add, change, delete user accounts"
+msgstr ""
+
+#: ../mainmenu.c:246
+msgid "Rooms and Floors"
+msgstr ""
+
+#: ../mainmenu.c:251
+msgid "Add, change, or delete floors"
+msgstr ""
+
+#: ../mainmenu.c:273
+msgid "Enter a server command"
+msgstr ""
+
+#: ../mainmenu.c:282
+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 ""
+
+#: ../mainmenu.c:289
+msgid "Enter command:"
+msgstr ""
+
+#: ../mainmenu.c:292
+msgid "Command input (if requesting SEND_LISTING transfer mode):"
+msgstr ""
+
+#: ../mainmenu.c:296
+#, c-format
+msgid "Detected host header is %s://%s"
+msgstr ""
+
+#: ../mainmenu.c:298
+msgid "Send command"
+msgstr ""
+
+#: ../mainmenu.c:327
+msgid "Server command results"
+msgstr ""
+
+#: ../messages.c:444
+msgid " (work)"
+msgstr ""
+
+#: ../messages.c:446
+msgid " (home)"
+msgstr ""
+
+#: ../messages.c:448
+msgid " (cell)"
+msgstr " (mobile)"
+
+#: ../messages.c:459 ../vcard_edit.c:252
+msgid "Address:"
+msgstr ""
+
+#: ../messages.c:519
+msgid "Telephone:"
+msgstr ""
+
+#: ../messages.c:524
+msgid "E-mail:"
+msgstr ""
+
+#: ../messages.c:632 ../messages.c:1229
+msgid "ERROR:"
+msgstr ""
+
+#: ../messages.c:655 ../messages.c:932 ../messages.c:1238 ../messages.c:1341
+msgid "unexpected end of message"
+msgstr ""
+
+#: ../messages.c:668 ../messages.c:1250
+msgid "from "
+msgstr ""
+
+#: ../messages.c:696 ../messages.c:1266
+msgid "in "
+msgstr ""
+
+#: ../messages.c:717 ../messages.c:1287
+msgid "to "
+msgstr ""
+
+#: ../messages.c:770
+msgid "View"
+msgstr ""
+
+#: ../messages.c:772
+msgid "Download"
+msgstr ""
+
+#: ../messages.c:819 ../messages.c:2851
+msgid "CC:"
+msgstr ""
+
+#: ../messages.c:827 ../messages.c:1323
+msgid "Subject:"
+msgstr ""
+
+#: ../messages.c:851 ../rss.c:28
+msgid "Reply"
+msgstr ""
+
+#: ../messages.c:866
+msgid "ReplyQuoted"
+msgstr ""
+
+#: ../messages.c:883
+msgid "ReplyAll"
+msgstr ""
+
+#: ../messages.c:891
+msgid "Forward"
+msgstr ""
+
+#: ../messages.c:898 ../messages.c:3101
+msgid "Move"
+msgstr ""
+
+#: ../messages.c:903
+msgid "Delete this message?"
+msgstr ""
+
+#: ../messages.c:909
+msgid "Headers"
+msgstr ""
+
+#: ../messages.c:914
+msgid "Print"
+msgstr ""
+
+#: ../messages.c:1025
+#, c-format
+msgid "I don't know how to display %s"
+msgstr ""
+
+#: ../messages.c:1060 ../messages.c:1587
+msgid "edit"
+msgstr ""
+
+#: ../messages.c:1550 ../messages.c:1859
+msgid "(no subject)"
+msgstr ""
+
+#: ../messages.c:1678
+msgid "(no name)"
+msgstr ""
+
+#: ../messages.c:1730
+msgid "This address book is empty."
+msgstr ""
+
+#: ../messages.c:2156
+msgid "No new messages."
+msgstr ""
+
+#: ../messages.c:2158
+msgid "No old messages."
+msgstr ""
+
+#: ../messages.c:2160
+msgid "No messages here."
+msgstr ""
+
+#: ../messages.c:2278
+msgid "Sender"
+msgstr ""
+
+#: ../messages.c:2280
+msgid "Date"
+msgstr ""
+
+#: ../messages.c:2295
+msgid "Click on any note to edit it."
+msgstr ""
+
+#: ../messages.c:2398
+msgid "Reading #"
+msgstr ""
+
+#: ../messages.c:2451
+#, c-format
+msgid "of %d messages."
+msgstr ""
+
+#: ../messages.c:2635
+#, c-format
+msgid "Cancelled.  Message was not posted."
+msgstr ""
+
+#: ../messages.c:2641
+#, c-format
+msgid "Automatically cancelled because you have already saved this message."
+msgstr ""
+
+#: ../messages.c:2660
+#, c-format
+msgid "Message has been sent.\n"
+msgstr ""
+
+#: ../messages.c:2663
+#, c-format
+msgid "Message has been posted.\n"
+msgstr ""
+
+#: ../messages.c:2797
+msgid " <I>from</I> "
+msgstr ""
+
+#: ../messages.c:2807
+msgid " <I>in</I> "
+msgstr ""
+
+#: ../messages.c:2840
+msgid "To:"
+msgstr ""
+
+#: ../messages.c:2862
+msgid "BCC:"
+msgstr ""
+
+#: ../messages.c:2880
+msgid "Subject (optional):"
+msgstr ""
+
+#: ../messages.c:2889 ../messages.c:3010 ../paging.c:57
+msgid "Send message"
+msgstr ""
+
+#: ../messages.c:2891 ../messages.c:3012
+msgid "Post message"
+msgstr ""
+
+#: ../messages.c:2907
+msgid "--- forwarded message ---"
+msgstr ""
+
+#: ../messages.c:2987
+msgid "Attachments:"
+msgstr ""
+
+#: ../messages.c:3002
+msgid "Attach file:"
+msgstr ""
+
+#: ../messages.c:3005 ../roomops.c:1477 ../roomops.c:1507
+msgid "Add"
+msgstr ""
+
+#: ../messages.c:3074
+msgid "Confirm move of message"
+msgstr ""
+
+#: ../messages.c:3081
+msgid "Move this message to:"
+msgstr ""
+
+#: ../messages.c:3127
+#, c-format
+msgid "The message was not moved."
+msgstr ""
+
+#: ../netconf.c:68 ../netconf.c:183
+msgid "Add a new node"
+msgstr ""
+
+#: ../netconf.c:75 ../netconf.c:129 ../siteconfig.c:112
+#, c-format
+msgid "Node name"
+msgstr ""
+
+#: ../netconf.c:77 ../netconf.c:133
+msgid "Shared secret"
+msgstr ""
+
+#: ../netconf.c:79 ../netconf.c:137
+msgid "Host or IP address"
+msgstr ""
+
+#: ../netconf.c:81 ../netconf.c:141
+msgid "Port number"
+msgstr ""
+
+#: ../netconf.c:84
+msgid "Add node"
+msgstr ""
+
+#: ../netconf.c:110
+msgid "Edit node configuration for "
+msgstr ""
+
+#: ../netconf.c:176
+msgid "Network configuration"
+msgstr ""
+
+#: ../netconf.c:189
+msgid "Currently configured nodes"
+msgstr ""
+
+#: ../netconf.c:204
+msgid "(Edit)"
+msgstr ""
+
+#: ../netconf.c:229
+msgid "Confirm delete"
+msgstr ""
+
+#: ../netconf.c:236
+msgid "Are you sure you want to delete "
+msgstr ""
+
+#: ../netconf.c:243
+msgid "Yes"
+msgstr ""
+
+#: ../netconf.c:246
+msgid "No"
+msgstr ""
+
+#: ../netconf.c:309
+msgid "Back to menu"
+msgstr ""
+
+#: ../notes.c:126
+msgid "An error has occurred."
+msgstr ""
+
+#: ../paging.c:24
+msgid "Send instant message"
+msgstr ""
+
+#: ../paging.c:33
+msgid "Send an instant message to: "
+msgstr ""
+
+#: ../paging.c:49
+msgid "Enter message text:"
+msgstr ""
+
+#: ../paging.c:89
+msgid "Message was not sent."
+msgstr ""
+
+#: ../paging.c:99
+msgid "Message has been sent to "
+msgstr ""
+
+#: ../paging.c:110
+msgid "[ close window ]"
+msgstr ""
+
+#: ../paging.c:170
+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 ""
+
+#: ../paging.c:309 ../paging.c:471
+msgid "An error occurred while setting up the chat socket."
+msgstr ""
+
+#: ../paging.c:336
+msgid "Now exiting chat mode."
+msgstr ""
+
+#: ../paging.c:507
+msgid "Send"
+msgstr ""
+
+#: ../paging.c:508
+msgid "Help"
+msgstr ""
+
+#: ../paging.c:509
+msgid "List users"
+msgstr ""
+
+#: ../preferences.c:205
+msgid "Preferences and settings"
+msgstr ""
+
+#: ../preferences.c:226
+msgid "Room list view"
+msgstr ""
+
+#: ../preferences.c:232
+msgid "Tree (folders) view"
+msgstr ""
+
+#: ../preferences.c:238
+msgid "Table (rooms) view"
+msgstr ""
+
+#: ../preferences.c:249
+msgid "Calendar hour format"
+msgstr ""
+
+#: ../preferences.c:255
+msgid "12 hour (am/pm)"
+msgstr ""
+
+#: ../preferences.c:261
+msgid "24 hour"
+msgstr ""
+
+#: ../preferences.c:272
+msgid "Calendar day view begins at:"
+msgstr ""
+
+#: ../preferences.c:301
+msgid "Calendar day view ends at:"
+msgstr ""
+
+#: ../preferences.c:330
+msgid "Attach signature to email messages?"
+msgstr ""
+
+#: ../preferences.c:348
+msgid "No signature"
+msgstr ""
+
+#: ../preferences.c:354
+msgid "Use this signature:"
+msgstr ""
+
+#: ../preferences.c:378
+msgid "Default character set for email headers:"
+msgstr ""
+
+#: ../preferences.c:388
+msgid "Change"
+msgstr ""
+
+#: ../preferences.c:407
+msgid "Cancelled.  No settings were changed."
+msgstr ""
+
+#: ../roomops.c:19
+msgid "Bulletin Board"
+msgstr ""
+
+#: ../roomops.c:20
+msgid "Mail Folder"
+msgstr ""
+
+#: ../roomops.c:21
+msgid "Address Book"
+msgstr ""
+
+#: ../roomops.c:23
+msgid "Task List"
+msgstr ""
+
+#: ../roomops.c:24
+msgid "Notes List"
+msgstr ""
+
+#: ../roomops.c:25
+msgid "Wiki"
+msgstr ""
+
+#: ../roomops.c:26
+msgid "Calendar List"
+msgstr ""
+
+#: ../roomops.c:258
+msgid "Zapped (forgotten) rooms"
+msgstr ""
+
+#: ../roomops.c:264
+msgid "Click on any room to un-zap it and goto that room.\n"
+msgstr ""
+
+#: ../roomops.c:358
+msgid "View as:"
+msgstr ""
+
+#: ../roomops.c:429
+#, c-format
+msgid "%d new of %d messages"
+msgstr ""
+
+#: ../roomops.c:473
+msgid "View contacts"
+msgstr ""
+
+#: ../roomops.c:484
+msgid "Day view"
+msgstr ""
+
+#: ../roomops.c:493
+msgid "Month view"
+msgstr ""
+
+#: ../roomops.c:504
+msgid "Calendar list"
+msgstr ""
+
+#: ../roomops.c:515
+msgid "View tasks"
+msgstr ""
+
+#: ../roomops.c:526
+msgid "View notes"
+msgstr ""
+
+#: ../roomops.c:537
+msgid "View message list"
+msgstr ""
+
+#: ../roomops.c:548
+msgid "Wiki home"
+msgstr ""
+
+#: ../roomops.c:573
+msgid "Add new contact"
+msgstr ""
+
+#: ../roomops.c:583
+msgid "Add new event"
+msgstr ""
+
+#: ../roomops.c:592
+msgid "Add new task"
+msgstr ""
+
+#: ../roomops.c:601
+msgid "Add new note"
+msgstr ""
+
+#: ../roomops.c:612
+msgid "Edit this page"
+msgstr ""
+
+#: ../roomops.c:634
+msgid ""
+"Leave all messages marked as unread, go to next room with unread messages"
+msgstr ""
+
+#: ../roomops.c:635
+msgid "Skip this room"
+msgstr ""
+
+#: ../roomops.c:645
+msgid "Mark all messages as read, go to next room with unread messages"
+msgstr ""
+
+#: ../roomops.c:1018
+msgid "Configuration"
+msgstr ""
+
+#: ../roomops.c:1034
+msgid "Message expire policy"
+msgstr ""
+
+#: ../roomops.c:1050
+msgid "Access controls"
+msgstr ""
+
+#: ../roomops.c:1066
+msgid "Sharing"
+msgstr ""
+
+#: ../roomops.c:1082
+msgid "Mailing list service"
+msgstr ""
+
+#: ../roomops.c:1104
+msgid "Are you sure you want to delete this room?"
+msgstr ""
+
+#: ../roomops.c:1106
+msgid "Delete this room"
+msgstr ""
+
+#: ../roomops.c:1109
+msgid "Set or change the icon for this room's banner"
+msgstr ""
+
+#: ../roomops.c:1112
+msgid "Edit this room's Info file"
+msgstr ""
+
+#: ../roomops.c:1121 ../roomops.c:1954
+msgid "Name of room: "
+msgstr ""
+
+#: ../roomops.c:1128 ../roomops.c:1958
+msgid "Resides on floor: "
+msgstr ""
+
+#: ../roomops.c:1142 ../roomops.c:2000
+msgid "Type of room:"
+msgstr ""
+
+#: ../roomops.c:1149
+msgid "Public room"
+msgstr ""
+
+#: ../roomops.c:1157
+msgid "Private - guess name"
+msgstr ""
+
+#: ../roomops.c:1164
+msgid "Private - require password:"
+msgstr ""
+
+#: ../roomops.c:1174 ../roomops.c:2031
+msgid "Private - invitation only"
+msgstr ""
+
+#: ../roomops.c:1178
+msgid "If private, cause current users to forget room"
+msgstr ""
+
+#: ../roomops.c:1186
+msgid "Preferred users only"
+msgstr ""
+
+#: ../roomops.c:1192
+msgid "Read-only room"
+msgstr ""
+
+#: ../roomops.c:1199
+msgid "File directory room"
+msgstr ""
+
+#: ../roomops.c:1202
+msgid "Directory name: "
+msgstr ""
+
+#: ../roomops.c:1210
+msgid "Uploading allowed"
+msgstr ""
+
+#: ../roomops.c:1216
+msgid "Downloading allowed"
+msgstr ""
+
+#: ../roomops.c:1222
+msgid "Visible directory"
+msgstr ""
+
+#: ../roomops.c:1231
+msgid "Network shared room"
+msgstr ""
+
+#: ../roomops.c:1237
+msgid "Permanent (does not auto-purge)"
+msgstr ""
+
+#: ../roomops.c:1242
+msgid "Anonymous messages"
+msgstr ""
+
+#: ../roomops.c:1250
+msgid "No anonymous messages"
+msgstr ""
+
+#: ../roomops.c:1256
+msgid "All messages are anonymous"
+msgstr ""
+
+#: ../roomops.c:1262
+msgid "Prompt user when entering messages"
+msgstr ""
+
+#: ../roomops.c:1268
+msgid "Room aide: "
+msgstr ""
+
+#: ../roomops.c:1340
+msgid "Shared with"
+msgstr ""
+
+#: ../roomops.c:1343
+msgid "Not shared with"
+msgstr ""
+
+#: ../roomops.c:1348 ../roomops.c:1393
+msgid "Remote node name"
+msgstr ""
+
+#: ../roomops.c:1350 ../roomops.c:1395
+msgid "Remote room name"
+msgstr ""
+
+#: ../roomops.c:1352 ../roomops.c:1397
+msgid "Actions"
+msgstr ""
+
+#: ../roomops.c:1385
+msgid "Unshare"
+msgstr ""
+
+#: ../roomops.c:1422
+msgid "Share"
+msgstr ""
+
+#: ../roomops.c:1430
+msgid "Notes:"
+msgstr ""
+
+#: ../roomops.c:1431
+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. "
+"<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.</UL></I><br />\n"
+msgstr ""
+
+#: ../roomops.c:1452
+msgid ""
+"<i>The contents of this room are being mailed <b>as individual messages</b> "
+"to the following list recipients:</i><br /><br />\n"
+msgstr ""
+
+#: ../roomops.c:1469 ../roomops.c:1499
+msgid "(remove)"
+msgstr ""
+
+#: ../roomops.c:1482
+msgid ""
+"<i>The contents of this room are being mailed <b>in digest form</b> to the "
+"following list recipients:</i><br /><br />\n"
+msgstr ""
+
+#: ../roomops.c:1513
+msgid ""
+"This room is configured to allow self-service subscribe/unsubscribe requests."
+msgstr ""
+
+#: ../roomops.c:1516
+msgid "Click to disable."
+msgstr ""
+
+#: ../roomops.c:1518
+msgid "The URL for subscribe/unsubscribe is: "
+msgstr ""
+
+#: ../roomops.c:1524
+msgid ""
+"This room is <i>not</i> configured to allow self-service subscribe/"
+"unsubscribe requests."
+msgstr ""
+
+#: ../roomops.c:1528
+msgid "Click to enable."
+msgstr ""
+
+#: ../roomops.c:1557
+msgid "Message expire policy for this room"
+msgstr ""
+
+#: ../roomops.c:1563
+msgid "Use the default policy for this floor"
+msgstr ""
+
+#: ../roomops.c:1567 ../roomops.c:1594 ../siteconfig.c:501 ../siteconfig.c:526
+#, c-format
+msgid "Never automatically expire messages"
+msgstr ""
+
+#: ../roomops.c:1571 ../roomops.c:1598 ../siteconfig.c:505 ../siteconfig.c:530
+#, c-format
+msgid "Expire by message count"
+msgstr ""
+
+#: ../roomops.c:1575 ../roomops.c:1602 ../siteconfig.c:509 ../siteconfig.c:534
+#, c-format
+msgid "Expire by message age"
+msgstr ""
+
+#: ../roomops.c:1577 ../roomops.c:1604 ../siteconfig.c:511 ../siteconfig.c:536
+#, c-format
+msgid "Number of messages or days: "
+msgstr ""
+
+#: ../roomops.c:1584
+msgid "Message expire policy for this floor"
+msgstr ""
+
+#: ../roomops.c:1590
+msgid "Use the system default"
+msgstr ""
+
+#: ../roomops.c:1665 ../roomops.c:3037
+msgid "Cancelled.  Changes were not saved."
+msgstr ""
+
+#: ../roomops.c:1804
+msgid "Your changes have been saved."
+msgstr ""
+
+#: ../roomops.c:1836
+#, c-format
+msgid "<B><I>User %s kicked out of room %s.</I></B>\n"
+msgstr ""
+
+#: ../roomops.c:1850
+#, c-format
+msgid "<B><I>User %s invited to room %s.</I></B>\n"
+msgstr ""
+
+#: ../roomops.c:1878
+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 ""
+
+#: ../roomops.c:1898
+msgid "Kick"
+msgstr ""
+
+#: ../roomops.c:1902
+msgid ""
+"To grant another user access to this room, enter the user name in the box "
+"below and click 'Invite'."
+msgstr ""
+
+#: ../roomops.c:1908
+msgid "Invite:"
+msgstr ""
+
+#: ../roomops.c:1913
+msgid "Invite"
+msgstr ""
+
+#: ../roomops.c:1977
+msgid "Default view for room: "
+msgstr ""
+
+#: ../roomops.c:2009
+msgid "Public (automatically appears to everyone)"
+msgstr ""
+
+#: ../roomops.c:2016
+msgid "Private - hidden (accessible to anyone who knows its name)"
+msgstr ""
+
+#: ../roomops.c:2023
+msgid "Private - require password: "
+msgstr ""
+
+#: ../roomops.c:2039
+msgid "Personal (mailbox for you only)"
+msgstr ""
+
+#: ../roomops.c:2044
+msgid "Create new room"
+msgstr ""
+
+#: ../roomops.c:2112
+msgid "Cancelled.  No new room was created."
+msgstr ""
+
+#: ../roomops.c:2155
+msgid "Go to a hidden room"
+msgstr ""
+
+#: ../roomops.c:2166
+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 ""
+
+#: ../roomops.c:2178
+msgid "Enter room name:"
+msgstr ""
+
+#: ../roomops.c:2185
+msgid "Enter room password:"
+msgstr ""
+
+#: ../roomops.c:2194
+msgid "Go there"
+msgstr ""
+
+#: ../roomops.c:2247
+msgid "Zap (forget/unsubscribe) the current room"
+msgstr ""
+
+#: ../roomops.c:2252
+#, c-format
+msgid ""
+"If you select this option, <em>%s</em> will disappear from your room list.  "
+"Is this what you wish to do?<br />\n"
+msgstr ""
+
+#: ../roomops.c:2257
+msgid "Zap this room"
+msgstr ""
+
+#: ../roomops.c:2987 ../roomops.c:2993
+msgid "Room list"
+msgstr ""
+
+#: ../roomops.c:2990
+msgid "Folder list"
+msgstr ""
+
+#: ../rss.c:34
+msgid "Email"
+msgstr ""
+
+#: ../rss.c:73
+msgid "Not logged in"
+msgstr ""
+
+#: ../rss.c:92
+msgid "Error retrieving RSS feed: couldn't find messages\n"
+msgstr ""
+
+#: ../siteconfig.c:38
+msgid "Site configuration"
+msgstr ""
+
+#: ../siteconfig.c:61
+msgid "General"
+msgstr ""
+
+#: ../siteconfig.c:62
+msgid "Access"
+msgstr ""
+
+#: ../siteconfig.c:63
+msgid "Network"
+msgstr ""
+
+#: ../siteconfig.c:64
+msgid "Tuning"
+msgstr ""
+
+#: ../siteconfig.c:65
+msgid "Directory"
+msgstr ""
+
+#: ../siteconfig.c:66
+msgid "Auto-purger"
+msgstr ""
+
+#: ../siteconfig.c:67
+msgid "Indexing/Journaling"
+msgstr ""
+
+#: ../siteconfig.c:71
+msgid "General site configuration items"
+msgstr ""
+
+#: ../siteconfig.c:75
+msgid "Access controls and site policy settings"
+msgstr ""
+
+#: ../siteconfig.c:79
+msgid "Network services"
+msgstr ""
+
+#: ../siteconfig.c:80 ../siteconfig.c:90
+msgid ""
+"Changes made on this screen will not take effect until you restart the "
+"Citadel server."
+msgstr ""
+
+#: ../siteconfig.c:85
+msgid "Advanced server fine-tuning controls"
+msgstr ""
+
+#: ../siteconfig.c:89
+msgid "Configure the LDAP connector for Citadel"
+msgstr ""
+
+#: ../siteconfig.c:95
+msgid "Configure automatic expiry of old messages"
+msgstr ""
+
+#: ../siteconfig.c:96
+msgid "These settings may be overridden on a per-floor or per-room basis."
+msgstr ""
+
+#: ../siteconfig.c:100
+msgid "Indexing and Journaling"
+msgstr ""
+
+#: ../siteconfig.c:101
+msgid "Warning: these facilities are resource intensive."
+msgstr ""
+
+#: ../siteconfig.c:119
+#, c-format
+msgid "Fully qualified domain name"
+msgstr ""
+
+#: ../siteconfig.c:126
+#, c-format
+msgid "Human-readable node name"
+msgstr ""
+
+#: ../siteconfig.c:133
+#, c-format
+msgid "Telephone number"
+msgstr ""
+
+#: ../siteconfig.c:140
+#, c-format
+msgid "Automatically grant room-aide status to users who create private rooms"
+msgstr ""
+
+#: ../siteconfig.c:148
+#, c-format
+msgid "Server connection idle timeout (in seconds)"
+msgstr ""
+
+#: ../siteconfig.c:155
+#, c-format
+msgid "Initial access level for new users"
+msgstr ""
+
+#: ../siteconfig.c:169
+#, c-format
+msgid "Require registration for new users"
+msgstr ""
+
+#: ../siteconfig.c:177
+#, c-format
+msgid "Quarantine messages from problem users"
+msgstr ""
+
+#: ../siteconfig.c:185
+#, c-format
+msgid "Name of quarantine room"
+msgstr ""
+
+#: ../siteconfig.c:192
+#, c-format
+msgid "Paginator prompt (for text mode clients)"
+msgstr ""
+
+#: ../siteconfig.c:199
+#, c-format
+msgid "Restrict access to Internet mail"
+msgstr ""
+
+#: ../siteconfig.c:207
+#, c-format
+msgid "Geographic location of this system"
+msgstr ""
+
+#: ../siteconfig.c:214
+#, c-format
+msgid "Name of system administrator"
+msgstr ""
+
+#: ../siteconfig.c:221
+#, c-format
+msgid "Maximum concurrent sessions (0 = no limit)"
+msgstr ""
+
+#: ../siteconfig.c:228
+#, c-format
+msgid "Default user purge time (days)"
+msgstr ""
+
+#: ../siteconfig.c:235
+#, c-format
+msgid "Default room purge time (days)"
+msgstr ""
+
+#: ../siteconfig.c:242
+#, c-format
+msgid "Name of room to log pages"
+msgstr ""
+
+#: ../siteconfig.c:249
+#, c-format
+msgid "Access level required to create rooms"
+msgstr ""
+
+#: ../siteconfig.c:263
+#, c-format
+msgid "Maximum message length"
+msgstr ""
+
+#: ../siteconfig.c:270
+#, c-format
+msgid "Minimum number of worker threads"
+msgstr ""
+
+#: ../siteconfig.c:277
+#, c-format
+msgid "Maximum number of worker threads"
+msgstr ""
+
+#: ../siteconfig.c:284
+#, c-format
+msgid "POP3 listener port (-1 to disable)"
+msgstr ""
+
+#: ../siteconfig.c:291
+#, c-format
+msgid "SMTP MTA port (-1 to disable)"
+msgstr ""
+
+#: ../siteconfig.c:298
+#, c-format
+msgid "Correct forged From: lines during authenticated SMTP"
+msgstr ""
+
+#: ../siteconfig.c:306
+#, c-format
+msgid "Allow aides to zap (forget) rooms"
+msgstr ""
+
+#: ../siteconfig.c:314
+#, c-format
+msgid "IMAP listener port (-1 to disable)"
+msgstr ""
+
+#: ../siteconfig.c:321
+#, c-format
+msgid "Network run frequency (in seconds)"
+msgstr ""
+
+#: ../siteconfig.c:328
+#, c-format
+msgid "Disable self-service user account creation"
+msgstr ""
+
+#: ../siteconfig.c:336
+#, c-format
+msgid "Hour to run database auto-purge"
+msgstr ""
+
+#: ../siteconfig.c:352
+#, c-format
+msgid "Host name of LDAP server (blank to disable)"
+msgstr ""
+
+#: ../siteconfig.c:359
+#, c-format
+msgid "Port number of LDAP server (blank to disable)"
+msgstr ""
+
+#: ../siteconfig.c:366
+#, c-format
+msgid "Base DN"
+msgstr ""
+
+#: ../siteconfig.c:373
+#, c-format
+msgid "Bind DN"
+msgstr ""
+
+#: ../siteconfig.c:380
+#, c-format
+msgid "Password for bind DN"
+msgstr ""
+
+#: ../siteconfig.c:388
+#, c-format
+msgid "Server IP address (0.0.0.0 for 'any')"
+msgstr ""
+
+#: ../siteconfig.c:395
+#, c-format
+msgid "SMTP MSA port (-1 to disable)"
+msgstr ""
+
+#: ../siteconfig.c:402
+#, c-format
+msgid "IMAP over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../siteconfig.c:409
+#, c-format
+msgid "POP3 over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../siteconfig.c:416
+#, c-format
+msgid "SMTP over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../siteconfig.c:423
+#, c-format
+msgid "Enable full text index"
+msgstr ""
+
+#: ../siteconfig.c:431
+#, c-format
+msgid "Automatically delete committed database logs"
+msgstr ""
+
+#: ../siteconfig.c:439
+#, c-format
+msgid "Instantly expunge deleted messages in IMAP"
+msgstr ""
+
+#: ../siteconfig.c:447
+#, c-format
+msgid "Allow unauthenticated SMTP clients to spoof this site's domains"
+msgstr ""
+
+#: ../siteconfig.c:455
+#, c-format
+msgid "Perform journaling of email messages"
+msgstr ""
+
+#: ../siteconfig.c:463
+#, c-format
+msgid "Perform journaling of non-email messages"
+msgstr ""
+
+#: ../siteconfig.c:471
+#, c-format
+msgid "Email destination of journalized messages"
+msgstr ""
+
+#: ../siteconfig.c:497
+#, c-format
+msgid "Default message expire policy for public rooms"
+msgstr ""
+
+#: ../siteconfig.c:518
+#, c-format
+msgid "Default message expire policy for private mailboxes"
+msgstr ""
+
+#: ../siteconfig.c:522
+#, c-format
+msgid "Same policy as public rooms"
+msgstr ""
+
+#: ../siteconfig.c:644
+msgid "Your system configuration has been updated."
+msgstr ""
+
+#: ../subst.c:216
+msgid "ERROR: could not open template "
+msgstr ""
+
+#: ../summary.c:35
+msgid "(nothing)"
+msgstr ""
+
+#: ../summary.c:50
+msgid "Messages"
+msgstr ""
+
+#: ../summary.c:87
+msgid "Who's&nbsp;online&nbsp;now"
+msgstr ""
+
+#: ../summary.c:122
+msgid "(None)"
+msgstr ""
+
+#: ../summary.c:135
+msgid "(This server does not support task lists)"
+msgstr ""
+
+#: ../summary.c:151
+msgid "Today&nbsp;on&nbsp;your&nbsp;calendar"
+msgstr ""
+
+#: ../summary.c:164
+msgid "(Nothing)"
+msgstr ""
+
+#: ../summary.c:176
+msgid "(This server does not support calendars)"
+msgstr ""
+
+#: ../summary.c:188
+msgid "About&nbsp;this&nbsp;server"
+msgstr ""
+
+#: ../summary.c:192
+#, c-format
+msgid ""
+"You are connected to %s, running %s with %s, and located in %s.  Your system "
+"administrator is %s."
+msgstr ""
+
+#: ../summary.c:259
+#, c-format
+msgid "Summary page for %s"
+msgstr ""
+
+#: ../sysmsgs.c:40
+#, c-format
+msgid "Edit %s"
+msgstr ""
+
+#: ../sysmsgs.c:44
+#, c-format
+msgid ""
+"Enter %s below.  Text is formatted to the reader's screen width.  To defeat "
+"the formatting, indent a line at least one space."
+msgstr ""
+
+#: ../sysmsgs.c:79
+#, c-format
+msgid "Cancelled.  %s was not saved."
+msgstr ""
+
+#: ../sysmsgs.c:98
+#, c-format
+msgid "%s has been saved."
+msgstr ""
+
+#: ../useredit.c:31
+msgid "Edit or delete users"
+msgstr ""
+
+#: ../useredit.c:40
+msgid "Add users"
+msgstr ""
+
+#: ../useredit.c:43
+msgid ""
+"To create a new user account, enter the desired user name in the box below "
+"and click 'Create'."
+msgstr ""
+
+#: ../useredit.c:48
+msgid "New user: "
+msgstr ""
+
+#: ../useredit.c:51
+msgid "Create"
+msgstr ""
+
+#: ../useredit.c:57
+msgid "Edit or Delete users"
+msgstr ""
+
+#: ../useredit.c:60
+msgid ""
+"To edit an existing user account, select the user name from the list and "
+"click 'Edit'."
+msgstr ""
+
+#: ../useredit.c:83
+msgid "Edit configuration"
+msgstr ""
+
+#: ../useredit.c:84
+msgid "Edit address book entry"
+msgstr ""
+
+#: ../useredit.c:86
+msgid "Delete user"
+msgstr ""
+
+#: ../useredit.c:86
+msgid "Delete this user?"
+msgstr ""
+
+#: ../useredit.c:204
+msgid ""
+"An error occurred while trying to create or edit this address book entry."
+msgstr ""
+
+#: ../useredit.c:283
+msgid "Edit user account: "
+msgstr ""
+
+#: ../useredit.c:303
+msgid "Password"
+msgstr ""
+
+#: ../useredit.c:310
+msgid "Permission to send Internet mail"
+msgstr ""
+
+#: ../useredit.c:319
+msgid "Number of logins"
+msgstr ""
+
+#: ../useredit.c:326
+msgid "Messages submitted"
+msgstr ""
+
+#: ../useredit.c:333
+msgid "Access level"
+msgstr ""
+
+#: ../useredit.c:347
+msgid "User ID number"
+msgstr ""
+
+#: ../useredit.c:355
+msgid "Date and time of last login"
+msgstr ""
+
+#: ../useredit.c:370
+msgid "Auto-purge after this many days"
+msgstr ""
+
+#: ../useredit.c:402
+msgid "Changes were not saved."
+msgstr ""
+
+#: ../useredit.c:486
+#, c-format
+msgid "A new user has been created."
+msgstr ""
+
+#: ../userlist.c:48
+#, c-format
+msgid "User list for %s"
+msgstr ""
+
+#: ../userlist.c:66
+msgid "User Name"
+msgstr ""
+
+#: ../userlist.c:67
+msgid "Number"
+msgstr ""
+
+#: ../userlist.c:68
+msgid "Access Level"
+msgstr ""
+
+#: ../userlist.c:69
+msgid "Last Login"
+msgstr ""
+
+#: ../userlist.c:70
+msgid "Total Logins"
+msgstr ""
+
+#: ../userlist.c:71
+msgid "Total Posts"
+msgstr ""
+
+#: ../userlist.c:129
+msgid "User profile"
+msgstr ""
+
+#: ../userlist.c:165
+#, c-format
+msgid "Click here to send an instant message to %s"
+msgstr ""
+
+#: ../vcard_edit.c:184
+msgid "Edit contact information"
+msgstr ""
+
+#: ../vcard_edit.c:200
+msgid "Prefix"
+msgstr ""
+
+#: ../vcard_edit.c:200
+msgid "First"
+msgstr ""
+
+#: ../vcard_edit.c:200
+msgid "Middle"
+msgstr ""
+
+#: ../vcard_edit.c:200
+msgid "Last"
+msgstr ""
+
+#: ../vcard_edit.c:200
+msgid "Suffix"
+msgstr ""
+
+#: ../vcard_edit.c:221
+msgid "Display name:"
+msgstr ""
+
+#: ../vcard_edit.c:228
+msgid "Title:"
+msgstr ""
+
+#: ../vcard_edit.c:235
+msgid "Organization:"
+msgstr ""
+
+#: ../vcard_edit.c:246
+msgid "PO box:"
+msgstr ""
+
+#: ../vcard_edit.c:262
+msgid "City:"
+msgstr ""
+
+#: ../vcard_edit.c:268
+msgid "State:"
+msgstr ""
+
+#: ../vcard_edit.c:274
+msgid "ZIP code:"
+msgstr ""
+
+#: ../vcard_edit.c:280
+msgid "Country:"
+msgstr ""
+
+#: ../vcard_edit.c:290
+msgid "Home telephone:"
+msgstr ""
+
+#: ../vcard_edit.c:296
+msgid "Work telephone:"
+msgstr ""
+
+#: ../vcard_edit.c:307
+msgid "Primary Internet e-mail address"
+msgstr ""
+
+#: ../vcard_edit.c:314
+msgid "Internet e-mail aliases"
+msgstr ""
+
+#: ../webcit.c:685
+#, c-format
+msgid "An error occurred while retrieving this part: %s\n"
+msgstr ""
+
+#: ../webcit.c:771
+msgid "Make this my start page"
+msgstr ""
+
+#: ../webcit.c:790
+msgid "You no longer have a start page selected."
+msgstr ""
+
+#: ../webcit.c:826
+msgid "Authorization Required"
+msgstr ""
+
+#: ../webcit.c:828
+#, c-format
+msgid ""
+"The resource you requested requires a valid username and password. You could "
+"not be logged in: %s\n"
+msgstr ""
+
+#: ../webcit.c:1247
+#, 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 ""
+
+#: ../webcit.c:1484 ../webcit.c:1486
+msgid "Room info"
+msgstr ""
+
+#: ../webcit.c:1489 ../webcit.c:1491
+msgid "Your bio"
+msgstr ""
+
+#: ../webcit.c:1499
+msgid "your photo"
+msgstr ""
+
+#: ../webcit.c:1505
+msgid "the icon for this room"
+msgstr ""
+
+#: ../webcit.c:1519
+msgid "the icon for this floor"
+msgstr ""
+
+#: ../who.c:27
+msgid "User name"
+msgstr ""
+
+#: ../who.c:28
+msgid "Room"
+msgstr ""
+
+#: ../who.c:29
+msgid "From host"
+msgstr ""
+
+#: ../who.c:62
+msgid "(kill)"
+msgstr ""
+
+#: ../who.c:65
+msgid "(edit)"
+msgstr ""
+
+#: ../who.c:141
+msgid "Do you really want to kill this session?"
+msgstr ""
+
+#: ../who.c:151
+#, c-format
+msgid "Users currently on %s"
+msgstr ""
+
+#: ../who.c:166
+#, c-format
+msgid ""
+"Click on a name to read user info.  Click on %s to send an instant message "
+"to that user."
+msgstr ""
+
+#: ../who.c:228
+msgid "Edit your session display"
+msgstr ""
+
+#: ../who.c:232
+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 ""
+
+#: ../who.c:244
+msgid "Room name:"
+msgstr ""
+
+#: ../who.c:249
+msgid "Change room name"
+msgstr ""
+
+#: ../who.c:253
+msgid "Host name:"
+msgstr ""
+
+#: ../who.c:258
+msgid "Change host name"
+msgstr ""
+
+#: ../who.c:268
+msgid "Change user name"
+msgstr ""
+
+#: ../wiki.c:64
+#, c-format
+msgid "There is no room called '%s'."
+msgstr ""
+
+#: ../wiki.c:74
+#, c-format
+msgid "'%s' is not a Wiki room."
+msgstr ""
+
+#: ../wiki.c:100
+#, c-format
+msgid "There is no page called '%s' here."
+msgstr ""
+
+#: ../wiki.c:102
+msgid ""
+"Select the 'Edit this page' link in the room banner if you would like to "
+"create this page."
+msgstr ""
diff --git a/webcit/po/es.po b/webcit/po/es.po
new file mode 100644 (file)
index 0000000..b39ea82
--- /dev/null
@@ -0,0 +1,2828 @@
+# WebCit
+# Copyright (C) 2006 The Citadel Project - http://www.citadel.org
+# This file is distributed under the terms of the GNU General Public License v2.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: WEBCIT 6.40\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-03-14 22:17-0500\n"
+"PO-Revision-Date: 2006-04-13 16:23-0500\n"
+"Last-Translator: Gabriel C. Huertas <gabrielhuertas@terra.es>\n"
+"Language-Team: Spanish <es@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../src/auth.c:23
+msgid "Deleted"
+msgstr "Borrado"
+
+#: ../src/auth.c:24 ../src/auth.c:72
+msgid "New User"
+msgstr "Nuevo Usuario"
+
+#: ../src/auth.c:25
+msgid "Problem User"
+msgstr "Usuario Problemático"
+
+#: ../src/auth.c:26
+msgid "Local User"
+msgstr "Usuario Local"
+
+#: ../src/auth.c:27
+msgid "Network User"
+msgstr "Usuario de la red"
+
+#: ../src/auth.c:28
+msgid "Preferred User"
+msgstr "Usuario Preferente"
+
+#: ../src/auth.c:29
+msgid "Aide"
+msgstr "Administrador"
+
+#: ../src/auth.c:52
+#, c-format
+msgid ""
+"<ul><li><b>If you already have an account on %s</b>, 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.<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;Login.&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>"
+
+#: ../src/auth.c:68 ../src/who.c:263
+msgid "User name:"
+msgstr "Nombre de usuario:"
+
+#: ../src/auth.c:69
+msgid "Password:"
+msgstr "Contraseña"
+
+#: ../src/auth.c:70
+msgid "Language:"
+msgstr "Lenguaje"
+
+#: ../src/auth.c:71
+msgid "Login"
+msgstr "Login"
+
+#: ../src/auth.c:73 ../src/paging.c:510
+msgid "Exit"
+msgstr "Salir"
+
+#: ../src/auth.c:75
+#, c-format
+msgid "%s - powered by Citadel"
+msgstr "%s - Motor Citadel"
+
+#: ../src/auth.c:174 ../src/auth.c:542
+msgid "Blank passwords are not allowed."
+msgstr "No se permiten contraseñas en blanco"
+
+#: ../src/auth.c:195
+msgid "Your password was not accepted."
+msgstr "Su contraseña no ha sido aceptada"
+
+#: ../src/auth.c:303
+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."
+
+#: ../src/auth.c:310
+msgid "Log in again"
+msgstr "Iniciar acceso de nuevo"
+
+#: ../src/auth.c:313
+msgid "Close window"
+msgstr "Cerrar ventana"
+
+#: ../src/auth.c:334 ../src/mainmenu.c:241
+msgid "Validate new users"
+msgstr "Validación de nuevos usuarios"
+
+#: ../src/auth.c:354
+msgid "No users require validation at this time."
+msgstr "Ningún usuario requiere validación por el momento"
+
+#: ../src/auth.c:395
+#, c-format
+msgid "Current access level: %d (%s)\n"
+msgstr "Nivel actual de acceso: %d (%s)\n"
+
+#: ../src/auth.c:403
+msgid "Select access level for this user:"
+msgstr "Seleccione el nivel de acceso para este usuario:"
+
+#: ../src/auth.c:466 ../src/mainmenu.c:137
+msgid "Change your password"
+msgstr "Cambie su contraseña"
+
+#: ../src/auth.c:495
+msgid "Enter new password:"
+msgstr "Introducir nueva contraseña"
+
+#: ../src/auth.c:499
+msgid "Enter it again to confirm:"
+msgstr "Introdúzcala de nuevo como confirmación:"
+
+#: ../src/auth.c:504
+msgid "Change password"
+msgstr "Cambia contraseña"
+
+#: ../src/auth.c:506 ../src/calendar.c:616 ../src/event.c:390
+#: ../src/graphics.c:58 ../src/iconbar.c:712 ../src/mainmenu.c:300
+#: ../src/messages.c:2942 ../src/messages.c:3063 ../src/messages.c:3151
+#: ../src/netconf.c:86 ../src/netconf.c:149 ../src/paging.c:58
+#: ../src/preferences.c:389 ../src/roomops.c:1280 ../src/roomops.c:1608
+#: ../src/roomops.c:2041 ../src/roomops.c:2190 ../src/roomops.c:2254
+#: ../src/siteconfig.c:564 ../src/sysmsgs.c:59 ../src/useredit.c:381
+#: ../src/vcard_edit.c:336 ../src/who.c:273
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: ../src/auth.c:523
+msgid "Cancelled.  Password was not changed."
+msgstr "Cancelado. No se cambió la contraseña."
+
+#: ../src/auth.c:534
+msgid "They don't match.  Password was not changed."
+msgstr "No cuadran. La contraseña no se cambia."
+
+#: ../src/availability.c:140
+msgid "availability unknown"
+msgstr "disponibilidad desconocida"
+
+#: ../src/availability.c:161
+msgid "free"
+msgstr "libre"
+
+#: ../src/availability.c:171
+msgid "BUSY"
+msgstr "OCUPADO"
+
+#: ../src/calendar.c:24
+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,pero"
+"los 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"
+
+#: ../src/calendar.c:38
+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"
+
+#: ../src/calendar.c:50
+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"
+
+#: ../src/calendar.c:107
+msgid "Meeting invitation"
+msgstr "Invitación a reunión"
+
+#: ../src/calendar.c:116
+msgid "Attendee's reply to your invitation"
+msgstr "Respuesta en atención a la invitación"
+
+#: ../src/calendar.c:125
+msgid "Published event"
+msgstr "Evento publicado"
+
+#: ../src/calendar.c:130
+msgid "This is an unknown type of calendar item."
+msgstr "Este es un elemento de calendario desconocido."
+
+#: ../src/calendar.c:139 ../src/calendar.c:560
+msgid "Summary:"
+msgstr "Sumario"
+
+#: ../src/calendar.c:148
+msgid "Location:"
+msgstr "Localización"
+
+#: ../src/calendar.c:174
+msgid "Date:"
+msgstr "Fecha"
+
+#: ../src/calendar.c:181
+msgid "Starting date/time:"
+msgstr "Fecha/hora de comienzo:"
+
+#: ../src/calendar.c:192
+msgid "Ending date/time:"
+msgstr "Fecha/hora de finalización:"
+
+#: ../src/calendar.c:201 ../src/calendar.c:596
+msgid "Description:"
+msgstr "Descripción:"
+
+#: ../src/calendar.c:210
+msgid "Attendee:"
+msgstr "Attn.:"
+
+#: ../src/calendar.c:250
+#, 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."
+
+#: ../src/calendar.c:254
+#, 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."
+
+#: ../src/calendar.c:259
+msgid "Update:"
+msgstr "Actualizar:"
+
+#: ../src/calendar.c:260
+msgid "CONFLICT:"
+msgstr "CONFLICTO"
+
+#: ../src/calendar.c:278
+msgid "How would you like to respond to this invitation?"
+msgstr "¿Como le gustaría responder a esta invitación?"
+
+#: ../src/calendar.c:279
+msgid "Accept"
+msgstr "Aceptar"
+
+#: ../src/calendar.c:280
+msgid "Tentative"
+msgstr "Tentativa"
+
+#: ../src/calendar.c:281
+msgid "Decline"
+msgstr "Declinar"
+
+#: ../src/calendar.c:305
+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."
+
+#: ../src/calendar.c:306
+msgid "Update"
+msgstr "Actualizar"
+
+#: ../src/calendar.c:307
+msgid "Ignore"
+msgstr "Ignorar"
+
+#: ../src/calendar.c:334
+msgid "There was an error parsing this calendar item."
+msgstr "Se produjo un error al pasar este elemento de calendario."
+
+#: ../src/calendar.c:361
+msgid "Respond to meeting request"
+msgstr "Responder a convocatoria de reunión"
+
+#: ../src/calendar.c:380
+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"
+#: ../src/calendar.c:384
+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"
+#: ../src/calendar.c:388
+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"
+
+#: ../src/calendar.c:393
+msgid "A reply has been sent to the meeting organizer."
+msgstr "Se envió una respuesta al organizador de la reunión."
+
+#: ../src/calendar.c:403 ../src/calendar.c:457
+msgid "Return to messages"
+msgstr "Volver a mensajes"
+
+#: ../src/calendar.c:422
+msgid "Update your calendar with this RSVP"
+msgstr "Actualizar el calendario con este RVSP"
+
+#: ../src/calendar.c:441
+msgid "Your calendar has been updated to reflect this RSVP."
+msgstr "Su calendario se actualizó para reflegar este RSVP. "
+
+#: ../src/calendar.c:443
+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ó "
+
+#: ../src/calendar.c:544
+msgid "Edit task"
+msgstr "Editar tarea"
+
+#: ../src/calendar.c:571
+msgid "Start date:"
+msgstr "Fecha de inicio"
+
+#: ../src/calendar.c:584
+msgid "Due date:"
+msgstr "Fecha finalización"
+
+#: ../src/calendar.c:614 ../src/event.c:387
+msgid "Save"
+msgstr "Salvar"
+
+#: ../src/calendar.c:615 ../src/event.c:388 ../src/messages.c:950
+#: ../src/messages.c:2327
+msgid "Delete"
+msgstr "Borrar"
+
+#: ../src/calendar_tools.c:73
+msgid "Month: "
+msgstr "Mes"
+
+#: ../src/calendar_tools.c:87
+msgid "Day: "
+msgstr "Día"
+
+#: ../src/calendar_tools.c:97
+msgid "Year: "
+msgstr "Año"
+
+#: ../src/calendar_tools.c:115
+msgid "Hour: "
+msgstr "Hora"
+
+#: ../src/calendar_tools.c:135
+msgid "Minute: "
+msgstr "Minuto"
+
+#: ../src/calendar_tools.c:204
+msgid "(status unknown)"
+msgstr "(estado desconocido)"
+
+#: ../src/calendar_tools.c:220
+msgid "(needs action)"
+msgstr "(requiere actuación)"
+
+#: ../src/calendar_tools.c:223
+msgid "(accepted)"
+msgstr "(aceptado)"
+
+#: ../src/calendar_tools.c:226
+msgid "(declined)"
+msgstr "(declinado)"
+
+#: ../src/calendar_tools.c:229
+msgid "(tenative)"
+msgstr "(tentativo)"
+
+#: ../src/calendar_tools.c:232
+msgid "(delegated)"
+msgstr "(delegado)"
+
+#: ../src/calendar_tools.c:235
+msgid "(completed)"
+msgstr "(completado)"
+
+#: ../src/calendar_tools.c:238
+msgid "(in process)"
+msgstr "(en proceso)"
+
+#: ../src/calendar_tools.c:241
+msgid "(none)"
+msgstr "(ninguno)"
+
+#: ../src/calendar_view.c:17
+msgid "The calendar view is not available."
+msgstr "La visualización del calendario no está disponible."
+
+#: ../src/calendar_view.c:24
+msgid "The tasks view is not available."
+msgstr "La visualización de tareas no está disponible."
+
+#: ../src/calendar_view.c:435
+msgid "Week"
+msgstr "Semana"
+
+#: ../src/calendar_view.c:437
+msgid "Hours"
+msgstr "Horas"
+
+#: ../src/calendar_view.c:438 ../src/messages.c:2322
+msgid "Subject"
+msgstr "Asunto"
+
+#: ../src/calendar_view.c:439 ../src/event.c:164
+msgid "Start"
+msgstr "Comienzo"
+
+#: ../src/calendar_view.c:440 ../src/event.c:218
+msgid "End"
+msgstr "Fin"
+
+#: ../src/calendar_view.c:930
+msgid "Name of task"
+msgstr "Nombre de la tarea"
+
+#: ../src/calendar_view.c:932
+msgid "Date due"
+msgstr "Fecha coclusión"
+
+#: ../src/event.c:76 ../src/paging.c:78
+msgid "Add or edit an event"
+msgstr "Añadir o editar un evento"
+
+#: ../src/event.c:142 ../src/iconbar.c:123 ../src/iconbar.c:539
+msgid "Summary"
+msgstr "Sumario"
+
+#: ../src/event.c:153
+msgid "Location"
+msgstr "Localización"
+
+#: ../src/event.c:207
+msgid "All day event"
+msgstr "Todos los eventos del día"
+
+#: ../src/event.c:246 ../src/iconbar.c:199 ../src/iconbar.c:586
+msgid "Notes"
+msgstr "Notas"
+
+#: ../src/event.c:288
+msgid "Organizer"
+msgstr "Organizador"
+
+#: ../src/event.c:293
+msgid "(you are the organizer)"
+msgstr "(tu eres el organizador)"
+
+#: ../src/event.c:311
+msgid "Show time as:"
+msgstr "Mostrar hora como:"
+
+#: ../src/event.c:333
+msgid "Free"
+msgstr "Libre"
+
+#: ../src/event.c:340
+msgid "Busy"
+msgstr "Ocupado"
+
+#: ../src/event.c:346
+msgid "Attendees"
+msgstr "Attn."
+
+#: ../src/event.c:349
+msgid "(One per line)"
+msgstr "(Uno por línea)"
+
+#: ../src/event.c:389
+msgid "Check attendee availability"
+msgstr "Comprobar posibilidad de atender"
+
+#: ../src/floors.c:34
+msgid "Add/change/delete floors"
+msgstr "Añadir/cambiar/borrar/niveles"
+
+#: ../src/floors.c:51 ../src/siteconfig.c:49 ../src/vcard_edit.c:78
+#: ../src/wiki.c:66 ../src/wiki.c:76
+msgid "Error"
+msgstr "Error"
+
+#: ../src/floors.c:62
+msgid "Floor number"
+msgstr "Número de nivel"
+
+#: ../src/floors.c:64
+msgid "Floor name"
+msgstr "Nombre de nivel"
+
+#: ../src/floors.c:66
+msgid "Number of rooms"
+msgstr "Número de salas"
+
+#: ../src/floors.c:68
+msgid "Floor CSS"
+msgstr "Sala CSS"
+
+#: ../src/floors.c:81
+msgid "(delete floor)"
+msgstr "(borrar sala)"
+
+#: ../src/floors.c:87
+msgid "(edit graphic)"
+msgstr "(editar gráfico)"
+
+#: ../src/floors.c:100
+msgid "Change name"
+msgstr "Cambiar nombre"
+
+#: ../src/floors.c:113
+msgid "Change CSS"
+msgstr "Cambiar CSS"
+
+#: ../src/floors.c:125
+msgid "Create new floor"
+msgstr "Crear nuevo nivel"
+
+#: ../src/floors.c:146
+#, c-format
+msgid "Floor has been deleted."
+msgstr "El nivel fue borrado."
+
+#: ../src/floors.c:169
+#, c-format
+msgid "New floor has been created."
+msgstr "Un nuevo nivel ha sido creado."
+
+#: ../src/graphics.c:27
+msgid "Image upload"
+msgstr "Cargar imagen"
+
+#: ../src/graphics.c:45
+msgid ""
+"You can upload any image directly from your computer, as long as it is in "
+"GIF format (JPEG, PNG, etc. won't work)."
+msgstr ""
+"Puede cargar cualquier imagen de su ordenador directamente, siempre que esté"
+"en formato GIF (JPEG, PNG, etc no funcionarán)."
+
+#: ../src/graphics.c:50
+msgid "Please select a file to upload:"
+msgstr "Por favor, seleccione el fichero a cargar:"
+
+#: ../src/graphics.c:54
+msgid "Upload"
+msgstr "Cargar"
+
+#: ../src/graphics.c:56
+msgid "Reset form"
+msgstr "Resetear formulario"
+
+#: ../src/graphics.c:74
+msgid "Graphics upload has been cancelled."
+msgstr "Carga de gafico cancelada."
+
+#: ../src/graphics.c:81
+msgid "You didn't upload a file."
+msgstr "No subiste ningún fichero."
+
+#: ../src/html2html.c:109
+#, c-format
+msgid "realloc() error! couldn't get %d bytes: %s"
+msgstr "¡realloc() error! no se pudieron conseguir %d bytes: %s"
+
+#: ../src/iconbar.c:105 ../src/iconbar.c:391
+msgid "Find out more about Citadel"
+msgstr "Saber más sobre Citadel"
+
+#: ../src/iconbar.c:106 ../src/iconbar.c:392
+msgid "CITADEL"
+msgstr "CITADEL"
+
+#: ../src/iconbar.c:110
+msgid "switch to room list"
+msgstr "cambiar a lista de salas"
+
+#: ../src/iconbar.c:116 ../src/iconbar.c:540
+msgid "Your summary page"
+msgstr "Tu página sumario"
+
+#: ../src/iconbar.c:133
+msgid "Go to your email inbox"
+msgstr "Ir a tu buzón de correo entrante"
+
+#: ../src/iconbar.c:140
+msgid "Mail"
+msgstr "Correo"
+
+#: ../src/iconbar.c:158
+msgid "Go to your personal calendar"
+msgstr "Ir a tu calendario personal"
+
+#: ../src/iconbar.c:165 ../src/iconbar.c:603 ../src/roomops.c:22
+msgid "Calendar"
+msgstr "Calendario"
+
+#: ../src/iconbar.c:175
+msgid "Go to your personal address book"
+msgstr "Ir a tu libreta personal de direcciones"
+
+#: ../src/iconbar.c:182 ../src/iconbar.c:570
+msgid "Contacts"
+msgstr "Contactos"
+
+#: ../src/iconbar.c:192
+msgid "Go to your personal notes"
+msgstr "Ir a tus notas personales"
+
+#: ../src/iconbar.c:209
+msgid "Go to your personal task list"
+msgstr "Ir a tu lista de tareas personal"
+
+#: ../src/iconbar.c:216 ../src/iconbar.c:618 ../src/summary.c:109
+msgid "Tasks"
+msgstr "Tareas"
+
+#: ../src/iconbar.c:224
+msgid "List all of your accessible rooms"
+msgstr "Listar todas las salas accesibles"
+
+#: ../src/iconbar.c:231 ../src/iconbar.c:634
+msgid "Rooms"
+msgstr "Salas"
+
+#: ../src/iconbar.c:240
+msgid "See who is online right now"
+msgstr "Ver quien está online ahora mismo"
+
+#: ../src/iconbar.c:247 ../src/iconbar.c:650
+msgid "Who is online?"
+msgstr "¿Quién está en línea?"
+
+#: ../src/iconbar.c:265 ../src/iconbar.c:666
+msgid "Chat"
+msgstr "Chat"
+
+#: ../src/iconbar.c:275
+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"
+
+#: ../src/iconbar.c:282
+msgid "Advanced"
+msgstr "Avanzado"
+
+#: ../src/iconbar.c:292
+msgid "Room and system administration functions"
+msgstr "Funciones de administración de sala y sistema"
+
+#: ../src/iconbar.c:299 ../src/roomops.c:997
+msgid "Administration"
+msgstr "Administración"
+
+#: ../src/iconbar.c:307 ../src/iconbar.c:316 ../src/iconbar.c:402
+#: ../src/iconbar.c:411 ../src/mainmenu.c:110
+msgid "Log off"
+msgstr "Log off (desconectar)"
+
+#: ../src/iconbar.c:308 ../src/iconbar.c:403
+msgid "Log off now?"
+msgstr "¿Desconectar ahora?"
+
+#: ../src/iconbar.c:326
+msgid "Customize this menu"
+msgstr "Personalizar este menú"
+
+#: ../src/iconbar.c:327
+msgid "customize this menu"
+msgstr "personalizar este menú"
+
+#: ../src/iconbar.c:396
+msgid "switch to menu"
+msgstr "cambiar a menú"
+
+#: ../src/iconbar.c:481
+msgid "Customize the icon bar"
+msgstr "Personalizar la barra de iconos"
+
+#: ../src/iconbar.c:493
+msgid "Display icons as:"
+msgstr "Mostrar iconos como:"
+
+#: ../src/iconbar.c:499
+msgid "pictures and text"
+msgstr "imágenes y texto"
+
+#: ../src/iconbar.c:500
+msgid "pictures only"
+msgstr "sólo imágenes"
+
+#: ../src/iconbar.c:501
+msgid "text only"
+msgstr "sólo texto"
+
+#: ../src/iconbar.c:506
+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 la"
+"izquierda de la pantalla"
+
+#: ../src/iconbar.c:524
+msgid "Site logo"
+msgstr "Logotipo del sitio"
+
+#: ../src/iconbar.c:525
+msgid "An icon describing this site"
+msgstr "Un icono descriptor de este sitio"
+
+#: ../src/iconbar.c:554
+msgid "Mail (inbox)"
+msgstr "Correo (entrante)"
+
+#: ../src/iconbar.c:555
+msgid "A shortcut to your email Inbox"
+msgstr "Atajo a su buzón de correo"
+
+#: ../src/iconbar.c:571
+msgid "Your personal address book"
+msgstr "Su libreta de direcciones personal"
+
+#: ../src/iconbar.c:587
+msgid "Your personal notes"
+msgstr "Sus notas personales"
+
+#: ../src/iconbar.c:604
+msgid "A shortcut to your personal calendar"
+msgstr "Atajo a su calendario personal"
+
+#: ../src/iconbar.c:619
+msgid "A shortcut to your personal task list"
+msgstr "Atajo a su lista personal de tareas"
+
+#: ../src/iconbar.c:635
+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)"
+#: ../src/iconbar.c:651
+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."
+
+#: ../src/iconbar.c:667
+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"
+
+#: ../src/iconbar.c:684
+msgid "Advanced options"
+msgstr "Opciones avanzadas"
+
+#: ../src/iconbar.c:685
+msgid "Access to the complete menu of Citadel functions."
+msgstr "Acceso al menú completo de funciones de Citadel."
+
+#: ../src/iconbar.c:701
+msgid "Citadel logo"
+msgstr "Logotipo de Citadel"
+
+#: ../src/iconbar.c:702
+msgid "Displays the 'Powered by Citadel' icon"
+msgstr "Muestra el icono 'Powered by Citadel' "
+
+#: ../src/iconbar.c:711 ../src/netconf.c:146 ../src/roomops.c:1279
+#: ../src/roomops.c:1606 ../src/siteconfig.c:562 ../src/sysmsgs.c:57
+#: ../src/useredit.c:381 ../src/vcard_edit.c:335
+msgid "Save changes"
+msgstr "Salvar cambios"
+
+#: ../src/iconbar.c:766
+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."
+#: ../src/inetconf.c:38
+msgid "localhost"
+msgstr "localhost"
+
+#: ../src/inetconf.c:39
+msgid "directory"
+msgstr "directorio"
+
+#: ../src/inetconf.c:40
+msgid "gatewaydomain"
+msgstr "gatewaydomain"
+
+#: ../src/inetconf.c:41
+msgid "smarthost"
+msgstr "smarthost"
+
+#: ../src/inetconf.c:42
+msgid "rbl"
+msgstr "rbl"
+
+#: ../src/inetconf.c:43
+msgid "spamassassin"
+msgstr "spamassassin"
+
+#: ../src/inetconf.c:45
+msgid "Local host aliases"
+msgstr "Alias del host local"
+
+#: ../src/inetconf.c:46
+msgid "Directory domains"
+msgstr "Dominios de directorios"
+
+#: ../src/inetconf.c:47
+msgid "Gateway domains"
+msgstr "Dominios de puerta de enlace"
+
+#: ../src/inetconf.c:48
+msgid "Smart hosts"
+msgstr "Smart hosts"
+
+#: ../src/inetconf.c:49
+msgid "RBL hosts"
+msgstr "RBL hosts"
+
+#: ../src/inetconf.c:50
+msgid "SpamAssassin hosts"
+msgstr "SpamAssasin hosts"
+
+#: ../src/inetconf.c:52
+msgid "(domains for which this host receives mail)"
+msgstr "(dominios desde los cuales este host recibirá correo)"
+
+#: ../src/inetconf.c:53
+msgid "(domains mapped with the Global Address Book)"
+msgstr "(dominios mapeados con la Libreta de Direcciones Global)"
+
+#: ../src/inetconf.c:54
+msgid "(domains whose subdomains match Citadel hosts)"
+msgstr "(dominios cuyos subdominios se corresponden con con el host Citadel)"
+
+#: ../src/inetconf.c:55
+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)"
+
+#: ../src/inetconf.c:56
+msgid "(hosts running a Realtime Blackhole List)"
+msgstr "(host corriendo una lista Agujero Negro en tiempo real)"
+
+#: ../src/inetconf.c:57
+msgid "(hosts running the SpamAssassin service)"
+msgstr "(host corriendo el servicio SpamAssassin)"
+
+#: ../src/inetconf.c:94
+msgid "Internet configuration"
+msgstr "Configuración de internet"
+
+#: ../src/inetconf.c:121
+msgid "Delete this entry?"
+msgstr "¿Borrar esta entrada?"
+
+#: ../src/inetconf.c:123 ../src/netconf.c:209
+msgid "(Delete)"
+msgstr "(Borrar)"
+
+#: ../src/inetconf.c:173
+#, c-format
+msgid "%s has been deleted."
+msgstr "%s ha sido borrado"
+
+#: ../src/listsub.c:44
+msgid "List subscription"
+msgstr "Lista subscripción"
+
+#: ../src/listsub.c:56
+msgid "List subscribe/unsubscribe"
+msgstr "Listar suscribir/cancelar subscripción"
+
+#: ../src/listsub.c:76
+msgid "Confirmation request sent"
+msgstr "Enviada solicitud de confirmación"
+
+#: ../src/listsub.c:78
+#, c-format
+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 enviado"
+"y su suscripción será activada.<br />\n"
+
+#: ../src/listsub.c:91
+msgid "Go back..."
+msgstr "Ir atrás"
+
+#: ../src/mainmenu.c:23
+msgid "Basic commands"
+msgstr "Comandos básicos"
+
+#: ../src/mainmenu.c:32
+msgid "List known rooms"
+msgstr "Listar salas conocidas"
+
+#: ../src/mainmenu.c:34
+msgid "Where can I go from here?"
+msgstr "¿A dónde se puede ir desde aquí?"
+
+#: ../src/mainmenu.c:39 ../src/roomops.c:646
+msgid "Goto next room"
+msgstr "Ir a la siguiente sala"
+
+#: ../src/mainmenu.c:42
+msgid "...with <EM>unread</EM> messages"
+msgstr "...con <EM>mensajes</EM> no leídos"
+
+#: ../src/mainmenu.c:47
+msgid "Skip to next room"
+msgstr "Saltar a la siguiente sala"
+
+#: ../src/mainmenu.c:50
+msgid "(come back here later)"
+msgstr "(volver aquí después)"
+
+#: ../src/mainmenu.c:57 ../src/roomops.c:450
+msgid "Ungoto"
+msgstr "Atrás"
+
+#: ../src/mainmenu.c:60
+#, c-format
+msgid "(oops! Back to %s)"
+msgstr "(¡oh! Vuelta a %s)"
+
+#: ../src/mainmenu.c:68 ../src/roomops.c:459
+msgid "Read new messages"
+msgstr "Leer mensajes nuevos"
+
+#: ../src/mainmenu.c:71
+msgid "...in this room"
+msgstr "... en esta sala"
+
+#: ../src/mainmenu.c:76 ../src/roomops.c:559
+msgid "Read all messages"
+msgstr "Leer todos los mensajes"
+
+#: ../src/mainmenu.c:79
+msgid "...old <EM>and</EM> new"
+msgstr "...viejos <EM>y</EM> nuevos"
+
+#: ../src/mainmenu.c:84 ../src/roomops.c:621
+msgid "Enter a message"
+msgstr "Redactar mensaje"
+
+#: ../src/mainmenu.c:87
+msgid "(post in this room)"
+msgstr "(postear a esta sala)"
+
+#: ../src/mainmenu.c:94
+msgid "Summary page"
+msgstr "Página sumario"
+
+#: ../src/mainmenu.c:97
+msgid "Summary of my account"
+msgstr "Sumario de mi cuenta"
+
+#: ../src/mainmenu.c:102
+msgid "User list"
+msgstr "Lista de usuarios"
+
+#: ../src/mainmenu.c:105
+msgid "(all registered users)"
+msgstr "(todos los usuarios registrados)"
+
+#: ../src/mainmenu.c:113
+msgid "Bye!"
+msgstr "¡Adiós!"
+
+#: ../src/mainmenu.c:122
+msgid "Your info"
+msgstr "Su información"
+
+#: ../src/mainmenu.c:127
+msgid "Change your preferences and settings"
+msgstr "Cambiar sus preferencias y configuración"
+
+#: ../src/mainmenu.c:132
+msgid "Update your contact information"
+msgstr "Actualizar su información de contacto"
+
+#: ../src/mainmenu.c:142
+msgid "Enter your 'bio'"
+msgstr "Introducir 'bio' (biografía)"
+
+#: ../src/mainmenu.c:147
+msgid "Edit your online photo"
+msgstr "Editar su foto en línea"
+
+#: ../src/mainmenu.c:154
+msgid "Advanced room commands"
+msgstr "Comandos avanzados de sala"
+
+#: ../src/mainmenu.c:160
+msgid "Edit or delete this room"
+msgstr "Editar o borrar esta sala"
+
+#: ../src/mainmenu.c:166
+msgid "Go to a 'hidden' room"
+msgstr "Ir a una sala 'hidden' (oculta)"
+
+#: ../src/mainmenu.c:171 ../src/roomops.c:1937
+msgid "Create a new room"
+msgstr "Crear nueva sala"
+
+#: ../src/mainmenu.c:176
+#, c-format
+msgid "Zap (forget) this room (%s)"
+msgstr "Zap (olvidar) esta sala (%s)"
+
+#: ../src/mainmenu.c:181
+msgid "List all forgotten rooms"
+msgstr "Listar todas las salas olvidadas"
+
+#: ../src/mainmenu.c:200
+msgid "System Administration Menu"
+msgstr "Menú de Administración de Sistema"
+
+#: ../src/mainmenu.c:209
+msgid "Global Configuration"
+msgstr "Configuración Global"
+
+#: ../src/mainmenu.c:214
+msgid "Edit site-wide configuration"
+msgstr "Editar configuración general del sitio"
+
+#: ../src/mainmenu.c:219
+msgid "Domain names and Internet mail configuration"
+msgstr "Dominios y configuración de correo de internet"
+
+#: ../src/mainmenu.c:224
+msgid "Configure replication with other Citadel servers"
+msgstr "Configurar replicación con otros servidores Citadel"
+
+#: ../src/mainmenu.c:231
+msgid "User account management"
+msgstr "Gestión de cuentas de usuario"
+
+#: ../src/mainmenu.c:236
+msgid "Add, change, delete user accounts"
+msgstr "Añadir, cambiar, borrar cuentas de usuarios"
+
+#: ../src/mainmenu.c:246
+msgid "Rooms and Floors"
+msgstr "Salas y Niveles"
+
+#: ../src/mainmenu.c:251
+msgid "Add, change, or delete floors"
+msgstr "Añadir, cambiar o borrar niveles"
+
+#: ../src/mainmenu.c:273
+msgid "Enter a server command"
+msgstr "Introducir comando de servidor"
+
+#: ../src/mainmenu.c:282
+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. "
+
+#: ../src/mainmenu.c:289
+msgid "Enter command:"
+msgstr "Introducir comando"
+
+#: ../src/mainmenu.c:292
+msgid "Command input (if requesting SEND_LISTING transfer mode):"
+msgstr "Introducción de comando (si se pidiera SEND_LISTING transfer mode):"
+
+#: ../src/mainmenu.c:296
+#, c-format
+msgid "Detected host header is %s://%s"
+msgstr "La cabecera detectada del host es %s://%s"
+
+#: ../src/mainmenu.c:298
+msgid "Send command"
+msgstr "Enviar comando"
+
+#: ../src/mainmenu.c:327
+msgid "Server command results"
+msgstr "Resultado de los comandos de servidor"
+
+#: ../src/messages.c:491
+msgid " (work)"
+msgstr " (trabajo)"
+
+#: ../src/messages.c:493
+msgid " (home)"
+msgstr " (casa)"
+
+#: ../src/messages.c:495
+msgid " (cell)"
+msgstr " (celular)"
+
+#: ../src/messages.c:506 ../src/vcard_edit.c:252
+msgid "Address:"
+msgstr "Dirección:"
+
+#: ../src/messages.c:566
+msgid "Telephone:"
+msgstr "Teléfono"
+
+#: ../src/messages.c:571
+msgid "E-mail:"
+msgstr "E-mail"
+
+#: ../src/messages.c:679 ../src/messages.c:1276
+msgid "ERROR:"
+msgstr "ERROR"
+
+#: ../src/messages.c:702 ../src/messages.c:979 ../src/messages.c:1285
+#: ../src/messages.c:1388
+msgid "unexpected end of message"
+msgstr "finalización inesperada de mensaje"
+
+#: ../src/messages.c:715 ../src/messages.c:1297
+msgid "from "
+msgstr "de"
+
+#: ../src/messages.c:743 ../src/messages.c:1313
+msgid "in "
+msgstr "en"
+
+#: ../src/messages.c:764 ../src/messages.c:1334
+msgid "to "
+msgstr "a"
+
+#: ../src/messages.c:817
+msgid "View"
+msgstr "Ver"
+
+#: ../src/messages.c:819
+msgid "Download"
+msgstr "Descargar"
+
+#: ../src/messages.c:866 ../src/messages.c:2899
+msgid "CC:"
+msgstr "CC:"
+
+#: ../src/messages.c:874 ../src/messages.c:1370
+msgid "Subject:"
+msgstr "Asunto:"
+
+#: ../src/messages.c:898 ../src/rss.c:28
+msgid "Reply"
+msgstr "Responder"
+
+#: ../src/messages.c:913
+msgid "ReplyQuoted"
+msgstr "Respuesta entrecomillada"
+
+#: ../src/messages.c:930
+msgid "ReplyAll"
+msgstr "Responder Todos"
+
+#: ../src/messages.c:938
+msgid "Forward"
+msgstr "Reenviar"
+
+#: ../src/messages.c:945 ../src/messages.c:3149
+msgid "Move"
+msgstr "Mover"
+
+#: ../src/messages.c:950
+msgid "Delete this message?"
+msgstr "¿Borrar este mensaje?"
+
+#: ../src/messages.c:956
+msgid "Headers"
+msgstr "Cabeceras"
+
+#: ../src/messages.c:961
+msgid "Print"
+msgstr "Imprimir"
+
+#: ../src/messages.c:1072
+#, c-format
+msgid "I don't know how to display %s"
+msgstr "No se como mostrar %s"
+
+#: ../src/messages.c:1107 ../src/messages.c:1634
+msgid "edit"
+msgstr "editar"
+
+#: ../src/messages.c:1597 ../src/messages.c:1905
+msgid "(no subject)"
+msgstr "(sin asunto)"
+
+#: ../src/messages.c:1725
+msgid "(no name)"
+msgstr "(sin nombre)"
+
+#: ../src/messages.c:1777
+msgid "This address book is empty."
+msgstr "Esta libreta de direcciones está vacía."
+
+#: ../src/messages.c:2202
+msgid "No new messages."
+msgstr "No hay mensajes nuevos."
+
+#: ../src/messages.c:2204
+msgid "No old messages."
+msgstr "No hay mensajes antiguos"
+
+#: ../src/messages.c:2206
+msgid "No messages here."
+msgstr "No hay mensajes aquí"
+
+#: ../src/messages.c:2324
+msgid "Sender"
+msgstr "Remitente"
+
+#: ../src/messages.c:2326
+msgid "Date"
+msgstr "Fecha"
+
+#: ../src/messages.c:2341
+msgid "Click on any note to edit it."
+msgstr "Pulse en cualquier nota para editarla"
+
+#: ../src/messages.c:2444
+msgid "Reading #"
+msgstr "Leyendo #"
+
+#: ../src/messages.c:2497
+#, c-format
+msgid "of %d messages."
+msgstr "de %d mensajes."
+
+#: ../src/messages.c:2682
+#, c-format
+msgid "Cancelled.  Message was not posted."
+msgstr "Cancelado. El mensaje no ha sido enviado."
+
+#: ../src/messages.c:2688
+#, c-format
+msgid "Automatically cancelled because you have already saved this message."
+msgstr "Cancelado automáticamente porque ya habías salvado este mensaje."
+
+#: ../src/messages.c:2708
+#, c-format
+msgid "Message has been sent.\n"
+msgstr "El mensaje ha sido enviado.\n"
+
+#: ../src/messages.c:2711
+#, c-format
+msgid "Message has been posted.\n"
+msgstr "El mensaje ha sido enviado.\n"
+
+#: ../src/messages.c:2845
+msgid " <I>from</I> "
+msgstr " <I>de</I> "
+
+#: ../src/messages.c:2855
+msgid " <I>in</I> "
+msgstr " <I>en</I> "
+
+#: ../src/messages.c:2888
+msgid "To:"
+msgstr "A"
+
+#: ../src/messages.c:2910
+msgid "BCC:"
+msgstr "BCC"
+
+#: ../src/messages.c:2928
+msgid "Subject (optional):"
+msgstr "Asunto"
+
+#: ../src/messages.c:2937 ../src/messages.c:3058 ../src/paging.c:57
+msgid "Send message"
+msgstr "Enviar mensaje"
+
+#: ../src/messages.c:2939 ../src/messages.c:3060
+msgid "Post message"
+msgstr "Postear mensaje"
+
+#: ../src/messages.c:2955
+msgid "--- forwarded message ---"
+msgstr "--- mensaje reenviado ---"
+
+#: ../src/messages.c:3035
+msgid "Attachments:"
+msgstr "Adjuntos"
+
+#: ../src/messages.c:3050
+msgid "Attach file:"
+msgstr "Adjuntar fichero"
+
+#: ../src/messages.c:3053 ../src/roomops.c:1472 ../src/roomops.c:1502
+msgid "Add"
+msgstr "Añadir"
+
+#: ../src/messages.c:3122
+msgid "Confirm move of message"
+msgstr "Confirme mover mensaje"
+
+#: ../src/messages.c:3129
+msgid "Move this message to:"
+msgstr "Mover este mensaje a:"
+
+#: ../src/messages.c:3175
+#, c-format
+msgid "The message was not moved."
+msgstr "No se movió el mensaje."
+
+#: ../src/netconf.c:68 ../src/netconf.c:183
+msgid "Add a new node"
+msgstr "Añadir un nuevo nodo"
+
+#: ../src/netconf.c:75 ../src/netconf.c:129 ../src/siteconfig.c:112
+#, c-format
+msgid "Node name"
+msgstr "Nombre de nodo"
+
+#: ../src/netconf.c:77 ../src/netconf.c:133
+msgid "Shared secret"
+msgstr "Secreto compartido"
+
+#: ../src/netconf.c:79 ../src/netconf.c:137
+msgid "Host or IP address"
+msgstr "Host o dirección IP"
+
+#: ../src/netconf.c:81 ../src/netconf.c:141
+msgid "Port number"
+msgstr "Puerto número"
+
+#: ../src/netconf.c:84
+msgid "Add node"
+msgstr "Añadir nodo"
+
+#: ../src/netconf.c:110
+msgid "Edit node configuration for "
+msgstr "Editar configuración de nodo para"
+
+#: ../src/netconf.c:176
+msgid "Network configuration"
+msgstr "Configuración de Red"
+
+#: ../src/netconf.c:189
+msgid "Currently configured nodes"
+msgstr "Nodos actualmente configurados"
+
+#: ../src/netconf.c:204
+msgid "(Edit)"
+msgstr "(Editar)"
+
+#: ../src/netconf.c:229
+msgid "Confirm delete"
+msgstr "Confirmar borrar"
+
+#: ../src/netconf.c:236
+msgid "Are you sure you want to delete "
+msgstr "¿Estás seguro de querer borrar?"
+
+#: ../src/netconf.c:243
+msgid "Yes"
+msgstr "Si"
+
+#: ../src/netconf.c:246
+msgid "No"
+msgstr "No"
+
+#: ../src/netconf.c:309
+msgid "Back to menu"
+msgstr "Volver al menú"
+
+#: ../src/notes.c:126
+msgid "An error has occurred."
+msgstr "Se produjo un error"
+
+#: ../src/paging.c:24
+msgid "Send instant message"
+msgstr "Enviar mensaje instantáneo"
+
+#: ../src/paging.c:33
+msgid "Send an instant message to: "
+msgstr "Enviar un mensaje instantáneo a: "
+
+#: ../src/paging.c:49
+msgid "Enter message text:"
+msgstr "Introducir texto de mensaje: "
+
+#: ../src/paging.c:89
+msgid "Message was not sent."
+msgstr "El mensaje no se envió."
+
+#: ../src/paging.c:99
+msgid "Message has been sent to "
+msgstr "El mensaje ha sido enviado a "
+
+#: ../src/paging.c:110
+msgid "[ close window ]"
+msgstr "[ cerrar ventana ]"
+
+#: ../src/paging.c:170
+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 ventana"
+"de mensajería instantánea no se pudo abrir. Esto ha sido causado probablemente "
+"porque tienes instalado un bloqueo de popups, configure su herramienta para"
+"permitir poups de este sitio si quiere recibir mensajería instantánea."
+
+#: ../src/paging.c:309 ../src/paging.c:471
+msgid "An error occurred while setting up the chat socket."
+msgstr "Se produjo un error al intentar activar la conexión de chat. "
+
+#: ../src/paging.c:336
+msgid "Now exiting chat mode."
+msgstr "Saliendo de modo chat."
+
+#: ../src/paging.c:507
+msgid "Send"
+msgstr "Enviar"
+
+#: ../src/paging.c:508
+msgid "Help"
+msgstr "Ayuda"
+
+#: ../src/paging.c:509
+msgid "List users"
+msgstr "Listar usuarios"
+
+#: ../src/preferences.c:205
+msgid "Preferences and settings"
+msgstr "Preferencias y configuración"
+
+#: ../src/preferences.c:226
+msgid "Room list view"
+msgstr "Ver listado de salas"
+
+#: ../src/preferences.c:232
+msgid "Tree (folders) view"
+msgstr "Ver (carpetas) en árbol"
+
+#: ../src/preferences.c:238
+msgid "Table (rooms) view"
+msgstr "Ver (salas) en tabla"
+
+#: ../src/preferences.c:249
+msgid "Calendar hour format"
+msgstr "Formato horario del calendario"
+
+#: ../src/preferences.c:255
+msgid "12 hour (am/pm)"
+msgstr "12 horas (am/pm)"
+
+#: ../src/preferences.c:261
+msgid "24 hour"
+msgstr "24 horas"
+
+#: ../src/preferences.c:272
+msgid "Calendar day view begins at:"
+msgstr "La visualización del calendario comienza por el dia:"
+
+#: ../src/preferences.c:301
+msgid "Calendar day view ends at:"
+msgstr "Los dias mostrados del calendario finalizan en:"
+
+#: ../src/preferences.c:330
+msgid "Attach signature to email messages?"
+msgstr "¿Añadir firma a el correo electrónico?"
+
+#: ../src/preferences.c:348
+msgid "No signature"
+msgstr "Sin firma"
+
+#: ../src/preferences.c:354
+msgid "Use this signature:"
+msgstr "Usar esta firma:"
+
+#: ../src/preferences.c:378
+msgid "Default character set for email headers:"
+msgstr "Juego de caracteres por defecto para cabeceras de correo:"
+
+#: ../src/preferences.c:388
+msgid "Change"
+msgstr "Cambiar"
+
+#: ../src/preferences.c:407
+msgid "Cancelled.  No settings were changed."
+msgstr "Cancelado. No se cambió la configuración."
+
+#: ../src/roomops.c:19
+msgid "Bulletin Board"
+msgstr "Tablón de anuncios"
+
+#: ../src/roomops.c:20
+msgid "Mail Folder"
+msgstr "Carpeta de Correo"
+
+#: ../src/roomops.c:21
+msgid "Address Book"
+msgstr "Libreta de Direcciones"
+
+#: ../src/roomops.c:23
+msgid "Task List"
+msgstr "Lista de Tareas"
+
+#: ../src/roomops.c:24
+msgid "Notes List"
+msgstr "Lista de Notas"
+
+#: ../src/roomops.c:25
+msgid "Wiki"
+msgstr "Wiki"
+
+#: ../src/roomops.c:26
+msgid "Calendar List"
+msgstr "Lista de Calendario"
+
+#: ../src/roomops.c:258
+msgid "Zapped (forgotten) rooms"
+msgstr "Salas Zapped (olvidadas)"
+
+#: ../src/roomops.c:264
+msgid "Click on any room to un-zap it and goto that room.\n"
+msgstr "Pulse en cualqueir sala para recordarla y entrar en ella.\n"
+
+#: ../src/roomops.c:358
+msgid "View as:"
+msgstr "Ver como:"
+
+#: ../src/roomops.c:429
+#, c-format
+msgid "%d new of %d messages"
+msgstr "%d nuevo de %d mensajes"
+
+#: ../src/roomops.c:473
+msgid "View contacts"
+msgstr "Ver contactos"
+
+#: ../src/roomops.c:484
+msgid "Day view"
+msgstr "Visualización de día"
+
+#: ../src/roomops.c:493
+msgid "Month view"
+msgstr "VIsualización mensual"
+
+#: ../src/roomops.c:504
+msgid "Calendar list"
+msgstr "Lista de calendario"
+
+#: ../src/roomops.c:515
+msgid "View tasks"
+msgstr "Ver tareas"
+
+#: ../src/roomops.c:526
+msgid "View notes"
+msgstr "Ver notas"
+
+#: ../src/roomops.c:537
+msgid "View message list"
+msgstr "Ver lista de mensajes"
+
+#: ../src/roomops.c:548
+msgid "Wiki home"
+msgstr "Wiki home"
+
+#: ../src/roomops.c:573
+msgid "Add new contact"
+msgstr "Añadir nuevo contacto"
+
+#: ../src/roomops.c:583
+msgid "Add new event"
+msgstr "Añadir nuevo evento"
+
+#: ../src/roomops.c:592
+msgid "Add new task"
+msgstr "Añadir nueva tarea"
+
+#: ../src/roomops.c:601
+msgid "Add new note"
+msgstr "Añadir nueva nota"
+
+#: ../src/roomops.c:612
+msgid "Edit this page"
+msgstr "Editar esta página"
+
+#: ../src/roomops.c:634
+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"
+
+#: ../src/roomops.c:635
+msgid "Skip this room"
+msgstr "Saltarse esta sala"
+
+#: ../src/roomops.c:645
+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"
+
+#: ../src/roomops.c:1013
+msgid "Configuration"
+msgstr "Configuración"
+
+#: ../src/roomops.c:1029
+msgid "Message expire policy"
+msgstr "Política de expiración de mensajes"
+
+#: ../src/roomops.c:1045
+msgid "Access controls"
+msgstr "Controles de acceso"
+
+#: ../src/roomops.c:1061
+msgid "Sharing"
+msgstr "Compartir"
+
+#: ../src/roomops.c:1077
+msgid "Mailing list service"
+msgstr "Servicio de lista de correo"
+
+#: ../src/roomops.c:1099
+msgid "Are you sure you want to delete this room?"
+msgstr "¿Esta seguro de querer borrar esta sala?"
+
+#: ../src/roomops.c:1101
+msgid "Delete this room"
+msgstr "Borrar esta sala"
+
+#: ../src/roomops.c:1104
+msgid "Set or change the icon for this room's banner"
+msgstr "Determinar o cambiar el icono para el baner de esta sala"
+
+#: ../src/roomops.c:1107
+msgid "Edit this room's Info file"
+msgstr "Editar el fichero informativo de esta sala"
+
+#: ../src/roomops.c:1116 ../src/roomops.c:1949
+msgid "Name of room: "
+msgstr "Nombre de la sala: "
+
+#: ../src/roomops.c:1123 ../src/roomops.c:1953
+msgid "Resides on floor: "
+msgstr "Nivel al que pertenece: "
+
+#: ../src/roomops.c:1137 ../src/roomops.c:1995
+msgid "Type of room:"
+msgstr "Tipo de sala:"
+
+#: ../src/roomops.c:1144
+msgid "Public room"
+msgstr "Sala pública"
+
+#: ../src/roomops.c:1152
+msgid "Private - guess name"
+msgstr "Privada - invitación nominativa"
+
+#: ../src/roomops.c:1159
+msgid "Private - require password:"
+msgstr "Privada - requiere contraseña:"
+
+#: ../src/roomops.c:1169 ../src/roomops.c:2026
+msgid "Private - invitation only"
+msgstr "Privada - sólo mediante invitación"
+
+#: ../src/roomops.c:1173
+msgid "If private, cause current users to forget room"
+msgstr "Si privada, hacer que los usuarios actuales olviden la sala"
+
+#: ../src/roomops.c:1181
+msgid "Preferred users only"
+msgstr "Usuarios preferentes solamente"
+
+#: ../src/roomops.c:1187
+msgid "Read-only room"
+msgstr "Sala de sólo lectura"
+
+#: ../src/roomops.c:1194
+msgid "File directory room"
+msgstr "Sala directorio de ficheros"
+
+#: ../src/roomops.c:1197
+msgid "Directory name: "
+msgstr "Nombre de directorio"
+
+#: ../src/roomops.c:1205
+msgid "Uploading allowed"
+msgstr "Subidas permitidas"
+
+#: ../src/roomops.c:1211
+msgid "Downloading allowed"
+msgstr "Bajadas permitidas"
+
+#: ../src/roomops.c:1217
+msgid "Visible directory"
+msgstr "Directorio visible"
+
+#: ../src/roomops.c:1226
+msgid "Network shared room"
+msgstr "Sala de intercambio en red"
+
+#: ../src/roomops.c:1232
+msgid "Permanent (does not auto-purge)"
+msgstr "Permanente (sin purga automática)"
+
+#: ../src/roomops.c:1237
+msgid "Anonymous messages"
+msgstr "Mensajes anónimos"
+
+#: ../src/roomops.c:1245
+msgid "No anonymous messages"
+msgstr "Sin mensajes anónimos"
+
+#: ../src/roomops.c:1251
+msgid "All messages are anonymous"
+msgstr "Todos los mensajes anónimos"
+
+#: ../src/roomops.c:1257
+msgid "Prompt user when entering messages"
+msgstr "Preguntar al usuario cuando esté introduciendo mensajes"
+
+#: ../src/roomops.c:1263
+msgid "Room aide: "
+msgstr "Administrador de la sala"
+
+#: ../src/roomops.c:1335
+msgid "Shared with"
+msgstr "Compartido con"
+
+#: ../src/roomops.c:1338
+msgid "Not shared with"
+msgstr "No compartido con"
+
+#: ../src/roomops.c:1343 ../src/roomops.c:1388
+msgid "Remote node name"
+msgstr "Nombre del nodo remoto"
+
+#: ../src/roomops.c:1345 ../src/roomops.c:1390
+msgid "Remote room name"
+msgstr "Nombre de la sala remota"
+
+#: ../src/roomops.c:1347 ../src/roomops.c:1392
+msgid "Actions"
+msgstr "Acciones"
+
+#: ../src/roomops.c:1380
+msgid "Unshare"
+msgstr "Dejar de compartir"
+
+#: ../src/roomops.c:1417
+msgid "Share"
+msgstr "Compartir"
+
+#: ../src/roomops.c:1425
+msgid "Notes:"
+msgstr "Notas:"
+
+#: ../src/roomops.c:1426
+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. "
+"<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.</UL></I><br />\n"
+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"
+
+#: ../src/roomops.c:1447
+msgid ""
+"<i>The contents of this room are being mailed <b>as individual messages</b> "
+"to the following list recipients:</i><br /><br />\n"
+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"
+
+#: ../src/roomops.c:1464 ../src/roomops.c:1494
+msgid "(remove)"
+msgstr "(remover)"
+
+#: ../src/roomops.c:1477
+msgid ""
+"<i>The contents of this room are being mailed <b>in digest form</b> to the "
+"following list recipients:</i><br /><br />\n"
+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"
+
+#: ../src/roomops.c:1508
+msgid ""
+"This room is configured to allow self-service subscribe/unsubscribe requests."
+msgstr ""
+"Esta sala está configurada para permitir autoservicio en los porcesos de suscripción/cancelación."
+
+#: ../src/roomops.c:1511
+msgid "Click to disable."
+msgstr "Pulse para desactivar"
+
+#: ../src/roomops.c:1513
+msgid "The URL for subscribe/unsubscribe is: "
+msgstr "La URL para suscribirse/cancelar suscripción es:"
+
+#: ../src/roomops.c:1519
+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 de"
+"suscripción/cancelación."
+
+#: ../src/roomops.c:1523
+msgid "Click to enable."
+msgstr "Pulse para activar."
+
+#: ../src/roomops.c:1552
+msgid "Message expire policy for this room"
+msgstr "Política de expiración de mensajes para esta sala"
+
+#: ../src/roomops.c:1558
+msgid "Use the default policy for this floor"
+msgstr "Use la política por defecto para esta sala"
+
+#: ../src/roomops.c:1562 ../src/roomops.c:1589 ../src/siteconfig.c:501
+#: ../src/siteconfig.c:526
+#, c-format
+msgid "Never automatically expire messages"
+msgstr "Nunca producir expiración automática de mensajes"
+
+#: ../src/roomops.c:1566 ../src/roomops.c:1593 ../src/siteconfig.c:505
+#: ../src/siteconfig.c:530
+#, c-format
+msgid "Expire by message count"
+msgstr "Expirar según cuenta de mensajes"
+
+#: ../src/roomops.c:1570 ../src/roomops.c:1597 ../src/siteconfig.c:509
+#: ../src/siteconfig.c:534
+#, c-format
+msgid "Expire by message age"
+msgstr "Expirar según la edad del mensaje"
+
+#: ../src/roomops.c:1572 ../src/roomops.c:1599 ../src/siteconfig.c:511
+#: ../src/siteconfig.c:536
+#, c-format
+msgid "Number of messages or days: "
+msgstr "Número de mensajes o días"
+
+#: ../src/roomops.c:1579
+msgid "Message expire policy for this floor"
+msgstr "Política de expiración de mensajes para este nivel"
+
+#: ../src/roomops.c:1585
+msgid "Use the system default"
+msgstr "Usar las configuraciones por defecto"
+
+#: ../src/roomops.c:1660 ../src/roomops.c:3032
+msgid "Cancelled.  Changes were not saved."
+msgstr "Cancelado. Los cambios no se salvaron"
+
+#: ../src/roomops.c:1799
+msgid "Your changes have been saved."
+msgstr "Los cambios han sido salvados"
+
+#: ../src/roomops.c:1831
+#, c-format
+msgid "<B><I>User %s kicked out of room %s.</I></B>\n"
+msgstr "<B><I>Usuario %s expulado de la sala %s.</I></B>\n"
+
+#: ../src/roomops.c:1845
+#, c-format
+msgid "<B><I>User %s invited to room %s.</I></B>\n"
+msgstr "<B><I>Usuario %s invitado a la sala %s.</I></B>\n"
+
+#: ../src/roomops.c:1873
+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'."
+
+#: ../src/roomops.c:1893
+msgid "Kick"
+msgstr "Kick"
+
+#: ../src/roomops.c:1897
+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'."
+
+#: ../src/roomops.c:1903
+msgid "Invite:"
+msgstr "Invitar"
+
+#: ../src/roomops.c:1908
+msgid "Invite"
+msgstr "Invitar"
+
+#: ../src/roomops.c:1972
+msgid "Default view for room: "
+msgstr "Vista por defecto para esta sala"
+
+#: ../src/roomops.c:2004
+msgid "Public (automatically appears to everyone)"
+msgstr "Pública (automáticamente aparece visible a todos)"
+
+#: ../src/roomops.c:2011
+msgid "Private - hidden (accessible to anyone who knows its name)"
+msgstr "Privada - oculta (accesible solo a quienes conocen su nombre)"
+
+#: ../src/roomops.c:2018
+msgid "Private - require password: "
+msgstr "Privada - se requiere contraseña:"
+
+#: ../src/roomops.c:2034
+msgid "Personal (mailbox for you only)"
+msgstr "Personal (buzón de correo para tí solo)"
+
+#: ../src/roomops.c:2039
+msgid "Create new room"
+msgstr "Crear nueva sala"
+
+#: ../src/roomops.c:2107
+msgid "Cancelled.  No new room was created."
+msgstr "Cancelado. Ninguna sala nueva se creó."
+
+#: ../src/roomops.c:2150
+msgid "Go to a hidden room"
+msgstr "Ir a una sala oculta"
+
+#: ../src/roomops.c:2161
+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, puedes"
+"entrar en la sala escribiendo el nombre abajo. Una vez que hayas ganado acceso a una sala"
+"privada, aparecerá regularmente en tu lista de salas disponibles, por lo que no tendrás que "
+"repetir este proceso. "
+
+#: ../src/roomops.c:2173
+msgid "Enter room name:"
+msgstr "Intoduzca el nombre de sala:"
+
+#: ../src/roomops.c:2180
+msgid "Enter room password:"
+msgstr "Introduzaca la contraseña de sala:"
+
+#: ../src/roomops.c:2189
+msgid "Go there"
+msgstr "Ir allí"
+
+#: ../src/roomops.c:2242
+msgid "Zap (forget/unsubscribe) the current room"
+msgstr "Zap (olvidar/cancela suscripción) a la sala actual"
+
+#: ../src/roomops.c:2247
+#, c-format
+msgid ""
+"If you select this option, <em>%s</em> will disappear from your room list.  "
+"Is this what you wish to do?<br />\n"
+msgstr ""
+"Si selecciona esta opción, <em>%s</em> desaparecerá de su lista de salas.  "
+"¿Es eso lo que desea?<br />\n"
+
+#: ../src/roomops.c:2252
+msgid "Zap this room"
+msgstr "Zap a esta sala"
+
+#: ../src/roomops.c:2982 ../src/roomops.c:2988
+msgid "Room list"
+msgstr "Lista de Salas"
+
+#: ../src/roomops.c:2985
+msgid "Folder list"
+msgstr "Lista de carpetas"
+
+#: ../src/rss.c:34
+msgid "Email"
+msgstr "Email"
+
+#: ../src/rss.c:73
+msgid "Not logged in"
+msgstr "No conectado ahora"
+
+#: ../src/rss.c:92
+msgid "Error retrieving RSS feed: couldn't find messages\n"
+msgstr "Error de respuesta RSS: no se pudieron encontrar mensajes\n"
+
+#: ../src/siteconfig.c:38
+msgid "Site configuration"
+msgstr "Configuración del sitio"
+
+#: ../src/siteconfig.c:61
+msgid "General"
+msgstr "General"
+
+#: ../src/siteconfig.c:62
+msgid "Access"
+msgstr "Acceso"
+
+#: ../src/siteconfig.c:63
+msgid "Network"
+msgstr "Red"
+
+#: ../src/siteconfig.c:64
+msgid "Tuning"
+msgstr "Afinar"
+
+#: ../src/siteconfig.c:65
+msgid "Directory"
+msgstr "Directorio"
+
+#: ../src/siteconfig.c:66
+msgid "Auto-purger"
+msgstr "Autopurgar"
+
+#: ../src/siteconfig.c:67
+msgid "Indexing/Journaling"
+msgstr "Indexar/Journaling"
+
+#: ../src/siteconfig.c:71
+msgid "General site configuration items"
+msgstr "Elementos de configuración general del sitio"
+
+#: ../src/siteconfig.c:75
+msgid "Access controls and site policy settings"
+msgstr "Control de acceso y política general del sitio"
+
+#: ../src/siteconfig.c:79
+msgid "Network services"
+msgstr "Servicios de red"
+
+#: ../src/siteconfig.c:80 ../src/siteconfig.c:90
+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"
+#: ../src/siteconfig.c:85
+msgid "Advanced server fine-tuning controls"
+msgstr "Control de afinación fina avanzada del servidor"
+
+#: ../src/siteconfig.c:89
+msgid "Configure the LDAP connector for Citadel"
+msgstr "Configurar la conexión LDAP para Citadel"
+
+#: ../src/siteconfig.c:95
+msgid "Configure automatic expiry of old messages"
+msgstr "Configurar expiración automática de mensajes antiguos"
+
+#: ../src/siteconfig.c:96
+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."
+
+#: ../src/siteconfig.c:100
+msgid "Indexing and Journaling"
+msgstr "Indexado y jornalización"
+
+#: ../src/siteconfig.c:101
+msgid "Warning: these facilities are resource intensive."
+msgstr "Advertencia: estas utilidades consumen muchos recursos."
+
+#: ../src/siteconfig.c:119
+#, c-format
+msgid "Fully qualified domain name"
+msgstr "Nombre de dominio totalmente cualificado"
+
+#: ../src/siteconfig.c:126
+#, c-format
+msgid "Human-readable node name"
+msgstr "Nombre del nodo humanamente legible"
+
+#: ../src/siteconfig.c:133
+#, c-format
+msgid "Telephone number"
+msgstr "Número de teléfono"
+
+#: ../src/siteconfig.c:140
+#, c-format
+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"
+
+#: ../src/siteconfig.c:148
+#, c-format
+msgid "Server connection idle timeout (in seconds)"
+msgstr "Tiempo máximo de espera de conexión (en segundos)"
+
+#: ../src/siteconfig.c:155
+#, c-format
+msgid "Initial access level for new users"
+msgstr "Nivel de acceso inicial para nuevos usuarios"
+
+#: ../src/siteconfig.c:169
+#, c-format
+msgid "Require registration for new users"
+msgstr "Se requiere registro para nuevos usuarios"
+
+#: ../src/siteconfig.c:177
+#, c-format
+msgid "Quarantine messages from problem users"
+msgstr "Poner en cuarentena mensajes de usuarios problemáticos"
+
+#: ../src/siteconfig.c:185
+#, c-format
+msgid "Name of quarantine room"
+msgstr "Nombre de la sala de cuarentena"
+
+#: ../src/siteconfig.c:192
+#, c-format
+msgid "Paginator prompt (for text mode clients)"
+msgstr "Paginador de texto (para clintes en modo texto)"
+
+#: ../src/siteconfig.c:199
+#, c-format
+msgid "Restrict access to Internet mail"
+msgstr "Restringir acceso a Correo Internet"
+
+#: ../src/siteconfig.c:207
+#, c-format
+msgid "Geographic location of this system"
+msgstr "Localización geográfica de este sistema"
+
+#: ../src/siteconfig.c:214
+#, c-format
+msgid "Name of system administrator"
+msgstr "Nombre del administrador de sistema"
+
+#: ../src/siteconfig.c:221
+#, c-format
+msgid "Maximum concurrent sessions (0 = no limit)"
+msgstr "Número máximo de sesiones concurrentes (0 = sin límite)"
+
+#: ../src/siteconfig.c:228
+#, c-format
+msgid "Default user purge time (days)"
+msgstr "Purga de usuario por defecto (dias)"
+
+#: ../src/siteconfig.c:235
+#, c-format
+msgid "Default room purge time (days)"
+msgstr "Purga por defecto de salas  (días)"
+
+#: ../src/siteconfig.c:242
+#, c-format
+msgid "Name of room to log pages"
+msgstr "Nombre de la sala para páginas de log"
+
+#: ../src/siteconfig.c:249
+#, c-format
+msgid "Access level required to create rooms"
+msgstr "Nivel de acceso requerido para crear salas"
+
+#: ../src/siteconfig.c:263
+#, c-format
+msgid "Maximum message length"
+msgstr "Longitud máxima de mensajes"
+
+#: ../src/siteconfig.c:270
+#, c-format
+msgid "Minimum number of worker threads"
+msgstr "Número mínimo de temáticas funcionando"
+
+#: ../src/siteconfig.c:277
+#, c-format
+msgid "Maximum number of worker threads"
+msgstr "Número máximo de temáticas funcionando"
+
+#: ../src/siteconfig.c:284
+#, c-format
+msgid "POP3 listener port (-1 to disable)"
+msgstr "Puerto de escucha POP3 (-1 para desactivar)"
+
+#: ../src/siteconfig.c:291
+#, c-format
+msgid "SMTP MTA port (-1 to disable)"
+msgstr "Puerto SMTP MTA (-1 para desactivar)"
+
+#: ../src/siteconfig.c:298
+#, c-format
+msgid "Correct forged From: lines during authenticated SMTP"
+msgstr "Correfir forged From: lineas durante SMTP autenticada"
+
+#: ../src/siteconfig.c:306
+#, c-format
+msgid "Allow aides to zap (forget) rooms"
+msgstr "Permitir a administradores olvidar (zap) salas"
+
+#: ../src/siteconfig.c:314
+#, c-format
+msgid "IMAP listener port (-1 to disable)"
+msgstr "Puerto de escucha IMAP (-1 para desactivar)"
+
+#: ../src/siteconfig.c:321
+#, c-format
+msgid "Network run frequency (in seconds)"
+msgstr "Frecuencia de marcha de red (en segundos)"
+
+#: ../src/siteconfig.c:328
+#, c-format
+msgid "Disable self-service user account creation"
+msgstr "Desactivar autoservicio en cuanto a creación de cuentas de usuario"
+
+#: ../src/siteconfig.c:336
+#, c-format
+msgid "Hour to run database auto-purge"
+msgstr "Hora para correr la autopurga de bases de datos"
+
+#: ../src/siteconfig.c:352
+#, c-format
+msgid "Host name of LDAP server (blank to disable)"
+msgstr "Nombre del Host del sevidor LDAP (en blanco para desactivar)"
+
+#: ../src/siteconfig.c:359
+#, c-format
+msgid "Port number of LDAP server (blank to disable)"
+msgstr "Número del puerto del servidor LDAP (en blanco para desactivar)"
+
+#: ../src/siteconfig.c:366
+#, c-format
+msgid "Base DN"
+msgstr "Base DN"
+
+#: ../src/siteconfig.c:373
+#, c-format
+msgid "Bind DN"
+msgstr "Bind DN"
+
+#: ../src/siteconfig.c:380
+#, c-format
+msgid "Password for bind DN"
+msgstr "Contraseña para bind DN"
+
+#: ../src/siteconfig.c:388
+#, c-format
+msgid "Server IP address (0.0.0.0 for 'any')"
+msgstr "Dirección de servidor IP (0.0.0.0 para 'cualquiera')"
+
+#: ../src/siteconfig.c:395
+#, c-format
+msgid "SMTP MSA port (-1 to disable)"
+msgstr "Puerto SMTP MSA (-1 para desactivar)"
+
+#: ../src/siteconfig.c:402
+#, c-format
+msgid "IMAP over SSL port (-1 to disable)"
+msgstr "Puerto IMAP sobre SSL (-1 para desactivar)"
+
+#: ../src/siteconfig.c:409
+#, c-format
+msgid "POP3 over SSL port (-1 to disable)"
+msgstr "Puerto POP3 sobre SSL (-1 para desactivar)"
+
+#: ../src/siteconfig.c:416
+#, c-format
+msgid "SMTP over SSL port (-1 to disable)"
+msgstr "Puerto SMTP sobre SSL (-1 para desactivar)"
+
+#: ../src/siteconfig.c:423
+#, c-format
+msgid "Enable full text index"
+msgstr "Activar índice de texto completo"
+
+#: ../src/siteconfig.c:431
+#, c-format
+msgid "Automatically delete committed database logs"
+msgstr "Borrar automáticamente logs de la base de datos pasados"
+
+#: ../src/siteconfig.c:439
+#, c-format
+msgid "Instantly expunge deleted messages in IMAP"
+msgstr "Desechar automáticamente mensajes borrados en IMAP"
+
+#: ../src/siteconfig.c:447
+#, c-format
+msgid "Allow unauthenticated SMTP clients to spoof this site's domains"
+msgstr "Permitir a cliente SMTP no autenticados hacer spoof a los dominios de este sitio"
+
+#: ../src/siteconfig.c:455
+#, c-format
+msgid "Perform journaling of email messages"
+msgstr "Realizar jornalización de mensajes de correo electrónico"
+
+#: ../src/siteconfig.c:463
+#, c-format
+msgid "Perform journaling of non-email messages"
+msgstr "Realizar jornalización de mensajes de tipo no email"
+
+#: ../src/siteconfig.c:471
+#, c-format
+msgid "Email destination of journalized messages"
+msgstr "Correo electrónico de destino de los mensajes jornalizados"
+
+#: ../src/siteconfig.c:497
+#, c-format
+msgid "Default message expire policy for public rooms"
+msgstr "Política de expiración por defecto para salas públicas"
+
+#: ../src/siteconfig.c:518
+#, c-format
+msgid "Default message expire policy for private mailboxes"
+msgstr "Política de expiración de mensajes por defecto para buzones privados"
+
+#: ../src/siteconfig.c:522
+#, c-format
+msgid "Same policy as public rooms"
+msgstr "Misma política que para salas públicas"
+
+#: ../src/siteconfig.c:644
+msgid "Your system configuration has been updated."
+msgstr "Su confiración de sistema ha sido actualizada"
+
+#: ../src/subst.c:216
+msgid "ERROR: could not open template "
+msgstr "ERROR: no se pudo abrir la plantilla (template) "
+
+#: ../src/summary.c:35
+msgid "(nothing)"
+msgstr "(nada)"
+
+#: ../src/summary.c:50
+msgid "Messages"
+msgstr "Mensajes"
+
+#: ../src/summary.c:87
+msgid "Who's&nbsp;online&nbsp;now"
+msgstr "Quién está&nbsp;en línea&nbsp;ahora"
+
+#: ../src/summary.c:122
+msgid "(None)"
+msgstr "(Ninguno)"
+
+#: ../src/summary.c:135
+msgid "(This server does not support task lists)"
+msgstr "(Este servidro no soporta listas de tarea)"
+
+#: ../src/summary.c:151
+msgid "Today&nbsp;on&nbsp;your&nbsp;calendar"
+msgstr "Hoy&nbsp;en&nbsp;su&nbsp;calendario"
+
+#: ../src/summary.c:164
+msgid "(Nothing)"
+msgstr "(Nada)"
+
+#: ../src/summary.c:176
+msgid "(This server does not support calendars)"
+msgstr "(Este servidro no soporta calendarios)"
+
+#: ../src/summary.c:188
+msgid "About&nbsp;this&nbsp;server"
+msgstr "Acerca&nbsp;de este&nbsp;servidor"
+
+#: ../src/summary.c:192
+#, c-format
+msgid ""
+"You are connected to %s, running %s with %s, and located in %s.  Your system "
+"administrator is %s."
+msgstr ""
+"Estás conectado a %s, corriendo %s con %s, y localizado en %s.  Tu administrador de sistema "
+"es %s."
+
+#: ../src/summary.c:259
+#, c-format
+msgid "Summary page for %s"
+msgstr "Página sumario para %s"
+
+#: ../src/sysmsgs.c:40
+#, c-format
+msgid "Edit %s"
+msgstr "Editar %s"
+
+#: ../src/sysmsgs.c:44
+#, c-format
+msgid ""
+"Enter %s below.  Text is formatted to the reader's screen width.  To defeat "
+"the formatting, indent a line at least one space."
+msgstr ""
+"Introducir %s abajo. El texto se reformateará según ancho de pantalla del lector. "
+"To defeat the formatting, indent a line at least one space."
+
+#: ../src/sysmsgs.c:79
+#, c-format
+msgid "Cancelled.  %s was not saved."
+msgstr "Cancelado %s no se salvó"
+
+#: ../src/sysmsgs.c:98
+#, c-format
+msgid "%s has been saved."
+msgstr "%s no se salvó"
+
+#: ../src/useredit.c:31
+msgid "Edit or delete users"
+msgstr "Editar o borrar usuarios"
+
+#: ../src/useredit.c:40
+msgid "Add users"
+msgstr "Añadir usuarios"
+
+#: ../src/useredit.c:43
+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'."
+
+#: ../src/useredit.c:48
+msgid "New user: "
+msgstr "Nuevo usuario: "
+
+#: ../src/useredit.c:51
+msgid "Create"
+msgstr "Crear"
+
+#: ../src/useredit.c:57
+msgid "Edit or Delete users"
+msgstr "Editar o Borrar usuarios"
+
+#: ../src/useredit.c:60
+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'."
+
+#: ../src/useredit.c:83
+msgid "Edit configuration"
+msgstr "Editar configuración"
+
+#: ../src/useredit.c:84
+msgid "Edit address book entry"
+msgstr "Editar entrada de la libreta de direcciones"
+
+#: ../src/useredit.c:86
+msgid "Delete user"
+msgstr "Borrar usuario"
+
+#: ../src/useredit.c:86
+msgid "Delete this user?"
+msgstr "¿Borrar este usuario?"
+
+#: ../src/useredit.c:204
+msgid ""
+"An error occurred while trying to create or edit this address book entry.."
+msgstr ""
+"Ocurrió un error mientras se intentaba crear o editar esta entrada de la libreta de direcciones."
+#: ../src/useredit.c:283
+msgid "Edit user account: "
+msgstr "Editar cuenta de usuario:"
+
+#: ../src/useredit.c:303
+msgid "Password"
+msgstr "Contraseña"
+
+#: ../src/useredit.c:310
+msgid "Permission to send Internet mail"
+msgstr "Autorización para enviar correo Internet"
+
+#: ../src/useredit.c:319
+msgid "Number of logins"
+msgstr "Número de conexiones"
+
+#: ../src/useredit.c:326
+msgid "Messages submitted"
+msgstr "Mensajes enviados"
+
+#: ../src/useredit.c:333
+msgid "Access level"
+msgstr "Nivel de acceso"
+
+#: ../src/useredit.c:347
+msgid "User ID number"
+msgstr "ID de usuario"
+
+#: ../src/useredit.c:355
+msgid "Date and time of last login"
+msgstr "Fecha y hora de la última conexión"
+
+#: ../src/useredit.c:370
+msgid "Auto-purge after this many days"
+msgstr "Autopurgar despues de estos muchos dias"
+
+#: ../src/useredit.c:402
+msgid "Changes were not saved."
+msgstr "Los cambios no se salvaron"
+
+#: ../src/useredit.c:486
+#, c-format
+msgid "A new user has been created."
+msgstr "Se creó un nuevo usuario"
+
+#: ../src/userlist.c:48
+#, c-format
+msgid "User list for %s"
+msgstr "Lista de usuarios %s"
+
+#: ../src/userlist.c:66
+msgid "User Name"
+msgstr "Nombre de Usuario"
+
+#: ../src/userlist.c:67
+msgid "Number"
+msgstr "Número"
+
+#: ../src/userlist.c:68
+msgid "Access Level"
+msgstr "Nivel de Acceso"
+
+#: ../src/userlist.c:69
+msgid "Last Login"
+msgstr "Última conexión"
+
+#: ../src/userlist.c:70
+msgid "Total Logins"
+msgstr "Total de conexiones"
+
+#: ../src/userlist.c:71
+msgid "Total Posts"
+msgstr "Correos Totales"
+
+#: ../src/userlist.c:129
+msgid "User profile"
+msgstr "Profile de usuario"
+
+#: ../src/userlist.c:165
+#, c-format
+msgid "Click here to send an instant message to %s"
+msgstr "Pulse aquí para enviar un mensaje instantáneo a %s"
+
+#: ../src/vcard_edit.c:184
+msgid "Edit contact information"
+msgstr "Editar información de contacto"
+
+#: ../src/vcard_edit.c:200
+msgid "Prefix"
+msgstr "Prefijo"
+
+#: ../src/vcard_edit.c:200
+msgid "First"
+msgstr "Primero"
+
+#: ../src/vcard_edit.c:200
+msgid "Middle"
+msgstr "Medio"
+
+#: ../src/vcard_edit.c:200
+msgid "Último"
+msgstr ""
+
+#: ../src/vcard_edit.c:200
+msgid "Suffix"
+msgstr "Sufijo"
+
+#: ../src/vcard_edit.c:221
+msgid "Display name:"
+msgstr "Mostrar nombre:"
+
+#: ../src/vcard_edit.c:228
+msgid "Title:"
+msgstr "Título:"
+
+#: ../src/vcard_edit.c:235
+msgid "Organization:"
+msgstr "Organización:"
+
+#: ../src/vcard_edit.c:246
+msgid "PO box:"
+msgstr "Aptdo. Correos"
+
+#: ../src/vcard_edit.c:262
+msgid "City:"
+msgstr "Ciudad"
+
+#: ../src/vcard_edit.c:268
+msgid "State:"
+msgstr "Estado:"
+
+#: ../src/vcard_edit.c:274
+msgid "ZIP code:"
+msgstr "Código postal"
+
+#: ../src/vcard_edit.c:280
+msgid "Country:"
+msgstr "País"
+
+#: ../src/vcard_edit.c:290
+msgid "Home telephone:"
+msgstr "Teléfono de casa"
+
+#: ../src/vcard_edit.c:296
+msgid "Work telephone:"
+msgstr "Teléfono del trabajo"
+
+#: ../src/vcard_edit.c:307
+msgid "Primary Internet e-mail address"
+msgstr "Dirección de email primaria"
+
+#: ../src/vcard_edit.c:314
+msgid "Internet e-mail aliases"
+msgstr "Alias de email"
+
+#: ../src/webcit.c:685
+#, c-format
+msgid "An error occurred while retrieving this part: %s\n"
+msgstr "Ocurrió un error mientras se recuperaba esta parte: %s\n"
+
+#: ../src/webcit.c:771
+msgid "Make this my start page"
+msgstr "Hacer de esta mi página de inicio"
+
+#: ../src/webcit.c:790
+msgid "You no longer have a start page selected."
+msgstr "Ya no tiene página de inicio seleccionada."
+
+#: ../src/webcit.c:826
+msgid "Authorization Required"
+msgstr "Autorización requerida"
+
+#: ../src/webcit.c:828
+#, 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"
+
+#: ../src/webcit.c:1255
+#, 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"
+
+#: ../src/webcit.c:1492 ../src/webcit.c:1494
+msgid "Room info"
+msgstr "Información de sala"
+
+#: ../src/webcit.c:1497 ../src/webcit.c:1499
+msgid "Your bio"
+msgstr "Tu biografía"
+
+#: ../src/webcit.c:1507
+msgid "your photo"
+msgstr "tu foto"
+
+#: ../src/webcit.c:1513
+msgid "the icon for this room"
+msgstr "el icono par esta sala"
+
+#: ../src/webcit.c:1527
+msgid "the icon for this floor"
+msgstr "el icono para este nivel"
+
+#: ../src/who.c:27
+msgid "User name"
+msgstr "Nombre de usuario"
+
+#: ../src/who.c:28
+msgid "Room"
+msgstr "Sala"
+
+#: ../src/who.c:29
+msgid "From host"
+msgstr "Desde el host"
+
+#: ../src/who.c:62
+msgid "(kill)"
+msgstr "(matar)"
+
+#: ../src/who.c:65
+msgid "(edit)"
+msgstr "(editar)"
+
+#: ../src/who.c:141
+msgid "Do you really want to kill this session?"
+msgstr "¿Realmente quiere matar esta sesión?"
+
+#: ../src/who.c:151
+#, c-format
+msgid "Users currently on %s"
+msgstr "Usuarios actualmente en %s"
+
+#: ../src/who.c:166
+#, c-format
+msgid ""
+"Click on a name to read user info.  Click on %s to send an instant message "
+"to that user."
+msgstr ""
+"Pulse en un nombre para leer la información del usuario. Pulse en %s para enviar un mensaje instantáneo "
+"a ese usuario. "
+
+#: ../src/who.c:228
+msgid "Edit your session display"
+msgstr "Editar la vista de sus sesión"
+
+#: ../src/who.c:232
+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. "
+
+#: ../src/who.c:244
+msgid "Room name:"
+msgstr "Nombre  de sala"
+
+#: ../src/who.c:249
+msgid "Change room name"
+msgstr "Cambiar nombre de sala"
+
+#: ../src/who.c:253
+msgid "Host name:"
+msgstr "Nombre de Host"
+
+#: ../src/who.c:258
+msgid "Change host name"
+msgstr "Cambiar nombre de host"
+
+#: ../src/who.c:268
+msgid "Change user name"
+msgstr "Cambiar nombre de usuario"
+
+#: ../src/wiki.c:64
+#, c-format
+msgid "There is no room called '%s'."
+msgstr "No existe la sala denominada '%s'."
+
+#: ../src/wiki.c:74
+#, c-format
+msgid "'%s' is not a Wiki room."
+msgstr "'%s' no es una sala Wiki."
+
+#: ../src/wiki.c:100
+#, c-format
+msgid "There is no page called '%s' here."
+msgstr "Aquí no existe ninguna página denominada '%s'."
+
+#: ../src/wiki.c:102
+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 desea"
+"crear esta página."
diff --git a/webcit/po/it.po b/webcit/po/it.po
new file mode 100644 (file)
index 0000000..c56a634
--- /dev/null
@@ -0,0 +1,2844 @@
+# translation of it.po to italian\r
+# Copyright (C) 2005 The Citadel Project - http://www.citadel.org\r
+# This file is distributed under the same license as the WebCit package.\r
+#\r
+# Gabriele Tassoni <tasso@fastwebnet.it>, 2005, 2006.\r
+msgid ""\r
+msgstr ""\r
+"Project-Id-Version: it\n"\r
+"Report-Msgid-Bugs-To: \n"\r
+"POT-Creation-Date: 2006-02-13 21:49+0100\n"\r
+"PO-Revision-Date: 2006-02-27 10:07+0100\n"\r
+"Last-Translator: Gabriele Tassoni <tasso@fastwebnet.it>\n"\r
+"Language-Team: italian <it@li.org>\n"\r
+"MIME-Version: 1.0\n"\r
+"Content-Type: text/plain; charset=UTF-8\n"\r
+"Content-Transfer-Encoding: 8bit\n"\r
+"X-Generator: KBabel 1.11.1\n"\r
+\r
+#: ../auth.c:23\r
+msgid "Deleted"\r
+msgstr "Cancellato"\r
+\r
+#: ../auth.c:24 ../auth.c:72\r
+msgid "New User"\r
+msgstr "Nuovo Utente"\r
+\r
+#: ../auth.c:25\r
+msgid "Problem User"\r
+msgstr "Utente con Problemi"\r
+\r
+#: ../auth.c:26\r
+msgid "Local User"\r
+msgstr "Utente Locale"\r
+\r
+#: ../auth.c:27\r
+msgid "Network User"\r
+msgstr "Utente di Rete"\r
+\r
+#: ../auth.c:28\r
+msgid "Preferred User"\r
+msgstr "Utente Preferito"\r
+\r
+#: ../auth.c:29\r
+msgid "Aide"\r
+msgstr "Amministratore"\r
+\r
+#: ../auth.c:52\r
+#, c-format\r
+msgid ""\r
+"<ul><li><b>If you already have an account on %s</b>, enter your user name "\r
+"and password and click &quot;Login.&quot; <li><b>If you are a new user</b>, "\r
+"enter the name and password you wish to use, and click &quot;New User.&quot; "\r
+"<li>Please log off properly when finished. <li>You must use a browser that "\r
+"supports <i>frames</i> and <i>cookies</i>. <li>Also keep in mind that if "\r
+"your browser is configured to block pop-up windows, you will not be able to "\r
+"receive any instant messages.<br /></ul>"\r
+msgstr ""\r
+"<ul><li><b>Se hai gi&agrave; un account su %s</b>, fornisci il tuo nome "\r
+"utente e la tua password e clicca su &quot;Login.&quot; <li><b>Se sei un "\r
+"nuovo utente</b>, fornisci il nome utente e la password che vorresti e "\r
+"clicca su &quot;Nuovo Utente.&quot; <li>Per favore, eseguire il logout in "\r
+"maniera corretta prima di uscire. <li>Devi usare un Browser che supporti i  "\r
+"<i>frames</i> e i <i>cookies</i>. <li>Tieni anche a mente che se il tuo "\r
+"browser &egrave; configurato per bloccare le finestre di pop up, non "\r
+"riuscirai a ricevere nessun messaggio istantaneo.<br /></ul>"\r
+\r
+#: ../auth.c:68 ../who.c:263\r
+msgid "User name:"\r
+msgstr "Nome utente:"\r
+\r
+#: ../auth.c:69\r
+msgid "Password:"\r
+msgstr "Password:"\r
+\r
+#: ../auth.c:70\r
+msgid "Language:"\r
+msgstr "Lingua:"\r
+\r
+#: ../auth.c:71\r
+msgid "Login"\r
+msgstr "Login"\r
+\r
+#: ../auth.c:73 ../paging.c:510\r
+msgid "Exit"\r
+msgstr "Uscita"\r
+\r
+#: ../auth.c:75\r
+#, c-format\r
+msgid "%s - powered by Citadel"\r
+msgstr "%s - potenziato da Citadel"\r
+\r
+#: ../auth.c:166 ../auth.c:534\r
+msgid "Blank passwords are not allowed."\r
+msgstr "Le password vuote non sono ammesse."\r
+\r
+#: ../auth.c:187\r
+msgid "Your password was not accepted."\r
+msgstr "La tua password non &egrave; stata accettata."\r
+\r
+#: ../auth.c:295\r
+msgid ""\r
+"This program was unable to connect or stay connected to the Citadel server.  "\r
+"Please report this problem to your system administrator."\r
+msgstr ""\r
+"Questo programma non riesce a collegarsi o a rimanere collegato al server "\r
+"Citadel. Per favore, segnala questo errore all'amministratore di sistema."\r
+\r
+#: ../auth.c:302\r
+msgid "Log in again"\r
+msgstr "Esegui nuovamente il Log in"\r
+\r
+#: ../auth.c:305\r
+msgid "Close window"\r
+msgstr "Chiudi la finestra"\r
+\r
+#: ../auth.c:326 ../mainmenu.c:241\r
+msgid "Validate new users"\r
+msgstr "Valida il nuovo utente"\r
+\r
+#: ../auth.c:346\r
+msgid "No users require validation at this time."\r
+msgstr "Non si richiede l'autenticazione utente in questo momento"\r
+\r
+#: ../auth.c:387\r
+#, c-format\r
+msgid "Current access level: %d (%s)\n"\r
+msgstr "Attuale livello di accesso: %d (%s)\n"\r
+\r
+#: ../auth.c:395\r
+msgid "Select access level for this user:"\r
+msgstr "Seleziona il livello di accesso per l'utente corrente:"\r
+\r
+#: ../auth.c:458 ../mainmenu.c:137\r
+msgid "Change your password"\r
+msgstr "Cambia la tua password"\r
+\r
+#: ../auth.c:487\r
+msgid "Enter new password:"\r
+msgstr "Inserisci la nuova password:"\r
+\r
+#: ../auth.c:491\r
+msgid "Enter it again to confirm:"\r
+msgstr "Inseriscila nuovamente per conferma:"\r
+\r
+#: ../auth.c:496\r
+msgid "Change password"\r
+msgstr "Cambia la password"\r
+\r
+#: ../auth.c:498 ../calendar.c:616 ../event.c:390 ../graphics.c:58\r
+#: ../iconbar.c:712 ../mainmenu.c:300 ../messages.c:2894 ../messages.c:3015\r
+#: ../messages.c:3103 ../netconf.c:86 ../netconf.c:149 ../paging.c:58\r
+#: ../preferences.c:389 ../roomops.c:1285 ../roomops.c:1613 ../roomops.c:2046\r
+#: ../roomops.c:2195 ../roomops.c:2259 ../siteconfig.c:564 ../sysmsgs.c:59\r
+#: ../useredit.c:381 ../vcard_edit.c:336 ../who.c:273\r
+msgid "Cancel"\r
+msgstr "Cancella"\r
+\r
+#: ../auth.c:515\r
+msgid "Cancelled.  Password was not changed."\r
+msgstr "Aziona cancellata. La password non &egrave; stata cambiata. "\r
+\r
+#: ../auth.c:526\r
+msgid "They don't match.  Password was not changed."\r
+msgstr "Le password non coincidono. Cambiamento non effettuato."\r
+\r
+#: ../availability.c:140\r
+msgid "availability unknown"\r
+msgstr "Disponibilit&agrave; sconosciuta"\r
+\r
+#: ../availability.c:161\r
+msgid "free"\r
+msgstr "libero"\r
+\r
+#: ../availability.c:171\r
+msgid "BUSY"\r
+msgstr "OCCUPATO"\r
+\r
+#: ../calendar.c:24\r
+msgid ""\r
+"<I>This message contains calendaring/scheduling information, but support for "\r
+"calendars is not available on this particular system.  Please ask your "\r
+"system administrator to install a new version of the Citadel web service "\r
+"with calendaring enabled.</I><br />\n"\r
+msgstr ""\r
+"<I>Questo messaggio contiene informazioni di organizzazione/programmazione, "\r
+"ma in questo particolare sistema, il supporto per i calendari non &egrave; "\r
+"disponibile. Per favore, chiedi al tuo amministratore di sistema di "\r
+"installare una nuova versione del servizion web di Citadel con il calendario "\r
+"abilitato.</I><br />\n"\r
+\r
+#: ../calendar.c:38\r
+msgid ""\r
+"<i>Cannot display calendar item.  You are seeing this error because your "\r
+"WebCit service has not been installed with calendar support.  Please contact "\r
+"your system administrator.</i><br />\n"\r
+msgstr ""\r
+"<i>Non posso mostrare l'oggetto calendario. Stai vedendo questo messaggio "\r
+"perch&egrave; il servizio WebCit non &egrave; stato installato col supporto "\r
+"al calendario. Per favore, contatta il tuo amministratore di sistema.</"\r
+"i><br />\n"\r
+\r
+#: ../calendar.c:50\r
+msgid ""\r
+"<i>Cannot display to-do item.  You are seeing this error because your WebCit "\r
+"service has not been installed with calendar support.  Please contact your "\r
+"system administrator.</i><br />\n"\r
+msgstr ""\r
+"<i>Non posso mostrare l'oggetto cose da fare. Stai vedendo questo messaggio "\r
+"perch&egrave; il servizio WebCit non &egrave; stato installato col supporto "\r
+"al calendario. Per favore, contatta il tuo amministratore di sistema.</"\r
+"i><br />\n"\r
+\r
+#: ../calendar.c:107\r
+msgid "Meeting invitation"\r
+msgstr "Invito a un incontro"\r
+\r
+#: ../calendar.c:116\r
+msgid "Attendee's reply to your invitation"\r
+msgstr "Risposta del membro al tuo invito"\r
+\r
+#: ../calendar.c:125\r
+msgid "Published event"\r
+msgstr "Evento pubblicato"\r
+\r
+#: ../calendar.c:130\r
+msgid "This is an unknown type of calendar item."\r
+msgstr "Questo &egrave un tipo di calendario sconosciuto."\r
+\r
+#: ../calendar.c:139 ../calendar.c:560\r
+msgid "Summary:"\r
+msgstr "Sommario:"\r
+\r
+#: ../calendar.c:148\r
+msgid "Location:"\r
+msgstr "Luogo:"\r
+\r
+#: ../calendar.c:174\r
+msgid "Date:"\r
+msgstr "Data:"\r
+\r
+#: ../calendar.c:181\r
+msgid "Starting date/time:"\r
+msgstr "Data e ora di inizio:"\r
+\r
+#: ../calendar.c:192\r
+msgid "Ending date/time:"\r
+msgstr "Data e ora di fine:"\r
+\r
+#: ../calendar.c:201 ../calendar.c:596\r
+msgid "Description:"\r
+msgstr "Descrizione:"\r
+\r
+#: ../calendar.c:210\r
+msgid "Attendee:"\r
+msgstr "Membro:"\r
+\r
+#: ../calendar.c:250\r
+#, c-format\r
+msgid "This is an update of '%s' which is already in your calendar."\r
+msgstr "Questo &egrave; un aggiornamento di '%s' gi&egrave; nel tuo calendario."\r
+\r
+#: ../calendar.c:254\r
+#, c-format\r
+msgid "This event would conflict with '%s' which is already in your calendar."\r
+msgstr ""\r
+"Questo evento &egrave; in conflitto con l'evento '%s' gi&agrave; presente "\r
+"nel tuo calendario."\r
+\r
+#: ../calendar.c:259\r
+msgid "Update:"\r
+msgstr "Aggiorna:"\r
+\r
+#: ../calendar.c:260\r
+msgid "CONFLICT:"\r
+msgstr "CONFLITTO:"\r
+\r
+#: ../calendar.c:278\r
+msgid "How would you like to respond to this invitation?"\r
+msgstr "Come vuoi rispondere a questo invito?"\r
+\r
+#: ../calendar.c:279\r
+msgid "Accept"\r
+msgstr "Accetta"\r
+\r
+#: ../calendar.c:280\r
+msgid "Tentative"\r
+msgstr "Tentativo"\r
+\r
+#: ../calendar.c:281\r
+msgid "Decline"\r
+msgstr "Declina"\r
+\r
+#: ../calendar.c:305\r
+msgid "Click <i>Update</i> to accept this reply and update your calendar."\r
+msgstr ""\r
+"Seleziona <i>Aggiorna</i> Per accettare questa risposta e aggiornare il tuo "\r
+"calendario."\r
+\r
+#: ../calendar.c:306\r
+msgid "Update"\r
+msgstr "Aggiorna"\r
+\r
+#: ../calendar.c:307\r
+msgid "Ignore"\r
+msgstr "Ignora"\r
+\r
+#: ../calendar.c:334\r
+msgid "There was an error parsing this calendar item."\r
+msgstr "C'&egrave; un errore in questo oggetto del calendario."\r
+\r
+#: ../calendar.c:361\r
+msgid "Respond to meeting request"\r
+msgstr "Rispondi alla richiesta di incontro"\r
+\r
+#: ../calendar.c:380\r
+msgid ""\r
+"You have accepted this meeting invitation.  It has been entered into your "\r
+"calendar."\r
+msgstr ""\r
+"Hai accettato questo invito all'incontro. &egrave; stato aggiunto al tuo "\r
+"calendario."\r
+\r
+#: ../calendar.c:384\r
+msgid ""\r
+"You have tentatively accepted this meeting invitation.  It has been "\r
+"'pencilled in' to your calendar."\r
+msgstr ""\r
+"Hai accettato questo messaggio in forse. &egrave; stato \"segnato a matita\" "\r
+"nel tuo calendario"\r
+\r
+#: ../calendar.c:388\r
+msgid ""\r
+"You have declined this meeting invitation.  It has <b>not</b> been entered "\r
+"into your calendar."\r
+msgstr "Hai declinato l'invito. Non &egrave; stato inserito nel tuo calendario."\r
+\r
+#: ../calendar.c:393\r
+msgid "A reply has been sent to the meeting organizer."\r
+msgstr "Una risposta &egrave; stata mandata all'organizzatore dell'incontro."\r
+\r
+#: ../calendar.c:403 ../calendar.c:457\r
+msgid "Return to messages"\r
+msgstr "Ritorna ai messaggi."\r
+\r
+#: ../calendar.c:422\r
+msgid "Update your calendar with this RSVP"\r
+msgstr "Aggiorna il tuo calendario con questo RSVP"\r
+\r
+#: ../calendar.c:441\r
+msgid "Your calendar has been updated to reflect this RSVP."\r
+msgstr "Il tuo calendario &egrave; stato aggiornato per riflettere questo RSVP."\r
+\r
+#: ../calendar.c:443\r
+msgid ""\r
+"You have chosen to ignore this RSVP. Your calendar has <b>not</b> been "\r
+"updated."\r
+msgstr ""\r
+"Hai scelto di ignorare questo RSVP. il tuo calendario <b>non</b> "\r
+"verr&agrave; aggiornato."\r
+\r
+#: ../calendar.c:544\r
+msgid "Edit task"\r
+msgstr "Aggiorna questa operazione."\r
+\r
+#: ../calendar.c:571\r
+msgid "Start date:"\r
+msgstr "Data di inizio:"\r
+\r
+#: ../calendar.c:584\r
+msgid "Due date:"\r
+msgstr "Scadenza:"\r
+\r
+#: ../calendar.c:614 ../event.c:387\r
+msgid "Save"\r
+msgstr "Salva"\r
+\r
+#: ../calendar.c:615 ../event.c:388 ../messages.c:903 ../messages.c:2281\r
+msgid "Delete"\r
+msgstr "Cancella"\r
+\r
+#: ../calendar_tools.c:73\r
+msgid "Month: "\r
+msgstr "Mese:"\r
+\r
+#: ../calendar_tools.c:87\r
+msgid "Day: "\r
+msgstr "Giorno:"\r
+\r
+#: ../calendar_tools.c:97\r
+msgid "Year: "\r
+msgstr "Anno:"\r
+\r
+#: ../calendar_tools.c:115\r
+msgid "Hour: "\r
+msgstr "Ora:"\r
+\r
+#: ../calendar_tools.c:135\r
+msgid "Minute: "\r
+msgstr "Minuto:"\r
+\r
+#: ../calendar_tools.c:204\r
+msgid "(status unknown)"\r
+msgstr "(stato sconosciuto)"\r
+\r
+#: ../calendar_tools.c:220\r
+msgid "(needs action)"\r
+msgstr "(serve una azione)"\r
+\r
+#: ../calendar_tools.c:223\r
+msgid "(accepted)"\r
+msgstr "(accettato)"\r
+\r
+#: ../calendar_tools.c:226\r
+msgid "(declined)"\r
+msgstr "(declinato)"\r
+\r
+#: ../calendar_tools.c:229\r
+msgid "(tenative)"\r
+msgstr "(tentativo) "\r
+\r
+#: ../calendar_tools.c:232\r
+msgid "(delegated)"\r
+msgstr "(delegato)"\r
+\r
+#: ../calendar_tools.c:235\r
+msgid "(completed)"\r
+msgstr "(completato)"\r
+\r
+#: ../calendar_tools.c:238\r
+msgid "(in process)"\r
+msgstr "(in lavorazione)"\r
+\r
+#: ../calendar_tools.c:241\r
+msgid "(none)"\r
+msgstr "(nessuno)"\r
+\r
+#: ../calendar_view.c:17\r
+msgid "The calendar view is not available."\r
+msgstr "La vista calendario non &egrave; disponibile."\r
+\r
+#: ../calendar_view.c:24\r
+msgid "The tasks view is not available."\r
+msgstr "La vista operazione non &egrave; disponibile."\r
+\r
+#: ../calendar_view.c:435\r
+msgid "Week"\r
+msgstr "Settimana"\r
+\r
+#: ../calendar_view.c:437\r
+msgid "Hours"\r
+msgstr "Ore"\r
+\r
+#: ../calendar_view.c:438 ../messages.c:2276\r
+msgid "Subject"\r
+msgstr "Oggetto"\r
+\r
+#: ../calendar_view.c:439 ../event.c:164\r
+msgid "Start"\r
+msgstr "Inizio"\r
+\r
+#: ../calendar_view.c:440 ../event.c:218\r
+msgid "End"\r
+msgstr "Fine"\r
+\r
+#: ../calendar_view.c:930\r
+msgid "Name of task"\r
+msgstr "Nome dell'operazione"\r
+\r
+#: ../calendar_view.c:932\r
+msgid "Date due"\r
+msgstr "Data dovuta"\r
+\r
+#: ../event.c:76 ../paging.c:78\r
+msgid "Add or edit an event"\r
+msgstr "Aggiungi o modifica un evento"\r
+\r
+#: ../event.c:142 ../iconbar.c:123 ../iconbar.c:539\r
+msgid "Summary"\r
+msgstr "Sommario"\r
+\r
+#: ../event.c:153\r
+msgid "Location"\r
+msgstr "Luogo"\r
+\r
+#: ../event.c:207\r
+msgid "All day event"\r
+msgstr "Evento per tutto il giorno"\r
+\r
+#: ../event.c:246 ../iconbar.c:199 ../iconbar.c:586\r
+msgid "Notes"\r
+msgstr "Note"\r
+\r
+#: ../event.c:288\r
+msgid "Organizer"\r
+msgstr "Organizer"\r
+\r
+#: ../event.c:293\r
+msgid "(you are the organizer)"\r
+msgstr "(tu sei l'organizzatore)"\r
+\r
+#: ../event.c:311\r
+msgid "Show time as:"\r
+msgstr "Mostra l'ora come:"\r
+\r
+#: ../event.c:333\r
+msgid "Free"\r
+msgstr "Libero"\r
+\r
+#: ../event.c:340\r
+msgid "Busy"\r
+msgstr "Occupato"\r
+\r
+#: ../event.c:346\r
+msgid "Attendees"\r
+msgstr "Membri"\r
+\r
+#: ../event.c:349\r
+msgid "(One per line)"\r
+msgstr "(Uno per linea)"\r
+\r
+#: ../event.c:389\r
+msgid "Check attendee availability"\r
+msgstr "Controlla la disponibilit&agrave; del membro."\r
+\r
+#: ../floors.c:34\r
+msgid "Add/change/delete floors"\r
+msgstr "Agiungi, cambia o cancella i piani"\r
+\r
+#: ../floors.c:51 ../siteconfig.c:49 ../vcard_edit.c:78 ../wiki.c:66\r
+#: ../wiki.c:76\r
+msgid "Error"\r
+msgstr "Errore"\r
+\r
+#: ../floors.c:62\r
+msgid "Floor number"\r
+msgstr "Numero del piano"\r
+\r
+#: ../floors.c:64\r
+msgid "Floor name"\r
+msgstr "Nome del piano"\r
+\r
+#: ../floors.c:66\r
+msgid "Number of rooms"\r
+msgstr "Numero di stanze"\r
+\r
+#: ../floors.c:68\r
+msgid "Floor CSS"\r
+msgstr "Stile del Piano"\r
+\r
+#: ../floors.c:81\r
+msgid "(delete floor)"\r
+msgstr "(Cancella il piano)"\r
+\r
+#: ../floors.c:87\r
+msgid "(edit graphic)"\r
+msgstr "(Modifica la grafica)"\r
+\r
+#: ../floors.c:100\r
+msgid "Change name"\r
+msgstr "Cambia nome"\r
+\r
+#: ../floors.c:113\r
+msgid "Change CSS"\r
+msgstr "Modifica lo Stile"\r
+\r
+#: ../floors.c:125\r
+msgid "Create new floor"\r
+msgstr "Crea un nuovo piano"\r
+\r
+#: ../floors.c:146\r
+#, c-format\r
+msgid "Floor has been deleted."\r
+msgstr "Il piano &egrave; stato cancellato."\r
+\r
+#: ../floors.c:169\r
+#, c-format\r
+msgid "New floor has been created."\r
+msgstr "Il nuovo piano &egrave; stato creato."\r
+\r
+#: ../graphics.c:27\r
+msgid "Image upload"\r
+msgstr "Carica l'immagine"\r
+\r
+#: ../graphics.c:45\r
+msgid ""\r
+"You can upload any image directly from your computer, as long as it is in "\r
+"GIF format (JPEG, PNG, etc. won't work)."\r
+msgstr ""\r
+"Puoi caricare una qualsiasi immagine direttamente dal tuo computer, sempre "\r
+"che sia in formato GIF (JPEG, PNG, etc. non funzioneranno)"\r
+\r
+#: ../graphics.c:50\r
+msgid "Please select a file to upload:"\r
+msgstr "Per favore, seleziona un file da caricare:"\r
+\r
+#: ../graphics.c:54\r
+msgid "Upload"\r
+msgstr "Carica"\r
+\r
+#: ../graphics.c:56\r
+msgid "Reset form"\r
+msgstr "Cancella"\r
+\r
+#: ../graphics.c:74\r
+msgid "Graphics upload has been cancelled."\r
+msgstr "Il caricamento della grafica &egrave; stato cancellato."\r
+\r
+#: ../graphics.c:81\r
+msgid "You didn't upload a file."\r
+msgstr "Non carichi un file."\r
+\r
+#: ../html2html.c:109\r
+#, c-format\r
+msgid "realloc() error! couldn't get %d bytes: %s"\r
+msgstr "errore di realloc()! non riesco a ottenere %d bytes: %s"\r
+\r
+#: ../iconbar.c:105 ../iconbar.c:391\r
+msgid "Find out more about Citadel"\r
+msgstr "Scopri di più  su Citadel"\r
+\r
+#: ../iconbar.c:106 ../iconbar.c:392\r
+msgid "CITADEL"\r
+msgstr "CITADEL"\r
+\r
+#: ../iconbar.c:110\r
+msgid "switch to room list"\r
+msgstr "Visualizza le cartelle"\r
+\r
+#: ../iconbar.c:116 ../iconbar.c:540\r
+msgid "Your summary page"\r
+msgstr "Visualizza il sommario"\r
+\r
+#: ../iconbar.c:133\r
+msgid "Go to your email inbox"\r
+msgstr "Leggi la tua Posta in Arrivo"\r
+\r
+#: ../iconbar.c:140\r
+msgid "Mail"\r
+msgstr "Posta"\r
+\r
+#: ../iconbar.c:158\r
+msgid "Go to your personal calendar"\r
+msgstr "Visualizza il tuo calendario personale"\r
+\r
+#: ../iconbar.c:165 ../iconbar.c:603 ../roomops.c:22\r
+msgid "Calendar"\r
+msgstr "Calendario"\r
+\r
+#: ../iconbar.c:175\r
+msgid "Go to your personal address book"\r
+msgstr "Vai ai tuoi contatti personali"\r
+\r
+#: ../iconbar.c:182 ../iconbar.c:570\r
+msgid "Contacts"\r
+msgstr "Contatti"\r
+\r
+#: ../iconbar.c:192\r
+msgid "Go to your personal notes"\r
+msgstr "Visualizza le tue Note personali"\r
+\r
+#: ../iconbar.c:209\r
+msgid "Go to your personal task list"\r
+msgstr "Visualizza le Attività da portare a termine"\r
+\r
+#: ../iconbar.c:216 ../iconbar.c:618 ../summary.c:109\r
+msgid "Tasks"\r
+msgstr "Attività"\r
+\r
+#: ../iconbar.c:224\r
+msgid "List all of your accessible rooms"\r
+msgstr "Mostra tutte le tue stanze accessibili"\r
+\r
+#: ../iconbar.c:231 ../iconbar.c:634\r
+msgid "Rooms"\r
+msgstr "Stanze"\r
+\r
+#: ../iconbar.c:240\r
+msgid "See who is online right now"\r
+msgstr "Mostra gli altri utenti collegati in questo momento"\r
+\r
+#: ../iconbar.c:247 ../iconbar.c:650\r
+msgid "Who is online?"\r
+msgstr "Chi &egrave; on line?"\r
+\r
+#: ../iconbar.c:265 ../iconbar.c:666\r
+msgid "Chat"\r
+msgstr "Chat"\r
+\r
+#: ../iconbar.c:275\r
+msgid "Advanced Options Menu: Advanced Room commands, Account Info, and Chat"\r
+msgstr ""\r
+"Menu di opzioni avnzate: Comandi avanzati di stanza, Informazioni "\r
+"dell'utente e Chat"\r
+\r
+#: ../iconbar.c:282\r
+msgid "Advanced"\r
+msgstr "Avanzato"\r
+\r
+#: ../iconbar.c:292\r
+msgid "Room and system administration functions"\r
+msgstr "Funzioni di amministrazione delle stanze e di sistema"\r
+\r
+#: ../iconbar.c:299 ../roomops.c:1002\r
+msgid "Administration"\r
+msgstr "Amministrazione"\r
+\r
+#: ../iconbar.c:307 ../iconbar.c:316 ../iconbar.c:402 ../iconbar.c:411\r
+#: ../mainmenu.c:110\r
+msgid "Log off"\r
+msgstr "Esci"\r
+\r
+#: ../iconbar.c:308 ../iconbar.c:403\r
+msgid "Log off now?"\r
+msgstr "Uscire adesso?"\r
+\r
+#: ../iconbar.c:326\r
+msgid "Customize this menu"\r
+msgstr "Personalizza questo menu"\r
+\r
+#: ../iconbar.c:327\r
+msgid "customize this menu"\r
+msgstr "modifica questo menu"\r
+\r
+#: ../iconbar.c:396\r
+msgid "switch to menu"\r
+msgstr "Visualizza il menu"\r
+\r
+#: ../iconbar.c:481\r
+msgid "Customize the icon bar"\r
+msgstr "Personalizza la barra delle icone"\r
+\r
+#: ../iconbar.c:493\r
+msgid "Display icons as:"\r
+msgstr "Mostra le icone come:"\r
+\r
+#: ../iconbar.c:499\r
+msgid "pictures and text"\r
+msgstr "immagini e testo"\r
+\r
+#: ../iconbar.c:500\r
+msgid "pictures only"\r
+msgstr "solo immagini"\r
+\r
+#: ../iconbar.c:501\r
+msgid "text only"\r
+msgstr "solo testo"\r
+\r
+#: ../iconbar.c:506\r
+msgid ""\r
+"Select the icons you would like to see displayed in the 'icon bar' menu on "\r
+"the left side of the screen."\r
+msgstr "Seleziona le icone che vorresti vedere nel menu alla sinistra dello schermo."\r
+\r
+#: ../iconbar.c:524\r
+msgid "Site logo"\r
+msgstr "Logo del sito"\r
+\r
+#: ../iconbar.c:525\r
+msgid "An icon describing this site"\r
+msgstr "Una icona che descriva questo sito"\r
+\r
+#: ../iconbar.c:554\r
+msgid "Mail (inbox)"\r
+msgstr "Mail (Posta in arrivo)"\r
+\r
+#: ../iconbar.c:555\r
+msgid "A shortcut to your email Inbox"\r
+msgstr "Un collegamento alla tua Posta in Arrivo"\r
+\r
+#: ../iconbar.c:571\r
+msgid "Your personal address book"\r
+msgstr "I tuoi Contatti personali"\r
+\r
+#: ../iconbar.c:587\r
+msgid "Your personal notes"\r
+msgstr "Le tue note personali"\r
+\r
+#: ../iconbar.c:604\r
+msgid "A shortcut to your personal calendar"\r
+msgstr "Un collegamento al tuo calendario personale"\r
+\r
+#: ../iconbar.c:619\r
+msgid "A shortcut to your personal task list"\r
+msgstr "Un collegamento alla tua lista di operazioni da effettuare"\r
+\r
+#: ../iconbar.c:635\r
+msgid ""\r
+"Clicking this icon displays a list of all accessible rooms (or folders) "\r
+"available."\r
+msgstr ""\r
+"Cliccando questa icona, mostra una lista di tutte le stanze o cartelle "\r
+"disponibili."\r
+\r
+#: ../iconbar.c:651\r
+msgid "Clicking this icon displays a list of all users currently logged in."\r
+msgstr ""\r
+"Cliccando su questa icona, mostra tutti gli utenti collegati in questo "\r
+"momento."\r
+\r
+#: ../iconbar.c:667\r
+msgid ""\r
+"Clicking this icon enters real-time chat mode with other users in the same "\r
+"room."\r
+msgstr ""\r
+"Cliccando su questa icona vi porter&agrave; a una chat in tempo reale con "\r
+"gli altri utenti nella stessa stanza."\r
+\r
+#: ../iconbar.c:684\r
+msgid "Advanced options"\r
+msgstr "Opzioni avanzate"\r
+\r
+#: ../iconbar.c:685\r
+msgid "Access to the complete menu of Citadel functions."\r
+msgstr "Accesso al menu completo delle funzioni di Citadel."\r
+\r
+#: ../iconbar.c:701\r
+msgid "Citadel logo"\r
+msgstr "Logo Citadel"\r
+\r
+#: ../iconbar.c:702\r
+msgid "Displays the 'Powered by Citadel' icon"\r
+msgstr "Mostra l'icona Potenziato da Citadel"\r
+\r
+#: ../iconbar.c:711 ../netconf.c:146 ../roomops.c:1284 ../roomops.c:1611\r
+#: ../siteconfig.c:562 ../sysmsgs.c:57 ../useredit.c:381 ../vcard_edit.c:335\r
+msgid "Save changes"\r
+msgstr "Cambia i cambiamenti"\r
+\r
+#: ../iconbar.c:766\r
+msgid ""\r
+"Your icon bar has been updated.  Please select any of its choices to "\r
+"continue."\r
+msgstr ""\r
+"La tua bara delle icone &egrave; stata aggiornata. Per favore, seleziona una "\r
+"delle sue possibilit&agrave; per continuare."\r
+\r
+#: ../inetconf.c:38\r
+msgid "localhost"\r
+msgstr "localhost"\r
+\r
+#: ../inetconf.c:39\r
+msgid "directory"\r
+msgstr "directory"\r
+\r
+#: ../inetconf.c:40\r
+msgid "gatewaydomain"\r
+msgstr "dominio del gateway"\r
+\r
+#: ../inetconf.c:41\r
+msgid "smarthost"\r
+msgstr "smarthost"\r
+\r
+#: ../inetconf.c:42\r
+msgid "rbl"\r
+msgstr "rbl"\r
+\r
+#: ../inetconf.c:43\r
+msgid "spamassassin"\r
+msgstr "spamassassin"\r
+\r
+#: ../inetconf.c:45\r
+msgid "Local host aliases"\r
+msgstr "Alias degli host locali"\r
+\r
+#: ../inetconf.c:46\r
+msgid "Directory domains"\r
+msgstr "Domini delle directory"\r
+\r
+#: ../inetconf.c:47\r
+msgid "Gateway domains"\r
+msgstr "Domini del gateway"\r
+\r
+#: ../inetconf.c:48\r
+msgid "Smart hosts"\r
+msgstr "Smart Host"\r
+\r
+#: ../inetconf.c:49\r
+msgid "RBL hosts"\r
+msgstr "Host RBL"\r
+\r
+#: ../inetconf.c:50\r
+msgid "SpamAssassin hosts"\r
+msgstr "Host Spamassassin"\r
+\r
+#: ../inetconf.c:52\r
+msgid "(domains for which this host receives mail)"\r
+msgstr "(Domini per cui questo host riceve email)"\r
+\r
+#: ../inetconf.c:53\r
+msgid "(domains mapped with the Global Address Book)"\r
+msgstr "(Domini mappati nei Contatti Globali)"\r
+\r
+#: ../inetconf.c:54\r
+msgid "(domains whose subdomains match Citadel hosts)"\r
+msgstr "(domini i cui sottodomini coincidono con host Citadel)"\r
+\r
+#: ../inetconf.c:55\r
+msgid "(if present, forward all outbound mail to one of these hosts)"\r
+msgstr "(Se presenti, invia tutta la posta non locale a uno di questi host)"\r
+\r
+#: ../inetconf.c:56\r
+msgid "(hosts running a Realtime Blackhole List)"\r
+msgstr "(host che usano una lista Blackhole in tempo reale)"\r
+\r
+#: ../inetconf.c:57\r
+msgid "(hosts running the SpamAssassin service)"\r
+msgstr "(host che forniscono il servizio spamassassin)"\r
+\r
+#: ../inetconf.c:94\r
+msgid "Internet configuration"\r
+msgstr "Configurazione internet"\r
+\r
+#: ../inetconf.c:121\r
+msgid "Delete this entry?"\r
+msgstr "Cancello questa voce?"\r
+\r
+#: ../inetconf.c:123 ../netconf.c:209\r
+msgid "(Delete)"\r
+msgstr "(Cancella)"\r
+\r
+#: ../inetconf.c:173\r
+#, c-format\r
+msgid "%s has been deleted."\r
+msgstr "%s &egrave; stato cancellato."\r
+\r
+#: ../listsub.c:44\r
+msgid "List subscription"\r
+msgstr "Mostra le sottoscrizioni"\r
+\r
+#: ../listsub.c:56\r
+msgid "List subscribe/unsubscribe"\r
+msgstr "Mostra le sottoscrizioni/cancella la sottoscrizione"\r
+\r
+#: ../listsub.c:76\r
+msgid "Confirmation request sent"\r
+msgstr "Richiesta di conferma inviata"\r
+\r
+#: ../listsub.c:78\r
+#, c-format\r
+msgid ""\r
+"You are subscribing <TT>%s</TT> to the <b>%s</b> mailing list.  The "\r
+"listserver has sent you an e-mail with one additional Web link for you to "\r
+"click on to confirm your subscription.  This extra step is for your "\r
+"protection, as it prevents others from being able to subscribe you to lists "\r
+"without your consent.<br /><br />Please click on the link which is being e-"\r
+"mailed to you and your subscription will be confirmed.<br />\n"\r
+msgstr ""\r
+"Stai sottoscrivendo <TT>%s</TT> alla mailing list <b>%s</b>.  Il server di "\r
+"posta ti ha inviato una email contenente un collegamento da cliccare per "\r
+"confermare la tua sottoscrizione. questo passo &egrave; necessario per la "\r
+"tua protezione, in modo da evitare che altre persone possano sottoscriverti "\r
+"senza il tuo consenso.<br /><br />Per favore, clicca sul collegamento "\r
+"presente nella email per confermare la tua sottoscrizione.<br />\n"\r
+\r
+#: ../listsub.c:91\r
+msgid "Go back..."\r
+msgstr "Indietro..."\r
+\r
+#: ../mainmenu.c:23\r
+msgid "Basic commands"\r
+msgstr "Comandi base"\r
+\r
+#: ../mainmenu.c:32\r
+msgid "List known rooms"\r
+msgstr "Mostra le stanze conosciute"\r
+\r
+#: ../mainmenu.c:34\r
+msgid "Where can I go from here?"\r
+msgstr "Dove posso andare da qui?"\r
+\r
+#: ../mainmenu.c:39 ../roomops.c:646\r
+msgid "Goto next room"\r
+msgstr "Vai alla Prossima Stanza"\r
+\r
+#: ../mainmenu.c:42\r
+msgid "...with <EM>unread</EM> messages"\r
+msgstr "... contenente messaggi <em>non letti</em>"\r
+\r
+#: ../mainmenu.c:47\r
+msgid "Skip to next room"\r
+msgstr "Salta alla prossima stanza"\r
+\r
+#: ../mainmenu.c:50\r
+msgid "(come back here later)"\r
+msgstr "(torna più tardi)"\r
+\r
+#: ../mainmenu.c:57 ../roomops.c:450\r
+msgid "Ungoto"\r
+msgstr "Stanza Precedente"\r
+\r
+#: ../mainmenu.c:60\r
+#, c-format\r
+msgid "(oops! Back to %s)"\r
+msgstr "(oops! Torna a %s)"\r
+\r
+#: ../mainmenu.c:68 ../roomops.c:459\r
+msgid "Read new messages"\r
+msgstr "Leggi i nuovi messaggi"\r
+\r
+#: ../mainmenu.c:71\r
+msgid "...in this room"\r
+msgstr "... in questa stanza"\r
+\r
+#: ../mainmenu.c:76 ../roomops.c:559\r
+msgid "Read all messages"\r
+msgstr "leggi tutti i messaggi"\r
+\r
+#: ../mainmenu.c:79\r
+msgid "...old <EM>and</EM> new"\r
+msgstr "...vecchi <em>e</em> nuovo"\r
+\r
+#: ../mainmenu.c:84 ../roomops.c:621\r
+msgid "Enter a message"\r
+msgstr "Componi un messaggio"\r
+\r
+#: ../mainmenu.c:87\r
+msgid "(post in this room)"\r
+msgstr "(scrivi in questa stanza)"\r
+\r
+#: ../mainmenu.c:94\r
+msgid "Summary page"\r
+msgstr "Sommario"\r
+\r
+#: ../mainmenu.c:97\r
+msgid "Summary of my account"\r
+msgstr "Sommario del mio account"\r
+\r
+#: ../mainmenu.c:102\r
+msgid "User list"\r
+msgstr "Utenti"\r
+\r
+#: ../mainmenu.c:105\r
+msgid "(all registered users)"\r
+msgstr "(tutti gli utenti registrati)"\r
+\r
+#: ../mainmenu.c:113\r
+msgid "Bye!"\r
+msgstr "Ciao!"\r
+\r
+#: ../mainmenu.c:122\r
+msgid "Your info"\r
+msgstr "Le tue Informazioni"\r
+\r
+#: ../mainmenu.c:127\r
+msgid "Change your preferences and settings"\r
+msgstr "Modifica le tue preferenze e impostazioni"\r
+\r
+#: ../mainmenu.c:132\r
+msgid "Update your contact information"\r
+msgstr "Aggiorna i tuoi dati personali"\r
+\r
+#: ../mainmenu.c:142\r
+msgid "Enter your 'bio'"\r
+msgstr "Inserisci la tua biografia"\r
+\r
+#: ../mainmenu.c:147\r
+msgid "Edit your online photo"\r
+msgstr "Modifica la tua foto on line"\r
+\r
+#: ../mainmenu.c:154\r
+msgid "Advanced room commands"\r
+msgstr "Comandi di stanza avanzati"\r
+\r
+#: ../mainmenu.c:160\r
+msgid "Edit or delete this room"\r
+msgstr "Cancella o modifica questa stanza"\r
+\r
+#: ../mainmenu.c:166\r
+msgid "Go to a 'hidden' room"\r
+msgstr "Entra in una stanza \"nascosta\""\r
+\r
+#: ../mainmenu.c:171 ../roomops.c:1942\r
+msgid "Create a new room"\r
+msgstr "Crea una nuova stanza"\r
+\r
+#: ../mainmenu.c:176\r
+#, c-format\r
+msgid "Zap (forget) this room (%s)"\r
+msgstr "Dimentica questa stanza (%s)"\r
+\r
+#: ../mainmenu.c:181\r
+msgid "List all forgotten rooms"\r
+msgstr "Mostra tutte le stanze dimenticate"\r
+\r
+#: ../mainmenu.c:200\r
+msgid "System Administration Menu"\r
+msgstr "Menu di amministrazione di sistema"\r
+\r
+#: ../mainmenu.c:209\r
+msgid "Global Configuration"\r
+msgstr "Configurazione globale"\r
+\r
+#: ../mainmenu.c:214\r
+msgid "Edit site-wide configuration"\r
+msgstr "Modifica la configurazione per tutto il sito"\r
+\r
+#: ../mainmenu.c:219\r
+msgid "Domain names and Internet mail configuration"\r
+msgstr "Configurazione dei nomi di dominio e della posta internet"\r
+\r
+#: ../mainmenu.c:224\r
+msgid "Configure replication with other Citadel servers"\r
+msgstr "Configura la replicazione con altri server Citadel"\r
+\r
+#: ../mainmenu.c:231\r
+msgid "User account management"\r
+msgstr "Gestione account utenti"\r
+\r
+#: ../mainmenu.c:236\r
+msgid "Add, change, delete user accounts"\r
+msgstr "Aggiungi, modifica, cancella degli account di utenti"\r
+\r
+#: ../mainmenu.c:246\r
+msgid "Rooms and Floors"\r
+msgstr "Stanze e piani"\r
+\r
+#: ../mainmenu.c:251\r
+msgid "Add, change, or delete floors"\r
+msgstr "Aggiungi, modifica o cancella i piani"\r
+\r
+#: ../mainmenu.c:273\r
+msgid "Enter a server command"\r
+msgstr "inserisci un comando per il server"\r
+\r
+#: ../mainmenu.c:282\r
+msgid ""\r
+"This screen allows you to enter Citadel server commands which are not "\r
+"supported by WebCit.  If you do not know what that means, then this screen "\r
+"will not be of much use to you."\r
+msgstr ""\r
+"Questa schermata ti permette di inviare comandi al server non supportati da "\r
+"WebCit. Se non sai cosa significhi, allora questa schermata non ti "\r
+"sar&agrave; di molto aiuto."\r
+\r
+#: ../mainmenu.c:289\r
+msgid "Enter command:"\r
+msgstr "Inserisci il comando:"\r
+\r
+#: ../mainmenu.c:292\r
+msgid "Command input (if requesting SEND_LISTING transfer mode):"\r
+msgstr "Input del comando (se si richiede un modo di traferimento SEND_LISTING):"\r
+\r
+#: ../mainmenu.c:296\r
+#, c-format\r
+msgid "Detected host header is %s://%s"\r
+msgstr "L'intestazione dell'host rilevata &egrave; %s://%s"\r
+\r
+#: ../mainmenu.c:298\r
+msgid "Send command"\r
+msgstr "Invia il comando"\r
+\r
+#: ../mainmenu.c:327\r
+msgid "Server command results"\r
+msgstr "Risultato del comando impartito al Server"\r
+\r
+#: ../messages.c:444\r
+msgid " (work)"\r
+msgstr "(lavoro)"\r
+\r
+#: ../messages.c:446\r
+msgid " (home)"\r
+msgstr "(casa)"\r
+\r
+#: ../messages.c:448\r
+msgid " (cell)"\r
+msgstr "(cellulare)"\r
+\r
+#: ../messages.c:459 ../vcard_edit.c:252\r
+msgid "Address:"\r
+msgstr "Indirizzo:"\r
+\r
+#: ../messages.c:519\r
+msgid "Telephone:"\r
+msgstr "Telefono:"\r
+\r
+#: ../messages.c:524\r
+msgid "E-mail:"\r
+msgstr "E-mail:"\r
+\r
+#: ../messages.c:632 ../messages.c:1229\r
+msgid "ERROR:"\r
+msgstr "ERRORE:"\r
+\r
+#: ../messages.c:655 ../messages.c:932 ../messages.c:1238 ../messages.c:1341\r
+msgid "unexpected end of message"\r
+msgstr "Fine del messaggio inaspettata"\r
+\r
+#: ../messages.c:668 ../messages.c:1250\r
+msgid "from "\r
+msgstr "da"\r
+\r
+#: ../messages.c:696 ../messages.c:1266\r
+msgid "in "\r
+msgstr "in"\r
+\r
+#: ../messages.c:717 ../messages.c:1287\r
+msgid "to "\r
+msgstr "a"\r
+\r
+#: ../messages.c:770\r
+msgid "View"\r
+msgstr "Vedi"\r
+\r
+#: ../messages.c:772\r
+msgid "Download"\r
+msgstr "Scarica"\r
+\r
+#: ../messages.c:819 ../messages.c:2851\r
+msgid "CC:"\r
+msgstr "CC:"\r
+\r
+#: ../messages.c:827 ../messages.c:1323\r
+msgid "Subject:"\r
+msgstr "Oggetto:"\r
+\r
+#: ../messages.c:851 ../rss.c:28\r
+msgid "Reply"\r
+msgstr "Rispondi"\r
+\r
+#: ../messages.c:866\r
+msgid "ReplyQuoted"\r
+msgstr "Rispondi con cronistoria"\r
+\r
+#: ../messages.c:883\r
+msgid "ReplyAll"\r
+msgstr "Rispondi A Tutti"\r
+\r
+#: ../messages.c:891\r
+msgid "Forward"\r
+msgstr "Inoltra"\r
+\r
+#: ../messages.c:898 ../messages.c:3101\r
+msgid "Move"\r
+msgstr "Sposta"\r
+\r
+#: ../messages.c:903\r
+msgid "Delete this message?"\r
+msgstr "Cancellare questo messaggio?"\r
+\r
+#: ../messages.c:909\r
+msgid "Headers"\r
+msgstr "Intestazione"\r
+\r
+#: ../messages.c:914\r
+msgid "Print"\r
+msgstr "Stampa"\r
+\r
+#: ../messages.c:1025\r
+#, c-format\r
+msgid "I don't know how to display %s"\r
+msgstr "Non so come mostrare %s"\r
+\r
+#: ../messages.c:1060 ../messages.c:1587\r
+msgid "edit"\r
+msgstr "Modifica"\r
+\r
+#: ../messages.c:1550 ../messages.c:1859\r
+msgid "(no subject)"\r
+msgstr "(nessun oggetto)"\r
+\r
+#: ../messages.c:1678\r
+msgid "(no name)"\r
+msgstr "(nessun nome)"\r
+\r
+#: ../messages.c:1730\r
+msgid "This address book is empty."\r
+msgstr "Questa lista contatti &egrave; vuota"\r
+\r
+#: ../messages.c:2156\r
+msgid "No new messages."\r
+msgstr "Nessun nuovo messaggio"\r
+\r
+#: ../messages.c:2158\r
+msgid "No old messages."\r
+msgstr "Nessun vecchio messaggio."\r
+\r
+#: ../messages.c:2160\r
+msgid "No messages here."\r
+msgstr "Nessun messaggio."\r
+\r
+#: ../messages.c:2278\r
+msgid "Sender"\r
+msgstr "Mittente"\r
+\r
+#: ../messages.c:2280\r
+msgid "Date"\r
+msgstr "Data"\r
+\r
+#: ../messages.c:2295\r
+msgid "Click on any note to edit it."\r
+msgstr "Clicca su una nota per modificarla."\r
+\r
+#: ../messages.c:2398\r
+msgid "Reading #"\r
+msgstr "Numero di letture"\r
+\r
+#: ../messages.c:2451\r
+#, c-format\r
+msgid "of %d messages."\r
+msgstr "di %d messaggi."\r
+\r
+#: ../messages.c:2635\r
+#, c-format\r
+msgid "Cancelled.  Message was not posted."\r
+msgstr "Cancellato. Il messaggio non &egrave; stato inviato."\r
+\r
+#: ../messages.c:2641\r
+#, c-format\r
+msgid "Automatically cancelled because you have already saved this message."\r
+msgstr "Cancellato automaticamente, hai gi&agrave; salvato questo messaggio."\r
+\r
+#: ../messages.c:2660\r
+#, c-format\r
+msgid "Message has been sent.\n"\r
+msgstr "Il messaggio &egrave; stato inviato.\n"\r
+\r
+#: ../messages.c:2663\r
+#, c-format\r
+msgid "Message has been posted.\n"\r
+msgstr "Il messaggio &egrave; stato postato.\n"\r
+\r
+#: ../messages.c:2797\r
+msgid " <I>from</I> "\r
+msgstr "<i>da</i>"\r
+\r
+#: ../messages.c:2807\r
+msgid " <I>in</I> "\r
+msgstr "<i>in</i>"\r
+\r
+#: ../messages.c:2840\r
+msgid "To:"\r
+msgstr "A:"\r
+\r
+#: ../messages.c:2862\r
+msgid "BCC:"\r
+msgstr "BCC:"\r
+\r
+#: ../messages.c:2880\r
+msgid "Subject (optional):"\r
+msgstr "Oggetto (opzionale):"\r
+\r
+#: ../messages.c:2889 ../messages.c:3010 ../paging.c:57\r
+msgid "Send message"\r
+msgstr "Invia il messaggio"\r
+\r
+#: ../messages.c:2891 ../messages.c:3012\r
+msgid "Post message"\r
+msgstr "Posta il messaggio"\r
+\r
+#: ../messages.c:2907\r
+msgid "--- forwarded message ---"\r
+msgstr "--- messaggio inoltrato ---"\r
+\r
+#: ../messages.c:2987\r
+msgid "Attachments:"\r
+msgstr "Allegati:"\r
+\r
+#: ../messages.c:3002\r
+msgid "Attach file:"\r
+msgstr "Allega file:"\r
+\r
+#: ../messages.c:3005 ../roomops.c:1477 ../roomops.c:1507\r
+msgid "Add"\r
+msgstr "Aggiungi"\r
+\r
+#: ../messages.c:3074\r
+msgid "Confirm move of message"\r
+msgstr "Conferma lo spostamento del messaggio"\r
+\r
+#: ../messages.c:3081\r
+msgid "Move this message to:"\r
+msgstr "Sposta questo messaggio in:"\r
+\r
+#: ../messages.c:3127\r
+#, c-format\r
+msgid "The message was not moved."\r
+msgstr "Il messaggio non è stato spostato"\r
+\r
+#: ../netconf.c:68 ../netconf.c:183\r
+msgid "Add a new node"\r
+msgstr "Aggiungi un nuovo nodo"\r
+\r
+#: ../netconf.c:75 ../netconf.c:129 ../siteconfig.c:112\r
+#, c-format\r
+msgid "Node name"\r
+msgstr "Nome del nodo"\r
+\r
+#: ../netconf.c:77 ../netconf.c:133\r
+msgid "Shared secret"\r
+msgstr "Segreto condiviso"\r
+\r
+#: ../netconf.c:79 ../netconf.c:137\r
+msgid "Host or IP address"\r
+msgstr "Nome dell'host o indirizzo IP"\r
+\r
+#: ../netconf.c:81 ../netconf.c:141\r
+msgid "Port number"\r
+msgstr "Numero di porta"\r
+\r
+#: ../netconf.c:84\r
+msgid "Add node"\r
+msgstr "Aggiungi un nodo"\r
+\r
+#: ../netconf.c:110\r
+msgid "Edit node configuration for "\r
+msgstr "Modifica la configurazione del nodo per"\r
+\r
+#: ../netconf.c:176\r
+msgid "Network configuration"\r
+msgstr "Configurazione di rete"\r
+\r
+#: ../netconf.c:189\r
+msgid "Currently configured nodes"\r
+msgstr "Nodi configurati"\r
+\r
+#: ../netconf.c:204\r
+msgid "(Edit)"\r
+msgstr "(Modifica)"\r
+\r
+#: ../netconf.c:229\r
+msgid "Confirm delete"\r
+msgstr "Conferma la cancellazione"\r
+\r
+#: ../netconf.c:236\r
+msgid "Are you sure you want to delete "\r
+msgstr "Sei sicuro di voler cancellare?"\r
+\r
+#: ../netconf.c:243\r
+msgid "Yes"\r
+msgstr "Si"\r
+\r
+#: ../netconf.c:246\r
+msgid "No"\r
+msgstr "No"\r
+\r
+#: ../netconf.c:309\r
+msgid "Back to menu"\r
+msgstr "Torna al menu"\r
+\r
+#: ../notes.c:126\r
+msgid "An error has occurred."\r
+msgstr "E' avvenuto un errore."\r
+\r
+#: ../paging.c:24\r
+msgid "Send instant message"\r
+msgstr "Invia un Messaggio Istantaneo"\r
+\r
+#: ../paging.c:33\r
+msgid "Send an instant message to: "\r
+msgstr "Invia un Messaggio istantaneo a:"\r
+\r
+#: ../paging.c:49\r
+msgid "Enter message text:"\r
+msgstr "Inserisci il testo del messaggio:"\r
+\r
+#: ../paging.c:89\r
+msgid "Message was not sent."\r
+msgstr "Il Messaggio non è stato spedito."\r
+\r
+#: ../paging.c:99\r
+msgid "Message has been sent to "\r
+msgstr "Il Messaggio è stato spedito a"\r
+\r
+#: ../paging.c:110\r
+msgid "[ close window ]"\r
+msgstr "[ chiudi la finestra ]"\r
+\r
+#: ../paging.c:170\r
+msgid ""\r
+"You have one or more instant messages waiting, but the Citadel Instant "\r
+"Messenger window failed to open.  This is probably because you have a popup "\r
+"blocker installed.  Please configure your popup blocker to allow popups from "\r
+"this site if you wish to receive instant messages."\r
+msgstr ""\r
+"Hai uno o più messaggi in coda che aspettano di essere letti, ma la finestra "\r
+"per i Messaggi Istantanei di Citadel non può essere aperta. La causa può "\r
+"essere un popup blocker installato nel tuo browser. Per favore, se vuoi "\r
+"ricevere Messaggi Istantanei, configura il tuo popup blocker in modo da "\r
+"permettere i popup da questo sito."\r
+\r
+#: ../paging.c:309 ../paging.c:471\r
+msgid "An error occurred while setting up the chat socket."\r
+msgstr "Si è verificato un errore durante la creazione della connessione per la chat."\r
+\r
+#: ../paging.c:336\r
+msgid "Now exiting chat mode."\r
+msgstr "Uscita dalla modalità chat."\r
+\r
+#: ../paging.c:507\r
+msgid "Send"\r
+msgstr "Invia"\r
+\r
+#: ../paging.c:508\r
+msgid "Help"\r
+msgstr "Aiuto"\r
+\r
+#: ../paging.c:509\r
+msgid "List users"\r
+msgstr "Mostra gli utenti"\r
+\r
+#: ../preferences.c:205\r
+msgid "Preferences and settings"\r
+msgstr "Preferenze e impostazioni"\r
+\r
+#: ../preferences.c:226\r
+msgid "Room list view"\r
+msgstr "Vista della lista delle stanze"\r
+\r
+#: ../preferences.c:232\r
+msgid "Tree (folders) view"\r
+msgstr "Vista ad albero (cartelle)"\r
+\r
+#: ../preferences.c:238\r
+msgid "Table (rooms) view"\r
+msgstr "Vista a tabella (stanze)"\r
+\r
+#: ../preferences.c:249\r
+msgid "Calendar hour format"\r
+msgstr "Formato dell'ora nel calendario"\r
+\r
+#: ../preferences.c:255\r
+msgid "12 hour (am/pm)"\r
+msgstr "12 ore (am/pm)"\r
+\r
+#: ../preferences.c:261\r
+msgid "24 hour"\r
+msgstr "24 ore"\r
+\r
+#: ../preferences.c:272\r
+msgid "Calendar day view begins at:"\r
+msgstr "La vista giornaliera del calendario inizia il:"\r
+\r
+#: ../preferences.c:301\r
+msgid "Calendar day view ends at:"\r
+msgstr "La vista giornaliera del calendario finisce il:"\r
+\r
+#: ../preferences.c:330\r
+msgid "Attach signature to email messages?"\r
+msgstr "Allega la firma ai messaggi email?"\r
+\r
+#: ../preferences.c:348\r
+msgid "No signature"\r
+msgstr "Nessuna firma"\r
+\r
+#: ../preferences.c:354\r
+msgid "Use this signature:"\r
+msgstr "Usa questa firma:"\r
+\r
+#: ../preferences.c:378\r
+msgid "Default character set for email headers:"\r
+msgstr "Set di caratteri di default per le intestazioni delle email:"\r
+\r
+#: ../preferences.c:388\r
+msgid "Change"\r
+msgstr "Cambia"\r
+\r
+#: ../preferences.c:407\r
+msgid "Cancelled.  No settings were changed."\r
+msgstr "Attività cancellata. Nessuna impostazione è stata cambiata."\r
+\r
+#: ../roomops.c:19\r
+msgid "Bulletin Board"\r
+msgstr "Forum"\r
+\r
+#: ../roomops.c:20\r
+msgid "Mail Folder"\r
+msgstr "Cartella di Posta"\r
+\r
+#: ../roomops.c:21\r
+msgid "Address Book"\r
+msgstr "Contatti"\r
+\r
+#: ../roomops.c:23\r
+msgid "Task List"\r
+msgstr "Lista delle Attività"\r
+\r
+#: ../roomops.c:24\r
+msgid "Notes List"\r
+msgstr "Lista delle Note"\r
+\r
+#: ../roomops.c:25\r
+msgid "Wiki"\r
+msgstr "Wiki"\r
+\r
+#: ../roomops.c:26\r
+msgid "Calendar List"\r
+msgstr "Lista Calendario"\r
+\r
+#: ../roomops.c:258\r
+msgid "Zapped (forgotten) rooms"\r
+msgstr "Stanze zappate (dimenticate)"\r
+\r
+#: ../roomops.c:264\r
+msgid "Click on any room to un-zap it and goto that room.\n"\r
+msgstr "Clicca su una stanza per dezapparla ed entrarci.\n"\r
+\r
+#: ../roomops.c:358\r
+msgid "View as:"\r
+msgstr "Vedi come:"\r
+\r
+#: ../roomops.c:429\r
+#, c-format\r
+msgid "%d new of %d messages"\r
+msgstr "%d nuovi messaggi su %d totali"\r
+\r
+#: ../roomops.c:473\r
+msgid "View contacts"\r
+msgstr "Vista contatti"\r
+\r
+#: ../roomops.c:484\r
+msgid "Day view"\r
+msgstr "Vista giornaliera"\r
+\r
+#: ../roomops.c:493\r
+msgid "Month view"\r
+msgstr "Vista mensile"\r
+\r
+#: ../roomops.c:504\r
+msgid "Calendar list"\r
+msgstr "Lista dei Calendari"\r
+\r
+#: ../roomops.c:515\r
+msgid "View tasks"\r
+msgstr "Mostra le Attività"\r
+\r
+#: ../roomops.c:526\r
+msgid "View notes"\r
+msgstr "Mostra le note"\r
+\r
+#: ../roomops.c:537\r
+msgid "View message list"\r
+msgstr "Vedi la lista dei messaggi"\r
+\r
+#: ../roomops.c:548\r
+msgid "Wiki home"\r
+msgstr "Home Page del Wiki"\r
+\r
+#: ../roomops.c:573\r
+msgid "Add new contact"\r
+msgstr "Aggiungi un nuovo contatto"\r
+\r
+#: ../roomops.c:583\r
+msgid "Add new event"\r
+msgstr "Aggiungi un nuovo evento"\r
+\r
+#: ../roomops.c:592\r
+msgid "Add new task"\r
+msgstr "Aggiungi una nuova Attività"\r
+\r
+#: ../roomops.c:601\r
+msgid "Add new note"\r
+msgstr "Aggiungi una nuova nota"\r
+\r
+#: ../roomops.c:612\r
+msgid "Edit this page"\r
+msgstr "Modifica questa pagina"\r
+\r
+#: ../roomops.c:634\r
+msgid "Leave all messages marked as unread, go to next room with unread messages"\r
+msgstr ""\r
+"Lascia tutti i messaggi marcati come non letti, passa alla stanza successiva "\r
+"con messaggi non letti."\r
+\r
+#: ../roomops.c:635\r
+msgid "Skip this room"\r
+msgstr "Salta questa stanza"\r
+\r
+#: ../roomops.c:645\r
+msgid "Mark all messages as read, go to next room with unread messages"\r
+msgstr ""\r
+"Marca tutti i messaggi come letti, vai alla prossima stanza con messaggi non "\r
+"letti"\r
+\r
+#: ../roomops.c:1018\r
+msgid "Configuration"\r
+msgstr "Configurazione"\r
+\r
+#: ../roomops.c:1034\r
+msgid "Message expire policy"\r
+msgstr "Politica di cancellazione dei messaggi"\r
+\r
+#: ../roomops.c:1050\r
+msgid "Access controls"\r
+msgstr "Controllo Accessi"\r
+\r
+#: ../roomops.c:1066\r
+msgid "Sharing"\r
+msgstr "Condivisione"\r
+\r
+#: ../roomops.c:1082\r
+msgid "Mailing list service"\r
+msgstr "Servizio Mailing List"\r
+\r
+#: ../roomops.c:1104\r
+msgid "Are you sure you want to delete this room?"\r
+msgstr "Sicuro di voler cancellare questa stanza?"\r
+\r
+#: ../roomops.c:1106\r
+msgid "Delete this room"\r
+msgstr "Cancella questa stanza"\r
+\r
+#: ../roomops.c:1109\r
+msgid "Set or change the icon for this room's banner"\r
+msgstr "Imposta o modifica l'icona per il banner di questa stanza"\r
+\r
+#: ../roomops.c:1112\r
+msgid "Edit this room's Info file"\r
+msgstr "Modifica il file di Informazioni di questa stanza"\r
+\r
+#: ../roomops.c:1121 ../roomops.c:1954\r
+msgid "Name of room: "\r
+msgstr "Nome delle stanza:"\r
+\r
+#: ../roomops.c:1128 ../roomops.c:1958\r
+msgid "Resides on floor: "\r
+msgstr "Appartiene al piano:"\r
+\r
+#: ../roomops.c:1142 ../roomops.c:2000\r
+msgid "Type of room:"\r
+msgstr "TIpo di stanza:"\r
+\r
+#: ../roomops.c:1149\r
+msgid "Public room"\r
+msgstr "Stanza pubblica"\r
+\r
+#: ../roomops.c:1157\r
+msgid "Private - guess name"\r
+msgstr "Privato - indovina il nome"\r
+\r
+#: ../roomops.c:1164\r
+msgid "Private - require password:"\r
+msgstr "Privato - richiede la password"\r
+\r
+#: ../roomops.c:1174 ../roomops.c:2031\r
+msgid "Private - invitation only"\r
+msgstr "Privato - solo su invito"\r
+\r
+#: ../roomops.c:1178\r
+msgid "If private, cause current users to forget room"\r
+msgstr "Se impostato come privato, l'utente corrente dimenticherà la stanza"\r
+\r
+#: ../roomops.c:1186\r
+msgid "Preferred users only"\r
+msgstr "Solo utenti preferiti"\r
+\r
+#: ../roomops.c:1192\r
+msgid "Read-only room"\r
+msgstr "Stanza in sola lettura"\r
+\r
+#: ../roomops.c:1199\r
+msgid "File directory room"\r
+msgstr "Stanza direttorio di file"\r
+\r
+#: ../roomops.c:1202\r
+msgid "Directory name: "\r
+msgstr "Nome del direttorio:"\r
+\r
+#: ../roomops.c:1210\r
+msgid "Uploading allowed"\r
+msgstr "Upload permesso"\r
+\r
+#: ../roomops.c:1216\r
+msgid "Downloading allowed"\r
+msgstr "Download permesso"\r
+\r
+#: ../roomops.c:1222\r
+msgid "Visible directory"\r
+msgstr "Direttorio visibile"\r
+\r
+#: ../roomops.c:1231\r
+msgid "Network shared room"\r
+msgstr "Stanza condivisa in rete"\r
+\r
+#: ../roomops.c:1237\r
+msgid "Permanent (does not auto-purge)"\r
+msgstr "Permanente (non si auto cancella)"\r
+\r
+#: ../roomops.c:1242\r
+msgid "Anonymous messages"\r
+msgstr "Messaggio anonimo"\r
+\r
+#: ../roomops.c:1250\r
+msgid "No anonymous messages"\r
+msgstr "Nessun messaggio anonimo"\r
+\r
+#: ../roomops.c:1256\r
+msgid "All messages are anonymous"\r
+msgstr "Tutti i messaggi sono anonimi"\r
+\r
+#: ../roomops.c:1262\r
+msgid "Prompt user when entering messages"\r
+msgstr "Notifica l'utente quando si sta digitando il messaggio"\r
+\r
+#: ../roomops.c:1268\r
+msgid "Room aide: "\r
+msgstr "Amministratore della stanza: "\r
+\r
+#: ../roomops.c:1340\r
+msgid "Shared with"\r
+msgstr "Condivisa con"\r
+\r
+#: ../roomops.c:1343\r
+msgid "Not shared with"\r
+msgstr "Non condivisa con"\r
+\r
+#: ../roomops.c:1348 ../roomops.c:1393\r
+msgid "Remote node name"\r
+msgstr "nome del nodo remoto"\r
+\r
+#: ../roomops.c:1350 ../roomops.c:1395\r
+msgid "Remote room name"\r
+msgstr "Nome della stanza remota"\r
+\r
+#: ../roomops.c:1352 ../roomops.c:1397\r
+msgid "Actions"\r
+msgstr "Azioni"\r
+\r
+#: ../roomops.c:1385\r
+msgid "Unshare"\r
+msgstr "Elimina condivisione"\r
+\r
+#: ../roomops.c:1422\r
+msgid "Share"\r
+msgstr "Condividi"\r
+\r
+#: ../roomops.c:1430\r
+msgid "Notes:"\r
+msgstr "note:"\r
+\r
+#: ../roomops.c:1431\r
+msgid ""\r
+"When sharing a room, it must be shared from both ends.  Adding a node to the "\r
+"'shared' list sends messages out, but in order to receive messages, the "\r
+"other nodes must be configured to send messages out to your system as well. "\r
+"<LI>If the remote room name is blank, it is assumed that the room name is "\r
+"identical on the remote node.<LI>If the remote room name is different, the "\r
+"remote node must also configure the name of the room here.</UL></I><br />\n"\r
+msgstr ""\r
+"La condivisione di una stanza deve essere effettuata in tutti i server in "\r
+"cui è presente. Aggiungendo un nodo alla lista di condivisioni fa in modo "\r
+"che il messaggio venga inviato, ma per ricevere, anche il nuovo nodo deve "\r
+"essere configurato per inviare i messaggi al primo.<li>Se il nome remoto "\r
+"della stanza è vuoto, è implicito che il nome della stanza remota sarà lo "\r
+"stesso.<li>Se il nome remoto è diverso, si deve configurare anche il nodo "\r
+"della stanza iniziale.</ul></i><br/>\n"\r
+\r
+#: ../roomops.c:1452\r
+msgid ""\r
+"<i>The contents of this room are being mailed <b>as individual messages</b> "\r
+"to the following list recipients:</i><br /><br />\n"\r
+msgstr ""\r
+"<i>I contenuti di questa stanza verranno inviati <b>come messaggi "\r
+"individuali</b> alla seguente lista di destinatari:</i><br/><br/>\n"\r
+\r
+#: ../roomops.c:1469 ../roomops.c:1499\r
+msgid "(remove)"\r
+msgstr "(rimuovi)"\r
+\r
+#: ../roomops.c:1482\r
+msgid ""\r
+"<i>The contents of this room are being mailed <b>in digest form</b> to the "\r
+"following list recipients:</i><br /><br />\n"\r
+msgstr ""\r
+"<i>I contenuti di questa stanza saranno inviati come <b>selezione di "\r
+"messaggi</b> alla seguente lista di destinatari</i><br/><br/>\n"\r
+\r
+#: ../roomops.c:1513\r
+msgid "This room is configured to allow self-service subscribe/unsubscribe requests."\r
+msgstr ""\r
+"Questa stanza è configurate per permettere la sottoscrizione/cancellazione "\r
+"automatica degli utenti."\r
+\r
+#: ../roomops.c:1516\r
+msgid "Click to disable."\r
+msgstr "Clicca per disabilitare."\r
+\r
+#: ../roomops.c:1518\r
+msgid "The URL for subscribe/unsubscribe is: "\r
+msgstr "L'indirizzo per sottoscriversi/cancellarsi dalla stanza è:"\r
+\r
+#: ../roomops.c:1524\r
+msgid ""\r
+"This room is <i>not</i> configured to allow self-service subscribe/"\r
+"unsubscribe requests."\r
+msgstr ""\r
+"Questa stanza <i>non</i> è stata configurata per permettere la "\r
+"sottoscrizione/cancellazione automatica degli utenti."\r
+\r
+#: ../roomops.c:1528\r
+msgid "Click to enable."\r
+msgstr "Clicca per abilitare."\r
+\r
+#: ../roomops.c:1557\r
+msgid "Message expire policy for this room"\r
+msgstr "Politica di cancellazione dei messaggi per questa stanza"\r
+\r
+#: ../roomops.c:1563\r
+msgid "Use the default policy for this floor"\r
+msgstr "Usa la politica di default per questo piano"\r
+\r
+#: ../roomops.c:1567 ../roomops.c:1594 ../siteconfig.c:501 ../siteconfig.c:526\r
+#, c-format\r
+msgid "Never automatically expire messages"\r
+msgstr "Non permettere ai messaggi di auto cancellarsi"\r
+\r
+#: ../roomops.c:1571 ../roomops.c:1598 ../siteconfig.c:505 ../siteconfig.c:530\r
+#, c-format\r
+msgid "Expire by message count"\r
+msgstr "Cancella per numero di messaggi"\r
+\r
+#: ../roomops.c:1575 ../roomops.c:1602 ../siteconfig.c:509 ../siteconfig.c:534\r
+#, c-format\r
+msgid "Expire by message age"\r
+msgstr "Elimina per età del messaggio"\r
+\r
+#: ../roomops.c:1577 ../roomops.c:1604 ../siteconfig.c:511 ../siteconfig.c:536\r
+#, c-format\r
+msgid "Number of messages or days: "\r
+msgstr "Numero di messaggi o giorni:"\r
+\r
+#: ../roomops.c:1584\r
+msgid "Message expire policy for this floor"\r
+msgstr "Politica di cancellazione messaggi per questo piano"\r
+\r
+#: ../roomops.c:1590\r
+msgid "Use the system default"\r
+msgstr "Usa il default di sistema"\r
+\r
+#: ../roomops.c:1665 ../roomops.c:3037\r
+msgid "Cancelled.  Changes were not saved."\r
+msgstr "Attività Cancellata.Le modifiche non sono state salvate."\r
+\r
+#: ../roomops.c:1804\r
+msgid "Your changes have been saved."\r
+msgstr "Le tue modifiche sono state salvate."\r
+\r
+#: ../roomops.c:1836\r
+#, c-format\r
+msgid "<B><I>User %s kicked out of room %s.</I></B>\n"\r
+msgstr "<B><I>L'utente %s è stato espulso dalla stanza %s.</I></B>\n"\r
+\r
+#: ../roomops.c:1850\r
+#, c-format\r
+msgid "<B><I>User %s invited to room %s.</I></B>\n"\r
+msgstr "<B><I>L'utente %s è stato invitato nella stanza %s.</I></B>\n"\r
+\r
+#: ../roomops.c:1878\r
+msgid ""\r
+"The users listed below have access to this room.  To remove a user from the "\r
+"access list, select the user name from the list and click 'Kick'."\r
+msgstr ""\r
+"Gli utenti mostrati sotto hanno accesso a questa stanza. Per rimuovere un "\r
+"utente dalla lista degli accessi, selezionalo e clicca 'Espelli'."\r
+\r
+#: ../roomops.c:1898\r
+msgid "Kick"\r
+msgstr "Espelli"\r
+\r
+#: ../roomops.c:1902\r
+msgid ""\r
+"To grant another user access to this room, enter the user name in the box "\r
+"below and click 'Invite'."\r
+msgstr ""\r
+"Per permettere a un altro utente l'accesso a questa stanza, inserisci il suo "\r
+"nome utente e clicca 'Invita'."\r
+\r
+#: ../roomops.c:1908\r
+msgid "Invite:"\r
+msgstr "Invita:"\r
+\r
+#: ../roomops.c:1913\r
+msgid "Invite"\r
+msgstr "Invita"\r
+\r
+#: ../roomops.c:1977\r
+msgid "Default view for room: "\r
+msgstr "Vista di default della stanza:"\r
+\r
+#: ../roomops.c:2009\r
+msgid "Public (automatically appears to everyone)"\r
+msgstr "Pubblica (Appare automaticamente a tutti gli utenti)"\r
+\r
+#: ../roomops.c:2016\r
+msgid "Private - hidden (accessible to anyone who knows its name)"\r
+msgstr "Privata - nascosta (Accessibile solo a chi ne conosce il nome)"\r
+\r
+#: ../roomops.c:2023\r
+msgid "Private - require password: "\r
+msgstr "Privata - richiede password"\r
+\r
+#: ../roomops.c:2039\r
+msgid "Personal (mailbox for you only)"\r
+msgstr "Personale (cassetta della posta solo per te)"\r
+\r
+#: ../roomops.c:2044\r
+msgid "Create new room"\r
+msgstr "Crea una nuova stanza"\r
+\r
+#: ../roomops.c:2112\r
+msgid "Cancelled.  No new room was created."\r
+msgstr "Attività Cancellata.Nessuna nuova stanza è stata creata."\r
+\r
+#: ../roomops.c:2155\r
+msgid "Go to a hidden room"\r
+msgstr "Vai a una stanza segreta"\r
+\r
+#: ../roomops.c:2166\r
+msgid ""\r
+"If you know the name of a hidden (guess-name) or passworded room, you can "\r
+"enter that room by typing its name below.  Once you gain access to a private "\r
+"room, it will appear in your regular room listings so you don't have to keep "\r
+"returning here."\r
+msgstr ""\r
+"Se conosci il nome di una stanza nascosta (indovina il nome) o protetta da "\r
+"password, puoi digitarlo qui sotto per accedervi. Una volta che hai "\r
+"l'accesso a una stanza privata, comparirà nella tua lista di stanze, così "\r
+"non dovrai ripetere questo passaggio."\r
+\r
+#: ../roomops.c:2178\r
+msgid "Enter room name:"\r
+msgstr "Inserisci il nome della stanza:"\r
+\r
+#: ../roomops.c:2185\r
+msgid "Enter room password:"\r
+msgstr "Inserisci la password della stanza:"\r
+\r
+#: ../roomops.c:2194\r
+msgid "Go there"\r
+msgstr "Entra nella stanza"\r
+\r
+#: ../roomops.c:2247\r
+msgid "Zap (forget/unsubscribe) the current room"\r
+msgstr "Zap (dimentica/cancella la tua sottoscrizione) questa stanza"\r
+\r
+#: ../roomops.c:2252\r
+#, c-format\r
+msgid ""\r
+"If you select this option, <em>%s</em> will disappear from your room list.  "\r
+"Is this what you wish to do?<br />\n"\r
+msgstr ""\r
+"Se selezioni questa opzione, <em>%s</em> scomparirà dalla tua lista delle "\r
+"stanze, vuoi farlo davvero?<br/><br/>\n"\r
+\r
+#: ../roomops.c:2257\r
+msgid "Zap this room"\r
+msgstr "Zap questa stanza"\r
+\r
+#: ../roomops.c:2987 ../roomops.c:2993\r
+msgid "Room list"\r
+msgstr "Lista delle stanze"\r
+\r
+#: ../roomops.c:2990\r
+msgid "Folder list"\r
+msgstr "Lista delle cartelle"\r
+\r
+#: ../rss.c:34\r
+msgid "Email"\r
+msgstr "Email"\r
+\r
+#: ../rss.c:73\r
+msgid "Not logged in"\r
+msgstr "Non autenticato"\r
+\r
+#: ../rss.c:92\r
+msgid "Error retrieving RSS feed: couldn't find messages\n"\r
+msgstr "Errore nella ricezione del RSS: non riesco a trovare dei messaggi</br>\n"\r
+\r
+#: ../siteconfig.c:38\r
+msgid "Site configuration"\r
+msgstr "Configurazione del sito"\r
+\r
+#: ../siteconfig.c:61\r
+msgid "General"\r
+msgstr "Generale"\r
+\r
+#: ../siteconfig.c:62\r
+msgid "Access"\r
+msgstr "Accesso"\r
+\r
+#: ../siteconfig.c:63\r
+msgid "Network"\r
+msgstr "Rete"\r
+\r
+#: ../siteconfig.c:64\r
+msgid "Tuning"\r
+msgstr "Rifiniture"\r
+\r
+#: ../siteconfig.c:65\r
+msgid "Directory"\r
+msgstr "Direttorio"\r
+\r
+#: ../siteconfig.c:66\r
+msgid "Auto-purger"\r
+msgstr "Eliminatore automatico"\r
+\r
+#: ../siteconfig.c:67\r
+msgid "Indexing/Journaling"\r
+msgstr "Indicizza"\r
+\r
+#: ../siteconfig.c:71\r
+msgid "General site configuration items"\r
+msgstr "Oggetti di configurazione generali del sito"\r
+\r
+#: ../siteconfig.c:75\r
+msgid "Access controls and site policy settings"\r
+msgstr "Controlli di accesso e impostazioni delle politiche del sito"\r
+\r
+#: ../siteconfig.c:79\r
+msgid "Network services"\r
+msgstr "Servizi di rete"\r
+\r
+#: ../siteconfig.c:80 ../siteconfig.c:90\r
+msgid ""\r
+"Changes made on this screen will not take effect until you restart the "\r
+"Citadel server."\r
+msgstr ""\r
+"I cambiamenti in questa schemata non avranno effetto finchè non si riavvia "\r
+"il server Citadel."\r
+\r
+#: ../siteconfig.c:85\r
+msgid "Advanced server fine-tuning controls"\r
+msgstr "Controlli avanzati per la configurazione delle rifiniture "\r
+\r
+#: ../siteconfig.c:89\r
+msgid "Configure the LDAP connector for Citadel"\r
+msgstr "Configura il connettore LDAP per Citadel"\r
+\r
+#: ../siteconfig.c:95\r
+msgid "Configure automatic expiry of old messages"\r
+msgstr "Configura la cancellazione automatica dei vecchi messaggi"\r
+\r
+#: ../siteconfig.c:96\r
+msgid "These settings may be overridden on a per-floor or per-room basis."\r
+msgstr ""\r
+"Queste impostazioni possono essere escluse da impostazioni specifiche alla "\r
+"stanza o al piano."\r
+\r
+#: ../siteconfig.c:100\r
+msgid "Indexing and Journaling"\r
+msgstr "Indicizzazione"\r
+\r
+#: ../siteconfig.c:101\r
+msgid "Warning: these facilities are resource intensive."\r
+msgstr "Attenzione: queste caratteristiche richiedono molte risorse."\r
+\r
+#: ../siteconfig.c:119\r
+#, c-format\r
+msgid "Fully qualified domain name"\r
+msgstr "Nome di dominio completo"\r
+\r
+#: ../siteconfig.c:126\r
+#, c-format\r
+msgid "Human-readable node name"\r
+msgstr "Nome del nodo leggibile da umani"\r
+\r
+#: ../siteconfig.c:133\r
+#, c-format\r
+msgid "Telephone number"\r
+msgstr "Numero di telefono"\r
+\r
+#: ../siteconfig.c:140\r
+#, c-format\r
+msgid "Automatically grant room-aide status to users who create private rooms"\r
+msgstr ""\r
+"Imposta automaticamente lo stato di aide per la stanza agli utenti che "\r
+"creano stanze private"\r
+\r
+#: ../siteconfig.c:148\r
+#, c-format\r
+msgid "Server connection idle timeout (in seconds)"\r
+msgstr "Timeout della connessione per il server in attesa (in secondi)"\r
+\r
+#: ../siteconfig.c:155\r
+#, c-format\r
+msgid "Initial access level for new users"\r
+msgstr "Livello di accesso iniziale per i nuovi utenti"\r
+\r
+#: ../siteconfig.c:169\r
+#, c-format\r
+msgid "Require registration for new users"\r
+msgstr "Richiedi la registrazione per i nuovo utenti"\r
+\r
+#: ../siteconfig.c:177\r
+#, c-format\r
+msgid "Quarantine messages from problem users"\r
+msgstr "Poni in quarantena i messaggi da utenti con problemi"\r
+\r
+#: ../siteconfig.c:185\r
+#, c-format\r
+msgid "Name of quarantine room"\r
+msgstr "Nome della stanza di quarantena"\r
+\r
+#: ../siteconfig.c:192\r
+#, c-format\r
+msgid "Paginator prompt (for text mode clients)"\r
+msgstr "Richiamo di impaginazione (per i client solo testo)"\r
+\r
+#: ../siteconfig.c:199\r
+#, c-format\r
+msgid "Restrict access to Internet mail"\r
+msgstr "Restringi l'accesso alla posta internet"\r
+\r
+#: ../siteconfig.c:207\r
+#, c-format\r
+msgid "Geographic location of this system"\r
+msgstr "Località geografica di questo server"\r
+\r
+#: ../siteconfig.c:214\r
+#, c-format\r
+msgid "Name of system administrator"\r
+msgstr "Nome dell'amministratore di sistema"\r
+\r
+#: ../siteconfig.c:221\r
+#, c-format\r
+msgid "Maximum concurrent sessions (0 = no limit)"\r
+msgstr "Numero massimo di sessioni concorrenti (0 = nessun limite)"\r
+\r
+#: ../siteconfig.c:228\r
+#, c-format\r
+msgid "Default user purge time (days)"\r
+msgstr "Tempo di eliminazione di default degli utenti (in giorni)"\r
+\r
+#: ../siteconfig.c:235\r
+#, c-format\r
+msgid "Default room purge time (days)"\r
+msgstr "Tempo di eliminazioni di default delle stanze (in giorni)"\r
+\r
+#: ../siteconfig.c:242\r
+#, c-format\r
+msgid "Name of room to log pages"\r
+msgstr "Nome delle stanze per il log delle pagine"\r
+\r
+#: ../siteconfig.c:249\r
+#, c-format\r
+msgid "Access level required to create rooms"\r
+msgstr "Livello di accesso richiesto per creare le stanze"\r
+\r
+#: ../siteconfig.c:263\r
+#, c-format\r
+msgid "Maximum message length"\r
+msgstr "Massima lunghezza dei messaggi"\r
+\r
+#: ../siteconfig.c:270\r
+#, c-format\r
+msgid "Minimum number of worker threads"\r
+msgstr "Numero minimo di discussioni attive"\r
+\r
+#: ../siteconfig.c:277\r
+#, c-format\r
+msgid "Maximum number of worker threads"\r
+msgstr "Massimo numero di discussioni attive"\r
+\r
+#: ../siteconfig.c:284\r
+#, c-format\r
+msgid "POP3 listener port (-1 to disable)"\r
+msgstr "Porta POP3 (-1 per disabilitare)"\r
+\r
+#: ../siteconfig.c:291\r
+#, c-format\r
+msgid "SMTP MTA port (-1 to disable)"\r
+msgstr "Porta SMTP MTA (-1 per disabilitare)"\r
+\r
+#: ../siteconfig.c:298\r
+#, c-format\r
+msgid "Correct forged From: lines during authenticated SMTP"\r
+msgstr "Correggi le linee From: forgiate durante una sessione SMTP autenticata"\r
+\r
+#: ../siteconfig.c:306\r
+#, c-format\r
+msgid "Allow aides to zap (forget) rooms"\r
+msgstr "Permetti agli amministratori di dimenticare le stanze"\r
+\r
+#: ../siteconfig.c:314\r
+#, c-format\r
+msgid "IMAP listener port (-1 to disable)"\r
+msgstr "Porta IMAP (-1 per disabilitare)"\r
+\r
+#: ../siteconfig.c:321\r
+#, c-format\r
+msgid "Network run frequency (in seconds)"\r
+msgstr "Velocità della rete (in secondi)"\r
+\r
+#: ../siteconfig.c:328\r
+#, c-format\r
+msgid "Disable self-service user account creation"\r
+msgstr "Disabilita l'autocreazione degli account utente"\r
+\r
+#: ../siteconfig.c:336\r
+#, c-format\r
+msgid "Hour to run database auto-purge"\r
+msgstr "Ora in cui lanciare la pulizia del database"\r
+\r
+#: ../siteconfig.c:352\r
+#, c-format\r
+msgid "Host name of LDAP server (blank to disable)"\r
+msgstr "Nome del server LDAP (vuoto per disabilitare)"\r
+\r
+#: ../siteconfig.c:359\r
+#, c-format\r
+msgid "Port number of LDAP server (blank to disable)"\r
+msgstr "Nuero di porta del server LDAP (vuoto per disabilitare)"\r
+\r
+#: ../siteconfig.c:366\r
+#, c-format\r
+msgid "Base DN"\r
+msgstr "DN di base"\r
+\r
+#: ../siteconfig.c:373\r
+#, c-format\r
+msgid "Bind DN"\r
+msgstr "DN bind"\r
+\r
+#: ../siteconfig.c:380\r
+#, c-format\r
+msgid "Password for bind DN"\r
+msgstr "Password per il DN bind"\r
+\r
+#: ../siteconfig.c:388\r
+#, c-format\r
+msgid "Server IP address (0.0.0.0 for 'any')"\r
+msgstr "Indirizzo ip del server (0.0.0.0 per 'qualsiasi')"\r
+\r
+#: ../siteconfig.c:395\r
+#, c-format\r
+msgid "SMTP MSA port (-1 to disable)"\r
+msgstr "Porta SMTP MSA (-1 per disabilitare)"\r
+\r
+#: ../siteconfig.c:402\r
+#, c-format\r
+msgid "IMAP over SSL port (-1 to disable)"\r
+msgstr "Porta IMAP SSL (-1 per disabiliare)"\r
+\r
+#: ../siteconfig.c:409\r
+#, c-format\r
+msgid "POP3 over SSL port (-1 to disable)"\r
+msgstr "Porta POP3 SSL (-1 per disabilitare)"\r
+\r
+#: ../siteconfig.c:416\r
+#, c-format\r
+msgid "SMTP over SSL port (-1 to disable)"\r
+msgstr "Porta SMTP SSL (-1 per disabilitare)"\r
+\r
+#: ../siteconfig.c:423\r
+#, c-format\r
+msgid "Enable full text index"\r
+msgstr "Abilita l'indicizzazione completa dei testi"\r
+\r
+#: ../siteconfig.c:431\r
+#, c-format\r
+msgid "Automatically delete committed database logs"\r
+msgstr "Cancella automaticamente i log del database approvati"\r
+\r
+#: ../siteconfig.c:439\r
+#, c-format\r
+msgid "Instantly expunge deleted messages in IMAP"\r
+msgstr "Elimina automaticamente i messaggi cancellati nelle cartelle IMAP"\r
+\r
+#: ../siteconfig.c:447\r
+#, c-format\r
+msgid "Allow unauthenticated SMTP clients to spoof this site's domains"\r
+msgstr "Permetti ai client SMTP non autenticati lo spoofing dei domini del server"\r
+\r
+#: ../siteconfig.c:455\r
+#, c-format\r
+msgid "Perform journaling of email messages"\r
+msgstr "Esegui l'indicizzazione delle email"\r
+\r
+#: ../siteconfig.c:463\r
+#, c-format\r
+msgid "Perform journaling of non-email messages"\r
+msgstr "Esegui l'indicizzazione dei messaggi non-email"\r
+\r
+#: ../siteconfig.c:471\r
+#, c-format\r
+msgid "Email destination of journalized messages"\r
+msgstr "Email di destinazione  dei messaggi indicizzati"\r
+\r
+#: ../siteconfig.c:497\r
+#, c-format\r
+msgid "Default message expire policy for public rooms"\r
+msgstr "Politica di default per la cancellazione delle stanze publiche"\r
+\r
+#: ../siteconfig.c:518\r
+#, c-format\r
+msgid "Default message expire policy for private mailboxes"\r
+msgstr "Politica di default per la cancellazione delle cassette postali private"\r
+\r
+#: ../siteconfig.c:522\r
+#, c-format\r
+msgid "Same policy as public rooms"\r
+msgstr "Stessa politica delle stanze private"\r
+\r
+#: ../siteconfig.c:644\r
+msgid "Your system configuration has been updated."\r
+msgstr "La configurazione del tuo sistema è stata aggiornata"\r
+\r
+#: ../subst.c:216\r
+msgid "ERROR: could not open template "\r
+msgstr "ERRORE non riesco ad aprire il template"\r
+\r
+#: ../summary.c:35\r
+msgid "(nothing)"\r
+msgstr "(nulla)"\r
+\r
+#: ../summary.c:50\r
+msgid "Messages"\r
+msgstr "Messaggi"\r
+\r
+#: ../summary.c:87\r
+msgid "Who's&nbsp;online&nbsp;now"\r
+msgstr "Chi è online adesso?"\r
+\r
+#: ../summary.c:122\r
+msgid "(None)"\r
+msgstr "(Nessuno)"\r
+\r
+#: ../summary.c:135\r
+msgid "(This server does not support task lists)"\r
+msgstr "(Questo server non supporta la lista delle operazioni)"\r
+\r
+#: ../summary.c:151\r
+msgid "Today&nbsp;on&nbsp;your&nbsp;calendar"\r
+msgstr "Oggi nel tuo calendario"\r
+\r
+#: ../summary.c:164\r
+msgid "(Nothing)"\r
+msgstr "(Nulla)"\r
+\r
+#: ../summary.c:176\r
+msgid "(This server does not support calendars)"\r
+msgstr "(Questo server non supporta i calendari)"\r
+\r
+#: ../summary.c:188\r
+msgid "About&nbsp;this&nbsp;server"\r
+msgstr "A proposito di questo server"\r
+\r
+#: ../summary.c:192\r
+#, c-format\r
+msgid ""\r
+"You are connected to %s, running %s with %s, and located in %s.  Your system "\r
+"administrator is %s."\r
+msgstr ""\r
+"Sei connesso a %s, %s è in esecuzione con %s e localizzato in %s. Il tuo "\r
+"amministratore di sistema è %s."\r
+\r
+#: ../summary.c:259\r
+#, c-format\r
+msgid "Summary page for %s"\r
+msgstr "Pagina riassuntiva per %s"\r
+\r
+#: ../sysmsgs.c:40\r
+#, c-format\r
+msgid "Edit %s"\r
+msgstr "Modifica %s"\r
+\r
+#: ../sysmsgs.c:44\r
+#, c-format\r
+msgid ""\r
+"Enter %s below.  Text is formatted to the reader's screen width.  To defeat "\r
+"the formatting, indent a line at least one space."\r
+msgstr ""\r
+"Inserisci %s qui sotto. Il testo viene formattato dalla larghezza dello "\r
+"schermo del lettore. Per non seguire la formattazione, indentare la linea di "\r
+"almeno uno spazio."\r
+\r
+#: ../sysmsgs.c:79\r
+#, c-format\r
+msgid "Cancelled.  %s was not saved."\r
+msgstr "Attività cancellata. %s non è stato salvato."\r
+\r
+#: ../sysmsgs.c:98\r
+#, c-format\r
+msgid "%s has been saved."\r
+msgstr "%s è stato salvato."\r
+\r
+#: ../useredit.c:31\r
+msgid "Edit or delete users"\r
+msgstr "Modifica o cancella gli utenti"\r
+\r
+#: ../useredit.c:40\r
+msgid "Add users"\r
+msgstr "Aggiungi utenti"\r
+\r
+#: ../useredit.c:43\r
+msgid ""\r
+"To create a new user account, enter the desired user name in the box below "\r
+"and click 'Create'."\r
+msgstr ""\r
+"Per creare un nuovo account utente, inserisci il nome utente desiderato "\r
+"nella casella riportata sotto e clicca 'Crea'."\r
+\r
+#: ../useredit.c:48\r
+msgid "New user: "\r
+msgstr "Nuovo utente:"\r
+\r
+#: ../useredit.c:51\r
+msgid "Create"\r
+msgstr "Crea"\r
+\r
+#: ../useredit.c:57\r
+msgid "Edit or Delete users"\r
+msgstr "Modifica o cancella gli utenti"\r
+\r
+#: ../useredit.c:60\r
+msgid ""\r
+"To edit an existing user account, select the user name from the list and "\r
+"click 'Edit'."\r
+msgstr ""\r
+"Per modificare un utente esistente, seleziona il suo nome dalla lista e "\r
+"clicca 'Modifica'."\r
+\r
+#: ../useredit.c:83\r
+msgid "Edit configuration"\r
+msgstr "Modifica la configurazione"\r
+\r
+#: ../useredit.c:84\r
+msgid "Edit address book entry"\r
+msgstr "Modifica il contatto"\r
+\r
+#: ../useredit.c:86\r
+msgid "Delete user"\r
+msgstr "Cancella l'utente"\r
+\r
+#: ../useredit.c:86\r
+msgid "Delete this user?"\r
+msgstr "Cancellare questo utente?"\r
+\r
+#: ../useredit.c:204\r
+msgid "An error occurred while trying to create or edit this address book entry."\r
+msgstr ""\r
+"E' avvenuto un errore durante la creazione o la cancellazione di questa voce "\r
+"della rubrica dei contatti"\r
+\r
+#: ../useredit.c:283\r
+msgid "Edit user account: "\r
+msgstr "Modifica l'account dell'utente:"\r
+\r
+#: ../useredit.c:303\r
+msgid "Password"\r
+msgstr "Password"\r
+\r
+#: ../useredit.c:310\r
+msgid "Permission to send Internet mail"\r
+msgstr "Permesso di inviare email a internet"\r
+\r
+#: ../useredit.c:319\r
+msgid "Number of logins"\r
+msgstr "Numero di login"\r
+\r
+#: ../useredit.c:326\r
+msgid "Messages submitted"\r
+msgstr "Numero di Messaggi"\r
+\r
+#: ../useredit.c:333\r
+msgid "Access level"\r
+msgstr "Livello di accesso"\r
+\r
+#: ../useredit.c:347\r
+msgid "User ID number"\r
+msgstr "Numero indentificativo"\r
+\r
+#: ../useredit.c:355\r
+msgid "Date and time of last login"\r
+msgstr "Data e giorno dell'ultimo accesso"\r
+\r
+#: ../useredit.c:370\r
+msgid "Auto-purge after this many days"\r
+msgstr "Auto elimina dopo questo numero di giorni"\r
+\r
+#: ../useredit.c:402\r
+msgid "Changes were not saved."\r
+msgstr "I cambiamento non sono stati salvati."\r
+\r
+#: ../useredit.c:486\r
+#, c-format\r
+msgid "A new user has been created."\r
+msgstr "E' stato creato un nuovo utente."\r
+\r
+#: ../userlist.c:48\r
+#, c-format\r
+msgid "User list for %s"\r
+msgstr "Lista utenti per %s"\r
+\r
+#: ../userlist.c:66\r
+msgid "User Name"\r
+msgstr "Nome Utente"\r
+\r
+#: ../userlist.c:67\r
+msgid "Number"\r
+msgstr "Numero"\r
+\r
+#: ../userlist.c:68\r
+msgid "Access Level"\r
+msgstr "Livello di Accesso"\r
+\r
+#: ../userlist.c:69\r
+msgid "Last Login"\r
+msgstr "Ultimo Login"\r
+\r
+#: ../userlist.c:70\r
+msgid "Total Logins"\r
+msgstr "Login Totali"\r
+\r
+#: ../userlist.c:71\r
+msgid "Total Posts"\r
+msgstr "Messaggi Totali"\r
+\r
+#: ../userlist.c:129\r
+msgid "User profile"\r
+msgstr "Profilo utente"\r
+\r
+#: ../userlist.c:165\r
+#, c-format\r
+msgid "Click here to send an instant message to %s"\r
+msgstr "Clicca qui per inviare un messaggio istantaneo a %s"\r
+\r
+#: ../vcard_edit.c:184\r
+msgid "Edit contact information"\r
+msgstr "Modifica le informazioni del contatto"\r
+\r
+#: ../vcard_edit.c:200\r
+msgid "Prefix"\r
+msgstr "Prefisso"\r
+\r
+#: ../vcard_edit.c:200\r
+msgid "First"\r
+msgstr "Nome"\r
+\r
+#: ../vcard_edit.c:200\r
+msgid "Middle"\r
+msgstr "Secondo nome"\r
+\r
+#: ../vcard_edit.c:200\r
+msgid "Last"\r
+msgstr "Cognome"\r
+\r
+#: ../vcard_edit.c:200\r
+msgid "Suffix"\r
+msgstr "Suffisso"\r
+\r
+#: ../vcard_edit.c:221\r
+msgid "Display name:"\r
+msgstr "Nome da mostrare:"\r
+\r
+#: ../vcard_edit.c:228\r
+msgid "Title:"\r
+msgstr "Titolo:"\r
+\r
+#: ../vcard_edit.c:235\r
+msgid "Organization:"\r
+msgstr "Organizzazione:"\r
+\r
+#: ../vcard_edit.c:246\r
+msgid "PO box:"\r
+msgstr "Presso:"\r
+\r
+#: ../vcard_edit.c:262\r
+msgid "City:"\r
+msgstr "Città:"\r
+\r
+#: ../vcard_edit.c:268\r
+msgid "State:"\r
+msgstr "Provincia:"\r
+\r
+#: ../vcard_edit.c:274\r
+msgid "ZIP code:"\r
+msgstr "C.A.P.:"\r
+\r
+#: ../vcard_edit.c:280\r
+msgid "Country:"\r
+msgstr "Nazione:"\r
+\r
+#: ../vcard_edit.c:290\r
+msgid "Home telephone:"\r
+msgstr "Telefono di casa:"\r
+\r
+#: ../vcard_edit.c:296\r
+msgid "Work telephone:"\r
+msgstr "Telefono di lavoro:"\r
+\r
+#: ../vcard_edit.c:307\r
+msgid "Primary Internet e-mail address"\r
+msgstr "Indirizzo email principale"\r
+\r
+#: ../vcard_edit.c:314\r
+msgid "Internet e-mail aliases"\r
+msgstr "Alias degli indirizzi email esterni"\r
+\r
+#: ../webcit.c:685\r
+#, c-format\r
+msgid "An error occurred while retrieving this part: %s\n"\r
+msgstr "E' avvenuto un errore durante il recupero di questa parte: %s<br/>\n"\r
+\r
+#: ../webcit.c:771\r
+msgid "Make this my start page"\r
+msgstr "Imposta questa pagina come principale"\r
+\r
+#: ../webcit.c:790\r
+msgid "You no longer have a start page selected."\r
+msgstr "Non hai più una pagina principale selezionata."\r
+\r
+#: ../webcit.c:826\r
+msgid "Authorization Required"\r
+msgstr "Autorizzazione richiesta"\r
+\r
+#: ../webcit.c:828\r
+#, c-format\r
+msgid ""\r
+"The resource you requested requires a valid username and password. You could "\r
+"not be logged in: %s\n"\r
+msgstr ""\r
+"Questa risorsa richiede un nome utente e una password. Non puoi essere "\r
+"autenticato e accedere a: %s\n"\r
+\r
+#: ../webcit.c:1247\r
+#, c-format\r
+msgid ""\r
+"You are connected to a Citadel server running Citadel %d.%02d. \n"\r
+"In order to run this version of WebCit you must also have Citadel %d.%02d or "\r
+"newer.\n"\r
+"\n"\r
+"\n"\r
+msgstr ""\r
+"Sei collegato a un server Citadel con installato Citadel %d.%02d. \n"\r
+"Per poter usare questa versione di WebCit, devi avere Citadel %d.%02d o più "\r
+"recente.\n"\r
+"\n"\r
+"\n"\r
+\r
+#: ../webcit.c:1484 ../webcit.c:1486\r
+msgid "Room info"\r
+msgstr "Informazioni di stanza"\r
+\r
+#: ../webcit.c:1489 ../webcit.c:1491\r
+msgid "Your bio"\r
+msgstr "Le tue informazioni personali"\r
+\r
+#: ../webcit.c:1499\r
+msgid "your photo"\r
+msgstr "La tua foto"\r
+\r
+#: ../webcit.c:1505\r
+msgid "the icon for this room"\r
+msgstr "l'icona di questa stanza"\r
+\r
+#: ../webcit.c:1519\r
+msgid "the icon for this floor"\r
+msgstr "L'icona per questo piano"\r
+\r
+#: ../who.c:27\r
+msgid "User name"\r
+msgstr "Nome utente"\r
+\r
+#: ../who.c:28\r
+msgid "Room"\r
+msgstr "Stanza"\r
+\r
+#: ../who.c:29\r
+msgid "From host"\r
+msgstr "Dall'host"\r
+\r
+#: ../who.c:62\r
+msgid "(kill)"\r
+msgstr "(termina)"\r
+\r
+#: ../who.c:65\r
+msgid "(edit)"\r
+msgstr "(modifica)"\r
+\r
+#: ../who.c:141\r
+msgid "Do you really want to kill this session?"\r
+msgstr "Vuoi davvero terminare questa sessione?"\r
+\r
+#: ../who.c:151\r
+#, c-format\r
+msgid "Users currently on %s"\r
+msgstr "Utenti attualmente su %s"\r
+\r
+#: ../who.c:166\r
+#, c-format\r
+msgid ""\r
+"Click on a name to read user info.  Click on %s to send an instant message "\r
+"to that user."\r
+msgstr ""\r
+"Clicca su un nome per leggere le informazioni utente.Clicca su %s per "\r
+"inviare un messaggio istantaneo a questo utente."\r
+\r
+#: ../who.c:228\r
+msgid "Edit your session display"\r
+msgstr "Modifica la tua vista della sessione"\r
+\r
+#: ../who.c:232\r
+msgid ""\r
+"This screen allows you to change the way your session appears in the 'Who is "\r
+"online' listing. To turn off any 'fake' name you've previously set, simply "\r
+"click the appropriate 'change' button without typing anything in the "\r
+"corresponding box. "\r
+msgstr ""\r
+"Questa schermata ti permette di cambiare il modo in cui appare la tua "\r
+"sessione nella lista \"chi è on line\". Per eliminare qualsiasi nome "\r
+"fittizio abbia usato in precedenza, clicca semplicemente sul bottone di "\r
+"\"modifica\" appropriaton senza digitare nulla nella casella corrispondente."\r
+\r
+#: ../who.c:244\r
+msgid "Room name:"\r
+msgstr "Nome della stanza:"\r
+\r
+#: ../who.c:249\r
+msgid "Change room name"\r
+msgstr "Cambia il nome della stanza"\r
+\r
+#: ../who.c:253\r
+msgid "Host name:"\r
+msgstr "Nome dell'host:"\r
+\r
+#: ../who.c:258\r
+msgid "Change host name"\r
+msgstr "Cambia il nome dell'host"\r
+\r
+#: ../who.c:268\r
+msgid "Change user name"\r
+msgstr "Cambia nome utente"\r
+\r
+#: ../wiki.c:64\r
+#, c-format\r
+msgid "There is no room called '%s'."\r
+msgstr "Nessuna stanza col nome '%s'."\r
+\r
+#: ../wiki.c:74\r
+#, c-format\r
+msgid "'%s' is not a Wiki room."\r
+msgstr "'%s' non è una stanza di tipo Wiki."\r
+\r
+#: ../wiki.c:100\r
+#, c-format\r
+msgid "There is no page called '%s' here."\r
+msgstr "Nessuna pagina chamata '%s'."\r
+\r
+#: ../wiki.c:102\r
+msgid ""\r
+"Select the 'Edit this page' link in the room banner if you would like to "\r
+"create this page."\r
+msgstr "Seleziona il collegamento 'Modifica questa pagina' se la vuoi creare."\r
+\r
diff --git a/webcit/po/webcit.pot b/webcit/po/webcit.pot
new file mode 100644 (file)
index 0000000..7c88b95
--- /dev/null
@@ -0,0 +1,2728 @@
+# 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: 2006-02-13 21:49+0100\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"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../auth.c:23
+msgid "Deleted"
+msgstr ""
+
+#: ../auth.c:24 ../auth.c:72
+msgid "New User"
+msgstr ""
+
+#: ../auth.c:25
+msgid "Problem User"
+msgstr ""
+
+#: ../auth.c:26
+msgid "Local User"
+msgstr ""
+
+#: ../auth.c:27
+msgid "Network User"
+msgstr ""
+
+#: ../auth.c:28
+msgid "Preferred User"
+msgstr ""
+
+#: ../auth.c:29
+msgid "Aide"
+msgstr ""
+
+#: ../auth.c:52
+#, c-format
+msgid ""
+"<ul><li><b>If you already have an account on %s</b>, 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.<br /></ul>"
+msgstr ""
+
+#: ../auth.c:68 ../who.c:263
+msgid "User name:"
+msgstr ""
+
+#: ../auth.c:69
+msgid "Password:"
+msgstr ""
+
+#: ../auth.c:70
+msgid "Language:"
+msgstr ""
+
+#: ../auth.c:71
+msgid "Login"
+msgstr ""
+
+#: ../auth.c:73 ../paging.c:510
+msgid "Exit"
+msgstr ""
+
+#: ../auth.c:75
+#, c-format
+msgid "%s - powered by Citadel"
+msgstr ""
+
+#: ../auth.c:166 ../auth.c:534
+msgid "Blank passwords are not allowed."
+msgstr ""
+
+#: ../auth.c:187
+msgid "Your password was not accepted."
+msgstr ""
+
+#: ../auth.c:295
+msgid ""
+"This program was unable to connect or stay connected to the Citadel server.  "
+"Please report this problem to your system administrator."
+msgstr ""
+
+#: ../auth.c:302
+msgid "Log in again"
+msgstr ""
+
+#: ../auth.c:305
+msgid "Close window"
+msgstr ""
+
+#: ../auth.c:326 ../mainmenu.c:241
+msgid "Validate new users"
+msgstr ""
+
+#: ../auth.c:346
+msgid "No users require validation at this time."
+msgstr ""
+
+#: ../auth.c:387
+#, c-format
+msgid "Current access level: %d (%s)\n"
+msgstr ""
+
+#: ../auth.c:395
+msgid "Select access level for this user:"
+msgstr ""
+
+#: ../auth.c:458 ../mainmenu.c:137
+msgid "Change your password"
+msgstr ""
+
+#: ../auth.c:487
+msgid "Enter new password:"
+msgstr ""
+
+#: ../auth.c:491
+msgid "Enter it again to confirm:"
+msgstr ""
+
+#: ../auth.c:496
+msgid "Change password"
+msgstr ""
+
+#: ../auth.c:498 ../calendar.c:616 ../event.c:390 ../graphics.c:58
+#: ../iconbar.c:712 ../mainmenu.c:300 ../messages.c:2894 ../messages.c:3015
+#: ../messages.c:3103 ../netconf.c:86 ../netconf.c:149 ../paging.c:58
+#: ../preferences.c:389 ../roomops.c:1285 ../roomops.c:1613 ../roomops.c:2046
+#: ../roomops.c:2195 ../roomops.c:2259 ../siteconfig.c:564 ../sysmsgs.c:59
+#: ../useredit.c:381 ../vcard_edit.c:336 ../who.c:273
+msgid "Cancel"
+msgstr ""
+
+#: ../auth.c:515
+msgid "Cancelled.  Password was not changed."
+msgstr ""
+
+#: ../auth.c:526
+msgid "They don't match.  Password was not changed."
+msgstr ""
+
+#: ../availability.c:140
+msgid "availability unknown"
+msgstr ""
+
+#: ../availability.c:161
+msgid "free"
+msgstr ""
+
+#: ../availability.c:171
+msgid "BUSY"
+msgstr ""
+
+#: ../calendar.c:24
+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 ""
+
+#: ../calendar.c:38
+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 ""
+
+#: ../calendar.c:50
+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 ""
+
+#: ../calendar.c:107
+msgid "Meeting invitation"
+msgstr ""
+
+#: ../calendar.c:116
+msgid "Attendee's reply to your invitation"
+msgstr ""
+
+#: ../calendar.c:125
+msgid "Published event"
+msgstr ""
+
+#: ../calendar.c:130
+msgid "This is an unknown type of calendar item."
+msgstr ""
+
+#: ../calendar.c:139 ../calendar.c:560
+msgid "Summary:"
+msgstr ""
+
+#: ../calendar.c:148
+msgid "Location:"
+msgstr ""
+
+#: ../calendar.c:174
+msgid "Date:"
+msgstr ""
+
+#: ../calendar.c:181
+msgid "Starting date/time:"
+msgstr ""
+
+#: ../calendar.c:192
+msgid "Ending date/time:"
+msgstr ""
+
+#: ../calendar.c:201 ../calendar.c:596
+msgid "Description:"
+msgstr ""
+
+#: ../calendar.c:210
+msgid "Attendee:"
+msgstr ""
+
+#: ../calendar.c:250
+#, c-format
+msgid "This is an update of '%s' which is already in your calendar."
+msgstr ""
+
+#: ../calendar.c:254
+#, c-format
+msgid "This event would conflict with '%s' which is already in your calendar."
+msgstr ""
+
+#: ../calendar.c:259
+msgid "Update:"
+msgstr ""
+
+#: ../calendar.c:260
+msgid "CONFLICT:"
+msgstr ""
+
+#: ../calendar.c:278
+msgid "How would you like to respond to this invitation?"
+msgstr ""
+
+#: ../calendar.c:279
+msgid "Accept"
+msgstr ""
+
+#: ../calendar.c:280
+msgid "Tentative"
+msgstr ""
+
+#: ../calendar.c:281
+msgid "Decline"
+msgstr ""
+
+#: ../calendar.c:305
+msgid "Click <i>Update</i> to accept this reply and update your calendar."
+msgstr ""
+
+#: ../calendar.c:306
+msgid "Update"
+msgstr ""
+
+#: ../calendar.c:307
+msgid "Ignore"
+msgstr ""
+
+#: ../calendar.c:334
+msgid "There was an error parsing this calendar item."
+msgstr ""
+
+#: ../calendar.c:361
+msgid "Respond to meeting request"
+msgstr ""
+
+#: ../calendar.c:380
+msgid ""
+"You have accepted this meeting invitation.  It has been entered into your "
+"calendar."
+msgstr ""
+
+#: ../calendar.c:384
+msgid ""
+"You have tentatively accepted this meeting invitation.  It has been "
+"'pencilled in' to your calendar."
+msgstr ""
+
+#: ../calendar.c:388
+msgid ""
+"You have declined this meeting invitation.  It has <b>not</b> been entered "
+"into your calendar."
+msgstr ""
+
+#: ../calendar.c:393
+msgid "A reply has been sent to the meeting organizer."
+msgstr ""
+
+#: ../calendar.c:403 ../calendar.c:457
+msgid "Return to messages"
+msgstr ""
+
+#: ../calendar.c:422
+msgid "Update your calendar with this RSVP"
+msgstr ""
+
+#: ../calendar.c:441
+msgid "Your calendar has been updated to reflect this RSVP."
+msgstr ""
+
+#: ../calendar.c:443
+msgid ""
+"You have chosen to ignore this RSVP. Your calendar has <b>not</b> been "
+"updated."
+msgstr ""
+
+#: ../calendar.c:544
+msgid "Edit task"
+msgstr ""
+
+#: ../calendar.c:571
+msgid "Start date:"
+msgstr ""
+
+#: ../calendar.c:584
+msgid "Due date:"
+msgstr ""
+
+#: ../calendar.c:614 ../event.c:387
+msgid "Save"
+msgstr ""
+
+#: ../calendar.c:615 ../event.c:388 ../messages.c:903 ../messages.c:2281
+msgid "Delete"
+msgstr ""
+
+#: ../calendar_tools.c:73
+msgid "Month: "
+msgstr ""
+
+#: ../calendar_tools.c:87
+msgid "Day: "
+msgstr ""
+
+#: ../calendar_tools.c:97
+msgid "Year: "
+msgstr ""
+
+#: ../calendar_tools.c:115
+msgid "Hour: "
+msgstr ""
+
+#: ../calendar_tools.c:135
+msgid "Minute: "
+msgstr ""
+
+#: ../calendar_tools.c:204
+msgid "(status unknown)"
+msgstr ""
+
+#: ../calendar_tools.c:220
+msgid "(needs action)"
+msgstr ""
+
+#: ../calendar_tools.c:223
+msgid "(accepted)"
+msgstr ""
+
+#: ../calendar_tools.c:226
+msgid "(declined)"
+msgstr ""
+
+#: ../calendar_tools.c:229
+msgid "(tenative)"
+msgstr ""
+
+#: ../calendar_tools.c:232
+msgid "(delegated)"
+msgstr ""
+
+#: ../calendar_tools.c:235
+msgid "(completed)"
+msgstr ""
+
+#: ../calendar_tools.c:238
+msgid "(in process)"
+msgstr ""
+
+#: ../calendar_tools.c:241
+msgid "(none)"
+msgstr ""
+
+#: ../calendar_view.c:17
+msgid "The calendar view is not available."
+msgstr ""
+
+#: ../calendar_view.c:24
+msgid "The tasks view is not available."
+msgstr ""
+
+#: ../calendar_view.c:435
+msgid "Week"
+msgstr ""
+
+#: ../calendar_view.c:437
+msgid "Hours"
+msgstr ""
+
+#: ../calendar_view.c:438 ../messages.c:2276
+msgid "Subject"
+msgstr ""
+
+#: ../calendar_view.c:439 ../event.c:164
+msgid "Start"
+msgstr ""
+
+#: ../calendar_view.c:440 ../event.c:218
+msgid "End"
+msgstr ""
+
+#: ../calendar_view.c:930
+msgid "Name of task"
+msgstr ""
+
+#: ../calendar_view.c:932
+msgid "Date due"
+msgstr ""
+
+#: ../event.c:76 ../paging.c:78
+msgid "Add or edit an event"
+msgstr ""
+
+#: ../event.c:142 ../iconbar.c:123 ../iconbar.c:539
+msgid "Summary"
+msgstr ""
+
+#: ../event.c:153
+msgid "Location"
+msgstr ""
+
+#: ../event.c:207
+msgid "All day event"
+msgstr ""
+
+#: ../event.c:246 ../iconbar.c:199 ../iconbar.c:586
+msgid "Notes"
+msgstr ""
+
+#: ../event.c:288
+msgid "Organizer"
+msgstr ""
+
+#: ../event.c:293
+msgid "(you are the organizer)"
+msgstr ""
+
+#: ../event.c:311
+msgid "Show time as:"
+msgstr ""
+
+#: ../event.c:333
+msgid "Free"
+msgstr ""
+
+#: ../event.c:340
+msgid "Busy"
+msgstr ""
+
+#: ../event.c:346
+msgid "Attendees"
+msgstr ""
+
+#: ../event.c:349
+msgid "(One per line)"
+msgstr ""
+
+#: ../event.c:389
+msgid "Check attendee availability"
+msgstr ""
+
+#: ../floors.c:34
+msgid "Add/change/delete floors"
+msgstr ""
+
+#: ../floors.c:51 ../siteconfig.c:49 ../vcard_edit.c:78 ../wiki.c:66
+#: ../wiki.c:76
+msgid "Error"
+msgstr ""
+
+#: ../floors.c:62
+msgid "Floor number"
+msgstr ""
+
+#: ../floors.c:64
+msgid "Floor name"
+msgstr ""
+
+#: ../floors.c:66
+msgid "Number of rooms"
+msgstr ""
+
+#: ../floors.c:68
+msgid "Floor CSS"
+msgstr ""
+
+#: ../floors.c:81
+msgid "(delete floor)"
+msgstr ""
+
+#: ../floors.c:87
+msgid "(edit graphic)"
+msgstr ""
+
+#: ../floors.c:100
+msgid "Change name"
+msgstr ""
+
+#: ../floors.c:113
+msgid "Change CSS"
+msgstr ""
+
+#: ../floors.c:125
+msgid "Create new floor"
+msgstr ""
+
+#: ../floors.c:146
+#, c-format
+msgid "Floor has been deleted."
+msgstr ""
+
+#: ../floors.c:169
+#, c-format
+msgid "New floor has been created."
+msgstr ""
+
+#: ../graphics.c:27
+msgid "Image upload"
+msgstr ""
+
+#: ../graphics.c:45
+msgid ""
+"You can upload any image directly from your computer, as long as it is in "
+"GIF format (JPEG, PNG, etc. won't work)."
+msgstr ""
+
+#: ../graphics.c:50
+msgid "Please select a file to upload:"
+msgstr ""
+
+#: ../graphics.c:54
+msgid "Upload"
+msgstr ""
+
+#: ../graphics.c:56
+msgid "Reset form"
+msgstr ""
+
+#: ../graphics.c:74
+msgid "Graphics upload has been cancelled."
+msgstr ""
+
+#: ../graphics.c:81
+msgid "You didn't upload a file."
+msgstr ""
+
+#: ../html2html.c:109
+#, c-format
+msgid "realloc() error! couldn't get %d bytes: %s"
+msgstr ""
+
+#: ../iconbar.c:105 ../iconbar.c:391
+msgid "Find out more about Citadel"
+msgstr ""
+
+#: ../iconbar.c:106 ../iconbar.c:392
+msgid "CITADEL"
+msgstr ""
+
+#: ../iconbar.c:110
+msgid "switch to room list"
+msgstr ""
+
+#: ../iconbar.c:116 ../iconbar.c:540
+msgid "Your summary page"
+msgstr ""
+
+#: ../iconbar.c:133
+msgid "Go to your email inbox"
+msgstr ""
+
+#: ../iconbar.c:140
+msgid "Mail"
+msgstr ""
+
+#: ../iconbar.c:158
+msgid "Go to your personal calendar"
+msgstr ""
+
+#: ../iconbar.c:165 ../iconbar.c:603 ../roomops.c:22
+msgid "Calendar"
+msgstr ""
+
+#: ../iconbar.c:175
+msgid "Go to your personal address book"
+msgstr ""
+
+#: ../iconbar.c:182 ../iconbar.c:570
+msgid "Contacts"
+msgstr ""
+
+#: ../iconbar.c:192
+msgid "Go to your personal notes"
+msgstr ""
+
+#: ../iconbar.c:209
+msgid "Go to your personal task list"
+msgstr ""
+
+#: ../iconbar.c:216 ../iconbar.c:618 ../summary.c:109
+msgid "Tasks"
+msgstr ""
+
+#: ../iconbar.c:224
+msgid "List all of your accessible rooms"
+msgstr ""
+
+#: ../iconbar.c:231 ../iconbar.c:634
+msgid "Rooms"
+msgstr ""
+
+#: ../iconbar.c:240
+msgid "See who is online right now"
+msgstr ""
+
+#: ../iconbar.c:247 ../iconbar.c:650
+msgid "Who is online?"
+msgstr ""
+
+#: ../iconbar.c:265 ../iconbar.c:666
+msgid "Chat"
+msgstr ""
+
+#: ../iconbar.c:275
+msgid "Advanced Options Menu: Advanced Room commands, Account Info, and Chat"
+msgstr ""
+
+#: ../iconbar.c:282
+msgid "Advanced"
+msgstr ""
+
+#: ../iconbar.c:292
+msgid "Room and system administration functions"
+msgstr ""
+
+#: ../iconbar.c:299 ../roomops.c:1002
+msgid "Administration"
+msgstr ""
+
+#: ../iconbar.c:307 ../iconbar.c:316 ../iconbar.c:402 ../iconbar.c:411
+#: ../mainmenu.c:110
+msgid "Log off"
+msgstr ""
+
+#: ../iconbar.c:308 ../iconbar.c:403
+msgid "Log off now?"
+msgstr ""
+
+#: ../iconbar.c:326
+msgid "Customize this menu"
+msgstr ""
+
+#: ../iconbar.c:327
+msgid "customize this menu"
+msgstr ""
+
+#: ../iconbar.c:396
+msgid "switch to menu"
+msgstr ""
+
+#: ../iconbar.c:481
+msgid "Customize the icon bar"
+msgstr ""
+
+#: ../iconbar.c:493
+msgid "Display icons as:"
+msgstr ""
+
+#: ../iconbar.c:499
+msgid "pictures and text"
+msgstr ""
+
+#: ../iconbar.c:500
+msgid "pictures only"
+msgstr ""
+
+#: ../iconbar.c:501
+msgid "text only"
+msgstr ""
+
+#: ../iconbar.c:506
+msgid ""
+"Select the icons you would like to see displayed in the 'icon bar' menu on "
+"the left side of the screen."
+msgstr ""
+
+#: ../iconbar.c:524
+msgid "Site logo"
+msgstr ""
+
+#: ../iconbar.c:525
+msgid "An icon describing this site"
+msgstr ""
+
+#: ../iconbar.c:554
+msgid "Mail (inbox)"
+msgstr ""
+
+#: ../iconbar.c:555
+msgid "A shortcut to your email Inbox"
+msgstr ""
+
+#: ../iconbar.c:571
+msgid "Your personal address book"
+msgstr ""
+
+#: ../iconbar.c:587
+msgid "Your personal notes"
+msgstr ""
+
+#: ../iconbar.c:604
+msgid "A shortcut to your personal calendar"
+msgstr ""
+
+#: ../iconbar.c:619
+msgid "A shortcut to your personal task list"
+msgstr ""
+
+#: ../iconbar.c:635
+msgid ""
+"Clicking this icon displays a list of all accessible rooms (or folders) "
+"available."
+msgstr ""
+
+#: ../iconbar.c:651
+msgid "Clicking this icon displays a list of all users currently logged in."
+msgstr ""
+
+#: ../iconbar.c:667
+msgid ""
+"Clicking this icon enters real-time chat mode with other users in the same "
+"room."
+msgstr ""
+
+#: ../iconbar.c:684
+msgid "Advanced options"
+msgstr ""
+
+#: ../iconbar.c:685
+msgid "Access to the complete menu of Citadel functions."
+msgstr ""
+
+#: ../iconbar.c:701
+msgid "Citadel logo"
+msgstr ""
+
+#: ../iconbar.c:702
+msgid "Displays the 'Powered by Citadel' icon"
+msgstr ""
+
+#: ../iconbar.c:711 ../netconf.c:146 ../roomops.c:1284 ../roomops.c:1611
+#: ../siteconfig.c:562 ../sysmsgs.c:57 ../useredit.c:381 ../vcard_edit.c:335
+msgid "Save changes"
+msgstr ""
+
+#: ../iconbar.c:766
+msgid ""
+"Your icon bar has been updated.  Please select any of its choices to "
+"continue."
+msgstr ""
+
+#: ../inetconf.c:38
+msgid "localhost"
+msgstr ""
+
+#: ../inetconf.c:39
+msgid "directory"
+msgstr ""
+
+#: ../inetconf.c:40
+msgid "gatewaydomain"
+msgstr ""
+
+#: ../inetconf.c:41
+msgid "smarthost"
+msgstr ""
+
+#: ../inetconf.c:42
+msgid "rbl"
+msgstr ""
+
+#: ../inetconf.c:43
+msgid "spamassassin"
+msgstr ""
+
+#: ../inetconf.c:45
+msgid "Local host aliases"
+msgstr ""
+
+#: ../inetconf.c:46
+msgid "Directory domains"
+msgstr ""
+
+#: ../inetconf.c:47
+msgid "Gateway domains"
+msgstr ""
+
+#: ../inetconf.c:48
+msgid "Smart hosts"
+msgstr ""
+
+#: ../inetconf.c:49
+msgid "RBL hosts"
+msgstr ""
+
+#: ../inetconf.c:50
+msgid "SpamAssassin hosts"
+msgstr ""
+
+#: ../inetconf.c:52
+msgid "(domains for which this host receives mail)"
+msgstr ""
+
+#: ../inetconf.c:53
+msgid "(domains mapped with the Global Address Book)"
+msgstr ""
+
+#: ../inetconf.c:54
+msgid "(domains whose subdomains match Citadel hosts)"
+msgstr ""
+
+#: ../inetconf.c:55
+msgid "(if present, forward all outbound mail to one of these hosts)"
+msgstr ""
+
+#: ../inetconf.c:56
+msgid "(hosts running a Realtime Blackhole List)"
+msgstr ""
+
+#: ../inetconf.c:57
+msgid "(hosts running the SpamAssassin service)"
+msgstr ""
+
+#: ../inetconf.c:94
+msgid "Internet configuration"
+msgstr ""
+
+#: ../inetconf.c:121
+msgid "Delete this entry?"
+msgstr ""
+
+#: ../inetconf.c:123 ../netconf.c:209
+msgid "(Delete)"
+msgstr ""
+
+#: ../inetconf.c:173
+#, c-format
+msgid "%s has been deleted."
+msgstr ""
+
+#: ../listsub.c:44
+msgid "List subscription"
+msgstr ""
+
+#: ../listsub.c:56
+msgid "List subscribe/unsubscribe"
+msgstr ""
+
+#: ../listsub.c:76
+msgid "Confirmation request sent"
+msgstr ""
+
+#: ../listsub.c:78
+#, c-format
+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 ""
+
+#: ../listsub.c:91
+msgid "Go back..."
+msgstr ""
+
+#: ../mainmenu.c:23
+msgid "Basic commands"
+msgstr ""
+
+#: ../mainmenu.c:32
+msgid "List known rooms"
+msgstr ""
+
+#: ../mainmenu.c:34
+msgid "Where can I go from here?"
+msgstr ""
+
+#: ../mainmenu.c:39 ../roomops.c:646
+msgid "Goto next room"
+msgstr ""
+
+#: ../mainmenu.c:42
+msgid "...with <EM>unread</EM> messages"
+msgstr ""
+
+#: ../mainmenu.c:47
+msgid "Skip to next room"
+msgstr ""
+
+#: ../mainmenu.c:50
+msgid "(come back here later)"
+msgstr ""
+
+#: ../mainmenu.c:57 ../roomops.c:450
+msgid "Ungoto"
+msgstr ""
+
+#: ../mainmenu.c:60
+#, c-format
+msgid "(oops! Back to %s)"
+msgstr ""
+
+#: ../mainmenu.c:68 ../roomops.c:459
+msgid "Read new messages"
+msgstr ""
+
+#: ../mainmenu.c:71
+msgid "...in this room"
+msgstr ""
+
+#: ../mainmenu.c:76 ../roomops.c:559
+msgid "Read all messages"
+msgstr ""
+
+#: ../mainmenu.c:79
+msgid "...old <EM>and</EM> new"
+msgstr ""
+
+#: ../mainmenu.c:84 ../roomops.c:621
+msgid "Enter a message"
+msgstr ""
+
+#: ../mainmenu.c:87
+msgid "(post in this room)"
+msgstr ""
+
+#: ../mainmenu.c:94
+msgid "Summary page"
+msgstr ""
+
+#: ../mainmenu.c:97
+msgid "Summary of my account"
+msgstr ""
+
+#: ../mainmenu.c:102
+msgid "User list"
+msgstr ""
+
+#: ../mainmenu.c:105
+msgid "(all registered users)"
+msgstr ""
+
+#: ../mainmenu.c:113
+msgid "Bye!"
+msgstr ""
+
+#: ../mainmenu.c:122
+msgid "Your info"
+msgstr ""
+
+#: ../mainmenu.c:127
+msgid "Change your preferences and settings"
+msgstr ""
+
+#: ../mainmenu.c:132
+msgid "Update your contact information"
+msgstr ""
+
+#: ../mainmenu.c:142
+msgid "Enter your 'bio'"
+msgstr ""
+
+#: ../mainmenu.c:147
+msgid "Edit your online photo"
+msgstr ""
+
+#: ../mainmenu.c:154
+msgid "Advanced room commands"
+msgstr ""
+
+#: ../mainmenu.c:160
+msgid "Edit or delete this room"
+msgstr ""
+
+#: ../mainmenu.c:166
+msgid "Go to a 'hidden' room"
+msgstr ""
+
+#: ../mainmenu.c:171 ../roomops.c:1942
+msgid "Create a new room"
+msgstr ""
+
+#: ../mainmenu.c:176
+#, c-format
+msgid "Zap (forget) this room (%s)"
+msgstr ""
+
+#: ../mainmenu.c:181
+msgid "List all forgotten rooms"
+msgstr ""
+
+#: ../mainmenu.c:200
+msgid "System Administration Menu"
+msgstr ""
+
+#: ../mainmenu.c:209
+msgid "Global Configuration"
+msgstr ""
+
+#: ../mainmenu.c:214
+msgid "Edit site-wide configuration"
+msgstr ""
+
+#: ../mainmenu.c:219
+msgid "Domain names and Internet mail configuration"
+msgstr ""
+
+#: ../mainmenu.c:224
+msgid "Configure replication with other Citadel servers"
+msgstr ""
+
+#: ../mainmenu.c:231
+msgid "User account management"
+msgstr ""
+
+#: ../mainmenu.c:236
+msgid "Add, change, delete user accounts"
+msgstr ""
+
+#: ../mainmenu.c:246
+msgid "Rooms and Floors"
+msgstr ""
+
+#: ../mainmenu.c:251
+msgid "Add, change, or delete floors"
+msgstr ""
+
+#: ../mainmenu.c:273
+msgid "Enter a server command"
+msgstr ""
+
+#: ../mainmenu.c:282
+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 ""
+
+#: ../mainmenu.c:289
+msgid "Enter command:"
+msgstr ""
+
+#: ../mainmenu.c:292
+msgid "Command input (if requesting SEND_LISTING transfer mode):"
+msgstr ""
+
+#: ../mainmenu.c:296
+#, c-format
+msgid "Detected host header is %s://%s"
+msgstr ""
+
+#: ../mainmenu.c:298
+msgid "Send command"
+msgstr ""
+
+#: ../mainmenu.c:327
+msgid "Server command results"
+msgstr ""
+
+#: ../messages.c:444
+msgid " (work)"
+msgstr ""
+
+#: ../messages.c:446
+msgid " (home)"
+msgstr ""
+
+#: ../messages.c:448
+msgid " (cell)"
+msgstr ""
+
+#: ../messages.c:459 ../vcard_edit.c:252
+msgid "Address:"
+msgstr ""
+
+#: ../messages.c:519
+msgid "Telephone:"
+msgstr ""
+
+#: ../messages.c:524
+msgid "E-mail:"
+msgstr ""
+
+#: ../messages.c:632 ../messages.c:1229
+msgid "ERROR:"
+msgstr ""
+
+#: ../messages.c:655 ../messages.c:932 ../messages.c:1238 ../messages.c:1341
+msgid "unexpected end of message"
+msgstr ""
+
+#: ../messages.c:668 ../messages.c:1250
+msgid "from "
+msgstr ""
+
+#: ../messages.c:696 ../messages.c:1266
+msgid "in "
+msgstr ""
+
+#: ../messages.c:717 ../messages.c:1287
+msgid "to "
+msgstr ""
+
+#: ../messages.c:770
+msgid "View"
+msgstr ""
+
+#: ../messages.c:772
+msgid "Download"
+msgstr ""
+
+#: ../messages.c:819 ../messages.c:2851
+msgid "CC:"
+msgstr ""
+
+#: ../messages.c:827 ../messages.c:1323
+msgid "Subject:"
+msgstr ""
+
+#: ../messages.c:851 ../rss.c:28
+msgid "Reply"
+msgstr ""
+
+#: ../messages.c:866
+msgid "ReplyQuoted"
+msgstr ""
+
+#: ../messages.c:883
+msgid "ReplyAll"
+msgstr ""
+
+#: ../messages.c:891
+msgid "Forward"
+msgstr ""
+
+#: ../messages.c:898 ../messages.c:3101
+msgid "Move"
+msgstr ""
+
+#: ../messages.c:903
+msgid "Delete this message?"
+msgstr ""
+
+#: ../messages.c:909
+msgid "Headers"
+msgstr ""
+
+#: ../messages.c:914
+msgid "Print"
+msgstr ""
+
+#: ../messages.c:1025
+#, c-format
+msgid "I don't know how to display %s"
+msgstr ""
+
+#: ../messages.c:1060 ../messages.c:1587
+msgid "edit"
+msgstr ""
+
+#: ../messages.c:1550 ../messages.c:1859
+msgid "(no subject)"
+msgstr ""
+
+#: ../messages.c:1678
+msgid "(no name)"
+msgstr ""
+
+#: ../messages.c:1730
+msgid "This address book is empty."
+msgstr ""
+
+#: ../messages.c:2156
+msgid "No new messages."
+msgstr ""
+
+#: ../messages.c:2158
+msgid "No old messages."
+msgstr ""
+
+#: ../messages.c:2160
+msgid "No messages here."
+msgstr ""
+
+#: ../messages.c:2278
+msgid "Sender"
+msgstr ""
+
+#: ../messages.c:2280
+msgid "Date"
+msgstr ""
+
+#: ../messages.c:2295
+msgid "Click on any note to edit it."
+msgstr ""
+
+#: ../messages.c:2398
+msgid "Reading #"
+msgstr ""
+
+#: ../messages.c:2451
+#, c-format
+msgid "of %d messages."
+msgstr ""
+
+#: ../messages.c:2635
+#, c-format
+msgid "Cancelled.  Message was not posted."
+msgstr ""
+
+#: ../messages.c:2641
+#, c-format
+msgid "Automatically cancelled because you have already saved this message."
+msgstr ""
+
+#: ../messages.c:2660
+#, c-format
+msgid "Message has been sent.\n"
+msgstr ""
+
+#: ../messages.c:2663
+#, c-format
+msgid "Message has been posted.\n"
+msgstr ""
+
+#: ../messages.c:2797
+msgid " <I>from</I> "
+msgstr ""
+
+#: ../messages.c:2807
+msgid " <I>in</I> "
+msgstr ""
+
+#: ../messages.c:2840
+msgid "To:"
+msgstr ""
+
+#: ../messages.c:2862
+msgid "BCC:"
+msgstr ""
+
+#: ../messages.c:2880
+msgid "Subject (optional):"
+msgstr ""
+
+#: ../messages.c:2889 ../messages.c:3010 ../paging.c:57
+msgid "Send message"
+msgstr ""
+
+#: ../messages.c:2891 ../messages.c:3012
+msgid "Post message"
+msgstr ""
+
+#: ../messages.c:2907
+msgid "--- forwarded message ---"
+msgstr ""
+
+#: ../messages.c:2987
+msgid "Attachments:"
+msgstr ""
+
+#: ../messages.c:3002
+msgid "Attach file:"
+msgstr ""
+
+#: ../messages.c:3005 ../roomops.c:1477 ../roomops.c:1507
+msgid "Add"
+msgstr ""
+
+#: ../messages.c:3074
+msgid "Confirm move of message"
+msgstr ""
+
+#: ../messages.c:3081
+msgid "Move this message to:"
+msgstr ""
+
+#: ../messages.c:3127
+#, c-format
+msgid "The message was not moved."
+msgstr ""
+
+#: ../netconf.c:68 ../netconf.c:183
+msgid "Add a new node"
+msgstr ""
+
+#: ../netconf.c:75 ../netconf.c:129 ../siteconfig.c:112
+#, c-format
+msgid "Node name"
+msgstr ""
+
+#: ../netconf.c:77 ../netconf.c:133
+msgid "Shared secret"
+msgstr ""
+
+#: ../netconf.c:79 ../netconf.c:137
+msgid "Host or IP address"
+msgstr ""
+
+#: ../netconf.c:81 ../netconf.c:141
+msgid "Port number"
+msgstr ""
+
+#: ../netconf.c:84
+msgid "Add node"
+msgstr ""
+
+#: ../netconf.c:110
+msgid "Edit node configuration for "
+msgstr ""
+
+#: ../netconf.c:176
+msgid "Network configuration"
+msgstr ""
+
+#: ../netconf.c:189
+msgid "Currently configured nodes"
+msgstr ""
+
+#: ../netconf.c:204
+msgid "(Edit)"
+msgstr ""
+
+#: ../netconf.c:229
+msgid "Confirm delete"
+msgstr ""
+
+#: ../netconf.c:236
+msgid "Are you sure you want to delete "
+msgstr ""
+
+#: ../netconf.c:243
+msgid "Yes"
+msgstr ""
+
+#: ../netconf.c:246
+msgid "No"
+msgstr ""
+
+#: ../netconf.c:309
+msgid "Back to menu"
+msgstr ""
+
+#: ../notes.c:126
+msgid "An error has occurred."
+msgstr ""
+
+#: ../paging.c:24
+msgid "Send instant message"
+msgstr ""
+
+#: ../paging.c:33
+msgid "Send an instant message to: "
+msgstr ""
+
+#: ../paging.c:49
+msgid "Enter message text:"
+msgstr ""
+
+#: ../paging.c:89
+msgid "Message was not sent."
+msgstr ""
+
+#: ../paging.c:99
+msgid "Message has been sent to "
+msgstr ""
+
+#: ../paging.c:110
+msgid "[ close window ]"
+msgstr ""
+
+#: ../paging.c:170
+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 ""
+
+#: ../paging.c:309 ../paging.c:471
+msgid "An error occurred while setting up the chat socket."
+msgstr ""
+
+#: ../paging.c:336
+msgid "Now exiting chat mode."
+msgstr ""
+
+#: ../paging.c:507
+msgid "Send"
+msgstr ""
+
+#: ../paging.c:508
+msgid "Help"
+msgstr ""
+
+#: ../paging.c:509
+msgid "List users"
+msgstr ""
+
+#: ../preferences.c:205
+msgid "Preferences and settings"
+msgstr ""
+
+#: ../preferences.c:226
+msgid "Room list view"
+msgstr ""
+
+#: ../preferences.c:232
+msgid "Tree (folders) view"
+msgstr ""
+
+#: ../preferences.c:238
+msgid "Table (rooms) view"
+msgstr ""
+
+#: ../preferences.c:249
+msgid "Calendar hour format"
+msgstr ""
+
+#: ../preferences.c:255
+msgid "12 hour (am/pm)"
+msgstr ""
+
+#: ../preferences.c:261
+msgid "24 hour"
+msgstr ""
+
+#: ../preferences.c:272
+msgid "Calendar day view begins at:"
+msgstr ""
+
+#: ../preferences.c:301
+msgid "Calendar day view ends at:"
+msgstr ""
+
+#: ../preferences.c:330
+msgid "Attach signature to email messages?"
+msgstr ""
+
+#: ../preferences.c:348
+msgid "No signature"
+msgstr ""
+
+#: ../preferences.c:354
+msgid "Use this signature:"
+msgstr ""
+
+#: ../preferences.c:378
+msgid "Default character set for email headers:"
+msgstr ""
+
+#: ../preferences.c:388
+msgid "Change"
+msgstr ""
+
+#: ../preferences.c:407
+msgid "Cancelled.  No settings were changed."
+msgstr ""
+
+#: ../roomops.c:19
+msgid "Bulletin Board"
+msgstr ""
+
+#: ../roomops.c:20
+msgid "Mail Folder"
+msgstr ""
+
+#: ../roomops.c:21
+msgid "Address Book"
+msgstr ""
+
+#: ../roomops.c:23
+msgid "Task List"
+msgstr ""
+
+#: ../roomops.c:24
+msgid "Notes List"
+msgstr ""
+
+#: ../roomops.c:25
+msgid "Wiki"
+msgstr ""
+
+#: ../roomops.c:26
+msgid "Calendar List"
+msgstr ""
+
+#: ../roomops.c:258
+msgid "Zapped (forgotten) rooms"
+msgstr ""
+
+#: ../roomops.c:264
+msgid "Click on any room to un-zap it and goto that room.\n"
+msgstr ""
+
+#: ../roomops.c:358
+msgid "View as:"
+msgstr ""
+
+#: ../roomops.c:429
+#, c-format
+msgid "%d new of %d messages"
+msgstr ""
+
+#: ../roomops.c:473
+msgid "View contacts"
+msgstr ""
+
+#: ../roomops.c:484
+msgid "Day view"
+msgstr ""
+
+#: ../roomops.c:493
+msgid "Month view"
+msgstr ""
+
+#: ../roomops.c:504
+msgid "Calendar list"
+msgstr ""
+
+#: ../roomops.c:515
+msgid "View tasks"
+msgstr ""
+
+#: ../roomops.c:526
+msgid "View notes"
+msgstr ""
+
+#: ../roomops.c:537
+msgid "View message list"
+msgstr ""
+
+#: ../roomops.c:548
+msgid "Wiki home"
+msgstr ""
+
+#: ../roomops.c:573
+msgid "Add new contact"
+msgstr ""
+
+#: ../roomops.c:583
+msgid "Add new event"
+msgstr ""
+
+#: ../roomops.c:592
+msgid "Add new task"
+msgstr ""
+
+#: ../roomops.c:601
+msgid "Add new note"
+msgstr ""
+
+#: ../roomops.c:612
+msgid "Edit this page"
+msgstr ""
+
+#: ../roomops.c:634
+msgid ""
+"Leave all messages marked as unread, go to next room with unread messages"
+msgstr ""
+
+#: ../roomops.c:635
+msgid "Skip this room"
+msgstr ""
+
+#: ../roomops.c:645
+msgid "Mark all messages as read, go to next room with unread messages"
+msgstr ""
+
+#: ../roomops.c:1018
+msgid "Configuration"
+msgstr ""
+
+#: ../roomops.c:1034
+msgid "Message expire policy"
+msgstr ""
+
+#: ../roomops.c:1050
+msgid "Access controls"
+msgstr ""
+
+#: ../roomops.c:1066
+msgid "Sharing"
+msgstr ""
+
+#: ../roomops.c:1082
+msgid "Mailing list service"
+msgstr ""
+
+#: ../roomops.c:1104
+msgid "Are you sure you want to delete this room?"
+msgstr ""
+
+#: ../roomops.c:1106
+msgid "Delete this room"
+msgstr ""
+
+#: ../roomops.c:1109
+msgid "Set or change the icon for this room's banner"
+msgstr ""
+
+#: ../roomops.c:1112
+msgid "Edit this room's Info file"
+msgstr ""
+
+#: ../roomops.c:1121 ../roomops.c:1954
+msgid "Name of room: "
+msgstr ""
+
+#: ../roomops.c:1128 ../roomops.c:1958
+msgid "Resides on floor: "
+msgstr ""
+
+#: ../roomops.c:1142 ../roomops.c:2000
+msgid "Type of room:"
+msgstr ""
+
+#: ../roomops.c:1149
+msgid "Public room"
+msgstr ""
+
+#: ../roomops.c:1157
+msgid "Private - guess name"
+msgstr ""
+
+#: ../roomops.c:1164
+msgid "Private - require password:"
+msgstr ""
+
+#: ../roomops.c:1174 ../roomops.c:2031
+msgid "Private - invitation only"
+msgstr ""
+
+#: ../roomops.c:1178
+msgid "If private, cause current users to forget room"
+msgstr ""
+
+#: ../roomops.c:1186
+msgid "Preferred users only"
+msgstr ""
+
+#: ../roomops.c:1192
+msgid "Read-only room"
+msgstr ""
+
+#: ../roomops.c:1199
+msgid "File directory room"
+msgstr ""
+
+#: ../roomops.c:1202
+msgid "Directory name: "
+msgstr ""
+
+#: ../roomops.c:1210
+msgid "Uploading allowed"
+msgstr ""
+
+#: ../roomops.c:1216
+msgid "Downloading allowed"
+msgstr ""
+
+#: ../roomops.c:1222
+msgid "Visible directory"
+msgstr ""
+
+#: ../roomops.c:1231
+msgid "Network shared room"
+msgstr ""
+
+#: ../roomops.c:1237
+msgid "Permanent (does not auto-purge)"
+msgstr ""
+
+#: ../roomops.c:1242
+msgid "Anonymous messages"
+msgstr ""
+
+#: ../roomops.c:1250
+msgid "No anonymous messages"
+msgstr ""
+
+#: ../roomops.c:1256
+msgid "All messages are anonymous"
+msgstr ""
+
+#: ../roomops.c:1262
+msgid "Prompt user when entering messages"
+msgstr ""
+
+#: ../roomops.c:1268
+msgid "Room aide: "
+msgstr ""
+
+#: ../roomops.c:1340
+msgid "Shared with"
+msgstr ""
+
+#: ../roomops.c:1343
+msgid "Not shared with"
+msgstr ""
+
+#: ../roomops.c:1348 ../roomops.c:1393
+msgid "Remote node name"
+msgstr ""
+
+#: ../roomops.c:1350 ../roomops.c:1395
+msgid "Remote room name"
+msgstr ""
+
+#: ../roomops.c:1352 ../roomops.c:1397
+msgid "Actions"
+msgstr ""
+
+#: ../roomops.c:1385
+msgid "Unshare"
+msgstr ""
+
+#: ../roomops.c:1422
+msgid "Share"
+msgstr ""
+
+#: ../roomops.c:1430
+msgid "Notes:"
+msgstr ""
+
+#: ../roomops.c:1431
+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. "
+"<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.</UL></I><br />\n"
+msgstr ""
+
+#: ../roomops.c:1452
+msgid ""
+"<i>The contents of this room are being mailed <b>as individual messages</b> "
+"to the following list recipients:</i><br /><br />\n"
+msgstr ""
+
+#: ../roomops.c:1469 ../roomops.c:1499
+msgid "(remove)"
+msgstr ""
+
+#: ../roomops.c:1482
+msgid ""
+"<i>The contents of this room are being mailed <b>in digest form</b> to the "
+"following list recipients:</i><br /><br />\n"
+msgstr ""
+
+#: ../roomops.c:1513
+msgid ""
+"This room is configured to allow self-service subscribe/unsubscribe requests."
+msgstr ""
+
+#: ../roomops.c:1516
+msgid "Click to disable."
+msgstr ""
+
+#: ../roomops.c:1518
+msgid "The URL for subscribe/unsubscribe is: "
+msgstr ""
+
+#: ../roomops.c:1524
+msgid ""
+"This room is <i>not</i> configured to allow self-service subscribe/"
+"unsubscribe requests."
+msgstr ""
+
+#: ../roomops.c:1528
+msgid "Click to enable."
+msgstr ""
+
+#: ../roomops.c:1557
+msgid "Message expire policy for this room"
+msgstr ""
+
+#: ../roomops.c:1563
+msgid "Use the default policy for this floor"
+msgstr ""
+
+#: ../roomops.c:1567 ../roomops.c:1594 ../siteconfig.c:501 ../siteconfig.c:526
+#, c-format
+msgid "Never automatically expire messages"
+msgstr ""
+
+#: ../roomops.c:1571 ../roomops.c:1598 ../siteconfig.c:505 ../siteconfig.c:530
+#, c-format
+msgid "Expire by message count"
+msgstr ""
+
+#: ../roomops.c:1575 ../roomops.c:1602 ../siteconfig.c:509 ../siteconfig.c:534
+#, c-format
+msgid "Expire by message age"
+msgstr ""
+
+#: ../roomops.c:1577 ../roomops.c:1604 ../siteconfig.c:511 ../siteconfig.c:536
+#, c-format
+msgid "Number of messages or days: "
+msgstr ""
+
+#: ../roomops.c:1584
+msgid "Message expire policy for this floor"
+msgstr ""
+
+#: ../roomops.c:1590
+msgid "Use the system default"
+msgstr ""
+
+#: ../roomops.c:1665 ../roomops.c:3037
+msgid "Cancelled.  Changes were not saved."
+msgstr ""
+
+#: ../roomops.c:1804
+msgid "Your changes have been saved."
+msgstr ""
+
+#: ../roomops.c:1836
+#, c-format
+msgid "<B><I>User %s kicked out of room %s.</I></B>\n"
+msgstr ""
+
+#: ../roomops.c:1850
+#, c-format
+msgid "<B><I>User %s invited to room %s.</I></B>\n"
+msgstr ""
+
+#: ../roomops.c:1878
+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 ""
+
+#: ../roomops.c:1898
+msgid "Kick"
+msgstr ""
+
+#: ../roomops.c:1902
+msgid ""
+"To grant another user access to this room, enter the user name in the box "
+"below and click 'Invite'."
+msgstr ""
+
+#: ../roomops.c:1908
+msgid "Invite:"
+msgstr ""
+
+#: ../roomops.c:1913
+msgid "Invite"
+msgstr ""
+
+#: ../roomops.c:1977
+msgid "Default view for room: "
+msgstr ""
+
+#: ../roomops.c:2009
+msgid "Public (automatically appears to everyone)"
+msgstr ""
+
+#: ../roomops.c:2016
+msgid "Private - hidden (accessible to anyone who knows its name)"
+msgstr ""
+
+#: ../roomops.c:2023
+msgid "Private - require password: "
+msgstr ""
+
+#: ../roomops.c:2039
+msgid "Personal (mailbox for you only)"
+msgstr ""
+
+#: ../roomops.c:2044
+msgid "Create new room"
+msgstr ""
+
+#: ../roomops.c:2112
+msgid "Cancelled.  No new room was created."
+msgstr ""
+
+#: ../roomops.c:2155
+msgid "Go to a hidden room"
+msgstr ""
+
+#: ../roomops.c:2166
+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 ""
+
+#: ../roomops.c:2178
+msgid "Enter room name:"
+msgstr ""
+
+#: ../roomops.c:2185
+msgid "Enter room password:"
+msgstr ""
+
+#: ../roomops.c:2194
+msgid "Go there"
+msgstr ""
+
+#: ../roomops.c:2247
+msgid "Zap (forget/unsubscribe) the current room"
+msgstr ""
+
+#: ../roomops.c:2252
+#, c-format
+msgid ""
+"If you select this option, <em>%s</em> will disappear from your room list.  "
+"Is this what you wish to do?<br />\n"
+msgstr ""
+
+#: ../roomops.c:2257
+msgid "Zap this room"
+msgstr ""
+
+#: ../roomops.c:2987 ../roomops.c:2993
+msgid "Room list"
+msgstr ""
+
+#: ../roomops.c:2990
+msgid "Folder list"
+msgstr ""
+
+#: ../rss.c:34
+msgid "Email"
+msgstr ""
+
+#: ../rss.c:73
+msgid "Not logged in"
+msgstr ""
+
+#: ../rss.c:92
+msgid "Error retrieving RSS feed: couldn't find messages\n"
+msgstr ""
+
+#: ../siteconfig.c:38
+msgid "Site configuration"
+msgstr ""
+
+#: ../siteconfig.c:61
+msgid "General"
+msgstr ""
+
+#: ../siteconfig.c:62
+msgid "Access"
+msgstr ""
+
+#: ../siteconfig.c:63
+msgid "Network"
+msgstr ""
+
+#: ../siteconfig.c:64
+msgid "Tuning"
+msgstr ""
+
+#: ../siteconfig.c:65
+msgid "Directory"
+msgstr ""
+
+#: ../siteconfig.c:66
+msgid "Auto-purger"
+msgstr ""
+
+#: ../siteconfig.c:67
+msgid "Indexing/Journaling"
+msgstr ""
+
+#: ../siteconfig.c:71
+msgid "General site configuration items"
+msgstr ""
+
+#: ../siteconfig.c:75
+msgid "Access controls and site policy settings"
+msgstr ""
+
+#: ../siteconfig.c:79
+msgid "Network services"
+msgstr ""
+
+#: ../siteconfig.c:80 ../siteconfig.c:90
+msgid ""
+"Changes made on this screen will not take effect until you restart the "
+"Citadel server."
+msgstr ""
+
+#: ../siteconfig.c:85
+msgid "Advanced server fine-tuning controls"
+msgstr ""
+
+#: ../siteconfig.c:89
+msgid "Configure the LDAP connector for Citadel"
+msgstr ""
+
+#: ../siteconfig.c:95
+msgid "Configure automatic expiry of old messages"
+msgstr ""
+
+#: ../siteconfig.c:96
+msgid "These settings may be overridden on a per-floor or per-room basis."
+msgstr ""
+
+#: ../siteconfig.c:100
+msgid "Indexing and Journaling"
+msgstr ""
+
+#: ../siteconfig.c:101
+msgid "Warning: these facilities are resource intensive."
+msgstr ""
+
+#: ../siteconfig.c:119
+#, c-format
+msgid "Fully qualified domain name"
+msgstr ""
+
+#: ../siteconfig.c:126
+#, c-format
+msgid "Human-readable node name"
+msgstr ""
+
+#: ../siteconfig.c:133
+#, c-format
+msgid "Telephone number"
+msgstr ""
+
+#: ../siteconfig.c:140
+#, c-format
+msgid "Automatically grant room-aide status to users who create private rooms"
+msgstr ""
+
+#: ../siteconfig.c:148
+#, c-format
+msgid "Server connection idle timeout (in seconds)"
+msgstr ""
+
+#: ../siteconfig.c:155
+#, c-format
+msgid "Initial access level for new users"
+msgstr ""
+
+#: ../siteconfig.c:169
+#, c-format
+msgid "Require registration for new users"
+msgstr ""
+
+#: ../siteconfig.c:177
+#, c-format
+msgid "Quarantine messages from problem users"
+msgstr ""
+
+#: ../siteconfig.c:185
+#, c-format
+msgid "Name of quarantine room"
+msgstr ""
+
+#: ../siteconfig.c:192
+#, c-format
+msgid "Paginator prompt (for text mode clients)"
+msgstr ""
+
+#: ../siteconfig.c:199
+#, c-format
+msgid "Restrict access to Internet mail"
+msgstr ""
+
+#: ../siteconfig.c:207
+#, c-format
+msgid "Geographic location of this system"
+msgstr ""
+
+#: ../siteconfig.c:214
+#, c-format
+msgid "Name of system administrator"
+msgstr ""
+
+#: ../siteconfig.c:221
+#, c-format
+msgid "Maximum concurrent sessions (0 = no limit)"
+msgstr ""
+
+#: ../siteconfig.c:228
+#, c-format
+msgid "Default user purge time (days)"
+msgstr ""
+
+#: ../siteconfig.c:235
+#, c-format
+msgid "Default room purge time (days)"
+msgstr ""
+
+#: ../siteconfig.c:242
+#, c-format
+msgid "Name of room to log pages"
+msgstr ""
+
+#: ../siteconfig.c:249
+#, c-format
+msgid "Access level required to create rooms"
+msgstr ""
+
+#: ../siteconfig.c:263
+#, c-format
+msgid "Maximum message length"
+msgstr ""
+
+#: ../siteconfig.c:270
+#, c-format
+msgid "Minimum number of worker threads"
+msgstr ""
+
+#: ../siteconfig.c:277
+#, c-format
+msgid "Maximum number of worker threads"
+msgstr ""
+
+#: ../siteconfig.c:284
+#, c-format
+msgid "POP3 listener port (-1 to disable)"
+msgstr ""
+
+#: ../siteconfig.c:291
+#, c-format
+msgid "SMTP MTA port (-1 to disable)"
+msgstr ""
+
+#: ../siteconfig.c:298
+#, c-format
+msgid "Correct forged From: lines during authenticated SMTP"
+msgstr ""
+
+#: ../siteconfig.c:306
+#, c-format
+msgid "Allow aides to zap (forget) rooms"
+msgstr ""
+
+#: ../siteconfig.c:314
+#, c-format
+msgid "IMAP listener port (-1 to disable)"
+msgstr ""
+
+#: ../siteconfig.c:321
+#, c-format
+msgid "Network run frequency (in seconds)"
+msgstr ""
+
+#: ../siteconfig.c:328
+#, c-format
+msgid "Disable self-service user account creation"
+msgstr ""
+
+#: ../siteconfig.c:336
+#, c-format
+msgid "Hour to run database auto-purge"
+msgstr ""
+
+#: ../siteconfig.c:352
+#, c-format
+msgid "Host name of LDAP server (blank to disable)"
+msgstr ""
+
+#: ../siteconfig.c:359
+#, c-format
+msgid "Port number of LDAP server (blank to disable)"
+msgstr ""
+
+#: ../siteconfig.c:366
+#, c-format
+msgid "Base DN"
+msgstr ""
+
+#: ../siteconfig.c:373
+#, c-format
+msgid "Bind DN"
+msgstr ""
+
+#: ../siteconfig.c:380
+#, c-format
+msgid "Password for bind DN"
+msgstr ""
+
+#: ../siteconfig.c:388
+#, c-format
+msgid "Server IP address (0.0.0.0 for 'any')"
+msgstr ""
+
+#: ../siteconfig.c:395
+#, c-format
+msgid "SMTP MSA port (-1 to disable)"
+msgstr ""
+
+#: ../siteconfig.c:402
+#, c-format
+msgid "IMAP over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../siteconfig.c:409
+#, c-format
+msgid "POP3 over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../siteconfig.c:416
+#, c-format
+msgid "SMTP over SSL port (-1 to disable)"
+msgstr ""
+
+#: ../siteconfig.c:423
+#, c-format
+msgid "Enable full text index"
+msgstr ""
+
+#: ../siteconfig.c:431
+#, c-format
+msgid "Automatically delete committed database logs"
+msgstr ""
+
+#: ../siteconfig.c:439
+#, c-format
+msgid "Instantly expunge deleted messages in IMAP"
+msgstr ""
+
+#: ../siteconfig.c:447
+#, c-format
+msgid "Allow unauthenticated SMTP clients to spoof this site's domains"
+msgstr ""
+
+#: ../siteconfig.c:455
+#, c-format
+msgid "Perform journaling of email messages"
+msgstr ""
+
+#: ../siteconfig.c:463
+#, c-format
+msgid "Perform journaling of non-email messages"
+msgstr ""
+
+#: ../siteconfig.c:471
+#, c-format
+msgid "Email destination of journalized messages"
+msgstr ""
+
+#: ../siteconfig.c:497
+#, c-format
+msgid "Default message expire policy for public rooms"
+msgstr ""
+
+#: ../siteconfig.c:518
+#, c-format
+msgid "Default message expire policy for private mailboxes"
+msgstr ""
+
+#: ../siteconfig.c:522
+#, c-format
+msgid "Same policy as public rooms"
+msgstr ""
+
+#: ../siteconfig.c:644
+msgid "Your system configuration has been updated."
+msgstr ""
+
+#: ../subst.c:216
+msgid "ERROR: could not open template "
+msgstr ""
+
+#: ../summary.c:35
+msgid "(nothing)"
+msgstr ""
+
+#: ../summary.c:50
+msgid "Messages"
+msgstr ""
+
+#: ../summary.c:87
+msgid "Who's&nbsp;online&nbsp;now"
+msgstr ""
+
+#: ../summary.c:122
+msgid "(None)"
+msgstr ""
+
+#: ../summary.c:135
+msgid "(This server does not support task lists)"
+msgstr ""
+
+#: ../summary.c:151
+msgid "Today&nbsp;on&nbsp;your&nbsp;calendar"
+msgstr ""
+
+#: ../summary.c:164
+msgid "(Nothing)"
+msgstr ""
+
+#: ../summary.c:176
+msgid "(This server does not support calendars)"
+msgstr ""
+
+#: ../summary.c:188
+msgid "About&nbsp;this&nbsp;server"
+msgstr ""
+
+#: ../summary.c:192
+#, c-format
+msgid ""
+"You are connected to %s, running %s with %s, and located in %s.  Your system "
+"administrator is %s."
+msgstr ""
+
+#: ../summary.c:259
+#, c-format
+msgid "Summary page for %s"
+msgstr ""
+
+#: ../sysmsgs.c:40
+#, c-format
+msgid "Edit %s"
+msgstr ""
+
+#: ../sysmsgs.c:44
+#, c-format
+msgid ""
+"Enter %s below.  Text is formatted to the reader's screen width.  To defeat "
+"the formatting, indent a line at least one space."
+msgstr ""
+
+#: ../sysmsgs.c:79
+#, c-format
+msgid "Cancelled.  %s was not saved."
+msgstr ""
+
+#: ../sysmsgs.c:98
+#, c-format
+msgid "%s has been saved."
+msgstr ""
+
+#: ../useredit.c:31
+msgid "Edit or delete users"
+msgstr ""
+
+#: ../useredit.c:40
+msgid "Add users"
+msgstr ""
+
+#: ../useredit.c:43
+msgid ""
+"To create a new user account, enter the desired user name in the box below "
+"and click 'Create'."
+msgstr ""
+
+#: ../useredit.c:48
+msgid "New user: "
+msgstr ""
+
+#: ../useredit.c:51
+msgid "Create"
+msgstr ""
+
+#: ../useredit.c:57
+msgid "Edit or Delete users"
+msgstr ""
+
+#: ../useredit.c:60
+msgid ""
+"To edit an existing user account, select the user name from the list and "
+"click 'Edit'."
+msgstr ""
+
+#: ../useredit.c:83
+msgid "Edit configuration"
+msgstr ""
+
+#: ../useredit.c:84
+msgid "Edit address book entry"
+msgstr ""
+
+#: ../useredit.c:86
+msgid "Delete user"
+msgstr ""
+
+#: ../useredit.c:86
+msgid "Delete this user?"
+msgstr ""
+
+#: ../useredit.c:204
+msgid ""
+"An error occurred while trying to create or edit this address book entry."
+msgstr ""
+
+#: ../useredit.c:283
+msgid "Edit user account: "
+msgstr ""
+
+#: ../useredit.c:303
+msgid "Password"
+msgstr ""
+
+#: ../useredit.c:310
+msgid "Permission to send Internet mail"
+msgstr ""
+
+#: ../useredit.c:319
+msgid "Number of logins"
+msgstr ""
+
+#: ../useredit.c:326
+msgid "Messages submitted"
+msgstr ""
+
+#: ../useredit.c:333
+msgid "Access level"
+msgstr ""
+
+#: ../useredit.c:347
+msgid "User ID number"
+msgstr ""
+
+#: ../useredit.c:355
+msgid "Date and time of last login"
+msgstr ""
+
+#: ../useredit.c:370
+msgid "Auto-purge after this many days"
+msgstr ""
+
+#: ../useredit.c:402
+msgid "Changes were not saved."
+msgstr ""
+
+#: ../useredit.c:486
+#, c-format
+msgid "A new user has been created."
+msgstr ""
+
+#: ../userlist.c:48
+#, c-format
+msgid "User list for %s"
+msgstr ""
+
+#: ../userlist.c:66
+msgid "User Name"
+msgstr ""
+
+#: ../userlist.c:67
+msgid "Number"
+msgstr ""
+
+#: ../userlist.c:68
+msgid "Access Level"
+msgstr ""
+
+#: ../userlist.c:69
+msgid "Last Login"
+msgstr ""
+
+#: ../userlist.c:70
+msgid "Total Logins"
+msgstr ""
+
+#: ../userlist.c:71
+msgid "Total Posts"
+msgstr ""
+
+#: ../userlist.c:129
+msgid "User profile"
+msgstr ""
+
+#: ../userlist.c:165
+#, c-format
+msgid "Click here to send an instant message to %s"
+msgstr ""
+
+#: ../vcard_edit.c:184
+msgid "Edit contact information"
+msgstr ""
+
+#: ../vcard_edit.c:200
+msgid "Prefix"
+msgstr ""
+
+#: ../vcard_edit.c:200
+msgid "First"
+msgstr ""
+
+#: ../vcard_edit.c:200
+msgid "Middle"
+msgstr ""
+
+#: ../vcard_edit.c:200
+msgid "Last"
+msgstr ""
+
+#: ../vcard_edit.c:200
+msgid "Suffix"
+msgstr ""
+
+#: ../vcard_edit.c:221
+msgid "Display name:"
+msgstr ""
+
+#: ../vcard_edit.c:228
+msgid "Title:"
+msgstr ""
+
+#: ../vcard_edit.c:235
+msgid "Organization:"
+msgstr ""
+
+#: ../vcard_edit.c:246
+msgid "PO box:"
+msgstr ""
+
+#: ../vcard_edit.c:262
+msgid "City:"
+msgstr ""
+
+#: ../vcard_edit.c:268
+msgid "State:"
+msgstr ""
+
+#: ../vcard_edit.c:274
+msgid "ZIP code:"
+msgstr ""
+
+#: ../vcard_edit.c:280
+msgid "Country:"
+msgstr ""
+
+#: ../vcard_edit.c:290
+msgid "Home telephone:"
+msgstr ""
+
+#: ../vcard_edit.c:296
+msgid "Work telephone:"
+msgstr ""
+
+#: ../vcard_edit.c:307
+msgid "Primary Internet e-mail address"
+msgstr ""
+
+#: ../vcard_edit.c:314
+msgid "Internet e-mail aliases"
+msgstr ""
+
+#: ../webcit.c:685
+#, c-format
+msgid "An error occurred while retrieving this part: %s\n"
+msgstr ""
+
+#: ../webcit.c:771
+msgid "Make this my start page"
+msgstr ""
+
+#: ../webcit.c:790
+msgid "You no longer have a start page selected."
+msgstr ""
+
+#: ../webcit.c:826
+msgid "Authorization Required"
+msgstr ""
+
+#: ../webcit.c:828
+#, c-format
+msgid ""
+"The resource you requested requires a valid username and password. You could "
+"not be logged in: %s\n"
+msgstr ""
+
+#: ../webcit.c:1247
+#, 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 ""
+
+#: ../webcit.c:1484 ../webcit.c:1486
+msgid "Room info"
+msgstr ""
+
+#: ../webcit.c:1489 ../webcit.c:1491
+msgid "Your bio"
+msgstr ""
+
+#: ../webcit.c:1499
+msgid "your photo"
+msgstr ""
+
+#: ../webcit.c:1505
+msgid "the icon for this room"
+msgstr ""
+
+#: ../webcit.c:1519
+msgid "the icon for this floor"
+msgstr ""
+
+#: ../who.c:27
+msgid "User name"
+msgstr ""
+
+#: ../who.c:28
+msgid "Room"
+msgstr ""
+
+#: ../who.c:29
+msgid "From host"
+msgstr ""
+
+#: ../who.c:62
+msgid "(kill)"
+msgstr ""
+
+#: ../who.c:65
+msgid "(edit)"
+msgstr ""
+
+#: ../who.c:141
+msgid "Do you really want to kill this session?"
+msgstr ""
+
+#: ../who.c:151
+#, c-format
+msgid "Users currently on %s"
+msgstr ""
+
+#: ../who.c:166
+#, c-format
+msgid ""
+"Click on a name to read user info.  Click on %s to send an instant message "
+"to that user."
+msgstr ""
+
+#: ../who.c:228
+msgid "Edit your session display"
+msgstr ""
+
+#: ../who.c:232
+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 ""
+
+#: ../who.c:244
+msgid "Room name:"
+msgstr ""
+
+#: ../who.c:249
+msgid "Change room name"
+msgstr ""
+
+#: ../who.c:253
+msgid "Host name:"
+msgstr ""
+
+#: ../who.c:258
+msgid "Change host name"
+msgstr ""
+
+#: ../who.c:268
+msgid "Change user name"
+msgstr ""
+
+#: ../wiki.c:64
+#, c-format
+msgid "There is no room called '%s'."
+msgstr ""
+
+#: ../wiki.c:74
+#, c-format
+msgid "'%s' is not a Wiki room."
+msgstr ""
+
+#: ../wiki.c:100
+#, c-format
+msgid "There is no page called '%s' here."
+msgstr ""
+
+#: ../wiki.c:102
+msgid ""
+"Select the 'Edit this page' link in the room banner if you would like to "
+"create this page."
+msgstr ""
diff --git a/webcit/preferences.c b/webcit/preferences.c
new file mode 100644 (file)
index 0000000..9284ead
--- /dev/null
@@ -0,0 +1,428 @@
+/*
+ * $Id$
+ */
+/**
+ * \defgroup ManagePrefs Manage user preferences with a little help from the Citadel server.
+ * \ingroup CitadelConfig
+ *
+ */
+/*@{*/
+#include "webcit.h"
+#include "webserver.h"
+#include "groupdav.h"
+
+
+/**
+ * \brief display preferences dialog
+ */
+void load_preferences(void) {
+       char buf[SIZ];
+       long msgnum = 0L;
+
+       serv_printf("GOTO %s", USERCONFIGROOM);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '2') return;
+       
+       serv_puts("MSGS ALL|0|1");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '8') {
+               serv_puts("subj|__ WebCit Preferences __");
+               serv_puts("000");
+       }
+       while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+               msgnum = atol(buf);
+       }
+
+       if (msgnum > 0L) {
+               serv_printf("MSG0 %ld", msgnum);
+               serv_getln(buf, sizeof buf);
+               if (buf[0] == '1') {
+                       while (serv_getln(buf, sizeof buf),
+                               (strcmp(buf, "text") && strcmp(buf, "000"))) {
+                       }
+                       if (!strcmp(buf, "text")) {
+                               while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+                                       if (WC->preferences == NULL) {
+                                               WC->preferences = malloc(SIZ);
+                                               strcpy(WC->preferences, "");
+                                       }
+                                       else {
+                                               WC->preferences = realloc(
+                                                       WC->preferences,
+                                                       strlen(WC->preferences)
+                                                       +SIZ
+                                               );
+                                       }
+                                       strcat(WC->preferences, buf);
+                                       strcat(WC->preferences, "\n");
+                               }
+                       }
+               }
+       }
+
+       /** Go back to the room we're supposed to be in */
+       serv_printf("GOTO %s", WC->wc_roomname);
+       serv_getln(buf, sizeof buf);
+}
+
+/**
+ * \brief Goto the user's configuration room, creating it if necessary.
+ * \return 0 on success or nonzero upon failure.
+ */
+int goto_config_room(void) {
+       char buf[SIZ];
+
+       serv_printf("GOTO %s", USERCONFIGROOM);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '2') { /* try to create the config room if not there */
+               serv_printf("CRE8 1|%s|4|0", USERCONFIGROOM);
+               serv_getln(buf, sizeof buf);
+               serv_printf("GOTO %s", USERCONFIGROOM);
+               serv_getln(buf, sizeof buf);
+               if (buf[0] != '2') return(1);
+       }
+       return(0);
+}
+
+/**
+ * \brief save the modifications
+ */
+void save_preferences(void) {
+       char buf[SIZ];
+       long msgnum = 0L;
+
+       if (goto_config_room() != 0) return;    /* oh well. */
+       serv_puts("MSGS ALL|0|1");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '8') {
+               serv_puts("subj|__ WebCit Preferences __");
+               serv_puts("000");
+       }
+       while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+               msgnum = atol(buf);
+       }
+
+       if (msgnum > 0L) {
+               serv_printf("DELE %ld", msgnum);
+               serv_getln(buf, sizeof buf);
+       }
+
+       serv_printf("ENT0 1||0|1|__ WebCit Preferences __|");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '4') {
+               serv_puts(WC->preferences);
+               serv_puts("");
+               serv_puts("000");
+       }
+
+       /** Go back to the room we're supposed to be in */
+       serv_printf("GOTO %s", WC->wc_roomname);
+       serv_getln(buf, sizeof buf);
+}
+
+/**
+ * \brief query the actual setting of key in the citadel database
+ * \param key config key to query
+ * \param value value to the key to get
+ * \param value_len length of the value string
+ */
+void get_preference(char *key, char *value, size_t value_len) {
+       int num_prefs;
+       int i;
+       char buf[SIZ];
+       char thiskey[SIZ];
+
+       strcpy(value, "");
+
+       num_prefs = num_tokens(WC->preferences, '\n');
+       for (i=0; i<num_prefs; ++i) {
+               extract_token(buf, WC->preferences, i, '\n', sizeof buf);
+               extract_token(thiskey, buf, 0, '|', sizeof thiskey);
+               if (!strcasecmp(thiskey, key)) {
+                       extract_token(value, buf, 1, '|', value_len);
+               }
+       }
+}
+
+/**
+ * \brief      Write a key into the webcit preferences database for this user
+ *
+ * \params     key             key whichs value is to be modified
+ * \param      value           value to set
+ * \param      save_to_server  1 = flush all data to the server, 0 = cache it for now
+ */
+void set_preference(char *key, char *value, int save_to_server) {
+       int num_prefs;
+       int i;
+       char buf[SIZ];
+       char thiskey[SIZ];
+       char *newprefs = NULL;
+
+       newprefs = malloc(strlen(WC->preferences) + strlen(key) + strlen(value) + 10);
+       if (newprefs == NULL) return;
+       strcpy(newprefs, "");
+
+       num_prefs = num_tokens(WC->preferences, '\n');
+       for (i=0; i<num_prefs; ++i) {
+               extract_token(buf, WC->preferences, i, '\n', sizeof buf);
+               if (num_tokens(buf, '|') == 2) {
+                       extract_token(thiskey, buf, 0, '|', sizeof thiskey);
+                       if (strcasecmp(thiskey, key)) {
+                               strcat(newprefs, buf);
+                               strcat(newprefs, "\n");
+                       }
+               }
+       }
+
+       sprintf(&newprefs[strlen(newprefs)], "%s|%s\n", key, value);
+       free(WC->preferences);
+       WC->preferences = newprefs;
+
+       if (save_to_server) save_preferences();
+}
+
+
+
+
+/** 
+ * \brief display form for changing your preferences and settings
+ */
+void display_preferences(void)
+{
+       output_headers(1, 1, 2, 0, 0, 0);
+       char ebuf[300];
+       char buf[256];
+       char calhourformat[16];
+       int i;
+
+       wprintf("<div id=\"banner\">\n");
+       wprintf("<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>");
+       wprintf("<img src=\"static/advanpage2_48x.gif\" ALT=\" \" ALIGN=MIDDLE>");
+       wprintf("<SPAN CLASS=\"titlebar\">&nbsp;");
+       wprintf(_("Preferences and settings"));
+       wprintf("</SPAN></TD><TD ALIGN=RIGHT>");
+       offer_start_page();
+       wprintf("</TD></TR></TABLE>\n");
+       wprintf("</div>\n"
+               "<div id=\"content\">\n");
+
+       wprintf("<div class=\"fix_scrollbar_bug\">"
+               "<table border=0 width=100%% bgcolor=\"#ffffff\"><tr><td>\n");
+
+       /** begin form */
+       wprintf("<center>\n"
+               "<form name=\"prefform\" action=\"set_preferences\" "
+               "method=\"post\">\n"
+               "<table border=0 cellspacing=5 cellpadding=5>\n");
+
+       /**
+        * Room list view
+        */
+       get_preference("roomlistview", buf, sizeof buf);
+       wprintf("<tr><td>");
+       wprintf(_("Room list view"));
+       wprintf("</td><td>");
+
+       wprintf("<input type=\"radio\" name=\"roomlistview\" VALUE=\"folders\"");
+       if (!strcasecmp(buf, "folders")) wprintf(" checked");
+       wprintf(">");
+       wprintf(_("Tree (folders) view"));
+       wprintf("<br></input>\n");
+
+       wprintf("<input type=\"radio\" name=\"roomlistview\" VALUE=\"rooms\"");
+       if (!strcasecmp(buf, "rooms")) wprintf(" checked");
+       wprintf(">");
+       wprintf(_("Table (rooms) view"));
+       wprintf("<br></input>\n");
+
+       wprintf("</td></tr>\n");
+
+       /**
+        * Calendar hour format
+        */
+       get_preference("calhourformat", calhourformat, sizeof calhourformat);
+       if (calhourformat[0] == 0) strcpy(calhourformat, "12");
+       wprintf("<tr><td>");
+       wprintf(_("Calendar hour format"));
+       wprintf("</td><td>");
+
+       wprintf("<input type=\"radio\" name=\"calhourformat\" VALUE=\"12\"");
+       if (!strcasecmp(calhourformat, "12")) wprintf(" checked");
+       wprintf(">");
+       wprintf(_("12 hour (am/pm)"));
+       wprintf("<br></input>\n");
+
+       wprintf("<input type=\"radio\" name=\"calhourformat\" VALUE=\"24\"");
+       if (!strcasecmp(calhourformat, "24")) wprintf(" checked");
+       wprintf(">");
+       wprintf(_("24 hour"));
+       wprintf("<br></input>\n");
+
+       wprintf("</td></tr>\n");
+
+       /**
+        * Calendar day view -- day start time
+        */
+       get_preference("daystart", buf, sizeof buf);
+       if (buf[0] == 0) strcpy(buf, "8");
+       wprintf("<tr><td>");
+       wprintf(_("Calendar day view begins at:"));
+       wprintf("</td><td>");
+
+       wprintf("<SELECT NAME=\"daystart\" SIZE=\"1\">\n");
+       for (i=0; i<=23; ++i) {
+
+               if (!strcasecmp(calhourformat, "24")) {
+                       wprintf("<OPTION %s VALUE=\"%d\">%d:00</OPTION>\n",
+                               ((atoi(buf) == i) ? "SELECTED" : ""),
+                               i, i
+                       );
+               }
+               else {
+                       wprintf("<OPTION %s VALUE=\"%d\">%s</OPTION>\n",
+                               ((atoi(buf) == i) ? "SELECTED" : ""),
+                               i, hourname[i]
+                       );
+               }
+
+       }
+       wprintf("</SELECT>\n");
+       wprintf("</td></tr>\n");
+
+       /**
+        * Calendar day view -- day end time
+        */
+       get_preference("dayend", buf, sizeof buf);
+       if (buf[0] == 0) strcpy(buf, "17");
+       wprintf("<tr><td>");
+       wprintf(_("Calendar day view ends at:"));
+       wprintf("</td><td>");
+
+       wprintf("<SELECT NAME=\"dayend\" SIZE=\"1\">\n");
+       for (i=0; i<=23; ++i) {
+
+               if (!strcasecmp(calhourformat, "24")) {
+                       wprintf("<OPTION %s VALUE=\"%d\">%d:00</OPTION>\n",
+                               ((atoi(buf) == i) ? "SELECTED" : ""),
+                               i, i
+                       );
+               }
+               else {
+                       wprintf("<OPTION %s VALUE=\"%d\">%s</OPTION>\n",
+                               ((atoi(buf) == i) ? "SELECTED" : ""),
+                               i, hourname[i]
+                       );
+               }
+
+       }
+       wprintf("</SELECT>\n");
+       wprintf("</td></tr>\n");
+
+       /**
+        * Signature
+        */
+       get_preference("use_sig", buf, sizeof buf);
+       if (buf[0] == 0) strcpy(buf, "no");
+       wprintf("<tr><td>");
+       wprintf(_("Attach signature to email messages?"));
+       wprintf("</td><td>");
+
+       wprintf("       <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>                                                               "
+       );
+
+       wprintf("<input type=\"radio\" id=\"no_sig\" name=\"use_sig\" VALUE=\"no\"");
+       if (!strcasecmp(buf, "no")) wprintf(" checked");
+       wprintf(" onChange=\"show_or_hide_sigbox();\" >");
+       wprintf(_("No signature"));
+       wprintf("<br></input>\n");
+
+       wprintf("<input type=\"radio\" id=\"yes_sig\" name=\"use_sig\" VALUE=\"yes\"");
+       if (!strcasecmp(buf, "yes")) wprintf(" checked");
+       wprintf(" onChange=\"show_or_hide_sigbox();\" >");
+       wprintf(_("Use this signature:"));
+       wprintf("<div id=\"signature_box\">"
+               "<br><textarea name=\"signature\" cols=\"40\" rows=\"5\">"
+       );
+       get_preference("signature", ebuf, sizeof ebuf);
+       euid_unescapize(buf, ebuf);
+       escputs(buf);
+       wprintf("</textarea>"
+               "</div>"
+       );
+
+       wprintf("<br></input>\n");
+
+       wprintf("</td></tr>\n");
+
+       wprintf("       <script type=\"text/javascript\">       "
+               "       show_or_hide_sigbox();                  "
+               "       </script>                               "
+       );
+
+       /** Character set to assume is in use for improperly encoded headers */
+       get_preference("default_header_charset", buf, sizeof buf);
+       if (buf[0] == 0) strcpy(buf, "UTF-8");
+       wprintf("<tr><td>");
+       wprintf(_("Default character set for email headers:"));
+       wprintf("</td><td>");
+       wprintf("<input type=\"text\" NAME=\"default_header_charset\" MAXLENGTH=\"32\" VALUE=\"%s\">", buf);
+       wprintf("</td></tr>");
+
+       /** submit buttons */
+       wprintf("</table>\n"
+               "<input type=\"submit\" name=\"change_button\" value=\"%s\">"
+               "&nbsp;"
+               "<INPUT type=\"submit\" name=\"cancel_button\" value=\"%s\">\n",
+               _("Change"),
+               _("Cancel")
+       );
+
+       /** end form */
+       wprintf("</form></center>\n");
+       wprintf("</td></tr></table></div>\n");
+       wDumpContent(1);
+}
+
+/**
+ * \brief Commit new preferences and settings
+ */
+void set_preferences(void)
+{
+       char ebuf[300];
+
+       if (strlen(bstr("change_button")) == 0) {
+               safestrncpy(WC->ImportantMessage, 
+                       _("Cancelled.  No settings were changed."),
+                       sizeof WC->ImportantMessage);
+               display_main_menu();
+               return;
+       }
+
+       /**
+        * Set the last argument to 1 only for the final setting, so
+        * we don't send the prefs file to the server repeatedly
+        */
+       set_preference("roomlistview", bstr("roomlistview"), 0);
+       set_preference("calhourformat", bstr("calhourformat"), 0);
+       set_preference("use_sig", bstr("use_sig"), 0);
+       set_preference("daystart", bstr("daystart"), 0);
+       set_preference("dayend", bstr("dayend"), 0);
+       set_preference("default_header_charset", bstr("default_header_charset"), 0);
+
+       euid_escapize(ebuf, bstr("signature"));
+       set_preference("signature", ebuf, 1);
+
+       display_main_menu();
+}
+
+
+/*@}*/
diff --git a/webcit/roomops.c b/webcit/roomops.c
new file mode 100644 (file)
index 0000000..73eb0d6
--- /dev/null
@@ -0,0 +1,3055 @@
+/*
+ * $Id$
+ */
+/**
+ * \defgroup RoomOps Lots of different room-related operations.
+ * \ingroup CitadelCommunitacion
+ */
+/*@{*/
+#include "webcit.h"
+
+char floorlist[128][SIZ]; /**< list of our floor names */
+
+char *viewdefs[8]; /**< the different kinds of available views */
+
+/**
+ * \brief initialize the viewdefs with localized strings
+ */
+void initialize_viewdefs(void) {
+       viewdefs[0] = _("Bulletin Board");
+       viewdefs[1] = _("Mail Folder");
+       viewdefs[2] = _("Address Book");
+       viewdefs[3] = _("Calendar");
+       viewdefs[4] = _("Task List");
+       viewdefs[5] = _("Notes List");
+       viewdefs[6] = _("Wiki");
+       viewdefs[7] = _("Calendar List");
+}
+
+/**
+ * \brief      Determine which views are allowed as the default for creating a new room.
+ *
+ * \param      which_view      The view ID being queried.
+ */
+int is_view_allowed_as_default(int which_view)
+{
+       switch(which_view) {
+               case VIEW_BBS:          return(1);
+               case VIEW_MAILBOX:      return(1);
+               case VIEW_ADDRESSBOOK:  return(1);
+               case VIEW_CALENDAR:     return(1);
+               case VIEW_TASKS:        return(1);
+               case VIEW_NOTES:        return(1);
+               case VIEW_WIKI:         return(0);      /**< because it isn't finished yet */
+               case VIEW_CALBRIEF:     return(0);
+               default:                return(0);      /**< should never get here */
+       }
+}
+
+
+/**
+ * \brief load the list of floors
+ */
+void load_floorlist(void)
+{
+       int a;
+       char buf[SIZ];
+
+       for (a = 0; a < 128; ++a)
+               floorlist[a][0] = 0;
+
+       serv_puts("LFLR");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '1') {
+               strcpy(floorlist[0], "Main Floor");
+               return;
+       }
+       while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+               extract_token(floorlist[extract_int(buf, 0)], buf, 1, '|', sizeof floorlist[0]);
+       }
+}
+
+
+/**
+ * \brief      Free a session's march list
+ *
+ * \param      wcf             Pointer to session being cleared
+ */
+void free_march_list(struct wcsession *wcf)
+{
+       struct march *mptr;
+
+       while (wcf->march != NULL) {
+               mptr = wcf->march->next;
+               free(wcf->march);
+               wcf->march = mptr;
+       }
+
+}
+
+
+
+/**
+ * \brief remove a room from the march list
+ */
+void remove_march(char *aaa)
+{
+       struct march *mptr, *mptr2;
+
+       if (WC->march == NULL)
+               return;
+
+       if (!strcasecmp(WC->march->march_name, 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, aaa)) {
+                       mptr2->next = mptr->next;
+                       free(mptr);
+                       mptr = mptr2;
+               } else {
+                       mptr2 = mptr;
+               }
+       }
+}
+
+
+
+
+/**
+ * \brief display rooms in tree structure???
+ * \param rp the roomlist to build a tree from
+ */
+void room_tree_list(struct roomlisting *rp)
+{
+       char rmname[64];
+       int f;
+
+       if (rp == NULL) {
+               return;
+       }
+
+       room_tree_list(rp->lnext);
+
+       strcpy(rmname, rp->rlname);
+       f = rp->rlflags;
+
+       wprintf("<a href=\"dotgoto&room=");
+       urlescputs(rmname);
+       wprintf("\"");
+       wprintf(">");
+       escputs1(rmname, 1, 1);
+       if ((f & QR_DIRECTORY) && (f & QR_NETWORK))
+               wprintf("}");
+       else if (f & QR_DIRECTORY)
+               wprintf("]");
+       else if (f & QR_NETWORK)
+               wprintf(")");
+       else
+               wprintf("&gt;");
+       wprintf("</A><TT> </TT>\n");
+
+       room_tree_list(rp->rnext);
+       free(rp);
+}
+
+
+/** 
+ * \brief Room ordering stuff (compare first by floor, then by order)
+ * \param r1 first roomlist to compare
+ * \param r2 second roomlist co compare
+ * \return are they the same???
+ */
+int rordercmp(struct roomlisting *r1, struct roomlisting *r2)
+{
+       if ((r1 == NULL) && (r2 == NULL))
+               return (0);
+       if (r1 == NULL)
+               return (-1);
+       if (r2 == NULL)
+               return (1);
+       if (r1->rlfloor < r2->rlfloor)
+               return (-1);
+       if (r1->rlfloor > r2->rlfloor)
+               return (1);
+       if (r1->rlorder < r2->rlorder)
+               return (-1);
+       if (r1->rlorder > r2->rlorder)
+               return (1);
+       return (0);
+}
+
+
+/**
+ * \brief Common code for all room listings
+ * \param variety what???
+ */
+void listrms(char *variety)
+{
+       char buf[SIZ];
+       int num_rooms = 0;
+
+       struct roomlisting *rl = NULL;
+       struct roomlisting *rp;
+       struct roomlisting *rs;
+
+
+       /** Ask the server for a room list */
+       serv_puts(variety);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '1') {
+               wprintf("&nbsp;");
+               return;
+       }
+       while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+               ++num_rooms;
+               rp = malloc(sizeof(struct roomlisting));
+               extract_token(rp->rlname, buf, 0, '|', sizeof rp->rlname);
+               rp->rlflags = extract_int(buf, 1);
+               rp->rlfloor = extract_int(buf, 2);
+               rp->rlorder = extract_int(buf, 3);
+               rp->lnext = NULL;
+               rp->rnext = NULL;
+
+               rs = rl;
+               if (rl == NULL) {
+                       rl = rp;
+               } else
+                       while (rp != NULL) {
+                               if (rordercmp(rp, rs) < 0) {
+                                       if (rs->lnext == NULL) {
+                                               rs->lnext = rp;
+                                               rp = NULL;
+                                       } else {
+                                               rs = rs->lnext;
+                                       }
+                               } else {
+                                       if (rs->rnext == NULL) {
+                                               rs->rnext = rp;
+                                               rp = NULL;
+                                       } else {
+                                               rs = rs->rnext;
+                                       }
+                               }
+                       }
+       }
+
+       room_tree_list(rl);
+
+       /**
+        * If no rooms were listed, print an nbsp to make the cell
+        * borders show up anyway.
+        */
+       if (num_rooms == 0) wprintf("&nbsp;");
+}
+
+
+/**
+ * \brief list all forgotten rooms
+ */
+void zapped_list(void)
+{
+       output_headers(1, 1, 0, 0, 0, 0);
+
+       svprintf("BOXTITLE", WCS_STRING, _("Zapped (forgotten) rooms"));
+       do_template("beginbox");
+
+       listrms("LZRM -1");
+
+       wprintf("<br /><br />\n");
+       wprintf(_("Click on any room to un-zap it and goto that room.\n"));
+       do_template("endbox");
+       wDumpContent(1);
+}
+
+
+/**
+ * \brief read this room's info file (set v to 1 for verbose mode)
+ */
+void readinfo(void)
+{
+       char buf[SIZ];
+
+       serv_puts("RINF");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '1') {
+               fmout("CENTER");
+       }
+       else {
+               wprintf("&nbsp;");
+       }
+}
+
+
+
+
+/**
+ * \brief Display room banner icon.  
+ * The server doesn't actually
+ * need the room name, but we supply it in order to
+ * keep the browser from using a cached icon from 
+ * another room.
+ */
+void embed_room_graphic(void) {
+       char buf[SIZ];
+
+       serv_puts("OIMG _roompic_");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '2') {
+               wprintf("<IMG HEIGHT=64 src=\"image&name=_roompic_&room=");
+               urlescputs(WC->wc_roomname);
+               wprintf("\">");
+               serv_puts("CLOS");
+               serv_getln(buf, sizeof buf);
+       }
+       else if (WC->wc_view == VIEW_ADDRESSBOOK) {
+               wprintf("<img height=48 width=48 src=\""
+                       "static/viewcontacts_48x.gif"
+                       "\">"
+               );
+       }
+       else if ( (WC->wc_view == VIEW_CALENDAR) || (WC->wc_view == VIEW_CALBRIEF) ) {
+               wprintf("<img height=48 width=48 src=\""
+                       "static/calarea_48x.gif"
+                       "\">"
+               );
+       }
+       else if (WC->wc_view == VIEW_TASKS) {
+               wprintf("<img height=48 width=48 src=\""
+                       "static/taskmanag_48x.gif"
+                       "\">"
+               );
+       }
+       else if (WC->wc_view == VIEW_NOTES) {
+               wprintf("<img height=48 width=48 src=\""
+                       "static/storenotes_48x.gif"
+                       "\">"
+               );
+       }
+       else if (WC->wc_view == VIEW_MAILBOX) {
+               wprintf("<img height=48 width=48 src=\""
+                       "static/privatemess_48x.gif"
+                       "\">"
+               );
+       }
+       else {
+               wprintf("<img height=48 width=48 src=\""
+                       "static/chatrooms_48x.gif"
+                       "\">"
+               );
+       }
+
+}
+
+
+
+/**
+ * \brief Display the current view and offer an option to change it
+ */
+void embed_view_o_matic(void) {
+       int i;
+
+       wprintf("<form name=\"viewomatic\" action=\"changeview\">\n"
+               "<span class=\"room_banner_new_messages\">");
+       wprintf(_("View as:"));
+       wprintf(" "
+               "<SELECT NAME=\"newview\" SIZE=\"1\" "
+               "STYLE=\"font-size: 7pt; background: #444455; color: #ddddcc;\" "
+               "OnChange=\"location.href=viewomatic.newview.options"
+               "[selectedIndex].value\">\n");
+
+       for (i=0; i<(sizeof viewdefs / sizeof (char *)); ++i) {
+               /**
+                * Only offer the views that make sense, given the default
+                * view for the room.  For example, don't offer a Calendar
+                * view in a non-Calendar room.
+                */
+               if (
+                       (i == WC->wc_view)
+                       ||      (i == WC->wc_default_view)                      /**< default */
+                       ||      ( (i == 0) && (WC->wc_default_view == 1) )      /**< mail or bulletin */
+                       ||      ( (i == 1) && (WC->wc_default_view == 0) )      /**< mail or bulletin */
+                       /** ||  ( (i == 7) && (WC->wc_default_view == 3) )      (calendar list temporarily disabled) */
+               ) {
+
+                       wprintf("<OPTION %s VALUE=\"changeview?view=%d\">",
+                               ((i == WC->wc_view) ? "SELECTED" : ""),
+                               i );
+                       escputs(viewdefs[i]);
+                       wprintf("</OPTION>\n");
+               }
+       }
+       wprintf("</select></span></form>\n");
+}
+
+
+/**
+ * \brief view room banner
+ * \param got what???
+ * \param navbar_style
+ */
+void embed_room_banner(char *got, int navbar_style) {
+       char buf[256];
+
+       /**
+        * We need to have the information returned by a GOTO server command.
+        * If it isn't supplied, we fake it by issuing our own GOTO.
+        */
+       if (got == NULL) {
+               serv_printf("GOTO %s", WC->wc_roomname);
+               serv_getln(buf, sizeof buf);
+               got = buf;
+       }
+
+       /** The browser needs some information for its own use */
+       wprintf("<script type=\"text/javascript\">      \n"
+               "       room_is_trash = %d;             \n"
+               "</script>\n",
+               WC->wc_is_trash
+       );
+
+       /**
+        * 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.
+        */
+       snprintf(WC->this_page, sizeof(WC->this_page), "dotskip&room=%s",
+               WC->wc_roomname);
+
+       /** Check for new mail. */
+       WC->new_mail = extract_int(&got[4], 9);
+       WC->wc_view = extract_int(&got[4], 11);
+
+       svprintf("ROOMNAME", WCS_STRING, "%s", WC->wc_roomname);
+       svprintf("NUMMSGS", WCS_STRING,
+               _("%d new of %d messages"),
+               extract_int(&got[4], 1),
+               extract_int(&got[4], 2)
+       );
+       svcallback("ROOMPIC", embed_room_graphic);
+       svcallback("ROOMINFO", readinfo);
+       svcallback("VIEWOMATIC", embed_view_o_matic);
+       svcallback("START", offer_start_page);
+
+       do_template("roombanner");
+       if (navbar_style != navbar_none) {
+
+               wprintf("<div style=\"position:absolute; bottom:0px; left:0px\">\n"
+                       "<table width=\"100%%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\"><tr>\n");
+
+
+               if (navbar_style == navbar_default) wprintf(
+                       "<td>"
+                       "<a href=\"ungoto\">"
+                       "<img align=\"middle\" src=\"static/ungoto2_24x.gif\" border=\"0\">"
+                       "<span class=\"navbar_link\">%s</span></A>"
+                       "</td>\n", _("Ungoto")
+               );
+
+               if ( (navbar_style == navbar_default) && (WC->wc_view == VIEW_BBS) ) {
+                       wprintf(
+                               "<td>"
+                               "<a href=\"readnew\">"
+                               "<img align=\"middle\" src=\"static/newmess2_24x.gif\" border=\"0\">"
+                               "<span class=\"navbar_link\">%s</span></A>"
+                               "</td>\n", _("Read new messages")
+                       );
+               }
+
+               if (navbar_style == navbar_default) {
+                       switch(WC->wc_view) {
+                               case VIEW_ADDRESSBOOK:
+                                       wprintf(
+                                               "<td>"
+                                               "<a href=\"readfwd\">"
+                                               "<img align=\"middle\" src=\"static/viewcontacts_24x.gif\" "
+                                               "border=\"0\">"
+                                               "<span class=\"navbar_link\">"
+                                               "%s"
+                                               "</span></a></td>\n", _("View contacts")
+                                       );
+                                       break;
+                               case VIEW_CALENDAR:
+                                       wprintf(
+                                               "<td>"
+                                               "<a href=\"readfwd?calview=day\">"
+                                               "<img align=\"middle\" src=\"static/taskday2_24x.gif\" "
+                                               "border=\"0\">"
+                                               "<span class=\"navbar_link\">"
+                                               "%s"
+                                               "</span></a></td>\n", _("Day view")
+                                       );
+                                       wprintf(
+                                               "<td>"
+                                               "<a href=\"readfwd?calview=month\">"
+                                               "<img align=\"middle\" src=\"static/monthview2_24x.gif\" "
+                                               "border=\"0\">"
+                                               "<span class=\"navbar_link\">"
+                                               "%s"
+                                               "</span></a></td>\n", _("Month view")
+                                       );
+                                       break;
+                               case VIEW_CALBRIEF:
+                                       wprintf(
+                                               "<td>"
+                                               "<a href=\"readfwd?calview=month\">"
+                                               "<img align=\"middle\" src=\"static/monthview2_24x.gif\" "
+                                               "border=\"0\">"
+                                               "<span class=\"navbar_link\">"
+                                               "%s"
+                                               "</span></a></td>\n", _("Calendar list")
+                                       );
+                                       break;
+                               case VIEW_TASKS:
+                                       wprintf(
+                                               "<td>"
+                                               "<a href=\"readfwd\">"
+                                               "<img align=\"middle\" src=\"static/taskmanag_24x.gif\" "
+                                               "border=\"0\">"
+                                               "<span class=\"navbar_link\">"
+                                               "%s"
+                                               "</span></a></td>\n", _("View tasks")
+                                       );
+                                       break;
+                               case VIEW_NOTES:
+                                       wprintf(
+                                               "<td>"
+                                               "<a href=\"readfwd\">"
+                                               "<img align=\"middle\" src=\"static/viewnotes_24x.gif\" "
+                                               "border=\"0\">"
+                                               "<span class=\"navbar_link\">"
+                                               "%s"
+                                               "</span></a></td>\n", _("View notes")
+                                       );
+                                       break;
+                               case VIEW_MAILBOX:
+                                       wprintf(
+                                               "<td>"
+                                               "<a href=\"readfwd\">"
+                                               "<img align=\"middle\" src=\"static/readallmess3_24x.gif\" "
+                                               "border=\"0\">"
+                                               "<span class=\"navbar_link\">"
+                                               "%s"
+                                               "</span></a></td>\n", _("View message list")
+                                       );
+                                       break;
+                               case VIEW_WIKI:
+                                       wprintf(
+                                               "<td>"
+                                               "<a href=\"readfwd\">"
+                                               "<img align=\"middle\" src=\"static/readallmess3_24x.gif\" "
+                                               "border=\"0\">"
+                                               "<span class=\"navbar_link\">"
+                                               "%s"
+                                               "</span></a></td>\n", _("Wiki home")
+                                       );
+                                       break;
+                               default:
+                                       wprintf(
+                                               "<td>"
+                                               "<a href=\"readfwd\">"
+                                               "<img align=\"middle\" src=\"static/readallmess3_24x.gif\" "
+                                               "border=\"0\">"
+                                               "<span class=\"navbar_link\">"
+                                               "%s"
+                                               "</span></a></td>\n", _("Read all messages")
+                                       );
+                                       break;
+                       }
+               }
+
+               if (navbar_style == navbar_default) {
+                       switch(WC->wc_view) {
+                               case VIEW_ADDRESSBOOK:
+                                       wprintf(
+                                               "<td><a href=\"display_enter\">"
+                                               "<img align=\"middle\" src=\"static/addnewcontact_24x.gif\" "
+                                               "border=\"0\"><span class=\"navbar_link\">"
+                                               "%s"
+                                               "</span></a></td>\n", _("Add new contact")
+                                       );
+                                       break;
+                               case VIEW_CALENDAR:
+                               case VIEW_CALBRIEF:
+                                       wprintf("<td><a href=\"display_enter");
+                                       if (strlen(bstr("year")) > 0) wprintf("?year=%s", bstr("year"));
+                                       if (strlen(bstr("month")) > 0) wprintf("?month=%s", bstr("month"));
+                                       if (strlen(bstr("day")) > 0) wprintf("?day=%s", bstr("day"));
+                                       wprintf("\">"
+                                               "<img align=\"middle\" src=\"static/addevent_24x.gif\" "
+                                               "border=\"0\"><span class=\"navbar_link\">"
+                                               "%s"
+                                               "</span></a></td>\n", _("Add new event")
+                                       );
+                                       break;
+                               case VIEW_TASKS:
+                                       wprintf(
+                                               "<td><a href=\"display_enter\">"
+                                               "<img align=\"middle\" src=\"static/newmess3_24x.gif\" "
+                                               "border=\"0\"><span class=\"navbar_link\">"
+                                               "%s"
+                                               "</span></a></td>\n", _("Add new task")
+                                       );
+                                       break;
+                               case VIEW_NOTES:
+                                       wprintf(
+                                               "<td><a href=\"javascript:add_new_note();\">"
+                                               "<img align=\"middle\" src=\"static/enternewnote_24x.gif\" "
+                                               "border=\"0\"><span class=\"navbar_link\">"
+                                               "%s"
+                                               "</span></a></td>\n", _("Add new note")
+                                       );
+                                       break;
+                               case VIEW_WIKI:
+                                       safestrncpy(buf, bstr("page"), sizeof buf);
+                                       str_wiki_index(buf);
+                                       wprintf(
+                                               "<td><a href=\"display_enter?wikipage=%s\">"
+                                               "<img align=\"middle\" src=\"static/newmess3_24x.gif\" "
+                                               "border=\"0\"><span class=\"navbar_link\">"
+                                               "%s"
+                                               "</span></a></td>\n", buf, _("Edit this page")
+                                       );
+                                       break;
+                               default:
+                                       wprintf(
+                                               "<td><a href=\"display_enter\">"
+                                               "<img align=\"middle\" src=\"static/newmess3_24x.gif\" "
+                                               "border=\"0\"><span class=\"navbar_link\">"
+                                               "%s"
+                                               "</span></a></td>\n", _("Enter a message")
+                                       );
+                                       break;
+                       }
+               }
+
+               if (navbar_style == navbar_default) wprintf(
+                       "<td>"
+                       "<a href=\"skip\" "
+                       "TITLE=\"%s\">"
+                       "<img align=\"middle\" src=\"static/skipthisroom_24x.gif\" border=\"0\">"
+                       "<span class=\"navbar_link\">%s</span></a>"
+                       "</td>\n",
+                       _("Leave all messages marked as unread, go to next room with unread messages"),
+                       _("Skip this room")
+               );
+
+               if (navbar_style == navbar_default) wprintf(
+                       "<td>"
+                       "<a href=\"gotonext\" "
+                       "TITLE=\"%s\">"
+                       "<img align=\"middle\" src=\"static/markngo_24x.gif\" border=\"0\">"
+                       "<span class=\"navbar_link\">%s</span></a>"
+                       "</td>\n",
+                       _("Mark all messages as read, go to next room with unread messages"),
+                       _("Goto next room")
+               );
+
+               wprintf("</tr></table></div>\n");
+       }
+
+}
+
+
+
+
+
+/**
+ * \brief back end routine to take the session to a new room
+ * \param gname room to go to
+ *
+ */
+int gotoroom(char *gname)
+{
+       char buf[SIZ];
+       static long ls = (-1L);
+       int err = 0;
+
+       /** store ungoto information */
+       strcpy(WC->ugname, WC->wc_roomname);
+       WC->uglsn = ls;
+
+       /** move to the new room */
+       serv_printf("GOTO %s", gname);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '2') {
+               buf[3] = 0;
+               err = atoi(buf);
+               serv_puts("GOTO _BASEROOM_");
+               serv_getln(buf, sizeof buf);
+       }
+       if (buf[0] != '2') {
+               buf[3] = 0;
+               err = atoi(buf);
+               return err;
+       }
+       extract_token(WC->wc_roomname, &buf[4], 0, '|', sizeof WC->wc_roomname);
+       WC->room_flags = extract_int(&buf[4], 4);
+       /* highest_msg_read = extract_int(&buf[4],6);
+          maxmsgnum = extract_int(&buf[4],5);
+        */
+       WC->is_mailbox = extract_int(&buf[4],7);
+       ls = extract_long(&buf[4], 6);
+       WC->wc_floor = extract_int(&buf[4], 10);
+       WC->wc_view = extract_int(&buf[4], 11);
+       WC->wc_default_view = extract_int(&buf[4], 12);
+       WC->wc_is_trash = extract_int(&buf[4], 13);
+
+       if (WC->is_aide)
+               WC->is_room_aide = WC->is_aide;
+       else
+               WC->is_room_aide = (char) extract_int(&buf[4], 8);
+
+       remove_march(WC->wc_roomname);
+       if (!strcasecmp(gname, "_BASEROOM_"))
+               remove_march(gname);
+
+       return err;
+}
+
+
+/**
+ * \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 TheFloor = 0;
+       int TheOrder = 32767;
+       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);
+                       TheFloor = mptr->march_floor;
+                       TheOrder = mptr->march_order;
+               }
+       }
+       return (TheRoom);
+}
+
+
+
+/**
+ *\brief 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, *mptr2;
+       char next_room[128];
+
+       /**
+        * 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 (WC->march == NULL) {
+               serv_puts("LKRN");
+               serv_getln(buf, sizeof buf);
+               if (buf[0] == '1')
+                       while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+                               mptr = (struct march *) malloc(sizeof(struct march));
+                               mptr->next = NULL;
+                               extract_token(mptr->march_name, buf, 0, '|', 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 = WC->march;
+                                       while (mptr2->next != NULL)
+                                               mptr2 = mptr2->next;
+                                       mptr2->next = mptr;
+                               }
+                       }
+               /**
+                * 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;
+               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->wc_roomname);
+       }
+       if (WC->march != NULL) {
+               strcpy(next_room, pop_march(-1));
+       } else {
+               strcpy(next_room, "_BASEROOM_");
+       }
+
+
+       smart_goto(next_room);
+}
+
+
+/**
+ * \brief goto next room
+ * \param next_room next room to go to
+ */
+void smart_goto(char *next_room) {
+       gotoroom(next_room);
+       readloop("readnew");
+}
+
+
+
+/**
+ * \brief 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);
+}
+
+
+/**
+ * \brief un-goto the previous room
+ */
+void ungoto(void)
+{
+       char buf[SIZ];
+
+       if (!strcmp(WC->ugname, "")) {
+               smart_goto(WC->wc_roomname);
+               return;
+       }
+       serv_printf("GOTO %s", WC->ugname);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '2') {
+               smart_goto(WC->wc_roomname);
+               return;
+       }
+       if (WC->uglsn >= 0L) {
+               serv_printf("SLRP %ld", WC->uglsn);
+               serv_getln(buf, sizeof buf);
+       }
+       strcpy(buf, WC->ugname);
+       strcpy(WC->ugname, "");
+       smart_goto(buf);
+}
+
+
+
+
+
+/**
+ * \brief Set/clear/read the "self-service list subscribe" flag for a room
+ * 
+ * \param newval set to 0 to clear, 1 to set, any other value to leave unchanged.
+ * \return return the new value.
+ */
+
+int self_service(int newval) {
+       int current_value = 0;
+       char buf[SIZ];
+       
+       char name[SIZ];
+       char password[SIZ];
+       char dirname[SIZ];
+       int flags, floor, order, view, flags2;
+
+       serv_puts("GETR");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '2') return(0);
+
+       extract_token(name, &buf[4], 0, '|', sizeof name);
+       extract_token(password, &buf[4], 1, '|', sizeof password);
+       extract_token(dirname, &buf[4], 2, '|', sizeof dirname);
+       flags = extract_int(&buf[4], 3);
+       floor = extract_int(&buf[4], 4);
+       order = extract_int(&buf[4], 5);
+       view = extract_int(&buf[4], 6);
+       flags2 = extract_int(&buf[4], 7);
+
+       if (flags2 & QR2_SELFLIST) {
+               current_value = 1;
+       }
+       else {
+               current_value = 0;
+       }
+
+       if (newval == 1) {
+               flags2 = flags2 | QR2_SELFLIST;
+       }
+       else if (newval == 0) {
+               flags2 = flags2 & ~QR2_SELFLIST;
+       }
+       else {
+               return(current_value);
+       }
+
+       if (newval != current_value) {
+               serv_printf("SETR %s|%s|%s|%d|0|%d|%d|%d|%d",
+                       name, password, dirname, flags,
+                       floor, order, view, flags2);
+               serv_getln(buf, sizeof buf);
+       }
+
+       return(newval);
+
+}
+
+
+
+
+
+
+/**
+ * \brief display the form for editing a room
+ */
+void display_editroom(void)
+{
+       char buf[SIZ];
+       char cmd[SIZ];
+       char node[SIZ];
+       char remote_room[SIZ];
+       char recp[SIZ];
+       char er_name[128];
+       char er_password[10];
+       char er_dirname[15];
+       char er_roomaide[26];
+       unsigned er_flags;
+       int er_floor;
+       int i, j;
+       char *tab;
+       char *shared_with;
+       char *not_shared_with;
+       int roompolicy = 0;
+       int roomvalue = 0;
+       int floorpolicy = 0;
+       int floorvalue = 0;
+
+       tab = bstr("tab");
+       if (strlen(tab) == 0) tab = "admin";
+
+       load_floorlist();
+       serv_puts("GETR");
+       serv_getln(buf, sizeof buf);
+
+       if (buf[0] != '2') {
+               strcpy(WC->ImportantMessage, &buf[4]);
+               display_main_menu();
+               return;
+       }
+       extract_token(er_name, &buf[4], 0, '|', sizeof er_name);
+       extract_token(er_password, &buf[4], 1, '|', sizeof er_password);
+       extract_token(er_dirname, &buf[4], 2, '|', sizeof er_dirname);
+       er_flags = extract_int(&buf[4], 3);
+       er_floor = extract_int(&buf[4], 4);
+
+       output_headers(1, 1, 1, 0, 0, 0);
+
+       /** print the tabbed dialog */
+       wprintf("<br />"
+               "<div class=\"fix_scrollbar_bug\">"
+               "<TABLE border=0 cellspacing=0 cellpadding=0 width=100%%>"
+               "<TR ALIGN=CENTER>"
+               "<TD>&nbsp;</TD>\n");
+
+       if (!strcmp(tab, "admin")) {
+               wprintf("<TD BGCOLOR=\"#FFFFFF\"><SPAN CLASS=\"tablabel\">");
+       }
+       else {
+               wprintf("<TD BGCOLOR=\"#CCCCCC\"><a href=\"display_editroom&tab=admin\">");
+       }
+       wprintf(_("Administration"));
+       if (!strcmp(tab, "admin")) {
+               wprintf("</SPAN></TD>\n");
+       }
+       else {
+               wprintf("</A></TD>\n");
+       }
+
+       wprintf("<TD>&nbsp;</TD>\n");
+
+       if (!strcmp(tab, "config")) {
+               wprintf("<TD BGCOLOR=\"#FFFFFF\"><SPAN CLASS=\"tablabel\">");
+       }
+       else {
+               wprintf("<TD BGCOLOR=\"#CCCCCC\"><a href=\"display_editroom&tab=config\">");
+       }
+       wprintf(_("Configuration"));
+       if (!strcmp(tab, "config")) {
+               wprintf("</SPAN></TD>\n");
+       }
+       else {
+               wprintf("</A></TD>\n");
+       }
+
+       wprintf("<TD>&nbsp;</TD>\n");
+
+       if (!strcmp(tab, "expire")) {
+               wprintf("<TD BGCOLOR=\"#FFFFFF\"><SPAN CLASS=\"tablabel\">");
+       }
+       else {
+               wprintf("<TD BGCOLOR=\"#CCCCCC\"><a href=\"display_editroom&tab=expire\">");
+       }
+       wprintf(_("Message expire policy"));
+       if (!strcmp(tab, "expire")) {
+               wprintf("</SPAN></TD>\n");
+       }
+       else {
+               wprintf("</A></TD>\n");
+       }
+
+       wprintf("<TD>&nbsp;</TD>\n");
+
+       if (!strcmp(tab, "access")) {
+               wprintf("<TD BGCOLOR=\"#FFFFFF\"><SPAN CLASS=\"tablabel\">");
+       }
+       else {
+               wprintf("<TD BGCOLOR=\"#CCCCCC\"><a href=\"display_editroom&tab=access\">");
+       }
+       wprintf(_("Access controls"));
+       if (!strcmp(tab, "access")) {
+               wprintf("</SPAN></TD>\n");
+       }
+       else {
+               wprintf("</A></TD>\n");
+       }
+
+       wprintf("<TD>&nbsp;</TD>\n");
+
+       if (!strcmp(tab, "sharing")) {
+               wprintf("<TD BGCOLOR=\"#FFFFFF\"><SPAN CLASS=\"tablabel\">");
+       }
+       else {
+               wprintf("<TD BGCOLOR=\"#CCCCCC\"><a href=\"display_editroom&tab=sharing\">");
+       }
+       wprintf(_("Sharing"));
+       if (!strcmp(tab, "sharing")) {
+               wprintf("</SPAN></TD>\n");
+       }
+       else {
+               wprintf("</A></TD>\n");
+       }
+
+       wprintf("<TD>&nbsp;</TD>\n");
+
+       if (!strcmp(tab, "listserv")) {
+               wprintf("<TD BGCOLOR=\"#FFFFFF\"><SPAN CLASS=\"tablabel\">");
+       }
+       else {
+               wprintf("<TD BGCOLOR=\"#CCCCCC\"><a href=\"display_editroom&tab=listserv\">");
+       }
+       wprintf(_("Mailing list service"));
+       if (!strcmp(tab, "listserv")) {
+               wprintf("</SPAN></TD>\n");
+       }
+       else {
+               wprintf("</A></TD>\n");
+       }
+
+       wprintf("<TD>&nbsp;</TD>\n");
+
+       wprintf("</TR></TABLE></div>\n");
+       /** end tabbed dialog */        
+
+       /** begin content of whatever tab is open now */
+       wprintf("<div class=\"fix_scrollbar_bug\">"
+               "<TABLE border=0 width=100%% bgcolor=\"#FFFFFF\">\n"
+               "<TR><TD>\n");
+
+       if (!strcmp(tab, "admin")) {
+               wprintf("<UL>"
+                       "<LI><a href=\"delete_room\" "
+                       "onClick=\"return confirm('");
+               wprintf(_("Are you sure you want to delete this room?"));
+               wprintf("');\">\n");
+               wprintf(_("Delete this room"));
+               wprintf("</A>\n"
+                       "<LI><a href=\"display_editroompic\">\n");
+               wprintf(_("Set or change the icon for this room's banner"));
+               wprintf("</A>\n"
+                       "<LI><a href=\"display_editinfo\">\n");
+               wprintf(_("Edit this room's Info file"));
+               wprintf("</A>\n"
+                       "</UL>");
+       }
+
+       if (!strcmp(tab, "config")) {
+               wprintf("<FORM METHOD=\"POST\" action=\"editroom\">\n");
+       
+               wprintf("<UL><LI>");
+               wprintf(_("Name of room: "));
+               wprintf("<INPUT TYPE=\"text\" NAME=\"er_name\" VALUE=\"%s\" MAXLENGTH=\"%d\">\n",
+                       er_name,
+                       (sizeof(er_name)-1)
+               );
+       
+               wprintf("<LI>");
+               wprintf(_("Resides on floor: "));
+               wprintf("<SELECT NAME=\"er_floor\" SIZE=\"1\">\n");
+               for (i = 0; i < 128; ++i)
+                       if (strlen(floorlist[i]) > 0) {
+                               wprintf("<OPTION ");
+                               if (i == er_floor)
+                                       wprintf("SELECTED ");
+                               wprintf("VALUE=\"%d\">", i);
+                               escputs(floorlist[i]);
+                               wprintf("</OPTION>\n");
+                       }
+               wprintf("</SELECT>\n");
+       
+               wprintf("<LI>");
+               wprintf(_("Type of room:"));
+               wprintf("<UL>\n");
+
+               wprintf("<LI><INPUT TYPE=\"radio\" NAME=\"type\" VALUE=\"public\" ");
+               if ((er_flags & QR_PRIVATE) == 0)
+               wprintf("CHECKED ");
+               wprintf("> ");
+               wprintf(_("Public room"));
+               wprintf("\n");
+
+               wprintf("<LI><INPUT TYPE=\"radio\" NAME=\"type\" VALUE=\"hidden\" ");
+               if ((er_flags & QR_PRIVATE) &&
+                   (er_flags & QR_GUESSNAME))
+                       wprintf("CHECKED ");
+               wprintf("> ");
+               wprintf(_("Private - guess name"));
+       
+               wprintf("\n<LI><INPUT TYPE=\"radio\" NAME=\"type\" VALUE=\"passworded\" ");
+               if ((er_flags & QR_PRIVATE) &&
+                   (er_flags & QR_PASSWORDED))
+                       wprintf("CHECKED ");
+               wprintf("> ");
+               wprintf(_("Private - require password:"));
+               wprintf("\n<INPUT TYPE=\"text\" NAME=\"er_password\" VALUE=\"%s\" MAXLENGTH=\"9\">\n",
+                       er_password);
+       
+               wprintf("<LI><INPUT TYPE=\"radio\" NAME=\"type\" VALUE=\"invonly\" ");
+               if ((er_flags & QR_PRIVATE)
+                   && ((er_flags & QR_GUESSNAME) == 0)
+                   && ((er_flags & QR_PASSWORDED) == 0))
+                       wprintf("CHECKED ");
+               wprintf("> ");
+               wprintf(_("Private - invitation only"));
+       
+               wprintf("\n<LI><INPUT TYPE=\"checkbox\" NAME=\"bump\" VALUE=\"yes\" ");
+               wprintf("> ");
+               wprintf(_("If private, cause current users to forget room"));
+       
+               wprintf("\n</UL>\n");
+       
+               wprintf("<LI><INPUT TYPE=\"checkbox\" NAME=\"prefonly\" VALUE=\"yes\" ");
+               if (er_flags & QR_PREFONLY)
+                       wprintf("CHECKED ");
+               wprintf("> ");
+               wprintf(_("Preferred users only"));
+       
+               wprintf("\n<LI><INPUT TYPE=\"checkbox\" NAME=\"readonly\" VALUE=\"yes\" ");
+               if (er_flags & QR_READONLY)
+                       wprintf("CHECKED ");
+               wprintf("> ");
+               wprintf(_("Read-only room"));
+       
+               /** directory stuff */
+               wprintf("\n<LI><INPUT TYPE=\"checkbox\" NAME=\"directory\" VALUE=\"yes\" ");
+               if (er_flags & QR_DIRECTORY)
+                       wprintf("CHECKED ");
+               wprintf("> ");
+               wprintf(_("File directory room"));
+
+               wprintf("\n<UL><LI>");
+               wprintf(_("Directory name: "));
+               wprintf("<INPUT TYPE=\"text\" NAME=\"er_dirname\" VALUE=\"%s\" MAXLENGTH=\"14\">\n",
+                       er_dirname);
+
+               wprintf("<LI><INPUT TYPE=\"checkbox\" NAME=\"ulallowed\" VALUE=\"yes\" ");
+               if (er_flags & QR_UPLOAD)
+                       wprintf("CHECKED ");
+               wprintf("> ");
+               wprintf(_("Uploading allowed"));
+       
+               wprintf("\n<LI><INPUT TYPE=\"checkbox\" NAME=\"dlallowed\" VALUE=\"yes\" ");
+               if (er_flags & QR_DOWNLOAD)
+                       wprintf("CHECKED ");
+               wprintf("> ");
+               wprintf(_("Downloading allowed"));
+       
+               wprintf("\n<LI><INPUT TYPE=\"checkbox\" NAME=\"visdir\" VALUE=\"yes\" ");
+               if (er_flags & QR_VISDIR)
+                       wprintf("CHECKED ");
+               wprintf("> ");
+               wprintf(_("Visible directory"));
+               wprintf("</UL>\n");
+       
+               /** end of directory stuff */
+       
+               wprintf("<LI><INPUT TYPE=\"checkbox\" NAME=\"network\" VALUE=\"yes\" ");
+               if (er_flags & QR_NETWORK)
+                       wprintf("CHECKED ");
+               wprintf("> ");
+               wprintf(_("Network shared room"));
+
+               wprintf("\n<LI><INPUT TYPE=\"checkbox\" NAME=\"permanent\" VALUE=\"yes\" ");
+               if (er_flags & QR_PERMANENT)
+                       wprintf("CHECKED ");
+               wprintf("> ");
+               wprintf(_("Permanent (does not auto-purge)"));
+
+               /** start of anon options */
+       
+               wprintf("\n<LI>");
+               wprintf(_("Anonymous messages"));
+               wprintf("<UL>\n");
+       
+               wprintf("<LI><INPUT TYPE=\"radio\" NAME=\"anon\" VALUE=\"no\" ");
+               if (((er_flags & QR_ANONONLY) == 0)
+                   && ((er_flags & QR_ANONOPT) == 0))
+                       wprintf("CHECKED ");
+               wprintf("> ");
+               wprintf(_("No anonymous messages"));
+       
+               wprintf("\n<LI><INPUT TYPE=\"radio\" NAME=\"anon\" VALUE=\"anononly\" ");
+               if (er_flags & QR_ANONONLY)
+                       wprintf("CHECKED ");
+               wprintf("> ");
+               wprintf(_("All messages are anonymous"));
+       
+               wprintf("\n<LI><INPUT TYPE=\"radio\" NAME=\"anon\" VALUE=\"anon2\" ");
+               if (er_flags & QR_ANONOPT)
+                       wprintf("CHECKED ");
+               wprintf("> ");
+               wprintf(_("Prompt user when entering messages"));
+               wprintf("</UL>\n");
+       
+       /* end of anon options */
+       
+               wprintf("<LI>");
+               wprintf(_("Room aide: "));
+               serv_puts("GETA");
+               serv_getln(buf, sizeof buf);
+               if (buf[0] != '2') {
+                       wprintf("<em>%s</em>\n", &buf[4]);
+               } else {
+                       extract_token(er_roomaide, &buf[4], 0, '|', sizeof er_roomaide);
+                       wprintf("<INPUT TYPE=\"text\" NAME=\"er_roomaide\" VALUE=\"%s\" MAXLENGTH=\"25\">\n", er_roomaide);
+               }
+       
+               wprintf("</UL><CENTER>\n");
+               wprintf("<INPUT TYPE=\"hidden\" NAME=\"tab\" VALUE=\"config\">\n"
+                       "<INPUT TYPE=\"submit\" NAME=\"ok_button\" VALUE=\"%s\">"
+                       "&nbsp;"
+                       "<INPUT TYPE=\"submit\" NAME=\"cancel_button\" VALUE=\"%s\">"
+                       "</CENTER>\n",
+                       _("Save changes"),
+                       _("Cancel")
+               );
+       }
+
+
+       /** Sharing the room with other Citadel nodes... */
+       if (!strcmp(tab, "sharing")) {
+
+               shared_with = strdup("");
+               not_shared_with = strdup("");
+
+               /** Learn the current configuration */
+               serv_puts("CONF getsys|application/x-citadel-ignet-config");
+               serv_getln(buf, sizeof buf);
+               if (buf[0]=='1') while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+                       extract_token(node, buf, 0, '|', sizeof node);
+                       not_shared_with = realloc(not_shared_with,
+                                       strlen(not_shared_with) + 32);
+                       strcat(not_shared_with, node);
+                       strcat(not_shared_with, "\n");
+               }
+
+               serv_puts("GNET");
+               serv_getln(buf, sizeof buf);
+               if (buf[0]=='1') while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+                       extract_token(cmd, buf, 0, '|', sizeof cmd);
+                       extract_token(node, buf, 1, '|', sizeof node);
+                       extract_token(remote_room, buf, 2, '|', sizeof remote_room);
+                       if (!strcasecmp(cmd, "ignet_push_share")) {
+                               shared_with = realloc(shared_with,
+                                               strlen(shared_with) + 32);
+                               strcat(shared_with, node);
+                               if (strlen(remote_room) > 0) {
+                                       strcat(shared_with, "|");
+                                       strcat(shared_with, remote_room);
+                               }
+                               strcat(shared_with, "\n");
+                       }
+               }
+
+               for (i=0; i<num_tokens(shared_with, '\n'); ++i) {
+                       extract_token(buf, shared_with, i, '\n', sizeof buf);
+                       extract_token(node, buf, 0, '|', sizeof node);
+                       for (j=0; j<num_tokens(not_shared_with, '\n'); ++j) {
+                               extract_token(cmd, not_shared_with, j, '\n', sizeof cmd);
+                               if (!strcasecmp(node, cmd)) {
+                                       remove_token(not_shared_with, j, '\n');
+                               }
+                       }
+               }
+
+               /** Display the stuff */
+               wprintf("<CENTER><br />"
+                       "<TABLE border=1 cellpadding=5><TR>"
+                       "<TD><B><I>");
+               wprintf(_("Shared with"));
+               wprintf("</I></B></TD>"
+                       "<TD><B><I>");
+               wprintf(_("Not shared with"));
+               wprintf("</I></B></TD></TR>\n"
+                       "<TR><TD VALIGN=TOP>\n");
+
+               wprintf("<TABLE border=0 cellpadding=5><TR BGCOLOR=\"#CCCCCC\"><TD>");
+               wprintf(_("Remote node name"));
+               wprintf("</TD><TD>");
+               wprintf(_("Remote room name"));
+               wprintf("</TD><TD>");
+               wprintf(_("Actions"));
+               wprintf("</TD></TR>\n");
+
+               for (i=0; i<num_tokens(shared_with, '\n'); ++i) {
+                       extract_token(buf, shared_with, i, '\n', sizeof buf);
+                       extract_token(node, buf, 0, '|', sizeof node);
+                       extract_token(remote_room, buf, 1, '|', sizeof remote_room);
+                       if (strlen(node) > 0) {
+                               wprintf("<FORM METHOD=\"POST\" "
+                                       "action=\"netedit\">"
+                                       "<TR><TD>%s</TD>\n", node);
+
+                               wprintf("<TD>");
+                               if (strlen(remote_room) > 0) {
+                                       escputs(remote_room);
+                               }
+                               wprintf("</TD>");
+
+                               wprintf("<TD>");
+               
+                               wprintf("<INPUT TYPE=\"hidden\" NAME=\"line\" "
+                                       "VALUE=\"ignet_push_share|");
+                               urlescputs(node);
+                               if (strlen(remote_room) > 0) {
+                                       wprintf("|");
+                                       urlescputs(remote_room);
+                               }
+                               wprintf("\">");
+                               wprintf("<INPUT TYPE=\"hidden\" NAME=\"tab\" "
+                                       "VALUE=\"sharing\">\n");
+                               wprintf("<INPUT TYPE=\"hidden\" NAME=\"cmd\" "
+                                       "VALUE=\"remove\">\n");
+                               wprintf("<INPUT TYPE=\"submit\" "
+                                       "NAME=\"unshare_button\" VALUE=\"%s\">", _("Unshare"));
+                               wprintf("</TD></TR></FORM>\n");
+                       }
+               }
+
+               wprintf("</TABLE>\n");
+               wprintf("</TD><TD VALIGN=TOP>\n");
+               wprintf("<TABLE border=0 cellpadding=5><TR BGCOLOR=\"#CCCCCC\"><TD>");
+               wprintf(_("Remote node name"));
+               wprintf("</TD><TD>");
+               wprintf(_("Remote room name"));
+               wprintf("</TD><TD>");
+               wprintf(_("Actions"));
+               wprintf("</TD></TR>\n");
+
+               for (i=0; i<num_tokens(not_shared_with, '\n'); ++i) {
+                       extract_token(node, not_shared_with, i, '\n', sizeof node);
+                       if (strlen(node) > 0) {
+                               wprintf("<FORM METHOD=\"POST\" "
+                                       "action=\"netedit\">"
+                                       "<TR><TD>");
+                               escputs(node);
+                               wprintf("</TD><TD>"
+                                       "<INPUT TYPE=\"INPUT\" "
+                                       "NAME=\"suffix\" "
+                                       "MAXLENGTH=128>"
+                                       "</TD><TD>");
+                               wprintf("<INPUT TYPE=\"hidden\" "
+                                       "NAME=\"line\" "
+                                       "VALUE=\"ignet_push_share|");
+                               urlescputs(node);
+                               wprintf("|\">");
+                               wprintf("<INPUT TYPE=\"hidden\" NAME=\"tab\" "
+                                       "VALUE=\"sharing\">\n");
+                               wprintf("<INPUT TYPE=\"hidden\" NAME=\"cmd\" "
+                                       "VALUE=\"add\">\n");
+                               wprintf("<INPUT TYPE=\"submit\" "
+                                       "NAME=\"add_button\" VALUE=\"%s\">", _("Share"));
+                               wprintf("</TD></TR></FORM>\n");
+                       }
+               }
+
+               wprintf("</TABLE>\n");
+               wprintf("</TD></TR>"
+                       "</TABLE></CENTER><br />\n"
+                       "<I><B>%s</B><UL><LI>", _("Notes:"));
+               wprintf(_("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."
+                       "</UL></I><br />\n"
+               ));
+
+       }
+
+       /** Mailing list management */
+       if (!strcmp(tab, "listserv")) {
+
+               wprintf("<br /><center>"
+                       "<TABLE BORDER=0 WIDTH=100%% CELLPADDING=5>"
+                       "<TR><TD VALIGN=TOP>");
+
+               wprintf(_("<i>The contents of this room are being "
+                       "mailed <b>as individual messages</b> "
+                       "to the following list recipients:"
+                       "</i><br /><br />\n"));
+
+               serv_puts("GNET");
+               serv_getln(buf, sizeof buf);
+               if (buf[0]=='1') while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+                       extract_token(cmd, buf, 0, '|', sizeof cmd);
+                       if (!strcasecmp(cmd, "listrecp")) {
+                               extract_token(recp, buf, 1, '|', sizeof recp);
+                       
+                               escputs(recp);
+                               wprintf(" <a href=\"netedit&cmd=remove&line="
+                                       "listrecp|");
+                               urlescputs(recp);
+                               wprintf("&tab=listserv\">");
+                               wprintf(_("(remove)"));
+                               wprintf("</A><br />");
+                       }
+               }
+               wprintf("<br /><FORM METHOD=\"POST\" action=\"netedit\">\n"
+                       "<INPUT TYPE=\"hidden\" NAME=\"tab\" VALUE=\"listserv\">\n"
+                       "<INPUT TYPE=\"hidden\" NAME=\"prefix\" VALUE=\"listrecp|\">\n");
+               wprintf("<INPUT TYPE=\"text\" NAME=\"line\">\n");
+               wprintf("<INPUT TYPE=\"submit\" NAME=\"add_button\" VALUE=\"%s\">", _("Add"));
+               wprintf("</FORM>\n");
+
+               wprintf("</TD><TD VALIGN=TOP>\n");
+               
+               wprintf(_("<i>The contents of this room are being "
+                       "mailed <b>in digest form</b> "
+                       "to the following list recipients:"
+                       "</i><br /><br />\n"));
+
+               serv_puts("GNET");
+               serv_getln(buf, sizeof buf);
+               if (buf[0]=='1') while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+                       extract_token(cmd, buf, 0, '|', sizeof cmd);
+                       if (!strcasecmp(cmd, "digestrecp")) {
+                               extract_token(recp, buf, 1, '|', sizeof recp);
+                       
+                               escputs(recp);
+                               wprintf(" <a href=\"netedit&cmd=remove&line="
+                                       "digestrecp|");
+                               urlescputs(recp);
+                               wprintf("&tab=listserv\">");
+                               wprintf(_("(remove)"));
+                               wprintf("</A><br />");
+                       }
+               }
+               wprintf("<br /><FORM METHOD=\"POST\" action=\"netedit\">\n"
+                       "<INPUT TYPE=\"hidden\" NAME=\"tab\" VALUE=\"listserv\">\n"
+                       "<INPUT TYPE=\"hidden\" NAME=\"prefix\" VALUE=\"digestrecp|\">\n");
+               wprintf("<INPUT TYPE=\"text\" NAME=\"line\">\n");
+               wprintf("<INPUT TYPE=\"submit\" NAME=\"add_button\" VALUE=\"%s\">", _("Add"));
+               wprintf("</FORM>\n");
+               
+               wprintf("</TD></TR></TABLE><hr />\n");
+
+               if (self_service(999) == 1) {
+                       wprintf(_("This room is configured to allow "
+                               "self-service subscribe/unsubscribe requests."));
+                       wprintf("<a href=\"toggle_self_service?newval=0&tab=listserv\">");
+                       wprintf(_("Click to disable."));
+                       wprintf("</A><br />\n");
+                       wprintf(_("The URL for subscribe/unsubscribe is: "));
+                       wprintf("<TT>%s://%s/listsub</TT><br />\n",
+                               (is_https ? "https" : "http"),
+                               WC->http_host);
+               }
+               else {
+                       wprintf(_("This room is <i>not</i> configured to allow "
+                               "self-service subscribe/unsubscribe requests."));
+                       wprintf(" <a href=\"toggle_self_service?newval=1&"
+                               "tab=listserv\">");
+                       wprintf(_("Click to enable."));
+                       wprintf("</A><br />\n");
+               }
+
+
+               wprintf("</CENTER>\n");
+       }
+
+
+       /** Mailing list management */
+       if (!strcmp(tab, "expire")) {
+
+               serv_puts("GPEX room");
+               serv_getln(buf, sizeof buf);
+               if (buf[0] == '2') {
+                       roompolicy = extract_int(&buf[4], 0);
+                       roomvalue = extract_int(&buf[4], 1);
+               }
+               
+               serv_puts("GPEX floor");
+               serv_getln(buf, sizeof buf);
+               if (buf[0] == '2') {
+                       floorpolicy = extract_int(&buf[4], 0);
+                       floorvalue = extract_int(&buf[4], 1);
+               }
+               
+               wprintf("<br /><FORM METHOD=\"POST\" action=\"set_room_policy\">\n");
+               wprintf("<TABLE border=0 cellspacing=5>\n");
+               wprintf("<TR><TD>");
+               wprintf(_("Message expire policy for this room"));
+               wprintf("<br />(");
+               escputs(WC->wc_roomname);
+               wprintf(")</TD><TD>");
+               wprintf("<INPUT TYPE=\"radio\" NAME=\"roompolicy\" VALUE=\"0\" %s>",
+                       ((roompolicy == 0) ? "CHECKED" : "") );
+               wprintf(_("Use the default policy for this floor"));
+               wprintf("<br />\n");
+               wprintf("<INPUT TYPE=\"radio\" NAME=\"roompolicy\" VALUE=\"1\" %s>",
+                       ((roompolicy == 1) ? "CHECKED" : "") );
+               wprintf(_("Never automatically expire messages"));
+               wprintf("<br />\n");
+               wprintf("<INPUT TYPE=\"radio\" NAME=\"roompolicy\" VALUE=\"2\" %s>",
+                       ((roompolicy == 2) ? "CHECKED" : "") );
+               wprintf(_("Expire by message count"));
+               wprintf("<br />\n");
+               wprintf("<INPUT TYPE=\"radio\" NAME=\"roompolicy\" VALUE=\"3\" %s>",
+                       ((roompolicy == 3) ? "CHECKED" : "") );
+               wprintf(_("Expire by message age"));
+               wprintf("<br />");
+               wprintf(_("Number of messages or days: "));
+               wprintf("<INPUT TYPE=\"text\" NAME=\"roomvalue\" MAXLENGTH=\"5\" VALUE=\"%d\">", roomvalue);
+               wprintf("</TD></TR>\n");
+
+               if (WC->axlevel >= 6) {
+                       wprintf("<TR><TD COLSPAN=2><hr /></TD></TR>\n");
+                       wprintf("<TR><TD>");
+                       wprintf(_("Message expire policy for this floor"));
+                       wprintf("<br />(");
+                       escputs(floorlist[WC->wc_floor]);
+                       wprintf(")</TD><TD>");
+                       wprintf("<INPUT TYPE=\"radio\" NAME=\"floorpolicy\" VALUE=\"0\" %s>",
+                               ((floorpolicy == 0) ? "CHECKED" : "") );
+                       wprintf(_("Use the system default"));
+                       wprintf("<br />\n");
+                       wprintf("<INPUT TYPE=\"radio\" NAME=\"floorpolicy\" VALUE=\"1\" %s>",
+                               ((floorpolicy == 1) ? "CHECKED" : "") );
+                       wprintf(_("Never automatically expire messages"));
+                       wprintf("<br />\n");
+                       wprintf("<INPUT TYPE=\"radio\" NAME=\"floorpolicy\" VALUE=\"2\" %s>",
+                               ((floorpolicy == 2) ? "CHECKED" : "") );
+                       wprintf(_("Expire by message count"));
+                       wprintf("<br />\n");
+                       wprintf("<INPUT TYPE=\"radio\" NAME=\"floorpolicy\" VALUE=\"3\" %s>",
+                               ((floorpolicy == 3) ? "CHECKED" : "") );
+                       wprintf(_("Expire by message age"));
+                       wprintf("<br />");
+                       wprintf(_("Number of messages or days: "));
+                       wprintf("<INPUT TYPE=\"text\" NAME=\"floorvalue\" MAXLENGTH=\"5\" VALUE=\"%d\">",
+                               floorvalue);
+               }
+
+               wprintf("<CENTER>\n");
+               wprintf("<TR><TD COLSPAN=2><hr /><CENTER>\n");
+               wprintf("<INPUT TYPE=\"submit\" NAME=\"ok_button\" VALUE=\"%s\">", _("Save changes"));
+               wprintf("&nbsp;");
+               wprintf("<INPUT TYPE=\"submit\" NAME=\"cancel_button\" VALUE=\"%s\">", _("Cancel"));
+               wprintf("</CENTER></TD><TR>\n");
+
+               wprintf("</TABLE>\n"
+                       "<INPUT TYPE=\"hidden\" NAME=\"tab\" VALUE=\"expire\">\n"
+                       "</FORM>\n"
+               );
+
+       }
+
+       /** Mailing list management */
+       if (!strcmp(tab, "access")) {
+               display_whok();
+       }
+
+       /** end content of whatever tab is open now */
+       wprintf("</TD></TR></TABLE></div>\n");
+
+       wDumpContent(1);
+}
+
+
+/** 
+ * \brief Toggle self-service list subscription
+ */
+void toggle_self_service(void) {
+       int newval = 0;
+
+       newval = atoi(bstr("newval"));
+       self_service(newval);
+       display_editroom();
+}
+
+
+
+/**
+ * \brief save new parameters for a room
+ */
+void editroom(void)
+{
+       char buf[SIZ];
+       char er_name[128];
+       char er_password[10];
+       char er_dirname[15];
+       char er_roomaide[26];
+       int er_floor;
+       unsigned er_flags;
+       int bump;
+
+
+       if (strlen(bstr("ok_button")) == 0) {
+               strcpy(WC->ImportantMessage,
+                       _("Cancelled.  Changes were not saved."));
+               display_editroom();
+               return;
+       }
+       serv_puts("GETR");
+       serv_getln(buf, sizeof buf);
+
+       if (buf[0] != '2') {
+               strcpy(WC->ImportantMessage, &buf[4]);
+               display_editroom();
+               return;
+       }
+       extract_token(er_name, &buf[4], 0, '|', sizeof er_name);
+       extract_token(er_password, &buf[4], 1, '|', sizeof er_password);
+       extract_token(er_dirname, &buf[4], 2, '|', sizeof er_dirname);
+       er_flags = extract_int(&buf[4], 3);
+
+       strcpy(er_roomaide, bstr("er_roomaide"));
+       if (strlen(er_roomaide) == 0) {
+               serv_puts("GETA");
+               serv_getln(buf, sizeof buf);
+               if (buf[0] != '2') {
+                       strcpy(er_roomaide, "");
+               } else {
+                       extract_token(er_roomaide, &buf[4], 0, '|', sizeof er_roomaide);
+               }
+       }
+       strcpy(buf, bstr("er_name"));
+       buf[128] = 0;
+       if (strlen(buf) > 0) {
+               strcpy(er_name, buf);
+       }
+
+       strcpy(buf, bstr("er_password"));
+       buf[10] = 0;
+       if (strlen(buf) > 0)
+               strcpy(er_password, buf);
+
+       strcpy(buf, bstr("er_dirname"));
+       buf[15] = 0;
+       if (strlen(buf) > 0)
+               strcpy(er_dirname, buf);
+
+       strcpy(buf, bstr("type"));
+       er_flags &= !(QR_PRIVATE | QR_PASSWORDED | QR_GUESSNAME);
+
+       if (!strcmp(buf, "invonly")) {
+               er_flags |= (QR_PRIVATE);
+       }
+       if (!strcmp(buf, "hidden")) {
+               er_flags |= (QR_PRIVATE | QR_GUESSNAME);
+       }
+       if (!strcmp(buf, "passworded")) {
+               er_flags |= (QR_PRIVATE | QR_PASSWORDED);
+       }
+       if (!strcmp(bstr("prefonly"), "yes")) {
+               er_flags |= QR_PREFONLY;
+       } else {
+               er_flags &= ~QR_PREFONLY;
+       }
+
+       if (!strcmp(bstr("readonly"), "yes")) {
+               er_flags |= QR_READONLY;
+       } else {
+               er_flags &= ~QR_READONLY;
+       }
+
+       if (!strcmp(bstr("permanent"), "yes")) {
+               er_flags |= QR_PERMANENT;
+       } else {
+               er_flags &= ~QR_PERMANENT;
+       }
+
+       if (!strcmp(bstr("network"), "yes")) {
+               er_flags |= QR_NETWORK;
+       } else {
+               er_flags &= ~QR_NETWORK;
+       }
+
+       if (!strcmp(bstr("directory"), "yes")) {
+               er_flags |= QR_DIRECTORY;
+       } else {
+               er_flags &= ~QR_DIRECTORY;
+       }
+
+       if (!strcmp(bstr("ulallowed"), "yes")) {
+               er_flags |= QR_UPLOAD;
+       } else {
+               er_flags &= ~QR_UPLOAD;
+       }
+
+       if (!strcmp(bstr("dlallowed"), "yes")) {
+               er_flags |= QR_DOWNLOAD;
+       } else {
+               er_flags &= ~QR_DOWNLOAD;
+       }
+
+       if (!strcmp(bstr("visdir"), "yes")) {
+               er_flags |= QR_VISDIR;
+       } else {
+               er_flags &= ~QR_VISDIR;
+       }
+
+       strcpy(buf, bstr("anon"));
+
+       er_flags &= ~(QR_ANONONLY | QR_ANONOPT);
+       if (!strcmp(buf, "anononly"))
+               er_flags |= QR_ANONONLY;
+       if (!strcmp(buf, "anon2"))
+               er_flags |= QR_ANONOPT;
+
+       bump = 0;
+       if (!strcmp(bstr("bump"), "yes"))
+               bump = 1;
+
+       er_floor = atoi(bstr("er_floor"));
+
+       sprintf(buf, "SETR %s|%s|%s|%u|%d|%d",
+            er_name, er_password, er_dirname, er_flags, bump, er_floor);
+       serv_puts(buf);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '2') {
+               strcpy(WC->ImportantMessage, &buf[4]);
+               display_editroom();
+               return;
+       }
+       gotoroom(er_name);
+
+       if (strlen(er_roomaide) > 0) {
+               sprintf(buf, "SETA %s", er_roomaide);
+               serv_puts(buf);
+               serv_getln(buf, sizeof buf);
+               if (buf[0] != '2') {
+                       strcpy(WC->ImportantMessage, &buf[4]);
+                       display_main_menu();
+                       return;
+               }
+       }
+       gotoroom(er_name);
+       strcpy(WC->ImportantMessage, _("Your changes have been saved."));
+       display_editroom();
+       return;
+}
+
+
+/**
+ * \brief Display form for Invite, Kick, and show Who Knows a room
+ */
+void do_invt_kick(void) {
+        char buf[SIZ], room[SIZ], username[SIZ];
+
+        serv_puts("GETR");
+        serv_getln(buf, sizeof buf);
+
+        if (buf[0] != '2') {
+               escputs(&buf[4]);
+               return;
+        }
+        extract_token(room, &buf[4], 0, '|', sizeof room);
+
+        strcpy(username, bstr("username"));
+
+        if (strlen(bstr("kick_button")) > 0) {
+                sprintf(buf, "KICK %s", username);
+                serv_puts(buf);
+                serv_getln(buf, sizeof buf);
+
+                if (buf[0] != '2') {
+                        strcpy(WC->ImportantMessage, &buf[4]);
+                } else {
+                        sprintf(WC->ImportantMessage,
+                               _("<B><I>User %s kicked out of room %s.</I></B>\n"), 
+                                username, room);
+                }
+        }
+
+       if (strlen(bstr("invite_button")) > 0) {
+                sprintf(buf, "INVT %s", username);
+                serv_puts(buf);
+                serv_getln(buf, sizeof buf);
+
+                if (buf[0] != '2') {
+                        strcpy(WC->ImportantMessage, &buf[4]);
+                } else {
+                        sprintf(WC->ImportantMessage,
+                               _("<B><I>User %s invited to room %s.</I></B>\n"), 
+                                username, room);
+                }
+        }
+
+       display_editroom();
+}
+
+
+
+/**
+ * \brief Display form for Invite, Kick, and show Who Knows a room
+ */
+void display_whok(void)
+{
+        char buf[SIZ], room[SIZ], username[SIZ];
+
+        serv_puts("GETR");
+        serv_getln(buf, sizeof buf);
+
+        if (buf[0] != '2') {
+               escputs(&buf[4]);
+               return;
+        }
+        extract_token(room, &buf[4], 0, '|', sizeof room);
+
+        
+       wprintf("<TABLE border=0 CELLSPACING=10><TR VALIGN=TOP><TD>");
+       wprintf(_("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'."));
+       wprintf("<br /><br />");
+       
+        wprintf("<CENTER><FORM METHOD=\"POST\" action=\"do_invt_kick\">\n");
+       wprintf("<INPUT TYPE=\"hidden\" NAME=\"tab\" VALUE=\"access\">\n");
+        wprintf("<SELECT NAME=\"username\" SIZE=\"10\" style=\"width:100%%\">\n");
+        serv_puts("WHOK");
+        serv_getln(buf, sizeof buf);
+        if (buf[0] == '1') {
+                while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+                        extract_token(username, buf, 0, '|', sizeof username);
+                        wprintf("<OPTION>");
+                        escputs(username);
+                        wprintf("\n");
+                }
+        }
+        wprintf("</SELECT><br />\n");
+
+        wprintf("<input type=\"submit\" name=\"kick_button\" value=\"%s\">", _("Kick"));
+        wprintf("</FORM></CENTER>\n");
+
+       wprintf("</TD><TD>");
+       wprintf(_("To grant another user access to this room, enter the "
+               "user name in the box below and click 'Invite'."));
+       wprintf("<br /><br />");
+
+        wprintf("<CENTER><FORM METHOD=\"POST\" action=\"do_invt_kick\">\n");
+       wprintf("<INPUT TYPE=\"hidden\" NAME=\"tab\" VALUE=\"access\">\n");
+        wprintf(_("Invite:"));
+       wprintf(" ");
+        wprintf("<input type=\"text\" name=\"username\" style=\"width:100%%\"><br />\n"
+               "<input type=\"hidden\" name=\"invite_button\" value=\"Invite\">"
+               "<input type=\"submit\" value=\"%s\">"
+               "</FORM></CENTER>\n", _("Invite"));
+
+       wprintf("</TD></TR></TABLE>\n");
+        wDumpContent(1);
+}
+
+
+
+/**
+ * \brief display the form for entering a new room
+ */
+void display_entroom(void)
+{
+       int i;
+       char buf[SIZ];
+
+       serv_puts("CRE8 0");
+       serv_getln(buf, sizeof buf);
+
+       if (buf[0] != '2') {
+               strcpy(WC->ImportantMessage, &buf[4]);
+               display_main_menu();
+               return;
+       }
+
+       output_headers(1, 1, 2, 0, 0, 0);
+       wprintf("<div id=\"banner\">\n"
+               "<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>"
+               "<SPAN CLASS=\"titlebar\">");
+       wprintf(_("Create a new room"));
+       wprintf("</SPAN>"
+               "</TD></TR></TABLE>\n"
+               "</div>\n<div id=\"content\">\n"
+       );
+
+       wprintf("<div class=\"fix_scrollbar_bug\">"
+               "<table border=0 width=100%% bgcolor=\"#ffffff\"><tr><td>\n");
+
+       wprintf("<form name=\"create_room_form\" method=\"POST\" action=\"entroom\">\n");
+
+       wprintf("<UL><LI>");
+       wprintf(_("Name of room: "));
+       wprintf("<INPUT TYPE=\"text\" NAME=\"er_name\" MAXLENGTH=\"127\">\n");
+
+        wprintf("<LI>");
+       wprintf(_("Resides on floor: "));
+        load_floorlist(); 
+        wprintf("<SELECT NAME=\"er_floor\" SIZE=\"1\">\n");
+        for (i = 0; i < 128; ++i)
+                if (strlen(floorlist[i]) > 0) {
+                        wprintf("<OPTION ");
+                        wprintf("VALUE=\"%d\">", i);
+                        escputs(floorlist[i]);
+                        wprintf("</OPTION>\n");
+                }
+        wprintf("</SELECT>\n");
+
+               /**
+                * 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.
+                */
+               wprintf("<LI>");
+               wprintf(_("Default view for room: "));
+        wprintf("<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;     "
+               "       }                                               "
+               "\">\n");
+       for (i=0; i<(sizeof viewdefs / sizeof (char *)); ++i) {
+               if (is_view_allowed_as_default(i)) {
+                       wprintf("<OPTION %s VALUE=\"%d\">",
+                               ((i == 0) ? "SELECTED" : ""), i );
+                       escputs(viewdefs[i]);
+                       wprintf("</OPTION>\n");
+               }
+       }
+       wprintf("</SELECT>\n");
+
+       wprintf("<LI>");
+       wprintf(_("Type of room:"));
+       wprintf("<UL>\n");
+
+       wprintf("<LI><INPUT TYPE=\"radio\" NAME=\"type\" VALUE=\"public\" ");
+       wprintf("CHECKED OnChange=\""
+               "       if (this.form.type[0].checked == true) {        "
+               "               this.form.er_floor.disabled = false;    "
+               "       }                                               "
+               "\"> ");
+       wprintf(_("Public (automatically appears to everyone)"));
+
+       wprintf("\n<LI><INPUT TYPE=\"radio\" NAME=\"type\" VALUE=\"hidden\" OnChange=\""
+               "       if (this.form.type[1].checked == true) {        "
+               "               this.form.er_floor.disabled = false;    "
+               "       }                                               "
+               "\"> ");
+       wprintf(_("Private - hidden (accessible to anyone who knows its name)"));
+
+       wprintf("\n<LI><INPUT TYPE=\"radio\" NAME=\"type\" VALUE=\"passworded\" OnChange=\""
+               "       if (this.form.type[2].checked == true) {        "
+               "               this.form.er_floor.disabled = false;    "
+               "       }                                               "
+               "\"> ");
+       wprintf(_("Private - require password: "));
+       wprintf("<INPUT TYPE=\"text\" NAME=\"er_password\" MAXLENGTH=\"9\">\n");
+
+       wprintf("<LI><INPUT TYPE=\"radio\" NAME=\"type\" VALUE=\"invonly\" OnChange=\""
+               "       if (this.form.type[3].checked == true) {        "
+               "               this.form.er_floor.disabled = false;    "
+               "       }                                               "
+               "\"> ");
+       wprintf(_("Private - invitation only"));
+
+       wprintf("\n<LI><INPUT TYPE=\"radio\" NAME=\"type\" VALUE=\"personal\" "
+               "OnChange=\""
+               "       if (this.form.type[4].checked == true) {        "
+               "               this.form.er_floor.disabled = true;     "
+               "       }                                               "
+               "\"> ");
+       wprintf(_("Personal (mailbox for you only)"));
+
+       wprintf("\n</UL>\n");
+
+       wprintf("<CENTER>\n");
+       wprintf("<INPUT TYPE=\"submit\" NAME=\"ok_button\" VALUE=\"%s\">", _("Create new room"));
+       wprintf("&nbsp;");
+       wprintf("<INPUT TYPE=\"submit\" NAME=\"cancel_button\" VALUE=\"%s\">", _("Cancel"));
+       wprintf("</CENTER>\n");
+       wprintf("</FORM>\n<hr />");
+       serv_printf("MESG roomaccess");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '1') {
+               fmout("CENTER");
+       }
+       wprintf("</td></tr></table></div>\n");
+       wDumpContent(1);
+}
+
+
+
+
+/**
+ * \brief support function for entroom() -- sets the default view 
+ */
+void er_set_default_view(int newview) {
+
+       char buf[SIZ];
+
+       char rm_name[SIZ];
+       char rm_pass[SIZ];
+       char rm_dir[SIZ];
+       int rm_bits1;
+       int rm_floor;
+       int rm_listorder;
+       int rm_bits2;
+
+       serv_puts("GETR");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '2') return;
+
+       extract_token(rm_name, &buf[4], 0, '|', sizeof rm_name);
+       extract_token(rm_pass, &buf[4], 1, '|', sizeof rm_pass);
+       extract_token(rm_dir, &buf[4], 2, '|', sizeof rm_dir);
+       rm_bits1 = extract_int(&buf[4], 3);
+       rm_floor = extract_int(&buf[4], 4);
+       rm_listorder = extract_int(&buf[4], 5);
+       rm_bits2 = extract_int(&buf[4], 7);
+
+       serv_printf("SETR %s|%s|%s|%d|0|%d|%d|%d|%d",
+               rm_name, rm_pass, rm_dir, rm_bits1, rm_floor,
+               rm_listorder, newview, rm_bits2
+       );
+       serv_getln(buf, sizeof buf);
+}
+
+
+
+/**
+ * \brief enter a new room
+ */
+void entroom(void)
+{
+       char buf[SIZ];
+       char er_name[SIZ];
+       char er_type[SIZ];
+       char er_password[SIZ];
+       int er_floor;
+       int er_num_type;
+       int er_view;
+
+       if (strlen(bstr("ok_button")) == 0) {
+               strcpy(WC->ImportantMessage,
+                       _("Cancelled.  No new room was created."));
+               display_main_menu();
+               return;
+       }
+       strcpy(er_name, bstr("er_name"));
+       strcpy(er_type, bstr("type"));
+       strcpy(er_password, bstr("er_password"));
+       er_floor = atoi(bstr("er_floor"));
+       er_view = atoi(bstr("er_view"));
+
+       er_num_type = 0;
+       if (!strcmp(er_type, "hidden"))
+               er_num_type = 1;
+       if (!strcmp(er_type, "passworded"))
+               er_num_type = 2;
+       if (!strcmp(er_type, "invonly"))
+               er_num_type = 3;
+       if (!strcmp(er_type, "personal"))
+               er_num_type = 4;
+
+       sprintf(buf, "CRE8 1|%s|%d|%s|%d|%d|%d", 
+               er_name, er_num_type, er_password, er_floor, 0, er_view);
+       serv_puts(buf);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '2') {
+               strcpy(WC->ImportantMessage, &buf[4]);
+               display_main_menu();
+               return;
+       }
+       gotoroom(er_name);
+       do_change_view(er_view);                /* Now go there */
+}
+
+
+/**
+ * \brief display the screen to enter a private room
+ */
+void display_private(char *rname, int req_pass)
+{
+       output_headers(1, 1, 2, 0, 0, 0);
+       wprintf("<div id=\"banner\">\n"
+               "<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>"
+               "<SPAN CLASS=\"titlebar\">");
+       wprintf(_("Go to a hidden room"));
+       wprintf("</SPAN>"
+               "</TD></TR></TABLE>\n"
+               "</div>\n<div id=\"content\">\n"
+       );
+
+       wprintf("<div class=\"fix_scrollbar_bug\">"
+               "<table border=0 width=100%% bgcolor=\"#ffffff\"><tr><td>\n");
+
+       wprintf("<CENTER>\n");
+       wprintf("<br />");
+       wprintf(_("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."));
+       wprintf("\n<br /><br />");
+
+       wprintf("<FORM METHOD=\"POST\" action=\"goto_private\">\n");
+
+       wprintf("<table border=\"0\" cellspacing=\"5\" "
+               "cellpadding=\"5\" BGCOLOR=\"#EEEEEE\">\n"
+               "<TR><TD>");
+       wprintf(_("Enter room name:"));
+       wprintf("</TD><TD>"
+               "<INPUT TYPE=\"text\" NAME=\"gr_name\" "
+               "VALUE=\"%s\" MAXLENGTH=\"128\">\n", rname);
+
+       if (req_pass) {
+               wprintf("</TD></TR><TR><TD>");
+               wprintf(_("Enter room password:"));
+               wprintf("</TD><TD>");
+               wprintf("<INPUT TYPE=\"password\" NAME=\"gr_pass\" MAXLENGTH=\"9\">\n");
+       }
+       wprintf("</TD></TR></TABLE><br />\n");
+
+       wprintf("<INPUT TYPE=\"submit\" NAME=\"ok_button\" VALUE=\"%s\">"
+               "&nbsp;"
+               "<INPUT TYPE=\"submit\" NAME=\"cancel_button\" VALUE=\"%s\">",
+               _("Go there"),
+               _("Cancel")
+       );
+       wprintf("</FORM>\n");
+       wprintf("</td></tr></table></div>\n");
+       wDumpContent(1);
+}
+
+/**
+ * \brief goto a private room
+ */
+void goto_private(void)
+{
+       char hold_rm[SIZ];
+       char buf[SIZ];
+
+       if (strlen(bstr("ok_button")) == 0) {
+               display_main_menu();
+               return;
+       }
+       strcpy(hold_rm, WC->wc_roomname);
+       strcpy(buf, "GOTO ");
+       strcat(buf, bstr("gr_name"));
+       strcat(buf, "|");
+       strcat(buf, bstr("gr_pass"));
+       serv_puts(buf);
+       serv_getln(buf, sizeof buf);
+
+       if (buf[0] == '2') {
+               smart_goto(bstr("gr_name"));
+               return;
+       }
+       if (!strncmp(buf, "540", 3)) {
+               display_private(bstr("gr_name"), 1);
+               return;
+       }
+       output_headers(1, 1, 1, 0, 0, 0);
+       wprintf("%s\n", &buf[4]);
+       wDumpContent(1);
+       return;
+}
+
+
+/**
+ * \brief display the screen to zap a room
+ */
+void display_zap(void)
+{
+       output_headers(1, 1, 2, 0, 0, 0);
+
+       wprintf("<div id=\"banner\">\n");
+       wprintf("<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#770000\"><TR><TD>");
+       wprintf("<SPAN CLASS=\"titlebar\">");
+       wprintf(_("Zap (forget/unsubscribe) the current room"));
+       wprintf("</SPAN>\n");
+       wprintf("</TD></TR></TABLE>\n");
+       wprintf("</div>\n<div id=\"content\">\n");
+
+       wprintf(_("If you select this option, <em>%s</em> will "
+               "disappear from your room list.  Is this what you wish "
+               "to do?<br />\n"), WC->wc_roomname);
+
+       wprintf("<FORM METHOD=\"POST\" action=\"zap\">\n");
+       wprintf("<INPUT TYPE=\"submit\" NAME=\"ok_button\" VALUE=\"%s\">", _("Zap this room"));
+       wprintf("&nbsp;");
+       wprintf("<INPUT TYPE=\"submit\" NAME=\"cancel_button\" VALUE=\"%s\">", _("Cancel"));
+       wprintf("</FORM>\n");
+       wDumpContent(1);
+}
+
+
+/**
+ * \brief zap a room
+ */
+void zap(void)
+{
+       char buf[SIZ];
+       char final_destination[SIZ];
+
+       /**
+        * If the forget-room routine fails for any reason, we fall back
+        * to the current room; otherwise, we go to the Lobby
+        */
+       strcpy(final_destination, WC->wc_roomname);
+
+       if (strlen(bstr("ok_button")) > 0) {
+               serv_printf("GOTO %s", WC->wc_roomname);
+               serv_getln(buf, sizeof buf);
+               if (buf[0] == '2') {
+                       serv_puts("FORG");
+                       serv_getln(buf, sizeof buf);
+                       if (buf[0] == '2') {
+                               strcpy(final_destination, "_BASEROOM_");
+                       }
+               }
+       }
+       smart_goto(final_destination);
+}
+
+
+
+/**
+ * \brief Delete the current room
+ */
+void delete_room(void)
+{
+       char buf[SIZ];
+
+       serv_puts("KILL 1");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '2') {
+               strcpy(WC->ImportantMessage, &buf[4]);
+               display_main_menu();
+               return;
+       } else {
+               smart_goto("_BASEROOM_");
+       }
+}
+
+
+
+/**
+ * \brief Perform changes to a room's network configuration
+ */
+void netedit(void) {
+       FILE *fp;
+       char buf[SIZ];
+       char line[SIZ];
+       char cmpa0[SIZ];
+       char cmpa1[SIZ];
+       char cmpb0[SIZ];
+       char cmpb1[SIZ];
+
+       if (strlen(bstr("line"))==0) {
+               display_editroom();
+               return;
+       }
+
+       strcpy(line, bstr("prefix"));
+       strcat(line, bstr("line"));
+       strcat(line, bstr("suffix"));
+
+       fp = tmpfile();
+       if (fp == NULL) {
+               display_editroom();
+               return;
+       }
+
+       serv_puts("GNET");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '1') {
+               fclose(fp);
+               display_editroom();
+               return;
+       }
+
+       /** This loop works for add *or* remove.  Spiffy, eh? */
+       while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+               extract_token(cmpa0, buf, 0, '|', sizeof cmpa0);
+               extract_token(cmpa1, buf, 1, '|', sizeof cmpa1);
+               extract_token(cmpb0, line, 0, '|', sizeof cmpb0);
+               extract_token(cmpb1, line, 1, '|', sizeof cmpb1);
+               if ( (strcasecmp(cmpa0, cmpb0)) 
+                  || (strcasecmp(cmpa1, cmpb1)) ) {
+                       fprintf(fp, "%s\n", buf);
+               }
+       }
+
+       rewind(fp);
+       serv_puts("SNET");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '4') {
+               fclose(fp);
+               display_editroom();
+               return;
+       }
+
+       while (fgets(buf, sizeof buf, fp) != NULL) {
+               buf[strlen(buf)-1] = 0;
+               serv_puts(buf);
+       }
+
+       if (strlen(bstr("add_button")) > 0) {
+               serv_puts(line);
+       }
+
+       serv_puts("000");
+       fclose(fp);
+       display_editroom();
+}
+
+
+
+/**
+ * \brief Convert a room name to a folder-ish-looking name.
+ * \param folder the folderish name
+ * \param room the room name
+ * \param floor the floor name
+ * \param is_mailbox is it a mailbox?
+ */
+void room_to_folder(char *folder, char *room, int floor, int is_mailbox)
+{
+       int i;
+
+       /**
+        * For mailboxes, just do it straight...
+        */
+       if (is_mailbox) {
+               sprintf(folder, "My folders|%s", room);
+       }
+
+       /**
+        * Otherwise, prefix the floor name as a "public folders" moniker
+        */
+       else {
+               sprintf(folder, "%s|%s", floorlist[floor], room);
+       }
+
+       /**
+        * Replace "\" characters with "|" for pseudo-folder-delimiting
+        */
+       for (i=0; i<strlen(folder); ++i) {
+               if (folder[i] == '\\') folder[i] = '|';
+       }
+}
+
+
+
+
+/**
+ * \brief Back end for change_view()
+ * \param newview set newview???
+ */
+void do_change_view(int newview) {
+       char buf[SIZ];
+
+       serv_printf("VIEW %d", newview);
+       serv_getln(buf, sizeof buf);
+       WC->wc_view = newview;
+       smart_goto(WC->wc_roomname);
+}
+
+
+
+/**
+ * \brief Change the view for this room
+ */
+void change_view(void) {
+       int view;
+
+       view = atol(bstr("view"));
+       do_change_view(view);
+}
+
+
+/**
+ * \brief One big expanded tree list view --- like a folder list
+ * \param fold the folder to view
+ * \param max_folders how many folders???
+ * \param num_floors hom many floors???
+ */
+void do_folder_view(struct folder *fold, int max_folders, int num_floors) {
+       char buf[SIZ];
+       int levels;
+       int i;
+       int has_subfolders = 0;
+       int *parents;
+
+       parents = malloc(max_folders * sizeof(int));
+
+       /** BEGIN TREE MENU */
+       wprintf("<div id=\"roomlist_div\">Loading folder list...</div>\n");
+
+       /** include NanoTree */
+       wprintf("<script type=\"text/javascript\" src=\"static/nanotree.js\"></script>\n");
+
+       /** initialize NanoTree */
+       wprintf("<script type=\"text/javascript\">                      \n"
+               "       showRootNode = false;                           \n"
+               "       sortNodes = false;                              \n"
+               "       dragable = false;                               \n"
+               "                                                       \n"
+               "       function standardClick(treeNode) {              \n"
+               "       }                                               \n"
+               "                                                       \n"
+               "       var closedGif = 'static/folder_closed.gif';     \n"
+               "       var openGif = 'static/folder_open.gif';         \n"
+               "                                                       \n"
+               "       rootNode = new TreeNode(1, 'root node - hide'); \n"
+       );
+
+       levels = 0;
+       for (i=0; i<max_folders; ++i) {
+
+               has_subfolders = 0;
+               if ((i+1) < max_folders) {
+                       if ( (!strncasecmp(fold[i].name, fold[i+1].name, strlen(fold[i].name)))
+                          && (fold[i+1].name[strlen(fold[i].name)] == '|') ) {
+                               has_subfolders = 1;
+                       }
+               }
+
+               levels = num_tokens(fold[i].name, '|');
+               parents[levels] = i;
+
+               wprintf("var node%d = new TreeNode(%d, '", i, i);
+
+               if (fold[i].selectable) {
+                       wprintf("<a href=\"dotgoto?room=");
+                       urlescputs(fold[i].room);
+                       wprintf("\">");
+               }
+
+               if (levels == 1) {
+                       wprintf("<SPAN CLASS=\"roomlist_floor\">");
+               }
+               else if (fold[i].hasnewmsgs) {
+                       wprintf("<SPAN CLASS=\"roomlist_new\">");
+               }
+               else {
+                       wprintf("<SPAN CLASS=\"roomlist_old\">");
+               }
+               extract_token(buf, fold[i].name, levels-1, '|', sizeof buf);
+               escputs(buf);
+               wprintf("</SPAN>");
+
+               wprintf("</a>', ");
+               if (has_subfolders) {
+                       wprintf("new Array(closedGif, openGif)");
+               }
+               else if (fold[i].view == VIEW_ADDRESSBOOK) {
+                       wprintf("'static/viewcontacts_16x.gif'");
+               }
+               else if (fold[i].view == VIEW_CALENDAR) {
+                       wprintf("'static/calarea_16x.gif'");
+               }
+               else if (fold[i].view == VIEW_CALBRIEF) {
+                       wprintf("'static/calarea_16x.gif'");
+               }
+               else if (fold[i].view == VIEW_TASKS) {
+                       wprintf("'static/taskmanag_16x.gif'");
+               }
+               else if (fold[i].view == VIEW_NOTES) {
+                       wprintf("'static/storenotes_16x.gif'");
+               }
+               else if (fold[i].view == VIEW_MAILBOX) {
+                       wprintf("'static/privatemess_16x.gif'");
+               }
+               else {
+                       wprintf("'static/chatrooms_16x.gif'");
+               }
+               wprintf(", '");
+               urlescputs(fold[i].name);
+               wprintf("');\n");
+
+               if (levels < 2) {
+                       wprintf("rootNode.addChild(node%d);\n", i);
+               }
+               else {
+                       wprintf("node%d.addChild(node%d);\n", parents[levels-1], i);
+               }
+       }
+
+       wprintf("container = document.getElementById('roomlist_div');   \n"
+               "showTree('');  \n"
+               "</script>\n"
+       );
+
+       free(parents);
+       /** END TREE MENU */
+}
+
+/**
+ * \brief Boxes and rooms and lists ... oh my!
+ * \param fold the folder to view
+ * \param max_folders how many folders???
+ * \param num_floors hom many floors???
+ */
+void do_rooms_view(struct folder *fold, int max_folders, int num_floors) {
+       char buf[256];
+       char floor_name[256];
+       char old_floor_name[256];
+       char boxtitle[256];
+       int levels, oldlevels;
+       int i, t;
+       int num_boxes = 0;
+       static int columns = 3;
+       int boxes_per_column = 0;
+       int current_column = 0;
+       int nf;
+
+       strcpy(floor_name, "");
+       strcpy(old_floor_name, "");
+
+       nf = num_floors;
+       while (nf % columns != 0) ++nf;
+       boxes_per_column = (nf / columns);
+       if (boxes_per_column < 1) boxes_per_column = 1;
+
+       /** Outer table (for columnization) */
+       wprintf("<TABLE BORDER=0 WIDTH=96%% CELLPADDING=5>"
+               "<tr><td valign=top>");
+
+       levels = 0;
+       oldlevels = 0;
+       for (i=0; i<max_folders; ++i) {
+
+               levels = num_tokens(fold[i].name, '|');
+               extract_token(floor_name, fold[i].name, 0,
+                       '|', sizeof floor_name);
+
+               if ( (strcasecmp(floor_name, old_floor_name))
+                  && (strlen(old_floor_name) > 0) ) {
+                       /* End inner box */
+                       do_template("endbox");
+
+                       ++num_boxes;
+                       if ((num_boxes % boxes_per_column) == 0) {
+                               ++current_column;
+                               if (current_column < columns) {
+                                       wprintf("</td><td valign=top>\n");
+                               }
+                       }
+               }
+               strcpy(old_floor_name, floor_name);
+
+               if (levels == 1) {
+                       /** Begin inner box */
+                       stresc(boxtitle, floor_name, 1, 0);
+                       svprintf("BOXTITLE", WCS_STRING, boxtitle);
+                       do_template("beginbox");
+               }
+
+               oldlevels = levels;
+
+               if (levels > 1) {
+                       wprintf("&nbsp;");
+                       if (levels>2) for (t=0; t<(levels-2); ++t) wprintf("&nbsp;&nbsp;&nbsp;");
+                       if (fold[i].selectable) {
+                               wprintf("<a href=\"dotgoto?room=");
+                               urlescputs(fold[i].room);
+                               wprintf("\">");
+                       }
+                       else {
+                               wprintf("<i>");
+                       }
+                       if (fold[i].hasnewmsgs) {
+                               wprintf("<SPAN CLASS=\"roomlist_new\">");
+                       }
+                       else {
+                               wprintf("<SPAN CLASS=\"roomlist_old\">");
+                       }
+                       extract_token(buf, fold[i].name, levels-1, '|', sizeof buf);
+                       escputs(buf);
+                       wprintf("</SPAN>");
+                       if (fold[i].selectable) {
+                               wprintf("</A>");
+                       }
+                       else {
+                               wprintf("</i>");
+                       }
+                       if (!strcasecmp(fold[i].name, "My Folders|Mail")) {
+                               wprintf(" (INBOX)");
+                       }
+                       wprintf("<br />\n");
+               }
+       }
+       /** End the final inner box */
+       do_template("endbox");
+
+       wprintf("</TD></TR></TABLE>\n");
+}
+
+/**
+ * \brief print a floor div???
+ * \param which_floordiv name of the floordiv???
+ */
+void set_floordiv_expanded(char *which_floordiv) {
+       begin_ajax_response();
+       safestrncpy(WC->floordiv_expanded, which_floordiv, sizeof WC->floordiv_expanded);
+       end_ajax_response();
+}
+
+/**
+ * \brief view the iconbar
+ * \param fold the folder to view
+ * \param max_folders how many folders???
+ * \param num_floors hom many floors???
+ */
+void do_iconbar_view(struct folder *fold, int max_folders, int num_floors) {
+       char buf[256];
+       char floor_name[256];
+       char old_floor_name[256];
+       char floordivtitle[256];
+       char floordiv_id[32];
+       int levels, oldlevels;
+       int i, t;
+       int num_drop_targets = 0;
+       char *icon = NULL;
+
+       strcpy(floor_name, "");
+       strcpy(old_floor_name, "");
+
+       levels = 0;
+       oldlevels = 0;
+       for (i=0; i<max_folders; ++i) {
+
+               levels = num_tokens(fold[i].name, '|');
+               extract_token(floor_name, fold[i].name, 0,
+                       '|', sizeof floor_name);
+
+               if ( (strcasecmp(floor_name, old_floor_name))
+                  && (strlen(old_floor_name) > 0) ) {
+                       /** End inner box */
+                       wprintf("<br>\n");
+                       wprintf("</div>\n");    /** floordiv */
+               }
+               strcpy(old_floor_name, floor_name);
+
+               if (levels == 1) {
+                       /** Begin floor */
+                       stresc(floordivtitle, floor_name, 0, 0);
+                       sprintf(floordiv_id, "floordiv%d", i);
+                       wprintf("<span class=\"ib_roomlist_floor\" "
+                               "onClick=\"expand_floor('%s')\">"
+                               "%s</span><br>\n", floordiv_id, floordivtitle);
+                       wprintf("<div id=\"%s\" style=\"display:%s\">",
+                               floordiv_id,
+                               (!strcasecmp(floordiv_id, WC->floordiv_expanded) ? "block" : "none")
+                       );
+               }
+
+               oldlevels = levels;
+
+               if (levels > 1) {
+                       wprintf("<div id=\"roomdiv%d\">", i);
+                       wprintf("&nbsp;");
+                       if (levels>2) for (t=0; t<(levels-2); ++t) wprintf("&nbsp;");
+
+                       /** choose the icon */
+                       if (fold[i].view == VIEW_ADDRESSBOOK) {
+                               icon = "viewcontacts_16x.gif" ;
+                       }
+                       else if (fold[i].view == VIEW_CALENDAR) {
+                               icon = "calarea_16x.gif" ;
+                       }
+                       else if (fold[i].view == VIEW_CALBRIEF) {
+                               icon = "calarea_16x.gif" ;
+                       }
+                       else if (fold[i].view == VIEW_TASKS) {
+                               icon = "taskmanag_16x.gif" ;
+                       }
+                       else if (fold[i].view == VIEW_NOTES) {
+                               icon = "storenotes_16x.gif" ;
+                       }
+                       else if (fold[i].view == VIEW_MAILBOX) {
+                               icon = "privatemess_16x.gif" ;
+                       }
+                       else {
+                               icon = "chatrooms_16x.gif" ;
+                       }
+
+                       if (fold[i].selectable) {
+                               wprintf("<a href=\"dotgoto?room=");
+                               urlescputs(fold[i].room);
+                               wprintf("\">");
+                               wprintf("<img align=\"middle\" border=0 src=\"static/%s\" alt=\"\"> ", icon);
+                       }
+                       else {
+                               wprintf("<i>");
+                       }
+                       if (fold[i].hasnewmsgs) {
+                               wprintf("<SPAN CLASS=\"ib_roomlist_new\">");
+                       }
+                       else {
+                               wprintf("<SPAN CLASS=\"ib_roomlist_old\">");
+                       }
+                       extract_token(buf, fold[i].name, levels-1, '|', sizeof buf);
+                       escputs(buf);
+                       if (!strcasecmp(fold[i].name, "My Folders|Mail")) {
+                               wprintf(" (INBOX)");
+                       }
+                       wprintf("</SPAN>");
+                       if (fold[i].selectable) {
+                               wprintf("</A>");
+                       }
+                       else {
+                               wprintf("</i>");
+                       }
+                       wprintf("<br />");
+                       wprintf("</div>\n");    /** roomdiv */
+               }
+       }
+       wprintf("</div>\n");    /** floordiv */
+
+
+       /** BEGIN: The old invisible pixel trick, to get our JavaScript to initialize */
+       wprintf("<img src=\"static/blank.gif\" onLoad=\"\n");
+
+       num_drop_targets = 0;
+
+       for (i=0; i<max_folders; ++i) {
+               levels = num_tokens(fold[i].name, '|');
+               if (levels > 1) {
+                       wprintf("drop_targets_elements[%d]=$('roomdiv%d');\n", num_drop_targets, i);
+                       wprintf("drop_targets_roomnames[%d]='", num_drop_targets);
+                       jsescputs(fold[i].room);
+                       wprintf("';\n");
+                       ++num_drop_targets;
+               }
+       }
+
+       wprintf("num_drop_targets = %d;\n", num_drop_targets);
+       if (strlen(WC->floordiv_expanded) > 1) {
+               wprintf("which_div_expanded = '%s';\n", WC->floordiv_expanded);
+       }
+
+       wprintf("\">\n");
+       /** END: The old invisible pixel trick, to get our JavaScript to initialize */
+}
+
+
+
+/**
+ * \brief Show the room list.  
+ * (only should get called by
+ * knrooms() because that's where output_headers() is called from)
+ * \param viewpref the view preferences???
+ */
+
+void list_all_rooms_by_floor(char *viewpref) {
+       char buf[SIZ];
+       int swap = 0;
+       struct folder *fold = NULL;
+       struct folder ftmp;
+       int max_folders = 0;
+       int alloc_folders = 0;
+       int i, j;
+       int ra_flags = 0;
+       int flags = 0;
+       int num_floors = 1;     /** add an extra one for private folders */
+
+       /** If our cached folder list is very old, burn it. */
+       if (WC->cache_fold != NULL) {
+               if ((time(NULL) - WC->cache_timestamp) > 300) {
+                       free(WC->cache_fold);
+                       WC->cache_fold = NULL;
+               }
+       }
+
+       /** Can we do the iconbar roomlist from cache? */
+       if ((WC->cache_fold != NULL) && (!strcasecmp(viewpref, "iconbar"))) {
+               do_iconbar_view(WC->cache_fold, WC->cache_max_folders, WC->cache_num_floors);
+               return;
+       }
+
+       /** Grab the floor table so we know how to build the list... */
+       load_floorlist();
+
+       /** Start with the mailboxes */
+       max_folders = 1;
+       alloc_folders = 1;
+       fold = malloc(sizeof(struct folder));
+       memset(fold, 0, sizeof(struct folder));
+       strcpy(fold[0].name, "My folders");
+       fold[0].is_mailbox = 1;
+
+       /** Then add floors */
+       serv_puts("LFLR");
+       serv_getln(buf, sizeof buf);
+       if (buf[0]=='1') while(serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+               if (max_folders >= alloc_folders) {
+                       alloc_folders = max_folders + 100;
+                       fold = realloc(fold,
+                               alloc_folders * sizeof(struct folder));
+               }
+               memset(&fold[max_folders], 0, sizeof(struct folder));
+               extract_token(fold[max_folders].name, buf, 1, '|', sizeof fold[max_folders].name);
+               ++max_folders;
+               ++num_floors;
+       }
+
+       /** Now add rooms */
+       serv_puts("LKRA");
+       serv_getln(buf, sizeof buf);
+       if (buf[0]=='1') while(serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+               if (max_folders >= alloc_folders) {
+                       alloc_folders = max_folders + 100;
+                       fold = realloc(fold,
+                               alloc_folders * sizeof(struct folder));
+               }
+               memset(&fold[max_folders], 0, sizeof(struct folder));
+               extract_token(fold[max_folders].room, buf, 0, '|', sizeof fold[max_folders].room);
+               ra_flags = extract_int(buf, 5);
+               flags = extract_int(buf, 1);
+               fold[max_folders].floor = extract_int(buf, 2);
+               fold[max_folders].hasnewmsgs =
+                       ((ra_flags & UA_HASNEWMSGS) ? 1 : 0 );
+               if (flags & QR_MAILBOX) {
+                       fold[max_folders].is_mailbox = 1;
+               }
+               fold[max_folders].view = extract_int(buf, 6);
+               room_to_folder(fold[max_folders].name,
+                               fold[max_folders].room,
+                               fold[max_folders].floor,
+                               fold[max_folders].is_mailbox);
+               fold[max_folders].selectable = 1;
+               ++max_folders;
+       }
+
+       /** Bubble-sort the folder list */
+       for (i=0; i<max_folders; ++i) {
+               for (j=0; j<(max_folders-1)-i; ++j) {
+                       if (fold[j].is_mailbox == fold[j+1].is_mailbox) {
+                               swap = strcasecmp(fold[j].name, fold[j+1].name);
+                       }
+                       else {
+                               if ( (fold[j+1].is_mailbox)
+                                  && (!fold[j].is_mailbox)) {
+                                       swap = 1;
+                               }
+                               else {
+                                       swap = 0;
+                               }
+                       }
+                       if (swap > 0) {
+                               memcpy(&ftmp, &fold[j], sizeof(struct folder));
+                               memcpy(&fold[j], &fold[j+1],
+                                                       sizeof(struct folder));
+                               memcpy(&fold[j+1], &ftmp,
+                                                       sizeof(struct folder));
+                       }
+               }
+       }
+
+
+       if (!strcasecmp(viewpref, "folders")) {
+               do_folder_view(fold, max_folders, num_floors);
+       }
+       else if (!strcasecmp(viewpref, "hackish_view")) {
+               for (i=0; i<max_folders; ++i) {
+                       escputs(fold[i].name);
+                       wprintf("<br />\n");
+               }
+       }
+       else if (!strcasecmp(viewpref, "iconbar")) {
+               do_iconbar_view(fold, max_folders, num_floors);
+       }
+       else {
+               do_rooms_view(fold, max_folders, num_floors);
+       }
+
+       /* Don't free the folder list ... cache it for future use! */
+       if (WC->cache_fold != NULL) {
+               free(WC->cache_fold);
+       }
+       WC->cache_fold = fold;
+       WC->cache_max_folders = max_folders;
+       WC->cache_num_floors = num_floors;
+       WC->cache_timestamp = time(NULL);
+}
+
+
+/**
+ * \brief Do either a known rooms list or a folders list, depending on the
+ * user's preference
+ */
+void knrooms(void)
+{
+       char listviewpref[SIZ];
+
+       output_headers(1, 1, 2, 0, 0, 0);
+
+       /** Determine whether the user is trying to change views */
+       if (bstr("view") != NULL) {
+               if (strlen(bstr("view")) > 0) {
+                       set_preference("roomlistview", bstr("view"), 1);
+               }
+       }
+
+       get_preference("roomlistview", listviewpref, sizeof listviewpref);
+
+       if ( (strcasecmp(listviewpref, "folders"))
+          && (strcasecmp(listviewpref, "table")) ) {
+               strcpy(listviewpref, "rooms");
+       }
+
+       /** title bar */
+       wprintf("<div id=\"banner\">\n"
+               "<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>"
+               "<SPAN CLASS=\"titlebar\">"
+       );
+       if (!strcasecmp(listviewpref, "rooms")) {
+               wprintf(_("Room list"));
+       }
+       if (!strcasecmp(listviewpref, "folders")) {
+               wprintf(_("Folder list"));
+       }
+       if (!strcasecmp(listviewpref, "table")) {
+               wprintf(_("Room list"));
+       }
+       wprintf("</SPAN></TD>\n");
+
+       /** offer the ability to switch views */
+       wprintf("<TD ALIGN=RIGHT><FORM NAME=\"roomlistomatic\">\n"
+               "<SELECT NAME=\"newview\" SIZE=\"1\" "
+               "OnChange=\"location.href=roomlistomatic.newview.options"
+               "[selectedIndex].value\">\n");
+
+       wprintf("<OPTION %s VALUE=\"knrooms&view=rooms\">"
+               "View as room list"
+               "</OPTION>\n",
+               ( !strcasecmp(listviewpref, "rooms") ? "SELECTED" : "" )
+       );
+
+       wprintf("<OPTION %s VALUE=\"knrooms&view=folders\">"
+               "View as folder list"
+               "</OPTION>\n",
+               ( !strcasecmp(listviewpref, "folders") ? "SELECTED" : "" )
+       );
+
+       wprintf("</SELECT><br />");
+       offer_start_page();
+       wprintf("</FORM></TD></TR></TABLE>\n");
+       wprintf("</div>\n"
+               "</div>\n"
+               "<div id=\"content\">\n");
+
+       /** Display the room list in the user's preferred format */
+       list_all_rooms_by_floor(listviewpref);
+       wDumpContent(1);
+}
+
+
+
+/**
+ * \brief Set the message expire policy for this room and/or floor
+ */
+void set_room_policy(void) {
+       char buf[SIZ];
+
+       if (strlen(bstr("ok_button")) == 0) {
+               strcpy(WC->ImportantMessage,
+                       _("Cancelled.  Changes were not saved."));
+               display_editroom();
+               return;
+       }
+
+       serv_printf("SPEX room|%d|%d", atoi(bstr("roompolicy")), atoi(bstr("roomvalue")));
+       serv_getln(buf, sizeof buf);
+       strcpy(WC->ImportantMessage, &buf[4]);
+
+       if (WC->axlevel >= 6) {
+               strcat(WC->ImportantMessage, "<br />\n");
+               serv_printf("SPEX floor|%d|%d", atoi(bstr("floorpolicy")), atoi(bstr("floorvalue")));
+               serv_getln(buf, sizeof buf);
+               strcat(WC->ImportantMessage, &buf[4]);
+       }
+
+       display_editroom();
+}
+
+
+/*@}*/
diff --git a/webcit/rss.c b/webcit/rss.c
new file mode 100644 (file)
index 0000000..6a96255
--- /dev/null
@@ -0,0 +1,349 @@
+/*
+ * $Id$
+ */
+/**
+ * \defgroup RssRooms Generate some RSS for our rooms.
+ * \ingroup WebcitHttpServerRSS
+ */
+/*@{*/
+#include "webcit.h"
+#include "webserver.h"
+
+
+time_t if_modified_since;    /**< the last modified stamp */
+
+/**
+ * \brief view rss Config menu
+ * \param reply_to the original author
+ * \param subject the subject of the feed
+ */
+void display_rss_control(char *reply_to, char *subject)
+{
+       wprintf("<div style=\"align: right;\"><p>\n");
+       wprintf("<a href=\"display_enter?recp=");
+       urlescputs(reply_to);
+       wprintf("&subject=");
+       if (strncasecmp(subject, "Re: ", 3)) wprintf("Re:%20");
+       urlescputs(subject);
+       wprintf("\">[%s]</a> \n", _("Reply"));
+       wprintf("<a href=\"display_enter?recp=");
+       urlescputs(reply_to);
+       wprintf("&force_room=_MAIL_&subject=");
+       if (strncasecmp(subject, "Re: ", 3)) wprintf("Re:%20");
+       urlescputs(subject);
+       wprintf("\">[%s]</a>\n", _("Email"));
+       wprintf("</p></div>\n");
+}
+
+
+/**
+ * \brief print the feed to the subscriber
+ * \param roomname the room we sould print out as rss 
+ * \param request_method the way the rss is requested????
+ */
+void display_rss(char *roomname, char *request_method)
+{
+       int nummsgs;
+       int a, b;
+       int bq = 0;
+       time_t now = 0L;
+       struct tm now_tm;
+#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
+       char buf[SIZ];
+       char date[30];
+       char from[256];
+       char subj[256];
+       char node[256];
+       char hnod[256];
+       char room[256];
+       char rfca[256];
+       char rcpt[256];
+       char msgn[256];
+       char content_type[256];
+       char charset[256];
+
+       if (!WC->logged_in) {
+               authorization_required(_("Not logged in"));
+               return;
+       }
+
+       if (gotoroom((char *)roomname)) {
+               lprintf(3, "RSS: Can't goto requested room\n");
+               wprintf("HTTP/1.1 404 Not Found\r\n");
+               wprintf("Content-Type: text/html\r\n");
+               wprintf("\r\n");
+               wprintf("Error retrieving RSS feed: couldn't find room\n");
+               return;
+       }
+
+       nummsgs = load_msg_ptrs("MSGS LAST|15", 0);
+       if (nummsgs == 0) {
+               lprintf(3, "RSS: No messages found\n");
+               wprintf("HTTP/1.1 404 Not Found\r\n");
+               wprintf("Content-Type: text/html\r\n");
+               wprintf("\r\n");
+               wprintf(_("Error retrieving RSS feed: couldn't find messages\n"));
+               return;
+       }
+
+       /** Read time of last message immediately */
+       serv_printf("MSG4 %ld", WC->msgarr[nummsgs - 1]);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '1') {
+               while (serv_getln(buf, sizeof buf), strcasecmp(buf, "000")) {
+                       if (!strncasecmp(buf, "msgn=", 5)) {
+                               strcpy(msgn, &buf[5]);
+                       }
+                       if (!strncasecmp(buf, "time=", 5)) {
+                               now = atol(&buf[5]);
+                               gmtime_r(&now, &now_tm);
+                               strftime(date, sizeof date, "%a, %d %b %Y %H:%M:%S GMT", &now_tm);
+                       }
+               }
+       }
+
+       if (if_modified_since > 0 && if_modified_since > now) {
+               lprintf(3, "RSS: Feed not updated since the last time you looked\n");
+               wprintf("HTTP/1.1 304 Not Modified\r\n");
+               wprintf("Last-Modified: %s\r\n", date);
+               now = time(NULL);
+               gmtime_r(&now, &now_tm);
+               strftime(date, sizeof date, "%a, %d %b %Y %H:%M:%S GMT", &now_tm);
+               wprintf("Date: %s\r\n", date);
+/*             if (*msgn) wprintf("ETag: %s\r\n\r\n", msgn); */
+               wDumpContent(0);
+               return;
+       }
+
+       /* Do RSS header */
+       lprintf(3, "RSS: Yum yum! This feed is tasty!\n");
+       wprintf("HTTP/1.1 200 OK\r\n");
+       wprintf("Last-Modified: %s\r\n", date);
+/*     if (*msgn) wprintf("ETag: %s\r\n\r\n", msgn); */
+       wprintf("Content-Type: application/rss+xml\r\n");
+       wprintf("$erver: %s\r\n", SERVER);
+       wprintf("Connection: close\r\n");
+       wprintf("\r\n");
+       if (!strcasecmp(request_method, "HEAD"))
+               return;
+
+       wprintf("<?xml version=\"1.0\"?>\n");
+       wprintf("<rss version=\"2.0\">\n");
+       wprintf("   <channel>\n");
+       wprintf("   <title>%s - %s</title>\n", WC->wc_roomname, serv_info.serv_humannode);
+       wprintf("   <link>%s://%s:%d/dotgoto?room=", (is_https ? "https" : "http"), WC->http_host, PORT_NUM);
+       escputs(roomname);
+       wprintf("</link>\n");
+       wprintf("   <description>");
+       /** Get room info for description */
+       serv_puts("RINF");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '1') {
+               while (1) {
+                       serv_getln(buf, sizeof buf);
+                       if (!strcmp(buf, "000"))
+                               break;
+                       wprintf("%s\n", buf);
+               }
+       }
+       wprintf("</description>\n");
+       if (now) {
+               wprintf("   <pubDate>%s</pubDate>\n", date);
+       }
+       wprintf("   <generator>%s</generator>\n", SERVER);
+       wprintf("   <docs>http://blogs.law.harvard.edu/tech/rss</docs>\n");
+       wprintf("   <ttl>30</ttl>\n");
+
+       /** Read all messages and output as RSS items */
+       for (a = 0; a < nummsgs; ++a) {
+               /** Read message and output each as RSS item */
+               serv_printf("MSG4 %ld", WC->msgarr[a]);
+               serv_getln(buf, sizeof buf);
+               if (buf[0] != '1') continue;
+
+               now = 0L;
+               strcpy(subj, "");
+               strcpy(hnod, "");
+               strcpy(node, "");
+               strcpy(room, "");
+               strcpy(rfca, "");
+               strcpy(rcpt, "");
+               strcpy(msgn, "");
+
+               while (serv_getln(buf, sizeof buf), strcasecmp(buf, "text")) {
+                       if (!strcmp(buf, "000")) {
+                               goto ENDITEM;   /** screw it */
+                       } else if (!strncasecmp(buf, "from=", 5)) {
+                               strcpy(from, &buf[5]);
+#ifdef HAVE_ICONV
+                               utf8ify_rfc822_string(from);
+#endif
+                       } else if (!strncasecmp(buf, "subj=", 5)) {
+                               strcpy(subj, &buf[5]);
+#ifdef HAVE_ICONV
+                               utf8ify_rfc822_string(subj);
+#endif
+                       } else if (!strncasecmp(buf, "hnod=", 5)) {
+                               strcpy(node, &buf[5]);
+                       } else if (!strncasecmp(buf, "room=", 5)) {
+                               strcpy(room, &buf[5]);
+                       } else if (!strncasecmp(buf, "rfca=", 5)) {
+                               strcpy(rfca, &buf[5]);
+                       } else if (!strncasecmp(buf, "rcpt=", 5)) {
+                               strcpy(rcpt, &buf[5]);
+                       } else if (!strncasecmp(buf, "msgn=", 5)) {
+                               strcpy(msgn, &buf[5]);
+                       } else if (!strncasecmp(buf, "time=", 5)) {
+                               now = atol(&buf[5]);
+                               gmtime_r(&now, &now_tm);
+                               strftime(date, sizeof date, "%a, %d %b %Y %H:%M:%S GMT", &now_tm);
+                       }
+               }
+               wprintf("   <item>\n");
+               if (subj[0]) {
+                       wprintf("      <title>%s from", subj);
+               } else {
+                       wprintf("      <title>From");
+               }
+               wprintf(" %s", from);
+               wprintf(" in %s", room);
+               if (strcmp(hnod, serv_info.serv_humannode) && strlen(hnod) > 0) {
+                       wprintf(" on %s", hnod);
+               }
+               wprintf("</title>\n");
+               if (now) {
+                       wprintf("      <pubDate>%s</pubDate>\n", date);
+               }
+               wprintf("      <guid isPermaLink=\"false\">%s</guid>\n", msgn);
+               /** Now the hard part, the message itself */
+               strcpy(content_type, "text/plain");
+               while (serv_getln(buf, sizeof buf), strlen(buf) > 0) {
+                       if (!strcmp(buf, "000")) {
+                               goto ENDBODY;
+                       }
+                       if (!strncasecmp(buf, "Content-type: ", 14)) {
+                               safestrncpy(content_type, &buf[14], sizeof content_type);
+                               for (b = 0; b < strlen(content_type); ++b) {
+                                       if (!strncasecmp(&content_type[b], "charset=", 8)) {
+                                               safestrncpy(charset, &content_type[b + 8], sizeof charset);
+                                       }
+                               }
+                               for (b = 0; b < strlen(content_type); ++b) {
+                                       if (content_type[b] == ';') {
+                                               content_type[b] = 0;
+                                       }
+                               }
+                       }
+               }
+
+               /** Set up a character set conversion if we need to */
+#ifdef HAVE_ICONV
+               if (strcasecmp(charset, "us-ascii") && strcasecmp(charset, "utf-8") && strcasecmp(charset, "") ) {
+                       ic = ctdl_iconv_open("UTF-8", charset);
+                       if (ic == (iconv_t)(-1)) {
+                               lprintf(5, "%s:%d iconv_open() failed: %s\n",
+                                       __FILE__, __LINE__, strerror(errno));
+                               goto ENDBODY;
+                       }
+               }
+#endif
+
+               /** Messages in legacy Citadel variformat get handled thusly... */
+               if (!strcasecmp(content_type, "text/x-citadel-variformat")) {
+                       int intext = 0;
+
+                       wprintf("      <description><![CDATA[");
+                       while (1) {
+                               serv_getln(buf, sizeof buf);
+                               if (!strcmp(buf, "000")) {
+                                       if (bq == 1)
+                                               wprintf("</blockquote>");
+                                       wprintf("\n");
+                                       break;
+                               }
+                               if (intext == 1 && isspace(buf[0])) {
+                                       wprintf("<br/>");
+                               }
+                               intext = 1;
+                               if (bq == 0 && !strncmp(buf, " >", 2)) {
+                                       wprintf("<blockquote>");
+                                       bq = 1;
+                               } else if (bq == 1 && strncmp(buf, " >", 2)) {
+                                       wprintf("</blockquote>");
+                                       bq = 0;
+                               }
+                               url(buf);
+                               escputs(buf);
+                               wprintf("\n");
+                       }
+                       display_rss_control(from, subj);
+                       wprintf("]]></description>\n");
+               }
+               /** Boring old 80-column fixed format text gets handled this way... */
+               else if (!strcasecmp(content_type, "text/plain")) {
+                       wprintf("      <description><![CDATA[");
+                       while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+                               if (buf[strlen(buf)-1] == '\n') buf[strlen(buf)-1] = 0;
+                               if (buf[strlen(buf)-1] == '\r') buf[strlen(buf)-1] = 0;
+       
+#ifdef HAVE_ICONV
+                               if (ic != (iconv_t)(-1) ) {
+                                       ibuf = buf;
+                                       ibuflen = strlen(ibuf);
+                                       obuflen = SIZ;
+                                       obuf = (char *) malloc(obuflen);
+                                       osav = obuf;
+                                       iconv(ic, &ibuf, &ibuflen, &obuf, &obuflen);
+                                       osav[SIZ-obuflen] = 0;
+                                       safestrncpy(buf, osav, sizeof buf);
+                                       free(osav);
+                               }
+#endif
+
+                               while ((strlen(buf) > 0) && (isspace(buf[strlen(buf) - 1])))
+                                       buf[strlen(buf) - 1] = 0;
+                               if ((bq == 0) &&
+                               ((!strncmp(buf, ">", 1)) || (!strncmp(buf, " >", 2)) || (!strncmp(buf, " :-)", 4)))) {
+                                       wprintf("<blockquote>");
+                                       bq = 1;
+                               } else if ((bq == 1) &&
+                                       (strncmp(buf, ">", 1)) && (strncmp(buf, " >", 2)) && (strncmp(buf, " :-)", 4))) {
+                                       wprintf("</blockquote>");
+                                       bq = 0;
+                               }
+                               wprintf("<tt>");
+                               url(buf);
+                               escputs(buf);
+                               wprintf("</tt><br />\n");
+                       }
+                       display_rss_control(from, subj);
+                       wprintf("]]></description>\n");
+               }
+               /** HTML is fun, but we've got to strip it first */
+               else if (!strcasecmp(content_type, "text/html")) {
+                       wprintf("      <description><![CDATA[");
+                       output_html(charset, 0);
+                       wprintf("]]></description>\n");
+               }
+
+ENDBODY:
+               wprintf("   </item>\n");
+ENDITEM:
+               now = 0L;
+       }
+
+       /** Do RSS footer */
+       wprintf("   </channel>\n");
+       wprintf("</rss>\n");
+       wDumpContent(0);
+}
+
+
+/*@}*/
diff --git a/webcit/serv_func.c b/webcit/serv_func.c
new file mode 100644 (file)
index 0000000..05574c2
--- /dev/null
@@ -0,0 +1,401 @@
+/*
+ * $Id$
+ */
+/**
+ * \defgroup ServFuncs Handles various types of data transfer operations with the Citadel service.
+ * \ingroup CitadelCommunitacion
+ */
+
+/*@{*/ 
+#include "webcit.h"
+#include "webserver.h"
+
+struct serv_info serv_info; /**< our connection data to the server */
+
+/**
+ * \brief get info about the server we've connected to
+ * \param browser_host the citadell we want to connect to
+ * \param user_agent which browser uses our client?
+ */
+void get_serv_info(char *browser_host, char *user_agent)
+{
+       char buf[SIZ];
+       int a;
+
+       /** Tell the server what kind of client is connecting */
+       serv_printf("IDEN %d|%d|%d|%s|%s",
+               DEVELOPER_ID,
+               CLIENT_ID,
+               CLIENT_VERSION,
+               user_agent,
+               browser_host
+       );
+       serv_getln(buf, sizeof buf);
+
+       /** Tell the server what kind of richtext we prefer */
+       serv_puts("MSGP text/html|text/plain");
+       serv_getln(buf, sizeof buf);
+
+#ifdef WEBCIT_WITH_CALENDAR_SERVICE
+       /**
+        * 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");
+       serv_getln(buf, sizeof buf);
+#endif
+
+       /** Now ask the server to tell us a little bit about itself... */
+       serv_puts("INFO");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '1')
+               return;
+
+       a = 0;
+       while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+               switch (a) {
+               case 0:
+                       serv_info.serv_pid = atoi(buf);
+                       WC->ctdl_pid = serv_info.serv_pid;
+                       break;
+               case 1:
+                       safestrncpy(serv_info.serv_nodename, buf, sizeof serv_info.serv_nodename);
+                       break;
+               case 2:
+                       safestrncpy(serv_info.serv_humannode, buf, sizeof serv_info.serv_humannode);
+                       break;
+               case 3:
+                       safestrncpy(serv_info.serv_fqdn, buf, sizeof serv_info.serv_fqdn);
+                       break;
+               case 4:
+                       safestrncpy(serv_info.serv_software, buf, sizeof serv_info.serv_software);
+                       break;
+               case 5:
+                       serv_info.serv_rev_level = atoi(buf);
+                       break;
+               case 6:
+                       safestrncpy(serv_info.serv_bbs_city, buf, sizeof serv_info.serv_bbs_city);
+                       break;
+               case 7:
+                       safestrncpy(serv_info.serv_sysadm, buf, sizeof serv_info.serv_sysadm);
+                       break;
+               case 9:
+                       safestrncpy(serv_info.serv_moreprompt, buf, sizeof serv_info.serv_moreprompt);
+                       break;
+               case 14:
+                       serv_info.serv_supports_ldap = atoi(buf);
+                       break;
+               case 15:
+                       serv_info.serv_newuser_disabled = atoi(buf);
+                       break;
+               }
+               ++a;
+       }
+}
+
+
+
+/**
+ * \brief Read Citadel variformat text and spit it out as HTML.
+ * \param align html align string
+ */
+void fmout(char *align)
+{
+       int intext = 0;
+       int bq = 0;
+       char buf[SIZ];
+
+       wprintf("<div align=%s>\n", align);
+       while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+
+               if ((intext == 1) && (isspace(buf[0]))) {
+                       wprintf("<br />");
+               }
+               intext = 1;
+
+               /**
+                * 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 ((bq == 0) && (!strncmp(buf, " >", 2))) {
+                       wprintf("<BLOCKQUOTE>");
+                       bq = 1;
+               } else if ((bq == 1) && (strncmp(buf, " >", 2))) {
+                       wprintf("</BLOCKQUOTE>");
+                       bq = 0;
+               }
+               if ((bq == 1) && (!strncmp(buf, " >", 2))) {
+                       strcpy(buf, &buf[2]);
+               }
+               /** Activate embedded URL's */
+               url(buf);
+
+               escputs(buf);
+               wprintf("\n");
+       }
+       if (bq == 1) {
+               wprintf("</I>");
+       }
+       wprintf("</div><br />\n");
+}
+
+
+
+
+/**
+ * \brief Read Citadel variformat text and spit it out as HTML in a form
+ * suitable for embedding in another message (forward/quote).
+ * (NO LINEBREAKS ALLOWED HERE!)
+ */
+void pullquote_fmout(void) {
+       int intext = 0;
+       int bq = 0;
+       char buf[SIZ];
+
+       while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+
+               if ((intext == 1) && (isspace(buf[0]))) {
+                       wprintf("<br />");
+               }
+               intext = 1;
+
+               /**
+                * 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 ((bq == 0) && (!strncmp(buf, " >", 2))) {
+                       wprintf("<BLOCKQUOTE>");
+                       bq = 1;
+               } else if ((bq == 1) && (strncmp(buf, " >", 2))) {
+                       wprintf("</BLOCKQUOTE>");
+                       bq = 0;
+               }
+               if ((bq == 1) && (!strncmp(buf, " >", 2))) {
+                       strcpy(buf, &buf[2]);
+               }
+
+               msgescputs(buf);
+       }
+       if (bq == 1) {
+               wprintf("</I>");
+       }
+}
+
+
+
+
+/**
+ * \brief Transmit message text (in memory) to the server.
+ *
+ * \param ptr Pointer to the message being transmitted
+ */
+void text_to_server(char *ptr)
+{
+       char buf[256];
+       int ch, a, pos;
+
+       pos = 0;
+       buf[0] = 0;
+
+       while (ptr[pos] != 0) {
+               ch = ptr[pos++];
+               if (ch == 10) {
+                       while ( (isspace(buf[strlen(buf) - 1]))
+                         && (strlen(buf) > 1) )
+                               buf[strlen(buf) - 1] = 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);
+}
+
+
+/**
+ * \brief Transmit message text (in memory) to the server,
+ *        converting to Quoted-Printable encoding as we go.
+ *
+ * \param ptr Pointer to the message being transmitted
+ */
+void text_to_server_qp(char *ptr)
+{
+       char buf[256];
+       int ch, pos;
+       int output_len = 0;
+
+       pos = 0;
+       buf[0] = 0;
+       output_len = 0;
+
+       while (ptr[pos] != 0) {
+               ch = ptr[pos++];
+
+               if (ch == 13) {
+                       /* ignore carriage returns */
+               }
+               else if (ch == 10) {
+                       /* hard line break */
+                       if (output_len > 0) {
+                               if (isspace(buf[output_len-1])) {
+                                       sprintf(&buf[output_len-1], "=%02X", buf[output_len-1]);
+                                       output_len += 2;
+                               }
+                       }
+                       buf[output_len++] = 0;
+                       serv_puts(buf);
+                       output_len = 0;
+               }
+               else if (ch == 9) {
+                       buf[output_len++] = ch;
+               }
+               else if ( (ch >= 32) && (ch <= 60) ) {
+                       buf[output_len++] = ch;
+               }
+               else if ( (ch >= 62) && (ch <= 126) ) {
+                       buf[output_len++] = ch;
+               }
+               else {
+                       sprintf(&buf[output_len], "=%02X", ch);
+                       output_len += 3;
+               }
+               
+               if (output_len > 72) {
+                       /* soft line break */
+                       if (isspace(buf[output_len-1])) {
+                               sprintf(&buf[output_len-1], "=%02X", buf[output_len-1]);
+                               output_len += 2;
+                       }
+                       buf[output_len++] = '=';
+                       buf[output_len++] = 0;
+                       serv_puts(buf);
+                       output_len = 0;
+               }
+       }
+
+       /* end of data - transmit anything that's left */
+       if (output_len > 0) {
+               if (isspace(buf[output_len-1])) {
+                       sprintf(&buf[output_len-1], "=%02X", buf[output_len-1]);
+                       output_len += 2;
+               }
+               buf[output_len++] = 0;
+               serv_puts(buf);
+               output_len = 0;
+       }
+}
+
+
+
+
+/**
+ * \brief 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)) {
+                       wprintf("\n");
+               }
+               wprintf("%s", buf);
+               ++count;
+       }
+}
+
+
+
+/**
+ * Read binary data from server into memory using a series of
+ * server READ commands.
+ * \param buffer the output buffer
+ * \param total_len the maximal length of buffer
+ */
+void read_server_binary(char *buffer, size_t total_len) {
+       char buf[SIZ];
+       size_t bytes = 0;
+       size_t thisblock = 0;
+
+       memset(buffer, 0, total_len);
+       while (bytes < total_len) {
+               thisblock = 4095;
+               if ((total_len - bytes) < thisblock) {
+                       thisblock = total_len - bytes;
+                       if (thisblock == 0) return;
+               }
+               serv_printf("READ %d|%d", (int)bytes, (int)thisblock);
+               serv_getln(buf, sizeof buf);
+               if (buf[0] == '6') {
+                       thisblock = (size_t)atoi(&buf[4]);
+                       if (!WC->connected) return;
+                       serv_read(&buffer[bytes], thisblock);
+                       bytes += thisblock;
+               }
+               else {
+                       lprintf(3, "Error: %s\n", &buf[4]);
+                       return;
+               }
+       }
+}
+
+
+/**
+ * \brief Read text from server, appending to a string buffer until the
+ * usual 000 terminator is found.  Caller is responsible for freeing
+ * the returned pointer.
+ */
+char *read_server_text(void) {
+       char *text = NULL;
+       size_t bytes_allocated = 0;
+       size_t bytes_read = 0;
+       int linelen;
+       char buf[SIZ];
+
+       text = malloc(SIZ);
+       if (text == NULL) {
+               return(NULL);
+       }
+       text[0] = 0;
+       bytes_allocated = SIZ;
+
+       while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+               linelen = strlen(buf);
+               buf[linelen] = '\n';
+               buf[linelen+1] = 0;
+               ++linelen;
+
+               if ((bytes_read + linelen) >= (bytes_allocated - 2)) {
+                       bytes_allocated = 2 * bytes_allocated;
+                       text = realloc(text, bytes_allocated);
+               }
+
+               strcpy(&text[bytes_read], buf);
+               bytes_read += linelen;
+       }
+
+       return(text);
+}
+
+
+
+/*@}*/
diff --git a/webcit/setup.c b/webcit/setup.c
new file mode 100644 (file)
index 0000000..f11a917
--- /dev/null
@@ -0,0 +1,683 @@
+/*
+ * $Id$
+ *
+ * WebCit setup utility
+ * 
+ * (This is basically just an install wizard.  It's not required.)
+ *
+ */
+
+#include "config.h"
+#include "webcit.h"
+#include "webserver.h"
+
+
+#ifdef HAVE_NEWT
+#include <newt.h>
+#endif
+
+
+#define UI_TEXT                0       /* Default setup type -- text only */
+#define UI_DIALOG      2       /* Use the 'dialog' program */
+#define UI_SILENT      3       /* Silent running, for use in scripts */
+#define UI_NEWT                4       /* Use the "newt" window library */
+
+int setup_type;
+char setup_directory[SIZ];
+char init_entry[SIZ];
+int using_web_installer = 0;
+char suggested_url[SIZ];
+
+/*
+ * Set an entry in inittab to the desired state
+ */
+void set_init_entry(char *which_entry, char *new_state) {
+       char *inittab = NULL;
+       FILE *fp;
+       char buf[SIZ];
+       char entry[SIZ];
+       char levels[SIZ];
+       char state[SIZ];
+       char prog[SIZ];
+
+       inittab = strdup("");
+       if (inittab == NULL) return;
+
+       fp = fopen("/etc/inittab", "r");
+       if (fp == NULL) return;
+
+       while(fgets(buf, sizeof buf, fp) != NULL) {
+
+               if (num_tokens(buf, ':') == 4) {
+                       extract_token(entry, buf, 0, ':', sizeof entry);
+                       extract_token(levels, buf, 1, ':', sizeof levels);
+                       extract_token(state, buf, 2, ':', sizeof state);
+                       extract_token(prog, buf, 3, ':', sizeof prog); /* includes 0x0a LF */
+
+                       if (!strcmp(entry, which_entry)) {
+                               strcpy(state, new_state);
+                               sprintf(buf, "%s:%s:%s:%s",
+                                       entry, levels, state, prog);
+                       }
+               }
+
+               inittab = realloc(inittab, strlen(inittab) + strlen(buf) + 2);
+               if (inittab == NULL) {
+                       fclose(fp);
+                       return;
+               }
+               
+               strcat(inittab, buf);
+       }
+       fclose(fp);
+       fp = fopen("/etc/inittab", "w");
+       if (fp != NULL) {
+               fwrite(inittab, strlen(inittab), 1, fp);
+               fclose(fp);
+               kill(1, SIGHUP);        /* Tell init to re-read /etc/inittab */
+       }
+       free(inittab);
+}
+
+
+
+
+/* 
+ * Shut down the Citadel service if necessary, during setup.
+ */
+void shutdown_service(void) {
+       FILE *infp;
+       char buf[SIZ];
+       char looking_for[SIZ];
+       int have_entry = 0;
+       char entry[SIZ];
+       char prog[SIZ];
+
+       strcpy(init_entry, "");
+
+       /* Determine the fully qualified path name of webserver */
+       snprintf(looking_for, sizeof looking_for, "%s/webserver ", setup_directory);
+
+       /* Pound through /etc/inittab line by line.  Set have_entry to 1 if
+        * an entry is found which we believe starts webserver.
+        */
+       infp = fopen("/etc/inittab", "r");
+       if (infp == NULL) {
+               return;
+       } else {
+               while (fgets(buf, sizeof buf, infp) != NULL) {
+                       buf[strlen(buf) - 1] = 0;
+                       extract_token(entry, buf, 0, ':', sizeof entry);
+                       extract_token(prog, buf, 3, ':', sizeof prog);
+                       if (!strncasecmp(prog, looking_for,
+                          strlen(looking_for))) {
+                               ++have_entry;
+                               strcpy(init_entry, entry);
+                       }
+               }
+               fclose(infp);
+       }
+
+       /* Bail out if there's nothing to do. */
+       if (!have_entry) return;
+
+       set_init_entry(init_entry, "off");
+}
+
+
+/*
+ * Start the Citadel service.
+ */
+void start_the_service(void) {
+       if (strlen(init_entry) > 0) {
+               set_init_entry(init_entry, "respawn");
+       }
+}
+
+
+
+void cleanup(int exitcode)
+{
+#ifdef HAVE_NEWT
+       newtCls();
+       newtRefresh();
+       newtFinished();
+#endif
+       exit(exitcode);
+}
+
+
+
+void title(char *text)
+{
+       if (setup_type == UI_TEXT) {
+               printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<%s>\n", text);
+       }
+}
+
+
+
+int yesno(char *question)
+{
+#ifdef HAVE_NEWT
+       newtComponent form = NULL;
+       newtComponent yesbutton = NULL;
+       newtComponent nobutton = NULL;
+#endif
+       int i = 0;
+       int answer = 0;
+       char buf[SIZ];
+
+       switch (setup_type) {
+
+       case UI_TEXT:
+               do {
+                       printf("%s\nYes/No --> ", question);
+                       fgets(buf, sizeof buf, stdin);
+                       answer = tolower(buf[0]);
+                       if (answer == 'y')
+                               answer = 1;
+                       else if (answer == 'n')
+                               answer = 0;
+               } while ((answer < 0) || (answer > 1));
+               break;
+
+       case UI_DIALOG:
+               sprintf(buf, "exec %s --yesno '%s' 10 72",
+                       getenv("CTDL_DIALOG"),
+                       question);
+               i = system(buf);
+               if (i == 0) {
+                       answer = 1;
+               }
+               else {
+                       answer = 0;
+               }
+               break;
+
+#ifdef HAVE_NEWT
+       case UI_NEWT:
+               newtCenteredWindow(76, 10, "Question");
+               form = newtForm(NULL, NULL, 0);
+               for (i=0; i<num_tokens(question, '\n'); ++i) {
+                       extract_token(buf, question, i, '\n', sizeof buf);
+                       newtFormAddComponent(form, newtLabel(1, 1+i, buf));
+               }
+               yesbutton = newtButton(10, 5, "Yes");
+               nobutton = newtButton(60, 5, "No");
+               newtFormAddComponent(form, yesbutton);
+               newtFormAddComponent(form, nobutton);
+               if (newtRunForm(form) == yesbutton) {
+                       answer = 1;
+               }
+               else {
+                       answer = 0;
+               }
+               newtPopWindow();
+               newtFormDestroy(form);  
+
+               break;
+#endif
+
+       }
+       return (answer);
+}
+
+void set_value(char *prompt, char str[])
+{
+#ifdef HAVE_NEWT
+       newtComponent form;
+       char *result;
+       int i;
+#endif
+       char buf[SIZ];
+       char dialog_result[PATH_MAX];
+       char setupmsg[SIZ];
+       FILE *fp;
+
+       strcpy(setupmsg, "");
+
+       switch (setup_type) {
+       case UI_TEXT:
+               title("WebCit setup");
+               printf("\n%s\n", prompt);
+               printf("This is currently set to:\n%s\n", str);
+               printf("Enter new value or press return to leave unchanged:\n");
+               fgets(buf, sizeof buf, stdin);
+               buf[strlen(buf) - 1] = 0;
+               if (strlen(buf) != 0)
+                       strcpy(str, buf);
+               break;
+
+       case UI_DIALOG:
+               CtdlMakeTempFileName(dialog_result, sizeof dialog_result);
+               sprintf(buf, "exec %s --inputbox '%s' 19 72 '%s' 2>%s",
+                       getenv("CTDL_DIALOG"),
+                       prompt,
+                       str,
+                       dialog_result);
+               system(buf);
+               fp = fopen(dialog_result, "r");
+               if (fp != NULL) {
+                       fgets(str, sizeof buf, fp);
+                       if (str[strlen(str)-1] == 10) {
+                               str[strlen(str)-1] = 0;
+                       }
+                       fclose(fp);
+                       unlink(dialog_result);
+               }
+               break;
+
+#ifdef HAVE_NEWT
+       case UI_NEWT:
+
+               newtCenteredWindow(76, 10, "WebCit setup");
+               form = newtForm(NULL, NULL, 0);
+               for (i=0; i<num_tokens(prompt, '\n'); ++i) {
+                       extract_token(buf, prompt, i, '\n', sizeof buf);
+                       newtFormAddComponent(form, newtLabel(1, 1+i, buf));
+               }
+               newtFormAddComponent(form, newtEntry(1, 8, str, 74, (const char **) &result,
+                                       NEWT_FLAG_RETURNEXIT));
+               newtRunForm(form);
+               strcpy(str, result);
+
+               newtPopWindow();
+               newtFormDestroy(form);  
+
+#endif
+       }
+}
+
+
+void important_message(char *title, char *msgtext)
+{
+#ifdef HAVE_NEWT
+       newtComponent form = NULL;
+       int i = 0;
+#endif
+       char buf[SIZ];
+
+       switch (setup_type) {
+
+       case UI_TEXT:
+               printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
+               printf("       %s \n\n%s\n\n", title, msgtext);
+               printf("Press return to continue...");
+               fgets(buf, sizeof buf, stdin);
+               break;
+
+       case UI_DIALOG:
+               sprintf(buf, "exec %s --msgbox '%s' 19 72",
+                       getenv("CTDL_DIALOG"),
+                       msgtext);
+               system(buf);
+               break;
+
+#ifdef HAVE_NEWT
+       case UI_NEWT:
+               newtCenteredWindow(76, 10, title);
+               form = newtForm(NULL, NULL, 0);
+               for (i=0; i<num_tokens(msgtext, '\n'); ++i) {
+                       extract_token(buf, msgtext, i, '\n', sizeof buf);
+                       newtFormAddComponent(form, newtLabel(1, 1+i, buf));
+               }
+               newtFormAddComponent(form, newtButton(35, 5, "OK"));
+               newtRunForm(form);
+               newtPopWindow();
+               newtFormDestroy(form);  
+               break;
+#endif
+
+       }
+}
+
+
+void display_error(char *error_message)
+{
+       important_message("Error", error_message);
+}
+
+void progress(char *text, long int curr, long int cmax)
+{
+#ifdef HAVE_NEWT
+
+       /* These variables are static because progress() gets called
+        * multiple times during the course of whatever operation is
+        * being performed.  This makes setup non-threadsafe, but who
+        * cares?
+        */
+       static newtComponent form = NULL;
+       static newtComponent scale = NULL;
+#endif
+       static long dots_printed = 0L;
+       long a = 0;
+       char buf[SIZ];
+       static FILE *fp = NULL;
+
+       switch (setup_type) {
+
+       case UI_TEXT:
+               if (curr == 0) {
+                       printf("%s\n", text);
+                       printf("..........................");
+                       printf("..........................");
+                       printf("..........................\r");
+                       fflush(stdout);
+                       dots_printed = 0;
+               } else if (curr == cmax) {
+                       printf("\r%79s\n", "");
+               } else {
+                       a = (curr * 100) / cmax;
+                       a = a * 78;
+                       a = a / 100;
+                       while (dots_printed < a) {
+                               printf("*");
+                               ++dots_printed;
+                               fflush(stdout);
+                       }
+               }
+               break;
+
+       case UI_DIALOG:
+               if (curr == 0) {
+                       sprintf(buf, "exec %s --gauge '%s' 7 72 0",
+                               getenv("CTDL_DIALOG"),
+                               text);
+                       fp = popen(buf, "w");
+                       if (fp != NULL) {
+                               fprintf(fp, "0\n");
+                               fflush(fp);
+                       }
+               } 
+               else if (curr == cmax) {
+                       if (fp != NULL) {
+                               fprintf(fp, "100\n");
+                               pclose(fp);
+                               fp = NULL;
+                       }
+               }
+               else {
+                       a = (curr * 100) / cmax;
+                       if (fp != NULL) {
+                               fprintf(fp, "%ld\n", a);
+                               fflush(fp);
+                       }
+               }
+               break;
+
+#ifdef HAVE_NEWT
+       case UI_NEWT:
+               if (curr == 0) {
+                       newtCenteredWindow(76, 8, text);
+                       form = newtForm(NULL, NULL, 0);
+                       scale = newtScale(1, 3, 74, cmax);
+                       newtFormAddComponent(form, scale);
+                       newtDrawForm(form);
+                       newtRefresh();
+               }
+               if ((curr > 0) && (curr <= cmax)) {
+                       newtScaleSet(scale, curr);
+                       newtRefresh();
+               }
+               if (curr == cmax) {
+                       newtFormDestroy(form);  
+                       newtPopWindow();
+                       newtRefresh();
+               }
+               break;
+#endif
+
+       }
+}
+
+
+
+
+/*
+ * check_inittab_entry()  -- Make sure "webserver" is in /etc/inittab
+ *
+ */
+void check_inittab_entry(void)
+{
+       FILE *infp;
+       char buf[SIZ];
+       char looking_for[SIZ];
+       char question[SIZ];
+       char entryname[5];
+       char http_port[128];
+#ifdef HAVE_OPENSSL
+       char https_port[128];
+#endif
+       char hostname[128];
+       char portname[128];
+       struct utsname my_utsname;
+
+       /* Determine the fully qualified path name of webserver */
+       snprintf(looking_for, sizeof looking_for, "%s/webserver", setup_directory);
+
+       /* If there's already an entry, then we have nothing left to do. */
+       if (strlen(init_entry) > 0) {
+               return;
+       }
+
+       /* Otherwise, prompt the user to create an entry. */
+       snprintf(question, sizeof question,
+               "There is no '%s' entry in /etc/inittab.\n"
+               "Would you like to add one?",
+               looking_for);
+       if (yesno(question) == 0)
+               return;
+
+       snprintf(question, sizeof question,
+               "On which port do you want WebCit to listen for HTTP "
+               "requests?\n\nYou can use the standard port (80) if you are "
+               "not running another\nweb server (such as Apache), otherwise "
+               "select another port.");
+       sprintf(http_port, "2000");
+       set_value(question, http_port);
+       uname(&my_utsname);
+       sprintf(suggested_url, "http://%s:%s/", my_utsname.nodename, http_port);
+
+#ifdef HAVE_OPENSSL
+       snprintf(question, sizeof question,
+               "On which port do you want WebCit to listen for HTTPS "
+               "requests?\n\nYou can use the standard port (443) if you are "
+               "not running another\nweb server (such as Apache), otherwise "
+               "select another port.");
+       sprintf(https_port, "443");
+       set_value(question, https_port);
+#endif
+
+       /* Find out where Citadel is. */
+       if ( (using_web_installer) && (getenv("CITADEL") != NULL) ) {
+               strcpy(hostname, "uds");
+               strcpy(portname, getenv("CITADEL"));
+       }
+       else {
+               snprintf(question, sizeof question,
+                       "Is the Citadel service running on the same host as WebCit?");
+               if (yesno(question)) {
+                       sprintf(hostname, "uds");
+                       sprintf(portname, "/usr/local/citadel");
+                       set_value("In what directory is Citadel installed?", portname);
+               }
+               else {
+                       sprintf(hostname, "127.0.0.1");
+                       sprintf(portname, "504");
+                       set_value("Enter the host name or IP address of your "
+                               "Citadel server.", hostname);
+                       set_value("Enter the port number on which Citadel is "
+                               "running (usually 504)", portname);
+               }
+       }
+
+       /* Generate unique entry names for /etc/inittab */
+       snprintf(entryname, sizeof entryname, "c0");
+       do {
+               ++entryname[1];
+               if (entryname[1] > '9') {
+                       entryname[1] = 0;
+                       ++entryname[0];
+                       if (entryname[0] > 'z') {
+                               display_error(
+                                  "Can't generate a unique entry name");
+                               return;
+                       }
+               }
+               snprintf(buf, sizeof buf,
+                    "grep %s: /etc/inittab >/dev/null 2>&1", entryname);
+       } while (system(buf) == 0);
+       
+
+       /* Now write it out to /etc/inittab */
+       infp = fopen("/etc/inittab", "a");
+       if (infp == NULL) {
+               display_error(strerror(errno));
+       } else {
+               fprintf(infp, "# Start the WebCit server...\n");
+               fprintf(infp, "h%s:2345:respawn:%s -p%s %s %s\n",
+                       entryname, looking_for,
+                       http_port, hostname, portname);
+#ifdef HAVE_OPENSSL
+               fprintf(infp, "s%s:2345:respawn:%s -p%s -s %s %s\n",
+                       entryname, looking_for,
+                       https_port, hostname, portname);
+#endif
+               fclose(infp);
+               strcpy(init_entry, entryname);
+       }
+}
+
+
+
+
+/*
+ * Figure out what type of user interface we're going to use
+ */
+int discover_ui(void)
+{
+
+       /* Use "dialog" if we have it */
+       if (getenv("CTDL_DIALOG") != NULL) {
+               return UI_DIALOG;
+       }
+               
+#ifdef HAVE_NEWT
+       newtInit();
+       newtCls();
+       newtDrawRootText(0, 0, "WebCit Setup");
+       return UI_NEWT;
+#endif
+       return UI_TEXT;
+}
+
+
+
+
+
+int main(int argc, char *argv[])
+{
+       int a;
+       char aaa[256];
+       int info_only = 0;
+       strcpy(suggested_url, "http://<your_host_name>:<port>/");
+
+       /* set an invalid setup type */
+       setup_type = (-1);
+
+       /* Check to see if we're running the web installer */
+       if (getenv("CITADEL_INSTALLER") != NULL) {
+               using_web_installer = 1;
+       }
+
+       /* parse command line args */
+       for (a = 0; a < argc; ++a) {
+               if (!strncmp(argv[a], "-u", 2)) {
+                       strcpy(aaa, argv[a]);
+                       strcpy(aaa, &aaa[2]);
+                       setup_type = atoi(aaa);
+               }
+               if (!strcmp(argv[a], "-i")) {
+                       info_only = 1;
+               }
+               if (!strcmp(argv[a], "-q")) {
+                       setup_type = UI_SILENT;
+               }
+       }
+
+
+       /* If a setup type was not specified, try to determine automatically
+        * the best one to use out of all available types.
+        */
+       if (setup_type < 0) {
+               setup_type = discover_ui();
+       }
+       if (info_only == 1) {
+               important_message("WebCit Setup", "Welcome to WebCit setup");
+               cleanup(0);
+       }
+
+       /* If we're on something BSDish then we don't have inittab */
+       if (access("/etc/inittab", F_OK)) {
+               important_message("Not running SysV style init",
+                               "WebCit Setup can only run on systems that use /etc/inittab.\n"
+                               "Please manually configure your startup scripts to run WebCit\n"
+                               "when the system is booted.\n");
+               cleanup(0);
+       }
+
+       /* Get started in a valid setup directory. */
+       strcpy(setup_directory, PREFIX);
+       if ( (using_web_installer) && (getenv("WEBCIT") != NULL) ) {
+               strcpy(setup_directory, getenv("WEBCIT"));
+       }
+       else {
+               set_value("In what directory is WebCit installed?",
+                       setup_directory);
+       }
+       if (chdir(setup_directory) != 0) {
+               important_message("WebCit Setup",
+                         "The directory you specified does not exist.");
+               cleanup(errno);
+       }
+
+       /* See if we need to shut down the WebCit service. */
+       for (a=0; a<=3; ++a) {
+               progress("Shutting down the WebCit service...", a, 3);
+               if (a == 0) shutdown_service();
+               sleep(1);
+       }
+
+       /* Now begin. */
+       switch (setup_type) {
+
+       case UI_TEXT:
+               printf("\n\n\n"
+                       "               *** WebCit setup program ***\n\n");
+               break;
+
+       }
+
+       check_inittab_entry();  /* Check /etc/inittab */
+
+       /* See if we can start the WebCit service. */
+       if (strlen(init_entry) > 0) {
+               for (a=0; a<=3; ++a) {
+                       progress("Starting the WebCit service...", a, 3);
+                       if (a == 0) start_the_service();
+                       sleep(1);
+               }
+               sprintf(aaa,
+                       "Setup is finished.  You may now log in.\n"
+                       "Point your web browser at %s\n", suggested_url);
+               important_message("Setup finished", aaa);
+       }
+       else {
+               important_message("Setup finished",
+                       "Setup is finished.  You may now start the server.");
+       }
+
+       cleanup(0);
+       return 0;
+}
diff --git a/webcit/setup_wizard.c b/webcit/setup_wizard.c
new file mode 100644 (file)
index 0000000..bc2b227
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * $Id$
+ *
+ * First-time setup wizard
+ */
+
+#include "webcit.h"
+
+
+/*
+ */
+void do_setup_wizard(void)
+{
+       char *step;
+       FILE *fp;
+
+       step = bstr("step");
+
+       if (!strcasecmp(step, "Finish")) {
+               fp = fopen(wizard_filename, "w");
+               if (fp != NULL) {
+                       fprintf(fp, "%d\n", serv_info.serv_rev_level);
+                       fclose(fp);
+               }
+               do_welcome();
+               return;
+       }
+
+       output_headers(1, 1, 2, 0, 0, 0);
+
+       wprintf("<div id=\"banner\">\n");
+       wprintf("<TABLE WIDTH=100%% BORDER=0 BGCOLOR=\"#444455\"><TR><TD>");
+       wprintf("<img src=\"static/citadel-logo.gif\" WIDTH=64 HEIGHT=64 ALT=\" \" ALIGN=MIDDLE>");
+       wprintf("<SPAN CLASS=\"titlebar\">&nbsp;First time setup");
+       wprintf("</SPAN></TD><TD ALIGN=RIGHT>");
+       wprintf("</TD></TR></TABLE>\n");
+       wprintf("</div>\n"
+               "<div id=\"content\">\n");
+
+       wprintf("<div class=\"fix_scrollbar_bug\">"
+               "<form method=\"post\" action=\"setup_wizard\">\n"
+       );
+
+       wprintf("<div align=center>"
+               "This is where the setup wizard will be placed.<br>\n"
+               "For now, just click Finish.<br><br>\n"
+       );
+
+       wprintf("<INPUT TYPE=\"submit\" NAME=\"step\" VALUE=\"Next\">\n");
+       wprintf("<INPUT TYPE=\"submit\" NAME=\"step\" VALUE=\"Finish\">\n");
+
+       wprintf("</form></div></div>\n");
+       wDumpContent(1);
+}
+
+
diff --git a/webcit/siteconfig.c b/webcit/siteconfig.c
new file mode 100644 (file)
index 0000000..17a7c3c
--- /dev/null
@@ -0,0 +1,650 @@
+/*
+ * $Id$
+ */
+/**
+ * \defgroup AdminConfig Administrative screen for site-wide configuration
+ * \ingroup CitadelConfig
+ */
+/*@{*/
+
+#include "webcit.h"
+
+/**
+ * \brief display all configuration items
+ */
+void display_siteconfig(void)
+{
+       char buf[SIZ];
+       int i, j;
+
+       char general[SIZ];
+       char access[SIZ];
+       char network[SIZ];
+       char tuning[SIZ];
+       char directory[SIZ];
+       char purger[SIZ];
+       char idxjnl[SIZ];
+
+       /** expire policy settings */
+       int sitepolicy = 0;
+       int sitevalue = 0;
+       int mboxpolicy = 0;
+       int mboxvalue = 0;
+
+       output_headers(1, 1, 2, 0, 0, 0);
+       wprintf("<div id=\"banner\">\n"
+               "<table width=100%% border=0 bgcolor=\"#444455\"><tr><td>"
+               "<span class=\"titlebar\">");
+       wprintf(_("Site configuration"));
+       wprintf("</span>"
+               "</td></tr></table>\n"
+               "</div>\n<div id=\"content\">\n"
+       );
+
+       serv_printf("CONF get");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '1') {
+               wprintf("<table width=100%% border=0 bgcolor=\"#444455\"><tr><td>");
+               wprintf("<span class=\"titlebar\">");
+               wprintf(_("Error"));
+               wprintf("</span>\n");
+               wprintf("</td></tr></table><br />\n");
+               wprintf("%s<br />\n", &buf[4]);
+               wDumpContent(1);
+               return;
+       }
+
+       wprintf("<div class=\"fix_scrollbar_bug\">"
+               "<table border=0 width=100%% bgcolor=\"#ffffff\"><tr><td>");
+
+       char *tabnames[] = {
+               _("General"),
+               _("Access"),
+               _("Network"),
+               _("Tuning"),
+               _("Directory"),
+               _("Auto-purger"),
+               _("Indexing/Journaling")
+       };
+
+       sprintf(general, "<center><h1>%s</h1><table border=\"0\">",
+                       _("General site configuration items")
+       );
+
+       sprintf(access, "<center><h1>%s</h1><table border=\"0\">",
+                       _("Access controls and site policy settings")
+       );
+
+       sprintf(network, "<center><h1>%s</h1><h2>%s</h2><table border=\"0\">",
+                       _("Network services"),
+                       _("Changes made on this screen will not take effect "
+                       "until you restart the Citadel server.")
+       );
+
+       sprintf(tuning, "<center><h1>%s</h1><table border=\"0\">",
+                       _("Advanced server fine-tuning controls")
+       );
+
+       sprintf(directory, "<center><h1>%s</h1><h2>%s</h2><table border=\"0\">",
+                       _("Configure the LDAP connector for Citadel"),
+                       _("Changes made on this screen will not take effect "
+                       "until you restart the Citadel server.")
+       );
+
+       sprintf(purger, "<center><h1>%s</h1><h2>%s</h2><table border=\"0\">",
+                       _("Configure automatic expiry of old messages"),
+                       _("These settings may be overridden on a per-floor or per-room basis.")
+       );
+
+       sprintf(idxjnl, "<center><h1>%s</h1><h2>%s</h2><table border=\"0\">",
+                       _("Indexing and Journaling"),
+                       _("Warning: these facilities are resource intensive.")
+       );
+
+
+       wprintf("<form method=\"post\" action=\"siteconfig\">\n");
+
+       i = 0;
+       while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+               switch (i++) {
+               case 0:
+                       sprintf(&general[strlen(general)], "<tr><td>");
+                       sprintf(&general[strlen(general)], _("Node name"));
+                       sprintf(&general[strlen(general)], "</td><td>");
+                       sprintf(&general[strlen(general)], "<input type=\"text\" name=\"c_nodename\" maxlength=\"15\" value=\"%s\">", buf);
+                       sprintf(&general[strlen(general)], "</td></tr>\n");
+                       break;
+               case 1:
+                       sprintf(&general[strlen(general)], "<tr><td>");
+                       sprintf(&general[strlen(general)], _("Fully qualified domain name"));
+                       sprintf(&general[strlen(general)], "</td><td>");
+                       sprintf(&general[strlen(general)], "<input type=\"text\" name=\"c_fqdn\" maxlength=\"63\" value=\"%s\">", buf);
+                       sprintf(&general[strlen(general)], "</td></tr>\n");
+                       break;
+               case 2:
+                       sprintf(&general[strlen(general)], "<tr><td>");
+                       sprintf(&general[strlen(general)], _("Human-readable node name"));
+                       sprintf(&general[strlen(general)], "</td><td>");
+                       sprintf(&general[strlen(general)], "<input type=\"text\" name=\"c_humannode\" maxlength=\"20\" value=\"%s\">", buf);
+                       sprintf(&general[strlen(general)], "</td></tr>\n");
+                       break;
+               case 3:
+                       sprintf(&general[strlen(general)], "<tr><td>");
+                       sprintf(&general[strlen(general)], _("Telephone number"));
+                       sprintf(&general[strlen(general)], "</td><td>");
+                       sprintf(&general[strlen(general)], "<input type=\"text\" name=\"c_phonenum\" maxlength=\"15\" value=\"%s\">", buf);
+                       sprintf(&general[strlen(general)], "</td></tr>\n");
+                       break;
+               case 4:
+                       sprintf(&access[strlen(access)], "<tr><td>");
+                       sprintf(&access[strlen(access)], _("Automatically grant room-aide status to users who create private rooms"));
+                       sprintf(&access[strlen(access)], "</td><td>");
+                       sprintf(&access[strlen(access)], "<input type=\"checkbox\" name=\"c_creataide\" value=\"yes\" %s>",
+                               ((atoi(buf) != 0) ? "checked" : ""));
+                       sprintf(&access[strlen(access)], "</td></tr>\n");
+                       break;
+               case 5:
+                       sprintf(&tuning[strlen(tuning)], "<tr><td>");
+                       sprintf(&tuning[strlen(tuning)], _("Server connection idle timeout (in seconds)"));
+                       sprintf(&tuning[strlen(tuning)], "</td><td>");
+                       sprintf(&tuning[strlen(tuning)], "<input type=\"text\" name=\"c_sleeping\" maxlength=\"15\" value=\"%s\">", buf);
+                       sprintf(&tuning[strlen(tuning)], "</td></tr>\n");
+                       break;
+               case 6:
+                       sprintf(&access[strlen(access)], "<tr><td>");
+                       sprintf(&access[strlen(access)], _("Initial access level for new users"));
+                       sprintf(&access[strlen(access)], "</td><td>");
+                       sprintf(&access[strlen(access)], "<select name=\"c_initax\" size=\"1\">\n");
+                       for (j=0; j<=6; ++j) {
+                               sprintf(&access[strlen(access)], "<option %s value=\"%d\">%d - %s</option>\n",
+                                       ((atoi(buf) == j) ? "selected" : ""),
+                                       j, j, axdefs[j]
+                               );
+                       }
+                       sprintf(&access[strlen(access)], "</select>");
+                       sprintf(&access[strlen(access)], "</td></tr>\n");
+                       break;
+               case 7:
+                       sprintf(&access[strlen(access)], "<tr><td>");
+                       sprintf(&access[strlen(access)], _("Require registration for new users"));
+                       sprintf(&access[strlen(access)], "</td><td>");
+                       sprintf(&access[strlen(access)], "<input type=\"checkbox\" name=\"c_regiscall\" value=\"yes\" %s>",
+                               ((atoi(buf) != 0) ? "checked" : ""));
+                       sprintf(&access[strlen(access)], "</td></tr>\n");
+                       break;
+               case 8:
+                       sprintf(&access[strlen(access)], "<tr><td>");
+                       sprintf(&access[strlen(access)], _("Quarantine messages from problem users"));
+                       sprintf(&access[strlen(access)], "</td><td>");
+                       sprintf(&access[strlen(access)], "<input type=\"checkbox\" name=\"c_twitdetect\" value=\"yes\" %s>",
+                               ((atoi(buf) != 0) ? "checked" : ""));
+                       sprintf(&access[strlen(access)], "</td></tr>\n");
+                       break;
+               case 9:
+                       sprintf(&access[strlen(access)], "<tr><td>");
+                       sprintf(&access[strlen(access)], _("Name of quarantine room"));
+                       sprintf(&access[strlen(access)], "</td><td>");
+                       sprintf(&access[strlen(access)], "<input type=\"text\" name=\"c_twitroom\" maxlength=\"63\" value=\"%s\">", buf);
+                       sprintf(&access[strlen(access)], "</td></tr>\n");
+                       break;
+               case 10:
+                       sprintf(&general[strlen(general)], "<tr><td>");
+                       sprintf(&general[strlen(general)], _("Paginator prompt (for text mode clients)"));
+                       sprintf(&general[strlen(general)], "</td><td>");
+                       sprintf(&general[strlen(general)], "<input type=\"text\" name=\"c_moreprompt\" maxlength=\"79\" value=\"%s\">", buf);
+                       sprintf(&general[strlen(general)], "</td></tr>\n");
+                       break;
+               case 11:
+                       sprintf(&access[strlen(access)], "<tr><td>");
+                       sprintf(&access[strlen(access)], _("Restrict access to Internet mail"));
+                       sprintf(&access[strlen(access)], "</td><td>");
+                       sprintf(&access[strlen(access)], "<input type=\"checkbox\" name=\"c_restrict\" value=\"yes\" %s>",
+                               ((atoi(buf) != 0) ? "checked" : ""));
+                       sprintf(&access[strlen(access)], "</td></tr>\n");
+                       break;
+               case 12:
+                       sprintf(&general[strlen(general)], "<tr><td>");
+                       sprintf(&general[strlen(general)], _("Geographic location of this system"));
+                       sprintf(&general[strlen(general)], "</td><td>");
+                       sprintf(&general[strlen(general)], "<input type=\"text\" name=\"c_bbs_city\" maxlength=\"31\" value=\"%s\">", buf);
+                       sprintf(&general[strlen(general)], "</td></tr>\n");
+                       break;
+               case 13:
+                       sprintf(&general[strlen(general)], "<tr><td>");
+                       sprintf(&general[strlen(general)], _("Name of system administrator"));
+                       sprintf(&general[strlen(general)], "</td><td>");
+                       sprintf(&general[strlen(general)], "<input type=\"text\" name=\"c_sysadm\" MAXLENGTH=\"25\" VALUE=\"%s\">", buf);
+                       sprintf(&general[strlen(general)], "</td></tr>\n");
+                       break;
+               case 14:
+                       sprintf(&tuning[strlen(tuning)], "<tr><td>");
+                       sprintf(&tuning[strlen(tuning)], _("Maximum concurrent sessions (0 = no limit)"));
+                       sprintf(&tuning[strlen(tuning)], "</td><td>");
+                       sprintf(&tuning[strlen(tuning)], "<input type=\"text\" name=\"c_maxsessions\" maxlength=\"5\" value=\"%s\">", buf);
+                       sprintf(&tuning[strlen(tuning)], "</td></tr>\n");
+                       break;
+               case 16:
+                       sprintf(&tuning[strlen(tuning)], "<tr><td>");
+                       sprintf(&tuning[strlen(tuning)], _("Default user purge time (days)"));
+                       sprintf(&tuning[strlen(tuning)], "</td><td>");
+                       sprintf(&tuning[strlen(tuning)], "<input type=\"text\" name=\"c_userpurge\" maxlength=\"5\" value=\"%s\">", buf);
+                       sprintf(&tuning[strlen(tuning)], "</td></tr>\n");
+                       break;
+               case 17:
+                       sprintf(&tuning[strlen(tuning)], "<tr><td>");
+                       sprintf(&tuning[strlen(tuning)], _("Default room purge time (days)"));
+                       sprintf(&tuning[strlen(tuning)], "</td><td>");
+                       sprintf(&tuning[strlen(tuning)], "<input type=\"text\" name=\"c_roompurge\" maxlength=\"5\" value=\"%s\">", buf);
+                       sprintf(&tuning[strlen(tuning)], "</td></tr>\n");
+                       break;
+               case 18:
+                       sprintf(&access[strlen(access)], "<tr><td>");
+                       sprintf(&access[strlen(access)], _("Name of room to log pages"));
+                       sprintf(&access[strlen(access)], "</td><td>");
+                       sprintf(&access[strlen(access)], "<input type=\"text\" name=\"c_logpages\" maxlength=\"63\" value=\"%s\">", buf);
+                       sprintf(&access[strlen(access)], "</td></tr>\n");
+                       break;
+               case 19:
+                       sprintf(&access[strlen(access)], "<tr><td>");
+                       sprintf(&access[strlen(access)], _("Access level required to create rooms"));
+                       sprintf(&access[strlen(access)], "</td><td>");
+                       sprintf(&access[strlen(access)], "<select name=\"c_createax\" size=\"1\">\n");
+                       for (j=0; j<=6; ++j) {
+                               sprintf(&access[strlen(access)], "<option %s value=\"%d\">%d - %s</option>\n",
+                                       ((atoi(buf) == j) ? "selected" : ""),
+                                       j, j, axdefs[j]
+                               );
+                       }
+                       sprintf(&access[strlen(access)], "</select>");
+                       sprintf(&access[strlen(access)], "</td></tr>\n");
+                       break;
+               case 20:
+                       sprintf(&tuning[strlen(tuning)], "<tr><td>");
+                       sprintf(&tuning[strlen(tuning)], _("Maximum message length"));
+                       sprintf(&tuning[strlen(tuning)], "</td><td>");
+                       sprintf(&tuning[strlen(tuning)], "<input type=\"text\" name=\"c_maxmsglen\" maxlength=\"20\" value=\"%s\">", buf);
+                       sprintf(&tuning[strlen(tuning)], "</td></tr>\n");
+                       break;
+               case 21:
+                       sprintf(&tuning[strlen(tuning)], "<tr><td>");
+                       sprintf(&tuning[strlen(tuning)], _("Minimum number of worker threads"));
+                       sprintf(&tuning[strlen(tuning)], "</td><td>");
+                       sprintf(&tuning[strlen(tuning)], "<input type=\"text\" name=\"c_min_workers\" maxlength=\"5\" value=\"%s\">", buf);
+                       sprintf(&tuning[strlen(tuning)], "</td></tr>\n");
+                       break;
+               case 22:
+                       sprintf(&tuning[strlen(tuning)], "<tr><td>");
+                       sprintf(&tuning[strlen(tuning)], _("Maximum number of worker threads"));
+                       sprintf(&tuning[strlen(tuning)], "</td><td>");
+                       sprintf(&tuning[strlen(tuning)], "<input type=\"text\" name=\"c_max_workers\" maxlength=\"5\" value=\"%s\">", buf);
+                       sprintf(&tuning[strlen(tuning)], "</td></tr>\n");
+                       break;
+               case 23:
+                       sprintf(&network[strlen(network)], "<tr><td>");
+                       sprintf(&network[strlen(network)], _("POP3 listener port (-1 to disable)"));
+                       sprintf(&network[strlen(network)], "</td><td>");
+                       sprintf(&network[strlen(network)], "<input type=\"text\" name=\"c_pop3_port\" maxlength=\"5\" value=\"%s\">", buf);
+                       sprintf(&network[strlen(network)], "</TD></TR>\n");
+                       break;
+               case 24:
+                       sprintf(&network[strlen(network)], "<TR><TD>");
+                       sprintf(&network[strlen(network)], _("SMTP MTA port (-1 to disable)"));
+                       sprintf(&network[strlen(network)], "</TD><TD>");
+                       sprintf(&network[strlen(network)], "<input type=\"text\" NAME=\"c_smtp_port\" MAXLENGTH=\"5\" VALUE=\"%s\">", buf);
+                       sprintf(&network[strlen(network)], "</TD></TR>\n");
+                       break;
+               case 25:        /* note: reverse bool */
+                       sprintf(&network[strlen(network)], "<TR><TD>");
+                       sprintf(&network[strlen(network)], _("Correct forged From: lines during authenticated SMTP"));
+                       sprintf(&network[strlen(network)], "</TD><TD>");
+                       sprintf(&network[strlen(network)], "<input type=\"checkbox\" NAME=\"c_rfc822_strict_from\" VALUE=\"yes\" %s>",
+                               ((atoi(buf) == 0) ? "CHECKED" : ""));
+                       sprintf(&network[strlen(network)], "</TD></TR>\n");
+                       break;
+               case 26:
+                       sprintf(&access[strlen(access)], "<TR><TD>");
+                       sprintf(&access[strlen(access)], _("Allow aides to zap (forget) rooms"));
+                       sprintf(&access[strlen(access)], "</TD><TD>");
+                       sprintf(&access[strlen(access)], "<input type=\"checkbox\" NAME=\"c_aide_zap\" VALUE=\"yes\" %s>",
+                               ((atoi(buf) != 0) ? "CHECKED" : ""));
+                       sprintf(&access[strlen(access)], "</TD></TR>\n");
+                       break;
+               case 27:
+                       sprintf(&network[strlen(network)], "<TR><TD>");
+                       sprintf(&network[strlen(network)], _("IMAP listener port (-1 to disable)"));
+                       sprintf(&network[strlen(network)], "</TD><TD>");
+                       sprintf(&network[strlen(network)], "<input type=\"text\" NAME=\"c_imap_port\" MAXLENGTH=\"5\" VALUE=\"%s\">", buf);
+                       sprintf(&network[strlen(network)], "</TD></TR>\n");
+                       break;
+               case 28:
+                       sprintf(&network[strlen(network)], "<TR><TD>");
+                       sprintf(&network[strlen(network)], _("Network run frequency (in seconds)"));
+                       sprintf(&network[strlen(network)], "</TD><TD>");
+                       sprintf(&network[strlen(network)], "<input type=\"text\" NAME=\"c_net_freq\" MAXLENGTH=\"5\" VALUE=\"%s\">", buf);
+                       sprintf(&network[strlen(network)], "</TD></TR>\n");
+                       break;
+               case 29:
+                       sprintf(&access[strlen(access)], "<TR><TD>");
+                       sprintf(&access[strlen(access)], _("Disable self-service user account creation"));
+                       sprintf(&access[strlen(access)], "</TD><TD>");
+                       sprintf(&access[strlen(access)], "<input type=\"checkbox\" NAME=\"c_disable_newu\" VALUE=\"yes\" %s>",
+                               ((atoi(buf) != 0) ? "CHECKED" : ""));
+                       sprintf(&access[strlen(access)], "</TD></TR>\n");
+                       break;
+               case 31:
+                       sprintf(&purger[strlen(purger)], "<TR><TD>");
+                       sprintf(&purger[strlen(purger)], _("Hour to run database auto-purge"));
+                       sprintf(&purger[strlen(purger)], "</TD><TD>");
+                       sprintf(&purger[strlen(purger)], "<SELECT NAME=\"c_purge_hour\" SIZE=\"1\">\n");
+                       for (j=0; j<=23; ++j) {
+                               sprintf(&purger[strlen(purger)], "<OPTION %s VALUE=\"%d\">%d:00%s</OPTION>\n",
+                                       ((atoi(buf) == j) ? "SELECTED" : ""),
+                                       j,
+                                       ((j == 0) ? 12 : ((j>12) ? j-12 : j)),
+                                       ((j >= 12) ? "pm" : "am")
+                               );
+                       }
+                       sprintf(&purger[strlen(purger)], "</SELECT>");
+                       sprintf(&purger[strlen(purger)], "</TD></TR>\n");
+                       break;
+               case 32:
+                       sprintf(&directory[strlen(directory)], "<TR><TD>");
+                       sprintf(&directory[strlen(directory)], _("Host name of LDAP server (blank to disable)"));
+                       sprintf(&directory[strlen(directory)], "</TD><TD>");
+                       sprintf(&directory[strlen(directory)], "<input type=\"text\" NAME=\"c_ldap_host\" MAXLENGTH=\"127\" VALUE=\"%s\">", buf);
+                       sprintf(&directory[strlen(directory)], "</TD></TR>\n");
+                       break;
+               case 33:
+                       sprintf(&directory[strlen(directory)], "<TR><TD>");
+                       sprintf(&directory[strlen(directory)], _("Port number of LDAP server (blank to disable)"));
+                       sprintf(&directory[strlen(directory)], "</TD><TD>");
+                       sprintf(&directory[strlen(directory)], "<input type=\"text\" NAME=\"c_ldap_port\" MAXLENGTH=\"127\" VALUE=\"%d\">", atoi(buf));
+                       sprintf(&directory[strlen(directory)], "</TD></TR>\n");
+                       break;
+               case 34:
+                       sprintf(&directory[strlen(directory)], "<TR><TD>");
+                       sprintf(&directory[strlen(directory)], _("Base DN"));
+                       sprintf(&directory[strlen(directory)], "</TD><TD>");
+                       sprintf(&directory[strlen(directory)], "<input type=\"text\" NAME=\"c_ldap_base_dn\" MAXLENGTH=\"255\" VALUE=\"%s\">", buf);
+                       sprintf(&directory[strlen(directory)], "</TD></TR>\n");
+                       break;
+               case 35:
+                       sprintf(&directory[strlen(directory)], "<TR><TD>");
+                       sprintf(&directory[strlen(directory)], _("Bind DN"));
+                       sprintf(&directory[strlen(directory)], "</TD><TD>");
+                       sprintf(&directory[strlen(directory)], "<input type=\"text\" NAME=\"c_ldap_bind_dn\" MAXLENGTH=\"255\" VALUE=\"%s\">", buf);
+                       sprintf(&directory[strlen(directory)], "</TD></TR>\n");
+                       break;
+               case 36:
+                       sprintf(&directory[strlen(directory)], "<TR><TD>");
+                       sprintf(&directory[strlen(directory)], _("Password for bind DN"));
+                       sprintf(&directory[strlen(directory)], "</TD><TD>");
+                       sprintf(&directory[strlen(directory)], "<input type=\"password\" NAME=\"c_ldap_bind_pw\" MAXLENGTH=\"255\" VALUE=\"%s\">",
+                               buf);
+                       sprintf(&directory[strlen(directory)], "</TD></TR>\n");
+                       break;
+               case 37:
+                       sprintf(&network[strlen(network)], "<TR><TD>");
+                       sprintf(&network[strlen(network)], _("Server IP address (0.0.0.0 for 'any')"));
+                       sprintf(&network[strlen(network)], "</TD><TD>");
+                       sprintf(&network[strlen(network)], "<input type=\"text\" NAME=\"c_ip_addr\" MAXLENGTH=\"15\" VALUE=\"%s\">", buf);
+                       sprintf(&network[strlen(network)], "</TD></TR>\n");
+                       break;
+               case 38:
+                       sprintf(&network[strlen(network)], "<TR><TD>");
+                       sprintf(&network[strlen(network)], _("SMTP MSA port (-1 to disable)"));
+                       sprintf(&network[strlen(network)], "</TD><TD>");
+                       sprintf(&network[strlen(network)], "<input type=\"text\" NAME=\"c_msa_port\" MAXLENGTH=\"5\" VALUE=\"%s\">", buf);
+                       sprintf(&network[strlen(network)], "</TD></TR>\n");
+                       break;
+               case 39:
+                       sprintf(&network[strlen(network)], "<TR><TD>");
+                       sprintf(&network[strlen(network)], _("IMAP over SSL port (-1 to disable)"));
+                       sprintf(&network[strlen(network)], "</TD><TD>");
+                       sprintf(&network[strlen(network)], "<input type=\"text\" NAME=\"c_imaps_port\" MAXLENGTH=\"5\" VALUE=\"%s\">", buf);
+                       sprintf(&network[strlen(network)], "</TD></TR>\n");
+                       break;
+               case 40:
+                       sprintf(&network[strlen(network)], "<TR><TD>");
+                       sprintf(&network[strlen(network)], _("POP3 over SSL port (-1 to disable)"));
+                       sprintf(&network[strlen(network)], "</TD><TD>");
+                       sprintf(&network[strlen(network)], "<input type=\"text\" NAME=\"c_pop3s_port\" MAXLENGTH=\"5\" VALUE=\"%s\">", buf);
+                       sprintf(&network[strlen(network)], "</TD></TR>\n");
+                       break;
+               case 41:
+                       sprintf(&network[strlen(network)], "<TR><TD>");
+                       sprintf(&network[strlen(network)], _("SMTP over SSL port (-1 to disable)"));
+                       sprintf(&network[strlen(network)], "</TD><TD>");
+                       sprintf(&network[strlen(network)], "<input type=\"text\" NAME=\"c_smtps_port\" MAXLENGTH=\"5\" VALUE=\"%s\">", buf);
+                       sprintf(&network[strlen(network)], "</TD></TR>\n");
+                       break;
+               case 42:
+                               sprintf(&idxjnl[strlen(idxjnl)], "<TR><TD>");
+                               sprintf(&idxjnl[strlen(idxjnl)], _("Enable full text index"));
+                               sprintf(&idxjnl[strlen(idxjnl)], "</TD><TD>");
+                               sprintf(&idxjnl[strlen(idxjnl)], "<input type=\"checkbox\" NAME=\"c_enable_fulltext\" VALUE=\"yes\" %s>",
+                                       ((atoi(buf) != 0) ? "CHECKED" : ""));
+                               sprintf(&idxjnl[strlen(idxjnl)], "</TD></TR>\n");
+                       break;
+               case 43:
+                       sprintf(&tuning[strlen(tuning)], "<TR><TD>");
+                       sprintf(&tuning[strlen(tuning)], _("Automatically delete committed database logs"));
+                       sprintf(&tuning[strlen(tuning)], "</TD><TD>");
+                       sprintf(&tuning[strlen(tuning)], "<input type=\"checkbox\" NAME=\"c_auto_cull\" VALUE=\"yes\" %s>",
+                               ((atoi(buf) != 0) ? "CHECKED" : ""));
+                       sprintf(&tuning[strlen(tuning)], "</TD></TR>\n");
+                       break;
+               case 44:
+                       sprintf(&network[strlen(network)], "<TR><TD>");
+                       sprintf(&network[strlen(network)], _("Instantly expunge deleted messages in IMAP"));
+                       sprintf(&network[strlen(network)], "</TD><TD>");
+                       sprintf(&network[strlen(network)], "<input type=\"checkbox\" NAME=\"c_instant_expunge\" VALUE=\"yes\" %s>",
+                               ((atoi(buf) != 0) ? "CHECKED" : ""));
+                       sprintf(&network[strlen(network)], "</TD></TR>\n");
+                       break;
+               case 45:
+                       sprintf(&network[strlen(network)], "<TR><TD>");
+                       sprintf(&network[strlen(network)], _("Allow unauthenticated SMTP clients to spoof this site's domains"));
+                       sprintf(&network[strlen(network)], "</TD><TD>");
+                       sprintf(&network[strlen(network)], "<input type=\"checkbox\" NAME=\"c_allow_spoofing\" VALUE=\"yes\" %s>",
+                               ((atoi(buf) != 0) ? "CHECKED" : ""));
+                       sprintf(&network[strlen(network)], "</TD></TR>\n");
+                       break;
+               case 46:
+                       sprintf(&idxjnl[strlen(idxjnl)], "<TR><TD>");
+                       sprintf(&idxjnl[strlen(idxjnl)], _("Perform journaling of email messages"));
+                       sprintf(&idxjnl[strlen(idxjnl)], "</TD><TD>");
+                       sprintf(&idxjnl[strlen(idxjnl)], "<input type=\"checkbox\" NAME=\"c_journal_email\" VALUE=\"yes\" %s>",
+                               ((atoi(buf) != 0) ? "CHECKED" : ""));
+                       sprintf(&idxjnl[strlen(idxjnl)], "</TD></TR>\n");
+                       break;
+               case 47:
+                       sprintf(&idxjnl[strlen(idxjnl)], "<TR><TD>");
+                       sprintf(&idxjnl[strlen(idxjnl)], _("Perform journaling of non-email messages"));
+                       sprintf(&idxjnl[strlen(idxjnl)], "</TD><TD>");
+                       sprintf(&idxjnl[strlen(idxjnl)], "<input type=\"checkbox\" NAME=\"c_journal_pubmsgs\" VALUE=\"yes\" %s>",
+                               ((atoi(buf) != 0) ? "CHECKED" : ""));
+                       sprintf(&idxjnl[strlen(idxjnl)], "</TD></TR>\n");
+                       break;
+               case 48:
+                       sprintf(&idxjnl[strlen(idxjnl)], "<TR><TD>");
+                       sprintf(&idxjnl[strlen(idxjnl)], _("Email destination of journalized messages"));
+                       sprintf(&idxjnl[strlen(idxjnl)], "</TD><TD>");
+                       sprintf(&idxjnl[strlen(idxjnl)], "<input type=\"text\" NAME=\"c_journal_dest\" MAXLENGTH=\"127\" VALUE=\"%s\">", buf);
+                       sprintf(&idxjnl[strlen(idxjnl)], "</TD></TR>\n");
+                       break;
+               }
+       }
+
+       serv_puts("GPEX site");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '2') {
+               sitepolicy = extract_int(&buf[4], 0);
+               sitevalue = extract_int(&buf[4], 1);
+       }
+
+       serv_puts("GPEX mailboxes");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '2') {
+               mboxpolicy = extract_int(&buf[4], 0);
+               mboxvalue = extract_int(&buf[4], 1);
+       }
+
+
+       sprintf(&purger[strlen(purger)], "<TR><TD COLSPAN=2><hr /></TD></TR>\n");
+
+       sprintf(&purger[strlen(purger)], "<TR><TD>");
+       sprintf(&purger[strlen(purger)], _("Default message expire policy for public rooms"));
+       sprintf(&purger[strlen(purger)], "</TD><TD>");
+       sprintf(&purger[strlen(purger)], "<input type=\"radio\" NAME=\"sitepolicy\" VALUE=\"1\" %s>",
+               ((sitepolicy == 1) ? "CHECKED" : "") );
+       sprintf(&purger[strlen(purger)], _("Never automatically expire messages"));
+       sprintf(&purger[strlen(purger)], "<br />\n");
+       sprintf(&purger[strlen(purger)], "<input type=\"radio\" NAME=\"sitepolicy\" VALUE=\"2\" %s>",
+               ((sitepolicy == 2) ? "CHECKED" : "") );
+       sprintf(&purger[strlen(purger)], _("Expire by message count"));
+       sprintf(&purger[strlen(purger)], "<br />\n");
+       sprintf(&purger[strlen(purger)], "<input type=\"radio\" NAME=\"sitepolicy\" VALUE=\"3\" %s>",
+               ((sitepolicy == 3) ? "CHECKED" : "") );
+       sprintf(&purger[strlen(purger)], _("Expire by message age"));
+       sprintf(&purger[strlen(purger)], "<br />");
+       sprintf(&purger[strlen(purger)], _("Number of messages or days: "));
+       sprintf(&purger[strlen(purger)], "<input type=\"text\" NAME=\"sitevalue\" MAXLENGTH=\"5\" VALUE=\"%d\">", sitevalue);
+       sprintf(&purger[strlen(purger)], "</TD></TR>\n");
+
+       sprintf(&purger[strlen(purger)], "<TR><TD COLSPAN=2><hr /></TD></TR>\n");
+
+       sprintf(&purger[strlen(purger)], "<TR><TD>");
+       sprintf(&purger[strlen(purger)], _("Default message expire policy for private mailboxes"));
+       sprintf(&purger[strlen(purger)], "</TD><TD>");
+       sprintf(&purger[strlen(purger)], "<input type=\"radio\" NAME=\"mboxpolicy\" VALUE=\"0\" %s>",
+               ((mboxpolicy == 0) ? "CHECKED" : "") );
+       sprintf(&purger[strlen(purger)], _("Same policy as public rooms"));
+       sprintf(&purger[strlen(purger)], "<br />\n");
+       sprintf(&purger[strlen(purger)], "<input type=\"radio\" NAME=\"mboxpolicy\" VALUE=\"1\" %s>",
+                       ((mboxpolicy == 1) ? "CHECKED" : "") );
+       sprintf(&purger[strlen(purger)], _("Never automatically expire messages"));
+       sprintf(&purger[strlen(purger)], "<br />\n");
+       sprintf(&purger[strlen(purger)], "<input type=\"radio\" NAME=\"mboxpolicy\" VALUE=\"2\" %s>",
+               ((mboxpolicy == 2) ? "CHECKED" : "") );
+       sprintf(&purger[strlen(purger)], _("Expire by message count"));
+       sprintf(&purger[strlen(purger)], "<br />\n");
+       sprintf(&purger[strlen(purger)], "<input type=\"radio\" NAME=\"mboxpolicy\" VALUE=\"3\" %s>",
+               ((mboxpolicy == 3) ? "CHECKED" : "") );
+       sprintf(&purger[strlen(purger)], _("Expire by message age"));
+       sprintf(&purger[strlen(purger)], "<br />");
+       sprintf(&purger[strlen(purger)], _("Number of messages or days: "));
+       sprintf(&purger[strlen(purger)], "<input type=\"text\" NAME=\"mboxvalue\" MAXLENGTH=\"5\" VALUE=\"%d\">", mboxvalue);
+       sprintf(&purger[strlen(purger)], "</TD></TR>\n");
+
+       sprintf(&purger[strlen(purger)], "<TR><TD COLSPAN=2><hr /></TD></TR>\n");
+
+
+       sprintf(&general[strlen(general)], "</table>");
+       sprintf(&access[strlen(access)], "</table>");
+       sprintf(&network[strlen(network)], "</table>");
+       sprintf(&tuning[strlen(tuning)], "</table>");
+       sprintf(&directory[strlen(directory)], "</table>");
+       sprintf(&purger[strlen(purger)], "</table>");
+       sprintf(&idxjnl[strlen(idxjnl)], "</table>");
+
+       tabbed_dialog(7, tabnames);
+
+       begin_tab(0, 7);        wprintf("%s", general);          end_tab(0, 7);
+       begin_tab(1, 7);        wprintf("%s", access);           end_tab(1, 7);
+       begin_tab(2, 7);        wprintf("%s", network);          end_tab(2, 7);
+       begin_tab(3, 7);        wprintf("%s", tuning);           end_tab(3, 7);
+       begin_tab(4, 7);        wprintf("%s", directory);        end_tab(4, 7);
+       begin_tab(5, 7);        wprintf("%s", purger);           end_tab(5, 7);
+       begin_tab(6, 7);        wprintf("%s", idxjnl);   end_tab(6, 7);
+
+       wprintf("<div align=\"center\"><br>");
+       wprintf("<input type=\"submit\" NAME=\"ok_button\" VALUE=\"%s\">", _("Save changes"));
+       wprintf("&nbsp;");
+       wprintf("<input type=\"submit\" NAME=\"cancel_button\" VALUE=\"%s\">\n", _("Cancel"));
+       wprintf("</div></FORM>\n");
+       wprintf("</td></tr></table></div>\n");
+       wDumpContent(1);
+}
+
+/**
+ * parse siteconfig changes 
+ */
+void siteconfig(void)
+{
+       char buf[256];
+
+       if (strlen(bstr("ok_button")) == 0) {
+               display_aide_menu();
+               return;
+       }
+       serv_printf("CONF set");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '4') {
+               safestrncpy(WC->ImportantMessage, &buf[4], sizeof WC->ImportantMessage);
+               display_aide_menu();
+               return;
+       }
+       serv_printf("%s", bstr("c_nodename"));
+       serv_printf("%s", bstr("c_fqdn"));
+       serv_printf("%s", bstr("c_humannode"));
+       serv_printf("%s", bstr("c_phonenum"));
+       serv_printf("%s", ((!strcasecmp(bstr("c_creataide"), "yes") ? "1" : "0")));
+       serv_printf("%s", bstr("c_sleeping"));
+       serv_printf("%s", bstr("c_initax"));
+       serv_printf("%s", ((!strcasecmp(bstr("c_regiscall"), "yes") ? "1" : "0")));
+       serv_printf("%s", ((!strcasecmp(bstr("c_twitdetect"), "yes") ? "1" : "0")));
+       serv_printf("%s", bstr("c_twitroom"));
+       serv_printf("%s", bstr("c_moreprompt"));
+       serv_printf("%s", ((!strcasecmp(bstr("c_restrict"), "yes") ? "1" : "0")));
+       serv_printf("%s", bstr("c_bbs_city"));
+       serv_printf("%s", bstr("c_sysadm"));
+       serv_printf("%s", bstr("c_maxsessions"));
+       serv_printf("");  /* placeholder - this field is not in use */
+       serv_printf("%s", bstr("c_userpurge"));
+       serv_printf("%s", bstr("c_roompurge"));
+       serv_printf("%s", bstr("c_logpages"));
+       serv_printf("%s", bstr("c_createax"));
+       serv_printf("%s", bstr("c_maxmsglen"));
+       serv_printf("%s", bstr("c_min_workers"));
+       serv_printf("%s", bstr("c_max_workers"));
+       serv_printf("%s", bstr("c_pop3_port"));
+       serv_printf("%s", bstr("c_smtp_port"));
+       serv_printf("%s", ((!strcasecmp(bstr("c_rfc822_strict_from"), "yes") ? "0" : "1"))); /* note: reverse bool */
+       serv_printf("%s", ((!strcasecmp(bstr("c_aide_zap"), "yes") ? "1" : "0")));
+       serv_printf("%s", bstr("c_imap_port"));
+       serv_printf("%s", bstr("c_net_freq"));
+       serv_printf("%s", ((!strcasecmp(bstr("c_disable_newu"), "yes") ? "1" : "0")));
+       serv_printf("1"); /* placeholder - this field is not in use */
+       serv_printf("%s", bstr("c_purge_hour"));
+       serv_printf("%s", bstr("c_ldap_host"));
+       serv_printf("%s", bstr("c_ldap_port"));
+       serv_printf("%s", bstr("c_ldap_base_dn"));
+       serv_printf("%s", bstr("c_ldap_bind_dn"));
+       serv_printf("%s", bstr("c_ldap_bind_pw"));
+       serv_printf("%s", bstr("c_ip_addr"));
+       serv_printf("%s", bstr("c_msa_port"));
+       serv_printf("%s", bstr("c_imaps_port"));
+       serv_printf("%s", bstr("c_pop3s_port"));
+       serv_printf("%s", bstr("c_smtps_port"));
+       serv_printf("%s", ((!strcasecmp(bstr("c_enable_fulltext"), "yes") ? "1" : "0")));
+       serv_printf("%s", ((!strcasecmp(bstr("c_auto_cull"), "yes") ? "1" : "0")));
+       serv_printf("%s", ((!strcasecmp(bstr("c_instant_expunge"), "yes") ? "1" : "0")));
+       serv_printf("%s", ((!strcasecmp(bstr("c_allow_spoofing"), "yes") ? "1" : "0")));
+       serv_printf("%s", ((!strcasecmp(bstr("c_journal_email"), "yes") ? "1" : "0")));
+       serv_printf("%s", ((!strcasecmp(bstr("c_journal_pubmsgs"), "yes") ? "1" : "0")));
+       serv_printf("%s", bstr("c_journal_dest"));
+       serv_printf("000");
+
+       serv_printf("SPEX site|%d|%d", atoi(bstr("sitepolicy")), atoi(bstr("sitevalue")));
+       serv_getln(buf, sizeof buf);
+       serv_printf("SPEX mailboxes|%d|%d", atoi(bstr("mboxpolicy")), atoi(bstr("mboxvalue")));
+       serv_getln(buf, sizeof buf);
+
+       safestrncpy(WC->ImportantMessage, _("Your system configuration has been updated."),
+               sizeof WC->ImportantMessage);
+       display_aide_menu();
+}
+
+
+/*@}*/
diff --git a/webcit/snprintf.c b/webcit/snprintf.c
new file mode 100644 (file)
index 0000000..66e9701
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * $Id$
+ */
+/** 
+ * \defgroup SnprintfReplacement modified from Sten Gunterberg's BUGTRAQ post of 22 Jul 1997
+ * --nathan bryant <bryant@cs.usm.maine.edu>
+ * \ingroup tools
+ */
+/*@{*/
+/**
+ * \brief Replacements for snprintf() and vsnprintf()
+ *
+ * Use it only if you have the "spare" cycles needed to effectively
+ * do every snprintf operation twice! Why is that? Because everything
+ * is first vfprintf()'d to /dev/null to determine the number of bytes.
+ * Perhaps a bit slow for demanding applications on slow machines,
+ * no problem for a fast machine with some spare cycles.
+ *
+ * You don't have a /dev/null? Every Linux contains one for free!
+ *
+ * Because the format string is never even looked at, all current and
+ * possible future printf-conversions should be handled just fine.
+ *
+ * Written July 1997 by Sten Gunterberg (gunterberg@ergon.ch)
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+
+/**
+ * \brief is it needed????
+ * \param fmt the formatstring?
+ * \param argp how many params?
+ */
+static int needed(const char *fmt, va_list argp)
+{
+       static FILE *sink = NULL;
+
+       /**
+        * ok, there's a small race here that could result in the sink being
+        * opened more than once if we're threaded, but I'd rather ignore it than
+        * spend cycles synchronizing :-) */
+
+       if (sink == NULL) {
+               if ((sink = fopen("/dev/null", "w")) == NULL) {
+                       perror("/dev/null");
+                       exit(1);
+               }
+       }
+       return vfprintf(sink, fmt, argp);
+}
+
+/**
+ * \brief vsnprintf wrapper
+ * \param buf the output charbuffer
+ * \param max maximal size of the buffer
+ * \param fmt the formatstring (see man printf)
+ * \param argp the variable argument list 
+ */
+int vsnprintf(char *buf, size_t max, const char *fmt, va_list argp)
+{
+       char *p;
+       int size;
+
+       if ((p = malloc(needed(fmt, argp) + 1)) == NULL) {
+               lprintf(1, "vsnprintf: malloc failed, aborting\n");
+               abort();
+       }
+       if ((size = vsprintf(p, fmt, argp)) >= max)
+               size = -1;
+
+       strncpy(buf, p, max);
+       buf[max - 1] = 0;
+       free(p);
+       return size;
+}
+
+/**
+ * \brief snprintf wrapper
+ * \param buf the output charbuffer
+ * \param max maximal size of the buffer
+ * \param fmt the formatstring (see man printf)
+ * \param ... the variable argument list 
+ */
+int snprintf(char *buf, size_t max, const char *fmt,...)
+{
+       va_list argp;
+       int bytes;
+
+       va_start(argp, fmt);
+       bytes = vsnprintf(buf, max, fmt, argp);
+       va_end(argp);
+
+       return bytes;
+}
+
+
+
+/*@}*/
diff --git a/webcit/static/BubbleTooltips.js b/webcit/static/BubbleTooltips.js
new file mode 100644 (file)
index 0000000..74a174d
--- /dev/null
@@ -0,0 +1,126 @@
+/*
+ * JavaScript code to create "bubble tooltips"
+ * 
+ * Copyright (C) 2006 Alessandro Fulciniti [http://web-graphics.com]
+ * Copyright (C) 2006 Art Cancro [http://www.citadel.org]
+ *
+ * The original version of this module was released into the public
+ * domain.  This version is distributed as part of the Citadel system
+ * under the terms of the GNU General Public License v2.
+ *
+ */
+
+function btt_enableTooltips(id)
+{
+       var links, i, h;
+       if (!document.getElementById || !document.getElementsByTagName) {
+               return;
+       }
+       btt_AddCss();
+       h = document.createElement("span");
+       h.id = "btc";
+       h.setAttribute("id", "btc");
+       h.style.position = "absolute";
+       document.getElementsByTagName("body")[0].appendChild(h);
+       if (id == null) {
+               links = document.getElementsByTagName("a");
+       }
+       else {
+               links = document.getElementById(id).getElementsByTagName("a");
+       }
+       for (i = 0; i < links.length; i++) {
+               btt_Prepare(links[i]);
+       }
+}
+
+function btt_Prepare(el)
+{
+       var tooltip, b, s, l, ih;
+       ih = el.getAttribute("btt_tooltext");
+       if (!ih) {
+               return;
+       }
+       el.removeAttribute("btt_tooltext");
+       el.removeAttribute("title");
+       tooltip = btt_CreateEl("span", "tooltip");
+       s = btt_CreateEl("span", "top");
+       s.appendChild(document.createTextNode(""));
+       s.innerHTML = ih;
+       tooltip.appendChild(s);
+       b = btt_CreateEl("b", "bottom");
+       tooltip.appendChild(b);
+       btt_setOpacity(tooltip);
+       el.tooltip = tooltip;
+       el.onmouseover = btt_showTooltip;
+       el.onmouseout = btt_hideTooltip;
+       el.onmousemove = btt_Locate;
+}
+
+function btt_showTooltip(e)
+{
+       document.getElementById("btc").appendChild(this.tooltip);
+       btt_Locate(e);
+}
+
+function btt_hideTooltip(e)
+{
+       var d = document.getElementById("btc");
+       if (d.childNodes.length > 0) {
+               d.removeChild(d.firstChild);
+       }
+}
+
+function btt_setOpacity(el)
+{
+       el.style.filter = "alpha(opacity:95)";
+       el.style.KHTMLOpacity = "0.95";
+       el.style.MozOpacity = "0.95";
+       el.style.opacity = "0.95";
+}
+
+function btt_CreateEl(t, c)
+{
+       var x = document.createElement(t);
+       x.className = c;
+       x.style.display = "block";
+       return (x);
+}
+
+function btt_AddCss()
+{
+       var l = btt_CreateEl("link");
+       l.setAttribute("type", "text/css");
+       l.setAttribute("rel", "stylesheet");
+       l.setAttribute("href", "static/bt.css");
+       l.setAttribute("media", "screen");
+       document.getElementsByTagName("head")[0].appendChild(l);
+}
+
+function btt_Locate(e)
+{
+       var posx = 0, posy = 0;
+       if (e == null) {
+               e = window.event;
+       }
+       if (e.pageX || e.pageY) {
+               posx = e.pageX;
+               posy = e.pageY;
+       }
+       
+       else if (e.clientX || e.clientY) {
+               if (document.documentElement.scrollTop) {
+                       posx =
+                           e.clientX +
+                           document.documentElement.scrollLeft;
+                       posy =
+                           e.clientY + document.documentElement.scrollTop;
+               }
+               
+               else {
+                       posx = e.clientX + document.body.scrollLeft;
+                       posy = e.clientY + document.body.scrollTop;
+               }
+       }
+       document.getElementById("btc").style.top = (posy + 10) + "px";
+       document.getElementById("btc").style.left = (posx - 260) + "px";
+}
diff --git a/webcit/static/activeuser_24x.gif b/webcit/static/activeuser_24x.gif
new file mode 100644 (file)
index 0000000..6ec913f
Binary files /dev/null and b/webcit/static/activeuser_24x.gif differ
diff --git a/webcit/static/addevent_24x.gif b/webcit/static/addevent_24x.gif
new file mode 100644 (file)
index 0000000..d6b34bd
Binary files /dev/null and b/webcit/static/addevent_24x.gif differ
diff --git a/webcit/static/addnewcontact_24x.gif b/webcit/static/addnewcontact_24x.gif
new file mode 100644 (file)
index 0000000..f636492
Binary files /dev/null and b/webcit/static/addnewcontact_24x.gif differ
diff --git a/webcit/static/advanpage2_32x.gif b/webcit/static/advanpage2_32x.gif
new file mode 100644 (file)
index 0000000..667dec7
Binary files /dev/null and b/webcit/static/advanpage2_32x.gif differ
diff --git a/webcit/static/advanpage2_48x.gif b/webcit/static/advanpage2_48x.gif
new file mode 100644 (file)
index 0000000..6ba92ed
Binary files /dev/null and b/webcit/static/advanpage2_48x.gif differ
diff --git a/webcit/static/beginbox.html b/webcit/static/beginbox.html
new file mode 100644 (file)
index 0000000..0cb7c64
--- /dev/null
@@ -0,0 +1,6 @@
+<! start beginbox.html>
+<table border=1 cellspacing=0 cellpadding=0 width=100%><tr><td>
+<table border=0 cellspacing=0 cellpadding=3 width=100%>
+<tr bgcolor="#000088"><td align=center><span class="boxlabel"><?BOXTITLE></span></td></tr>
+<tr bgcolor="#FFFFFF"><td>
+<! end beginbox.html>
diff --git a/webcit/static/beginbox_nt.html b/webcit/static/beginbox_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/bgcolor.gif b/webcit/static/bgcolor.gif
new file mode 100644 (file)
index 0000000..55fcf1b
Binary files /dev/null and b/webcit/static/bgcolor.gif differ
diff --git a/webcit/static/blackdot.gif b/webcit/static/blackdot.gif
new file mode 100644 (file)
index 0000000..f79319f
Binary files /dev/null and b/webcit/static/blackdot.gif differ
diff --git a/webcit/static/blank.gif b/webcit/static/blank.gif
new file mode 100644 (file)
index 0000000..4bcc753
Binary files /dev/null and b/webcit/static/blank.gif differ
diff --git a/webcit/static/body-background.gif b/webcit/static/body-background.gif
new file mode 100644 (file)
index 0000000..e69942e
Binary files /dev/null and b/webcit/static/body-background.gif differ
diff --git a/webcit/static/bold.gif b/webcit/static/bold.gif
new file mode 100644 (file)
index 0000000..bdb3259
Binary files /dev/null and b/webcit/static/bold.gif differ
diff --git a/webcit/static/bt.css b/webcit/static/bt.css
new file mode 100644 (file)
index 0000000..1759de0
--- /dev/null
@@ -0,0 +1,18 @@
+.tooltip {\r
+       width: 300px;\r
+       color: #000;\r
+       font:lighter 11px/1.3 sans-serif;\r
+       text-decoration:none;\r
+       text-align:left;\r
+}\r
+\r
+.tooltip span.top {\r
+       padding: 30px 8px 0;\r
+       background: url(bt.gif) no-repeat top\r
+}\r
+\r
+.tooltip b.bottom {\r
+       padding:3px 8px 15px;\r
+       color: #548912;\r
+       background: url(bt.gif) no-repeat bottom\r
+}\r
diff --git a/webcit/static/bt.gif b/webcit/static/bt.gif
new file mode 100644 (file)
index 0000000..6670c48
Binary files /dev/null and b/webcit/static/bt.gif differ
diff --git a/webcit/static/calarea_16x.gif b/webcit/static/calarea_16x.gif
new file mode 100644 (file)
index 0000000..ec469b7
Binary files /dev/null and b/webcit/static/calarea_16x.gif differ
diff --git a/webcit/static/calarea_32x.gif b/webcit/static/calarea_32x.gif
new file mode 100644 (file)
index 0000000..67d1e78
Binary files /dev/null and b/webcit/static/calarea_32x.gif differ
diff --git a/webcit/static/calarea_48x.gif b/webcit/static/calarea_48x.gif
new file mode 100644 (file)
index 0000000..fbb8fcc
Binary files /dev/null and b/webcit/static/calarea_48x.gif differ
diff --git a/webcit/static/centre.gif b/webcit/static/centre.gif
new file mode 100644 (file)
index 0000000..f98c86a
Binary files /dev/null and b/webcit/static/centre.gif differ
diff --git a/webcit/static/chatframeset.html b/webcit/static/chatframeset.html
new file mode 100644 (file)
index 0000000..935d79e
--- /dev/null
@@ -0,0 +1,27 @@
+<html>
+<head>
+<title>Real-time chat: <?ROOMNAME></title>
+</head>
+
+<frameset rows="*, 1, 70" framespacing="0" border="false" frameborder="0">
+
+       <frame name="chat_transcript" src="about:blank" scrolling="yes">
+       </frame>
+
+       <frame name="chat_recv" src="chat_recv" scrolling="no">
+       </frame>
+
+       <frame name="chat_send" src="chat_send" scrolling="no">
+       </frame>
+
+</frameset>
+
+<body bgcolor="#ffffff" link="#ff0000">
+<noframes>
+<div align="center">
+This function requires a browser that can support frames.
+</div>
+</noframes>
+</body>
+
+</html>
diff --git a/webcit/static/chatrooms_16x.gif b/webcit/static/chatrooms_16x.gif
new file mode 100644 (file)
index 0000000..7c95338
Binary files /dev/null and b/webcit/static/chatrooms_16x.gif differ
diff --git a/webcit/static/chatrooms_32x.gif b/webcit/static/chatrooms_32x.gif
new file mode 100644 (file)
index 0000000..8c0fb0c
Binary files /dev/null and b/webcit/static/chatrooms_32x.gif differ
diff --git a/webcit/static/chatrooms_48x.gif b/webcit/static/chatrooms_48x.gif
new file mode 100644 (file)
index 0000000..2d42ae2
Binary files /dev/null and b/webcit/static/chatrooms_48x.gif differ
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/citadelchat_16x.gif b/webcit/static/citadelchat_16x.gif
new file mode 100644 (file)
index 0000000..02fd9d3
Binary files /dev/null and b/webcit/static/citadelchat_16x.gif differ
diff --git a/webcit/static/citadelchat_24x.gif b/webcit/static/citadelchat_24x.gif
new file mode 100644 (file)
index 0000000..64d27b8
Binary files /dev/null and b/webcit/static/citadelchat_24x.gif differ
diff --git a/webcit/static/citadelchat_32x.gif b/webcit/static/citadelchat_32x.gif
new file mode 100644 (file)
index 0000000..0212d87
Binary files /dev/null and b/webcit/static/citadelchat_32x.gif differ
diff --git a/webcit/static/citadelchat_48x.gif b/webcit/static/citadelchat_48x.gif
new file mode 100644 (file)
index 0000000..fe4770f
Binary files /dev/null and b/webcit/static/citadelchat_48x.gif differ
diff --git a/webcit/static/controls.js b/webcit/static/controls.js
new file mode 100644 (file)
index 0000000..43cdb3e
--- /dev/null
@@ -0,0 +1,699 @@
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//           (c) 2005 Ivan Krstic (http://blogs.law.harvard.edu/ivan)
+//           (c) 2005 Jon Tirsen (http://www.tirsen.com)
+// Contributors:
+//  Richard Livsey
+//  Rahul Bhargava
+// 
+// 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.
+
+// 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.
+
+var Autocompleter = {}
+Autocompleter.Base = function() {};
+Autocompleter.Base.prototype = {
+  baseInitialize: function(element, update, options) {
+    this.element     = $(element); 
+    this.update      = $(update);  
+    this.hasFocus    = false; 
+    this.changed     = false; 
+    this.active      = false; 
+    this.index       = 0;     
+    this.entryCount  = 0;
+
+    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});
+      }
+      new 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);
+
+    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, "keypress", this.onKeyPress.bindAsEventListener(this));
+  },
+
+  show: function() {
+    if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update);
+    if(!this.iefix && (navigator.appVersion.indexOf('MSIE')>0) && (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) {
+      Position.clone(this.update, this.iefix);
+      this.iefix.style.zIndex = 1;
+      this.update.style.zIndex = 2;
+      Element.show(this.iefix);
+    }
+  },
+
+  hide: function() {
+    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();
+         if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
+         return;
+       case Event.KEY_DOWN:
+         this.markNext();
+         this.render();
+         if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
+         return;
+      }
+     else 
+      if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN) 
+        return;
+
+    this.changed = true;
+    this.hasFocus = true;
+
+    if(this.observer) clearTimeout(this.observer);
+      this.observer = 
+        setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000);
+  },
+
+  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.hide();
+  },
+  
+  markPrevious: function() {
+    if(this.index > 0) this.index--
+      else this.index = this.entryCcount-1;
+  },
+  
+  markNext: function() {
+    if(this.index < this.entryCount-1) this.index++
+      else this.index = 0;
+  },
+  
+  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 = Element.collectTextNodesIgnoreClass(selectedElement, 'informal');
+    var lastTokenPos = this.findLastToken();
+    if (lastTokenPos != -1) {
+      var newValue = this.element.value.substr(0, lastTokenPos + 1);
+      var whitespace = this.element.value.substr(lastTokenPos + 1).match(/^\s+/);
+      if (whitespace)
+        newValue += whitespace[0];
+      this.element.value = newValue + value;
+    } else {
+      this.element.value = value;
+    }
+    this.element.focus(); 
+  },
+
+  updateChoices: function(choices) {
+    if(!this.changed && this.hasFocus) {
+      this.update.innerHTML = choices;
+      Element.cleanWhitespace(this.update);
+      Element.cleanWhitespace(this.update.firstChild);
+
+      if(this.update.firstChild && this.update.firstChild.childNodes) {
+        this.entryCount = 
+          this.update.firstChild.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;
+      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;   
+    if(this.getToken().length>=this.options.minChars) {
+      this.startIndicator();
+      this.getUpdatedChoices();
+    } else {
+      this.active = false;
+      this.hide();
+    }
+  },
+
+  getToken: function() {
+    var tokenPos = this.findLastToken();
+    if (tokenPos != -1)
+      var ret = this.element.value.substr(tokenPos + 1).replace(/^\s+/,'').replace(/\s+$/,'');
+    else
+      var ret = this.element.value;
+
+    return /\n/.test(ret) ? '' : ret;
+  },
+
+  findLastToken: function() {
+    var lastTokenPos = -1;
+
+    for (var i=0; i<this.options.tokens.length; i++) {
+      var thisTokenPos = this.element.value.lastIndexOf(this.options.tokens[i]);
+      if (thisTokenPos > lastTokenPos)
+        lastTokenPos = thisTokenPos;
+    }
+    return lastTokenPos;
+  }
+}
+
+Ajax.Autocompleter = Class.create();
+Object.extend(Object.extend(Ajax.Autocompleter.prototype, Autocompleter.Base.prototype), {
+  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() {
+    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.Local.prototype = Object.extend(new 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
+//
+// The constructor takes three parameters. The first is the element
+// that should support in-place editing. The second is the url to submit
+// the changed value to. The server should respond with the updated
+// value (the server might have post-processed it or validation might
+// have prevented it from changing). The third is a hash of options.
+//
+// Supported options are (all are optional and have sensible defaults):
+// - okText - The text of the submit button that submits the changed value
+//            to the server (default: "ok")
+// - cancelText - The text of the link that cancels editing (default: "cancel")
+// - savingText - The text being displayed as the AJAX engine communicates
+//                with the server (default: "Saving...")
+// - formId - The id given to the <form> element
+//            (default: the id of the element to edit plus '-inplaceeditor')
+
+Ajax.InPlaceEditor = Class.create();
+Ajax.InPlaceEditor.defaultHighlightColor = "#FFFF99";
+Ajax.InPlaceEditor.prototype = {
+  initialize: function(element, url, options) {
+    this.url = url;
+    this.element = $(element);
+
+    this.options = Object.extend({
+      okText: "ok",
+      cancelText: "cancel",
+      savingText: "Saving...",
+      clickToEditText: "Click to edit",
+      okText: "ok",
+      rows: 1,
+      onComplete: function(transport, element) {
+        new Effect.Highlight(element, {startcolor: this.options.highlightcolor});
+      },
+      onFailure: function(transport) {
+        alert("Error communicating with the server: " + transport.responseText.stripTags());
+      },
+      callback: function(form) {
+        return Form.serialize(form);
+      },
+      loadingText: 'Loading...',
+      savingClassName: 'inplaceeditor-saving',
+      formClassName: 'inplaceeditor-form',
+      highlightcolor: Ajax.InPlaceEditor.defaultHighlightColor,
+      highlightendcolor: "#FFFFFF",
+      externalControl: null,
+      ajaxOptions: {}
+    }, options || {});
+
+    if(!this.options.formId && this.element.id) {
+      this.options.formId = this.element.id + "-inplaceeditor";
+      if ($(this.options.formId)) {
+        // there's already a form with that name, don't specify an id
+        this.options.formId = null;
+      }
+    }
+    
+    if (this.options.externalControl) {
+      this.options.externalControl = $(this.options.externalControl);
+    }
+    
+    this.originalBackground = Element.getStyle(this.element, 'background-color');
+    if (!this.originalBackground) {
+      this.originalBackground = "transparent";
+    }
+    
+    this.element.title = this.options.clickToEditText;
+    
+    this.onclickListener = this.enterEditMode.bindAsEventListener(this);
+    this.mouseoverListener = this.enterHover.bindAsEventListener(this);
+    this.mouseoutListener = this.leaveHover.bindAsEventListener(this);
+    Event.observe(this.element, 'click', this.onclickListener);
+    Event.observe(this.element, 'mouseover', this.mouseoverListener);
+    Event.observe(this.element, 'mouseout', this.mouseoutListener);
+    if (this.options.externalControl) {
+      Event.observe(this.options.externalControl, 'click', this.onclickListener);
+      Event.observe(this.options.externalControl, 'mouseover', this.mouseoverListener);
+      Event.observe(this.options.externalControl, 'mouseout', this.mouseoutListener);
+    }
+  },
+  enterEditMode: function() {
+    if (this.saving) return;
+    if (this.editing) return;
+    this.editing = true;
+    this.onEnterEditMode();
+    if (this.options.externalControl) {
+      Element.hide(this.options.externalControl);
+    }
+    Element.hide(this.element);
+    this.form = this.getForm();
+    this.element.parentNode.insertBefore(this.form, this.element);
+  },
+  getForm: function() {
+    form = document.createElement("form");
+    form.id = this.options.formId;
+    Element.addClassName(form, this.options.formClassName)
+    form.onsubmit = this.onSubmit.bind(this);
+
+    this.createEditField(form);
+
+    if (this.options.textarea) {
+      var br = document.createElement("br");
+      form.appendChild(br);
+    }
+
+    okButton = document.createElement("input");
+    okButton.type = "submit";
+    okButton.value = this.options.okText;
+    form.appendChild(okButton);
+
+    cancelLink = document.createElement("a");
+    cancelLink.href = "#";
+    cancelLink.appendChild(document.createTextNode(this.options.cancelText));
+    cancelLink.onclick = this.onclickCancel.bind(this);
+    form.appendChild(cancelLink);
+    return form;
+  },
+  createEditField: function(form) {
+    if (this.options.rows == 1) {
+      this.options.textarea = false;
+      var textField = document.createElement("input");
+      textField.type = "text";
+      textField.name = "value";
+      textField.value = this.getText();
+      textField.style.backgroundColor = this.options.highlightcolor;
+      var size = this.options.size || this.options.cols || 0;
+      if (size != 0)
+        textField.size = size;
+      form.appendChild(textField);
+      this.editField = textField;
+    } else {
+      this.options.textarea = true;
+      var textArea = document.createElement("textarea");
+      textArea.name = "value";
+      textArea.value = this.getText();
+      textArea.rows = this.options.rows;
+      textArea.cols = this.options.cols || 40;
+      form.appendChild(textArea);
+      this.editField = textArea;
+    }
+  },
+  getText: function() {
+    if (this.options.loadTextURL) {
+      this.loadExternalText();
+      return this.options.loadingText;
+    } else {
+      return this.element.innerHTML;
+    }
+  },
+  loadExternalText: function() {
+    new Ajax.Request(
+      this.options.loadTextURL,
+      {
+        asynchronous: true,
+        onComplete: this.onLoadedExternalText.bind(this)
+      }
+    );
+  },
+  onLoadedExternalText: function(transport) {
+    this.form.value.value = transport.responseText.stripTags();
+  },
+  onclickCancel: function() {
+    this.onComplete();
+    this.leaveEditMode();
+    return false;
+  },
+  onFailure: function(transport) {
+    this.options.onFailure(transport);
+    if (this.oldInnerHTML) {
+      this.element.innerHTML = this.oldInnerHTML;
+      this.oldInnerHTML = null;
+    }
+    return false;
+  },
+  onSubmit: function() {
+    this.saving = true;
+    new Ajax.Updater(
+      { 
+        success: this.element,
+         // don't update on failure (this could be an option)
+        failure: null
+      },
+      this.url,
+      Object.extend({
+        parameters: this.options.callback(this.form, this.editField.value),
+        onComplete: this.onComplete.bind(this),
+        onFailure: this.onFailure.bind(this)
+      }, this.options.ajaxOptions)
+    );
+    this.onLoading();
+    return false;
+  },
+  onLoading: function() {
+    this.saving = true;
+    this.removeForm();
+    this.leaveHover();
+    this.showSaving();
+  },
+  showSaving: function() {
+    this.oldInnerHTML = this.element.innerHTML;
+    this.element.innerHTML = this.options.savingText;
+    Element.addClassName(this.element, this.options.savingClassName);
+    this.element.style.backgroundColor = this.originalBackground;
+    Element.show(this.element);
+  },
+  removeForm: function() {
+    if(this.form) {
+      Element.remove(this.form);
+      this.form = null;
+    }
+  },
+  enterHover: function() {
+    if (this.saving) return;
+    this.element.style.backgroundColor = this.options.highlightcolor;
+    if (this.effect) {
+      this.effect.cancel();
+    }
+    Element.addClassName(this.element, this.options.hoverClassName)
+  },
+  leaveHover: function() {
+    if (this.options.backgroundColor) {
+      this.element.style.backgroundColor = this.oldBackground;
+    }
+    Element.removeClassName(this.element, this.options.hoverClassName)
+    if (this.saving) return;
+    this.effect = new Effect.Highlight(this.element, {
+      startcolor: this.options.highlightcolor,
+      endcolor: this.options.highlightendcolor,
+      restorecolor: this.originalBackground
+    });
+  },
+  leaveEditMode: function() {
+    Element.removeClassName(this.element, this.options.savingClassName);
+    this.removeForm();
+    this.leaveHover();
+    this.element.style.backgroundColor = this.originalBackground;
+    Element.show(this.element);
+    if (this.options.externalControl) {
+      Element.show(this.options.externalControl);
+    }
+    this.editing = false;
+    this.saving = false;
+    this.oldInnerHTML = null;
+    this.onLeaveEditMode();
+  },
+  onComplete: function(transport) {
+    this.leaveEditMode();
+    this.options.onComplete.bind(this)(transport, this.element);
+  },
+  onEnterEditMode: function() {},
+  onLeaveEditMode: function() {},
+  dispose: function() {
+    if (this.oldInnerHTML) {
+      this.element.innerHTML = this.oldInnerHTML;
+    }
+    this.leaveEditMode();
+    Event.stopObserving(this.element, 'click', this.onclickListener);
+    Event.stopObserving(this.element, 'mouseover', this.mouseoverListener);
+    Event.stopObserving(this.element, 'mouseout', this.mouseoutListener);
+    if (this.options.externalControl) {
+      Event.stopObserving(this.options.externalControl, 'click', this.onclickListener);
+      Event.stopObserving(this.options.externalControl, 'mouseover', this.mouseoverListener);
+      Event.stopObserving(this.options.externalControl, 'mouseout', this.mouseoutListener);
+    }
+  }
+};
\ No newline at end of file
diff --git a/webcit/static/copy.gif b/webcit/static/copy.gif
new file mode 100644 (file)
index 0000000..faebb18
Binary files /dev/null and b/webcit/static/copy.gif differ
diff --git a/webcit/static/cut.gif b/webcit/static/cut.gif
new file mode 100644 (file)
index 0000000..ca60a1a
Binary files /dev/null and b/webcit/static/cut.gif differ
diff --git a/webcit/static/diskette_24x.gif b/webcit/static/diskette_24x.gif
new file mode 100644 (file)
index 0000000..3cd59ea
Binary files /dev/null and b/webcit/static/diskette_24x.gif differ
diff --git a/webcit/static/down_pointer.gif b/webcit/static/down_pointer.gif
new file mode 100644 (file)
index 0000000..49a3ef5
Binary files /dev/null and b/webcit/static/down_pointer.gif differ
diff --git a/webcit/static/dragdrop.js b/webcit/static/dragdrop.js
new file mode 100644 (file)
index 0000000..55461c1
--- /dev/null
@@ -0,0 +1,545 @@
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+// 
+// Element.Class part Copyright (c) 2005 by Rick Olson
+// 
+// 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.
+
+
+/*--------------------------------------------------------------------------*/
+
+var Droppables = {
+  drops: false,
+
+  remove: function(element) {
+    for(var i = 0; i < this.drops.length; i++)
+      if(this.drops[i].element == element)
+        this.drops.splice(i,1);
+  },
+
+  add: function(element) {
+    element = $(element);
+    var options = Object.extend({
+      greedy:     true,
+      hoverclass: null  
+    }, arguments[1] || {});
+
+    // cache containers
+    if(options.containment) {
+      options._containers = new Array();
+      var containment = options.containment;
+      if((typeof containment == 'object') && 
+        (containment.constructor == Array)) {
+        for(var i=0; i<containment.length; i++)
+          options._containers.push($(containment[i]));
+      } else {
+        options._containers.push($(containment));
+      }
+      options._containers_length = 
+        options._containers.length-1;
+    }
+
+    Element.makePositioned(element); // fix IE
+
+    options.element = element;
+
+    // activate the droppable    
+    if(!this.drops) this.drops = [];
+    this.drops.push(options);
+  },
+
+  isContained: function(element, drop) {
+    var containers = drop._containers;
+    var parentNode = element.parentNode;
+    var i = drop._containers_length;
+    do { if(parentNode==containers[i]) return true; } while (i--);
+    return false;
+  },
+
+  isAffected: function(pX, pY, element, drop) {
+    return (
+      (drop.element!=element) &&
+      ((!drop._containers) ||
+        this.isContained(element, drop)) &&
+      ((!drop.accept) ||
+        (Element.Class.has_any(element, drop.accept))) &&
+      Position.within(drop.element, pX, pY) );
+  },
+
+  deactivate: function(drop) {
+    Element.Class.remove(drop.element, drop.hoverclass);
+    this.last_active = null;
+  },
+
+  activate: function(drop) {
+    if(this.last_active) this.deactivate(this.last_active);
+    if(drop.hoverclass)
+      Element.Class.add(drop.element, drop.hoverclass);
+    this.last_active = drop;
+  },
+
+  show: function(event, element) {
+    if(!this.drops) return;
+    var pX = Event.pointerX(event);
+    var pY = Event.pointerY(event);
+    Position.prepare();
+
+    var i = this.drops.length-1; do {
+      var drop = this.drops[i];
+      if(this.isAffected(pX, pY, element, drop)) {
+        if(drop.onHover)
+           drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));
+        if(drop.greedy) { 
+          this.activate(drop);
+          return;
+        }
+      }
+    } while (i--);
+  },
+
+  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);
+
+  },
+
+  reset: function() {
+    if(this.last_active)
+      this.deactivate(this.last_active);
+  }
+}
+
+var Draggables = {
+  observers: new Array(),
+  addObserver: function(observer) {
+    this.observers.push(observer);    
+  },
+  removeObserver: function(element) {  // element instead of obsever fixes mem leaks
+    for(var i = 0; i < this.observers.length; i++)
+      if(this.observers[i].element && (this.observers[i].element == element))
+        this.observers.splice(i,1);
+  },
+  notify: function(eventName, draggable) {  // 'onStart', 'onEnd'
+    for(var i = 0; i < this.observers.length; i++)
+      this.observers[i][eventName](draggable);
+  }
+}
+
+/*--------------------------------------------------------------------------*/
+
+var Draggable = Class.create();
+Draggable.prototype = {
+  initialize: function(element) {
+    var options = Object.extend({
+      handle: false,
+      starteffect: function(element) { 
+        new Effect.Opacity(element, {duration:0.2, from:1.0, to:0.7}); 
+      },
+      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.MoveBy(element, -top_offset, -left_offset, {duration:dur});
+      },
+      endeffect: function(element) { 
+         new Effect.Opacity(element, {duration:0.2, from:0.7, to:1.0}); 
+      },
+      zindex: 1000,
+      revert: false
+    }, arguments[1] || {});
+
+    this.element      = $(element);
+    this.handle       = options.handle ? $(options.handle) : this.element;
+
+    Element.makePositioned(this.element); // fix IE    
+
+    this.offsetX      = 0;
+    this.offsetY      = 0;
+    this.originalLeft = this.currentLeft();
+    this.originalTop  = this.currentTop();
+    this.originalX    = this.element.offsetLeft;
+    this.originalY    = this.element.offsetTop;
+    this.originalZ    = parseInt(this.element.style.zIndex || "0");
+
+    this.options      = options;
+
+    this.active       = false;
+    this.dragging     = false;   
+
+    this.eventMouseDown = this.startDrag.bindAsEventListener(this);
+    this.eventMouseUp   = this.endDrag.bindAsEventListener(this);
+    this.eventMouseMove = this.update.bindAsEventListener(this);
+    this.eventKeypress  = this.keyPress.bindAsEventListener(this);
+
+    Event.observe(this.handle, "mousedown", this.eventMouseDown);
+  },
+  destroy: function() {
+    Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);
+    this.unregisterEvents();
+  },
+  registerEvents: function() {
+    if(this.active) return;
+    Event.observe(document, "mouseup", this.eventMouseUp);
+    Event.observe(document, "mousemove", this.eventMouseMove);
+    Event.observe(document, "keypress", this.eventKeypress);
+  },
+  unregisterEvents: function() {
+    if(!this.active) return;
+    Event.stopObserving(document, "mouseup", this.eventMouseUp);
+    Event.stopObserving(document, "mousemove", this.eventMouseMove);
+    Event.stopObserving(document, "keypress", this.eventKeypress);
+  },
+  currentLeft: function() {
+    return parseInt(this.element.style.left || '0');
+  },
+  currentTop: function() {
+    return parseInt(this.element.style.top || '0')
+  },
+  startDrag: function(event) {
+    if(Event.isLeftClick(event)) {
+      this.registerEvents();
+      this.active = true;
+      var pointer = [Event.pointerX(event), Event.pointerY(event)];
+      var offsets = Position.cumulativeOffset(this.element);
+      this.offsetX =  (pointer[0] - offsets[0]);
+      this.offsetY =  (pointer[1] - offsets[1]);
+      Event.stop(event);
+    }
+  },
+  finishDrag: function(event, success) {
+    this.unregisterEvents();
+
+    this.active = false;
+    this.dragging = false;
+
+    if(this.options.ghosting) {
+      Position.relativize(this.element);
+      Element.remove(this._clone);
+      this._clone = null;
+    }
+
+    if(success) Droppables.fire(event, this.element);
+    Draggables.notify('onEnd', this);
+
+    var revert = this.options.revert;
+    if(revert && typeof revert == 'function') revert = revert(this.element);
+
+    if(revert && this.options.reverteffect) {
+      this.options.reverteffect(this.element, 
+      this.currentTop()-this.originalTop,
+      this.currentLeft()-this.originalLeft);
+    } else {
+      this.originalLeft = this.currentLeft();
+      this.originalTop  = this.currentTop();
+    }
+
+    this.element.style.zIndex = this.originalZ;
+
+    if(this.options.endeffect) 
+      this.options.endeffect(this.element);
+
+
+    Droppables.reset();
+  },
+  keyPress: function(event) {
+    if(this.active) {
+      if(event.keyCode==Event.KEY_ESC) {
+        this.finishDrag(event, false);
+        Event.stop(event);
+      }
+    }
+  },
+  endDrag: function(event) {
+    if(this.active && this.dragging) {
+      this.finishDrag(event, true);
+      Event.stop(event);
+    }
+    this.active = false;
+    this.dragging = false;
+  },
+  draw: function(event) {
+    var pointer = [Event.pointerX(event), Event.pointerY(event)];
+    var offsets = Position.cumulativeOffset(this.element);
+    offsets[0] -= this.currentLeft();
+    offsets[1] -= this.currentTop();
+    var style = this.element.style;
+    if((!this.options.constraint) || (this.options.constraint=='horizontal'))
+      style.left = (pointer[0] - offsets[0] - this.offsetX) + "px";
+    if((!this.options.constraint) || (this.options.constraint=='vertical'))
+      style.top  = (pointer[1] - offsets[1] - this.offsetY) + "px";
+    if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
+  },
+  update: function(event) {
+   if(this.active) {
+      if(!this.dragging) {
+        var style = this.element.style;
+        this.dragging = true;
+        if(style.position=="") style.position = "relative";
+        style.zIndex = this.options.zindex;
+
+        if(this.options.ghosting) {
+          this._clone = this.element.cloneNode(true);
+          Position.absolutize(this.element);
+          this.element.parentNode.insertBefore(this._clone, this.element);
+        }
+
+        Draggables.notify('onStart', this);
+        if(this.options.starteffect) this.options.starteffect(this.element);
+      }
+
+      Droppables.show(event, this.element);
+      this.draw(event);
+      if(this.options.change) this.options.change(this);
+
+      // fix AppleWebKit rendering
+      if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0); 
+
+      Event.stop(event);
+   }
+  }
+}
+
+/*--------------------------------------------------------------------------*/
+
+var SortableObserver = Class.create();
+SortableObserver.prototype = {
+  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 = {
+  sortables: new Array(),
+  options: function(element){
+    element = $(element);
+    for(var i=0;i<this.sortables.length;i++)
+      if(this.sortables[i].element == element)
+        return this.sortables[i];
+    return null;        
+  },
+  destroy: function(element){
+    element = $(element);
+    for(var i=0;i<this.sortables.length;i++) {
+      if(this.sortables[i].element == element) {
+        var s = this.sortables[i];
+        Draggables.removeObserver(s.element);
+        for(var j=0;j<s.droppables.length;j++)
+          Droppables.remove(s.droppables[j]);
+        for(j=0;j<s.draggables.length;j++)
+          s.draggables[j].destroy();
+        this.sortables.splice(i,1);
+      }
+    }
+  },
+  create: function(element) {
+    element = $(element);
+    var options = Object.extend({ 
+      element:     element,
+      tag:         'li',       // assumes li children, override with tag: 'tagname'
+      dropOnEmpty: false,
+      tree:        false,      // fixme: unimplemented
+      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,
+      hoverclass:  null,
+      ghosting:    false,
+      onChange:    function() {},
+      onUpdate:    function() {}
+    }, arguments[1] || {});
+
+    // clear any old sortable with same element
+    this.destroy(element);
+
+    // build options for the draggables
+    var options_for_draggable = {
+      revert:      true,
+      ghosting:    options.ghosting,
+      constraint:  options.constraint,
+      handle:      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,
+      hoverclass:  options.hoverclass,
+      onHover:     Sortable.onHover,
+      greedy:      !options.dropOnEmpty
+    }
+
+    // fix for gecko engine
+    Element.cleanWhitespace(element); 
+
+    options.draggables = [];
+    options.droppables = [];
+
+    // make it so
+
+    // drop on empty handling
+    if(options.dropOnEmpty) {
+      Droppables.add(element,
+        {containment: options.containment, onHover: Sortable.onEmptyHover, greedy: false});
+      options.droppables.push(element);
+    }
+
+    var elements = this.findElements(element, options);
+    if(elements) {
+      for (var i = 0; i < elements.length; i++) {
+        // handles are per-draggable
+        var handle = options.handle ? 
+          Element.Class.childrenWith(elements[i], options.handle)[0] : elements[i];
+            options.draggables.push(new Draggable(elements[i], Object.extend(options_for_draggable, { handle: handle })));
+            Droppables.add(elements[i], options_for_droppable);
+
+        options.droppables.push(elements[i]);
+      }
+    }
+
+    // keep reference
+    this.sortables.push(options);
+
+    // for onupdate
+    Draggables.addObserver(new SortableObserver(element, options.onUpdate));
+
+  },
+
+  // return all suitable-for-sortable elements in a guaranteed order
+  findElements: function(element, options) {
+    if(!element.hasChildNodes()) return null;
+    var elements = [];
+    var children = element.childNodes;
+    for(var i = 0; i<children.length; i++) {
+      if(children[i].tagName && children[i].tagName==options.tag.toUpperCase() &&
+        (!options.only || (Element.Class.has(children[i], options.only))))
+          elements.push(children[i]);
+      if(options.tree) {
+        var grandchildren = this.findElements(children[i], options);
+        if(grandchildren) elements.push(grandchildren);
+      }
+    }
+
+    return (elements.length>0 ? elements.flatten() : null);
+  },
+
+  onHover: function(element, dropon, overlap) {
+    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) {
+    if(element.parentNode!=dropon) {
+      dropon.appendChild(element);
+    }
+  },
+
+  unmark: function() {
+    if(Sortable._marker) Element.hide(Sortable._marker);
+  },
+
+  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') || document.createElement('DIV');
+      Element.hide(Sortable._marker);
+      Element.Class.add(Sortable._marker, 'dropmarker');
+      Sortable._marker.style.position = 'absolute';
+      document.getElementsByTagName("body").item(0).appendChild(Sortable._marker);
+    }    
+    var offsets = Position.cumulativeOffset(dropon);
+    Sortable._marker.style.top  = offsets[1] + 'px';
+    if(position=='after') Sortable._marker.style.top = (offsets[1]+dropon.clientHeight) + 'px';
+    Sortable._marker.style.left = offsets[0] + 'px';
+    Element.show(Sortable._marker);
+  },
+
+  serialize: function(element) {
+    element = $(element);
+    var sortableOptions = this.options(element);
+    var options = Object.extend({
+      tag:  sortableOptions.tag,
+      only: sortableOptions.only,
+      name: element.id
+    }, arguments[1] || {});
+
+    var items = $(element).childNodes;
+    var queryComponents = new Array();
+
+    for(var i=0; i<items.length; i++)
+      if(items[i].tagName && items[i].tagName==options.tag.toUpperCase() &&
+        (!options.only || (Element.Class.has(items[i], options.only))))
+        queryComponents.push(
+          encodeURIComponent(options.name) + "[]=" + 
+          encodeURIComponent(items[i].id.split("_")[1]));
+
+    return queryComponents.join("&");
+  }
+} 
\ No newline at end of file
diff --git a/webcit/static/effects.js b/webcit/static/effects.js
new file mode 100644 (file)
index 0000000..71de14c
--- /dev/null
@@ -0,0 +1,707 @@
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//
+// Parts (c) 2005 Justin Palmer (http://encytemedia.com/)
+// Parts (c) 2005 Mark Pilgrim (http://diveintomark.org/)
+// 
+// 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.
+
+var Effect = {
+  tagifyText: function(element) {
+    var tagifyStyle = "position:relative";
+    if(/MSIE/.test(navigator.userAgent)) tagifyStyle += ";zoom:1"; 
+    element = $(element);
+    var children = element.childNodes;
+    for (var i = 0; i < children.length; i++)
+      if(children[i].nodeType==3) {
+        var child = children[i];
+        for (var j = 0; j < child.nodeValue.length; j++)
+          element.insertBefore(
+            Builder.node('span',{style: tagifyStyle},
+              child.nodeValue.substr(j,1) == " " ? String.fromCharCode(160) : 
+              child.nodeValue.substr(j,1)), child);
+        Element.remove(child);
+      }
+  },
+  multiple: function(element, effect) {
+    if(((typeof element == 'object') || 
+        (typeof element == 'function')) && 
+       (element.length))
+      var elements = element;
+    else
+      var elements = $(element).childNodes;
+      
+    var options = Object.extend({
+      speed: 0.1,
+      delay: 0.0
+    }, arguments[2] || {});
+    var speed = options.speed;
+    var delay = options.delay;
+
+    for(var i = 0; i < elements.length; i++)
+      new effect(elements[i], 
+        Object.extend(options, { delay: delay + i*speed }));
+  }
+};
+
+var Effect2 = Effect; // deprecated
+
+/* ------------- transitions ------------- */
+
+Effect.Transitions = {}
+
+Effect.Transitions.linear = function(pos) {
+  return pos;
+}
+Effect.Transitions.sinoidal = function(pos) {
+  return (-Math.cos(pos*Math.PI)/2) + 0.5;
+}
+Effect.Transitions.reverse  = function(pos) {
+  return 1-pos;
+}
+Effect.Transitions.flicker = function(pos) {
+  return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random(0.25);
+}
+Effect.Transitions.wobble = function(pos) {
+  return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
+}
+Effect.Transitions.pulse = function(pos) {
+  return (Math.floor(pos*10) % 2 == 0 ? 
+    (pos*10-Math.floor(pos*10)) : 1-(pos*10-Math.floor(pos*10)));
+}
+Effect.Transitions.none = function(pos) {
+  return 0;
+}
+Effect.Transitions.full = function(pos) {
+  return 1;
+}
+
+/* ------------- core effects ------------- */
+
+Effect.Queue = {
+  effects:  [],
+  interval: null,
+  findLast: function() {
+    var timestamp = false;
+    for(var i = 0; i < this.effects.length; i++)
+      if(!timestamp || (this.effects[i].finishOn>timestamp))
+        timestamp = this.effects[i].finishOn;
+    return timestamp;
+  },
+  add: function(effect) {
+    var timestamp = new Date().getTime();
+    
+    switch(effect.options.queue) {
+      case 'front':
+        // move unstarted effects after this effect  
+        for(var i = 0; i < this.effects.length; i++)
+          if(this.effects[i].state == 'idle') {
+            this.effects[i].startOn  += effect.finishOn;
+            this.effects[i].finishOn += effect.finishOn;
+          }
+        break;
+      case 'end':
+        // start effect after last queued effect has finished
+        timestamp = this.findLast() || timestamp;
+        break;
+    }
+    
+    effect.startOn  += timestamp;
+    effect.finishOn += timestamp;
+    
+    this.effects.push(effect);
+    
+    if(!this.interval) 
+      this.interval = setInterval(this.loop.bind(this), 40);
+  },
+  remove: function(effect) {
+    for(var i = 0; i < this.effects.length; i++)
+      if(this.effects[i]==effect) this.effects.splice(i,1);
+    if(this.effects.length == 0) {
+      clearInterval(this.interval);
+      this.interval = null;
+    }
+  },
+  loop: function() {
+    var timePos = new Date().getTime();
+    for(var i = 0; i < this.effects.length; i++) {
+      this.effects[i].loop(timePos);
+    }
+  }
+}
+
+Effect.Base = function() {};
+Effect.Base.prototype = {
+  setOptions: function(options) {
+    this.options = Object.extend({
+      transition: Effect.Transitions.sinoidal,
+      duration:   1.0,   // seconds
+      fps:        25.0,  // max. 25fps due to Effect.Queue implementation
+      sync:       false, // true for combining
+      from:       0.0,
+      to:         1.0,
+      delay:      0.0,
+      queue:      'parallel'
+    }, options || {});
+  },
+  start: function(options) {
+    this.setOptions(options || {});
+    this.currentFrame = 0;
+    this.state        = 'idle';
+    this.startOn      = this.options.delay*1000;
+    this.finishOn     = this.startOn + (this.options.duration*1000);
+    if(this.options.beforeStart) this.options.beforeStart(this);
+    if(!this.options.sync) Effect.Queue.add(this);
+  },
+  loop: function(timePos) {
+    if(timePos >= this.startOn) {
+      if(timePos >= this.finishOn) {
+        this.render(1.0);
+        this.cancel();
+        if(this.finish) this.finish(); 
+        if(this.options.afterFinish) this.options.afterFinish(this);
+        return;  
+      }
+      var pos   = (timePos - this.startOn) / (this.finishOn - this.startOn);
+      var frame = Math.round(pos * this.options.fps * this.options.duration);
+      if(frame > this.currentFrame) {
+        this.render(pos);
+        this.currentFrame = frame;
+      }
+    }
+  },
+  render: function(pos) {
+    if(this.state == 'idle') {
+      this.state = 'running';
+      if(this.setup) this.setup();
+    }
+    if(this.options.transition) pos = this.options.transition(pos);
+    pos *= (this.options.to-this.options.from);
+    pos += this.options.from; 
+    if(this.options.beforeUpdate) this.options.beforeUpdate(this);
+    if(this.update) this.update(pos);
+    if(this.options.afterUpdate) this.options.afterUpdate(this);  
+  },
+  cancel: function() {
+    if(!this.options.sync) Effect.Queue.remove(this);
+    this.state = 'finished';
+  }
+}
+
+Effect.Parallel = Class.create();
+Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {
+  initialize: function(effects) {
+    this.effects = effects || [];
+    this.start(arguments[1]);
+  },
+  update: function(position) {
+    for (var i = 0; i < this.effects.length; i++)
+      this.effects[i].render(position);
+  },
+  finish: function(position) {
+    for (var i = 0; i < this.effects.length; i++) {
+      this.effects[i].cancel();
+      if(this.effects[i].finish) this.effects[i].finish(position);
+    }
+  }
+});
+
+// Internet Explorer caveat: works only on elements that have
+// a 'layout', meaning having a given width or height. 
+// There is no way to safely set this automatically.
+Effect.Opacity = Class.create();
+Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {
+  initialize: function(element) {
+    this.element = $(element);
+    var options = Object.extend({
+      from: 0.0,
+      to:   1.0
+    }, arguments[1] || {});
+    this.start(options);
+  },
+  update: function(position) {
+    this.setOpacity(position);
+  }, 
+  setOpacity: function(opacity) {
+    if(opacity<0.0001) opacity = 0; // fix errors with things like 6.152242992829571e-8
+    if(opacity==1.0) {
+      this.element.style.opacity = '0.999999';
+      this.element.style.filter  = null;
+    } else {
+      this.element.style.opacity = opacity;
+      this.element.style.filter  = "alpha(opacity:"+opacity*100+")";
+    }
+  }
+});
+
+Effect.MoveBy = Class.create();
+Object.extend(Object.extend(Effect.MoveBy.prototype, Effect.Base.prototype), {
+  initialize: function(element, toTop, toLeft) {
+    this.element      = $(element);
+    this.toTop        = toTop;
+    this.toLeft       = toLeft;
+    this.start(arguments[3]);
+  },
+  setup: function() {
+    this.originalTop  = parseFloat(Element.getStyle(this.element,'top')  || '0');
+    this.originalLeft = parseFloat(Element.getStyle(this.element,'left') || '0');
+    Element.makePositioned(this.element);
+  },
+  update: function(position) {
+    topd  = this.toTop  * position + this.originalTop;
+    leftd = this.toLeft * position + this.originalLeft;
+    this.setPosition(topd, leftd);
+  },
+  setPosition: function(topd, leftd) {
+    this.element.style.top  = topd  + "px";
+    this.element.style.left = leftd + "px";
+  }
+});
+
+Effect.Scale = Class.create();
+Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {
+  initialize: function(element, percent) {
+    this.element = $(element)
+    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.originalTop    = this.element.offsetTop;
+    this.originalLeft   = this.element.offsetLeft;
+    if(Element.getStyle(this.element,'font-size')=="") this.sizeEm = 1.0;
+    if(Element.getStyle(this.element,'font-size') && Element.getStyle(this.element,'font-size').indexOf("em")>0)
+      this.sizeEm = parseFloat(Element.getStyle(this.element,'font-size'));
+    this.factor = (this.options.scaleTo/100.0) - (this.options.scaleFrom/100.0);
+    if(this.options.scaleMode=='box') {
+      this.originalHeight = this.element.clientHeight;
+      this.originalWidth  = this.element.clientWidth; 
+    } else 
+    if(this.options.scaleMode=='contents') {
+      this.originalHeight = this.element.scrollHeight;
+      this.originalWidth  = this.element.scrollWidth;
+    } else {
+      this.originalHeight = this.options.scaleMode.originalHeight;
+      this.originalWidth  = this.options.scaleMode.originalWidth;
+    }
+  },
+  update: function(position) {
+    var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
+    if(this.options.scaleContent && this.sizeEm) 
+      this.element.style.fontSize = this.sizeEm*currentScale + "em";
+    this.setDimensions(
+      this.originalWidth * currentScale, 
+      this.originalHeight * currentScale);
+  },
+  setDimensions: function(width, height) {
+    if(this.options.scaleX) this.element.style.width = width + 'px';
+    if(this.options.scaleY) this.element.style.height = height + 'px';
+    if(this.options.scaleFromCenter) {
+      var topd  = (height - this.originalHeight)/2;
+      var leftd = (width  - this.originalWidth)/2;
+      if(Element.getStyle(this.element,'position')=='absolute') {
+        if(this.options.scaleY) this.element.style.top = this.originalTop-topd + "px";
+        if(this.options.scaleX) this.element.style.left = this.originalLeft-leftd + "px";
+      } else {
+        if(this.options.scaleY) this.element.style.top = -topd + "px";
+        if(this.options.scaleX) this.element.style.left = -leftd + "px";
+      }
+    }
+  }
+});
+
+Effect.Highlight = Class.create();
+Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), {
+  initialize: function(element) {
+    this.element = $(element);
+    var options = Object.extend({
+      startcolor:   "#ffff99"
+    }, arguments[1] || {});
+    this.start(options);
+  },
+  setup: function() {
+    // try to parse current background color as default for endcolor
+    // browser stores this as: "rgb(255, 255, 255)", convert to "#ffffff" format
+    if(!this.options.endcolor) {
+      var endcolor = "#ffffff";
+      var current = Element.getStyle(this.element, 'background-color');
+      if(current && current.slice(0,4) == "rgb(") {
+        endcolor = "#";
+        var cols = current.slice(4,current.length-1).split(',');
+        var i=0; do { endcolor += parseInt(cols[i]).toColorPart() } while (++i<3);
+      }
+      this.options.endcolor = endcolor;
+    }    
+    // init color calculations
+    this.colors_base = [
+      parseInt(this.options.startcolor.slice(1,3),16),
+      parseInt(this.options.startcolor.slice(3,5),16),
+      parseInt(this.options.startcolor.slice(5),16) ];
+    this.colors_delta = [
+      parseInt(this.options.endcolor.slice(1,3),16)-this.colors_base[0],
+      parseInt(this.options.endcolor.slice(3,5),16)-this.colors_base[1],
+      parseInt(this.options.endcolor.slice(5),16)-this.colors_base[2]];
+  },
+  update: function(position) {
+    var colors = [
+      Math.round(this.colors_base[0]+(this.colors_delta[0]*position)),
+      Math.round(this.colors_base[1]+(this.colors_delta[1]*position)),
+      Math.round(this.colors_base[2]+(this.colors_delta[2]*position)) ];
+    this.element.style.backgroundColor = "#" +
+      colors[0].toColorPart() + colors[1].toColorPart() + colors[2].toColorPart();
+  },
+  finish: function() {
+    this.element.style.backgroundColor = this.options.restorecolor;
+  }
+});
+
+Effect.ScrollTo = Class.create();
+Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), {
+  initialize: function(element) {
+    this.element = $(element);
+    this.start(arguments[1] || {});
+  },
+  setup: function() {
+    Position.prepare();
+    var offsets = Position.cumulativeOffset(this.element);
+    var max = window.innerHeight ? 
+      window.height - window.innerHeight :
+      document.body.scrollHeight - 
+        (document.documentElement.clientHeight ? 
+          document.documentElement.clientHeight : document.body.clientHeight);
+    this.scrollStart = Position.deltaY;
+    this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart;
+  },
+  update: function(position) {
+    Position.prepare();
+    window.scrollTo(Position.deltaX, 
+      this.scrollStart + (position*this.delta));
+  }
+});
+
+/* ------------- combination effects ------------- */
+
+Effect.Fade = function(element) {
+  var options = Object.extend({
+  from: 1.0,
+  to:   0.0,
+  afterFinish: function(effect) 
+    { Element.hide(effect.element);
+      effect.setOpacity(1); } 
+  }, arguments[1] || {});
+  return new Effect.Opacity(element,options);
+}
+
+Effect.Appear = function(element) {
+  var options = Object.extend({
+  from: 0.0,
+  to:   1.0,
+  beforeStart: function(effect)  
+    { effect.setOpacity(0);
+      Element.show(effect.element); },
+  afterUpdate: function(effect)  
+    { Element.show(effect.element); }
+  }, arguments[1] || {});
+  return new Effect.Opacity(element,options);
+}
+
+Effect.Puff = function(element) {
+  return new Effect.Parallel(
+   [ new Effect.Scale(element, 200, { sync: true, scaleFromCenter: true }), 
+     new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0 } ) ], 
+     Object.extend({ duration: 1.0, 
+      beforeUpdate: function(effect) 
+       { effect.effects[0].element.style.position = 'absolute'; },
+      afterFinish: function(effect)
+       { Element.hide(effect.effects[0].element); }
+     }, arguments[1] || {})
+   );
+}
+
+Effect.BlindUp = function(element) {
+  element = $(element);
+  Element.makeClipping(element);
+  return new Effect.Scale(element, 0, 
+    Object.extend({ scaleContent: false, 
+      scaleX: false, 
+      afterFinish: function(effect) 
+        { 
+          Element.hide(effect.element);
+          Element.undoClipping(effect.element);
+        } 
+    }, arguments[1] || {})
+  );
+}
+
+Effect.BlindDown = function(element) {
+  element = $(element);
+  element.style.height = '0px';
+  Element.makeClipping(element);
+  Element.show(element);
+  return new Effect.Scale(element, 100, 
+    Object.extend({ scaleContent: false, 
+      scaleX: false, 
+      scaleMode: 'contents',
+      scaleFrom: 0,
+      afterFinish: function(effect) {
+        Element.undoClipping(effect.element);
+      }
+    }, arguments[1] || {})
+  );
+}
+
+Effect.SwitchOff = function(element) {
+  return new Effect.Appear(element,
+    { duration: 0.4,
+     transition: Effect.Transitions.flicker,
+     afterFinish: function(effect)
+      { effect.element.style.overflow = 'hidden';
+        new Effect.Scale(effect.element, 1, 
+         { duration: 0.3, scaleFromCenter: true,
+          scaleX: false, scaleContent: false,
+          afterUpdate: function(effect) { 
+           if(effect.element.style.position=="")
+             effect.element.style.position = 'relative'; },
+          afterFinish: function(effect) { Element.hide(effect.element); }
+         } )
+      }
+    } );
+}
+
+Effect.DropOut = function(element) {
+  return new Effect.Parallel(
+    [ new Effect.MoveBy(element, 100, 0, { sync: true }), 
+      new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0 } ) ], 
+    Object.extend(
+      { duration: 0.5, 
+        afterFinish: function(effect)
+          { Element.hide(effect.effects[0].element); } 
+      }, arguments[1] || {}));
+}
+
+Effect.Shake = function(element) {
+  return new Effect.MoveBy(element, 0, 20, 
+    { duration: 0.05, afterFinish: function(effect) {
+  new Effect.MoveBy(effect.element, 0, -40, 
+    { duration: 0.1, afterFinish: function(effect) { 
+  new Effect.MoveBy(effect.element, 0, 40, 
+    { duration: 0.1, afterFinish: function(effect) {  
+  new Effect.MoveBy(effect.element, 0, -40, 
+    { duration: 0.1, afterFinish: function(effect) {  
+  new Effect.MoveBy(effect.element, 0, 40, 
+    { duration: 0.1, afterFinish: function(effect) {  
+  new Effect.MoveBy(effect.element, 0, -20, 
+    { duration: 0.05, afterFinish: function(effect) {  
+  }}) }}) }}) }}) }}) }});
+}
+
+Effect.SlideDown = function(element) {
+  element = $(element);
+  element.style.height   = '0px';
+  Element.makeClipping(element);
+  Element.cleanWhitespace(element);
+  Element.makePositioned(element.firstChild);
+  Element.show(element);
+  return new Effect.Scale(element, 100, 
+   Object.extend({ scaleContent: false, 
+    scaleX: false, 
+    scaleMode: 'contents',
+    scaleFrom: 0,
+    afterUpdate: function(effect) 
+      { effect.element.firstChild.style.bottom = 
+          (effect.originalHeight - effect.element.clientHeight) + 'px'; },
+    afterFinish: function(effect) 
+      {  Element.undoClipping(effect.element); }
+    }, arguments[1] || {})
+  );
+}
+  
+Effect.SlideUp = function(element) {
+  element = $(element);
+  Element.makeClipping(element);
+  Element.cleanWhitespace(element);
+  Element.makePositioned(element.firstChild);
+  Element.show(element);
+  return new Effect.Scale(element, 0, 
+   Object.extend({ scaleContent: false, 
+    scaleX: false, 
+    afterUpdate: function(effect) 
+      { effect.element.firstChild.style.bottom = 
+          (effect.originalHeight - effect.element.clientHeight) + 'px'; },
+    afterFinish: function(effect)
+      { 
+        Element.hide(effect.element);
+        Element.undoClipping(effect.element);
+      }
+   }, arguments[1] || {})
+  );
+}
+
+Effect.Squish = function(element) {
+ return new Effect.Scale(element, 0, 
+   { afterFinish: function(effect) { Element.hide(effect.element); } });
+}
+
+Effect.Grow = function(element) {
+  element = $(element);
+  var options = arguments[1] || {};
+  
+  var originalWidth = element.clientWidth;
+  var originalHeight = element.clientHeight;
+  element.style.overflow = 'hidden';
+  Element.show(element);
+  
+  var direction = options.direction || 'center';
+  var moveTransition = options.moveTransition || Effect.Transitions.sinoidal;
+  var scaleTransition = options.scaleTransition || Effect.Transitions.sinoidal;
+  var opacityTransition = options.opacityTransition || Effect.Transitions.full;
+  
+  var initialMoveX, initialMoveY;
+  var moveX, moveY;
+  
+  switch (direction) {
+    case 'top-left':
+      initialMoveX = initialMoveY = moveX = moveY = 0; 
+      break;
+    case 'top-right':
+      initialMoveX = originalWidth;
+      initialMoveY = moveY = 0;
+      moveX = -originalWidth;
+      break;
+    case 'bottom-left':
+      initialMoveX = moveX = 0;
+      initialMoveY = originalHeight;
+      moveY = -originalHeight;
+      break;
+    case 'bottom-right':
+      initialMoveX = originalWidth;
+      initialMoveY = originalHeight;
+      moveX = -originalWidth;
+      moveY = -originalHeight;
+      break;
+    case 'center':
+      initialMoveX = originalWidth / 2;
+      initialMoveY = originalHeight / 2;
+      moveX = -originalWidth / 2;
+      moveY = -originalHeight / 2;
+      break;
+  }
+  
+  return new Effect.MoveBy(element, initialMoveY, initialMoveX, { 
+    duration: 0.01, 
+    beforeUpdate: function(effect) { $(element).style.height = '0px'; },
+    afterFinish: function(effect) {
+      new Effect.Parallel(
+        [ new Effect.Opacity(element, { sync: true, to: 1.0, from: 0.0, transition: opacityTransition }),
+          new Effect.MoveBy(element, moveY, moveX, { sync: true, transition: moveTransition }),
+          new Effect.Scale(element, 100, { 
+            scaleMode: { originalHeight: originalHeight, originalWidth: originalWidth }, 
+            sync: true, scaleFrom: 0, scaleTo: 100, transition: scaleTransition })],
+        options); }
+    });
+}
+
+Effect.Shrink = function(element) {
+  element = $(element);
+  var options = arguments[1] || {};
+  
+  var originalWidth = element.clientWidth;
+  var originalHeight = element.clientHeight;
+  element.style.overflow = 'hidden';
+  Element.show(element);
+
+  var direction = options.direction || 'center';
+  var moveTransition = options.moveTransition || Effect.Transitions.sinoidal;
+  var scaleTransition = options.scaleTransition || Effect.Transitions.sinoidal;
+  var opacityTransition = options.opacityTransition || Effect.Transitions.none;
+  
+  var moveX, moveY;
+  
+  switch (direction) {
+    case 'top-left':
+      moveX = moveY = 0;
+      break;
+    case 'top-right':
+      moveX = originalWidth;
+      moveY = 0;
+      break;
+    case 'bottom-left':
+      moveX = 0;
+      moveY = originalHeight;
+      break;
+    case 'bottom-right':
+      moveX = originalWidth;
+      moveY = originalHeight;
+      break;
+    case 'center':  
+      moveX = originalWidth / 2;
+      moveY = originalHeight / 2;
+      break;
+  }
+  
+  return new Effect.Parallel(
+    [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: opacityTransition }),
+      new Effect.Scale(element, 0, { sync: true, transition: moveTransition }),
+      new Effect.MoveBy(element, moveY, moveX, { sync: true, transition: scaleTransition }) ],
+    options);
+}
+
+Effect.Pulsate = function(element) {
+  element = $(element);
+  var options    = arguments[1] || {};
+  var transition = options.transition || Effect.Transitions.sinoidal;
+  var reverser   = function(pos){ return transition(1-Effect.Transitions.pulse(pos)) };
+  reverser.bind(transition);
+  return new Effect.Opacity(element, 
+    Object.extend(Object.extend({  duration: 3.0,
+       afterFinish: function(effect) { Element.show(effect.element); }
+    }, options), {transition: reverser}));
+}
+
+Effect.Fold = function(element) {
+ element = $(element);
+ element.style.overflow = 'hidden';
+ return new Effect.Scale(element, 5, Object.extend({   
+   scaleContent: false,
+   scaleTo: 100,
+   scaleX: false,
+   afterFinish: function(effect) {
+   new Effect.Scale(element, 1, { 
+     scaleContent: false, 
+     scaleTo: 0,
+     scaleY: false,
+     afterFinish: function(effect) { Element.hide(effect.element) } });
+ }}, arguments[1] || {}));
+}
+
+// old: new Effect.ContentZoom(element, percent)
+// new: Element.setContentZoom(element, percent) 
+
+Element.setContentZoom = function(element, percent) {
+  element = $(element);
+  element.style.fontSize = (percent/100) + "em";  
+  if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
+}
diff --git a/webcit/static/empty.html b/webcit/static/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/endbox.html b/webcit/static/endbox.html
new file mode 100644 (file)
index 0000000..bbf33b1
--- /dev/null
@@ -0,0 +1,3 @@
+</td></tr></table>
+</td></tr></table>
+<br />
diff --git a/webcit/static/enternewnote_24x.gif b/webcit/static/enternewnote_24x.gif
new file mode 100644 (file)
index 0000000..a8fbda5
Binary files /dev/null and b/webcit/static/enternewnote_24x.gif differ
diff --git a/webcit/static/error.gif b/webcit/static/error.gif
new file mode 100644 (file)
index 0000000..57d398c
Binary files /dev/null and b/webcit/static/error.gif differ
diff --git a/webcit/static/favicon.ico b/webcit/static/favicon.ico
new file mode 100644 (file)
index 0000000..856d5a7
Binary files /dev/null and b/webcit/static/favicon.ico differ
diff --git a/webcit/static/folder_closed.gif b/webcit/static/folder_closed.gif
new file mode 100644 (file)
index 0000000..f772648
Binary files /dev/null and b/webcit/static/folder_closed.gif differ
diff --git a/webcit/static/folder_open.gif b/webcit/static/folder_open.gif
new file mode 100644 (file)
index 0000000..27c8bfc
Binary files /dev/null and b/webcit/static/folder_open.gif differ
diff --git a/webcit/static/head.html b/webcit/static/head.html
new file mode 100644 (file)
index 0000000..fb69553
--- /dev/null
@@ -0,0 +1,15 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+        "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+<head>
+<title><?SERV_HUMANNODE></title>
+<meta name="MSSmartTagsPreventParsing" content="TRUE" />
+<link href="static/webcit.css" rel="stylesheet" type="text/css">
+<script type="text/javascript" src="static/wclib.js"></script>
+<script type="text/javascript" src="static/prototype.js"></script>
+<script type="text/javascript" src="static/scriptaculous.js"></script>
+<script type="text/javascript" src="static/niftycube.js"></script>
+
+</head>
+<body>
+<! end head.html>
diff --git a/webcit/static/hr.gif b/webcit/static/hr.gif
new file mode 100644 (file)
index 0000000..c98da9d
Binary files /dev/null and b/webcit/static/hr.gif differ
diff --git a/webcit/static/hyperlink.gif b/webcit/static/hyperlink.gif
new file mode 100644 (file)
index 0000000..1fb1a4a
Binary files /dev/null and b/webcit/static/hyperlink.gif differ
diff --git a/webcit/static/image.gif b/webcit/static/image.gif
new file mode 100644 (file)
index 0000000..8cbba16
Binary files /dev/null and b/webcit/static/image.gif differ
diff --git a/webcit/static/inactiveuser_24x.gif b/webcit/static/inactiveuser_24x.gif
new file mode 100644 (file)
index 0000000..74a3c1e
Binary files /dev/null and b/webcit/static/inactiveuser_24x.gif differ
diff --git a/webcit/static/indent.gif b/webcit/static/indent.gif
new file mode 100644 (file)
index 0000000..2abb6b2
Binary files /dev/null and b/webcit/static/indent.gif differ
diff --git a/webcit/static/instant_messenger.html b/webcit/static/instant_messenger.html
new file mode 100644 (file)
index 0000000..1db2b4a
--- /dev/null
@@ -0,0 +1,209 @@
+<html>
+<head>
+       <title>Citadel Instant Messenger</title>
+       <script type="text/javascript" src="prototype.js"></script>
+       <script type="text/javascript" src="wclib.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">
+
+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()
+               + '&g_cmd=SEXP ' + recipient + '|' + thetext;
+       new Ajax.Request('../ajax_servcmd',
+               {
+                       method: 'get',
+                       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=\"citadelchat_16x.gif\">&nbsp;'
+                       + '<input type=\"text\" size=\"72\" maxlength=\"72\" 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 = 'g_cmd=GEXP&r=' + Math.random();
+       new Ajax.Request('../ajax_servcmd',
+               {
+                       method: 'get',
+                       parameters: parms,
+                       onSuccess: ShowNewMsg
+               }
+       );
+}
+
+// Perform some initialization.
+parms = '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/italic.gif b/webcit/static/italic.gif
new file mode 100644 (file)
index 0000000..8b1485b
Binary files /dev/null and b/webcit/static/italic.gif differ
diff --git a/webcit/static/justifyfull.gif b/webcit/static/justifyfull.gif
new file mode 100644 (file)
index 0000000..b12528b
Binary files /dev/null and b/webcit/static/justifyfull.gif differ
diff --git a/webcit/static/lastnode.gif b/webcit/static/lastnode.gif
new file mode 100644 (file)
index 0000000..d1fbed7
Binary files /dev/null and b/webcit/static/lastnode.gif differ
diff --git a/webcit/static/left_just.gif b/webcit/static/left_just.gif
new file mode 100644 (file)
index 0000000..505c5d9
Binary files /dev/null and b/webcit/static/left_just.gif differ
diff --git a/webcit/static/line.gif b/webcit/static/line.gif
new file mode 100644 (file)
index 0000000..1bb437a
Binary files /dev/null and b/webcit/static/line.gif differ
diff --git a/webcit/static/list.gif b/webcit/static/list.gif
new file mode 100644 (file)
index 0000000..b3018d9
Binary files /dev/null and b/webcit/static/list.gif differ
diff --git a/webcit/static/login.html b/webcit/static/login.html
new file mode 100644 (file)
index 0000000..6ec9261
--- /dev/null
@@ -0,0 +1,39 @@
+<?=beginbox>
+<center>
+<font color="#FF0000"><?MESG></font>
+<table border=0>
+<tr>
+<td align=center>
+       <?HELLO>
+       <form action="login" method="POST">
+
+       <table border="0" cellspacing="5" cellpadding="5" bgcolor="#EEEEEE">
+               <tr><td><?USERNAME_BOX></td>
+               <td><input type="text" name="name" maxlength="25"></td></tr>
+               <tr><td><?PASSWORD_BOX></td>
+               <td><input type="password" name="pass" maxlength="20"></td></tr>
+               <tr><td><?LANGUAGE_BOX></td>
+               <td><?DO_LANGUAGE_BOX></td></tr>
+
+       <tr><td align=center colspan=2>
+       <input type="submit" name="login_action" value="<?LOGIN_BUTTON>">
+       <?NEWUSER_BUTTON_PRE>
+       <input type="submit" name="newuser_action" value="<?NEWUSER_BUTTON>">
+       <?NEWUSER_BUTTON_POST>
+       <input type="submit" name="exit_action" value="<?EXIT_BUTTON>">
+       </td></tr>
+
+       </table>
+       </form>
+
+       </td>
+       <td align="center"><p><img src="image&name=hello"></p></td>
+       </tr>
+       <tr>
+               <td colspan="2">
+               <?LOGIN_INSTRUCTIONS>
+               </td>
+</tr>
+</table>
+</center>
+<?=endbox>
diff --git a/webcit/static/logoff_32x.gif b/webcit/static/logoff_32x.gif
new file mode 100644 (file)
index 0000000..1c42037
Binary files /dev/null and b/webcit/static/logoff_32x.gif differ
diff --git a/webcit/static/markngo_24x.gif b/webcit/static/markngo_24x.gif
new file mode 100644 (file)
index 0000000..cc7afeb
Binary files /dev/null and b/webcit/static/markngo_24x.gif differ
diff --git a/webcit/static/menubar.html b/webcit/static/menubar.html
new file mode 100644 (file)
index 0000000..35416fe
--- /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"><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" target="aboutcit"
+       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/minus.gif b/webcit/static/minus.gif
new file mode 100644 (file)
index 0000000..50f623b
Binary files /dev/null and b/webcit/static/minus.gif differ
diff --git a/webcit/static/minus_last.gif b/webcit/static/minus_last.gif
new file mode 100644 (file)
index 0000000..c316c83
Binary files /dev/null and b/webcit/static/minus_last.gif differ
diff --git a/webcit/static/minus_last_no_root.gif b/webcit/static/minus_last_no_root.gif
new file mode 100644 (file)
index 0000000..cd52861
Binary files /dev/null and b/webcit/static/minus_last_no_root.gif differ
diff --git a/webcit/static/minus_no_root.gif b/webcit/static/minus_no_root.gif
new file mode 100644 (file)
index 0000000..0cd1ab6
Binary files /dev/null and b/webcit/static/minus_no_root.gif differ
diff --git a/webcit/static/minus_nolines.gif b/webcit/static/minus_nolines.gif
new file mode 100644 (file)
index 0000000..b54e870
Binary files /dev/null and b/webcit/static/minus_nolines.gif differ
diff --git a/webcit/static/monthview2_24x.gif b/webcit/static/monthview2_24x.gif
new file mode 100644 (file)
index 0000000..209be94
Binary files /dev/null and b/webcit/static/monthview2_24x.gif differ
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/newmess2_24x.gif b/webcit/static/newmess2_24x.gif
new file mode 100644 (file)
index 0000000..fcfeb99
Binary files /dev/null and b/webcit/static/newmess2_24x.gif differ
diff --git a/webcit/static/newmess3_24x.gif b/webcit/static/newmess3_24x.gif
new file mode 100644 (file)
index 0000000..3c6ac92
Binary files /dev/null and b/webcit/static/newmess3_24x.gif differ
diff --git a/webcit/static/newstartpage.html b/webcit/static/newstartpage.html
new file mode 100644 (file)
index 0000000..680eb4f
--- /dev/null
@@ -0,0 +1,22 @@
+<! newstartpage.html start>
+<table width="100%" border="0" bgcolor="#444455">
+<tr>
+       <td>
+               <font size=+1 color="#FFFFFF"
+               <b>New start page</b>
+               </font>
+       </td>
+</tr>
+</table>
+
+<center>
+<font size=+2>Your start page has been changed.</font>
+<br /><br />
+
+<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>
+</center>
+<! newstartpage.html end>
\ No newline at end of file
diff --git a/webcit/static/nextdate_32x.gif b/webcit/static/nextdate_32x.gif
new file mode 100644 (file)
index 0000000..6288caf
Binary files /dev/null and b/webcit/static/nextdate_32x.gif differ
diff --git a/webcit/static/niftyCorners.css b/webcit/static/niftyCorners.css
new file mode 100644 (file)
index 0000000..6570f60
--- /dev/null
@@ -0,0 +1,35 @@
+/*Nifty Corners Cube CSS by Alessandro Fulciniti\r
+The following classes are added dinamically by javascript,\r
+and their use should be avoided in the markup */\r
+\r
+b.niftycorners,b.niftyfill{display:block}\r
+b.niftycorners *{display:block;height: 1px;line-height:1px;font-size: 1px;\r
+    overflow:hidden;border-style:solid;border-width: 0 1px}\r
+/*normal*/\r
+b.r1{margin: 0 3px;border-width: 0 2px}\r
+b.r2{margin: 0 2px}\r
+b.r3{margin: 0 1px}\r
+b.r4{height: 2px}\r
+b.rb1{margin: 0 8px;border-width:0 2px}\r
+b.rb2{margin: 0 6px;border-width:0 2px}\r
+b.rb3{margin: 0 5px}\r
+b.rb4{margin: 0 4px}\r
+b.rb5{margin: 0 3px}\r
+b.rb6{margin: 0 2px}\r
+b.rb7{margin: 0 1px;height:2px}\r
+b.rb8{margin: 0;height:2px}\r
+b.rs1{margin: 0 1px}\r
+/*transparent inside*/\r
+b.t1{border-width: 0 5px}\r
+b.t2{border-width: 0 3px}\r
+b.t3{border-width: 0 2px}\r
+b.t4{height: 2px}\r
+b.tb1{border-width: 0 10px}\r
+b.tb2{border-width: 0 8px}\r
+b.tb3{border-width: 0 6px}\r
+b.tb4{border-width: 0 5px}\r
+b.tb5{border-width: 0 4px}\r
+b.tb6{border-width: 0 3px}\r
+b.tb7{border-width: 0 2px;height:2px}\r
+b.tb8{border-width: 0 1px;height:2px}\r
+b.ts1{border-width: 0 2px}
\ No newline at end of file
diff --git a/webcit/static/niftycube.js b/webcit/static/niftycube.js
new file mode 100644 (file)
index 0000000..ccaed31
--- /dev/null
@@ -0,0 +1,298 @@
+/* Nifty Corners Cube - rounded corners with CSS and Javascript\r
+Copyright 2006 Alessandro Fulciniti (a.fulciniti@html.it)\r
+\r
+This program is free software; you can redistribute it and/or modify\r
+it under the terms of the GNU General Public License as published by\r
+the Free Software Foundation; either version 2 of the License, or\r
+(at your option) any later version.\r
+\r
+This program 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\r
+GNU General Public License for more details.\r
+\r
+You should have received a copy of the GNU General Public License\r
+along with this program; if not, write to the Free Software\r
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA\r
+*/\r
+\r
+var niftyOk=(document.getElementById && document.createElement && Array.prototype.push);\r
+var niftyCss=false;\r
+\r
+String.prototype.find=function(what){\r
+return(this.indexOf(what)>=0 ? true : false);\r
+}\r
+\r
+var oldonload=window.onload;\r
+if(typeof(NiftyLoad)!='function') NiftyLoad=function(){};\r
+if(typeof(oldonload)=='function')\r
+    window.onload=function(){oldonload();AddCss();NiftyLoad()};\r
+else window.onload=function(){AddCss();NiftyLoad()};\r
+\r
+function AddCss(){\r
+niftyCss=true;\r
+var l=CreateEl("link");\r
+l.setAttribute("type","text/css");\r
+l.setAttribute("rel","stylesheet");\r
+l.setAttribute("href","static/niftyCorners.css");\r
+l.setAttribute("media","screen");\r
+document.getElementsByTagName("head")[0].appendChild(l);\r
+}\r
+\r
+function Nifty(selector,options){\r
+if(niftyOk==false) return;\r
+if(niftyCss==false) AddCss();\r
+var i,v=selector.split(","),h=0;\r
+if(options==null) options="";\r
+if(options.find("fixed-height"))\r
+    h=getElementsBySelector(v[0])[0].offsetHeight;\r
+for(i=0;i<v.length;i++)\r
+    Rounded(v[i],options);\r
+if(options.find("height")) SameHeight(selector,h);\r
+}\r
+\r
+function Rounded(selector,options){\r
+var i,top="",bottom="",v=new Array();\r
+if(options!=""){\r
+    options=options.replace("left","tl bl");\r
+    options=options.replace("right","tr br");\r
+    options=options.replace("top","tr tl");\r
+    options=options.replace("bottom","br bl");\r
+    options=options.replace("transparent","alias");\r
+    if(options.find("tl")){\r
+        top="both";\r
+        if(!options.find("tr")) top="left";\r
+        }\r
+    else if(options.find("tr")) top="right";\r
+    if(options.find("bl")){\r
+        bottom="both";\r
+        if(!options.find("br")) bottom="left";\r
+        }\r
+    else if(options.find("br")) bottom="right";\r
+    }\r
+if(top=="" && bottom=="" && !options.find("none")){top="both";bottom="both";}\r
+v=getElementsBySelector(selector);\r
+for(i=0;i<v.length;i++){\r
+    FixIE(v[i]);\r
+    if(top!="") AddTop(v[i],top,options);\r
+    if(bottom!="") AddBottom(v[i],bottom,options);\r
+    }\r
+}\r
+\r
+function AddTop(el,side,options){\r
+var d=CreateEl("b"),lim=4,border="",p,i,btype="r",bk,color;\r
+d.style.marginLeft="-"+getPadding(el,"Left")+"px";\r
+d.style.marginRight="-"+getPadding(el,"Right")+"px";\r
+if(options.find("alias") || (color=getBk(el))=="transparent"){\r
+    color="transparent";bk="transparent"; border=getParentBk(el);btype="t";\r
+    }\r
+else{\r
+    bk=getParentBk(el); border=Mix(color,bk);\r
+    }\r
+d.style.background=bk;\r
+d.className="niftycorners";\r
+p=getPadding(el,"Top");\r
+if(options.find("small")){\r
+    d.style.marginBottom=(p-2)+"px";\r
+    btype+="s"; lim=2;\r
+    }\r
+else if(options.find("big")){\r
+    d.style.marginBottom=(p-10)+"px";\r
+    btype+="b"; lim=8;\r
+    }\r
+else d.style.marginBottom=(p-5)+"px";\r
+for(i=1;i<=lim;i++)\r
+    d.appendChild(CreateStrip(i,side,color,border,btype));\r
+el.style.paddingTop="0";\r
+el.insertBefore(d,el.firstChild);\r
+}\r
+\r
+function AddBottom(el,side,options){\r
+var d=CreateEl("b"),lim=4,border="",p,i,btype="r",bk,color;\r
+d.style.marginLeft="-"+getPadding(el,"Left")+"px";\r
+d.style.marginRight="-"+getPadding(el,"Right")+"px";\r
+if(options.find("alias") || (color=getBk(el))=="transparent"){\r
+    color="transparent";bk="transparent"; border=getParentBk(el);btype="t";\r
+    }\r
+else{\r
+    bk=getParentBk(el); border=Mix(color,bk);\r
+    }\r
+d.style.background=bk;\r
+d.className="niftycorners";\r
+p=getPadding(el,"Bottom");\r
+if(options.find("small")){\r
+    d.style.marginTop=(p-2)+"px";\r
+    btype+="s"; lim=2;\r
+    }\r
+else if(options.find("big")){\r
+    d.style.marginTop=(p-10)+"px";\r
+    btype+="b"; lim=8;\r
+    }\r
+else d.style.marginTop=(p-5)+"px";\r
+for(i=lim;i>0;i--)\r
+    d.appendChild(CreateStrip(i,side,color,border,btype));\r
+el.style.paddingBottom=0;\r
+el.appendChild(d);\r
+}\r
+\r
+function CreateStrip(index,side,color,border,btype){\r
+var x=CreateEl("b");\r
+x.className=btype+index;\r
+x.style.backgroundColor=color;\r
+x.style.borderColor=border;\r
+if(side=="left"){\r
+    x.style.borderRightWidth="0";\r
+    x.style.marginRight="0";\r
+    }\r
+else if(side=="right"){\r
+    x.style.borderLeftWidth="0";\r
+    x.style.marginLeft="0";\r
+    }\r
+return(x);\r
+}\r
+\r
+function CreateEl(x){\r
+return(document.createElement(x));\r
+}\r
+\r
+function FixIE(el){\r
+if(el.currentStyle!=null && el.currentStyle.hasLayout!=null && el.currentStyle.hasLayout==false)\r
+    el.style.display="inline-block";\r
+}\r
+\r
+function SameHeight(selector,maxh){\r
+var i,v=selector.split(","),t,j,els=[],gap;\r
+for(i=0;i<v.length;i++){\r
+    t=getElementsBySelector(v[i]);\r
+    els=els.concat(t);\r
+    }\r
+for(i=0;i<els.length;i++){\r
+    if(els[i].offsetHeight>maxh) maxh=els[i].offsetHeight;\r
+    els[i].style.height="auto";\r
+    }\r
+for(i=0;i<els.length;i++){\r
+    gap=maxh-els[i].offsetHeight;\r
+    if(gap>0){\r
+        t=CreateEl("b");t.className="niftyfill";t.style.height=gap+"px";\r
+        nc=els[i].lastChild;\r
+        if(nc.className=="niftycorners")\r
+            els[i].insertBefore(t,nc);\r
+        else els[i].appendChild(t);\r
+        }\r
+    }\r
+}\r
+\r
+function getElementsBySelector(selector){\r
+var i,j,selid="",selclass="",tag=selector,tag2="",v2,k,f,a,s=[],objlist=[],c;\r
+if(selector.find("#")){ //id selector like "tag#id"\r
+    if(selector.find(" ")){  //descendant selector like "tag#id tag"\r
+        s=selector.split(" ");\r
+        var fs=s[0].split("#");\r
+        if(fs.length==1) return(objlist);\r
+        f=document.getElementById(fs[1]);\r
+        if(f){\r
+            v=f.getElementsByTagName(s[1]);\r
+            for(i=0;i<v.length;i++) objlist.push(v[i]);\r
+            }\r
+        return(objlist);\r
+        }\r
+    else{\r
+        s=selector.split("#");\r
+        tag=s[0];\r
+        selid=s[1];\r
+        if(selid!=""){\r
+            f=document.getElementById(selid);\r
+            if(f) objlist.push(f);\r
+            return(objlist);\r
+            }\r
+        }\r
+    }\r
+if(selector.find(".")){      //class selector like "tag.class"\r
+    s=selector.split(".");\r
+    tag=s[0];\r
+    selclass=s[1];\r
+    if(selclass.find(" ")){   //descendant selector like tag1.classname tag2\r
+        s=selclass.split(" ");\r
+        selclass=s[0];\r
+        tag2=s[1];\r
+        }\r
+    }\r
+var v=document.getElementsByTagName(tag);  // tag selector like "tag"\r
+if(selclass==""){\r
+    for(i=0;i<v.length;i++) objlist.push(v[i]);\r
+    return(objlist);\r
+    }\r
+for(i=0;i<v.length;i++){\r
+    c=v[i].className.split(" ");\r
+    for(j=0;j<c.length;j++){\r
+        if(c[j]==selclass){\r
+            if(tag2=="") objlist.push(v[i]);\r
+            else{\r
+                v2=v[i].getElementsByTagName(tag2);\r
+                for(k=0;k<v2.length;k++) objlist.push(v2[k]);\r
+                }\r
+            }\r
+        }\r
+    }\r
+return(objlist);\r
+}\r
+\r
+function getParentBk(x){\r
+var el=x.parentNode,c;\r
+while(el.tagName.toUpperCase()!="HTML" && (c=getBk(el))=="transparent")\r
+    el=el.parentNode;\r
+if(c=="transparent") c="#FFFFFF";\r
+return(c);\r
+}\r
+\r
+function getBk(x){\r
+var c=getStyleProp(x,"backgroundColor");\r
+if(c==null || c=="transparent" || c.find("rgba(0, 0, 0, 0)"))\r
+    return("transparent");\r
+if(c.find("rgb")) c=rgb2hex(c);\r
+return(c);\r
+}\r
+\r
+function getPadding(x,side){\r
+var p=getStyleProp(x,"padding"+side);\r
+if(p==null || !p.find("px")) return(0);\r
+return(parseInt(p));\r
+}\r
+\r
+function getStyleProp(x,prop){\r
+if(x.currentStyle)\r
+    return(x.currentStyle[prop]);\r
+if(document.defaultView.getComputedStyle)\r
+    return(document.defaultView.getComputedStyle(x,'')[prop]);\r
+return(null);\r
+}\r
+\r
+function rgb2hex(value){\r
+var hex="",v,h,i;\r
+var regexp=/([0-9]+)[, ]+([0-9]+)[, ]+([0-9]+)/;\r
+var h=regexp.exec(value);\r
+for(i=1;i<4;i++){\r
+    v=parseInt(h[i]).toString(16);\r
+    if(v.length==1) hex+="0"+v;\r
+    else hex+=v;\r
+    }\r
+return("#"+hex);\r
+}\r
+\r
+function Mix(c1,c2){\r
+var i,step1,step2,x,y,r=new Array(3);\r
+if(c1.length==4)step1=1;\r
+else step1=2;\r
+if(c2.length==4) step2=1;\r
+else step2=2;\r
+for(i=0;i<3;i++){\r
+    x=parseInt(c1.substr(1+step1*i,step1),16);\r
+    if(step1==1) x=16*x+x;\r
+    y=parseInt(c2.substr(1+step2*i,step2),16);\r
+    if(step2==1) y=16*y+y;\r
+    r[i]=Math.floor((x*50+y*50)/100);\r
+    r[i]=r[i].toString(16);\r
+    if(r[i].length==1) r[i]="0"+r[i];\r
+    }\r
+return("#"+r[0]+r[1]+r[2]);\r
+}\r
diff --git a/webcit/static/nocookies.html b/webcit/static/nocookies.html
new file mode 100644 (file)
index 0000000..6962be4
--- /dev/null
@@ -0,0 +1,15 @@
+<html>
+<head>
+       <title>Error</title>
+</head>
+<body>
+
+<div align="center">
+<h2>Sorry!</h2>
+<br />
+This site requires both Cookies and JavaScript to be enabled in your browser.<br />
+Please enable these features and log in again.  We are sorry for the inconvenience.
+</div>
+
+</body>
+</html>
diff --git a/webcit/static/numbered_list.gif b/webcit/static/numbered_list.gif
new file mode 100644 (file)
index 0000000..d1a4dbc
Binary files /dev/null and b/webcit/static/numbered_list.gif differ
diff --git a/webcit/static/outdent.gif b/webcit/static/outdent.gif
new file mode 100644 (file)
index 0000000..fa3c1b6
Binary files /dev/null and b/webcit/static/outdent.gif differ
diff --git a/webcit/static/page.gif b/webcit/static/page.gif
new file mode 100644 (file)
index 0000000..27f9698
Binary files /dev/null and b/webcit/static/page.gif differ
diff --git a/webcit/static/page16x16.gif b/webcit/static/page16x16.gif
new file mode 100644 (file)
index 0000000..1a3b54c
Binary files /dev/null and b/webcit/static/page16x16.gif differ
diff --git a/webcit/static/palette.htm b/webcit/static/palette.htm
new file mode 100644 (file)
index 0000000..4572f81
--- /dev/null
@@ -0,0 +1,124 @@
+<html>\r
+<head>\r
+       <title>Text Color</title>\r
+       <script type="text/javascript">\r
+       <!--\r
+       function selectColor(color) {\r
+               self.parent.setColor(color);\r
+       }\r
+       \r
+       function InitColorPalette() {\r
+               if (document.getElementsByTagName)\r
+                       var x = document.getElementsByTagName('TD');\r
+               else if (document.all)\r
+                       var x = document.all.tags('TD');\r
+               for (var i=0;i<x.length;i++) {\r
+                       x[i].onmouseover = over;\r
+                       x[i].onmouseout = out;\r
+                       x[i].onclick = click;\r
+               }\r
+       }\r
+       \r
+       function over() {\r
+               this.style.border='1px dotted white';\r
+       }\r
+       \r
+       function out() {\r
+               this.style.border='1px solid gray';\r
+       }\r
+       \r
+       function click() {\r
+               selectColor(this.id);\r
+       }\r
+       //-->\r
+       </script>\r
+</head>\r
+<body bgcolor="white" onLoad="InitColorPalette()" leftmargin="0" rightmargin="0" marginwidth="0" marginheight="0" topmargin="0" bottommargin="0">\r
+<table width="150" height="100" cellpadding="0" cellspacing="1" border="1" align="center">\r
+       <tr>\r
+               <td id="#FFFFFF" bgcolor="#FFFFFF" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#FFCCCC" bgcolor="#FFCCCC" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#FFCC99" bgcolor="#FFCC99" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#FFFF99" bgcolor="#FFFF99" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#FFFFCC" bgcolor="#FFFFCC" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#99FF99" bgcolor="#99FF99" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#99FFFF" bgcolor="#99FFFF" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#CCFFFF" bgcolor="#CCFFFF" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#CCCCFF" bgcolor="#CCCCFF" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#FFCCFF" bgcolor="#FFCCFF" width="10" height="10"><img width="1" height="1"></td>\r
+       </tr>\r
+       <tr>\r
+               <td id="#CCCCCC" bgcolor="#CCCCCC" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#FF6666" bgcolor="#FF6666" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#FF9966" bgcolor="#FF9966" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#FFFF66" bgcolor="#FFFF66" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#FFFF33" bgcolor="#FFFF33" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#66FF99" bgcolor="#66FF99" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#33FFFF" bgcolor="#33FFFF" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#66FFFF" bgcolor="#66FFFF" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#9999FF" bgcolor="#9999FF" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#FF99FF" bgcolor="#FF99FF" width="10" height="10"><img width="1" height="1"></td>\r
+       </tr>\r
+       <tr>\r
+               <td id="#C0C0C0" bgcolor="#C0C0C0" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#FF0000" bgcolor="#FF0000" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#FF9900" bgcolor="#FF9900" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#FFCC66" bgcolor="#FFCC66" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#FFFF00" bgcolor="#FFFF00" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#33FF33" bgcolor="#33FF33" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#66CCCC" bgcolor="#66CCCC" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#33CCFF" bgcolor="#33CCFF" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#6666CC" bgcolor="#6666CC" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#CC66CC" bgcolor="#CC66CC" width="10" height="10"><img width="1" height="1"></td>\r
+       </tr>\r
+       <tr>\r
+               <td id="#999999" bgcolor="#999999" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#CC0000" bgcolor="#CC0000" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#FF6600" bgcolor="#FF6600" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#FFCC33" bgcolor="#FFCC33" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#FFCC00" bgcolor="#FFCC00" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#33CC00" bgcolor="#33CC00" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#00CCCC" bgcolor="#00CCCC" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#3366FF" bgcolor="#3366FF" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#6633FF" bgcolor="#6633FF" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#CC33CC" bgcolor="#CC33CC" width="10" height="10"><img width="1" height="1"></td>\r
+       </tr>\r
+       <tr>\r
+               <td id="#666666" bgcolor="#666666" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#990000" bgcolor="#990000" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#CC6600" bgcolor="#CC6600" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#CC9933" bgcolor="#CC9933" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#999900" bgcolor="#999900" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#009900" bgcolor="#009900" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#339999" bgcolor="#339999" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#3333FF" bgcolor="#3333FF" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#6600CC" bgcolor="#6600CC" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#993399" bgcolor="#993399" width="10" height="10"><img width="1" height="1"></td>\r
+       </tr>\r
+       <tr>\r
+               <td id="#333333" bgcolor="#333333" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#660000" bgcolor="#660000" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#993300" bgcolor="#993300" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#996633" bgcolor="#996633" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#666600" bgcolor="#666600" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#006600" bgcolor="#006600" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#336666" bgcolor="#336666" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#000099" bgcolor="#000099" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#333399" bgcolor="#333399" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#663366" bgcolor="#663366" width="10" height="10"><img width="1" height="1"></td>\r
+       </tr>\r
+       <tr>\r
+               <td id="#000000" bgcolor="#000000" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#330000" bgcolor="#330000" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#663300" bgcolor="#663300" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#663333" bgcolor="#663333" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#333300" bgcolor="#333300" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#003300" bgcolor="#003300" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#003333" bgcolor="#003333" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#000066" bgcolor="#000066" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#330099" bgcolor="#330099" width="10" height="10"><img width="1" height="1"></td>\r
+               <td id="#330033" bgcolor="#330033" width="10" height="10"><img width="1" height="1"></td>\r
+       </tr>\r
+</table>\r
+</body>\r
+</html>\r
diff --git a/webcit/static/paste.gif b/webcit/static/paste.gif
new file mode 100644 (file)
index 0000000..9bcc76a
Binary files /dev/null and b/webcit/static/paste.gif differ
diff --git a/webcit/static/plus.gif b/webcit/static/plus.gif
new file mode 100644 (file)
index 0000000..c84dce2
Binary files /dev/null and b/webcit/static/plus.gif differ
diff --git a/webcit/static/plus_last.gif b/webcit/static/plus_last.gif
new file mode 100644 (file)
index 0000000..701c16c
Binary files /dev/null and b/webcit/static/plus_last.gif differ
diff --git a/webcit/static/plus_last_no_root.gif b/webcit/static/plus_last_no_root.gif
new file mode 100644 (file)
index 0000000..84e0662
Binary files /dev/null and b/webcit/static/plus_last_no_root.gif differ
diff --git a/webcit/static/plus_no_root.gif b/webcit/static/plus_no_root.gif
new file mode 100644 (file)
index 0000000..22a4a90
Binary files /dev/null and b/webcit/static/plus_no_root.gif differ
diff --git a/webcit/static/plus_nolines.gif b/webcit/static/plus_nolines.gif
new file mode 100644 (file)
index 0000000..a7dc6be
Binary files /dev/null and b/webcit/static/plus_nolines.gif differ
diff --git a/webcit/static/prevdate_32x.gif b/webcit/static/prevdate_32x.gif
new file mode 100644 (file)
index 0000000..c8c98b5
Binary files /dev/null and b/webcit/static/prevdate_32x.gif differ
diff --git a/webcit/static/privatemess_16x.gif b/webcit/static/privatemess_16x.gif
new file mode 100644 (file)
index 0000000..0070b72
Binary files /dev/null and b/webcit/static/privatemess_16x.gif differ
diff --git a/webcit/static/privatemess_32x.gif b/webcit/static/privatemess_32x.gif
new file mode 100644 (file)
index 0000000..9b9d6d4
Binary files /dev/null and b/webcit/static/privatemess_32x.gif differ
diff --git a/webcit/static/privatemess_48x.gif b/webcit/static/privatemess_48x.gif
new file mode 100644 (file)
index 0000000..2c54b39
Binary files /dev/null and b/webcit/static/privatemess_48x.gif differ
diff --git a/webcit/static/prototype.js b/webcit/static/prototype.js
new file mode 100644 (file)
index 0000000..ed7d920
--- /dev/null
@@ -0,0 +1,1257 @@
+/*  Prototype JavaScript framework, version 1.4.0_pre4
+ *  (c) 2005 Sam Stephenson <sam@conio.net>
+ *
+ *  THIS FILE IS AUTOMATICALLY GENERATED. When sending patches, please diff
+ *  against the source tree, available from the Prototype darcs repository. 
+ *
+ *  Prototype is freely distributable under the terms of an MIT-style license.
+ *
+ *  For details, see the Prototype web site: http://prototype.conio.net/
+ *
+/*--------------------------------------------------------------------------*/
+
+var Prototype = {
+  Version: '1.4.0_pre4',
+  
+  emptyFunction: function() {},
+  K: function(x) {return x}
+}
+
+var Class = {
+  create: function() {
+    return function() { 
+      this.initialize.apply(this, arguments);
+    }
+  }
+}
+
+var Abstract = new Object();
+
+Object.extend = function(destination, source) {
+  for (property in source) {
+    destination[property] = source[property];
+  }
+  return destination;
+}
+
+Function.prototype.bind = function(object) {
+  var __method = this;
+  return function() {
+    return __method.apply(object, arguments);
+  }
+}
+
+Function.prototype.bindAsEventListener = function(object) {
+  var __method = this;
+  return function(event) {
+    return __method.call(object, event || window.event);
+  }
+}
+
+Number.prototype.toColorPart = function() {
+  var digits = this.toString(16);
+  if (this < 16) return '0' + digits;
+  return digits;
+}
+
+var Try = {
+  these: function() {
+    var returnValue;
+
+    for (var i = 0; i < arguments.length; i++) {
+      var lambda = arguments[i];
+      try {
+        returnValue = lambda();
+        break;
+      } catch (e) {}
+    }
+
+    return returnValue;
+  }
+}
+
+/*--------------------------------------------------------------------------*/
+
+var PeriodicalExecuter = Class.create();
+PeriodicalExecuter.prototype = {
+  initialize: function(callback, frequency) {
+    this.callback = callback;
+    this.frequency = frequency;
+    this.currentlyExecuting = false;
+
+    this.registerCallback();
+  },
+
+  registerCallback: function() {
+    setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
+  },
+
+  onTimerEvent: function() {
+    if (!this.currentlyExecuting) {
+      try { 
+        this.currentlyExecuting = true;
+        this.callback(); 
+      } finally { 
+        this.currentlyExecuting = false;
+      }
+    }
+  }
+}
+
+/*--------------------------------------------------------------------------*/
+
+function $() {
+  var elements = new Array();
+
+  for (var i = 0; i < arguments.length; i++) {
+    var element = arguments[i];
+    if (typeof element == 'string')
+      element = document.getElementById(element);
+
+    if (arguments.length == 1) 
+      return element;
+
+    elements.push(element);
+  }
+
+  return elements;
+}
+
+if (!Array.prototype.push) {
+  Array.prototype.push = function() {
+               var startLength = this.length;
+               for (var i = 0; i < arguments.length; i++)
+      this[startLength + i] = arguments[i];
+         return this.length;
+  }
+}
+
+if (!Function.prototype.apply) {
+  // Based on code from http://www.youngpup.net/
+  Function.prototype.apply = function(object, parameters) {
+    var parameterStrings = new Array();
+    if (!object)     object = window;
+    if (!parameters) parameters = new Array();
+    
+    for (var i = 0; i < parameters.length; i++)
+      parameterStrings[i] = 'parameters[' + i + ']';
+    
+    object.__apply__ = this;
+    var result = eval('object.__apply__(' + 
+      parameterStrings.join(', ') + ')');
+    object.__apply__ = null;
+    
+    return result;
+  }
+}
+
+Object.extend(String.prototype, {
+  stripTags: function() {
+    return this.replace(/<\/?[^>]+>/gi, '');
+  },
+
+  escapeHTML: function() {
+    var div = document.createElement('div');
+    var text = document.createTextNode(this);
+    div.appendChild(text);
+    return div.innerHTML;
+  },
+
+  unescapeHTML: function() {
+    var div = document.createElement('div');
+    div.innerHTML = this.stripTags();
+    return div.childNodes[0].nodeValue;
+  },
+  
+  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;
+  }
+});
+
+
+var _break    = new Object();
+var _continue = new Object();
+
+var Enumerable = {
+  each: function(iterator) {
+    var index = 0;
+    try {
+      this._each(function(value) {
+        try {
+          iterator(value, index++);
+        } catch (e) {
+          if (e != _continue) throw e;
+        }
+      });
+    } catch (e) {
+      if (e != _break) throw e;
+    }
+  },
+  
+  all: function(iterator) {
+    var result = true;
+    this.each(function(value, index) {
+      if (!(result &= (iterator || Prototype.K)(value, index))) 
+        throw _break;
+    });
+    return result;
+  },
+  
+  any: function(iterator) {
+    var result = true;
+    this.each(function(value, index) {
+      if (result &= (iterator || Prototype.K)(value, index)) 
+        throw _break;
+    });
+    return result;
+  },
+  
+  collect: function(iterator) {
+    var results = [];
+    this.each(function(value, index) {
+      results.push(iterator(value, index));
+    });
+    return results;
+  },
+  
+  detect: function (iterator) {
+    var result;
+    this.each(function(value, index) {
+      if (iterator(value, index)) {
+        result = value;
+        throw _break;
+      }
+    });
+    return result;
+  },
+  
+  findAll: function(iterator) {
+    var results = [];
+    this.each(function(value, index) {
+      if (iterator(value, index))
+        results.push(value);
+    });
+    return results;
+  },
+  
+  grep: function(pattern, iterator) {
+    var results = [];
+    this.each(function(value, index) {
+      var stringValue = value.toString();
+      if (stringValue.match(pattern))
+        results.push((iterator || Prototype.K)(value, index));
+    })
+    return results;
+  },
+  
+  include: function(object) {
+    var found = false;
+    this.each(function(value) {
+      if (value == object) {
+        found = true;
+        throw _break;
+      }
+    });
+    return found;
+  },
+  
+  inject: function(memo, iterator) {
+    this.each(function(value, index) {
+      memo = iterator(memo, value, index);
+    });
+    return memo;
+  },
+  
+  invoke: function(method) {
+    var args = $A(arguments).slice(1);
+    return this.collect(function(value) {
+      return value[method].apply(value, args);
+    });
+  },
+  
+  max: function(iterator) {
+    var result;
+    this.each(function(value, index) {
+      value = (iterator || Prototype.K)(value, index);
+      if (value >= (result || value))
+        result = value;
+    });
+    return result;
+  },
+  
+  min: function(iterator) {
+    var result;
+    this.each(function(value, index) {
+      value = (iterator || Prototype.K)(value, index);
+      if (value <= (result || value))
+        result = value;
+    });
+    return result;
+  },
+  
+  partition: function(iterator) {
+    var trues = [], falses = [];
+    this.each(function(value, index) {
+      ((iterator || Prototype.K)(value, index) ? 
+        trues : falses).push(value);
+    });
+    return [trues, falses];
+  },
+  
+  pluck: function(property) {
+    var results = [];
+    this.each(function(value, index) {
+      results.push(value[property]);
+    });
+    return results;
+  },
+  
+  reject: function(iterator) {
+    var results = [];
+    this.each(function(value, index) {
+      if (!iterator(value, index))
+        results.push(value);
+    });
+    return results;
+  },
+  
+  sortBy: function(iterator) {
+    return this.collect(function(value, index) {
+      return {value: value, criteria: iterator(value, index)};
+    }).sort(function(left, right) {
+      var a = left.criteria, b = right.criteria;
+      return a < b ? -1 : a > b ? 1 : 0;
+    }).pluck('value');
+  },
+  
+  toArray: function() {
+    return this.collect(Prototype.K);
+  },
+  
+  zip: function() {
+    var iterator = Prototype.K, args = $A(arguments);
+    if (typeof args.last() == 'function')
+      iterator = args.pop();
+
+    var collections = [this].concat(args).map($A);
+    return this.map(function(value, index) {
+      iterator(value = collections.pluck(index));
+      return value;
+    });
+  }
+}
+
+Object.extend(Enumerable, {
+  map:     Enumerable.collect,
+  find:    Enumerable.detect,
+  select:  Enumerable.findAll,
+  member:  Enumerable.include,
+  entries: Enumerable.toArray
+});
+
+$A = Array.from = function(iterable) {
+  var results = [];
+  for (var i = 0; i < iterable.length; i++)
+    results.push(iterable[i]);
+  return results;
+}
+
+Object.extend(Array.prototype, {
+  _each: function(iterator) {
+    for (var i = 0; i < this.length; i++)
+      iterator(this[i]);
+  },
+  
+  first: function() {
+    return this[0];
+  },
+  
+  last: function() {
+    return this[this.length - 1];
+  }
+});
+
+Object.extend(Array.prototype, Enumerable);
+
+
+var Ajax = {
+  getTransport: function() {
+    return Try.these(
+      function() {return new ActiveXObject('Msxml2.XMLHTTP')},
+      function() {return new ActiveXObject('Microsoft.XMLHTTP')},
+      function() {return new XMLHttpRequest()}
+    ) || false;
+  }
+}
+
+Ajax.Base = function() {};
+Ajax.Base.prototype = {
+  setOptions: function(options) {
+    this.options = {
+      method:       'post',
+      asynchronous: true,
+      parameters:   ''
+    }
+    Object.extend(this.options, options || {});
+  },
+
+  responseIsSuccess: function() {
+    return this.transport.status == undefined
+        || this.transport.status == 0 
+        || (this.transport.status >= 200 && this.transport.status < 300);
+  },
+
+  responseIsFailure: function() {
+    return !this.responseIsSuccess();
+  }
+}
+
+Ajax.Request = Class.create();
+Ajax.Request.Events = 
+  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
+
+Ajax.Request.prototype = Object.extend(new Ajax.Base(), {
+  initialize: function(url, options) {
+    this.transport = Ajax.getTransport();
+    this.setOptions(options);
+    this.request(url);
+  },
+
+  request: function(url) {
+    var parameters = this.options.parameters || '';
+    if (parameters.length > 0) parameters += '&_=';
+
+    try {
+      if (this.options.method == 'get')
+        url += '?' + parameters;
+
+      this.transport.open(this.options.method, url,
+        this.options.asynchronous);
+
+      if (this.options.asynchronous) {
+        this.transport.onreadystatechange = this.onStateChange.bind(this);
+        setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10);
+      }
+
+      this.setRequestHeaders();
+
+      var body = this.options.postBody ? this.options.postBody : parameters;
+      this.transport.send(this.options.method == 'post' ? body : null);
+
+    } catch (e) {
+    }
+  },
+
+  setRequestHeaders: function() {
+    var requestHeaders = 
+      ['X-Requested-With', 'XMLHttpRequest',
+       'X-Prototype-Version', Prototype.Version];
+
+    if (this.options.method == 'post') {
+      requestHeaders.push('Content-type', 
+        'application/x-www-form-urlencoded');
+
+      /* Force "Connection: close" for Mozilla browsers to work around
+       * a bug where XMLHttpReqeuest sends an incorrect Content-length
+       * header. See Mozilla Bugzilla #246651. 
+       */
+      if (this.transport.overrideMimeType)
+        requestHeaders.push('Connection', 'close');
+    }
+
+    if (this.options.requestHeaders)
+      requestHeaders.push.apply(requestHeaders, this.options.requestHeaders);
+
+    for (var i = 0; i < requestHeaders.length; i += 2)
+      this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]);
+  },
+
+  onStateChange: function() {
+    var readyState = this.transport.readyState;
+    if (readyState != 1)
+      this.respondToReadyState(this.transport.readyState);
+  },
+
+  respondToReadyState: function(readyState) {
+    var event = Ajax.Request.Events[readyState];
+
+    if (event == 'Complete')
+      (this.options['on' + this.transport.status]
+       || this.options['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')]
+       || Prototype.emptyFunction)(this.transport);
+
+    (this.options['on' + event] || Prototype.emptyFunction)(this.transport);
+
+    /* Avoid memory leak in MSIE: clean up the oncomplete event handler */
+    if (event == 'Complete')
+      this.transport.onreadystatechange = Prototype.emptyFunction;
+  }
+});
+
+Ajax.Updater = Class.create();
+Ajax.Updater.ScriptFragment = '(?:<script.*?>)((\n|.)*?)(?:<\/script>)';
+
+Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), {
+  initialize: function(container, url, options) {
+    this.containers = {
+      success: container.success ? $(container.success) : $(container),
+      failure: container.failure ? $(container.failure) :
+        (container.success ? null : $(container))
+    }
+
+    this.transport = Ajax.getTransport();
+    this.setOptions(options);
+
+    var onComplete = this.options.onComplete || Prototype.emptyFunction;
+    this.options.onComplete = (function() {
+      this.updateContent();
+      onComplete(this.transport);
+    }).bind(this);
+
+    this.request(url);
+  },
+
+  updateContent: function() {
+    var receiver = this.responseIsSuccess() ?
+      this.containers.success : this.containers.failure;
+
+    var match    = new RegExp(Ajax.Updater.ScriptFragment, 'img');
+    var response = this.transport.responseText.replace(match, '');
+    var scripts  = this.transport.responseText.match(match);
+
+    if (receiver) {
+      if (this.options.insertion) {
+        new this.options.insertion(receiver, response);
+      } else {
+        receiver.innerHTML = response;
+      }
+    }
+
+    if (this.responseIsSuccess()) {
+      if (this.onComplete)
+        setTimeout((function() {this.onComplete(
+          this.transport)}).bind(this), 10);
+    }
+
+    if (this.options.evalScripts && scripts) {
+      match = new RegExp(Ajax.Updater.ScriptFragment, 'im');
+      setTimeout((function() {
+        for (var i = 0; i < scripts.length; i++)
+          eval(scripts[i].match(match)[1]);
+      }).bind(this), 10);
+    }
+  }
+});
+
+Ajax.PeriodicalUpdater = Class.create();
+Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), {
+  initialize: function(container, url, options) {
+    this.setOptions(options);
+    this.onComplete = this.options.onComplete;
+
+    this.frequency = (this.options.frequency || 2);
+    this.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.onComplete = undefined;
+    clearTimeout(this.timer);
+    (this.onComplete || Ajax.emptyFunction).apply(this, arguments);
+  },
+
+  updateComplete: function(request) {
+    if (this.options.decay) {
+      this.decay = (request.responseText == this.lastText ? 
+        this.decay * this.options.decay : 1);
+
+      this.lastText = request.responseText;
+    }
+    this.timer = setTimeout(this.onTimerEvent.bind(this), 
+      this.decay * this.frequency * 1000);
+  },
+
+  onTimerEvent: function() {
+    this.updater = new Ajax.Updater(this.container, this.url, this.options);
+  }
+});
+
+document.getElementsByClassName = function(className) {
+  var children = document.getElementsByTagName('*') || document.all;
+  var elements = new Array();
+  
+  for (var i = 0; i < children.length; i++) {
+    var child = children[i];
+    var classNames = child.className.split(' ');
+    for (var j = 0; j < classNames.length; j++) {
+      if (classNames[j] == className) {
+        elements.push(child);
+        break;
+      }
+    }
+  }
+  
+  return elements;
+}
+
+/*--------------------------------------------------------------------------*/
+
+if (!window.Element) {
+  var Element = new Object();
+}
+
+Object.extend(Element, {
+  toggle: function() {
+    for (var i = 0; i < arguments.length; i++) {
+      var element = $(arguments[i]);
+      element.style.display = 
+        (element.style.display == 'none' ? '' : 'none');
+    }
+  },
+
+  hide: function() {
+    for (var i = 0; i < arguments.length; i++) {
+      var element = $(arguments[i]);
+      element.style.display = 'none';
+    }
+  },
+
+  show: function() {
+    for (var i = 0; i < arguments.length; i++) {
+      var element = $(arguments[i]);
+      element.style.display = '';
+    }
+  },
+
+  remove: function(element) {
+    element = $(element);
+    element.parentNode.removeChild(element);
+  },
+   
+  getHeight: function(element) {
+    element = $(element);
+    return element.offsetHeight; 
+  },
+
+  hasClassName: function(element, className) {
+    element = $(element);
+    if (!element)
+      return;
+    var a = element.className.split(' ');
+    for (var i = 0; i < a.length; i++) {
+      if (a[i] == className)
+        return true;
+    }
+    return false;
+  },
+
+  addClassName: function(element, className) {
+    element = $(element);
+    Element.removeClassName(element, className);
+    element.className += ' ' + className;
+  },
+
+  removeClassName: function(element, className) {
+    element = $(element);
+    if (!element)
+      return;
+    var newClassName = '';
+    var a = element.className.split(' ');
+    for (var i = 0; i < a.length; i++) {
+      if (a[i] != className) {
+        if (i > 0)
+          newClassName += ' ';
+        newClassName += a[i];
+      }
+    }
+    element.className = newClassName;
+  },
+  
+  // removes whitespace-only text node children
+  cleanWhitespace: function(element) {
+    var element = $(element);
+    for (var i = 0; i < element.childNodes.length; i++) {
+      var node = element.childNodes[i];
+      if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) 
+        Element.remove(node);
+    }
+  }
+});
+
+var Toggle = new Object();
+Toggle.display = Element.toggle;
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.Insertion = function(adjacency) {
+  this.adjacency = adjacency;
+}
+
+Abstract.Insertion.prototype = {
+  initialize: function(element, content) {
+    this.element = $(element);
+    this.content = content;
+    
+    if (this.adjacency && this.element.insertAdjacentHTML) {
+      this.element.insertAdjacentHTML(this.adjacency, this.content);
+    } else {
+      this.range = this.element.ownerDocument.createRange();
+      if (this.initializeRange) this.initializeRange();
+      this.fragment = this.range.createContextualFragment(this.content);
+      this.insertContent();
+    }
+  }
+}
+
+var Insertion = new Object();
+
+Insertion.Before = Class.create();
+Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), {
+  initializeRange: function() {
+    this.range.setStartBefore(this.element);
+  },
+  
+  insertContent: function() {
+    this.element.parentNode.insertBefore(this.fragment, this.element);
+  }
+});
+
+Insertion.Top = Class.create();
+Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), {
+  initializeRange: function() {
+    this.range.selectNodeContents(this.element);
+    this.range.collapse(true);
+  },
+  
+  insertContent: function() {  
+    this.element.insertBefore(this.fragment, this.element.firstChild);
+  }
+});
+
+Insertion.Bottom = Class.create();
+Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), {
+  initializeRange: function() {
+    this.range.selectNodeContents(this.element);
+    this.range.collapse(this.element);
+  },
+  
+  insertContent: function() {
+    this.element.appendChild(this.fragment);
+  }
+});
+
+Insertion.After = Class.create();
+Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), {
+  initializeRange: function() {
+    this.range.setStartAfter(this.element);
+  },
+  
+  insertContent: function() {
+    this.element.parentNode.insertBefore(this.fragment, 
+      this.element.nextSibling);
+  }
+});
+
+var Field = {
+  clear: function() {
+    for (var i = 0; i < arguments.length; i++)
+      $(arguments[i]).value = '';
+  },
+
+  focus: function(element) {
+    $(element).focus();
+  },
+  
+  present: function() {
+    for (var i = 0; i < arguments.length; i++)
+      if ($(arguments[i]).value == '') return false;
+    return true;
+  },
+  
+  select: function(element) {
+    $(element).select();
+  },
+   
+  activate: function(element) {
+    $(element).focus();
+    $(element).select();
+  }
+}
+
+/*--------------------------------------------------------------------------*/
+
+var Form = {
+  serialize: function(form) {
+    var elements = Form.getElements($(form));
+    var queryComponents = new Array();
+    
+    for (var i = 0; i < elements.length; i++) {
+      var queryComponent = Form.Element.serialize(elements[i]);
+      if (queryComponent)
+        queryComponents.push(queryComponent);
+    }
+    
+    return queryComponents.join('&');
+  },
+  
+  getElements: function(form) {
+    var form = $(form);
+    var elements = new Array();
+
+    for (tagName in Form.Element.Serializers) {
+      var tagElements = form.getElementsByTagName(tagName);
+      for (var j = 0; j < tagElements.length; j++)
+        elements.push(tagElements[j]);
+    }
+    return elements;
+  },
+  
+  getInputs: function(form, typeName, name) {
+    var form = $(form);
+    var inputs = form.getElementsByTagName('input');
+    
+    if (!typeName && !name)
+      return inputs;
+      
+    var matchingInputs = new Array();
+    for (var i = 0; i < inputs.length; i++) {
+      var input = inputs[i];
+      if ((typeName && input.type != typeName) ||
+          (name && input.name != name)) 
+        continue;
+      matchingInputs.push(input);
+    }
+
+    return matchingInputs;
+  },
+
+  disable: function(form) {
+    var elements = Form.getElements(form);
+    for (var i = 0; i < elements.length; i++) {
+      var element = elements[i];
+      element.blur();
+      element.disabled = 'true';
+    }
+  },
+
+  enable: function(form) {
+    var elements = Form.getElements(form);
+    for (var i = 0; i < elements.length; i++) {
+      var element = elements[i];
+      element.disabled = '';
+    }
+  },
+
+  focusFirstElement: function(form) {
+    var form = $(form);
+    var elements = Form.getElements(form);
+    for (var i = 0; i < elements.length; i++) {
+      var element = elements[i];
+      if (element.type != 'hidden' && !element.disabled) {
+        Field.activate(element);
+        break;
+      }
+    }
+  },
+
+  reset: function(form) {
+    $(form).reset();
+  }
+}
+
+Form.Element = {
+  serialize: function(element) {
+    var element = $(element);
+    var method = element.tagName.toLowerCase();
+    var parameter = Form.Element.Serializers[method](element);
+    
+    if (parameter)
+      return encodeURIComponent(parameter[0]) + '=' + 
+        encodeURIComponent(parameter[1]);                   
+  },
+  
+  getValue: function(element) {
+    var element = $(element);
+    var method = element.tagName.toLowerCase();
+    var parameter = Form.Element.Serializers[method](element);
+    
+    if (parameter) 
+      return parameter[1];
+  }
+}
+
+Form.Element.Serializers = {
+  input: function(element) {
+    switch (element.type.toLowerCase()) {
+      case 'submit':
+      case 'hidden':
+      case 'password':
+      case 'text':
+        return Form.Element.Serializers.textarea(element);
+      case 'checkbox':  
+      case 'radio':
+        return Form.Element.Serializers.inputSelector(element);
+    }
+    return false;
+  },
+
+  inputSelector: function(element) {
+    if (element.checked)
+      return [element.name, element.value];
+  },
+
+  textarea: function(element) {
+    return [element.name, element.value];
+  },
+
+  select: function(element) {
+    var value = '';
+    if (element.type == 'select-one') {
+      var index = element.selectedIndex;
+      if (index >= 0)
+        value = element.options[index].value || element.options[index].text;
+    } else {
+      value = new Array();
+      for (var i = 0; i < element.length; i++) {
+        var opt = element.options[i];
+        if (opt.selected)
+          value.push(opt.value || opt.text);
+      }
+    }
+    return [element.name, value];
+  }
+}
+
+/*--------------------------------------------------------------------------*/
+
+var $F = Form.Element.getValue;
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.TimedObserver = function() {}
+Abstract.TimedObserver.prototype = {
+  initialize: function(element, frequency, callback) {
+    this.frequency = frequency;
+    this.element   = $(element);
+    this.callback  = callback;
+    
+    this.lastValue = this.getValue();
+    this.registerCallback();
+  },
+  
+  registerCallback: function() {
+    setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
+  },
+  
+  onTimerEvent: function() {
+    var value = this.getValue();
+    if (this.lastValue != value) {
+      this.callback(this.element, value);
+      this.lastValue = value;
+    }
+  }
+}
+
+Form.Element.Observer = Class.create();
+Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
+  getValue: function() {
+    return Form.Element.getValue(this.element);
+  }
+});
+
+Form.Observer = Class.create();
+Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
+  getValue: function() {
+    return Form.serialize(this.element);
+  }
+});
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.EventObserver = function() {}
+Abstract.EventObserver.prototype = {
+  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() {
+    var elements = Form.getElements(this.element);
+    for (var i = 0; i < elements.length; i++)
+      this.registerCallback(elements[i]);
+  },
+  
+  registerCallback: function(element) {
+    if (element.type) {
+      switch (element.type.toLowerCase()) {
+        case 'checkbox':  
+        case 'radio':
+          element.target = this;
+          element.prev_onclick = element.onclick || Prototype.emptyFunction;
+          element.onclick = function() {
+            this.prev_onclick(); 
+            this.target.onElementEvent();
+          }
+          break;
+        case 'password':
+        case 'text':
+        case 'textarea':
+        case 'select-one':
+        case 'select-multiple':
+          element.target = this;
+          element.prev_onchange = element.onchange || Prototype.emptyFunction;
+          element.onchange = function() {
+            this.prev_onchange(); 
+            this.target.onElementEvent();
+          }
+          break;
+      }
+    }    
+  }
+}
+
+Form.Element.EventObserver = Class.create();
+Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
+  getValue: function() {
+    return Form.Element.getValue(this.element);
+  }
+});
+
+Form.EventObserver = Class.create();
+Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
+  getValue: function() {
+    return Form.serialize(this.element);
+  }
+});
+
+
+if (!window.Event) {
+  var Event = new Object();
+}
+
+Object.extend(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,
+
+  element: function(event) {
+    return event.target || event.srcElement;
+  },
+
+  isLeftClick: function(event) {
+    return (((event.which) && (event.which == 1)) ||
+            ((event.button) && (event.button == 1)));
+  },
+
+  pointerX: function(event) {
+    return event.pageX || (event.clientX + 
+      (document.documentElement.scrollLeft || document.body.scrollLeft));
+  },
+
+  pointerY: function(event) {
+    return event.pageY || (event.clientY + 
+      (document.documentElement.scrollTop || document.body.scrollTop));
+  },
+
+  stop: function(event) {
+    if (event.preventDefault) { 
+      event.preventDefault(); 
+      event.stopPropagation(); 
+    } else {
+      event.returnValue = false;
+    }
+  },
+
+  // find the first node with the given tagName, starting from the
+  // node the event was triggered on; traverses the DOM upwards
+  findElement: function(event, tagName) {
+    var element = Event.element(event);
+    while (element.parentNode && (!element.tagName ||
+        (element.tagName.toUpperCase() != tagName.toUpperCase())))
+      element = element.parentNode;
+    return element;
+  },
+
+  observers: false,
+  
+  _observeAndCache: function(element, name, observer, useCapture) {
+    if (!this.observers) this.observers = [];
+    if (element.addEventListener) {
+      this.observers.push([element, name, observer, useCapture]);
+      element.addEventListener(name, observer, useCapture);
+    } else if (element.attachEvent) {
+      this.observers.push([element, name, observer, useCapture]);
+      element.attachEvent('on' + name, observer);
+    }
+  },
+  
+  unloadCache: function() {
+    if (!Event.observers) return;
+    for (var i = 0; i < Event.observers.length; i++) {
+      Event.stopObserving.apply(this, Event.observers[i]);
+      Event.observers[i][0] = null;
+    }
+    Event.observers = false;
+  },
+
+  observe: function(element, name, observer, useCapture) {
+    var element = $(element);
+    useCapture = useCapture || false;
+    
+    if (name == 'keypress' &&
+        ((/Konqueror|Safari|KHTML/.test(navigator.userAgent)) 
+        || element.attachEvent))
+      name = 'keydown';
+    
+    this._observeAndCache(element, name, observer, useCapture);
+  },
+
+  stopObserving: function(element, name, observer, useCapture) {
+    var element = $(element);
+    useCapture = useCapture || false;
+    
+    if (name == 'keypress' &&
+        ((/Konqueror|Safari|KHTML/.test(navigator.userAgent)) 
+        || element.detachEvent))
+      name = 'keydown';
+    
+    if (element.removeEventListener) {
+      element.removeEventListener(name, observer, useCapture);
+    } else if (element.detachEvent) {
+      element.detachEvent('on' + name, observer);
+    }
+  }
+});
+
+/* prevent memory leaks in IE */
+Event.observe(window, 'unload', Event.unloadCache, false);
+
+var Position = {
+
+  // set to true if needed, warning: firefox performance problems
+  // NOT neeeded for page scrolling, only if draggable contained in
+  // scrollable elements
+  includeScrollOffsets: false, 
+
+  // must be called before calling withinIncludingScrolloffset, every time the
+  // page is scrolled
+  prepare: function() {
+    this.deltaX =  window.pageXOffset 
+                || document.documentElement.scrollLeft 
+                || document.body.scrollLeft 
+                || 0;
+    this.deltaY =  window.pageYOffset 
+                || document.documentElement.scrollTop 
+                || document.body.scrollTop 
+                || 0;
+  },
+
+  realOffset: function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.scrollTop  || 0;
+      valueL += element.scrollLeft || 0; 
+      element = element.parentNode;
+    } while (element);
+    return [valueL, valueT];
+  },
+
+  cumulativeOffset: function(element) {
+    var valueT = 0, valueL = 0;
+    do {
+      valueT += element.offsetTop  || 0;
+      valueL += element.offsetLeft || 0;
+      element = element.offsetParent;
+    } while (element);
+    return [valueL, valueT];
+  },
+
+  // caches x/y coordinate pair to use with overlap
+  within: function(element, x, y) {
+    if (this.includeScrollOffsets)
+      return this.withinIncludingScrolloffsets(element, x, y);
+    this.xcomp = x;
+    this.ycomp = y;
+    this.offset = this.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 = this.realOffset(element);
+
+    this.xcomp = x + offsetcache[0] - this.deltaX;
+    this.ycomp = y + offsetcache[1] - this.deltaY;
+    this.offset = this.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);
+  },
+
+  // within must be called directly before
+  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;
+  },
+
+  clone: function(source, target) {
+    source = $(source);
+    target = $(target);
+    target.style.position = 'absolute';
+    var offsets = this.cumulativeOffset(source);
+    target.style.top    = offsets[1] + 'px';
+    target.style.left   = offsets[0] + 'px';
+    target.style.width  = source.offsetWidth + 'px';
+    target.style.height = source.offsetHeight + 'px';
+  }
+}
diff --git a/webcit/static/readallmess3_24x.gif b/webcit/static/readallmess3_24x.gif
new file mode 100644 (file)
index 0000000..fb2479a
Binary files /dev/null and b/webcit/static/readallmess3_24x.gif differ
diff --git a/webcit/static/redo.gif b/webcit/static/redo.gif
new file mode 100644 (file)
index 0000000..b51d6b8
Binary files /dev/null and b/webcit/static/redo.gif differ
diff --git a/webcit/static/right_just.gif b/webcit/static/right_just.gif
new file mode 100644 (file)
index 0000000..a3204d9
Binary files /dev/null and b/webcit/static/right_just.gif differ
diff --git a/webcit/static/robots.txt b/webcit/static/robots.txt
new file mode 100644 (file)
index 0000000..8fe8379
--- /dev/null
@@ -0,0 +1,3 @@
+# WebCit deals exclusively in dynamic content and cannot be spidered.  Go away.
+User-agent: *
+Disallow: /
diff --git a/webcit/static/roombanner.html b/webcit/static/roombanner.html
new file mode 100644 (file)
index 0000000..04781d9
--- /dev/null
@@ -0,0 +1,23 @@
+<! start roombanner.html>
+<table width="100%" border="0" cellpadding="0" cellspacing="0">
+<tr>
+       <td align="left" valign="middle" bgcolor="#444455">
+       <?ROOMPIC>
+       </td>
+       <td align="left" valign="middle" bgcolor="#444455">
+               <span class="room_banner_room_name"><?ROOMNAME></span>
+       </td>
+       <td align="left" bgcolor="#444455">
+               <span class="room_banner_room_info"><?ROOMINFO></span>
+       </td>
+       <td align="right" valign="top" bgcolor="#444455">
+               <?VIEWOMATIC>
+       </td>
+       <td align="right" valign="top" bgcolor="#444455">
+               <span class="room_banner_new_messages"><?NUMMSGS></span>
+               <br />
+               <span class="room_banner_start_page"><?START></span>
+       </td>
+</tr>
+</table>
+<! end roombanner.html>
diff --git a/webcit/static/rte.css b/webcit/static/rte.css
new file mode 100644 (file)
index 0000000..b56d74b
--- /dev/null
@@ -0,0 +1,36 @@
+.rteImage {\r
+       background: #D3D3D3;\r
+       border: 1px solid #D3D3D3;\r
+       cursor: pointer;\r
+       cursor: hand;\r
+}\r
+\r
+.rteImageRaised {\r
+       background: #D3D3D3;\r
+       border: 1px outset;\r
+       cursor: pointer;\r
+       cursor: hand;\r
+}\r
+\r
+.rteImageLowered {\r
+       background: #D3D3D3;\r
+       border: 1px inset;\r
+       cursor: pointer;\r
+       cursor: hand;\r
+}\r
+\r
+.rteVertSep {\r
+       margin: 0 4px 0 4px;\r
+}\r
+\r
+.rteBack {\r
+       background: #D3D3D3;\r
+       border: 1px outset;\r
+       letter-spacing: 0;\r
+       padding: 2px;\r
+}\r
+\r
+.rteBack tbody tr td, .rteBack tr td {\r
+       background: #D3D3D3;\r
+       padding: 0;\r
+}\r
diff --git a/webcit/static/savecontact_16x.gif b/webcit/static/savecontact_16x.gif
new file mode 100644 (file)
index 0000000..df79ac2
Binary files /dev/null and b/webcit/static/savecontact_16x.gif differ
diff --git a/webcit/static/savecontact_32x.gif b/webcit/static/savecontact_32x.gif
new file mode 100644 (file)
index 0000000..c1513cf
Binary files /dev/null and b/webcit/static/savecontact_32x.gif differ
diff --git a/webcit/static/savecontact_48x.gif b/webcit/static/savecontact_48x.gif
new file mode 100644 (file)
index 0000000..d8caa0b
Binary files /dev/null and b/webcit/static/savecontact_48x.gif differ
diff --git a/webcit/static/scriptaculous.js b/webcit/static/scriptaculous.js
new file mode 100644 (file)
index 0000000..ea1ad40
--- /dev/null
@@ -0,0 +1,26 @@
+var Scriptaculous = {
+  Version: '1.5_pre4',
+  require: function(libraryName) {
+    // inserting via DOM fails in Safari 2.0, so brute force approach
+    document.write('<script type="text/javascript" src="'+libraryName+'"></script>');
+  },
+  load: function() {
+    if((typeof Prototype=='undefined') ||
+      parseFloat(Prototype.Version.split(".")[0] + "." +
+                 Prototype.Version.split(".")[1]) < 1.4)
+      throw("script.aculo.us requires the Prototype JavaScript framework >= 1.4.0");
+    var scriptTags = document.getElementsByTagName("script");
+    for(var i=0;i<scriptTags.length;i++) {
+      if(scriptTags[i].src && scriptTags[i].src.match(/scriptaculous\.js$/)) {
+        var path = scriptTags[i].src.replace(/scriptaculous\.js$/,'');
+        this.require(path + 'util.js');
+        this.require(path + 'effects.js');
+        this.require(path + 'dragdrop.js');
+        this.require(path + 'controls.js');
+        break;
+      }
+    }
+  }
+}
+
+Scriptaculous.load();
\ No newline at end of file
diff --git a/webcit/static/skipthisroom_24x.gif b/webcit/static/skipthisroom_24x.gif
new file mode 100644 (file)
index 0000000..099652a
Binary files /dev/null and b/webcit/static/skipthisroom_24x.gif differ
diff --git a/webcit/static/sort_none.gif b/webcit/static/sort_none.gif
new file mode 100644 (file)
index 0000000..68dce00
Binary files /dev/null and b/webcit/static/sort_none.gif differ
diff --git a/webcit/static/spellcheck.gif b/webcit/static/spellcheck.gif
new file mode 100644 (file)
index 0000000..e6c8d82
Binary files /dev/null and b/webcit/static/spellcheck.gif differ
diff --git a/webcit/static/square.gif b/webcit/static/square.gif
new file mode 100644 (file)
index 0000000..a413fc8
Binary files /dev/null and b/webcit/static/square.gif differ
diff --git a/webcit/static/storenotes_16x.gif b/webcit/static/storenotes_16x.gif
new file mode 100644 (file)
index 0000000..66f08b5
Binary files /dev/null and b/webcit/static/storenotes_16x.gif differ
diff --git a/webcit/static/storenotes_32x.gif b/webcit/static/storenotes_32x.gif
new file mode 100644 (file)
index 0000000..ea8c618
Binary files /dev/null and b/webcit/static/storenotes_32x.gif differ
diff --git a/webcit/static/storenotes_48x.gif b/webcit/static/storenotes_48x.gif
new file mode 100644 (file)
index 0000000..4ddaa63
Binary files /dev/null and b/webcit/static/storenotes_48x.gif differ
diff --git a/webcit/static/summscreen_32x.gif b/webcit/static/summscreen_32x.gif
new file mode 100644 (file)
index 0000000..b143fbf
Binary files /dev/null and b/webcit/static/summscreen_32x.gif differ
diff --git a/webcit/static/summscreen_48x.gif b/webcit/static/summscreen_48x.gif
new file mode 100644 (file)
index 0000000..9f536b8
Binary files /dev/null and b/webcit/static/summscreen_48x.gif differ
diff --git a/webcit/static/t.gif b/webcit/static/t.gif
new file mode 100644 (file)
index 0000000..23efd27
Binary files /dev/null and b/webcit/static/t.gif differ
diff --git a/webcit/static/t_no_root.gif b/webcit/static/t_no_root.gif
new file mode 100644 (file)
index 0000000..3da5e91
Binary files /dev/null and b/webcit/static/t_no_root.gif differ
diff --git a/webcit/static/taskday2_24x.gif b/webcit/static/taskday2_24x.gif
new file mode 100644 (file)
index 0000000..995b171
Binary files /dev/null and b/webcit/static/taskday2_24x.gif differ
diff --git a/webcit/static/taskmanag_16x.gif b/webcit/static/taskmanag_16x.gif
new file mode 100644 (file)
index 0000000..fd8cae9
Binary files /dev/null and b/webcit/static/taskmanag_16x.gif differ
diff --git a/webcit/static/taskmanag_24x.gif b/webcit/static/taskmanag_24x.gif
new file mode 100644 (file)
index 0000000..120284e
Binary files /dev/null and b/webcit/static/taskmanag_24x.gif differ
diff --git a/webcit/static/taskmanag_32x.gif b/webcit/static/taskmanag_32x.gif
new file mode 100644 (file)
index 0000000..c6065a4
Binary files /dev/null and b/webcit/static/taskmanag_32x.gif differ
diff --git a/webcit/static/taskmanag_48x.gif b/webcit/static/taskmanag_48x.gif
new file mode 100644 (file)
index 0000000..883b280
Binary files /dev/null and b/webcit/static/taskmanag_48x.gif differ
diff --git a/webcit/static/textcolor.gif b/webcit/static/textcolor.gif
new file mode 100644 (file)
index 0000000..413e041
Binary files /dev/null and b/webcit/static/textcolor.gif differ
diff --git a/webcit/static/trailing.html b/webcit/static/trailing.html
new file mode 100644 (file)
index 0000000..59d9652
--- /dev/null
@@ -0,0 +1,3 @@
+<! start trailing.html>
+</body>
+</html>
diff --git a/webcit/static/underline.gif b/webcit/static/underline.gif
new file mode 100644 (file)
index 0000000..db8fb4f
Binary files /dev/null and b/webcit/static/underline.gif differ
diff --git a/webcit/static/undo.gif b/webcit/static/undo.gif
new file mode 100644 (file)
index 0000000..555d0db
Binary files /dev/null and b/webcit/static/undo.gif differ
diff --git a/webcit/static/ungoto2_24x.gif b/webcit/static/ungoto2_24x.gif
new file mode 100644 (file)
index 0000000..dae0abb
Binary files /dev/null and b/webcit/static/ungoto2_24x.gif differ
diff --git a/webcit/static/unittest.js b/webcit/static/unittest.js
new file mode 100644 (file)
index 0000000..b53d65e
--- /dev/null
@@ -0,0 +1,381 @@
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//           (c) 2005 Jon Tirsen (http://www.tirsen.com)
+//           (c) 2005 Michael Schuerig (http://www.schuerig.de/michael/)
+//
+// 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.
+
+
+// experimental, Firefox-only
+Event.simulateMouse = function(element, eventName) {
+  var options = Object.extend({
+    pointerX: 0,
+    pointerY: 0,
+    buttons: 0
+  }, arguments[2] || {});
+  var oEvent = document.createEvent("MouseEvents");
+  oEvent.initMouseEvent(eventName, true, true, document.defaultView, 
+    options.buttons, options.pointerX, options.pointerY, options.pointerX, options.pointerY, 
+    false, false, false, false, 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 = function(obj) {
+  var info = [];
+
+  if(typeof obj=="string" || 
+     typeof obj=="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(", ") + "}");
+}
+
+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.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);
+  },
+  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/>");
+  }
+}
+
+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();
+    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(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"];
+  },
+  // 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.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);
+  },
+  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); }
+  },
+  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); }
+  },
+  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); }
+  },
+  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);
+  },
+  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); } 
+  },
+  _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]));
+  }
+}
+
+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;
+    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); }
+  }
+});
\ No newline at end of file
diff --git a/webcit/static/up_pointer.gif b/webcit/static/up_pointer.gif
new file mode 100644 (file)
index 0000000..83e5e61
Binary files /dev/null and b/webcit/static/up_pointer.gif differ
diff --git a/webcit/static/usermanag_32x.gif b/webcit/static/usermanag_32x.gif
new file mode 100644 (file)
index 0000000..9fa9dd4
Binary files /dev/null and b/webcit/static/usermanag_32x.gif differ
diff --git a/webcit/static/usermanag_48x.gif b/webcit/static/usermanag_48x.gif
new file mode 100644 (file)
index 0000000..0876d61
Binary files /dev/null and b/webcit/static/usermanag_48x.gif differ
diff --git a/webcit/static/util.js b/webcit/static/util.js
new file mode 100644 (file)
index 0000000..9170a95
--- /dev/null
@@ -0,0 +1,429 @@
+// 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
+
+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/viewcontacts_16x.gif b/webcit/static/viewcontacts_16x.gif
new file mode 100644 (file)
index 0000000..880adbb
Binary files /dev/null and b/webcit/static/viewcontacts_16x.gif differ
diff --git a/webcit/static/viewcontacts_24x.gif b/webcit/static/viewcontacts_24x.gif
new file mode 100644 (file)
index 0000000..d04eff9
Binary files /dev/null and b/webcit/static/viewcontacts_24x.gif differ
diff --git a/webcit/static/viewcontacts_32x.gif b/webcit/static/viewcontacts_32x.gif
new file mode 100644 (file)
index 0000000..c6dee06
Binary files /dev/null and b/webcit/static/viewcontacts_32x.gif differ
diff --git a/webcit/static/viewcontacts_48x.gif b/webcit/static/viewcontacts_48x.gif
new file mode 100644 (file)
index 0000000..b6495a9
Binary files /dev/null and b/webcit/static/viewcontacts_48x.gif differ
diff --git a/webcit/static/viewnotes_24x.gif b/webcit/static/viewnotes_24x.gif
new file mode 100644 (file)
index 0000000..cba60b0
Binary files /dev/null and b/webcit/static/viewnotes_24x.gif differ
diff --git a/webcit/static/wclib.js b/webcit/static/wclib.js
new file mode 100644 (file)
index 0000000..bf4ae9a
--- /dev/null
@@ -0,0 +1,483 @@
+//
+// $Id: wclib.js,v 625.2 2005/09/18 04:04:32 ajc Exp $
+//
+// JavaScript function library for WebCit.
+//
+//
+
+
+var browserType;
+var room_is_trash = 0;
+
+if (document.layers) {browserType = "nn4"}
+if (document.all) {browserType = "ie"}
+if (window.navigator.userAgent.toLowerCase().match("gecko")) {
+       browserType= "gecko"
+}
+
+var ns6=document.getElementById&&!document.all;
+
+
+
+// We love string tokenizers.
+function extract_token(source_string, token_num, delimiter) {
+       var i = 0;
+       var extracted_string = source_string;
+
+       if (token_num > 0) {
+               for (i=0; i<token_num; ++i) {
+                       var j = extracted_string.indexOf(delimiter);
+                       if (j >= 0) {
+                               extracted_string = extracted_string.substring(j+1);
+                       }
+               }
+       }
+
+       j = extracted_string.indexOf(delimiter);
+       if (j >= 0) {
+               extracted_string = extracted_string.substring(0, j);
+       }
+
+       return extracted_string;
+}
+
+
+
+// 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";
+}
+
+
+// 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', {} );
+}
+
+
+
+// Toggle the icon bar between menu/roomlist...
+var which_div_expanded = null;
+var num_drop_targets = 0;
+var drop_targets_elements = new Array();
+var drop_targets_roomnames = new Array();
+
+function switch_to_room_list() {
+       $('iconbar').innerHTML = $('iconbar').innerHTML.substr(0, $('iconbar').innerHTML.indexOf('switch'));
+       new Ajax.Updater('iconbar', 'iconbar_ajax_rooms', { method: 'get' } );
+}
+
+function expand_floor(floor_div) {
+       if (which_div_expanded != null) {
+               if ($(which_div_expanded) != null) {
+                       $(which_div_expanded).style.display = 'none' ;
+               }
+       }
+
+       // clicking on the already-expanded floor causes the whole list to collapse
+       if (which_div_expanded == floor_div) {
+               which_div_expanded = null;
+
+               // notify the server that no floors are expanded
+               new Ajax.Request(
+                       'set_floordiv_expanded/-1', {
+                               method: 'post'
+                       }
+               );
+               return true;
+       }
+
+       // expand the requested floor
+       $(floor_div).style.display = 'block';
+       which_div_expanded = floor_div;
+
+       // notify the server of which floor is expanded
+       new Ajax.Request(
+               'set_floordiv_expanded/'+floor_div, {
+                       method: 'post'
+               }
+       );
+}
+
+function switch_to_menu_buttons() {
+       which_div_expanded = null;
+       num_drop_targets = 0;
+       new Ajax.Updater('iconbar', 'iconbar_ajax_menu', { method: 'get' } );
+}
+
+
+// Static variables for mailbox view...
+//
+var CtdlNumMsgsSelected = 0;
+var CtdlMsgsSelected = new Array();
+
+// This gets called when you single click on a message in the mailbox view.
+// We know that the element id of the table row will be the letter 'm' plus the message number.
+//
+function CtdlSingleClickMsg(evt, msgnum) {
+
+       // Clear the preview pane until we load the new message
+       $('preview_pane').innerHTML = '';
+
+       // De-select any messages that were already selected, *unless* the Ctrl key
+       // is being pressed, in which case the user wants multi select.
+       if (!evt.ctrlKey) {
+               if (CtdlNumMsgsSelected > 0) {
+                       for (i=0; i<CtdlNumMsgsSelected; ++i) {
+                               $('m'+CtdlMsgsSelected[i]).style.backgroundColor = '#fff';
+                               $('m'+CtdlMsgsSelected[i]).style.color = '#000';
+                       }
+                       CtdlNumMsgsSelected = 0;
+               }
+       }
+
+       // For multi select ... is the message being clicked already selected?
+       already_selected = 0;
+       if ( (evt.ctrlKey) && (CtdlNumMsgsSelected > 0) ) {
+               for (i=0; i<CtdlNumMsgsSelected; ++i) {
+                       if (CtdlMsgsSelected[i] == msgnum) {
+                               already_selected = 1;
+                       }
+               }
+       }
+
+       // Now select (or de-select) the message
+       if ( (evt.ctrlKey) && (already_selected == 1) ) {
+               $('m'+msgnum).style.backgroundColor = '#fff';
+               $('m'+msgnum).style.color = '#000';
+       }
+       else {
+               $('m'+msgnum).style.backgroundColor='#69aaff';
+               $('m'+msgnum).style.color='#fff';
+               CtdlNumMsgsSelected = CtdlNumMsgsSelected + 1;
+               CtdlMsgsSelected[CtdlNumMsgsSelected-1] = msgnum;
+       }
+
+       // Update the preview pane
+       new Ajax.Updater('preview_pane', 'msg/'+msgnum, { method: 'get' } );
+
+       // Mark the message as read
+       new Ajax.Request(
+               'ajax_servcmd', {
+                       method: 'post',
+                       parameters: 'g_cmd=SEEN '+msgnum+'|1',
+                       onComplete: CtdlRemoveTheUnseenBold(msgnum)
+               }
+       );
+
+       return false;           // try to defeat the default click behavior
+}
+
+// Delete selected messages.
+function CtdlDeleteSelectedMessages(evt) {
+       
+       if (CtdlNumMsgsSelected < 1) {
+               // Nothing to delete, so exit silently.
+               return false;
+       }
+       for (i=0; i<CtdlNumMsgsSelected; ++i) {
+               if (parseInt(room_is_trash) > 0) {
+                       new Ajax.Request(
+                               'ajax_servcmd', {
+                                       method: 'post',
+                                       parameters: 'g_cmd=DELE ' + CtdlMsgsSelected[i],
+                                       onComplete: CtdlClearDeletedMsg(CtdlMsgsSelected[i])
+                               }
+                       );
+               }
+               else {
+                       new Ajax.Request(
+                               'ajax_servcmd', {
+                                       method: 'post',
+                                       parameters: 'g_cmd=MOVE ' + CtdlMsgsSelected[i] + '|_TRASH_|0',
+                                       onComplete: CtdlClearDeletedMsg(CtdlMsgsSelected[i])
+                               }
+                       );
+               }
+       }
+       CtdlNumMsgsSelected = 0;
+
+       // Clear the preview pane too.
+       $('preview_pane').innerHTML = '';
+}
+
+
+// Move selected messages.
+function CtdlMoveSelectedMessages(evt, target_roomname) {
+       
+       if (CtdlNumMsgsSelected < 1) {
+               // Nothing to delete, so exit silently.
+               return false;
+       }
+       for (i=0; i<CtdlNumMsgsSelected; ++i) {
+               new Ajax.Request(
+                       'ajax_servcmd', {
+                               method:'post',
+                               parameters:'g_cmd=MOVE ' + CtdlMsgsSelected[i] + '|' + target_roomname + '|0',
+                               onComplete:CtdlClearDeletedMsg(CtdlMsgsSelected[i])
+                       }
+               );
+       }
+       CtdlNumMsgsSelected = 0;
+
+       // Clear the preview pane too.
+       $('preview_pane').innerHTML = '';
+}
+
+
+
+// This gets called when the user touches the keyboard after selecting messages...
+function CtdlMsgListKeyPress(evt) {
+       if(document.all) {                              // aIEeee
+               var whichKey = window.event.keyCode;
+       }
+       else {                                          // non-sux0r browsers
+               var whichKey = evt.which;
+       }
+       if (whichKey == 46) {                           // DELETE key
+               CtdlDeleteSelectedMessages(evt);
+       }
+       return true;
+}
+
+// Take the boldface away from a message to indicate that it has been seen.
+function CtdlRemoveTheUnseenBold(msgnum) {
+       $('m'+msgnum).style.fontWeight='normal';
+}
+
+// A message has been deleted, so yank it from the list.
+// (IE barfs on m9999.innerHTML='' so we use a script.aculo.us effect instead.)
+function CtdlClearDeletedMsg(msgnum) {
+       new Effect.Squish('m'+msgnum);
+}
+
+
+// These functions called when the user down-clicks on the message list resizer bar
+
+var saved_x = 0;
+var saved_y = 0;
+
+function CtdlResizeMsgListMouseUp(evt) {
+       document.onmouseup = null;
+       document.onmousemove = null;
+       if (document.layers) {
+               document.releaseEvents(Event.MOUSEUP | Event.MOUSEMOVE);
+       }
+       return true;
+}
+
+function CtdlResizeMsgListMouseMove(evt) {
+       y = (ns6 ? evt.clientY : event.clientY);
+       increment = y - saved_y;
+
+       // First move the bottom of the message list...
+       d = $('message_list');
+       if (d.offsetHeight){
+               divHeight = d.offsetHeight;
+       }
+       else if (d.style.pixelHeight) {
+               divHeight = d.style.pixelHeight;
+       }
+       d.style.height = (divHeight + increment) + 'px';
+
+       // Then move the top of the preview pane...
+       d = $('preview_pane');
+       if (d.offsetTop){
+               divTop = d.offsetTop;
+       }
+       else if (d.style.pixelTop) {
+               divTop = d.style.pixelTop;
+       }
+       d.style.top = (divTop + increment) + 'px';
+
+       // Resize the bottom of the preview pane...
+       d = $('preview_pane');
+       if (d.offsetHeight){
+               divHeight = d.offsetHeight;
+       }
+       else if (d.style.pixelHeight) {
+               divHeight = d.style.pixelHeight;
+       }
+       d.style.height = (divHeight - increment) + 'px';
+
+       // Then move the top of the slider bar.
+       d = $('resize_msglist');
+       if (d.offsetTop){
+               divTop = d.offsetTop;
+       }
+       else if (d.style.pixelTop) {
+               divTop = d.style.pixelTop;
+       }
+       d.style.top = (divTop + increment) + 'px';
+
+       saved_y = y;
+       return true;
+}
+
+function CtdlResizeMsgListMouseDown(evt) {
+       saved_y = (ns6 ? evt.clientY : event.clientY);
+       document.onmouseup = CtdlResizeMsgListMouseUp;
+       document.onmousemove = CtdlResizeMsgListMouseMove;
+       if (document.layers) {
+               document.captureEvents(Event.MOUSEUP | Event.MOUSEMOVE);
+       }
+       return false;           // disable the default action
+}
+
+
+
+// These functions handle drag and drop message moving
+
+var mm_div = null;
+
+function CtdlMoveMsgMouseDown(evt, msgnum) {
+
+       // do the highlight first
+       CtdlSingleClickMsg(evt, msgnum);
+
+       // Now handle the possibility of dragging
+       saved_x = (ns6 ? evt.clientX : event.clientX);
+       saved_y = (ns6 ? evt.clientY : event.clientY);
+       document.onmouseup = CtdlMoveMsgMouseUp;
+       document.onmousemove = CtdlMoveMsgMouseMove;
+       if (document.layers) {
+               document.captureEvents(Event.MOUSEUP | Event.MOUSEMOVE);
+       }
+
+       return false;
+}
+
+function CtdlMoveMsgMouseMove(evt) {
+       x = (ns6 ? evt.clientX : event.clientX);
+       y = (ns6 ? evt.clientY : event.clientY);
+
+       if ( (x == saved_x) && (y == saved_y) ) {
+               return true;
+       }
+
+       if (CtdlNumMsgsSelected < 1) { 
+               return true;
+       }
+
+       if (!mm_div) {
+
+
+               drag_o_text = "<div style=\"overflow:none; background-color:#fff; color:#000; border: 1px solid black; filter:alpha(opacity=75); -moz-opacity:.75; opacity:.75;\"><tr><td>";
+               for (i=0; i<CtdlNumMsgsSelected; ++i) {
+                       drag_o_text = drag_o_text + 
+                               ctdl_ts_getInnerText(
+                                       $('m'+CtdlMsgsSelected[i]).cells[0]
+                               ) + '<br>';
+               }
+               drag_o_text = drag_o_text + "<div>";
+
+               mm_div = document.createElement("DIV");
+               mm_div.style.position='absolute';
+               mm_div.style.top = y + 'px';
+               mm_div.style.left = x + 'px';
+               mm_div.style.pixelHeight = '300';
+               mm_div.style.pixelWidth = '300';
+               mm_div.innerHTML = drag_o_text;
+               document.body.appendChild(mm_div);
+       }
+       else {
+               mm_div.style.top = y + 'px';
+               mm_div.style.left = x + 'px';
+       }
+
+       return false;   // prevent the default mouse action from happening?
+}
+
+function CtdlMoveMsgMouseUp(evt) {
+       document.onmouseup = null;
+       document.onmousemove = null;
+       if (document.layers) {
+               document.releaseEvents(Event.MOUSEUP | Event.MOUSEMOVE);
+       }
+
+       if (mm_div) {
+               document.body.removeChild(mm_div);      
+               mm_div = null;
+       }
+
+       if (num_drop_targets < 1) {     // nowhere to drop
+               return true;
+       }
+
+       // Did we release the mouse button while hovering over a drop target?
+       // NOTE: this only works cross-browser because the iconbar div is always
+       //      positioned at 0,0.  Browsers differ in whether the 'offset'
+       //      functions return pos relative to the document or parent.
+
+       for (i=0; i<num_drop_targets; ++i) {
+
+               x = (ns6 ? evt.clientX : event.clientX);
+               y = (ns6 ? evt.clientY : event.clientY);
+
+               l = parseInt(drop_targets_elements[i].offsetLeft);
+               t = parseInt(drop_targets_elements[i].offsetTop);
+               r = parseInt(drop_targets_elements[i].offsetLeft)
+                 + parseInt(drop_targets_elements[i].offsetWidth);
+               b = parseInt(drop_targets_elements[i].offsetTop)
+                 + parseInt(drop_targets_elements[i].offsetHeight);
+
+               /* alert('Offsets are: ' + l + ' ' + t + ' ' + r + ' ' + b + '.'); */
+       
+               if ( (x >= l) && (x <= r) && (y >= t) && (y <= b) ) {
+                       // Yes, we dropped it on a hotspot.
+                       CtdlMoveSelectedMessages(evt, drop_targets_roomnames[i]);
+                       return true;
+               }
+       }
+
+       return true;
+}
+
+
+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;
+}
+
+
+
+// This function handles the creation of new notes in the "Notes" view.
+//
+function add_new_note() {
+
+       new_eid = Math.random() + '';
+       new_eid = new_eid.substr(3);
+
+       $('new_notes_here').innerHTML = $('new_notes_here').innerHTML
+               + '<IMG ALIGN=MIDDLE src=\"static/storenotes_48x.gif\">'
+               + '<span id=\"note' + new_eid + '\">' + Date() + '</span><br />'
+       ;
+
+       new Ajax.InPlaceEditor('note' + new_eid,
+               'updatenote?eid=' + new_eid , {rows:5,cols:72});
+}
diff --git a/webcit/static/webcit-tinymce.css b/webcit/static/webcit-tinymce.css
new file mode 100644 (file)
index 0000000..f64b77e
--- /dev/null
@@ -0,0 +1,6 @@
+<!-- styles applied to the TinyMCE editor component when used in WebCit -->
+
+body {
+    font-size: 10pt;
+    font-family: sans-serif;
+}
diff --git a/webcit/static/webcit.css b/webcit/static/webcit.css
new file mode 100644 (file)
index 0000000..1fc63da
--- /dev/null
@@ -0,0 +1,574 @@
+<style type="text/css">
+
+* html {
+       overflow: hidden;
+}
+
+body {
+       margin:0;
+       padding: 0 0 0 0;
+       height: 100%;
+       overflow: auto;
+       background-image: url(/static/body-background.gif);
+       color: #000000;
+       font-weight: normal;
+       font-size: 10pt;
+}
+
+#iconbar {
+       position:fixed;
+       display:block;
+       top:0px;
+       left:0px;
+       width: 15%;
+       height:100%;
+       background: #ffffee;
+}
+
+* html #iconbar {
+       position:absolute;
+       display:block;
+       top:0px;
+       left:0px;
+       width: 15%;
+       height:100%;
+       background: #ffffff;
+}
+
+#banner {
+       position:fixed;
+       display:block;
+       top:0px;
+       left: 15%;
+       width: 85%;
+       height: 15%;
+       background: #445;
+}
+
+* html #banner {
+       position:absolute;
+       display:block;
+       top:0px;
+       left: 15%;
+       width: 85%;
+       height: 15%;
+       background: #445;
+}
+
+#important_message {
+       position:absolute;
+       top:0px; right:0px;
+       background-color: #880000;
+       z-index: 2;
+}
+
+#content {
+       position:fixed;
+       display:block;
+       top: 15%;
+       left: 15%;
+       width: 85%;
+       height: 85%;
+       overflow: auto;
+       /* overflow-x: hidden; */
+}
+
+* html #content {
+       position:absolute;
+       display:block;
+       top: 15%;
+       left: 15%;
+       width: 85%;
+       height: 85%;
+       overflow: auto;
+       /* overflow-x: hidden; */
+}
+
+#message_list_hdr {
+       position:fixed;
+       display:block;
+       top: 15%;
+       left: 15%;
+       width: 85%;
+       height: 5%;
+       overflow: none;
+}
+
+* html #message_list_hdr {
+       position:absolute;
+       display:block;
+       top: 15%;
+       left: 15%;
+       width: 85%;
+       height: 5%;
+       overflow: none;
+}
+
+#message_list {
+       position:fixed;
+       display:block;
+       top: 20%;
+       left: 15%;
+       width: 85%;
+       height: 20%;
+       overflow: auto;
+       cursor: pointer;
+}
+
+* html #message_list {
+       position:absolute;
+       display:block;
+       top: 20%;
+       left: 15%;
+       width: 85%;
+       height: 20%;
+       overflow: auto;
+       cursor: pointer;
+}
+
+#resize_msglist {
+       position:fixed;
+       display:block;
+       top: 40%;
+       left: 15%;
+       width: 85%;
+       height: 1%;
+       overflow: none;
+       cursor: s-resize;
+}
+
+* html #resize_msglist {
+       position:absolute;
+       display:block;
+       top: 40%;
+       left: 15%;
+       width: 85%;
+       height: 1%;
+       overflow: none;
+       cursor: s-resize;
+}
+
+#preview_pane {
+       position:fixed;
+       display:block;
+       top: 41%;
+       left: 15%;
+       width: 85%;
+       height: 59%;
+       overflow: auto;
+}
+
+* html #preview_pane {
+       position:absolute;
+       display:block;
+       top: 41%;
+       left: 15%;
+       width: 85%;
+       height: 59%;
+       overflow: auto;
+}
+
+
+.fix_scrollbar_bug {
+       margin-right:1px;               /* Gecko and other non-broken browsers */
+       width: expression('97%');       /* Only IE6 understands 'expression' - fixes weird scrollbarbug */
+}
+
+#button {
+       width: 100%;
+       padding: 0 0 1em 0;
+       margin-bottom: 1em;
+       background-color: #ffffee;
+       color: #aaaaaa;
+       font-size: 8pt;
+}
+
+#button ul {
+       list-style: none;
+       margin: 0;
+       padding: 0;
+       border: none;
+}
+
+#button li {
+       border-bottom: 1px solid #aaaaaa;
+       margin: 0;
+}
+
+#button img {
+       vertical-align: middle;
+       padding-left: 2px;
+       padding-right: 5px;
+}
+
+#button li a {
+       display: block;
+       background-color: #ffffee;
+       color: #000000;
+       text-decoration: none;
+       width: 100%;
+}
+
+html>body #button li a {
+       width: auto;
+}
+
+#button li a:hover {
+       //background-color: #ddddff;
+       background-image:url(/static/body-background.gif);
+       color: #000000;
+}
+
+a:link {
+       color: #0000FF;
+       text-decoration: none;
+}
+
+a:visited {
+       color: #0000FF;
+       text-decoration: none;
+}
+
+a:active {
+       color: #0000FF;
+       text-decoration: none;
+}
+
+a:hover {
+       text-decoration: underline;
+}
+
+.menubar_link {
+       font-size: 9pt;
+}
+
+.navbar_link {
+       font-size: 7pt;
+       color: #FFFFEE;
+}
+
+.titlebar {
+       font-size: 12pt;
+       color: #FFFFEE;
+}
+
+.mainmenu {
+       font-size: 10pt;
+       font-weight: bold;
+       color: #880000;
+}
+
+.menudesc {
+       font-size: 8pt;
+       color: #000088;
+}
+
+.message_header {
+       font-size: 10pt;
+       color: #000000;
+}
+
+.message_subject {
+       font-size: 10pt;
+       color: #000000;
+       font-style: italic;
+}
+
+.tablabel {
+       font-size: 10pt;
+       font-weight: bold;
+       color: #000000;
+}
+
+.boxlabel {
+       font-size: 7pt;
+       font-weight: bold;
+       color: #FFFFEE;
+}
+
+.customize {
+       font-size: 8pt;
+       font-style: italic;
+       color: #000044;
+       background-color: #DDDDCC;
+}
+
+.room_banner_room_name {
+       font-size: 14pt;
+       font-weight: bold;
+       color: #FFFFEE;
+}
+
+.room_banner_room_info {
+       font-size: 6pt;
+       color: #FFFFEE;
+}
+
+.room_banner_new_messages {
+       font-size: 10pt;
+       color: #DDDDCC;
+}
+
+.room_banner_start_page {
+       font-size: 7pt;
+       color: #DDDDCC;
+}
+
+.menubar_bg {
+       background-color: #FF0000;
+}
+
+.msgbuttons {
+       font-size: 7pt;
+}
+
+.roomlist_floor {
+       font-size: 12pt;
+       font-weight: bold;
+       color: #000000;
+}
+
+.roomlist_new {
+       font-size: 10pt;
+       color: #880000;
+       font-weight: bold;
+}
+
+.roomlist_old {
+       font-size: 10pt;
+       color: #000088;
+}
+
+.ib_roomlist_floor {
+       font-size: 8pt;
+       font-weight: bold;
+       color: #000000;
+       cursor: pointer;
+}
+
+.ib_roomlist_new {
+       font-size: 10px;
+       color: #880000;
+       font-weight: bold;
+       cursor: pointer;
+}
+
+.ib_roomlist_old {
+       font-size: 10px;
+       color: #000088;
+       cursor: pointer;
+}
+
+.mailbox_summary {
+       font-size: 10pt;
+       color: #000000;
+}
+
+<!-- begin quote levels colors -->
+
+blockquote {
+       color: navy !important; background-color: RGB(245,245,245) !important; 
+}
+blockquote blockquote {
+       color: maroon !important; background-color: RGB(235,235,235) !important;
+}
+blockquote blockquote blockquote {
+       color: green !important; background-color: RGB(225,225,225) !important;
+}
+blockquote blockquote blockquote blockquote {
+       color: purple !important; background-color: RGB(215,215,215) !important;
+}
+blockquote blockquote blockquote blockquote blockquote {
+       color: teal !important; background-color: RGB(205,205,205) !important;
+}
+
+blockquote pre {
+       margin-left: 1%;
+       margin-right: 1%;
+}
+
+<!-- end quote levels colors -->
+
+var sub {
+       font-style: normal;
+}
+
+.note {
+       font-size: 85%;
+       margin-left: 10%;
+}
+
+.toolbar {
+       text-align: center;
+}
+
+.toolbar IMG {
+       float: right;
+}
+
+.errormsg {
+       color: #AA0000;
+       background: none;
+       font-weight: bold;
+       font-style: italic;
+}
+
+.imsg {
+       color: #aaaaaa;
+       background: none;
+       font-weight: bold;
+       font-style: italic;
+       text-align: center;
+}
+
+.warning {
+       color: #FF4500;
+       background: none;
+       text-decoration: none;
+}
+
+.error strong {
+       color: #DC143C;
+       background: #FFD700;
+       text-decoration: none;
+}
+
+.warning strong {
+       color: #FF4500;
+       background: #FFD700;
+       text-decoration: none;
+}
+
+.warning a:link, .warning a:visited, .warning a:active {
+       color: #FF4500;
+       background: none;
+       text-decoration: underline;
+}
+
+.error a:link, .error a:visited, .error a:active {
+       color: #DC143C;
+       background: none;
+       text-decoration: underline;
+}
+
+.error strong a:link, .error strong a:visited, .error strong a:active {
+       color: #DC143C;
+       background: #FFD700;
+}
+
+.warning strong a:link, .warning strong a:visited, .warning strong a:active {
+       color: #FF4500;
+       background: #FFD700;
+}
+
+colgroup.entity {
+       text-align: center;
+}
+
+.default {
+       text-decoration: underline;
+       font-style: normal;
+}
+
+.required {
+       font-weight: bold;
+}
+
+td li.transitional, .elements li.transitional {
+       font-weight: lighter;
+       color: #696969;
+       background: none;
+}
+
+td li.frameset, .elements li.frameset {
+       font-weight: lighter;
+       color: #808080;
+       background: none;
+}
+
+@media print {
+       input#toggler, .toolbar { display: none }
+}
+
+<!-- begin nanotree styles -->
+
+.treetitle {
+       padding:2px;
+       cursor:default;
+       
+       font-size: 11px;
+       color: #000000;
+}
+.editednode {
+       padding:2px;
+       cursor:default;
+       background-color: #FFFFFF;;
+       color: #000000;
+       
+       font-size: 11px;
+}
+.editednodeinput {
+       background-color: #FFFFFF;;
+       color: #000000;
+       
+       width: 150px;
+       height: 17px;
+       
+       border-style: solid;
+       border-width: 1px;
+       border-color: #000000;
+       
+       font-size: 11px;
+}
+.treetitleselectedfocused {
+       padding:2px;
+       cursor:default;
+       background-color: highlight;
+       color: highlighttext;
+       
+       font-size: 11px;
+}
+.treetitleselectedblured {
+       padding:2px;
+       cursor:default;
+       background-color: menu;
+       color: windowtext;
+       font-size: 11px;
+}
+
+<!-- end nanotree styles -->
+
+<!-- begin address autocompleter styles -->
+
+div.auto_complete {
+       width: 350px;
+       background: #fff;
+}
+
+div.auto_complete ul {
+       border:1px solid #888;
+       margin:0;
+       padding:0;
+       width:100%;
+       list-style-type: none;
+       background: #fff;
+}
+
+div.auto_complete ul li {
+       margin:0;
+       padding:3px;
+}
+
+div.auto_complete ul li.selected {
+       background-color: #ffc;
+} 
+
+div.auto_complete ul strong.highlight {
+       color: #800;
+       margin:0;
+       padding:0;
+}
+
+<!-- end address autocompleter styles -->
+
+</style>
diff --git a/webcit/static/week_view.gif b/webcit/static/week_view.gif
new file mode 100644 (file)
index 0000000..4621306
Binary files /dev/null and b/webcit/static/week_view.gif differ
diff --git a/webcit/static/white.gif b/webcit/static/white.gif
new file mode 100644 (file)
index 0000000..6a62ac8
Binary files /dev/null and b/webcit/static/white.gif differ
diff --git a/webcit/static/xml_button.gif b/webcit/static/xml_button.gif
new file mode 100644 (file)
index 0000000..ecb0957
Binary files /dev/null and b/webcit/static/xml_button.gif differ
diff --git a/webcit/static/year_view.gif b/webcit/static/year_view.gif
new file mode 100644 (file)
index 0000000..17272f9
Binary files /dev/null and b/webcit/static/year_view.gif differ
diff --git a/webcit/subst.c b/webcit/subst.c
new file mode 100644 (file)
index 0000000..4359306
--- /dev/null
@@ -0,0 +1,258 @@
+/*
+ * $Id$
+ */
+/**
+ * \defgroup Subst Variable substitution type stuff
+ * \ingroup CitadelConfig
+ */
+
+/*@{*/
+
+#include "webcit.h"
+
+
+/**
+ * \brief Clear out the list of substitution variables local to this session
+ */
+void clear_local_substs(void) {
+       struct wcsubst *ptr;
+
+       while (WC->vars != NULL) {
+               ptr = WC->vars->next;
+
+               if ((WC->vars->wcs_type == WCS_STRING)
+                  || (WC->vars->wcs_type == WCS_SERVCMD)) {
+                       free(WC->vars->wcs_value);
+               }
+
+               free(WC->vars);
+               WC->vars = ptr;
+       }
+
+       WC->vars = NULL;
+}
+
+
+/*
+ * \brief Add a substitution variable (local to this session)
+ * \param keyname the replacementstring to substitute
+ * \param keytype the kind of the key
+ * \param format the format string ala printf
+ * \param ... the arguments to substitute in the formatstring
+ */
+void svprintf(char *keyname, int keytype, const char *format,...)
+{
+       va_list arg_ptr;
+       char wbuf[SIZ];
+       struct wcsubst *ptr = NULL;
+       struct wcsubst *scan;
+
+       /**
+        * First scan through to see if we're doing a replacement of
+        * an existing key
+        */
+       for (scan=WC->vars; scan!=NULL; scan=scan->next) {
+               if (!strcasecmp(scan->wcs_key, keyname)) {
+                       ptr = scan;
+                       free(ptr->wcs_value);
+               }
+       }
+
+       /** Otherwise allocate a new one */
+       if (ptr == NULL) {
+               ptr = (struct wcsubst *) malloc(sizeof(struct wcsubst));
+               ptr->next = WC->vars;
+               safestrncpy(ptr->wcs_key, keyname, sizeof ptr->wcs_key);
+               WC->vars = ptr;
+       }
+
+       /** Format the string and save it */
+
+       va_start(arg_ptr, format);
+       vsnprintf(wbuf, sizeof wbuf, format, arg_ptr);
+       va_end(arg_ptr);
+
+       ptr->wcs_type = keytype;
+       ptr->wcs_value = strdup(wbuf);
+}
+
+/**
+ * \brief Add a substitution variable (local to this session) that does a callback
+ * \param keyname the keystring to substitute
+ * \param fcn_ptr the function callback to give the substitution string
+ */
+void svcallback(char *keyname, void (*fcn_ptr)() )
+{
+       struct wcsubst *ptr;
+
+       ptr = (struct wcsubst *) malloc(sizeof(struct wcsubst));
+       ptr->next = WC->vars;
+       ptr->wcs_type = WCS_FUNCTION;
+       strcpy(ptr->wcs_key, keyname);
+       ptr->wcs_function = fcn_ptr;
+       WC->vars = ptr;
+}
+
+
+
+/**
+ * \brief back end for print_value_of() ... does a server command
+ * \param servcmd server command to execute on the citadel server
+ */
+void pvo_do_cmd(char *servcmd) {
+       char buf[SIZ];
+
+       serv_puts(servcmd);
+       serv_getln(buf, sizeof buf);
+
+       switch(buf[0]) {
+               case '2':
+               case '3':
+               case '5':
+                       wprintf("%s\n", &buf[4]);
+                       break;
+               case '1':
+                       fmout("CENTER");
+                       break;
+               case '4':
+                       wprintf("%s\n", &buf[4]);
+                       serv_puts("000");
+                       break;
+       }
+}
+
+
+
+/**
+ * \brief Print the value of a variable
+ * \param keyname get a key to print
+ */
+void print_value_of(char *keyname) {
+       struct wcsubst *ptr;
+       void *fcn();
+
+       if (keyname[0] == '=') {
+               do_template(&keyname[1]);
+       }
+
+       if (!strcasecmp(keyname, "SERV_PID")) {
+               wprintf("%d", WC->ctdl_pid);
+       }
+
+       else if (!strcasecmp(keyname, "SERV_NODENAME")) {
+               escputs(serv_info.serv_nodename);
+       }
+
+       else if (!strcasecmp(keyname, "SERV_HUMANNODE")) {
+               escputs(serv_info.serv_humannode);
+       }
+
+       else if (!strcasecmp(keyname, "SERV_FQDN")) {
+               escputs(serv_info.serv_fqdn);
+       }
+
+       else if (!strcasecmp(keyname, "SERV_SOFTWARE")) {
+               escputs(serv_info.serv_software);
+       }
+
+       else if (!strcasecmp(keyname, "SERV_REV_LEVEL")) {
+               wprintf("%d.%02d",
+                       serv_info.serv_rev_level / 100,
+                       serv_info.serv_rev_level % 100
+               );
+       }
+
+       else if (!strcasecmp(keyname, "SERV_BBS_CITY")) {
+               escputs(serv_info.serv_bbs_city);
+       }
+
+       else if (!strcasecmp(keyname, "CURRENT_USER")) {
+               escputs(WC->wc_fullname);
+       }
+
+       else if (!strcasecmp(keyname, "CURRENT_ROOM")) {
+               escputs(WC->wc_roomname);
+       }
+
+       /** Page-local variables */
+       else for (ptr = WC->vars; ptr != NULL; ptr = ptr->next) {
+               if (!strcasecmp(ptr->wcs_key, keyname)) {
+                       if (ptr->wcs_type == WCS_STRING) {
+                               wprintf("%s", ptr->wcs_value);
+                       }
+                       else if (ptr->wcs_type == WCS_SERVCMD) {
+                               pvo_do_cmd(ptr->wcs_value);
+                       }
+                       else if (ptr->wcs_type == WCS_FUNCTION) {
+                               (*ptr->wcs_function) ();
+                       }
+               }
+       }
+}
+
+
+
+/**
+ * \brief Display a variable-substituted template
+ * \param templatename template file to load
+ */
+void do_template(void *templatename) {
+       char filename[PATH_MAX];
+       FILE *fp;
+       char inbuf[1024];
+       char outbuf[sizeof inbuf];
+       char key[sizeof inbuf];
+       int i, pos;
+
+       strcpy(filename, "static/");
+       strcat(filename, templatename);
+       if (WC->is_wap)
+               strcat(filename, ".wml");
+       else
+               strcat(filename, ".html");
+       
+       fp = fopen(filename, "r");
+       if (fp == NULL) {
+               wprintf(_("ERROR: could not open template "));
+               wprintf("'%s' - %s<br />\n",
+                       templatename, strerror(errno));
+               return;
+       }
+
+       strcpy(inbuf, "");
+
+       while (fgets(inbuf, sizeof inbuf, fp) != NULL) {
+               strcpy(outbuf, "");
+
+               while (strlen(inbuf) > 0) {
+                       pos = (-1);
+                       for (i=strlen(inbuf); i>=0; --i) {
+                               if ((inbuf[i]=='<')&&(inbuf[i+1]=='?')) pos = i;
+                       }
+                       if (pos < 0) {
+                               wprintf("%s", inbuf);
+                               strcpy(inbuf, "");
+                       }
+                       else {
+                               strncpy(outbuf, inbuf, pos);
+                               outbuf[pos] = 0;
+                               wprintf("%s", outbuf);
+                               strcpy(inbuf, &inbuf[pos]);
+                               pos = 1;
+                               for (i=strlen(inbuf); i>=0; --i) {
+                                       if (inbuf[i]=='>') pos = i;
+                               }
+                               strncpy(key, &inbuf[2], pos-2);
+                               key[pos-2] = 0;
+                               print_value_of(key);
+                               strcpy(inbuf, &inbuf[pos+1]);
+                       }
+               }
+       }
+
+       fclose(fp);
+}
+
+
+
+/*@}*/
diff --git a/webcit/summary.c b/webcit/summary.c
new file mode 100644 (file)
index 0000000..3d99403
--- /dev/null
@@ -0,0 +1,288 @@
+/*
+ * $Id$
+ */
+/**
+ * \defgroup SymaryFuncs Displays the "Summary Page"
+ * \ingroup WebcitDisplayItems
+ */
+/*@{*/
+#include "webcit.h"
+
+/**
+ * \brief 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);
+       wprintf("%s", buf);
+}
+
+
+
+
+/**
+ * \brief Dummy section
+ */
+void dummy_section(void) {
+       svprintf("BOXTITLE", WCS_STRING, "(dummy&nbsp;section)");
+       do_template("beginbox");
+       wprintf(_("(nothing)"));
+       do_template("endbox");
+}
+
+
+/**
+ * \brief 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";
+
+       svprintf("BOXTITLE", WCS_STRING, _("Messages"));
+       do_template("beginbox");
+
+       number_of_rooms_to_check = num_tokens(rooms_to_check, '|');
+       if (number_of_rooms_to_check == 0) return;
+
+       wprintf("<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);
+                       wprintf("<tr><td><a href=\"dotgoto?room=");
+                       urlescputs(room);
+                       wprintf("\">");
+                       escputs(room);
+                       wprintf("</a></td><td>%d/%d</td></tr>\n",
+                               extract_int(&buf[4], 1),
+                               extract_int(&buf[4], 2)
+                       );
+               }
+       }
+       wprintf("</table>\n");
+       do_template("endbox");
+
+}
+
+
+/**
+ * \brief Wholist section
+ */
+void wholist_section(void) {
+       char buf[SIZ];
+       char user[SIZ];
+
+       svprintf("BOXTITLE", WCS_STRING, _("Who's&nbsp;online&nbsp;now"));
+       do_template("beginbox");
+       serv_puts("RWHO");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '1') while(serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+               extract_token(user, buf, 1, '|', sizeof user);
+               escputs(user);
+               wprintf("<br />\n");
+       }
+       do_template("endbox");
+}
+
+
+/**
+ * \brief Task list section
+ */
+void tasks_section(void) {
+#ifdef WEBCIT_WITH_CALENDAR_SERVICE
+       int num_msgs = 0;
+       int i;
+#endif
+
+       svprintf("BOXTITLE", WCS_STRING, _("Tasks"));
+       do_template("beginbox");
+#ifdef WEBCIT_WITH_CALENDAR_SERVICE
+       gotoroom("_TASKS_");
+       if (WC->wc_view != VIEW_TASKS) {
+               num_msgs = 0;
+       }
+       else {
+               num_msgs = load_msg_ptrs("MSGS ALL", 0);
+       }
+
+       if (num_msgs < 1) {
+               wprintf("<i>");
+               wprintf(_("(None)"));
+               wprintf("</i><br />\n");
+       }
+       else {
+               for (i=0; i<num_msgs; ++i) {
+                       display_task(WC->msgarr[i]);
+               }
+       }
+
+       calendar_summary_view();
+
+#else /* WEBCIT_WITH_CALENDAR_SERVICE */
+       wprintf("<i>");
+       wprintf(_("(This server does not support task lists)"));
+       wprintf("</i>\n");
+#endif /* WEBCIT_WITH_CALENDAR_SERVICE */
+       do_template("endbox");
+}
+
+
+/**
+ * \brief Calendar section
+ */
+void calendar_section(void) {
+#ifdef WEBCIT_WITH_CALENDAR_SERVICE
+       int num_msgs = 0;
+       int i;
+#endif
+
+       svprintf("BOXTITLE", WCS_STRING, _("Today&nbsp;on&nbsp;your&nbsp;calendar"));
+       do_template("beginbox");
+#ifdef WEBCIT_WITH_CALENDAR_SERVICE
+       gotoroom("_CALENDAR_");
+       if ( (WC->wc_view != VIEW_CALENDAR) && (WC->wc_view != VIEW_CALBRIEF) ) {
+               num_msgs = 0;
+       }
+       else {
+               num_msgs = load_msg_ptrs("MSGS ALL", 0);
+       }
+
+       if (num_msgs < 1) {
+               wprintf("<i>");
+               wprintf(_("(Nothing)"));
+               wprintf("</i><br />\n");
+       }
+       else {
+               for (i=0; i<num_msgs; ++i) {
+                       display_calendar(WC->msgarr[i]);
+               }
+               calendar_summary_view();
+       }
+
+#else /* WEBCIT_WITH_CALENDAR_SERVICE */
+       wprintf("<i>");
+       wprintf(_("(This server does not support calendars)"));
+       wprintf("</i>\n");
+#endif /* WEBCIT_WITH_CALENDAR_SERVICE */
+       do_template("endbox");
+}
+
+/**
+ * \brief Server info section (fluff, really)
+ */
+void server_info_section(void) {
+       char message[512];
+
+       svprintf("BOXTITLE", WCS_STRING, _("About&nbsp;this&nbsp;server"));
+       do_template("beginbox");
+
+       snprintf(message, sizeof message,
+               _("You are connected to %s, running %s with %s, and located in %s.  Your system administrator is %s."),
+               serv_info.serv_humannode,
+               serv_info.serv_software,
+               SERVER,
+               serv_info.serv_bbs_city,
+               serv_info.serv_sysadm);
+       escputs(message);
+       do_template("endbox");
+}
+
+/**
+ * \brief summary of inner div????
+ */
+void summary_inner_div(void) {
+       /**
+        * Now let's do three columns of crap.  All portals and all groupware
+        * clients seem to want to do three columns, so we'll do three
+        * columns too.  Conformity is not inherently a virtue, but there are
+        * a lot of really shallow people out there, and even though they're
+        * not people I consider worthwhile, I still want them to use WebCit.
+        */
+
+       wprintf("<div class=\"fix_scrollbar_bug\">"
+               "<table border=0 width=100%%><tr valign=top>");
+
+       /**
+        * Column One
+        */
+       wprintf("<td width=33%%>");
+       wholist_section();
+
+       /**
+        * Column Two
+        */
+       wprintf("</td><td width=33%%>");
+       server_info_section();
+       wprintf("<br />");
+       tasks_section();
+
+       /**
+        * Column Three
+        */
+       wprintf("</td><td width=33%%>");
+       new_messages_section();
+       wprintf("<br />");
+       calendar_section();
+
+       /**
+        * End of columns
+        */
+       wprintf("</td></tr></table>");
+}
+
+
+/**
+ * \brief Display this user's summary page
+ */
+void summary(void) {
+       char title[256];
+
+       output_headers(1, 1, 2, 0, 0, 0);
+       wprintf("<div id=\"banner\">\n");
+       wprintf("<table width=100%% border=0 bgcolor=#444455><tr>"
+               "<td><img src=\"static/summscreen_48x.gif\"></td><td>"
+               "<span class=\"titlebar\">"
+       );
+
+       snprintf(title, sizeof title, _("Summary page for %s"), WC->wc_fullname);
+       escputs(title);
+       wprintf("</span></td><td>\n");
+       wprintf("</td><td aling=right><span class=\"titlebar\">");
+       output_date();
+       wprintf("</span><br />");
+       offer_start_page();
+       wprintf("</td></tr></table>\n");
+
+       /**
+        * You guessed it ... we're going to refresh using ajax.
+        * In the future we might consider updating individual sections of the summary
+        * instead of the whole thing.
+        */
+       wprintf("</div>\n<div id=\"content\">\n");
+       summary_inner_div();
+       wprintf("</div>\n");
+
+       wprintf(
+               "<script type=\"text/javascript\">                                      "
+               " new Ajax.PeriodicalUpdater('content', 'summary_inner_div',            "
+               "                            { method: 'get', frequency: 60 }  );       "
+               "</script>                                                              \n"
+       );
+
+       wDumpContent(1);
+}
+
+
+/*@}*/
diff --git a/webcit/sysmsgs.c b/webcit/sysmsgs.c
new file mode 100644 (file)
index 0000000..7de3998
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ * $Id$
+ */
+/**
+ * \defgroup ShowSysMsgs Editing of various text files on the Citadel server.
+ * \ingroup WebcitDisplayItems
+ */
+/*@{*/
+#include "webcit.h"
+
+
+/**
+ * \brief display the form for editing something (room info, bio, etc)
+ * \param description the descriptive text for the box
+ * \param check_cmd command to check????
+ * \param read_cmd read answer from citadel server???
+ * \param save_cmd save comand to the citadel server??
+ * \param with_room_banner should we bisplay a room banner?
+ */
+void display_edit(char *description, char *check_cmd,
+                 char *read_cmd, char *save_cmd, int with_room_banner)
+{
+       char buf[SIZ];
+
+       serv_puts(check_cmd);
+       serv_getln(buf, sizeof buf);
+
+       if (buf[0] != '2') {
+               safestrncpy(WC->ImportantMessage, &buf[4], sizeof WC->ImportantMessage);
+               display_main_menu();
+               return;
+       }
+       if (with_room_banner) {
+               output_headers(1, 1, 1, 0, 0, 0);
+       }
+       else {
+               output_headers(1, 1, 0, 0, 0, 0);
+       }
+
+       svprintf("BOXTITLE", WCS_STRING, _("Edit %s"), description);
+       do_template("beginbox");
+
+       wprintf("<div align=\"center\">");
+       wprintf(_("Enter %s below.  Text is formatted to "
+               "the reader's screen width.  To defeat the "
+               "formatting, indent a line at least one space."), description);
+       wprintf("<br />");
+
+       wprintf("<FORM METHOD=\"POST\" action=\"%s\">\n", save_cmd);
+       wprintf("<TEXTAREA NAME=\"msgtext\" wrap=soft "
+               "ROWS=10 COLS=80 WIDTH=80>\n");
+       serv_puts(read_cmd);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '1')
+               server_to_text();
+       wprintf("</TEXTAREA><br /><br />\n");
+       wprintf("<INPUT TYPE=\"submit\" NAME=\"save_button\" VALUE=\"%s\">", _("Save changes"));
+       wprintf("&nbsp;");
+       wprintf("<INPUT TYPE=\"submit\" NAME=\"cancel_button\" VALUE=\"%s\"><br />\n", _("Cancel"));
+
+       wprintf("</FORM></div>\n");
+       do_template("endbox");
+       wDumpContent(1);
+}
+
+
+/**
+ * \brief save a screen which was displayed with display_edit()
+ * \param description the window title???
+ * \param enter_cmd which command to enter at the citadel server???
+ * \param regoto should we go to that room again after executing that command?
+ */
+void save_edit(char *description, char *enter_cmd, int regoto)
+{
+       char buf[SIZ];
+
+       if (strlen(bstr("save_button")) == 0) {
+               sprintf(WC->ImportantMessage,
+                       _("Cancelled.  %s was not saved."),
+                       description);
+               display_main_menu();
+               return;
+       }
+       serv_puts(enter_cmd);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '4') {
+               safestrncpy(WC->ImportantMessage, &buf[4], sizeof WC->ImportantMessage);
+               display_main_menu();
+               return;
+       }
+       text_to_server(bstr("msgtext"));
+       serv_puts("000");
+
+       if (regoto) {
+               smart_goto(WC->wc_roomname);
+       } else {
+               sprintf(WC->ImportantMessage,
+                       _("%s has been saved."),
+                       description);
+               display_main_menu();
+               return;
+       }
+}
+
+
+/*@}*/
diff --git a/webcit/tabs.c b/webcit/tabs.c
new file mode 100644 (file)
index 0000000..9c00bc9
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+ * $Id:  $
+ */
+/**
+ * \defgroup TabUtils Utility functions for creating tabbed dialogs
+ * \ingroup WebcitDisplayItems
+ */
+/*@{*/
+#include "webcit.h"
+
+/**
+ * \brief print tabbed dialog
+ * \param num_tabs how many tabs do we have?
+ * \param tabnames the headers of the tables
+ */
+void tabbed_dialog(int num_tabs, char *tabnames[]) {
+       int i;
+
+       wprintf("<script type=\"text/javascript\">                                              "
+               "var previously_selected_tab = '0';                                             "
+               "function tabsel(which_tab) {                                                   "
+               "       if (which_tab == previously_selected_tab) {                             "
+               "               return;                                                         "
+               "       }                                                                       "
+               "       $('tabtd'+previously_selected_tab).style.backgroundColor = '#cccccc';   "
+               "       $('tabdiv'+previously_selected_tab).style.display = 'none';             "
+               "       $('tabtd'+which_tab).style.backgroundColor = '#ffffff';                 "
+               "       $('tabdiv'+which_tab).style.display = 'block';                          "
+               "       previously_selected_tab = which_tab;                                    "
+               "}                                                                              "
+               "</script>                                                                      \n"
+       );
+
+       wprintf("<table id=\"TheTabs\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\" width=\"100%%\">"
+               "<tr align=\"center\" style=\"cursor:pointer\"><td>&nbsp;</td>"
+       );
+
+       for (i=0; i<num_tabs; ++i) {
+               wprintf("<td id=\"tabtd%d\" bgcolor=\"#%s\" "
+                       "onClick='tabsel(\"%d\");'"
+                       ">"
+                       "<span class=\"tablabel\">",
+                       i,
+                       ( (i==0) ? "ffffff" : "cccccc" ),
+                       i,
+                       i
+               );
+               wprintf("%s", tabnames[i]);
+               wprintf("</span></td>");
+
+               wprintf("<td>&nbsp;</td>\n");
+       }
+
+       wprintf("</tr></table>\n");
+       wprintf("<table border=\"0\" width=\"100%%\" bgcolor=\"#ffffff\"><tr><td>");
+}
+
+/**
+ * \brief print the tab-header
+ * \param tabnum number of the tab to print
+ * \param num_tabs total number oftabs to be printed
+ */
+void begin_tab(int tabnum, int num_tabs) {
+       wprintf("<div id=\"tabdiv%d\" style=\"display:%s\">",
+               tabnum,
+               ( (tabnum == 0) ? "block" : "none" )
+       );
+}
+
+/**
+ * \brief print the tab-footer
+ * \param tabnum number of the tab to print
+ * \param num_tabs total number oftabs to be printed
+ */
+void end_tab(int tabnum, int num_tabs) {
+       wprintf("</div>\n");
+       wprintf("<!-- end tab %d of %d -->\n", tabnum, num_tabs);
+
+       if (tabnum == num_tabs-1) {
+               wprintf("</td></tr></table>\n");
+               wprintf("<script type=\"text/javascript\">"
+                       " Nifty(\"table#TheTabs td\", \"small transparent top\");"
+                       "</script>"
+               );
+                       //" Nifty(\"td#tabtd1\", \"small transparent top\");"
+       }
+}
+
+
+/*@}*/
diff --git a/webcit/tcp_sockets.c b/webcit/tcp_sockets.c
new file mode 100644 (file)
index 0000000..2d5d985
--- /dev/null
@@ -0,0 +1,237 @@
+/*
+ * $Id$
+ */
+/** 
+ * \defgroup TcpSockets TCP client socket module for WebCit
+ * \ingroup CitadelCommunitacion
+ */
+/*@{*/
+
+/*
+ * Uncomment this to log all communications with the Citadel server
+#define SERV_TRACE 1
+ */
+
+#include "webcit.h"
+#include "webserver.h"
+
+/**
+ * \brief register the timeout
+ * \param signum signalhandler number
+ * \return signals
+ */
+RETSIGTYPE timeout(int signum)
+{
+       lprintf(1, "Connection timed out.\n");
+       exit(3);
+}
+
+
+/**
+ * \brief Connect a unix domain socket
+ * \param sockpath where to open a unix domain socket
+ */
+int uds_connectsock(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) {
+               lprintf(1, "Can't create socket: %s\n",
+                       strerror(errno));
+               return(-1);
+       }
+
+       if (connect(s, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
+               lprintf(1, "Can't connect: %s\n",
+                       strerror(errno));
+               close(s);
+               return(-1);
+       }
+
+       return s;
+}
+
+
+/**
+ * \brief Connect a TCP/IP socket
+ * \param host the host to connect to
+ * \param service the service on the host to call
+ */
+int tcp_connectsock(char *host, char *service)
+{
+       struct hostent *phe;
+       struct servent *pse;
+       struct protoent *ppe;
+       struct sockaddr_in sin;
+       int s;
+
+       memset(&sin, 0, sizeof(sin));
+       sin.sin_family = AF_INET;
+
+       pse = getservbyname(service, "tcp");
+       if (pse) {
+               sin.sin_port = pse->s_port;
+       } else if ((sin.sin_port = htons((u_short) atoi(service))) == 0) {
+               lprintf(1, "Can't get %s service entry\n", service);
+               return (-1);
+       }
+       phe = gethostbyname(host);
+       if (phe) {
+               memcpy(&sin.sin_addr, phe->h_addr, phe->h_length);
+       } else if ((sin.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE) {
+               lprintf(1, "Can't get %s host entry: %s\n",
+                       host, strerror(errno));
+               return (-1);
+       }
+       if ((ppe = getprotobyname("tcp")) == 0) {
+               lprintf(1, "Can't get TCP protocol entry: %s\n",
+                       strerror(errno));
+               return (-1);
+       }
+
+       s = socket(PF_INET, SOCK_STREAM, ppe->p_proto);
+       if (s < 0) {
+               lprintf(1, "Can't create socket: %s\n", strerror(errno));
+               return (-1);
+       }
+       signal(SIGALRM, timeout);
+       alarm(30);
+
+       if (connect(s, (struct sockaddr *) &sin, sizeof(sin)) < 0) {
+               lprintf(1, "Can't connect to %s.%s: %s\n",
+                       host, service, strerror(errno));
+               close(s);
+               return (-1);
+       }
+       alarm(0);
+       signal(SIGALRM, SIG_IGN);
+
+       return (s);
+}
+
+
+
+
+/**
+ * \brief Input binary data from socket
+ * \param buf the buffer to get the input to
+ * \param bytes the maximal number of bytes to read
+ */
+void serv_read(char *buf, int bytes)
+{
+       int len, rlen;
+
+       len = 0;
+       while (len < bytes) {
+               rlen = read(WC->serv_sock, &buf[len], bytes - len);
+               if (rlen < 1) {
+                       lprintf(1, "Server connection broken: %s\n",
+                               strerror(errno));
+                       close(WC->serv_sock);
+                       WC->serv_sock = (-1);
+                       WC->connected = 0;
+                       WC->logged_in = 0;
+                       memset(buf, 0, bytes);
+                       return;
+               }
+               len = len + rlen;
+       }
+}
+
+
+/**
+ * \brief input string from pipe
+ */
+void serv_getln(char *strbuf, int bufsize)
+{
+       int ch, len;
+       char buf[2];
+
+       len = 0;
+       strbuf[0] = 0;
+       do {
+               serv_read(&buf[0], 1);
+               ch = buf[0];
+               if ((ch != 13) && (ch != 10)) {
+                       strbuf[len++] = ch;
+               }
+       } while ((ch != 10) && (ch != 0) && (len < (bufsize-1)));
+       strbuf[len] = 0;
+#ifdef SERV_TRACE
+       lprintf(9, "%3d>%s\n", WC->serv_sock, strbuf);
+#endif
+}
+
+
+
+/**
+ * \brief send binary to server
+ * \param buf the buffer to write to citadel server
+ * \param nbytes how many bytes to send to citadel server
+ */
+void serv_write(char *buf, int nbytes)
+{
+       int bytes_written = 0;
+       int retval;
+       while (bytes_written < nbytes) {
+               retval = write(WC->serv_sock, &buf[bytes_written],
+                              nbytes - bytes_written);
+               if (retval < 1) {
+                       lprintf(1, "Server connection broken: %s\n",
+                               strerror(errno));
+                       close(WC->serv_sock);
+                       WC->serv_sock = (-1);
+                       WC->connected = 0;
+                       WC->logged_in = 0;
+                       return;
+               }
+               bytes_written = bytes_written + retval;
+       }
+}
+
+
+/**
+ * \brief send line to server
+ * \param string the line to send to the citadel server
+ */
+void serv_puts(char *string)
+{
+       char buf[SIZ];
+
+#ifdef SERV_TRACE
+       lprintf(9, "%3d<%s\n", WC->serv_sock, string);
+#endif
+       sprintf(buf, "%s\n", string);
+       serv_write(buf, strlen(buf));
+}
+
+
+/**
+ * \brief convenience function to send stuff to the server
+ * \param format the formatstring
+ * \param ... the entities to insert into format 
+ */
+void serv_printf(const char *format,...)
+{
+       va_list arg_ptr;
+       char buf[SIZ];
+
+       va_start(arg_ptr, format);
+       vsnprintf(buf, sizeof buf, format, arg_ptr);
+       va_end(arg_ptr);
+
+       strcat(buf, "\n");
+       serv_write(buf, strlen(buf));
+#ifdef SERV_TRACE
+       lprintf(9, "<%s", buf);
+#endif
+}
+
+
+/*@}*/
diff --git a/webcit/tiny_mce/blank.htm b/webcit/tiny_mce/blank.htm
new file mode 100644 (file)
index 0000000..5a4a5a5
--- /dev/null
@@ -0,0 +1,9 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>blank_page</title>\r
+       <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />\r
+</head>\r
+<body class="mceContentBody">\r
+\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/langs/ar.js b/webcit/tiny_mce/langs/ar.js
new file mode 100644 (file)
index 0000000..e2e36d2
--- /dev/null
@@ -0,0 +1,43 @@
+// arabic lang variables\r
+// Toolbar Items and Context Menu\r
+\r
+tinyMCE.addToLang('',{\r
+dir : 'rtl',\r
+bold_desc : '&#1594;&#1575;&#1605;&#1602;',\r
+italic_desc : '&#1605;&#1575;&#1574;&#1604;',\r
+underline_desc : '&#1578;&#1587;&#1591;&#1610;&#1585;',\r
+striketrough_desc : '&#1610;&#1578;&#1608;&#1587;&#1591;&#1607; &#1582;&#1591;',\r
+justifyleft_desc : '&#1605;&#1581;&#1575;&#1584;&#1575;&#1577; &#1573;&#1604;&#1609; &#1575;&#1604;&#1610;&#1587;&#1575;&#1585;',\r
+justifycenter_desc : '&#1578;&#1608;&#1587;&#1610;&#1591;',\r
+justifyright_desc : '&#1605;&#1581;&#1575;&#1584;&#1575;&#1577; &#1573;&#1604;&#1609; &#1575;&#1604;&#1610;&#1605;&#1610;&#1606;',\r
+justifyfull_desc : '&#1590;&#1576;&#1591;',\r
+bullist_desc : '&#1578;&#1593;&#1583;&#1575;&#1583; &#1606;&#1602;&#1591;&#1610;',\r
+numlist_desc : '&#1578;&#1593;&#1583;&#1575;&#1583; &#1585;&#1602;&#1605;&#1610;',\r
+outdent_desc : '&#1573;&#1606;&#1602;&#1575;&#1589; &#1575;&#1604;&#1605;&#1587;&#1575;&#1601;&#1577; &#1575;&#1604;&#1576;&#1575;&#1583;&#1574;&#1577;',\r
+indent_desc : '&#1586;&#1610;&#1575;&#1583;&#1577; &#1575;&#1604;&#1605;&#1587;&#1575;&#1601;&#1577; &#1575;&#1604;&#1576;&#1575;&#1583;&#1574;&#1577;',\r
+undo_desc : '&#1578;&#1585;&#1575;&#1580;&#1593;',\r
+redo_desc : '&#1573;&#1593;&#1575;&#1583;&#1577;',\r
+link_desc : '&#1573;&#1583;&#1585;&#1575;&#1580;/&#1578;&#1581;&#1585;&#1610;&#1585; &#1585;&#1575;&#1576;&#1591;',\r
+unlink_desc : '&#1573;&#1586;&#1575;&#1604;&#1577; &#1585;&#1575;&#1576;&#1591;',\r
+image_desc : '&#1573;&#1583;&#1585;&#1575;&#1580;/&#1578;&#1581;&#1585;&#1610;&#1585; &#1589;&#1608;&#1585;&#1577;',\r
+cleanup_desc : 'Cleanup messy code',\r
+focus_alert : 'A editor instance must be focused before using this command.',\r
+edit_confirm : 'Do you want to use the WYSIWYG mode for this textarea?',\r
+insert_link_title : '&#1573;&#1583;&#1585;&#1575;&#1580;/&#1578;&#1581;&#1585;&#1610;&#1585; &#1585;&#1575;&#1576;&#1591;',\r
+insert : '&#1573;&#1583;&#1585;&#1575;&#1580;',\r
+update : '&#1573;&#1583;&#1585;&#1575;&#1580;',\r
+cancel : '&#1571;&#1604;&#1594;&#1610;',\r
+insert_link_url : '&#1585;&#1575;&#1576;&#1591; URL',\r
+insert_link_target : '&#1575;&#1604;&#1607;&#1583;&#1601;',\r
+insert_link_target_same : '&#1606;&#1601;&#1587; &#1575;&#1604;&#1573;&#1591;&#1575;&#1585;',\r
+insert_link_target_blank : '&#1573;&#1591;&#1575;&#1585; &#1580;&#1583;&#1610;&#1583; (_blank)',\r
+insert_image_title : '&#1573;&#1583;&#1585;&#1575;&#1580;/&#1578;&#1581;&#1585;&#1610;&#1585; &#1589;&#1608;&#1585;&#1577;',\r
+insert_image_src : '&#1589;&#1608;&#1585;&#1577; URL',\r
+insert_image_alt : '&#1575;&#1604;&#1608;&#1589;&#1601;',\r
+help_desc : '&#1575;&#1604;&#1605;&#1587;&#1575;&#1593;&#1583;&#1577;',\r
+bold_img : 'bold.gif',\r
+italic_img : 'italic.gif',\r
+underline_img : "underline.gif",\r
+clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?',\r
+popup_blocked : 'Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.'\r
+});\r
diff --git a/webcit/tiny_mce/langs/ca.js b/webcit/tiny_mce/langs/ca.js
new file mode 100644 (file)
index 0000000..3f956f6
--- /dev/null
@@ -0,0 +1,41 @@
+// CA lang variables by Marc Bria\r
+\r
+tinyMCE.addToLang('',{\r
+bold_desc : 'Negreta',\r
+italic_desc : 'Cursiva',\r
+underline_desc : 'Subratllat',\r
+striketrough_desc : 'Tatxat',\r
+justifyleft_desc : 'Alinear a l´esquerra',\r
+justifycenter_desc : 'Alinear al centre',\r
+justifyright_desc : 'Alinear a la dreta',\r
+justifyfull_desc : 'Alinear justificat',\r
+bullist_desc : 'Llista sense ordenar',\r
+numlist_desc : 'Llista ordenada',\r
+outdent_desc : 'Disminueix sangria',\r
+indent_desc : 'Augmentar sangria',\r
+undo_desc : 'Desfer',\r
+redo_desc : 'Refer',\r
+link_desc : 'Insertar enllaç',\r
+unlink_desc : 'Treure enllaç',\r
+image_desc : 'Insertar imatge',\r
+cleanup_desc : 'Netejar codi',\r
+focus_alert : 'L´àrea de l´editor ha de ser enfocada abans d´executar aquesta comanda.',\r
+edit_confirm : 'Vols utilitzar el modus WYSIWYG per a aquesta àrea de text?',\r
+insert_link_title : 'Insertar/editar enllaç',\r
+insert : 'Insertar',\r
+update : 'Insertar',\r
+cancel : 'Cancel·lar',\r
+insert_link_url : 'Adreça de l´enllaç',\r
+insert_link_target : 'Destí',\r
+insert_link_target_same : 'Obrir enllaç a la mateixa finestra',\r
+insert_link_target_blank : 'Obrir enllaç en una finestra nova',\r
+insert_image_title : 'Insertar/editar imatge',\r
+insert_image_src : 'URL de l´imatge',\r
+insert_image_alt : 'Descripció de la imatge',\r
+help_desc : 'Ajut',\r
+bold_img : "bold.gif",\r
+italic_img : "italic.gif",\r
+underline_img : "underline.gif",\r
+clipboard_msg : 'Copiar/Tallar/Enganxar no és possible amb Mozilla i Firefox.\nVols més informació sobre aquest problema de seguretat?',\r
+popup_blocked : 'Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.'\r
+});\r
diff --git a/webcit/tiny_mce/langs/cs.js b/webcit/tiny_mce/langs/cs.js
new file mode 100644 (file)
index 0000000..55578f3
--- /dev/null
@@ -0,0 +1,52 @@
+/**\r
+ * Czech lang variables \r
+ * encoding: utf-8\r
+ * \r
+ * @author Michi   \r
+ * @author Pavel Novák\r
+ * @author Josef Klimosz\r
+ *    \r
+ * $Id: cs.js,v 1.6 2005/10/18 13:59:21 spocke Exp $ \r
+ */  \r
+\r
+\r
+tinyMCE.addToLang('',{\r
+bold_desc : 'Tučně',\r
+italic_desc : 'Kurzíva',\r
+underline_desc : 'Podtržení',\r
+striketrough_desc : 'Přeškrtnutí',\r
+justifyleft_desc : 'Zarovnání vlevo',\r
+justifycenter_desc : 'Zarovnání na střed',\r
+justifyright_desc : 'Zarovnání vpravo',\r
+justifyfull_desc : 'Zarovnání do bloku',\r
+bullist_desc : 'Seznam s odrážkami',\r
+numlist_desc : 'Číslovaný seznam',\r
+outdent_desc : 'Snížit odsazení',\r
+indent_desc : 'Zvýšit odsazení',\r
+undo_desc : 'Zpět',\r
+redo_desc : 'Znovu',\r
+link_desc : 'Vložit odkaz',\r
+unlink_desc : 'Zrušit odkaz',\r
+image_desc : 'Vložit obrázek',\r
+cleanup_desc : 'Vyčistit kód',\r
+focus_alert : 'Před použitím tohoto příkazu musí být kurzor v okně editoru.',\r
+edit_confirm : 'Chcete použít WYSIWYG editaci pro tento text?',\r
+insert_link_title : 'Vložit/upravit odkaz',\r
+insert : 'Vložit',\r
+update : 'Změnit',\r
+cancel : 'Zrušit',\r
+insert_link_url : 'URL odkazu',\r
+insert_link_target : 'Cíl',\r
+insert_link_target_same : 'Otevřít odkaz ve stejném okně',\r
+insert_link_target_blank : 'Otevřít odkaz v novém okně',\r
+insert_image_title : 'Vložit/upravit obrázek',\r
+insert_image_src : 'URL obrázku',\r
+insert_image_alt : 'Popis obrázku',\r
+help_desc : 'Nápověda',\r
+bold_img : 'bold.gif',\r
+italic_img : 'italic.gif',\r
+underline_img : "underline.gif",\r
+clipboard_msg : 'Funkce Kopírovat/vyjmout/vložit nejsou použitelné v Mozille a Firefoxu.\nChcete více informací o tomto problému?',\r
+popup_blocked : 'Omlouváme se, ale blokovač vyskakovacích oken neumožnil otevřít okno, které zprostředkovává funkčnost aplikace. Musíte vypnout blokování vyskakovacích oken na tomto webu, abyste využili plné funkčnosti.'\r
+});\r
+\r
diff --git a/webcit/tiny_mce/langs/cy.js b/webcit/tiny_mce/langs/cy.js
new file mode 100644 (file)
index 0000000..6ef0f6c
--- /dev/null
@@ -0,0 +1,41 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+bold_desc : 'Bold (Ctrl+B)',\r
+italic_desc : 'Italig (Ctrl+I)',\r
+underline_desc : 'Tanlinellu (Ctrl+U)',\r
+striketrough_desc : 'Llinell drwodd',\r
+justifyleft_desc : 'Unioni i\'r chwith',\r
+justifycenter_desc : 'Unioni i\'r canol',\r
+justifyright_desc : 'Unioni i\'r dde',\r
+justifyfull_desc : 'Unioni llawn',\r
+bullist_desc : 'Rhestr heb drefn',\r
+numlist_desc : 'Rhestr mewn trefn',\r
+outdent_desc : 'Lleihau mewnoliad',\r
+indent_desc : 'Cynyddu mewnoliad',\r
+undo_desc : 'Dadwneud (Ctrl+Z)',\r
+redo_desc : 'Ailwneud (Ctrl+Y)',\r
+link_desc : 'Mewnosod/golygu dolen',\r
+unlink_desc : 'Dadgysylltu',\r
+image_desc : 'Mewnosod/golygu delwedd',\r
+cleanup_desc : 'Tacluso c&ocirc;d',\r
+focus_alert : 'Rhaid rhoi ffocws i\'r golygydd cyn defnyddio\'r gorchymyn hwn.',\r
+edit_confirm : 'Wyt ti eisiau defnyddio\'r dull WYSIWYG ar gyfer yr ardal destun hon?',\r
+insert_link_title : 'Mewnosod/golygu dolen',\r
+insert : 'Mewnosod',\r
+update : 'Diweddaru',\r
+cancel : 'Diddymu',\r
+insert_link_url : 'URL dolen',\r
+insert_link_target : 'Targed',\r
+insert_link_target_same : 'Agor dolen yn yr un ffenest',\r
+insert_link_target_blank : 'Agor dolen mewn ffenest newydd',\r
+insert_image_title : 'Mewnosod/golygu delwedd',\r
+insert_image_src : 'URL delwedd',\r
+insert_image_alt : 'Disgrifiad delwedd',\r
+help_desc : 'Cymorth',\r
+bold_img : "bold.gif",\r
+italic_img : "italic.gif",\r
+underline_img : "underline.gif",\r
+clipboard_msg : 'Dyw Cop&iuml;o/Torri/Gludo ddim ar gael ym Mozilla na Firefox.\nHoffet ti ragor o wybodaeth ynghylch hyn?',\r
+popup_blocked : 'Mae\'n ddrwg gennym, ond mae dy declyn atal ffenestri naid wedi analluogi ffenest sy\'n cynnig nodweddion i\'r rhaglen. Bydd rhaid i ti analluogi atal ffenestri naid ar gyfer y safle hon er mwyn cael y defnydd gorau o\'r rhaglen hwn.'\r
+});\r
diff --git a/webcit/tiny_mce/langs/da.js b/webcit/tiny_mce/langs/da.js
new file mode 100644 (file)
index 0000000..c81acc1
--- /dev/null
@@ -0,0 +1,41 @@
+// DK lang variables contributed by Jan Moelgaard\r
+\r
+tinyMCE.addToLang('',{\r
+bold_desc : 'Fed',\r
+italic_desc : 'Kursiv',\r
+underline_desc : 'Understreg',\r
+striketrough_desc : 'Gennemstreg',\r
+justifyleft_desc : 'Venstrestil',\r
+justifycenter_desc : 'Centrer',\r
+justifyright_desc : 'H&#248;jrestil',\r
+justifyfull_desc : 'Lige margin',\r
+bullist_desc : 'Liste med bullets',\r
+numlist_desc : 'Liste med tal',\r
+outdent_desc : 'Ryk til venstre',\r
+indent_desc : 'Ryk til h&#248;jre',\r
+undo_desc : 'Fortryd',\r
+redo_desc : 'G&#248;r igen',\r
+link_desc : 'Inds&#230;t link',\r
+unlink_desc : 'Fjern link',\r
+image_desc : 'Inds&#230;t billede',\r
+cleanup_desc : 'Ryd op i koden',\r
+focus_alert : 'Der skal s&#230;ttes fokus p&#229; sessionen, f&#248;r man kan bruge denne kommando',\r
+edit_confirm : 'Vil du bruge WYSIWYG mode til dette textomr&#229;de?',\r
+insert_link_title : 'Inds&#230;t eller rediger link',\r
+insert : 'Inds&#230;t',\r
+update : 'Opdater',\r
+cancel : 'Fortryd',\r
+insert_link_url : 'Linkadresse',\r
+insert_link_target : 'Destination',\r
+insert_link_target_same : 'Luk linket op i samme vindue',\r
+insert_link_target_blank : 'Luk linket op i et nyt vindue',\r
+insert_image_title : 'Inds&#230;t / rediger billede',\r
+insert_image_src : 'Billedets adresse',\r
+insert_image_alt : 'Alternativ tekst',\r
+help_desc : 'Hj&#230;lp',\r
+bold_img : "bold.gif",\r
+italic_img : "italic.gif",\r
+underline_img : "underline.gif",\r
+clipboard_msg : 'Kopier/Klip/Inds&#230;t virker ikke i Mozilla og Firefox.\nVil du vide mere om dette?',\r
+popup_blocked : 'Beklager, men din browser blokerer for pop-up-vinduer. Skal du bruge denne editor fuldt ud, skal pop-up-vinduer v&#230;re tilladt.'\r
+});\r
diff --git a/webcit/tiny_mce/langs/de.js b/webcit/tiny_mce/langs/de.js
new file mode 100644 (file)
index 0000000..62e5a96
--- /dev/null
@@ -0,0 +1,41 @@
+// DE lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+bold_desc : 'Fett',\r
+italic_desc : 'Kursiv',\r
+underline_desc : 'Unterstrichen',\r
+striketrough_desc : 'Durchgestrichen',\r
+justifyleft_desc : 'Linksb&uuml;ndig',\r
+justifycenter_desc : 'Zentriert',\r
+justifyright_desc : 'Rechtsb&uuml;ndig',\r
+justifyfull_desc : 'Blocksatz',\r
+bullist_desc : 'Aufz&auml;hlungszeichen',\r
+numlist_desc : 'Nummerierung',\r
+outdent_desc : 'Einzug verkleinern',\r
+indent_desc : 'Einzug vergr&ouml;&szlig;ern',\r
+undo_desc : 'R&uuml;ckg&auml;ngig',\r
+redo_desc : 'Wiederholen',\r
+link_desc : 'Link einf&uuml;gen/bearbeiten',\r
+unlink_desc : 'Link entfernen',\r
+image_desc : 'Bild einf&uuml;gen/bearbeiten',\r
+cleanup_desc : 'Unsauberen Code aufr&auml;umen',\r
+focus_alert : 'Klicken Sie bitte vor Benutzung dieses Befehls auf das Editorfenster.',\r
+edit_confirm : 'Wollen Sie den WYSIWYG-Modus f&uuml;r dieses Textfeld benutzen?',\r
+insert_link_title : 'Link einf&uuml;gen/bearbeiten',\r
+insert : 'Einf&uuml;gen',\r
+update : 'Aktualisieren',\r
+cancel : 'Abbrechen',\r
+insert_link_url : 'Link-URL',\r
+insert_link_target : 'Ziel',\r
+insert_link_target_same : 'Link in gleichen Fester &ouml;ffnen',\r
+insert_link_target_blank : 'Link in neuen Fenster &ouml;ffnen',\r
+insert_image_title : 'Bild einf&uuml;gen/bearbeiten',\r
+insert_image_src : 'Bild-URL',\r
+insert_image_alt : 'Bild-Beschreibung',\r
+help_desc : 'Hilfe',\r
+bold_img : "bold_de_se.gif",\r
+italic_img : "italic_de_se.gif",\r
+underline_img : "underline.gif",\r
+clipboard_msg : 'Kopieren/Ausschneiden/Einf&uuml;gen ist in Mozilla und Firefox nicht verf&uuml;gbar.\nWollen Sie mehr Informationen dar&uuml;ber erhalten?',\r
+popup_blocked : 'Ihr Popup-Blocker hat verhindert, dass das Bearbeitungsfenster des Editors ge&ouml;ffnet werden konnte. Bitte deaktivieren Sie den Popup-Schutz f&uuml;r diese Seite.'\r
+});\r
diff --git a/webcit/tiny_mce/langs/el.js b/webcit/tiny_mce/langs/el.js
new file mode 100644 (file)
index 0000000..d41b619
--- /dev/null
@@ -0,0 +1,41 @@
+// Greek lang variables by Jacaranda Bill\r
+\r
+tinyMCE.addToLang('',{\r
+bold_desc : '¸íôïíç ãñá&ouml;Þ',\r
+italic_desc : 'ÐëÜãéá ãñá&ouml;Þ',\r
+underline_desc : 'ÕðïãñÜììéóç',\r
+striketrough_desc : '&Auml;éáêñéôÞ &auml;éáãñá&ouml;Þ',\r
+justifyleft_desc : 'Óôïß÷éóç áñéóô&aring;ñÜ',\r
+justifycenter_desc : 'Óôïß÷éóç óôï êÝíôñï',\r
+justifyright_desc : 'Óôïß÷éóç &auml;&aring;îéÜ',\r
+justifyfull_desc : 'ÐëÞñçò óôïß÷éóç',\r
+bullist_desc : 'Êïõêêß&auml;&aring;ò',\r
+numlist_desc : 'Áñßèìçóç',\r
+outdent_desc : 'Ì&aring;ßùóç &aring;óï÷Þò',\r
+indent_desc : 'Áýîçóç &aring;óï÷Þò',\r
+undo_desc : 'Áíáßñ&aring;óç',\r
+redo_desc : 'Áêýñùóç áíáßñ&aring;óçò',\r
+link_desc : '&Auml;çìéïõñãßá/&Auml;éüñèùóç õð&aring;ñ-óýí&auml;&aring;óçò',\r
+unlink_desc : '&Auml;éáãñá&ouml;Þ õð&aring;ñ-óýí&auml;&aring;óçò',\r
+image_desc : '&Aring;éóáãùãÞ/&Auml;éüñèùóç &aring;éêüíáò',\r
+cleanup_desc : 'ÊáèÜñéóìá êþ&auml;éêá',\r
+focus_alert : 'ÐñÝð&aring;é íá õðÜñ÷&aring;é &aring;í&aring;ñãüò êÜðïéïò &aring;ð&aring;î&aring;ñãáóôÞò ê&aring;éìÝíïõ ðñéí íá ÷ñçóéìïðïéÞó&aring;ô&aring; áõôÞ ôçí &aring;íôïëÞ.',\r
+edit_confirm : 'ÈÝë&aring;ô&aring; íá ÷ñçóéìïðïéÞó&aring;ô&aring; ôçí êáôÜóôáóç WYSIWYG ãéá ôï óõãê&aring;êñéìÝíï ðëáßóéï ê&aring;éìÝíïõ;',\r
+insert_link_title : '&Auml;çìéïõñãßá/&Auml;éüñèùóç õð&aring;ñ-óýí&auml;&aring;óçò',\r
+insert : '&Aring;éóáãùãÞ',\r
+update : '&Aring;éóáãùãÞ',\r
+cancel : 'Áêýñùóç',\r
+insert_link_url : '&Auml;é&aring;ýèõíóç',\r
+insert_link_target : 'Óôü÷ïò',\r
+insert_link_target_same : '¢íïéãìá ôçò &auml;é&aring;ýèõíóçò óôï ß&auml;éï ðáñÜèõñï',\r
+insert_link_target_blank : '¢íïéãìá ôçò &auml;é&aring;ýèõíóçò ó&aring; íÝï ðáñÜèõñï',\r
+insert_image_title : '&Aring;éóáãùãÞ/&Auml;éüñèùóç &aring;éêüíáò',\r
+insert_image_src : '&Auml;é&aring;ýèõíóç',\r
+insert_image_alt : 'Ð&aring;ñéãñá&ouml;Þ',\r
+help_desc : 'ÂïÞè&aring;éá',\r
+bold_img : "bold.gif",\r
+italic_img : "italic.gif",\r
+underline_img : "underline.gif",\r
+clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?',\r
+popup_blocked : 'Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.'\r
+});\r
diff --git a/webcit/tiny_mce/langs/en.js b/webcit/tiny_mce/langs/en.js
new file mode 100644 (file)
index 0000000..c093eaf
--- /dev/null
@@ -0,0 +1,41 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+bold_desc : 'Bold (Ctrl+B)',\r
+italic_desc : 'Italic (Ctrl+I)',\r
+underline_desc : 'Underline (Ctrl+U)',\r
+striketrough_desc : 'Strikethrough',\r
+justifyleft_desc : 'Align left',\r
+justifycenter_desc : 'Align center',\r
+justifyright_desc : 'Align right',\r
+justifyfull_desc : 'Align full',\r
+bullist_desc : 'Unordered list',\r
+numlist_desc : 'Ordered list',\r
+outdent_desc : 'Outdent',\r
+indent_desc : 'Indent',\r
+undo_desc : 'Undo (Ctrl+Z)',\r
+redo_desc : 'Redo (Ctrl+Y)',\r
+link_desc : 'Insert/edit link',\r
+unlink_desc : 'Unlink',\r
+image_desc : 'Insert/edit image',\r
+cleanup_desc : 'Cleanup messy code',\r
+focus_alert : 'A editor instance must be focused before using this command.',\r
+edit_confirm : 'Do you want to use the WYSIWYG mode for this textarea?',\r
+insert_link_title : 'Insert/edit link',\r
+insert : 'Insert',\r
+update : 'Update',\r
+cancel : 'Cancel',\r
+insert_link_url : 'Link URL',\r
+insert_link_target : 'Target',\r
+insert_link_target_same : 'Open link in the same window',\r
+insert_link_target_blank : 'Open link in a new window',\r
+insert_image_title : 'Insert/edit image',\r
+insert_image_src : 'Image URL',\r
+insert_image_alt : 'Image description',\r
+help_desc : 'Help',\r
+bold_img : "bold.gif",\r
+italic_img : "italic.gif",\r
+underline_img : "underline.gif",\r
+clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?',\r
+popup_blocked : 'Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.'\r
+});\r
diff --git a/webcit/tiny_mce/langs/es.js b/webcit/tiny_mce/langs/es.js
new file mode 100644 (file)
index 0000000..f51c443
--- /dev/null
@@ -0,0 +1,50 @@
+/**\r
+ * ES lang variables\r
+ * \r
+ * Authors : Alvaro Velasco,\r
+ *           Adolfo Sanz De Diego (asanzdiego) <asanzdiego@yahoo.es>,\r
+ *           Carlos C Soto (eclipxe) <csoto@sia-solutions.com>\r
+ * Last Updated : October 17, 2005\r
+ * TinyMCE Version : 2.0RC3\r
+ */\r
+\r
+\r
+tinyMCE.addToLang('',{\r
+bold_desc : 'Negrita (Ctrl+B)',\r
+italic_desc : 'Cursiva (Ctrl+I)',\r
+underline_desc : 'Subrayado (Ctrl+U)',\r
+striketrough_desc : 'Tachado',\r
+justifyleft_desc : 'Alinear a la izquierda',\r
+justifycenter_desc : 'Alinear al centro',\r
+justifyright_desc : 'Alinear a la derecha',\r
+justifyfull_desc : 'Alinear justificado',\r
+bullist_desc : 'Lista sin ordenar',\r
+numlist_desc : 'Lista ordenada',\r
+outdent_desc : 'Disminuir sangría',\r
+indent_desc : 'Aumentar sangría',\r
+undo_desc : 'Deshacer',\r
+redo_desc : 'Rehacer',\r
+link_desc : 'Insertar enlace',\r
+unlink_desc : 'Quitar enlace',\r
+image_desc : 'Insertar imagen',\r
+cleanup_desc : 'Limpiar codigo',\r
+focus_alert : 'Una instanacia del editor debe ser enfocada antes de usar este comando.',\r
+edit_confirm : '¿Quieres usar el modo WYSIWYG (What You See Is What You Get - "lo que ves es lo que obtienes") para esta area de texto?',\r
+insert_link_title : 'Insertar/editar enlace',\r
+insert : 'Insertar',\r
+update : 'Actualizar',\r
+cancel : 'Cancelar',\r
+insert_link_url : 'Dirección del enlace',\r
+insert_link_target : 'Destino',\r
+insert_link_target_same : 'Abrir enlace en la misma ventana',\r
+insert_link_target_blank : 'Abrir enlace en una ventana nueva',\r
+insert_image_title : 'Insertar/editar imagen',\r
+insert_image_src : 'Dirección de la imagen',\r
+insert_image_alt : 'Descripción de la imagen',\r
+help_desc : 'Ayuda',\r
+bold_img : "bold_es.gif",\r
+italic_img : "italic_es.gif",\r
+underline_img : "underline_es.gif",\r
+clipboard_msg : 'No se pueden utilizar los comandos Copiar / Cortar / Pegar en Mozilla y en Firefox.\r\nUse el teclado Copiar (Ctrl+C) / Cortar (Ctrl+X) / Pegar (Ctrl+V)\r\n¿Quieres obtener más información?',\r
+popup_blocked : 'Lo siento, pero tu bloqueador de popups ha desactivado una ventana que ha lanzado la aplicación. Debes desactivar tu bloqueador de popups para tener toda la funcionalad de la aplicación.'\r
+});\r
diff --git a/webcit/tiny_mce/langs/fa.js b/webcit/tiny_mce/langs/fa.js
new file mode 100644 (file)
index 0000000..46623ad
--- /dev/null
@@ -0,0 +1,46 @@
+// IR lang variables\r
+// Persian (Farsi) language pack (for IRAN)\r
+// By: Morteza Zafari\r
+// Lost@LostLord.com\r
+// http://www.LostLord.com\r
+\r
+tinyMCE.addToLang('',{\r
+dir : 'rtl',\r
+bold_desc : '????',\r
+italic_desc : '????',\r
+underline_desc : '??? ?? ???',\r
+striketrough_desc : '?? ?????',\r
+justifyleft_desc : '?? ???',\r
+justifycenter_desc : '??? ???',\r
+justifyright_desc : '???? ???',\r
+justifyfull_desc : '????? ???',\r
+bullist_desc : '????',\r
+numlist_desc : '???? ????',\r
+outdent_desc : '???? ?????',\r
+indent_desc : '?????? ?????',\r
+undo_desc : '????????',\r
+redo_desc : '????????',\r
+link_desc : '??? ? ?????? ????',\r
+unlink_desc : '??? ????',\r
+image_desc : '??? ? ?????? ???',\r
+cleanup_desc : '??????? ??',\r
+focus_alert : 'A editor instance must be focused before using this command.',\r
+edit_confirm : 'Do you want to use the WYSIWYG mode for this textarea?',\r
+insert_link_title : '??? ? ?????? ????',\r
+insert : '  ?????  ',\r
+update : '  ?????  ',\r
+cancel : ' ?????? ',\r
+insert_link_url : 'URL ????',\r
+insert_link_target : '????',\r
+insert_link_target_same : '???? ?? ?? ???? ???? ??? ??',\r
+insert_link_target_blank : '???? ?? ?? ???? ???? ??? ??',\r
+insert_image_title : '??? ? ?????? ???',\r
+insert_image_src : 'URL ???',\r
+insert_image_alt : '?????',\r
+help_desc : '??????',\r
+bold_img : "bold.gif",\r
+italic_img : "italic.gif",\r
+underline_img : "underline.gif",\r
+clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?',\r
+popup_blocked : 'Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.'\r
+});\r
diff --git a/webcit/tiny_mce/langs/fi.js b/webcit/tiny_mce/langs/fi.js
new file mode 100644 (file)
index 0000000..31c0f88
--- /dev/null
@@ -0,0 +1,42 @@
+// FI lang variables by Urho Konttori from Absolutions\r
+// Updated by Tuomo Aura, Ateco.fi\r
+\r
+tinyMCE.addToLang('',{\r
+bold_desc : 'Lihavoi (Ctrl+B)',\r
+italic_desc : 'Kursivoi (Ctrl+I)',\r
+underline_desc : 'Alleviivaa (Ctrl+U)',\r
+striketrough_desc : 'Yliviivaa',\r
+justifyleft_desc : 'Vasen tasaus',\r
+justifycenter_desc : 'Keskitys',\r
+justifyright_desc : 'Oikea tasaus',\r
+justifyfull_desc : 'Pakotettu tasaus',\r
+bullist_desc : 'Luettelo',\r
+numlist_desc : 'Numeroitu lista',\r
+outdent_desc : 'Poista sisennyt',\r
+indent_desc : 'Sisennys',\r
+undo_desc : 'Peruuta (Ctrl+Z)',\r
+redo_desc : 'Tee uudelleen (Ctrl+Y)',\r
+link_desc : 'Lis&auml;&auml; linkki',\r
+unlink_desc : 'Poista linkki',\r
+image_desc : 'Lis&auml;&auml; kuva',\r
+cleanup_desc : 'Siisti koodi',\r
+focus_alert : 'Teksink&auml;sittelyalue t&auml;ytyy olla valittuna ennen t&auml;m&auml;n komennon suorittamista.',\r
+edit_confirm : 'Haluatko k&auml;ytt&auml;&auml; WYSIWYG-tilaa t&auml;h&auml;n tekstialueeseen?',\r
+insert_link_title : 'Lis&auml;&auml;/muokkaa linkki&auml;',\r
+insert : 'Lisää',\r
+update : 'Päivitä',\r
+cancel : 'Peruuta',\r
+insert_link_url : 'Linkin URL',\r
+insert_link_target : 'Kohde',\r
+insert_link_target_same : 'Avaa linkki samassa ikkunassa',\r
+insert_link_target_blank : 'Avaa linkki uudessa ikkunassa',\r
+insert_image_title : 'Lis&auml;&auml;/muokkaa kuvaa',\r
+insert_image_src : 'Kuvan URL',\r
+insert_image_alt : 'Kuvan selite',\r
+help_desc : 'Apua',\r
+bold_img : "bold.gif",\r
+italic_img : "italic.gif",\r
+underline_img : "underline.gif",\r
+clipboard_msg : 'Leikkaus/Kopiointi/Liit&auml;minen ei onnistu Mozilla eik&auml; Firefox -selaimilla tietoturvasta johtuen. \n Haluatko lis&auml;tietoa aiheesta?',\r
+popup_blocked : 'Koneellasi oleva popup-ikkunoiden esto-ohjelma est&auml;&auml; tarvittavan ikkunan avaamisen. Sinun pit&auml;&auml; sallia popup-ikkunoiden n&auml;ytt&auml;minen t&auml;ll&auml; sivustolla ohjelman asetuksista.'\r
+});\r
diff --git a/webcit/tiny_mce/langs/fr.js b/webcit/tiny_mce/langs/fr.js
new file mode 100644 (file)
index 0000000..e292df1
--- /dev/null
@@ -0,0 +1,43 @@
+// FR lang variables by Pat Boens\r
+// Modify by Laurent Dran\r
+// Modifié par Normand Lamoureux le 2005-11-12\r
+\r
+tinyMCE.addToLang('',{\r
+bold_desc : 'Gras',\r
+italic_desc : 'Italique',\r
+underline_desc : 'Souligné',\r
+striketrough_desc : 'Barré',\r
+justifyleft_desc : 'Aligner à gauche',\r
+justifycenter_desc : 'Centrer',\r
+justifyright_desc : 'Aligner à droite',\r
+justifyfull_desc : 'Justifier',\r
+bullist_desc : 'Liste à puces',\r
+numlist_desc : 'Liste numérotée',\r
+outdent_desc : 'Diminuer le retrait',\r
+indent_desc : 'Augmenter le retrait',\r
+undo_desc : 'Annuler',\r
+redo_desc : 'Restaurer',\r
+link_desc : 'Insérer/Modifier un lien',\r
+unlink_desc : 'Supprimer le lien',\r
+image_desc : 'Insérer/Modifier une image',\r
+cleanup_desc : 'Nettoyer le code',\r
+focus_alert : 'Une instance de l\éditeur doit avoir le focus avant d\'utiliser cette commande.',\r
+edit_confirm : 'Voulez-vous utiliser le mode WYSIWYG pour cette zone d\'édition de texte ?',\r
+insert_link_title : 'Gestionnaire d\'hyperlien',\r
+insert : 'Insérer',\r
+update : 'Appliquer',\r
+cancel : 'Annuler',\r
+insert_link_url : 'Lien URL',\r
+insert_link_target : 'Cible',\r
+insert_link_target_same : 'Ouvrir dans la même fenêtre',\r
+insert_link_target_blank : 'Ouvrir dans une nouvelle fenêtre',\r
+insert_image_title : 'Gestionnaire d\'image',\r
+insert_image_src : 'URL de l\'image',\r
+insert_image_alt : 'Équivalent textuel',\r
+help_desc : 'Aide',\r
+bold_img : "bold_fr.gif",\r
+italic_img : "italic.gif",\r
+underline_img : "underline_fr.gif",\r
+clipboard_msg : 'Pour des raisons de sécurité, les fonctions « Copier », « Couper » et « Coller »\nne sont pas disponibles dans Mozilla et Firefox.\n\n\nVoulez-vous plus d\'information à ce sujet?\n',\r
+popup_blocked : 'Désolé, mais votre bloqueur de pop-up empêche le fonctionnement normal de l\'application.\n\n\nPour utiliser cet outil, veuillez régler votre navigateur pour qu\'il accepte les pop-up de ce site.'\r
+});\r
diff --git a/webcit/tiny_mce/langs/fr_ca.js b/webcit/tiny_mce/langs/fr_ca.js
new file mode 100644 (file)
index 0000000..4fd6e90
--- /dev/null
@@ -0,0 +1,40 @@
+// Canadian French lang variables by Virtuelcom\r
+\r
+tinyMCE.addToLang('',{\r
+bold_desc : 'Gras',\r
+italic_desc : 'Italique',\r
+underline_desc : 'Souligner',\r
+striketrough_desc : 'Barrer',\r
+justifyleft_desc : 'Aligner à gauche',\r
+justifycenter_desc : 'Aligner au centre',\r
+justifyright_desc : 'Aligner à droite',\r
+justifyfull_desc : 'Justifier',\r
+bullist_desc : 'Puces',\r
+numlist_desc : 'Numérotation',\r
+outdent_desc : 'Réduire le retrait',\r
+indent_desc : 'Augmenter le retrait',\r
+undo_desc : 'Annuler la dernière action',\r
+redo_desc : 'Refaire la dernière action annulée',\r
+link_desc : 'Insérer un hyperlien',\r
+unlink_desc : 'Supprimer un hyperlien',\r
+image_desc : 'Insérer une image',\r
+cleanup_desc : 'Nettoyer le code',\r
+focus_alert : 'Un éditeur doit être sélectionné pour utiliser cette fonction.',\r
+edit_confirm : 'Désirez-vous utiliser l\'éditeur pour modifier cette zone?',\r
+insert_link_title : 'Insérer / Modifier un hyperlien',\r
+insert : 'Insérer',\r
+update : 'Insérer',\r
+cancel : 'Annuler',\r
+insert_link_url : 'Adresse URL',\r
+insert_link_target : 'Destination',\r
+insert_link_target_same : 'Ouvrir dans la même fenêtre',\r
+insert_link_target_blank : 'Ouvrir dans une nouvelle fenêtre',\r
+insert_image_title : 'Insérer / Modifier une image',\r
+insert_image_src : 'Adresse de l\'image',\r
+insert_image_alt : 'Description de l\'image',\r
+help_desc : 'Aide',\r
+bold_img : "bold_fr.gif",\r
+italic_img : "italic.gif",\r
+underline_img : "underline_fr.gif",\r
+clipboard_msg : 'Copier/Couper/Coller ne sont pas disponibles dans Mozilla et FireFox.\nDésirez-vous consulter de plus amples informations à ce sujet?'\r
+});\r
diff --git a/webcit/tiny_mce/langs/he.js b/webcit/tiny_mce/langs/he.js
new file mode 100644 (file)
index 0000000..44719a8
--- /dev/null
@@ -0,0 +1,41 @@
+// HE lang variables by Liron Newman, http://eesh.net\r
+\r
+tinyMCE.addToLang('',{\r
+bold_desc : 'îåãâù (Ctrl+B)',\r
+italic_desc : 'ðèåé (Ctrl+I)',\r
+underline_desc : '÷å úçúé (Ctrl+U)',\r
+striketrough_desc : '÷å çåöä',\r
+justifyleft_desc : 'éùø ìùîàì',\r
+justifycenter_desc : 'éùø ìîøëæ',\r
+justifyright_desc : 'éùø ìéîéï',\r
+justifyfull_desc : 'éùø ìùðé äöããéí',\r
+bullist_desc : 'øùéîä çñøú ñãø',\r
+numlist_desc : 'øùéîä îñåãøú',\r
+outdent_desc : 'ä÷èï ëðéñä',\r
+indent_desc : 'äâãì ëðéñä',\r
+undo_desc : 'áèì (Ctrl+Z)',\r
+redo_desc : 'áöò ùåá (Ctrl+Y)',\r
+link_desc : 'äëðñ/òøåê ÷éùåø',\r
+unlink_desc : 'áèì ÷éùåø',\r
+image_desc : 'äëðñ/òøåê úîåðä',\r
+cleanup_desc : 'ð÷ä ÷åã îáåìâï',\r
+focus_alert : 'éù ìáçåø áùãä òøéëä ìôðé ùðéúï ìäùúîù áô÷åãä æå.',\r
+edit_confirm : 'äàí áøöåðê ìäùúîù áîöá òøéëä òùéøä (WYSIWYG) òáåø ùãä è÷ñè æä?',\r
+insert_link_title : 'äëðñ/òøåê ÷éùåø',\r
+insert : 'äëðñ',\r
+update : 'òãëï',\r
+cancel : 'áèì',\r
+insert_link_url : 'ëúåáú (URL) ä÷éùåø',\r
+insert_link_target : 'éòã',\r
+insert_link_target_same : 'ôúç àú ä÷éùåø áàåúå çìåï',\r
+insert_link_target_blank : 'ôúç àú ä÷éùåø áçìåï çãù',\r
+insert_image_title : 'äëðñ/òøåê úîåðä',\r
+insert_image_src : 'ëúåáú (URL) äúîåðä',\r
+insert_image_alt : 'úéàåø äúîåðä',\r
+help_desc : 'òæøä',\r
+bold_img : "bold.gif",\r
+italic_img : "italic.gif",\r
+underline_img : "underline.gif",\r
+clipboard_msg : 'ôòåìåú äòú÷ä/âæéøä/äãá÷ä àéðï ðúîëåú úçú Mozilla å-Firefox.\näàí áøöåðê ì÷áì îéãò ðåñó àåãåú ðåùà æä?',\r
+popup_blocked : 'ñìéçä, àê ùîðå ìá ëé çåñí äçìåðåú ä÷åôöéí ùìê çñí çìåï ùîäååä çì÷ îäééùåí. úöèøê ìáèì àú çñéîú äçìåðåú ä÷åôöéí áàúø æä ëãé ìðöì ëìé æä áîìåàå.'\r
+});\r
diff --git a/webcit/tiny_mce/langs/hu.js b/webcit/tiny_mce/langs/hu.js
new file mode 100644 (file)
index 0000000..aebcc36
--- /dev/null
@@ -0,0 +1,41 @@
+// HU lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+bold_desc : 'Félkövér',\r
+italic_desc : 'Dölt',\r
+underline_desc : 'Aláhúzott',\r
+striketrough_desc : 'Áthúzott',\r
+justifyleft_desc : 'Balra igazított',\r
+justifycenter_desc : 'Középre igazított',\r
+justifyright_desc : 'Jobbra igazított',\r
+justifyfull_desc : 'Telejesen igazított',\r
+bullist_desc : 'Rendezetlen lista',\r
+numlist_desc : 'Rendezett lista',\r
+outdent_desc : 'Kihúzás',\r
+indent_desc : 'Behúzás',\r
+undo_desc : 'visszavonás',\r
+redo_desc : 'Ismét',\r
+link_desc : 'Link hozzáadása/szerkesztése',\r
+unlink_desc : 'Link megszüntetése',\r
+image_desc : 'Kép beillesztése/szerkesztése',\r
+cleanup_desc : 'Rendetlen kód tisztítása',\r
+focus_alert : 'Egy szerkesztõablakra muszáj fókuszálni ennek a parancsnak a használata elõtt.',\r
+edit_confirm : 'Szeretnéd használni ezt a WYSIWYG módot ehhez a szövegmezõhöz?',\r
+insert_link_title : 'Link beillesztése/szerkesztése',\r
+insert : 'Beillesztés',\r
+update : 'Frissítés',\r
+cancel : 'Mégse',\r
+insert_link_url : 'Link URL',\r
+insert_link_target : 'Cél',\r
+insert_link_target_same : 'Link megnyitása ugyanabban az ablakban',\r
+insert_link_target_blank : 'Link megnyitása új ablakban',\r
+insert_image_title : 'Kép beillesztése/szerkesztése',\r
+insert_image_src : 'Kép URL',\r
+insert_image_alt : 'Kép leírása',\r
+help_desc : 'Súgó',\r
+bold_img : "bold.gif",\r
+italic_img : "italic.gif",\r
+underline_img : "underline.gif",\r
+clipboard_msg : 'A Másolás/Kivágás/Beillesztés nem elérhetõ Mozillában and Firefox-ban.\nSzeretnél több információt errõl a problémáról?',\r
+popup_blocked : 'Sajnálom, de észrevettem, hogy a popup-blokkolód letiltotta az ablakot, ami biztosítja ennek az alkalmazásnak a mûködését. Meg kell szüntetned a popup-blokkolást ennek a segédeszköznek a teljes használatához.'\r
+});\r
diff --git a/webcit/tiny_mce/langs/is.js b/webcit/tiny_mce/langs/is.js
new file mode 100644 (file)
index 0000000..9bb4f9f
--- /dev/null
@@ -0,0 +1,41 @@
+// Iceland lang variables by Johannes Birgir Jensson\r
+\r
+tinyMCE.addToLang('',{\r
+bold_desc : 'Feitletrun (Ctrl+B)',\r
+italic_desc : 'Sk&aacute;letrun (Ctrl+I)',\r
+underline_desc : 'Undirstrikun (Ctrl+U)',\r
+striketrough_desc : 'Strik &iacute; gegn',\r
+justifyleft_desc : 'Vinstri j&ouml;fnun',\r
+justifycenter_desc : 'Mi&eth;ju j&ouml;fnun',\r
+justifyright_desc : 'H&aelig;gri j&ouml;fnun',\r
+justifyfull_desc : 'Samfelld j&ouml;fnun',\r
+bullist_desc : 'Óra&eth;a&eth;ur listi',\r
+numlist_desc : 'Ra&eth;a&eth;ur listi',\r
+outdent_desc : 'Útdr&aacute;ttur',\r
+indent_desc : 'Inndr&aacute;ttur',\r
+undo_desc : 'Afturkalla (Ctrl+Z)',\r
+redo_desc : 'Endurkalla (Ctrl+Y)',\r
+link_desc : 'Setja inn/breyta hlekk',\r
+unlink_desc : 'Fjarl&aelig;gja hlekk',\r
+image_desc : 'Setja inn/breyta mynd',\r
+cleanup_desc : 'Hreinsa ruslk&oacute;&eth;a',\r
+focus_alert : 'Setja &thorn;arf bendil &iacute; ritsv&aelig;&eth;i &aacute;&eth;ur en &thorn;essi skipun er notu&eth;.',\r
+edit_confirm : 'Viltu nota WYSIWYG &aacute; &thorn;essum reit?',\r
+insert_link_title : 'N&yacute;r/breyttur hlekkur',\r
+insert : 'Setja inn',\r
+update : 'Uppf&aelig;ra',\r
+cancel : 'H&aelig;tta vi&eth;',\r
+insert_link_url : 'Sl&oacute;&eth; hlekks',\r
+insert_link_target : 'Gluggi',\r
+insert_link_target_same : 'Opna tengil &iacute; sama glugga',\r
+insert_link_target_blank : 'Opna tengil &iacute; n&yacute;jum glugga',\r
+insert_image_title : 'N&yacute;/breytt mynd',\r
+insert_image_src : 'Sl&oacute;&eth; myndar',\r
+insert_image_alt : 'L&yacute;sing myndar',\r
+help_desc : 'Hj&aacute;lp',\r
+bold_img : "bold.gif",\r
+italic_img : "italic.gif",\r
+underline_img : "underline.gif",\r
+clipboard_msg : 'Afrita/skeyta/líma er ekki leyft í vafranum.\nViltu fá frekari upplýsingar um hvernig á að stilla það?',\r
+popup_blocked : 'Afsakið, gluggavörn vafrans hefur meinað glugga, sem umsjónarkerfið notar, leyfi til þess að opnast. Þú verður að leyfa þessum vef að opna sprettiglugga (popup) til að geta nýtt þennan möguleika.'\r
+});\r
diff --git a/webcit/tiny_mce/langs/it.js b/webcit/tiny_mce/langs/it.js
new file mode 100644 (file)
index 0000000..ecbc7a6
--- /dev/null
@@ -0,0 +1,41 @@
+// Variabili lingua IT - fabrix.xm@lombardiacom.it\r
+\r
+tinyMCE.addToLang('',{\r
+bold_desc : 'Grassetto',\r
+italic_desc : 'Corsivo',\r
+underline_desc : 'Sottolineato',\r
+striketrough_desc : 'Barrato',\r
+justifyleft_desc : 'Allinea a sinistra',\r
+justifycenter_desc : 'Allinea centrato',\r
+justifyright_desc : 'Allinea a destra',\r
+justifyfull_desc : 'Giustifica',\r
+bullist_desc : 'Lista non ordinata',\r
+numlist_desc : 'Lista ordinata',\r
+outdent_desc : 'Rientra',\r
+indent_desc : 'Indenta',\r
+undo_desc : 'Annulla',\r
+redo_desc : 'Ripeti',\r
+link_desc : 'Inserisci link',\r
+unlink_desc : 'Elimina link',\r
+image_desc : 'Inserisci immagine',\r
+cleanup_desc : 'Pulisci il  codice',\r
+focus_alert : 'Una istanza dell\' editor deve essere selezionata prima di usare questo comando.',\r
+edit_confirm : 'Vuoi usare la modalit\u00E0 WYSIWYG per questa textarea?',\r
+insert_link_title : 'Inserisci/modifica link',\r
+insert : 'Inserisci',\r
+update : 'Inserisci',\r
+cancel : 'Cancella',\r
+insert_link_url : 'Link URL',\r
+insert_link_target : 'Target',\r
+insert_link_target_same : 'Apri il link nella stessa finestra',\r
+insert_link_target_blank : 'Apri il link in una nuova finestra',\r
+insert_image_title : 'Inserisci/modifica immagine',\r
+insert_image_src : 'URL immagine',\r
+insert_image_alt : 'Descrizione dell\'immagine',\r
+help_desc : 'Guida',\r
+bold_img : "bold.gif",\r
+italic_img : "italic.gif",\r
+underline_img : "underline.gif",\r
+clipboard_msg : 'Copia, Taglia e Incolla non sono disponibili in Mozilla e Firefox.\nVuoi maggiori dettegli su questo problema?',\r
+popup_blocked : 'Spiacenti, un sistema di blocco popup ha impedito l\'apertura di una finestra necessaria per il funzionamento dell\'editor. Disabilita il blocco popup per questo sito se vuoi utilizzare tutte le funzionalità.'\r
+});\r
diff --git a/webcit/tiny_mce/langs/ja.js b/webcit/tiny_mce/langs/ja.js
new file mode 100644 (file)
index 0000000..1300ee4
--- /dev/null
@@ -0,0 +1,41 @@
+// JP lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+bold_desc : '\e$BB@;z\e(B',\r
+italic_desc : '\e$B<PBN\e(B',\r
+underline_desc : '\e$B2<@~\e(B',\r
+striketrough_desc : '\e$BKu>C@~\e(B',\r
+justifyleft_desc : '\e$B:85M$a\e(B',\r
+justifycenter_desc : '\e$BCf1{9g$o$;\e(B',\r
+justifyright_desc : '\e$B1&5M$a\e(B',\r
+justifyfull_desc : '\e$B9TB7$(\e(B',\r
+bullist_desc : '\e$B2U>r=q\e(B',\r
+numlist_desc : '\e$BHV9fIU$-2U>r=q\e(B',\r
+outdent_desc : '\e$B;z>e$2\e(B',\r
+indent_desc : '\e$B;z2<$2\e(B',\r
+undo_desc : '\e$B$d$j$J$*$7\e(B',\r
+redo_desc : '\e$B:F<B9T\e(B',\r
+link_desc : '\e$B%j%s%/$NA^F~\e(B/\e$BJT=8\e(B',\r
+unlink_desc : '\e$B%j%s%/$N:o=|\e(B',\r
+image_desc : '\e$B2hA|$NA^F~\e(B/\e$BJT=8\e(B',\r
+cleanup_desc : '\e$B%3!<%I@0M}\e(B',\r
+focus_alert : '\e$B$3$N%3%^%s%I$r;H$&A0$K%(%G%#%?>e$N$I$3$+$rA*Br$9$kI,MW$,$"$j$^$9!#\e(B',\r
+edit_confirm : 'WYSIWYG\e$B%b!<%I$G$3$N%F%-%9%H%(%j%"$rJT=8$7$^$9$+!)\e(B',\r
+insert_link_title : '\e$B%j%s%/$NA^F~\e(B/\e$BJT=8\e(B',\r
+insert : '\e$BA^F~\e(B',\r
+update : '\e$BA^F~\e(B',\r
+cancel : '\e$B<h$j>C$7\e(B',\r
+insert_link_url : '\e$B%j%s%/@h\e(BURL',\r
+insert_link_target : '\e$B%?!<%2%C%H\e(B',\r
+insert_link_target_same : '\e$BF1$8Ak$G%j%s%/$r3+$/\e(B',\r
+insert_link_target_blank : '\e$B?7$7$$Ak$G%j%s%/$r3+$/\e(B',\r
+insert_image_title : '\e$B2hA|$NA^F~\e(B/\e$BJT=8\e(B',\r
+insert_image_src : '\e$B2hA|$N\e(BURL',\r
+insert_image_alt : '\e$B2hA|$N@bL@\e(B',\r
+help_desc : '\e$B%X%k%W\e(B',\r
+bold_img : "bold.gif",\r
+italic_img : "italic.gif",\r
+underline_img : "underline.gif",\r
+clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?',\r
+popup_blocked : 'Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.'\r
+});\r
diff --git a/webcit/tiny_mce/langs/ko.js b/webcit/tiny_mce/langs/ko.js
new file mode 100644 (file)
index 0000000..3ac5b4d
--- /dev/null
@@ -0,0 +1,40 @@
+// KO lang variables by Setzer Gabbiani\r
+\r
+tinyMCE.addToLang('',{\r
+bold_desc : 'ÁøÇÏ°Ô',\r
+italic_desc : '±â¿ïÀÓ',\r
+underline_desc : '¹ØÁÙ',\r
+striketrough_desc : '°¡·ÎÁÙ',\r
+justifyleft_desc : '¿ÞÂÊ Á¤·&Auml;',\r
+justifycenter_desc : '°¡¿îµ¥ Á¤·&Auml;',\r
+justifyright_desc : '¿À¸¥ÂÊ Á¤·&Auml;',\r
+justifyfull_desc : '¾çÂÊ Á¤·&Auml;',\r
+bullist_desc : '¸ñÂ÷ ¸&Aring;±â±â',\r
+numlist_desc : '¹øÈ£ ¸&Aring;±â±â',\r
+outdent_desc : '³»¾î¾²±â',\r
+indent_desc : 'µé¿©¾²±â',\r
+undo_desc : '½ÇÇàÃë¼Ò',\r
+redo_desc : 'Àç½ÇÇà',\r
+link_desc : '¸µ&Aring;© ³&Ouml;±â/°í&Auml;¡±â',\r
+unlink_desc : '¸µ&Aring;© ÇØÁ¦',\r
+image_desc : '±×¸² ³&Ouml;±â/°í&Auml;¡±â',\r
+cleanup_desc : '&Auml;Úµ&aring;¸¦ ±ò²ûÇÏ°Ô',\r
+focus_alert : 'ÀÌ ¸í·ÉÀ» ½ÇÇàÇϱâ Àü¿¡ ¹Ýµ&aring;½Ã ¿¡µð&Aring;Í ³»ÀÇ ¾îµò°¡¿¡ &Auml;¿¼­°¡ À&Ouml;¾î¾ß ÇÕ´Ï´Ù.',\r
+edit_confirm : 'ÀÌ &Aring;ؽºÆ® ¹Ú½º¿¡¼­ HTML ¿¡µð&Aring;͸¦ »ç¿ëÇϱ栿øÇϽʴϱî?',\r
+insert_link_title : '¸µ&Aring;© ³&Ouml;±â/°í&Auml;¡±â',\r
+insert : '»ðÀÔ',\r
+update : '»ðÀÔ',\r
+cancel : 'Ãë¼Ò',\r
+insert_link_url : 'URL ¸µ&Aring;©',\r
+insert_link_target : '&Aring;¸°Ù',\r
+insert_link_target_same : '°°Àº Ã¢¿¡¼­ ¸µ&Aring;© ¿­±â',\r
+insert_link_target_blank : '»õ Ã¢¿¡¼­ ¸µ&Aring;© ¿­±â',\r
+insert_image_title : '±×¸² ³&Ouml;±â/°í&Auml;¡±â',\r
+insert_image_src : '±×¸² URL',\r
+insert_image_alt : '±×¸² ¼³¸í',\r
+help_desc : 'µµ¿ò¸»',\r
+bold_img : "bold.gif",\r
+italic_img : "italic.gif",\r
+underline_img : "underline.gif",\r
+popup_blocked : 'Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.'\r
+});\r
diff --git a/webcit/tiny_mce/langs/nb.js b/webcit/tiny_mce/langs/nb.js
new file mode 100644 (file)
index 0000000..2e6968d
--- /dev/null
@@ -0,0 +1,41 @@
+// nb = Norwegian (bokm&aring;l) lang variables by Knut B. Jacobsen\r
+\r
+tinyMCE.addToLang('',{\r
+bold_desc : 'Fet',\r
+italic_desc : 'Kursiv',\r
+underline_desc : 'Understreking',\r
+striketrough_desc : 'Gjennomstreking',\r
+justifyleft_desc : 'Venstrestill',\r
+justifycenter_desc : 'Sentrer',\r
+justifyright_desc : 'H&oslash;yrestill',\r
+justifyfull_desc : 'Blokkjustering',\r
+bullist_desc : 'Punktliste',\r
+numlist_desc : 'Nummerliste',\r
+outdent_desc : 'Reduser innrykk',\r
+indent_desc : '&Oslash;k innrykk',\r
+undo_desc : 'Angre',\r
+redo_desc : 'Gj&oslash;r om',\r
+link_desc : 'Opprett/endre lenke',\r
+unlink_desc : 'Fjern lenke',\r
+image_desc : 'Sett inn/endre bilde',\r
+cleanup_desc : 'Rens grisete kode',\r
+focus_alert : 'Editoren m&aring; v&aelig;re i fokus f&oslash;r du benytter denne kommando.',\r
+edit_confirm : 'Vil du benytte WYSIWYG editoren for dette tekstfelt?',\r
+insert_link_title : 'Opprett/endre lenke',\r
+insert : 'Sett inn',\r
+update : 'Oppdater',\r
+cancel : 'Avbryt',\r
+insert_link_url : 'Lenkens URL',\r
+insert_link_target : 'Vindu',\r
+insert_link_target_same : '&Aring;pne i samme vindu',\r
+insert_link_target_blank : '&Aring;pne i nytt vindu',\r
+insert_image_title : 'Opprett/endre bilde',\r
+insert_image_src : 'Bildets URL',\r
+insert_image_alt : 'Bildets beskrivelse',\r
+help_desc : 'Hjelp',\r
+bold_img : 'bold_de_se.gif',\r
+italic_img : 'italic_de_se.gif',\r
+underline_img : 'underline.gif',\r
+clipboard_msg : 'Klipp ut/Kopier/Lim inn fungerer ikke i Mozilla og Firefox. Vil du vite mer om dette?',\r
+popup_blocked : 'Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.'\r
+});\r
diff --git a/webcit/tiny_mce/langs/nl.js b/webcit/tiny_mce/langs/nl.js
new file mode 100644 (file)
index 0000000..7e29252
--- /dev/null
@@ -0,0 +1,42 @@
+// NL lang variables thanks to "Meint Post"\r
+// Updates by (2.0) Mark van der Sanden\r
+\r
+tinyMCE.addToLang('',{\r
+bold_desc : 'Vet (Ctrl+B)',\r
+italic_desc : 'Cursief (Ctrl+I)',\r
+underline_desc : 'Onderstrepen (Ctrl+U)',\r
+striketrough_desc : 'Doorhalen',\r
+justifyleft_desc : 'Links uitlijnen',\r
+justifycenter_desc : 'Centreren',\r
+justifyright_desc : 'Rechts uitlijnen',\r
+justifyfull_desc : 'Volledig uitlijnen',\r
+bullist_desc : 'Opsommingstekens',\r
+numlist_desc : 'Genummerde lijst',\r
+outdent_desc : 'Inspringen verkleinen',\r
+indent_desc : 'Inspringen vergroten',\r
+undo_desc : 'Ongedaan maken (Ctrl+Z)',\r
+redo_desc : 'Opnieuw (Ctrl+Y)',\r
+link_desc : 'Hyperlink invoegen/bewerken',\r
+unlink_desc : 'Hyperlink verwijderen',\r
+image_desc : 'Afbeelding invoegen',\r
+cleanup_desc : 'Code opschonen',\r
+focus_alert : 'Klik op de tekst in de editor voor het uitvoeren van dit commando.',\r
+edit_confirm : 'Wilt u de WYSIWYG modus voor deze textarea gebruiken?',\r
+insert_link_title : 'Hyperlink invoegen/bewerken',\r
+insert : 'OK',\r
+update : 'Toepassen',\r
+cancel : 'Annuleren',\r
+insert_link_url : 'URL link',\r
+insert_link_target : 'Bestemming',\r
+insert_link_target_same : 'Open link in hetzelfde venster',\r
+insert_link_target_blank : 'Open link in een nieuw venster',\r
+insert_image_title : 'Afbeelding invoegen/bewerken',\r
+insert_image_src : 'Afbeelding',\r
+insert_image_alt : 'Beschrijving',\r
+help_desc : 'Help',\r
+bold_img : "bold.gif",\r
+italic_img : "italic.gif",\r
+underline_img : "underline.gif",\r
+clipboard_msg : 'Kopiëren/knippen/plakken is niet beschikbaar in Mozilla en Firefox.\nWilt u meer informatie over deze kwestie?',\r
+popup_blocked : 'Uw browser heeft zojuist geweigerd een popup-venster te tonen. Waarschijnlijk gebruikt u een poup-blocker die voor deze editor te streng omgaat met popups. Om het venster toch te tonen, zult u uw popup-blocker zo in moeten stellen dat het popups van deze website toestaat.'\r
+});\r
diff --git a/webcit/tiny_mce/langs/nn.js b/webcit/tiny_mce/langs/nn.js
new file mode 100644 (file)
index 0000000..72a2d68
--- /dev/null
@@ -0,0 +1,41 @@
+// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen\r
+\r
+tinyMCE.addToLang('',{\r
+bold_desc : 'Feit',\r
+italic_desc : 'Kursiv',\r
+underline_desc : 'Understreking',\r
+striketrough_desc : 'Gjennomstreking',\r
+justifyleft_desc : 'Venstrestill',\r
+justifycenter_desc : 'Sentrer',\r
+justifyright_desc : 'H&oslash;grestill',\r
+justifyfull_desc : 'Blokkjustering',\r
+bullist_desc : 'Punktliste',\r
+numlist_desc : 'Nummerliste',\r
+outdent_desc : 'Reduser innrykk',\r
+indent_desc : 'Auk innrykk',\r
+undo_desc : 'Angre',\r
+redo_desc : 'Gjer om',\r
+link_desc : 'Opprett/endre lenke',\r
+unlink_desc : 'Fjern lenke',\r
+image_desc : 'Sett inn/endre bilde',\r
+cleanup_desc : 'Rens grisete kode',\r
+focus_alert : 'Editoren m&aring; v&aelig;re i fokus f&oslash;r du benytter denne kommando.',\r
+edit_confirm : 'Vil du benytte WYSIWYG editoren for dette tekstfelt?',\r
+insert_link_title : 'Opprett/endre lenke',\r
+insert : 'Sett inn',\r
+update : 'Oppdater',\r
+cancel : 'Avbryt',\r
+insert_link_url : 'Lenkens URL',\r
+insert_link_target : 'Vindu',\r
+insert_link_target_same : '&Aring;pne i samme vindauge',\r
+insert_link_target_blank : '&Aring;pne i nytt vindauge',\r
+insert_image_title : 'Opprett/endre bilde',\r
+insert_image_src : 'Bildets URL',\r
+insert_image_alt : 'Bildets beskrivelse',\r
+help_desc : 'Hjelp',\r
+bold_img : 'bold_de_se.gif',\r
+italic_img : 'italic_de_se.gif',\r
+underline_img : 'underline.gif',\r
+clipboard_msg : 'Klipp ut/Kopier/Lim inn fungerer ikkje i Mozilla og Firefox. Vil du vite meir om dette?',\r
+popup_blocked : 'Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.'\r
+});\r
diff --git a/webcit/tiny_mce/langs/pl.js b/webcit/tiny_mce/langs/pl.js
new file mode 100644 (file)
index 0000000..3fc44c2
--- /dev/null
@@ -0,0 +1,44 @@
+// PL lang variables\r
+// fixed by Wooya\r
+// http://www.mfusion.prv.pl\r
+// fixed by lemiel 26.10.2005\r
+\r
+tinyMCE.addToLang('',{\r
+bold_desc : 'Pogrubienie (Ctrl+B)',\r
+italic_desc : 'Pochylenie (Ctrl+I)',\r
+underline_desc : 'Podkre¶lenie (Ctrl+U)',\r
+striketrough_desc : 'Przekre¶lenie',\r
+justifyleft_desc : 'Wyrównaj do lewej',\r
+justifycenter_desc : 'Wyrównaj do ¶rodka',\r
+justifyright_desc : 'Wyrównaj do prawej',\r
+justifyfull_desc : 'Wyrównaj na ca³o¶ci',\r
+bullist_desc : 'Lista nienumerowana',\r
+numlist_desc : 'Lista numerowana',\r
+outdent_desc : 'Zmniejsz wciêcie',\r
+indent_desc : 'Zwiêksz wciêcie',\r
+undo_desc : 'Cofnij (Ctrl+Z)',\r
+redo_desc : 'Ponów (Ctrl+Y)',\r
+link_desc : 'Wstaw/edytuj link',\r
+unlink_desc : 'Usuñ link',\r
+image_desc : 'Wstaw/edytuj obrazek',\r
+cleanup_desc : 'Usuñ zbêdny kod',\r
+focus_alert : 'Instancja edytora musi byæ aktywna przed u¿yciem tego polecenia.',\r
+edit_confirm : 'Czy chcesz u¿yæ edytora WYSIWYG dla tego pola tekstowego?',\r
+insert_link_title : 'Wstaw/edytuj link',\r
+insert : 'Wstaw',\r
+update : 'Aktualizuj',\r
+cancel : 'Anuluj',\r
+insert_link_url : 'URL linku',\r
+insert_link_target : 'Cel',\r
+insert_link_target_same : 'Otwórz link w tym samym oknie',\r
+insert_link_target_blank : 'Otwórz link w nowym oknie',\r
+insert_image_title : 'Wstaw/edytuj obrazek',\r
+insert_image_src : 'URL obrazka',\r
+insert_image_alt : 'Opis obrazka',\r
+help_desc : 'Pomoc',\r
+bold_img : "bold.gif",\r
+italic_img : "italic.gif",\r
+underline_img : "underline.gif",\r
+clipboard_msg : 'Kopiuj/Wytnij/Wklej nie jest dostêpne dla przegl±darek Mozilla i Firefox.\nCzy chcesz uzyskaæ o tym wiêcej informacji?',\r
+popup_blocked : 'Niestety, ale odnotowano, ¿e Twoja przegl±darka ma w³±czon± blokadê okienek popup. Musisz wy³±czyæ opcjê blokowania okienek dla tej strony, aby TinyMCE móg³ pracowaæ z pe³n± funkcjonalno¶ci±.'\r
+});\r
diff --git a/webcit/tiny_mce/langs/pt.js b/webcit/tiny_mce/langs/pt.js
new file mode 100644 (file)
index 0000000..72dd319
--- /dev/null
@@ -0,0 +1,42 @@
+// PT lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+bold_desc : 'Negrito',\r
+italic_desc : 'Itálico',\r
+underline_desc : 'Sublinhar',\r
+striketrough_desc : 'Riscado',\r
+justifyleft_desc : 'Alinhar á esquerda',\r
+justifycenter_desc : 'Alinhar ao centro',\r
+justifyright_desc : 'Alinhar á direita',\r
+justifyfull_desc : 'Justificado',\r
+bullist_desc : 'Lista não ordenada',\r
+numlist_desc : 'Lista ordenada',\r
+outdent_desc : 'Retirar indentação',\r
+indent_desc : 'Indentar',\r
+undo_desc : 'Desfazer',\r
+redo_desc : 'Refazer',\r
+link_desc : 'Inserir Hiperligação',\r
+unlink_desc : 'Remover hiperligação',\r
+image_desc : 'Inserir Referência a imagem externa',\r
+object_desc : 'Inserir Objecto Multimédia da Galeria',\r
+cleanup_desc : 'Limpeza de código',\r
+focus_alert : 'Uma instância do editor deverá estar seleccionada antes de utilizar este comando.',\r
+edit_confirm : 'Deseja utilizar o modo visual de edição para ezta área de texto?',\r
+insert_link_title : 'Inserir/editar hiperligação',\r
+insert : 'Inserir',\r
+update : 'Actualizar',\r
+cancel : 'Cancelar',\r
+insert_link_url : 'URL de hiperligação',\r
+insert_link_target : 'Destino',\r
+insert_link_target_same : 'Abrir endereço na mesma janela',\r
+insert_link_target_blank : 'Abrir endereço numa nova janela',\r
+insert_image_title : 'Inserir/editar imagem',\r
+insert_image_src : 'Endereço da imagem',\r
+insert_image_alt : 'Descrição alt.',\r
+help_desc : 'Ajuda',\r
+bold_img : "bold.gif",\r
+italic_img : "italic.gif",\r
+underline_img : "underline.gif",\r
+clipboard_msg : 'Copiar/Cortar/Colar não está disponível em Mozilla and Firefox.\nPretende obter mais informação acerca desta questão?',\r
+popup_blocked : 'Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.'\r
+});\r
diff --git a/webcit/tiny_mce/langs/pt_br.js b/webcit/tiny_mce/langs/pt_br.js
new file mode 100644 (file)
index 0000000..e4f851a
--- /dev/null
@@ -0,0 +1,50 @@
+/**\r
+ * pt_br lang variables\r
+ * Brazilian Portuguese\r
+ *\r
+ * Authors : ????\r
+ * Revision and modifications:\r
+ *           Marcio Barbosa (mpg) <mpg@mpg.com.br>\r
+ * Last Updated : November 26, 2005\r
+ * TinyMCE Version : 2.0RC4\r
+ */\r
+tinyMCE.addToLang('',{\r
+bold_desc : 'Negrito (Ctrl+B)',\r
+italic_desc : 'Itálico (Ctrl+I)',\r
+underline_desc : 'Sublinhar (Ctrl+U)',\r
+striketrough_desc : 'Riscado',\r
+justifyleft_desc : 'Alinhar à esquerda',\r
+justifycenter_desc : 'Centralizado',\r
+justifyright_desc : 'Alinhar à direita',\r
+justifyfull_desc : 'Justificado',\r
+bullist_desc : 'Lista não ordenada',\r
+numlist_desc : 'Lista ordenada',\r
+outdent_desc : 'Retirar indentação',\r
+indent_desc : 'Indentar',\r
+undo_desc : 'Desfazer (Ctrl+Z)',\r
+redo_desc : 'Refazer (Ctrl+Y)',\r
+link_desc : 'Inserir link',\r
+unlink_desc : 'Remover link',\r
+image_desc : 'Inserir Referência a imagem externa',\r
+object_desc : 'Inserir Objeto Multimídia da Galeria',\r
+cleanup_desc : 'Limpeza de código',\r
+focus_alert : 'Uma instância do editor deverá estar selecionada antes de utilizar este comando.',\r
+edit_confirm : 'Deseja utilizar o Modo Visual (WYSIWYG) de edição para esta área de texto?',\r
+insert_link_title : 'Inserir/editar link',\r
+insert : 'Inserir',\r
+update : 'Atualizar',\r
+cancel : 'Cancelar',\r
+insert_link_url : 'URL do link',\r
+insert_link_target : 'Destino',\r
+insert_link_target_same : 'Abrir link na mesma janela',\r
+insert_link_target_blank : 'Abrir link em uma nova janela',\r
+insert_image_title : 'Inserir/editar imagem',\r
+insert_image_src : 'Endereço (URL) da imagem',\r
+insert_image_alt : 'Descrição da imagem',\r
+help_desc : 'Ajuda',\r
+bold_img : "bold.gif",\r
+italic_img : "italic.gif",\r
+underline_img : "underline.gif",\r
+clipboard_msg : 'Copiar/Cortar/Colar não está disponível no Mozilla e Firefox.\nPretende obter mais informação sobre esta questão?',\r
+popup_blocked : 'Desculpe, mas sabemos que seu bloqueador de popup desativou uma que permite a funcionabilidade desta aplicação. Você precisa desativar seu bloqueador de popup neste site para que possa ser utilizado todos os recursos desta ferramenta.'\r
+});\r
diff --git a/webcit/tiny_mce/langs/readme.txt b/webcit/tiny_mce/langs/readme.txt
new file mode 100644 (file)
index 0000000..e23001b
--- /dev/null
@@ -0,0 +1,2 @@
+The language pack codes are based on ISO-639-2\r
+http://www.loc.gov/standards/iso639-2/englangn.html\r
diff --git a/webcit/tiny_mce/langs/ru.js b/webcit/tiny_mce/langs/ru.js
new file mode 100644 (file)
index 0000000..6ef3f1a
--- /dev/null
@@ -0,0 +1,43 @@
+// Russian windows-1251 translation by Vladimir Vitkovsky\r
+// admin@transport.su\r
+// www.webgui.uanet.biz\r
+\r
+tinyMCE.addToLang('',{\r
+bold_desc : 'Ïîëóæèðíûé',\r
+italic_desc : 'Êóðñèâ',\r
+underline_desc : 'Ïîä÷åðêíóòûé',\r
+striketrough_desc : 'Ïåðå÷åðêíóòûé',\r
+justifyleft_desc : 'Âûðàâíèâàíèå âëåâî',\r
+justifycenter_desc : 'Âûðàâíèâàíèå ïî öåíòðó',\r
+justifyright_desc : 'Âûðàâíèâàíèå âïðàâî',\r
+justifyfull_desc : 'Ðàâíîìåðíîå çàïîëíåíèå',\r
+bullist_desc : 'Ìàðêèðîâàííûé ñïèñîê',\r
+numlist_desc : 'Íóìåðîâàííûé ñïèñîê',\r
+outdent_desc : 'Óìåíüøèòü îòñòóï',\r
+indent_desc : 'Óâåëè÷èòü îòñïóò',\r
+undo_desc : 'Îòìåíèòü',\r
+redo_desc : 'Âåðíóòü',\r
+link_desc : 'Âñòàâèòü/èçìåíèòü ññûëêó',\r
+unlink_desc : 'Óáðàòü ññûëêó',\r
+image_desc : 'Âñòàâèòü/èçìåíèòü èçîáðàæåíèå',\r
+cleanup_desc : 'Ïîä÷èñòèòü èçáûòî÷íûé êîä',\r
+focus_alert : 'Äëÿ èñïîëüçîâàíèÿ äàííîé êîìàíäû Âû äîëæíû íàõîäèòñÿ â ïîëå ðåäàêòîðà.',\r
+edit_confirm : 'Õîòèòå ëè Âû ðåäàêòèðîâàòü â âèçóàëüíîì (WYSIWYG) ðåæèìå?',\r
+insert_link_title : 'Âñòàâèòü/èçìåíèòü ññûëêó',\r
+insert : 'Âñòàâèòü',\r
+update : 'Ïðèìåíèòü',\r
+cancel : 'Îòìåíèòü',\r
+insert_link_url : 'Àäðåñ ññûëêè',\r
+insert_link_target : 'Îòêðûòü â...:',\r
+insert_link_target_same : 'òîì æå îêíå',\r
+insert_link_target_blank : 'íîâîì îêíå',\r
+insert_image_title : 'Âñòàâèòü/èçìåíèòü èçîáðàæåíèå',\r
+insert_image_src : 'Àäðåñ êàðòèíêè',\r
+insert_image_alt : 'Îïèñàíèå êàðòèíêè',\r
+help_desc : 'Ïîìîùü',\r
+bold_img : "bold_ru.gif",\r
+italic_img : "italic_ru.gif",\r
+underline_img : "underline_ru.gif",\r
+clipboard_msg : 'Êîïèðîâàòü/Âûðåçàòü/Âñòàâèòü íåäîñòóïíû äëÿ Mozilla è Firefox.\nÕîòèòå óçíàòü îá ýòîì ïîäðîáíåå?',\r
+popup_blocked : 'Èçâèíèòå, íî â Âàøåì áðàóçåðå çàáëîêèðîâàíû âñïëûâàþùèå îêíà. Äëÿ òîãî, ÷òîáû èìåòü âîçìîæíîñòü âîñïîëüçîâàòüñÿ âñåìè âîçìîæíîñòÿìè ðåäàêòîðà, íåîáõîäèìî îòêëþ÷èòü áëîêèðîâêó âñïëûâàþùèõ îêîí äëÿ ýòîãî ñàéòà.'\r
+});\r
diff --git a/webcit/tiny_mce/langs/ru_KOI8-R.js b/webcit/tiny_mce/langs/ru_KOI8-R.js
new file mode 100644 (file)
index 0000000..7416864
--- /dev/null
@@ -0,0 +1,43 @@
+// Russian KOI8-R translation by Vladimir Vitkovsky\r
+// admin@transport.su\r
+// www.webgui.uanet.biz\r
+\r
+tinyMCE.addToLang('',{\r
+bold_desc : 'ðÏÌÕÖÉÒÎÙÊ',\r
+italic_desc : 'ëÕÒÓÉ×',\r
+underline_desc : 'ðÏÄÞÅÒËÎÕÔÙÊ',\r
+striketrough_desc : 'ðÅÒÅÞÅÒËÎÕÔÙÊ',\r
+justifyleft_desc : '÷ÙÒÁ×ÎÉ×ÁÎÉÅ ×ÌÅ×Ï',\r
+justifycenter_desc : '÷ÙÒÁ×ÎÉ×ÁÎÉÅ ÐÏ ÃÅÎÔÒÕ',\r
+justifyright_desc : '÷ÙÒÁ×ÎÉ×ÁÎÉÅ ×ÐÒÁ×Ï',\r
+justifyfull_desc : 'òÁ×ÎÏÍÅÒÎÏÅ ÚÁÐÏÌÎÅÎÉÅ',\r
+bullist_desc : 'íÁÒËÉÒÏ×ÁÎÎÙÊ ÓÐÉÓÏË',\r
+numlist_desc : 'îÕÍÅÒÏ×ÁÎÎÙÊ ÓÐÉÓÏË',\r
+outdent_desc : 'õÍÅÎØÛÉÔØ ÏÔÓÔÕÐ',\r
+indent_desc : 'õ×ÅÌÉÞÉÔØ ÏÔÓÐÕÔ',\r
+undo_desc : 'ïÔÍÅÎÉÔØ',\r
+redo_desc : '÷ÅÒÎÕÔØ',\r
+link_desc : '÷ÓÔÁ×ÉÔØ/ÉÚÍÅÎÉÔØ ÓÓÙÌËÕ',\r
+unlink_desc : 'õÂÒÁÔØ ÓÓÙÌËÕ',\r
+image_desc : '÷ÓÔÁ×ÉÔØ/ÉÚÍÅÎÉÔØ ÉÚÏÂÒÁÖÅÎÉÅ',\r
+cleanup_desc : 'ðÏÄÞÉÓÔÉÔØ ÉÚÂÙÔÏÞÎÙÊ ËÏÄ',\r
+focus_alert : 'äÌÑ ÉÓÐÏÌØÚÏ×ÁÎÉÑ ÄÁÎÎÏÊ ËÏÍÁÎÄÙ ÷Ù ÄÏÌÖÎÙ ÎÁÈÏÄÉÔÓÑ × ÐÏÌÅ ÒÅÄÁËÔÏÒÁ.',\r
+edit_confirm : 'èÏÔÉÔÅ ÌÉ ÷Ù ÒÅÄÁËÔÉÒÏ×ÁÔØ × ×ÉÚÕÁÌØÎÏÍ (WYSIWYG) ÒÅÖÉÍÅ?',\r
+insert_link_title : '÷ÓÔÁ×ÉÔØ/ÉÚÍÅÎÉÔØ ÓÓÙÌËÕ',\r
+insert : '÷ÓÔÁ×ÉÔØ',\r
+update : 'ðÒÉÍÅÎÉÔØ',\r
+cancel : 'ïÔÍÅÎÉÔØ',\r
+insert_link_url : 'áÄÒÅÓ ÓÓÙÌËÉ',\r
+insert_link_target : 'ïÔËÒÙÔØ ×...:',\r
+insert_link_target_same : 'ÔÏÍ ÖÅ ÏËÎÅ',\r
+insert_link_target_blank : 'ÎÏ×ÏÍ ÏËÎÅ',\r
+insert_image_title : '÷ÓÔÁ×ÉÔØ/ÉÚÍÅÎÉÔØ ÉÚÏÂÒÁÖÅÎÉÅ',\r
+insert_image_src : 'áÄÒÅÓ ËÁÒÔÉÎËÉ',\r
+insert_image_alt : 'ïÐÉÓÁÎÉÅ ËÁÒÔÉÎËÉ',\r
+help_desc : 'ðÏÍÏÝØ',\r
+bold_img : "bold_ru.gif",\r
+italic_img : "italic_ru.gif",\r
+underline_img : "underline_ru.gif",\r
+clipboard_msg : 'ëÏÐÉÒÏ×ÁÔØ/÷ÙÒÅÚÁÔØ/÷ÓÔÁ×ÉÔØ ÎÅÄÏÓÔÕÐÎÙ ÄÌÑ Mozilla É Firefox.\nèÏÔÉÔÅ ÕÚÎÁÔØ Ï ÜÔÏÍ ÐÏÄÒÏÂÎÅÅ?',\r
+popup_blocked : 'éÚ×ÉÎÉÔÅ, ÎÏ × ÷ÁÛÅÍ ÂÒÁÕÚÅÒÅ ÚÁÂÌÏËÉÒÏ×ÁÎÙ ×ÓÐÌÙ×ÁÀÝÉÅ ÏËÎÁ. äÌÑ ÔÏÇÏ, ÞÔÏÂÙ ÉÍÅÔØ ×ÏÚÍÏÖÎÏÓÔØ ×ÏÓÐÏÌØÚÏ×ÁÔØÓÑ ×ÓÅÍÉ ×ÏÚÍÏÖÎÏÓÔÑÍÉ ÒÅÄÁËÔÏÒÁ, ÎÅÏÂÈÏÄÉÍÏ ÏÔËÌÀÞÉÔØ ÂÌÏËÉÒÏ×ËÕ ×ÓÐÌÙ×ÁÀÝÉÈ ÏËÏΠÄÌÑ ÜÔÏÇÏ ÓÁÊÔÁ.'\r
+});\r
diff --git a/webcit/tiny_mce/langs/ru_UTF-8.js b/webcit/tiny_mce/langs/ru_UTF-8.js
new file mode 100644 (file)
index 0000000..18c3d94
--- /dev/null
@@ -0,0 +1,43 @@
+// Russian UTF-8 translation by Vladimir Vitkovsky\r
+// admin@transport.su\r
+// www.webgui.uanet.biz\r
+\r
+tinyMCE.addToLang('',{\r
+bold_desc : 'Полужирный',\r
+italic_desc : 'Курсив',\r
+underline_desc : 'Подчеркнутый',\r
+striketrough_desc : 'Перечеркнутый',\r
+justifyleft_desc : 'Выравнивание влево',\r
+justifycenter_desc : 'Выравнивание по центру',\r
+justifyright_desc : 'Выравнивание вправо',\r
+justifyfull_desc : 'Равномерное заполнение',\r
+bullist_desc : 'Маркированный список',\r
+numlist_desc : 'Нумерованный список',\r
+outdent_desc : 'Уменьшить отступ',\r
+indent_desc : 'Увеличить отспут',\r
+undo_desc : 'Отменить',\r
+redo_desc : 'Вернуть',\r
+link_desc : 'Вставить/изменить ссылку',\r
+unlink_desc : 'Убрать ссылку',\r
+image_desc : 'Вставить/изменить изображение',\r
+cleanup_desc : 'Подчистить избыточный код',\r
+focus_alert : 'Для использования данной команды Вы должны находится в поле редактора.',\r
+edit_confirm : 'Хотите ли Вы редактировать в визуальном (WYSIWYG) режиме?',\r
+insert_link_title : 'Вставить/изменить ссылку',\r
+insert : 'Вставить',\r
+update : 'Применить',\r
+cancel : 'Отменить',\r
+insert_link_url : 'Адрес ссылки',\r
+insert_link_target : 'Открыть в...:',\r
+insert_link_target_same : 'том же окне',\r
+insert_link_target_blank : 'новом окне',\r
+insert_image_title : 'Вставить/изменить изображение',\r
+insert_image_src : 'Адрес картинки',\r
+insert_image_alt : 'Описание картинки',\r
+help_desc : 'Помощь',\r
+bold_img : "bold_ru.gif",\r
+italic_img : "italic_ru.gif",\r
+underline_img : "underline_ru.gif",\r
+clipboard_msg : 'Копировать/Вырезать/Вставить недоступны для Mozilla и Firefox.\nХотите узнать об этом подробнее?',\r
+popup_blocked : 'Извините, но в Вашем браузере заблокированы всплывающие окна. Для того, чтобы иметь возможность воспользоваться всеми возможностями редактора, необходимо отключить блокировку всплывающих окон для этого сайта.'\r
+});\r
diff --git a/webcit/tiny_mce/langs/sk.js b/webcit/tiny_mce/langs/sk.js
new file mode 100644 (file)
index 0000000..cd0c61b
--- /dev/null
@@ -0,0 +1,50 @@
+/**\r
+ * Slovak lang variables \r
+ * encoding: utf-8\r
+ * \r
+ * @author Vladimir VASIL vvasil@post.sk\r
+ *    \r
+ * $Id: sk.js,v 1.1 2005/11/22 20:56:43 spocke Exp $ \r
+ */  \r
+\r
+\r
+tinyMCE.addToLang('',{\r
+bold_desc : 'Tučné',\r
+italic_desc : 'Kurzivá',\r
+underline_desc : 'Podčiarknutie',\r
+striketrough_desc : 'Preškrtnutie',\r
+justifyleft_desc : 'Zarovnanie vľavo',\r
+justifycenter_desc : 'Zarovnanie na stred',\r
+justifyright_desc : 'Zarovnanie vpravo',\r
+justifyfull_desc : 'Zarovnanie do bloku',\r
+bullist_desc : 'Zoznam s odrážkami',\r
+numlist_desc : 'Číslovaný zoznam',\r
+outdent_desc : 'Snížiť odsadenie',\r
+indent_desc : 'Zvýšiť odsadenie',\r
+undo_desc : 'Zpäť',\r
+redo_desc : 'Znovu',\r
+link_desc : 'Vložiť odkaz',\r
+unlink_desc : 'Zrušiť odkaz',\r
+image_desc : 'Vložiť obrázok',\r
+cleanup_desc : 'Vyčistiť kód',\r
+focus_alert : 'Pred použitím tohoto príkazu musí byť kurzor v okne editora.',\r
+edit_confirm : 'Chcete použiť WYSIWYG editáciu pre tento text?',\r
+insert_link_title : 'Vložiť/upraviť odkaz',\r
+insert : 'Vložiť',\r
+update : 'Zmeniť',\r
+cancel : 'Zrušiť',\r
+insert_link_url : 'URL odkazu',\r
+insert_link_target : 'Cieľ',\r
+insert_link_target_same : 'Otvoriť odkaz v rovnakom okne',\r
+insert_link_target_blank : 'Otvoriť odkaz v novom okne',\r
+insert_image_title : 'Vložiť/upraviť obrázok',\r
+insert_image_src : 'URL obrázku',\r
+insert_image_alt : 'Popis obrázku',\r
+help_desc : 'Nápoveda',\r
+bold_img : 'bold.gif',\r
+italic_img : 'italic.gif',\r
+underline_img : "underline.gif",\r
+clipboard_msg : 'Funkcia Kopírovať/vysrihnúť/vložiť niesú použiteľné v Mozille a Firefoxe.\nChcete viac informácií o tomto probléme?',\r
+popup_blocked : 'Ospravedlňujeme sa, ale blokovač vyskakovacích okien neumožnil otvoriť okno, ktoré zprostredkovává funkčnosť aplikáce. Musíte vypnuť blokovanie vyskakovacích okien na tomto webe, abyste využili jeho plnú funkčnosť.'\r
+});\r
+\r
diff --git a/webcit/tiny_mce/langs/sv.js b/webcit/tiny_mce/langs/sv.js
new file mode 100644 (file)
index 0000000..f07ffa8
--- /dev/null
@@ -0,0 +1,43 @@
+// SE lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+bold_desc : 'Fet',\r
+italic_desc : 'Kursiv',\r
+underline_desc : 'Understruken',\r
+striketrough_desc : 'Genomstruken',\r
+justifyleft_desc : 'V&auml;nsterjustera',\r
+justifycenter_desc : 'Centrera',\r
+justifyright_desc : 'H&ouml;gerjustera',\r
+justifyfull_desc : 'Kantjustera',\r
+bullist_desc : 'Punktlista',\r
+numlist_desc : 'Nummerlista',\r
+outdent_desc : 'Utdrag',\r
+indent_desc : 'Indrag',\r
+undo_desc : '&Aring;ngra',\r
+redo_desc : 'G&ouml;r om',\r
+link_desc : 'Skapa l&auml;nk',\r
+unlink_desc : 'Ta bort l&auml;nk',\r
+image_desc : 'Skapa/redigera bild',\r
+cleanup_desc : 'Rensa skr&auml;pkod',\r
+focus_alert : 'Flytta mark&ouml;ren till en textyta innan du anv&auml;nder detta kommando.',\r
+edit_confirm : 'Vill du anv&auml;nda WYSIWYG-editorn f&ouml;r detta textf&auml;lt?',\r
+insert_link_title : 'Skapa/redigera l&auml;nk',\r
+insert : 'Skapa',\r
+update : 'Uppdatera',\r
+cancel : 'Avbryt',\r
+insert_link_url : 'L&auml;nkens URL',\r
+insert_link_target : 'F&ouml;nster',\r
+insert_link_target_same : '&Ouml;ppna l&auml;nken i samma f&ouml;nster',\r
+insert_link_target_blank : '&Ouml;ppna l&auml;nken i ett nytt f&ouml;nster',\r
+insert_link_delta_width : 20,\r
+insert_link_delta_height : 10,\r
+insert_image_title : 'Skapa/redigera bild',\r
+insert_image_src : 'Bildens URL',\r
+insert_image_alt : 'Bildens beskrivning',\r
+bold_img : 'bold_de_se.gif',\r
+italic_img : 'italic_de_se.gif',\r
+underline_img : "underline.gif",\r
+clipboard_msg : 'Klipput/Kopiera/Klistra fungerar inte Mozilla och Firefox. Vill du veta mer om detta?',\r
+help_desc : "Hj&auml;lp",\r
+popup_blocked : 'Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.'\r
+});\r
diff --git a/webcit/tiny_mce/langs/th.js b/webcit/tiny_mce/langs/th.js
new file mode 100644 (file)
index 0000000..7e1d150
--- /dev/null
@@ -0,0 +1,40 @@
+// TH lang variables Thai contributed by Innozent\r
+\r
+tinyMCE.addToLang('',{\r
+bold_desc : 'µÑÇ˹Ò',\r
+italic_desc : 'µÑÇéàÍÕ§',\r
+underline_desc : '¢Õ´àÊé¹ãµé',\r
+striketrough_desc : '¢Õ´¤&Aring;èÍÁ',\r
+justifyleft_desc : 'ªÔ´¢Íº«éÒÂ',\r
+justifycenter_desc : '¡&Ouml;觡&Aring;Ò§',\r
+justifyright_desc : 'ªÔ´¢Íº¢ÇÒ',\r
+justifyfull_desc : '¨Ñ´ªÔ´¢Íº',\r
+bullist_desc : 'ÊÑ­&Aring;ѡɳìáÊ´§ËÑÇ¢éÍÂèÍÂ',\r
+numlist_desc : '&Aring;ӴѺà&Aring;¢',\r
+outdent_desc : '&Aring;´¡ÒÃàÂ×éͧ',\r
+indent_desc : 'à¾ÔèÁ¡ÒÃàÂ×éͧ',\r
+undo_desc : 'à&Aring;Ô¡·Ó',\r
+redo_desc : '·ÓãËÁè',\r
+link_desc : 'à¾ÔèÁ&Aring;Ô§¤ì',\r
+unlink_desc : '&Aring;º&Aring;Ô§¤ì',\r
+image_desc : 'ãÊèÃÙ»',\r
+cleanup_desc : '·Ó¤ÇÒÁÊÐÍÒ´¢éͤÇÒÁ',\r
+focus_alert : 'µéͧà&Aring;×Í¡¡&Aring;èͧ¢éͤÇÒÁ¡è͹·Õè¨Ðãªé¤ÓÊÑ觹Õé',\r
+edit_confirm : '¤Ø³µéͧ¡Ò÷Õè¨Ðãªé WYSIWYG mode ÊÓËÃѺ¡&Aring;èͧ¢éͤÇÒÁ¹ÕéËÃ×Í&auml;Áè?',\r
+insert_link_title : 'à¾ÔèÁ/á¡é&auml;¢ &Aring;Ô§¤ì',\r
+insert : 'à¾ÔèÁ',\r
+cancel : '¡à&Aring;Ô¡',\r
+insert_link_url : 'Link URL',\r
+insert_link_target : 'à»Ô´&Aring;Ô§¤ìã¹',\r
+insert_link_target_same : '˹éÒµèÒ§à´ÕÂǡѹ',\r
+insert_link_target_blank : '˹éÒµèÒ§ãËÁè',\r
+insert_image_title : 'à¾ÔèÁ/á¡é&auml;¢ ÃÙ»',\r
+insert_image_src : 'URL ¢Í§ÃÙ»',\r
+insert_image_alt : '¤Ó͸ԺÒÂÃÙ»',\r
+help_desc : 'ªèÇÂàË&Aring;×Í',\r
+bold_img : "bold.gif",\r
+italic_img : "italic.gif",\r
+underline_img : "underline.gif",\r
+clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?',\r
+popup_blocked : 'Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.'\r
+});\r
diff --git a/webcit/tiny_mce/langs/zh_cn.js b/webcit/tiny_mce/langs/zh_cn.js
new file mode 100644 (file)
index 0000000..46cd403
--- /dev/null
@@ -0,0 +1,41 @@
+// Simplified Chinese lang variables contributed by tom_cat (thomaswangyang@gmail.com)\r
+\r
+tinyMCE.addToLang('',{\r
+bold_desc : 'ºÚÌå (Ctrl+B)',\r
+italic_desc : 'бÌå (Ctrl+I)',\r
+underline_desc : 'Ï»®Ïß (Ctrl+U)',\r
+striketrough_desc : 'ɾ³ýÏß',\r
+justifyleft_desc : '×ó¶ÔÆë',\r
+justifycenter_desc : '¾ÓÖжÔÆë',\r
+justifyright_desc : 'ÓÒ¶ÔÆë',\r
+justifyfull_desc : 'Á½¶Ë¶ÔÆë',\r
+bullist_desc : 'ÎÞÐòÁбí',\r
+numlist_desc : 'ÓÐÐòÁбí',\r
+outdent_desc : '¼õÉÙËõ½ø',\r
+indent_desc : 'Ôö¼ÓËõ½ø',\r
+undo_desc : '³·Ïû (Ctrl+Z)',\r
+redo_desc : 'ÖØ×ö (Ctrl+Y)',\r
+link_desc : '²åÈë/±à¼­ Á´½Ó',\r
+unlink_desc : 'ɾ³ýÁ´½Ó',\r
+image_desc : '²åÈë/±à¼­ Í¼Ïñ',\r
+cleanup_desc : 'ɾ³ýÈßÓà´úÂë',\r
+focus_alert : 'ÇëÏÈÑ¡Ôñ±à¼­Çø',\r
+edit_confirm : 'ÄúÏëÔڱ༭ÇøÓòÉÏʹÓÃËù¼û¼´ËùµÃ±à¼­Æ÷ô£¿',\r
+insert_link_title : '²åÈë/±à¼­ Á´½Ó',\r
+insert : '²åÈë',\r
+update : '¸üÐÂ',\r
+cancel : 'È¡Ïû',\r
+insert_link_url : 'Á´½ÓµØÖ·',\r
+insert_link_target : 'Á´½ÓÄ¿±ê',\r
+insert_link_target_same : 'ÔÚͬһ´°¿ÚÖдò¿ªÁ´½Ó',\r
+insert_link_target_blank : 'ÔÚд°¿ÚÖдò¿ªÁ´½Ó',\r
+insert_image_title : '²åÈë/±à¼­ Í¼Ïñ',\r
+insert_image_src : 'ͼÏñµØÖ·',\r
+insert_image_alt : 'ͼÏñÃèÊö',\r
+help_desc : '°ïÖú',\r
+bold_img : "bold.gif",\r
+italic_img : "italic.gif",\r
+underline_img : "underline.gif",\r
+clipboard_msg : '¼ôÇÐ/¸´ÖÆ/Õ³Ìù¹¦ÄÜÔÚ Mozilla ºÍ Firefox ä¯ÀÀÆ÷Öв»Ö§³Ö¡£ÄúÏ£Íû»ñµÃ¸ü¶àµÄÐÅÏ¢Âð£¿',\r
+popup_blocked : '¶Ô²»Æð, ÄúµÄä¯ÀÀÆ÷½ûÖ¹Á˵¯³öʽ´°¿Ú¡£ÎªÁËÈÃÄúʹÓõ½×îÍêÉƵŦÄÜ£¬Çë¶Ô±¾ÍøÕ¾µÄµ¯³öʽ´°¿Ú½â³ý½ûÖ¹¡£'\r
+});\r
diff --git a/webcit/tiny_mce/langs/zh_tw.js b/webcit/tiny_mce/langs/zh_tw.js
new file mode 100644 (file)
index 0000000..9d4e6d0
--- /dev/null
@@ -0,0 +1,42 @@
+// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// ÁcÅ餤¤å BIG-5 ¡F¼Æ¦ìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com\r
+\r
+tinyMCE.addToLang('',{\r
+bold_desc : '²ÊÅé¡]Ctrl+B¡^',\r
+italic_desc : '±×Åé¡]Ctrl+I¡^',\r
+underline_desc : '¥[©³½u¡]Ctrl+U¡^',\r
+striketrough_desc : '§R°£½u',\r
+justifyleft_desc : '¾a¥ª',\r
+justifycenter_desc : '¸m¤¤',\r
+justifyright_desc : '¾a¥k',\r
+justifyfull_desc : '¾ã½g¹ï»ô',\r
+bullist_desc : '¶µ¥Ø¤è¦¡±ø¦C',\r
+numlist_desc : '½s¸¹¤è¦¡±ø¦C',\r
+outdent_desc : 'ÂX¤jÁY±Æ',\r
+indent_desc : '´î¤pÁY±Æ',\r
+undo_desc : '´_­ì¡]Ctrl+Z¡^',\r
+redo_desc : '­«½Æ¡]Ctrl+Y¡^',\r
+link_desc : '´¡¤J©Î½s¿è³sµ²',\r
+unlink_desc : '§R°£³sµ²',\r
+image_desc : '´¡¤J©Î½s¿è¹ÏÀÉ',\r
+cleanup_desc : '²M°£¤¾½X',\r
+focus_alert : '¨Ï¥Î¦¹«ü¥O«e¶·¥ý«ü©w½s¿è¾¹',\r
+edit_confirm : '­n©ó¦¹¤å¦r¿é¤J°Ï¤¤±Ä¥Î©Òµø§Y±o¼Ò¦¡¶Ü¡H',\r
+insert_link_title : '´¡¤J©Î½s¿è³sµ²',\r
+insert : '´¡¤J',\r
+update : '§ó·s',\r
+cancel : '¨ú®ø',\r
+insert_link_url : '³sµ²ºô§}',\r
+insert_link_target : '¹ï¶H',\r
+insert_link_target_same : '©ó¦Pµøµ¡¤¤¶}±Ò³sµ²',\r
+insert_link_target_blank : '¥H·sµøµ¡¤¤¶}±Ò³sµ²',\r
+insert_image_title : '´¡¤J©Î½s¿è¹ÏÀÉ',\r
+insert_image_src : '¹ÏÀɺô§}',\r
+insert_image_alt : '¹ÏÀÉ»¡©ú',\r
+help_desc : '¨ó§U',\r
+bold_img : "bold_tw.gif",\r
+italic_img : "italic_tw.gif",\r
+underline_img : "underline_tw.gif",\r
+clipboard_msg : '¦b Mozilla ©M Firefox ¤¤µLªk¨Ï¥Î½Æ»s©Î°Å¤U©Î¶K¤W¥\¯à¡C\n»Ý­n§ó¦hÃö©ó¦¹ªº°T®§¶Ü¡H',\r
+popup_blocked : '³á¡I±z¦³³]¸m¸õ²{µøµ¡¹jµ´¾÷¨î¡A¤w±N¥\¯à¸õ²{µøµ¡µ¹¹jµ´¤F¡C\n½Ð½Õ¾ã¸õ²{µøµ¡¹jµ´¾÷¨îªº³]©w¡A¤~¯à¥¿±`¨Ï¥Î¦¹¥\¯à¡C'\r
+});
\ No newline at end of file
diff --git a/webcit/tiny_mce/langs/zh_tw_utf8.js b/webcit/tiny_mce/langs/zh_tw_utf8.js
new file mode 100644 (file)
index 0000000..e39a16c
--- /dev/null
@@ -0,0 +1,42 @@
+// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// 繁體中文 UTF-8 ;數位應用坊製作; twapweb_AT_gmail_DOT_com\r
+\r
+tinyMCE.addToLang('',{\r
+bold_desc : '粗體(Ctrl+B)',\r
+italic_desc : '斜體(Ctrl+I)',\r
+underline_desc : '加底線(Ctrl+U)',\r
+striketrough_desc : '刪除線',\r
+justifyleft_desc : '靠左',\r
+justifycenter_desc : '置中',\r
+justifyright_desc : '靠右',\r
+justifyfull_desc : '整篇對齊',\r
+bullist_desc : '項目方式條列',\r
+numlist_desc : '編號方式條列',\r
+outdent_desc : '擴大縮排',\r
+indent_desc : '減小縮排',\r
+undo_desc : '復原(Ctrl+Z)',\r
+redo_desc : '重複(Ctrl+Y)',\r
+link_desc : '插入或編輯連結',\r
+unlink_desc : '刪除連結',\r
+image_desc : '插入或編輯圖檔',\r
+cleanup_desc : '清除冗碼',\r
+focus_alert : '使用此指令前須先指定編輯器',\r
+edit_confirm : '要於此文字輸入區中採用所視即得模式嗎?',\r
+insert_link_title : '插入或編輯連結',\r
+insert : '插入',\r
+update : '更新',\r
+cancel : '取消',\r
+insert_link_url : '連結網址',\r
+insert_link_target : '對象',\r
+insert_link_target_same : '於同視窗中開啟連結',\r
+insert_link_target_blank : '以新視窗中開啟連結',\r
+insert_image_title : '插入或編輯圖檔',\r
+insert_image_src : '圖檔網址',\r
+insert_image_alt : '圖檔說明',\r
+help_desc : '協助',\r
+bold_img : "bold_tw.gif",\r
+italic_img : "italic_tw.gif",\r
+underline_img : "underline_tw.gif",\r
+clipboard_msg : '在 Mozilla 和 Firefox 中無法使用複製或剪下或貼上功能。\n需要更多關於此的訊息嗎?',\r
+popup_blocked : '喔!您有設置跳現視窗隔絕機制,已將功能跳現視窗給隔絕了。\n請調整跳現視窗隔絕機制的設定,才能正常使用此功能。'\r
+});\r
diff --git a/webcit/tiny_mce/license.txt b/webcit/tiny_mce/license.txt
new file mode 100644 (file)
index 0000000..3b0396a
--- /dev/null
@@ -0,0 +1,437 @@
+                 GNU LIBRARY GENERAL PUBLIC LICENSE\r
+                      Version 2, June 1991\r
+\r
+ Copyright (C) 1991 Free Software Foundation, Inc.\r
+ 59 Temple Place, Suite 330, Boston, MA  02111-1307  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 library GPL.  It is\r
+ numbered 2 because it goes with version 2 of the ordinary GPL.]\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 Library General Public License, applies to some\r
+specially designated Free Software Foundation software, and to any\r
+other libraries whose authors decide to use it.  You can use it for\r
+your libraries, too.\r
+\r
+  When we speak of free software, we are referring to freedom, not\r
+price.  Our General Public Licenses are designed to make sure that you\r
+have the freedom to distribute copies of free software (and charge for\r
+this service if you wish), that you receive source code or can get it\r
+if you want it, that you can change the software or use pieces of it\r
+in new free programs; and that you know you can do these things.\r
+\r
+  To protect your rights, we need to make restrictions that forbid\r
+anyone to deny you these rights or to ask you to surrender the rights.\r
+These restrictions translate to certain responsibilities for you if\r
+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 a program 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
+  Our method of protecting your rights has two steps: (1) copyright\r
+the library, and (2) offer you this license which gives you legal\r
+permission to copy, distribute and/or modify the library.\r
+\r
+  Also, for each distributor's protection, we want to make certain\r
+that everyone understands that there is no warranty for this free\r
+library.  If the library is modified by someone else and passed on, we\r
+want its recipients to know that what they have is not the original\r
+version, so that any problems introduced by others will not reflect on\r
+the original authors' reputations.\r
+.\r
+  Finally, any free program is threatened constantly by software\r
+patents.  We wish to avoid the danger that companies distributing free\r
+software will individually obtain patent licenses, thus in effect\r
+transforming the program into proprietary software.  To prevent this,\r
+we have made it clear that any patent must be licensed for everyone's\r
+free use or not licensed at all.\r
+\r
+  Most GNU software, including some libraries, is covered by the ordinary\r
+GNU General Public License, which was designed for utility programs.  This\r
+license, the GNU Library General Public License, applies to certain\r
+designated libraries.  This license is quite different from the ordinary\r
+one; be sure to read it in full, and don't assume that anything in it is\r
+the same as in the ordinary license.\r
+\r
+  The reason we have a separate public license for some libraries is that\r
+they blur the distinction we usually make between modifying or adding to a\r
+program and simply using it.  Linking a program with a library, without\r
+changing the library, is in some sense simply using the library, and is\r
+analogous to running a utility program or application program.  However, in\r
+a textual and legal sense, the linked executable is a combined work, a\r
+derivative of the original library, and the ordinary General Public License\r
+treats it as such.\r
+\r
+  Because of this blurred distinction, using the ordinary General\r
+Public License for libraries did not effectively promote software\r
+sharing, because most developers did not use the libraries.  We\r
+concluded that weaker conditions might promote sharing better.\r
+\r
+  However, unrestricted linking of non-free programs would deprive the\r
+users of those programs of all benefit from the free status of the\r
+libraries themselves.  This Library General Public License is intended to\r
+permit developers of non-free programs to use free libraries, while\r
+preserving your freedom as a user of such programs to change the free\r
+libraries that are incorporated in them.  (We have not seen how to achieve\r
+this as regards changes in header files, but we have achieved it as regards\r
+changes in the actual functions of the Library.)  The hope is that this\r
+will lead to faster development of free libraries.\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, while the latter only\r
+works together with the library.\r
+\r
+  Note that it is possible for a library to be covered by the ordinary\r
+General Public License rather than by this special one.\r
+.\r
+                 GNU LIBRARY GENERAL PUBLIC LICENSE\r
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\r
+\r
+  0. This License Agreement applies to any software library which\r
+contains a notice placed by the copyright holder or other authorized\r
+party saying it may be distributed under the terms of this Library\r
+General Public License (also called "this License").  Each licensee is\r
+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 compile 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) 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
+    c) 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
+    d) 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 source code distributed need not include anything that is normally\r
+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 to\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 Library 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
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..53472c8
--- /dev/null
@@ -0,0 +1,118 @@
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('template', 'en'); // <- Add a comma separated list of all supported languages\r
+\r
+/****\r
+ * Steps for creating a plugin from this template:\r
+ *\r
+ * 1. Change all "template" to the name of your plugin.\r
+ * 2. Remove all the callbacks in this file that you don't need.\r
+ * 3. Remove the popup.htm file if you don't need any popups.\r
+ * 4. Add your custom logic to the callbacks you needed.\r
+ * 5. Write documentation in a readme.txt file on how to use the plugin.\r
+ * 6. Upload it under the "Plugins" section at sourceforge.\r
+ *\r
+ ****/\r
+\r
+/**\r
+ * Gets executed when a editor instance is initialized\r
+ */\r
+function TinyMCE_template_initInstance(inst) {\r
+       // You can take out plugin specific parameters\r
+       alert("Initialization parameter:" + tinyMCE.getParam("template_someparam", false));\r
+}\r
+\r
+/**\r
+ * Gets executed when a editor needs to generate a button.\r
+ */\r
+function TinyMCE_template_getControlHTML(control_name) {\r
+       switch (control_name) {\r
+               case "template":\r
+                       return '<img id="{$editor_id}_template" src="{$pluginurl}/images/template.gif" title="{$lang_template_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceTemplate\', true);" />';\r
+       }\r
+\r
+       return "";\r
+}\r
+\r
+/**\r
+ * Gets executed when a command is called.\r
+ */\r
+function TinyMCE_template_execCommand(editor_id, element, command, user_interface, value) {\r
+       // Handle commands\r
+       switch (command) {\r
+               // Remember to have the "mce" prefix for commands so they don't intersect with built in ones in the browser.\r
+               case "mceTemplate":\r
+                       // Show UI/Popup\r
+                       if (user_interface) {\r
+                               // Open a popup window and send in some custom data in a window argument\r
+                               var template = new Array();\r
+\r
+                               template['file'] = '../../plugins/template/popup.htm'; // Relative to theme\r
+                               template['width'] = 300;\r
+                               template['height'] = 200;\r
+\r
+                               tinyMCE.openWindow(template, {editor_id : editor_id, some_custom_arg : "somecustomdata"});\r
+\r
+                               // Let TinyMCE know that something was modified\r
+                               tinyMCE.triggerNodeChange(false);\r
+                       } else {\r
+                               // Do a command this gets called from the template popup\r
+                               alert("execCommand: mceTemplate gets called from popup.");\r
+                       }\r
+\r
+                       return true;\r
+       }\r
+\r
+       // Pass to next handler in chain\r
+       return false;\r
+}\r
+\r
+/**\r
+ * Gets executed when the selection/cursor position was changed.\r
+ */\r
+function TinyMCE_template_handleNodeChange(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {\r
+       // Deselect template button\r
+       tinyMCE.switchClassSticky(editor_id + '_template', 'mceButtonNormal');\r
+\r
+       // Select template button if parent node is a strong or b\r
+       if (node.parentNode.nodeName == "STRONG" || node.parentNode.nodeName == "B")\r
+               tinyMCE.switchClassSticky(editor_id + '_template', 'mceButtonSelected');\r
+\r
+       return true;\r
+}\r
+\r
+/**\r
+ * Gets executed when contents is inserted / retrived.\r
+ */\r
+function TinyMCE_template_cleanup(type, content) {\r
+       switch (type) {\r
+               case "get_from_editor":\r
+                       alert("[FROM] Value HTML string: " + content);\r
+\r
+                       // Do custom cleanup code here\r
+\r
+                       break;\r
+\r
+               case "insert_to_editor":\r
+                       alert("[TO] Value HTML string: " + content);\r
+\r
+                       // Do custom cleanup code here\r
+\r
+                       break;\r
+\r
+               case "get_from_editor_dom":\r
+                       alert("[FROM] Value DOM Element " + content.innerHTML);\r
+\r
+                       // Do custom cleanup code here\r
+\r
+                       break;\r
+\r
+               case "insert_to_editor_dom":\r
+                       alert("[TO] Value DOM Element: " + content.innerHTML);\r
+\r
+                       // Do custom cleanup code here\r
+\r
+                       break;\r
+       }\r
+\r
+       return content;\r
+}\r
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..7e181d1
--- /dev/null
@@ -0,0 +1,132 @@
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('template', 'en,he,nb,ru,ru_KOI8-R,ru_UTF-8,nn,fi,cy,es,is,pl'); // <- Add a comma separated list of all supported languages\r
+\r
+/****\r
+ * Steps for creating a plugin from this template:\r
+ *\r
+ * 1. Change all "template" to the name of your plugin.\r
+ * 2. Remove all the callbacks in this file that you don't need.\r
+ * 3. Remove the popup.htm file if you don't need any popups.\r
+ * 4. Add your custom logic to the callbacks you needed.\r
+ * 5. Write documentation in a readme.txt file on how to use the plugin.\r
+ * 6. Upload it under the "Plugins" section at sourceforge.\r
+ *\r
+ ****/\r
+\r
+/**\r
+ * Information about the plugin.\r
+ */\r
+function TinyMCE_template_getInfo() {\r
+       return {\r
+               longname : 'Template plugin',\r
+               author : 'Your name',\r
+               authorurl : 'http://www.yoursite.com',\r
+               infourl : 'http://www.yoursite.com/docs/template.html',\r
+               version : "1.0"\r
+       };\r
+};\r
+\r
+/**\r
+ * Gets executed when a editor instance is initialized\r
+ */\r
+function TinyMCE_template_initInstance(inst) {\r
+       // You can take out plugin specific parameters\r
+       alert("Initialization parameter:" + tinyMCE.getParam("template_someparam", false));\r
+}\r
+\r
+/**\r
+ * Gets executed when a editor needs to generate a button.\r
+ */\r
+function TinyMCE_template_getControlHTML(control_name) {\r
+       switch (control_name) {\r
+               case "template":\r
+                       var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceTemplate\', true);return false;';\r
+                       return '<a href="javascript:' + cmd + '" onclick="' + cmd + '" target="_self" onmousedown="return false;"><img id="{$editor_id}_template" src="{$pluginurl}/images/template.gif" title="{$lang_template_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';\r
+       }\r
+\r
+       return "";\r
+}\r
+\r
+/**\r
+ * Gets executed when a command is called.\r
+ */\r
+function TinyMCE_template_execCommand(editor_id, element, command, user_interface, value) {\r
+       // Handle commands\r
+       switch (command) {\r
+               // Remember to have the "mce" prefix for commands so they don't intersect with built in ones in the browser.\r
+               case "mceTemplate":\r
+                       // Show UI/Popup\r
+                       if (user_interface) {\r
+                               // Open a popup window and send in some custom data in a window argument\r
+                               var template = new Array();\r
+\r
+                               template['file'] = '../../plugins/template/popup.htm'; // Relative to theme\r
+                               template['width'] = 300;\r
+                               template['height'] = 200;\r
+\r
+                               tinyMCE.openWindow(template, {editor_id : editor_id, some_custom_arg : "somecustomdata"});\r
+\r
+                               // Let TinyMCE know that something was modified\r
+                               tinyMCE.triggerNodeChange(false);\r
+                       } else {\r
+                               // Do a command this gets called from the template popup\r
+                               alert("execCommand: mceTemplate gets called from popup.");\r
+                       }\r
+\r
+                       return true;\r
+       }\r
+\r
+       // Pass to next handler in chain\r
+       return false;\r
+}\r
+\r
+/**\r
+ * Gets executed when the selection/cursor position was changed.\r
+ */\r
+function TinyMCE_template_handleNodeChange(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {\r
+       // Deselect template button\r
+       tinyMCE.switchClassSticky(editor_id + '_template', 'mceButtonNormal');\r
+\r
+       // Select template button if parent node is a strong or b\r
+       if (node.parentNode.nodeName == "STRONG" || node.parentNode.nodeName == "B")\r
+               tinyMCE.switchClassSticky(editor_id + '_template', 'mceButtonSelected');\r
+\r
+       return true;\r
+}\r
+\r
+/**\r
+ * Gets executed when contents is inserted / retrived.\r
+ */\r
+function TinyMCE_template_cleanup(type, content) {\r
+       switch (type) {\r
+               case "get_from_editor":\r
+                       alert("[FROM] Value HTML string: " + content);\r
+\r
+                       // Do custom cleanup code here\r
+\r
+                       break;\r
+\r
+               case "insert_to_editor":\r
+                       alert("[TO] Value HTML string: " + content);\r
+\r
+                       // Do custom cleanup code here\r
+\r
+                       break;\r
+\r
+               case "get_from_editor_dom":\r
+                       alert("[FROM] Value DOM Element " + content.innerHTML);\r
+\r
+                       // Do custom cleanup code here\r
+\r
+                       break;\r
+\r
+               case "insert_to_editor_dom":\r
+                       alert("[TO] Value DOM Element: " + content.innerHTML);\r
+\r
+                       // Do custom cleanup code here\r
+\r
+                       break;\r
+       }\r
+\r
+       return content;\r
+}\r
diff --git a/webcit/tiny_mce/plugins/_template/images/template.gif b/webcit/tiny_mce/plugins/_template/images/template.gif
new file mode 100644 (file)
index 0000000..1ab5da4
Binary files /dev/null and b/webcit/tiny_mce/plugins/_template/images/template.gif differ
diff --git a/webcit/tiny_mce/plugins/_template/langs/da.js b/webcit/tiny_mce/plugins/_template/langs/da.js
new file mode 100644 (file)
index 0000000..d0ac335
--- /dev/null
@@ -0,0 +1,8 @@
+// DK lang variables contributed by Jan Moelgaard\r
+\r
+/* Remember to namespace the language parameters lang_<your plugin>_<some name> */\r
+\r
+tinyMCE.addToLang('',{\r
+template_title : 'Dette er bare en pop-up-skabelon',\r
+template_desc : 'Dette er bare en testknap'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/_template/langs/de.js b/webcit/tiny_mce/plugins/_template/langs/de.js
new file mode 100644 (file)
index 0000000..3aa2130
--- /dev/null
@@ -0,0 +1,9 @@
+// DE lang variables\r
+\r
+/* Remember to namespace the language parameters lang_<your plugin>_<some name> */\r
+/* Sprachparameter müssen als lang_<Eigenes Plugin>_<Eigener Name> definiert werden */\r
+\r
+tinyMCE.addToLang('',{\r
+template_title : 'Dies ist nur ein Beispiel-Popup',\r
+template_desc : 'Dies ist nur ein Beispiel-Button'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/_template/langs/en.js b/webcit/tiny_mce/plugins/_template/langs/en.js
new file mode 100644 (file)
index 0000000..2c34076
--- /dev/null
@@ -0,0 +1,8 @@
+// UK lang variables\r
+\r
+/* Remember to namespace the language parameters lang_<your plugin>_<some name> */\r
+\r
+tinyMCE.addToLang('',{\r
+template_title : 'This is just a template popup',\r
+template_desc : 'This is just a template button'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/_template/langs/es.js b/webcit/tiny_mce/plugins/_template/langs/es.js
new file mode 100644 (file)
index 0000000..8382e81
--- /dev/null
@@ -0,0 +1,14 @@
+/**\r
+ * ES lang variables\r
+ * \r
+ * Authors : Alvaro Velasco,\r
+ *           Adolfo Sanz De Diego (asanzdiego) <asanzdiego@yahoo.es>,\r
+ *           Carlos C Soto (eclipxe) <csoto@sia-solutions.com>\r
+ * Last Updated : October 17, 2005\r
+ * TinyMCE Version : 2.0RC3\r
+ */\r
+\r
+tinyMCE.addToLang('',{\r
+template_title : 'Esto es solo la plantilla de un popup',\r
+template_desc : 'Esto es solo la plantilla de un botón'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/_template/langs/fr.js b/webcit/tiny_mce/plugins/_template/langs/fr.js
new file mode 100644 (file)
index 0000000..709e48c
--- /dev/null
@@ -0,0 +1,9 @@
+// Canadian French lang variables by Virtuelcom   last modification: 2005-06-15\r
+// Modifié par Normand Lamoureux le 2005-11-12\r
+\r
+/* N'oubliez pas d'identifer les paramètres de langue ainsi: <votre plugin>_<un nom> */\r
+\r
+tinyMCE.addToLang('',{\r
+template_title : 'Texte qui apparaîtra sous forme de titre dans la fenêtre pop-up de votre plugin',\r
+template_desc : 'Texte qui apparaîtra sous forme d\'info-bulle au survol du bouton de votre plugin'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/_template/langs/fr_ca.js b/webcit/tiny_mce/plugins/_template/langs/fr_ca.js
new file mode 100644 (file)
index 0000000..1c0fc95
--- /dev/null
@@ -0,0 +1,8 @@
+// Canadian French lang variables by Virtuelcom   last modification: 2005-06-15\r
+\r
+/* Remember to namespace the language parameters <your plugin>_<some name> */\r
+\r
+tinyMCE.addToLang('',{\r
+template_title : 'Ceci est un exmple pour le gabarit de popup',\r
+template_desc : 'Ceci est un exmple pour le gabarit d\'un bouton'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/_template/langs/he.js b/webcit/tiny_mce/plugins/_template/langs/he.js
new file mode 100644 (file)
index 0000000..71dbc44
--- /dev/null
@@ -0,0 +1,8 @@
+// HE lang variables\r
+\r
+/* Remember to namespace the language parameters lang_<your plugin>_<some name> */\r
+\r
+tinyMCE.addToLang('',{\r
+template_title : 'æä ñúí çìåï ÷åôõ ùì äúáðéú',\r
+template_desc : 'æä ñúí ëôúåø ùì äúáðéú'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/_template/langs/hu.js b/webcit/tiny_mce/plugins/_template/langs/hu.js
new file mode 100644 (file)
index 0000000..7a26f66
--- /dev/null
@@ -0,0 +1,8 @@
+// HU lang variables\r
+\r
+/* Remember to namespace the language parameters lang_<your plugin>_<some name> */\r
+\r
+tinyMCE.addToLang('',{\r
+template_title : 'Ez csak egy példa popup',\r
+template_desc : 'Ez csak egy példa gomb'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/_template/langs/is.js b/webcit/tiny_mce/plugins/_template/langs/is.js
new file mode 100644 (file)
index 0000000..b3ed8e3
--- /dev/null
@@ -0,0 +1,8 @@
+// Iceland lang variables by Johannes Birgir Jensson\r
+\r
+/* Remember to namespace the language parameters lang_<your plugin>_<some name> */\r
+\r
+tinyMCE.addToLang('',{\r
+template_title : '&THORN;etta er sni&eth;m&aacute;tsgluggi',\r
+template_desc : '&THORN;etta er  sni&eth;m&aacute;tstakki'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/_template/langs/nb.js b/webcit/tiny_mce/plugins/_template/langs/nb.js
new file mode 100644 (file)
index 0000000..de1b13a
--- /dev/null
@@ -0,0 +1,8 @@
+// nb = Norwegian (bokm&aring;l) lang variables by Knut B. Jacobsen\r
+\r
+/* Remember to namespace the language parameters lang_<your plugin>_<some name> */\r
+\r
+tinyMCE.addToLang('',{\r
+template_title : 'Dette er bare en template popup',\r
+template_desc : 'Dette er bare en template knapp'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/_template/langs/nl.js b/webcit/tiny_mce/plugins/_template/langs/nl.js
new file mode 100644 (file)
index 0000000..1422b38
--- /dev/null
@@ -0,0 +1,8 @@
+// NL lang variables\r
+\r
+/* Remember to namespace the language parameters lang_<your plugin>_<some name> */\r
+\r
+tinyMCE.addToLang('',{\r
+template_title : 'Dit is slechts een voorbeeldpopup',\r
+template_desc : 'Dit is slechts een voorbeeldknop'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/_template/langs/nn.js b/webcit/tiny_mce/plugins/_template/langs/nn.js
new file mode 100644 (file)
index 0000000..853d30c
--- /dev/null
@@ -0,0 +1,8 @@
+// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen\r
+\r
+/* Remember to namespace the language parameters lang_<your plugin>_<some name> */\r
+\r
+tinyMCE.addToLang('',{\r
+template_title : 'Dette er berre ein template popup',\r
+template_desc : 'Dette er berre ein template knapp'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/_template/langs/pl.js b/webcit/tiny_mce/plugins/_template/langs/pl.js
new file mode 100644 (file)
index 0000000..c1a9f91
--- /dev/null
@@ -0,0 +1,8 @@
+// PL lang variables\r
+\r
+/* Remember to namespace the language parameters lang_<your plugin>_<some name> */\r
+\r
+tinyMCE.addToLang('',{\r
+template_title : 'To jest szablon okna popup',\r
+template_desc : 'To jest szablon przycisku'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/_template/langs/pt_br.js b/webcit/tiny_mce/plugins/_template/langs/pt_br.js
new file mode 100644 (file)
index 0000000..23d85c0
--- /dev/null
@@ -0,0 +1,13 @@
+/**\r
+ * pt_br lang variables\r
+ * Brazilian Portuguese\r
+ *\r
+ * Authors :\r
+ *           Marcio Barbosa (mpg) <mpg@mpg.com.br>\r
+ * Last Updated : November 26, 2005\r
+ * TinyMCE Version : 2.0RC4\r
+ */\r
+tinyMCE.addToLang('',{\r
+template_title : 'Este é só um modêlo de popup',\r
+template_desc : 'Este é só um modêlo de botão'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/_template/langs/ru.js b/webcit/tiny_mce/plugins/_template/langs/ru.js
new file mode 100644 (file)
index 0000000..bed8428
--- /dev/null
@@ -0,0 +1,8 @@
+// RU cp1251 lang variables\r
+\r
+/* Remember to namespace the language parameters lang_<your plugin>_<some name> */\r
+\r
+tinyMCE.addToLang('',{\r
+template_title : 'Ýòî øàáëîí äëÿ popup',\r
+template_desc : 'Ýòî øàáëîí äëÿ êíîïêè'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/_template/langs/ru_KOI8-R.js b/webcit/tiny_mce/plugins/_template/langs/ru_KOI8-R.js
new file mode 100644 (file)
index 0000000..b406343
--- /dev/null
@@ -0,0 +1,8 @@
+// RU KOI8-R lang variables\r
+\r
+/* Remember to namespace the language parameters lang_<your plugin>_<some name> */\r
+\r
+tinyMCE.addToLang('',{\r
+template_title : 'üÔÏ ÛÁÂÌÏΠÄÌÑ popup',\r
+template_desc : 'üÔÏ ÛÁÂÌÏΠÄÌÑ ËÎÏÐËÉ'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/_template/langs/ru_UTF-8.js b/webcit/tiny_mce/plugins/_template/langs/ru_UTF-8.js
new file mode 100644 (file)
index 0000000..00fbf1a
--- /dev/null
@@ -0,0 +1,8 @@
+// RU UTF-8 lang variables\r
+\r
+/* Remember to namespace the language parameters lang_<your plugin>_<some name> */\r
+\r
+tinyMCE.addToLang('',{\r
+template_title : 'Это шаблон для popup',\r
+template_desc : 'Это шаблон для кнопки'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/_template/langs/zh_cn.js b/webcit/tiny_mce/plugins/_template/langs/zh_cn.js
new file mode 100644 (file)
index 0000000..50f83ed
--- /dev/null
@@ -0,0 +1,8 @@
+// Simplified Chinese lang variables contributed by tom_cat (thomaswangyang@gmail.com)\r
+\r
+/* Remember to namespace the language parameters <your plugin>_<some name> */\r
+\r
+tinyMCE.addToLang('',{\r
+template_title : 'ÕâÊÇÒ»¸öÄ£°åµ¯³ö´°¿Ú',\r
+template_desc : 'ÕâÊÇÒ»¸öÄ£°å°´Å¥'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/_template/langs/zh_tw.js b/webcit/tiny_mce/plugins/_template/langs/zh_tw.js
new file mode 100644 (file)
index 0000000..b403638
--- /dev/null
@@ -0,0 +1,7 @@
+// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// ÁcÅ餤¤å BIG-5 ¡F¼Æ¦ìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com\r
+\r
+tinyMCE.addToLang('',{\r
+template_title : '¼Ë¦¡¸õ²{µøµ¡',\r
+template_desc : '¼Ë¦¡«ö¶s'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/_template/langs/zh_tw_utf8.js b/webcit/tiny_mce/plugins/_template/langs/zh_tw_utf8.js
new file mode 100644 (file)
index 0000000..ff6ee9b
--- /dev/null
@@ -0,0 +1,7 @@
+// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// 繁體中文 UTF-8 ;數位應用坊製作; twapweb_AT_gmail_DOT_com\r
+\r
+tinyMCE.addToLang('',{\r
+template_title : '樣式跳現視窗',\r
+template_desc : '樣式按鈕'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/_template/popup.htm b/webcit/tiny_mce/plugins/_template/popup.htm
new file mode 100644 (file)
index 0000000..b07467f
--- /dev/null
@@ -0,0 +1,48 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_template_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript">\r
+       <!--\r
+               function init() {\r
+                       var inst = tinyMCE.selectedInstance;\r
+                       var elm = inst.getFocusElement();\r
+\r
+                       alert("Got a window argument from plugin: " + tinyMCE.getWindowArg('some_custom_arg'));\r
+\r
+                       // Set the form item value to the selected node element name\r
+                       document.forms[0].nodename.value = elm.nodeName;\r
+               }\r
+\r
+               function insertSomething() {\r
+                       // Execute the mceTemplate command without UI this time\r
+                       tinyMCEPopup.execCommand('mceTemplate');\r
+\r
+                       // Close the dialog\r
+                       tinyMCEPopup.close();\r
+               }\r
+       //-->\r
+       </script>\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('init();');"> \r
+       <form onsubmit="insert();return false;">\r
+               <h3>{$lang_template_title}</h3>\r
+\r
+               <!-- Gets filled with the selected elements name -->\r
+               <div style="margin-top: 10px; margin-bottom: 10px">\r
+                       The selected element name: <input type="text" name="nodename" />\r
+               </div>\r
+\r
+               <div class="mceActionPanel">\r
+                       <div style="float: left">\r
+                               <input type="button" id="insert" name="insert" value="{$lang_insert}" onclick="insertSomething();" />\r
+                       </div>\r
+\r
+                       <div style="float: right">\r
+                               <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+                       </div>\r
+               </div>\r
+       </form>\r
+</body> \r
+</html> \r
diff --git a/webcit/tiny_mce/plugins/_template/readme.txt b/webcit/tiny_mce/plugins/_template/readme.txt
new file mode 100644 (file)
index 0000000..2ee1505
--- /dev/null
@@ -0,0 +1 @@
+This is a template/tutorial plugin that where created to help you in the development of own plugins for TinyMCE.
\ No newline at end of file
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..cb32092
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.importPluginLanguagePack('advhr','en,de,sv,zh_cn,cs,fa,fr_ca,fr,pl,pt_br,nl,da,he,nb,hu,ru,ru_KOI8-R,ru_UTF-8,nn,fi,es,cy,is,zh_tw,zh_tw_utf8,sk');function TinyMCE_advhr_getInfo(){return{longname:'Advanced HR',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_advhr.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_advhr_getControlHTML(control_name){switch(control_name){case "advhr":var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceAdvancedHr\');return false;';return '<a href="javascript:'+cmd+'" onclick="'+cmd+'" target="_self" onmousedown="return false;"><img id="{$editor_id}_advhr" src="{$pluginurl}/images/advhr.gif" title="{$lang_insert_advhr_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';}return "";}function TinyMCE_advhr_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mceAdvancedHr":var template=new Array();template['file']='../../plugins/advhr/rule.htm';template['width']=270;template['height']=180;template['width']+=tinyMCE.getLang('lang_advhr_delta_width',0);template['height']+=tinyMCE.getLang('lang_advhr_delta_height',0);var size="",width="",noshade="";if(tinyMCE.selectedElement!=null&&tinyMCE.selectedElement.nodeName.toLowerCase()=="hr"){tinyMCE.hrElement=tinyMCE.selectedElement;if(tinyMCE.hrElement){size=tinyMCE.hrElement.getAttribute('size')?tinyMCE.hrElement.getAttribute('size'):"";width=tinyMCE.hrElement.getAttribute('width')?tinyMCE.hrElement.getAttribute('width'):"";noshade=tinyMCE.hrElement.getAttribute('noshade')?tinyMCE.hrElement.getAttribute('noshade'):"";}tinyMCE.openWindow(template,{editor_id:editor_id,size:size,width:width,noshade:noshade,mceDo:'update'});}else{if(tinyMCE.isMSIE){tinyMCE.execInstanceCommand(editor_id,'mceInsertContent',false,'<hr />');}else{tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes",size:size,width:width,noshade:noshade,mceDo:'insert'});}}return true;}return false;}function TinyMCE_advhr_handleNodeChange(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){tinyMCE.switchClassSticky(editor_id+'_advhr','mceButtonNormal');if(node==null)return;do{if(node.nodeName.toLowerCase()=="hr")tinyMCE.switchClassSticky(editor_id+'_advhr','mceButtonSelected');}while((node=node.parentNode));return true;}
\ 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..b18afa5
--- /dev/null
@@ -0,0 +1,75 @@
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('advhr', 'en,de,sv,zh_cn,cs,fa,fr_ca,fr,pl,pt_br,nl,da,he,nb,hu,ru,ru_KOI8-R,ru_UTF-8,nn,fi,es,cy,is,zh_tw,zh_tw_utf8,sk');\r
+\r
+function TinyMCE_advhr_getInfo() {\r
+       return {\r
+               longname : 'Advanced HR',\r
+               author : 'Moxiecode Systems',\r
+               authorurl : 'http://tinymce.moxiecode.com',\r
+               infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_advhr.html',\r
+               version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+       };\r
+};\r
+\r
+function TinyMCE_advhr_getControlHTML(control_name) {\r
+    switch (control_name) {\r
+        case "advhr":\r
+                       var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceAdvancedHr\');return false;';\r
+            return '<a href="javascript:' + cmd + '" onclick="' + cmd + '" target="_self" onmousedown="return false;"><img id="{$editor_id}_advhr" src="{$pluginurl}/images/advhr.gif" title="{$lang_insert_advhr_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';\r
+    }\r
+\r
+    return "";\r
+}\r
+\r
+/**\r
+ * Executes the mceAdvanceHr command.\r
+ */\r
+function TinyMCE_advhr_execCommand(editor_id, element, command, user_interface, value) {\r
+    // Handle commands\r
+    switch (command) {\r
+        case "mceAdvancedHr":\r
+            var template = new Array();\r
+\r
+            template['file']   = '../../plugins/advhr/rule.htm'; // Relative to theme\r
+            template['width']  = 270;\r
+            template['height'] = 180;\r
+\r
+                       template['width']  += tinyMCE.getLang('lang_advhr_delta_width', 0);\r
+                       template['height'] += tinyMCE.getLang('lang_advhr_delta_height', 0);\r
+\r
+            var size = "", width = "", noshade = "";\r
+            if (tinyMCE.selectedElement != null && tinyMCE.selectedElement.nodeName.toLowerCase() == "hr"){\r
+                tinyMCE.hrElement = tinyMCE.selectedElement;\r
+                if (tinyMCE.hrElement) {\r
+                    size    = tinyMCE.hrElement.getAttribute('size') ? tinyMCE.hrElement.getAttribute('size') : "";\r
+                    width   = tinyMCE.hrElement.getAttribute('width') ? tinyMCE.hrElement.getAttribute('width') : "";\r
+                    noshade = tinyMCE.hrElement.getAttribute('noshade') ? tinyMCE.hrElement.getAttribute('noshade') : "";\r
+                }\r
+                tinyMCE.openWindow(template, {editor_id : editor_id, size : size, width : width, noshade : noshade, mceDo : 'update'});\r
+            } else {\r
+                if (tinyMCE.isMSIE) {\r
+                    tinyMCE.execInstanceCommand(editor_id, 'mceInsertContent', false,'<hr />');\r
+                } else {\r
+                    tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes", size : size, width : width, noshade : noshade, mceDo : 'insert'});\r
+                }\r
+            }\r
+                    \r
+       return true;\r
+   }\r
+   // Pass to next handler in chain\r
+   return false;\r
+}\r
+\r
+function TinyMCE_advhr_handleNodeChange(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {\r
+       tinyMCE.switchClassSticky(editor_id + '_advhr', 'mceButtonNormal');\r
+\r
+       if (node == null)\r
+               return;\r
+\r
+       do {\r
+               if (node.nodeName.toLowerCase() == "hr")\r
+                       tinyMCE.switchClassSticky(editor_id + '_advhr', 'mceButtonSelected');\r
+       } while ((node = node.parentNode));\r
+\r
+       return true;\r
+}
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advhr/images/advhr.gif b/webcit/tiny_mce/plugins/advhr/images/advhr.gif
new file mode 100644 (file)
index 0000000..e2f8658
Binary files /dev/null and b/webcit/tiny_mce/plugins/advhr/images/advhr.gif differ
diff --git a/webcit/tiny_mce/plugins/advhr/jscripts/rule.js b/webcit/tiny_mce/plugins/advhr/jscripts/rule.js
new file mode 100644 (file)
index 0000000..a75a6df
--- /dev/null
@@ -0,0 +1,41 @@
+function init() {\r
+       var formObj = document.forms[0];\r
+       formObj.width.value  = tinyMCE.getWindowArg('width');\r
+       formObj.size.value   = tinyMCE.getWindowArg('size');\r
+       formObj.insert.value = tinyMCE.getLang('lang_' + tinyMCE.getWindowArg('mceDo'));\r
+       if (tinyMCE.getWindowArg('noshade')) {\r
+               formObj.noshade.checked = true;\r
+       }\r
+       if (tinyMCE.getWindowArg('width').lastIndexOf('%')!=-1) {\r
+               formObj.width2.value = "%";\r
+               formObj.width.value  = formObj.width.value.substring(0,formObj.width.value.length-1);\r
+       }\r
+}\r
+\r
+function insertHR() {\r
+       var formObj = document.forms[0];\r
+       var width   = formObj.width.value;\r
+       var size    = formObj.size.value;\r
+       var html = '<hr';\r
+       if (size!='' && size!=0) {\r
+               html += ' size="' + size + '"';\r
+       }\r
+       if (width!='' && width!=0) {\r
+               html += ' width="' + width;\r
+               if (formObj.width2.value=='%') {\r
+                       html += '%';\r
+               }\r
+               html += '"';\r
+       }\r
+       if (formObj.noshade.checked==true) {\r
+               html += ' noshade="noshade"';\r
+       }\r
+       html += ' />';\r
+\r
+       tinyMCEPopup.execCommand("mceInsertContent", true, html);\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function cancelAction() {\r
+       tinyMCEPopup.close();\r
+}\r
diff --git a/webcit/tiny_mce/plugins/advhr/langs/cs.js b/webcit/tiny_mce/plugins/advhr/langs/cs.js
new file mode 100644 (file)
index 0000000..e33df89
--- /dev/null
@@ -0,0 +1,14 @@
+/**\r
+ * Czech lang variables \r
+ * encoding: utf-8\r
+ *  \r
+ * $Id: cs.js,v 1.4 2005/10/18 13:59:21 spocke Exp $ \r
+ */  \r
+\r
+tinyMCE.addToLang('',{\r
+insert_advhr_desc : 'Vložit/editovat vodorovný oddělovač',\r
+insert_advhr_width : 'Šířka',\r
+insert_advhr_size : 'Výška',\r
+insert_advhr_noshade : 'Nestínovat'\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/advhr/langs/cy.js b/webcit/tiny_mce/plugins/advhr/langs/cy.js
new file mode 100644 (file)
index 0000000..4ba9b88
--- /dev/null
@@ -0,0 +1,8 @@
+// Welsh lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+insert_advhr_desc : 'Mewnosod/golygu llinell llorweddol',\r
+insert_advhr_width : 'Lled',\r
+insert_advhr_size : 'Uchder',\r
+insert_advhr_noshade : 'Dim cysgod'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advhr/langs/da.js b/webcit/tiny_mce/plugins/advhr/langs/da.js
new file mode 100644 (file)
index 0000000..5bce9e6
--- /dev/null
@@ -0,0 +1,8 @@
+// DK lang variables contributed by Jan Moelgaard\r
+\r
+tinyMCE.addToLang('',{\r
+insert_advhr_desc : 'Inds&#230;t / rediger horisontal bj&#230;lke',\r
+insert_advhr_width : 'Bredde',\r
+insert_advhr_size : 'H&#248;jde',\r
+insert_advhr_noshade : 'Ingen skygge'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advhr/langs/de.js b/webcit/tiny_mce/plugins/advhr/langs/de.js
new file mode 100644 (file)
index 0000000..b6c64de
--- /dev/null
@@ -0,0 +1,8 @@
+// DE lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+insert_advhr_desc : 'Horizontale Linie einf&uuml;gen/bearbeiten',\r
+insert_advhr_width : 'Breite',\r
+insert_advhr_size : 'H&ouml;he',\r
+insert_advhr_noshade : 'Keinen Schatten'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advhr/langs/en.js b/webcit/tiny_mce/plugins/advhr/langs/en.js
new file mode 100644 (file)
index 0000000..7c23b39
--- /dev/null
@@ -0,0 +1,8 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+insert_advhr_desc : 'Insert / edit Horizontale Rule',\r
+insert_advhr_width : 'Width',\r
+insert_advhr_size : 'Height',\r
+insert_advhr_noshade : 'No shadow'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advhr/langs/es.js b/webcit/tiny_mce/plugins/advhr/langs/es.js
new file mode 100644 (file)
index 0000000..4de94cc
--- /dev/null
@@ -0,0 +1,10 @@
+// ES lang variables by Alvaro Velasco and Adolfo Sanz De Diego (asanzdiego) <asanzdiego@yahoo.es>\r
+// Last Updated : October 2005\r
+// TinyMCE Version : 2.0RC3\r
+\r
+tinyMCE.addToLang('',{\r
+insert_advhr_desc : 'Insertar/Editar Barra Horizontal',\r
+insert_advhr_width : 'Ancho',\r
+insert_advhr_size : 'Alto',\r
+insert_advhr_noshade : 'Sin Sombras'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advhr/langs/fa.js b/webcit/tiny_mce/plugins/advhr/langs/fa.js
new file mode 100644 (file)
index 0000000..54a4fbc
--- /dev/null
@@ -0,0 +1,13 @@
+// IR lang variables\r
+// Persian (Farsi) language pack (for IRAN)\r
+// By: Morteza Zafari\r
+// Lost@LostLord.com\r
+// http://www.LostLord.com\r
+\r
+tinyMCE.addToLang('',{\r
+dir : 'rtl',\r
+insert_advhr_desc : '??? ? ?????? ?? ????',\r
+insert_advhr_width : '???',\r
+insert_advhr_size : '??????',\r
+insert_advhr_noshade : '???? ????'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advhr/langs/fi.js b/webcit/tiny_mce/plugins/advhr/langs/fi.js
new file mode 100644 (file)
index 0000000..55cbb1d
--- /dev/null
@@ -0,0 +1,8 @@
+// FI lang variables by Tuomo Aura, Ateco.fi\r
+\r
+tinyMCE.addToLang('',{\r
+insert_advhr_desc : 'Lis&auml;&auml; / Muokkaa vaakaviivaa',\r
+insert_advhr_width : 'Leveys',\r
+insert_advhr_size : 'Korkeus',\r
+insert_advhr_noshade : 'Ei varjostusta'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advhr/langs/fr.js b/webcit/tiny_mce/plugins/advhr/langs/fr.js
new file mode 100644 (file)
index 0000000..1971e3a
--- /dev/null
@@ -0,0 +1,9 @@
+// French lang variables by Laurent Dran\r
+// Modifié par Normand Lamoureux le 2005-11-12\r
+\r
+tinyMCE.addToLang('',{\r
+insert_advhr_desc : 'Insérer une règle horizontale stylée',\r
+insert_advhr_width : 'Largeur',\r
+insert_advhr_size : 'Hauteur',\r
+insert_advhr_noshade : 'Sans ombre'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advhr/langs/fr_ca.js b/webcit/tiny_mce/plugins/advhr/langs/fr_ca.js
new file mode 100644 (file)
index 0000000..6dcd773
--- /dev/null
@@ -0,0 +1,8 @@
+// CA_FR lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+insert_advhr_desc : 'Insérer / Modifier Séparateur Horizontal',\r
+insert_advhr_width : 'Largeur',\r
+insert_advhr_size : 'Hauteur',\r
+insert_advhr_noshade : 'Sans ombrage'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advhr/langs/he.js b/webcit/tiny_mce/plugins/advhr/langs/he.js
new file mode 100644 (file)
index 0000000..ca2b22b
--- /dev/null
@@ -0,0 +1,8 @@
+// HE lang variables by Liron Newman, http://eesh.net\r
+\r
+tinyMCE.addToLang('',{\r
+insert_advhr_desc : 'äëðñ/òøåê ÷å àåô÷é',\r
+insert_advhr_width : 'øåçá',\r
+insert_advhr_size : 'âåáä',\r
+insert_advhr_noshade : 'ììà öì'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advhr/langs/hu.js b/webcit/tiny_mce/plugins/advhr/langs/hu.js
new file mode 100644 (file)
index 0000000..2457f1c
--- /dev/null
@@ -0,0 +1,8 @@
+// HU lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+insert_advhr_desc : 'Vízszintes vonal beillesztése / szerkesztése',\r
+insert_advhr_width : 'Hosszúság',\r
+insert_advhr_size : 'Szélesség',\r
+insert_advhr_noshade : 'Nincs árnyék'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advhr/langs/is.js b/webcit/tiny_mce/plugins/advhr/langs/is.js
new file mode 100644 (file)
index 0000000..63ca1d4
--- /dev/null
@@ -0,0 +1,8 @@
+// Iceland lang variables by Johannes Birgir Jensson\r
+\r
+tinyMCE.addToLang('',{\r
+insert_advhr_desc : 'B&aelig;ta vi&eth;/breyta stiku',\r
+insert_advhr_width : 'Breidd',\r
+insert_advhr_size : 'H&aelig;&eth;',\r
+insert_advhr_noshade : 'Enginn skuggi'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advhr/langs/nb.js b/webcit/tiny_mce/plugins/advhr/langs/nb.js
new file mode 100644 (file)
index 0000000..14a5ab6
--- /dev/null
@@ -0,0 +1,8 @@
+// nb = Norwegian (bokm&aring;l) lang variables by Knut B. Jacobsen\r
+\r
+tinyMCE.addToLang('',{\r
+insert_advhr_desc : 'Lage/Redigere horisontal linje',\r
+insert_advhr_width : 'Bredde',\r
+insert_advhr_size : 'H&oslash;yde',\r
+insert_advhr_noshade : 'Ingen skygge'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advhr/langs/nl.js b/webcit/tiny_mce/plugins/advhr/langs/nl.js
new file mode 100644 (file)
index 0000000..2ef3ba2
--- /dev/null
@@ -0,0 +1,8 @@
+// NL lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+insert_advhr_desc : 'Horizontale lijn invoegen/bewerken',\r
+insert_advhr_width : 'Breedte',\r
+insert_advhr_size : 'Hoogte',\r
+insert_advhr_noshade : 'Geen schaduw'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advhr/langs/nn.js b/webcit/tiny_mce/plugins/advhr/langs/nn.js
new file mode 100644 (file)
index 0000000..2cc7b16
--- /dev/null
@@ -0,0 +1,8 @@
+// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen\r
+\r
+tinyMCE.addToLang('',{\r
+insert_advhr_desc : 'Lage/Redigere horisontal linje',\r
+insert_advhr_width : 'Bredde',\r
+insert_advhr_size : 'H&oslash;gde',\r
+insert_advhr_noshade : 'Ingen skugge'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advhr/langs/pl.js b/webcit/tiny_mce/plugins/advhr/langs/pl.js
new file mode 100644 (file)
index 0000000..dcb081e
--- /dev/null
@@ -0,0 +1,11 @@
+// PL lang variables\r
+// fixed by Wooya\r
+// http://www.mfusion.prv.pl\r
+// fixed by lemiel 14.11.2005\r
+\r
+tinyMCE.addToLang('',{\r
+insert_advhr_desc : 'Wstaw/Edytuj poziom± liniê',\r
+insert_advhr_width : 'Szeroko¶æ',\r
+insert_advhr_size : 'Wysoko¶æ',\r
+insert_advhr_noshade : 'Brak cienia'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advhr/langs/pt_br.js b/webcit/tiny_mce/plugins/advhr/langs/pt_br.js
new file mode 100644 (file)
index 0000000..03cf85a
--- /dev/null
@@ -0,0 +1,16 @@
+/**\r
+ * pt_br lang variables\r
+ * Brazilian Portuguese\r
+ *\r
+ * Authors : ????\r
+ * Revision and modifications:\r
+ *           Marcio Barbosa (mpg) <mpg@mpg.com.br>\r
+ * Last Updated : November 26, 2005\r
+ * TinyMCE Version : 2.0RC4\r
+ */\r
+tinyMCE.addToLang('',{\r
+insert_advhr_desc : 'Inserir / editar Linha Horizontal',\r
+insert_advhr_width : 'Largura',\r
+insert_advhr_size : 'Altura',\r
+insert_advhr_noshade : 'Sem Sombra'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advhr/langs/ru.js b/webcit/tiny_mce/plugins/advhr/langs/ru.js
new file mode 100644 (file)
index 0000000..e6295ee
--- /dev/null
@@ -0,0 +1,8 @@
+// RU cp1251 lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+insert_advhr_desc : 'Âñòàâèòü / ðåäàêòèðîâàòü ãîðèçîíòàëüíûé ðàçäåëèòåëü',\r
+insert_advhr_width : 'Øèðèíà',\r
+insert_advhr_size : 'Âûñîòà',\r
+insert_advhr_noshade : 'Áåç òåíè'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advhr/langs/ru_KOI8-R.js b/webcit/tiny_mce/plugins/advhr/langs/ru_KOI8-R.js
new file mode 100644 (file)
index 0000000..6dfa5c2
--- /dev/null
@@ -0,0 +1,8 @@
+// RU KOI8-R lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+insert_advhr_desc : '÷ÓÔÁ×ÉÔØ / ÒÅÄÁËÔÉÒÏ×ÁÔØ ÇÏÒÉÚÏÎÔÁÌØÎÙÊ ÒÁÚÄÅÌÉÔÅÌØ',\r
+insert_advhr_width : 'ûÉÒÉÎÁ',\r
+insert_advhr_size : '÷ÙÓÏÔÁ',\r
+insert_advhr_noshade : 'âÅÚ ÔÅÎÉ'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advhr/langs/ru_UTF-8.js b/webcit/tiny_mce/plugins/advhr/langs/ru_UTF-8.js
new file mode 100644 (file)
index 0000000..f3d8b8a
--- /dev/null
@@ -0,0 +1,8 @@
+// RU UTF-8 lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+insert_advhr_desc : 'Вставить / редактировать горизонтальный разделитель',\r
+insert_advhr_width : 'Ширина',\r
+insert_advhr_size : 'Высота',\r
+insert_advhr_noshade : 'Без тени'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advhr/langs/sk.js b/webcit/tiny_mce/plugins/advhr/langs/sk.js
new file mode 100644 (file)
index 0000000..84c6d46
--- /dev/null
@@ -0,0 +1,16 @@
+/**\r
+ * Slovak lang variables \r
+ * encoding: utf-8\r
+ * \r
+ * @author Vladimir VASIL vvasil@post.sk\r
+ *    \r
+ * $Id: sk.js,v 1.1 2005/11/22 20:56:43 spocke Exp $ \r
+ */  \r
+\r
+tinyMCE.addToLang('',{\r
+insert_advhr_desc : 'Vložiť/editovať vodorovný oddeľovač',\r
+insert_advhr_width : 'Šírka',\r
+insert_advhr_size : 'Výška',\r
+insert_advhr_noshade : 'Nestieňovať'\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/advhr/langs/sv.js b/webcit/tiny_mce/plugins/advhr/langs/sv.js
new file mode 100644 (file)
index 0000000..e3b9fb2
--- /dev/null
@@ -0,0 +1,8 @@
+// SE lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+insert_advhr_desc : 'Skapa/Redigera horisontell linje',\r
+insert_advhr_width : 'Bredd',\r
+insert_advhr_size : 'H&ouml;jd',\r
+insert_advhr_noshade : 'Ingen skugga'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advhr/langs/zh_cn.js b/webcit/tiny_mce/plugins/advhr/langs/zh_cn.js
new file mode 100644 (file)
index 0000000..b9ee545
--- /dev/null
@@ -0,0 +1,8 @@
+// Simplified Chinese lang variables contributed by tom_cat (thomaswangyang@gmail.com)\r
+\r
+tinyMCE.addToLang('',{\r
+insert_advhr_desc : '²åÈë/±à¼­ Ë®Æ½±ê³ß',\r
+insert_advhr_width : '¿í¶È',\r
+insert_advhr_size : '¸ß¶È',\r
+insert_advhr_noshade : 'ÎÞÒõÓ°'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advhr/langs/zh_tw.js b/webcit/tiny_mce/plugins/advhr/langs/zh_tw.js
new file mode 100644 (file)
index 0000000..c3029f6
--- /dev/null
@@ -0,0 +1,10 @@
+// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// ÁcÅ餤¤å BIG-5 ¡F¼Æ¦ìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com\r
+\r
+\r
+tinyMCE.addToLang('',{\r
+insert_advhr_desc : '´¡¤J©Î½s¿è¤ô¥­½u',\r
+insert_advhr_width : '¼e',\r
+insert_advhr_size : '°ª',\r
+insert_advhr_noshade : 'µL³±¼v'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advhr/langs/zh_tw_utf8.js b/webcit/tiny_mce/plugins/advhr/langs/zh_tw_utf8.js
new file mode 100644 (file)
index 0000000..bc26a57
--- /dev/null
@@ -0,0 +1,10 @@
+// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// 繁體中文 UTF-8 ;數位應用坊製作; twapweb_AT_gmail_DOT_com\r
+\r
+\r
+tinyMCE.addToLang('',{\r
+insert_advhr_desc : '插入或編輯水平線',\r
+insert_advhr_width : '寬',\r
+insert_advhr_size : '高',\r
+insert_advhr_noshade : '無陰影'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advhr/readme.txt b/webcit/tiny_mce/plugins/advhr/readme.txt
new file mode 100644 (file)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/webcit/tiny_mce/plugins/advhr/rule.htm b/webcit/tiny_mce/plugins/advhr/rule.htm
new file mode 100644 (file)
index 0000000..0e711b4
--- /dev/null
@@ -0,0 +1,59 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_insert_link_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/rule.js"></script>\r
+       <style type="text/css">\r
+       <!--\r
+          input.radio {\r
+                       border: 1px none #000000;\r
+                       background-color: transparent;\r
+                       vertical-align: middle;\r
+          }\r
+       -->\r
+       </style>\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('init();');">\r
+    <form onsubmit="insertHR();return false;" action="#">\r
+        <table border="0" cellpadding="0" cellspacing="0" width="100%">\r
+            <tr>\r
+                <td align="center" valign="middle"><table border="0" cellpadding="4" cellspacing="0">\r
+                    <tr>\r
+                        <td colspan="2" class="title">{$lang_insert_advhr_desc}</td>\r
+                    </tr>\r
+                    <tr>\r
+                        <td align="right">{$lang_insert_advhr_width}:</td>\r
+                        <td nowrap="nowrap">\r
+                            <input name="width" type="text" id="width" value="" style="width: 50px; vertical-align: middle;" />\r
+                            <select name="width2" id="width2" style="width: 50px; vertical-align: middle;">\r
+                                <option value="">px</option>\r
+                                <option value="%">%</option>\r
+                            </select>\r
+                        </td>\r
+                    </tr>\r
+                    <tr>\r
+                        <td align="right" valign="top">{$lang_insert_advhr_size}:</td>\r
+                        <td><select id="size" name="size" style="width: 100px;">\r
+                            <option value="">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 align="right" valign="top"><input type="checkbox" name="noshade" id="noshade" class="radio" /></td>\r
+                        <td><label for="noshade">{$lang_insert_advhr_noshade}</label></td>\r
+                    </tr>\r
+                    <tr>\r
+                        <td><input type="button" name="insert" value="{$lang_insert}" onclick="insertHR();" id="insert" /></td>\r
+                        <td align="right"><input type="button" name="cancel" value="{$lang_cancel}" onclick="cancelAction();" id="cancel" /></td>\r
+                    </tr>\r
+                </table></td>\r
+            </tr>\r
+        </table>\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..f05e376
--- /dev/null
@@ -0,0 +1,66 @@
+/* CSS file for advimage plugin popup */\r
+\r
+.mceImageList {\r
+       width: 280px;\r
+}\r
+\r
+.mceActionPanel {\r
+       margin-top: 7px;\r
+}\r
+\r
+.alignPreview {\r
+       border: 1px solid black;\r
+       width: 140px;\r
+       height: 140px;\r
+       overflow: hidden;\r
+       padding: 5px;\r
+}\r
+\r
+.checkbox {\r
+       border: 0px;\r
+}\r
+\r
+.panel_wrapper div.current {\r
+       height: 305px;\r
+}\r
+\r
+#prev {\r
+       margin:0px;\r
+       border: 1px\r
+       solid black;\r
+       width: 99%;\r
+       height:150px;\r
+       overflow: auto;\r
+}\r
+\r
+#align, #classlist {\r
+       width: 150px;\r
+}\r
+\r
+#width, #height {\r
+       vertical-align: middle;\r
+       width: 50px;\r
+       text-align: center;\r
+}\r
+\r
+#vspace, #hspace, #border {\r
+       vertical-align: middle;\r
+       width: 30px;\r
+       text-align: center;\r
+}\r
+\r
+#classlist {\r
+       width: 180px;\r
+}\r
+\r
+input {\r
+       width: 280px;\r
+}\r
+\r
+#constrain, #onmousemovecheck {\r
+       width: auto;\r
+}\r
+\r
+#id, #dir, #lang, #usemap, #longdesc {\r
+       width: 200px;\r
+}\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..3c81a74
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.importPluginLanguagePack('advimage','en,de,sv,zh_cn,cs,fa,fr_ca,fr,pl,pt_br,nl,he,nb,ru,ru_KOI8-R,ru_UTF-8,nn,cy,es,is,zh_tw,zh_tw_utf8,sk');function TinyMCE_advimage_getInfo(){return{longname:'Advanced image',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_advimage.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_advimage_getControlHTML(control_name){switch(control_name){case "image":var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceAdvImage\');return false;';return '<a href="javascript:'+cmd+'" onclick="'+cmd+'" target="_self" onmousedown="return false;"><img id="{$editor_id}_advimage" src="{$themeurl}/images/image.gif" title="{$lang_image_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreClass(this);" /></a>';}return "";}function TinyMCE_advimage_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mceAdvImage":var template=new Array();template['file']='../../plugins/advimage/image.htm';template['width']=480;template['height']=380;template['width']+=tinyMCE.getLang('lang_advimage_delta_width',0);template['height']+=tinyMCE.getLang('lang_advimage_delta_height',0);var inst=tinyMCE.getInstanceById(editor_id);var elm=inst.getFocusElement();if(elm!=null&&tinyMCE.getAttrib(elm,'class').indexOf('mceItem')!=-1)return true;tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes"});return true;}return false;}function TinyMCE_advimage_cleanup(type,content){switch(type){case "insert_to_editor_dom":var imgs=content.getElementsByTagName("img");for(var i=0;i<imgs.length;i++){var onmouseover=tinyMCE.cleanupEventStr(tinyMCE.getAttrib(imgs[i],'onmouseover'));var onmouseout=tinyMCE.cleanupEventStr(tinyMCE.getAttrib(imgs[i],'onmouseout'));if((src=tinyMCE.getImageSrc(onmouseover))!=""){if(tinyMCE.getParam('convert_urls'))src=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'],src);imgs[i].setAttribute('onmouseover',"this.src='"+src+"';");}if((src=tinyMCE.getImageSrc(onmouseout))!=""){if(tinyMCE.getParam('convert_urls'))src=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'],src);imgs[i].setAttribute('onmouseout',"this.src='"+src+"';");}}break;case "get_from_editor_dom":var imgs=content.getElementsByTagName("img");for(var i=0;i<imgs.length;i++){var onmouseover=tinyMCE.cleanupEventStr(tinyMCE.getAttrib(imgs[i],'onmouseover'));var onmouseout=tinyMCE.cleanupEventStr(tinyMCE.getAttrib(imgs[i],'onmouseout'));if((src=tinyMCE.getImageSrc(onmouseover))!=""){if(tinyMCE.getParam('convert_urls'))src=eval(tinyMCE.settings['urlconverter_callback']+"(src, null, true);");imgs[i].setAttribute('onmouseover',"this.src='"+src+"';");}if((src=tinyMCE.getImageSrc(onmouseout))!=""){if(tinyMCE.getParam('convert_urls'))src=eval(tinyMCE.settings['urlconverter_callback']+"(src, null, true);");imgs[i].setAttribute('onmouseout',"this.src='"+src+"';");}}break;}return content;}function TinyMCE_advimage_handleNodeChange(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){tinyMCE.switchClassSticky(editor_id+'_advimage','mceButtonNormal');if(node==null)return;do{if(node.nodeName=="IMG"&&tinyMCE.getAttrib(node,'class').indexOf('mceItem')==-1)tinyMCE.switchClassSticky(editor_id+'_advimage','mceButtonSelected');}while((node=node.parentNode));return true;}
\ 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..7138b00
--- /dev/null
@@ -0,0 +1,113 @@
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('advimage', 'en,de,sv,zh_cn,cs,fa,fr_ca,fr,pl,pt_br,nl,he,nb,ru,ru_KOI8-R,ru_UTF-8,nn,cy,es,is,zh_tw,zh_tw_utf8,sk');\r
+\r
+function TinyMCE_advimage_getInfo() {\r
+       return {\r
+               longname : 'Advanced image',\r
+               author : 'Moxiecode Systems',\r
+               authorurl : 'http://tinymce.moxiecode.com',\r
+               infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_advimage.html',\r
+               version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+       };\r
+};\r
+\r
+function TinyMCE_advimage_getControlHTML(control_name) {\r
+       switch (control_name) {\r
+               case "image":\r
+                       var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceAdvImage\');return false;';\r
+                       return '<a href="javascript:' + cmd + '" onclick="' + cmd + '" target="_self" onmousedown="return false;"><img id="{$editor_id}_advimage" src="{$themeurl}/images/image.gif" title="{$lang_image_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreClass(this);" /></a>';\r
+       }\r
+\r
+       return "";\r
+}\r
+\r
+function TinyMCE_advimage_execCommand(editor_id, element, command, user_interface, value) {\r
+       switch (command) {\r
+               case "mceAdvImage":\r
+                       var template = new Array();\r
+\r
+                       template['file']   = '../../plugins/advimage/image.htm';\r
+                       template['width']  = 480;\r
+                       template['height'] = 380;\r
+\r
+                       // Language specific width and height addons\r
+                       template['width']  += tinyMCE.getLang('lang_advimage_delta_width', 0);\r
+                       template['height'] += tinyMCE.getLang('lang_advimage_delta_height', 0);\r
+\r
+                       var inst = tinyMCE.getInstanceById(editor_id);\r
+                       var elm = inst.getFocusElement();\r
+\r
+                       if (elm != null && tinyMCE.getAttrib(elm, 'class').indexOf('mceItem') != -1)\r
+                               return true;\r
+\r
+                       tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes"});\r
+\r
+                       return true;\r
+       }\r
+\r
+       return false;\r
+}\r
+\r
+function TinyMCE_advimage_cleanup(type, content) {\r
+       switch (type) {\r
+               case "insert_to_editor_dom":\r
+                       var imgs = content.getElementsByTagName("img");\r
+                       for (var i=0; i<imgs.length; i++) {\r
+                               var onmouseover = tinyMCE.cleanupEventStr(tinyMCE.getAttrib(imgs[i], 'onmouseover'));\r
+                               var onmouseout = tinyMCE.cleanupEventStr(tinyMCE.getAttrib(imgs[i], 'onmouseout'));\r
+\r
+                               if ((src = tinyMCE.getImageSrc(onmouseover)) != "") {\r
+                                       if (tinyMCE.getParam('convert_urls'))\r
+                                               src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], src);\r
+\r
+                                       imgs[i].setAttribute('onmouseover', "this.src='" + src + "';");\r
+                               }\r
+\r
+                               if ((src = tinyMCE.getImageSrc(onmouseout)) != "") {\r
+                                       if (tinyMCE.getParam('convert_urls'))\r
+                                               src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], src);\r
+\r
+                                       imgs[i].setAttribute('onmouseout', "this.src='" + src + "';");\r
+                               }\r
+                       }\r
+                       break;\r
+\r
+               case "get_from_editor_dom":\r
+                       var imgs = content.getElementsByTagName("img");\r
+                       for (var i=0; i<imgs.length; i++) {\r
+                               var onmouseover = tinyMCE.cleanupEventStr(tinyMCE.getAttrib(imgs[i], 'onmouseover'));\r
+                               var onmouseout = tinyMCE.cleanupEventStr(tinyMCE.getAttrib(imgs[i], 'onmouseout'));\r
+\r
+                               if ((src = tinyMCE.getImageSrc(onmouseover)) != "") {\r
+                                       if (tinyMCE.getParam('convert_urls'))\r
+                                               src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, null, true);");\r
+\r
+                                       imgs[i].setAttribute('onmouseover', "this.src='" + src + "';");\r
+                               }\r
+\r
+                               if ((src = tinyMCE.getImageSrc(onmouseout)) != "") {\r
+                                       if (tinyMCE.getParam('convert_urls'))\r
+                                               src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, null, true);");\r
+\r
+                                       imgs[i].setAttribute('onmouseout', "this.src='" + src + "';");\r
+                               }\r
+                       }\r
+                       break;\r
+       }\r
+\r
+       return content;\r
+}\r
+\r
+function TinyMCE_advimage_handleNodeChange(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {\r
+       tinyMCE.switchClassSticky(editor_id + '_advimage', 'mceButtonNormal');\r
+\r
+       if (node == null)\r
+               return;\r
+\r
+       do {\r
+               if (node.nodeName == "IMG" && tinyMCE.getAttrib(node, 'class').indexOf('mceItem') == -1)\r
+                       tinyMCE.switchClassSticky(editor_id + '_advimage', 'mceButtonSelected');\r
+       } while ((node = node.parentNode));\r
+\r
+       return true;\r
+}\r
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..5d7e8c3
--- /dev/null
@@ -0,0 +1,240 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_insert_image_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/functions.js"></script>\r
+       <link href="css/advimage.css" rel="stylesheet" type="text/css" />\r
+       <base target="_self" />\r
+</head>\r
+<body id="advimage" onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+    <form onsubmit="insertAction();return false;" action="#"> \r
+               <div class="tabs">\r
+                       <ul>\r
+                               <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{$lang_advimage_tab_general}</a></span></li>\r
+                               <li id="appearance_tab"><span><a href="javascript:mcTabs.displayTab('appearance_tab','appearance_panel');" onmousedown="return false;">{$lang_advimage_tab_appearance}</a></span></li>\r
+                               <li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{$lang_advimage_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>{$lang_advimage_general}</legend>\r
+\r
+                                               <table class="properties">\r
+                                                       <tr>\r
+                                                               <td class="column1"><label id="srclabel" for="src">{$lang_insert_image_src}</label></td>\r
+                                                               <td colspan="2"><table border="0" cellspacing="0" cellpadding="0">\r
+                                                                       <tr> \r
+                                                                         <td><input name="src" type="text" id="src" value="" onchange="showPreviewImage(this.value);" /></td> \r
+                                                                         <td id="srcbrowsercontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                                 </table></td>\r
+                                                       </tr>\r
+                                                       <tr id="imagelistsrcrow">\r
+                                                               <td class="column1"><label for="imagelistsrc">{$lang_image_list}</label></td>\r
+                                                               <td colspan="2" id="imagelistsrccontainer">&nbsp;</td>\r
+                                                       </tr>\r
+                                                       <tr> \r
+                                                               <td class="column1"><label id="altlabel" for="alt">{$lang_insert_image_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">{$lang_advimage_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>{$lang_advimage_preview}</legend>\r
+                                       <div id="prev"></div>\r
+                               </fieldset>\r
+                       </div>\r
+\r
+                       <div id="appearance_panel" class="panel">\r
+                               <fieldset>\r
+                                       <legend>{$lang_advimage_tab_appearance}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr> \r
+                                                       <td class="column1"><label id="alignlabel" for="align">{$lang_insert_image_align}</label></td> \r
+                                                       <td><select id="align" name="align" onchange="changeAppearance();"> \r
+                                                                       <option value="">{$lang_insert_image_align_default}</option> \r
+                                                                       <option value="baseline">{$lang_insert_image_align_baseline}</option> \r
+                                                                       <option value="top">{$lang_insert_image_align_top}</option> \r
+                                                                       <option value="middle">{$lang_insert_image_align_middle}</option> \r
+                                                                       <option value="bottom">{$lang_insert_image_align_bottom}</option> \r
+                                                                       <option value="texttop">{$lang_insert_image_align_texttop}</option> \r
+                                                                       <option value="absmiddle">{$lang_insert_image_align_absmiddle}</option> \r
+                                                                       <option value="absbottom">{$lang_insert_image_align_absbottom}</option> \r
+                                                                       <option value="left">{$lang_insert_image_align_left}</option> \r
+                                                                       <option value="right">{$lang_insert_image_align_right}</option> \r
+                                                               </select> \r
+                                                       </td>\r
+                                                       <td rowspan="6" valign="top">\r
+                                                               <div class="alignPreview">\r
+                                                                       <img id="alignSampleImg" src="images/sample.gif" alt="{$lang_advimage_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>\r
+                                                       <td class="column1"><label id="widthlabel" for="width">{$lang_insert_image_dimensions}</label></td>\r
+                                                       <td nowrap="nowrap">\r
+                                                               <input name="width" type="text" id="width" value="" size="5" maxlength="5" onchange="changeHeight();" /> x \r
+                                                               <input name="height" type="text" id="height" value="" size="5" maxlength="5" onchange="changeWidth();" /> px\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td>&nbsp;</td>\r
+                                                       <td><table 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">{$lang_advimage_constrain_proportions}</label></td>\r
+                                                                       </tr>\r
+                                                               </table></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label id="vspacelabel" for="vspace">{$lang_insert_image_vspace}</label></td> \r
+                                                       <td><input name="vspace" type="text" id="vspace" value="" size="3" maxlength="3" onchange="changeAppearance();updateStyle();" />\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr> \r
+                                                       <td class="column1"><label id="hspacelabel" for="hspace">{$lang_insert_image_hspace}</label></td> \r
+                                                       <td><input name="hspace" type="text" id="hspace" value="" size="3" maxlength="3" onchange="changeAppearance();updateStyle();" /></td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label id="borderlabel" for="border">{$lang_insert_image_border}</label></td> \r
+                                                       <td><input id="border" name="border" type="text" value="" size="3" maxlength="3" onchange="changeAppearance();updateStyle();" /></td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label id="classlabel" for="classlist">{$lang_class_name}</label></td>\r
+                                                       <td colspan="2">\r
+                                                                <select id="classlist" name="classlist">\r
+                                                                       <option value="" selected>{$lang_not_set}</option>\r
+                                                                </select>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label id="stylelabel" for="style">{$lang_advimage_style}</label></td> \r
+                                                       <td colspan="2"><input id="style" name="style" type="text" value="" onchange="styleUpdated();" /></td> \r
+                                               </tr>\r
+\r
+                                               <!-- <tr>\r
+                                                       <td class="column1"><label id="classeslabel" for="classes">{$lang_advimage_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>{$lang_advimage_swap_image}</legend>\r
+\r
+                                       <input type="checkbox" id="onmousemovecheck" name="onmousemovecheck" class="checkbox" onclick="changeMouseMove();" />\r
+                                       <label id="onmousemovechecklabel" for="onmousemovecheck">{$lang_advimage_alt_image}</label>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0" width="100%">\r
+                                                       <tr>\r
+                                                               <td class="column1"><label id="onmouseoversrclabel" for="onmouseoversrc">{$lang_advimage_mouseover}</label></td> \r
+                                                               <td><table 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 id="imagelistoverrow">\r
+                                                               <td class="column1"><label for="imagelistover">{$lang_image_list}</label></td>\r
+                                                               <td id="imagelistovercontainer">&nbsp;</td>\r
+                                                       </tr>\r
+                                                       <tr> \r
+                                                               <td class="column1"><label id="onmouseoutsrclabel" for="onmouseoutsrc">{$lang_advimage_mouseout}</label></td> \r
+                                                               <td class="column2"><table 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 id="imagelistoutrow">\r
+                                                               <td class="column1"><label for="imagelistout">{$lang_image_list}</label></td>\r
+                                                               <td id="imagelistoutcontainer">&nbsp;</td>\r
+                                                       </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+\r
+                               <fieldset>\r
+                                       <legend>{$lang_advimage_misc}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td class="column1"><label id="idlabel" for="id">{$lang_advimage_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">{$lang_advimage_langdir}</label></td> \r
+                                                       <td>\r
+                                                               <select id="dir" name="dir" onchange="changeAppearance();"> \r
+                                                                               <option value="">{$lang_not_set}</option> \r
+                                                                               <option value="ltr">{$lang_advimage_ltr}</option> \r
+                                                                               <option value="rtl">{$lang_advimage_rtl}</option> \r
+                                                               </select>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label id="langlabel" for="lang">{$lang_advimage_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">{$lang_advimage_image_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">{$lang_advimage_long_desc}</label></td>\r
+                                                       <td><table 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
+                       <div style="float: left">\r
+                               <input type="button" id="insert" name="insert" value="{$lang_insert}" onclick="insertAction();" />\r
+                       </div>\r
+\r
+                       <div style="float: right">\r
+                               <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="cancelAction();" />\r
+                       </div>\r
+               </div>\r
+    </form>\r
+</body> \r
+</html> \r
diff --git a/webcit/tiny_mce/plugins/advimage/images/sample.gif b/webcit/tiny_mce/plugins/advimage/images/sample.gif
new file mode 100644 (file)
index 0000000..53bf689
Binary files /dev/null and b/webcit/tiny_mce/plugins/advimage/images/sample.gif differ
diff --git a/webcit/tiny_mce/plugins/advimage/jscripts/functions.js b/webcit/tiny_mce/plugins/advimage/jscripts/functions.js
new file mode 100644 (file)
index 0000000..7bae388
--- /dev/null
@@ -0,0 +1,545 @@
+/* Functions for the advimage plugin popup */\r
+\r
+var preloadImg = null;\r
+var orgImageWidth, orgImageHeight;\r
+\r
+function preinit() {\r
+       // Initialize\r
+       tinyMCE.setWindowArg('mce_windowresize', false);\r
+\r
+       // Import external list url javascript\r
+       var url = tinyMCE.getParam("external_image_list_url");\r
+       if (url != null) {\r
+               // Fix relative\r
+               if (url.charAt(0) != '/' && url.indexOf('://') == -1)\r
+                       url = tinyMCE.documentBasePath + "/" + url;\r
+\r
+               document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + url + '"></sc'+'ript>');\r
+       }\r
+}\r
+\r
+function convertURL(url, node, on_save) {\r
+       return eval("tinyMCEPopup.windowOpener." + tinyMCE.settings['urlconverter_callback'] + "(url, node, on_save);");\r
+}\r
+\r
+function getImageSrc(str) {\r
+       var pos = -1;\r
+\r
+       if (!str)\r
+               return "";\r
+\r
+       if ((pos = str.indexOf('this.src=')) != -1) {\r
+               var src = str.substring(pos + 10);\r
+\r
+               src = src.substring(0, src.indexOf('\''));\r
+\r
+               if (tinyMCE.getParam('convert_urls'))\r
+                       src = convertURL(src, null, true);\r
+\r
+               return src;\r
+       }\r
+\r
+       return "";\r
+}\r
+\r
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       var formObj = document.forms[0];\r
+       var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));\r
+       var elm = inst.getFocusElement();\r
+       var action = "insert";\r
+       var html = "";\r
+\r
+       // Image list src\r
+       html = getImageListHTML('imagelistsrc','src','onSelectMainImage');\r
+       if (html == "")\r
+               document.getElementById("imagelistsrcrow").style.display = 'none';\r
+       else\r
+               document.getElementById("imagelistsrccontainer").innerHTML = html;\r
+\r
+       // Image list oversrc\r
+       html = getImageListHTML('imagelistover','onmouseoversrc');\r
+       if (html == "")\r
+               document.getElementById("imagelistoverrow").style.display = 'none';\r
+       else\r
+               document.getElementById("imagelistovercontainer").innerHTML = html;\r
+\r
+       // Image list outsrc\r
+       html = getImageListHTML('imagelistout','onmouseoutsrc');\r
+       if (html == "")\r
+               document.getElementById("imagelistoutrow").style.display = 'none';\r
+       else\r
+               document.getElementById("imagelistoutcontainer").innerHTML = html;\r
+\r
+       // Src browser\r
+       html = getBrowserHTML('srcbrowser','src','image','advimage');\r
+       document.getElementById("srcbrowsercontainer").innerHTML = html;\r
+\r
+       // Over browser\r
+       html = getBrowserHTML('oversrcbrowser','onmouseoversrc','image','advimage');\r
+       document.getElementById("onmouseoversrccontainer").innerHTML = html;\r
+\r
+       // Out browser\r
+       html = getBrowserHTML('outsrcbrowser','onmouseoutsrc','image','advimage');\r
+       document.getElementById("onmouseoutsrccontainer").innerHTML = html;\r
+\r
+       // Longdesc browser\r
+       html = getBrowserHTML('longdescbrowser','longdesc','file','advimage');\r
+       document.getElementById("longdesccontainer").innerHTML = html;\r
+\r
+       // Resize some elements\r
+       if (isVisible('srcbrowser'))\r
+               document.getElementById('src').style.width = '260px';\r
+\r
+       if (isVisible('oversrcbrowser'))\r
+               document.getElementById('onmouseoversrc').style.width = '260px';\r
+\r
+       if (isVisible('outsrcbrowser'))\r
+               document.getElementById('onmouseoutsrc').style.width = '260px';\r
+\r
+       if (isVisible('longdescbrowser'))\r
+               document.getElementById('longdesc').style.width = '180px';\r
+\r
+       // Check action\r
+       if (elm != null && elm.nodeName == "IMG")\r
+               action = "update";\r
+\r
+       formObj.insert.value = tinyMCE.getLang('lang_' + action, 'Insert', true); \r
+\r
+       if (action == "update") {\r
+               var src = tinyMCE.getAttrib(elm, 'src');\r
+               var onmouseoversrc = getImageSrc(tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmouseover')));\r
+               var onmouseoutsrc = getImageSrc(tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmouseout')));\r
+\r
+               src = convertURL(src, elm, true);\r
+\r
+               // Use mce_src if found\r
+               var mceRealSrc = tinyMCE.getAttrib(elm, 'mce_src');\r
+               if (mceRealSrc != "") {\r
+                       src = mceRealSrc;\r
+\r
+                       if (tinyMCE.getParam('convert_urls'))\r
+                               src = convertURL(src, elm, true);\r
+               }\r
+\r
+               if (onmouseoversrc != "" && tinyMCE.getParam('convert_urls'))\r
+                       onmouseoversrc = convertURL(onmouseoversrc, elm, true);\r
+\r
+               if (onmouseoutsrc != "" && tinyMCE.getParam('convert_urls'))\r
+                       onmouseoutsrc = convertURL(onmouseoutsrc, elm, true);\r
+\r
+               // Setup form data\r
+               var style = tinyMCE.parseStyle(tinyMCE.getAttrib(elm, "style"));\r
+\r
+               // Store away old size\r
+               orgImageWidth = trimSize(getStyle(elm, 'width'))\r
+               orgImageHeight = trimSize(getStyle(elm, 'height'));\r
+\r
+               formObj.src.value    = src;\r
+               formObj.alt.value    = tinyMCE.getAttrib(elm, 'alt');\r
+               formObj.title.value  = tinyMCE.getAttrib(elm, 'title');\r
+               formObj.border.value = trimSize(getStyle(elm, 'border', 'borderWidth'));\r
+               formObj.vspace.value = tinyMCE.getAttrib(elm, 'vspace');\r
+               formObj.hspace.value = tinyMCE.getAttrib(elm, 'hspace');\r
+               formObj.width.value  = orgImageWidth;\r
+               formObj.height.value = orgImageHeight;\r
+               formObj.onmouseoversrc.value = onmouseoversrc;\r
+               formObj.onmouseoutsrc.value  = onmouseoutsrc;\r
+               formObj.id.value  = tinyMCE.getAttrib(elm, 'id');\r
+               formObj.dir.value  = tinyMCE.getAttrib(elm, 'dir');\r
+               formObj.lang.value  = tinyMCE.getAttrib(elm, 'lang');\r
+               formObj.longdesc.value  = tinyMCE.getAttrib(elm, 'longdesc');\r
+               formObj.usemap.value  = tinyMCE.getAttrib(elm, 'usemap');\r
+               formObj.style.value  = tinyMCE.serializeStyle(style);\r
+\r
+               // Select by the values\r
+               if (tinyMCE.isMSIE)\r
+                       selectByValue(formObj, 'align', getStyle(elm, 'align', 'styleFloat'));\r
+               else\r
+                       selectByValue(formObj, 'align', getStyle(elm, 'align', 'cssFloat'));\r
+\r
+               addClassesToList('classlist', 'advimage_styles');\r
+\r
+               selectByValue(formObj, 'classlist', tinyMCE.getAttrib(elm, 'class'));\r
+               selectByValue(formObj, 'imagelistsrc', src);\r
+               selectByValue(formObj, 'imagelistover', onmouseoversrc);\r
+               selectByValue(formObj, 'imagelistout', onmouseoutsrc);\r
+\r
+               updateStyle();\r
+               showPreviewImage(src, true);\r
+               changeAppearance();\r
+\r
+               window.focus();\r
+       } else\r
+               addClassesToList('classlist', 'advimage_styles');\r
+\r
+       // If option enabled default contrain proportions to checked\r
+       if (tinyMCE.getParam("advimage_constrain_proportions", true))\r
+               formObj.constrain.checked = true;\r
+\r
+       // Check swap image if valid data\r
+       if (formObj.onmouseoversrc.value != "" || formObj.onmouseoutsrc.value != "")\r
+               setSwapImageDisabled(false);\r
+       else\r
+               setSwapImageDisabled(true);\r
+}\r
+\r
+function setSwapImageDisabled(state) {\r
+       var formObj = document.forms[0];\r
+\r
+       formObj.onmousemovecheck.checked = !state;\r
+\r
+       setBrowserDisabled('overbrowser', state);\r
+       setBrowserDisabled('outbrowser', state);\r
+\r
+       if (formObj.imagelistover)\r
+               formObj.imagelistover.disabled = state;\r
+\r
+       if (formObj.imagelistout)\r
+               formObj.imagelistout.disabled = state;\r
+\r
+       formObj.onmouseoversrc.disabled = state;\r
+       formObj.onmouseoutsrc.disabled  = state;\r
+}\r
+\r
+function setAttrib(elm, 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
+               elm.setAttribute(attrib, value);\r
+\r
+               if (attrib == "style")\r
+                       attrib = "style.cssText";\r
+\r
+               if (attrib == "longdesc")\r
+                       attrib = "longDesc";\r
+\r
+               if (attrib == "width") {\r
+                       attrib = "style.width";\r
+                       value = value + "px";\r
+               }\r
+\r
+               if (attrib == "height") {\r
+                       attrib = "style.height";\r
+                       value = value + "px";\r
+               }\r
+\r
+               if (attrib == "class")\r
+                       attrib = "className";\r
+\r
+               eval('elm.' + attrib + "=value;");\r
+       } else\r
+               elm.removeAttribute(attrib);\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, '&gr;');\r
+\r
+       return ' ' + attrib + '="' + value + '"';\r
+}\r
+\r
+function insertAction() {\r
+       var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));\r
+       var elm = inst.getFocusElement();\r
+       var formObj = document.forms[0];\r
+       var src = formObj.src.value;\r
+       var onmouseoversrc = formObj.onmouseoversrc.value;\r
+       var onmouseoutsrc = formObj.onmouseoutsrc.value;\r
+\r
+       if (tinyMCE.getParam("accessibility_warnings")) {\r
+               if (formObj.alt.value == "") {\r
+                       var answer = confirm(tinyMCE.getLang('lang_advimage_missing_alt', '', true));\r
+                       if (answer == true) {\r
+                               formObj.alt.value = " ";\r
+                       }\r
+               } else {\r
+                       var answer = true;\r
+               }\r
+\r
+               if (!answer)\r
+                       return;\r
+       }\r
+\r
+       if (onmouseoversrc && onmouseoversrc != "")\r
+               onmouseoversrc = "this.src='" + convertURL(onmouseoversrc, tinyMCE.imgElement) + "';";\r
+\r
+       if (onmouseoutsrc && onmouseoutsrc != "")\r
+               onmouseoutsrc = "this.src='" + convertURL(onmouseoutsrc, tinyMCE.imgElement) + "';";\r
+\r
+       if (elm != null && elm.nodeName == "IMG") {\r
+               setAttrib(elm, 'src', convertURL(src, tinyMCE.imgElement));\r
+               setAttrib(elm, 'mce_src', src);\r
+               setAttrib(elm, 'alt');\r
+               setAttrib(elm, 'title');\r
+               setAttrib(elm, 'border');\r
+               setAttrib(elm, 'vspace');\r
+               setAttrib(elm, 'hspace');\r
+               setAttrib(elm, 'width');\r
+               setAttrib(elm, 'height');\r
+               setAttrib(elm, 'onmouseover', onmouseoversrc);\r
+               setAttrib(elm, 'onmouseout', onmouseoutsrc);\r
+               setAttrib(elm, 'id');\r
+               setAttrib(elm, 'dir');\r
+               setAttrib(elm, 'lang');\r
+               setAttrib(elm, 'longdesc');\r
+               setAttrib(elm, 'usemap');\r
+               setAttrib(elm, 'style');\r
+               setAttrib(elm, 'class', getSelectValue(formObj, 'classlist'));\r
+               setAttrib(elm, 'align', getSelectValue(formObj, 'align'));\r
+\r
+               //tinyMCEPopup.execCommand("mceRepaint");\r
+\r
+               // Repaint if dimensions changed\r
+               if (formObj.width.value != orgImageWidth || formObj.height.value != orgImageHeight)\r
+                       inst.repaint();\r
+\r
+               // Refresh in old MSIE\r
+               if (tinyMCE.isMSIE5)\r
+                       elm.outerHTML = elm.outerHTML;\r
+       } else {\r
+               var html = "<img";\r
+\r
+               html += makeAttrib('src', convertURL(src, tinyMCE.imgElement));\r
+               html += makeAttrib('mce_src', src);\r
+               html += makeAttrib('alt');\r
+               html += makeAttrib('title');\r
+               html += makeAttrib('border');\r
+               html += makeAttrib('vspace');\r
+               html += makeAttrib('hspace');\r
+               html += makeAttrib('width');\r
+               html += makeAttrib('height');\r
+               html += makeAttrib('onmouseover', onmouseoversrc);\r
+               html += makeAttrib('onmouseout', onmouseoutsrc);\r
+               html += makeAttrib('id');\r
+               html += makeAttrib('dir');\r
+               html += makeAttrib('lang');\r
+               html += makeAttrib('longdesc');\r
+               html += makeAttrib('usemap');\r
+               html += makeAttrib('style');\r
+               html += makeAttrib('class', getSelectValue(formObj, 'classlist'));\r
+               html += makeAttrib('align', getSelectValue(formObj, 'align'));\r
+               html += " />";\r
+\r
+               tinyMCEPopup.execCommand("mceInsertContent", false, html);\r
+       }\r
+\r
+       tinyMCE._setEventsEnabled(inst.getBody(), false);\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function cancelAction() {\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function changeAppearance() {\r
+       var formObj = document.forms[0];\r
+       var img = document.getElementById('alignSampleImg');\r
+\r
+       if (img) {\r
+               img.align = formObj.align.value;\r
+               img.border = formObj.border.value;\r
+               img.hspace = formObj.hspace.value;\r
+               img.vspace = formObj.vspace.value;\r
+       }\r
+}\r
+\r
+function changeMouseMove() {\r
+       var formObj = document.forms[0];\r
+\r
+       setSwapImageDisabled(!formObj.onmousemovecheck.checked);\r
+}\r
+\r
+function updateStyle() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       if (tinyMCE.getParam('inline_styles', false)) {\r
+               st['width'] = formObj.width.value == '' ? '' : formObj.width.value + "px";\r
+               st['height'] = formObj.height.value == '' ? '' : formObj.height.value + "px";\r
+               st['border-width'] = formObj.border.value == '' ? '' : formObj.border.value + "px";\r
+               st['margin-top'] = formObj.vspace.value == '' ? '' : formObj.vspace.value + "px";\r
+               st['margin-bottom'] = formObj.vspace.value == '' ? '' : formObj.vspace.value + "px";\r
+               st['margin-left'] = formObj.hspace.value == '' ? '' : formObj.hspace.value + "px";\r
+               st['margin-right'] = formObj.hspace.value == '' ? '' : formObj.hspace.value + "px";\r
+       } else {\r
+               st['width'] = st['height'] = st['border-width'] = null;\r
+\r
+               if (st['margin-top'] == st['margin-bottom'])\r
+                       st['margin-top'] = st['margin-bottom'] = null;\r
+\r
+               if (st['margin-left'] == st['margin-right'])\r
+                       st['margin-left'] = st['margin-right'] = null;\r
+       }\r
+\r
+       formObj.style.value = tinyMCE.serializeStyle(st);\r
+}\r
+\r
+function styleUpdated() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       if (st['width'])\r
+               formObj.width.value = st['width'].replace('px', '');\r
+\r
+       if (st['height'])\r
+               formObj.height.value = st['height'].replace('px', '');\r
+\r
+       if (st['margin-top'] && st['margin-top'] == st['margin-bottom'])\r
+               formObj.vspace.value = st['margin-top'].replace('px', '');\r
+\r
+       if (st['margin-left'] && st['margin-left'] == st['margin-right'])\r
+               formObj.hspace.value = st['margin-left'].replace('px', '');\r
+\r
+       if (st['border-width'])\r
+               formObj.border.value = st['border-width'].replace('px', '');\r
+}\r
+\r
+function changeHeight() {\r
+       var formObj = document.forms[0];\r
+\r
+       if (!formObj.constrain.checked || !preloadImg) {\r
+               updateStyle();\r
+               return;\r
+       }\r
+\r
+       if (formObj.width.value == "" || formObj.height.value == "")\r
+               return;\r
+\r
+       var temp = (formObj.width.value / preloadImg.width) * preloadImg.height;\r
+       formObj.height.value = temp.toFixed(0);\r
+       updateStyle();\r
+}\r
+\r
+function changeWidth() {\r
+       var formObj = document.forms[0];\r
+\r
+       if (!formObj.constrain.checked || !preloadImg) {\r
+               updateStyle();\r
+               return;\r
+       }\r
+\r
+       if (formObj.width.value == "" || formObj.height.value == "")\r
+               return;\r
+\r
+       var temp = (formObj.height.value / preloadImg.height) * preloadImg.width;\r
+       formObj.width.value = temp.toFixed(0);\r
+       updateStyle();\r
+}\r
+\r
+function onSelectMainImage(target_form_element, name, value) {\r
+       var formObj = document.forms[0];\r
+\r
+       formObj.alt.value = name;\r
+       formObj.title.value = name;\r
+\r
+       resetImageData();\r
+       showPreviewImage(formObj.elements[target_form_element].value, false);\r
+}\r
+\r
+function showPreviewImage(src, start) {\r
+       var formObj = document.forms[0];\r
+\r
+       selectByValue(document.forms[0], 'imagelistsrc', src);\r
+\r
+       var elm = document.getElementById('prev');\r
+       var src = src == "" ? src : tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], src);\r
+\r
+       if (!start && tinyMCE.getParam("advimage_update_dimensions_onchange", true))\r
+               resetImageData();\r
+\r
+       if (src == "")\r
+               elm.innerHTML = "";\r
+       else\r
+               elm.innerHTML = '<img src="' + src + '" border="0" />'\r
+\r
+       getImageData(src);\r
+}\r
+\r
+function getImageData(src) {\r
+       preloadImg = new Image();\r
+\r
+       tinyMCE.addEvent(preloadImg, "load", updateImageData);\r
+       tinyMCE.addEvent(preloadImg, "error", resetImageData);\r
+\r
+       preloadImg.src = src;\r
+}\r
+\r
+function updateImageData() {\r
+       var formObj = document.forms[0];\r
+\r
+       if (formObj.width.value == "")\r
+               formObj.width.value = preloadImg.width;\r
+\r
+       if (formObj.height.value == "")\r
+               formObj.height.value = preloadImg.height;\r
+\r
+       updateStyle();\r
+}\r
+\r
+function resetImageData() {\r
+       var formObj = document.forms[0];\r
+       formObj.width.value = formObj.height.value = "";        \r
+}\r
+\r
+function getSelectValue(form_obj, field_name) {\r
+       var elm = form_obj.elements[field_name];\r
+\r
+       if (elm == null || elm.options == null)\r
+               return "";\r
+\r
+       return elm.options[elm.selectedIndex].value;\r
+}\r
+\r
+function getImageListHTML(elm_id, target_form_element, onchange_func) {\r
+       if (typeof(tinyMCEImageList) == "undefined" || tinyMCEImageList.length == 0)\r
+               return "";\r
+\r
+       var html = "";\r
+\r
+       html += '<select id="' + elm_id + '" name="' + elm_id + '"';\r
+       html += ' class="mceImageList" onfocus="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<tinyMCEImageList.length; i++)\r
+               html += '<option value="' + tinyMCEImageList[i][1] + '">' + tinyMCEImageList[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
+// While loading\r
+preinit();\r
diff --git a/webcit/tiny_mce/plugins/advimage/langs/cs.js b/webcit/tiny_mce/plugins/advimage/langs/cs.js
new file mode 100644 (file)
index 0000000..9dd373d
--- /dev/null
@@ -0,0 +1,8 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+insert_image_alt2 : 'Název obrázku',\r
+insert_image_onmousemove : 'Alternativní obrázek',\r
+insert_image_mouseover : 'pøi najetí my\9ai',\r
+insert_image_mouseout : 'pøi odjetí my\9ai'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advimage/langs/cy.js b/webcit/tiny_mce/plugins/advimage/langs/cy.js
new file mode 100644 (file)
index 0000000..8ca5b56
--- /dev/null
@@ -0,0 +1,27 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('advimage',{\r
+tab_general : 'Cyffredinol',\r
+tab_appearance : 'Ymddangosiad',\r
+tab_advanced : 'Uwch',\r
+general : 'Cyffredinol',\r
+title : 'Teitl',\r
+preview : 'Rhagolwg',\r
+constrain_proportions : 'Cadw cymesuredd',\r
+langdir : 'Cyfeiriad iaith',\r
+langcode : 'C&ocirc;d iaith',\r
+long_desc : 'Dolen disgrifiad hir',\r
+style : 'Arddull',\r
+classes : 'Dosbarthiadau',\r
+ltr : 'Chwith i\'r dde',\r
+rtl : 'Dde i\'r chwith',\r
+id : 'Id',\r
+image_map : 'Map delwedd',\r
+swap_image : 'Cyfnewid delwedd',\r
+alt_image : 'Delwedd amgen',\r
+mouseover : 'llygoden drosodd',\r
+mouseout : 'llygoden allan',\r
+misc : 'Arall',\r
+example_img : 'Delwedd&nbsp;rhagolwg&nbsp;delwedd',\r
+missing_alt : 'Wyt ti\'n sicr eisiau parhau heb gynnwys Disgrifiad Delwedd? Heb un, mae\'n bosib na fydd y ddelwedd yn hygyrch i ddefnyddwyr gydag anableddau, neu rhai gyda phorwr testun, neu sy\'n pori gyda delweddau wedi\'u diffodd.'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advimage/langs/da.js b/webcit/tiny_mce/plugins/advimage/langs/da.js
new file mode 100644 (file)
index 0000000..acd488b
--- /dev/null
@@ -0,0 +1,26 @@
+// DK lang variables contributed by Jan Moelgaard\r
+\r
+tinyMCE.addToLang('advimage',{\r
+tab_general : 'Generelt',\r
+tab_appearance : 'Udseende',\r
+tab_advanced : 'Avanceret',\r
+general : 'Generelt',\r
+title : 'Overskrift',\r
+preview : 'Se',\r
+constrain_proportions : 'Fasthold proportioner',\r
+langdir : 'Tekstretning',\r
+langcode : 'Sprogkode',\r
+long_desc : 'Langt beskrivelseslink',\r
+style : 'Style',\r
+classes : 'Klasser',\r
+ltr : 'Venstre til h&#248;jre',\r
+rtl : 'H&#248;jre til venstre',\r
+id : 'Id',\r
+image_map : 'Billedkort',\r
+swap_image : 'Alternativt billede',\r
+alt_image : 'Alternative image',\r
+mouseover : 'ved mouse over',\r
+mouseout : 'ved mouse out',\r
+misc : 'Diverse',\r
+example_img : 'Appearance&nbsp;preview&nbsp;image'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advimage/langs/de.js b/webcit/tiny_mce/plugins/advimage/langs/de.js
new file mode 100644 (file)
index 0000000..52c2de8
--- /dev/null
@@ -0,0 +1,27 @@
+// DE lang variables\r
+\r
+tinyMCE.addToLang('advimage',{\r
+tab_general : 'Allgemein',\r
+tab_appearance : 'Erscheinungsbild',\r
+tab_advanced : 'Erweitert',\r
+general : 'Allgemein',\r
+title : 'Titel',\r
+preview : 'Vorschau',\r
+constrain_proportions : 'Verh&auml;ltnis beibehalten',\r
+langdir : 'Sprachrichtung',\r
+langcode : 'Sprach-Code',\r
+long_desc : 'Link zu ausf&uuml;hrlicher Beschreibung',\r
+style : 'CSS-Stil',\r
+classes : 'CSS-Klassen',\r
+ltr : 'Von links nach rechts',\r
+rtl : 'Von rechts nach links',\r
+id : 'ID',\r
+image_map : 'Image Map (Bild mit sensitiven Bereichen)',\r
+swap_image : 'Bild austauschen',\r
+alt_image : 'Alternatives Bild',\r
+mouseover : 'f&uuml;r Mouse-Over',\r
+mouseout : 'f&uuml;r Mouse-Out',\r
+misc : 'Sonstiges',\r
+example_img : 'Erscheinungsbild&nbsp;Vorschau&nbsp;Bild',\r
+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.'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advimage/langs/en.js b/webcit/tiny_mce/plugins/advimage/langs/en.js
new file mode 100644 (file)
index 0000000..ffd7e30
--- /dev/null
@@ -0,0 +1,27 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('advimage',{\r
+tab_general : 'General',\r
+tab_appearance : 'Appearance',\r
+tab_advanced : 'Advanced',\r
+general : 'General',\r
+title : 'Title',\r
+preview : 'Preview',\r
+constrain_proportions : 'Constrain proportions',\r
+langdir : 'Language direction',\r
+langcode : 'Language code',\r
+long_desc : 'Long description link',\r
+style : 'Style',\r
+classes : 'Classes',\r
+ltr : 'Left to right',\r
+rtl : 'Right to left',\r
+id : 'Id',\r
+image_map : 'Image map',\r
+swap_image : 'Swap image',\r
+alt_image : 'Alternative image',\r
+mouseover : 'for mouse over',\r
+mouseout : 'for mouse out',\r
+misc : 'Miscellaneous',\r
+example_img : 'Appearance&nbsp;preview&nbsp;image',\r
+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.'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advimage/langs/es.js b/webcit/tiny_mce/plugins/advimage/langs/es.js
new file mode 100644 (file)
index 0000000..f95fe59
--- /dev/null
@@ -0,0 +1,35 @@
+/**\r
+ * ES lang variables\r
+ * \r
+ * Authors : Alvaro Velasco,\r
+ *           Adolfo Sanz De Diego (asanzdiego) <asanzdiego@yahoo.es>,\r
+ *           Carlos C Soto (eclipxe) <csoto@sia-solutions.com>\r
+ * Last Updated : October 17, 2005\r
+ * TinyMCE Version : 2.0RC3\r
+ */\r
+\r
+tinyMCE.addToLang('advimage',{\r
+tab_general : 'General',\r
+tab_appearance : 'Aspecto',\r
+tab_advanced : 'Avanzado',\r
+general : 'General',\r
+title : 'Titulo',\r
+preview : 'Vista previa',\r
+constrain_proportions : 'Bloquear relación de aspecto',\r
+langdir : 'Dirección del texto',\r
+langcode : 'Código del idioma',\r
+long_desc : 'Descripción larga del link',\r
+style : 'Estilo',\r
+classes : 'Clases',\r
+ltr : 'De izquierda a derecha',\r
+rtl : 'De derecha a izquierda',\r
+id : 'Id',\r
+image_map : 'Mapa de la imagen',\r
+swap_image : 'Intercambio de imagen',\r
+alt_image : 'Imagen alternativa',\r
+mouseover : 'Al pasar el ratón por encima de la imagen',\r
+mouseout : 'Al sacar el ratón de la imagen',\r
+misc : 'Misceláneo',\r
+example_img : 'Aspecto&nbsp;vista previa&nbsp;imagen',\r
+missing_alt : '¿Estás seguro de querer continuar sin incluir una descripción de la imagen? Sin ella la imagen puede no ser accesible para ciertos usuarios discapacitados, o para los usuarios que usen navegadores de texto, o para los usuarios que tengan las imagenes desactivadas en su navegador.'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advimage/langs/fa.js b/webcit/tiny_mce/plugins/advimage/langs/fa.js
new file mode 100644 (file)
index 0000000..48dbe97
--- /dev/null
@@ -0,0 +1,13 @@
+// IR lang variables\r
+// Persian (Farsi) language pack (for IRAN)\r
+// By: Morteza Zafari\r
+// Lost@LostLord.com\r
+// http://www.LostLord.com\r
+\r
+tinyMCE.addToLang('',{\r
+dir : 'rtl',\r
+insert_image_alt2 : '????? ???',\r
+insert_image_onmousemove : '??? ???????',\r
+insert_image_mouseover : '??? ??????? ????? ???? ?????? ????',\r
+insert_image_mouseout : '??? ??????? ????? ???? ?????? ????'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advimage/langs/fa_ca.js b/webcit/tiny_mce/plugins/advimage/langs/fa_ca.js
new file mode 100644 (file)
index 0000000..4779ba0
--- /dev/null
@@ -0,0 +1,8 @@
+// CA_FR lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+insert_image_alt2 : 'Titre de l\'image',\r
+insert_image_onmousemove : 'Image alternative',\r
+insert_image_mouseover : 'pour le «mouse over»',\r
+insert_image_mouseout : 'pour le «mouse out»'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advimage/langs/fr.js b/webcit/tiny_mce/plugins/advimage/langs/fr.js
new file mode 100644 (file)
index 0000000..5adc816
--- /dev/null
@@ -0,0 +1,47 @@
+// French lang variables by Laurent Dran\r
+// Modifié par Normand Lamoureux le 2005-11-12\r
+\r
+tinyMCE.addToLang('advlink',{\r
+general_tab : 'Général',\r
+popup_tab : 'Pop-up',\r
+events_tab : 'Événements',\r
+advanced_tab : 'Avancé',\r
+general_props : 'Propriétés générales',\r
+popup_props : 'Propriétés du pop-up',\r
+event_props : 'Événements',\r
+advanced_props : 'Propriétés avancées',\r
+popup_opts : 'Options',\r
+anchor_names : 'Ancres',\r
+target_same : 'Ovrir dans la même fenêtre/cadre',\r
+target_parent : 'Ouvrir dans la fenêtre/cadre parent',\r
+target_top : 'Ouvrir dans la fenêtre principale',\r
+target_blank : 'Ouvrir dans une nouvelle fenêtre',\r
+popup : 'Pop-up Javascript',\r
+popup_url : 'URL du pop-up',\r
+popup_name : 'Nom de la fenêtre',\r
+popup_return : 'Insérer \'return false;\'',\r
+popup_scrollbars : 'Montrer les barres de défilement',\r
+popup_statusbar : 'Montrer la barre de statut',\r
+popup_toolbar : 'Montrer la barre d\'outils',\r
+popup_menubar : 'Montrer la barre de menus',\r
+popup_location : 'Montrer la barre de titre',\r
+popup_resizable : 'Permettre le redimensionnement',\r
+popup_dependent : 'Dépendent (Mozilla/Firefox seulement)',\r
+popup_size : 'Taille',\r
+popup_position : 'Position (X/Y)',\r
+id : 'Id',\r
+style: 'Style en ligne',\r
+classes : 'Classe CSS',\r
+target_name : 'Nom de la cible',\r
+langdir : 'Sens d\'écriture',\r
+target_langcode : 'Code de langue de la cible',\r
+langcode : 'Code de langue du libellé',\r
+encoding : 'Encodage de la cible',\r
+mime : 'Type MIME de la cible',\r
+rel : 'Relation de la page vers la cible',\r
+rev : 'Relation de la cible vers la page',\r
+tabindex : 'Attribut tabindex',\r
+accesskey : 'Attribut accesskey',\r
+ltr : 'Vers la droite',\r
+rtl : 'Vers la gauche'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advimage/langs/fr_ca.js b/webcit/tiny_mce/plugins/advimage/langs/fr_ca.js
new file mode 100644 (file)
index 0000000..4779ba0
--- /dev/null
@@ -0,0 +1,8 @@
+// CA_FR lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+insert_image_alt2 : 'Titre de l\'image',\r
+insert_image_onmousemove : 'Image alternative',\r
+insert_image_mouseover : 'pour le «mouse over»',\r
+insert_image_mouseout : 'pour le «mouse out»'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advimage/langs/he.js b/webcit/tiny_mce/plugins/advimage/langs/he.js
new file mode 100644 (file)
index 0000000..ecb163f
--- /dev/null
@@ -0,0 +1,27 @@
+// HE lang variables\r
+\r
+tinyMCE.addToLang('advimage',{\r
+tab_general : 'ëììé',\r
+tab_appearance : 'îøàä',\r
+tab_advanced : 'îú÷ãí',\r
+general : 'ëììé',\r
+title : 'ëåúøú',\r
+preview : 'úöåâä î÷ãéîä',\r
+constrain_proportions : 'äâáìú îéîãéí',\r
+langdir : 'ëéååï ùôä',\r
+langcode : '÷åã ùôä',\r
+long_desc : '÷éùåø ìäñáø àøåê',\r
+style : 'ñâðåï',\r
+classes : 'Classéí',\r
+ltr : 'ùîàì ìéîéï',\r
+rtl : 'éîéï ìùîàì',\r
+id : 'Id',\r
+image_map : 'îôú úîåðä',\r
+swap_image : 'äçìôú úîåðä',\r
+alt_image : 'úîåðä çìåôéú',\r
+mouseover : 'ëùñîï äòëáø îòì äúîåðä',\r
+mouseout : 'ëùñîï äòëáø òåæá àú äúîåðä',\r
+misc : 'àçø',\r
+example_img : 'úöåâä&nbsp;î÷ãéîä&nbsp;ùì&nbsp;îøàä',\r
+missing_alt : 'äàí àúä áèåç ùáøöåðê ìäîùéê îáìé ìëìåì úéàåø ùì äúîåðä? ììà úéàåø, éúëï ëé äúîåðä ìà úäéä ðâéùä ìîùúîùéí áòìé îåâáìåéåú, àå ëàìå äîùúîùéí áãôãôï è÷ñèåàìé, àå ùîñééøéí áøùú áìé ìäöéâ úîåðåú.'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advimage/langs/hu.js b/webcit/tiny_mce/plugins/advimage/langs/hu.js
new file mode 100644 (file)
index 0000000..1980e8d
--- /dev/null
@@ -0,0 +1,27 @@
+// HU lang variables\r
+\r
+tinyMCE.addToLang('advimage',{\r
+tab_general : 'Általános',\r
+tab_appearance : 'Megjelenés',\r
+tab_advanced : 'Haladó',\r
+general : 'Általános',\r
+title : 'Cím',\r
+preview : 'Elõnézet',\r
+constrain_proportions : 'Arányok kényszerítése',\r
+langdir : 'Szöveg pozíció',\r
+langcode : 'Szöveg kód',\r
+long_desc : 'Hosszú leírás link',\r
+style : 'Stílus',\r
+classes : 'Osztályok',\r
+ltr : 'Balról jobbra',\r
+rtl : 'Jobbról balra',\r
+id : 'Azonosító',\r
+image_map : 'Kép térkép',\r
+swap_image : 'Kép váltás',\r
+alt_image : 'Másik kép',\r
+mouseover : 'egér rámutatásra',\r
+mouseout : 'egér elmozdítására',\r
+misc : 'Egyéb',\r
+example_img : 'Elõnézeti&nbsp;kép&nbsp;megjelenése',\r
+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.'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advimage/langs/is.js b/webcit/tiny_mce/plugins/advimage/langs/is.js
new file mode 100644 (file)
index 0000000..bae47b1
--- /dev/null
@@ -0,0 +1,27 @@
+// Iceland lang variables by Johannes Birgir Jensson\r
+\r
+tinyMCE.addToLang('advimage',{\r
+tab_general : 'A&eth;alstillingar',\r
+tab_appearance : '&Uacute;tlit',\r
+tab_advanced : 'Fl&oacute;knari valkostir',\r
+general : 'Helstu uppl&yacute;singar',\r
+title : 'Titill',\r
+preview : 'Forsko&eth;un',\r
+constrain_proportions : 'Vernda hlutf&ouml;ll',\r
+langdir : 'Rith&aacute;ttur tungum&aacute;ls',\r
+langcode : 'Tungum&aacute;lsk&oacute;&eth;i',\r
+long_desc : 'Tengill &aacute; &iacute;tarl&yacute;singu',\r
+style : 'St&iacute;ll',\r
+classes : 'Klassi',\r
+ltr : 'Vinstri til h&aelig;gri',\r
+rtl : 'H&aelig;gri til vinstri',\r
+id : 'Id',\r
+image_map : 'Myndarkort',\r
+swap_image : 'Skipta mynd',\r
+alt_image : 'Skiptimynd',\r
+mouseover : '&thorn;egar m&uacute;s fer yfir',\r
+mouseout : '&thorn;egar m&uacute;s fer fr&aacute;',\r
+misc : '&Yacute;mislegt',\r
+example_img : 'Forsko&eth;unarmynd',\r
+missing_alt : 'Ertu viss um a&eth; &thorn;&uacute; viljir halda &aacute;fram &aacute;n myndarl&yacute;singar? &Aacute;n hennar munu sumir notendur, eins og fatla&eth;ir e&eth;a me&eth; gamla vafra ekki geta s&eacute;&eth; myndina.'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advimage/langs/ko.js b/webcit/tiny_mce/plugins/advimage/langs/ko.js
new file mode 100644 (file)
index 0000000..70eb4b1
--- /dev/null
@@ -0,0 +1,8 @@
+// KO lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+insert_image_alt2 : '±×¸² Á¦¸ñ',\r
+insert_image_onmousemove : '´ëü À̹ÌÁ&ouml;',\r
+insert_image_mouseover : '¸¶¿ì½º¸¦ ¿Ã·ÈÀ» ¶§',\r
+insert_image_mouseout : '¸¶¿ì½º¸¦ ³»·ÈÀ» ¶§'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advimage/langs/nb.js b/webcit/tiny_mce/plugins/advimage/langs/nb.js
new file mode 100644 (file)
index 0000000..487c592
--- /dev/null
@@ -0,0 +1,27 @@
+// nb = Norwegian (bokm&aring;l) lang variables by Knut B. Jacobsen\r
+\r
+tinyMCE.addToLang('advimage',{\r
+tab_general : 'Generelle innstillinger',\r
+tab_appearance : 'Visuelle innstillinger',\r
+tab_advanced : 'Avanserte innstillinger',\r
+general : 'Generell',\r
+title : 'Tittel',\r
+preview : 'Forh&aring;ndsvisning',\r
+constrain_proportions : 'Behold proporsjonene',\r
+langdir : 'Skrift retning',\r
+langcode : 'Spr&aring;k kode',\r
+long_desc : 'Lang beskrivelse',\r
+style : 'Stil',\r
+classes : 'CSS klasser',\r
+ltr : 'Venstre mot h&oslash;yre',\r
+rtl : 'H&oslash;yre mot venstre',\r
+id : 'Id',\r
+image_map : 'Opprett bilde',\r
+swap_image : 'Bytt bilde',\r
+alt_image : 'Alternativt bilde',\r
+mouseover : 'n&aring;r pekeren er over',\r
+mouseout : 'n&aring;r pekeren er utenfor',\r
+misc : 'Annet',\r
+example_img : 'Forh&aring;ndsvisnings bilde',\r
+missing_alt : 'Er du sikker p&aring; at du vil fortsette uten &aring; sette inn en beskrivelse av bildet?'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advimage/langs/nl.js b/webcit/tiny_mce/plugins/advimage/langs/nl.js
new file mode 100644 (file)
index 0000000..15ca4aa
--- /dev/null
@@ -0,0 +1,27 @@
+// NL lang variables\r
+\r
+tinyMCE.addToLang('advimage',{\r
+tab_general : 'Algemeen',\r
+tab_appearance : 'Beeld',\r
+tab_advanced : 'Geavanceerd',\r
+general : 'Algemeen',\r
+title : 'Titel',\r
+preview : 'Voorbeeld',\r
+constrain_proportions : 'Verhoudingen behouden',\r
+langdir : 'Taalrichting',\r
+langcode : 'Taalcode',\r
+long_desc : 'Link naar lange omschrijving',\r
+style : 'Stijl',\r
+classes : 'Stijlen',\r
+ltr : 'Links naar rechts',\r
+rtl : 'Rechts naar links',\r
+id : 'Id',\r
+image_map : 'Afbeelding opdelen',\r
+swap_image : 'Afbeelding wisselen',\r
+alt_image : 'Alternatieve afbeelding',\r
+mouseover : 'voor muis-over',\r
+mouseout : 'voor muis-uit',\r
+misc : 'Diversen',\r
+example_img : 'Voorbeeld&nbsp;afbeelding',\r
+missing_alt : 'Zonder een beschrijving van de afbeelding, zal de pagina voor mensen met een visuele handicap of met afbeeldingen uitgeschakeld niet toegankelijk zijn. Weet u zeker dat u wilt doorgaan zonder beschrijving?'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advimage/langs/nn.js b/webcit/tiny_mce/plugins/advimage/langs/nn.js
new file mode 100644 (file)
index 0000000..67ba306
--- /dev/null
@@ -0,0 +1,27 @@
+// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen\r
+\r
+tinyMCE.addToLang('advimage',{\r
+tab_general : 'Generelle innstillinger',\r
+tab_appearance : 'Visuelle innstillinger',\r
+tab_advanced : 'Avanserte innstillinger',\r
+general : 'Generell',\r
+title : 'Tittel',\r
+preview : 'Forh&aring;ndsvisning',\r
+constrain_proportions : 'Behold proporsjonene',\r
+langdir : 'Skrift retning',\r
+langcode : 'Spr&aring;k kode',\r
+long_desc : 'Lang beskrivelse',\r
+style : 'Stil',\r
+classes : 'CSS klasser',\r
+ltr : 'Venstre mot h&oslash;gre',\r
+rtl : 'H&oslash;gre mot venstre',\r
+id : 'Id',\r
+image_map : 'Opprett bilde',\r
+swap_image : 'Bytt bilde',\r
+alt_image : 'Alternativt bilde',\r
+mouseover : 'n&aring;r pekeren er over',\r
+mouseout : 'n&aring;r pekeren er utenfor',\r
+misc : 'Annet',\r
+example_img : 'Forh&aring;ndsvisningsbilde',\r
+missing_alt : 'Er du sikker p&aring; at du vil fortsette uten &aring; sette inn ein beskrivelse av bildet?'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advimage/langs/pl.js b/webcit/tiny_mce/plugins/advimage/langs/pl.js
new file mode 100644 (file)
index 0000000..0fce7f7
--- /dev/null
@@ -0,0 +1,28 @@
+// PL lang variables\r
+// fixed by lemiel 14.11.2005\r
+\r
+tinyMCE.addToLang('advimage',{\r
+tab_general : 'G³ówne ustawienia',\r
+tab_appearance : 'Widok',\r
+tab_advanced : 'Zaawansowane',\r
+general : 'G³ówne',\r
+title : 'Tytu³',\r
+preview : 'Podgl±d',\r
+constrain_proportions : 'Zachowaj proporcje',\r
+langdir : 'Kierunek tekstu',\r
+langcode : 'Kod jêzyka',\r
+long_desc : 'D³ugi opis linku',\r
+style : 'Styl',\r
+classes : 'Klasy',\r
+ltr : 'Lewy do prawego',\r
+rtl : 'Prawy do lewego',\r
+id : 'Id',\r
+image_map : 'Mapa obrazka',\r
+swap_image : 'Podmiana obrazka',\r
+alt_image : 'Alternatywny obrazek',\r
+mouseover : 'gdy myszka nad obrazkiem',\r
+mouseout : 'gdy myszka poza obrazkiem',\r
+misc : 'Ró¿ne',\r
+example_img : 'Przyk³adowy&nbsp;podgl±d&nbsp;obrazka',\r
+missing_alt : 'Czy jeste¶ pewien, ¿e chcesz kontynuowaæ bez zawarcia opisu obrazka? Niektórzy u¿ytkownicy moga u¿ywaæ przegl±darek tekstowych, lub mieæ ograniczenia na wy¶wietlanie grafik, a wtedy Twój obrazek pozostanie dla nich niewidoczny.'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advimage/langs/pt_br.js b/webcit/tiny_mce/plugins/advimage/langs/pt_br.js
new file mode 100644 (file)
index 0000000..841c1dc
--- /dev/null
@@ -0,0 +1,35 @@
+/**\r
+ * pt_br lang variables\r
+ * Brazilian Portuguese\r
+ *\r
+ * Authors : ????\r
+ * Revision and modifications:\r
+ *           Marcio Barbosa (mpg) <mpg@mpg.com.br>\r
+ * Last Updated : November 26, 2005\r
+ * TinyMCE Version : 2.0RC4\r
+ */\r
+tinyMCE.addToLang('advimage',{\r
+tab_general : 'Geral',\r
+tab_appearance : 'Aparência',\r
+tab_advanced : 'Avançado',\r
+general : 'Geral',\r
+title : 'Título',\r
+preview : 'Visualizar (Preview)',\r
+constrain_proportions : 'Bloquear proporções',\r
+langdir : 'Direção da linguagem',\r
+langcode : 'Código da linguagem',\r
+long_desc : 'Descrição completa do link',\r
+style : 'Estilo',\r
+classes : 'Classes',\r
+ltr : 'Esquerda para direita',\r
+rtl : 'Direita para esquerda',\r
+id : 'Id',\r
+image_map : 'Mapa da imagem',\r
+swap_image : 'Trocar imagem',\r
+alt_image : 'Imagem alternativa',\r
+mouseover : 'para o mouse sobre o link',\r
+mouseout : 'para o mouse fora do link',\r
+misc : 'Miscelânia',\r
+example_img : 'Aparência&nbsp;Visualizar&nbsp;Imagem',\r
+missing_alt : 'Tem certeza que deseja continuar sem incluir uma descrição para imagem? Sem isso a imagem pode não estar acessível para alguns usuários especiáis, ou para aqueles que utilizam um navegador em modo texto, ou para navegadores com imagens desativadas.'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advimage/langs/ru.js b/webcit/tiny_mce/plugins/advimage/langs/ru.js
new file mode 100644 (file)
index 0000000..9cac283
--- /dev/null
@@ -0,0 +1,26 @@
+// RU cp1251 lang variables\r
+\r
+tinyMCE.addToLang('advimage',{\r
+tab_general : 'Îñíîâíûå',\r
+tab_appearance : 'Âèçóàëèçàöèÿ',\r
+tab_advanced : 'Ðàñøèðåííûå',\r
+general : 'Ãëàâíûå',\r
+title : 'Çàãîëîâîê',\r
+preview : 'Ïðåäâàðèòåëüíûé ïðîñìîòð',\r
+constrain_proportions : 'Ñîõðàíèòü ïðîïîðöèè',\r
+langdir : 'Îïèñàíèå ÿçûêà',\r
+langcode : 'Êîä ÿçûêà',\r
+long_desc : 'Ïîëíîå îïèñàíèå',\r
+style : 'Ñòèëè',\r
+classes : 'Êëàññû',\r
+ltr : 'Ñëåâà íàïðàâî',\r
+rtl : 'Ñïðàâà íàëåâî',\r
+id : 'Id',\r
+image_map : 'Êàðòà èçîáðàæåíèÿ',\r
+swap_image : 'Ïîäìåíà êàðòèíêè',\r
+alt_image : 'Àëüòåðíàòèâíîå èçîáðàæåíèå',\r
+mouseover : 'ïðè íàâåäåíèè ìûøè',\r
+mouseout : 'êîãäà óâîäèòå ìûøü',\r
+misc : 'Ïðî÷åå',\r
+example_img : 'Âèçóàëèçàöèÿ&nbsp;ðàñïîëîæåíèÿ&nbsp;êàðòèíêè'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advimage/langs/ru_KOI8-R.js b/webcit/tiny_mce/plugins/advimage/langs/ru_KOI8-R.js
new file mode 100644 (file)
index 0000000..cc20475
--- /dev/null
@@ -0,0 +1,26 @@
+// RU KOI8-R lang variables\r
+\r
+tinyMCE.addToLang('advimage',{\r
+tab_general : 'ïÓÎÏ×ÎÙÅ',\r
+tab_appearance : '÷ÉÚÕÁÌÉÚÁÃÉÑ',\r
+tab_advanced : 'òÁÓÛÉÒÅÎÎÙÅ',\r
+general : 'çÌÁ×ÎÙÅ',\r
+title : 'úÁÇÏÌÏ×ÏË',\r
+preview : 'ðÒÅÄ×ÁÒÉÔÅÌØÎÙÊ ÐÒÏÓÍÏÔÒ',\r
+constrain_proportions : 'óÏÈÒÁÎÉÔØ ÐÒÏÐÏÒÃÉÉ',\r
+langdir : 'ïÐÉÓÁÎÉÅ ÑÚÙËÁ',\r
+langcode : 'ëÏÄ ÑÚÙËÁ',\r
+long_desc : 'ðÏÌÎÏÅ ÏÐÉÓÁÎÉÅ',\r
+style : 'óÔÉÌÉ',\r
+classes : 'ëÌÁÓÓÙ',\r
+ltr : 'óÌÅ×Á ÎÁÐÒÁ×Ï',\r
+rtl : 'óÐÒÁ×Á ÎÁÌÅ×Ï',\r
+id : 'Id',\r
+image_map : 'ëÁÒÔÁ ÉÚÏÂÒÁÖÅÎÉÑ',\r
+swap_image : 'ðÏÄÍÅÎÁ ËÁÒÔÉÎËÉ',\r
+alt_image : 'áÌØÔÅÒÎÁÔÉ×ÎÏÅ ÉÚÏÂÒÁÖÅÎÉÅ',\r
+mouseover : 'ÐÒÉ ÎÁ×ÅÄÅÎÉÉ ÍÙÛÉ',\r
+mouseout : 'ËÏÇÄÁ Õ×ÏÄÉÔÅ ÍÙÛØ',\r
+misc : 'ðÒÏÞÅÅ',\r
+example_img : '÷ÉÚÕÁÌÉÚÁÃÉÑ&nbsp;ÒÁÓÐÏÌÏÖÅÎÉÑ&nbsp;ËÁÒÔÉÎËÉ'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advimage/langs/ru_UTF-8.js b/webcit/tiny_mce/plugins/advimage/langs/ru_UTF-8.js
new file mode 100644 (file)
index 0000000..04c6128
--- /dev/null
@@ -0,0 +1,26 @@
+// RU UTF-8 lang variables\r
+\r
+tinyMCE.addToLang('advimage',{\r
+tab_general : 'Основные',\r
+tab_appearance : 'Визуализация',\r
+tab_advanced : 'Расширенные',\r
+general : 'Главные',\r
+title : 'Заголовок',\r
+preview : 'Предварительный просмотр',\r
+constrain_proportions : 'Сохранить пропорции',\r
+langdir : 'Описание языка',\r
+langcode : 'Код языка',\r
+long_desc : 'Полное описание',\r
+style : 'Стили',\r
+classes : 'Классы',\r
+ltr : 'Слева направо',\r
+rtl : 'Справа налево',\r
+id : 'Id',\r
+image_map : 'Карта изображения',\r
+swap_image : 'Подмена картинки',\r
+alt_image : 'Альтернативное изображение',\r
+mouseover : 'при наведении мыши',\r
+mouseout : 'когда уводите мышь',\r
+misc : 'Прочее',\r
+example_img : 'Визуализация&nbsp;расположения&nbsp;картинки'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advimage/langs/sk.js b/webcit/tiny_mce/plugins/advimage/langs/sk.js
new file mode 100644 (file)
index 0000000..d5d4d61
--- /dev/null
@@ -0,0 +1,16 @@
+/**\r
+ * Slovak lang variables \r
+ * encoding: utf-8\r
+ * \r
+ * @author Vladimir VASIL vvasil@post.sk\r
+ *    \r
+ * $Id: sk.js,v 1.1 2005/11/22 20:56:44 spocke Exp $ \r
+ */  \r
+\r
+\r
+tinyMCE.addToLang('',{\r
+insert_image_alt2 : 'Názov obrázku',\r
+insert_image_onmousemove : 'Alternatívny obrázok',\r
+insert_image_mouseover : 'pri najet? myšou',\r
+insert_image_mouseout : 'pri odjet? myšou'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advimage/langs/sv.js b/webcit/tiny_mce/plugins/advimage/langs/sv.js
new file mode 100644 (file)
index 0000000..b4cb179
--- /dev/null
@@ -0,0 +1,27 @@
+// SE lang variables\r
+\r
+tinyMCE.addToLang('advimage',{\r
+tab_general : 'Generella inst&auml;llningar',\r
+tab_appearance : 'Visuella inst&auml;llningar',\r
+tab_advanced : 'Avancerade inst&auml;llningar',\r
+general : 'Generella',\r
+title : 'Titel',\r
+preview : 'F&ouml;rhandsgranskning',\r
+constrain_proportions : 'Beh&aring;ll proportionerna',\r
+langdir : 'Skrift riktning',\r
+langcode : 'Spr&aring;k k&aring;d',\r
+long_desc : 'Long beskrivning',\r
+style : 'Stil',\r
+classes : 'CSS Classer',\r
+ltr : 'V&auml;nster till h&ouml;ger',\r
+rtl : 'H&ouml;ger till v&auml;nster',\r
+id : 'Id',\r
+image_map : 'Bild karta',\r
+swap_image : 'Byt bild',\r
+alt_image : 'Alternativ bild',\r
+mouseover : 'n&auml;r pekaren &auml;r &ouml;ver',\r
+mouseout : 'n&auml;r pekaren &auml;r utanf&ouml;r',\r
+misc : '&Ouml;vrigt',\r
+example_img : 'F&ouml;rhandsgransknings bild',\r
+missing_alt : '&Auml;r du s&auml;ker p&aring; att du vill forts&auml;tta utan att skriva en bild beskrivning. Utan en alternativ beskrivning &auml;r bilden inte handikapanpassad.'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advimage/langs/zh_cn.js b/webcit/tiny_mce/plugins/advimage/langs/zh_cn.js
new file mode 100644 (file)
index 0000000..43e5818
--- /dev/null
@@ -0,0 +1,27 @@
+// Simplified Chinese lang variables contributed by tom_cat (thomaswangyang@gmail.com)\r
+\r
+tinyMCE.addToLang('advimage',{\r
+tab_general : 'Ò»°ã',\r
+tab_appearance : 'ÏÔʾ',\r
+tab_advanced : '¸ß¼¶',\r
+general : 'Ò»°ã',\r
+title : '±êÌâ',\r
+preview : 'Ô¤ÀÀ',\r
+constrain_proportions : 'Ô¼ÊøÊôÐÔ',\r
+langdir : 'Êéд·½Ïò',\r
+langcode : 'ÓïÑÔ±àÂë',\r
+long_desc : '³¤ÃèÊöÁ´½Ó',\r
+style : '·ç¸ñ',\r
+classes : 'Àà',\r
+ltr : '´Ó×óÖÁÓÒ',\r
+rtl : '´ÓÓÒÖÁ×ó',\r
+id : '±íʶ',\r
+image_map : 'ͼƬ¶ÔÓ¦',\r
+swap_image : 'µ÷»»Í¼Æ¬',\r
+alt_image : 'ºòѡͼƬ',\r
+mouseover : 'Êó±êÔÚÉÏÃæʱ',\r
+mouseout : 'Êó±êÀ뿪ʱ',\r
+misc : 'ÔÓÏî',\r
+example_img : 'Appearance&nbsp;preview&nbsp;image',\r
+missing_alt : 'ÄúÈ·ÈÏÒªÔÚûÓÐͼƬ˵Ã÷µÄÇé¿öϼÌÐøÂ𣿠ÕâÑùÆäËû¹Ø±ÕͼƬä¯ÀÀµÄÓû§½«ÎÞ·¨×¢Òâµ½ÄãÔÚÕâÀïÓÐͼƬ¡£'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advimage/langs/zh_tw.js b/webcit/tiny_mce/plugins/advimage/langs/zh_tw.js
new file mode 100644 (file)
index 0000000..7cee3c3
--- /dev/null
@@ -0,0 +1,29 @@
+// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// ÁcÅ餤¤å BIG-5 ¡F¼Æ¦ìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com\r
+\r
+\r
+tinyMCE.addToLang('advimage',{\r
+tab_general : '¤@¯ë',\r
+tab_appearance : '¥~Æ[',\r
+tab_advanced : '¶i¶¥',\r
+general : '¤@¯ë',\r
+title : '¼ÐÃD',\r
+preview : '¹wÄý',\r
+constrain_proportions : '¤ñ¨Ò­­¨î',\r
+langdir : '»y¨¥¥Îªk',\r
+langcode : '»y½X',\r
+long_desc : '§¹¾ã»¡©ú³sµ²',\r
+style : '¦¡¼Ë',\r
+classes : '¤ÀÃþ',\r
+ltr : '¥Ñ¥ª¦Ü¥k',\r
+rtl : '¥Ñ¥k¦Ü¥ª',\r
+id : '½s¸¹',\r
+image_map : '¹ÏÀɬM®g',\r
+swap_image : '¹ÏÀɥ洫',\r
+alt_image : '´À¥N¹ÏÀÉ',\r
+mouseover : '·í·Æ¹«²¾¤J',\r
+mouseout : '·í·Æ¹«²¾¥X',\r
+misc : 'Âø¶µ',\r
+example_img : '¥~Æ[&nbsp;¹wÄý&nbsp;¹ÏÀÉ',\r
+missing_alt : '½T©w­n¦b¤£§t¹ÏÀÉ»¡©úªºª¬ªp¤UÄ~Äò°õ¦æ¶Ü¡H\n¨S¦³¹ÏÀÉ»¡©ú¥i¯à·|¾É­P¨º¨Ç¹³¬O¥H¯Â¤å¦rÂsÄý¾¹©Î\nÃö³¬ÂsÄý¾¹¹ÏÀÉÅã²{¥\¯àªº¥Î¤áµLªk¶¶§QŪ¨ú¸ê°T¡C'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advimage/langs/zh_tw_utf8.js b/webcit/tiny_mce/plugins/advimage/langs/zh_tw_utf8.js
new file mode 100644 (file)
index 0000000..32ab67d
--- /dev/null
@@ -0,0 +1,29 @@
+// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// 繁體中文 UTF-8 ;數位應用坊製作; twapweb_AT_gmail_DOT_com\r
+\r
+\r
+tinyMCE.addToLang('advimage',{\r
+tab_general : '一般',\r
+tab_appearance : '外觀',\r
+tab_advanced : '進階',\r
+general : '一般',\r
+title : '標題',\r
+preview : '預覽',\r
+constrain_proportions : '比例限制',\r
+langdir : '語言用法',\r
+langcode : '語碼',\r
+long_desc : '完整說明連結',\r
+style : '式樣',\r
+classes : '分類',\r
+ltr : '由左至右',\r
+rtl : '由右至左',\r
+id : '編號',\r
+image_map : '圖檔映射',\r
+swap_image : '圖檔交換',\r
+alt_image : '替代圖檔',\r
+mouseover : '當滑鼠移入',\r
+mouseout : '當滑鼠移出',\r
+misc : '雜項',\r
+example_img : '外觀&nbsp;預覽&nbsp;圖檔',\r
+missing_alt : '確定要在不含圖檔說明的狀況下繼續執行嗎?\n沒有圖檔說明可能會導致那些像是以純文字瀏覽器或\n關閉瀏覽器圖檔顯現功能的用戶無法順利讀取資訊。'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advimage/readme.txt b/webcit/tiny_mce/plugins/advimage/readme.txt
new file mode 100644 (file)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/webcit/tiny_mce/plugins/advlink/css/advlink.css b/webcit/tiny_mce/plugins/advlink/css/advlink.css
new file mode 100644 (file)
index 0000000..0cb37bd
--- /dev/null
@@ -0,0 +1,35 @@
+/* CSS file for advimage plugin popup */\r
+\r
+.mceLinkList, .mceAnchorList, #targetlist {\r
+       width: 280px;\r
+}\r
+\r
+.mceActionPanel {\r
+       margin-top: 7px;\r
+}\r
+\r
+.panel_wrapper div.current {\r
+       height: 320px;\r
+}\r
+\r
+#classlist, #title, #href {\r
+       width: 280px;\r
+}\r
+\r
+#popupurl, #popupname {\r
+       width: 200px;\r
+}\r
+\r
+#popupwidth, #popupheight, #popupleft, #popuptop {\r
+       width: 30px;\r
+       vertical-align: middle;\r
+       text-align: center;\r
+}\r
+\r
+#id, #style, #classes, #target, #dir, #hreflang, #lang, #charset, #type, #rel, #rev, #tabindex, #accesskey {\r
+       width: 200px;\r
+}\r
+\r
+#events_panel input {\r
+       width: 200px;\r
+}\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..9e2047b
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.importPluginLanguagePack('advlink','en,de,sv,zh_cn,cs,fa,fr_ca,fr,pl,pt_br,nl,he,nb,ru,ru_KOI8-R,ru_UTF-8,nn,cy,es,is,zh_tw,zh_tw_utf8,sk');function TinyMCE_advlink_getInfo(){return{longname:'Advanced link',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_advlink.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_advlink_getControlHTML(control_name){switch(control_name){case "link":var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceAdvLink\');return false;';return '<a href="javascript:'+cmd+'" onclick="'+cmd+'" target="_self" onmousedown="return false;"><img id="{$editor_id}_advlink" src="{$themeurl}/images/link.gif" title="{$lang_link_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreClass(this);" /></a>';}return "";}function TinyMCE_advlink_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mceAdvLink":var anySelection=false;var inst=tinyMCE.getInstanceById(editor_id);var focusElm=inst.getFocusElement();if(tinyMCE.selectedElement)anySelection=(tinyMCE.selectedElement.nodeName.toLowerCase()=="img")||(selectedText&&selectedText.length>0);if(anySelection||(focusElm!=null&&focusElm.nodeName=="A")){var template=new Array();template['file']='../../plugins/advlink/link.htm';template['width']=480;template['height']=400;template['width']+=tinyMCE.getLang('lang_advlink_delta_width',0);template['height']+=tinyMCE.getLang('lang_advlink_delta_height',0);tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes"});}return true;}return false;}function TinyMCE_advlink_handleNodeChange(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){tinyMCE.switchClassSticky(editor_id+'_advlink','mceButtonDisabled',true);if(node==null)return;if(any_selection)tinyMCE.switchClassSticky(editor_id+'_advlink','mceButtonNormal',false);do{if(node.nodeName=="A"&&tinyMCE.getAttrib(node,'href')!="")tinyMCE.switchClassSticky(editor_id+'_advlink','mceButtonSelected',false);}while((node=node.parentNode));return true;}
\ 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..77aecb9
--- /dev/null
@@ -0,0 +1,69 @@
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('advlink', 'en,de,sv,zh_cn,cs,fa,fr_ca,fr,pl,pt_br,nl,he,nb,ru,ru_KOI8-R,ru_UTF-8,nn,cy,es,is,zh_tw,zh_tw_utf8,sk');\r
+\r
+function TinyMCE_advlink_getInfo() {\r
+       return {\r
+               longname : 'Advanced link',\r
+               author : 'Moxiecode Systems',\r
+               authorurl : 'http://tinymce.moxiecode.com',\r
+               infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_advlink.html',\r
+               version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+       };\r
+};\r
+\r
+function TinyMCE_advlink_getControlHTML(control_name) {\r
+       switch (control_name) {\r
+               case "link":\r
+                       var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceAdvLink\');return false;';\r
+                       return '<a href="javascript:' + cmd + '" onclick="' + cmd + '" target="_self" onmousedown="return false;"><img id="{$editor_id}_advlink" src="{$themeurl}/images/link.gif" title="{$lang_link_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreClass(this);" /></a>';\r
+       }\r
+\r
+       return "";\r
+}\r
+\r
+function TinyMCE_advlink_execCommand(editor_id, element, command, user_interface, value) {\r
+       switch (command) {\r
+               case "mceAdvLink":\r
+                       var anySelection = false;\r
+                       var inst = tinyMCE.getInstanceById(editor_id);\r
+                       var focusElm = inst.getFocusElement();\r
+\r
+                       if (tinyMCE.selectedElement)\r
+                               anySelection = (tinyMCE.selectedElement.nodeName.toLowerCase() == "img") || (selectedText && selectedText.length > 0);\r
+\r
+                       if (anySelection || (focusElm != null && focusElm.nodeName == "A")) {\r
+                               var template = new Array();\r
+\r
+                               template['file']   = '../../plugins/advlink/link.htm';\r
+                               template['width']  = 480;\r
+                               template['height'] = 400;\r
+\r
+                               // Language specific width and height addons\r
+                               template['width']  += tinyMCE.getLang('lang_advlink_delta_width', 0);\r
+                               template['height'] += tinyMCE.getLang('lang_advlink_delta_height', 0);\r
+\r
+                               tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes"});\r
+                       }\r
+\r
+                       return true;\r
+       }\r
+\r
+       return false;\r
+}\r
+\r
+function TinyMCE_advlink_handleNodeChange(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {\r
+       tinyMCE.switchClassSticky(editor_id + '_advlink', 'mceButtonDisabled', true);\r
+\r
+       if (node == null)\r
+               return;\r
+\r
+       if (any_selection)\r
+               tinyMCE.switchClassSticky(editor_id + '_advlink', 'mceButtonNormal', false);\r
+\r
+       do {\r
+               if (node.nodeName == "A" && tinyMCE.getAttrib(node, 'href') != "")\r
+                       tinyMCE.switchClassSticky(editor_id + '_advlink', 'mceButtonSelected', false);\r
+       } while ((node = node.parentNode));\r
+\r
+       return true;\r
+}\r
diff --git a/webcit/tiny_mce/plugins/advlink/jscripts/functions.js b/webcit/tiny_mce/plugins/advlink/jscripts/functions.js
new file mode 100644 (file)
index 0000000..538ad6a
--- /dev/null
@@ -0,0 +1,564 @@
+/* Functions for the advlink plugin popup */\r
+\r
+var templates = {\r
+       "window.open" : "window.open('${url}','${target}','${options}')"\r
+};\r
+\r
+function preinit() {\r
+       // Initialize\r
+       tinyMCE.setWindowArg('mce_windowresize', false);\r
+\r
+       // Import external list url javascript\r
+       var url = tinyMCE.getParam("external_link_list_url");\r
+       if (url != null) {\r
+               // Fix relative\r
+               if (url.charAt(0) != '/' && url.indexOf('://') == -1)\r
+                       url = tinyMCE.documentBasePath + "/" + url;\r
+\r
+               document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + url + '"></sc'+'ript>');\r
+       }\r
+}\r
+\r
+function changeClass() {\r
+       var formObj = document.forms[0];\r
+       formObj.classes.value = getSelectValue(formObj, 'classlist');\r
+}\r
+\r
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       var formObj = document.forms[0];\r
+       var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));\r
+       var elm = inst.getFocusElement();\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('linklisthrefcontainer').innerHTML = getLinkListHTML('linklisthref','href');\r
+       document.getElementById('anchorlistcontainer').innerHTML = getAnchorListHTML('anchorlist','href');\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
+       // 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 = tinyMCE.getParentElement(elm, "a");\r
+       if (elm != null && elm.nodeName == "A")\r
+               action = "update";\r
+\r
+       formObj.insert.value = tinyMCE.getLang('lang_' + action, 'Insert', true); \r
+\r
+       setPopupControlsDisabled(true);\r
+\r
+       if (action == "update") {\r
+               var href = tinyMCE.getAttrib(elm, 'href');\r
+\r
+               href = convertURL(href, elm, true);\r
+\r
+               // Use mce_href if found\r
+               var mceRealHref = tinyMCE.getAttrib(elm, 'mce_href');\r
+               if (mceRealHref != "") {\r
+                       href = mceRealHref;\r
+\r
+                       if (tinyMCE.getParam('convert_urls'))\r
+                               href = convertURL(href, elm, true);\r
+               }\r
+\r
+               var onclick = tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onclick'));\r
+\r
+               // Setup form data\r
+               setFormValue('href', href);\r
+               setFormValue('title', tinyMCE.getAttrib(elm, 'title'));\r
+               setFormValue('id', tinyMCE.getAttrib(elm, 'id'));\r
+               setFormValue('style', tinyMCE.serializeStyle(tinyMCE.parseStyle(tinyMCE.getAttrib(elm, "style"))));\r
+               setFormValue('rel', tinyMCE.getAttrib(elm, 'rel'));\r
+               setFormValue('rev', tinyMCE.getAttrib(elm, 'rev'));\r
+               setFormValue('charset', tinyMCE.getAttrib(elm, 'charset'));\r
+               setFormValue('hreflang', tinyMCE.getAttrib(elm, 'hreflang'));\r
+               setFormValue('dir', tinyMCE.getAttrib(elm, 'dir'));\r
+               setFormValue('lang', tinyMCE.getAttrib(elm, 'lang'));\r
+               setFormValue('tabindex', tinyMCE.getAttrib(elm, 'tabindex', typeof(elm.tabindex) != "undefined" ? elm.tabindex : ""));\r
+               setFormValue('accesskey', tinyMCE.getAttrib(elm, 'accesskey', typeof(elm.accesskey) != "undefined" ? elm.accesskey : ""));\r
+               setFormValue('type', tinyMCE.getAttrib(elm, 'type'));\r
+               setFormValue('onfocus', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onfocus')));\r
+               setFormValue('onblur', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onblur')));\r
+               setFormValue('onclick', onclick);\r
+               setFormValue('ondblclick', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'ondblclick')));\r
+               setFormValue('onmousedown', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmousedown')));\r
+               setFormValue('onmouseup', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmouseup')));\r
+               setFormValue('onmouseover', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmouseover')));\r
+               setFormValue('onmousemove', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmousemove')));\r
+               setFormValue('onmouseout', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmouseout')));\r
+               setFormValue('onkeypress', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onkeypress')));\r
+               setFormValue('onkeydown', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onkeydown')));\r
+               setFormValue('onkeyup', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onkeyup')));\r
+               setFormValue('target', tinyMCE.getAttrib(elm, 'target'));\r
+               setFormValue('classes', tinyMCE.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', tinyMCE.getAttrib(elm, 'dir'));\r
+               selectByValue(formObj, 'rel', tinyMCE.getAttrib(elm, 'rel'));\r
+               selectByValue(formObj, 'rev', tinyMCE.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', tinyMCE.getAttrib(elm, 'class'), true);\r
+               selectByValue(formObj, 'targetlist', tinyMCE.getAttrib(elm, 'target'), true);\r
+       } else\r
+               addClassesToList('classlist', 'advlink_styles');\r
+\r
+       window.focus();\r
+}\r
+\r
+function setFormValue(name, value) {\r
+       document.forms[0].elements[name].value = value;\r
+}\r
+\r
+function convertURL(url, node, on_save) {\r
+       return eval("tinyMCEPopup.windowOpener." + tinyMCE.settings['urlconverter_callback'] + "(url, node, on_save);");\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
+       }\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
+               if (tinyMCE.getParam('convert_urls'))\r
+                       url = convertURL(url, null, true);\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 = new Array();\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 new Array();\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 = new Array();\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
+       if (tinyMCE.getParam('convert_urls'))\r
+               url = convertURL(url, null, true);\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
+\r
+function setAttrib(elm, attrib, value) {\r
+       var formObj = document.forms[0];\r
+       var valueElm = formObj.elements[attrib.toLowerCase()];\r
+\r
+       if (typeof(value) == "undefined" || value == null) {\r
+               value = "";\r
+\r
+               if (valueElm)\r
+                       value = valueElm.value;\r
+       }\r
+\r
+       if (value != "") {\r
+               elm.setAttribute(attrib.toLowerCase(), value);\r
+\r
+               if (attrib == "style")\r
+                       attrib = "style.cssText";\r
+\r
+               if (attrib.substring(0, 2) == 'on')\r
+                       value = 'return true;' + value;\r
+\r
+               if (attrib == "class")\r
+                       attrib = "className";\r
+\r
+               eval('elm.' + attrib + "=value;");\r
+       } else\r
+               elm.removeAttribute(attrib);\r
+}\r
+\r
+function getAnchorListHTML(id, target) {\r
+       var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));\r
+       var nodes = inst.getBody().getElementsByTagName("a");\r
+\r
+       var html = "";\r
+\r
+       html += '<select id="' + id + '" name="' + id + '" class="mceAnchorList" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="this.form.' + target + '.value=';\r
+       html += 'this.options[this.selectedIndex].value;">';\r
+       html += '<option value="">---</option>';\r
+\r
+       for (var i=0; i<nodes.length; i++) {\r
+               if ((name = tinyMCE.getAttrib(nodes[i], "name")) != "")\r
+                       html += '<option value="#' + name + '">' + name + '</option>';\r
+       }\r
+\r
+       html += '</select>';\r
+\r
+       return html;\r
+}\r
+\r
+function insertAction() {\r
+       var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));\r
+       var elm = inst.getFocusElement();\r
+\r
+       elm = tinyMCE.getParentElement(elm, "a");\r
+\r
+       tinyMCEPopup.execCommand("mceBeginUndoLevel");\r
+\r
+       // Create new anchor elements\r
+       if (elm == null) {\r
+               if (tinyMCE.isSafari)\r
+                       tinyMCEPopup.execCommand("mceInsertContent", false, '<a href="#mce_temp_url#">' + inst.getSelectedHTML() + '</a>');\r
+               else\r
+                       tinyMCEPopup.execCommand("createlink", false, "#mce_temp_url#");\r
+\r
+               var elementArray = tinyMCE.getElementsByAttributeValue(inst.getBody(), "a", "href", "#mce_temp_url#");\r
+               for (var i=0; i<elementArray.length; i++) {\r
+                       var elm = elementArray[i];\r
+\r
+                       // Move cursor behind the new anchor\r
+                       if (tinyMCE.isGecko) {\r
+                               var sp = inst.getDoc().createTextNode(" ");\r
+\r
+                               if (elm.nextSibling)\r
+                                       elm.parentNode.insertBefore(sp, elm.nextSibling);\r
+                               else\r
+                                       elm.parentNode.appendChild(sp);\r
+\r
+                               // Set range after link\r
+                               var rng = inst.getDoc().createRange();\r
+                               rng.setStartAfter(elm);\r
+                               rng.setEndAfter(elm);\r
+\r
+                               // Update selection\r
+                               var sel = inst.getSel();\r
+                               sel.removeAllRanges();\r
+                               sel.addRange(rng);\r
+                       }\r
+\r
+                       setAllAttribs(elm);\r
+               }\r
+       } else\r
+               setAllAttribs(elm);\r
+\r
+       tinyMCE._setEventsEnabled(inst.getBody(), false);\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;\r
+       var target = getSelectValue(formObj, 'targetlist');\r
+\r
+       // Make anchors absolute\r
+       if (href.charAt(0) == '#')\r
+               href = tinyMCE.settings['document_base_url'] + href;\r
+\r
+       setAttrib(elm, 'href', convertURL(href, elm));\r
+       setAttrib(elm, 'mce_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 == null || elm.options == null)\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" onfocus="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 = tinyMCE.getParam('theme_advanced_link_targets', '').split(';');\r
+       var html = '';\r
+\r
+       html += '<select id="' + elm_id + '" name="' + elm_id + '" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="this.form.' + target_form_element + '.value=';\r
+       html += 'this.options[this.selectedIndex].value;">';\r
+\r
+       html += '<option value="_self">' + tinyMCE.getLang('lang_advlink_target_same') + '</option>';\r
+       html += '<option value="_blank">' + tinyMCE.getLang('lang_advlink_target_blank') + ' (_blank)</option>';\r
+       html += '<option value="_parent">' + tinyMCE.getLang('lang_advlink_target_parent') + ' (_parent)</option>';\r
+       html += '<option value="_top">' + tinyMCE.getLang('lang_advlink_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
diff --git a/webcit/tiny_mce/plugins/advlink/langs/cs.js b/webcit/tiny_mce/plugins/advlink/langs/cs.js
new file mode 100644 (file)
index 0000000..586dce0
--- /dev/null
@@ -0,0 +1,28 @@
+/**\r
+ * Czech lang variables \r
+ * encoding: utf-8\r
+ *  \r
+ * $Id: cs.js,v 1.4 2005/10/18 13:59:42 spocke Exp $ \r
+ */  \r
+\r
+tinyMCE.addToLang('',{\r
+insert_link_target_same : 'Otevřít ve stejném okně/rámu',\r
+insert_link_target_parent : 'Otevřít v rodičovském okně/rámu',\r
+insert_link_target_top : 'Otevřít v nejvyšším rámu (přepíše všechny rámy)',\r
+insert_link_target_blank : 'Otevřít v novém okně',\r
+insert_link_target_named : 'Otevřít v okně',\r
+insert_link_popup : 'JS-Popup',\r
+insert_link_popup_url : 'Popup URL',\r
+insert_link_popup_name : 'Název okna',\r
+insert_link_popup_return : 'Vložit \'return false\'',\r
+insert_link_popup_scrollbars : 'Ukázat posuvníky',\r
+insert_link_popup_statusbar : 'Ukázat stavový řádek',\r
+insert_link_popup_toolbar : 'Ukázat ovládací lištu',\r
+insert_link_popup_menubar : 'Ukázat menu',\r
+insert_link_popup_location : 'Ukázat lištu umístění',\r
+insert_link_popup_resizable : 'Proměnná velikost okna',\r
+insert_link_popup_size : 'Velikost',\r
+insert_link_popup_position : 'Umístění (X/Y)',\r
+insert_link_popup_missingtarget : 'Vložte název cíle nebo vyberte jinou volbu.'\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/advlink/langs/cy.js b/webcit/tiny_mce/plugins/advlink/langs/cy.js
new file mode 100644 (file)
index 0000000..5ad11a1
--- /dev/null
@@ -0,0 +1,46 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('advlink',{\r
+general_tab : 'Cyffredinol',\r
+popup_tab : 'Ffenest Naid',\r
+events_tab : 'Digwyddiadau',\r
+advanced_tab : 'Uwch',\r
+general_props : 'Priodoleddau cyffredinol',\r
+popup_props : 'Priodoleddau ffenest naid',\r
+event_props : 'Digwyddiadau',\r
+advanced_props : 'Priodoleddau uwch',\r
+popup_opts : 'Dewisiadau',\r
+anchor_names : 'Angorau',\r
+target_same : 'Agor yn y ffenest / ffr&acirc;m yma',\r
+target_parent : 'Agor yn rhiant y ffenest / ffr&acirc;m',\r
+target_top : 'Agor yn y ffr&acirc;m uchaf (disodli pob ffr&acirc;m)',\r
+target_blank : 'Agor mewn ffenest newydd',\r
+popup : 'Ffenest naid Javascript',\r
+popup_url : 'URL ffenest naid',\r
+popup_name : 'Enw ffenest',\r
+popup_return : 'Mewnosod \'return false\'',\r
+popup_scrollbars : 'Dangos bariau sgrolio',\r
+popup_statusbar : 'Dangos bar statws',\r
+popup_toolbar : 'Dangos bariau offer',\r
+popup_menubar : 'Dangos bar dewislen',\r
+popup_location : 'Dangos bar lleoliad',\r
+popup_resizable : 'Caniat&aacute;u newid maint y ffenest',\r
+popup_dependent : 'Dibynnol (Mozilla/Firefox yn unig)',\r
+popup_size : 'Maint',\r
+popup_position : 'Lleoliad (X/Y)',\r
+id : 'Id',\r
+style: 'Arddull',\r
+classes : 'Dosbarthiadau',\r
+target_name : 'Enw targed',\r
+langdir : 'Cyfeiriad iaith',\r
+target_langcode : 'Iaith y targed',\r
+langcode : 'C&ocirc;d iaith',\r
+encoding : 'Amgodio testun y targed',\r
+mime : 'Math MIME y targed',\r
+rel : 'Perthynas tudalen i\'r targed',\r
+rev : 'Perthynas targed i\'r dudalen',\r
+tabindex : 'Tabindex',\r
+accesskey : 'Accesskey',\r
+ltr : 'Chwith i\'r dde',\r
+rtl : 'Dde i\'r chwith'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advlink/langs/da.js b/webcit/tiny_mce/plugins/advlink/langs/da.js
new file mode 100644 (file)
index 0000000..511d403
--- /dev/null
@@ -0,0 +1,46 @@
+// DK lang variables contributed by Jan Moelgaard\r
+\r
+tinyMCE.addToLang('advlink',{\r
+general_tab : 'Generelt',\r
+popup_tab : 'Pop up',\r
+events_tab : 'Events',\r
+advanced_tab : 'Avanceret',\r
+general_props : 'Generelle egenskaber',\r
+popup_props : 'Popup egenskaber',\r
+event_props : 'Events',\r
+advanced_props : 'Advancerede egenskaber',\r
+popup_opts : 'Valgmuligheder',\r
+anchor_names : 'Bogm&#230;rker',\r
+target_same : 'Åbn i samme vindue / ramme',\r
+target_parent : 'Åbn i overordnet vindue / ramme',\r
+target_top : 'Åbn i topramme (erstatter alle rammer)',\r
+target_blank : 'Åbn i nyt vindue',\r
+popup : 'Javascript popup',\r
+popup_url : 'Popup adresse',\r
+popup_name : 'Winduets navn',\r
+popup_return : 'Inds&#230;t \'return false\'',\r
+popup_scrollbars : 'Vis scrollbar',\r
+popup_statusbar : 'Vis statuslinje',\r
+popup_toolbar : 'Vis v&#230;rkt&#248;jslinjer',\r
+popup_menubar : 'Vis menulinje',\r
+popup_location : 'Vis adresse',\r
+popup_resizable : 'G&#248;r vinduet skalerbart',\r
+popup_dependent : 'Afh&#230;ngigt (kun ved Mozilla/Firefox)',\r
+popup_size : 'St&#248;rrelse',\r
+popup_position : 'Placering (X/Y)',\r
+id : 'Id',\r
+style: 'Style',\r
+classes : 'Klasser',\r
+target_name : 'Target navn',\r
+langdir : 'Sprogretning',\r
+target_langcode : 'Target sprog',\r
+langcode : 'Sprogkode',\r
+encoding : 'Target karakterkode',\r
+mime : 'Target MIME type',\r
+rel : 'Relation mellem side og target',\r
+rev : 'Relation mellem target og side',\r
+tabindex : 'Tabindex',\r
+accesskey : 'Adgangsn&#248;gle',\r
+ltr : 'Venstre til h&#248;jre',\r
+rtl : 'H&#248;jre til venstre'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advlink/langs/de.js b/webcit/tiny_mce/plugins/advlink/langs/de.js
new file mode 100644 (file)
index 0000000..62c0744
--- /dev/null
@@ -0,0 +1,47 @@
+// DE lang variables\r
+\r
+tinyMCE.addToLang('advlink',{\r
+general_tab : 'Allgemein',\r
+popup_tab : 'Popup',\r
+events_tab : 'JS-Events',\r
+advanced_tab : 'Erweitert',\r
+general_props : 'Allgemeine Eigenschaften',\r
+popup_props : 'Popup-Eigenschaften',\r
+event_props : 'Javascript-Events',\r
+advanced_props : 'Erweiterte Eigenschaften',\r
+popup_opts : 'Optionen',\r
+anchor_names : 'Anker',\r
+target_same : '_self - In diesem Fenster/Frame &ouml;ffnen',\r
+target_parent : '_parent - Im Eltern-Fenster/-Frame &ouml;ffnen',\r
+target_top : '_top - Im Fenster &ouml;ffnen (ersetzt alle Frames)',\r
+target_blank : '_blank - In neuem Fenster &ouml;ffnen',\r
+popup : 'Javascript-Popup',\r
+popup_url : 'Popup-URL',\r
+popup_name : 'Popup-Name',\r
+popup_return : 'Mit \'return false\' einf&uuml;gen',\r
+popup_scrollbars : 'Scrollleisten anzeigen',\r
+popup_statusbar : 'Statuszeilen anzeigen',\r
+popup_toolbar : 'Werkzeugleisten anzeigen',\r
+popup_menubar : 'Men&uuml;leiste anzeigen',\r
+popup_location : 'Adresszeile anzeigen',\r
+popup_resizable : 'Fenstergr&ouml;&szlig;e ver&auml;nderbar',\r
+popup_dependent : 'Abh&auml;ngiges Fenster (Nur Mozilla/Firefox)',\r
+popup_size : 'Gr&ouml;&szlig;e',\r
+popup_position : 'Position (X/Y)',\r
+id : 'ID',\r
+style: 'CSS-Stil',\r
+classes : 'CSS-Klassen',\r
+target_name : 'Zielname',\r
+langdir : 'Sprachrichtung',\r
+target_langcode : 'Zielsprache',\r
+langcode : 'Sprach-Code',\r
+encoding : 'Zeichenkodierung',\r
+mime : 'MIME-Typ',\r
+rel : 'Verh&auml;ltnis Seite zu Ziel',\r
+rev : 'Verh&auml;ltnis Ziel zu Seite',\r
+tabindex : 'Tabulator-Index',\r
+accesskey : 'Tastaturk&uuml;rzel',\r
+ltr : 'Von links nach rechts',\r
+rtl : 'Von rechts nach links',\r
+delta_width : 10\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advlink/langs/en.js b/webcit/tiny_mce/plugins/advlink/langs/en.js
new file mode 100644 (file)
index 0000000..0e68e5a
--- /dev/null
@@ -0,0 +1,46 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('advlink',{\r
+general_tab : 'General',\r
+popup_tab : 'Popup',\r
+events_tab : 'Events',\r
+advanced_tab : 'Advanced',\r
+general_props : 'General properties',\r
+popup_props : 'Popup properties',\r
+event_props : 'Events',\r
+advanced_props : 'Advanced properties',\r
+popup_opts : 'Options',\r
+anchor_names : 'Anchors',\r
+target_same : 'Open in this window / frame',\r
+target_parent : 'Open in parent window / frame',\r
+target_top : 'Open in top frame (replaces all frames)',\r
+target_blank : 'Open in new window',\r
+popup : 'Javascript popup',\r
+popup_url : 'Popup URL',\r
+popup_name : 'Window name',\r
+popup_return : 'Insert \'return false\'',\r
+popup_scrollbars : 'Show scrollbars',\r
+popup_statusbar : 'Show status bar',\r
+popup_toolbar : 'Show toolbars',\r
+popup_menubar : 'Show menu bar',\r
+popup_location : 'Show location bar',\r
+popup_resizable : 'Make window resizable',\r
+popup_dependent : 'Dependent (Mozilla/Firefox only)',\r
+popup_size : 'Size',\r
+popup_position : 'Position (X/Y)',\r
+id : 'Id',\r
+style: 'Style',\r
+classes : 'Classes',\r
+target_name : 'Target name',\r
+langdir : 'Language direction',\r
+target_langcode : 'Target language',\r
+langcode : 'Language code',\r
+encoding : 'Target character encoding',\r
+mime : 'Target MIME type',\r
+rel : 'Relationship page to target',\r
+rev : 'Relationship target to page',\r
+tabindex : 'Tabindex',\r
+accesskey : 'Accesskey',\r
+ltr : 'Left to right',\r
+rtl : 'Right to left'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advlink/langs/es.js b/webcit/tiny_mce/plugins/advlink/langs/es.js
new file mode 100644 (file)
index 0000000..cd7f9d9
--- /dev/null
@@ -0,0 +1,54 @@
+/**\r
+ * ES lang variables\r
+ * \r
+ * Authors : Alvaro Velasco,\r
+ *           Adolfo Sanz De Diego (asanzdiego) <asanzdiego@yahoo.es>,\r
+ *           Carlos C Soto (eclipxe) <csoto@sia-solutions.com>\r
+ * Last Updated : October 17, 2005\r
+ * TinyMCE Version : 2.0RC3\r
+ */\r
+\r
+tinyMCE.addToLang('advlink',{\r
+general_tab : 'General',\r
+popup_tab : 'Popup',\r
+events_tab : 'Eventos',\r
+advanced_tab : 'Avanzado',\r
+general_props : 'Propiedades generales',\r
+popup_props : 'Propiedades de la popup',\r
+event_props : 'Eventos',\r
+advanced_props : 'Propiedades avanzadas',\r
+popup_opts : 'Opciones',\r
+anchor_names : 'Anclas',\r
+target_same : 'Abrir en esta ventana/frame',\r
+target_parent : 'Abrir en la ventana/frame padre',\r
+target_top : 'Abrir el frame superior (replaza todos los frames)',\r
+target_blank : 'Abrir en una ventana nueva',\r
+popup : 'Popup con JavaScript',\r
+popup_url : 'Dirección de la popup',\r
+popup_name : 'Nombre de la ventana',\r
+popup_return : 'Insertar \'return false\'',\r
+popup_scrollbars : 'Mostrar barras de scroll',\r
+popup_statusbar : 'Mostrar barra de estado',\r
+popup_toolbar : 'Mostrar barras de tarea',\r
+popup_menubar : 'Mostrar barra de menu',\r
+popup_location : 'Mostrar barra de direcciones',\r
+popup_resizable : 'La ventana puede cambiar de tamaño',\r
+popup_dependent : 'Dependiente (solo Mozilla/Firefox)',\r
+popup_size : 'Tamaño',\r
+popup_position : 'Posición (X/Y)',\r
+id : 'Id',\r
+style: 'Estilo',\r
+classes : 'Clases',\r
+target_name : 'Nombre del target',\r
+langdir : 'Dirección del texto',\r
+target_langcode : 'Idioma del target',\r
+langcode : 'Código del idioma',\r
+encoding : 'Codificación de los carácteres del target',\r
+mime : 'Tipo MIME del target',\r
+rel : 'Relación de la página con el target',\r
+rev : 'Relación del target con la página',\r
+tabindex : 'Indice para la tabulación',\r
+accesskey : 'Tecla de acceso',\r
+ltr : 'de izquierda a derecha',\r
+rtl : 'de derecha a izquierda'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advlink/langs/fa.js b/webcit/tiny_mce/plugins/advlink/langs/fa.js
new file mode 100644 (file)
index 0000000..aca154b
--- /dev/null
@@ -0,0 +1,27 @@
+// IR lang variables\r
+// Persian (Farsi) language pack (for IRAN)\r
+// By: Morteza Zafari\r
+// Lost@LostLord.com\r
+// http://www.LostLord.com\r
+\r
+tinyMCE.addToLang('',{\r
+dir : 'rtl',\r
+insert_link_target_same : '?? ???? ???? / ???? ??? ??',\r
+insert_link_target_parent : '?? ???? / ???? ???? ??? ??',\r
+insert_link_target_top : '?? ???? ???? ??? ?? (??? ?????? ?????? ????? ?????)',\r
+insert_link_target_blank : '?? ???? ???? ??? ??',\r
+insert_link_target_named : '?? ????? ??? ??',\r
+insert_link_popup : 'JS-Popup',\r
+insert_link_popup_url : 'URL ?????',\r
+insert_link_popup_name : '??? ?????',\r
+insert_link_popup_return : '?????? \'return false\'',\r
+insert_link_popup_scrollbars : '????? scrollbars',\r
+insert_link_popup_statusbar : '????? statusbar',\r
+insert_link_popup_toolbar : '????? toolbars',\r
+insert_link_popup_menubar : '????? menubar',\r
+insert_link_popup_location : '????? locationbar',\r
+insert_link_popup_resizable : '???? ????? ?????? ????',\r
+insert_link_popup_size : '??????',\r
+insert_link_popup_position : '?????? (X/Y)',\r
+insert_link_popup_missingtarget : '???? ?? ??? ???? ???? ?????? ???? ?? ??? ??? ???? ????? ????? ?? ?????? ??????.'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advlink/langs/fr.js b/webcit/tiny_mce/plugins/advlink/langs/fr.js
new file mode 100644 (file)
index 0000000..14f196e
--- /dev/null
@@ -0,0 +1,22 @@
+// French lang variables by Laurent Dran\r
+\r
+tinyMCE.addToLang('',{\r
+insert_link_target_same : 'Ouvre dans la fen&#281;tre / Cadre(frame)',\r
+insert_link_target_parent : 'Ouvre dans fen&#281;tre parente / Cadres(frame)',\r
+insert_link_target_top : 'Ouvre dans le Top frame (remplace toutes les cadres(frames))',\r
+insert_link_target_blank : 'Ouvre dans la fen&#281;tre',\r
+insert_link_target_named : 'Ouvre dans la fen&#281;tre',\r
+insert_link_popup : 'JS-Popup',\r
+insert_link_popup_url : 'URL de la Popup',\r
+insert_link_popup_name : 'Nom de la fen&#281;tre',\r
+insert_link_popup_return : 'Insert \'return false\'',\r
+insert_link_popup_scrollbars : 'Montrer la barre de d&eacute;filement ',\r
+insert_link_popup_statusbar : 'Montrer la barre d\'&eacute;tat',\r
+insert_link_popup_toolbar : 'Montrer la barre d\'outils',\r
+insert_link_popup_menubar : 'Montrer la barre du menu',\r
+insert_link_popup_location : 'Montre la barre d\'adresse',\r
+insert_link_popup_resizable : 'Fabriquer une fen&#281;tre redimensionnable',\r
+insert_link_popup_size : 'Taille',\r
+insert_link_popup_position : 'Position (X/Y)',\r
+insert_link_popup_missingtarget : 'Veuillez ins&eacute;rer un nom pour la cible ou choisissez une autre option.'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advlink/langs/fr_ca.js b/webcit/tiny_mce/plugins/advlink/langs/fr_ca.js
new file mode 100644 (file)
index 0000000..7b57ba3
--- /dev/null
@@ -0,0 +1,22 @@
+// CA_FR lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+insert_link_target_same : 'Ouvrir dans la même fenêtre',\r
+insert_link_target_parent : 'Ouvrir dans la fenêtre parent',\r
+insert_link_target_top : 'Ouvrir dans le cadre supérieur',\r
+insert_link_target_blank : 'Ouvrir dans une nouvelle fenêtre',\r
+insert_link_target_named : 'Ouvrir à la destination',\r
+insert_link_popup : 'JS-Popup',\r
+insert_link_popup_url : 'URL du popup',\r
+insert_link_popup_name : 'Nom de la fenêtre',\r
+insert_link_popup_return : 'Insérer le script \'return false\'',\r
+insert_link_popup_scrollbars : 'Barres de défilement',\r
+insert_link_popup_statusbar : 'Barre de statut',\r
+insert_link_popup_toolbar : 'Barres d\'outils',\r
+insert_link_popup_menubar : 'Barre de menu',\r
+insert_link_popup_location : 'Barre d\'adresse',\r
+insert_link_popup_resizable : 'Fenêtre redimensionnable',\r
+insert_link_popup_size : 'Dimensions',\r
+insert_link_popup_position : 'Position (X/Y)',\r
+insert_link_popup_missingtarget : 'S.v.p., entrer un nom de destination ou choisir une autre option.'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advlink/langs/he.js b/webcit/tiny_mce/plugins/advlink/langs/he.js
new file mode 100644 (file)
index 0000000..bf3f794
--- /dev/null
@@ -0,0 +1,46 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('advlink',{\r
+general_tab : 'ëììé',\r
+popup_tab : 'çìåï ÷åôõ',\r
+events_tab : 'àøåòéí',\r
+advanced_tab : 'îú÷ãí',\r
+general_props : 'îàôééðéí ëììééí',\r
+popup_props : 'îàôééðé äçìåï ä÷åôõ',\r
+event_props : 'àøåòéí',\r
+advanced_props : 'îàôééðéí îú÷ãîéí',\r
+popup_opts : 'àôùøåéåú',\r
+anchor_names : 'òåâðéí',\r
+target_same : 'ôúç áçìåï æä àå îñâøú æå',\r
+target_parent : 'ôúç áçìåï àå áîñâøú äî÷åøééí',\r
+target_top : 'ôúç áîñâøú äøàùéú (îçìéó àú ëì äîñâøåú)',\r
+target_blank : 'ôúç áçìåï çãù',\r
+popup : 'çìåï ÷åôõ ùì Javascript',\r
+popup_url : 'ëúåáú äçìåï ä÷åôõ',\r
+popup_name : 'ùí äçìåï',\r
+popup_return : 'äëðñ \'return false\'',\r
+popup_scrollbars : 'äöâ ôñé âìéìä',\r
+popup_statusbar : 'äöâ ùåøú îöá',\r
+popup_toolbar : 'äöâ ñøâìé ëìåí',\r
+popup_menubar : 'äöâ àú ùåøú äúôøéèéí',\r
+popup_location : 'äöâ àú ùåøú äëúåáú',\r
+popup_resizable : 'çìåï ùðéúï ìùðåú àú âåãìå',\r
+popup_dependent : 'úìåé (Mozilla/Firefox áìáã)',\r
+popup_size : 'âåãì',\r
+popup_position : 'îé÷åí (X/Y)',\r
+id : 'Id',\r
+style: 'ñâðåï',\r
+classes : 'Classéí',\r
+target_name : 'ùí éòã',\r
+langdir : 'ëéååï ùôä',\r
+target_langcode : 'ùôú éòã',\r
+langcode : '÷åã ùôä',\r
+encoding : '÷éãåã úååéí ùì äéòã',\r
+mime : 'ñåâ MIME ùì äéòã',\r
+rel : 'éçñ ùì ãó ìéòã',\r
+rev : 'éçñ ùì éòã ìãó',\r
+tabindex : 'ñãø èàáéí',\r
+accesskey : 'î÷ù âéùä',\r
+ltr : 'ùîàì ìéîéï',\r
+rtl : 'éîéï ìùîàì'\r
+});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advlink/langs/hu.js b/webcit/tiny_mce/plugins/advlink/langs/hu.js
new file mode 100644 (file)
index 0000000..75f6beb
--- /dev/null
@@ -0,0 +1,46 @@
+// HU lang variables\r
+\r
+tinyMCE.addToLang('advlink',{\r
+general_tab : 'Általános',\r
+popup_tab : 'Popup',\r
+events_tab : 'Események',\r
+advanced_tab : 'Haladó',\r
+general_props : 'Általános beállítások',\r
+popup_props : 'Popup beállítások',\r
+event_props : 'Események',\r
+advanced_props : 'Haladó beállítások',\r
+popup_opts : 'Opciók',\r
+anchor_names : 'Horgonyok',\r
+target_same : 'Megnyitás ebben az ablakban / keretben',\r
+target_parent : 'Megnyitás a szülõ ablakban / keretben',\r
+target_top : 'Megnyitás felsõ keretben (minden keretet lecserél)',\r
+target_blank : 'Megnyitás új ablakban',\r
+popup : 'Javascript popup',\r
+popup_url : 'Popup URL',\r
+popup_name : 'Ablak név',\r
+popup_return : '\'return false\' beszúrása',\r
+popup_scrollbars : 'Görgetõsávok megjelenítése',\r
+popup_statusbar : 'Állapotsor megjelenítése',\r
+popup_toolbar : 'Eszköztárak megjelenítése',\r
+popup_menubar : 'Menüsor megjelenítése',\r
+popup_location : 'Címsáv megjelenítése',\r
+popup_resizable : 'Ablak átméretezhetõvé tétele',\r
+popup_dependent : 'Függõ (csak Mozilla/Firefox)',\r
+popup_size : 'Méret',\r
+popup_position : 'Pozíció (X/Y)',\r
+id : 'Azonosító',\r
+style: 'Stílus',\r
+classes : 'Osztályok',\r
+target_name : 'Cél neve',\r
+langdir : 'Szöveg pozíció',\r
+target_langcode : 'Cél szöveg',\r
+langcode : 'Szöveg kód',\r
+encoding : 'Cél karakter kódolás',\r
+mime : 'Cél MIME típus',\r
+rel : 'Oldal kapcsolata a céllal',\r
+rev : 'Cél kapcsolat az oldallal',\r
+tabindex : 'Tabindex',\r
+accesskey : 'Accesskey',\r
+ltr : 'Balról jobbra',\r
+rtl : 'Jobbról balra'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advlink/langs/is.js b/webcit/tiny_mce/plugins/advlink/langs/is.js
new file mode 100644 (file)
index 0000000..3350e2b
--- /dev/null
@@ -0,0 +1,46 @@
+// Iceland lang variables by Johannes Birgir Jensson\r
+\r
+tinyMCE.addToLang('advlink',{\r
+general_tab : 'Almennt',\r
+popup_tab : 'Sprettigluggi',\r
+events_tab : 'Atbur&eth;ir',\r
+advanced_tab : 'S&eacute;rstillingar',\r
+general_props : 'Almennar stillingar',\r
+popup_props : 'Stillingar sprettiglugga',\r
+event_props : 'Atbur&eth;ir',\r
+advanced_props : 'S&eacute;rstillingar',\r
+popup_opts : 'Valkostir',\r
+anchor_names : 'Akkeri',\r
+target_same : 'Opna &iacute; &thorn;essum glugga / ramma',\r
+target_parent : 'Opna &iacute; glugga / ramma foreldris',\r
+target_top : 'Opna í efsta ramma (kemur í sta&eth; allra ramma)',\r
+target_blank : 'Opna &iacute; n&yacute;jum glugga',\r
+popup : 'Javascript sprettigluggi',\r
+popup_url : 'Sl&oacute;&eth; sprettiglugga',\r
+popup_name : 'Nafn glugga',\r
+popup_return : 'Setja \'return false\'',\r
+popup_scrollbars : 'S&yacute;na skrunsl&aacute;r',\r
+popup_statusbar : 'S&yacute;na st&ouml;&eth;ustiku',\r
+popup_toolbar : 'S&yacute;na t&oacute;lastiku',\r
+popup_menubar : 'S&yacute;na valstiku',\r
+popup_location : 'S&yacute;na sl&oacute;&eth;arstiku',\r
+popup_resizable : 'Leyfa glugga a&eth; breyta st&aelig;r&eth;',\r
+popup_dependent : 'H&aacute;&eth;ur (eing&ouml;ngu Mozilla/Firefox)',\r
+popup_size : 'St&aelig;r&eth;',\r
+popup_position : 'Sta&eth;setning (X/Y)',\r
+id : 'Id',\r
+style: 'St&iacute;ll',\r
+classes : 'Klassi',\r
+target_name : 'Nafn tengils',\r
+langdir : 'Rith&aacute;ttur tungum&aacute;ls',\r
+target_langcode : 'Tungum&aacute; tengils',\r
+langcode : 'Tungum&aacute;lskenni',\r
+encoding : 'Textak&oacute;&eth;un tengils',\r
+mime : 'MIME-tegund tengils',\r
+rel : 'Tengsl s&iacute;&eth;u til tengils',\r
+rev : 'Tengsl tengils til s&iacute;&eth;u',\r
+tabindex : 'R&ouml;&eth;un',\r
+accesskey : 'Fl&yacute;tilykill',\r
+ltr : 'Vinstri til h&aelig;gri',\r
+rtl : 'H&aelig;gri til vinstri'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advlink/langs/ko.js b/webcit/tiny_mce/plugins/advlink/langs/ko.js
new file mode 100644 (file)
index 0000000..bcd48c0
--- /dev/null
@@ -0,0 +1,21 @@
+// KO lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+insert_link_target_same : '°°Àº Ã¢¿¡¼­ ¸µ&Aring;©/ÇÁ·¹ÀÓ ¿­±â',\r
+insert_link_target_parent : 'ºÎ¸ð Ã¢¿¡¼­ ¸µ&Aring;©/ÇÁ·¹ÀÓ ¿­±â',\r
+insert_link_target_top : 'TOP ÇÁ·¹ÀÓ¿¡¼­ ¿­±â (¸ðµç ÇÁ·¹ÀÓÀ» ´ëü)',\r
+insert_link_target_blank : '»õ Ã¢¿¡¼­ ¿­±â',\r
+insert_link_target_named : '»õ Ã¢¿¡¼­ ¿­±â',\r
+insert_link_popup : 'JS-Popup',\r
+insert_link_popup_url : 'Æ˾÷ URL',\r
+insert_link_popup_name : 'â À̸§',\r
+insert_link_popup_return : '\'return false\' ³&Ouml;±â',\r
+insert_link_popup_scrollbars : '½º&Aring;©·Ñ¹Ù¸¦ º¸¿©ÁÜ',\r
+insert_link_popup_statusbar : '»ó&Aring;ÂâÀ» º¸¿©ÁÜ',\r
+insert_link_popup_toolbar : '&Aring;ø¹Ù¸¦ º¸¿©ÁÜ',\r
+insert_link_popup_menubar : '¸Þ´º¹Ù¸¦ º¸¿©ÁÜ',\r
+insert_link_popup_location : 'À§&Auml;¡ Ç¥½ÃÁÙÀ» º¸¿©ÁÜ',\r
+insert_link_popup_resizable : '&Aring;©±â Á¶Àý °¡´ÉÇÑ À©µµ¿ì »ý¼º',\r
+insert_link_popup_size : '&Aring;©±â',\r
+insert_link_popup_position : 'À§&Auml;¡ (X/Y)'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advlink/langs/nb.js b/webcit/tiny_mce/plugins/advlink/langs/nb.js
new file mode 100644 (file)
index 0000000..5528ada
--- /dev/null
@@ -0,0 +1,46 @@
+// nb = Norwegian (bokm&aring;l) lang variables by Knut B. Jacobsen\r
+\r
+tinyMCE.addToLang('advlink',{\r
+general_tab : 'Generelle innstillinger',\r
+popup_tab : 'Popup',\r
+events_tab : 'Hendelser',\r
+advanced_tab : 'Avanserte innstillinger',\r
+general_props : 'Generelle innstillinger',\r
+popup_props : 'Popup innstillinger',\r
+event_props : 'Hendelser',\r
+advanced_props : 'Generelle innstillinger',\r
+popup_opts : 'Innstillinger',\r
+anchor_names : 'Bokmerke',\r
+target_same : '&Aring;pne i samme vindu / ramme',\r
+target_parent : '&Aring;pne i underliggende vindu / ramme',\r
+target_top : '&Aring;pne i topprammen (erstatter alle rammer)',\r
+target_blank : '&Aring;pne i et nytt vindu',\r
+popup : 'Javascript popup',\r
+popup_url : 'Popup URL',\r
+popup_name : 'Vindu navn',\r
+popup_return : 'Sett inn \'return false\'',\r
+popup_scrollbars : 'Vis scrollbars',\r
+popup_statusbar : 'Vis status bar',\r
+popup_toolbar : 'Vis toolbars',\r
+popup_menubar : 'Vis meny bar',\r
+popup_location : 'Vis location bar',\r
+popup_resizable : 'Gj&oslash;r vinduet skalerbart',\r
+popup_dependent : 'Avhengig vindu (Bare i Mozilla/Firefox)',\r
+popup_size : 'St&oring;rrelse',\r
+popup_position : 'Posisjon (X/Y)',\r
+id : 'Id',\r
+style: 'Stil',\r
+classes : 'CSS klasser',\r
+target_name : 'M&aring;l navn',\r
+langdir : 'Skrift retning',\r
+target_langcode : 'M&aring;l spr&aring;k',\r
+langcode : 'Spr&aring;k kode',\r
+encoding : 'Tegn konvertering',\r
+mime : 'M&aring;lets MIME type',\r
+rel : 'Relasjon side til m&aring;l',\r
+rev : 'Relasjon m&aring;l til side',\r
+tabindex : 'Tabindex',\r
+accesskey : 'Accesskey',\r
+ltr : 'Venstre mot h&oslash;yre',\r
+rtl : 'H&oslash;yre mot venstre'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advlink/langs/nl.js b/webcit/tiny_mce/plugins/advlink/langs/nl.js
new file mode 100644 (file)
index 0000000..8d089ad
--- /dev/null
@@ -0,0 +1,46 @@
+// NL lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+general_tab : 'Algemeen',\r
+popup_tab : 'Popup',\r
+events_tab : 'Gebeurtenissen',\r
+advanced_tab : 'Geavanceerd',\r
+general_props : 'Algemene eigenschappen',\r
+popup_props : 'Popup eigenschappen',\r
+event_props : 'Gebeurtenissen',\r
+advanced_props : 'Geavanceerde eigenschappen',\r
+popup_opts : 'Opties',\r
+anchor_names : 'Bladwijzers',\r
+target_same : 'Openen in dit venster/frame',\r
+target_parent : 'Openen in hgerliggend frame',\r
+target_top : 'Openen in bovenste frame (vervangt alle frames)',\r
+target_blank : 'Openen in nieuw venster',\r
+popup : 'Javascript popup',\r
+popup_url : 'Popup URL',\r
+popup_name : 'Vensternaam',\r
+popup_return : 'Voeg \'return false\' toe',\r
+popup_scrollbars : 'Toon scrollbalken',\r
+popup_statusbar : 'Toon statusbalk',\r
+popup_toolbar : 'Toon werkbalk',\r
+popup_menubar : 'Toon menubalk',\r
+popup_location : 'Toon adresbalk',\r
+popup_resizable : 'Maak venster schaalbaar',\r
+popup_dependent : 'Afhankelijk (Mozilla/Firefox only)',\r
+popup_size : 'Afmetingen',\r
+popup_position : 'Positie (x/y)',\r
+id : 'Id',\r
+style: 'Stijl',\r
+classes : 'Stijlen',\r
+target_name : 'Naam doelframe',\r
+langdir : 'Taalrichting',\r
+target_langcode : 'Taal van doel',\r
+langcode : 'Taalcode',\r
+encoding : 'Doel character encoding',\r
+mime : 'Doel MIME type',\r
+rel : 'Relatie van pagina tot doel',\r
+rev : 'Relatie van doel tot pagina',\r
+tabindex : 'Tabindex',\r
+accesskey : 'Toegangstoets',\r
+ltr : 'Links naar rechts',\r
+rtl : 'Rechts naar links'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advlink/langs/nn.js b/webcit/tiny_mce/plugins/advlink/langs/nn.js
new file mode 100644 (file)
index 0000000..399f1d1
--- /dev/null
@@ -0,0 +1,46 @@
+// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen\r
+\r
+tinyMCE.addToLang('advlink',{\r
+general_tab : 'Generelle innstillinger',\r
+popup_tab : 'Popup',\r
+events_tab : 'Hendelser',\r
+advanced_tab : 'Avanserte innstillinger',\r
+general_props : 'Generelle innstillinger',\r
+popup_props : 'Popup innstillinger',\r
+event_props : 'Hendelser',\r
+advanced_props : 'Generelle innstillinger',\r
+popup_opts : 'Innstillinger',\r
+anchor_names : 'Bokmerke',\r
+target_same : '&Aring;pne i samme vindauge / ramme',\r
+target_parent : '&Aring;pne i underliggende vindauge / ramme',\r
+target_top : '&Aring;pne i topprammen (erstatter alle rammer)',\r
+target_blank : '&Aring;pne i eit nytt vindauge',\r
+popup : 'Javascript popup',\r
+popup_url : 'Popup URL',\r
+popup_name : 'Vindauge navn',\r
+popup_return : 'Sett inn \'return false\'',\r
+popup_scrollbars : 'Vis scrollbars',\r
+popup_statusbar : 'Vis status bar',\r
+popup_toolbar : 'Vis toolbars',\r
+popup_menubar : 'Vis meny bar',\r
+popup_location : 'Vis location bar',\r
+popup_resizable : 'Gjer vindauget skalerbart',\r
+popup_dependent : 'Avhengig vindauge (Bare i Mozilla/Firefox)',\r
+popup_size : 'St&oslash;rrelse',\r
+popup_position : 'Posisjon (X/Y)',\r
+id : 'Id',\r
+style: 'Stil',\r
+classes : 'CSS klasser',\r
+target_name : 'M&aring;l navn',\r
+langdir : 'Skrift retning',\r
+target_langcode : 'M&aring;l spr&aring;k',\r
+langcode : 'Spr&aring;k kode',\r
+encoding : 'Tekken konvertering',\r
+mime : 'M&aring;lets MIME type',\r
+rel : 'Relasjon side til m&aring;l',\r
+rev : 'Relasjon m&aring;l til side',\r
+tabindex : 'Tabindex',\r
+accesskey : 'Accesskey',\r
+ltr : 'Venstre mot h&oslash;gre',\r
+rtl : 'H&oslash;gre mot venstre'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advlink/langs/pl.js b/webcit/tiny_mce/plugins/advlink/langs/pl.js
new file mode 100644 (file)
index 0000000..46c930c
--- /dev/null
@@ -0,0 +1,49 @@
+// PL lang variables\r
+// fixed by Wooya\r
+// http://www.mfusion.prv.pl\r
+// fixed by lemiel 14.11.2005\r
+\r
+tinyMCE.addToLang('advlink',{\r
+general_tab : 'G³ówne ustawienia',\r
+popup_tab : 'Okienko popup',\r
+events_tab : 'Zdarzenia',\r
+advanced_tab : 'Zaawansowane',\r
+general_props : 'G³ówne',\r
+popup_props : 'Ustawienia popup',\r
+event_props : 'Zdarzenia',\r
+advanced_props : 'Zaawansowane opcje',\r
+popup_opts : 'Opcje',\r
+anchor_names : 'Kotwice',\r
+target_same : 'Otwórz w tym oknie / ramce',\r
+target_parent : 'Otwórz w poprzednim oknie / ramce',\r
+target_top : 'Otwórz w g³ównej ramce (zamienia wszystkie ramki)',\r
+target_blank : 'Otwórz w nowym oknie',\r
+popup : 'Okienko popup Javascript',\r
+popup_url : 'URL dla popup',\r
+popup_name : 'Nazwa okna',\r
+popup_return : 'Wstaw \'return false\'',\r
+popup_scrollbars : 'Poka¿ paski przewijania',\r
+popup_statusbar : 'Poka¿ pasek statusu',\r
+popup_toolbar : 'Poka¿ pasek narzêdzi',\r
+popup_menubar : 'Poka¿ pasek menu',\r
+popup_location : 'Poka¿ pasek adresu',\r
+popup_resizable : 'Pozwalaj na zmianê wielko¶ci okna',\r
+popup_dependent : 'Zale¿ne (tylko Mozilla/Firefox)',\r
+popup_size : 'Rozmiar',\r
+popup_position : 'Pozycja (X/Y)',\r
+id : 'Id',\r
+style: 'Styl',\r
+classes : 'Klasa',\r
+target_name : 'Nazwa celu',\r
+langdir : 'Kierunek tekstu',\r
+target_langcode : 'Jêzyk celu',\r
+langcode : 'Kod jêzyka',\r
+encoding : 'Kodowanie znaków celu',\r
+mime : 'Typ MIME celu',\r
+rel : 'Zale¿no¶æ strony do celu',\r
+rev : 'Zale¿no¶æ celu do strony',\r
+tabindex : 'Indeks tabeli',\r
+accesskey : 'Klawisz dostêpu',\r
+ltr : 'Lewy do prawego',\r
+rtl : 'Prawy do lewego'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advlink/langs/pt_br.js b/webcit/tiny_mce/plugins/advlink/langs/pt_br.js
new file mode 100644 (file)
index 0000000..159db18
--- /dev/null
@@ -0,0 +1,54 @@
+/**\r
+ * pt_br lang variables\r
+ * Brazilian Portuguese\r
+ *\r
+ * Authors : ????\r
+ * Revision and modifications:\r
+ *           Marcio Barbosa (mpg) <mpg@mpg.com.br>\r
+ * Last Updated : November 26, 2005\r
+ * TinyMCE Version : 2.0RC4\r
+ */\r
+tinyMCE.addToLang('advlink',{\r
+general_tab : 'Geral',\r
+popup_tab : 'Popup',\r
+events_tab : 'Eventos',\r
+advanced_tab : 'Avançado',\r
+general_props : 'Propriedades Gerais',\r
+popup_props : 'Propriedades do Popup',\r
+event_props : 'Eventos',\r
+advanced_props : 'Propriedades Avançadas',\r
+popup_opts : 'Opções',\r
+anchor_names : 'Âncoras',\r
+target_same : 'Abrir nesta janela / frame',\r
+target_parent : 'Abrir na janela / frame',\r
+target_top : 'Abrir na janela superior (repondo todas as frames)',\r
+target_blank : 'Abrir em uma nova janela',\r
+popup : 'Javascript popup',\r
+popup_url : 'Popup de uma URL',\r
+popup_name : 'Nome da Janela',\r
+popup_return : 'Inserir \'returna falso\'',\r
+popup_scrollbars : 'Mostrar barra de rolagem',\r
+popup_statusbar : 'Mostrar barra de status',\r
+popup_toolbar : 'Mostrar barra de ferramentas',\r
+popup_menubar : 'Mostrar barra do menu',\r
+popup_location : 'Mostrar barra de endereço',\r
+popup_resizable : 'Permite redimensionamento da janela',\r
+popup_dependent : 'Dependente (Somente para Mozilla/Firefox)',\r
+popup_size : 'Tamanho',\r
+popup_position : 'Posição (X/Y)',\r
+id : 'Id',\r
+style: 'Estilo',\r
+classes : 'Classes',\r
+target_name : 'Nome do Destino',\r
+langdir : 'Direção do texto',\r
+target_langcode : 'Idioma do destino',\r
+langcode : 'Código do idioma',\r
+encoding : 'Tipo de codifição de carctere de destino',\r
+mime : 'Tipo de MIME do destino',\r
+rel : 'Relacionamento da página com o destino',\r
+rev : 'Relacionamento do destino com a página',\r
+tabindex : 'Tabindex',\r
+accesskey : 'Accesskey',\r
+ltr : 'Esquerda para direita',\r
+rtl : 'Direita para esquerda'\r
+});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/advlink/langs/ru.js b/webcit/tiny_mce/plugins/advlink/langs/ru.js
new file mode 100644 (file)
index 0000000..8e782dc
--- /dev/null
@@ -0,0 +1,47 @@
+// RU cp1251 lang variables\r
+\r
+tinyMCE.addToLang('advlink',{\r
+general_tab : 'Îñíîâíûå',\r
+popup_tab : 'Âñïëûâàþùèå',\r
+events_tab : 'Ñîáûòèÿ',\r
+advanced_tab : 'Ðàñøèðåííûå',\r
+general_props : 'Îñíîâíûå ñâîéñòâà',\r
+popup_props : 'Ñâîéñòâà Popup ýëåìåíòîâ',\r
+event_props : 'Ñîáûòèÿ',\r
+advanced_props : 'Ðàñøèðåííûå íàñòðîéêè',\r
+popup_opts : 'Îïöèè',\r
+anchor_names : 'ßêîðÿ',\r
+target_same : 'Îòêðûâàòü â ýòîì îêíå / ôðåéìå',\r
+target_parent : 'Îòêðûâàòü â ðîäèòåëüñêîì îêíå / ôðåéìå',\r
+target_top : 'Îòêðûâàòü â âåðõíåì ôðåéìå (çàìåíÿòü âñå ôðåéìû)',\r
+target_blank : 'Îòêðûâàòü â íîâîì îêíå',\r
+popup : 'Javascript popup',\r
+popup_url : 'Popup URL',\r
+popup_name : 'Èìÿ îêíà',\r
+popup_return : 'Insert \'return false\'',\r
+popup_scrollbars : 'Ïîêàçûâàòü ëèíåéêè ïðîêðóòêè',\r
+popup_statusbar : 'Ïîêàçûâàòü status bar',\r
+popup_toolbar : 'Ïîêàçûâàòü ïàíåëè èíñòðóìåíòîâ',\r
+popup_menubar : 'Ïîêàçûâàòü ïàíåëü ìåíþ',\r
+popup_location : 'Ïîêàçûâàòü location bar',\r
+popup_resizable : 'Ïîçâîëèòü èçìåíÿòü ðàçìåðû îêíà',\r
+popup_dependent : 'Çàâèñèìîñòü (òîëüêî Mozilla/Firefox)',\r
+popup_size : 'Ðàçìåð',\r
+popup_position : 'Ðàñïîëîæåíèå (X/Y)',\r
+id : 'Id',\r
+style: 'Ñòèëü',\r
+classes : 'Êëàññû',\r
+target_name : 'Èìÿ öåëè',\r
+langdir : 'Íàïðàâëåíèå ïèñüìà â ÿçûêå',\r
+target_langcode : 'Öåëåâîé ÿçûê',\r
+langcode : 'Êîä ÿçûêà',\r
+encoding : 'Öåëåâàÿ êîäèðîâêà',\r
+mime : 'Öåëåâîé MIME òèï',\r
+rel : 'Çàâèñèìîñòü page -> target',\r
+rev : 'Çàâèñèìîñòü target -> page',\r
+tabindex : 'Tabindex',\r
+accesskey : 'Accesskey',\r
+ltr : 'Ñëåâà íàïðàâî',\r
+rtl : 'Ñïðàâà íàëåâî',\r
+delta_width : 40\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advlink/langs/ru_KOI8-R.js b/webcit/tiny_mce/plugins/advlink/langs/ru_KOI8-R.js
new file mode 100644 (file)
index 0000000..a88821b
--- /dev/null
@@ -0,0 +1,46 @@
+// RU KOI8-R lang variables\r
+\r
+tinyMCE.addToLang('advlink',{\r
+general_tab : 'ïÓÎÏ×ÎÙÅ',\r
+popup_tab : '÷ÓÐÌÙ×ÁÀÝÉÅ',\r
+events_tab : 'óÏÂÙÔÉÑ',\r
+advanced_tab : 'òÁÓÛÉÒÅÎÎÙÅ',\r
+general_props : 'ïÓÎÏ×ÎÙÅ Ó×ÏÊÓÔ×Á',\r
+popup_props : 'ó×ÏÊÓÔ×Á Popup ÜÌÅÍÅÎÔÏ×',\r
+event_props : 'óÏÂÙÔÉÑ',\r
+advanced_props : 'òÁÓÛÉÒÅÎÎÙÅ ÎÁÓÔÒÏÊËÉ',\r
+popup_opts : 'ïÐÃÉÉ',\r
+anchor_names : 'ñËÏÒÑ',\r
+target_same : 'ïÔËÒÙ×ÁÔØ × ÜÔÏÍ ÏËÎÅ / ÆÒÅÊÍÅ',\r
+target_parent : 'ïÔËÒÙ×ÁÔØ × ÒÏÄÉÔÅÌØÓËÏÍ ÏËÎÅ / ÆÒÅÊÍÅ',\r
+target_top : 'ïÔËÒÙ×ÁÔØ × ×ÅÒÈÎÅÍ ÆÒÅÊÍÅ (ÚÁÍÅÎÑÔØ ×ÓÅ ÆÒÅÊÍÙ)',\r
+target_blank : 'ïÔËÒÙ×ÁÔØ × ÎÏ×ÏÍ ÏËÎÅ',\r
+popup : 'Javascript popup',\r
+popup_url : 'Popup URL',\r
+popup_name : 'éÍÑ ÏËÎÁ',\r
+popup_return : 'Insert \'return false\'',\r
+popup_scrollbars : 'ðÏËÁÚÙ×ÁÔØ ÌÉÎÅÊËÉ ÐÒÏËÒÕÔËÉ',\r
+popup_statusbar : 'ðÏËÁÚÙ×ÁÔØ status bar',\r
+popup_toolbar : 'ðÏËÁÚÙ×ÁÔØ ÐÁÎÅÌÉ ÉÎÓÔÒÕÍÅÎÔÏ×',\r
+popup_menubar : 'ðÏËÁÚÙ×ÁÔØ ÐÁÎÅÌØ ÍÅÎÀ',\r
+popup_location : 'ðÏËÁÚÙ×ÁÔØ location bar',\r
+popup_resizable : 'ðÏÚ×ÏÌÉÔØ ÉÚÍÅÎÑÔØ ÒÁÚÍÅÒÙ ÏËÎÁ',\r
+popup_dependent : 'úÁ×ÉÓÉÍÏÓÔØ (ÔÏÌØËÏ Mozilla/Firefox)',\r
+popup_size : 'òÁÚÍÅÒ',\r
+popup_position : 'òÁÓÐÏÌÏÖÅÎÉÅ (X/Y)',\r
+id : 'Id',\r
+style: 'óÔÉÌØ',\r
+classes : 'ëÌÁÓÓÙ',\r
+target_name : 'éÍÑ ÃÅÌÉ',\r
+langdir : 'îÁÐÒÁ×ÌÅÎÉÅ ÐÉÓØÍÁ × ÑÚÙËÅ',\r
+target_langcode : 'ãÅÌÅ×ÏÊ ÑÚÙË',\r
+langcode : 'ëÏÄ ÑÚÙËÁ',\r
+encoding : 'ãÅÌÅ×ÁÑ ËÏÄÉÒÏ×ËÁ',\r
+mime : 'ãÅÌÅ×ÏÊ MIME ÔÉÐ',\r
+rel : 'úÁ×ÉÓÉÍÏÓÔØ page -> target',\r
+rev : 'úÁ×ÉÓÉÍÏÓÔØ target -> page',\r
+tabindex : 'Tabindex',\r
+accesskey : 'Accesskey',\r
+ltr : 'óÌÅ×Á ÎÁÐÒÁ×Ï',\r
+rtl : 'óÐÒÁ×Á ÎÁÌÅ×Ï'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advlink/langs/ru_UTF-8.js b/webcit/tiny_mce/plugins/advlink/langs/ru_UTF-8.js
new file mode 100644 (file)
index 0000000..146485d
--- /dev/null
@@ -0,0 +1,46 @@
+// RU UTF-8 lang variables\r
+\r
+tinyMCE.addToLang('advlink',{\r
+general_tab : 'Основные',\r
+popup_tab : 'Всплывающие',\r
+events_tab : 'События',\r
+advanced_tab : 'Расширенные',\r
+general_props : 'Основные свойства',\r
+popup_props : 'Свойства Popup элементов',\r
+event_props : 'События',\r
+advanced_props : 'Расширенные настройки',\r
+popup_opts : 'Опции',\r
+anchor_names : 'Якоря',\r
+target_same : 'Открывать в этом окне / фрейме',\r
+target_parent : 'Открывать в родительском окне / фрейме',\r
+target_top : 'Открывать в верхнем фрейме (заменять все фреймы)',\r
+target_blank : 'Открывать в новом окне',\r
+popup : 'Javascript popup',\r
+popup_url : 'Popup URL',\r
+popup_name : 'Имя окна',\r
+popup_return : 'Insert \'return false\'',\r
+popup_scrollbars : 'Показывать линейки прокрутки',\r
+popup_statusbar : 'Показывать status bar',\r
+popup_toolbar : 'Показывать панели инструментов',\r
+popup_menubar : 'Показывать панель меню',\r
+popup_location : 'Показывать location bar',\r
+popup_resizable : 'Позволить изменять размеры окна',\r
+popup_dependent : 'Зависимость (только Mozilla/Firefox)',\r
+popup_size : 'Размер',\r
+popup_position : 'Расположение (X/Y)',\r
+id : 'Id',\r
+style: 'Стиль',\r
+classes : 'Классы',\r
+target_name : 'Имя цели',\r
+langdir : 'Направление письма в языке',\r
+target_langcode : 'Целевой язык',\r
+langcode : 'Код языка',\r
+encoding : 'Целевая кодировка',\r
+mime : 'Целевой MIME тип',\r
+rel : 'Зависимость page -> target',\r
+rev : 'Зависимость target -> page',\r
+tabindex : 'Tabindex',\r
+accesskey : 'Accesskey',\r
+ltr : 'Слева направо',\r
+rtl : 'Справа налево'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advlink/langs/sk.js b/webcit/tiny_mce/plugins/advlink/langs/sk.js
new file mode 100644 (file)
index 0000000..8a1a8a4
--- /dev/null
@@ -0,0 +1,30 @@
+/**\r
+ * Slovak lang variables \r
+ * encoding: utf-8\r
+ * \r
+ * @author Vladimir VASIL vvasil@post.sk\r
+ *    \r
+ * $Id: sk.js,v 1.1 2005/11/22 20:56:44 spocke Exp $ \r
+ */  \r
+\r
+tinyMCE.addToLang('',{\r
+insert_link_target_same : 'Otvoríť v rovnakom okne/ráme',\r
+insert_link_target_parent : 'Otvoríť v rodičovském okne/ráme',\r
+insert_link_target_top : 'Otvoriť v najvyššom ráme (prepíše všetky rámy)',\r
+insert_link_target_blank : 'Otvoríť v novom okne',\r
+insert_link_target_named : 'Otvoríť v okne',\r
+insert_link_popup : 'JS-Popup',\r
+insert_link_popup_url : 'Popup URL',\r
+insert_link_popup_name : 'Názov okna',\r
+insert_link_popup_return : 'Vložiť \'return false\'',\r
+insert_link_popup_scrollbars : 'Ukázať posúvníky',\r
+insert_link_popup_statusbar : 'Ukázať stavový riadok',\r
+insert_link_popup_toolbar : 'Ukázať ovládaciu lištu',\r
+insert_link_popup_menubar : 'Ukázať menu',\r
+insert_link_popup_location : 'Ukázať lištu umiestení',\r
+insert_link_popup_resizable : 'Premenlivá veľkosť okna',\r
+insert_link_popup_size : 'Velikosť',\r
+insert_link_popup_position : 'Umiestnenie (X/Y)',\r
+insert_link_popup_missingtarget : 'Vložte názov cieľa alebo vyberte inú voľbu.'\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/advlink/langs/sv.js b/webcit/tiny_mce/plugins/advlink/langs/sv.js
new file mode 100644 (file)
index 0000000..1efe42a
--- /dev/null
@@ -0,0 +1,46 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('advlink',{\r
+general_tab : 'Generella inst&auml;llningar',\r
+popup_tab : 'Popup',\r
+events_tab : 'H&auml;ndelser',\r
+advanced_tab : 'Avancerade inst&auml;llningar',\r
+general_props : 'Generella inst&auml;llningar',\r
+popup_props : 'Popup inst&auml;llningar',\r
+event_props : 'H&auml;ndelser',\r
+advanced_props : 'Generella inst&auml;llningar',\r
+popup_opts : 'Inst&auml;llningar',\r
+anchor_names : 'Bokm&auml;rken',\r
+target_same : '&Ouml;ppna i samma f&ouml;nster / ram',\r
+target_parent : '&Ouml;ppna i underliggande f&ouml;nster / ram',\r
+target_top : '&Ouml;ppna i toppramen (ers&auml;tter alla ramar)',\r
+target_blank : '&Ouml;ppna i ett nytt f&ouml;nster',\r
+popup : 'Javascript popup',\r
+popup_url : 'Popup URL',\r
+popup_name : 'F&ouml;nster namn',\r
+popup_return : 'S&auml;ttin \'return false\'',\r
+popup_scrollbars : 'Visa scrollbars',\r
+popup_statusbar : 'Visa status bar',\r
+popup_toolbar : 'Visa toolbars',\r
+popup_menubar : 'Visa menu bar',\r
+popup_location : 'Visa location bar',\r
+popup_resizable : 'G&ouml;r f&ouml;nstret skalbart',\r
+popup_dependent : 'Beroende f&ouml;nster (&Auml;ndast i Mozilla/Firefox)',\r
+popup_size : 'Storek',\r
+popup_position : 'Position (X/Y)',\r
+id : 'Id',\r
+style: 'Stil',\r
+classes : 'CSS Classer',\r
+target_name : 'M&aring;l namn',\r
+langdir : 'Skrift riktning',\r
+target_langcode : 'M&aring;l spr&aring;k',\r
+langcode : 'Spr&aring;k k&aring;d',\r
+encoding : 'Tecken konvertering',\r
+mime : 'M&aring;lets MIME typ',\r
+rel : 'Relation sida till m&aring;l',\r
+rev : 'Relation m&aring;l till sida',\r
+tabindex : 'Tabindex',\r
+accesskey : 'Accesskey',\r
+ltr : 'V&auml;nster till h&ouml;ger',\r
+rtl : 'H&ouml;ger till v&auml;nster'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advlink/langs/zh_cn.js b/webcit/tiny_mce/plugins/advlink/langs/zh_cn.js
new file mode 100644 (file)
index 0000000..9cd3de9
--- /dev/null
@@ -0,0 +1,46 @@
+// Simplified Chinese lang variables contributed by tom_cat (thomaswangyang@gmail.com)\r
+\r
+tinyMCE.addToLang('advlink',{\r
+general_tab : 'Ò»°ã',\r
+popup_tab : 'µ¯³ö',\r
+events_tab : 'ʼþ',\r
+advanced_tab : '¸ß¼¶',\r
+general_props : 'Ò»°ãÊôÐÔ',\r
+popup_props : 'µ¯³öÊôÐÔ',\r
+event_props : 'ʼþÊôÐÔ',\r
+advanced_props : '¸ß¼¼ÊôÐÔ',\r
+popup_opts : 'Ñ¡Ïî',\r
+anchor_names : 'êµã',\r
+target_same : 'ÔÚµ±Ç°´°¿Ú/¿ò¼ÜÖдò¿ª',\r
+target_parent : 'ÔÚ¸¸´°¿Ú/¿ò¼ÜÖдò¿ª',\r
+target_top : 'ÔÚ¶¥¶Ë´°¿Ú/¿ò¼ÜÖдò¿ª',\r
+target_blank : 'ÔÚд°¿ÚÖдò¿ª',\r
+popup : 'Javascript µ¯³ö',\r
+popup_url : 'µ¯³öµØÖ·',\r
+popup_name : 'µ¯³ö´°¿ÚÃû',\r
+popup_return : '²åÈë \'return false\'',\r
+popup_scrollbars : 'ÏÔʾ¹ö¶¯Ìõ',\r
+popup_statusbar : 'ÏÔʾ״̬Ìõ',\r
+popup_toolbar : 'ÏÔʾ¹¤¾ßÌõ',\r
+popup_menubar : 'ÏÔʾ²Ëµ¥Ìõ',\r
+popup_location : 'ÏÔʾµØÖ·Ìõ',\r
+popup_resizable : '´°¿Ú´óС¿É±ä',\r
+popup_dependent : 'Dependent (½öÏÞÓÚ Mozilla/Firefox)',\r
+popup_size : '´óС',\r
+popup_position : 'λÖà(X/Y)',\r
+id : '±êʶ',\r
+style: 'Ñùʽ',\r
+classes : 'Àà',\r
+target_name : 'Ä¿±êÃû³Æ',\r
+langdir : 'Êéд·½Ïò',\r
+target_langcode : 'Ä¿±êÓïÑÔ',\r
+langcode : 'ÓïÑÔ±àÂë',\r
+encoding : 'Ä¿±êÎÄ×Ö±àÂë',\r
+mime : 'Ä¿±ê MIME ÖÖÀà',\r
+rel : 'Ò³ÓëÄ¿±êµÄ¹Øϵ',\r
+rev : 'Ä¿±êÓëÒ³µÄ¹Øϵ',\r
+tabindex : 'Tabindex',\r
+accesskey : 'Accesskey',\r
+ltr : '´Ó×óµ½ÓÒ',\r
+rtl : '´ÓÓÒµ½×ó'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advlink/langs/zh_tw.js b/webcit/tiny_mce/plugins/advlink/langs/zh_tw.js
new file mode 100644 (file)
index 0000000..ebeef26
--- /dev/null
@@ -0,0 +1,47 @@
+// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// ÁcÅ餤¤å BIG-5 ¡F¼Æ¦ìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com\r
+\r
+tinyMCE.addToLang('advlink',{\r
+general_tab : '¤@¯ë',\r
+popup_tab : '¸õ²{µøµ¡',\r
+events_tab : '¨Æ¥ó',\r
+advanced_tab : '¶i¶¥',\r
+general_props : '¤@¯ëÄÝ©Ê',\r
+popup_props : '¸õ²{µøµ¡ÄÝ©Ê',\r
+event_props : '¨Æ¥óÄÝ©Ê',\r
+advanced_props : '¶i¶¥ÄÝ©Ê',\r
+popup_opts : '¿ï¶µ',\r
+anchor_names : '³sµ²ÂI',\r
+target_same : '©ó¦¹µøµ¡©Î®Ø¬[¤¤¶}±Ò',\r
+target_parent : '©ó¤W¼hµøµ¡©Î®Ø¬[¤¤¶}±Ò',\r
+target_top : '©ó¥D®Ø¬[¤¤¶}±Ò¡]·|¨ú¥N¥þ³¡®Ø¬[¡^',\r
+target_blank : '©ó·sµøµ¡¤¤¶}±Ò',\r
+popup : 'Javascript ¸õ²{µøµ¡',\r
+popup_url : '¸õ²{µøµ¡ºô§}',\r
+popup_name : 'µøµ¡¦WºÙ',\r
+popup_return : '´¡¤J "¸T¦^¤W­¶"',\r
+popup_scrollbars : 'Åã¥Ü²¾°Ê¶b',\r
+popup_statusbar : 'Åã¥Üª¬ºA¦C',\r
+popup_toolbar : 'Åã¥Ü¤u¨ã¦C',\r
+popup_menubar : 'Åã¥Ü¿ï³æ¦C',\r
+popup_location : 'Åã¥Ü¦ì¸m¦C',\r
+popup_resizable : '¥i¤j¤p¤Æµøµ¡',\r
+popup_dependent : '±qÄÝ©Ê¡]¶È¾A¥Î Mozilla / Firefox ¡^',\r
+popup_size : '¤j¤p',\r
+popup_position : '¦ì¸m¡] X / Y ¶b¡^',\r
+id : '½s½X',\r
+style: '¦¡¼Ë',\r
+classes : '¤ÀÃþ',\r
+target_name : '¹ï¶H¦WºÙ',\r
+langdir : '»y¨¥¥Îªk',\r
+target_langcode : '¹ï¶H»y¨¥',\r
+langcode : '»y½X',\r
+encoding : '¹ï¶H¦r¤¸½s½X',\r
+mime : '¹ï¶H MIME «¬¦¡',\r
+rel : '±Nºô­¶»P¹ï¶H²£¥ÍÃöÁp',\r
+rev : '±N¹ï¶H»Pºô­¶²£¥ÍÃöÁp',\r
+tabindex : '¼ÐÅÒ¯Á¤Þ',\r
+accesskey : '¦s¨úÁä',\r
+ltr : '¥Ñ¥ª¦Ü¥k',\r
+rtl : '¥Ñ¥k¦Ü¥ª'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/advlink/langs/zh_tw_utf8.js b/webcit/tiny_mce/plugins/advlink/langs/zh_tw_utf8.js
new file mode 100644 (file)
index 0000000..e360a6d
--- /dev/null
@@ -0,0 +1,47 @@
+// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// 繁體中文 UTF-8 ;數位應用坊製作; twapweb_AT_gmail_DOT_com\r
+\r
+tinyMCE.addToLang('advlink',{\r
+general_tab : '一般',\r
+popup_tab : '跳現視窗',\r
+events_tab : '事件',\r
+advanced_tab : '進階',\r
+general_props : '一般屬性',\r
+popup_props : '跳現視窗屬性',\r
+event_props : '事件屬性',\r
+advanced_props : '進階屬性',\r
+popup_opts : '選項',\r
+anchor_names : '連結點',\r
+target_same : '於此視窗或框架中開啟',\r
+target_parent : '於上層視窗或框架中開啟',\r
+target_top : '於主框架中開啟(會取代全部框架)',\r
+target_blank : '於新視窗中開啟',\r
+popup : 'Javascript 跳現視窗',\r
+popup_url : '跳現視窗網址',\r
+popup_name : '視窗名稱',\r
+popup_return : '插入 "禁回上頁"',\r
+popup_scrollbars : '顯示移動軸',\r
+popup_statusbar : '顯示狀態列',\r
+popup_toolbar : '顯示工具列',\r
+popup_menubar : '顯示選單列',\r
+popup_location : '顯示位置列',\r
+popup_resizable : '可大小化視窗',\r
+popup_dependent : '從屬性(僅適用 Mozilla / Firefox )',\r
+popup_size : '大小',\r
+popup_position : '位置( X / Y 軸)',\r
+id : '編碼',\r
+style: '式樣',\r
+classes : '分類',\r
+target_name : '對象名稱',\r
+langdir : '語言用法',\r
+target_langcode : '對象語言',\r
+langcode : '語碼',\r
+encoding : '對象字元編碼',\r
+mime : '對象 MIME 型式',\r
+rel : '將網頁與對象產生關聯',\r
+rev : '將對象與網頁產生關聯',\r
+tabindex : '標籤索引',\r
+accesskey : '存取鍵',\r
+ltr : '由左至右',\r
+rtl : '由右至左'\r
+});\r
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..2299ac8
--- /dev/null
@@ -0,0 +1,334 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_insert_link_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/functions.js"></script>\r
+       <link href="css/advlink.css" rel="stylesheet" type="text/css" />\r
+       <base target="_self" />\r
+</head>\r
+<body id="advlink" onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+    <form onsubmit="insertAction();return false;" action="#">\r
+               <div class="tabs">\r
+                       <ul>\r
+                               <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{$lang_advlink_general_tab}</a></span></li>\r
+                               <li id="popup_tab"><span><a href="javascript:mcTabs.displayTab('popup_tab','popup_panel');" onmousedown="return false;">{$lang_advlink_popup_tab}</a></span></li>\r
+                               <li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{$lang_advlink_events_tab}</a></span></li>\r
+                               <li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{$lang_advlink_advanced_tab}</a></span></li>\r
+                       </ul>\r
+               </div>\r
+\r
+               <div class="panel_wrapper">\r
+                       <div id="general_panel" class="panel current">\r
+                               <fieldset>\r
+                                       <legend>{$lang_advlink_general_props}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                 <td nowrap="nowrap"><label id="hreflabel" for="href">{$lang_insert_link_url}</label></td>\r
+                                                 <td><table border="0" cellspacing="0" cellpadding="0">\r
+                                                               <tr>\r
+                                                                 <td><input id="href" name="href" type="text" value="" onchange="selectByValue(this.form,'linklisthref',this.value);" /></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">{$lang_link_list}</label></td>\r
+                                                       <td colspan="2" id="linklisthrefcontainer">&nbsp;</td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="anchorlist">{$lang_advlink_anchor_names}</label></td>\r
+                                                       <td colspan="2" id="anchorlistcontainer">&nbsp;</td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td><label id="targetlistlabel" for="targetlist">{$lang_insert_link_target}</label></td>\r
+                                                       <td id="targetlistcontainer">&nbsp;</td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td nowrap="nowrap"><label id="titlelabel" for="title">{$lang_theme_insert_link_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">{$lang_class_name}</label></td>\r
+                                                       <td>\r
+                                                                <select id="classlist" name="classlist" onchange="changeClass();">\r
+                                                                       <option value="" selected>{$lang_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>{$lang_advlink_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">{$lang_advlink_popup}</label>\r
+\r
+                                       <table border="0" cellpadding="0" cellspacing="4">\r
+                                               <tr>\r
+                                                       <td nowrap="nowrap"><label for="popupurl">{$lang_advlink_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 nowrap="nowrap"><label for="popupname">{$lang_advlink_popup_name}</label>&nbsp;</td>\r
+                                                       <td><input type="text" name="popupname" id="popupname" value="" onchange="buildOnClick();" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td nowrap="nowrap"><label>{$lang_advlink_popup_size}</label>&nbsp;</td>\r
+                                                       <td nowrap="nowrap">\r
+                                                               <input type="text" id="popupwidth" name="popupwidth" value="" onchange="buildOnClick();" /> x\r
+                                                               <input type="text" id="popupheight" name="popupheight" value="" onchange="buildOnClick();" /> px\r
+                                                       </td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td nowrap="nowrap" id="labelleft"><label>{$lang_advlink_popup_position}</label>&nbsp;</td>\r
+                                                       <td nowrap="nowrap">\r
+                                                               <input type="text" id="popupleft" name="popupleft" value="" onchange="buildOnClick();" /> /                                \r
+                                                               <input type="text" id="popuptop" name="popuptop" value="" onchange="buildOnClick();" /> (c /c = center)\r
+                                                       </td>\r
+                                               </tr>\r
+                                       </table>\r
+\r
+                                       <fieldset>\r
+                                               <legend>{$lang_advlink_popup_opts}</legend>\r
+\r
+                                               <table border="0" cellpadding="0" cellspacing="4">\r
+                                                       <tr>\r
+                                                               <td><input type="checkbox" id="popuplocation" name="popuplocation" class="checkbox" onchange="buildOnClick();" /></td>\r
+                                                               <td nowrap="nowrap"><label id="popuplocationlabel" for="popuplocation">{$lang_advlink_popup_location}</label></td>\r
+                                                               <td><input type="checkbox" id="popupscrollbars" name="popupscrollbars" class="checkbox" onchange="buildOnClick();" /></td>\r
+                                                               <td nowrap="nowrap"><label id="popupscrollbarslabel" for="popupscrollbars">{$lang_advlink_popup_scrollbars}</label></td>\r
+                                                       </tr>\r
+                                                       <tr>\r
+                                                               <td><input type="checkbox" id="popupmenubar" name="popupmenubar" class="checkbox" onchange="buildOnClick();" /></td>\r
+                                                               <td nowrap="nowrap"><label id="popupmenubarlabel" for="popupmenubar">{$lang_advlink_popup_menubar}</label></td>\r
+                                                               <td><input type="checkbox" id="popupresizable" name="popupresizable" class="checkbox" onchange="buildOnClick();" /></td>\r
+                                                               <td nowrap="nowrap"><label id="popupresizablelabel" for="popupresizable">{$lang_advlink_popup_resizable}</label></td>\r
+                                                       </tr>\r
+                                                       <tr>\r
+                                                               <td><input type="checkbox" id="popuptoolbar" name="popuptoolbar" class="checkbox" onchange="buildOnClick();" /></td>\r
+                                                               <td nowrap="nowrap"><label id="popuptoolbarlabel" for="popuptoolbar">{$lang_advlink_popup_toolbar}</label></td>\r
+                                                               <td><input type="checkbox" id="popupdependent" name="popupdependent" class="checkbox" onchange="buildOnClick();" /></td>\r
+                                                               <td nowrap="nowrap"><label id="popupdependentlabel" for="popupdependent">{$lang_advlink_popup_dependent}</label></td>\r
+                                                       </tr>\r
+                                                       <tr>\r
+                                                               <td><input type="checkbox" id="popupstatus" name="popupstatus" class="checkbox" onchange="buildOnClick();" /></td>\r
+                                                               <td nowrap="nowrap"><label id="popupstatuslabel" for="popupstatus">{$lang_advlink_popup_statusbar}</label></td>\r
+                                                               <td><input type="checkbox" id="popupreturn" name="popupreturn" class="checkbox" onchange="buildOnClick();" /></td>\r
+                                                               <td nowrap="nowrap"><label id="popupreturnlabel" for="popupreturn">{$lang_advlink_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>{$lang_advlink_advanced_props}</legend>\r
+\r
+                                       <table border="0" cellpadding="0" cellspacing="4">\r
+                                               <tr>\r
+                                                       <td class="column1"><label id="idlabel" for="id">{$lang_advlink_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">{$lang_advlink_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">{$lang_advlink_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">{$lang_advlink_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">{$lang_advlink_langdir}</label></td> \r
+                                                       <td>\r
+                                                               <select id="dir" name="dir"> \r
+                                                                               <option value="">{$lang_not_set}</option> \r
+                                                                               <option value="ltr">{$lang_advlink_ltr}</option> \r
+                                                                               <option value="rtl">{$lang_advlink_rtl}</option> \r
+                                                               </select>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label id="hreflanglabel" for="hreflang">{$lang_advlink_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">{$lang_advlink_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">{$lang_advlink_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">{$lang_advlink_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">{$lang_advlink_rel}</label></td>\r
+                                                       <td><select id="rel" name="rel"> \r
+                                                                       <option value="">{$lang_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="revlabel" for="rev">{$lang_advlink_rev}</label></td>\r
+                                                       <td><select id="rev" name="rev"> \r
+                                                                       <option value="">{$lang_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">{$lang_advlink_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">{$lang_advlink_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>{$lang_advlink_event_props}</legend>\r
+\r
+                                       <table border="0" cellpadding="0" cellspacing="4">\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
+                       <div style="float: left">\r
+                               <input type="button" id="insert" name="insert" value="{$lang_insert}" onclick="insertAction();" />\r
+                       </div>\r
+\r
+                       <div style="float: right">\r
+                               <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+                       </div>\r
+               </div>\r
+    </form>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/plugins/advlink/readme.txt b/webcit/tiny_mce/plugins/advlink/readme.txt
new file mode 100644 (file)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/webcit/tiny_mce/plugins/autosave/editor_plugin.js b/webcit/tiny_mce/plugins/autosave/editor_plugin.js
new file mode 100644 (file)
index 0000000..cc05008
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.importPluginLanguagePack('autosave','en,sv,cs,he,nb,hu,de,da,ru,ru_KOI8-R,ru_UTF-8,nn,fi,cy,es,is,pl,pt_br');function TinyMCE_autosave_getInfo(){return{longname:'Auto save',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_autosave.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_autosave_beforeUnloadHandler(){var msg=tinyMCE.getLang("lang_autosave_unload_msg");var anyDirty=false;for(var n in tinyMCE.instances){var inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;if(inst.isDirty())return msg;}return;}window.onbeforeunload=TinyMCE_autosave_beforeUnloadHandler;
\ 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..0cc8b32
--- /dev/null
@@ -0,0 +1,30 @@
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('autosave', 'en,sv,cs,he,nb,hu,de,da,ru,ru_KOI8-R,ru_UTF-8,nn,fi,cy,es,is,pl,pt_br');\r
+\r
+function TinyMCE_autosave_getInfo() {\r
+       return {\r
+               longname : 'Auto save',\r
+               author : 'Moxiecode Systems',\r
+               authorurl : 'http://tinymce.moxiecode.com',\r
+               infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_autosave.html',\r
+               version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+       };\r
+};\r
+\r
+function TinyMCE_autosave_beforeUnloadHandler() {\r
+       var msg = tinyMCE.getLang("lang_autosave_unload_msg");\r
+\r
+       var anyDirty = false;\r
+       for (var n in tinyMCE.instances) {\r
+               var inst = tinyMCE.instances[n];\r
+               if (!tinyMCE.isInstance(inst))\r
+                       continue;\r
+\r
+               if (inst.isDirty())\r
+                       return msg;\r
+       }\r
+\r
+       return;\r
+}\r
+\r
+window.onbeforeunload = TinyMCE_autosave_beforeUnloadHandler;\r
diff --git a/webcit/tiny_mce/plugins/autosave/langs/cs.js b/webcit/tiny_mce/plugins/autosave/langs/cs.js
new file mode 100644 (file)
index 0000000..8033482
--- /dev/null
@@ -0,0 +1,11 @@
+/**\r
+ * Czech lang variables \r
+ * encoding: utf-8\r
+ *  \r
+ * $Id: cs.js,v 1.1 2005/10/18 13:55:41 spocke Exp $ \r
+ */  \r
+\r
+tinyMCE.addToLang('',{\r
+autosave_unload_msg : 'Změny, které jste udělal(a) budou ztraceny, jestliže opustíte tuto stránku.'\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/autosave/langs/cy.js b/webcit/tiny_mce/plugins/autosave/langs/cy.js
new file mode 100644 (file)
index 0000000..60e79b9
--- /dev/null
@@ -0,0 +1,5 @@
+// EN lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+autosave_unload_msg : 'Byddi di\'n colli unrhyw newidiadau os wyt ti\'n gadael y dudalen hon.'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/autosave/langs/da.js b/webcit/tiny_mce/plugins/autosave/langs/da.js
new file mode 100644 (file)
index 0000000..f66dfe3
--- /dev/null
@@ -0,0 +1,5 @@
+// DK lang variables contributed by Jan Moelgaard\r
+\r
+tinyMCE.addToLang('',{\r
+autosave_unload_msg : 'De &#230;ndringer, du har lavet, vil g&#229; tabt, hvis du lukker denne side.'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/autosave/langs/de.js b/webcit/tiny_mce/plugins/autosave/langs/de.js
new file mode 100644 (file)
index 0000000..90060a9
--- /dev/null
@@ -0,0 +1,5 @@
+// DE lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+autosave_unload_msg : 'Alle Ver&auml;nderungen an dieser Seite werden verlorengehen, wenn Sie diese Seite jetzt verlassen.'\r
+});\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..0195133
--- /dev/null
@@ -0,0 +1,5 @@
+// EN lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+autosave_unload_msg : 'The changes you made will be lost if you navigate away from this page.'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/autosave/langs/es.js b/webcit/tiny_mce/plugins/autosave/langs/es.js
new file mode 100644 (file)
index 0000000..de3dc36
--- /dev/null
@@ -0,0 +1,13 @@
+/**\r
+ * ES lang variables\r
+ * \r
+ * Authors : Alvaro Velasco,\r
+ *           Adolfo Sanz De Diego (asanzdiego) <asanzdiego@yahoo.es>,\r
+ *           Carlos C Soto (eclipxe) <csoto@sia-solutions.com>\r
+ * Last Updated : October 17, 2005\r
+ * TinyMCE Version : 2.0RC3\r
+ */\r
+\r
+tinyMCE.addToLang('',{\r
+autosave_unload_msg : 'Los cambios que hayas hecho pueden perderse si navegas fuera de esta página.'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/autosave/langs/fr.js b/webcit/tiny_mce/plugins/autosave/langs/fr.js
new file mode 100644 (file)
index 0000000..957a136
--- /dev/null
@@ -0,0 +1,5 @@
+// Traduit par Normand Lamoureux le 2005-11-12\r
+\r
+tinyMCE.addToLang('',{\r
+autosave_unload_msg : 'Vos modifications seront perdues si vous quittez cette page.'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/autosave/langs/he.js b/webcit/tiny_mce/plugins/autosave/langs/he.js
new file mode 100644 (file)
index 0000000..cf3fa3c
--- /dev/null
@@ -0,0 +1,5 @@
+// HE lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+autosave_unload_msg : 'äùéðåééí ùáéöòú éàáãå àí úòæåá àú ãó æä.'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/autosave/langs/hu.js b/webcit/tiny_mce/plugins/autosave/langs/hu.js
new file mode 100644 (file)
index 0000000..53ba609
--- /dev/null
@@ -0,0 +1,5 @@
+// HU lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+autosave_unload_msg : 'A módosítások el fognak veszni, ha elnavigálsz az oldalról.'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/autosave/langs/is.js b/webcit/tiny_mce/plugins/autosave/langs/is.js
new file mode 100644 (file)
index 0000000..58c86a8
--- /dev/null
@@ -0,0 +1,5 @@
+// Iceland lang variables by Johannes Birgir Jensson\r
+\r
+tinyMCE.addToLang('',{\r
+autosave_unload_msg : 'Breytingarnar sem þú gerðir munu hverfa ef þú flakkar annað.'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/autosave/langs/nb.js b/webcit/tiny_mce/plugins/autosave/langs/nb.js
new file mode 100644 (file)
index 0000000..149c159
--- /dev/null
@@ -0,0 +1,6 @@
+// nb = Norwegian (bokm&aring;l) lang variables by Knut B. Jacobsen\r
+\r
+tinyMCE.addToLang('',{\r
+autosave_unload_msg : 'Forandringene du gjorde forsvinner om du velger &aring; forlate denne siden.'\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/autosave/langs/nl.js b/webcit/tiny_mce/plugins/autosave/langs/nl.js
new file mode 100644 (file)
index 0000000..608764c
--- /dev/null
@@ -0,0 +1,5 @@
+// NL lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+autosave_unload_msg : 'De gemaakte veranderingen zullen verloren gaan als u naar een andere pagina navigeert.'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/autosave/langs/nn.js b/webcit/tiny_mce/plugins/autosave/langs/nn.js
new file mode 100644 (file)
index 0000000..d1f261f
--- /dev/null
@@ -0,0 +1,6 @@
+// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen\r
+\r
+tinyMCE.addToLang('',{\r
+autosave_unload_msg : 'Forandringene du gjorde forsvinner om du velger &aring; forlate denne siden.'\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/autosave/langs/pl.js b/webcit/tiny_mce/plugins/autosave/langs/pl.js
new file mode 100644 (file)
index 0000000..6656f5c
--- /dev/null
@@ -0,0 +1,8 @@
+// PL lang variables\r
+// fixed by Wooya\r
+// http://www.mfusion.prv.pl\r
+// fixed by lemiel 14.11.2005\r
+\r
+tinyMCE.addToLang('',{\r
+autosave_unload_msg : 'Zmiany jakie wprowadzi³e¶ zostan± utracone, je¶li opu¶cisz teraz tê stronê.'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/autosave/langs/pt_br.js b/webcit/tiny_mce/plugins/autosave/langs/pt_br.js
new file mode 100644 (file)
index 0000000..025a1b6
--- /dev/null
@@ -0,0 +1,12 @@
+/**\r
+ * pt_br lang variables\r
+ * Brazilian Portuguese\r
+ *\r
+ * Authors : \r
+ *           Marcio Barbosa (mpg) <mpg@mpg.com.br>\r
+ * Last Updated : November 26, 2005\r
+ * TinyMCE Version : 2.0RC4\r
+ */\r
+tinyMCE.addToLang('',{\r
+autosave_unload_msg : 'As modificações feitas serão perdidas caso você navegue fora desta página.'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/autosave/langs/ru.js b/webcit/tiny_mce/plugins/autosave/langs/ru.js
new file mode 100644 (file)
index 0000000..a58fa40
--- /dev/null
@@ -0,0 +1,5 @@
+// RU lang variables cp1251\r
+\r
+tinyMCE.addToLang('',{\r
+autosave_unload_msg : 'Èçìåíåíèÿ íå áóäóò ïîòåðÿíû åñëè Âû óéä¸òå ñ ýòîé ñòðàíèöû.'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/autosave/langs/ru_KOI8-R.js b/webcit/tiny_mce/plugins/autosave/langs/ru_KOI8-R.js
new file mode 100644 (file)
index 0000000..f43c325
--- /dev/null
@@ -0,0 +1,5 @@
+// RU lang variables KOI8-R\r
+\r
+tinyMCE.addToLang('',{\r
+autosave_unload_msg : 'éÚÍÅÎÅÎÉÑ ÎÅ ÂÕÄÕÔ ÐÏÔÅÒÑÎÙ ÅÓÌÉ ÷Ù ÕÊÄ£ÔÅ Ó ÜÔÏÊ ÓÔÒÁÎÉÃÙ.'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/autosave/langs/ru_UTF-8.js b/webcit/tiny_mce/plugins/autosave/langs/ru_UTF-8.js
new file mode 100644 (file)
index 0000000..092ec6a
--- /dev/null
@@ -0,0 +1,5 @@
+// RU lang variables UTF-8\r
+\r
+tinyMCE.addToLang('',{\r
+autosave_unload_msg : 'Изменения не будут потеряны если Вы уйдёте с этой страницы.'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/autosave/langs/sk.js b/webcit/tiny_mce/plugins/autosave/langs/sk.js
new file mode 100644 (file)
index 0000000..0224a75
--- /dev/null
@@ -0,0 +1,13 @@
+/**\r
+ * Slovak lang variables \r
+ * encoding: utf-8\r
+ * \r
+ * @author Vladimir VASIL vvasil@post.sk\r
+ *    \r
+ * $Id: sk.js,v 1.1 2005/11/22 20:56:44 spocke Exp $ \r
+ */  \r
+\r
+tinyMCE.addToLang('',{\r
+autosave_unload_msg : 'Zmeny, ktoré ste urobyl(a) budú stratené, ak opustíte túto stránku.'\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/autosave/langs/sv.js b/webcit/tiny_mce/plugins/autosave/langs/sv.js
new file mode 100644 (file)
index 0000000..7c1b66e
--- /dev/null
@@ -0,0 +1,6 @@
+// SE lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+autosave_unload_msg : 'F&ouml;r&auml;ndringarna du gjorde kommer att g&aring; f&ouml;rlorade om du v&auml;ljer att l&auml;mna denna sida.'\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/autosave/langs/zh_cn.js b/webcit/tiny_mce/plugins/autosave/langs/zh_cn.js
new file mode 100644 (file)
index 0000000..260b67c
--- /dev/null
@@ -0,0 +1,5 @@
+// Simplified Chinese lang variables contributed by tom_cat (thomaswangyang@gmail.com)\r
+\r
+tinyMCE.addToLang('',{\r
+autosave_unload_msg : 'Èç¹ûÄúÀ뿪±¾Ò³£¬ÄúËù×÷µÄÐ޸Ľ«»áÏûʧ¡£'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/autosave/langs/zh_tw.js b/webcit/tiny_mce/plugins/autosave/langs/zh_tw.js
new file mode 100644 (file)
index 0000000..ebf0f60
--- /dev/null
@@ -0,0 +1,6 @@
+// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// ÁcÅ餤¤å BIG-5 ¡F¼Æ¦ìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com\r
+\r
+tinyMCE.addToLang('',{\r
+autosave_unload_msg : '©Ò¦³¤w§@ªº§ïÅÜ·|¦]±zÂ÷¶}¦¹­¶­±¦Ó¦Û°Ê©ñ±ó¤£Àx¦s'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/autosave/langs/zh_tw_utf8.js b/webcit/tiny_mce/plugins/autosave/langs/zh_tw_utf8.js
new file mode 100644 (file)
index 0000000..e18fc00
--- /dev/null
@@ -0,0 +1,6 @@
+// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// 繁體中文 UTF-8 ;數位應用坊製作; twapweb_AT_gmail_DOT_com\r
+\r
+tinyMCE.addToLang('',{\r
+autosave_unload_msg : '所有已作的改變會因您離開此頁面而自動放棄不儲存'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/autosave/readme.txt b/webcit/tiny_mce/plugins/autosave/readme.txt
new file mode 100644 (file)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/webcit/tiny_mce/plugins/contextmenu/css/contextmenu.css b/webcit/tiny_mce/plugins/contextmenu/css/contextmenu.css
new file mode 100644 (file)
index 0000000..58bb337
--- /dev/null
@@ -0,0 +1,60 @@
+.contextMenuIEPopup {\r
+       padding: 0px;\r
+       margin: 0px;\r
+       border: 0px;\r
+       overflow: hidden;\r
+}\r
+\r
+.contextMenu {\r
+       position: absolute;\r
+       cursor: default;\r
+       z-index: 1000;\r
+       border: 1px solid #D4D0C8;\r
+       background-color: #FFFFFF;\r
+}\r
+\r
+.contextMenuItem, .contextMenuItemOver {\r
+}\r
+\r
+.contextMenuItemOver {\r
+       background-color: #B6BDD2;\r
+}\r
+\r
+.contextMenuSeparator {\r
+       width: 100%;\r
+       background-color: #D4D0C8;\r
+       border: 0px;\r
+}\r
+\r
+.contextMenuImage, .contextMenuItemDisabled {\r
+       border: 0px;\r
+}\r
+\r
+.contextMenuIcon {\r
+       background-color: #F0F0EE;\r
+}\r
+\r
+.contextMenuItemOver .contextMenuIcon {\r
+       background-color: #B6BDD2;\r
+}\r
+\r
+.contextMenuIcon {\r
+       background-color: #F0F0EE;\r
+}\r
+\r
+.contextMenuItemDisabled img {\r
+       filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);\r
+       -moz-opacity:0.3;\r
+       opacity: 0.3;\r
+}\r
+\r
+.contextMenuText {\r
+       font-family: Tahoma, Verdana, Arial, Helvetica;\r
+       font-size: 11px;\r
+       margin-left: 5px;\r
+       margin-right: 10px;\r
+}\r
+\r
+.contextMenuItemDisabled {\r
+       color: #AAAAAA;\r
+}\r
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..dc4567c
--- /dev/null
@@ -0,0 +1 @@
+if(!tinyMCE.settings['contextmenu_skip_plugin_css'])tinyMCE.loadCSS(tinyMCE.baseURL+"/plugins/contextmenu/css/contextmenu.css");var TinyMCE_contextmenu_contextMenu=null;function TinyMCE_contextmenu_getInfo(){return{longname:'Context menus',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_contextmenu.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_contextmenu_initInstance(inst){if(tinyMCE.isMSIE5_0&&tinyMCE.isOpera)return;tinyMCE.addEvent(inst.getDoc(),"click",TinyMCE_contextmenu_hideContextMenu);tinyMCE.addEvent(inst.getDoc(),"keypress",TinyMCE_contextmenu_hideContextMenu);tinyMCE.addEvent(inst.getDoc(),"keydown",TinyMCE_contextmenu_hideContextMenu);tinyMCE.addEvent(document,"click",TinyMCE_contextmenu_hideContextMenu);tinyMCE.addEvent(document,"keypress",TinyMCE_contextmenu_hideContextMenu);tinyMCE.addEvent(document,"keydown",TinyMCE_contextmenu_hideContextMenu);var contextMenu=new ContextMenu({commandhandler:"TinyMCE_contextmenu_commandHandler",spacer_image:tinyMCE.baseURL+"/plugins/contextmenu/images/spacer.gif"});TinyMCE_contextmenu_contextMenu=contextMenu;if(tinyMCE.isGecko){tinyMCE.addEvent(inst.getDoc(),"contextmenu",function(e){TinyMCE_contextmenu_showContextMenu(tinyMCE.isMSIE?inst.contentWindow.event:e,inst);});}else tinyMCE.addEvent(inst.getDoc(),"contextmenu",TinyMCE_contextmenu_onContextMenu);}function TinyMCE_contextmenu_onContextMenu(e){var elm=tinyMCE.isMSIE?e.srcElement:e.target;var targetInst,body;if((body=tinyMCE.getParentElement(elm,"body"))!=null){for(var n in tinyMCE.instances){var inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;if(body==inst.getBody()){targetInst=inst;break;}}return TinyMCE_contextmenu_showContextMenu(tinyMCE.isMSIE?targetInst.contentWindow.event:e,targetInst);}}function TinyMCE_contextmenu_showContextMenu(e,inst){function getAttrib(elm,name){return elm.getAttribute(name)?elm.getAttribute(name):"";}var x,y,elm,contextMenu;var pos=tinyMCE.getAbsPosition(inst.iframeElement);x=tinyMCE.isMSIE?e.screenX:pos.absLeft+(e.pageX-inst.getBody().scrollLeft);y=tinyMCE.isMSIE?e.screenY:pos.absTop+(e.pageY-inst.getBody().scrollTop);elm=tinyMCE.isMSIE?e.srcElement:e.target;contextMenu=TinyMCE_contextmenu_contextMenu;contextMenu.inst=inst;window.setTimeout(function(){var theme=tinyMCE.getParam("theme");contextMenu.clearAll();var sel=inst.getSelectedText().length!=0||elm.nodeName=="IMG";contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/cut.gif","$lang_cut_desc","Cut","",!sel);contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/copy.gif","$lang_copy_desc","Copy","",!sel);contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/paste.gif","$lang_paste_desc","Paste","",false);elm=tinyMCE.getParentElement(elm,"img,table,td");if(elm){switch(elm.nodeName){case "IMG":contextMenu.addSeparator();if(tinyMCE.getAttrib(elm,'class').indexOf('mceItemFlash')==0)contextMenu.addItem(tinyMCE.baseURL+"/plugins/flash/images/flash.gif","$lang_flash_props","mceFlash");else contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/image.gif","$lang_image_props_desc",typeof(TinyMCE_advimage_getControlHTML)!="undefined"?"mceAdvImage":"mceImage");break;case "TABLE":case "TD":if(typeof(TinyMCE_table_getControlHTML)!="undefined"){var colspan=(elm.nodeName=="TABLE")?"":getAttrib(elm,"colspan");var rowspan=(elm.nodeName=="TABLE")?"":getAttrib(elm,"rowspan");colspan=colspan==""?"1":colspan;rowspan=rowspan==""?"1":rowspan;contextMenu.addSeparator();contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/cut.gif","$lang_table_cut_row_desc","mceTableCutRow");contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/copy.gif","$lang_table_copy_row_desc","mceTableCopyRow");contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/paste.gif","$lang_table_paste_row_before_desc","mceTablePasteRowBefore","",inst.tableRowClipboard==null);contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/paste.gif","$lang_table_paste_row_after_desc","mceTablePasteRowAfter","",inst.tableRowClipboard==null);contextMenu.addSeparator();contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table.gif","$lang_table_desc","mceInsertTable","insert");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table.gif","$lang_table_props_desc","mceInsertTable");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_cell_props.gif","$lang_table_cell_desc","mceTableCellProps");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_delete.gif","$lang_table_del","mceTableDelete");contextMenu.addSeparator();contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_row_props.gif","$lang_table_row_desc","mceTableRowProps");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_insert_row_before.gif","$lang_table_row_before_desc","mceTableInsertRowBefore");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_insert_row_after.gif","$lang_table_row_after_desc","mceTableInsertRowAfter");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_delete_row.gif","$lang_table_delete_row_desc","mceTableDeleteRow");contextMenu.addSeparator();contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_insert_col_before.gif","$lang_table_col_before_desc","mceTableInsertColBefore");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_insert_col_after.gif","$lang_table_col_after_desc","mceTableInsertColAfter");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_delete_col.gif","$lang_table_delete_col_desc","mceTableDeleteCol");contextMenu.addSeparator();contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_split_cells.gif","$lang_table_split_cells_desc","mceTableSplitCells","",(colspan=="1"&&rowspan=="1"));contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_merge_cells.gif","$lang_table_merge_cells_desc","mceTableMergeCells","",false);}break;}}else{if(typeof(TinyMCE_table_getControlHTML)!="undefined"){contextMenu.addSeparator();contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table.gif","$lang_table_desc","mceInsertTable","insert");}}contextMenu.show(x,y);},10);tinyMCE.cancelEvent(e);return false;}function TinyMCE_contextmenu_hideContextMenu(){TinyMCE_contextmenu_contextMenu.hide();}function TinyMCE_contextmenu_commandHandler(command,value){TinyMCE_contextmenu_contextMenu.hide();var ui=false;if(command=="mceInsertTable"||command=="mceTableCellProps"||command=="mceTableRowProps"||command=="mceTableMergeCells")ui=true;if(command=="Paste")value=null;TinyMCE_contextmenu_contextMenu.inst.execCommand(command,ui,value);}function ContextMenu(settings){function defParam(key,def_val){settings[key]=typeof(settings[key])!="undefined"?settings[key]:def_val;}var self=this;this.isMSIE=(navigator.appName=="Microsoft Internet Explorer");this.contextMenuDiv=document.createElement("div");this.contextMenuDiv.className="contextMenu";this.contextMenuDiv.setAttribute("class","contextMenu");this.contextMenuDiv.style.display="none";this.contextMenuDiv.style.position='absolute';this.contextMenuDiv.style.zindex=1000;this.contextMenuDiv.style.left='0px';this.contextMenuDiv.style.top='0px';this.contextMenuDiv.unselectable="on";document.body.appendChild(this.contextMenuDiv);defParam("commandhandler","");defParam("spacer_image","images/spacer.gif");this.items=new Array();this.settings=settings;this.html="";if(tinyMCE.isMSIE&&!tinyMCE.isMSIE5_0&&!tinyMCE.isOpera){this.pop=window.createPopup();doc=this.pop.document;doc.open();doc.write('<html><head><link href="'+tinyMCE.baseURL+'/plugins/contextmenu/css/contextmenu.css" rel="stylesheet" type="text/css" /></head><body unselectable="yes" class="contextMenuIEPopup"></body></html>');doc.close();}};ContextMenu.prototype.clearAll=function(){this.html="";this.contextMenuDiv.innerHTML="";};ContextMenu.prototype.addSeparator=function(){this.html+='<tr class="contextMenuItem"><td class="contextMenuIcon"><img src="'+this.settings['spacer_image']+'" width="20" height="1" class="contextMenuImage" /></td><td><img class="contextMenuSeparator" width="1" height="1" src="'+this.settings['spacer_image']+'" /></td></tr>';};ContextMenu.prototype.addItem=function(icon,title,command,value,disabled){if(title.charAt(0)=='$')title=tinyMCE.getLang(title.substring(1));var onMouseDown='';var html='';if(tinyMCE.isMSIE&&!tinyMCE.isMSIE5_0)onMouseDown='contextMenu.execCommand(\''+command+'\', \''+value+'\');return false;';else onMouseDown=this.settings['commandhandler']+'(\''+command+'\', \''+value+'\');return false;';if(icon=="")icon=this.settings['spacer_image'];if(!disabled)html+='<tr class="contextMenuItem" onmousedown="'+onMouseDown+'" onmouseover="tinyMCE.switchClass(this,\'contextMenuItemOver\');" onmouseout="tinyMCE.switchClass(this,\'contextMenuItem\');">';else html+='<tr class="contextMenuItemDisabled">';html+='<td class="contextMenuIcon"><img src="'+icon+'" width="20" height="20" class="contextMenuImage" /></td>';html+='<td><div class="contextMenuText">';html+=title;html+='</div></td>';html+='</tr>';this.html+=html;};ContextMenu.prototype.show=function(x,y){if(this.html=="")return;var html='';html+='<table border="0" cellpadding="0" cellspacing="0">';html+=this.html;html+='</table>';this.contextMenuDiv.innerHTML=html;if(tinyMCE.isMSIE&&!tinyMCE.isMSIE5_0&&!tinyMCE.isOpera){var width,height;this.contextMenuDiv.style.display="block";width=this.contextMenuDiv.offsetWidth;height=this.contextMenuDiv.offsetHeight;this.contextMenuDiv.style.display="none";this.pop.document.body.innerHTML='<div class="contextMenu">'+html+"</div>";this.pop.document.tinyMCE=tinyMCE;this.pop.document.contextMenu=this;this.pop.show(x,y,width,height);}else{this.contextMenuDiv.style.left=x+'px';this.contextMenuDiv.style.top=y+'px';this.contextMenuDiv.style.display="block";}};ContextMenu.prototype.hide=function(){if(tinyMCE.isMSIE&&!tinyMCE.isMSIE5_0&&!tinyMCE.isOpera)this.pop.hide();else this.contextMenuDiv.style.display="none";};ContextMenu.prototype.execCommand=function(command,value){eval(this.settings['commandhandler']+"(command, value);");};
\ 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..42743e4
--- /dev/null
@@ -0,0 +1,309 @@
+/* Import plugin specific language pack */\r
+//tinyMCE.importPluginLanguagePack('contextmenu', 'en,zh_cn,cs,fa,fr_ca,fr,de,nb');\r
+if (!tinyMCE.settings['contextmenu_skip_plugin_css'])\r
+       tinyMCE.loadCSS(tinyMCE.baseURL + "/plugins/contextmenu/css/contextmenu.css");\r
+\r
+// Global contextmenu class instance\r
+var TinyMCE_contextmenu_contextMenu = null;\r
+\r
+function TinyMCE_contextmenu_getInfo() {\r
+       return {\r
+               longname : 'Context menus',\r
+               author : 'Moxiecode Systems',\r
+               authorurl : 'http://tinymce.moxiecode.com',\r
+               infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_contextmenu.html',\r
+               version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+       };\r
+};\r
+\r
+function TinyMCE_contextmenu_initInstance(inst) {\r
+       // Is not working on MSIE 5.0 or Opera no contextmenu event\r
+       if (tinyMCE.isMSIE5_0 && tinyMCE.isOpera)\r
+               return;\r
+\r
+       // Add hide event handles\r
+       tinyMCE.addEvent(inst.getDoc(), "click", TinyMCE_contextmenu_hideContextMenu);\r
+       tinyMCE.addEvent(inst.getDoc(), "keypress", TinyMCE_contextmenu_hideContextMenu);\r
+       tinyMCE.addEvent(inst.getDoc(), "keydown", TinyMCE_contextmenu_hideContextMenu);\r
+       tinyMCE.addEvent(document, "click", TinyMCE_contextmenu_hideContextMenu);\r
+       tinyMCE.addEvent(document, "keypress", TinyMCE_contextmenu_hideContextMenu);\r
+       tinyMCE.addEvent(document, "keydown", TinyMCE_contextmenu_hideContextMenu);\r
+\r
+       var contextMenu = new ContextMenu({\r
+               commandhandler : "TinyMCE_contextmenu_commandHandler",\r
+               spacer_image : tinyMCE.baseURL + "/plugins/contextmenu/images/spacer.gif"\r
+       });\r
+\r
+       // Register global reference\r
+       TinyMCE_contextmenu_contextMenu = contextMenu;\r
+\r
+       // Attach contextmenu event\r
+       if (tinyMCE.isGecko) {\r
+               tinyMCE.addEvent(inst.getDoc(), "contextmenu", function(e) {TinyMCE_contextmenu_showContextMenu(tinyMCE.isMSIE ? inst.contentWindow.event : e, inst);});\r
+       } else\r
+               tinyMCE.addEvent(inst.getDoc(), "contextmenu", TinyMCE_contextmenu_onContextMenu);\r
+}\r
+\r
+function TinyMCE_contextmenu_onContextMenu(e) {\r
+       var elm = tinyMCE.isMSIE ? e.srcElement : e.target;\r
+       var targetInst, body;\r
+\r
+       // Find instance\r
+       if ((body = tinyMCE.getParentElement(elm, "body")) != null) {\r
+               for (var n in tinyMCE.instances) {\r
+                       var inst = tinyMCE.instances[n];\r
+                       if (!tinyMCE.isInstance(inst))\r
+                               continue;\r
+\r
+                       if (body == inst.getBody()) {\r
+                               targetInst = inst;\r
+                               break;\r
+                       }\r
+               }\r
+\r
+               return TinyMCE_contextmenu_showContextMenu(tinyMCE.isMSIE ? targetInst.contentWindow.event : e, targetInst);\r
+       }\r
+}\r
+\r
+function TinyMCE_contextmenu_showContextMenu(e, inst) {\r
+       function getAttrib(elm, name) {\r
+               return elm.getAttribute(name) ? elm.getAttribute(name) : "";\r
+       }\r
+\r
+       var x, y, elm, contextMenu;\r
+       var pos = tinyMCE.getAbsPosition(inst.iframeElement);\r
+\r
+       x = tinyMCE.isMSIE ? e.screenX : pos.absLeft + (e.pageX - inst.getBody().scrollLeft);\r
+       y = tinyMCE.isMSIE ? e.screenY : pos.absTop + (e.pageY - inst.getBody().scrollTop);\r
+       elm = tinyMCE.isMSIE ? e.srcElement : e.target;\r
+       contextMenu = TinyMCE_contextmenu_contextMenu;\r
+       contextMenu.inst = inst;\r
+\r
+       // Mozilla needs some time\r
+       window.setTimeout(function () {\r
+               var theme = tinyMCE.getParam("theme");\r
+\r
+               contextMenu.clearAll();\r
+               var sel = inst.getSelectedText().length != 0 || elm.nodeName == "IMG";\r
+\r
+               // Default items\r
+               contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/cut.gif", "$lang_cut_desc", "Cut", "", !sel);\r
+               contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/copy.gif", "$lang_copy_desc", "Copy", "", !sel);\r
+               contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/paste.gif", "$lang_paste_desc", "Paste", "", false);\r
+\r
+               // Get element\r
+               elm = tinyMCE.getParentElement(elm, "img,table,td");\r
+               if (elm) {\r
+                       switch (elm.nodeName) {\r
+                               case "IMG":\r
+                                       contextMenu.addSeparator();\r
+\r
+                                       // If flash\r
+                                       if (tinyMCE.getAttrib(elm, 'class').indexOf('mceItemFlash') == 0)\r
+                                               contextMenu.addItem(tinyMCE.baseURL + "/plugins/flash/images/flash.gif", "$lang_flash_props", "mceFlash");\r
+                                       else\r
+                                               contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/image.gif", "$lang_image_props_desc", typeof(TinyMCE_advimage_getControlHTML) != "undefined" ? "mceAdvImage" : "mceImage");\r
+                                       break;\r
+\r
+                               case "TABLE":\r
+                               case "TD":\r
+                                       // Is table plugin loaded\r
+                                       if (typeof(TinyMCE_table_getControlHTML) != "undefined") {\r
+                                               var colspan = (elm.nodeName == "TABLE") ? "" : getAttrib(elm, "colspan");\r
+                                               var rowspan = (elm.nodeName == "TABLE") ? "" : getAttrib(elm, "rowspan");\r
+\r
+                                               colspan = colspan == "" ? "1" : colspan;\r
+                                               rowspan = rowspan == "" ? "1" : rowspan;\r
+\r
+                                               contextMenu.addSeparator();\r
+                                               contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/cut.gif", "$lang_table_cut_row_desc", "mceTableCutRow");\r
+                                               contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/copy.gif", "$lang_table_copy_row_desc", "mceTableCopyRow");\r
+                                               contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/paste.gif", "$lang_table_paste_row_before_desc", "mceTablePasteRowBefore", "", inst.tableRowClipboard == null);\r
+                                               contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/paste.gif", "$lang_table_paste_row_after_desc", "mceTablePasteRowAfter", "", inst.tableRowClipboard == null);\r
+\r
+/*                                             contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/justifyleft.gif", "$lang_justifyleft_desc", "JustifyLeft", "", false);\r
+                                               contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/justifycenter.gif", "$lang_justifycenter_desc", "JustifyCenter", "", false);\r
+                                               contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/justifyright.gif", "$lang_justifyright_desc", "JustifyRight", "", false);\r
+                                               contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/justifyfull.gif", "$lang_justifyfull_desc", "JustifyFull", "", false);*/\r
+                                               contextMenu.addSeparator();\r
+                                               contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table.gif", "$lang_table_desc", "mceInsertTable", "insert");\r
+                                               contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table.gif", "$lang_table_props_desc", "mceInsertTable");\r
+                                               contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_cell_props.gif", "$lang_table_cell_desc", "mceTableCellProps");\r
+                                               contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_delete.gif", "$lang_table_del", "mceTableDelete");\r
+                                               contextMenu.addSeparator();\r
+                                               contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_row_props.gif", "$lang_table_row_desc", "mceTableRowProps");\r
+                                               contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_insert_row_before.gif", "$lang_table_row_before_desc", "mceTableInsertRowBefore");\r
+                                               contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_insert_row_after.gif", "$lang_table_row_after_desc", "mceTableInsertRowAfter");\r
+                                               contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_delete_row.gif", "$lang_table_delete_row_desc", "mceTableDeleteRow");\r
+                                               contextMenu.addSeparator();\r
+                                               contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_insert_col_before.gif", "$lang_table_col_before_desc", "mceTableInsertColBefore");\r
+                                               contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_insert_col_after.gif", "$lang_table_col_after_desc", "mceTableInsertColAfter");\r
+                                               contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_delete_col.gif", "$lang_table_delete_col_desc", "mceTableDeleteCol");\r
+                                               contextMenu.addSeparator();\r
+                                               contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_split_cells.gif", "$lang_table_split_cells_desc", "mceTableSplitCells", "", (colspan == "1" && rowspan == "1"));\r
+                                               contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_merge_cells.gif", "$lang_table_merge_cells_desc", "mceTableMergeCells", "", false);\r
+                                       }\r
+                                       break;\r
+                       }\r
+               }  else {\r
+                       // Add table specific\r
+                       if (typeof(TinyMCE_table_getControlHTML) != "undefined") {\r
+                               contextMenu.addSeparator();\r
+                               contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table.gif", "$lang_table_desc", "mceInsertTable", "insert");\r
+                       }\r
+               }\r
+\r
+               contextMenu.show(x, y);\r
+       }, 10);\r
+\r
+       // Cancel default handeling\r
+       tinyMCE.cancelEvent(e);\r
+       return false;\r
+}\r
+\r
+function TinyMCE_contextmenu_hideContextMenu() {\r
+       TinyMCE_contextmenu_contextMenu.hide();\r
+}\r
+\r
+function TinyMCE_contextmenu_commandHandler(command, value) {\r
+       TinyMCE_contextmenu_contextMenu.hide();\r
+\r
+       // UI must be true on these\r
+       var ui = false;\r
+       if (command == "mceInsertTable" || command == "mceTableCellProps" || command == "mceTableRowProps" || command == "mceTableMergeCells")\r
+               ui = true;\r
+\r
+       if (command == "Paste")\r
+               value = null;\r
+\r
+       TinyMCE_contextmenu_contextMenu.inst.execCommand(command, ui, value);\r
+}\r
+\r
+// Context menu class\r
+\r
+function ContextMenu(settings) {\r
+       // Default value function\r
+       function defParam(key, def_val) {\r
+               settings[key] = typeof(settings[key]) != "undefined" ? settings[key] : def_val;\r
+       }\r
+\r
+       var self = this;\r
+\r
+       this.isMSIE = (navigator.appName == "Microsoft Internet Explorer");\r
+\r
+       // Setup contextmenu div\r
+       this.contextMenuDiv = document.createElement("div");\r
+       this.contextMenuDiv.className = "contextMenu";\r
+       this.contextMenuDiv.setAttribute("class", "contextMenu");\r
+       this.contextMenuDiv.style.display = "none";\r
+       this.contextMenuDiv.style.position = 'absolute';\r
+       this.contextMenuDiv.style.zindex = 1000;\r
+       this.contextMenuDiv.style.left = '0px';\r
+       this.contextMenuDiv.style.top = '0px';\r
+       this.contextMenuDiv.unselectable = "on";\r
+\r
+       document.body.appendChild(this.contextMenuDiv);\r
+\r
+       // Setup default values\r
+       defParam("commandhandler", "");\r
+       defParam("spacer_image", "images/spacer.gif");\r
+\r
+       this.items = new Array();\r
+       this.settings = settings;\r
+       this.html = "";\r
+\r
+       // IE Popup\r
+       if (tinyMCE.isMSIE && !tinyMCE.isMSIE5_0 && !tinyMCE.isOpera) {\r
+               this.pop = window.createPopup();\r
+               doc = this.pop.document;\r
+               doc.open();\r
+               doc.write('<html><head><link href="' + tinyMCE.baseURL + '/plugins/contextmenu/css/contextmenu.css" rel="stylesheet" type="text/css" /></head><body unselectable="yes" class="contextMenuIEPopup"></body></html>');\r
+               doc.close();\r
+       }\r
+};\r
+\r
+ContextMenu.prototype.clearAll = function() {\r
+       this.html = "";\r
+       this.contextMenuDiv.innerHTML = "";\r
+};\r
+\r
+ContextMenu.prototype.addSeparator = function() {\r
+       this.html += '<tr class="contextMenuItem"><td class="contextMenuIcon"><img src="' + this.settings['spacer_image'] + '" width="20" height="1" class="contextMenuImage" /></td><td><img class="contextMenuSeparator" width="1" height="1" src="' + this.settings['spacer_image'] + '" /></td></tr>';\r
+};\r
+\r
+ContextMenu.prototype.addItem = function(icon, title, command, value, disabled) {\r
+       if (title.charAt(0) == '$')\r
+               title = tinyMCE.getLang(title.substring(1));\r
+\r
+       var onMouseDown = '';\r
+       var html = '';\r
+\r
+       if (tinyMCE.isMSIE && !tinyMCE.isMSIE5_0)\r
+               onMouseDown = 'contextMenu.execCommand(\'' + command + '\', \'' + value + '\');return false;';\r
+       else\r
+               onMouseDown = this.settings['commandhandler'] + '(\'' + command + '\', \'' + value + '\');return false;';\r
+\r
+       if (icon == "")\r
+               icon = this.settings['spacer_image'];\r
+\r
+       if (!disabled)\r
+               html += '<tr class="contextMenuItem" onmousedown="' + onMouseDown + '" onmouseover="tinyMCE.switchClass(this,\'contextMenuItemOver\');" onmouseout="tinyMCE.switchClass(this,\'contextMenuItem\');">';\r
+       else\r
+               html += '<tr class="contextMenuItemDisabled">';\r
+\r
+       html += '<td class="contextMenuIcon"><img src="' + icon + '" width="20" height="20" class="contextMenuImage" /></td>';\r
+       html += '<td><div class="contextMenuText">';\r
+\r
+       // Add text\r
+       html += title;\r
+\r
+       html += '</div></td>';\r
+       html += '</tr>';\r
+\r
+       // Add to main\r
+       this.html += html;\r
+};\r
+\r
+ContextMenu.prototype.show = function(x, y) {\r
+       if (this.html == "")\r
+               return;\r
+\r
+       var html = '';\r
+\r
+       html += '<table border="0" cellpadding="0" cellspacing="0">';\r
+       html += this.html;\r
+       html += '</table>';\r
+\r
+       this.contextMenuDiv.innerHTML = html;\r
+\r
+       if (tinyMCE.isMSIE && !tinyMCE.isMSIE5_0 && !tinyMCE.isOpera) {\r
+               var width, height;\r
+\r
+               // Get dimensions\r
+               this.contextMenuDiv.style.display = "block";\r
+               width = this.contextMenuDiv.offsetWidth;\r
+               height = this.contextMenuDiv.offsetHeight;\r
+               this.contextMenuDiv.style.display = "none";\r
+\r
+               // Setup popup and show\r
+               this.pop.document.body.innerHTML = '<div class="contextMenu">' + html + "</div>";\r
+               this.pop.document.tinyMCE = tinyMCE;\r
+               this.pop.document.contextMenu = this;\r
+               this.pop.show(x, y, width, height);\r
+       } else {\r
+               this.contextMenuDiv.style.left = x + 'px';\r
+               this.contextMenuDiv.style.top = y + 'px';\r
+               this.contextMenuDiv.style.display = "block";\r
+       }\r
+};\r
+\r
+ContextMenu.prototype.hide = function() {\r
+       if (tinyMCE.isMSIE && !tinyMCE.isMSIE5_0 && !tinyMCE.isOpera)\r
+               this.pop.hide();\r
+       else\r
+               this.contextMenuDiv.style.display = "none";\r
+};\r
+\r
+ContextMenu.prototype.execCommand = function(command, value) {\r
+       eval(this.settings['commandhandler'] + "(command, value);");\r
+};\r
diff --git a/webcit/tiny_mce/plugins/contextmenu/images/spacer.gif b/webcit/tiny_mce/plugins/contextmenu/images/spacer.gif
new file mode 100644 (file)
index 0000000..3884865
Binary files /dev/null and b/webcit/tiny_mce/plugins/contextmenu/images/spacer.gif differ
diff --git a/webcit/tiny_mce/plugins/contextmenu/readme.txt b/webcit/tiny_mce/plugins/contextmenu/readme.txt
new file mode 100644 (file)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/webcit/tiny_mce/plugins/directionality/editor_plugin.js b/webcit/tiny_mce/plugins/directionality/editor_plugin.js
new file mode 100644 (file)
index 0000000..78e1921
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.importPluginLanguagePack('directionality','en,sv,fr_ca,zh_cn,cs,da,he,nb,de,hu,ru,ru_KOI8-R,ru_UTF-8,nn,es,cy,is,pl,nl,fr,pt_br');function TinyMCE_directionality_getInfo(){return{longname:'Directionality',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_directionality.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_directionality_getControlHTML(control_name){switch(control_name){case "ltr":var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceDirectionLTR\');return false;';return '<a href="javascript:'+cmd+'" onclick="'+cmd+'" target="_self" onmousedown="return false;"><img id="{$editor_id}_ltr" src="{$pluginurl}/images/ltr.gif" title="{$lang_directionality_ltr_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';case "rtl":var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceDirectionRTL\');return false;';return '<a href="javascript:'+cmd+'" onclick="'+cmd+'" target="_self" onmousedown="return false;"><img id="{$editor_id}_rtl" src="{$pluginurl}/images/rtl.gif" title="{$lang_directionality_rtl_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';}return "";}function TinyMCE_directionality_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mceDirectionLTR":var inst=tinyMCE.getInstanceById(editor_id);var elm=tinyMCE.getParentElement(inst.getFocusElement(),"p,div,td,h1,h2,h3,h4,h5,h6,pre,address");if(elm)elm.setAttribute("dir","ltr");tinyMCE.triggerNodeChange(false);return true;case "mceDirectionRTL":var inst=tinyMCE.getInstanceById(editor_id);var elm=tinyMCE.getParentElement(inst.getFocusElement(),"p,div,td,h1,h2,h3,h4,h5,h6,pre,address");if(elm)elm.setAttribute("dir","rtl");tinyMCE.triggerNodeChange(false);return true;}return false;}function TinyMCE_directionality_handleNodeChange(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){function getAttrib(elm,name){return elm.getAttribute(name)?elm.getAttribute(name):"";}tinyMCE.switchClassSticky(editor_id+'_ltr','mceButtonNormal',false);tinyMCE.switchClassSticky(editor_id+'_rtl','mceButtonNormal',false);if(node==null)return;var elm=tinyMCE.getParentElement(node,"p,div,td,h1,h2,h3,h4,h5,h6,pre,address");if(!elm){tinyMCE.switchClassSticky(editor_id+'_ltr','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_rtl','mceButtonDisabled',true);return;}var dir=getAttrib(elm,"dir");if(dir=="ltr"||dir=="")tinyMCE.switchClassSticky(editor_id+'_ltr','mceButtonSelected',false);else tinyMCE.switchClassSticky(editor_id+'_rtl','mceButtonSelected',false);return true;}
\ 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..210d2aa
--- /dev/null
@@ -0,0 +1,81 @@
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('directionality', 'en,sv,fr_ca,zh_cn,cs,da,he,nb,de,hu,ru,ru_KOI8-R,ru_UTF-8,nn,es,cy,is,pl,nl,fr,pt_br');\r
+\r
+function TinyMCE_directionality_getInfo() {\r
+       return {\r
+               longname : 'Directionality',\r
+               author : 'Moxiecode Systems',\r
+               authorurl : 'http://tinymce.moxiecode.com',\r
+               infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_directionality.html',\r
+               version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+       };\r
+};\r
+\r
+function TinyMCE_directionality_getControlHTML(control_name) {\r
+    switch (control_name) {\r
+        case "ltr":\r
+                       var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceDirectionLTR\');return false;';\r
+            return '<a href="javascript:' + cmd + '" onclick="' + cmd + '" target="_self" onmousedown="return false;"><img id="{$editor_id}_ltr" src="{$pluginurl}/images/ltr.gif" title="{$lang_directionality_ltr_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';\r
+\r
+        case "rtl":\r
+                       var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceDirectionRTL\');return false;';\r
+            return '<a href="javascript:' + cmd + '" onclick="' + cmd + '" target="_self" onmousedown="return false;"><img id="{$editor_id}_rtl" src="{$pluginurl}/images/rtl.gif" title="{$lang_directionality_rtl_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';\r
+    }\r
+\r
+    return "";\r
+}\r
+\r
+function TinyMCE_directionality_execCommand(editor_id, element, command, user_interface, value) {\r
+       // Handle commands\r
+       switch (command) {\r
+               case "mceDirectionLTR":\r
+                       var inst = tinyMCE.getInstanceById(editor_id);\r
+                       var elm = tinyMCE.getParentElement(inst.getFocusElement(), "p,div,td,h1,h2,h3,h4,h5,h6,pre,address");\r
+\r
+                       if (elm)\r
+                               elm.setAttribute("dir", "ltr");\r
+\r
+                       tinyMCE.triggerNodeChange(false);\r
+                       return true;\r
+\r
+               case "mceDirectionRTL":\r
+                       var inst = tinyMCE.getInstanceById(editor_id);\r
+                       var elm = tinyMCE.getParentElement(inst.getFocusElement(), "p,div,td,h1,h2,h3,h4,h5,h6,pre,address");\r
+\r
+                       if (elm)\r
+                               elm.setAttribute("dir", "rtl");\r
+\r
+                       tinyMCE.triggerNodeChange(false);\r
+                       return true;\r
+       }\r
+\r
+       // Pass to next handler in chain\r
+       return false;\r
+}\r
+\r
+function TinyMCE_directionality_handleNodeChange(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {\r
+       function getAttrib(elm, name) {\r
+               return elm.getAttribute(name) ? elm.getAttribute(name) : "";\r
+       }\r
+\r
+       tinyMCE.switchClassSticky(editor_id + '_ltr', 'mceButtonNormal', false);\r
+       tinyMCE.switchClassSticky(editor_id + '_rtl', 'mceButtonNormal', false);\r
+\r
+       if (node == null)\r
+               return;\r
+\r
+       var elm = tinyMCE.getParentElement(node, "p,div,td,h1,h2,h3,h4,h5,h6,pre,address");\r
+       if (!elm) {\r
+               tinyMCE.switchClassSticky(editor_id + '_ltr', 'mceButtonDisabled', true);\r
+               tinyMCE.switchClassSticky(editor_id + '_rtl', 'mceButtonDisabled', true);\r
+               return;\r
+       }\r
+\r
+       var dir = getAttrib(elm, "dir");\r
+       if (dir == "ltr" || dir == "")\r
+               tinyMCE.switchClassSticky(editor_id + '_ltr', 'mceButtonSelected', false);\r
+       else\r
+               tinyMCE.switchClassSticky(editor_id + '_rtl', 'mceButtonSelected', false);\r
+\r
+       return true;\r
+}\r
diff --git a/webcit/tiny_mce/plugins/directionality/images/ltr.gif b/webcit/tiny_mce/plugins/directionality/images/ltr.gif
new file mode 100644 (file)
index 0000000..ac8f30c
Binary files /dev/null and b/webcit/tiny_mce/plugins/directionality/images/ltr.gif differ
diff --git a/webcit/tiny_mce/plugins/directionality/images/rtl.gif b/webcit/tiny_mce/plugins/directionality/images/rtl.gif
new file mode 100644 (file)
index 0000000..0348f99
Binary files /dev/null and b/webcit/tiny_mce/plugins/directionality/images/rtl.gif differ
diff --git a/webcit/tiny_mce/plugins/directionality/langs/cs.js b/webcit/tiny_mce/plugins/directionality/langs/cs.js
new file mode 100644 (file)
index 0000000..1946571
--- /dev/null
@@ -0,0 +1,12 @@
+/**\r
+ * Czech lang variables \r
+ * encoding: utf-8\r
+ *  \r
+ * $Id: cs.js,v 1.1 2005/10/18 13:55:41 spocke Exp $ \r
+ */  \r
+\r
+tinyMCE.addToLang('',{\r
+directionality_ltr_desc : 'Směr z leva doprava',\r
+directionality_rtl_desc : 'Směr z prava doleva'\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/directionality/langs/cy.js b/webcit/tiny_mce/plugins/directionality/langs/cy.js
new file mode 100644 (file)
index 0000000..0f593a6
--- /dev/null
@@ -0,0 +1,6 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+directionality_ltr_desc : 'Cyfeiriad chwith i\'r dde',\r
+directionality_rtl_desc : 'Cyfeiriad dde i\'r chwith'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/directionality/langs/da.js b/webcit/tiny_mce/plugins/directionality/langs/da.js
new file mode 100644 (file)
index 0000000..5eab4ea
--- /dev/null
@@ -0,0 +1,6 @@
+// DK lang variables contributed by Jan Moelgaard\r
+\r
+tinyMCE.addToLang('',{\r
+directionality_ltr_desc : 'Retning - venstre mod h&#248;jre',\r
+directionality_rtl_desc : 'Retning - h&#248;jre mod venstre'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/directionality/langs/de.js b/webcit/tiny_mce/plugins/directionality/langs/de.js
new file mode 100644 (file)
index 0000000..5551a48
--- /dev/null
@@ -0,0 +1,6 @@
+// DE lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+directionality_ltr_desc : 'Von links nach rechts',\r
+directionality_rtl_desc : 'Von rechts nach links'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/directionality/langs/en.js b/webcit/tiny_mce/plugins/directionality/langs/en.js
new file mode 100644 (file)
index 0000000..a1db297
--- /dev/null
@@ -0,0 +1,6 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+directionality_ltr_desc : 'Direction left to right',\r
+directionality_rtl_desc : 'Direction right to left'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/directionality/langs/es.js b/webcit/tiny_mce/plugins/directionality/langs/es.js
new file mode 100644 (file)
index 0000000..deca267
--- /dev/null
@@ -0,0 +1,14 @@
+/**\r
+ * ES lang variables\r
+ * \r
+ * Authors : Alvaro Velasco,\r
+ *           Adolfo Sanz De Diego (asanzdiego) <asanzdiego@yahoo.es>,\r
+ *           Carlos C Soto (eclipxe) <csoto@sia-solutions.com>\r
+ * Last Updated : October 17, 2005\r
+ * TinyMCE Version : 2.0RC3\r
+ */\r
+\r
+tinyMCE.addToLang('',{\r
+directionality_ltr_desc : 'Dirección de izquierda a derecha',\r
+directionality_rtl_desc : 'Dirección de derecha a izquierda'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/directionality/langs/fr.js b/webcit/tiny_mce/plugins/directionality/langs/fr.js
new file mode 100644 (file)
index 0000000..6a4e24a
--- /dev/null
@@ -0,0 +1,6 @@
+// Traduit par Normand Lamoureux le 2005-11-12\r
+\r
+tinyMCE.addToLang('',{\r
+directionality_ltr_desc : 'Vers la droite',\r
+directionality_rtl_desc : 'Vers la gauche'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/directionality/langs/fr_ca.js b/webcit/tiny_mce/plugins/directionality/langs/fr_ca.js
new file mode 100644 (file)
index 0000000..1ed3b89
--- /dev/null
@@ -0,0 +1,6 @@
+// fr_ca lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+directionality_ltr_desc : 'Direction de la gauche vers la droite',\r
+directionality_rtl_desc : 'Direction de la droite vers la gauche'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/directionality/langs/he.js b/webcit/tiny_mce/plugins/directionality/langs/he.js
new file mode 100644 (file)
index 0000000..063b943
--- /dev/null
@@ -0,0 +1,6 @@
+// HE lang variables by Liron Newman, http://eesh.net\r
+\r
+tinyMCE.addToLang('',{\r
+directionality_ltr_desc : 'ëéååï ùîàì ìéîéï',\r
+directionality_rtl_desc : 'ëéååï éîéï ìùîàì'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/directionality/langs/hu.js b/webcit/tiny_mce/plugins/directionality/langs/hu.js
new file mode 100644 (file)
index 0000000..d61608a
--- /dev/null
@@ -0,0 +1,6 @@
+// HU lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+directionality_ltr_desc : 'Elhelyezkedés balról jobbra',\r
+directionality_rtl_desc : 'Elhelyezkedés jobbról balra'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/directionality/langs/is.js b/webcit/tiny_mce/plugins/directionality/langs/is.js
new file mode 100644 (file)
index 0000000..19b66a9
--- /dev/null
@@ -0,0 +1,6 @@
+// Iceland lang variables by Johannes Birgir Jensson\r
+\r
+tinyMCE.addToLang('',{\r
+directionality_ltr_desc : 'Fr&aacute; vinstri til h&aelig;gri',\r
+directionality_rtl_desc : 'Fr&aacute; h&aelig;gri til vinstri'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/directionality/langs/nb.js b/webcit/tiny_mce/plugins/directionality/langs/nb.js
new file mode 100644 (file)
index 0000000..bec3514
--- /dev/null
@@ -0,0 +1,6 @@
+// nb = Norwegian (bokm&aring;l) lang variables by Knut B. Jacobsen\r
+\r
+tinyMCE.addToLang('',{\r
+directionality_ltr_desc : 'Retning fra venstre mot h&oslash;yre',\r
+directionality_rtl_desc : 'Retning fra h&oslash;yre mot venstre'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/directionality/langs/nl.js b/webcit/tiny_mce/plugins/directionality/langs/nl.js
new file mode 100644 (file)
index 0000000..409d6df
--- /dev/null
@@ -0,0 +1,6 @@
+// NL lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+directionality_ltr_desc : 'Richting links naar rechts',\r
+directionality_rtl_desc : 'Richting rechts naar links'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/directionality/langs/nn.js b/webcit/tiny_mce/plugins/directionality/langs/nn.js
new file mode 100644 (file)
index 0000000..3186896
--- /dev/null
@@ -0,0 +1,6 @@
+// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen\r
+\r
+tinyMCE.addToLang('',{\r
+directionality_ltr_desc : 'Venstre mot h&oslash;gre',\r
+directionality_rtl_desc : 'H&oslash;gre mot venstre'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/directionality/langs/pl.js b/webcit/tiny_mce/plugins/directionality/langs/pl.js
new file mode 100644 (file)
index 0000000..90d400d
--- /dev/null
@@ -0,0 +1,8 @@
+// PL lang variables\r
+// fixed by Wooya\r
+// http://www.mfusion.prv.pl\r
+\r
+tinyMCE.addToLang('',{\r
+directionality_ltr_desc : 'Kierunek od lewej do prawej',\r
+directionality_rtl_desc : 'Kierunek od prawej do lewej'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/directionality/langs/pt_br.js b/webcit/tiny_mce/plugins/directionality/langs/pt_br.js
new file mode 100644 (file)
index 0000000..dc240f2
--- /dev/null
@@ -0,0 +1,13 @@
+/**\r
+ * pt_br lang variables\r
+ * Brazilian Portuguese\r
+ *\r
+ * Authors :\r
+ *           Marcio Barbosa (mpg) <mpg@mpg.com.br>\r
+ * Last Updated : November 26, 2005\r
+ * TinyMCE Version : 2.0RC4\r
+ */\r
+tinyMCE.addToLang('',{\r
+directionality_ltr_desc : 'Direcionamento da esquerda para direita',\r
+directionality_rtl_desc : 'Direcionamento da direita para esquerda'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/directionality/langs/ru.js b/webcit/tiny_mce/plugins/directionality/langs/ru.js
new file mode 100644 (file)
index 0000000..263b2d2
--- /dev/null
@@ -0,0 +1,6 @@
+// RU lang variables cp1251\r
+\r
+tinyMCE.addToLang('',{\r
+directionality_ltr_desc : 'Íàïðàâëåíèå ñëåâà íàïðàâî',\r
+directionality_rtl_desc : 'Íàïðàâëåíèå ñïðàâà íàëåâî'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/directionality/langs/ru_KOI8-R.js b/webcit/tiny_mce/plugins/directionality/langs/ru_KOI8-R.js
new file mode 100644 (file)
index 0000000..e2dba4b
--- /dev/null
@@ -0,0 +1,6 @@
+// RU lang variables KOI8-R\r
+\r
+tinyMCE.addToLang('',{\r
+directionality_ltr_desc : 'îÁÐÒÁ×ÌÅÎÉÅ ÓÌÅ×Á ÎÁÐÒÁ×Ï',\r
+directionality_rtl_desc : 'îÁÐÒÁ×ÌÅÎÉÅ ÓÐÒÁ×Á ÎÁÌÅ×Ï'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/directionality/langs/ru_UTF-8.js b/webcit/tiny_mce/plugins/directionality/langs/ru_UTF-8.js
new file mode 100644 (file)
index 0000000..5ce95ef
--- /dev/null
@@ -0,0 +1,6 @@
+// RU lang variables UTF-8\r
+\r
+tinyMCE.addToLang('',{\r
+directionality_ltr_desc : 'Направление слева направо',\r
+directionality_rtl_desc : 'Направление справа налево'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/directionality/langs/sk.js b/webcit/tiny_mce/plugins/directionality/langs/sk.js
new file mode 100644 (file)
index 0000000..0754b55
--- /dev/null
@@ -0,0 +1,14 @@
+/**\r
+ * Slovak lang variables \r
+ * encoding: utf-8\r
+ * \r
+ * @author Vladimir VASIL vvasil@post.sk\r
+ *    \r
+ * $Id: sk.js,v 1.1 2005/11/22 20:56:44 spocke Exp $ \r
+ */  \r
+\r
+tinyMCE.addToLang('',{\r
+directionality_ltr_desc : 'Smer z ľava doprava',\r
+directionality_rtl_desc : 'Smer z prava doľava'\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/directionality/langs/sv.js b/webcit/tiny_mce/plugins/directionality/langs/sv.js
new file mode 100644 (file)
index 0000000..7abfc8d
--- /dev/null
@@ -0,0 +1,6 @@
+// SV lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+directionality_ltr_desc : 'Riktning fr&aring;n v&auml;nster till h&ouml;ger',\r
+directionality_rtl_desc : 'Riktning fr&aring;n h&ouml;ger till v&auml;nster'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/directionality/langs/zh_cn.js b/webcit/tiny_mce/plugins/directionality/langs/zh_cn.js
new file mode 100644 (file)
index 0000000..922874f
--- /dev/null
@@ -0,0 +1,6 @@
+// Simplified Chinese lang variables contributed by tom_cat (thomaswangyang@gmail.com)\r
+\r
+tinyMCE.addToLang('',{\r
+directionality_ltr_desc : '·½Ïò´Ó×óÍùÓÒ',\r
+directionality_rtl_desc : '·½Ïò´ÓÓÒÍù×ó'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/directionality/langs/zh_tw.js b/webcit/tiny_mce/plugins/directionality/langs/zh_tw.js
new file mode 100644 (file)
index 0000000..db59c86
--- /dev/null
@@ -0,0 +1,7 @@
+// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// ÁcÅ餤¤å BIG-5 ¡F¼Æ¦ìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com\r
+\r
+tinyMCE.addToLang('',{\r
+directionality_ltr_desc : '¥Ñ¥ª©¹¥k¤è¦V',\r
+directionality_rtl_desc : '¥Ñ¥k©¹¥ª¤è¦V'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/directionality/langs/zh_tw_utf8.js b/webcit/tiny_mce/plugins/directionality/langs/zh_tw_utf8.js
new file mode 100644 (file)
index 0000000..54e3201
--- /dev/null
@@ -0,0 +1,7 @@
+// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// 繁體中文 UTF-8 ;數位應用坊製作; twapweb_AT_gmail_DOT_com\r
+\r
+tinyMCE.addToLang('',{\r
+directionality_ltr_desc : '由左往右方向',\r
+directionality_rtl_desc : '由右往左方向'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/directionality/readme.txt b/webcit/tiny_mce/plugins/directionality/readme.txt
new file mode 100644 (file)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/webcit/tiny_mce/plugins/emotions/editor_plugin.js b/webcit/tiny_mce/plugins/emotions/editor_plugin.js
new file mode 100644 (file)
index 0000000..68f2c42
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.importPluginLanguagePack('emotions','en,sv,zh_cn,cs,fa,fr_ca,fr,de,pl,pt_br,nl,da,he,nb,hu,ru,ru_KOI8-R,ru_UTF-8,nn,es,cy,is,zh_tw,zh_tw_utf8,sk');function TinyMCE_emotions_getInfo(){return{longname:'Emotions',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_emotions.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_emotions_getControlHTML(control_name){switch(control_name){case "emotions":var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceEmotion\');return false;';return '<a href="javascript:'+cmd+'" onclick="'+cmd+'" target="_self" onmousedown="return false;"><img id="{$editor_id}_emotions" src="{$pluginurl}/images/emotions.gif" title="{$lang_emotions_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';}return "";}function TinyMCE_emotions_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mceEmotion":var template=new Array();template['file']='../../plugins/emotions/emotions.htm';template['width']=160;template['height']=160;template['width']+=tinyMCE.getLang('lang_emotions_delta_width',0);template['height']+=tinyMCE.getLang('lang_emotions_delta_height',0);tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes"});return true;}return false;}
\ 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..4517b94
--- /dev/null
@@ -0,0 +1,51 @@
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('emotions', 'en,sv,zh_cn,cs,fa,fr_ca,fr,de,pl,pt_br,nl,da,he,nb,hu,ru,ru_KOI8-R,ru_UTF-8,nn,es,cy,is,zh_tw,zh_tw_utf8,sk');\r
+\r
+function TinyMCE_emotions_getInfo() {\r
+       return {\r
+               longname : 'Emotions',\r
+               author : 'Moxiecode Systems',\r
+               authorurl : 'http://tinymce.moxiecode.com',\r
+               infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_emotions.html',\r
+               version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+       };\r
+};\r
+\r
+/**\r
+ * Returns the HTML contents of the emotions control.\r
+ */\r
+function TinyMCE_emotions_getControlHTML(control_name) {\r
+       switch (control_name) {\r
+               case "emotions":\r
+                       var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceEmotion\');return false;';\r
+                       return '<a href="javascript:' + cmd + '" onclick="' + cmd + '" target="_self" onmousedown="return false;"><img id="{$editor_id}_emotions" src="{$pluginurl}/images/emotions.gif" title="{$lang_emotions_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';\r
+       }\r
+\r
+       return "";\r
+}\r
+\r
+/**\r
+ * Executes the mceEmotion command.\r
+ */\r
+function TinyMCE_emotions_execCommand(editor_id, element, command, user_interface, value) {\r
+       // Handle commands\r
+       switch (command) {\r
+               case "mceEmotion":\r
+                       var template = new Array();\r
+\r
+                       template['file'] = '../../plugins/emotions/emotions.htm'; // Relative to theme\r
+                       template['width'] = 160;\r
+                       template['height'] = 160;\r
+\r
+                       // Language specific width and height addons\r
+                       template['width'] += tinyMCE.getLang('lang_emotions_delta_width', 0);\r
+                       template['height'] += tinyMCE.getLang('lang_emotions_delta_height', 0);\r
+\r
+                       tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes"});\r
+\r
+                       return true;\r
+       }\r
+\r
+       // Pass to next handler in chain\r
+       return false;\r
+}\r
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..c70f4b4
--- /dev/null
@@ -0,0 +1,40 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_emotions_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/functions.js"></script>\r
+       <base target="_self" />\r
+</head>\r
+<body style="display: none">\r
+       <div align="center">\r
+               <div class="title">{$lang_emotions_title}:<br /><br /></div>\r
+\r
+               <table border="0" cellspacing="0" cellpadding="4">\r
+                 <tr>\r
+                       <td><a href="javascript:insertEmotion('smiley-cool.gif','lang_emotions_cool');"><img src="images/smiley-cool.gif" width="18" height="18" border="0" alt="{$lang_emotions_cool}" title="{$lang_emotions_cool}" /></a></td>\r
+                       <td><a href="javascript:insertEmotion('smiley-cry.gif','lang_emotions_cry');"><img src="images/smiley-cry.gif" width="18" height="18" border="0" alt="{$lang_emotions_cry}" title="{$lang_emotions_cry}" /></a></td>\r
+                       <td><a href="javascript:insertEmotion('smiley-embarassed.gif','lang_emotions_embarassed');"><img src="images/smiley-embarassed.gif" width="18" height="18" border="0" alt="{$lang_emotions_embarassed}" title="{$lang_emotions_embarassed}" /></a></td>\r
+                       <td><a href="javascript:insertEmotion('smiley-foot-in-mouth.gif','lang_emotions_foot_in_mouth');"><img src="images/smiley-foot-in-mouth.gif" width="18" height="18" border="0" alt="{$lang_emotions_foot_in_mouth}" title="{$lang_emotions_foot_in_mouth}" /></a></td>\r
+                 </tr>\r
+                 <tr>\r
+                       <td><a href="javascript:insertEmotion('smiley-frown.gif','lang_emotions_frown');"><img src="images/smiley-frown.gif" width="18" height="18" border="0" alt="{$lang_emotions_frown}" title="{$lang_emotions_frown}" /></a></td>\r
+                       <td><a href="javascript:insertEmotion('smiley-innocent.gif','lang_emotions_innocent');"><img src="images/smiley-innocent.gif" width="18" height="18" border="0" alt="{$lang_emotions_innocent}" title="{$lang_emotions_innocent}" /></a></td>\r
+                       <td><a href="javascript:insertEmotion('smiley-kiss.gif','lang_emotions_kiss');"><img src="images/smiley-kiss.gif" width="18" height="18" border="0" alt="{$lang_emotions_kiss}" title="{$lang_emotions_kiss}" /></a></td>\r
+                       <td><a href="javascript:insertEmotion('smiley-laughing.gif','lang_emotions_laughing');"><img src="images/smiley-laughing.gif" width="18" height="18" border="0" alt="{$lang_emotions_laughing}" title="{$lang_emotions_laughing}" /></a></td>\r
+                 </tr>\r
+                 <tr>\r
+                       <td><a href="javascript:insertEmotion('smiley-money-mouth.gif','lang_emotions_money_mouth');"><img src="images/smiley-money-mouth.gif" width="18" height="18" border="0" alt="{$lang_emotions_money_mouth}" title="{$lang_emotions_money_mouth}" /></a></td>\r
+                       <td><a href="javascript:insertEmotion('smiley-sealed.gif','lang_emotions_sealed');"><img src="images/smiley-sealed.gif" width="18" height="18" border="0" alt="{$lang_emotions_sealed}" title="{$lang_emotions_sealed}" /></a></td>\r
+                       <td><a href="javascript:insertEmotion('smiley-smile.gif','lang_emotions_smile');"><img src="images/smiley-smile.gif" width="18" height="18" border="0" alt="{$lang_emotions_smile}" title="{$lang_emotions_smile}" /></a></td>\r
+                       <td><a href="javascript:insertEmotion('smiley-surprised.gif','lang_emotions_surprised');"><img src="images/smiley-surprised.gif" width="18" height="18" border="0" alt="{$lang_emotions_surprised}" title="{$lang_emotions_surprised}" /></a></td>\r
+                 </tr>\r
+                 <tr>\r
+                       <td><a href="javascript:insertEmotion('smiley-tongue-out.gif','lang_emotions_tongue_out');"><img src="images/smiley-tongue-out.gif" width="18" height="18" border="0" alt="{$lang_emotions_tongue-out}" title="{$lang_emotions_tongue_out}" /></a></td>\r
+                       <td><a href="javascript:insertEmotion('smiley-undecided.gif','lang_emotions_undecided');"><img src="images/smiley-undecided.gif" width="18" height="18" border="0" alt="{$lang_emotions_undecided}" title="{$lang_emotions_undecided}" /></a></td>\r
+                       <td><a href="javascript:insertEmotion('smiley-wink.gif','lang_emotions_wink');"><img src="images/smiley-wink.gif" width="18" height="18" border="0" alt="{$lang_emotions_wink}" title="{$lang_emotions_wink}" /></a></td>\r
+                       <td><a href="javascript:insertEmotion('smiley-yell.gif','lang_emotions_yell');"><img src="images/smiley-yell.gif" width="18" height="18" border="0" alt="{$lang_emotions_yell}" title="{$lang_emotions_yell}" /></a></td>\r
+                 </tr>\r
+               </table>\r
+       </div>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/plugins/emotions/images/emotions.gif b/webcit/tiny_mce/plugins/emotions/images/emotions.gif
new file mode 100644 (file)
index 0000000..26adbe6
Binary files /dev/null and b/webcit/tiny_mce/plugins/emotions/images/emotions.gif differ
diff --git a/webcit/tiny_mce/plugins/emotions/images/readme.txt b/webcit/tiny_mce/plugins/emotions/images/readme.txt
new file mode 100644 (file)
index 0000000..a3cea1b
--- /dev/null
@@ -0,0 +1,2 @@
+These emotions where taken from Mozilla Thunderbird.\r
+I hope they don't get angry if I use them here after all this is a open source project aswell.\r
diff --git a/webcit/tiny_mce/plugins/emotions/images/smiley-cool.gif b/webcit/tiny_mce/plugins/emotions/images/smiley-cool.gif
new file mode 100644 (file)
index 0000000..ba90cc3
Binary files /dev/null and b/webcit/tiny_mce/plugins/emotions/images/smiley-cool.gif differ
diff --git a/webcit/tiny_mce/plugins/emotions/images/smiley-cry.gif b/webcit/tiny_mce/plugins/emotions/images/smiley-cry.gif
new file mode 100644 (file)
index 0000000..74d897a
Binary files /dev/null and b/webcit/tiny_mce/plugins/emotions/images/smiley-cry.gif differ
diff --git a/webcit/tiny_mce/plugins/emotions/images/smiley-embarassed.gif b/webcit/tiny_mce/plugins/emotions/images/smiley-embarassed.gif
new file mode 100644 (file)
index 0000000..963a96b
Binary files /dev/null and b/webcit/tiny_mce/plugins/emotions/images/smiley-embarassed.gif differ
diff --git a/webcit/tiny_mce/plugins/emotions/images/smiley-foot-in-mouth.gif b/webcit/tiny_mce/plugins/emotions/images/smiley-foot-in-mouth.gif
new file mode 100644 (file)
index 0000000..16f68cc
Binary files /dev/null and b/webcit/tiny_mce/plugins/emotions/images/smiley-foot-in-mouth.gif differ
diff --git a/webcit/tiny_mce/plugins/emotions/images/smiley-frown.gif b/webcit/tiny_mce/plugins/emotions/images/smiley-frown.gif
new file mode 100644 (file)
index 0000000..716f55e
Binary files /dev/null and b/webcit/tiny_mce/plugins/emotions/images/smiley-frown.gif differ
diff --git a/webcit/tiny_mce/plugins/emotions/images/smiley-innocent.gif b/webcit/tiny_mce/plugins/emotions/images/smiley-innocent.gif
new file mode 100644 (file)
index 0000000..334d49e
Binary files /dev/null and b/webcit/tiny_mce/plugins/emotions/images/smiley-innocent.gif differ
diff --git a/webcit/tiny_mce/plugins/emotions/images/smiley-kiss.gif b/webcit/tiny_mce/plugins/emotions/images/smiley-kiss.gif
new file mode 100644 (file)
index 0000000..4efd549
Binary files /dev/null and b/webcit/tiny_mce/plugins/emotions/images/smiley-kiss.gif differ
diff --git a/webcit/tiny_mce/plugins/emotions/images/smiley-laughing.gif b/webcit/tiny_mce/plugins/emotions/images/smiley-laughing.gif
new file mode 100644 (file)
index 0000000..1606c11
Binary files /dev/null and b/webcit/tiny_mce/plugins/emotions/images/smiley-laughing.gif differ
diff --git a/webcit/tiny_mce/plugins/emotions/images/smiley-money-mouth.gif b/webcit/tiny_mce/plugins/emotions/images/smiley-money-mouth.gif
new file mode 100644 (file)
index 0000000..ca2451e
Binary files /dev/null and b/webcit/tiny_mce/plugins/emotions/images/smiley-money-mouth.gif differ
diff --git a/webcit/tiny_mce/plugins/emotions/images/smiley-sealed.gif b/webcit/tiny_mce/plugins/emotions/images/smiley-sealed.gif
new file mode 100644 (file)
index 0000000..b33d3cc
Binary files /dev/null and b/webcit/tiny_mce/plugins/emotions/images/smiley-sealed.gif differ
diff --git a/webcit/tiny_mce/plugins/emotions/images/smiley-smile.gif b/webcit/tiny_mce/plugins/emotions/images/smiley-smile.gif
new file mode 100644 (file)
index 0000000..e6a9e60
Binary files /dev/null and b/webcit/tiny_mce/plugins/emotions/images/smiley-smile.gif differ
diff --git a/webcit/tiny_mce/plugins/emotions/images/smiley-surprised.gif b/webcit/tiny_mce/plugins/emotions/images/smiley-surprised.gif
new file mode 100644 (file)
index 0000000..cb99cdd
Binary files /dev/null and b/webcit/tiny_mce/plugins/emotions/images/smiley-surprised.gif differ
diff --git a/webcit/tiny_mce/plugins/emotions/images/smiley-tongue-out.gif b/webcit/tiny_mce/plugins/emotions/images/smiley-tongue-out.gif
new file mode 100644 (file)
index 0000000..2075dc1
Binary files /dev/null and b/webcit/tiny_mce/plugins/emotions/images/smiley-tongue-out.gif differ
diff --git a/webcit/tiny_mce/plugins/emotions/images/smiley-undecided.gif b/webcit/tiny_mce/plugins/emotions/images/smiley-undecided.gif
new file mode 100644 (file)
index 0000000..bef7e25
Binary files /dev/null and b/webcit/tiny_mce/plugins/emotions/images/smiley-undecided.gif differ
diff --git a/webcit/tiny_mce/plugins/emotions/images/smiley-wink.gif b/webcit/tiny_mce/plugins/emotions/images/smiley-wink.gif
new file mode 100644 (file)
index 0000000..9faf1af
Binary files /dev/null and b/webcit/tiny_mce/plugins/emotions/images/smiley-wink.gif differ
diff --git a/webcit/tiny_mce/plugins/emotions/images/smiley-yell.gif b/webcit/tiny_mce/plugins/emotions/images/smiley-yell.gif
new file mode 100644 (file)
index 0000000..648e6e8
Binary files /dev/null and b/webcit/tiny_mce/plugins/emotions/images/smiley-yell.gif differ
diff --git a/webcit/tiny_mce/plugins/emotions/jscripts/functions.js b/webcit/tiny_mce/plugins/emotions/jscripts/functions.js
new file mode 100644 (file)
index 0000000..b151b57
--- /dev/null
@@ -0,0 +1,21 @@
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+}\r
+\r
+function insertEmotion(file_name, title) {\r
+       title = tinyMCE.getLang(title);\r
+\r
+       if (title == null)\r
+               title = "";\r
+\r
+       // XML encode\r
+       title = title.replace(/&/g, '&amp;');\r
+       title = title.replace(/\"/g, '&quot;');\r
+       title = title.replace(/</g, '&lt;');\r
+       title = title.replace(/>/g, '&gr;');\r
+\r
+       var html = '<img src="' + tinyMCE.baseURL + "/plugins/emotions/images/" + file_name + '" mce_src="' + tinyMCE.baseURL + "/plugins/emotions/images/" + file_name + '" border="0" alt="' + title + '" />';\r
+\r
+       tinyMCE.execCommand('mceInsertContent', false, html);\r
+       tinyMCEPopup.close();\r
+}\r
diff --git a/webcit/tiny_mce/plugins/emotions/langs/cs.js b/webcit/tiny_mce/plugins/emotions/langs/cs.js
new file mode 100644 (file)
index 0000000..b91fd84
--- /dev/null
@@ -0,0 +1,12 @@
+/**\r
+ * Czech lang variables \r
+ * encoding: utf-8\r
+ *  \r
+ * $Id: cs.js,v 1.4 2005/10/18 13:59:42 spocke Exp $ \r
+ */  \r
+\r
+tinyMCE.addToLang('',{\r
+insert_emotions_title : 'Vložit emotikonu',\r
+emotions_desc : 'Emotikony'\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/emotions/langs/cy.js b/webcit/tiny_mce/plugins/emotions/langs/cy.js
new file mode 100644 (file)
index 0000000..d771cef
--- /dev/null
@@ -0,0 +1,22 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('emotions',{\r
+title : 'Mewnosod gwenoglun',\r
+desc : 'Gwenogluniau',\r
+cool : 'C&#373;l',\r
+cry : 'Cr&iuml;o',\r
+embarassed : 'Cywilydd',\r
+foot_in_mouth : 'Troed yn y ceg',\r
+frown : 'Gwgu',\r
+innocent : 'Diniwed',\r
+kiss : 'Sws',\r
+laughing : 'Chwerthin',\r
+money_mouth : 'Ceg arian',\r
+sealed : 'Seliwyd',\r
+smile : 'Gw&ecirc;n',\r
+surprised : 'Synnu',\r
+tongue_out : 'Tafod allan',\r
+undecided : 'Penagored',\r
+wink : 'Winc',\r
+yell : 'Gwaedd'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/emotions/langs/da.js b/webcit/tiny_mce/plugins/emotions/langs/da.js
new file mode 100644 (file)
index 0000000..a671571
--- /dev/null
@@ -0,0 +1,22 @@
+// DK lang variables contributed by Jan Moelgaard\r
+\r
+tinyMCE.addToLang('emotions',{\r
+title : 'Inds&#230;t smiley',\r
+desc : 'Smileys',\r
+cool : 'Cool',\r
+cry : 'Gr&#229;d',\r
+embarassed : 'Forlegen',\r
+foot_in_mouth : 'Foden i munden',\r
+frown : 'Rynket pande',\r
+innocent : 'Uskyldig',\r
+kiss : 'Kys',\r
+laughing : 'Latter',\r
+money_mouth : 'L&#230;kker mund',\r
+sealed : 'Lukket af',\r
+smile : 'Smil',\r
+surprised : 'Overrasket',\r
+tongue_out : 'R&#230;k tunge',\r
+undecided : 'Usikker',\r
+wink : 'Blink',\r
+yell : 'R&#229;b'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/emotions/langs/de.js b/webcit/tiny_mce/plugins/emotions/langs/de.js
new file mode 100644 (file)
index 0000000..5ca5508
--- /dev/null
@@ -0,0 +1,22 @@
+// DE lang variables\r
+\r
+tinyMCE.addToLang('emotions',{\r
+title : 'Insert emotion',\r
+desc : 'Emotions',\r
+cool : 'Cool',\r
+cry : 'Cry',\r
+embarassed : 'Embarassed',\r
+foot_in_mouth : 'Foot in mouth',\r
+frown : 'Frown',\r
+innocent : 'Innocent',\r
+kiss : 'Kiss',\r
+laughing : 'Laughing',\r
+money_mouth : 'Money mouth',\r
+sealed : 'Sealed',\r
+smile : 'Smile',\r
+surprised : 'Surprised',\r
+tongue_out : 'Tongue out',\r
+undecided : 'Undecided',\r
+wink : 'Wink',\r
+yell : 'Yell'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/emotions/langs/el.js b/webcit/tiny_mce/plugins/emotions/langs/el.js
new file mode 100644 (file)
index 0000000..f1fa858
--- /dev/null
@@ -0,0 +1,6 @@
+// Greek lang variables by Jacaranda Bill\r
+\r
+tinyMCE.addToLang('',{\r
+insert_emotions_title : '&Aring;éóáãùãÞ &aring;íüò &aring;éêïíé&auml;ßïõ emoticon',\r
+emotions_desc : '&Aring;éêïíß&auml;éá emoticons'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/emotions/langs/en.js b/webcit/tiny_mce/plugins/emotions/langs/en.js
new file mode 100644 (file)
index 0000000..3cdd675
--- /dev/null
@@ -0,0 +1,22 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('emotions',{\r
+title : 'Insert emotion',\r
+desc : 'Emotions',\r
+cool : 'Cool',\r
+cry : 'Cry',\r
+embarassed : 'Embarassed',\r
+foot_in_mouth : 'Foot in mouth',\r
+frown : 'Frown',\r
+innocent : 'Innocent',\r
+kiss : 'Kiss',\r
+laughing : 'Laughing',\r
+money_mouth : 'Money mouth',\r
+sealed : 'Sealed',\r
+smile : 'Smile',\r
+surprised : 'Surprised',\r
+tongue_out : 'Tongue out',\r
+undecided : 'Undecided',\r
+wink : 'Wink',\r
+yell : 'Yell'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/emotions/langs/es.js b/webcit/tiny_mce/plugins/emotions/langs/es.js
new file mode 100644 (file)
index 0000000..cafdb0c
--- /dev/null
@@ -0,0 +1,30 @@
+/**\r
+ * ES lang variables\r
+ * \r
+ * Authors : Alvaro Velasco,\r
+ *           Adolfo Sanz De Diego (asanzdiego) <asanzdiego@yahoo.es>,\r
+ *           Carlos C Soto (eclipxe) <csoto@sia-solutions.com>\r
+ * Last Updated : October 17, 2005\r
+ * TinyMCE Version : 2.0RC3\r
+ */\r
+\r
+tinyMCE.addToLang('emotions',{\r
+title : 'Intertar emoticono',\r
+desc : 'Emoticonos',\r
+cool : 'Chulo',\r
+cry : 'Llorando',\r
+embarassed : 'Avergonzado',\r
+foot_in_mouth : 'Sin palabras',\r
+frown : 'Triste',\r
+innocent : 'Inocente',\r
+kiss : 'Beso',\r
+laughing : 'Riendo',\r
+money_mouth : 'Forrado',\r
+sealed : 'Boca sellada',\r
+smile : 'Sonriente',\r
+surprised : 'Sorprendido',\r
+tongue_out : 'Burla',\r
+undecided : 'Indeciso',\r
+wink : 'Guiño',\r
+yell : 'Enfadado'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/emotions/langs/fa.js b/webcit/tiny_mce/plugins/emotions/langs/fa.js
new file mode 100644 (file)
index 0000000..f357f1a
--- /dev/null
@@ -0,0 +1,11 @@
+// IR lang variables\r
+// Persian (Farsi) language pack (for IRAN)\r
+// By: Morteza Zafari\r
+// Lost@LostLord.com\r
+// http://www.LostLord.com\r
+\r
+tinyMCE.addToLang('',{\r
+dir : 'rtl',\r
+insert_emotions_title : '?????? ????',\r
+emotions_desc : '??????'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/emotions/langs/fr.js b/webcit/tiny_mce/plugins/emotions/langs/fr.js
new file mode 100644 (file)
index 0000000..be7c1ad
--- /dev/null
@@ -0,0 +1,22 @@
+// Traduit par Normand Lamoureux le 2005-11-12\r
+\r
+tinyMCE.addToLang('emotions',{\r
+title : 'Choisir une émoticône',\r
+desc : 'Insérer une émoticône',\r
+cool : 'Cool',\r
+cry : 'Triste',\r
+embarassed : 'Embarrassé',\r
+foot_in_mouth : 'Oups !',\r
+frown : 'Mécontent',\r
+innocent : 'Innocent',\r
+kiss : 'Bisou',\r
+laughing : 'Mort de rire',\r
+money_mouth : 'Sencuré',\r
+sealed : 'Motus',\r
+smile : 'Sourire',\r
+surprised : 'Surprise',\r
+tongue_out : 'Moqueur',\r
+undecided : 'Perplexe',\r
+wink : 'Clin d\'oeil',\r
+yell : 'Horreur !'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/emotions/langs/fr_ca.js b/webcit/tiny_mce/plugins/emotions/langs/fr_ca.js
new file mode 100644 (file)
index 0000000..41b771a
--- /dev/null
@@ -0,0 +1,6 @@
+// Canadian French lang variables by Virtuelcom   last modification: 2005-06-15\r
+\r
+tinyMCE.addToLang('',{\r
+insert_emotions_title : 'Insérer un émoticon',\r
+emotions_desc : 'Émoticons'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/emotions/langs/he.js b/webcit/tiny_mce/plugins/emotions/langs/he.js
new file mode 100644 (file)
index 0000000..47d983a
--- /dev/null
@@ -0,0 +1,22 @@
+// HE lang variables\r
+\r
+tinyMCE.addToLang('emotions',{\r
+title : 'äëðñ øâùåï',\r
+desc : 'øâùåðéí',\r
+cool : 'øâåò',\r
+cry : 'áåëä',\r
+embarassed : 'ðáåê',\r
+foot_in_mouth : 'òí äøâì áôä',\r
+frown : 'æåòó',\r
+innocent : 'úîéí',\r
+kiss : 'ðùé÷ä',\r
+laughing : 'öåç÷',\r
+money_mouth : 'ôä ùì ëñó',\r
+sealed : 'àèåí',\r
+smile : 'çéåê',\r
+surprised : 'îåôúò',\r
+tongue_out : 'ìùåï áçåõ',\r
+undecided : 'áìúé äçìèé',\r
+wink : '÷øéöä',\r
+yell : 'öò÷ä'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/emotions/langs/hu.js b/webcit/tiny_mce/plugins/emotions/langs/hu.js
new file mode 100644 (file)
index 0000000..35c4c95
--- /dev/null
@@ -0,0 +1,22 @@
+// HU lang variables\r
+\r
+tinyMCE.addToLang('emotions',{\r
+title : 'Hangulatjel beszúrása',\r
+desc : 'Hangulatjelek',\r
+cool : 'Király',\r
+cry : 'Sírás',\r
+embarassed : 'Zavart',\r
+foot_in_mouth : 'Foot in mouth',\r
+frown : 'Homlokráncolás',\r
+innocent : 'Ártatlan',\r
+kiss : 'Csók',\r
+laughing : 'Nevetés',\r
+money_mouth : 'Pénzéhes',\r
+sealed : 'Elnémult',\r
+smile : 'Mosolygás',\r
+surprised : 'Meglepett',\r
+tongue_out : 'Tongue out',\r
+undecided : 'Határozatlan',\r
+wink : 'Kacsintás',\r
+yell : 'Sikoltás'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/emotions/langs/is.js b/webcit/tiny_mce/plugins/emotions/langs/is.js
new file mode 100644 (file)
index 0000000..583e8b8
--- /dev/null
@@ -0,0 +1,22 @@
+// Iceland lang variables by Johannes Birgir Jensson\r
+\r
+tinyMCE.addToLang('emotions',{\r
+title : 'Tilfinningat&aacute;kn',\r
+desc : 'Tilfinningat&aacute;kn',\r
+cool : 'Svalur',\r
+cry : 'Gr&aacute;ta',\r
+embarassed : 'Sk&ouml;mmustulegur',\r
+foot_in_mouth : 'Tala af s&eacute;r',\r
+frown : 'F&yacute;ldur',\r
+innocent : 'Saklaus',\r
+kiss : 'Koss',\r
+laughing : 'Hl&aelig;jandi',\r
+money_mouth : 'Gr&aacute;&eth;ugur',\r
+sealed : '&THORN;&ouml;gull sem gr&ouml;fin',\r
+smile : 'Brosandi',\r
+surprised : 'Hissa',\r
+tongue_out : 'Ullandi',\r
+undecided : '&Oacute;&aacute;kve&eth;inn',\r
+wink : 'Glottandi',\r
+yell : '&Ouml;skrandi'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/emotions/langs/it.js b/webcit/tiny_mce/plugins/emotions/langs/it.js
new file mode 100644 (file)
index 0000000..3e84bf9
--- /dev/null
@@ -0,0 +1,6 @@
+//IT lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+insert_emotions_title : 'Inserisci una emoticon',\r
+emotions_desc : 'Emoticon'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/emotions/langs/ko.js b/webcit/tiny_mce/plugins/emotions/langs/ko.js
new file mode 100644 (file)
index 0000000..49f8134
--- /dev/null
@@ -0,0 +1,6 @@
+// KO lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+insert_emotions_title : 'À̸ðƼ&Auml;Ü ³&Ouml;±â',\r
+emotions_desc : 'À̸ðƼ&Auml;Ü'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/emotions/langs/nb.js b/webcit/tiny_mce/plugins/emotions/langs/nb.js
new file mode 100644 (file)
index 0000000..801f3b2
--- /dev/null
@@ -0,0 +1,22 @@
+// nb = Norwegian (bokm&aring;l) lang variables by Knut B. Jacobsen\r
+\r
+tinyMCE.addToLang('emotions',{\r
+title : 'Lim inn f&oslash;lelse',\r
+desc : 'F&oslash;lelser',\r
+cool : 'Cool',\r
+cry : 'Gr&aring;ter',\r
+embarassed : 'Sjenert',\r
+foot_in_mouth : 'Fot i munnen',\r
+frown : 'Lei seg',\r
+innocent : 'Uskyldig',\r
+kiss : 'Kyss',\r
+laughing : 'Ler',\r
+money_mouth : 'Penger i munnen',\r
+sealed : 'Hemmelig',\r
+smile : 'Glad',\r
+surprised : 'Overrasket',\r
+tongue_out : 'Rekke tunge',\r
+undecided : 'Betenkt',\r
+wink : 'Fl&oslash;rt',\r
+yell : 'Skrikende'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/emotions/langs/nl.js b/webcit/tiny_mce/plugins/emotions/langs/nl.js
new file mode 100644 (file)
index 0000000..a596ab4
--- /dev/null
@@ -0,0 +1,22 @@
+// NL lang variables\r
+\r
+tinyMCE.addToLang('emotions',{\r
+title : 'Emoticon invoegen',\r
+desc : 'Emoticons',\r
+cool : 'Cool',\r
+cry : 'Huilen',\r
+embarassed : 'Verlegen', // embarrassed\r
+foot_in_mouth : 'Eten in mond', // food in mouth?\r
+frown : 'Fronsen',\r
+innocent : 'Onschuldig',\r
+kiss : 'Kus',\r
+laughing : 'Lachend',\r
+money_mouth : 'Geldgezicht',\r
+sealed : 'Verzegeld',\r
+smile : 'Smile',\r
+surprised : 'Verbaasd',\r
+tongue_out : 'Tong uitstekend',\r
+undecided : 'Obepaald',\r
+wink : 'Knipoog',\r
+yell : 'Schreeuwen'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/emotions/langs/nn.js b/webcit/tiny_mce/plugins/emotions/langs/nn.js
new file mode 100644 (file)
index 0000000..92f17a0
--- /dev/null
@@ -0,0 +1,22 @@
+// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen\r
+\r
+tinyMCE.addToLang('emotions',{\r
+title : 'Lim inn f&oslash;lelse',\r
+desc : 'F&oslash;lelser',\r
+cool : 'Cool',\r
+cry : 'Gr&aring;ter',\r
+embarassed : 'Sjenert',\r
+foot_in_mouth : 'Fot i munnen',\r
+frown : 'Lei seg',\r
+innocent : 'Uskyldig',\r
+kiss : 'Kyss',\r
+laughing : 'Ler',\r
+money_mouth : 'Penger i munnen',\r
+sealed : 'Hemmelig',\r
+smile : 'Glad',\r
+surprised : 'Overrasket',\r
+tongue_out : 'Rekke tunge',\r
+undecided : 'Betenkt',\r
+wink : 'Fl&oslash;rt',\r
+yell : 'Skrikende'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/emotions/langs/pl.js b/webcit/tiny_mce/plugins/emotions/langs/pl.js
new file mode 100644 (file)
index 0000000..c19da95
--- /dev/null
@@ -0,0 +1,25 @@
+// PL lang variables\r
+// fixed by Wooya\r
+// http://www.mfusion.prv.pl\r
+// lemiel 25.10.2005\r
+\r
+tinyMCE.addToLang('emotions',{\r
+title : 'Wstaw emotikonkê',\r
+desc : 'Emotikonki',\r
+cool : 'Super',\r
+cry : 'P³aczê',\r
+embarassed : 'Za¿enowanie',\r
+foot_in_mouth : 'Trzepiê jêzorem',\r
+frown : 'Marszczê brew',\r
+innocent : 'Niewinny',\r
+kiss : 'Poca³unek',\r
+laughing : '¦miech',\r
+money_mouth : 'Zasady ¿yciowe',\r
+sealed : 'Zaplombowane usta',\r
+smile : 'U¶miech',\r
+surprised : 'Zaskoczenie',\r
+tongue_out : 'Pokazujê jêzyk',\r
+undecided : 'Niezdecydowanie',\r
+wink : 'Perskie oko',\r
+yell : 'Wycie'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/emotions/langs/pt_br.js b/webcit/tiny_mce/plugins/emotions/langs/pt_br.js
new file mode 100644 (file)
index 0000000..f46ec0b
--- /dev/null
@@ -0,0 +1,29 @@
+/**\r
+ * pt_br lang variables\r
+ * Brazilian Portuguese\r
+ *\r
+ * Authors :\r
+ *           Marcio Barbosa (mpg) <mpg@mpg.com.br>\r
+ * Last Updated : November 26, 2005\r
+ * TinyMCE Version : 2.0RC4\r
+ */\r
+tinyMCE.addToLang('emotions',{\r
+title : 'Inserir Emoticons',\r
+desc : 'Emoticons',\r
+cool : 'Legal',\r
+cry : 'Chorando',\r
+embarassed : 'Embaraçado',\r
+foot_in_mouth : 'Falando asneira',\r
+frown : 'Triste',\r
+innocent : 'Inocente',\r
+kiss : 'Beijo',\r
+laughing : 'Rindo',\r
+money_mouth : 'Interesseiro',\r
+sealed : 'Lábios fechados',\r
+smile : 'Sorriso',\r
+surprised : 'Surpreso',\r
+tongue_out : 'Mostrar a língüa',\r
+undecided : 'Indeciso',\r
+wink : 'Piscar',\r
+yell : 'Grito'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/emotions/langs/ru.js b/webcit/tiny_mce/plugins/emotions/langs/ru.js
new file mode 100644 (file)
index 0000000..00f55b2
--- /dev/null
@@ -0,0 +1,22 @@
+// RU lang variables cp1251\r
+\r
+tinyMCE.addToLang('emotions',{\r
+title : 'Âñòàâèòü ñìàéëèê',\r
+desc : 'Ñìàéëèêè',\r
+cool : 'Cool',\r
+cry : 'Ïëà÷',\r
+embarassed : 'Embarassed',\r
+foot_in_mouth : 'Foot in mouth',\r
+frown : 'Íàõìóðåííîñòü',\r
+innocent : 'Ñâÿòîé',\r
+kiss : 'Ïîöåëóé',\r
+laughing : 'Ñìåõ',\r
+money_mouth : 'Money mouth',\r
+sealed : 'Çàêëååííûé',\r
+smile : 'Óëûáêà',\r
+surprised : 'Ñþðïðèç',\r
+tongue_out : 'Âûñóíóòûé ÿçûê',\r
+undecided : 'Undecided',\r
+wink : 'Wink',\r
+yell : 'Yell'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/emotions/langs/ru_KOI8-R.js b/webcit/tiny_mce/plugins/emotions/langs/ru_KOI8-R.js
new file mode 100644 (file)
index 0000000..ec9af98
--- /dev/null
@@ -0,0 +1,22 @@
+// RU lang variables KOI8-R\r
+\r
+tinyMCE.addToLang('emotions',{\r
+title : '÷ÓÔÁ×ÉÔØ ÓÍÁÊÌÉË',\r
+desc : 'óÍÁÊÌÉËÉ',\r
+cool : 'Cool',\r
+cry : 'ðÌÁÞ',\r
+embarassed : 'Embarassed',\r
+foot_in_mouth : 'Foot in mouth',\r
+frown : 'îÁÈÍÕÒÅÎÎÏÓÔØ',\r
+innocent : 'ó×ÑÔÏÊ',\r
+kiss : 'ðÏÃÅÌÕÊ',\r
+laughing : 'óÍÅÈ',\r
+money_mouth : 'Money mouth',\r
+sealed : 'úÁËÌÅÅÎÎÙÊ',\r
+smile : 'õÌÙÂËÁ',\r
+surprised : 'óÀÒÐÒÉÚ',\r
+tongue_out : '÷ÙÓÕÎÕÔÙÊ ÑÚÙË',\r
+undecided : 'Undecided',\r
+wink : 'Wink',\r
+yell : 'Yell'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/emotions/langs/ru_UTF-8.js b/webcit/tiny_mce/plugins/emotions/langs/ru_UTF-8.js
new file mode 100644 (file)
index 0000000..2c94bc8
--- /dev/null
@@ -0,0 +1,22 @@
+// RU lang variables UTF-8\r
+\r
+tinyMCE.addToLang('emotions',{\r
+title : 'Вставить смайлик',\r
+desc : 'Смайлики',\r
+cool : 'Cool',\r
+cry : 'Плач',\r
+embarassed : 'Embarassed',\r
+foot_in_mouth : 'Foot in mouth',\r
+frown : 'Нахмуренность',\r
+innocent : 'Святой',\r
+kiss : 'Поцелуй',\r
+laughing : 'Смех',\r
+money_mouth : 'Money mouth',\r
+sealed : 'Заклеенный',\r
+smile : 'Улыбка',\r
+surprised : 'Сюрприз',\r
+tongue_out : 'Высунутый язык',\r
+undecided : 'Undecided',\r
+wink : 'Wink',\r
+yell : 'Yell'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/emotions/langs/sk.js b/webcit/tiny_mce/plugins/emotions/langs/sk.js
new file mode 100644 (file)
index 0000000..0746fdc
--- /dev/null
@@ -0,0 +1,14 @@
+/**\r
+ * Slovak lang variables \r
+ * encoding: utf-8\r
+ * \r
+ * @author Vladimir VASIL vvasil@post.sk\r
+ *    \r
+ * $Id: sk.js,v 1.1 2005/11/22 20:56:44 spocke Exp $ \r
+ */  \r
+\r
+tinyMCE.addToLang('',{\r
+insert_emotions_title : 'Vložiť emotikonu',\r
+emotions_desc : 'Emotikony'\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/emotions/langs/sv.js b/webcit/tiny_mce/plugins/emotions/langs/sv.js
new file mode 100644 (file)
index 0000000..18d0740
--- /dev/null
@@ -0,0 +1,22 @@
+// SE lang variables\r
+\r
+tinyMCE.addToLang('emotions',{\r
+title : 'Klistra in k&auml;nsla',\r
+desc : 'K&auml;nslor',\r
+cool : 'Cool',\r
+cry : 'Gr&aring;ter',\r
+embarassed : 'Generad',\r
+foot_in_mouth : 'Fot i munnnen',\r
+frown : 'Ledsen',\r
+innocent : 'Oskyldig',\r
+kiss : 'Kyss',\r
+laughing : 'Skrattande',\r
+money_mouth : 'Penga mun',\r
+sealed : 'Hemlis',\r
+smile : 'Glad',\r
+surprised : 'F&ouml;rv&aring;nad',\r
+tongue_out : 'R&auml;cka ut tungan',\r
+undecided : 'Fundersam',\r
+wink : 'Fl&ouml;rt',\r
+yell : 'Skrikandes'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/emotions/langs/zh_cn.js b/webcit/tiny_mce/plugins/emotions/langs/zh_cn.js
new file mode 100644 (file)
index 0000000..2d05cb9
--- /dev/null
@@ -0,0 +1,22 @@
+// Simplified Chinese lang variables contributed by tom_cat (thomaswangyang@gmail.com)\r
+\r
+tinyMCE.addToLang('emotions',{\r
+title : '²åÈë±íÇé',\r
+desc : '±íÇé',\r
+cool : 'Cool',\r
+cry : 'Cry',\r
+embarassed : 'Embarassed',\r
+foot_in_mouth : 'Foot in mouth',\r
+frown : 'Frown',\r
+innocent : 'Innocent',\r
+kiss : 'Kiss',\r
+laughing : 'Laughing',\r
+money_mouth : 'Money mouth',\r
+sealed : 'Sealed',\r
+smile : 'Smile',\r
+surprised : 'Surprised',\r
+tongue_out : 'Tongue out',\r
+undecided : 'Undecided',\r
+wink : 'Wink',\r
+yell : 'Yell'\r
+});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/emotions/langs/zh_tw.js b/webcit/tiny_mce/plugins/emotions/langs/zh_tw.js
new file mode 100644 (file)
index 0000000..ca3e2d6
--- /dev/null
@@ -0,0 +1,23 @@
+// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// ÁcÅ餤¤å BIG-5 ¡F¼Æ¦ìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com\r
+\r
+tinyMCE.addToLang('emotions',{\r
+title : '´¡¤Jªí±¡¹Ï¥Ü',\r
+desc : 'ªí±¡¹Ï¥Ü',\r
+cool : '»Å³á',\r
+cry : '¤j­ú',\r
+embarassed : '¦nêɧr',\r
+foot_in_mouth : '¯ä¦º¤F',\r
+frown : '­ó¡IÃi±o²z§A',\r
+innocent : '§Ú¬OµL¶dªº',\r
+kiss : '¿Ë¤@­Ó',\r
+laughing : '¤Ó¥i¯º¹Æ',\r
+money_mouth : '¦n°ª¿³³á',\r
+sealed : '³¬¼L',\r
+smile : '·L¯º',\r
+surprised : 'Åå³Y',\r
+tongue_out : '¦R¦ÞÀY',\r
+undecided : '§Ú·Q·Q',\r
+wink : '¯w²´',\r
+yell : '°I¦º¤F¡ã¡ã'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/emotions/langs/zh_tw_utf8.js b/webcit/tiny_mce/plugins/emotions/langs/zh_tw_utf8.js
new file mode 100644 (file)
index 0000000..1bc29d9
--- /dev/null
@@ -0,0 +1,23 @@
+// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// 繁體中文 UTF-8 ;數位應用坊製作; twapweb_AT_gmail_DOT_com\r
+\r
+tinyMCE.addToLang('emotions',{\r
+title : '插入表情圖示',\r
+desc : '表情圖示',\r
+cool : '酷喔',\r
+cry : '大哭',\r
+embarassed : '好糗呀',\r
+foot_in_mouth : '臭死了',\r
+frown : '哼!懶得理你',\r
+innocent : '我是無辜的',\r
+kiss : '親一個',\r
+laughing : '太可笑嘍',\r
+money_mouth : '好高興喔',\r
+sealed : '閉嘴',\r
+smile : '微笑',\r
+surprised : '驚訝',\r
+tongue_out : '吐舌頭',\r
+undecided : '我想想',\r
+wink : '眨眼',\r
+yell : '衰死了~~'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/emotions/readme.txt b/webcit/tiny_mce/plugins/emotions/readme.txt
new file mode 100644 (file)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/webcit/tiny_mce/plugins/flash/css/content.css b/webcit/tiny_mce/plugins/flash/css/content.css
new file mode 100644 (file)
index 0000000..843258b
--- /dev/null
@@ -0,0 +1,7 @@
+.mceItemFlash {\r
+       border: 1px dotted #cc0000;\r
+       background-image: url('../images/flash.gif');\r
+       background-position: center;\r
+       background-repeat: no-repeat;\r
+       background-color: #ffffcc;\r
+}\r
diff --git a/webcit/tiny_mce/plugins/flash/css/flash.css b/webcit/tiny_mce/plugins/flash/css/flash.css
new file mode 100644 (file)
index 0000000..d3e88e1
--- /dev/null
@@ -0,0 +1,11 @@
+.panel_wrapper div.current {\r
+       height: 100px;\r
+}\r
+\r
+#width, #height {\r
+       width: 50px;\r
+}\r
+\r
+#file {\r
+       width: 250px;\r
+}\r
diff --git a/webcit/tiny_mce/plugins/flash/editor_plugin.js b/webcit/tiny_mce/plugins/flash/editor_plugin.js
new file mode 100644 (file)
index 0000000..daf0294
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.importPluginLanguagePack('flash','en,de,sv,zh_cn,cs,fa,fr_ca,fr,pl,pt_br,nl,da,he,nb,hu,ru,ru_KOI8-R,ru_UTF-8,nn,es,cy,is,zh_tw,zh_tw_utf8,sk,pt_br');function TinyMCE_flash_getInfo(){return{longname:'Flash',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_flash.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_flash_initInstance(inst){if(!tinyMCE.settings['flash_skip_plugin_css'])tinyMCE.importCSS(inst.getDoc(),tinyMCE.baseURL+"/plugins/flash/css/content.css");}function TinyMCE_flash_getControlHTML(control_name){switch(control_name){case "flash":var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceFlash\');return false;';return '<a href="javascript:'+cmd+'" onclick="'+cmd+'" target="_self" onmousedown="return false;"><img id="{$editor_id}_flash" src="{$pluginurl}/images/flash.gif" title="{$lang_flash_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';}return "";}function TinyMCE_flash_parseAttributes(attribute_string){var attributeName="";var attributeValue="";var withInName;var withInValue;var attributes=new Array();var whiteSpaceRegExp=new RegExp('^[ \n\r\t]+','g');if(attribute_string==null||attribute_string.length<2)return null;withInName=withInValue=false;for(var i=0;i<attribute_string.length;i++){var chr=attribute_string.charAt(i);if((chr=='"'||chr=="'")&&!withInValue)withInValue=true;else if((chr=='"'||chr=="'")&&withInValue){withInValue=false;var pos=attributeName.lastIndexOf(' ');if(pos!=-1)attributeName=attributeName.substring(pos+1);attributes[attributeName.toLowerCase()]=attributeValue.substring(1);attributeName="";attributeValue="";}else if(!whiteSpaceRegExp.test(chr)&&!withInName&&!withInValue)withInName=true;if(chr=='='&&withInName)withInName=false;if(withInName)attributeName+=chr;if(withInValue)attributeValue+=chr;}return attributes;}function TinyMCE_flash_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mceFlash":var name="",swffile="",swfwidth="",swfheight="",action="insert";var template=new Array();var inst=tinyMCE.getInstanceById(editor_id);var focusElm=inst.getFocusElement();template['file']='../../plugins/flash/flash.htm';template['width']=430;template['height']=175;template['width']+=tinyMCE.getLang('lang_flash_delta_width',0);template['height']+=tinyMCE.getLang('lang_flash_delta_height',0);if(focusElm!=null&&focusElm.nodeName.toLowerCase()=="img"){name=tinyMCE.getAttrib(focusElm,'class');if(name.indexOf('mceItemFlash')==-1)return true;swffile=tinyMCE.getAttrib(focusElm,'alt');if(tinyMCE.getParam('convert_urls'))swffile=eval(tinyMCE.settings['urlconverter_callback']+"(swffile, null, true);");swfwidth=tinyMCE.getAttrib(focusElm,'width');swfheight=tinyMCE.getAttrib(focusElm,'height');action="update";}tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes",swffile:swffile,swfwidth:swfwidth,swfheight:swfheight,action:action});return true;}return false;}function TinyMCE_flash_cleanup(type,content){switch(type){case "insert_to_editor_dom":if(tinyMCE.getParam('convert_urls')){var imgs=content.getElementsByTagName("img");for(var i=0;i<imgs.length;i++){if(tinyMCE.getAttrib(imgs[i],"class")=="mceItemFlash"){var src=tinyMCE.getAttrib(imgs[i],"alt");if(tinyMCE.getParam('convert_urls'))src=eval(tinyMCE.settings['urlconverter_callback']+"(src, null, true);");imgs[i].setAttribute('alt',src);imgs[i].setAttribute('title',src);}}}break;case "get_from_editor_dom":var imgs=content.getElementsByTagName("img");for(var i=0;i<imgs.length;i++){if(tinyMCE.getAttrib(imgs[i],"class")=="mceItemFlash"){var src=tinyMCE.getAttrib(imgs[i],"alt");if(tinyMCE.getParam('convert_urls'))src=eval(tinyMCE.settings['urlconverter_callback']+"(src, null, true);");imgs[i].setAttribute('alt',src);imgs[i].setAttribute('title',src);}}break;case "insert_to_editor":var startPos=0;var embedList=new Array();content=content.replace(new RegExp('<[ ]*embed','gi'),'<embed');content=content.replace(new RegExp('<[ ]*/embed[ ]*>','gi'),'</embed>');content=content.replace(new RegExp('<[ ]*object','gi'),'<object');content=content.replace(new RegExp('<[ ]*/object[ ]*>','gi'),'</object>');while((startPos=content.indexOf('<embed',startPos+1))!=-1){var endPos=content.indexOf('>',startPos);var attribs=TinyMCE_flash_parseAttributes(content.substring(startPos+6,endPos));embedList[embedList.length]=attribs;}var index=0;while((startPos=content.indexOf('<object',startPos))!=-1){if(index>=embedList.length)break;var attribs=embedList[index];endPos=content.indexOf('</object>',startPos);endPos+=9;var contentAfter=content.substring(endPos);content=content.substring(0,startPos);content+='<img width="'+attribs["width"]+'" height="'+attribs["height"]+'"';content+=' src="'+(tinyMCE.getParam("theme_href")+'/images/spacer.gif')+'" title="'+attribs["src"]+'"';content+=' alt="'+attribs["src"]+'" class="mceItemFlash" />'+content.substring(endPos);content+=contentAfter;index++;startPos++;}var index=0;while((startPos=content.indexOf('<embed',startPos))!=-1){if(index>=embedList.length)break;var attribs=embedList[index];endPos=content.indexOf('>',startPos);endPos+=9;var contentAfter=content.substring(endPos);content=content.substring(0,startPos);content+='<img width="'+attribs["width"]+'" height="'+attribs["height"]+'"';content+=' src="'+(tinyMCE.getParam("theme_href")+'/images/spacer.gif')+'" title="'+attribs["src"]+'"';content+=' alt="'+attribs["src"]+'" class="mceItemFlash" />'+content.substring(endPos);content+=contentAfter;index++;startPos++;}break;case "get_from_editor":var startPos=-1;while((startPos=content.indexOf('<img',startPos+1))!=-1){var endPos=content.indexOf('/>',startPos);var attribs=TinyMCE_flash_parseAttributes(content.substring(startPos+4,endPos));if(attribs['class']!="mceItemFlash")continue;endPos+=2;var embedHTML='';var wmode=tinyMCE.getParam("flash_wmode","");var quality=tinyMCE.getParam("flash_quality","high");var menu=tinyMCE.getParam("flash_menu","false");embedHTML+='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"';embedHTML+=' codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0"';embedHTML+=' width="'+attribs["width"]+'" height="'+attribs["height"]+'">';embedHTML+='<param name="movie" value="'+attribs["title"]+'" />';embedHTML+='<param name="quality" value="'+quality+'" />';embedHTML+='<param name="menu" value="'+menu+'" />';embedHTML+='<param name="wmode" value="'+wmode+'" />';embedHTML+='<embed src="'+attribs["title"]+'" wmode="'+wmode+'" quality="'+quality+'" menu="'+menu+'" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="'+attribs["width"]+'" height="'+attribs["height"]+'"></embed></object>';chunkBefore=content.substring(0,startPos);chunkAfter=content.substring(endPos);content=chunkBefore+embedHTML+chunkAfter;}break;}return content;}function TinyMCE_flash_handleNodeChange(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){tinyMCE.switchClassSticky(editor_id+'_flash','mceButtonNormal');if(node==null)return;do{if(node.nodeName.toLowerCase()=="img"&&tinyMCE.getAttrib(node,'class').indexOf('mceItemFlash')==0)tinyMCE.switchClassSticky(editor_id+'_flash','mceButtonSelected');}while((node=node.parentNode));return true;}
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/flash/editor_plugin_src.js b/webcit/tiny_mce/plugins/flash/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..e4fa863
--- /dev/null
@@ -0,0 +1,270 @@
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('flash', 'en,de,sv,zh_cn,cs,fa,fr_ca,fr,pl,pt_br,nl,da,he,nb,hu,ru,ru_KOI8-R,ru_UTF-8,nn,es,cy,is,zh_tw,zh_tw_utf8,sk,pt_br');\r
+\r
+function TinyMCE_flash_getInfo() {\r
+       return {\r
+               longname : 'Flash',\r
+               author : 'Moxiecode Systems',\r
+               authorurl : 'http://tinymce.moxiecode.com',\r
+               infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_flash.html',\r
+               version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+       };\r
+};\r
+\r
+function TinyMCE_flash_initInstance(inst) {\r
+       if (!tinyMCE.settings['flash_skip_plugin_css'])\r
+               tinyMCE.importCSS(inst.getDoc(), tinyMCE.baseURL + "/plugins/flash/css/content.css");\r
+}\r
+\r
+function TinyMCE_flash_getControlHTML(control_name) {\r
+    switch (control_name) {\r
+        case "flash":\r
+                       var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceFlash\');return false;';\r
+            return '<a href="javascript:' + cmd + '" onclick="' + cmd + '" target="_self" onmousedown="return false;"><img id="{$editor_id}_flash" src="{$pluginurl}/images/flash.gif" title="{$lang_flash_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';\r
+    }\r
+\r
+    return "";\r
+}\r
+\r
+function TinyMCE_flash_parseAttributes(attribute_string) {\r
+       var attributeName = "";\r
+       var attributeValue = "";\r
+       var withInName;\r
+       var withInValue;\r
+       var attributes = new Array();\r
+       var whiteSpaceRegExp = new RegExp('^[ \n\r\t]+', 'g');\r
+\r
+       if (attribute_string == null || attribute_string.length < 2)\r
+               return null;\r
+\r
+       withInName = withInValue = false;\r
+\r
+       for (var i=0; i<attribute_string.length; i++) {\r
+               var chr = attribute_string.charAt(i);\r
+\r
+               if ((chr == '"' || chr == "'") && !withInValue)\r
+                       withInValue = true;\r
+               else if ((chr == '"' || chr == "'") && withInValue) {\r
+                       withInValue = false;\r
+\r
+                       var pos = attributeName.lastIndexOf(' ');\r
+                       if (pos != -1)\r
+                               attributeName = attributeName.substring(pos+1);\r
+\r
+                       attributes[attributeName.toLowerCase()] = attributeValue.substring(1);\r
+\r
+                       attributeName = "";\r
+                       attributeValue = "";\r
+               } else if (!whiteSpaceRegExp.test(chr) && !withInName && !withInValue)\r
+                       withInName = true;\r
+\r
+               if (chr == '=' && withInName)\r
+                       withInName = false;\r
+\r
+               if (withInName)\r
+                       attributeName += chr;\r
+\r
+               if (withInValue)\r
+                       attributeValue += chr;\r
+       }\r
+\r
+       return attributes;\r
+}\r
+\r
+function TinyMCE_flash_execCommand(editor_id, element, command, user_interface, value) {\r
+    // Handle commands\r
+    switch (command) {\r
+        case "mceFlash":\r
+                       var name = "", swffile = "", swfwidth = "", swfheight = "", action = "insert";\r
+            var template = new Array();\r
+                       var inst = tinyMCE.getInstanceById(editor_id);\r
+                       var focusElm = inst.getFocusElement();\r
+\r
+            template['file']   = '../../plugins/flash/flash.htm'; // Relative to theme\r
+            template['width']  = 430;\r
+            template['height'] = 175;\r
+\r
+                       template['width'] += tinyMCE.getLang('lang_flash_delta_width', 0);\r
+                       template['height'] += tinyMCE.getLang('lang_flash_delta_height', 0);\r
+\r
+                       // Is selection a image\r
+            if (focusElm != null && focusElm.nodeName.toLowerCase() == "img") {\r
+                               name = tinyMCE.getAttrib(focusElm, 'class');\r
+\r
+                               if (name.indexOf('mceItemFlash') == -1) // Not a Flash\r
+                                       return true;\r
+\r
+                               // Get rest of Flash items\r
+                               swffile = tinyMCE.getAttrib(focusElm, 'alt');\r
+\r
+                               if (tinyMCE.getParam('convert_urls'))\r
+                                       swffile = eval(tinyMCE.settings['urlconverter_callback'] + "(swffile, null, true);");\r
+\r
+                               swfwidth = tinyMCE.getAttrib(focusElm, 'width');\r
+                               swfheight = tinyMCE.getAttrib(focusElm, 'height');\r
+                               action = "update";\r
+            }\r
+\r
+            tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes", swffile : swffile, swfwidth : swfwidth, swfheight : swfheight, action : action});\r
+               return true;\r
+   }\r
+\r
+   // Pass to next handler in chain\r
+   return false;\r
+}\r
+\r
+function TinyMCE_flash_cleanup(type, content) {\r
+       switch (type) {\r
+               case "insert_to_editor_dom":\r
+                       // Force relative/absolute\r
+                       if (tinyMCE.getParam('convert_urls')) {\r
+                               var imgs = content.getElementsByTagName("img");\r
+                               for (var i=0; i<imgs.length; i++) {\r
+                                       if (tinyMCE.getAttrib(imgs[i], "class") == "mceItemFlash") {\r
+                                               var src = tinyMCE.getAttrib(imgs[i], "alt");\r
+\r
+                                               if (tinyMCE.getParam('convert_urls'))\r
+                                                       src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, null, true);");\r
+\r
+                                               imgs[i].setAttribute('alt', src);\r
+                                               imgs[i].setAttribute('title', src);\r
+                                       }\r
+                               }\r
+                       }\r
+                       break;\r
+\r
+               case "get_from_editor_dom":\r
+                       var imgs = content.getElementsByTagName("img");\r
+                       for (var i=0; i<imgs.length; i++) {\r
+                               if (tinyMCE.getAttrib(imgs[i], "class") == "mceItemFlash") {\r
+                                       var src = tinyMCE.getAttrib(imgs[i], "alt");\r
+\r
+                                       if (tinyMCE.getParam('convert_urls'))\r
+                                               src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, null, true);");\r
+\r
+                                       imgs[i].setAttribute('alt', src);\r
+                                       imgs[i].setAttribute('title', src);\r
+                               }\r
+                       }\r
+                       break;\r
+\r
+               case "insert_to_editor":\r
+                       var startPos = 0;\r
+                       var embedList = new Array();\r
+\r
+                       // Fix the embed and object elements\r
+                       content = content.replace(new RegExp('<[ ]*embed','gi'),'<embed');\r
+                       content = content.replace(new RegExp('<[ ]*/embed[ ]*>','gi'),'</embed>');\r
+                       content = content.replace(new RegExp('<[ ]*object','gi'),'<object');\r
+                       content = content.replace(new RegExp('<[ ]*/object[ ]*>','gi'),'</object>');\r
+\r
+                       // Parse all embed tags\r
+                       while ((startPos = content.indexOf('<embed', startPos+1)) != -1) {\r
+                               var endPos = content.indexOf('>', startPos);\r
+                               var attribs = TinyMCE_flash_parseAttributes(content.substring(startPos + 6, endPos));\r
+                               embedList[embedList.length] = attribs;\r
+                       }\r
+\r
+                       // Parse all object tags and replace them with images from the embed data\r
+                       var index = 0;\r
+                       while ((startPos = content.indexOf('<object', startPos)) != -1) {\r
+                               if (index >= embedList.length)\r
+                                       break;\r
+\r
+                               var attribs = embedList[index];\r
+\r
+                               // Find end of object\r
+                               endPos = content.indexOf('</object>', startPos);\r
+                               endPos += 9;\r
+\r
+                               // Insert image\r
+                               var contentAfter = content.substring(endPos);\r
+                               content = content.substring(0, startPos);\r
+                               content += '<img width="' + attribs["width"] + '" height="' + attribs["height"] + '"';\r
+                               content += ' src="' + (tinyMCE.getParam("theme_href") + '/images/spacer.gif') + '" title="' + attribs["src"] + '"';\r
+                               content += ' alt="' + attribs["src"] + '" class="mceItemFlash" />' + content.substring(endPos);\r
+                               content += contentAfter;\r
+                               index++;\r
+\r
+                               startPos++;\r
+                       }\r
+\r
+                       // Parse all embed tags and replace them with images from the embed data\r
+                       var index = 0;\r
+                       while ((startPos = content.indexOf('<embed', startPos)) != -1) {\r
+                               if (index >= embedList.length)\r
+                                       break;\r
+\r
+                               var attribs = embedList[index];\r
+\r
+                               // Find end of embed\r
+                               endPos = content.indexOf('>', startPos);\r
+                               endPos += 9;\r
+\r
+                               // Insert image\r
+                               var contentAfter = content.substring(endPos);\r
+                               content = content.substring(0, startPos);\r
+                               content += '<img width="' + attribs["width"] + '" height="' + attribs["height"] + '"';\r
+                               content += ' src="' + (tinyMCE.getParam("theme_href") + '/images/spacer.gif') + '" title="' + attribs["src"] + '"';\r
+                               content += ' alt="' + attribs["src"] + '" class="mceItemFlash" />' + content.substring(endPos);\r
+                               content += contentAfter;\r
+                               index++;\r
+\r
+                               startPos++;\r
+                       }\r
+\r
+                       break;\r
+\r
+               case "get_from_editor":\r
+                       // Parse all img tags and replace them with object+embed\r
+                       var startPos = -1;\r
+                       while ((startPos = content.indexOf('<img', startPos+1)) != -1) {\r
+                               var endPos = content.indexOf('/>', startPos);\r
+                               var attribs = TinyMCE_flash_parseAttributes(content.substring(startPos + 4, endPos));\r
+\r
+                               // Is not flash, skip it\r
+                               if (attribs['class'] != "mceItemFlash")\r
+                                       continue;\r
+\r
+                               endPos += 2;\r
+\r
+                               var embedHTML = '';\r
+                               var wmode = tinyMCE.getParam("flash_wmode", "");\r
+                               var quality = tinyMCE.getParam("flash_quality", "high");\r
+                               var menu = tinyMCE.getParam("flash_menu", "false");\r
+\r
+                               // Insert object + embed\r
+                               embedHTML += '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"';\r
+                               embedHTML += ' codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0"';\r
+                               embedHTML += ' width="' + attribs["width"] + '" height="' + attribs["height"] + '">';\r
+                               embedHTML += '<param name="movie" value="' + attribs["title"] + '" />';\r
+                               embedHTML += '<param name="quality" value="' + quality + '" />';\r
+                               embedHTML += '<param name="menu" value="' + menu + '" />';\r
+                               embedHTML += '<param name="wmode" value="' + wmode + '" />';\r
+                               embedHTML += '<embed src="' + attribs["title"] + '" wmode="' + wmode + '" quality="' + quality + '" menu="' + menu + '" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="' + attribs["width"] + '" height="' + attribs["height"] + '"></embed></object>';\r
+\r
+                               // Insert embed/object chunk\r
+                               chunkBefore = content.substring(0, startPos);\r
+                               chunkAfter = content.substring(endPos);\r
+                               content = chunkBefore + embedHTML + chunkAfter;\r
+                       }\r
+                       break;\r
+       }\r
+\r
+       // Pass through to next handler in chain\r
+       return content;\r
+}\r
+\r
+function TinyMCE_flash_handleNodeChange(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {\r
+       tinyMCE.switchClassSticky(editor_id + '_flash', 'mceButtonNormal');\r
+\r
+       if (node == null)\r
+               return;\r
+\r
+       do {\r
+               if (node.nodeName.toLowerCase() == "img" && tinyMCE.getAttrib(node, 'class').indexOf('mceItemFlash') == 0)\r
+                       tinyMCE.switchClassSticky(editor_id + '_flash', 'mceButtonSelected');\r
+       } while ((node = node.parentNode));\r
+\r
+       return true;\r
+}\r
diff --git a/webcit/tiny_mce/plugins/flash/flash.htm b/webcit/tiny_mce/plugins/flash/flash.htm
new file mode 100644 (file)
index 0000000..7bab48a
--- /dev/null
@@ -0,0 +1,70 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_flash_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/flash.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <link href="css/flash.css" rel="stylesheet" type="text/css" />\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+    <form onsubmit="insertFlash();return false;" action="#">\r
+               <div class="tabs">\r
+                       <ul>\r
+                               <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{$lang_flash_general}</a></span></li>\r
+                       </ul>\r
+               </div>\r
+\r
+               <div class="panel_wrapper">\r
+                       <div id="general_panel" class="panel current">\r
+                               <fieldset>\r
+                                       <legend>{$lang_flash_general}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                                       <tr>\r
+                                                       <td nowrap="nowrap"><label for="file">{$lang_flash_file}</label></td>\r
+                                                         <td nowrap="nowrap">\r
+                                                                       <table border="0" cellspacing="0" cellpadding="0">\r
+                                                                         <tr>\r
+                                                                               <td><input id="file" name="file" type="text" value="" onfocus="this.select();" /></td>\r
+                                                                               <td id="filebrowsercontainer">&nbsp;</td>\r
+                                                                         </tr>\r
+                                                                       </table>\r
+                                                               </td>\r
+                                                       </tr>\r
+                                                       <tr id="linklistrow">\r
+                                                               <td><label for="linklist">{$lang_flash_list}</label></td>\r
+                                                               <td id="linklistcontainer">&nbsp;</td>\r
+                                                       </tr>\r
+                                                       <tr>\r
+                                                               <td nowrap="nowrap"><label>{$lang_flash_size}</label></td>\r
+                                                               <td nowrap="nowrap">\r
+                                                                       <input type="text" id="width" name="width" value="" onfocus="this.select();" />\r
+                                                                       <select name="width2" id="width2" style="width: 50px">\r
+                                                                               <option value="">px</option>\r
+                                                                               <option value="%">%</option>\r
+                                                                       </select>&nbsp;x&nbsp;<input id="height" name="height" type="text"  value="" onfocus="this.select();" />\r
+                                                                       <select name="height2" id="height2" style="width: 50px">\r
+                                                                               <option value="">px</option>\r
+                                                                               <option value="%">%</option>\r
+                                                                       </select>\r
+                                                               </td>\r
+                                                       </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+               </div>\r
+\r
+               <div class="mceActionPanel">\r
+                       <div style="float: left">\r
+                               <input type="button" id="insert" name="insert" value="{$lang_insert}" onclick="insertFlash();" />\r
+                       </div>\r
+\r
+                       <div style="float: right">\r
+                               <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+                       </div>\r
+               </div>\r
+       </form>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/plugins/flash/images/flash.gif b/webcit/tiny_mce/plugins/flash/images/flash.gif
new file mode 100644 (file)
index 0000000..cb192e6
Binary files /dev/null and b/webcit/tiny_mce/plugins/flash/images/flash.gif differ
diff --git a/webcit/tiny_mce/plugins/flash/jscripts/flash.js b/webcit/tiny_mce/plugins/flash/jscripts/flash.js
new file mode 100644 (file)
index 0000000..4f08077
--- /dev/null
@@ -0,0 +1,107 @@
+var url = tinyMCE.getParam("flash_external_list_url");\r
+if (url != null) {\r
+       // Fix relative\r
+       if (url.charAt(0) != '/' && url.indexOf('://') == -1)\r
+               url = tinyMCE.documentBasePath + "/" + url;\r
+\r
+       document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + url + '"></sc'+'ript>');\r
+}\r
+\r
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       document.getElementById("filebrowsercontainer").innerHTML = getBrowserHTML('filebrowser','file','flash','flash');\r
+\r
+       // Image list outsrc\r
+       var html = getFlashListHTML('filebrowser','file','flash','flash');\r
+       if (html == "")\r
+               document.getElementById("linklistrow").style.display = 'none';\r
+       else\r
+               document.getElementById("linklistcontainer").innerHTML = html;\r
+\r
+       var formObj = document.forms[0];\r
+       var swffile   = tinyMCE.getWindowArg('swffile');\r
+       var swfwidth  = '' + tinyMCE.getWindowArg('swfwidth');\r
+       var swfheight = '' + tinyMCE.getWindowArg('swfheight');\r
+\r
+       if (swfwidth.indexOf('%')!=-1) {\r
+               formObj.width2.value = "%";\r
+               formObj.width.value  = swfwidth.substring(0,swfwidth.length-1);\r
+       } else {\r
+               formObj.width2.value = "px";\r
+               formObj.width.value  = swfwidth;\r
+       }\r
+\r
+       if (swfheight.indexOf('%')!=-1) {\r
+               formObj.height2.value = "%";\r
+               formObj.height.value  = swfheight.substring(0,swfheight.length-1);\r
+       } else {\r
+               formObj.height2.value = "px";\r
+               formObj.height.value  = swfheight;\r
+       }\r
+\r
+       formObj.file.value = swffile;\r
+       formObj.insert.value = tinyMCE.getLang('lang_' + tinyMCE.getWindowArg('action'), 'Insert', true);\r
+\r
+       selectByValue(formObj, 'linklist', swffile);\r
+\r
+       // Handle file browser\r
+       if (isVisible('filebrowser'))\r
+               document.getElementById('file').style.width = '230px';\r
+\r
+       // Auto select flash in list\r
+       if (typeof(tinyMCEFlashList) != "undefined" && tinyMCEFlashList.length > 0) {\r
+               for (var i=0; i<formObj.linklist.length; i++) {\r
+                       if (formObj.linklist.options[i].value == tinyMCE.getWindowArg('swffile'))\r
+                               formObj.linklist.options[i].selected = true;\r
+               }\r
+       }\r
+}\r
+\r
+function getFlashListHTML() {\r
+       if (typeof(tinyMCEFlashList) != "undefined" && tinyMCEFlashList.length > 0) {\r
+               var html = "";\r
+\r
+               html += '<select id="linklist" name="linklist" style="width: 250px" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="this.form.file.value=this.options[this.selectedIndex].value;">';\r
+               html += '<option value="">---</option>';\r
+\r
+               for (var i=0; i<tinyMCEFlashList.length; i++)\r
+                       html += '<option value="' + tinyMCEFlashList[i][1] + '">' + tinyMCEFlashList[i][0] + '</option>';\r
+\r
+               html += '</select>';\r
+\r
+               return html;\r
+       }\r
+\r
+       return "";\r
+}\r
+\r
+function insertFlash() {\r
+       var formObj = document.forms[0];\r
+       var html      = '';\r
+       var file      = formObj.file.value;\r
+       var width     = formObj.width.value;\r
+       var height    = formObj.height.value;\r
+       if (formObj.width2.value=='%') {\r
+               width = width + '%';\r
+       }\r
+       if (formObj.height2.value=='%') {\r
+               height = height + '%';\r
+       }\r
+\r
+       if (width == "")\r
+               width = 100;\r
+\r
+       if (height == "")\r
+               height = 100;\r
+\r
+       html += ''\r
+               + '<img src="' + (tinyMCE.getParam("theme_href") + "/images/spacer.gif") + '" mce_src="' + (tinyMCE.getParam("theme_href") + "/images/spacer.gif") + '" '\r
+               + 'width="' + width + '" height="' + height + '" '\r
+               + 'border="0" alt="' + file + '" title="' + file + '" class="mceItemFlash" />';\r
+\r
+       tinyMCEPopup.execCommand("mceInsertContent", true, html);\r
+       tinyMCE.selectedInstance.repaint();\r
+\r
+       tinyMCEPopup.close();\r
+}\r
diff --git a/webcit/tiny_mce/plugins/flash/langs/cs.js b/webcit/tiny_mce/plugins/flash/langs/cs.js
new file mode 100644 (file)
index 0000000..cebe019
--- /dev/null
@@ -0,0 +1,14 @@
+/**\r
+ * Czech lang variables \r
+ * encoding: utf-8\r
+ *  \r
+ * $Id: cs.js,v 1.6 2005/10/18 13:59:42 spocke Exp $ \r
+ */  \r
+\r
+tinyMCE.addToLang('',{\r
+insert_flash : 'Vlo\9eit/editovat Flash Movie',\r
+insert_flash_file : 'Flash soubor (.swf)',\r
+insert_flash_size : 'Velikost',\r
+insert_flash_list : 'Seznam',\r
+flash_props : 'Vlastnosti Flash'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/flash/langs/cy.js b/webcit/tiny_mce/plugins/flash/langs/cy.js
new file mode 100644 (file)
index 0000000..c2e17e4
--- /dev/null
@@ -0,0 +1,11 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('flash',{\r
+title : 'Mewnosod/golygu Ffilm Flash',\r
+desc : 'Mewnosod/golygu Ffilm Flash',\r
+file : 'Ffeil Flash (.swf)',\r
+size : 'Maint',\r
+list : 'Ffeiliau Flash',\r
+props : 'Priodoleddau Flash',\r
+general : 'Cyffredinol'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/flash/langs/da.js b/webcit/tiny_mce/plugins/flash/langs/da.js
new file mode 100644 (file)
index 0000000..cd2134a
--- /dev/null
@@ -0,0 +1,11 @@
+// DK lang variables contributed by Jan Moelgaard\r
+\r
+tinyMCE.addToLang('flash',{\r
+title : 'Inds&#230;t / rediger Flash-film',\r
+desc : 'Inds&#230;t / rediger Flash-film',\r
+file : 'Flash-Fil (.swf)',\r
+size : 'St&#248;rrelse',\r
+list : 'Flash filer',\r
+props : 'Flash egenskaber',\r
+general : 'Genererelt'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/flash/langs/de.js b/webcit/tiny_mce/plugins/flash/langs/de.js
new file mode 100644 (file)
index 0000000..4072c14
--- /dev/null
@@ -0,0 +1,11 @@
+// DE lang variables\r
+\r
+tinyMCE.addToLang('flash',{\r
+title : 'Flash-Datei einf&uuml;gen/bearbeiten',\r
+desc : 'Flash-Datei einf&uuml;gen/bearbeiten',\r
+file : 'Flash-Datei (.swf)',\r
+size : 'Gr&ouml;&szlig;e',\r
+list : 'Flash-Dateien',\r
+props : 'Flash-Eigenschaften',\r
+general : 'Allgemein'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/flash/langs/en.js b/webcit/tiny_mce/plugins/flash/langs/en.js
new file mode 100644 (file)
index 0000000..67272bc
--- /dev/null
@@ -0,0 +1,11 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('flash',{\r
+title : 'Insert / edit Flash Movie',\r
+desc : 'Insert / edit Flash Movie',\r
+file : 'Flash-File (.swf)',\r
+size : 'Size',\r
+list : 'Flash files',\r
+props : 'Flash properties',\r
+general : 'General'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/flash/langs/es.js b/webcit/tiny_mce/plugins/flash/langs/es.js
new file mode 100644 (file)
index 0000000..f916a1c
--- /dev/null
@@ -0,0 +1,19 @@
+/**\r
+ * ES lang variables\r
+ * \r
+ * Authors : Alvaro Velasco,\r
+ *           Adolfo Sanz De Diego (asanzdiego) <asanzdiego@yahoo.es>,\r
+ *           Carlos C Soto (eclipxe) <csoto@sia-solutions.com>\r
+ * Last Updated : October 17, 2005\r
+ * TinyMCE Version : 2.0RC3\r
+ */\r
+\r
+tinyMCE.addToLang('flash',{\r
+title : 'Insertar / editar pelicula Flash',\r
+desc : 'Insert / edit Flash Movie',\r
+file : 'Fichero Flash (.swf)',\r
+size : 'Tamaño',\r
+list : 'Ficheros Flash',\r
+props : 'Propiedades del Flash',\r
+general : 'General'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/flash/langs/fa.js b/webcit/tiny_mce/plugins/flash/langs/fa.js
new file mode 100644 (file)
index 0000000..66a8b4e
--- /dev/null
@@ -0,0 +1,13 @@
+// IR lang variables\r
+// Persian (Farsi) language pack (for IRAN)\r
+// By: Morteza Zafari\r
+// Lost@LostLord.com\r
+// http://www.LostLord.com\r
+\r
+tinyMCE.addToLang('',{\r
+dir : 'rtl',\r
+insert_flash : '?????? ? ?????? ???? ???',\r
+insert_flash_file : '???? ??? (.swf)',\r
+insert_flash_size : '?????',\r
+flash_props : 'Flash properties'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/flash/langs/fr.js b/webcit/tiny_mce/plugins/flash/langs/fr.js
new file mode 100644 (file)
index 0000000..34a0348
--- /dev/null
@@ -0,0 +1,11 @@
+// Traduit par Normand Lamoureux le 2005-11-12\r
+\r
+tinyMCE.addToLang('flash',{\r
+title : 'Gestionnaire d\'animation Flash',\r
+desc : 'Insérer une animation Flash',\r
+file : 'Fichier Flash (.swf)',\r
+size : 'Taille',\r
+list : 'Fichiers Flash',\r
+props : 'Propriétés Flash',\r
+general : 'Général'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/flash/langs/fr_ca.js b/webcit/tiny_mce/plugins/flash/langs/fr_ca.js
new file mode 100644 (file)
index 0000000..f80d920
--- /dev/null
@@ -0,0 +1,9 @@
+// Canadian French lang variables by Virtuelcom   last modification: 2005-06-15\r
+\r
+tinyMCE.addToLang('',{\r
+insert_flash : 'Insérer / Modifier une animation Flash',\r
+insert_flash_file : 'Fichier Flash (.swf)',\r
+insert_flash_size : 'Dimension',\r
+insert_flash_list : 'Fichiers Flash',\r
+flash_props : 'Propriétés Flash'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/flash/langs/he.js b/webcit/tiny_mce/plugins/flash/langs/he.js
new file mode 100644 (file)
index 0000000..09448fe
--- /dev/null
@@ -0,0 +1,11 @@
+// HE lang variables\r
+\r
+tinyMCE.addToLang('flash',{\r
+title : 'äëðñ/òøåê ñøèåï Flash',\r
+desc : 'äëðñ/òøåê ñøèåï Flash',\r
+file : '÷åáõ Flash (.swf)',\r
+size : 'âåãì',\r
+list : '÷áöé Flash',\r
+props : 'îàôééðé Flash',\r
+general : 'ëììé'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/flash/langs/hu.js b/webcit/tiny_mce/plugins/flash/langs/hu.js
new file mode 100644 (file)
index 0000000..0760f10
--- /dev/null
@@ -0,0 +1,11 @@
+// HU lang variables\r
+\r
+tinyMCE.addToLang('flash',{\r
+title : 'Flash animáció beszúrása / szerkesztése',\r
+desc : 'Flash animáció beszúrása / szerkesztése',\r
+file : 'Flash-Fájl (.swf)',\r
+size : 'Méret',\r
+list : 'Flash fájlok',\r
+props : 'Flash tulajdonságok',\r
+general : 'Általános'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/flash/langs/is.js b/webcit/tiny_mce/plugins/flash/langs/is.js
new file mode 100644 (file)
index 0000000..022a7d6
--- /dev/null
@@ -0,0 +1,11 @@
+// Iceland lang variables by Johannes Birgir Jensson\r
+\r
+tinyMCE.addToLang('flash',{\r
+title : 'B&aelig;ta vi&eth; / breyta Flash-mynd',\r
+desc : 'B&aelig;ta vi&eth; / breyta Flash-mynd',\r
+file : 'Flash-skr&aacute; (.swf)',\r
+size : 'St&aelig;r&eth;',\r
+list : 'Flash skr&aacute;r',\r
+props : 'Flash stillingar',\r
+general : 'Almennt'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/flash/langs/nb.js b/webcit/tiny_mce/plugins/flash/langs/nb.js
new file mode 100644 (file)
index 0000000..09eaa6a
--- /dev/null
@@ -0,0 +1,11 @@
+// nb = Norwegian (bokm&aring;l) lang variables by Knut B. Jacobsen\r
+\r
+tinyMCE.addToLang('flash',{\r
+title : 'Lag/oppdater flash-film',\r
+desc : 'Lag/oppdater flash-film',\r
+file : 'Flash-film (.swf)',\r
+size : 'St&oslash;rrelse',\r
+list : 'Flash-filer',\r
+props : 'Flash egenskaper',\r
+general : 'Generelle innstillinger'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/flash/langs/nl.js b/webcit/tiny_mce/plugins/flash/langs/nl.js
new file mode 100644 (file)
index 0000000..5a35fe6
--- /dev/null
@@ -0,0 +1,11 @@
+// NL lang variables\r
+\r
+tinyMCE.addToLang('flash',{\r
+title : 'Flash bestand invoegen/bewerken',\r
+desc : 'Flash bestand invoegen/bewerken',\r
+file : 'Flash bestand (.swf)',\r
+size : 'Grootte',\r
+list : 'Flash bestanden',\r
+props : 'Flash eigenschappen',\r
+general : 'Algemeen'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/flash/langs/nn.js b/webcit/tiny_mce/plugins/flash/langs/nn.js
new file mode 100644 (file)
index 0000000..13eb072
--- /dev/null
@@ -0,0 +1,11 @@
+// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen\r
+\r
+tinyMCE.addToLang('flash',{\r
+title : 'Lag/oppdater flash-film',\r
+desc : 'Lag/oppdater flash-film',\r
+file : 'Flash-film (.swf)',\r
+size : 'St&oslash;rrelse',\r
+list : 'Flash-filer',\r
+props : 'Flash egenskaper',\r
+general : 'Generelle innstillinger'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/flash/langs/pl.js b/webcit/tiny_mce/plugins/flash/langs/pl.js
new file mode 100644 (file)
index 0000000..ece0c45
--- /dev/null
@@ -0,0 +1,14 @@
+// PL lang variables\r
+// fixed by Wooya\r
+// http://www.mfusion.prv.pl\r
+// fixed by lemiel 14.11.2005\r
+\r
+tinyMCE.addToLang('flash',{\r
+title : 'Wstaw/edytuj film flash',\r
+desc : 'Wstaw/edytuj film flash',\r
+file : 'Plik flash (.swf)',\r
+size : 'Rozmiar',\r
+list : 'Pliki flash',\r
+props : 'W³a¶ciwo¶ci flash',\r
+general : 'G³ówne'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/flash/langs/pt_br.js b/webcit/tiny_mce/plugins/flash/langs/pt_br.js
new file mode 100644 (file)
index 0000000..cf0c2e3
--- /dev/null
@@ -0,0 +1,19 @@
+/**\r
+ * pt_br lang variables\r
+ * Brazilian Portuguese\r
+ *\r
+ * Authors : ????\r
+ * Revision and modifications:\r
+ *           Marcio Barbosa (mpg) <mpg@mpg.com.br>\r
+ * Last Updated : November 26, 2005\r
+ * TinyMCE Version : 2.0RC4\r
+ */\r
+tinyMCE.addToLang('flash',{\r
+title : 'Inserir / editar Arquivo Flash',\r
+desc : 'Inserir / editar Arquivo Flash',\r
+file : 'Arquivo Flash (.swf)',\r
+size : 'Tamanho',\r
+list : 'Lista de arquivos Flash',\r
+props : 'Propriedades do Flash',\r
+general : 'Geral'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/flash/langs/ru.js b/webcit/tiny_mce/plugins/flash/langs/ru.js
new file mode 100644 (file)
index 0000000..6b4805b
--- /dev/null
@@ -0,0 +1,11 @@
+// RU lang variables cp1251\r
+\r
+tinyMCE.addToLang('flash',{\r
+title : 'Âñòàâèòü / Ðåäàêòèðîâàòü Flash ðîëèê',\r
+desc : 'Âñòàâèòü / Ðåäàêòèðîâàòü Flash ðîëèê',\r
+file : 'Flash-Ôàéë (.swf)',\r
+size : 'Ðàçìåð',\r
+list : 'Flash ôàéëû',\r
+props : 'Ñâîéñòâà Flash',\r
+general : 'Îñíîâíîå'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/flash/langs/ru_KOI8-R.js b/webcit/tiny_mce/plugins/flash/langs/ru_KOI8-R.js
new file mode 100644 (file)
index 0000000..0b9a522
--- /dev/null
@@ -0,0 +1,11 @@
+// RU lang variables KOI8-R\r
+\r
+tinyMCE.addToLang('flash',{\r
+title : '÷ÓÔÁ×ÉÔØ / òÅÄÁËÔÉÒÏ×ÁÔØ Flash ÒÏÌÉË',\r
+desc : '÷ÓÔÁ×ÉÔØ / òÅÄÁËÔÉÒÏ×ÁÔØ Flash ÒÏÌÉË',\r
+file : 'Flash-æÁÊÌ (.swf)',\r
+size : 'òÁÚÍÅÒ',\r
+list : 'Flash ÆÁÊÌÙ',\r
+props : 'ó×ÏÊÓÔ×Á Flash',\r
+general : 'ïÓÎÏ×ÎÏÅ'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/flash/langs/ru_UTF-8.js b/webcit/tiny_mce/plugins/flash/langs/ru_UTF-8.js
new file mode 100644 (file)
index 0000000..bdb004f
--- /dev/null
@@ -0,0 +1,11 @@
+// RU lang variables UTF-8\r
+\r
+tinyMCE.addToLang('flash',{\r
+title : 'Вставить / Редактировать Flash ролик',\r
+desc : 'Вставить / Редактировать Flash ролик',\r
+file : 'Flash-Файл (.swf)',\r
+size : 'Размер',\r
+list : 'Flash файлы',\r
+props : 'Свойства Flash',\r
+general : 'Основное'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/flash/langs/sk.js b/webcit/tiny_mce/plugins/flash/langs/sk.js
new file mode 100644 (file)
index 0000000..46a6c01
--- /dev/null
@@ -0,0 +1,16 @@
+/**\r
+ * Slovak lang variables \r
+ * encoding: utf-8\r
+ * \r
+ * @author Vladimir VASIL vvasil@post.sk\r
+ *    \r
+ * $Id: sk.js,v 1.1 2005/11/22 20:56:44 spocke Exp $ \r
+ */  \r
+\r
+tinyMCE.addToLang('',{\r
+insert_flash : 'Vložiť/editovať Flash Movie',\r
+insert_flash_file : 'Flash súbor (.swf)',\r
+insert_flash_size : 'Veľkosť',\r
+insert_flash_list : 'Zoznam',\r
+flash_props : 'Vlastnosti Flash'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/flash/langs/sv.js b/webcit/tiny_mce/plugins/flash/langs/sv.js
new file mode 100644 (file)
index 0000000..211ba98
--- /dev/null
@@ -0,0 +1,11 @@
+// SE lang variables\r
+\r
+tinyMCE.addToLang('flash',{\r
+title : 'Skapa/uppdatera flash-film',\r
+desc : 'Skapa/uppdatera flash-film',\r
+file : 'Flash-film (.swf)',\r
+size : 'Storlek',\r
+list : 'Flash-filer',\r
+props : 'Flash egenskaper',\r
+general : 'Generella inst&auml;llningar'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/flash/langs/zh_cn.js b/webcit/tiny_mce/plugins/flash/langs/zh_cn.js
new file mode 100644 (file)
index 0000000..82c830d
--- /dev/null
@@ -0,0 +1,11 @@
+// Simplified Chinese lang variables contributed by tom_cat (thomaswangyang@gmail.com)\r
+\r
+tinyMCE.addToLang('flash',{\r
+title : '²åÈë/±à¼­ FlashµçÓ°',\r
+desc : 'FlashµçÓ°ÃèÊö',\r
+file : 'Flash²å¼þ(.swf)',\r
+size : '³ß´ç',\r
+list : 'Flash²å¼þÁбí',\r
+props : 'FlashÊôÐÔ',\r
+general : 'Ò»°ã'\r
+});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/flash/langs/zh_tw.js b/webcit/tiny_mce/plugins/flash/langs/zh_tw.js
new file mode 100644 (file)
index 0000000..31ae8b1
--- /dev/null
@@ -0,0 +1,12 @@
+// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// ÁcÅ餤¤å BIG-5 ¡F¼Æ¦ìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com\r
+\r
+tinyMCE.addToLang('flash',{\r
+title : '´¡¤J©Î½s¿è Flash °ÊµeÀÉ',\r
+desc : '´¡¤J©Î½s¿è Flash °ÊµeÀÉ',\r
+file : 'Flash °ÊµeÀÉ¡] .swf ¡^',\r
+size : '¤j¤p',\r
+list : 'Flash °ÊµeÀÉ',\r
+props : 'Flash °ÊµeÀÉÄÝ©Ê',\r
+general : '¤@¯ë'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/flash/langs/zh_tw_utf8.js b/webcit/tiny_mce/plugins/flash/langs/zh_tw_utf8.js
new file mode 100644 (file)
index 0000000..724f7f3
--- /dev/null
@@ -0,0 +1,12 @@
+// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// 繁體中文 UTF-8 ;數位應用坊製作; twapweb_AT_gmail_DOT_com\r
+\r
+tinyMCE.addToLang('flash',{\r
+title : '插入或編輯 Flash 動畫檔',\r
+desc : '插入或編輯 Flash 動畫檔',\r
+file : 'Flash 動畫檔( .swf )',\r
+size : '大小',\r
+list : 'Flash 動畫檔',\r
+props : 'Flash 動畫檔屬性',\r
+general : '一般'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/flash/readme.txt b/webcit/tiny_mce/plugins/flash/readme.txt
new file mode 100644 (file)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/webcit/tiny_mce/plugins/fullscreen/editor_plugin.js b/webcit/tiny_mce/plugins/fullscreen/editor_plugin.js
new file mode 100644 (file)
index 0000000..4c6bccd
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.importPluginLanguagePack('fullscreen','en,sv,cs,fr_ca,zh_cn,da,he,nb,de,hu,ru,ru_KOI8-R,ru_UTF-8,nn,es,cy,is,pl,nl,fr,pt_br');function TinyMCE_fullscreen_getInfo(){return{longname:'Fullscreen',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_fullscreen.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_fullscreen_getControlHTML(control_name){switch(control_name){case "fullscreen":var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceFullScreen\');return false;';return '<a href="javascript:'+cmd+'" onclick="'+cmd+'" onmousedown="return false;"><img id="{$editor_id}_fullscreen" src="{$pluginurl}/images/fullscreen.gif" title="{$lang_fullscreen_desc}" width="20" height="20" class="mceButton'+(tinyMCE.getParam('fullscreen_is_enabled')?'Selected':'Normal')+'" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';}return "";}function TinyMCE_fullscreen_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mceFullScreen":if(tinyMCE.getParam('fullscreen_is_enabled')){window.opener.tinyMCE.execInstanceCommand(tinyMCE.getParam('fullscreen_editor_id'),'mceSetContent',false,tinyMCE.getContent(editor_id));top.close();}else{tinyMCE.setWindowArg('editor_id',editor_id);var win=window.open(tinyMCE.baseURL+"/plugins/fullscreen/fullscreen.htm","mceFullScreenPopup","fullscreen=yes,menubar=no,toolbar=no,scrollbars=no,resizable=yes,left=0,top=0,width="+screen.availWidth+",height="+screen.availHeight);}return true;}return false;}
\ 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..68ab1f9
--- /dev/null
@@ -0,0 +1,45 @@
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('fullscreen', 'en,sv,cs,fr_ca,zh_cn,da,he,nb,de,hu,ru,ru_KOI8-R,ru_UTF-8,nn,es,cy,is,pl,nl,fr,pt_br');\r
+\r
+function TinyMCE_fullscreen_getInfo() {\r
+       return {\r
+               longname : 'Fullscreen',\r
+               author : 'Moxiecode Systems',\r
+               authorurl : 'http://tinymce.moxiecode.com',\r
+               infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_fullscreen.html',\r
+               version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+       };\r
+};\r
+\r
+function TinyMCE_fullscreen_getControlHTML(control_name) {\r
+       switch (control_name) {\r
+               case "fullscreen":\r
+                       var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceFullScreen\');return false;';\r
+                       return '<a href="javascript:' + cmd + '" onclick="' + cmd + '" onmousedown="return false;"><img id="{$editor_id}_fullscreen" src="{$pluginurl}/images/fullscreen.gif" title="{$lang_fullscreen_desc}" width="20" height="20" class="mceButton' + (tinyMCE.getParam('fullscreen_is_enabled') ? 'Selected' : 'Normal') + '" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';\r
+       }\r
+\r
+       return "";\r
+}\r
+\r
+function TinyMCE_fullscreen_execCommand(editor_id, element, command, user_interface, value) {\r
+       // Handle commands\r
+       switch (command) {\r
+               case "mceFullScreen":\r
+                       if (tinyMCE.getParam('fullscreen_is_enabled')) {\r
+                               // In fullscreen mode\r
+                               window.opener.tinyMCE.execInstanceCommand(tinyMCE.getParam('fullscreen_editor_id'), 'mceSetContent', false, tinyMCE.getContent(editor_id));\r
+                               top.close();\r
+                       } else {\r
+                               tinyMCE.setWindowArg('editor_id', editor_id);\r
+\r
+                               var win = window.open(tinyMCE.baseURL + "/plugins/fullscreen/fullscreen.htm", "mceFullScreenPopup", "fullscreen=yes,menubar=no,toolbar=no,scrollbars=no,resizable=yes,left=0,top=0,width=" + screen.availWidth + ",height="  + screen.availHeight);\r
+                       }\r
+       \r
+                       return true;\r
+       }\r
+\r
+       // Pass to next handler in chain\r
+       return false;\r
+}\r
+\r
+\r
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..d648d76
--- /dev/null
@@ -0,0 +1,73 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_fullscreen_title}</title>\r
+       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce.js"></script>\r
+       <script language="javascript" type="text/javascript">\r
+               function patchCallback(settings, key) {\r
+                       if (settings[key])\r
+                               settings[key] = "window.opener." + settings[key];\r
+               }\r
+\r
+               var settings = new Array();\r
+\r
+               // Clone array\r
+               for (var name in window.opener.tinyMCE.settings)\r
+                       settings[name] = window.opener.tinyMCE.settings[name];\r
+\r
+               // Override options for fullscreen\r
+               for (var name in window.opener.tinyMCE.settings.fullscreen_settings)\r
+                       settings[name] = window.opener.tinyMCE.settings.fullscreen_settings[name];\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, 'oninit');\r
+\r
+               // Set options\r
+               settings['mode'] = 'exact';\r
+               settings['elements'] = 'fullscreenarea';\r
+               settings['ask'] = false;\r
+               settings['setupcontent_callback'] = 'setupContent';\r
+               settings['fullscreen_is_enabled'] = true;\r
+               settings['fullscreen_editor_id'] = window.opener.tinyMCE.getWindowArg("editor_id");\r
+               settings['theme_advanced_resizing'] = false;\r
+\r
+               // Init\r
+               tinyMCE.init(settings);\r
+               tinyMCE.documentBasePath = window.opener.tinyMCE.documentBasePath;\r
+\r
+               function setupContent(editor_id, body, doc) {\r
+                       var inst = tinyMCE.getInstanceById(editor_id);\r
+                       var backInst = window.opener.tinyMCE.getInstanceById(tinyMCE.getParam('fullscreen_editor_id'));\r
+\r
+                       // Setup title\r
+                       var divElm = document.createElement("div");\r
+                       divElm.innerHTML = tinyMCELang['lang_fullscreen_title'];\r
+                       document.title = divElm.innerHTML;\r
+\r
+                       // Get content\r
+                       inst.getBody().innerHTML = backInst.getBody().innerHTML;\r
+               }\r
+\r
+               function unloadHandler(e) {\r
+                       var doc = tinyMCE.isMSIE ? window.frames['mce_editor_0'].window.document : document.getElementById('mce_editor_0').contentDocument;\r
+                       window.opener.tinyMCE.setInnerHTML(window.opener.tinyMCE.selectedInstance.getBody(), doc.body.innerHTML);\r
+               }\r
+\r
+               // Add onunload\r
+               tinyMCE.addEvent(window, "beforeunload", unloadHandler);\r
+       </script>\r
+       <base target="_self" />\r
+</head>\r
+<body style="margin: 0px; overflow: hidden; height: 100%" scrolling="no" scroll="no">\r
+<textarea id="fullscreenarea" style="width: 100%; height: 100%"></textarea>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/plugins/fullscreen/images/fullscreen.gif b/webcit/tiny_mce/plugins/fullscreen/images/fullscreen.gif
new file mode 100644 (file)
index 0000000..66fa6d9
Binary files /dev/null and b/webcit/tiny_mce/plugins/fullscreen/images/fullscreen.gif differ
diff --git a/webcit/tiny_mce/plugins/fullscreen/langs/cs.js b/webcit/tiny_mce/plugins/fullscreen/langs/cs.js
new file mode 100644 (file)
index 0000000..fc40a3e
--- /dev/null
@@ -0,0 +1,12 @@
+/**\r
+ * Czech lang variables \r
+ * encoding: utf-8\r
+ *  \r
+ * $Id: cs.js,v 1.4 2005/10/18 13:59:42 spocke Exp $ \r
+ */  \r
+\r
+tinyMCE.addToLang('',{\r
+fullscreen_title : 'Na celou obrazovku',\r
+fullscreen_desc : 'Přepnout na celou obrazovku'\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/fullscreen/langs/cy.js b/webcit/tiny_mce/plugins/fullscreen/langs/cy.js
new file mode 100644 (file)
index 0000000..c527967
--- /dev/null
@@ -0,0 +1,6 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+fullscreen_title : 'Dull sgr&icirc;n-lawn',\r
+fullscreen_desc : 'Gwrthdroi dull sgr&icirc;n-lawn'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/fullscreen/langs/da.js b/webcit/tiny_mce/plugins/fullscreen/langs/da.js
new file mode 100644 (file)
index 0000000..4d86b01
--- /dev/null
@@ -0,0 +1,6 @@
+// DK lang variables contributed by Jan Moelgaard\r
+\r
+tinyMCE.addToLang('',{\r
+fullscreen_title : 'Fuldsk&#230;rmstilstand',\r
+fullscreen_desc : 'T&#230;nd / sluk for fuldsk&#230;rm'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/fullscreen/langs/de.js b/webcit/tiny_mce/plugins/fullscreen/langs/de.js
new file mode 100644 (file)
index 0000000..e1d0fa7
--- /dev/null
@@ -0,0 +1,6 @@
+// DE lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+fullscreen_title : 'Vollbild-Modus',\r
+fullscreen_desc : 'Vollbild-Modus umschalten'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/fullscreen/langs/en.js b/webcit/tiny_mce/plugins/fullscreen/langs/en.js
new file mode 100644 (file)
index 0000000..9a2ea6e
--- /dev/null
@@ -0,0 +1,6 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+fullscreen_title : 'Fullscreen mode',\r
+fullscreen_desc : 'Toggle fullscreen mode'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/fullscreen/langs/es.js b/webcit/tiny_mce/plugins/fullscreen/langs/es.js
new file mode 100644 (file)
index 0000000..c4b552c
--- /dev/null
@@ -0,0 +1,8 @@
+// ES lang variables by Alvaro Velasco and Adolfo Sanz De Diego (asanzdiego) <asanzdiego@yahoo.es>\r
+// Last Updated : October 2005\r
+// TinyMCE Version : 2.0RC3\r
+\r
+tinyMCE.addToLang('',{\r
+fullscreen_title : 'Pantalla completa',\r
+fullscreen_desc : 'Cambiar a pantalla completa'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/fullscreen/langs/fr.js b/webcit/tiny_mce/plugins/fullscreen/langs/fr.js
new file mode 100644 (file)
index 0000000..9637605
--- /dev/null
@@ -0,0 +1,6 @@
+// Traduit par Normand Lamoureux le 2005-11-12\r
+\r
+tinyMCE.addToLang('',{\r
+fullscreen_title : 'Affichage plein écran',\r
+fullscreen_desc : 'Affichage plein écran/normal'\r
+});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/fullscreen/langs/fr_ca.js b/webcit/tiny_mce/plugins/fullscreen/langs/fr_ca.js
new file mode 100644 (file)
index 0000000..a810964
--- /dev/null
@@ -0,0 +1,6 @@
+// Canadian French lang variables by Virtuelcom   last modification: 2005-06-15\r
+\r
+tinyMCE.addToLang('',{\r
+fullscreen_title : 'Mode plein écran',\r
+fullscreen_desc : 'Basculer le mode plein écrans'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/fullscreen/langs/he.js b/webcit/tiny_mce/plugins/fullscreen/langs/he.js
new file mode 100644 (file)
index 0000000..13663da
--- /dev/null
@@ -0,0 +1,6 @@
+// HE lang variables by Liron Newman, http://eesh.net\r
+\r
+tinyMCE.addToLang('',{\r
+fullscreen_title : 'îöá îñê îìà',\r
+fullscreen_desc : 'äçìó îöá îñê îìà'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/fullscreen/langs/hu.js b/webcit/tiny_mce/plugins/fullscreen/langs/hu.js
new file mode 100644 (file)
index 0000000..5201245
--- /dev/null
@@ -0,0 +1,6 @@
+// HU lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+fullscreen_title : 'Teljesképernyõs mód',\r
+fullscreen_desc : 'Váltás teljesképernyõs módra'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/fullscreen/langs/is.js b/webcit/tiny_mce/plugins/fullscreen/langs/is.js
new file mode 100644 (file)
index 0000000..5cec332
--- /dev/null
@@ -0,0 +1,6 @@
+// Iceland lang variables by Johannes Birgir Jensson\r
+\r
+tinyMCE.addToLang('',{\r
+fullscreen_title : 'Heilskj&aacute;r',\r
+fullscreen_desc : 'Skipta &iacute; / &uacute;r heilskj&aacute;'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/fullscreen/langs/nb.js b/webcit/tiny_mce/plugins/fullscreen/langs/nb.js
new file mode 100644 (file)
index 0000000..be4047f
--- /dev/null
@@ -0,0 +1,6 @@
+// nb = Norwegian (bokm&aring;l) lang variables by Knut B. Jacobsen\r
+\r
+tinyMCE.addToLang('',{\r
+fullscreen_title : 'Fullskjerm tilstand',\r
+fullscreen_desc : 'Hopp fra/til fullskjermtilstand'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/fullscreen/langs/nl.js b/webcit/tiny_mce/plugins/fullscreen/langs/nl.js
new file mode 100644 (file)
index 0000000..8e28e20
--- /dev/null
@@ -0,0 +1,6 @@
+// NL lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+fullscreen_title : 'Volledig scherm',\r
+fullscreen_desc : 'Volledig scherm aan/uit'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/fullscreen/langs/nn.js b/webcit/tiny_mce/plugins/fullscreen/langs/nn.js
new file mode 100644 (file)
index 0000000..5b6f3e7
--- /dev/null
@@ -0,0 +1,6 @@
+// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen\r
+\r
+tinyMCE.addToLang('',{\r
+fullscreen_title : 'Fullskjerm tilstand',\r
+fullscreen_desc : 'Hopp fra/til fullskjermtilstand'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/fullscreen/langs/pl.js b/webcit/tiny_mce/plugins/fullscreen/langs/pl.js
new file mode 100644 (file)
index 0000000..4dffb2e
--- /dev/null
@@ -0,0 +1,9 @@
+// PL lang variables\r
+// fixed by Wooya\r
+// http://www.mfusion.prv.pl\r
+// fixed by lemiel 14.11.2005\r
+\r
+tinyMCE.addToLang('',{\r
+fullscreen_title : 'Tryb pe³noekranowy',\r
+fullscreen_desc : 'Prze³±cz w tryb pe³noekranowy'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/fullscreen/langs/pt_br.js b/webcit/tiny_mce/plugins/fullscreen/langs/pt_br.js
new file mode 100644 (file)
index 0000000..433615c
--- /dev/null
@@ -0,0 +1,14 @@
+/**\r
+ * pt_br lang variables\r
+ * Brazilian Portuguese\r
+ *\r
+ * Authors : ????\r
+ * Revision and modifications:\r
+ *           Marcio Barbosa (mpg) <mpg@mpg.com.br>\r
+ * Last Updated : November 26, 2005\r
+ * TinyMCE Version : 2.0RC4\r
+ */\r
+tinyMCE.addToLang('',{\r
+fullscreen_title : 'Modo de Janela Inteira (Fullscreen)',\r
+fullscreen_desc : 'Alterar para modo de janela inteira'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/fullscreen/langs/ru.js b/webcit/tiny_mce/plugins/fullscreen/langs/ru.js
new file mode 100644 (file)
index 0000000..ab0d9a4
--- /dev/null
@@ -0,0 +1,6 @@
+// RU lang variables cp1251\r
+\r
+tinyMCE.addToLang('',{\r
+fullscreen_title : 'Ïîëíîýêðàííûé ðåæèì',\r
+fullscreen_desc : 'Âêëþ÷èòü ïîëíîýêðàííûé ðåæèì'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/fullscreen/langs/ru_KOI8-R.js b/webcit/tiny_mce/plugins/fullscreen/langs/ru_KOI8-R.js
new file mode 100644 (file)
index 0000000..3b17116
--- /dev/null
@@ -0,0 +1,6 @@
+// RU lang variables KOI8-R\r
+\r
+tinyMCE.addToLang('',{\r
+fullscreen_title : 'ðÏÌÎÏÜËÒÁÎÎÙÊ ÒÅÖÉÍ',\r
+fullscreen_desc : '÷ËÌÀÞÉÔØ ÐÏÌÎÏÜËÒÁÎÎÙÊ ÒÅÖÉÍ'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/fullscreen/langs/ru_UTF-8.js b/webcit/tiny_mce/plugins/fullscreen/langs/ru_UTF-8.js
new file mode 100644 (file)
index 0000000..d4fd1b3
--- /dev/null
@@ -0,0 +1,6 @@
+// RU lang variables UTF-8\r
+\r
+tinyMCE.addToLang('',{\r
+fullscreen_title : 'Полноэкранный режим',\r
+fullscreen_desc : 'Включить полноэкранный режим'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/fullscreen/langs/sk.js b/webcit/tiny_mce/plugins/fullscreen/langs/sk.js
new file mode 100644 (file)
index 0000000..4f77916
--- /dev/null
@@ -0,0 +1,14 @@
+/**\r
+ * Slovak lang variables \r
+ * encoding: utf-8\r
+ * \r
+ * @author Vladimir VASIL vvasil@post.sk\r
+ *    \r
+ * $Id: sk.js,v 1.1 2005/11/22 20:56:44 spocke Exp $ \r
+ */  \r
+\r
+tinyMCE.addToLang('',{\r
+fullscreen_title : 'Na celú obrazovku',\r
+fullscreen_desc : 'Prepnúť na celú obrazovku'\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/fullscreen/langs/sv.js b/webcit/tiny_mce/plugins/fullscreen/langs/sv.js
new file mode 100644 (file)
index 0000000..5f671f0
--- /dev/null
@@ -0,0 +1,6 @@
+// SV lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+fullscreen_title : 'Fullsk&auml;rmsl&auml;ge',\r
+fullscreen_desc : 'Hoppa fr&aring;n/till fullsk&auml;rmsl&auml;ge'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/fullscreen/langs/zh_cn.js b/webcit/tiny_mce/plugins/fullscreen/langs/zh_cn.js
new file mode 100644 (file)
index 0000000..866427f
--- /dev/null
@@ -0,0 +1,6 @@
+// Simplified Chinese lang variables contributed by tom_cat (thomaswangyang@gmail.com)\r
+\r
+tinyMCE.addToLang('',{\r
+fullscreen_title : 'È«ÆÁģʽ',\r
+fullscreen_desc : 'Çл»È«ÆÁģʽ'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/fullscreen/langs/zh_tw.js b/webcit/tiny_mce/plugins/fullscreen/langs/zh_tw.js
new file mode 100644 (file)
index 0000000..47a456a
--- /dev/null
@@ -0,0 +1,7 @@
+// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// ÁcÅ餤¤å BIG-5 ¡F¼Æ¦ìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com\r
+\r
+tinyMCE.addToLang('',{\r
+fullscreen_title : '¥þ¿Ã¹õ¼Ò¦¡',\r
+fullscreen_desc : 'Âন¥þ¿Ã¹õ¼Ò¦¡'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/fullscreen/langs/zh_tw_utf8.js b/webcit/tiny_mce/plugins/fullscreen/langs/zh_tw_utf8.js
new file mode 100644 (file)
index 0000000..2442c4b
--- /dev/null
@@ -0,0 +1,7 @@
+// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// 繁體中文 UTF-8 ;數位應用坊製作; twapweb_AT_gmail_DOT_com\r
+\r
+tinyMCE.addToLang('',{\r
+fullscreen_title : '全螢幕模式',\r
+fullscreen_desc : '轉成全螢幕模式'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/fullscreen/readme.txt b/webcit/tiny_mce/plugins/fullscreen/readme.txt
new file mode 100644 (file)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/webcit/tiny_mce/plugins/iespell/editor_plugin.js b/webcit/tiny_mce/plugins/iespell/editor_plugin.js
new file mode 100644 (file)
index 0000000..9368e44
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.importPluginLanguagePack('iespell','cs,el,en,fr_ca,it,ko,sv,zh_cn,fr,de,pl,pt_br,nl,da,he,nb,ru,ru_KOI8-R,ru_UTF-8,nn,fi,cy,es,is,zh_tw,zh_tw_utf8,sk');function TinyMCE_iespell_getInfo(){return{longname:'IESpell',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_iespell.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_iespell_getControlHTML(control_name){if(control_name=="iespell"&&(tinyMCE.isMSIE&&!tinyMCE.isOpera)){var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceIESpell\');return false;';return '<a href="javascript:'+cmd+'" onclick="'+cmd+'" target="_self" onmousedown="return false;"><img id="{$editor_id}_iespell" src="{$pluginurl}/images/iespell.gif" title="{$lang_iespell_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';}return "";}function TinyMCE_iespell_execCommand(editor_id,element,command,user_interface,value){if(command=="mceIESpell"){try{var ieSpell=new ActiveXObject("ieSpell.ieSpellExtension");ieSpell.CheckDocumentNode(tinyMCE.getInstanceById(editor_id).contentDocument.documentElement);}catch(e){if(e.number==-2146827859){if(confirm(tinyMCE.getLang("lang_iespell_download","",true)))window.open('http://www.iespell.com/download.php','ieSpellDownload','');}else alert("Error Loading ieSpell: Exception "+e.number);}return true;}return false;}
\ 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..1b09fb7
--- /dev/null
@@ -0,0 +1,49 @@
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('iespell', 'cs,el,en,fr_ca,it,ko,sv,zh_cn,fr,de,pl,pt_br,nl,da,he,nb,ru,ru_KOI8-R,ru_UTF-8,nn,fi,cy,es,is,zh_tw,zh_tw_utf8,sk');\r
+\r
+function TinyMCE_iespell_getInfo() {\r
+       return {\r
+               longname : 'IESpell',\r
+               author : 'Moxiecode Systems',\r
+               authorurl : 'http://tinymce.moxiecode.com',\r
+               infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_iespell.html',\r
+               version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+       };\r
+};\r
+\r
+/**\r
+ * Returns the HTML contents of the iespell control.\r
+ */\r
+function TinyMCE_iespell_getControlHTML(control_name) {\r
+       // Is it the iespell control and is the brower MSIE.\r
+       if (control_name == "iespell" && (tinyMCE.isMSIE && !tinyMCE.isOpera)) {\r
+               var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceIESpell\');return false;';\r
+               return '<a href="javascript:' + cmd + '" onclick="' + cmd + '" target="_self" onmousedown="return false;"><img id="{$editor_id}_iespell" src="{$pluginurl}/images/iespell.gif" title="{$lang_iespell_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';\r
+       }\r
+\r
+       return "";\r
+}\r
+\r
+/**\r
+ * Executes the mceIESpell command.\r
+ */\r
+function TinyMCE_iespell_execCommand(editor_id, element, command, user_interface, value) {\r
+       // Handle ieSpellCommand\r
+       if (command == "mceIESpell") {\r
+               try {\r
+                       var ieSpell = new ActiveXObject("ieSpell.ieSpellExtension");\r
+                       ieSpell.CheckDocumentNode(tinyMCE.getInstanceById(editor_id).contentDocument.documentElement);\r
+               } catch (e) {\r
+                       if (e.number == -2146827859) {\r
+                               if (confirm(tinyMCE.getLang("lang_iespell_download", "", true)))\r
+                                       window.open('http://www.iespell.com/download.php', 'ieSpellDownload', '');\r
+                       } else\r
+                               alert("Error Loading ieSpell: Exception " + e.number);\r
+               }\r
+\r
+               return true;\r
+       }\r
+\r
+       // Pass to next handler in chain\r
+       return false;\r
+}
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/iespell/images/iespell.gif b/webcit/tiny_mce/plugins/iespell/images/iespell.gif
new file mode 100644 (file)
index 0000000..a9a2891
Binary files /dev/null and b/webcit/tiny_mce/plugins/iespell/images/iespell.gif differ
diff --git a/webcit/tiny_mce/plugins/iespell/langs/cs.js b/webcit/tiny_mce/plugins/iespell/langs/cs.js
new file mode 100644 (file)
index 0000000..04e1282
--- /dev/null
@@ -0,0 +1,12 @@
+/**\r
+ * Czech lang variables \r
+ * encoding: utf-8\r
+ *  \r
+ * $Id: cs.js,v 1.4 2005/10/18 13:59:42 spocke Exp $ \r
+ */  \r
+\r
+tinyMCE.addToLang('',{\r
+iespell_desc : 'Spustit kontrolu pravopisu',\r
+iespell_download : "ieSpell nedetekován. Klikněte na OK a otevřete stahovací stránku."\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/iespell/langs/cy.js b/webcit/tiny_mce/plugins/iespell/langs/cy.js
new file mode 100644 (file)
index 0000000..e7671a2
--- /dev/null
@@ -0,0 +1,7 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+iespell_desc : 'Dechrau gwirio sillafu',\r
+iespell_download : "Methwyd canfod ieSpell. Cliciwch OK i fynd i'r dudalen lawrlwytho."\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/iespell/langs/da.js b/webcit/tiny_mce/plugins/iespell/langs/da.js
new file mode 100644 (file)
index 0000000..4612e18
--- /dev/null
@@ -0,0 +1,7 @@
+// DK lang variables contributed by Jan Moelgaard\r
+\r
+tinyMCE.addToLang('',{\r
+iespell_desc : 'Lav stavekontrol',\r
+iespell_download : "ieSpell kan ikke findes. Klik p&#229; OK for at forts&#230;tte til downloadsiden."\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/iespell/langs/de.js b/webcit/tiny_mce/plugins/iespell/langs/de.js
new file mode 100644 (file)
index 0000000..bc10a50
--- /dev/null
@@ -0,0 +1,7 @@
+// DE lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+iespell_desc : 'Rechtschreibpr&uuml;fung',\r
+iespell_download : "ieSpell nicht gefunden. Klicken Sie OK, um die Download-Seite aufzurufen."\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/iespell/langs/el.js b/webcit/tiny_mce/plugins/iespell/langs/el.js
new file mode 100644 (file)
index 0000000..9b48b86
--- /dev/null
@@ -0,0 +1,7 @@
+// Greek lang variables by Jacaranda Bill\r
+\r
+tinyMCE.addToLang('',{\r
+iespell_desc : 'Ïñèïãñá&ouml;éêüò Ýë&aring;ã÷ïò',\r
+iespell_download : "Ôï ðñüãñáììá ieSpell &auml;&aring;í âñÝèçê&aring;. ÐáôÞóô&aring; OK ãéá íá ì&aring;ôáâ&aring;ßô&aring; óôçí éóôïó&aring;ëß&auml;á ëÞøçò ôïõ ðñïãñÜììáôïò."\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/iespell/langs/en.js b/webcit/tiny_mce/plugins/iespell/langs/en.js
new file mode 100644 (file)
index 0000000..c3688e9
--- /dev/null
@@ -0,0 +1,7 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+iespell_desc : 'Run spell checking',\r
+iespell_download : "ieSpell not detected. Click OK to go to download page."\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/iespell/langs/es.js b/webcit/tiny_mce/plugins/iespell/langs/es.js
new file mode 100644 (file)
index 0000000..f27868a
--- /dev/null
@@ -0,0 +1,15 @@
+/**\r
+ * ES lang variables\r
+ * \r
+ * Authors : Alvaro Velasco,\r
+ *           Adolfo Sanz De Diego (asanzdiego) <asanzdiego@yahoo.es>,\r
+ *           Carlos C Soto (eclipxe) <csoto@sia-solutions.com>\r
+ * Last Updated : October 17, 2005\r
+ * TinyMCE Version : 2.0RC3\r
+ */\r
+\r
+tinyMCE.addToLang('',{\r
+iespell_desc : 'Ejecutar corrector ortográfico',\r
+iespell_download : "Corrector ortográfico no detectado. Pulse OK para ir a la página de descarga."\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/iespell/langs/fr.js b/webcit/tiny_mce/plugins/iespell/langs/fr.js
new file mode 100644 (file)
index 0000000..ba5573a
--- /dev/null
@@ -0,0 +1,7 @@
+// French lang variables by Laurent Dran\r
+// Modifié par Normand Lamoureux le 2005-11-12\r
+\r
+tinyMCE.addToLang('',{\r
+iespell_desc : 'Lancer le vérificateur d\'orthographe',\r
+iespell_download : "Le dictionnaire ieSpell n\'a pas été trouvé.\n\nCliquez sur Ok pour aller au site de téléchargement."\r
+});\r
diff --git a/webcit/tiny_mce/plugins/iespell/langs/fr_ca.js b/webcit/tiny_mce/plugins/iespell/langs/fr_ca.js
new file mode 100644 (file)
index 0000000..8904beb
--- /dev/null
@@ -0,0 +1,6 @@
+// Canadian French lang variables by Virtuelcom   last modification: 2005-06-15\r
+\r
+tinyMCE.addToLang('',{\r
+iespell_desc : 'Executer le vérificateur d\'orthographe',\r
+iespell_download : "ieSpell n\'a pas été trouvé. Cliquez sur OK pour aller au site de téléchargement."\r
+});\r
diff --git a/webcit/tiny_mce/plugins/iespell/langs/he.js b/webcit/tiny_mce/plugins/iespell/langs/he.js
new file mode 100644 (file)
index 0000000..1c1fde6
--- /dev/null
@@ -0,0 +1,6 @@
+// HE lang variables by Liron Newman, http://eesh.net\r
+\r
+tinyMCE.addToLang('',{\r
+iespell_desc : 'äôòì áãé÷ú àéåú',\r
+iespell_download : "ìà ðîöà ieSpell. ìçõ òì àéùåø ëãé ìäâéò ìãó ääåøãä."\r
+});\r
diff --git a/webcit/tiny_mce/plugins/iespell/langs/hu.js b/webcit/tiny_mce/plugins/iespell/langs/hu.js
new file mode 100644 (file)
index 0000000..d24a803
--- /dev/null
@@ -0,0 +1,7 @@
+// HU lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+iespell_desc : 'Helyesírásellenõrzés indítása',\r
+iespell_download : "ieSpell nem található. Kattints az OK-ra a letöltési oldalhoz."\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/iespell/langs/is.js b/webcit/tiny_mce/plugins/iespell/langs/is.js
new file mode 100644 (file)
index 0000000..f302400
--- /dev/null
@@ -0,0 +1,7 @@
+// Iceland lang variables by Johannes Birgir Jensson\r
+\r
+tinyMCE.addToLang('',{\r
+iespell_desc : 'Stafsetningarp&uacute;ki',\r
+iespell_download : "ieSpell ekki til staðar. Smellið á OK til að sjá niðurhalssíðu."\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/iespell/langs/it.js b/webcit/tiny_mce/plugins/iespell/langs/it.js
new file mode 100644 (file)
index 0000000..6f4d529
--- /dev/null
@@ -0,0 +1,7 @@
+// IT lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+iespell_desc : 'Avvia il controllo ortografico',\r
+iespell_download : "ieSpell non trovato. Clicca OK per andare alla pagina di download."\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/iespell/langs/ko.js b/webcit/tiny_mce/plugins/iespell/langs/ko.js
new file mode 100644 (file)
index 0000000..eb03092
--- /dev/null
@@ -0,0 +1,7 @@
+// KO lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+iespell_desc : '¸ÂÃã¹ý °Ë»ç ½ÇÇà',\r
+iespell_download : "ieSpellÀ» Ã£À» ¼&ouml; ¾ø½À´Ï´Ù. OK¸¦ ´©¸£¸é ´Ù¿î·Îµ&aring; Æ&auml;ÀÌÁ&ouml;·Î À̵¿ÇÕ´Ï´Ù."\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/iespell/langs/nb.js b/webcit/tiny_mce/plugins/iespell/langs/nb.js
new file mode 100644 (file)
index 0000000..71d165f
--- /dev/null
@@ -0,0 +1,6 @@
+// nb = Norwegian (bokm&aring;l) lang variables by Knut B. Jacobsen\r
+\r
+tinyMCE.addToLang('',{\r
+iespell_desc : 'Kj&oslash;r rettstavingskontroll',\r
+iespell_download : "ieSpell virker ikke &aring; v&aelig;re installert. Klikk OK for &aring; laste hjem."\r
+});\r
diff --git a/webcit/tiny_mce/plugins/iespell/langs/nl.js b/webcit/tiny_mce/plugins/iespell/langs/nl.js
new file mode 100644 (file)
index 0000000..9d3530d
--- /dev/null
@@ -0,0 +1,6 @@
+// NL lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+iespell_desc : 'Spellingscontrole',\r
+iespell_download : "ieSpell niet gedetecteerd. Klik op OK om deze te downloaden."\r
+});\r
diff --git a/webcit/tiny_mce/plugins/iespell/langs/nn.js b/webcit/tiny_mce/plugins/iespell/langs/nn.js
new file mode 100644 (file)
index 0000000..85b46a1
--- /dev/null
@@ -0,0 +1,6 @@
+// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen\r
+\r
+tinyMCE.addToLang('',{\r
+iespell_desc : 'Kj&oslash;r rettstavingskontroll',\r
+iespell_download : "ieSpell virker ikke &aring; v&aelig;re installert. Klikk OK for &aring; laste hjem."\r
+});\r
diff --git a/webcit/tiny_mce/plugins/iespell/langs/pl.js b/webcit/tiny_mce/plugins/iespell/langs/pl.js
new file mode 100644 (file)
index 0000000..1b30d97
--- /dev/null
@@ -0,0 +1,8 @@
+// PL lang variables\r
+// fixed by Wooya\r
+// http://www.mfusion.prv.pl\r
+\r
+tinyMCE.addToLang('',{\r
+iespell_desc : 'Uruchom sprawdzanie pisowni',\r
+iespell_download : "Nie wykryto pluginu, kliknij aby przej¶æ do strony z pluginami."\r
+});\r
diff --git a/webcit/tiny_mce/plugins/iespell/langs/pt_br.js b/webcit/tiny_mce/plugins/iespell/langs/pt_br.js
new file mode 100644 (file)
index 0000000..6b808f4
--- /dev/null
@@ -0,0 +1,14 @@
+/**\r
+ * pt_br lang variables\r
+ * Brazilian Portuguese\r
+ *\r
+ * Authors : ????\r
+ * Revision and modifications:\r
+ *           Marcio Barbosa (mpg) <mpg@mpg.com.br>\r
+ * Last Updated : November 26, 2005\r
+ * TinyMCE Version : 2.0RC4\r
+ */\r
+tinyMCE.addToLang('',{\r
+iespell_desc : 'Executar verificação ortográfica',\r
+iespell_download : "Verificador ieSpell não detectado. Click OK para ir à página de download."\r
+});\r
diff --git a/webcit/tiny_mce/plugins/iespell/langs/ru.js b/webcit/tiny_mce/plugins/iespell/langs/ru.js
new file mode 100644 (file)
index 0000000..006af8e
--- /dev/null
@@ -0,0 +1,7 @@
+// RU lang variables cp1251\r
+\r
+tinyMCE.addToLang('',{\r
+iespell_desc : 'Çàïóñòèòü ïðîâåðêó îðôîãðàôèè',\r
+iespell_download : "ieSpell íå îáíàðóæåí. íàæìèòå OK, ÷òîáû ïåðåéòè íà ñòðàíèöó çàãðóçêè."\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/iespell/langs/ru_KOI8-R.js b/webcit/tiny_mce/plugins/iespell/langs/ru_KOI8-R.js
new file mode 100644 (file)
index 0000000..61c7bf2
--- /dev/null
@@ -0,0 +1,7 @@
+// RU lang variables KOI8-R\r
+\r
+tinyMCE.addToLang('',{\r
+iespell_desc : 'úÁÐÕÓÔÉÔØ ÐÒÏ×ÅÒËÕ ÏÒÆÏÇÒÁÆÉÉ',\r
+iespell_download : "ieSpell ÎÅ ÏÂÎÁÒÕÖÅÎ. ÎÁÖÍÉÔÅ OK, ÞÔÏÂÙ ÐÅÒÅÊÔÉ ÎÁ ÓÔÒÁÎÉÃÕ ÚÁÇÒÕÚËÉ."\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/iespell/langs/ru_UTF-8.js b/webcit/tiny_mce/plugins/iespell/langs/ru_UTF-8.js
new file mode 100644 (file)
index 0000000..1de0ad6
--- /dev/null
@@ -0,0 +1,7 @@
+// RU lang variables UTF-8\r
+\r
+tinyMCE.addToLang('',{\r
+iespell_desc : 'Запустить проверку орфографии',\r
+iespell_download : "ieSpell не обнаружен. нажмите OK, чтобы перейти на страницу загрузки."\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/iespell/langs/sk.js b/webcit/tiny_mce/plugins/iespell/langs/sk.js
new file mode 100644 (file)
index 0000000..0c09517
--- /dev/null
@@ -0,0 +1,14 @@
+/**\r
+ * Slovak lang variables \r
+ * encoding: utf-8\r
+ * \r
+ * @author Vladimir VASIL vvasil@post.sk\r
+ *    \r
+ * $Id: sk.js,v 1.1 2005/11/22 20:56:44 spocke Exp $ \r
+ */  \r
+\r
+tinyMCE.addToLang('',{\r
+iespell_desc : 'Spustiť kontrolu pravopisu',\r
+iespell_download : "ieSpell nedetekovaný Kliknite na OK a otvorte stahovaciu stránku."\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/iespell/langs/sv.js b/webcit/tiny_mce/plugins/iespell/langs/sv.js
new file mode 100644 (file)
index 0000000..7006885
--- /dev/null
@@ -0,0 +1,6 @@
+// SE lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+iespell_desc : 'K&ouml;r r&auml;ttstavningskontroll',\r
+iespell_download : "ieSpell verkar inte vara installerad. Klicka OK f&ouml;r att ladda hem."\r
+});\r
diff --git a/webcit/tiny_mce/plugins/iespell/langs/zh_cn.js b/webcit/tiny_mce/plugins/iespell/langs/zh_cn.js
new file mode 100644 (file)
index 0000000..032655a
--- /dev/null
@@ -0,0 +1,6 @@
+// Simplified Chinese lang variables contributed by tom_cat (thomaswangyang@gmail.com)\r
+\r
+tinyMCE.addToLang('',{\r
+iespell_desc : 'ÔËÐÐƴд¼ì²é',\r
+iespell_download : "δ¼ì²âµ½ ieSpell Æ´Ð´¼ì²é£¬µã»÷ OK Ç°ÍùÏÂÔØÒ³Ãæ¡£"\r
+});\r
diff --git a/webcit/tiny_mce/plugins/iespell/langs/zh_tw.js b/webcit/tiny_mce/plugins/iespell/langs/zh_tw.js
new file mode 100644 (file)
index 0000000..5345a72
--- /dev/null
@@ -0,0 +1,7 @@
+// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// ÁcÅ餤¤å BIG-5 ¡F¼Æ¦ìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com\r
+\r
+tinyMCE.addToLang('',{\r
+iespell_desc : '°õ¦æ«÷¦rÀˬd',\r
+iespell_download : "µL ieSpell «÷¦rÀˬd¥\¯à¡CÂI«ö¡u½T©w¡v«á¤U¸ü¦w¸Ë"\r
+});\r
diff --git a/webcit/tiny_mce/plugins/iespell/langs/zh_tw_utf8.js b/webcit/tiny_mce/plugins/iespell/langs/zh_tw_utf8.js
new file mode 100644 (file)
index 0000000..936520a
--- /dev/null
@@ -0,0 +1,8 @@
+// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// 繁體中文 UTF-8 ;數位應用坊製作; twapweb_AT_gmail_DOT_com\r
+\r
+tinyMCE.addToLang('',{\r
+iespell_desc : '執行拼字檢查',\r
+iespell_download : "無 ieSpell 拼字檢查功能。點按「確定」後下載安裝"\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/iespell/readme.txt b/webcit/tiny_mce/plugins/iespell/readme.txt
new file mode 100644 (file)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/webcit/tiny_mce/plugins/inlinepopups/css/inlinepopup.css b/webcit/tiny_mce/plugins/inlinepopups/css/inlinepopup.css
new file mode 100644 (file)
index 0000000..2b62077
--- /dev/null
@@ -0,0 +1,69 @@
+/* Window classes */\r
+\r
+.mceWindow {\r
+       position: absolute;\r
+       left: 0px;\r
+       top: 0px;\r
+       border: 1px solid black;\r
+       background-color: #D4D0C8;\r
+}\r
+\r
+.mceWindowHead {\r
+       background-color: #334F8D;\r
+       width: 100%;\r
+       height: 18px;\r
+       cursor: move;\r
+       overflow: hidden;\r
+}\r
+\r
+.mceWindowBody {\r
+       clear: both;\r
+       background-color: white;\r
+}\r
+\r
+.mceWindowStatusbar {\r
+       background-color: #D4D0C8;\r
+       height: 12px;\r
+       border-top: 1px solid black;\r
+}\r
+\r
+.mceWindowTitle {\r
+       float: left;\r
+       font-family: "MS Sans Serif";\r
+       font-size: 9pt;\r
+       font-weight: bold;\r
+       line-height: 18px;\r
+       color: white;\r
+       margin-left: 2px;\r
+       overflow: hidden;\r
+}\r
+\r
+.mceWindowHeadTools {\r
+       margin-right: 2px;\r
+}\r
+\r
+.mceWindowClose, .mceWindowMinimize, .mceWindowMaximize {\r
+       display: block;\r
+       float: right;\r
+       overflow: hidden;\r
+       margin-top: 2px;\r
+}\r
+\r
+.mceWindowClose {\r
+       margin-left: 2px;\r
+}\r
+\r
+.mceWindowMinimize {\r
+}\r
+\r
+.mceWindowMaximize {\r
+}\r
+\r
+.mceWindowResize {\r
+       display: block;\r
+       float: right;\r
+       overflow: hidden;\r
+       cursor: se-resize;\r
+       width: 12px;\r
+       height: 12px;\r
+}\r
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..a70f4d7
--- /dev/null
@@ -0,0 +1 @@
+function TinyMCE_inlinepopups_getInfo(){return{longname:'Inline Popups',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_inlinepopups.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};TinyMCE.prototype.orgOpenWindow=TinyMCE.prototype.openWindow;TinyMCE.prototype.openWindow=function(template,args){if(args['inline']!="yes"||tinyMCE.isOpera||tinyMCE.getParam("plugins").indexOf('inlinepopups')==-1){mcWindows.selectedWindow=null;args['mce_inside_iframe']=false;this.orgOpenWindow(template,args);return;}var url,resizable,scrollbars;args['mce_inside_iframe']=true;tinyMCE.windowArgs=args;if(template['file'].charAt(0)!='/'&&template['file'].indexOf('://')==-1)url=tinyMCE.baseURL+"/themes/"+tinyMCE.getParam("theme")+"/"+template['file'];else url=template['file'];if(!(width=parseInt(template['width'])))width=320;if(!(height=parseInt(template['height'])))height=200;resizable=(args&&args['resizable'])?args['resizable']:"no";scrollbars=(args&&args['scrollbars'])?args['scrollbars']:"no";height+=18;for(var name in args){if(typeof(args[name])=='function')continue;url=tinyMCE.replaceVar(url,name,escape(args[name]));}var elm=document.getElementById(this.selectedInstance.editorId+'_parent');var pos=tinyMCE.getAbsPosition(elm);pos.absLeft+=Math.round((elm.firstChild.clientWidth/2)-(width/2));pos.absTop+=Math.round((elm.firstChild.clientHeight/2)-(height/2));mcWindows.open(url,mcWindows.idCounter++,"modal=yes,width="+width+",height="+height+",resizable="+resizable+",scrollbars="+scrollbars+",statusbar="+resizable+",left="+pos.absLeft+",top="+pos.absTop);};TinyMCE.prototype.orgCloseWindow=TinyMCE.prototype.closeWindow;TinyMCE.prototype.closeWindow=function(win){if(mcWindows.selectedWindow!=null)mcWindows.selectedWindow.close();else this.orgCloseWindow(win);};TinyMCE.prototype.setWindowTitle=function(win_ref,title){for(var n in mcWindows.windows){var win=mcWindows.windows[n];if(typeof(win)=='function')continue;if(win_ref.name==win.id+"_iframe")window.frames[win.id+"_iframe"].document.getElementById(win.id+'_title').innerHTML=title;}};function MCWindows(){this.settings=new Array();this.windows=new Array();this.isMSIE=(navigator.appName=="Microsoft Internet Explorer");this.isGecko=navigator.userAgent.indexOf('Gecko')!=-1;this.isSafari=navigator.userAgent.indexOf('Safari')!=-1;this.isMac=navigator.userAgent.indexOf('Mac')!=-1;this.isMSIE5_0=this.isMSIE&&(navigator.userAgent.indexOf('MSIE 5.0')!=-1);this.action="none";this.selectedWindow=null;this.lastSelectedWindow=null;this.zindex=100;this.mouseDownScreenX=0;this.mouseDownScreenY=0;this.mouseDownLayerX=0;this.mouseDownLayerY=0;this.mouseDownWidth=0;this.mouseDownHeight=0;this.idCounter=0;};MCWindows.prototype.init=function(settings){this.settings=settings;if(this.isMSIE)this.addEvent(document,"mousemove",mcWindows.eventDispatcher);else this.addEvent(window,"mousemove",mcWindows.eventDispatcher);this.addEvent(document,"mouseup",mcWindows.eventDispatcher);this.doc=document;};MCWindows.prototype.getParam=function(name,default_value){var value=null;value=(typeof(this.settings[name])=="undefined")?default_value:this.settings[name];if(value=="true"||value=="false")return(value=="true");return value;};MCWindows.prototype.eventDispatcher=function(e){e=typeof(e)=="undefined"?window.event:e;if(mcWindows.selectedWindow==null)return;if(mcWindows.isGecko&&e.type=="mousedown"){var elm=e.currentTarget;for(var n in mcWindows.windows){var win=mcWindows.windows[n];if(win.headElement==elm||win.resizeElement==elm){win.focus();break;}}}switch(e.type){case "mousemove":mcWindows.selectedWindow.onMouseMove(e);break;case "mouseup":mcWindows.selectedWindow.onMouseUp(e);break;case "mousedown":mcWindows.selectedWindow.onMouseDown(e);break;case "focus":mcWindows.selectedWindow.onFocus(e);break;}};MCWindows.prototype.addEvent=function(obj,name,handler){if(this.isMSIE)obj.attachEvent("on"+name,handler);else obj.addEventListener(name,handler,true);};MCWindows.prototype.cancelEvent=function(e){if(this.isMSIE){e.returnValue=false;e.cancelBubble=true;}else e.preventDefault();};MCWindows.prototype.parseFeatures=function(opts){opts=opts.toLowerCase();opts=opts.replace(/;/g,",");opts=opts.replace(/[^0-9a-z=,]/g,"");var optionChunks=opts.split(',');var options=new Array();options['left']="10";options['top']="10";options['width']="300";options['height']="300";options['resizable']="yes";options['minimizable']="yes";options['maximizable']="yes";options['close']="yes";options['movable']="yes";options['statusbar']="yes";options['scrollbars']="auto";options['modal']="no";if(opts=="")return options;for(var i=0;i<optionChunks.length;i++){var parts=optionChunks[i].split('=');if(parts.length==2)options[parts[0]]=parts[1];}options['left']=parseInt(options['left']);options['top']=parseInt(options['top']);options['width']=parseInt(options['width']);options['height']=parseInt(options['height']);return options;};MCWindows.prototype.open=function(url,name,features){this.lastSelectedWindow=this.selectedWindow;var win=new MCWindow();var winDiv,html="",id;var imgPath=this.getParam("images_path");features=this.parseFeatures(features);id="mcWindow_"+name;win.deltaHeight=18;if(features['statusbar']=="yes"){win.deltaHeight+=13;if(this.isMSIE)win.deltaHeight+=1;}width=parseInt(features['width']);height=parseInt(features['height'])-win.deltaHeight;if(this.isMSIE)width-=2;win.id=id;win.url=url;win.name=name;win.features=features;this.windows[name]=win;iframeWidth=width;iframeHeight=height;html+='<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">';html+='<html>';html+='<head>';html+='<title>Wrapper iframe</title>';html+='<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">';html+='<link href="'+this.getParam("css_file")+'" rel="stylesheet" type="text/css" />';html+='</head>';html+='<body onload="parent.mcWindows.onLoad(\''+name+'\');">';html+='<div id="'+id+'_container" class="mceWindow">';html+='<div id="'+id+'_head" class="mceWindowHead" onmousedown="parent.mcWindows.windows[\''+name+'\'].focus();">';html+='  <div id="'+id+'_title" class="mceWindowTitle"';html+='  onselectstart="return false;" unselectable="on" style="-moz-user-select: none !important;"></div>';html+='    <div class="mceWindowHeadTools">';html+='      <a href="javascript:parent.mcWindows.windows[\''+name+'\'].close();" target="_self" onmousedown="return false;" class="mceWindowClose"><img border="0" src="'+imgPath+'/window_close.gif" /></a>';html+='    </div>';html+='</div><div id="'+id+'_body" class="mceWindowBody" style="width: '+width+'px; height: '+height+'px;">';html+='<iframe id="'+id+'_iframe" name="'+id+'_iframe" frameborder="0" width="'+iframeWidth+'" height="'+iframeHeight+'" src="'+url+'" class="mceWindowBodyIframe" scrolling="'+features['scrollbars']+'"></iframe></div>';if(features['statusbar']=="yes"){html+='<div id="'+id+'_statusbar" class="mceWindowStatusbar" onmousedown="parent.mcWindows.windows[\''+name+'\'].focus();">';if(features['resizable']=="yes"){if(this.isGecko)html+='<div id="'+id+'_resize" class="mceWindowResize"><div style="background-image: url(\''+imgPath+'/window_resize.gif\'); width: 12px; height: 12px;"></div></div>';else html+='<div id="'+id+'_resize" class="mceWindowResize"><img onmousedown="parent.mcWindows.windows[\''+name+'\'].focus();" border="0" src="'+imgPath+'/window_resize.gif" /></div>';}html+='</div>';}html+='</div>';html+='</body>';html+='</html>';this.createFloatingIFrame(id,features['left'],features['top'],features['width'],features['height'],html);};MCWindows.prototype.setDocumentLock=function(state){if(state){var elm=document.getElementById('mcWindowEventBlocker');if(elm==null){elm=document.createElement("div");elm.id="mcWindowEventBlocker";elm.style.position="absolute";elm.style.left="0px";elm.style.top="0px";document.body.appendChild(elm);}elm.style.display="none";var imgPath=this.getParam("images_path");var width=document.body.clientWidth;var height=document.body.clientHeight;elm.style.width=width;elm.style.height=height;elm.innerHTML='<img src="'+imgPath+'/spacer.gif" width="'+width+'" height="'+height+'" />';elm.style.zIndex=mcWindows.zindex-1;elm.style.display="block";}else{var elm=document.getElementById('mcWindowEventBlocker');if(mcWindows.windows.length==0)elm.parentNode.removeChild(elm);else elm.style.zIndex=mcWindows.zindex-1;}};MCWindows.prototype.onLoad=function(name){var win=mcWindows.windows[name];var id="mcWindow_"+name;var wrapperIframe=window.frames[id+"_iframe"].frames[0];var wrapperDoc=window.frames[id+"_iframe"].document;var doc=window.frames[id+"_iframe"].document;var winDiv=document.getElementById("mcWindow_"+name+"_div");var realIframe=window.frames[id+"_iframe"].frames[0];win.id="mcWindow_"+name;win.winElement=winDiv;win.bodyElement=doc.getElementById(id+'_body');win.iframeElement=doc.getElementById(id+'_iframe');win.headElement=doc.getElementById(id+'_head');win.titleElement=doc.getElementById(id+'_title');win.resizeElement=doc.getElementById(id+'_resize');win.containerElement=doc.getElementById(id+'_container');win.left=win.features['left'];win.top=win.features['top'];win.frame=window.frames[id+'_iframe'].frames[0];win.wrapperFrame=window.frames[id+'_iframe'];win.wrapperIFrameElement=document.getElementById(id+"_iframe");mcWindows.addEvent(win.headElement,"mousedown",mcWindows.eventDispatcher);if(win.resizeElement!=null)mcWindows.addEvent(win.resizeElement,"mousedown",mcWindows.eventDispatcher);if(mcWindows.isMSIE){mcWindows.addEvent(realIframe.document,"mousemove",mcWindows.eventDispatcher);mcWindows.addEvent(realIframe.document,"mouseup",mcWindows.eventDispatcher);}else{mcWindows.addEvent(realIframe,"mousemove",mcWindows.eventDispatcher);mcWindows.addEvent(realIframe,"mouseup",mcWindows.eventDispatcher);mcWindows.addEvent(realIframe,"focus",mcWindows.eventDispatcher);}for(var i=0;i<window.frames.length;i++){if(!window.frames[i]._hasMouseHandlers){if(mcWindows.isMSIE){mcWindows.addEvent(window.frames[i].document,"mousemove",mcWindows.eventDispatcher);mcWindows.addEvent(window.frames[i].document,"mouseup",mcWindows.eventDispatcher);}else{mcWindows.addEvent(window.frames[i],"mousemove",mcWindows.eventDispatcher);mcWindows.addEvent(window.frames[i],"mouseup",mcWindows.eventDispatcher);}window.frames[i]._hasMouseHandlers=true;}}if(mcWindows.isMSIE){mcWindows.addEvent(win.frame.document,"mousemove",mcWindows.eventDispatcher);mcWindows.addEvent(win.frame.document,"mouseup",mcWindows.eventDispatcher);}else{mcWindows.addEvent(win.frame,"mousemove",mcWindows.eventDispatcher);mcWindows.addEvent(win.frame,"mouseup",mcWindows.eventDispatcher);mcWindows.addEvent(win.frame,"focus",mcWindows.eventDispatcher);}var func=this.getParam("on_open_window","");if(func!="")eval(func+"(win);");win.focus();if(win.features['modal']=="yes")mcWindows.setDocumentLock(true);};MCWindows.prototype.createFloatingIFrame=function(id_prefix,left,top,width,height,html){var iframe=document.createElement("iframe");var div=document.createElement("div");width=parseInt(width);height=parseInt(height)+1;div.setAttribute("id",id_prefix+"_div");div.setAttribute("width",width);div.setAttribute("height",(height));div.style.position="absolute";div.style.left=left+"px";div.style.top=top+"px";div.style.width=width+"px";div.style.height=(height)+"px";div.style.backgroundColor="white";div.style.display="none";if(this.isGecko){iframeWidth=width+2;iframeHeight=height+2;}else{iframeWidth=width;iframeHeight=height+1;}iframe.setAttribute("id",id_prefix+"_iframe");iframe.setAttribute("name",id_prefix+"_iframe");iframe.setAttribute("border","0");iframe.setAttribute("frameBorder","0");iframe.setAttribute("marginWidth","0");iframe.setAttribute("marginHeight","0");iframe.setAttribute("leftMargin","0");iframe.setAttribute("topMargin","0");iframe.setAttribute("width",iframeWidth);iframe.setAttribute("height",iframeHeight);iframe.setAttribute("scrolling","no");iframe.style.width=iframeWidth+"px";iframe.style.height=iframeHeight+"px";iframe.style.backgroundColor="white";div.appendChild(iframe);document.body.appendChild(div);div.innerHTML=div.innerHTML;if(this.isSafari){window.setTimeout(function(){doc=window.frames[id_prefix+'_iframe'].document;doc.open();doc.write(html);doc.close();},10);}else{doc=window.frames[id_prefix+'_iframe'].window.document;doc.open();doc.write(html);doc.close();}div.style.display="block";return div;};function MCWindow(){};MCWindow.prototype.focus=function(){if(this!=mcWindows.selectedWindow){this.winElement.style.zIndex=++mcWindows.zindex;mcWindows.lastSelectedWindow=mcWindows.selectedWindow;mcWindows.selectedWindow=this;}};MCWindow.prototype.minimize=function(){};MCWindow.prototype.maximize=function(){};MCWindow.prototype.startResize=function(){mcWindows.action="resize";};MCWindow.prototype.startMove=function(e){mcWindows.action="move";};MCWindow.prototype.close=function(){if(mcWindows.lastSelectedWindow!=null)mcWindows.lastSelectedWindow.focus();var mcWindowsNew=new Array();for(var n in mcWindows.windows){var win=mcWindows.windows[n];if(typeof(win)=='function')continue;if(win.name!=this.name)mcWindowsNew[n]=win;}mcWindows.windows=mcWindowsNew;var e=mcWindows.doc.getElementById(this.id+"_iframe");e.parentNode.removeChild(e);var e=mcWindows.doc.getElementById(this.id+"_div");e.parentNode.removeChild(e);mcWindows.setDocumentLock(false);};MCWindow.prototype.onMouseMove=function(e){var scrollX=0;var scrollY=0;var dx=e.screenX-mcWindows.mouseDownScreenX;var dy=e.screenY-mcWindows.mouseDownScreenY;switch(mcWindows.action){case "resize":width=mcWindows.mouseDownWidth+(e.screenX-mcWindows.mouseDownScreenX);height=mcWindows.mouseDownHeight+(e.screenY-mcWindows.mouseDownScreenY);width=width<100?100:width;height=height<100?100:height;this.wrapperIFrameElement.style.width=width+2;this.wrapperIFrameElement.style.height=height+2;this.wrapperIFrameElement.width=width+2;this.wrapperIFrameElement.height=height+2;this.winElement.style.width=width;this.winElement.style.height=height;height=height-this.deltaHeight;this.containerElement.style.width=width;this.iframeElement.style.width=width;this.iframeElement.style.height=height;this.bodyElement.style.width=width;this.bodyElement.style.height=height;this.headElement.style.width=width;mcWindows.cancelEvent(e);break;case "move":this.left=mcWindows.mouseDownLayerX+(e.screenX-mcWindows.mouseDownScreenX);this.top=mcWindows.mouseDownLayerY+(e.screenY-mcWindows.mouseDownScreenY);this.winElement.style.left=this.left+"px";this.winElement.style.top=this.top+"px";mcWindows.cancelEvent(e);break;}};function debug(msg){document.getElementById('debug').value+=msg+"\n";}MCWindow.prototype.onMouseUp=function(e){mcWindows.action="none";};MCWindow.prototype.onFocus=function(e){var winRef=e.currentTarget;for(var n in mcWindows.windows){var win=mcWindows.windows[n];if(typeof(win)=='function')continue;if(winRef.name==win.id+"_iframe"){win.focus();return;}}};MCWindow.prototype.onMouseDown=function(e){var elm=mcWindows.isMSIE?this.wrapperFrame.event.srcElement:e.target;var scrollX=0;var scrollY=0;mcWindows.mouseDownScreenX=e.screenX;mcWindows.mouseDownScreenY=e.screenY;mcWindows.mouseDownLayerX=this.left;mcWindows.mouseDownLayerY=this.top;mcWindows.mouseDownWidth=parseInt(this.winElement.style.width);mcWindows.mouseDownHeight=parseInt(this.winElement.style.height);if(this.resizeElement!=null&&elm==this.resizeElement.firstChild)this.startResize(e);else this.startMove(e);mcWindows.cancelEvent(e);};var mcWindows=new MCWindows();mcWindows.init({images_path:tinyMCE.baseURL+"/plugins/inlinepopups/images",css_file:tinyMCE.baseURL+"/plugins/inlinepopups/css/inlinepopup.css"});
\ 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..7ce2e3c
--- /dev/null
@@ -0,0 +1,653 @@
+/**\r
+ * $RCSfile: editor_plugin_src.js,v $\r
+ * $Revision: 1.4 $\r
+ * $Date: 2005/11/27 18:06:45 $\r
+ *\r
+ * Moxiecode DHTML Windows script.\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+// Patch openWindow, closeWindow TinyMCE functions\r
+\r
+function TinyMCE_inlinepopups_getInfo() {\r
+       return {\r
+               longname : 'Inline Popups',\r
+               author : 'Moxiecode Systems',\r
+               authorurl : 'http://tinymce.moxiecode.com',\r
+               infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_inlinepopups.html',\r
+               version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+       };\r
+};\r
+\r
+TinyMCE.prototype.orgOpenWindow = TinyMCE.prototype.openWindow;\r
+\r
+TinyMCE.prototype.openWindow = function(template, args) {\r
+       // Does the caller support inline\r
+       if (args['inline'] != "yes" || tinyMCE.isOpera || tinyMCE.getParam("plugins").indexOf('inlinepopups') == -1) {\r
+               mcWindows.selectedWindow = null;\r
+               args['mce_inside_iframe'] = false;\r
+               this.orgOpenWindow(template, args);\r
+               return;\r
+       }\r
+\r
+       var url, resizable, scrollbars;\r
+\r
+       args['mce_inside_iframe'] = true;\r
+       tinyMCE.windowArgs = args;\r
+\r
+       if (template['file'].charAt(0) != '/' && template['file'].indexOf('://') == -1)\r
+               url = tinyMCE.baseURL + "/themes/" + tinyMCE.getParam("theme") + "/" + template['file'];\r
+       else\r
+               url = template['file'];\r
+\r
+       if (!(width = parseInt(template['width'])))\r
+               width = 320;\r
+\r
+       if (!(height = parseInt(template['height'])))\r
+               height = 200;\r
+\r
+       resizable = (args && args['resizable']) ? args['resizable'] : "no";\r
+       scrollbars = (args && args['scrollbars']) ? args['scrollbars'] : "no";\r
+\r
+       height += 18;\r
+\r
+       // Replace all args as variables in URL\r
+       for (var name in args) {\r
+               if (typeof(args[name]) == 'function')\r
+                       continue;\r
+\r
+               url = tinyMCE.replaceVar(url, name, escape(args[name]));\r
+       }\r
+\r
+       var elm = document.getElementById(this.selectedInstance.editorId + '_parent');\r
+       var pos = tinyMCE.getAbsPosition(elm);\r
+\r
+       // Center div in editor area\r
+       pos.absLeft += Math.round((elm.firstChild.clientWidth / 2) - (width / 2));\r
+       pos.absTop += Math.round((elm.firstChild.clientHeight / 2) - (height / 2));\r
+\r
+       mcWindows.open(url, mcWindows.idCounter++, "modal=yes,width=" + width+ ",height=" + height + ",resizable=" + resizable + ",scrollbars=" + scrollbars + ",statusbar=" + resizable + ",left=" + pos.absLeft + ",top=" + pos.absTop);\r
+};\r
+\r
+TinyMCE.prototype.orgCloseWindow = TinyMCE.prototype.closeWindow;\r
+\r
+TinyMCE.prototype.closeWindow = function(win) {\r
+       if (mcWindows.selectedWindow != null)\r
+               mcWindows.selectedWindow.close();\r
+       else\r
+               this.orgCloseWindow(win);\r
+};\r
+\r
+TinyMCE.prototype.setWindowTitle = function(win_ref, title) {\r
+       for (var n in mcWindows.windows) {\r
+               var win = mcWindows.windows[n];\r
+               if (typeof(win) == 'function')\r
+                       continue;\r
+\r
+               if (win_ref.name == win.id + "_iframe")\r
+                       window.frames[win.id + "_iframe"].document.getElementById(win.id + '_title').innerHTML = title;\r
+       }\r
+};\r
+\r
+// * * * * * MCWindows classes below\r
+\r
+// Windows handler\r
+function MCWindows() {\r
+       this.settings = new Array();\r
+       this.windows = new Array();\r
+       this.isMSIE = (navigator.appName == "Microsoft Internet Explorer");\r
+       this.isGecko = navigator.userAgent.indexOf('Gecko') != -1;\r
+       this.isSafari = navigator.userAgent.indexOf('Safari') != -1;\r
+       this.isMac = navigator.userAgent.indexOf('Mac') != -1;\r
+       this.isMSIE5_0 = this.isMSIE && (navigator.userAgent.indexOf('MSIE 5.0') != -1);\r
+       this.action = "none";\r
+       this.selectedWindow = null;\r
+       this.lastSelectedWindow = null;\r
+       this.zindex = 100;\r
+       this.mouseDownScreenX = 0;\r
+       this.mouseDownScreenY = 0;\r
+       this.mouseDownLayerX = 0;\r
+       this.mouseDownLayerY = 0;\r
+       this.mouseDownWidth = 0;\r
+       this.mouseDownHeight = 0;\r
+       this.idCounter = 0;\r
+};\r
+\r
+MCWindows.prototype.init = function(settings) {\r
+       this.settings = settings;\r
+\r
+       if (this.isMSIE)\r
+               this.addEvent(document, "mousemove", mcWindows.eventDispatcher);\r
+       else\r
+               this.addEvent(window, "mousemove", mcWindows.eventDispatcher);\r
+\r
+       this.addEvent(document, "mouseup", mcWindows.eventDispatcher);\r
+\r
+       this.doc = document;\r
+};\r
+\r
+MCWindows.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
+MCWindows.prototype.eventDispatcher = function(e) {\r
+       e = typeof(e) == "undefined" ? window.event : e;\r
+\r
+       if (mcWindows.selectedWindow == null)\r
+               return;\r
+\r
+       // Switch focus\r
+       if (mcWindows.isGecko && e.type == "mousedown") {\r
+               var elm = e.currentTarget;\r
+\r
+               for (var n in mcWindows.windows) {\r
+                       var win = mcWindows.windows[n];\r
+\r
+                       if (win.headElement == elm || win.resizeElement == elm) {\r
+                               win.focus();\r
+                               break;\r
+                       }\r
+               }\r
+       }\r
+\r
+       switch (e.type) {\r
+               case "mousemove":\r
+                       mcWindows.selectedWindow.onMouseMove(e);\r
+                       break;\r
+\r
+               case "mouseup":\r
+                       mcWindows.selectedWindow.onMouseUp(e);\r
+                       break;\r
+\r
+               case "mousedown":\r
+                       mcWindows.selectedWindow.onMouseDown(e);\r
+                       break;\r
+\r
+               case "focus":\r
+                       mcWindows.selectedWindow.onFocus(e);\r
+                       break;\r
+       }\r
+};\r
+\r
+MCWindows.prototype.addEvent = function(obj, name, handler) {\r
+       if (this.isMSIE)\r
+               obj.attachEvent("on" + name, handler);\r
+       else\r
+               obj.addEventListener(name, handler, true);\r
+};\r
+\r
+MCWindows.prototype.cancelEvent = function(e) {\r
+       if (this.isMSIE) {\r
+               e.returnValue = false;\r
+               e.cancelBubble = true;\r
+       } else\r
+               e.preventDefault();\r
+};\r
+\r
+MCWindows.prototype.parseFeatures = function(opts) {\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 = new Array();\r
+\r
+       options['left'] = "10";\r
+       options['top'] = "10";\r
+       options['width'] = "300";\r
+       options['height'] = "300";\r
+       options['resizable'] = "yes";\r
+       options['minimizable'] = "yes";\r
+       options['maximizable'] = "yes";\r
+       options['close'] = "yes";\r
+       options['movable'] = "yes";\r
+       options['statusbar'] = "yes";\r
+       options['scrollbars'] = "auto";\r
+       options['modal'] = "no";\r
+\r
+       if (opts == "")\r
+               return 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
+       options['left'] = parseInt(options['left']);\r
+       options['top'] = parseInt(options['top']);\r
+       options['width'] = parseInt(options['width']);\r
+       options['height'] = parseInt(options['height']);\r
+\r
+       return options;\r
+};\r
+\r
+MCWindows.prototype.open = function(url, name, features) {\r
+       this.lastSelectedWindow = this.selectedWindow;\r
+\r
+       var win = new MCWindow();\r
+       var winDiv, html = "", id;\r
+       var imgPath = this.getParam("images_path");\r
+\r
+       features = this.parseFeatures(features);\r
+\r
+       // Create div\r
+       id = "mcWindow_" + name;\r
+       win.deltaHeight = 18;\r
+\r
+       if (features['statusbar'] == "yes") {\r
+               win.deltaHeight += 13;\r
+\r
+               if (this.isMSIE)\r
+                       win.deltaHeight += 1;\r
+       }\r
+\r
+       width = parseInt(features['width']);\r
+       height = parseInt(features['height'])-win.deltaHeight;\r
+\r
+       if (this.isMSIE)\r
+               width -= 2;\r
+\r
+       // Setup first part of window\r
+       win.id = id;\r
+       win.url = url;\r
+       win.name = name;\r
+       win.features = features;\r
+       this.windows[name] = win;\r
+\r
+       iframeWidth = width;\r
+       iframeHeight = height;\r
+\r
+       // Create inner content\r
+       html += '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">';\r
+       html += '<html>';\r
+       html += '<head>';\r
+       html += '<title>Wrapper iframe</title>';\r
+       html += '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">';\r
+       html += '<link href="' + this.getParam("css_file") + '" rel="stylesheet" type="text/css" />';\r
+       html += '</head>';\r
+       html += '<body onload="parent.mcWindows.onLoad(\'' + name + '\');">';\r
+\r
+       html += '<div id="' + id + '_container" class="mceWindow">';\r
+       html += '<div id="' + id + '_head" class="mceWindowHead" onmousedown="parent.mcWindows.windows[\'' + name + '\'].focus();">';\r
+       html += '  <div id="' + id + '_title" class="mceWindowTitle"';\r
+       html += '  onselectstart="return false;" unselectable="on" style="-moz-user-select: none !important;"></div>';\r
+       html += '    <div class="mceWindowHeadTools">';\r
+       html += '      <a href="javascript:parent.mcWindows.windows[\'' + name + '\'].close();" target="_self" onmousedown="return false;" class="mceWindowClose"><img border="0" src="' + imgPath + '/window_close.gif" /></a>';\r
+//     html += '      <a href="javascript:mcWindows.windows[\'' + name + '\'].maximize();" target="_self" onmousedown="return false;" class="mceWindowMaximize"></a>';\r
+//     html += '      <a href="javascript:mcWindows.windows[\'' + name + '\'].minimize();" target="_self" onmousedown="return false;" class="mceWindowMinimize"></a>';\r
+       html += '    </div>';\r
+       html += '</div><div id="' + id + '_body" class="mceWindowBody" style="width: ' + width + 'px; height: ' + height + 'px;">';\r
+       html += '<iframe id="' + id + '_iframe" name="' + id + '_iframe" frameborder="0" width="' + iframeWidth + '" height="' + iframeHeight + '" src="' + url + '" class="mceWindowBodyIframe" scrolling="' + features['scrollbars'] + '"></iframe></div>';\r
+\r
+       if (features['statusbar'] == "yes") {\r
+               html += '<div id="' + id + '_statusbar" class="mceWindowStatusbar" onmousedown="parent.mcWindows.windows[\'' + name + '\'].focus();">';\r
+\r
+               if (features['resizable'] == "yes") {\r
+                       if (this.isGecko)\r
+                               html += '<div id="' + id + '_resize" class="mceWindowResize"><div style="background-image: url(\'' + imgPath + '/window_resize.gif\'); width: 12px; height: 12px;"></div></div>';\r
+                       else\r
+                               html += '<div id="' + id + '_resize" class="mceWindowResize"><img onmousedown="parent.mcWindows.windows[\'' + name + '\'].focus();" border="0" src="' + imgPath + '/window_resize.gif" /></div>';\r
+               }\r
+\r
+               html += '</div>';\r
+       }\r
+\r
+       html += '</div>';\r
+\r
+       html += '</body>';\r
+       html += '</html>';\r
+\r
+       // Create iframe\r
+       this.createFloatingIFrame(id, features['left'], features['top'], features['width'], features['height'], html);\r
+};\r
+\r
+// Blocks the document events by placing a image over the whole document\r
+MCWindows.prototype.setDocumentLock = function(state) {\r
+       if (state) {\r
+               var elm = document.getElementById('mcWindowEventBlocker');\r
+               if (elm == null) {\r
+                       elm = document.createElement("div");\r
+\r
+                       elm.id = "mcWindowEventBlocker";\r
+                       elm.style.position = "absolute";\r
+                       elm.style.left = "0px";\r
+                       elm.style.top = "0px";\r
+\r
+                       document.body.appendChild(elm);\r
+               }\r
+\r
+               elm.style.display = "none";\r
+\r
+               var imgPath = this.getParam("images_path");\r
+               var width = document.body.clientWidth;\r
+               var height = document.body.clientHeight;\r
+\r
+               elm.style.width = width;\r
+               elm.style.height = height;\r
+               elm.innerHTML = '<img src="' + imgPath + '/spacer.gif" width="' + width + '" height="' + height + '" />';\r
+\r
+               elm.style.zIndex = mcWindows.zindex-1;\r
+               elm.style.display = "block";\r
+       } else {\r
+               var elm = document.getElementById('mcWindowEventBlocker');\r
+\r
+               if (mcWindows.windows.length == 0)\r
+                       elm.parentNode.removeChild(elm);\r
+               else\r
+                       elm.style.zIndex = mcWindows.zindex-1;\r
+       }\r
+};\r
+\r
+// Gets called when wrapper iframe is initialized\r
+MCWindows.prototype.onLoad = function(name) {\r
+       var win = mcWindows.windows[name];\r
+       var id = "mcWindow_" + name;\r
+       var wrapperIframe = window.frames[id + "_iframe"].frames[0];\r
+       var wrapperDoc = window.frames[id + "_iframe"].document;\r
+       var doc = window.frames[id + "_iframe"].document;\r
+       var winDiv = document.getElementById("mcWindow_" + name + "_div");\r
+       var realIframe = window.frames[id + "_iframe"].frames[0];\r
+\r
+       // Set window data\r
+       win.id = "mcWindow_" + name;\r
+       win.winElement = winDiv;\r
+       win.bodyElement = doc.getElementById(id + '_body');\r
+       win.iframeElement = doc.getElementById(id + '_iframe');\r
+       win.headElement = doc.getElementById(id + '_head');\r
+       win.titleElement = doc.getElementById(id + '_title');\r
+       win.resizeElement = doc.getElementById(id + '_resize');\r
+       win.containerElement = doc.getElementById(id + '_container');\r
+       win.left = win.features['left'];\r
+       win.top = win.features['top'];\r
+       win.frame = window.frames[id + '_iframe'].frames[0];\r
+       win.wrapperFrame = window.frames[id + '_iframe'];\r
+       win.wrapperIFrameElement = document.getElementById(id + "_iframe");\r
+\r
+       // Add event handlers\r
+       mcWindows.addEvent(win.headElement, "mousedown", mcWindows.eventDispatcher);\r
+\r
+       if (win.resizeElement != null)\r
+               mcWindows.addEvent(win.resizeElement, "mousedown", mcWindows.eventDispatcher);\r
+\r
+       if (mcWindows.isMSIE) {\r
+               mcWindows.addEvent(realIframe.document, "mousemove", mcWindows.eventDispatcher);\r
+               mcWindows.addEvent(realIframe.document, "mouseup", mcWindows.eventDispatcher);\r
+       } else {\r
+               mcWindows.addEvent(realIframe, "mousemove", mcWindows.eventDispatcher);\r
+               mcWindows.addEvent(realIframe, "mouseup", mcWindows.eventDispatcher);\r
+               mcWindows.addEvent(realIframe, "focus", mcWindows.eventDispatcher);\r
+       }\r
+\r
+       for (var i=0; i<window.frames.length; i++) {\r
+               if (!window.frames[i]._hasMouseHandlers) {\r
+                       if (mcWindows.isMSIE) {\r
+                               mcWindows.addEvent(window.frames[i].document, "mousemove", mcWindows.eventDispatcher);\r
+                               mcWindows.addEvent(window.frames[i].document, "mouseup", mcWindows.eventDispatcher);\r
+                       } else {\r
+                               mcWindows.addEvent(window.frames[i], "mousemove", mcWindows.eventDispatcher);\r
+                               mcWindows.addEvent(window.frames[i], "mouseup", mcWindows.eventDispatcher);\r
+                       }\r
+\r
+                       window.frames[i]._hasMouseHandlers = true;\r
+               }\r
+       }\r
+\r
+       if (mcWindows.isMSIE) {\r
+               mcWindows.addEvent(win.frame.document, "mousemove", mcWindows.eventDispatcher);\r
+               mcWindows.addEvent(win.frame.document, "mouseup", mcWindows.eventDispatcher);\r
+       } else {\r
+               mcWindows.addEvent(win.frame, "mousemove", mcWindows.eventDispatcher);\r
+               mcWindows.addEvent(win.frame, "mouseup", mcWindows.eventDispatcher);\r
+               mcWindows.addEvent(win.frame, "focus", mcWindows.eventDispatcher);\r
+       }\r
+\r
+       // Dispatch open window event\r
+       var func = this.getParam("on_open_window", "");\r
+       if (func != "")\r
+               eval(func + "(win);");\r
+\r
+       win.focus();\r
+\r
+       if (win.features['modal'] == "yes")\r
+               mcWindows.setDocumentLock(true);\r
+};\r
+\r
+MCWindows.prototype.createFloatingIFrame = function(id_prefix, left, top, width, height, html) {\r
+       var iframe = document.createElement("iframe");\r
+       var div = document.createElement("div");\r
+\r
+       width = parseInt(width);\r
+       height = parseInt(height)+1;\r
+\r
+       // Create wrapper div\r
+       div.setAttribute("id", id_prefix + "_div");\r
+       div.setAttribute("width", width);\r
+       div.setAttribute("height", (height));\r
+       div.style.position = "absolute";\r
+       div.style.left = left + "px";\r
+       div.style.top = top + "px";\r
+       div.style.width = width + "px";\r
+       div.style.height = (height) + "px";\r
+       div.style.backgroundColor = "white";\r
+       div.style.display = "none";\r
+\r
+       if (this.isGecko) {\r
+               iframeWidth = width + 2;\r
+               iframeHeight = height + 2;\r
+       } else {\r
+               iframeWidth = width;\r
+               iframeHeight = height + 1;\r
+       }\r
+\r
+       // Create iframe\r
+       iframe.setAttribute("id", id_prefix + "_iframe");\r
+       iframe.setAttribute("name", id_prefix + "_iframe");\r
+       iframe.setAttribute("border", "0");\r
+       iframe.setAttribute("frameBorder", "0");\r
+       iframe.setAttribute("marginWidth", "0");\r
+       iframe.setAttribute("marginHeight", "0");\r
+       iframe.setAttribute("leftMargin", "0");\r
+       iframe.setAttribute("topMargin", "0");\r
+       iframe.setAttribute("width", iframeWidth);\r
+       iframe.setAttribute("height", iframeHeight);\r
+//     iframe.setAttribute("src", "../jscripts/tiny_mce/blank.htm");\r
+       // iframe.setAttribute("allowtransparency", "false");\r
+       iframe.setAttribute("scrolling", "no");\r
+       iframe.style.width = iframeWidth + "px";\r
+       iframe.style.height = iframeHeight + "px";\r
+       iframe.style.backgroundColor = "white";\r
+       div.appendChild(iframe);\r
+\r
+       document.body.appendChild(div);\r
+\r
+       // Fixed MSIE 5.0 issue\r
+       div.innerHTML = div.innerHTML;\r
+\r
+       if (this.isSafari) {\r
+               // Give Safari some time to setup\r
+               window.setTimeout(function() {\r
+                       doc = window.frames[id_prefix + '_iframe'].document;\r
+                       doc.open();\r
+                       doc.write(html);\r
+                       doc.close();\r
+               }, 10);\r
+       } else {\r
+               doc = window.frames[id_prefix + '_iframe'].window.document;\r
+               doc.open();\r
+               doc.write(html);\r
+               doc.close();\r
+       }\r
+\r
+       div.style.display = "block";\r
+\r
+       return div;\r
+};\r
+\r
+// Window instance\r
+function MCWindow() {\r
+};\r
+\r
+MCWindow.prototype.focus = function() {\r
+       if (this != mcWindows.selectedWindow) {\r
+               this.winElement.style.zIndex = ++mcWindows.zindex;\r
+               mcWindows.lastSelectedWindow = mcWindows.selectedWindow;\r
+               mcWindows.selectedWindow = this;\r
+       }\r
+};\r
+\r
+MCWindow.prototype.minimize = function() {\r
+};\r
+\r
+MCWindow.prototype.maximize = function() {\r
+       \r
+};\r
+\r
+MCWindow.prototype.startResize = function() {\r
+       mcWindows.action = "resize";\r
+};\r
+\r
+MCWindow.prototype.startMove = function(e) {\r
+       mcWindows.action = "move";\r
+};\r
+\r
+MCWindow.prototype.close = function() {\r
+       if (mcWindows.lastSelectedWindow != null)\r
+               mcWindows.lastSelectedWindow.focus();\r
+\r
+       var mcWindowsNew = new Array();\r
+       for (var n in mcWindows.windows) {\r
+               var win = mcWindows.windows[n];\r
+               if (typeof(win) == 'function')\r
+                       continue;\r
+\r
+               if (win.name != this.name)\r
+                       mcWindowsNew[n] = win;\r
+       }\r
+\r
+       mcWindows.windows = mcWindowsNew;\r
+\r
+//     alert(mcWindows.doc.getElementById(this.id + "_iframe"));\r
+\r
+       var e = mcWindows.doc.getElementById(this.id + "_iframe");\r
+       e.parentNode.removeChild(e);\r
+\r
+       var e = mcWindows.doc.getElementById(this.id + "_div");\r
+       e.parentNode.removeChild(e);\r
+\r
+       mcWindows.setDocumentLock(false);\r
+};\r
+\r
+MCWindow.prototype.onMouseMove = function(e) {\r
+       var scrollX = 0;//this.doc.body.scrollLeft;\r
+       var scrollY = 0;//this.doc.body.scrollTop;\r
+\r
+       // Calculate real X, Y\r
+       var dx = e.screenX - mcWindows.mouseDownScreenX;\r
+       var dy = e.screenY - mcWindows.mouseDownScreenY;\r
+\r
+       switch (mcWindows.action) {\r
+               case "resize":\r
+                       width = mcWindows.mouseDownWidth + (e.screenX - mcWindows.mouseDownScreenX);\r
+                       height = mcWindows.mouseDownHeight + (e.screenY - mcWindows.mouseDownScreenY);\r
+\r
+                       width = width < 100 ? 100 : width;\r
+                       height = height < 100 ? 100 : height;\r
+\r
+                       this.wrapperIFrameElement.style.width = width+2;\r
+                       this.wrapperIFrameElement.style.height = height+2;\r
+                       this.wrapperIFrameElement.width = width+2;\r
+                       this.wrapperIFrameElement.height = height+2;\r
+                       this.winElement.style.width = width;\r
+                       this.winElement.style.height = height;\r
+\r
+                       height = height - this.deltaHeight;\r
+\r
+                       this.containerElement.style.width = width;\r
+\r
+                       this.iframeElement.style.width = width;\r
+                       this.iframeElement.style.height = height;\r
+                       this.bodyElement.style.width = width;\r
+                       this.bodyElement.style.height = height;\r
+                       this.headElement.style.width = width;\r
+                       //this.statusElement.style.width = width;\r
+\r
+                       mcWindows.cancelEvent(e);\r
+                       break;\r
+\r
+               case "move":\r
+                       this.left = mcWindows.mouseDownLayerX + (e.screenX - mcWindows.mouseDownScreenX);\r
+                       this.top = mcWindows.mouseDownLayerY + (e.screenY - mcWindows.mouseDownScreenY);\r
+                       this.winElement.style.left = this.left + "px";\r
+                       this.winElement.style.top = this.top + "px";\r
+\r
+                       mcWindows.cancelEvent(e);\r
+                       break;\r
+       }\r
+};\r
+\r
+function debug(msg) {\r
+       document.getElementById('debug').value += msg + "\n";\r
+}\r
+\r
+MCWindow.prototype.onMouseUp = function(e) {\r
+       mcWindows.action = "none";\r
+};\r
+\r
+MCWindow.prototype.onFocus = function(e) {\r
+       // Gecko only handler\r
+       var winRef = e.currentTarget;\r
+\r
+       for (var n in mcWindows.windows) {\r
+               var win = mcWindows.windows[n];\r
+               if (typeof(win) == 'function')\r
+                       continue;\r
+\r
+               if (winRef.name == win.id + "_iframe") {\r
+                       win.focus();\r
+                       return;\r
+               }\r
+       }\r
+};\r
+\r
+MCWindow.prototype.onMouseDown = function(e) {\r
+       var elm = mcWindows.isMSIE ? this.wrapperFrame.event.srcElement : e.target;\r
+\r
+       var scrollX = 0;//this.doc.body.scrollLeft;\r
+       var scrollY = 0;//this.doc.body.scrollTop;\r
+\r
+       mcWindows.mouseDownScreenX = e.screenX;\r
+       mcWindows.mouseDownScreenY = e.screenY;\r
+       mcWindows.mouseDownLayerX = this.left;\r
+       mcWindows.mouseDownLayerY = this.top;\r
+       mcWindows.mouseDownWidth = parseInt(this.winElement.style.width);\r
+       mcWindows.mouseDownHeight = parseInt(this.winElement.style.height);\r
+\r
+       if (this.resizeElement != null && elm == this.resizeElement.firstChild)\r
+               this.startResize(e);\r
+       else\r
+               this.startMove(e);\r
+\r
+       mcWindows.cancelEvent(e);\r
+};\r
+\r
+// Global instance\r
+var mcWindows = new MCWindows();\r
+\r
+// Initialize windows\r
+mcWindows.init({\r
+       images_path : tinyMCE.baseURL + "/plugins/inlinepopups/images",\r
+       css_file : tinyMCE.baseURL + "/plugins/inlinepopups/css/inlinepopup.css"\r
+});\r
diff --git a/webcit/tiny_mce/plugins/inlinepopups/images/spacer.gif b/webcit/tiny_mce/plugins/inlinepopups/images/spacer.gif
new file mode 100644 (file)
index 0000000..fc25609
Binary files /dev/null and b/webcit/tiny_mce/plugins/inlinepopups/images/spacer.gif differ
diff --git a/webcit/tiny_mce/plugins/inlinepopups/images/window_close.gif b/webcit/tiny_mce/plugins/inlinepopups/images/window_close.gif
new file mode 100644 (file)
index 0000000..3469e5a
Binary files /dev/null and b/webcit/tiny_mce/plugins/inlinepopups/images/window_close.gif differ
diff --git a/webcit/tiny_mce/plugins/inlinepopups/images/window_maximize.gif b/webcit/tiny_mce/plugins/inlinepopups/images/window_maximize.gif
new file mode 100644 (file)
index 0000000..fcae73e
Binary files /dev/null and b/webcit/tiny_mce/plugins/inlinepopups/images/window_maximize.gif differ
diff --git a/webcit/tiny_mce/plugins/inlinepopups/images/window_minimize.gif b/webcit/tiny_mce/plugins/inlinepopups/images/window_minimize.gif
new file mode 100644 (file)
index 0000000..94f167a
Binary files /dev/null and b/webcit/tiny_mce/plugins/inlinepopups/images/window_minimize.gif differ
diff --git a/webcit/tiny_mce/plugins/inlinepopups/images/window_resize.gif b/webcit/tiny_mce/plugins/inlinepopups/images/window_resize.gif
new file mode 100644 (file)
index 0000000..6c402d0
Binary files /dev/null and b/webcit/tiny_mce/plugins/inlinepopups/images/window_resize.gif differ
diff --git a/webcit/tiny_mce/plugins/inlinepopups/jscripts/mcwindows.js b/webcit/tiny_mce/plugins/inlinepopups/jscripts/mcwindows.js
new file mode 100644 (file)
index 0000000..a88ffd7
--- /dev/null
@@ -0,0 +1,455 @@
+/**\r
+ * $RCSfile: mcwindows.js,v $\r
+ * $Revision: 1.2 $\r
+ * $Date: 2005/10/18 13:59:43 $\r
+ *\r
+ * Moxiecode DHTML Windows script.\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+// Windows handler\r
+function MCWindows() {\r
+       this.settings = new Array();\r
+       this.windows = new Array();\r
+       this.isMSIE = (navigator.appName == "Microsoft Internet Explorer");\r
+       this.isGecko = navigator.userAgent.indexOf('Gecko') != -1;\r
+       this.isSafari = navigator.userAgent.indexOf('Safari') != -1;\r
+       this.isMac = navigator.userAgent.indexOf('Mac') != -1;\r
+       this.isMSIE5_0 = this.isMSIE && (navigator.userAgent.indexOf('MSIE 5.0') != -1);\r
+       this.action = "none";\r
+       this.selectedWindow = null;\r
+       this.zindex = 100;\r
+       this.mouseDownScreenX = 0;\r
+       this.mouseDownScreenY = 0;\r
+       this.mouseDownLayerX = 0;\r
+       this.mouseDownLayerY = 0;\r
+       this.mouseDownWidth = 0;\r
+       this.mouseDownHeight = 0;\r
+};\r
+\r
+MCWindows.prototype.init = function(settings) {\r
+       this.settings = settings;\r
+\r
+       if (this.isMSIE)\r
+               this.addEvent(document, "mousemove", mcWindows.eventDispatcher);\r
+       else\r
+               this.addEvent(window, "mousemove", mcWindows.eventDispatcher);\r
+\r
+       this.addEvent(document, "mouseup", mcWindows.eventDispatcher);\r
+};\r
+\r
+MCWindows.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
+MCWindows.prototype.eventDispatcher = function(e) {\r
+       e = typeof(e) == "undefined" ? window.event : e;\r
+\r
+       if (mcWindows.selectedWindow == null)\r
+               return;\r
+\r
+       // Switch focus\r
+       if (mcWindows.isGecko && e.type == "mousedown") {\r
+               var elm = e.currentTarget;\r
+\r
+               for (var n in mcWindows.windows) {\r
+                       var win = mcWindows.windows[n];\r
+                       if (typeof(win) == 'function')\r
+                               continue;\r
+\r
+                       if (win.headElement == elm || win.resizeElement == elm) {\r
+                               win.focus();\r
+                               break;\r
+                       }\r
+               }\r
+       }\r
+\r
+       switch (e.type) {\r
+               case "mousemove":\r
+                       mcWindows.selectedWindow.onMouseMove(e);\r
+                       break;\r
+\r
+               case "mouseup":\r
+                       mcWindows.selectedWindow.onMouseUp(e);\r
+                       break;\r
+\r
+               case "mousedown":\r
+                       mcWindows.selectedWindow.onMouseDown(e);\r
+                       break;\r
+\r
+               case "focus":\r
+                       mcWindows.selectedWindow.onFocus(e);\r
+                       break;\r
+       }\r
+}\r
+\r
+MCWindows.prototype.addEvent = function(obj, name, handler) {\r
+       if (this.isMSIE)\r
+               obj.attachEvent("on" + name, handler);\r
+       else\r
+               obj.addEventListener(name, handler, true);\r
+};\r
+\r
+MCWindows.prototype.cancelEvent = function(e) {\r
+       if (this.isMSIE) {\r
+               e.returnValue = false;\r
+               e.cancelBubble = true;\r
+       } else\r
+               e.preventDefault();\r
+};\r
+\r
+MCWindows.prototype.parseFeatures = function(opts) {\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 = new Array();\r
+\r
+       options['left'] = 10;\r
+       options['top'] = 10;\r
+       options['width'] = 300;\r
+       options['height'] = 300;\r
+       options['resizable'] = true;\r
+       options['minimizable'] = true;\r
+       options['maximizable'] = true;\r
+       options['close'] = true;\r
+       options['movable'] = true;\r
+\r
+       if (opts == "")\r
+               return 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
+MCWindows.prototype.open = function(url, name, features) {\r
+       var win = new MCWindow();\r
+       var winDiv, html = "", id;\r
+\r
+       features = this.parseFeatures(features);\r
+\r
+       // Create div\r
+       id = "mcWindow_" + name;\r
+\r
+       width = parseInt(features['width']);\r
+       height = parseInt(features['height'])-12-19;\r
+\r
+       if (this.isMSIE)\r
+               width -= 2;\r
+\r
+       // Setup first part of window\r
+       win.id = id;\r
+       win.url = url;\r
+       win.name = name;\r
+       win.features = features;\r
+       this.windows[name] = win;\r
+\r
+       iframeWidth = width;\r
+       iframeHeight = height;\r
+\r
+       // Create inner content\r
+       html += '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">';\r
+       html += '<html>';\r
+       html += '<head>';\r
+       html += '<title>Wrapper iframe</title>';\r
+       html += '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">';\r
+       html += '<link href="../jscripts/tiny_mce/themes/advanced/css/editor_ui.css" rel="stylesheet" type="text/css" />';\r
+       html += '</head>';\r
+       html += '<body onload="parent.mcWindows.onLoad(\'' + name + '\');">';\r
+\r
+       html += '<div id="' + id + '_container" class="mceWindow">';\r
+       html += '<div id="' + id + '_head" class="mceWindowHead" onmousedown="parent.mcWindows.windows[\'' + name + '\'].focus();">';\r
+       html += '  <div id="' + id + '_title" class="mceWindowTitle"';\r
+       html += '  onselectstart="return false;" unselectable="on" style="-moz-user-select: none !important;">No name window</div>';\r
+       html += '    <div class="mceWindowHeadTools">';\r
+       html += '      <a href="javascript:parent.mcWindows.windows[\'' + name + '\'].close();" onmousedown="return false;" class="mceWindowClose"><img border="0" src="../jscripts/tiny_mce/themes/advanced/images/window_close.gif" /></a>';\r
+//     html += '      <a href="javascript:mcWindows.windows[\'' + name + '\'].maximize();" onmousedown="return false;" class="mceWindowMaximize"></a>';\r
+//     html += '      <a href="javascript:mcWindows.windows[\'' + name + '\'].minimize();" onmousedown="return false;" class="mceWindowMinimize"></a>';\r
+       html += '    </div>';\r
+       html += '</div><div id="' + id + '_body" class="mceWindowBody" style="width: ' + width + 'px; height: ' + height + 'px;">';\r
+       html += '<iframe id="' + id + '_iframe" name="' + id + '_iframe" onfocus="parent.mcWindows.windows[\'' + name + '\'].focus();" frameborder="0" width="' + iframeWidth + '" height="' + iframeHeight + '" src="' + url + '" class="mceWindowBodyIframe"></iframe></div>';\r
+       html += '<div id="' + id + '_statusbar" class="mceWindowStatusbar" onmousedown="parent.mcWindows.windows[\'' + name + '\'].focus();">';\r
+       html += '<div id="' + id + '_resize" class="mceWindowResize"><img onmousedown="parent.mcWindows.windows[\'' + name + '\'].focus();" border="0" src="../jscripts/tiny_mce/themes/advanced/images/window_resize.gif" /></div>';\r
+       html += '</div>';\r
+       html += '</div>';\r
+\r
+       html += '</body>';\r
+       html += '</html>';\r
+\r
+       // Create iframe\r
+       this.createFloatingIFrame(id, features['left'], features['top'], features['width'], features['height'], html);\r
+};\r
+\r
+// Gets called when wrapper iframe is initialized\r
+MCWindows.prototype.onLoad = function(name) {\r
+       var win = mcWindows.windows[name];\r
+       var id = "mcWindow_" + name;\r
+       var wrapperIframe = window.frames[id + "_iframe"].frames[0];\r
+       var wrapperDoc = window.frames[id + "_iframe"].document;\r
+       var doc = window.frames[id + "_iframe"].document;\r
+       var winDiv = document.getElementById("mcWindow_" + name + "_div");\r
+       var realIframe = window.frames[id + "_iframe"].frames[0];\r
+\r
+       // Set window data\r
+       win.id = "mcWindow_" + name + "_iframe";\r
+       win.winElement = winDiv;\r
+       win.bodyElement = doc.getElementById(id + '_body');\r
+       win.iframeElement = doc.getElementById(id + '_iframe');\r
+       win.headElement = doc.getElementById(id + '_head');\r
+       win.titleElement = doc.getElementById(id + '_title');\r
+       win.resizeElement = doc.getElementById(id + '_resize');\r
+       win.containerElement = doc.getElementById(id + '_container');\r
+       win.left = win.features['left'];\r
+       win.top = win.features['top'];\r
+       win.frame = window.frames[id + '_iframe'].frames[0];\r
+       win.wrapperFrame = window.frames[id + '_iframe'];\r
+       win.wrapperIFrameElement = document.getElementById(id + "_iframe");\r
+\r
+       // Add event handlers\r
+       mcWindows.addEvent(win.headElement, "mousedown", mcWindows.eventDispatcher);\r
+       mcWindows.addEvent(win.resizeElement, "mousedown", mcWindows.eventDispatcher);\r
+\r
+       if (mcWindows.isMSIE) {\r
+               mcWindows.addEvent(realIframe.document, "mousemove", mcWindows.eventDispatcher);\r
+               mcWindows.addEvent(realIframe.document, "mouseup", mcWindows.eventDispatcher);\r
+       } else {\r
+               mcWindows.addEvent(realIframe, "mousemove", mcWindows.eventDispatcher);\r
+               mcWindows.addEvent(realIframe, "mouseup", mcWindows.eventDispatcher);\r
+               mcWindows.addEvent(realIframe, "focus", mcWindows.eventDispatcher);\r
+       }\r
+\r
+       for (var i=0; i<window.frames.length; i++) {\r
+               if (!window.frames[i]._hasMouseHandlers) {\r
+                       if (mcWindows.isMSIE) {\r
+                               mcWindows.addEvent(window.frames[i].document, "mousemove", mcWindows.eventDispatcher);\r
+                               mcWindows.addEvent(window.frames[i].document, "mouseup", mcWindows.eventDispatcher);\r
+                       } else {\r
+                               mcWindows.addEvent(window.frames[i], "mousemove", mcWindows.eventDispatcher);\r
+                               mcWindows.addEvent(window.frames[i], "mouseup", mcWindows.eventDispatcher);\r
+                       }\r
+\r
+                       window.frames[i]._hasMouseHandlers = true;\r
+               }\r
+       }\r
+\r
+       if (mcWindows.isMSIE) {\r
+               mcWindows.addEvent(win.frame.document, "mousemove", mcWindows.eventDispatcher);\r
+               mcWindows.addEvent(win.frame.document, "mouseup", mcWindows.eventDispatcher);\r
+       } else {\r
+               mcWindows.addEvent(win.frame, "mousemove", mcWindows.eventDispatcher);\r
+               mcWindows.addEvent(win.frame, "mouseup", mcWindows.eventDispatcher);\r
+               mcWindows.addEvent(win.frame, "focus", mcWindows.eventDispatcher);\r
+       }\r
+\r
+       this.selectedWindow = win;\r
+};\r
+\r
+MCWindows.prototype.createFloatingIFrame = function(id_prefix, left, top, width, height, html) {\r
+       var iframe = document.createElement("iframe");\r
+       var div = document.createElement("div");\r
+\r
+       width = parseInt(width);\r
+       height = parseInt(height)+1;\r
+\r
+       // Create wrapper div\r
+       div.setAttribute("id", id_prefix + "_div");\r
+       div.setAttribute("width", width);\r
+       div.setAttribute("height", (height));\r
+       div.style.position = "absolute";\r
+       div.style.left = left + "px";\r
+       div.style.top = top + "px";\r
+       div.style.width = width + "px";\r
+       div.style.height = (height) + "px";\r
+       div.style.backgroundColor = "white";\r
+       div.style.display = "none";\r
+\r
+       if (this.isGecko) {\r
+               iframeWidth = width + 2;\r
+               iframeHeight = height + 2;\r
+       } else {\r
+               iframeWidth = width;\r
+               iframeHeight = height + 1;\r
+       }\r
+\r
+       // Create iframe\r
+       iframe.setAttribute("id", id_prefix + "_iframe");\r
+       iframe.setAttribute("name", id_prefix + "_iframe");\r
+       iframe.setAttribute("border", "0");\r
+       iframe.setAttribute("frameBorder", "0");\r
+       iframe.setAttribute("marginWidth", "0");\r
+       iframe.setAttribute("marginHeight", "0");\r
+       iframe.setAttribute("leftMargin", "0");\r
+       iframe.setAttribute("topMargin", "0");\r
+       iframe.setAttribute("width", iframeWidth);\r
+       iframe.setAttribute("height", iframeHeight);\r
+//     iframe.setAttribute("src", "../jscripts/tiny_mce/blank.htm");\r
+       // iframe.setAttribute("allowtransparency", "false");\r
+       iframe.setAttribute("scrolling", "no");\r
+       iframe.style.width = iframeWidth + "px";\r
+       iframe.style.height = iframeHeight + "px";\r
+       iframe.style.backgroundColor = "white";\r
+       div.appendChild(iframe);\r
+\r
+       document.body.appendChild(div);\r
+\r
+       // Fixed MSIE 5.0 issue\r
+       div.innerHTML = div.innerHTML;\r
+\r
+       if (this.isSafari) {\r
+               // Give Safari some time to setup\r
+               window.setTimeout(function() {\r
+                       doc = window.frames[id_prefix + '_iframe'].document;\r
+                       doc.open();\r
+                       doc.write(html);\r
+                       doc.close();\r
+               }, 10);\r
+       } else {\r
+               doc = window.frames[id_prefix + '_iframe'].window.document\r
+               doc.open();\r
+               doc.write(html);\r
+               doc.close();\r
+       }\r
+\r
+       div.style.display = "block";\r
+\r
+       return div;\r
+};\r
+\r
+// Window instance\r
+function MCWindow() {\r
+};\r
+\r
+MCWindow.prototype.focus = function() {\r
+       this.winElement.style.zIndex = mcWindows.zindex++;\r
+       mcWindows.selectedWindow = this;\r
+};\r
+\r
+MCWindow.prototype.minimize = function() {\r
+};\r
+\r
+MCWindow.prototype.maximize = function() {\r
+       \r
+};\r
+\r
+MCWindow.prototype.startResize = function() {\r
+       mcWindows.action = "resize";\r
+};\r
+\r
+MCWindow.prototype.startMove = function(e) {\r
+       mcWindows.action = "move";\r
+};\r
+\r
+MCWindow.prototype.close = function() {\r
+       document.body.removeChild(this.winElement);\r
+       mcWindows.windows[this.name] = null;\r
+};\r
+\r
+MCWindow.prototype.onMouseMove = function(e) {\r
+       var scrollX = 0;//this.doc.body.scrollLeft;\r
+       var scrollY = 0;//this.doc.body.scrollTop;\r
+\r
+       // Calculate real X, Y\r
+       var dx = e.screenX - mcWindows.mouseDownScreenX;\r
+       var dy = e.screenY - mcWindows.mouseDownScreenY;\r
+\r
+       switch (mcWindows.action) {\r
+               case "resize":\r
+                       width = mcWindows.mouseDownWidth + (e.screenX - mcWindows.mouseDownScreenX);\r
+                       height = mcWindows.mouseDownHeight + (e.screenY - mcWindows.mouseDownScreenY);\r
+\r
+                       width = width < 100 ? 100 : width;\r
+                       height = height < 100 ? 100 : height;\r
+\r
+                       this.wrapperIFrameElement.style.width = width+2;\r
+                       this.wrapperIFrameElement.style.height = height+2;\r
+                       this.wrapperIFrameElement.width = width+2;\r
+                       this.wrapperIFrameElement.height = height+2;\r
+                       this.winElement.style.width = width;\r
+                       this.winElement.style.height = height;\r
+\r
+                       height = height-12-19;\r
+\r
+                       this.containerElement.style.width = width;\r
+\r
+                       this.iframeElement.style.width = width;\r
+                       this.iframeElement.style.height = height;\r
+                       this.bodyElement.style.width = width;\r
+                       this.bodyElement.style.height = height;\r
+                       this.headElement.style.width = width;\r
+                       //this.statusElement.style.width = width;\r
+\r
+                       mcWindows.cancelEvent(e);\r
+                       break;\r
+\r
+               case "move":\r
+                       this.left = mcWindows.mouseDownLayerX + (e.screenX - mcWindows.mouseDownScreenX);\r
+                       this.top = mcWindows.mouseDownLayerY + (e.screenY - mcWindows.mouseDownScreenY);\r
+                       this.winElement.style.left = this.left + "px";\r
+                       this.winElement.style.top = this.top + "px";\r
+\r
+                       mcWindows.cancelEvent(e);\r
+                       break;\r
+       }\r
+};\r
+\r
+MCWindow.prototype.onMouseUp = function(e) {\r
+       mcWindows.action = "none";\r
+};\r
+\r
+MCWindow.prototype.onFocus = function(e) {\r
+       // Gecko only handler\r
+       var winRef = e.currentTarget;\r
+\r
+       for (var n in mcWindows.windows) {\r
+               var win = mcWindows.windows[n];\r
+               if (typeof(win) == 'function')\r
+                       continue;\r
+\r
+               if (winRef.name == win.id) {\r
+                       win.focus();\r
+                       return;\r
+               }\r
+       }\r
+};\r
+\r
+MCWindow.prototype.onMouseDown = function(e) {\r
+       var elm = mcWindows.isMSIE ? this.wrapperFrame.event.srcElement : e.target;\r
+\r
+       var scrollX = 0;//this.doc.body.scrollLeft;\r
+       var scrollY = 0;//this.doc.body.scrollTop;\r
+\r
+       mcWindows.mouseDownScreenX = e.screenX;\r
+       mcWindows.mouseDownScreenY = e.screenY;\r
+       mcWindows.mouseDownLayerX = this.left;\r
+       mcWindows.mouseDownLayerY = this.top;\r
+       mcWindows.mouseDownWidth = parseInt(this.winElement.style.width);\r
+       mcWindows.mouseDownHeight = parseInt(this.winElement.style.height);\r
+\r
+       if (elm == this.resizeElement.firstChild)\r
+               this.startResize(e);\r
+       else\r
+               this.startMove(e);\r
+\r
+       mcWindows.cancelEvent(e);\r
+};\r
+\r
+// Global instance\r
+var mcWindows = new MCWindows();\r
diff --git a/webcit/tiny_mce/plugins/inlinepopups/readme.txt b/webcit/tiny_mce/plugins/inlinepopups/readme.txt
new file mode 100644 (file)
index 0000000..e69de29
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..14737e0
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.importPluginLanguagePack('insertdatetime','cs,el,en,fr_ca,it,ko,sv,zh_cn,fa,fr,de,pl,pt_br,nl,da,he,nb,ru,ru_KOI8-R,ru_UTF-8,nn,fi,es,cy,is,pl');function TinyMCE_insertdatetime_getInfo(){return{longname:'Insert date/time',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_insertdatetime.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_insertdatetime_getControlHTML(control_name){switch(control_name){case "insertdate":var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceInsertDate\');return false;';return '<a href="javascript:'+cmd+'" onclick="'+cmd+'" target="_self" onmousedown="return false;"><img id="{$editor_id}_insertdate" src="{$pluginurl}/images/insertdate.gif" title="{$lang_insertdate_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';case "inserttime":var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceInsertTime\');return false;';return '<a href="javascript:'+cmd+'" onclick="'+cmd+'" target="_self" onmousedown="return false;"><img id="{$editor_id}_inserttime" src="{$pluginurl}/images/inserttime.gif" title="{$lang_inserttime_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';}return "";}function TinyMCE_insertdatetime_execCommand(editor_id,element,command,user_interface,value){function addZeros(value,len){value=""+value;if(value.length<len){for(var i=0;i<(len-value.length);i++)value="0"+value;}return value;}function getDateTime(date,format){format=tinyMCE.regexpReplace(format,"%D","%m/%d/%y");format=tinyMCE.regexpReplace(format,"%r","%I:%M:%S %p");format=tinyMCE.regexpReplace(format,"%Y",""+date.getFullYear());format=tinyMCE.regexpReplace(format,"%y",""+date.getYear());format=tinyMCE.regexpReplace(format,"%m",addZeros(date.getMonth()+1,2));format=tinyMCE.regexpReplace(format,"%d",addZeros(date.getDate(),2));format=tinyMCE.regexpReplace(format,"%H",""+addZeros(date.getHours(),2));format=tinyMCE.regexpReplace(format,"%M",""+addZeros(date.getMinutes(),2));format=tinyMCE.regexpReplace(format,"%S",""+addZeros(date.getSeconds(),2));format=tinyMCE.regexpReplace(format,"%I",""+((date.getHours()+11)%12+1));format=tinyMCE.regexpReplace(format,"%p",""+(date.getHours()<12?"AM":"PM"));format=tinyMCE.regexpReplace(format,"%B",""+tinyMCE.getLang("lang_inserttime_months_long")[date.getMonth()]);format=tinyMCE.regexpReplace(format,"%b",""+tinyMCE.getLang("lang_inserttime_months_short")[date.getMonth()]);format=tinyMCE.regexpReplace(format,"%A",""+tinyMCE.getLang("lang_inserttime_day_long")[date.getDay()]);format=tinyMCE.regexpReplace(format,"%a",""+tinyMCE.getLang("lang_inserttime_day_short")[date.getDay()]);format=tinyMCE.regexpReplace(format,"%%","%");return format;}switch(command){case "mceInsertDate":tinyMCE.execInstanceCommand(editor_id,'mceInsertContent',false,getDateTime(new Date(),tinyMCE.getParam("plugin_insertdate_dateFormat",tinyMCE.getLang('lang_insertdate_def_fmt'))));return true;case "mceInsertTime":tinyMCE.execInstanceCommand(editor_id,'mceInsertContent',false,getDateTime(new Date(),tinyMCE.getParam("plugin_insertdate_timeFormat",tinyMCE.getLang('lang_inserttime_def_fmt'))));return true;}return false;}
\ 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..6322a19
--- /dev/null
@@ -0,0 +1,82 @@
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('insertdatetime', 'cs,el,en,fr_ca,it,ko,sv,zh_cn,fa,fr,de,pl,pt_br,nl,da,he,nb,ru,ru_KOI8-R,ru_UTF-8,nn,fi,es,cy,is,pl');\r
+\r
+function TinyMCE_insertdatetime_getInfo() {\r
+       return {\r
+               longname : 'Insert date/time',\r
+               author : 'Moxiecode Systems',\r
+               authorurl : 'http://tinymce.moxiecode.com',\r
+               infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_insertdatetime.html',\r
+               version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+       };\r
+};\r
+\r
+/**\r
+ * Returns the HTML contents of the insertdate, inserttime controls.\r
+ */\r
+function TinyMCE_insertdatetime_getControlHTML(control_name) {\r
+       switch (control_name) {\r
+               case "insertdate":\r
+                       var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceInsertDate\');return false;';\r
+                       return '<a href="javascript:' + cmd + '" onclick="' + cmd + '" target="_self" onmousedown="return false;"><img id="{$editor_id}_insertdate" src="{$pluginurl}/images/insertdate.gif" title="{$lang_insertdate_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';\r
+\r
+               case "inserttime":\r
+                       var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceInsertTime\');return false;';\r
+                       return '<a href="javascript:' + cmd + '" onclick="' + cmd + '" target="_self" onmousedown="return false;"><img id="{$editor_id}_inserttime" src="{$pluginurl}/images/inserttime.gif" title="{$lang_inserttime_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';\r
+       }\r
+\r
+       return "";\r
+}\r
+\r
+/**\r
+ * Executes the mceInsertDate command.\r
+ */\r
+function TinyMCE_insertdatetime_execCommand(editor_id, element, command, user_interface, value) {\r
+       /* Adds zeros infront of value */\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
+       /* Returns the date object in the specified format */\r
+       function getDateTime(date, format) {\r
+               format = tinyMCE.regexpReplace(format, "%D", "%m/%d/%y");\r
+               format = tinyMCE.regexpReplace(format, "%r", "%I:%M:%S %p");\r
+               format = tinyMCE.regexpReplace(format, "%Y", "" + date.getFullYear());\r
+               format = tinyMCE.regexpReplace(format, "%y", "" + date.getYear());\r
+               format = tinyMCE.regexpReplace(format, "%m", addZeros(date.getMonth()+1, 2));\r
+               format = tinyMCE.regexpReplace(format, "%d", addZeros(date.getDate(), 2));\r
+               format = tinyMCE.regexpReplace(format, "%H", "" + addZeros(date.getHours(), 2));\r
+               format = tinyMCE.regexpReplace(format, "%M", "" + addZeros(date.getMinutes(), 2));\r
+               format = tinyMCE.regexpReplace(format, "%S", "" + addZeros(date.getSeconds(), 2));\r
+               format = tinyMCE.regexpReplace(format, "%I", "" + ((date.getHours() + 11) % 12 + 1));\r
+               format = tinyMCE.regexpReplace(format, "%p", "" + (date.getHours() < 12 ? "AM" : "PM"));\r
+               format = tinyMCE.regexpReplace(format, "%B", "" + tinyMCE.getLang("lang_inserttime_months_long")[date.getMonth()]);\r
+               format = tinyMCE.regexpReplace(format, "%b", "" + tinyMCE.getLang("lang_inserttime_months_short")[date.getMonth()]);\r
+               format = tinyMCE.regexpReplace(format, "%A", "" + tinyMCE.getLang("lang_inserttime_day_long")[date.getDay()]);\r
+               format = tinyMCE.regexpReplace(format, "%a", "" + tinyMCE.getLang("lang_inserttime_day_short")[date.getDay()]);\r
+               format = tinyMCE.regexpReplace(format, "%%", "%");\r
+\r
+               return format;\r
+       }\r
+\r
+       // Handle commands\r
+       switch (command) {\r
+               case "mceInsertDate":\r
+                       tinyMCE.execInstanceCommand(editor_id, 'mceInsertContent', false, getDateTime(new Date(), tinyMCE.getParam("plugin_insertdate_dateFormat", tinyMCE.getLang('lang_insertdate_def_fmt'))));\r
+                       return true;\r
+\r
+               case "mceInsertTime":\r
+                       tinyMCE.execInstanceCommand(editor_id, 'mceInsertContent', false, getDateTime(new Date(), tinyMCE.getParam("plugin_insertdate_timeFormat", tinyMCE.getLang('lang_inserttime_def_fmt'))));\r
+                       return true;\r
+       }\r
+\r
+       // Pass to next handler in chain\r
+       return false;\r
+}\r
diff --git a/webcit/tiny_mce/plugins/insertdatetime/images/insertdate.gif b/webcit/tiny_mce/plugins/insertdatetime/images/insertdate.gif
new file mode 100644 (file)
index 0000000..8ad424d
Binary files /dev/null and b/webcit/tiny_mce/plugins/insertdatetime/images/insertdate.gif differ
diff --git a/webcit/tiny_mce/plugins/insertdatetime/images/inserttime.gif b/webcit/tiny_mce/plugins/insertdatetime/images/inserttime.gif
new file mode 100644 (file)
index 0000000..6dad3b3
Binary files /dev/null and b/webcit/tiny_mce/plugins/insertdatetime/images/inserttime.gif differ
diff --git a/webcit/tiny_mce/plugins/insertdatetime/langs/cs.js b/webcit/tiny_mce/plugins/insertdatetime/langs/cs.js
new file mode 100644 (file)
index 0000000..0f766d5
--- /dev/null
@@ -0,0 +1,18 @@
+/**\r
+ * Czech lang variables \r
+ * encoding: utf-8\r
+ *  \r
+ * $Id: cs.js,v 1.5 2005/10/18 13:59:43 spocke Exp $ \r
+ */  \r
+\r
+tinyMCE.addToLang('',{\r
+insertdate_def_fmt : '%Y-%m-%d',\r
+inserttime_def_fmt : '%H:%M:%S',\r
+insertdate_desc : 'Vložit datum',\r
+inserttime_desc : 'Vložit čas',\r
+inserttime_months_long : new Array('Leden','Únor','Březen','Duben','Květen','Červen','Červenec','Srpen','Září','Říjen','Listopad','Prosinec'),\r
+inserttime_months_short : new Array('Led','Úno','Bře','Dub','Kvě','Črv','Čvc','Srp','Zář','Říj','Lis','Pro'),\r
+inserttime_day_long : new Array('Neděle','Pondělí','Úterý','Středa','Čtvrtek','Pátek','Sobota','Neděle'),\r
+inserttime_day_short : new Array('Ne','Po','Út','St','Čt','Pá','So','Ne')\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/insertdatetime/langs/cy.js b/webcit/tiny_mce/plugins/insertdatetime/langs/cy.js
new file mode 100644 (file)
index 0000000..81b8dd5
--- /dev/null
@@ -0,0 +1,12 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+insertdate_def_fmt : '%Y-%m-%d',\r
+inserttime_def_fmt : '%H:%M:%S',\r
+insertdate_desc : 'Mewnosod dyddiad',\r
+inserttime_desc : 'Mewnosod amser',\r
+inserttime_months_long : new Array("Ionawr", "Chwefror", "Mawrth", "Ebrill", "Mai", "Mehefin", "Gorffennaf", "Awst", "Medi", "Hydref", "Tachwedd", "Rhagfyr"),\r
+inserttime_months_short : new Array("Ion", "Chwe", "Maw", "Ebr", "Mai", "Meh", "Gor", "Aws", "Med", "Hyd", "Tach", "Rhag"),\r
+inserttime_day_long : new Array("Dydd Sul", "Dydd Llun", "Dydd Mawrth", "Dydd Mercher", "Dydd Iau", "Dydd Gwener", "Dydd Sadwrn", "Dydd Sul"),\r
+inserttime_day_short : new Array("Sul", "Llun", "Maw", "Mer", "Iau", "Gwe", "Sad", "Sul")\r
+});\r
diff --git a/webcit/tiny_mce/plugins/insertdatetime/langs/da.js b/webcit/tiny_mce/plugins/insertdatetime/langs/da.js
new file mode 100644 (file)
index 0000000..a88a913
--- /dev/null
@@ -0,0 +1,12 @@
+// DK lang variables contributed by Jan Moelgaard\r
+\r
+tinyMCE.addToLang('',{\r
+insertdate_def_fmt : '%d-%m-%Y',\r
+inserttime_def_fmt : '%H:%M:%S',\r
+insertdate_desc : 'Indsæt dato',\r
+inserttime_desc : 'Indsæt tid',\r
+inserttime_months_long : new Array("Januar", "Februar", "Marts", "April", "Maj", "Juni", "Juli", "August", "September", "Oktober", "November", "December"),\r
+inserttime_months_short : new Array("Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"),\r
+inserttime_day_long : new Array("S&#248;ndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "L&#248;rdag", "S&#248;ndag"),\r
+inserttime_day_short : new Array("S&#248;n", "Man", "Tir", "Ons", "Tor", "Fre", "L&#248;r", "S&#248;n")\r
+});\r
diff --git a/webcit/tiny_mce/plugins/insertdatetime/langs/de.js b/webcit/tiny_mce/plugins/insertdatetime/langs/de.js
new file mode 100644 (file)
index 0000000..e908815
--- /dev/null
@@ -0,0 +1,12 @@
+// DE lang variables \r
+\r
+tinyMCE.addToLang('',{\r
+insertdate_def_fmt : '%Y-%m-%d',\r
+inserttime_def_fmt : '%H:%M:%S',\r
+insertdate_desc : 'Datum einf&uuml;gen',\r
+inserttime_desc : 'Zeit einf&uuml;gen',\r
+inserttime_months_long : new Array("Januar", "Februar", "M&auml;rz", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"),\r
+inserttime_months_short : new Array("Jan", "Feb", "M&auml;r", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"),\r
+inserttime_day_long : new Array("Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"),\r
+inserttime_day_short : new Array("So", "Mo", "Di", "Mi", "Do", "Fr", "Sa", "So")\r
+});\r
diff --git a/webcit/tiny_mce/plugins/insertdatetime/langs/el.js b/webcit/tiny_mce/plugins/insertdatetime/langs/el.js
new file mode 100644 (file)
index 0000000..213793b
--- /dev/null
@@ -0,0 +1,12 @@
+// Greek lang variables by Jacaranda Bill\r
+\r
+tinyMCE.addToLang('',{\r
+insertdate_def_fmt : '%Y-%m-%d',\r
+inserttime_def_fmt : '%H:%M:%S',\r
+insertdate_desc : '&Aring;éóáãùãÞ çì&aring;ñïìçíßáò',\r
+inserttime_desc : '&Aring;éóáãùãÞ þñáò',\r
+inserttime_months_long : new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"),\r
+inserttime_months_short : new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"),\r
+inserttime_day_long : new Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"),\r
+inserttime_day_short : new Array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")\r
+});\r
diff --git a/webcit/tiny_mce/plugins/insertdatetime/langs/en.js b/webcit/tiny_mce/plugins/insertdatetime/langs/en.js
new file mode 100644 (file)
index 0000000..c3ec02b
--- /dev/null
@@ -0,0 +1,12 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+insertdate_def_fmt : '%Y-%m-%d',\r
+inserttime_def_fmt : '%H:%M:%S',\r
+insertdate_desc : 'Insert date',\r
+inserttime_desc : 'Insert time',\r
+inserttime_months_long : new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"),\r
+inserttime_months_short : new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"),\r
+inserttime_day_long : new Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"),\r
+inserttime_day_short : new Array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")\r
+});\r
diff --git a/webcit/tiny_mce/plugins/insertdatetime/langs/es.js b/webcit/tiny_mce/plugins/insertdatetime/langs/es.js
new file mode 100644 (file)
index 0000000..77a3ef5
--- /dev/null
@@ -0,0 +1,20 @@
+/**\r
+ * ES lang variables\r
+ * \r
+ * Authors : Alvaro Velasco,\r
+ *           Adolfo Sanz De Diego (asanzdiego) <asanzdiego@yahoo.es>,\r
+ *           Carlos C Soto (eclipxe) <csoto@sia-solutions.com>\r
+ * Last Updated : October 17, 2005\r
+ * TinyMCE Version : 2.0RC3\r
+ */\r
+\r
+tinyMCE.addToLang('',{\r
+insertdate_def_fmt : '%d-%m-%Y',\r
+inserttime_def_fmt : '%H:%M:%S',\r
+insertdate_desc : 'Insertar fecha',\r
+inserttime_desc : 'Insertar hora',\r
+inserttime_months_long : new Array("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"),\r
+inserttime_months_short : new Array("Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic"),\r
+inserttime_day_long : new Array("Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"),\r
+inserttime_day_short : new Array("Dom", "Lun", "Mar", "Mié", "Jue", "Vie", "Sáb", "Dom")\r
+});\r
diff --git a/webcit/tiny_mce/plugins/insertdatetime/langs/fa.js b/webcit/tiny_mce/plugins/insertdatetime/langs/fa.js
new file mode 100644 (file)
index 0000000..5d89b73
--- /dev/null
@@ -0,0 +1,13 @@
+// IR lang variables\r
+// Persian (Farsi) language pack (for IRAN)\r
+// By: Morteza Zafari\r
+// Lost@LostLord.com\r
+// http://www.LostLord.com\r
+\r
+tinyMCE.addToLang('',{\r
+insertdate_def_fmt : '%Y-%m-%d',\r
+inserttime_def_fmt : '%H:%M:%S',\r
+dir : 'rtl',\r
+insertdate_desc : '?????? ?????',\r
+inserttime_desc : '?????? ????'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/insertdatetime/langs/fi.js b/webcit/tiny_mce/plugins/insertdatetime/langs/fi.js
new file mode 100644 (file)
index 0000000..3758c96
--- /dev/null
@@ -0,0 +1,12 @@
+// FI lang variables by Tuomo Aura, Ateco.fi\r
+\r
+tinyMCE.addToLang('',{\r
+insertdate_def_fmt : '%d.%m.%Y',\r
+inserttime_def_fmt : '%H:%M:%S',\r
+insertdate_desc : 'Lis&auml;&auml; p&auml;iv&auml;m&auml;&auml;r&auml;',\r
+inserttime_desc : 'Lis&auml;&auml; kellonaika',\r
+inserttime_months_long : new Array("Tammikuu", "Helmikuu", "Maaliskuu", "Huhtikuu", "Toukokuu", "Kes&auml;kuu", "Hein&auml;kuu", "Elokuu", "Syyskuu", "Lokakuu", "Marraskuu", "Joulukuu"),\r
+inserttime_months_short : new Array("Tammi", "Helmi", "Maalis", "Huhti", "Touko", "Kes&auml;", "Hein&auml;", "Elo", "Syys", "Loka", "Marras", "Joulu"),\r
+inserttime_day_long : new Array("Sunnuntai", "Maanantai", "Tiistai", "Keskiviikko", "Torstai", "Perjantai", "Lauantai"),\r
+inserttime_day_short : new Array("Su", "Ma", "Ti", "Ke", "To", "Pe", "La")\r
+});\r
diff --git a/webcit/tiny_mce/plugins/insertdatetime/langs/fr.js b/webcit/tiny_mce/plugins/insertdatetime/langs/fr.js
new file mode 100644 (file)
index 0000000..81e5b7e
--- /dev/null
@@ -0,0 +1,12 @@
+// Traduit par Normand Lamoureux le 2005-11-12\r
+\r
+tinyMCE.addToLang('',{\r
+insertdate_def_fmt : '%Y-%m-%d',\r
+inserttime_def_fmt : '%H:%M:%S',\r
+insertdate_desc : 'Insérer la date',\r
+inserttime_desc : 'Insérer l\'heure',\r
+inserttime_months_long : new Array("Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"),\r
+inserttime_months_short : new Array("Jan", "Fév", "Mar", "Avr", "Mai", "Jun", "Jul", "Aoû", "Sep", "Oct", "Nov", "Déc"),\r
+inserttime_day_long : new Array("Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"),\r
+inserttime_day_short : new Array("Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam", "Dim")\r
+});\r
diff --git a/webcit/tiny_mce/plugins/insertdatetime/langs/fr_ca.js b/webcit/tiny_mce/plugins/insertdatetime/langs/fr_ca.js
new file mode 100644 (file)
index 0000000..72a076c
--- /dev/null
@@ -0,0 +1,10 @@
+// Canadian French lang variables by Virtuelcom\r
+\r
+tinyMCE.addToLang('',{\r
+insertdate_desc : 'Insérer la date',\r
+inserttime_desc : 'Insérer l\'heure',\r
+inserttime_months_long : new Array("Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"),\r
+inserttime_months_short : new Array("Jan", "Fev", "Mar", "Avr", "Mai", "Juin", "Juil", "Aout", "Sep", "Oct", "Nov", "Dec"),\r
+inserttime_day_long : new Array("Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"),\r
+inserttime_day_short : new Array("Lun", "Mar", "Mer", "Jeu", "Thu", "Ven", "Sam", "Dim")\r
+});\r
diff --git a/webcit/tiny_mce/plugins/insertdatetime/langs/he.js b/webcit/tiny_mce/plugins/insertdatetime/langs/he.js
new file mode 100644 (file)
index 0000000..95663e6
--- /dev/null
@@ -0,0 +1,12 @@
+// HE lang variables by Liron Newman, http://eesh.net\r
+\r
+tinyMCE.addToLang('',{\r
+insertdate_def_fmt : '%Y-%m-%d',\r
+inserttime_def_fmt : '%H:%M:%S',\r
+insertdate_desc : 'äëðñ úàøéê',\r
+inserttime_desc : 'äëðñ ùòä',\r
+inserttime_months_long : new Array("éðåàø", "ôáøåàø", "îøõ", "àôøéì", "îàé", "éåðé", "éåìé", "àåëåñè", "ñôèîáø", "àå÷èåáø", "ðåáîáø", "ãöîáø"),\r
+inserttime_months_short : new Array("éðå", "ôáø", "îøõ", "àôø", "îàé", "éåð", "éåì", "àåâ", "ñôè", "àå÷", "ðåá", "ãöî"),\r
+inserttime_day_long : new Array("éåí øàùåï", "éåí ùðé", "éåí ùìéùé", "éåí øáéòé", "éåí çîéùé", "éåí ùéùé", "éåí ùáú", "éåí øàùåï"),\r
+inserttime_day_short : new Array("à'", "á'", "â'", "ã'", "ä'", "å'", "ù'", "à'")\r
+});\r
diff --git a/webcit/tiny_mce/plugins/insertdatetime/langs/hu.js b/webcit/tiny_mce/plugins/insertdatetime/langs/hu.js
new file mode 100644 (file)
index 0000000..52c909f
--- /dev/null
@@ -0,0 +1,12 @@
+// HU lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+insertdate_def_fmt : '%Y-%m-%d',\r
+inserttime_def_fmt : '%H:%M:%S',\r
+insertdate_desc : 'Dátum beszúrása',\r
+inserttime_desc : 'Idõ beszúrása',\r
+inserttime_months_long : new Array("Január", "Február", "Március", "Április", "Május", "Június", "Július", "Augusztus", "Szeptember", "Október", "November", "December"),\r
+inserttime_months_short : new Array("Jan", "Feb", "Már", "Ápr", "Máj", "Jún", "Júl", "Aug", "Sze", "Okt", "Nov", "Dec"),\r
+inserttime_day_long : new Array("Vasárnap", "Hétfõ", "Kedd", "Szerda", "Csütörtök", "Péntek", "Szombat", "Vasárnap"),\r
+inserttime_day_short : new Array("Vas", "Hé", "Ke", "Sze", "Csü", "Pén", "Szo", "Vas")\r
+});\r
diff --git a/webcit/tiny_mce/plugins/insertdatetime/langs/is.js b/webcit/tiny_mce/plugins/insertdatetime/langs/is.js
new file mode 100644 (file)
index 0000000..c543976
--- /dev/null
@@ -0,0 +1,12 @@
+// Iceland lang variables by Johannes Birgir Jensson\r
+\r
+tinyMCE.addToLang('',{\r
+insertdate_def_fmt : '%d. %m. %Y',\r
+inserttime_def_fmt : '%H:%M:%S',\r
+insertdate_desc : 'Setja inn dagsetningu',\r
+inserttime_desc : 'Setja inn t&iacute;ma',\r
+inserttime_months_long : new Array("Janúar", "Febrúar", "Mars", "Apríl", "Maí", "Júní", "Júlí", "Ágúst", "September", "Október", "Nóvember", "Desember"),\r
+inserttime_months_short : new Array("Jan", "Feb", "Mar", "Apr", "Maí", "Jún", "Júl", "Ágú", "Sep", "Okt", "Nóv", "Des"),\r
+inserttime_day_long : new Array("Sunnudagur", "Mánudagur", "Þriðjudagur", "Miðvikudagur", "Fimmtudagur", "Föstudagur", "Laugardagur", "Sunnudagur"),\r
+inserttime_day_short : new Array("Sun", "Mán", "Þri", "Mið", "Fim", "Fös", "Lau", "Sun")\r
+});\r
diff --git a/webcit/tiny_mce/plugins/insertdatetime/langs/it.js b/webcit/tiny_mce/plugins/insertdatetime/langs/it.js
new file mode 100644 (file)
index 0000000..365fc28
--- /dev/null
@@ -0,0 +1,12 @@
+// IT lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+insertdate_def_fmt : '%Y-%m-%d',\r
+inserttime_def_fmt : '%H:%M:%S',\r
+insertdate_desc : 'Inserisci data',\r
+inserttime_desc : 'Inserisci ora',\r
+inserttime_months_long : new Array("Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"),\r
+inserttime_months_short : new Array("Gen", "Feb", "Mar", "Apr", "Mag", "Giu", "Lug", "Ago", "Set", "Ott", "Nov", "Dic"),\r
+inserttime_day_long : new Array("Domenica", "Lunedì", "Martedì", "Mercoledì", "Giovedì", "Venerdì", "Sabato", "Domenica"),\r
+inserttime_day_short : new Array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")\r
+});\r
diff --git a/webcit/tiny_mce/plugins/insertdatetime/langs/ko.js b/webcit/tiny_mce/plugins/insertdatetime/langs/ko.js
new file mode 100644 (file)
index 0000000..007f08c
--- /dev/null
@@ -0,0 +1,12 @@
+// KO lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+insertdate_def_fmt : '%Y-%m-%d',\r
+inserttime_def_fmt : '%H:%M:%S',\r
+insertdate_desc : '³¯Â¥ ³&Ouml;±â',\r
+inserttime_desc : '½Ã°£ ³&Ouml;±â',\r
+inserttime_months_long : new Array("1¿ù", "2¿ù", "3¿ù", "4¿ù", "5¿ù", "6¿ù", "7¿ù", "8¿ù", "9¿ù", "10¿ù", "11¿ù", "12¿ù"),\r
+inserttime_months_short : new Array("1¿ù", "2¿ù", "3¿ù", "4¿ù", "5¿ù", "6¿ù", "7¿ù", "8¿ù", "9¿ù", "10¿ù", "11¿ù", "12¿ù"),\r
+inserttime_day_long : new Array("ÀÏ¿&auml;ÀÏ", "¿ù¿&auml;ÀÏ", "È­¿&auml;ÀÏ", "¼&ouml;¿&auml;ÀÏ", "¸ñ¿&auml;ÀÏ", "±Ý¿&auml;ÀÏ", "&Aring;&auml;¿&auml;ÀÏ", "ÀÏ¿&auml;ÀÏ"),\r
+inserttime_day_short : new Array("ÀÏ", "¿ù", "È­", "¼&ouml;", "¸ñ", "±Ý", "&Aring;&auml;", "ÀÏ")\r
+});\r
diff --git a/webcit/tiny_mce/plugins/insertdatetime/langs/nb.js b/webcit/tiny_mce/plugins/insertdatetime/langs/nb.js
new file mode 100644 (file)
index 0000000..b52c4f9
--- /dev/null
@@ -0,0 +1,12 @@
+// nb = Norwegian (bokm&aring;l) lang variables by Knut B. Jacobsen\r
+\r
+tinyMCE.addToLang('',{\r
+insertdate_def_fmt : '%Y-%m-%d',\r
+inserttime_def_fmt : '%H:%M:%S',\r
+insertdate_desc : 'Lim inn dato',\r
+inserttime_desc : 'Lim inn tid',\r
+inserttime_months_long  : new Array("Januar", "Februar", "Mars", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Desember"),\r
+inserttime_months_short  : new Array("Jan","Feb", "Mar", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Des"),\r
+inserttime_day_long  : new Array("S&oslash;ndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "L&oslash;rdag", "S&oslash;ndag"),\r
+inserttime_day_short  : new Array("S&oslash;n", "Man", "Tir", "Ons", "Tor", "Fre", "L&oslash;r", "S&oslash;n")\r
+});\r
diff --git a/webcit/tiny_mce/plugins/insertdatetime/langs/nl.js b/webcit/tiny_mce/plugins/insertdatetime/langs/nl.js
new file mode 100644 (file)
index 0000000..375ae4b
--- /dev/null
@@ -0,0 +1,12 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+insertdate_def_fmt : '%d-%m-%Y',\r
+inserttime_def_fmt : '%H:%M:%S',\r
+insertdate_desc : 'Datum invoegen',\r
+inserttime_desc : 'Tijd invoegen',\r
+inserttime_months_long : new Array("januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"),\r
+inserttime_months_short : new Array("jan", "feb", "mrt", "apr", "mei", "jun", "jul", "aug", "sep", "oct", "nov", "dec"),\r
+inserttime_day_long : new Array("zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag", "zondag"),\r
+inserttime_day_short : new Array("zo", "ma", "di", "wo", "do", "vr", "za", "zo")\r
+});\r
diff --git a/webcit/tiny_mce/plugins/insertdatetime/langs/nn.js b/webcit/tiny_mce/plugins/insertdatetime/langs/nn.js
new file mode 100644 (file)
index 0000000..244e335
--- /dev/null
@@ -0,0 +1,12 @@
+// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen\r
+\r
+tinyMCE.addToLang('',{\r
+insertdate_def_fmt : '%Y-%m-%d',\r
+inserttime_def_fmt : '%H:%M:%S',\r
+insertdate_desc : 'Lim inn dato',\r
+inserttime_desc : 'Lim inn tid',\r
+inserttime_months_long  : new Array("Januar", "Februar", "Mars", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Desember"),\r
+inserttime_months_short  : new Array("Jan","Feb", "Mar", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Des"),\r
+inserttime_day_long  : new Array("Sundag", "Mandag", "Tysdag", "Onsdag", "Torsdag", "Fredag", "Laurdag", "Sundag"),\r
+inserttime_day_short  : new Array("Sun", "Man", "Tys", "Ons", "Tor", "Fre", "Laur", "Sun")\r
+});\r
diff --git a/webcit/tiny_mce/plugins/insertdatetime/langs/pl.js b/webcit/tiny_mce/plugins/insertdatetime/langs/pl.js
new file mode 100644 (file)
index 0000000..160002a
--- /dev/null
@@ -0,0 +1,15 @@
+// PL lang variables\r
+// fixed by Wooya\r
+// http://www.mfusion.prv.pl\r
+// fixed by lemiel 14.11.2005\r
+\r
+tinyMCE.addToLang('',{\r
+insertdate_def_fmt : '%Y-%m-%d',\r
+inserttime_def_fmt : '%H:%M:%S',\r
+insertdate_desc : 'Wstaw aktualn± datê',\r
+inserttime_desc : 'Wstaw aktualny czas',\r
+inserttime_months_long : new Array("Styczeñ", "Luty", "Marzec", "Kwiecieñ", "Maj", "Czerwiec", "Lipiec", "Sierpieñ", "Wrzesieñ", "Pa¼dziernik", "Listopad", "Grudzieñ"),\r
+inserttime_months_short : new Array("Sty", "Lut", "Mar", "Kwi", "Maj", "Czer", "Lip", "Sier", "Wrze", "Pa¼", "List", "Grudz"),\r
+inserttime_day_long : new Array("Niedziela", "Poniedzia³ek", "Wtorek", "¦roda", "Czwartek", "Pi±tek", "Sobota", "Niedziela"),\r
+inserttime_day_short : new Array("Nie", "Pon", "Wto", "¦ro", "Czw", "Pi±", "Sob", "Nie")\r
+});\r
diff --git a/webcit/tiny_mce/plugins/insertdatetime/langs/pt_br.js b/webcit/tiny_mce/plugins/insertdatetime/langs/pt_br.js
new file mode 100644 (file)
index 0000000..27fb439
--- /dev/null
@@ -0,0 +1,20 @@
+/**\r
+ * pt_br lang variables\r
+ * Brazilian Portuguese\r
+ *\r
+ * Authors : ????\r
+ * Revision and modifications:\r
+ *           Marcio Barbosa (mpg) <mpg@mpg.com.br>\r
+ * Last Updated : November 26, 2005\r
+ * TinyMCE Version : 2.0RC4\r
+ */\r
+tinyMCE.addToLang('',{\r
+insertdate_def_fmt : '%d/%m/%y',\r
+inserttime_def_fmt : '%H:%M:%S hs',\r
+insertdate_desc : 'Inserir data',\r
+inserttime_desc : 'Inserir hora',\r
+inserttime_months_long : new Array("Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"),\r
+inserttime_months_short : new Array("Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"),\r
+inserttime_day_long : new Array("Domingo", "Segunda-Feira", "Terça-Feira", "Quarta-Feira", "Quinta-Feira", "Sexta-Feira", "Sábado", "Domingo"),\r
+inserttime_day_short : new Array("Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sab", "Dom")\r
+});\r
diff --git a/webcit/tiny_mce/plugins/insertdatetime/langs/ru.js b/webcit/tiny_mce/plugins/insertdatetime/langs/ru.js
new file mode 100644 (file)
index 0000000..cfebf25
--- /dev/null
@@ -0,0 +1,12 @@
+// RU lang variables cp1251\r
+\r
+tinyMCE.addToLang('',{\r
+insertdate_def_fmt : '%d %m %Y',\r
+inserttime_def_fmt : '%H:%M:%S',\r
+insertdate_desc : 'Âñòàâèòü äàòó',\r
+inserttime_desc : 'Âñòàâèòü âðåìÿ',\r
+inserttime_months_long : new Array("ÿíâàðÿ", "ôåâðàëÿ", "ìàðòà", "àïðåëÿ", "ìàÿ", "èþíÿ", "èþëÿ", "àâãóñòà", "ñåíòÿáðÿ", "îêòÿáðÿ", "íîÿáðÿ", "äåêàáðÿ"),\r
+inserttime_months_short : new Array("ÿíâ", "ôåâ", "ìàðò", "àïð", "ìàé", "èþíü", "èþëü", "àâã", "ñåíò", "îêò", "íáð", "äåê"),\r
+inserttime_day_long : new Array("âîñêðåñåíüå", "ïîíåäåëüíèê", "âòîðíèê", "ñðåäà", "÷åòâåðã", "ïÿòíèöà", "ñóááîòà", "âîñêðåñåíüå"),\r
+inserttime_day_short : new Array("âñê", "ïí", "âò", "ñð", "÷òâ", "ïòí", "ñá", "âñê")\r
+});\r
diff --git a/webcit/tiny_mce/plugins/insertdatetime/langs/ru_KOI8-R.js b/webcit/tiny_mce/plugins/insertdatetime/langs/ru_KOI8-R.js
new file mode 100644 (file)
index 0000000..0bce119
--- /dev/null
@@ -0,0 +1,12 @@
+// RU lang variables KOI8-R\r
+\r
+tinyMCE.addToLang('',{\r
+insertdate_def_fmt : '%d %m %Y',\r
+inserttime_def_fmt : '%H:%M:%S',\r
+insertdate_desc : '÷ÓÔÁ×ÉÔØ ÄÁÔÕ',\r
+inserttime_desc : '÷ÓÔÁ×ÉÔØ ×ÒÅÍÑ',\r
+inserttime_months_long : new Array("ÑÎ×ÁÒÑ", "ÆÅ×ÒÁÌÑ", "ÍÁÒÔÁ", "ÁÐÒÅÌÑ", "ÍÁÑ", "ÉÀÎÑ", "ÉÀÌÑ", "Á×ÇÕÓÔÁ", "ÓÅÎÔÑÂÒÑ", "ÏËÔÑÂÒÑ", "ÎÏÑÂÒÑ", "ÄÅËÁÂÒÑ"),\r
+inserttime_months_short : new Array("ÑÎ×", "ÆÅ×", "ÍÁÒÔ", "ÁÐÒ", "ÍÁÊ", "ÉÀÎØ", "ÉÀÌØ", "Á×Ç", "ÓÅÎÔ", "ÏËÔ", "ÎÂÒ", "ÄÅË"),\r
+inserttime_day_long : new Array("×ÏÓËÒÅÓÅÎØÅ", "ÐÏÎÅÄÅÌØÎÉË", "×ÔÏÒÎÉË", "ÓÒÅÄÁ", "ÞÅÔ×ÅÒÇ", "ÐÑÔÎÉÃÁ", "ÓÕÂÂÏÔÁ", "×ÏÓËÒÅÓÅÎØÅ"),\r
+inserttime_day_short : new Array("×ÓË", "ÐÎ", "×Ô", "ÓÒ", "ÞÔ×", "ÐÔÎ", "ÓÂ", "×ÓË")\r
+});\r
diff --git a/webcit/tiny_mce/plugins/insertdatetime/langs/ru_UTF-8.js b/webcit/tiny_mce/plugins/insertdatetime/langs/ru_UTF-8.js
new file mode 100644 (file)
index 0000000..bbf4596
--- /dev/null
@@ -0,0 +1,12 @@
+// RU lang variables UTF-8\r
+\r
+tinyMCE.addToLang('',{\r
+insertdate_def_fmt : '%d %m %Y',\r
+inserttime_def_fmt : '%H:%M:%S',\r
+insertdate_desc : 'Вставить дату',\r
+inserttime_desc : 'Вставить время',\r
+inserttime_months_long : new Array("января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября", "декабря"),\r
+inserttime_months_short : new Array("янв", "фев", "март", "апр", "май", "июнь", "июль", "авг", "сент", "окт", "нбр", "дек"),\r
+inserttime_day_long : new Array("воскресенье", "понедельник", "вторник", "среда", "четверг", "пятница", "суббота", "воскресенье"),\r
+inserttime_day_short : new Array("вск", "пн", "вт", "ср", "чтв", "птн", "сб", "вск")\r
+});\r
diff --git a/webcit/tiny_mce/plugins/insertdatetime/langs/sk.js b/webcit/tiny_mce/plugins/insertdatetime/langs/sk.js
new file mode 100644 (file)
index 0000000..6060b55
--- /dev/null
@@ -0,0 +1,20 @@
+/**\r
+ * Slovak lang variables \r
+ * encoding: utf-8\r
+ * \r
+ * @author Vladimir VASIL vvasil@post.sk\r
+ *    \r
+ * $Id: sk.js,v 1.1 2005/11/22 20:56:44 spocke Exp $ \r
+ */  \r
+\r
+tinyMCE.addToLang('',{\r
+insertdate_def_fmt : '%Y-%m-%d',\r
+inserttime_def_fmt : '%H:%M:%S',\r
+insertdate_desc : 'Vložiť dátum',\r
+inserttime_desc : 'Vložiť čas',\r
+inserttime_months_long : new Array('Január','Február','Marec','Apríl','Máj','Jún','Júl','August','September','Október','November','December'),\r
+inserttime_months_short : new Array('Jan','Feb','Mar','Apr','Máj','Jún','Júl','Aug','Sep','Okt','Nov','Dec'),\r
+inserttime_day_long : new Array('Nedeľa','Pondelok','Utorok','Streda','Štvrtok','Piatok','Sobota','Nedeľa'),\r
+inserttime_day_short : new Array('Ne','Po','Ut','St','Št','Pi','So','Ne')\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/insertdatetime/langs/sv.js b/webcit/tiny_mce/plugins/insertdatetime/langs/sv.js
new file mode 100644 (file)
index 0000000..39f0e8f
--- /dev/null
@@ -0,0 +1,12 @@
+// SE lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+insertdate_def_fmt : '%Y-%m-%d',\r
+inserttime_def_fmt : '%H:%M:%S',\r
+insertdate_desc : 'Klistra in datum',\r
+inserttime_desc : 'Klistra in tid',\r
+inserttime_months_long  : new Array("Januari", "Februari", "Mars", "April", "Maj", "Juni", "Juli", "Augusti", "September", "Oktober", "November", "December"),\r
+inserttime_months_short  : new Array("Jan","Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"),\r
+inserttime_day_long  : new Array("S&ouml;ndag", "M&aring;ndag", "Tisdag", "Onsdag", "Torsdag", "Fredag", "L&ouml;rdag", "S&ouml;ndag"),\r
+inserttime_day_short  : new Array("S&ouml;n", "M&aring;n", "Tis", "Ons", "Tor", "Fre", "L&ouml;r", "S&ouml;n")\r
+});\r
diff --git a/webcit/tiny_mce/plugins/insertdatetime/langs/zh_cn.js b/webcit/tiny_mce/plugins/insertdatetime/langs/zh_cn.js
new file mode 100644 (file)
index 0000000..ead7dd2
--- /dev/null
@@ -0,0 +1,12 @@
+// Simplified Chinese lang variables contributed by tom_cat (thomaswangyang@gmail.com)\r
+\r
+tinyMCE.addToLang('',{\r
+insertdate_def_fmt : '%Y-%m-%d',\r
+inserttime_def_fmt : '%H:%M:%S',\r
+insertdate_desc : '²åÈ뵱ǰÈÕÆÚ',\r
+inserttime_desc : '²åÈ뵱ǰʱ¼ä',\r
+inserttime_months_long : new Array("Ò»Ô·Ý", "¶þÔ·Ý", "ÈýÔ·Ý", "ËÄÔ·Ý", "ÎåÔ·Ý", "ÁùÔ·Ý", "ÆßÔ·Ý", "°ËÔ·Ý", "¾ÅÔ·Ý", "ʮԷÝ", "ʮһÔ·Ý", "Ê®¶þÔ·Ý"),\r
+inserttime_months_short : new Array("Ò»ÔÂ", "¶þÔÂ", "ÈýÔÂ", "ËÄÔÂ", "ÎåÔÂ", "ÁùÔÂ", "ÆßÔÂ", "°ËÔÂ", "¾ÅÔÂ", "Ê®ÔÂ", "ʮһÔÂ", "Ê®¶þÔÂ"),\r
+inserttime_day_long : new Array("ÐÇÆÚÈÕ", "ÐÇÆÚÒ»", "ÐÇÆÚ¶þ", "ÐÇÆÚÈý", "ÐÇÆÚËÄ", "ÐÇÆÚÎå", "ÐÇÆÚÁù", "ÐÇÆÚÈÕ"),\r
+inserttime_day_short : new Array("ÐÇÆÚÈÕ", "ÐÇÆÚÒ»", "ÐÇÆÚ¶þ", "ÐÇÆÚÈý", "ÐÇÆÚËÄ", "ÐÇÆÚÎå", "ÐÇÆÚÁù", "ÐÇÆÚÈÕ")\r
+});\r
diff --git a/webcit/tiny_mce/plugins/insertdatetime/langs/zh_tw.js b/webcit/tiny_mce/plugins/insertdatetime/langs/zh_tw.js
new file mode 100644 (file)
index 0000000..f9cd497
--- /dev/null
@@ -0,0 +1,13 @@
+// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// ÁcÅ餤¤å BIG-5 ¡F¼Æ¦ìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com\r
+\r
+tinyMCE.addToLang('',{\r
+insertdate_def_fmt : '%Y-%m-%d',\r
+inserttime_def_fmt : '%H:%M:%S',\r
+insertdate_desc : '´¡¤J¤é´Á',\r
+inserttime_desc : '´¡¤J®É¶¡',\r
+inserttime_months_long : new Array("¤@¤ë", "¤G¤ë", "¤T¤ë", "¥|¤ë", "¤­¤ë", "¤»¤ë", "¤C¤ë", "¤K¤ë", "¤E¤ë", "¤Q¤ë", "¤Q¤@¤ë", "¤Q¤G¤ë"),\r
+inserttime_months_short : new Array("¤@", "¤G", "¤T", "¥|", "¤­", "¤»", "¤C", "¤K", "¤E", "¤Q", "¤Q¤@", "¤Q¤G"),\r
+inserttime_day_long : new Array("¬P´Á¤é", "¬P´Á¤@", "¬P´Á¤G", "¬P´Á¤T", "¬P´Á¥|", "¬P´Á¤­", "¬P´Á¤»", "¬P´Á¤é"),\r
+inserttime_day_short : new Array("¤é", "¤@", "¤G", "¤T", "¥|", "¤­", "¤»", "¤é")\r
+});\r
diff --git a/webcit/tiny_mce/plugins/insertdatetime/langs/zh_tw_utf8.js b/webcit/tiny_mce/plugins/insertdatetime/langs/zh_tw_utf8.js
new file mode 100644 (file)
index 0000000..df9af30
--- /dev/null
@@ -0,0 +1,13 @@
+// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// 繁體中文 UTF-8 ;數位應用坊製作; twapweb_AT_gmail_DOT_com\r
+\r
+tinyMCE.addToLang('',{\r
+insertdate_def_fmt : '%Y/%m/%d',\r
+inserttime_def_fmt : '%H:%M:%S',\r
+insertdate_desc : '插入日期',\r
+inserttime_desc : '插入時間',\r
+inserttime_months_long : new Array("一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"),\r
+inserttime_months_short : new Array("一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "十一", "十二"),\r
+inserttime_day_long : new Array("星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"),\r
+inserttime_day_short : new Array("日", "一", "二", "三", "四", "五", "六", "日")\r
+});\r
diff --git a/webcit/tiny_mce/plugins/insertdatetime/readme.txt b/webcit/tiny_mce/plugins/insertdatetime/readme.txt
new file mode 100644 (file)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/webcit/tiny_mce/plugins/noneditable/css/noneditable.css b/webcit/tiny_mce/plugins/noneditable/css/noneditable.css
new file mode 100644 (file)
index 0000000..c4dc455
--- /dev/null
@@ -0,0 +1,17 @@
+/* This is the CSS file for the noneditable elements plugin */\r
+\r
+.mceItemEditable {\r
+       /*border: 1px dotted #0000cc;*/\r
+       -moz-user-focus: none;\r
+       -moz-user-input: auto;\r
+       -moz-user-modify: auto;\r
+       -moz-user-select: text;\r
+}\r
+\r
+.mceItemNonEditable {\r
+       /*border: 1px dotted #cc0000;*/\r
+       -moz-user-focus: ignore;\r
+       /*-moz-user-input: disabled;*/\r
+       -moz-user-modify: read-only;\r
+       -moz-user-select: all;\r
+}\r
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..37beb47
--- /dev/null
@@ -0,0 +1 @@
+function TinyMCE_noneditable_getInfo(){return{longname:'Non editable elements',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_noneditable.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_noneditable_initInstance(inst){tinyMCE.importCSS(inst.getDoc(),tinyMCE.baseURL+"/plugins/noneditable/css/noneditable.css");if(tinyMCE.isMSIE5_0)tinyMCE.settings['plugins']=tinyMCE.settings['plugins'].replace(/noneditable/gi,'Noneditable');if(tinyMCE.isGecko){tinyMCE.addEvent(inst.getDoc(),"keyup",TinyMCE_noneditable_fixKeyUp);}}function TinyMCE_noneditable_fixKeyUp(e){var inst=tinyMCE.selectedInstance;var sel=inst.getSel();var rng=inst.getRng();var an=sel.anchorNode;if((e.keyCode==38||e.keyCode==37||e.keyCode==40||e.keyCode==39)&&(elm=TinyMCE_noneditable_isNonEditable(an))!=null){rng=inst.getDoc().createRange();rng.selectNode(elm);rng.collapse(true);sel.removeAllRanges();sel.addRange(rng);tinyMCE.cancelEvent(e);}}function TinyMCE_noneditable_selectAll(e){var inst=tinyMCE.selectedInstance;var sel=inst.getSel();var doc=inst.getDoc();if((elm=TinyMCE_noneditable_isNonEditable(sel.focusNode))!=null){inst.selectNode(elm,false);tinyMCE.cancelEvent(e);return;}if((elm=TinyMCE_noneditable_isNonEditable(sel.anchorNode))!=null){inst.selectNode(elm,false);tinyMCE.cancelEvent(e);return;}}function TinyMCE_noneditable_isNonEditable(elm){var editClass=tinyMCE.getParam("noneditable_editable_class","mceItemEditable");var nonEditClass=tinyMCE.getParam("noneditable_noneditable_class","mceItemNonEditable");if(!elm)return;do{var className=elm.className?elm.className:"";if(className.indexOf(editClass)!=-1)return null;if(className.indexOf(nonEditClass)!=-1)return elm;}while(elm=elm.parentNode);return null;}function TinyMCE_noneditable_cleanup(type,content,inst){switch(type){case "insert_to_editor_dom":var nodes=tinyMCE.getNodeTree(content,new Array(),1);var editClass=tinyMCE.getParam("noneditable_editable_class","mceItemEditable");var nonEditClass=tinyMCE.getParam("noneditable_noneditable_class","mceItemNonEditable");for(var i=0;i<nodes.length;i++){var elm=nodes[i];var editable=tinyMCE.getAttrib(elm,"contenteditable");if(new RegExp("true|false","gi").test(editable))TinyMCE_noneditable_setEditable(elm,editable=="true");if(tinyMCE.isMSIE){var className=elm.className?elm.className:"";if(className.indexOf(editClass)!=-1)elm.contentEditable=true;if(className.indexOf(nonEditClass)!=-1)elm.contentEditable=false;}}break;case "insert_to_editor":if(tinyMCE.isMSIE){var editClass=tinyMCE.getParam("noneditable_editable_class","mceItemEditable");var nonEditClass=tinyMCE.getParam("noneditable_noneditable_class","mceItemNonEditable");content=content.replace(new RegExp("<(.*?)class=\"(.*?)("+editClass+")(.*?)\"(.*?)>","gi"),'<$1class="$2$3$4" contenteditable="true"$5>');content=content.replace(new RegExp("<(.*?)class=\"(.*?)("+nonEditClass+")(.*?)\"(.*?)>","gi"),'<$1class="$2$3$4" contenteditable="false"$5>');}break;case "get_from_editor_dom":if(tinyMCE.getParam("noneditable_leave_contenteditable",false)){var nodes=tinyMCE.getNodeTree(content,new Array(),1);for(var i=0;i<nodes.length;i++)nodes[i].removeAttribute("contenteditable");}break;}return content;}function TinyMCE_noneditable_setEditable(elm,state){var editClass=tinyMCE.getParam("noneditable_editable_class","mceItemEditable");var nonEditClass=tinyMCE.getParam("noneditable_noneditable_class","mceItemNonEditable");var className=elm.className?elm.className:"";if(className.indexOf(editClass)!=-1||className.indexOf(nonEditClass)!=-1)return;if((className=tinyMCE.getAttrib(elm,"class"))!="")className+=" ";className+=state?editClass:nonEditClass;elm.setAttribute("class",className);elm.className=className;}
\ 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..597b1f0
--- /dev/null
@@ -0,0 +1,149 @@
+function TinyMCE_noneditable_getInfo() {\r
+       return {\r
+               longname : 'Non editable elements',\r
+               author : 'Moxiecode Systems',\r
+               authorurl : 'http://tinymce.moxiecode.com',\r
+               infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_noneditable.html',\r
+               version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+       };\r
+};\r
+\r
+function TinyMCE_noneditable_initInstance(inst) {\r
+       tinyMCE.importCSS(inst.getDoc(), tinyMCE.baseURL + "/plugins/noneditable/css/noneditable.css");\r
+\r
+       // Ugly hack\r
+       if (tinyMCE.isMSIE5_0)\r
+               tinyMCE.settings['plugins'] = tinyMCE.settings['plugins'].replace(/noneditable/gi, 'Noneditable');\r
+\r
+       if (tinyMCE.isGecko) {\r
+               tinyMCE.addEvent(inst.getDoc(), "keyup", TinyMCE_noneditable_fixKeyUp);\r
+//             tinyMCE.addEvent(inst.getDoc(), "keypress", TinyMCE_noneditable_selectAll);\r
+//             tinyMCE.addEvent(inst.getDoc(), "mouseup", TinyMCE_noneditable_selectAll);\r
+       }\r
+}\r
+\r
+function TinyMCE_noneditable_fixKeyUp(e) {\r
+       var inst = tinyMCE.selectedInstance;\r
+       var sel = inst.getSel();\r
+       var rng = inst.getRng();\r
+       var an = sel.anchorNode;\r
+\r
+       // Move cursor outside non editable fields\r
+       if ((e.keyCode == 38 || e.keyCode == 37 || e.keyCode == 40 || e.keyCode == 39) && (elm = TinyMCE_noneditable_isNonEditable(an)) != null) {\r
+               rng = inst.getDoc().createRange();\r
+               rng.selectNode(elm);\r
+               rng.collapse(true);\r
+               sel.removeAllRanges();\r
+               sel.addRange(rng);\r
+               tinyMCE.cancelEvent(e);\r
+       }\r
+}\r
+\r
+function TinyMCE_noneditable_selectAll(e) {\r
+       var inst = tinyMCE.selectedInstance;\r
+       var sel = inst.getSel();\r
+       var doc = inst.getDoc();\r
+\r
+       if ((elm = TinyMCE_noneditable_isNonEditable(sel.focusNode)) != null) {\r
+               inst.selectNode(elm, false);\r
+               tinyMCE.cancelEvent(e);\r
+               return;\r
+       }\r
+\r
+       if ((elm = TinyMCE_noneditable_isNonEditable(sel.anchorNode)) != null) {\r
+               inst.selectNode(elm, false);\r
+               tinyMCE.cancelEvent(e);\r
+               return;\r
+       }\r
+}\r
+\r
+function TinyMCE_noneditable_isNonEditable(elm) {\r
+       var editClass = tinyMCE.getParam("noneditable_editable_class", "mceItemEditable");\r
+       var nonEditClass = tinyMCE.getParam("noneditable_noneditable_class", "mceItemNonEditable");\r
+\r
+       if (!elm)\r
+               return;\r
+\r
+       do {\r
+               var className = elm.className ? elm.className : "";\r
+\r
+               if (className.indexOf(editClass) != -1)\r
+                       return null;\r
+\r
+               if (className.indexOf(nonEditClass) != -1)\r
+                       return elm;\r
+       } while (elm = elm.parentNode);\r
+\r
+       return null;\r
+}\r
+\r
+function TinyMCE_noneditable_cleanup(type, content, inst) {\r
+       switch (type) {\r
+               case "insert_to_editor_dom":\r
+                       var nodes = tinyMCE.getNodeTree(content, new Array(), 1);\r
+                       var editClass = tinyMCE.getParam("noneditable_editable_class", "mceItemEditable");\r
+                       var nonEditClass = tinyMCE.getParam("noneditable_noneditable_class", "mceItemNonEditable");\r
+\r
+                       for (var i=0; i<nodes.length; i++) {\r
+                               var elm = nodes[i];\r
+\r
+                               // Convert contenteditable to classes\r
+                               var editable = tinyMCE.getAttrib(elm, "contenteditable");\r
+                               if (new RegExp("true|false","gi").test(editable))\r
+                                       TinyMCE_noneditable_setEditable(elm, editable == "true");\r
+\r
+                               if (tinyMCE.isMSIE) {\r
+                                       var className = elm.className ? elm.className : "";\r
+\r
+                                       if (className.indexOf(editClass) != -1)\r
+                                               elm.contentEditable = true;\r
+\r
+                                       if (className.indexOf(nonEditClass) != -1)\r
+                                               elm.contentEditable = false;\r
+                               }\r
+                       }\r
+\r
+                       break;\r
+\r
+               case "insert_to_editor":\r
+                       if (tinyMCE.isMSIE) {\r
+                               var editClass = tinyMCE.getParam("noneditable_editable_class", "mceItemEditable");\r
+                               var nonEditClass = tinyMCE.getParam("noneditable_noneditable_class", "mceItemNonEditable");\r
+\r
+                               content = content.replace(new RegExp("<(.*?)class=\"(.*?)(" + editClass + ")(.*?)\"(.*?)>", "gi"), '<$1class="$2$3$4" contenteditable="true"$5>');\r
+                               content = content.replace(new RegExp("<(.*?)class=\"(.*?)(" + nonEditClass + ")(.*?)\"(.*?)>", "gi"), '<$1class="$2$3$4" contenteditable="false"$5>');\r
+                       }\r
+\r
+                       break;\r
+\r
+               case "get_from_editor_dom":\r
+                       if (tinyMCE.getParam("noneditable_leave_contenteditable", false)) {\r
+                               var nodes = tinyMCE.getNodeTree(content, new Array(), 1);\r
+\r
+                               for (var i=0; i<nodes.length; i++)\r
+                                       nodes[i].removeAttribute("contenteditable");\r
+                       }\r
+\r
+                       break;\r
+       }\r
+\r
+       return content;\r
+}\r
+\r
+function TinyMCE_noneditable_setEditable(elm, state) {\r
+       var editClass = tinyMCE.getParam("noneditable_editable_class", "mceItemEditable");\r
+       var nonEditClass = tinyMCE.getParam("noneditable_noneditable_class", "mceItemNonEditable");\r
+\r
+       var className = elm.className ? elm.className : "";\r
+\r
+       if (className.indexOf(editClass) != -1 || className.indexOf(nonEditClass) != -1)\r
+               return;\r
+\r
+       if ((className = tinyMCE.getAttrib(elm, "class")) != "")\r
+               className += " ";\r
+\r
+       className += state ? editClass : nonEditClass;\r
+\r
+       elm.setAttribute("class", className);\r
+       elm.className = className;\r
+}\r
diff --git a/webcit/tiny_mce/plugins/noneditable/readme.txt b/webcit/tiny_mce/plugins/noneditable/readme.txt
new file mode 100644 (file)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/webcit/tiny_mce/plugins/paste/blank.htm b/webcit/tiny_mce/plugins/paste/blank.htm
new file mode 100644 (file)
index 0000000..1ddf829
--- /dev/null
@@ -0,0 +1,19 @@
+<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 language="javascript">\r
+               function init() {\r
+                       document.body.contentEditable = true;\r
+                       document.designMode = 'on';\r
+                       parent.initIframe(document);\r
+                       window.focus();\r
+               }\r
+       </script>\r
+       <link href="css/blank.css" rel="stylesheet" type="text/css" />\r
+       <base target="_self" />\r
+</head>\r
+<body onload="init();">\r
+\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/plugins/paste/css/blank.css b/webcit/tiny_mce/plugins/paste/css/blank.css
new file mode 100644 (file)
index 0000000..eca411a
--- /dev/null
@@ -0,0 +1,13 @@
+body {\r
+       background-color: #FFFFFF;\r
+       font-family: Verdana, Arial, Helvetica, sans-serif;\r
+       font-size: 10px;\r
+       scrollbar-3dlight-color: #F0F0EE;\r
+       scrollbar-arrow-color: #676662;\r
+       scrollbar-base-color: #F0F0EE;\r
+       scrollbar-darkshadow-color: #DDDDDD;\r
+       scrollbar-face-color: #E0E0DD;\r
+       scrollbar-highlight-color: #F0F0EE;\r
+       scrollbar-shadow-color: #F0F0EE;\r
+       scrollbar-track-color: #F5F5F5;\r
+}\r
diff --git a/webcit/tiny_mce/plugins/paste/css/pasteword.css b/webcit/tiny_mce/plugins/paste/css/pasteword.css
new file mode 100644 (file)
index 0000000..b3be627
--- /dev/null
@@ -0,0 +1,3 @@
+.sourceIframe {\r
+       border: 1px solid #808080;\r
+}\r
diff --git a/webcit/tiny_mce/plugins/paste/editor_plugin.js b/webcit/tiny_mce/plugins/paste/editor_plugin.js
new file mode 100644 (file)
index 0000000..ffc2f8d
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.importPluginLanguagePack('paste','en,sv,cs,zh_cn,fr_ca,da,he,nb,de,hu,ru,ru_KOI8-R,ru_UTF-8,nn,fi,es,cy,is,pl,nl,fr,pt_br');function TinyMCE_paste_getInfo(){return{longname:'Paste text/word',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_paste.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_paste_initInstance(inst){if(tinyMCE.isMSIE&&tinyMCE.getParam("paste_auto_cleanup_on_paste",false))tinyMCE.addEvent(inst.getBody(),"paste",TinyMCE_paste_handleEvent);}function TinyMCE_paste_handleEvent(e){switch(e.type){case "paste":var html=TinyMCE_paste__clipboardHTML();tinyMCE.execCommand('delete');if(html&&html.length>0)tinyMCE.execCommand('mcePasteWord',false,html);tinyMCE.cancelEvent(e);return false;}return true;}function TinyMCE_paste_getControlHTML(control_name){switch(control_name){case "pastetext":var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mcePasteText\', true);return false;';return '<a href="javascript:'+cmd+'" onclick="'+cmd+'" target="_self" onmousedown="return false;"><img id="{$editor_id}pastetext" src="{$pluginurl}/images/pastetext.gif" title="{$lang_paste_text_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreClass(this);" /></a>';case "pasteword":var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mcePasteWord\', true);return false;';return '<a href="javascript:'+cmd+'" onclick="'+cmd+'" target="_self" onmousedown="return false;"><img id="{$editor_id}pasteword" src="{$pluginurl}/images/pasteword.gif" title="{$lang_paste_word_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreClass(this);" /></a>';case "selectall":var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceSelectAll\');return false;';return '<a href="javascript:'+cmd+'" onclick="'+cmd+'" target="_self" onmousedown="return false;"><img id="{$editor_id}selectall" src="{$pluginurl}/images/selectall.gif" title="{$lang_selectall_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreClass(this);" /></a>';}return '';}function TinyMCE_paste_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mcePasteText":if(user_interface){if((tinyMCE.isMSIE&&!tinyMCE.isOpera)&&!tinyMCE.getParam('paste_use_dialog',false))TinyMCE_paste__insertText(clipboardData.getData("Text"),true);else{var template=new Array();template['file']='../../plugins/paste/pastetext.htm';template['width']=450;template['height']=400;var plain_text="";tinyMCE.openWindow(template,{editor_id:editor_id,plain_text:plain_text,resizable:"yes",scrollbars:"no",inline:"yes",mceDo:'insert'});}}else TinyMCE_paste__insertText(value['html'],value['linebreaks']);return true;case "mcePasteWord":if(user_interface){if((tinyMCE.isMSIE&&!tinyMCE.isOpera)&&!tinyMCE.getParam('paste_use_dialog',false)){var html=TinyMCE_paste__clipboardHTML();if(html&&html.length>0)TinyMCE_paste__insertWordContent(html);}else{var template=new Array();template['file']='../../plugins/paste/pasteword.htm';template['width']=450;template['height']=400;var plain_text="";tinyMCE.openWindow(template,{editor_id:editor_id,plain_text:plain_text,resizable:"yes",scrollbars:"no",inline:"yes",mceDo:'insert'});}}else TinyMCE_paste__insertWordContent(value);return true;case "mceSelectAll":tinyMCE.execInstanceCommand(editor_id,'selectall');return true;}return false;}function TinyMCE_paste__insertText(content,bLinebreaks){if(content&&content.length>0){if(bLinebreaks){if(tinyMCE.getParam("paste_create_paragraphs",true)){var rl=tinyMCE.getParam("paste_replace_list",'\u2122,<sup>TM</sup>,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-').split(',');for(var i=0;i<rl.length;i+=2)content=content.replace(new RegExp(rl[i],'gi'),rl[i+1]);content=tinyMCE.regexpReplace(content,"\r\n\r\n","</p><p>","gi");content=tinyMCE.regexpReplace(content,"\r\r","</p><p>","gi");content=tinyMCE.regexpReplace(content,"\n\n","</p><p>","gi");if((pos=content.indexOf('</p><p>'))!=-1){tinyMCE.execCommand("Delete");var node=tinyMCE.selectedInstance.getFocusElement();var breakElms=new Array();do{if(node.nodeType==1){if(node.nodeName=="TD"||node.nodeName=="BODY")break;breakElms[breakElms.length]=node;}}while(node=node.parentNode);var before="",after="</p>";before+=content.substring(0,pos);for(var i=0;i<breakElms.length;i++){before+="</"+breakElms[i].nodeName+">";after+="<"+breakElms[(breakElms.length-1)-i].nodeName+">";}before+="<p>";content=before+content.substring(pos+7)+after;}}if(tinyMCE.getParam("paste_create_linebreaks",true)){content=tinyMCE.regexpReplace(content,"\r\n","<br />","gi");content=tinyMCE.regexpReplace(content,"\r","<br />","gi");content=tinyMCE.regexpReplace(content,"\n","<br />","gi");}}tinyMCE.execCommand("mceInsertRawHTML",false,content);}}function TinyMCE_paste__insertWordContent(content){if(content&&content.length>0){var bull=String.fromCharCode(8226);var middot=String.fromCharCode(183);var rl=tinyMCE.getParam("paste_replace_list",'\u2122,<sup>TM</sup>,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-').split(',');for(var i=0;i<rl.length;i+=2)content=content.replace(new RegExp(rl[i],'gi'),rl[i+1]);if(tinyMCE.getParam("paste_convert_headers_to_strong",false)){content=content.replace(new RegExp('<p class=MsoHeading.*?>(.*?)<\/p>','gi'),'<p><b>$1</b></p>');}content=content.replace(new RegExp('tab-stops: list [0-9]+.0pt">','gi'),'">'+"--list--");content=content.replace(new RegExp(bull+"(.*?)<BR>","gi"),"<p>"+middot+"$1</p>");content=content.replace(new RegExp('<SPAN style="mso-list: Ignore">','gi'),"<span>"+bull);content=content.replace(/<o:p><\/o:p>/gi,"");content=content.replace(new RegExp('<br style="page-break-before: always;.*>','gi'),'-- page break --');content=content.replace(new RegExp('<(!--)([^>]*)(--)>','g'),"");content=content.replace(/<\/?span[^>]*>/gi,"");content=content.replace(new RegExp('<(\\w[^>]*) style="([^"]*)"([^>]*)','gi'),"<$1$3");content=content.replace(/<\/?font[^>]*>/gi,"");switch(tinyMCE.getParam("paste_strip_class_attributes","all")){case "all":content=content.replace(/<(\w[^>]*)class=([^|>]*)([^>]*)/gi,"<$1$3");break;case "mso":content=content.replace(new RegExp('<(\\w[^>]*) class="?mso([^ |>]*)([^>]*)','gi'),"<$1$3");break;}content=content.replace(new RegExp('href="?'+TinyMCE_paste__reEscape(""+document.location)+'','gi'),'href="'+tinyMCE.settings['document_base_url']);content=content.replace(/<(\w[^>]*)lang=([^|>]*)([^>]*)/gi,"<$1$3");content=content.replace(/<\\?\?xml[^>]*>/gi,"");content=content.replace(/<\/?\w+:[^>]*>/gi,"");content=content.replace(/--page break--\s*<p>&nbsp;<\/p>/gi,"");content=content.replace(/--page break--/gi,"");if(!tinyMCE.settings['force_p_newlines']){content=content.replace('','','gi');content=content.replace('</p>','<br /><br />','gi');}if(!tinyMCE.isMSIE&&!tinyMCE.settings['force_p_newlines']){content=content.replace(/<\/?p[^>]*>/gi,"");}content=content.replace(/<\/?div[^>]*>/gi,"");if(tinyMCE.getParam("paste_convert_middot_lists",true)){var div=document.createElement("div");div.innerHTML=content;var className=tinyMCE.getParam("paste_unindented_list_class","unIndentedList");while(TinyMCE_paste_convertMiddots(div,"--list--"));while(TinyMCE_paste_convertMiddots(div,middot,className));while(TinyMCE_paste_convertMiddots(div,bull));content=div.innerHTML;}if(tinyMCE.getParam("paste_convert_headers_to_strong",false)){content=content.replace(/<h[1-6]>&nbsp;<\/h[1-6]>/gi,'<p>&nbsp;&nbsp;</p>');content=content.replace(/<h[1-6]>/gi,'<p><b>');content=content.replace(/<\/h[1-6]>/gi,'</b></p>');content=content.replace(/<b>&nbsp;<\/b>/gi,'<b>&nbsp;&nbsp;</b>');content=content.replace(/^(&nbsp;)*/gi,'');}content=content.replace(/--list--/gi,"");tinyMCE.execCommand("mceInsertContent",false,content);tinyMCE.execCommand("mceCleanup");}}function TinyMCE_paste__reEscape(s){var l="?.\\*[](){}+^$:";var o="";for(var i=0;i<s.length;i++){var c=s.charAt(i);if(l.indexOf(c)!=-1)o+='\\'+c;else o+=c;}return o;}function TinyMCE_paste_convertMiddots(div,search,class_name){var mdot=String.fromCharCode(183);var bull=String.fromCharCode(8226);var nodes=div.getElementsByTagName("p");for(var i=0;i<nodes.length;i++){var p=nodes[i];if(p.innerHTML.indexOf(search)!=-1){var ul=document.createElement("ul");if(class_name)ul.className=class_name;var li=document.createElement("li");li.innerHTML=p.innerHTML.replace(new RegExp(''+mdot+'|'+bull+'|--list--|&nbsp;',"gi"),'');ul.appendChild(li);var np=p.nextSibling;while(np){if(np.nodeType!=1||np.innerHTML.indexOf(search)==-1)break;var cp=np.nextSibling;var li=document.createElement("li");li.innerHTML=np.innerHTML.replace(new RegExp(''+mdot+'|'+bull+'|--list--|&nbsp;',"gi"),'');np.parentNode.removeChild(np);ul.appendChild(li);np=cp;}p.parentNode.replaceChild(ul,p);return true;}}return false;}function TinyMCE_paste__clipboardHTML(){var div=document.getElementById('_TinyMCE_clipboardHTML');if(!div){var div=document.createElement('DIV');div.id='_TinyMCE_clipboardHTML';with(div.style){visibility='hidden';overflow='hidden';position='absolute';width=1;height=1;}document.body.appendChild(div);}div.innerHTML='';var rng=document.body.createTextRange();rng.moveToElementText(div);rng.execCommand('Paste');var html=div.innerHTML;div.innerHTML='';return html;}
\ 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..a4e5d70
--- /dev/null
@@ -0,0 +1,333 @@
+/* Import plugin specific language pack */ \r
+tinyMCE.importPluginLanguagePack('paste', 'en,sv,cs,zh_cn,fr_ca,da,he,nb,de,hu,ru,ru_KOI8-R,ru_UTF-8,nn,fi,es,cy,is,pl,nl,fr,pt_br');\r
+\r
+function TinyMCE_paste_getInfo() {\r
+       return {\r
+               longname : 'Paste text/word',\r
+               author : 'Moxiecode Systems',\r
+               authorurl : 'http://tinymce.moxiecode.com',\r
+               infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_paste.html',\r
+               version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+       };\r
+};\r
+\r
+function TinyMCE_paste_initInstance(inst) {\r
+       if (tinyMCE.isMSIE && tinyMCE.getParam("paste_auto_cleanup_on_paste", false))\r
+               tinyMCE.addEvent(inst.getBody(), "paste", TinyMCE_paste_handleEvent);\r
+}\r
+\r
+function TinyMCE_paste_handleEvent(e) {\r
+       switch (e.type) {\r
+               case "paste":\r
+                       var html = TinyMCE_paste__clipboardHTML();\r
+\r
+                       // Removes italic, strong etc\r
+                       tinyMCE.execCommand('delete');\r
+\r
+                       if (html && html.length > 0)\r
+                               tinyMCE.execCommand('mcePasteWord', false, html);\r
+\r
+                       tinyMCE.cancelEvent(e);\r
+                       return false;\r
+       }\r
+\r
+       return true;\r
+}\r
+\r
+function TinyMCE_paste_getControlHTML(control_name) { \r
+       switch (control_name) { \r
+               case "pastetext":\r
+                       var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mcePasteText\', true);return false;';\r
+                       return '<a href="javascript:' + cmd + '" onclick="' + cmd + '" target="_self" onmousedown="return false;"><img id="{$editor_id}pastetext" src="{$pluginurl}/images/pastetext.gif" title="{$lang_paste_text_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreClass(this);" /></a>'; \r
+\r
+               case "pasteword":\r
+                       var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mcePasteWord\', true);return false;';\r
+                       return '<a href="javascript:' + cmd + '" onclick="' + cmd + '" target="_self" onmousedown="return false;"><img id="{$editor_id}pasteword" src="{$pluginurl}/images/pasteword.gif" title="{$lang_paste_word_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreClass(this);" /></a>'; \r
+\r
+               case "selectall":\r
+                       var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceSelectAll\');return false;';\r
+                       return '<a href="javascript:' + cmd + '" onclick="' + cmd + '" target="_self" onmousedown="return false;"><img id="{$editor_id}selectall" src="{$pluginurl}/images/selectall.gif" title="{$lang_selectall_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreClass(this);" /></a>'; \r
+       } \r
+\r
+       return ''; \r
+} \r
+\r
+function TinyMCE_paste_execCommand(editor_id, element, command, user_interface, value) { \r
+       switch (command) { \r
+               case "mcePasteText": \r
+                       if (user_interface) {\r
+                               if ((tinyMCE.isMSIE && !tinyMCE.isOpera) && !tinyMCE.getParam('paste_use_dialog', false))\r
+                                       TinyMCE_paste__insertText(clipboardData.getData("Text"), true); \r
+                               else { \r
+                                       var template = new Array(); \r
+                                       template['file']        = '../../plugins/paste/pastetext.htm'; // Relative to theme \r
+                                       template['width']  = 450; \r
+                                       template['height'] = 400; \r
+                                       var plain_text = ""; \r
+                                       tinyMCE.openWindow(template, {editor_id : editor_id, plain_text: plain_text, resizable : "yes", scrollbars : "no", inline : "yes", mceDo : 'insert'}); \r
+                               }\r
+                       } else\r
+                               TinyMCE_paste__insertText(value['html'], value['linebreaks']);\r
+\r
+                       return true;\r
+\r
+               case "mcePasteWord": \r
+                       if (user_interface) {\r
+                               if ((tinyMCE.isMSIE && !tinyMCE.isOpera) && !tinyMCE.getParam('paste_use_dialog', false)) {\r
+                                       var html = TinyMCE_paste__clipboardHTML();\r
+\r
+                                       if (html && html.length > 0)\r
+                                               TinyMCE_paste__insertWordContent(html);\r
+                               } else { \r
+                                       var template = new Array(); \r
+                                       template['file']        = '../../plugins/paste/pasteword.htm'; // Relative to theme \r
+                                       template['width']  = 450; \r
+                                       template['height'] = 400; \r
+                                       var plain_text = ""; \r
+                                       tinyMCE.openWindow(template, {editor_id : editor_id, plain_text: plain_text, resizable : "yes", scrollbars : "no", inline : "yes", mceDo : 'insert'});\r
+                               }\r
+                       } else\r
+                               TinyMCE_paste__insertWordContent(value);\r
+\r
+                       return true;\r
+\r
+               case "mceSelectAll":\r
+                       tinyMCE.execInstanceCommand(editor_id, 'selectall'); \r
+                       return true; \r
+\r
+       } \r
+\r
+       // Pass to next handler in chain \r
+       return false; \r
+} \r
+\r
+function TinyMCE_paste__insertText(content, bLinebreaks) { \r
+       if (content && content.length > 0) {\r
+               if (bLinebreaks) { \r
+                       // Special paragraph treatment \r
+                       if (tinyMCE.getParam("paste_create_paragraphs", true)) {\r
+                               var rl = tinyMCE.getParam("paste_replace_list", '\u2122,<sup>TM</sup>,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-').split(',');\r
+                               for (var i=0; i<rl.length; i+=2)\r
+                                       content = content.replace(new RegExp(rl[i], 'gi'), rl[i+1]);\r
+\r
+                               content = tinyMCE.regexpReplace(content, "\r\n\r\n", "</p><p>", "gi"); \r
+                               content = tinyMCE.regexpReplace(content, "\r\r", "</p><p>", "gi"); \r
+                               content = tinyMCE.regexpReplace(content, "\n\n", "</p><p>", "gi"); \r
+\r
+                               // Has paragraphs \r
+                               if ((pos = content.indexOf('</p><p>')) != -1) { \r
+                                       tinyMCE.execCommand("Delete"); \r
+\r
+                                       var node = tinyMCE.selectedInstance.getFocusElement(); \r
+\r
+                                       // Get list of elements to break \r
+                                       var breakElms = new Array(); \r
+\r
+                                       do { \r
+                                               if (node.nodeType == 1) { \r
+                                                       // Don't break tables and break at body \r
+                                                       if (node.nodeName == "TD" || node.nodeName == "BODY") \r
+                                                               break; \r
+       \r
+                                                       breakElms[breakElms.length] = node; \r
+                                               } \r
+                                       } while(node = node.parentNode); \r
+\r
+                                       var before = "", after = "</p>"; \r
+                                       before += content.substring(0, pos); \r
+\r
+                                       for (var i=0; i<breakElms.length; i++) { \r
+                                               before += "</" + breakElms[i].nodeName + ">"; \r
+                                               after += "<" + breakElms[(breakElms.length-1)-i].nodeName + ">"; \r
+                                       } \r
+\r
+                                       before += "<p>"; \r
+                                       content = before + content.substring(pos+7) + after; \r
+                               } \r
+                       } \r
+\r
+                       if (tinyMCE.getParam("paste_create_linebreaks", true)) {\r
+                               content = tinyMCE.regexpReplace(content, "\r\n", "<br />", "gi"); \r
+                               content = tinyMCE.regexpReplace(content, "\r", "<br />", "gi"); \r
+                               content = tinyMCE.regexpReplace(content, "\n", "<br />", "gi"); \r
+                       }\r
+               } \r
+       \r
+               tinyMCE.execCommand("mceInsertRawHTML", false, content); \r
+       }\r
+}\r
+\r
+function TinyMCE_paste__insertWordContent(content) { \r
+       if (content && content.length > 0) {\r
+               // Cleanup Word content\r
+               var bull = String.fromCharCode(8226);\r
+               var middot = String.fromCharCode(183);\r
+\r
+               var rl = tinyMCE.getParam("paste_replace_list", '\u2122,<sup>TM</sup>,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-').split(',');\r
+               for (var i=0; i<rl.length; i+=2)\r
+                       content = content.replace(new RegExp(rl[i], 'gi'), rl[i+1]);\r
+\r
+               if (tinyMCE.getParam("paste_convert_headers_to_strong", false)) {\r
+                       content = content.replace(new RegExp('<p class=MsoHeading.*?>(.*?)<\/p>', 'gi'), '<p><b>$1</b></p>');\r
+               }\r
+\r
+               content = content.replace(new RegExp('tab-stops: list [0-9]+.0pt">', 'gi'), '">' + "--list--");\r
+               content = content.replace(new RegExp(bull + "(.*?)<BR>", "gi"), "<p>" + middot + "$1</p>");\r
+               content = content.replace(new RegExp('<SPAN style="mso-list: Ignore">', 'gi'), "<span>" + bull); // Covert to bull list\r
+               content = content.replace(/<o:p><\/o:p>/gi, "");\r
+               content = content.replace(new RegExp('<br style="page-break-before: always;.*>', 'gi'), '-- page break --'); // Replace pagebreaks\r
+               content = content.replace(new RegExp('<(!--)([^>]*)(--)>', 'g'), "");  // Word comments\r
+               content = content.replace(/<\/?span[^>]*>/gi, "");\r
+               content = content.replace(new RegExp('<(\\w[^>]*) style="([^"]*)"([^>]*)', 'gi'), "<$1$3");\r
+               content = content.replace(/<\/?font[^>]*>/gi, "");\r
+\r
+               // Strips class attributes.\r
+               switch (tinyMCE.getParam("paste_strip_class_attributes", "all")) {\r
+                       case "all":\r
+                               content = content.replace(/<(\w[^>]*) class=([^ |>]*)([^>]*)/gi, "<$1$3");\r
+                               break;\r
+\r
+                       case "mso":\r
+                               content = content.replace(new RegExp('<(\\w[^>]*) class="?mso([^ |>]*)([^>]*)', 'gi'), "<$1$3");\r
+                               break;\r
+               }\r
+\r
+               content = content.replace(new RegExp('href="?' + TinyMCE_paste__reEscape("" + document.location) + '', 'gi'), 'href="' + tinyMCE.settings['document_base_url']);\r
+               content = content.replace(/<(\w[^>]*) lang=([^ |>]*)([^>]*)/gi, "<$1$3");\r
+               content = content.replace(/<\\?\?xml[^>]*>/gi, "");\r
+               content = content.replace(/<\/?\w+:[^>]*>/gi, "");\r
+               content = content.replace(/-- page break --\s*<p>&nbsp;<\/p>/gi, ""); // Remove pagebreaks\r
+               content = content.replace(/-- page break --/gi, ""); // Remove pagebreaks\r
+\r
+//             content = content.replace(/\/?&nbsp;*/gi, ""); &nbsp;\r
+//             content = content.replace(/<p>&nbsp;<\/p>/gi, '');\r
+\r
+               if (!tinyMCE.settings['force_p_newlines']) {\r
+                       content = content.replace('', '' ,'gi');\r
+                       content = content.replace('</p>', '<br /><br />' ,'gi');\r
+               }\r
+\r
+               if (!tinyMCE.isMSIE && !tinyMCE.settings['force_p_newlines']) {\r
+                       content = content.replace(/<\/?p[^>]*>/gi, "");\r
+               }\r
+\r
+               content = content.replace(/<\/?div[^>]*>/gi, "");\r
+\r
+               // Convert all middlot lists to UL lists\r
+               if (tinyMCE.getParam("paste_convert_middot_lists", true)) {\r
+                       var div = document.createElement("div");\r
+                       div.innerHTML = content;\r
+\r
+                       // Convert all middot paragraphs to li elements\r
+                       var className = tinyMCE.getParam("paste_unindented_list_class", "unIndentedList");\r
+\r
+                       while (TinyMCE_paste_convertMiddots(div, "--list--")) ; // bull\r
+                       while (TinyMCE_paste_convertMiddots(div, middot, className)) ; // Middot\r
+                       while (TinyMCE_paste_convertMiddots(div, bull)) ; // bull\r
+\r
+                       content = div.innerHTML;\r
+               }\r
+\r
+               // Replace all headers with strong and fix some other issues\r
+               if (tinyMCE.getParam("paste_convert_headers_to_strong", false)) {\r
+                       content = content.replace(/<h[1-6]>&nbsp;<\/h[1-6]>/gi, '<p>&nbsp;&nbsp;</p>');\r
+                       content = content.replace(/<h[1-6]>/gi, '<p><b>');\r
+                       content = content.replace(/<\/h[1-6]>/gi, '</b></p>');\r
+                       content = content.replace(/<b>&nbsp;<\/b>/gi, '<b>&nbsp;&nbsp;</b>');\r
+                       content = content.replace(/^(&nbsp;)*/gi, '');\r
+               }\r
+\r
+               content = content.replace(/--list--/gi, ""); // Remove --list--\r
+\r
+               // Insert cleaned content\r
+               tinyMCE.execCommand("mceInsertContent", false, content);\r
+               tinyMCE.execCommand("mceCleanup"); // Do normal cleanup\r
+       }\r
+}\r
+\r
+function TinyMCE_paste__reEscape(s) {\r
+       var l = "?.\\*[](){}+^$:";\r
+       var o = "";\r
+\r
+       for (var i=0; i<s.length; i++) {\r
+               var c = s.charAt(i);\r
+\r
+               if (l.indexOf(c) != -1)\r
+                       o += '\\' + c;\r
+               else\r
+                       o += c;\r
+       }\r
+\r
+       return o;\r
+}\r
+\r
+function TinyMCE_paste_convertMiddots(div, search, class_name) {\r
+       var mdot = String.fromCharCode(183);\r
+       var bull = String.fromCharCode(8226);\r
+\r
+       var nodes = div.getElementsByTagName("p");\r
+       for (var i=0; i<nodes.length; i++) {\r
+               var p = nodes[i];\r
+\r
+               // Is middot\r
+               if (p.innerHTML.indexOf(search) != -1) {\r
+                       var ul = document.createElement("ul");\r
+\r
+                       if (class_name)\r
+                               ul.className = class_name;\r
+\r
+                       // Add the first one\r
+                       var li = document.createElement("li");\r
+                       li.innerHTML = p.innerHTML.replace(new RegExp('' + mdot + '|' + bull + '|--list--|&nbsp;', "gi"), '');\r
+                       ul.appendChild(li);\r
+\r
+                       // Add the rest\r
+                       var np = p.nextSibling;\r
+                       while (np) {\r
+                               // Not element or middot paragraph\r
+                               if (np.nodeType != 1 || np.innerHTML.indexOf(search) == -1)\r
+                                       break;\r
+\r
+                               var cp = np.nextSibling;\r
+                               var li = document.createElement("li");\r
+                               li.innerHTML = np.innerHTML.replace(new RegExp('' + mdot + '|' + bull + '|--list--|&nbsp;', "gi"), '');\r
+                               np.parentNode.removeChild(np);\r
+                               ul.appendChild(li);\r
+                               np = cp;\r
+                       }\r
+\r
+                       p.parentNode.replaceChild(ul, p);\r
+\r
+                       return true;\r
+               }\r
+       }\r
+\r
+       return false;\r
+}\r
+\r
+function TinyMCE_paste__clipboardHTML() {\r
+       var div = document.getElementById('_TinyMCE_clipboardHTML');\r
+\r
+       if (!div) {\r
+               var div = document.createElement('DIV');\r
+               div.id = '_TinyMCE_clipboardHTML';\r
+\r
+               with (div.style) {\r
+                       visibility = 'hidden';\r
+                       overflow = 'hidden';\r
+                       position = 'absolute';\r
+                       width = 1;\r
+                       height = 1;\r
+               }\r
+\r
+               document.body.appendChild(div);\r
+       }\r
+\r
+       div.innerHTML = '';\r
+       var rng = document.body.createTextRange();\r
+       rng.moveToElementText(div);\r
+       rng.execCommand('Paste');\r
+       var html = div.innerHTML;\r
+       div.innerHTML = '';\r
+       return html;\r
+}\r
diff --git a/webcit/tiny_mce/plugins/paste/images/pastetext.gif b/webcit/tiny_mce/plugins/paste/images/pastetext.gif
new file mode 100644 (file)
index 0000000..e381cc6
Binary files /dev/null and b/webcit/tiny_mce/plugins/paste/images/pastetext.gif differ
diff --git a/webcit/tiny_mce/plugins/paste/images/pasteword.gif b/webcit/tiny_mce/plugins/paste/images/pasteword.gif
new file mode 100644 (file)
index 0000000..0ccb008
Binary files /dev/null and b/webcit/tiny_mce/plugins/paste/images/pasteword.gif differ
diff --git a/webcit/tiny_mce/plugins/paste/images/selectall.gif b/webcit/tiny_mce/plugins/paste/images/selectall.gif
new file mode 100644 (file)
index 0000000..c4f9901
Binary files /dev/null and b/webcit/tiny_mce/plugins/paste/images/selectall.gif differ
diff --git a/webcit/tiny_mce/plugins/paste/jscripts/pastetext.js b/webcit/tiny_mce/plugins/paste/jscripts/pastetext.js
new file mode 100644 (file)
index 0000000..927745b
--- /dev/null
@@ -0,0 +1,34 @@
+function saveContent() {\r
+       if (document.forms[0].htmlSource.value == '') {\r
+               tinyMCEPopup.close();\r
+               return false;\r
+       }\r
+\r
+       tinyMCEPopup.execCommand('mcePasteText', false, {\r
+               html : document.forms[0].htmlSource.value,\r
+               linebreaks : document.forms[0].linebreaks.checked\r
+       });\r
+\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function onLoadInit() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       resizeInputs();\r
+}\r
+\r
+var wHeight=0, wWidth=0, owHeight=0, owWidth=0;\r
+\r
+function resizeInputs() {\r
+       if (!tinyMCE.isMSIE) {\r
+               wHeight = self.innerHeight-80;\r
+               wWidth = self.innerWidth-17;\r
+       } else {\r
+               wHeight = document.body.clientHeight-80;\r
+               wWidth = document.body.clientWidth-17;\r
+       }\r
+\r
+       document.forms[0].htmlSource.style.height = Math.abs(wHeight) + 'px';\r
+       document.forms[0].htmlSource.style.width  = Math.abs(wWidth) + 'px';\r
+}\r
diff --git a/webcit/tiny_mce/plugins/paste/jscripts/pasteword.js b/webcit/tiny_mce/plugins/paste/jscripts/pasteword.js
new file mode 100644 (file)
index 0000000..c56ea81
--- /dev/null
@@ -0,0 +1,46 @@
+function saveContent() {\r
+       var html = document.getElementById("frmData").contentWindow.document.body.innerHTML;\r
+\r
+       if (html == ''){\r
+               tinyMCEPopup.close();\r
+               return false;\r
+       }\r
+\r
+       tinyMCEPopup.execCommand('mcePasteWord', false, html);\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function onLoadInit() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       // Fix for endless reloading in FF\r
+       window.setTimeout('createIFrame();', 10);\r
+}\r
+\r
+function createIFrame() {\r
+       document.getElementById('iframecontainer').innerHTML = '<iframe id="frmData" name="frmData" class="sourceIframe" src="blank.htm" height="280" width="400" frameborder="0" style="background-color:#FFFFFF; width:100%;" dir="ltr" wrap="soft"></iframe>';\r
+}\r
+\r
+var wHeight=0, wWidth=0, owHeight=0, owWidth=0;\r
+\r
+function initIframe(doc) {\r
+       var dir = tinyMCE.selectedInstance.settings['directionality'];\r
+       doc.body.dir = dir;\r
+       resizeInputs();\r
+}\r
+\r
+function resizeInputs() {\r
+       if (!tinyMCE.isMSIE) {\r
+               wHeight = self.innerHeight - 80;\r
+               wWidth = self.innerWidth - 18;\r
+       } else {\r
+               wHeight = document.body.clientHeight - 80;\r
+               wWidth = document.body.clientWidth - 18;\r
+       }\r
+\r
+       var elm = document.getElementById('frmData');\r
+       if (elm) {\r
+               elm.style.height = Math.abs(wHeight) + 'px';\r
+               elm.style.width  = Math.abs(wWidth) + 'px';\r
+       }\r
+}\r
diff --git a/webcit/tiny_mce/plugins/paste/langs/cs.js b/webcit/tiny_mce/plugins/paste/langs/cs.js
new file mode 100644 (file)
index 0000000..081aa6b
--- /dev/null
@@ -0,0 +1,16 @@
+/**\r
+ * Czech lang variables \r
+ * encoding: utf-8\r
+ *  \r
+ * $Id: cs.js,v 1.4 2005/10/18 13:59:43 spocke Exp $ \r
+ */  \r
+\r
+tinyMCE.addToLang('',{\r
+paste_text_desc : 'Vložit neformátovaný text',\r
+paste_text_title : 'Použij CTRL + V na klávesnici pro vložení textu do okna.',\r
+paste_text_linebreaks : 'Nechej přerušení řádků',\r
+paste_word_desc : 'Vložit text z aplikace Word',\r
+paste_word_title : 'Použij CTRL + V na klávesnici pro vložení textu do okna.',\r
+selectall_desc : 'Označit vše'\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/paste/langs/cy.js b/webcit/tiny_mce/plugins/paste/langs/cy.js
new file mode 100644 (file)
index 0000000..a4f6f52
--- /dev/null
@@ -0,0 +1,10 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+paste_text_desc : 'Gludo fel Testun Plaen',\r
+paste_text_title : 'Defnyddia CTRL+V ar dy fysellfwrdd i ludo\'r testun i fewn i\'r ffenest.',\r
+paste_text_linebreaks : 'Cadw toriadau llinell',\r
+paste_word_desc : 'Gludo o Word',\r
+paste_word_title : 'Defnyddia CTRL+V ar dy fysellfwrdd i ludo\'r testun i fewn i\'r ffenest.',\r
+selectall_desc : 'Dewis Popeth'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/paste/langs/da.js b/webcit/tiny_mce/plugins/paste/langs/da.js
new file mode 100644 (file)
index 0000000..54b5288
--- /dev/null
@@ -0,0 +1,10 @@
+// DK lang variables contributed by Jan Moelgaard\r
+\r
+tinyMCE.addToLang('',{\r
+paste_text_desc : 'Inds&#230;t som ren tekst',\r
+paste_text_title : 'Brug CTRL+V p&#229; tastaturett inds&#230;tte teksten i vinduet.',\r
+paste_text_linebreaks : 'Behold linjebrud',\r
+paste_word_desc : 'Inds&#230;t fra Word',\r
+paste_word_title : 'Brug CTRL+V p&#229; tastaturett inds&#230;tte teksten i vinduet.',\r
+selectall_desc : 'V&#230;lg alt'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/paste/langs/de.js b/webcit/tiny_mce/plugins/paste/langs/de.js
new file mode 100644 (file)
index 0000000..de34979
--- /dev/null
@@ -0,0 +1,10 @@
+// DE lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+paste_text_desc : 'Als unformatierten Text einf&uuml;gen',\r
+paste_text_title : 'Benutzen Sie Strg+V/Apfel-V auf Ihrer Tastatur, um Text in das Fenster einzuf&uuml;gen.',\r
+paste_text_linebreaks : 'Zeilenumbr&uuml;che beibehalten',\r
+paste_word_desc : 'Microsoft Word-Text einf&uuml;gen',\r
+paste_word_title : 'Benutzen Sie Strg+V/Apfel-V auf Ihrer Tastatur, um Text in das Fenster einzuf&uuml;gen.',\r
+selectall_desc : 'Alles ausw&auml;hlen'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/paste/langs/en.js b/webcit/tiny_mce/plugins/paste/langs/en.js
new file mode 100644 (file)
index 0000000..b125d51
--- /dev/null
@@ -0,0 +1,10 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+paste_text_desc : 'Paste as Plain Text',\r
+paste_text_title : 'Use CTRL+V on your keyboard to paste the text into the window.',\r
+paste_text_linebreaks : 'Keep linebreaks',\r
+paste_word_desc : 'Paste from Word',\r
+paste_word_title : 'Use CTRL+V on your keyboard to paste the text into the window.',\r
+selectall_desc : 'Select All'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/paste/langs/es.js b/webcit/tiny_mce/plugins/paste/langs/es.js
new file mode 100644 (file)
index 0000000..2f5acf4
--- /dev/null
@@ -0,0 +1,12 @@
+// ES lang variables by Alvaro Velasco and Adolfo Sanz De Diego (asanzdiego) <asanzdiego@yahoo.es>\r
+// Last Updated : October 2005\r
+// TinyMCE Version : 2.0RC3\r
+\r
+tinyMCE.addToLang('',{\r
+paste_text_desc : 'Pegar como texto plano',\r
+paste_text_title : 'Use CTRL+V para pegar el texto en la ventana.',\r
+paste_text_linebreaks : 'Mantener saltos de linea',\r
+paste_word_desc : 'Pegar desde Word',\r
+paste_word_title : 'Use CTRL+V para pegar el texto en la ventana.',\r
+selectall_desc : 'Seleccionar todo'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/paste/langs/fi.js b/webcit/tiny_mce/plugins/paste/langs/fi.js
new file mode 100644 (file)
index 0000000..49c373e
--- /dev/null
@@ -0,0 +1,10 @@
+// FI lang variables by Tuomo Aura, Ateco.fi\r
+\r
+tinyMCE.addToLang('',{\r
+paste_text_desc : 'Liit&auml; tavallisena tekstin&auml;',\r
+paste_text_title : 'Paina CTRL+V liitt&auml;&auml;ksesi leikkaamasi/kopioimasi tekstin ikkunaan.',\r
+paste_text_linebreaks : 'S&auml;ilyt&auml; rivinvaihdot',\r
+paste_word_desc : 'Liit&auml; Wordista',\r
+paste_word_title : 'Paina CTRL+V liitt&auml;&auml;ksesi leikkaamasi/kopioimasi tekstin ikkunaan.',\r
+selectall_desc : 'Valitse kaikki'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/paste/langs/fr.js b/webcit/tiny_mce/plugins/paste/langs/fr.js
new file mode 100644 (file)
index 0000000..3406ea6
--- /dev/null
@@ -0,0 +1,10 @@
+// Traduit par Normand Lamoureux le 2005-11-12\r
+\r
+tinyMCE.addToLang('',{\r
+paste_text_desc : 'Coller comme du texte',\r
+paste_text_title : 'Faites CTRL+V pour coller le texte dans la fenêtre.',\r
+paste_text_linebreaks : 'Conserver les retours à la ligne',\r
+paste_word_desc : 'Coller depuis Word',\r
+paste_word_title : 'Faites CTRL+V pour coller le texte dans la fenêtre.',\r
+selectall_desc : 'Sélectionner tout'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/paste/langs/fr_ca.js b/webcit/tiny_mce/plugins/paste/langs/fr_ca.js
new file mode 100644 (file)
index 0000000..14d611d
--- /dev/null
@@ -0,0 +1,10 @@
+// Canadian French lang variables by Virtuelcom   last modification: 2005-06-15\r
+\r
+tinyMCE.addToLang('',{\r
+paste_text_desc : 'Coller texte seulement',\r
+paste_text_title : 'Utilisez CTRL+V sur votre clavier pour coller le texte dans la fenêtre.',\r
+paste_text_linebreaks : 'Garder les sauts de ligne',\r
+paste_word_desc : 'Coller à partir de Word',\r
+paste_word_title : 'Utilisez CTRL+V sur votre clavier pour coller le texte dans la fenêtre.',\r
+selectall_desc : 'Selectionner tout'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/paste/langs/he.js b/webcit/tiny_mce/plugins/paste/langs/he.js
new file mode 100644 (file)
index 0000000..d660e43
--- /dev/null
@@ -0,0 +1,10 @@
+// HE lang variables by Liron Newman, http://eesh.net\r
+\r
+tinyMCE.addToLang('',{\r
+paste_text_desc : 'äãá÷ ëè÷ñè øâéì',\r
+paste_text_title : 'äùúîù á-CTRL+V ùòì äî÷ìãú ùìê ëãé ìäãáé÷ àú äè÷ñè ìçìåï.',\r
+paste_text_linebreaks : 'ùîåø òì îòáøé ùåøä',\r
+paste_word_desc : 'äãá÷ î-Word',\r
+paste_word_title : 'äùúîù á-CTRL+V ùòì äî÷ìãú ùìê ëãé ìäãáé÷ àú äè÷ñè ìçìåï.',\r
+selectall_desc : 'áçø äëì'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/paste/langs/hu.js b/webcit/tiny_mce/plugins/paste/langs/hu.js
new file mode 100644 (file)
index 0000000..09d6f82
--- /dev/null
@@ -0,0 +1,10 @@
+// HU lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+paste_text_desc : 'Beillesztés sima szövegként',\r
+paste_text_title : 'Használd a CTRL+V -t a billentyûzeten a szöveg beillesztéséhez az ablakba.',\r
+paste_text_linebreaks : 'Keep linebreaks',\r
+paste_word_desc : 'Beillesztés Word-bõl',\r
+paste_word_title : 'Használd a CTRL+V -t a billentyûzeten a szöveg beillesztéséhez az ablakba.',\r
+selectall_desc : 'Mindet kijelöl'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/paste/langs/is.js b/webcit/tiny_mce/plugins/paste/langs/is.js
new file mode 100644 (file)
index 0000000..28c5403
--- /dev/null
@@ -0,0 +1,10 @@
+// Iceland lang variables by Johannes Birgir Jensson\r
+\r
+tinyMCE.addToLang('',{\r
+paste_text_desc : 'Skeyta texta eing&ouml;ngu',\r
+paste_text_title : 'Notaðu CTRL+V á lyklaborðinu til að skeyta textanum í gluggann.',\r
+paste_text_linebreaks : 'Halda l&iacute;nubilum',\r
+paste_word_desc : 'Skeyta &uacute;r Word',\r
+paste_word_title : 'Notaðu CTRL+V á lyklaborðinu til að skeyta textanum í gluggann.',\r
+selectall_desc : 'Velja allt'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/paste/langs/nb.js b/webcit/tiny_mce/plugins/paste/langs/nb.js
new file mode 100644 (file)
index 0000000..446aeae
--- /dev/null
@@ -0,0 +1,10 @@
+// nb = Norwegian (bokm&aring;l) lang variables by Knut B. Jacobsen\r
+\r
+tinyMCE.addToLang('',{\r
+paste_text_desc : 'Lim inn som vanlig tekst',\r
+paste_text_title : 'Bruk CTRL+V p&aring; tastaturet ditt for &aring; lime inn i dette vinduet.',\r
+paste_text_linebreaks : 'Spar linjebrudd',\r
+paste_word_desc : 'Lim inn fra Office (Word)',\r
+paste_word_title : 'Bruk CTRL+V p&aring; tastaturet ditt for &aring; lime inn i dette vinduet.',\r
+selectall_desc : 'Velg alt'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/paste/langs/nl.js b/webcit/tiny_mce/plugins/paste/langs/nl.js
new file mode 100644 (file)
index 0000000..642e012
--- /dev/null
@@ -0,0 +1,10 @@
+// NL lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+paste_text_desc : 'Plakken als platte tekst',\r
+paste_text_title : 'Gebruik CTRL+V op uw toetsenbord om de tekst in het venster te plakken.',\r
+paste_text_linebreaks : 'Behoud regeleinden',\r
+paste_word_desc : 'Plakken uit Word',\r
+paste_word_title : 'Gebruik CTRL+V op uw toetsenbord om de tekst in het venster te plakken.',\r
+selectall_desc : 'Alles selecteren'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/paste/langs/nn.js b/webcit/tiny_mce/plugins/paste/langs/nn.js
new file mode 100644 (file)
index 0000000..9084597
--- /dev/null
@@ -0,0 +1,10 @@
+// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen\r
+\r
+tinyMCE.addToLang('',{\r
+paste_text_desc : 'Lim inn som vanleg tekst',\r
+paste_text_title : 'Bruk CTRL+V p&aring; tastaturet ditt for &aring; lime inn i dette vindauget.',\r
+paste_text_linebreaks : 'Spar linjebrudd',\r
+paste_word_desc : 'Lim inn frå Office (Word)',\r
+paste_word_title : 'Bruk CTRL+V p&aring; tastaturet ditt for &aring; lime inn i dette vindauget.',\r
+selectall_desc : 'Velg alt'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/paste/langs/pl.js b/webcit/tiny_mce/plugins/paste/langs/pl.js
new file mode 100644 (file)
index 0000000..65e0cda
--- /dev/null
@@ -0,0 +1,12 @@
+// PL lang variables\r
+// fixed by Wooya\r
+// http://www.mfusion.prv.pl\r
+\r
+tinyMCE.addToLang('',{\r
+paste_text_desc : 'Wklej jako czysty tekst',\r
+paste_text_title : 'U¿yj CTRL+V na klawiaturze, aby wkleiæ tekst do okna.',\r
+paste_text_linebreaks : 'Zachowaj ³amanie linii',\r
+paste_word_desc : 'Wklej z Worda',\r
+paste_word_title : 'U¿yj CTRL+V na klawiaturze, aby wkleiæ tekst do okna.',\r
+selectall_desc : 'Zaznacz wszystko'\r
+});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/paste/langs/pt_br.js b/webcit/tiny_mce/plugins/paste/langs/pt_br.js
new file mode 100644 (file)
index 0000000..bf77746
--- /dev/null
@@ -0,0 +1,17 @@
+/**\r
+ * pt_br lang variables\r
+ * Brazilian Portuguese\r
+ *\r
+ * Authors :\r
+ *           Marcio Barbosa (mpg) <mpg@mpg.com.br>\r
+ * Last Updated : November 26, 2005\r
+ * TinyMCE Version : 2.0RC4\r
+ */\r
+tinyMCE.addToLang('',{\r
+paste_text_desc : 'Colar um texto simples',\r
+paste_text_title : 'Use CTRL+V no seu teclado para colar o texto dentro da janela.',\r
+paste_text_linebreaks : 'Manter quebras de linha',\r
+paste_word_desc : 'Colar do Word',\r
+paste_word_title : 'Use CTRL+V no seu teclado para colar o texto dentro da janela.',\r
+selectall_desc : 'Selecionar tudo'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/paste/langs/ru.js b/webcit/tiny_mce/plugins/paste/langs/ru.js
new file mode 100644 (file)
index 0000000..c720cb6
--- /dev/null
@@ -0,0 +1,10 @@
+// RU cp1251 lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+paste_text_desc : 'Âñòàâèòü êàê ïðîñòîé òåêñò',\r
+paste_text_title : 'Èñïîëüçóéòå CTRL+V äëÿ âñòàâêè òåêñòà â îêîøêî.',\r
+paste_text_linebreaks : 'Ñîõðàíèòü ïåðåíîñû ñòðîê',\r
+paste_word_desc : 'Âñòàâèòü èç Word',\r
+paste_word_title : 'Èñïîëüçóéòå CTRL+V äëÿ âñòàâêè òåêñòà â îêîøêî.',\r
+selectall_desc : 'Âûäåëèòü âñ¸'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/paste/langs/ru_KOI8-R.js b/webcit/tiny_mce/plugins/paste/langs/ru_KOI8-R.js
new file mode 100644 (file)
index 0000000..be75485
--- /dev/null
@@ -0,0 +1,10 @@
+// RU KOI8-R lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+paste_text_desc : '÷ÓÔÁ×ÉÔØ ËÁË ÐÒÏÓÔÏÊ ÔÅËÓÔ',\r
+paste_text_title : 'éÓÐÏÌØÚÕÊÔÅ CTRL+V ÄÌÑ ×ÓÔÁ×ËÉ ÔÅËÓÔÁ × ÏËÏÛËÏ.',\r
+paste_text_linebreaks : 'óÏÈÒÁÎÉÔØ ÐÅÒÅÎÏÓÙ ÓÔÒÏË',\r
+paste_word_desc : '÷ÓÔÁ×ÉÔØ ÉÚ Word',\r
+paste_word_title : 'éÓÐÏÌØÚÕÊÔÅ CTRL+V ÄÌÑ ×ÓÔÁ×ËÉ ÔÅËÓÔÁ × ÏËÏÛËÏ.',\r
+selectall_desc : '÷ÙÄÅÌÉÔØ ×Ó£'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/paste/langs/ru_UTF-8.js b/webcit/tiny_mce/plugins/paste/langs/ru_UTF-8.js
new file mode 100644 (file)
index 0000000..c5dc2cf
--- /dev/null
@@ -0,0 +1,10 @@
+// RU UTF-8 lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+paste_text_desc : 'Вставить как простой текст',\r
+paste_text_title : 'Используйте CTRL+V для вставки текста в окошко.',\r
+paste_text_linebreaks : 'Сохранить переносы строк',\r
+paste_word_desc : 'Вставить из Word',\r
+paste_word_title : 'Используйте CTRL+V для вставки текста в окошко.',\r
+selectall_desc : 'Выделить всё'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/paste/langs/sk.js b/webcit/tiny_mce/plugins/paste/langs/sk.js
new file mode 100644 (file)
index 0000000..a92ee19
--- /dev/null
@@ -0,0 +1,18 @@
+/**\r
+ * Slovak lang variables \r
+ * encoding: utf-8\r
+ * \r
+ * @author Vladimir VASIL vvasil@post.sk\r
+ *    \r
+ * $Id: sk.js,v 1.1 2005/11/22 20:56:44 spocke Exp $ \r
+ */  \r
+\r
+tinyMCE.addToLang('',{\r
+paste_text_desc : 'Vložiť neformatovaný text',\r
+paste_text_title : 'Použi CTRL + V na klávesnici pre vloženie textu do okna.',\r
+paste_text_linebreaks : 'Nechaj prerušenie riadkov',\r
+paste_word_desc : 'Vložiť text s aplikáce Word',\r
+paste_word_title : 'Použi CTRL + V na klávesnici pre vloženie textu do okna.',\r
+selectall_desc : 'Označiť všetko'\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/paste/langs/sv.js b/webcit/tiny_mce/plugins/paste/langs/sv.js
new file mode 100644 (file)
index 0000000..c005c94
--- /dev/null
@@ -0,0 +1,10 @@
+// SV lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+paste_text_desc : 'Klistra in som vanlig text',\r
+paste_text_title : 'Anv&auml;nd CTRL+V p&aring; ditt tangentbord f&ouml;r att klistra in i detta f&ouml;nster.',\r
+paste_text_linebreaks : 'Spara radbrytningar',\r
+paste_word_desc : 'Klistra in fr&aring;n Word',\r
+paste_word_title : 'Anv&auml;nd CTRL+V p&aring; ditt tangentbord f&ouml;r att klistra in i detta f&ouml;nster.',\r
+selectall_desc : 'Select All'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/paste/langs/zh_cn.js b/webcit/tiny_mce/plugins/paste/langs/zh_cn.js
new file mode 100644 (file)
index 0000000..0c2bb0f
--- /dev/null
@@ -0,0 +1,10 @@
+// Simplified Chinese lang variables contributed by tom_cat (thomaswangyang@gmail.com)\r
+\r
+tinyMCE.addToLang('',{\r
+paste_text_desc : '×÷Ϊ´¿Îı¾Õ³Ìù',\r
+paste_text_title : 'ʹÓÿì½Ý¼ü CTRL+V ½«Îı¾±¾Õ³Ìùµ½ÒÔÏ´°¿ÚÖÐ',\r
+paste_text_linebreaks : '±£Áô»»Ðзû',\r
+paste_word_desc : '´ÓWordÕ³Ìù',\r
+paste_word_title : 'ʹÓÿì½Ý¼ü CTRL+V ½«Îı¾Õ³Ìùµ½ÒÔÏ´°¿Ú',\r
+selectall_desc : 'ȫѡ'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/paste/langs/zh_tw.js b/webcit/tiny_mce/plugins/paste/langs/zh_tw.js
new file mode 100644 (file)
index 0000000..ecbcc7b
--- /dev/null
@@ -0,0 +1,11 @@
+// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// ÁcÅ餤¤å BIG-5 ¡F¼Æ¦ìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com\r
+\r
+tinyMCE.addToLang('',{\r
+paste_text_desc : '±Ä¯Â¤å¦r¼Ò¦¡¶K¤W',\r
+paste_text_title : '¨Ï¥ÎÁä½L¤Wªº CTRL+V ²Õ¦XÁä±N¤å¦r¶K¤J§@·~°Ï¤¤',\r
+paste_text_linebreaks : '«O¯d´«¦æ²Å¸¹',\r
+paste_word_desc : '¦Û Word ¤ºÂà¶K',\r
+paste_word_title : '¨Ï¥ÎÁä½L¤Wªº CTRL+V ²Õ¦XÁä±N¤å¦r¶K¤J§@·~°Ï¤¤',\r
+selectall_desc : '¥þ¿ï'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/paste/langs/zh_tw_utf8.js b/webcit/tiny_mce/plugins/paste/langs/zh_tw_utf8.js
new file mode 100644 (file)
index 0000000..04b60d5
--- /dev/null
@@ -0,0 +1,11 @@
+// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// 繁體中文 UTF-8 ;數位應用坊製作; twapweb_AT_gmail_DOT_com\r
+\r
+tinyMCE.addToLang('',{\r
+paste_text_desc : '採純文字模式貼上',\r
+paste_text_title : '使用鍵盤上的 CTRL+V 組合鍵將文字貼入作業區中',\r
+paste_text_linebreaks : '保留換行符號',\r
+paste_word_desc : '自 Word 內轉貼',\r
+paste_word_title : '使用鍵盤上的 CTRL+V 組合鍵將文字貼入作業區中',\r
+selectall_desc : '全選'\r
+});\r
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..63ff000
--- /dev/null
@@ -0,0 +1,34 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_paste_text_desc}</title>\r
+       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/pastetext.js"></script>\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('onLoadInit();');" onresize="resizeInputs();" style="display: none">\r
+<form name="source" onsubmit="saveContent();">\r
+       <div style="float: left" class="title">{$lang_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">{$lang_paste_text_linebreaks}</label>\r
+       </div>\r
+\r
+       <br style="clear: both" />\r
+\r
+       <div>{$lang_paste_text_title}</div>\r
+\r
+       <textarea name="htmlSource" id="htmlSource" rows="15" cols="100" style="width: 100%; height: 100%; font-family: 'Courier New',Courier,mono; font-size: 12px;" dir="ltr" wrap="soft"></textarea>\r
+\r
+       <div class="mceActionPanel">\r
+               <div style="float: left">\r
+                       <input type="button" name="insert" value="{$lang_insert}" onclick="saveContent();" id="insert" />\r
+               </div>\r
+\r
+               <div style="float: right">\r
+                       <input type="button" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" id="cancel" />\r
+               </div>\r
+       </div>\r
+</form>\r
+</body> \r
+</html>
\ 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..7acc7f7
--- /dev/null
@@ -0,0 +1,29 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />\r
+       <title>{$lang_paste_word_desc}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/pasteword.js"></script>\r
+       <link href="css/pasteword.css" rel="stylesheet" type="text/css" />\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('onLoadInit();');" onresize="resizeInputs();" style="display: none">\r
+       <form name="source" onsubmit="saveContent();" action="#">\r
+               <div class="title">{$lang_paste_word_desc}</div>\r
+\r
+               <div>{$lang_paste_word_title}</div>\r
+\r
+               <div id="iframecontainer"></div>\r
+\r
+               <div class="mceActionPanel">\r
+                       <div style="float: left">\r
+                               <input type="button" id="insert" name="insert" value="{$lang_insert}" onclick="saveContent();" />\r
+                       </div>\r
+\r
+                       <div style="float: right">\r
+                               <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+                       </div>\r
+               </div>\r
+       </form>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/plugins/paste/readme.txt b/webcit/tiny_mce/plugins/paste/readme.txt
new file mode 100644 (file)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/webcit/tiny_mce/plugins/preview/editor_plugin.js b/webcit/tiny_mce/plugins/preview/editor_plugin.js
new file mode 100644 (file)
index 0000000..caa9945
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.importPluginLanguagePack('preview','cs,de,el,en,fr_ca,it,ko,pt,sv,zh_cn,fa,fr,pl,pt_br,nl,da,he,nb,hu,ru,ru_KOI8-R,ru_UTF-8,nn,es,cy,is,zh_tw,zh_tw_utf8,sk');function TinyMCE_preview_getInfo(){return{longname:'Preview',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_preview.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_preview_getControlHTML(control_name){switch(control_name){case "preview":var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mcePreview\');return false;';return '<a href="javascript:'+cmd+'" onclick="'+cmd+'" target="_self" onmousedown="return false;"><img id="{$editor_id}_preview" src="{$pluginurl}/images/preview.gif" title="{$lang_preview_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';}return "";}function TinyMCE_preview_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mcePreview":var previewPage=tinyMCE.getParam("plugin_preview_pageurl",null);var previewWidth=tinyMCE.getParam("plugin_preview_width","550");var previewHeight=tinyMCE.getParam("plugin_preview_height","600");if(previewPage){var template=new Array();template['file']=previewPage;template['width']=previewWidth;template['height']=previewHeight;tinyMCE.openWindow(template,{editor_id:editor_id,resizable:"yes",scrollbars:"yes",inline:"yes",content:tinyMCE.getContent(),content_css:tinyMCE.getParam("content_css")});}else{var win=window.open("","mcePreview","menubar=no,toolbar=no,scrollbars=yes,resizable=yes,left=20,top=20,width="+previewWidth+",height="+previewHeight);var html="";html+=tinyMCE.getParam('doctype');html+='<html xmlns="http://www.w3.org/1999/xhtml">';html+='<head>';html+='<title>'+tinyMCE.getLang('lang_preview_desc')+'</title>';html+='<base href="'+tinyMCE.getParam("document_base_url")+'">';html+='<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">';html+='<link href="'+tinyMCE.getParam("content_css")+'" rel="stylesheet" type="text/css">';html+='</head>';html+='<body>';html+=tinyMCE.getContent();html+='</body>';html+='</html>';win.document.write(html);win.document.close();}return true;}return false;}
\ 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..028b2f6
--- /dev/null
@@ -0,0 +1,72 @@
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('preview', 'cs,de,el,en,fr_ca,it,ko,pt,sv,zh_cn,fa,fr,pl,pt_br,nl,da,he,nb,hu,ru,ru_KOI8-R,ru_UTF-8,nn,es,cy,is,zh_tw,zh_tw_utf8,sk');\r
+\r
+function TinyMCE_preview_getInfo() {\r
+       return {\r
+               longname : 'Preview',\r
+               author : 'Moxiecode Systems',\r
+               authorurl : 'http://tinymce.moxiecode.com',\r
+               infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_preview.html',\r
+               version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+       };\r
+};\r
+\r
+/**\r
+ * Returns the HTML contents of the preview control.\r
+ */\r
+function TinyMCE_preview_getControlHTML(control_name) {\r
+       switch (control_name) {\r
+               case "preview":\r
+                       var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mcePreview\');return false;';\r
+                       return '<a href="javascript:' + cmd + '" onclick="' + cmd + '" target="_self" onmousedown="return false;"><img id="{$editor_id}_preview" src="{$pluginurl}/images/preview.gif" title="{$lang_preview_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';\r
+       }\r
+\r
+       return "";\r
+}\r
+\r
+/**\r
+ * Executes the mcePreview command.\r
+ */\r
+function TinyMCE_preview_execCommand(editor_id, element, command, user_interface, value) {\r
+       // Handle commands\r
+       switch (command) {\r
+               case "mcePreview":\r
+                       var previewPage = tinyMCE.getParam("plugin_preview_pageurl", null);\r
+                       var previewWidth = tinyMCE.getParam("plugin_preview_width", "550");\r
+                       var previewHeight = tinyMCE.getParam("plugin_preview_height", "600");\r
+\r
+                       // Use a custom preview page\r
+                       if (previewPage) {\r
+                               var template = new Array();\r
+\r
+                               template['file'] = previewPage;\r
+                               template['width'] = previewWidth;\r
+                               template['height'] = previewHeight;\r
+\r
+                               tinyMCE.openWindow(template, {editor_id : editor_id, resizable : "yes", scrollbars : "yes", inline : "yes", content : tinyMCE.getContent(), content_css : tinyMCE.getParam("content_css")});\r
+                       } else {\r
+                               var win = window.open("", "mcePreview", "menubar=no,toolbar=no,scrollbars=yes,resizable=yes,left=20,top=20,width=" + previewWidth + ",height="  + previewHeight);\r
+                               var html = "";\r
+\r
+                               html += tinyMCE.getParam('doctype');\r
+                               html += '<html xmlns="http://www.w3.org/1999/xhtml">';\r
+                               html += '<head>';\r
+                               html += '<title>' + tinyMCE.getLang('lang_preview_desc') + '</title>';\r
+                               html += '<base href="' + tinyMCE.getParam("document_base_url") + '">';\r
+                               html += '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">';\r
+                               html += '<link href="' + tinyMCE.getParam("content_css") + '" rel="stylesheet" type="text/css">';\r
+                               html += '</head>';\r
+                               html += '<body>';\r
+                               html += tinyMCE.getContent();\r
+                               html += '</body>';\r
+                               html += '</html>';\r
+\r
+                               win.document.write(html);\r
+                               win.document.close();\r
+                       }\r
+\r
+                       return true;\r
+       }\r
+\r
+       return false;\r
+}\r
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..19ebead
--- /dev/null
@@ -0,0 +1,13 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+<script language="javascript" src="../../tiny_mce_popup.js"></script>\r
+<title>Example of a custom preview page</title>\r
+<link href="{$content_css}" rel="stylesheet" type="text/css" />\r
+</head>\r
+<body>\r
+\r
+Editor contents: <br />\r
+{$content}\r
+\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/plugins/preview/images/preview.gif b/webcit/tiny_mce/plugins/preview/images/preview.gif
new file mode 100644 (file)
index 0000000..318936e
Binary files /dev/null and b/webcit/tiny_mce/plugins/preview/images/preview.gif differ
diff --git a/webcit/tiny_mce/plugins/preview/langs/cs.js b/webcit/tiny_mce/plugins/preview/langs/cs.js
new file mode 100644 (file)
index 0000000..3cd7d4e
--- /dev/null
@@ -0,0 +1,11 @@
+/**\r
+ * Czech lang variables \r
+ * encoding: utf-8\r
+ *  \r
+ * $Id: cs.js,v 1.4 2005/10/18 13:59:43 spocke Exp $ \r
+ */  \r
+\r
+tinyMCE.addToLang('',{\r
+preview_desc : 'Náhled'\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/preview/langs/cy.js b/webcit/tiny_mce/plugins/preview/langs/cy.js
new file mode 100644 (file)
index 0000000..01d4201
--- /dev/null
@@ -0,0 +1,5 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+preview_desc : 'Rhagolwg'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/preview/langs/da.js b/webcit/tiny_mce/plugins/preview/langs/da.js
new file mode 100644 (file)
index 0000000..07b7662
--- /dev/null
@@ -0,0 +1,5 @@
+// DK lang variables contributed by Jan Moelgaard\r
+\r
+tinyMCE.addToLang('',{\r
+preview_desc : 'Se siden'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/preview/langs/de.js b/webcit/tiny_mce/plugins/preview/langs/de.js
new file mode 100644 (file)
index 0000000..c8bc6b1
--- /dev/null
@@ -0,0 +1,5 @@
+// DE lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+preview_desc : 'Vorschau'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/preview/langs/el.js b/webcit/tiny_mce/plugins/preview/langs/el.js
new file mode 100644 (file)
index 0000000..6e5f8ae
--- /dev/null
@@ -0,0 +1,5 @@
+// Greek lang variables by Jacaranda Bill\r
+\r
+tinyMCE.addToLang('',{\r
+preview_desc : 'Ðñï&aring;ðéóêüðçóç éóôïó&aring;ëß&auml;áò'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/preview/langs/en.js b/webcit/tiny_mce/plugins/preview/langs/en.js
new file mode 100644 (file)
index 0000000..b68b675
--- /dev/null
@@ -0,0 +1,5 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+preview_desc : 'Preview'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/preview/langs/es.js b/webcit/tiny_mce/plugins/preview/langs/es.js
new file mode 100644 (file)
index 0000000..a305521
--- /dev/null
@@ -0,0 +1,7 @@
+// ES lang variables by Alvaro Velasco and Adolfo Sanz De Diego (asanzdiego) <asanzdiego@yahoo.es>\r
+// Last Updated : October 2005\r
+// TinyMCE Version : 2.0RC3\r
+\r
+tinyMCE.addToLang('',{\r
+preview_desc : 'Vista previa'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/preview/langs/fa.js b/webcit/tiny_mce/plugins/preview/langs/fa.js
new file mode 100644 (file)
index 0000000..d9a9658
--- /dev/null
@@ -0,0 +1,10 @@
+// IR lang variables\r
+// Persian (Farsi) language pack (for IRAN)\r
+// By: Morteza Zafari\r
+// Lost@LostLord.com\r
+// http://www.LostLord.com\r
+\r
+tinyMCE.addToLang('',{\r
+dir : 'rtl',\r
+preview_desc : '??? ?????'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/preview/langs/fr.js b/webcit/tiny_mce/plugins/preview/langs/fr.js
new file mode 100644 (file)
index 0000000..ac8675a
--- /dev/null
@@ -0,0 +1,6 @@
+// French lang variables by Laurent Dran\r
+// Modifié par Normand Lamoureux le 2005-11-12\r
+\r
+tinyMCE.addToLang('',{\r
+preview_desc : 'Prévisualisation'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/preview/langs/fr_ca.js b/webcit/tiny_mce/plugins/preview/langs/fr_ca.js
new file mode 100644 (file)
index 0000000..1f687d6
--- /dev/null
@@ -0,0 +1,5 @@
+// Canadian French lang variables by Virtuelcom   last modification: 2005-06-15\r
+\r
+tinyMCE.addToLang('',{\r
+preview_desc : 'Prévisualisation'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/preview/langs/he.js b/webcit/tiny_mce/plugins/preview/langs/he.js
new file mode 100644 (file)
index 0000000..6fd7262
--- /dev/null
@@ -0,0 +1,5 @@
+// HE lang variables by Liron Newman, http://eesh.net\r
+\r
+tinyMCE.addToLang('',{\r
+preview_desc : 'úöåâä î÷ãéîä'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/preview/langs/hu.js b/webcit/tiny_mce/plugins/preview/langs/hu.js
new file mode 100644 (file)
index 0000000..94e83b9
--- /dev/null
@@ -0,0 +1,5 @@
+// HU lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+preview_desc : 'Elõnézet'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/preview/langs/is.js b/webcit/tiny_mce/plugins/preview/langs/is.js
new file mode 100644 (file)
index 0000000..d20b485
--- /dev/null
@@ -0,0 +1,5 @@
+// Iceland lang variables by Johannes Birgir Jensson\r
+\r
+tinyMCE.addToLang('',{\r
+preview_desc : 'Forsko&eth;a'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/preview/langs/it.js b/webcit/tiny_mce/plugins/preview/langs/it.js
new file mode 100644 (file)
index 0000000..f63d430
--- /dev/null
@@ -0,0 +1,5 @@
+// IT lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+preview_desc : 'Anteprima'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/preview/langs/ko.js b/webcit/tiny_mce/plugins/preview/langs/ko.js
new file mode 100644 (file)
index 0000000..2759a08
--- /dev/null
@@ -0,0 +1,5 @@
+// KO lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+preview_desc : '¹Ì¸®º¸±â'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/preview/langs/nb.js b/webcit/tiny_mce/plugins/preview/langs/nb.js
new file mode 100644 (file)
index 0000000..231f1ba
--- /dev/null
@@ -0,0 +1,5 @@
+// nb = Norwegian (bokm&aring;l) lang variables by Knut B. Jacobsen\r
+\r
+tinyMCE.addToLang('',{\r
+preview_desc : 'Forh&aring;ndsvisning'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/preview/langs/nl.js b/webcit/tiny_mce/plugins/preview/langs/nl.js
new file mode 100644 (file)
index 0000000..ec66d32
--- /dev/null
@@ -0,0 +1,5 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+preview_desc : 'Voorbeeld'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/preview/langs/nn.js b/webcit/tiny_mce/plugins/preview/langs/nn.js
new file mode 100644 (file)
index 0000000..e273a27
--- /dev/null
@@ -0,0 +1,5 @@
+// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen\r
+\r
+tinyMCE.addToLang('',{\r
+preview_desc : 'Forh&aring;ndsvisning'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/preview/langs/pl.js b/webcit/tiny_mce/plugins/preview/langs/pl.js
new file mode 100644 (file)
index 0000000..2e3f901
--- /dev/null
@@ -0,0 +1,7 @@
+// PL lang variables\r
+// fixed by Wooya\r
+// http://www.musion.prv.pl\r
+\r
+tinyMCE.addToLang('',{\r
+preview_desc : 'Podgl±d'\r
+});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/preview/langs/pt.js b/webcit/tiny_mce/plugins/preview/langs/pt.js
new file mode 100644 (file)
index 0000000..6256c47
--- /dev/null
@@ -0,0 +1,5 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+preview_desc : 'Pré-visualização'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/preview/langs/pt_br.js b/webcit/tiny_mce/plugins/preview/langs/pt_br.js
new file mode 100644 (file)
index 0000000..3cbf430
--- /dev/null
@@ -0,0 +1,13 @@
+/**\r
+ * pt_br lang variables\r
+ * Brazilian Portuguese\r
+ *\r
+ * Authors : ????\r
+ * Revision and modifications:\r
+ *           Marcio Barbosa (mpg) <mpg@mpg.com.br>\r
+ * Last Updated : November 26, 2005\r
+ * TinyMCE Version : 2.0RC4\r
+ */\r
+tinyMCE.addToLang('',{\r
+preview_desc : 'Visualizar'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/preview/langs/ru.js b/webcit/tiny_mce/plugins/preview/langs/ru.js
new file mode 100644 (file)
index 0000000..994bb57
--- /dev/null
@@ -0,0 +1,5 @@
+// RU lang variables cp1251\r
+\r
+tinyMCE.addToLang('',{\r
+preview_desc : 'Ïðåäâàðèòåëüíûé ïðîñìîòð'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/preview/langs/ru_KOI8-R.js b/webcit/tiny_mce/plugins/preview/langs/ru_KOI8-R.js
new file mode 100644 (file)
index 0000000..5de38b6
--- /dev/null
@@ -0,0 +1,5 @@
+// RU lang variables KOI8-R\r
+\r
+tinyMCE.addToLang('',{\r
+preview_desc : 'ðÒÅÄ×ÁÒÉÔÅÌØÎÙÊ ÐÒÏÓÍÏÔÒ'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/preview/langs/ru_UTF-8.js b/webcit/tiny_mce/plugins/preview/langs/ru_UTF-8.js
new file mode 100644 (file)
index 0000000..dda8c81
--- /dev/null
@@ -0,0 +1,5 @@
+// RU lang variables UTF-8\r
+\r
+tinyMCE.addToLang('',{\r
+preview_desc : 'Предварительный просмотр'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/preview/langs/sk.js b/webcit/tiny_mce/plugins/preview/langs/sk.js
new file mode 100644 (file)
index 0000000..7a1971f
--- /dev/null
@@ -0,0 +1,13 @@
+/**\r
+ * Slovak lang variables \r
+ * encoding: utf-8\r
+ * \r
+ * @author Vladimir VASIL vvasil@post.sk\r
+ *    \r
+ * $Id: sk.js,v 1.1 2005/11/22 20:56:44 spocke Exp $ \r
+ */  \r
+\r
+tinyMCE.addToLang('',{\r
+preview_desc : 'Náhľad'\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/preview/langs/sv.js b/webcit/tiny_mce/plugins/preview/langs/sv.js
new file mode 100644 (file)
index 0000000..cb2bbf8
--- /dev/null
@@ -0,0 +1,5 @@
+// SE lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+preview_desc : 'F&ouml;rhandsgranska'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/preview/langs/zh_cn.js b/webcit/tiny_mce/plugins/preview/langs/zh_cn.js
new file mode 100644 (file)
index 0000000..b5b6d06
--- /dev/null
@@ -0,0 +1,5 @@
+// Simplified Chinese lang variables contributed by cube316 (cube316@etang.com)\r
+\r
+tinyMCE.addToLang('',{\r
+preview_desc : 'Ô¤ÀÀ'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/preview/langs/zh_tw.js b/webcit/tiny_mce/plugins/preview/langs/zh_tw.js
new file mode 100644 (file)
index 0000000..f15e551
--- /dev/null
@@ -0,0 +1,6 @@
+// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// ÁcÅ餤¤å BIG-5 ¡F¼Æ¦ìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com\r
+\r
+tinyMCE.addToLang('',{\r
+preview_desc : '¹wÄý'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/preview/langs/zh_tw_utf8.js b/webcit/tiny_mce/plugins/preview/langs/zh_tw_utf8.js
new file mode 100644 (file)
index 0000000..9d5e737
--- /dev/null
@@ -0,0 +1,6 @@
+// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// 繁體中文 UTF-8 ;數位應用坊製作; twapweb_AT_gmail_DOT_com\r
+\r
+tinyMCE.addToLang('',{\r
+preview_desc : '預覽'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/preview/readme.txt b/webcit/tiny_mce/plugins/preview/readme.txt
new file mode 100644 (file)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/webcit/tiny_mce/plugins/print/editor_plugin.js b/webcit/tiny_mce/plugins/print/editor_plugin.js
new file mode 100644 (file)
index 0000000..4f565e5
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.importPluginLanguagePack('print','en,sv,zh_cn,fa,fr_ca,fr,de,pl,pt_br,cs,nl,da,he,nb,hu,ru,ru_KOI8-R,ru_UTF-8,nn,fi,es,cy,is,zh_tw,zh_tw_utf8,sk');function TinyMCE_print_getInfo(){return{longname:'Print',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_print.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_print_getControlHTML(control_name){switch(control_name){case "print":var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mcePrint\',true);return false;';return '<a href="javascript:'+cmd+'" onclick="'+cmd+'" target="_self" onmousedown="return false;"><img id="{$editor_id}_print" src="{$pluginurl}/images/print.gif" title="{$lang_print_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';}return "";}function TinyMCE_print_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mcePrint":tinyMCE.getInstanceById(editor_id).contentWindow.print();return true;}return false;}
\ 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..d2188cd
--- /dev/null
@@ -0,0 +1,37 @@
+/* Import theme        specific language pack */\r
+tinyMCE.importPluginLanguagePack('print', 'en,sv,zh_cn,fa,fr_ca,fr,de,pl,pt_br,cs,nl,da,he,nb,hu,ru,ru_KOI8-R,ru_UTF-8,nn,fi,es,cy,is,zh_tw,zh_tw_utf8,sk');\r
+\r
+function TinyMCE_print_getInfo() {\r
+       return {\r
+               longname : 'Print',\r
+               author : 'Moxiecode Systems',\r
+               authorurl : 'http://tinymce.moxiecode.com',\r
+               infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_print.html',\r
+               version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+       };\r
+};\r
+\r
+function TinyMCE_print_getControlHTML(control_name)    {\r
+       switch (control_name) {\r
+               case "print":\r
+                       var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mcePrint\',true);return false;';\r
+                       return '<a href="javascript:' + cmd + '" onclick="' + cmd + '" target="_self" onmousedown="return false;"><img id="{$editor_id}_print" src="{$pluginurl}/images/print.gif" title="{$lang_print_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';\r
+       }\r
+\r
+       return "";\r
+}\r
+\r
+/**\r
+ * Executes    the     search/replace commands.\r
+ */\r
+function TinyMCE_print_execCommand(editor_id, element, command,        user_interface, value) {\r
+       // Handle commands\r
+       switch (command) {\r
+               case "mcePrint":\r
+                       tinyMCE.getInstanceById(editor_id).contentWindow.print();\r
+                       return true;\r
+       }\r
+\r
+       // Pass to next handler in chain\r
+       return false;\r
+}\r
diff --git a/webcit/tiny_mce/plugins/print/images/print.gif b/webcit/tiny_mce/plugins/print/images/print.gif
new file mode 100644 (file)
index 0000000..72104d1
Binary files /dev/null and b/webcit/tiny_mce/plugins/print/images/print.gif differ
diff --git a/webcit/tiny_mce/plugins/print/langs/cs.js b/webcit/tiny_mce/plugins/print/langs/cs.js
new file mode 100644 (file)
index 0000000..8365e71
--- /dev/null
@@ -0,0 +1,11 @@
+/**\r
+ * Czech lang variables \r
+ * encoding: utf-8\r
+ *  \r
+ * $Id: cs.js,v 1.4 2005/10/18 13:59:43 spocke Exp $ \r
+ */  \r
+\r
+tinyMCE.addToLang('',{\r
+print_desc : 'Tisk'\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/print/langs/cy.js b/webcit/tiny_mce/plugins/print/langs/cy.js
new file mode 100644 (file)
index 0000000..ea0a8d0
--- /dev/null
@@ -0,0 +1,5 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+print_desc : 'Argraffu'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/print/langs/da.js b/webcit/tiny_mce/plugins/print/langs/da.js
new file mode 100644 (file)
index 0000000..3427fe7
--- /dev/null
@@ -0,0 +1,5 @@
+// DK lang variables contributed by Jan Moelgaard\r
+\r
+tinyMCE.addToLang('',{\r
+print_desc : 'Udskriv'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/print/langs/de.js b/webcit/tiny_mce/plugins/print/langs/de.js
new file mode 100644 (file)
index 0000000..163f19d
--- /dev/null
@@ -0,0 +1,5 @@
+// DE lang variables \r
+\r
+tinyMCE.addToLang('',{\r
+print_desc : 'Drucken'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/print/langs/en.js b/webcit/tiny_mce/plugins/print/langs/en.js
new file mode 100644 (file)
index 0000000..6407cdb
--- /dev/null
@@ -0,0 +1,5 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+print_desc : 'Print'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/print/langs/es.js b/webcit/tiny_mce/plugins/print/langs/es.js
new file mode 100644 (file)
index 0000000..273784e
--- /dev/null
@@ -0,0 +1,7 @@
+// ES lang variables by Alvaro Velasco and Adolfo Sanz De Diego (asanzdiego) <asanzdiego@yahoo.es>\r
+// Last Updated : October 2005\r
+// TinyMCE Version : 2.0RC3\r
+\r
+tinyMCE.addToLang('',{\r
+print_desc : 'Imprimir'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/print/langs/fa.js b/webcit/tiny_mce/plugins/print/langs/fa.js
new file mode 100644 (file)
index 0000000..81e6df0
--- /dev/null
@@ -0,0 +1,10 @@
+// IR lang variables\r
+// Persian (Farsi) language pack (for IRAN)\r
+// By: Morteza Zafari\r
+// Lost@LostLord.com\r
+// http://www.LostLord.com\r
+\r
+tinyMCE.addToLang('',{\r
+dir : 'rtl',\r
+print_desc : '???'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/print/langs/fi.js b/webcit/tiny_mce/plugins/print/langs/fi.js
new file mode 100644 (file)
index 0000000..e97d9ab
--- /dev/null
@@ -0,0 +1,5 @@
+// FI lang variables by Tuomo Aura, Ateco.fi\r
+\r
+tinyMCE.addToLang('',{\r
+print_desc : 'Tulosta'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/print/langs/fr.js b/webcit/tiny_mce/plugins/print/langs/fr.js
new file mode 100644 (file)
index 0000000..9979dc6
--- /dev/null
@@ -0,0 +1,5 @@
+// French lang variables by Laurent Dran\r
+\r
+tinyMCE.addToLang('',{\r
+print_desc : 'Imprimer'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/print/langs/fr_ca.js b/webcit/tiny_mce/plugins/print/langs/fr_ca.js
new file mode 100644 (file)
index 0000000..c98cc74
--- /dev/null
@@ -0,0 +1,5 @@
+// Canadian French lang variables by Virtuelcom   last modification: 2005-06-15\r
+\r
+tinyMCE.addToLang('',{\r
+print_desc : 'Imprimer'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/print/langs/he.js b/webcit/tiny_mce/plugins/print/langs/he.js
new file mode 100644 (file)
index 0000000..de55f38
--- /dev/null
@@ -0,0 +1,5 @@
+// HE lang variables by Liron Newman, http://eesh.net\r
+\r
+tinyMCE.addToLang('',{\r
+print_desc : 'äãôñ'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/print/langs/hu.js b/webcit/tiny_mce/plugins/print/langs/hu.js
new file mode 100644 (file)
index 0000000..8e1ec6a
--- /dev/null
@@ -0,0 +1,5 @@
+// HU lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+print_desc : 'Nyomtatás'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/print/langs/is.js b/webcit/tiny_mce/plugins/print/langs/is.js
new file mode 100644 (file)
index 0000000..df67cae
--- /dev/null
@@ -0,0 +1,5 @@
+// Iceland lang variables by Johannes Birgir Jensson\r
+\r
+tinyMCE.addToLang('',{\r
+print_desc : 'Prenta'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/print/langs/nb.js b/webcit/tiny_mce/plugins/print/langs/nb.js
new file mode 100644 (file)
index 0000000..e2dba3b
--- /dev/null
@@ -0,0 +1,5 @@
+// nb = Norwegian (bokm&aring;l) lang variables by Knut B. Jacobsen\r
+\r
+tinyMCE.addToLang('',{\r
+print_desc : 'Skriv ut'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/print/langs/nl.js b/webcit/tiny_mce/plugins/print/langs/nl.js
new file mode 100644 (file)
index 0000000..7b12025
--- /dev/null
@@ -0,0 +1,5 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+print_desc : 'Afdrukken'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/print/langs/nn.js b/webcit/tiny_mce/plugins/print/langs/nn.js
new file mode 100644 (file)
index 0000000..4e2fdec
--- /dev/null
@@ -0,0 +1,5 @@
+// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen\r
+\r
+tinyMCE.addToLang('',{\r
+print_desc : 'Skriv ut'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/print/langs/pl.js b/webcit/tiny_mce/plugins/print/langs/pl.js
new file mode 100644 (file)
index 0000000..d13f09c
--- /dev/null
@@ -0,0 +1,5 @@
+// PL lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+print_desc : 'Drukuj'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/print/langs/pt_br.js b/webcit/tiny_mce/plugins/print/langs/pt_br.js
new file mode 100644 (file)
index 0000000..28052e4
--- /dev/null
@@ -0,0 +1,13 @@
+/**\r
+ * pt_br lang variables\r
+ * Brazilian Portuguese\r
+ *\r
+ * Authors : ????\r
+ * Revision and modifications:\r
+ *           Marcio Barbosa (mpg) <mpg@mpg.com.br>\r
+ * Last Updated : November 26, 2005\r
+ * TinyMCE Version : 2.0RC4\r
+ */\r
+tinyMCE.addToLang('',{\r
+print_desc : 'Imprimir'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/print/langs/ru.js b/webcit/tiny_mce/plugins/print/langs/ru.js
new file mode 100644 (file)
index 0000000..edc826b
--- /dev/null
@@ -0,0 +1,5 @@
+// RU lang variables cp1251\r
+\r
+tinyMCE.addToLang('',{\r
+print_desc : 'Ðàñïå÷àòàòü'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/print/langs/ru_KOI8-R.js b/webcit/tiny_mce/plugins/print/langs/ru_KOI8-R.js
new file mode 100644 (file)
index 0000000..038375c
--- /dev/null
@@ -0,0 +1,5 @@
+// RU lang variables KOI8-R\r
+\r
+tinyMCE.addToLang('',{\r
+print_desc : 'òÁÓÐÅÞÁÔÁÔØ'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/print/langs/ru_UTF-8.js b/webcit/tiny_mce/plugins/print/langs/ru_UTF-8.js
new file mode 100644 (file)
index 0000000..a7185f8
--- /dev/null
@@ -0,0 +1,5 @@
+// RU lang variables UTF-8\r
+\r
+tinyMCE.addToLang('',{\r
+print_desc : 'Распечатать'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/print/langs/sk.js b/webcit/tiny_mce/plugins/print/langs/sk.js
new file mode 100644 (file)
index 0000000..9954763
--- /dev/null
@@ -0,0 +1,13 @@
+/**\r
+ * Slovak lang variables \r
+ * encoding: utf-8\r
+ * \r
+ * @author Vladimir VASIL vvasil@post.sk\r
+ *    \r
+ * $Id: sk.js,v 1.1 2005/11/22 20:56:44 spocke Exp $ \r
+ */  \r
+\r
+tinyMCE.addToLang('',{\r
+print_desc : 'Tlač'\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/print/langs/sv.js b/webcit/tiny_mce/plugins/print/langs/sv.js
new file mode 100644 (file)
index 0000000..3448437
--- /dev/null
@@ -0,0 +1,5 @@
+// SE lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+print_desc : 'Skriv ut'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/print/langs/zh_cn.js b/webcit/tiny_mce/plugins/print/langs/zh_cn.js
new file mode 100644 (file)
index 0000000..957512c
--- /dev/null
@@ -0,0 +1,6 @@
+// Simplified Chinese lang variables contributed by cube316 (cube316@gmail.com)\r
+//Çë·ÃÎÊ http://www.cube316.net/ ÒÔ»ñÈ¡TinyMCEµ&Auml;&Ouml;ÐÎ&Auml;&Ouml;§³&Ouml;\r
+\r
+tinyMCE.addToLang('',{\r
+print_desc : '´òÓ¡'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/print/langs/zh_tw.js b/webcit/tiny_mce/plugins/print/langs/zh_tw.js
new file mode 100644 (file)
index 0000000..6dc26a6
--- /dev/null
@@ -0,0 +1,6 @@
+// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// ÁcÅ餤¤å BIG-5 ¡F¼Æ¦ìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com\r
+\r
+tinyMCE.addToLang('',{\r
+print_desc : '¦C¦L'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/print/langs/zh_tw_utf8.js b/webcit/tiny_mce/plugins/print/langs/zh_tw_utf8.js
new file mode 100644 (file)
index 0000000..c0615a7
--- /dev/null
@@ -0,0 +1,6 @@
+// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// 繁體中文 UTF-8 ;數位應用坊製作; twapweb_AT_gmail_DOT_com\r
+\r
+tinyMCE.addToLang('',{\r
+print_desc : '列印'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/print/readme.txt b/webcit/tiny_mce/plugins/print/readme.txt
new file mode 100644 (file)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/webcit/tiny_mce/plugins/readme.txt b/webcit/tiny_mce/plugins/readme.txt
new file mode 100644 (file)
index 0000000..b694fdb
--- /dev/null
@@ -0,0 +1 @@
+This is the location you place TinyMCE plugins.\r
diff --git a/webcit/tiny_mce/plugins/save/editor_plugin.js b/webcit/tiny_mce/plugins/save/editor_plugin.js
new file mode 100644 (file)
index 0000000..6115379
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.importPluginLanguagePack('save','en,sv,zh_cn,cs,fa,fr_ca,fr,de,pl,pt_br,nl,he,nb,hu,ru,ru_KOI8-R,ru_UTF-8,nn,fi,da,es,cy,is,zh_tw,zh_tw_utf8,sk');function TinyMCE_save_getInfo(){return{longname:'Save',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_save.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_save_getControlHTML(control_name){switch(control_name){case "save":var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceSave\');return false;';return '<a href="javascript:'+cmd+'" onclick="'+cmd+'" target="_self" onmousedown="return false;"><img id="{$editor_id}_save" src="{$pluginurl}/images/save.gif" title="{$lang_save_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.switchClass(this,\'mceButtonNormal\');" onmousedown="tinyMCE.switchClass(this,\'mceButtonDown\');" /></a>';}return "";}function TinyMCE_save_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mceSave":var formObj=tinyMCE.selectedInstance.formElement.form;if(formObj){tinyMCE.triggerSave();for(var i=0;i<formObj.elements.length;i++){var elementId=formObj.elements[i].name?formObj.elements[i].name:formObj.elements[i].id;if(elementId.indexOf('mce_editor_')==0)formObj.elements[i].disabled=true;}tinyMCE.isNotDirty=true;if(formObj.onsubmit==null||formObj.onsubmit()!=false)tinyMCE.selectedInstance.formElement.form.submit();}else alert("Error: No form element found.");return true;}return false;}
\ 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..5eab60f
--- /dev/null
@@ -0,0 +1,58 @@
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('save', 'en,sv,zh_cn,cs,fa,fr_ca,fr,de,pl,pt_br,nl,he,nb,hu,ru,ru_KOI8-R,ru_UTF-8,nn,fi,da,es,cy,is,zh_tw,zh_tw_utf8,sk');\r
+\r
+function TinyMCE_save_getInfo() {\r
+       return {\r
+               longname : 'Save',\r
+               author : 'Moxiecode Systems',\r
+               authorurl : 'http://tinymce.moxiecode.com',\r
+               infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_save.html',\r
+               version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+       };\r
+};\r
+\r
+/**\r
+ * Returns the HTML contents of the save control.\r
+ */\r
+function TinyMCE_save_getControlHTML(control_name) {\r
+       switch (control_name) {\r
+               case "save":\r
+                       var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceSave\');return false;';\r
+                       return '<a href="javascript:' + cmd + '" onclick="' + cmd + '" target="_self" onmousedown="return false;"><img id="{$editor_id}_save" src="{$pluginurl}/images/save.gif" title="{$lang_save_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.switchClass(this,\'mceButtonNormal\');" onmousedown="tinyMCE.switchClass(this,\'mceButtonDown\');" /></a>';\r
+       }\r
+\r
+       return "";\r
+}\r
+\r
+/**\r
+ * Executes the save command.\r
+ */\r
+function TinyMCE_save_execCommand(editor_id, element, command, user_interface, value) {\r
+       // Handle commands\r
+       switch (command) {\r
+               case "mceSave":\r
+                       var formObj = tinyMCE.selectedInstance.formElement.form;\r
+\r
+                       if (formObj) {\r
+                               tinyMCE.triggerSave();\r
+\r
+                               // Disable all UI form elements that TinyMCE created\r
+                               for (var i=0; i<formObj.elements.length; i++) {\r
+                                       var elementId = formObj.elements[i].name ? formObj.elements[i].name : formObj.elements[i].id;\r
+\r
+                                       if (elementId.indexOf('mce_editor_') == 0)\r
+                                               formObj.elements[i].disabled = true;\r
+                               }\r
+\r
+                               tinyMCE.isNotDirty = true;\r
+\r
+                               if (formObj.onsubmit == null || formObj.onsubmit() != false)\r
+                                       tinyMCE.selectedInstance.formElement.form.submit();\r
+                       } else\r
+                               alert("Error: No form element found.");\r
+\r
+                       return true;\r
+       }\r
+       // Pass to next handler in chain\r
+       return false;\r
+}
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/save/images/save.gif b/webcit/tiny_mce/plugins/save/images/save.gif
new file mode 100644 (file)
index 0000000..2777beb
Binary files /dev/null and b/webcit/tiny_mce/plugins/save/images/save.gif differ
diff --git a/webcit/tiny_mce/plugins/save/langs/cs.js b/webcit/tiny_mce/plugins/save/langs/cs.js
new file mode 100644 (file)
index 0000000..0f7d2b5
--- /dev/null
@@ -0,0 +1,11 @@
+/**\r
+ * Czech lang variables \r
+ * encoding: utf-8\r
+ *  \r
+ * $Id: cs.js,v 1.4 2005/10/18 13:59:43 spocke Exp $ \r
+ */  \r
+\r
+tinyMCE.addToLang('',{\r
+save_desc : 'Uložit'\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/save/langs/cy.js b/webcit/tiny_mce/plugins/save/langs/cy.js
new file mode 100644 (file)
index 0000000..9bb3cdc
--- /dev/null
@@ -0,0 +1,5 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+save_desc : 'Cadw'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/save/langs/da.js b/webcit/tiny_mce/plugins/save/langs/da.js
new file mode 100644 (file)
index 0000000..a0bad1f
--- /dev/null
@@ -0,0 +1,5 @@
+// DK lang variables contributed by Jan Moelgaard\r
+\r
+tinyMCE.addToLang('',{\r
+save_desc : 'Gem'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/save/langs/de.js b/webcit/tiny_mce/plugins/save/langs/de.js
new file mode 100644 (file)
index 0000000..b109797
--- /dev/null
@@ -0,0 +1,5 @@
+// DE lang variables \r
+\r
+tinyMCE.addToLang('',{\r
+save_desc : 'Speichern'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/save/langs/en.js b/webcit/tiny_mce/plugins/save/langs/en.js
new file mode 100644 (file)
index 0000000..2c56b4b
--- /dev/null
@@ -0,0 +1,5 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+save_desc : 'Save'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/save/langs/es.js b/webcit/tiny_mce/plugins/save/langs/es.js
new file mode 100644 (file)
index 0000000..42d76af
--- /dev/null
@@ -0,0 +1,7 @@
+// ES lang variables by Alvaro Velasco and Adolfo Sanz De Diego (asanzdiego) <asanzdiego@yahoo.es>\r
+// Last Updated : October 2005\r
+// TinyMCE Version : 2.0RC3\r
+\r
+tinyMCE.addToLang('',{\r
+save_desc : 'Salvar'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/save/langs/fa.js b/webcit/tiny_mce/plugins/save/langs/fa.js
new file mode 100644 (file)
index 0000000..e99e436
--- /dev/null
@@ -0,0 +1,11 @@
+// IR lang variables\r
+// Persian (Farsi) language pack (for IRAN)\r
+// By: Morteza Zafari\r
+// Lost@LostLord.com\r
+// http://www.LostLord.com\r
+\r
+tinyMCE.addToLang('',{\r
+dir : 'rtl',\r
+save_desc : '???'\r
+});\r
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/save/langs/fi.js b/webcit/tiny_mce/plugins/save/langs/fi.js
new file mode 100644 (file)
index 0000000..fbffbe3
--- /dev/null
@@ -0,0 +1,5 @@
+// FI lang variables by Tuomo Aura, Ateco.fi\r
+\r
+tinyMCE.addToLang('',{\r
+save_desc : 'Tallenna'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/save/langs/fr.js b/webcit/tiny_mce/plugins/save/langs/fr.js
new file mode 100644 (file)
index 0000000..2043345
--- /dev/null
@@ -0,0 +1,6 @@
+// French lang variables by Laurent Dran\r
+// Modifié par Normand Lamoureux le 2005-11-12\r
+\r
+tinyMCE.addToLang('',{\r
+save_desc : 'Enregistrer'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/save/langs/fr_ca.js b/webcit/tiny_mce/plugins/save/langs/fr_ca.js
new file mode 100644 (file)
index 0000000..4d6e912
--- /dev/null
@@ -0,0 +1,6 @@
+// Canadian French lang variables by Virtuelcom   last modification: 2005-06-15\r
+\r
+tinyMCE.addToLang('',{\r
+save_desc : 'Enregistrer'\r
+});\r
+, 
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/save/langs/he.js b/webcit/tiny_mce/plugins/save/langs/he.js
new file mode 100644 (file)
index 0000000..fb08bb8
--- /dev/null
@@ -0,0 +1,5 @@
+// HE lang variables by Liron Newman, http://eesh.net\r
+\r
+tinyMCE.addToLang('',{\r
+save_desc : 'ùîåø'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/save/langs/hu.js b/webcit/tiny_mce/plugins/save/langs/hu.js
new file mode 100644 (file)
index 0000000..54b152a
--- /dev/null
@@ -0,0 +1,5 @@
+// HU lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+save_desc : 'Mentés'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/save/langs/is.js b/webcit/tiny_mce/plugins/save/langs/is.js
new file mode 100644 (file)
index 0000000..21ae8ce
--- /dev/null
@@ -0,0 +1,5 @@
+// Iceland lang variables by Johannes Birgir Jensson\r
+\r
+tinyMCE.addToLang('',{\r
+save_desc : 'Vista'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/save/langs/nb.js b/webcit/tiny_mce/plugins/save/langs/nb.js
new file mode 100644 (file)
index 0000000..c599d94
--- /dev/null
@@ -0,0 +1,5 @@
+// nb = Norwegian (bokm&aring;l) lang variables by Knut B. Jacobsen\r
+\r
+tinyMCE.addToLang('save',{\r
+desc : 'Lagre'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/save/langs/nl.js b/webcit/tiny_mce/plugins/save/langs/nl.js
new file mode 100644 (file)
index 0000000..7368988
--- /dev/null
@@ -0,0 +1,5 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+save_desc : 'Opslaan'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/save/langs/nn.js b/webcit/tiny_mce/plugins/save/langs/nn.js
new file mode 100644 (file)
index 0000000..b6bc7ec
--- /dev/null
@@ -0,0 +1,5 @@
+// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen\r
+\r
+tinyMCE.addToLang('save',{\r
+desc : 'Lagre'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/save/langs/pl.js b/webcit/tiny_mce/plugins/save/langs/pl.js
new file mode 100644 (file)
index 0000000..96c1a7f
--- /dev/null
@@ -0,0 +1,5 @@
+// PL lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+save_desc : 'Zachowaj'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/save/langs/pt_br.js b/webcit/tiny_mce/plugins/save/langs/pt_br.js
new file mode 100644 (file)
index 0000000..c96f558
--- /dev/null
@@ -0,0 +1,13 @@
+/**\r
+ * pt_br lang variables\r
+ * Brazilian Portuguese\r
+ *\r
+ * Authors : ????\r
+ * Revision and modifications:\r
+ *           Marcio Barbosa (mpg) <mpg@mpg.com.br>\r
+ * Last Updated : November 26, 2005\r
+ * TinyMCE Version : 2.0RC4\r
+ */\r
+tinyMCE.addToLang('',{\r
+save_desc : 'Salvar'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/save/langs/ru.js b/webcit/tiny_mce/plugins/save/langs/ru.js
new file mode 100644 (file)
index 0000000..c3f2c97
--- /dev/null
@@ -0,0 +1,5 @@
+// RU lang variables cp1251\r
+\r
+tinyMCE.addToLang('',{\r
+save_desc : 'Ñîõðàíèòü'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/save/langs/ru_KOI8-R.js b/webcit/tiny_mce/plugins/save/langs/ru_KOI8-R.js
new file mode 100644 (file)
index 0000000..fbd0459
--- /dev/null
@@ -0,0 +1,5 @@
+// RU lang variables KOI8-R\r
+\r
+tinyMCE.addToLang('',{\r
+save_desc : 'óÏÈÒÁÎÉÔØ'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/save/langs/ru_UTF-8.js b/webcit/tiny_mce/plugins/save/langs/ru_UTF-8.js
new file mode 100644 (file)
index 0000000..67600d7
--- /dev/null
@@ -0,0 +1,5 @@
+// RU lang variables UTF-8\r
+\r
+tinyMCE.addToLang('',{\r
+save_desc : 'Сохранить'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/save/langs/sk.js b/webcit/tiny_mce/plugins/save/langs/sk.js
new file mode 100644 (file)
index 0000000..7218863
--- /dev/null
@@ -0,0 +1,13 @@
+/**\r
+ * Slovak lang variables \r
+ * encoding: utf-8\r
+ * \r
+ * @author Vladimir VASIL vvasil@post.sk\r
+ *    \r
+ * $Id: sk.js,v 1.1 2005/11/22 20:56:44 spocke Exp $ \r
+ */  \r
+\r
+tinyMCE.addToLang('',{\r
+save_desc : 'Uložiť'\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/save/langs/sv.js b/webcit/tiny_mce/plugins/save/langs/sv.js
new file mode 100644 (file)
index 0000000..3ddfb1f
--- /dev/null
@@ -0,0 +1,5 @@
+// SV lang variables\r
+\r
+tinyMCE.addToLang('save',{\r
+desc : 'Spara'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/save/langs/zh_cn.js b/webcit/tiny_mce/plugins/save/langs/zh_cn.js
new file mode 100644 (file)
index 0000000..e71cb85
--- /dev/null
@@ -0,0 +1,7 @@
+// Simplified Chinese lang variables contributed by cube316 (cube316@gmail.com)\r
+//Çë·ÃÎÊ http://www.cube316.net/ ÒÔ»ñÈ¡TinyMCEµ&Auml;&Ouml;ÐÎ&Auml;&Ouml;§³&Ouml;\r
+\r
+tinyMCE.addToLang('',{\r
+save_desc : '±£´æ'\r
+});\r
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/save/langs/zh_tw.js b/webcit/tiny_mce/plugins/save/langs/zh_tw.js
new file mode 100644 (file)
index 0000000..e7d9594
--- /dev/null
@@ -0,0 +1,6 @@
+// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// ÁcÅ餤¤å BIG-5 ¡F¼Æ¦ìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com\r
+\r
+tinyMCE.addToLang('',{\r
+save_desc : '¦sÀÉ'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/save/langs/zh_tw_utf8.js b/webcit/tiny_mce/plugins/save/langs/zh_tw_utf8.js
new file mode 100644 (file)
index 0000000..7a692a7
--- /dev/null
@@ -0,0 +1,6 @@
+// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// 繁體中文 UTF-8 ;數位應用坊製作; twapweb_AT_gmail_DOT_com\r
+\r
+tinyMCE.addToLang('',{\r
+save_desc : '存檔'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/save/readme.txt b/webcit/tiny_mce/plugins/save/readme.txt
new file mode 100644 (file)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/webcit/tiny_mce/plugins/searchreplace/editor_plugin.js b/webcit/tiny_mce/plugins/searchreplace/editor_plugin.js
new file mode 100644 (file)
index 0000000..9455116
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.importPluginLanguagePack('searchreplace','en,sv,zh_cn,fa,fr_ca,fr,de,pl,pt_br,cs,nl,da,he,nb,hu,ru,ru_KOI8-R,ru_UTF-8,nn,fi,cy,es,is,zh_tw,zh_tw_utf8,sk');function TinyMCE_searchreplace_getInfo(){return{longname:'Search/Replace',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_searchreplace.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_searchreplace_getControlHTML(control_name){switch(control_name){case "search":var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceSearch\',true);return false;';return '<a href="javascript:'+cmd+'" onclick="'+cmd+'" target="_self" onmousedown="return false;"><img id="{$editor_id}_search" src="{$pluginurl}/images/search.gif" title="{$lang_searchreplace_search_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';case "replace":var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceSearchReplace\',true);return false;';return '<a href="javascript:'+cmd+'" onclick="'+cmd+'" target="_self" onmousedown="return false;"><img id="{$editor_id}_replace" src="{$pluginurl}/images/replace.gif" title="{$lang_searchreplace_replace_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';}return "";}function TinyMCE_searchreplace_execCommand(editor_id,element,command,user_interface,value){function defValue(key,default_value){value[key]=typeof(value[key])=="undefined"?default_value:value[key];}function replaceSel(search_str,str){if(!tinyMCE.isMSIE){var sel=instance.contentWindow.getSelection();var rng=sel.getRangeAt(0);}else{var rng=instance.contentWindow.document.selection.createRange();}if(!tinyMCE.isMSIE){var doc=instance.contentWindow.document;if(str.indexOf(search_str)==-1){rng.deleteContents();rng.insertNode(rng.createContextualFragment(str));rng.collapse(false);}else{doc.execCommand("insertimage",false,"#mce_temp_url#");var elm=tinyMCE.getElementByAttributeValue(doc.body,"img","src","#mce_temp_url#");elm.parentNode.replaceChild(doc.createTextNode(str),elm);}}else{if(rng.item)rng.item(0).outerHTML=str;else rng.pasteHTML(str);}}var instance=tinyMCE.getInstanceById(editor_id);if(!value)value=new Array();defValue("editor_id",editor_id);defValue("searchstring","");defValue("replacestring",null);defValue("replacemode","none");defValue("casesensitive",false);defValue("backwards",false);defValue("wrap",false);defValue("wholeword",false);defValue("inline","yes");switch(command){case "mceResetSearch":tinyMCE.lastSearchRng=null;return true;case "mceSearch":if(user_interface){var template=new Array();if(value['replacestring']!=null){template['file']='../../plugins/searchreplace/replace.htm';template['width']=320;template['height']=120+(tinyMCE.isNS7?20:0);template['width']+=tinyMCE.getLang('lang_searchreplace_replace_delta_width',0);template['height']+=tinyMCE.getLang('lang_searchreplace_replace_delta_height',0);}else{template['file']='../../plugins/searchreplace/search.htm';template['width']=310;template['height']=105+(tinyMCE.isNS7?25:0);template['width']+=tinyMCE.getLang('lang_searchreplace_search_delta_width',0);template['height']+=tinyMCE.getLang('lang_searchreplace_replace_delta_height',0);}tinyMCE.openWindow(template,value);}else{var win=tinyMCE.getInstanceById(editor_id).contentWindow;var doc=tinyMCE.getInstanceById(editor_id).contentWindow.document;var body=tinyMCE.getInstanceById(editor_id).contentWindow.document.body;if(body.innerHTML==""){alert(tinyMCE.getLang('lang_searchreplace_notfound'));return true;}if(value['replacemode']=="current"){replaceSel(value['string'],value['replacestring']);value['replacemode']="none";tinyMCE.execInstanceCommand(editor_id,'mceSearch',user_interface,value,false);return true;}if(tinyMCE.isMSIE){var rng=tinyMCE.lastSearchRng?tinyMCE.lastSearchRng:doc.selection.createRange();var flags=0;if(value['wholeword'])flags=flags|2;if(value['casesensitive'])flags=flags|4;if(!rng.findText){alert('This operation is currently not supported by this browser.');return true;}if(value['replacemode']=="all"){while(rng.findText(value['string'],value['backwards']?-1:1,flags)){rng.scrollIntoView();rng.select();rng.collapse(false);replaceSel(value['string'],value['replacestring']);}alert(tinyMCE.getLang('lang_searchreplace_allreplaced'));return true;}if(rng.findText(value['string'],value['backwards']?-1:1,flags)){rng.scrollIntoView();rng.select();rng.collapse(value['backwards']);tinyMCE.lastSearchRng=rng;}else alert(tinyMCE.getLang('lang_searchreplace_notfound'));}else{if(value['replacemode']=="all"){while(win.find(value['string'],value['casesensitive'],value['backwards'],value['wrap'],value['wholeword'],false,false))replaceSel(value['string'],value['replacestring']);alert(tinyMCE.getLang('lang_searchreplace_allreplaced'));return true;}if(!win.find(value['string'],value['casesensitive'],value['backwards'],value['wrap'],value['wholeword'],false,false))alert(tinyMCE.getLang('lang_searchreplace_notfound'));}}return true;case "mceSearchReplace":value['replacestring']="";tinyMCE.execInstanceCommand(editor_id,'mceSearch',user_interface,value,false);return true;}return false;}function TinyMCE_searchreplace_handleNodeChange(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){return true;}
\ 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..7a7dde7
--- /dev/null
@@ -0,0 +1,195 @@
+/* Import theme        specific language pack */\r
+tinyMCE.importPluginLanguagePack('searchreplace', 'en,sv,zh_cn,fa,fr_ca,fr,de,pl,pt_br,cs,nl,da,he,nb,hu,ru,ru_KOI8-R,ru_UTF-8,nn,fi,cy,es,is,zh_tw,zh_tw_utf8,sk');\r
+\r
+function TinyMCE_searchreplace_getInfo() {\r
+       return {\r
+               longname : 'Search/Replace',\r
+               author : 'Moxiecode Systems',\r
+               authorurl : 'http://tinymce.moxiecode.com',\r
+               infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_searchreplace.html',\r
+               version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+       };\r
+};\r
+\r
+function TinyMCE_searchreplace_getControlHTML(control_name)    {\r
+       switch (control_name) {\r
+               case "search":\r
+                       var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceSearch\',true);return false;';\r
+                       return '<a href="javascript:' + cmd + '" onclick="' + cmd + '" target="_self" onmousedown="return false;"><img id="{$editor_id}_search" src="{$pluginurl}/images/search.gif" title="{$lang_searchreplace_search_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';\r
+\r
+               case "replace":\r
+                       var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceSearchReplace\',true);return false;';\r
+                       return '<a href="javascript:' + cmd + '" onclick="' + cmd + '" target="_self" onmousedown="return false;"><img id="{$editor_id}_replace" src="{$pluginurl}/images/replace.gif" title="{$lang_searchreplace_replace_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';\r
+       }\r
+\r
+       return "";\r
+}\r
+\r
+/**\r
+ * Executes    the     search/replace commands.\r
+ */\r
+function TinyMCE_searchreplace_execCommand(editor_id, element, command,        user_interface, value) {\r
+       function defValue(key, default_value) {\r
+               value[key] = typeof(value[key]) == "undefined" ? default_value : value[key];\r
+       }\r
+\r
+       function replaceSel(search_str, str) {\r
+               // Get current selection\r
+               if (!tinyMCE.isMSIE) {\r
+                       var sel = instance.contentWindow.getSelection();\r
+                       var rng = sel.getRangeAt(0);\r
+               } else {\r
+                       var rng = instance.contentWindow.document.selection.createRange();\r
+               }\r
+\r
+               // Replace current one\r
+               if (!tinyMCE.isMSIE) {\r
+                       var doc = instance.contentWindow.document;\r
+\r
+                       // This way works when the replace doesn't contain the search string\r
+                       if (str.indexOf(search_str) == -1) {\r
+                               rng.deleteContents();\r
+                               rng.insertNode(rng.createContextualFragment(str));\r
+                               rng.collapse(false);\r
+                       } else {\r
+                               // Insert content ugly way! Needed to move selection to after replace item\r
+                               doc.execCommand("insertimage", false, "#mce_temp_url#");\r
+                               var elm = tinyMCE.getElementByAttributeValue(doc.body, "img", "src", "#mce_temp_url#");\r
+                               elm.parentNode.replaceChild(doc.createTextNode(str), elm);\r
+                       }\r
+               } else {\r
+                       if (rng.item)\r
+                               rng.item(0).outerHTML = str;\r
+                       else\r
+                               rng.pasteHTML(str);\r
+               }\r
+       }\r
+\r
+       var instance = tinyMCE.getInstanceById(editor_id);\r
+\r
+       if (!value)\r
+               value = new Array();\r
+\r
+       // Setup defualt values\r
+       defValue("editor_id", editor_id);\r
+       defValue("searchstring", "");\r
+       defValue("replacestring", null);\r
+       defValue("replacemode", "none");\r
+       defValue("casesensitive", false);\r
+       defValue("backwards", false);\r
+       defValue("wrap", false);\r
+       defValue("wholeword", false);\r
+       defValue("inline", "yes");\r
+\r
+       // Handle commands\r
+       switch (command) {\r
+               case "mceResetSearch":\r
+                       tinyMCE.lastSearchRng = null;\r
+                       return true;\r
+\r
+               case "mceSearch":\r
+                       if (user_interface) {\r
+                               // Open search dialog\r
+                               var template = new Array();\r
+\r
+                               if (value['replacestring'] != null) {\r
+                                       template['file'] = '../../plugins/searchreplace/replace.htm'; // Relative to theme\r
+                                       template['width'] = 320;\r
+                                       template['height'] = 120 + (tinyMCE.isNS7 ? 20 : 0);\r
+                                       template['width'] += tinyMCE.getLang('lang_searchreplace_replace_delta_width', 0);\r
+                                       template['height'] += tinyMCE.getLang('lang_searchreplace_replace_delta_height', 0);\r
+                               } else {\r
+                                       template['file'] = '../../plugins/searchreplace/search.htm'; // Relative to theme\r
+                                       template['width'] = 310;\r
+                                       template['height'] = 105 + (tinyMCE.isNS7 ? 25 : 0);\r
+                                       template['width'] += tinyMCE.getLang('lang_searchreplace_search_delta_width', 0);\r
+                                       template['height'] += tinyMCE.getLang('lang_searchreplace_replace_delta_height', 0);\r
+                               }\r
+\r
+                               tinyMCE.openWindow(template, value);\r
+                       } else {\r
+                               var win = tinyMCE.getInstanceById(editor_id).contentWindow;\r
+                               var doc = tinyMCE.getInstanceById(editor_id).contentWindow.document;\r
+                               var body = tinyMCE.getInstanceById(editor_id).contentWindow.document.body;\r
+\r
+                               // Whats the point\r
+                               if (body.innerHTML == "") {\r
+                                       alert(tinyMCE.getLang('lang_searchreplace_notfound'));\r
+                                       return true;\r
+                               }\r
+\r
+                               // Handle replace current\r
+                               if (value['replacemode'] == "current") {\r
+                                       replaceSel(value['string'], value['replacestring']);\r
+\r
+                                       // Search next one\r
+                                       value['replacemode'] = "none";\r
+                                       tinyMCE.execInstanceCommand(editor_id, 'mceSearch', user_interface, value, false);\r
+\r
+                                       return true;\r
+                               }\r
+\r
+                               if (tinyMCE.isMSIE) {\r
+                                       var rng = tinyMCE.lastSearchRng ? tinyMCE.lastSearchRng : doc.selection.createRange();\r
+                                       var flags = 0;\r
+\r
+                                       if (value['wholeword'])\r
+                                               flags = flags | 2;\r
+\r
+                                       if (value['casesensitive'])\r
+                                               flags = flags | 4;\r
+\r
+                                       if (!rng.findText) {\r
+                                               alert('This operation is currently not supported by this browser.');\r
+                                               return true;\r
+                                       }\r
+\r
+                                       // Handle replace all mode\r
+                                       if (value['replacemode'] == "all") {\r
+                                               while (rng.findText(value['string'], value['backwards'] ? -1 : 1, flags)) {\r
+                                                       rng.scrollIntoView();\r
+                                                       rng.select();\r
+                                                       rng.collapse(false);\r
+                                                       replaceSel(value['string'], value['replacestring']);\r
+                                               }\r
+\r
+                                               alert(tinyMCE.getLang('lang_searchreplace_allreplaced'));\r
+                                               return true;\r
+                                       }\r
+\r
+                                       if (rng.findText(value['string'], value['backwards'] ? -1 : 1, flags)) {\r
+                                               rng.scrollIntoView();\r
+                                               rng.select();\r
+                                               rng.collapse(value['backwards']);\r
+                                               tinyMCE.lastSearchRng = rng;\r
+                                       } else\r
+                                               alert(tinyMCE.getLang('lang_searchreplace_notfound'));\r
+                               } else {\r
+                                       if (value['replacemode'] == "all") {\r
+                                               while (win.find(value['string'], value['casesensitive'], value['backwards'], value['wrap'], value['wholeword'], false, false))\r
+                                                       replaceSel(value['string'], value['replacestring']);\r
+\r
+                                               alert(tinyMCE.getLang('lang_searchreplace_allreplaced'));\r
+                                               return true;\r
+                                       }\r
+\r
+                                       if (!win.find(value['string'], value['casesensitive'], value['backwards'], value['wrap'], value['wholeword'], false, false))\r
+                                               alert(tinyMCE.getLang('lang_searchreplace_notfound'));\r
+                               }\r
+                       }\r
+                       return true;\r
+\r
+               case "mceSearchReplace":\r
+                       value['replacestring'] = "";\r
+\r
+                       tinyMCE.execInstanceCommand(editor_id, 'mceSearch', user_interface, value, false);\r
+                       return true;\r
+       }\r
+\r
+       // Pass to next handler in chain\r
+       return false;\r
+}\r
+\r
+function TinyMCE_searchreplace_handleNodeChange(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {\r
+       return true;\r
+}\r
diff --git a/webcit/tiny_mce/plugins/searchreplace/images/replace.gif b/webcit/tiny_mce/plugins/searchreplace/images/replace.gif
new file mode 100644 (file)
index 0000000..784c73e
Binary files /dev/null and b/webcit/tiny_mce/plugins/searchreplace/images/replace.gif differ
diff --git a/webcit/tiny_mce/plugins/searchreplace/images/search.gif b/webcit/tiny_mce/plugins/searchreplace/images/search.gif
new file mode 100644 (file)
index 0000000..cfe76b5
Binary files /dev/null and b/webcit/tiny_mce/plugins/searchreplace/images/search.gif differ
diff --git a/webcit/tiny_mce/plugins/searchreplace/jscripts/replace.js b/webcit/tiny_mce/plugins/searchreplace/jscripts/replace.js
new file mode 100644 (file)
index 0000000..ad3c549
--- /dev/null
@@ -0,0 +1,40 @@
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       var formObj = document.forms[0];\r
+\r
+       formObj.searchstring.value = tinyMCE.getWindowArg("searchstring");\r
+       formObj.replacestring.value = tinyMCE.getWindowArg("replacestring");\r
+       formObj.casesensitivebox.checked = tinyMCE.getWindowArg("casesensitive");\r
+       formObj.backwards[0].checked = tinyMCE.getWindowArg("backwards");\r
+       formObj.backwards[1].checked = !tinyMCE.getWindowArg("backwards");\r
+//             formObj.wrapatend.checked = tinyMCE.getWindowArg("wrap");\r
+//             formObj.wholeword.checked = tinyMCE.getWindowArg("wholeword");\r
+\r
+       tinyMCEPopup.execCommand("mceResetSearch", false, {dummy : ""}, false);\r
+}\r
+\r
+function searchNext(replacemode) {\r
+       var formObj = document.forms[0];\r
+\r
+       // Whats the point?\r
+       if (formObj.searchstring.value == "" || formObj.searchstring.value == formObj.replacestring.value)\r
+               return;\r
+\r
+       // Do search\r
+       tinyMCEPopup.execCommand('mceSearch', false, { \r
+               string : formObj.searchstring.value,\r
+               replacestring : formObj.replacestring.value,\r
+               replacemode : replacemode,\r
+               casesensitive : formObj.casesensitivebox.checked,\r
+               backwards : formObj.backwards[0].checked\r
+//                     wrap : formObj.wrapatend.checked,\r
+//                     wholeword : formObj.wholeword.checked\r
+               }, false);\r
+\r
+       window.focus();\r
+}\r
+\r
+function cancelAction() {\r
+       tinyMCEPopup.close();\r
+}\r
diff --git a/webcit/tiny_mce/plugins/searchreplace/jscripts/search.js b/webcit/tiny_mce/plugins/searchreplace/jscripts/search.js
new file mode 100644 (file)
index 0000000..5202fdc
--- /dev/null
@@ -0,0 +1,36 @@
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       var formObj = document.forms[0];\r
+\r
+       formObj.searchstring.value = tinyMCE.getWindowArg("searchstring");\r
+       formObj.casesensitivebox.checked = tinyMCE.getWindowArg("casesensitive");\r
+       formObj.backwards[0].checked = tinyMCE.getWindowArg("backwards");\r
+       formObj.backwards[1].checked = !tinyMCE.getWindowArg("backwards");\r
+//             formObj.wrapatend.checked = tinyMCE.getWindowArg("wrap");\r
+//             formObj.wholeword.checked = tinyMCE.getWindowArg("wholeword");\r
+\r
+       tinyMCEPopup.execCommand("mceResetSearch", false, {dummy : ""}, false);\r
+}\r
+\r
+function searchNext() {\r
+       var formObj = document.forms[0];\r
+\r
+       if (formObj.searchstring.value == "")\r
+               return;\r
+\r
+       // Do search\r
+       tinyMCEPopup.execCommand('mceSearch', false, { \r
+               string : formObj.searchstring.value,\r
+               casesensitive : formObj.casesensitivebox.checked,\r
+               backwards : formObj.backwards[0].checked\r
+//                     wrap : formObj.wrapatend.checked,\r
+//                     wholeword : formObj.wholeword.checked\r
+               }, false);\r
+\r
+       window.focus();\r
+}\r
+\r
+function cancelAction() {\r
+       tinyMCEPopup.close();\r
+}\r
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/cs.js b/webcit/tiny_mce/plugins/searchreplace/langs/cs.js
new file mode 100644 (file)
index 0000000..2034f11
--- /dev/null
@@ -0,0 +1,27 @@
+/**\r
+ * Czech lang variables \r
+ * encoding: utf-8\r
+ *  \r
+ * $Id: cs.js,v 1.4 2005/10/18 13:59:43 spocke Exp $ \r
+ */  \r
+\r
+tinyMCE.addToLang('',{\r
+searchreplace_search_desc : 'Najdi',\r
+searchreplace_searchnext_desc : 'Najdi znova',\r
+searchreplace_replace_desc : 'Najdi/Nahradit',\r
+searchreplace_notfound : 'Vyhledávaní ukončeno. Řetězec nemusel být nalezen.',\r
+searchreplace_search_title : 'Najdi',\r
+searchreplace_replace_title : 'Najdi/Nahradit',\r
+searchreplace_allreplaced : 'Všechny výskyty řetězce byly změněny.',\r
+searchreplace_findwhat : 'Najít',\r
+searchreplace_replacewith : 'Nahradit',\r
+searchreplace_direction : 'Směr',\r
+searchreplace_up : 'Nahoru',\r
+searchreplace_down : 'Dolů',\r
+searchreplace_case : 'Přesná shoda',\r
+searchreplace_findnext : 'Najdi&nbsp;další',\r
+searchreplace_replace : 'Nahradit',\r
+searchreplace_replaceall : 'Nahradit&nbsp;vše',\r
+searchreplace_cancel : 'Zrušit'\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/cy.js b/webcit/tiny_mce/plugins/searchreplace/langs/cy.js
new file mode 100644 (file)
index 0000000..05ba531
--- /dev/null
@@ -0,0 +1,22 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+searchreplace_search_desc : 'Canfod',\r
+searchreplace_searchnext_desc : 'Canfod eto',\r
+searchreplace_replace_desc : 'Canfod/Cyfnewid',\r
+searchreplace_notfound : 'Cwblhauwyd y chwilio. Methwyd dod o hyd i\'r testun canfod.',\r
+searchreplace_search_title : 'Canfod',\r
+searchreplace_replace_title : 'Canfod/Cyfnewid',\r
+searchreplace_allreplaced : 'Cyfnewidiwyd holl achosion y testun chwilio.',\r
+searchreplace_findwhat : 'Canfod beth',\r
+searchreplace_replacewith : 'Cyfnewid gyda',\r
+searchreplace_direction : 'Cyfeiriad',\r
+searchreplace_up : 'Fyny',\r
+searchreplace_down : 'Lawr',\r
+searchreplace_case : 'Maint llythrennau\'n bwysig',\r
+searchreplace_findnext : 'Canfod&nbsp;nesaf',\r
+searchreplace_replace : 'Cyfnewid',\r
+searchreplace_replaceall : 'Cyfnewid&nbsp;popeth',\r
+searchreplace_cancel : 'Diddymu',\r
+searchreplace_replace_delta_width : 75\r
+});\r
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/da.js b/webcit/tiny_mce/plugins/searchreplace/langs/da.js
new file mode 100644 (file)
index 0000000..4e9b3db
--- /dev/null
@@ -0,0 +1,21 @@
+// DK lang variables contributed by Jan Moelgaard\r
+\r
+tinyMCE.addToLang('',{\r
+searchreplace_search_desc : 'S&#248;g',\r
+searchreplace_searchnext_desc : 'S&#248;g igen',\r
+searchreplace_replace_desc : 'S&#248;g og erstat',\r
+searchreplace_notfound : 'S&#248;gningen er f&#230;rdig. S&#248;geudtrykket kunne ikke findes.',\r
+searchreplace_search_title : 'S&#248;g',\r
+searchreplace_replace_title : 'S&#248;g og erstat',\r
+searchreplace_allreplaced : 'Alle forekomster af s&#248;geudtrykket blev erstattet.',\r
+searchreplace_findwhat : 'Hvad skal vi s&#248;ge efter',\r
+searchreplace_replacewith : 'Erstat det med',\r
+searchreplace_direction : 'Retning',\r
+searchreplace_up : 'Op',\r
+searchreplace_down : 'Ned',\r
+searchreplace_case : 'Skelne mellem store og sm&#229; bogstaver',\r
+searchreplace_findnext : 'S&#248;g efter&nbsp;n&#230;ste',\r
+searchreplace_replace : 'Erstat',\r
+searchreplace_replaceall : 'Erstat&nbsp;alle',\r
+searchreplace_cancel : 'Fortryd'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/de.js b/webcit/tiny_mce/plugins/searchreplace/langs/de.js
new file mode 100644 (file)
index 0000000..379b177
--- /dev/null
@@ -0,0 +1,22 @@
+// DE lang variables \r
+\r
+tinyMCE.addToLang('',{\r
+searchreplace_search_desc : 'Suchen',\r
+searchreplace_searchnext_desc : 'Erneut suchen',\r
+searchreplace_replace_desc : 'Suchen/Ersetzen',\r
+searchreplace_notfound : 'Die Suche wurde abgeschlossen. Das Suchwort wurde nicht gefunden.',\r
+searchreplace_search_title : 'Suchen',\r
+searchreplace_replace_title : 'Suchen/Ersetzen',\r
+searchreplace_allreplaced : 'Die Suche wurde abgeschlossen. Alle Vorkommen wurden ersetzt.',\r
+searchreplace_findwhat : 'Suchen nach',\r
+searchreplace_replacewith : 'Ersetzen durch',\r
+searchreplace_direction : 'Suchrichtung',\r
+searchreplace_up : 'R&uuml;ckw&auml;rts',\r
+searchreplace_down : 'Vorw&auml;rts',\r
+searchreplace_case : 'Gro&szlig;-/Kleinschreibung beachten',\r
+searchreplace_findnext : 'Weitersuchen',\r
+searchreplace_replace : 'Ersetzen',\r
+searchreplace_replaceall : 'Alle ersetzen',\r
+searchreplace_cancel : 'Abbrechen',\r
+searchreplace_replace_delta_width : 50\r
+});\r
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/en.js b/webcit/tiny_mce/plugins/searchreplace/langs/en.js
new file mode 100644 (file)
index 0000000..8218e9c
--- /dev/null
@@ -0,0 +1,21 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+searchreplace_search_desc : 'Find',\r
+searchreplace_searchnext_desc : 'Find again',\r
+searchreplace_replace_desc : 'Find/Replace',\r
+searchreplace_notfound : 'The search has been compleated. The search string could not be found.',\r
+searchreplace_search_title : 'Find',\r
+searchreplace_replace_title : 'Find/Replace',\r
+searchreplace_allreplaced : 'All occurrences of the search string was replaced.',\r
+searchreplace_findwhat : 'Find what',\r
+searchreplace_replacewith : 'Replace with',\r
+searchreplace_direction : 'Direction',\r
+searchreplace_up : 'Up',\r
+searchreplace_down : 'Down',\r
+searchreplace_case : 'Match case',\r
+searchreplace_findnext : 'Find&nbsp;next',\r
+searchreplace_replace : 'Replace',\r
+searchreplace_replaceall : 'Replace&nbsp;all',\r
+searchreplace_cancel : 'Cancel'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/es.js b/webcit/tiny_mce/plugins/searchreplace/langs/es.js
new file mode 100644 (file)
index 0000000..f5b0211
--- /dev/null
@@ -0,0 +1,30 @@
+/**\r
+ * ES lang variables\r
+ * \r
+ * Authors : Alvaro Velasco,\r
+ *           Adolfo Sanz De Diego (asanzdiego) <asanzdiego@yahoo.es>,\r
+ *           Carlos C Soto (eclipxe) <csoto@sia-solutions.com>\r
+ * Last Updated : October 17, 2005\r
+ * TinyMCE Version : 2.0RC3\r
+ */\r
+\r
+tinyMCE.addToLang('',{\r
+searchreplace_search_desc : 'Buscar',\r
+searchreplace_searchnext_desc : 'Buscar de nuevo',\r
+searchreplace_replace_desc : 'Buscar/Replazar',\r
+searchreplace_notfound : 'La búsqueda ha terminado. No se ha encontrado el elemento buscado.',\r
+searchreplace_search_title : 'Buscar',\r
+searchreplace_replace_title : 'Buscar/Replazar',\r
+searchreplace_allreplaced : 'Todas las ocurrencias del elemento buscado han sido remplazadas.',\r
+searchreplace_findwhat : 'Buscar',\r
+searchreplace_replacewith : 'Replazar con',\r
+searchreplace_direction : 'Dirección',\r
+searchreplace_up : 'Arriba',\r
+searchreplace_down : 'Abajo',\r
+searchreplace_case : 'Búsqueda exacta (mayúsculas y minúsculas)',\r
+searchreplace_findnext : 'Buscar siguiente',\r
+searchreplace_replace : 'Replazar',\r
+searchreplace_replaceall : 'Replazar todo',\r
+searchreplace_cancel : 'Cancelar',\r
+searchreplace_replace_delta_width : 70\r
+});\r
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/fa.js b/webcit/tiny_mce/plugins/searchreplace/langs/fa.js
new file mode 100644 (file)
index 0000000..4aa5cc8
--- /dev/null
@@ -0,0 +1,26 @@
+// IR lang variables\r
+// Persian (Farsi) language pack (for IRAN)\r
+// By: Morteza Zafari\r
+// Lost@LostLord.com\r
+// http://www.LostLord.com\r
+\r
+tinyMCE.addToLang('',{\r
+dir : 'rtl',\r
+searchreplace_search_desc : '?????',\r
+searchreplace_searchnext_desc : '?????? ????',\r
+searchreplace_replace_desc : '?????/????????',\r
+searchreplace_notfound : '????? ????? ????. ??? ????? ???? ???.',\r
+searchreplace_search_title : '?????',\r
+searchreplace_replace_title : '?????/????????',\r
+searchreplace_allreplaced : '??? ????? ??????? ?????.',\r
+searchreplace_findwhat : '????? ?? ?????',\r
+searchreplace_replacewith : '???????? ??',\r
+searchreplace_direction : '??? ?????',\r
+searchreplace_up : '?? ??? ????',\r
+searchreplace_down : '?? ??? ?????',\r
+searchreplace_case : '????? ???? ???? ? ????',\r
+searchreplace_findnext : '????-????',\r
+searchreplace_replace : '???????-??',\r
+searchreplace_replaceall : '????????-???',\r
+searchreplace_cancel : '??????'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/fi.js b/webcit/tiny_mce/plugins/searchreplace/langs/fi.js
new file mode 100644 (file)
index 0000000..2462e3e
--- /dev/null
@@ -0,0 +1,21 @@
+// FI lang variables by Tuomo Aura, Ateco.fi\r
+\r
+tinyMCE.addToLang('',{\r
+searchreplace_search_desc : 'Etsi',\r
+searchreplace_searchnext_desc : 'Etsi uudelleen',\r
+searchreplace_replace_desc : 'Etsi/Korvaa',\r
+searchreplace_notfound : 'Haku on p&auml;&auml;ttynyt. Haettua merkkijonoa ei l&ouml;ytynyt.',\r
+searchreplace_search_title : 'Etsi',\r
+searchreplace_replace_title : 'Etsi/Korvaa',\r
+searchreplace_allreplaced : 'Kaikki esiintyneet hakutermit korvattiin.',\r
+searchreplace_findwhat : 'Etsitt&auml;v&auml;',\r
+searchreplace_replacewith : 'Korvaava',\r
+searchreplace_direction : 'Suunta',\r
+searchreplace_up : 'Yl&ouml;s',\r
+searchreplace_down : 'Alas',\r
+searchreplace_case : 'Sama kirjainkoko',\r
+searchreplace_findnext : 'Etsi&nbsp;seuraava',\r
+searchreplace_replace : 'Korvaa',\r
+searchreplace_replaceall : 'Korvaa&nbsp;kaikki',\r
+searchreplace_cancel : 'Peruuta'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/fr.js b/webcit/tiny_mce/plugins/searchreplace/langs/fr.js
new file mode 100644 (file)
index 0000000..2aa3d11
--- /dev/null
@@ -0,0 +1,22 @@
+// Franch lang variables by Laurent Dran\r
+// Modifié par Normand Lamoureux le 2005-11-12\r
+\r
+tinyMCE.addToLang('',{\r
+searchreplace_search_desc : 'Rehercher',\r
+searchreplace_searchnext_desc : 'Rehercher suivant',\r
+searchreplace_replace_desc : 'Rechercher/Remplacer',\r
+searchreplace_notfound : 'Recherche complétée. La fin du document a été atteinte.',\r
+searchreplace_search_title : 'Rechercher',\r
+searchreplace_replace_title : 'Rechercher/Remplacer',\r
+searchreplace_allreplaced : 'Action terminée avec succès. Les remplacements\nont été faits dans l\'ensemble du document.',\r
+searchreplace_findwhat : 'Trouver le mot',\r
+searchreplace_replacewith : 'Remplacer avec',\r
+searchreplace_direction : 'Direction',\r
+searchreplace_up : 'Vers le haut',\r
+searchreplace_down : 'Vers le bas',\r
+searchreplace_case : 'Respecter la casse',\r
+searchreplace_findnext : 'Suivant',\r
+searchreplace_replace : 'Remplacer',\r
+searchreplace_replaceall : 'Remplacer tout',\r
+searchreplace_cancel : 'Annuler'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/fr_ca.js b/webcit/tiny_mce/plugins/searchreplace/langs/fr_ca.js
new file mode 100644 (file)
index 0000000..09485ca
--- /dev/null
@@ -0,0 +1,21 @@
+// Canadian French lang variables by Virtuelcom   last modification: 2005-06-15\r
+\r
+tinyMCE.addToLang('',{\r
+searchreplace_search_desc : 'Chercher',\r
+searchreplace_searchnext_desc : 'Chercher suivant',\r
+searchreplace_replace_desc : 'Chercher/Remplacer',\r
+searchreplace_notfound : 'La recherche est terminée.  Aucune occurence trouvée.',\r
+searchreplace_search_title : 'Chercher',\r
+searchreplace_replace_title : 'Chercher/Remplacer',\r
+searchreplace_allreplaced : 'Toutes les occurences ont été remplacées.',\r
+searchreplace_findwhat : 'Chercher quoi',\r
+searchreplace_replacewith : 'Remplacer par',\r
+searchreplace_direction : 'Direction',\r
+searchreplace_up : 'Monter',\r
+searchreplace_down : 'Descendre',\r
+searchreplace_case : 'Sensible à la case',\r
+searchreplace_findnext : 'Chercher&nbsp,suivant',\r
+searchreplace_replace : 'Remplacer',\r
+searchreplace_replaceall : 'Remplacer&nbsp,tous',\r
+searchreplace_cancel : 'Annuler'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/he.js b/webcit/tiny_mce/plugins/searchreplace/langs/he.js
new file mode 100644 (file)
index 0000000..fdac48d
--- /dev/null
@@ -0,0 +1,21 @@
+// HE lang variables by Liron Newman, http://eesh.net\r
+\r
+tinyMCE.addToLang('',{\r
+searchreplace_search_desc : 'çôù',\r
+searchreplace_searchnext_desc : 'çôù ùåá',\r
+searchreplace_replace_desc : 'çôù/äçìó',\r
+searchreplace_notfound : 'äçéôåù äåùìí. îçøåæú äçéôåù ìà ðîöàä.',\r
+searchreplace_search_title : 'çôù',\r
+searchreplace_replace_title : 'çôù/äçìó',\r
+searchreplace_allreplaced : 'îçøåæú äçéôåù äåçìôä áëì î÷åí áå äéà ðîöàä.',\r
+searchreplace_findwhat : 'îä ìçôù',\r
+searchreplace_replacewith : 'ìäçìéó á-',\r
+searchreplace_direction : 'ëéååï',\r
+searchreplace_up : 'ìîòìä',\r
+searchreplace_down : 'ìîèä',\r
+searchreplace_case : 'äúàí âåãì àåúéåú',\r
+searchreplace_findnext : 'îöà&nbsp;àú&nbsp;äáà',\r
+searchreplace_replace : 'äçìó',\r
+searchreplace_replaceall : 'äçìó&nbsp;äëì',\r
+searchreplace_cancel : 'áèì'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/hu.js b/webcit/tiny_mce/plugins/searchreplace/langs/hu.js
new file mode 100644 (file)
index 0000000..0b4690d
--- /dev/null
@@ -0,0 +1,21 @@
+// HU lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+searchreplace_search_desc : 'Keresés',\r
+searchreplace_searchnext_desc : 'Újra keresés',\r
+searchreplace_replace_desc : 'Keres/Cserél',\r
+searchreplace_notfound : 'A keresés elkészült. A keresési szöveg nem található.',\r
+searchreplace_search_title : 'Keres',\r
+searchreplace_replace_title : 'Keres/Cserél',\r
+searchreplace_allreplaced : 'A kereséséi szöveg minden elõfordulása cserélve lett.',\r
+searchreplace_findwhat : 'Mit keres',\r
+searchreplace_replacewith : 'Mire cserél',\r
+searchreplace_direction : 'Hatókör',\r
+searchreplace_up : 'Fel',\r
+searchreplace_down : 'Le',\r
+searchreplace_case : 'Teljes szó',\r
+searchreplace_findnext : 'Következõt&nbsp;keres',\r
+searchreplace_replace : 'Cserél',\r
+searchreplace_replaceall : 'Mindent&nbsp;cserél',\r
+searchreplace_cancel : 'Mégse'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/is.js b/webcit/tiny_mce/plugins/searchreplace/langs/is.js
new file mode 100644 (file)
index 0000000..d7ab672
--- /dev/null
@@ -0,0 +1,22 @@
+// Iceland lang variables by Johannes Birgir Jensson\r
+\r
+tinyMCE.addToLang('',{\r
+searchreplace_search_desc : 'Finna',\r
+searchreplace_searchnext_desc : 'Finna aftur',\r
+searchreplace_replace_desc : 'Finna/skipta',\r
+searchreplace_notfound : 'Leit er lokið. Leitarorð fannst ekki.',\r
+searchreplace_search_title : 'Finna',\r
+searchreplace_replace_title : 'Finna/skipta',\r
+searchreplace_allreplaced : 'Skipt var um öll tilvik.',\r
+searchreplace_findwhat : 'Finna hvar',\r
+searchreplace_replacewith : 'Skipta &uacute;t fyrir ',\r
+searchreplace_direction : '&Aacute;tt',\r
+searchreplace_up : 'Upp',\r
+searchreplace_down : 'Ni&eth;ur',\r
+searchreplace_case : 'Passa h&aacute;-/l&aacute;gstafi',\r
+searchreplace_findnext : 'Finna&nbsp;n&aelig;st',\r
+searchreplace_replace : 'Skipta',\r
+searchreplace_replaceall : 'Skipta&nbsp;&ouml;llum',\r
+searchreplace_cancel : 'H&aelig;tta vi&eth;',\r
+searchreplace_replace_delta_width : 30\r
+});\r
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/nb.js b/webcit/tiny_mce/plugins/searchreplace/langs/nb.js
new file mode 100644 (file)
index 0000000..9110947
--- /dev/null
@@ -0,0 +1,21 @@
+// nb = Norwegian (bokm&aring;l) lang variables by Knut B. Jacobsen\r
+\r
+tinyMCE.addToLang('',{\r
+searchreplace_search_desc : 'S&oslash;k',\r
+searchreplace_searchnext_desc : 'S&oslash;k igjen',\r
+searchreplace_replace_desc : 'S&oslash;k/Erstatt',\r
+searchreplace_notfound : 'S&oslash;kingen avsluttet. Fant ikke s&oslash;kestrengen.',\r
+searchreplace_search_title : 'S&oslash;k',\r
+searchreplace_replace_title : 'S&oslash;k/Erstatt',\r
+searchreplace_allreplaced : 'Alle treff p&aring; s&oslash;kestrengen erstattes',\r
+searchreplace_findwhat : 'S&oslash;k p&aring;',\r
+searchreplace_replacewith : 'Erstatt med',\r
+searchreplace_direction : 'S&oslash;keretning',\r
+searchreplace_up : 'Oppover',\r
+searchreplace_down : 'Nedover',\r
+searchreplace_case : 'Skill mellom store og sm&aring; tegn',\r
+searchreplace_findnext : 'Neste s&oslash;k',\r
+searchreplace_replace : 'Erstatt',\r
+searchreplace_replaceall : 'Erstatt alle',\r
+searchreplace_cancel : 'Avbryt'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/nl.js b/webcit/tiny_mce/plugins/searchreplace/langs/nl.js
new file mode 100644 (file)
index 0000000..b3fe537
--- /dev/null
@@ -0,0 +1,21 @@
+// NL lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+searchreplace_search_desc : 'Zoeken',\r
+searchreplace_searchnext_desc : 'Opnieuw zoeken',\r
+searchreplace_replace_desc : 'Zoeken/Vervangen',\r
+searchreplace_notfound : 'Het doorzoeken van document is voltooid. De gezochte tekst is niet gevonden.',\r
+searchreplace_search_title : 'Zoeken',\r
+searchreplace_replace_title : 'Zoeken/Vervangen',\r
+searchreplace_allreplaced : 'Alle zoekargumenten werden vervangen.',\r
+searchreplace_findwhat : 'Zoeken naar',\r
+searchreplace_replacewith : 'Vervangen door',\r
+searchreplace_direction : 'Richting',\r
+searchreplace_up : 'Omhoog',\r
+searchreplace_down : 'Omlaag',\r
+searchreplace_case : 'Identieke hoofdletters/kleine letters',\r
+searchreplace_findnext : 'Volgende zoeken',\r
+searchreplace_replace : 'Vervangen',\r
+searchreplace_replaceall : 'Alles&nbsp;vervangen',\r
+searchreplace_cancel : 'Annuleren'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/nn.js b/webcit/tiny_mce/plugins/searchreplace/langs/nn.js
new file mode 100644 (file)
index 0000000..626e940
--- /dev/null
@@ -0,0 +1,21 @@
+// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen\r
+\r
+tinyMCE.addToLang('',{\r
+searchreplace_search_desc : 'S&oslash;k',\r
+searchreplace_searchnext_desc : 'S&oslash;k igjen',\r
+searchreplace_replace_desc : 'S&oslash;k/Erstatt',\r
+searchreplace_notfound : 'S&oslash;kingen avsluttet. Fant ikkje s&oslash;kestrengen.',\r
+searchreplace_search_title : 'S&oslash;k',\r
+searchreplace_replace_title : 'S&oslash;k/Erstatt',\r
+searchreplace_allreplaced : 'Alle treff p&aring; s&oslash;kestrengen erstattes',\r
+searchreplace_findwhat : 'S&oslash;k p&aring;',\r
+searchreplace_replacewith : 'Erstatt med',\r
+searchreplace_direction : 'S&oslash;keretning',\r
+searchreplace_up : 'Oppover',\r
+searchreplace_down : 'Nedover',\r
+searchreplace_case : 'Skill mellom store og sm&aring; tegn',\r
+searchreplace_findnext : 'Neste s&oslash;k',\r
+searchreplace_replace : 'Erstatt',\r
+searchreplace_replaceall : 'Erstatt alle',\r
+searchreplace_cancel : 'Avbryt'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/pl.js b/webcit/tiny_mce/plugins/searchreplace/langs/pl.js
new file mode 100644 (file)
index 0000000..5f4dae2
--- /dev/null
@@ -0,0 +1,23 @@
+// PL lang variables\r
+// fixed by Wooya\r
+// http://www.mfusion.prv.pl\r
+\r
+tinyMCE.addToLang('',{\r
+searchreplace_search_desc : 'Znajd¼',\r
+searchreplace_searchnext_desc : 'Znajd¼ ponownie',\r
+searchreplace_replace_desc : 'Znajd¼/Zast±p',\r
+searchreplace_notfound : 'Ukoñczono wyszukiwanie. Poszukiwana fraza nie zosta³a odnaleziona.',\r
+searchreplace_search_title : 'Znajd¼',\r
+searchreplace_replace_title : 'Znajd¼/Zast±p',\r
+searchreplace_allreplaced : 'Wszystkie wyst±pienia poszukiwanej frazy zosta³y zast±pione. ',\r
+searchreplace_findwhat : 'Znajd¼',\r
+searchreplace_replacewith : 'Zast±p',\r
+searchreplace_direction : 'Kierunek',\r
+searchreplace_up : 'Do góry',\r
+searchreplace_down : 'Do do³u',\r
+searchreplace_case : 'Wielko¶æ liter',\r
+searchreplace_findnext : 'Znajd¼&nbsp;nastêpny',\r
+searchreplace_replace : 'Zast±p',\r
+searchreplace_replaceall : 'Zast±p&nbsp;wszystkie',\r
+searchreplace_cancel : 'Wyjd¼'\r
+});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/pt_br.js b/webcit/tiny_mce/plugins/searchreplace/langs/pt_br.js
new file mode 100644 (file)
index 0000000..d30fd1c
--- /dev/null
@@ -0,0 +1,29 @@
+/**\r
+ * pt_br lang variables\r
+ * Brazilian Portuguese\r
+ *\r
+ * Authors : ????\r
+ * Revision and modifications:\r
+ *           Marcio Barbosa (mpg) <mpg@mpg.com.br>\r
+ * Last Updated : November 26, 2005\r
+ * TinyMCE Version : 2.0RC4\r
+ */\r
+tinyMCE.addToLang('',{\r
+searchreplace_search_desc : 'Procurar',\r
+searchreplace_searchnext_desc : 'Procurar novamente',\r
+searchreplace_replace_desc : 'Procurar/Substituir',\r
+searchreplace_notfound : 'A procura foi concluída. A expressão procurada não foi encontrada.',\r
+searchreplace_search_title : 'Procurar',\r
+searchreplace_replace_title : 'Procurar/Substituir',\r
+searchreplace_allreplaced : 'Todas as ocorrências encontradas foram substituídas.',\r
+searchreplace_findwhat : 'Procurar por',\r
+searchreplace_replacewith : 'Substituir com',\r
+searchreplace_direction : 'Direção',\r
+searchreplace_up : 'Acima',\r
+searchreplace_down : 'Abaixo',\r
+searchreplace_case : 'Procurar exatamente',\r
+searchreplace_findnext : 'Procurar&nbsp,próxima',\r
+searchreplace_replace : 'Substituir',\r
+searchreplace_replaceall : 'Substituir&nbsp,tudo',\r
+searchreplace_cancel : 'Cancelar'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/ru.js b/webcit/tiny_mce/plugins/searchreplace/langs/ru.js
new file mode 100644 (file)
index 0000000..22fbd59
--- /dev/null
@@ -0,0 +1,22 @@
+// RU cp1251 lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+searchreplace_search_desc : 'Íàéòè',\r
+searchreplace_searchnext_desc : 'Íàéòè îïÿòü',\r
+searchreplace_replace_desc : 'Íàéòè/Çàìåíèòü',\r
+searchreplace_notfound : 'Ïîèñê çàâåðø¸í. Èñêîìîå âûðàæåíèå íå íàéäåíî.',\r
+searchreplace_search_title : 'Íàéòè',\r
+searchreplace_replace_title : 'Íàéòè/Çàìåíèòü',\r
+searchreplace_allreplaced : 'Çàìåíà áûëà âûïîëíåíà âî âñåõ ñëó÷àÿõ ñîâïàäåíèÿ èñêîìîãî âûðàæåíèÿ.',\r
+searchreplace_findwhat : 'Íàéòè ÷òî',\r
+searchreplace_replacewith : 'Çàìåíèòü ÷åì',\r
+searchreplace_direction : 'Íàïðàâëåíèå',\r
+searchreplace_up : 'Ââåðõ',\r
+searchreplace_down : 'Âíèç',\r
+searchreplace_case : 'Ñ ó÷¸òîì ðåãèñòðà',\r
+searchreplace_findnext : 'Íàéòè&nbsp;ñëåäóþùåå',\r
+searchreplace_replace : 'Çàìåíèòü',\r
+searchreplace_replaceall : 'Çàìåíèòü&nbsp;âåçäå',\r
+searchreplace_cancel : 'Îòìåíèòü',\r
+searchreplace_replace_delta_width : 150\r
+});\r
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/ru_KOI8-R.js b/webcit/tiny_mce/plugins/searchreplace/langs/ru_KOI8-R.js
new file mode 100644 (file)
index 0000000..01b0ac3
--- /dev/null
@@ -0,0 +1,21 @@
+// RU KOI8-R lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+searchreplace_search_desc : 'îÁÊÔÉ',\r
+searchreplace_searchnext_desc : 'îÁÊÔÉ ÏÐÑÔØ',\r
+searchreplace_replace_desc : 'îÁÊÔÉ/úÁÍÅÎÉÔØ',\r
+searchreplace_notfound : 'ðÏÉÓË ÚÁ×ÅÒÛ£Î. éÓËÏÍÏÅ ×ÙÒÁÖÅÎÉÅ ÎÅ ÎÁÊÄÅÎÏ.',\r
+searchreplace_search_title : 'îÁÊÔÉ',\r
+searchreplace_replace_title : 'îÁÊÔÉ/úÁÍÅÎÉÔØ',\r
+searchreplace_allreplaced : 'úÁÍÅÎÁ ÂÙÌÁ ×ÙÐÏÌÎÅÎÁ ×Ï ×ÓÅÈ ÓÌÕÞÁÑÈ ÓÏ×ÐÁÄÅÎÉÑ ÉÓËÏÍÏÇÏ ×ÙÒÁÖÅÎÉÑ.',\r
+searchreplace_findwhat : 'îÁÊÔÉ ÞÔÏ',\r
+searchreplace_replacewith : 'úÁÍÅÎÉÔØ ÞÅÍ',\r
+searchreplace_direction : 'îÁÐÒÁ×ÌÅÎÉÅ',\r
+searchreplace_up : '÷×ÅÒÈ',\r
+searchreplace_down : '÷ÎÉÚ',\r
+searchreplace_case : 'ó ÕÞ£ÔÏÍ ÒÅÇÉÓÔÒÁ',\r
+searchreplace_findnext : 'îÁÊÔÉ&nbsp;ÓÌÅÄÕÀÝÅÅ',\r
+searchreplace_replace : 'úÁÍÅÎÉÔØ',\r
+searchreplace_replaceall : 'úÁÍÅÎÉÔØ&nbsp;×ÅÚÄÅ',\r
+searchreplace_cancel : 'ïÔÍÅÎÉÔØ'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/ru_UTF-8.js b/webcit/tiny_mce/plugins/searchreplace/langs/ru_UTF-8.js
new file mode 100644 (file)
index 0000000..cf78f42
--- /dev/null
@@ -0,0 +1,21 @@
+// RU UTF-8 lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+searchreplace_search_desc : 'Найти',\r
+searchreplace_searchnext_desc : 'Найти опять',\r
+searchreplace_replace_desc : 'Найти/Заменить',\r
+searchreplace_notfound : 'Поиск завершён. Искомое выражение не найдено.',\r
+searchreplace_search_title : 'Найти',\r
+searchreplace_replace_title : 'Найти/Заменить',\r
+searchreplace_allreplaced : 'Замена была выполнена во всех случаях совпадения искомого выражения.',\r
+searchreplace_findwhat : 'Найти что',\r
+searchreplace_replacewith : 'Заменить чем',\r
+searchreplace_direction : 'Направление',\r
+searchreplace_up : 'Вверх',\r
+searchreplace_down : 'Вниз',\r
+searchreplace_case : 'С учётом регистра',\r
+searchreplace_findnext : 'Найти&nbsp;следующее',\r
+searchreplace_replace : 'Заменить',\r
+searchreplace_replaceall : 'Заменить&nbsp;везде',\r
+searchreplace_cancel : 'Отменить'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/sk.js b/webcit/tiny_mce/plugins/searchreplace/langs/sk.js
new file mode 100644 (file)
index 0000000..87ade05
--- /dev/null
@@ -0,0 +1,29 @@
+/**\r
+ * Slovak lang variables \r
+ * encoding: utf-8\r
+ * \r
+ * @author Vladimir VASIL vvasil@post.sk\r
+ *    \r
+ * $Id: sk.js,v 1.1 2005/11/22 20:56:44 spocke Exp $ \r
+ */  \r
+\r
+tinyMCE.addToLang('',{\r
+searchreplace_search_desc : 'Nájdi',\r
+searchreplace_searchnext_desc : 'Nájdi znova',\r
+searchreplace_replace_desc : 'Nájdi/Nahradiť',\r
+searchreplace_notfound : 'Vyhľadávanie ukončené. Reťazec nemusel byť nájdený.',\r
+searchreplace_search_title : 'Nájdi',\r
+searchreplace_replace_title : 'Nájdi/Nahradiť',\r
+searchreplace_allreplaced : 'Všetky výskyty reťazca boly zmenené.',\r
+searchreplace_findwhat : 'Nájsť',\r
+searchreplace_replacewith : 'Nahradiť',\r
+searchreplace_direction : 'Smer',\r
+searchreplace_up : 'Nahor',\r
+searchreplace_down : 'Dole',\r
+searchreplace_case : 'Presná shoda',\r
+searchreplace_findnext : 'Nájdi&nbsp;ďalší',\r
+searchreplace_replace : 'Nahradiť',\r
+searchreplace_replaceall : 'Nahradiť&nbsp;všetko',\r
+searchreplace_cancel : 'Zrušiť'\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/sv.js b/webcit/tiny_mce/plugins/searchreplace/langs/sv.js
new file mode 100644 (file)
index 0000000..f69f44a
--- /dev/null
@@ -0,0 +1,21 @@
+// SE lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+searchreplace_search_desc : 'S&ouml;k',\r
+searchreplace_searchnext_desc : 'S&ouml;k igen',\r
+searchreplace_replace_desc : 'S&ouml;k/Ers&auml;tt',\r
+searchreplace_notfound : 'S&ouml;kningen &auml;r slutf&ouml;rd. S&ouml;kstr&auml;ngen kunde inte hittas.',\r
+searchreplace_search_title : 'S&ouml;k',\r
+searchreplace_replace_title : 'S&ouml;k/Ers&auml;tt',\r
+searchreplace_allreplaced : 'Alla tr&auml;ffar p&aring; s&ouml;kstr&auml;ngen ersattes',\r
+searchreplace_findwhat : 'S&ouml;k p&aring;',\r
+searchreplace_replacewith : 'Ers&auml;tt med',\r
+searchreplace_direction : 'S&ouml;kriktning',\r
+searchreplace_up : 'Upp&aring;t',\r
+searchreplace_down : 'Ner&aring;t',\r
+searchreplace_case : 'Matcha gemener/VERSALER',\r
+searchreplace_findnext : 'S&ouml;k&nbsp;n&auml;sta',\r
+searchreplace_replace : 'Ers&auml;tt',\r
+searchreplace_replaceall : 'Ers&auml;tt&nbsp;alla',\r
+searchreplace_cancel : 'Avbryt'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/zh_cn.js b/webcit/tiny_mce/plugins/searchreplace/langs/zh_cn.js
new file mode 100644 (file)
index 0000000..28be76c
--- /dev/null
@@ -0,0 +1,21 @@
+// Simplified Chinese lang variables contributed by tom_cat (thomaswangyang@gmail.com)\r
+\r
+tinyMCE.addToLang('',{\r
+searchreplace_search_desc : '²éÕÒ',\r
+searchreplace_searchnext_desc : 'ÔٴβéÕÒ',\r
+searchreplace_replace_desc : '²éÕÒ/Ìæ»»',\r
+searchreplace_notfound : 'ËÑË÷Íê±Ï£¬Ã»ÓÐÕÒµ½Òª²éÕÒµÄ×Ö·û´®¡£',\r
+searchreplace_search_title : '²éÕÒ',\r
+searchreplace_replace_title : '²éÕÒ/Ìæ»»',\r
+searchreplace_allreplaced : 'ËùÓзûºÏÌõ¼þµÄ×Ö·û´®ÒÑÌæ»»Íê±Ï¡£',\r
+searchreplace_findwhat : '²éÕÒ',\r
+searchreplace_replacewith : 'Ì滻Ϊ',\r
+searchreplace_direction : '·½Ïò',\r
+searchreplace_up : 'ÏòÉÏ',\r
+searchreplace_down : 'ÏòÏÂ',\r
+searchreplace_case : 'Æ¥Åä´óСд',\r
+searchreplace_findnext : '²éÕÒÏÂÒ»¸ö',\r
+searchreplace_replace : 'Ìæ»»',\r
+searchreplace_replaceall : 'È«²¿Ìæ»»',\r
+searchreplace_cancel : 'È¡Ïû'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/zh_tw.js b/webcit/tiny_mce/plugins/searchreplace/langs/zh_tw.js
new file mode 100644 (file)
index 0000000..2820463
--- /dev/null
@@ -0,0 +1,22 @@
+// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// ÁcÅ餤¤å BIG-5 ¡F¼Æ¦ìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com\r
+\r
+tinyMCE.addToLang('',{\r
+searchreplace_search_desc : '¬d¸ß',\r
+searchreplace_searchnext_desc : '¦A¦¸¬d¸ß',\r
+searchreplace_replace_desc : '¬d¸ß©Î´À´«',\r
+searchreplace_notfound : '¤w§¹¦¨¬d¸ß¡C¨S§ä¨ì«ü©wªº¦r¦ê¡C',\r
+searchreplace_search_title : '¬d¸ß',\r
+searchreplace_replace_title : '¬d¸ß©Î´À´«',\r
+searchreplace_allreplaced : '©Ò¦³§ä¨ìªº¦r¦ê¤w§¹¦¨´À´«',\r
+searchreplace_findwhat : '§ä¤°»ò',\r
+searchreplace_replacewith : '´À´«¦¨',\r
+searchreplace_direction : '¤è¦V',\r
+searchreplace_up : '©¹¤W',\r
+searchreplace_down : '¦V¤U',\r
+searchreplace_case : '¬Û²Åµ²ªG',\r
+searchreplace_findnext : '¬d¸ß¤U­Ó',\r
+searchreplace_replace : '´À´«',\r
+searchreplace_replaceall : '¥þ³¡´À´«',\r
+searchreplace_cancel : '¨ú®ø'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/searchreplace/langs/zh_tw_utf8.js b/webcit/tiny_mce/plugins/searchreplace/langs/zh_tw_utf8.js
new file mode 100644 (file)
index 0000000..91376f3
--- /dev/null
@@ -0,0 +1,22 @@
+// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// 繁體中文 UTF-8 ;數位應用坊製作; twapweb_AT_gmail_DOT_com\r
+\r
+tinyMCE.addToLang('',{\r
+searchreplace_search_desc : '查詢',\r
+searchreplace_searchnext_desc : '再次查詢',\r
+searchreplace_replace_desc : '查詢或替換',\r
+searchreplace_notfound : '已完成查詢。沒找到指定的字串。',\r
+searchreplace_search_title : '查詢',\r
+searchreplace_replace_title : '查詢或替換',\r
+searchreplace_allreplaced : '所有找到的字串已完成替換',\r
+searchreplace_findwhat : '找什麼',\r
+searchreplace_replacewith : '替換成',\r
+searchreplace_direction : '方向',\r
+searchreplace_up : '往上',\r
+searchreplace_down : '向下',\r
+searchreplace_case : '相符結果',\r
+searchreplace_findnext : '查詢下個',\r
+searchreplace_replace : '替換',\r
+searchreplace_replaceall : '全部替換',\r
+searchreplace_cancel : '取消'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/searchreplace/readme.txt b/webcit/tiny_mce/plugins/searchreplace/readme.txt
new file mode 100644 (file)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/webcit/tiny_mce/plugins/searchreplace/replace.htm b/webcit/tiny_mce/plugins/searchreplace/replace.htm
new file mode 100644 (file)
index 0000000..e724640
--- /dev/null
@@ -0,0 +1,49 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_searchreplace_replace_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/replace.js"></script>\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none; margin: 4px;">\r
+<form onsubmit="searchNext('none');return false;" action="#">\r
+  <table border="0" cellspacing="0" cellpadding="2">\r
+         <tr>\r
+               <td><label for="searchstring">{$lang_searchreplace_findwhat}</label></td>\r
+               <td><input type="text" id="searchstring" name="searchstring" style="width: 200px" /></td>\r
+         </tr>\r
+         <tr>\r
+               <td><label for="replacestring">{$lang_searchreplace_replacewith}</label></td>\r
+               <td><input type="text" id="replacestring" name="replacestring" style="width: 200px" /></td>\r
+         </tr>\r
+        <tr>\r
+          <td colspan="2"><table border="0" cellspacing="0" cellpadding="0">\r
+            <tr>\r
+              <td><label>{$lang_searchreplace_direction}</label></td>\r
+              <td><input id="backwardsu" name="backwards" class="radio" type="radio" value="true" /></td>\r
+              <td><label for="backwardsu">{$lang_searchreplace_up}</label></td>\r
+              <td><input id="backwardsd" name="backwards" class="radio" type="radio" value="false" /></td>\r
+              <td><label for="backwardsd">{$lang_searchreplace_down}</label></td>\r
+            </tr>\r
+          </table></td>\r
+        </tr>\r
+        <tr>\r
+<td colspan="2"><table border="0" cellspacing="0" cellpadding="0">\r
+  <tr>\r
+    <td><input id="casesensitivebox" name="casesensitivebox" class="checkbox" type="checkbox" value="true" /></td>\r
+    <td><label for="casesensitivebox">{$lang_searchreplace_case}</label></td>\r
+  </tr>\r
+</table></td>\r
+</tr>\r
+      </table>\r
+  <table border="0" width="300" cellspacing="0" cellpadding="4">\r
+    <tr>\r
+      <td><input id="insertBtn" name="insertBtn" type="button" value="{$lang_searchreplace_findnext}" onclick="searchNext('none');" /></td>\r
+      <td><input name="replaceBtn" type="button" id="replaceBtn" value="{$lang_searchreplace_replace}" onclick="searchNext('current');" /></td>\r
+      <td><input name="replaceBtn" type="button" id="replaceAllBtn" value="{$lang_searchreplace_replaceall}" onclick="searchNext('all');" /></td>\r
+     <td align="right"><input name="cancelBtn" type="button" id="cancelBtn" value="{$lang_searchreplace_cancel}" onclick="cancelAction();" /></td>\r
+    </tr>\r
+  </table>\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/plugins/searchreplace/search.htm b/webcit/tiny_mce/plugins/searchreplace/search.htm
new file mode 100644 (file)
index 0000000..fe9055e
--- /dev/null
@@ -0,0 +1,42 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_searchreplace_search_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/search.js"></script>\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none; margin: 4px;">\r
+<form onsubmit="searchNext();return false;" action="#">\r
+  <table border="0" cellspacing="0" cellpadding="2">\r
+        <tr>\r
+          <td><label for="searchstring">{$lang_searchreplace_findwhat}</label>&nbsp;<input type="text" id="searchstring" name="searchstring" style="width: 200px" /></td>\r
+        </tr>\r
+        <tr>\r
+          <td><table border="0" cellspacing="0" cellpadding="0">\r
+            <tr>\r
+              <td><label>{$lang_searchreplace_direction}</label></td>\r
+              <td><input id="backwardsu" name="backwards" class="radio" type="radio" value="true" /></td>\r
+              <td><label for="backwardsu">{$lang_searchreplace_up}</label></td>\r
+              <td><input id="backwardsd" name="backwards" class="radio" type="radio" value="false" /></td>\r
+              <td><label for="backwardsd">{$lang_searchreplace_down}</label></td>\r
+            </tr>\r
+          </table></td>\r
+        </tr>\r
+        <tr>\r
+<td><table border="0" cellspacing="0" cellpadding="0">\r
+  <tr>\r
+    <td><input id="casesensitivebox" name="casesensitivebox" class="checkbox" type="checkbox" value="true" /></td>\r
+    <td><label for="casesensitivebox">{$lang_searchreplace_case}</label></td>\r
+  </tr>\r
+</table></td>\r
+</tr>\r
+      </table>\r
+  <table border="0" width="300" cellspacing="0" cellpadding="4">\r
+    <tr>\r
+      <td><input id="insert" name="insert" type="submit" value="{$lang_searchreplace_findnext}" /></td>\r
+      <td align="right"><input id="cancel" name="cancel" type="button" value="{$lang_searchreplace_cancel}" onclick="cancelAction();" /></td>\r
+    </tr>\r
+  </table>\r
+</form>\r
+</body>\r
+</html>\r
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..699b3b9
--- /dev/null
@@ -0,0 +1,182 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_table_cell_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/cell.js"></script>\r
+       <link href="css/cell.css" rel="stylesheet" type="text/css" />\r
+       <base target="_self" />\r
+</head>\r
+<body id="tablecell" onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+       <form onsubmit="updateAction();return false;" action="#">\r
+               <div class="tabs">\r
+                       <ul>\r
+                               <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{$lang_table_general_tab}</a></span></li>\r
+                               <li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{$lang_table_advanced_tab}</a></span></li>\r
+                       </ul>\r
+               </div>\r
+\r
+               <div class="panel_wrapper">\r
+                       <div id="general_panel" class="panel current">\r
+                               <fieldset>\r
+                                       <legend>{$lang_table_general_props}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td><label for="align">{$lang_table_align}</label></td>\r
+                                                       <td>\r
+                                                               <select id="align" name="align">\r
+                                                                       <option value="">{$lang_not_set}</option>\r
+                                                                       <option value="center">{$lang_table_align_middle}</option>\r
+                                                                       <option value="left">{$lang_table_align_left}</option>\r
+                                                                       <option value="right">{$lang_table_align_right}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+               \r
+                                                       <td><label for="celltype">{$lang_table_cell_type}</label></td>\r
+                                                       <td>\r
+                                                               <select id="celltype" name="celltype">\r
+                                                                       <option value="td">{$lang_table_td}</option>\r
+                                                                       <option value="th">{$lang_table_th}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="valign">{$lang_table_valign}</label></td>\r
+                                                       <td>\r
+                                                               <select id="valign" name="valign">\r
+                                                                       <option value="">{$lang_not_set}</option>\r
+                                                                       <option value="top">{$lang_table_align_top}</option>\r
+                                                                       <option value="middle">{$lang_table_align_middle}</option>\r
+                                                                       <option value="bottom">{$lang_table_align_bottom}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+\r
+                                                       <td><label for="scope">{$lang_table_scope}</label></td>\r
+                                                       <td>\r
+                                                               <select id="scope" name="scope">\r
+                                                                       <option value="">{$lang_not_set}</option>\r
+                                                                       <option value="col">{$lang_table_col}</option>\r
+                                                                       <option value="row">{$lang_table_row}</option>\r
+                                                                       <option value="rowgroup">{$lang_table_rowgroup}</option>\r
+                                                                       <option value="colgroup">{$lang_table_colgroup}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="width">{$lang_table_width}</label></td>\r
+                                                       <td><input id="width" name="width" type="text" value="" size="4" maxlength="4" onchange="changedSize();" /></td>\r
+\r
+                                                       <td><label for="height">{$lang_table_height}</label></td>\r
+                                                       <td><input id="height" name="height" type="text" value="" size="4" maxlength="4" onchange="changedSize();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="class">{$lang_class_name}</label></td>\r
+                                                       <td colspan="3">\r
+                                                               <select id="class" name="class">\r
+                                                                       <option value="" selected="selected">{$lang_not_set}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+\r
+                       <div id="advanced_panel" class="panel">\r
+                               <fieldset>\r
+                                       <legend>{$lang_table_advanced_props}</legend>\r
+\r
+                                       <table border="0" cellpadding="0" cellspacing="4">\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="id">{$lang_table_id}</label></td> \r
+                                                       <td><input id="id" name="id" type="text" value="" style="width: 200px" /></td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="style">{$lang_table_style}</label></td>\r
+                                                       <td><input type="text" id="style" name="style" value="" style="width: 200px;" onchange="changedStyle();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="dir">{$lang_table_langdir}</label></td> \r
+                                                       <td>\r
+                                                               <select id="dir" name="dir" style="width: 200px"> \r
+                                                                               <option value="">{$lang_not_set}</option> \r
+                                                                               <option value="ltr">{$lang_table_ltr}</option> \r
+                                                                               <option value="rtl">{$lang_table_rtl}</option> \r
+                                                               </select>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="lang">{$lang_table_langcode}</label></td> \r
+                                                       <td>\r
+                                                               <input id="lang" name="lang" type="text" value="" style="width: 200px" />\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="backgroundimage">{$lang_table_bgimage}</label></td> \r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="backgroundimage" name="backgroundimage" type="text" value="" style="width: 200px" onchange="changedBackgroundImage();" /></td>\r
+                                                                               <td id="backgroundimagebrowsercontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="bordercolor">{$lang_table_bordercolor}</label></td> \r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="bordercolor" name="bordercolor" type="text" value="" size="9" onchange="updateColor('bordercolor_pick','bordercolor');changedColor();" /></td>\r
+                                                                               <td id="bordercolor_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="bgcolor">{$lang_table_bgcolor}</label></td> \r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');changedColor();" /></td>\r
+                                                                               <td id="bgcolor_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td> \r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+               </div>\r
+\r
+               <div class="mceActionPanel">\r
+                       <div>\r
+                               <select id="action" name="action">\r
+                                       <option value="cell">{$lang_table_cell_cell}</option>\r
+                                       <option value="row">{$lang_table_cell_row}</option>\r
+                                       <option value="all">{$lang_table_cell_all}</option>\r
+                               </select>\r
+                       </div>\r
+\r
+                       <div style="float: left">\r
+                               <div><input type="button" id="insert" name="insert" value="{$lang_update}" onclick="updateAction();" /></div>\r
+                       </div>\r
+\r
+                       <div style="float: right">\r
+                               <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+                       </div>\r
+               </div>\r
+       </form>\r
+</body>\r
+</html>\r
diff --git a/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..804f766
--- /dev/null
@@ -0,0 +1,13 @@
+/* CSS file for table dialog in the table plugin */\r
+\r
+.panel_wrapper div.current {\r
+       height: 220px;\r
+}\r
+\r
+.advfield {\r
+       width: 200px;\r
+}\r
+\r
+#class {\r
+       width: 150px;\r
+}\r
diff --git a/webcit/tiny_mce/plugins/table/editor_plugin.js b/webcit/tiny_mce/plugins/table/editor_plugin.js
new file mode 100644 (file)
index 0000000..7f531e4
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.importPluginLanguagePack('table','en,ar,cs,da,de,el,es,fi,fr_ca,hu,it,ja,ko,nl,nb,pl,pt,pt_br,sv,tw,zh_cn,fr,de,he,nb,ru,ru_KOI8-R,ru_UTF-8,nn,cy,is,zh_tw,zh_tw_utf8,sk');function TinyMCE_table_getInfo(){return{longname:'Tables',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_table.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_table_initInstance(inst){if(tinyMCE.isGecko){var doc=inst.getDoc();tinyMCE.addEvent(doc,"mouseup",TinyMCE_table_mouseDownHandler);}inst.tableRowClipboard=null;}function TinyMCE_table_mouseDownHandler(e){var elm=tinyMCE.isMSIE?event.srcElement:e.target;var focusElm=tinyMCE.selectedInstance.getFocusElement();if(elm.nodeName=="BODY"&&(focusElm.nodeName=="TD"||focusElm.nodeName=="TH"||(focusElm.parentNode&&focusElm.parentNode.nodeName=="TD")||(focusElm.parentNode&&focusElm.parentNode.nodeName=="TH"))){window.setTimeout(function(){var tableElm=tinyMCE.getParentElement(focusElm,"table");tinyMCE.handleVisualAid(tableElm,true,tinyMCE.settings['visual'],tinyMCE.selectedInstance);},10);}}function TinyMCE_table_getControlHTML(control_name){var controls=new Array(['table','table.gif','{$lang_table_desc}','mceInsertTable',true],['delete_col','table_delete_col.gif','{$lang_table_delete_col_desc}','mceTableDeleteCol'],['delete_row','table_delete_row.gif','{$lang_table_delete_row_desc}','mceTableDeleteRow'],['col_after','table_insert_col_after.gif','{$lang_table_col_after_desc}','mceTableInsertColAfter'],['col_before','table_insert_col_before.gif','{$lang_table_col_before_desc}','mceTableInsertColBefore'],['row_after','table_insert_row_after.gif','{$lang_table_row_after_desc}','mceTableInsertRowAfter'],['row_before','table_insert_row_before.gif','{$lang_table_row_before_desc}','mceTableInsertRowBefore'],['row_props','table_row_props.gif','{$lang_table_row_desc}','mceTableRowProps',true],['cell_props','table_cell_props.gif','{$lang_table_cell_desc}','mceTableCellProps',true],['split_cells','table_split_cells.gif','{$lang_table_split_cells_desc}','mceTableSplitCells',true],['merge_cells','table_merge_cells.gif','{$lang_table_merge_cells_desc}','mceTableMergeCells',true]);for(var i=0;i<controls.length;i++){var but=controls[i];var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\''+but[3]+'\', '+(but.length>4?but[4]:false)+(but.length>5?', \''+but[5]+'\'':'')+');return false;';if(but[0]==control_name&&(tinyMCE.isMSIE||!tinyMCE.settings['button_tile_map']))return '<a href="javascript:'+cmd+'" onclick="'+cmd+'" onmousedown="return false;" target="_self"><img id="{$editor_id}_'+but[0]+'" src="{$pluginurl}/images/'+but[1]+'" title="'+but[2]+'" width="20" height="20" class="mceButtonDisabled" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';else if(but[0]==control_name)return '<a href="javascript:'+cmd+'" onclick="'+cmd+'" onmousedown="return false;" target="_self"><img id="{$editor_id}_'+but[0]+'" src="{$themeurl}/images/spacer.gif" style="background-image:url({$pluginurl}/images/buttons.gif); background-position: '+(0-(i*20))+'px 0px" title="'+but[2]+'" width="20" height="20" class="mceButtonDisabled" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';}if(control_name=="tablecontrols"){var html="";html+=tinyMCE.getControlHTML("table");html+=tinyMCE.getControlHTML("separator");html+=tinyMCE.getControlHTML("row_props");html+=tinyMCE.getControlHTML("cell_props");html+=tinyMCE.getControlHTML("separator");html+=tinyMCE.getControlHTML("row_before");html+=tinyMCE.getControlHTML("row_after");html+=tinyMCE.getControlHTML("delete_row");html+=tinyMCE.getControlHTML("separator");html+=tinyMCE.getControlHTML("col_before");html+=tinyMCE.getControlHTML("col_after");html+=tinyMCE.getControlHTML("delete_col");html+=tinyMCE.getControlHTML("separator");html+=tinyMCE.getControlHTML("split_cells");html+=tinyMCE.getControlHTML("merge_cells");return html;}return "";}function TinyMCE_table_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mceInsertTable":case "mceTableRowProps":case "mceTableCellProps":case "mceTableSplitCells":case "mceTableMergeCells":case "mceTableInsertRowBefore":case "mceTableInsertRowAfter":case "mceTableDeleteRow":case "mceTableInsertColBefore":case "mceTableInsertColAfter":case "mceTableDeleteCol":case "mceTableCutRow":case "mceTableCopyRow":case "mceTablePasteRowBefore":case "mceTablePasteRowAfter":case "mceTableDelete":var inst=tinyMCE.getInstanceById(editor_id);inst.execCommand('mceBeginUndoLevel');TinyMCE_table_doExecCommand(editor_id,element,command,user_interface,value);inst.execCommand('mceEndUndoLevel');return true;}return false;}function TinyMCE_table_doExecCommand(editor_id,element,command,user_interface,value){var inst=tinyMCE.getInstanceById(editor_id);var focusElm=inst.getFocusElement();var trElm=tinyMCE.getParentElement(focusElm,"tr");var tdElm=tinyMCE.getParentElement(focusElm,"td,th");var tableElm=tinyMCE.getParentElement(focusElm,"table");var doc=inst.contentWindow.document;var tableBorder=tableElm?tableElm.getAttribute("border"):"";if(trElm&&tdElm==null)tdElm=trElm.cells[0];function inArray(ar,v){for(var i=0;i<ar.length;i++){if(ar[i].length>0&&inArray(ar[i],v))return true;if(ar[i]==v)return true;}return false;}function makeTD(){var newTD=doc.createElement("td");newTD.innerHTML="&nbsp;";}function getColRowSpan(td){var colspan=tinyMCE.getAttrib(td,"colspan");var rowspan=tinyMCE.getAttrib(td,"rowspan");colspan=colspan==""?1:parseInt(colspan);rowspan=rowspan==""?1:parseInt(rowspan);return{colspan:colspan,rowspan:rowspan};}function getCellPos(grid,td){for(var y=0;y<grid.length;y++){for(var x=0;x<grid[y].length;x++){if(grid[y][x]==td)return{cellindex:x,rowindex:y};}}return null;}function getCell(grid,row,col){if(grid[row]&&grid[row][col])return grid[row][col];return null;}function getTableGrid(table){var grid=new Array();var rows=table.rows;for(var y=0;y<rows.length;y++){for(var x=0;x<rows[y].cells.length;x++){var td=rows[y].cells[x];var sd=getColRowSpan(td);for(xstart=x;grid[y]&&grid[y][xstart];xstart++);for(var y2=y;y2<y+sd['rowspan'];y2++){if(!grid[y2])grid[y2]=new Array();for(var x2=xstart;x2<xstart+sd['colspan'];x2++){grid[y2][x2]=td;}}}}return grid;}function trimRow(table,tr,td,new_tr){var grid=getTableGrid(table);var cpos=getCellPos(grid,td);if(new_tr.cells.length!=tr.childNodes.length){var cells=tr.childNodes;var lastElm=null;for(var x=0;td=getCell(grid,cpos.rowindex,x);x++){var remove=true;var sd=getColRowSpan(td);if(inArray(cells,td)){new_tr.childNodes[x]._delete=true;}else if((lastElm==null||td!=lastElm)&&sd.colspan>1){for(var i=x;i<x+td.colSpan;i++)new_tr.childNodes[i]._delete=true;}if((lastElm==null||td!=lastElm)&&sd.rowspan>1)td.rowSpan=sd.rowspan+1;lastElm=td;}deleteMarked(tableElm);}}function prevElm(node,name){while((node=node.previousSibling)!=null){if(node.nodeName==name)return node;}return null;}function nextElm(node,names){var namesAr=names.split(',');while((node=node.nextSibling)!=null){for(var i=0;i<namesAr.length;i++){if(node.nodeName.toLowerCase()==namesAr[i].toLowerCase())return node;}}return null;}function deleteMarked(tbl){if(tbl.rows==0)return;var tr=tbl.rows[0];do{var next=nextElm(tr,"TR");if(tr._delete){tr.parentNode.removeChild(tr);continue;}var td=tr.cells[0];if(td.cells>1){do{var nexttd=nextElm(td,"TD,TH");if(td._delete)td.parentNode.removeChild(td);}while((td=nexttd)!=null);}}while((tr=next)!=null);}function addRows(td_elm,tr_elm,rowspan){td_elm.rowSpan=1;var trNext=nextElm(tr_elm,"TR");for(var i=1;i<rowspan&&trNext;i++){var newTD=doc.createElement("td");newTD.innerHTML="&nbsp;";if(tinyMCE.isMSIE)trNext.insertBefore(newTD,trNext.cells(td_elm.cellIndex));else trNext.insertBefore(newTD,trNext.cells[td_elm.cellIndex]);trNext=nextElm(trNext,"TR");}}function copyRow(doc,table,tr){var grid=getTableGrid(table);var newTR=tr.cloneNode(false);var cpos=getCellPos(grid,tr.cells[0]);var lastCell=null;var tableBorder=tinyMCE.getAttrib(table,"border");var tdElm=null;for(var x=0;tdElm=getCell(grid,cpos.rowindex,x);x++){var newTD=null;if(lastCell!=tdElm){for(var i=0;i<tr.cells.length;i++){if(tdElm==tr.cells[i]){newTD=tdElm.cloneNode(true);break;}}}if(newTD==null){newTD=doc.createElement("td");newTD.innerHTML="&nbsp;";}newTD.colSpan=1;newTD.rowSpan=1;newTR.appendChild(newTD);lastCell=tdElm;}return newTR;}switch(command){case "mceTableRowProps":if(trElm==null)return true;if(user_interface){var template=new Array();template['file']='../../plugins/table/row.htm';template['width']=380;template['height']=295;template['width']+=tinyMCE.getLang('lang_table_rowprops_delta_width',0);template['height']+=tinyMCE.getLang('lang_table_rowprops_delta_height',0);tinyMCE.openWindow(template,{editor_id:inst.editorId,inline:"yes"});}return true;case "mceTableCellProps":if(tdElm==null)return true;if(user_interface){var template=new Array();template['file']='../../plugins/table/cell.htm';template['width']=380;template['height']=295;template['width']+=tinyMCE.getLang('lang_table_cellprops_delta_width',0);template['height']+=tinyMCE.getLang('lang_table_cellprops_delta_height',0);tinyMCE.openWindow(template,{editor_id:inst.editorId,inline:"yes"});}return true;case "mceInsertTable":if(user_interface){var template=new Array();template['file']='../../plugins/table/table.htm';template['width']=380;template['height']=295;template['width']+=tinyMCE.getLang('lang_table_table_delta_width',0);template['height']+=tinyMCE.getLang('lang_table_table_delta_height',0);tinyMCE.openWindow(template,{editor_id:inst.editorId,inline:"yes",action:value});}return true;case "mceTableDelete":var table=tinyMCE.getParentElement(inst.getFocusElement(),"table");if(table){table.parentNode.removeChild(table);inst.repaint();}return true;case "mceTableSplitCells":case "mceTableMergeCells":case "mceTableInsertRowBefore":case "mceTableInsertRowAfter":case "mceTableDeleteRow":case "mceTableInsertColBefore":case "mceTableInsertColAfter":case "mceTableDeleteCol":case "mceTableCutRow":case "mceTableCopyRow":case "mceTablePasteRowBefore":case "mceTablePasteRowAfter":if(!tableElm)return true;if(tableElm!=trElm.parentNode)tableElm=trElm.parentNode;if(tableElm&&trElm){switch(command){case "mceTableInsertRowBefore":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);var newTR=doc.createElement("tr");var lastTDElm=null;cpos.rowindex--;if(cpos.rowindex<0)cpos.rowindex=0;for(var x=0;tdElm=getCell(grid,cpos.rowindex,x);x++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd['rowspan']==1){var newTD=doc.createElement("td");newTD.innerHTML="&nbsp;";newTD.colSpan=tdElm.colSpan;newTR.appendChild(newTD);}else tdElm.rowSpan=sd['rowspan']+1;lastTDElm=tdElm;}}trElm.parentNode.insertBefore(newTR,trElm);break;case "mceTableCutRow":if(!trElm||!tdElm)return true;inst.tableRowClipboard=copyRow(doc,tableElm,trElm);inst.execCommand("mceTableDeleteRow");break;case "mceTableCopyRow":if(!trElm||!tdElm)return true;inst.tableRowClipboard=copyRow(doc,tableElm,trElm);break;case "mceTablePasteRowBefore":if(!trElm||!tdElm)return true;var newTR=inst.tableRowClipboard.cloneNode(true);var prevTR=prevElm(trElm,"TR");if(prevTR!=null)trimRow(tableElm,prevTR,prevTR.cells[0],newTR);trElm.parentNode.insertBefore(newTR,trElm);break;case "mceTablePasteRowAfter":if(!trElm||!tdElm)return true;var nextTR=nextElm(trElm,"TR");var newTR=inst.tableRowClipboard.cloneNode(true);trimRow(tableElm,trElm,tdElm,newTR);if(nextTR==null)trElm.parentNode.appendChild(newTR);else nextTR.parentNode.insertBefore(newTR,nextTR);break;case "mceTableInsertRowAfter":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);var newTR=doc.createElement("tr");var lastTDElm=null;for(var x=0;tdElm=getCell(grid,cpos.rowindex,x);x++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd['rowspan']==1){var newTD=doc.createElement("td");newTD.innerHTML="&nbsp;";newTD.colSpan=tdElm.colSpan;newTR.appendChild(newTD);}else tdElm.rowSpan=sd['rowspan']+1;lastTDElm=tdElm;}}if(newTR.hasChildNodes()){var nextTR=nextElm(trElm,"TR");if(nextTR)nextTR.parentNode.insertBefore(newTR,nextTR);else tableElm.appendChild(newTR);}break;case "mceTableDeleteRow":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);if(grid.length==1){tableElm.parentNode.removeChild(tableElm);return true;}var cells=trElm.cells;var nextTR=nextElm(trElm,"TR");for(var x=0;x<cells.length;x++){if(cells[x].rowSpan>1){var newTD=cells[x].cloneNode(true);var sd=getColRowSpan(cells[x]);newTD.rowSpan=sd.rowspan-1;var nextTD=nextTR.cells[x];if(nextTD==null)nextTR.appendChild(newTD);else nextTR.insertBefore(newTD,nextTD);}}var lastTDElm=null;for(var x=0;tdElm=getCell(grid,cpos.rowindex,x);x++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd.rowspan>1){tdElm.rowSpan=sd.rowspan-1;}else{trElm=tdElm.parentNode;if(trElm.parentNode)trElm._delete=true;}lastTDElm=tdElm;}}deleteMarked(tableElm);cpos.rowindex--;if(cpos.rowindex<0)cpos.rowindex=0;inst.selectNode(getCell(grid,cpos.rowindex,0),true,true);break;case "mceTableInsertColBefore":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);var lastTDElm=null;for(var y=0;tdElm=getCell(grid,y,cpos.cellindex);y++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd['colspan']==1){var newTD=doc.createElement(tdElm.nodeName);newTD.innerHTML="&nbsp;";newTD.rowSpan=tdElm.rowSpan;tdElm.parentNode.insertBefore(newTD,tdElm);}else tdElm.colSpan++;lastTDElm=tdElm;}}break;case "mceTableInsertColAfter":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);var lastTDElm=null;for(var y=0;tdElm=getCell(grid,y,cpos.cellindex);y++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd['colspan']==1){var newTD=doc.createElement(tdElm.nodeName);newTD.innerHTML="&nbsp;";newTD.rowSpan=tdElm.rowSpan;var nextTD=nextElm(tdElm,"TD,TH");if(nextTD==null)tdElm.parentNode.appendChild(newTD);else nextTD.parentNode.insertBefore(newTD,nextTD);}else tdElm.colSpan++;lastTDElm=tdElm;}}break;case "mceTableDeleteCol":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);var lastTDElm=null;if(grid.length>1&&grid[0].length<=1){tableElm.parentNode.removeChild(tableElm);return true;}for(var y=0;tdElm=getCell(grid,y,cpos.cellindex);y++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd['colspan']>1)tdElm.colSpan=sd['colspan']-1;else{if(tdElm.parentNode)tdElm.parentNode.removeChild(tdElm);}lastTDElm=tdElm;}}cpos.cellindex--;if(cpos.cellindex<0)cpos.cellindex=0;inst.selectNode(getCell(grid,0,cpos.cellindex),true,true);break;case "mceTableSplitCells":if(!trElm||!tdElm)return true;var spandata=getColRowSpan(tdElm);var colspan=spandata["colspan"];var rowspan=spandata["rowspan"];if(colspan>1||rowspan>1){tdElm.colSpan=1;for(var i=1;i<colspan;i++){var newTD=doc.createElement("td");newTD.innerHTML="&nbsp;";trElm.insertBefore(newTD,nextElm(tdElm,"TD,TH"));if(rowspan>1)addRows(newTD,trElm,rowspan);}addRows(tdElm,trElm,rowspan);}tableElm=tinyMCE.getParentElement(inst.getFocusElement(),"table");break;case "mceTableMergeCells":var rows=new Array();var sel=inst.getSel();var grid=getTableGrid(tableElm);if(tinyMCE.isMSIE||sel.rangeCount==1){if(user_interface){var template=new Array();var sp=getColRowSpan(tdElm);template['file']='../../plugins/table/merge_cells.htm';template['width']=250;template['height']=105+(tinyMCE.isNS7?25:0);template['width']+=tinyMCE.getLang('lang_table_merge_cells_delta_width',0);template['height']+=tinyMCE.getLang('lang_table_merge_cells_delta_height',0);tinyMCE.openWindow(template,{editor_id:inst.editorId,inline:"yes",action:"update",numcols:sp.colspan,numrows:sp.rowspan});return true;}else{var numRows=parseInt(value['numrows']);var numCols=parseInt(value['numcols']);var cpos=getCellPos(grid,tdElm);if((""+numRows)=="NaN")numRows=1;if((""+numCols)=="NaN")numCols=1;var tRows=tableElm.rows;for(var y=cpos.rowindex;y<grid.length;y++){var rowCells=new Array();for(var x=cpos.cellindex;x<grid[y].length;x++){var td=getCell(grid,y,x);if(td&&!inArray(rows,td)&&!inArray(rowCells,td)){var cp=getCellPos(grid,td);if(cp.cellindex<cpos.cellindex+numCols&&cp.rowindex<cpos.rowindex+numRows)rowCells[rowCells.length]=td;}}if(rowCells.length>0)rows[rows.length]=rowCells;}}}else{var cells=new Array();var sel=inst.getSel();var lastTR=null;var curRow=null;var x1=-1,y1=-1,x2,y2;if(sel.rangeCount<2)return true;for(var i=0;i<sel.rangeCount;i++){var rng=sel.getRangeAt(i);var tdElm=rng.startContainer.childNodes[rng.startOffset];if(!tdElm)break;if(tdElm.nodeName=="TD")cells[cells.length]=tdElm;}var tRows=tableElm.rows;for(var y=0;y<tRows.length;y++){var rowCells=new Array();for(var x=0;x<tRows[y].cells.length;x++){var td=tRows[y].cells[x];for(var i=0;i<cells.length;i++){if(td==cells[i]){rowCells[rowCells.length]=td;}}}if(rowCells.length>0)rows[rows.length]=rowCells;}var curRow=new Array();var lastTR=null;for(var y=0;y<grid.length;y++){for(var x=0;x<grid[y].length;x++){grid[y][x]._selected=false;for(var i=0;i<cells.length;i++){if(grid[y][x]==cells[i]){if(x1==-1){x1=x;y1=y;}x2=x;y2=y;grid[y][x]._selected=true;}}}}for(var y=y1;y<=y2;y++){for(var x=x1;x<=x2;x++){if(!grid[y][x]._selected){alert("Invalid selection for merge.");return true;}}}}var rowSpan=1,colSpan=1;var lastRowSpan=-1;for(var y=0;y<rows.length;y++){var rowColSpan=0;for(var x=0;x<rows[y].length;x++){var sd=getColRowSpan(rows[y][x]);rowColSpan+=sd['colspan'];if(lastRowSpan!=-1&&sd['rowspan']!=lastRowSpan){alert("Invalid selection for merge.");return true;}lastRowSpan=sd['rowspan'];}if(rowColSpan>colSpan)colSpan=rowColSpan;lastRowSpan=-1;}var lastColSpan=-1;for(var x=0;x<rows[0].length;x++){var colRowSpan=0;for(var y=0;y<rows.length;y++){var sd=getColRowSpan(rows[y][x]);colRowSpan+=sd['rowspan'];if(lastColSpan!=-1&&sd['colspan']!=lastColSpan){alert("Invalid selection for merge.");return true;}lastColSpan=sd['colspan'];}if(colRowSpan>rowSpan)rowSpan=colRowSpan;lastColSpan=-1;}tdElm=rows[0][0];tdElm.rowSpan=rowSpan;tdElm.colSpan=colSpan;for(var y=0;y<rows.length;y++){for(var x=0;x<rows[y].length;x++){var html=rows[y][x].innerHTML;var chk=tinyMCE.regexpReplace(html,"[ \t\r\n]","");if(chk!="<br/>"&&chk!="<br>"&&chk!="&nbsp;"&&(x+y>0))tdElm.innerHTML+=html;if(rows[y][x]!=tdElm&&!rows[y][x]._deleted){var cpos=getCellPos(grid,rows[y][x]);var tr=rows[y][x].parentNode;tr.removeChild(rows[y][x]);rows[y][x]._deleted=true;if(!tr.hasChildNodes()){tr.parentNode.removeChild(tr);var lastCell=null;for(var x=0;cellElm=getCell(grid,cpos.rowindex,x);x++){if(cellElm!=lastCell&&cellElm.rowSpan>1)cellElm.rowSpan--;lastCell=cellElm;}if(tdElm.rowSpan>1)tdElm.rowSpan--;}}}}break;}tableElm=tinyMCE.getParentElement(inst.getFocusElement(),"table");tinyMCE.handleVisualAid(tableElm,true,tinyMCE.settings['visual'],tinyMCE.selectedInstance);tinyMCE.triggerNodeChange();inst.repaint();}return true;}return false;}function TinyMCE_table_handleNodeChange(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){var colspan="1",rowspan="1";var inst=tinyMCE.getInstanceById(editor_id);tinyMCE.switchClassSticky(editor_id+'_table','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_row_props','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_cell_props','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_row_before','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_row_after','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_delete_row','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_col_before','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_col_after','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_delete_col','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_split_cells','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_merge_cells','mceButtonDisabled',true);if(tinyMCE.getParentElement(node,"tr"))tinyMCE.switchClassSticky(editor_id+'_row_props','mceButtonSelected',false);if(tdElm=tinyMCE.getParentElement(node,"td,th")){tinyMCE.switchClassSticky(editor_id+'_cell_props','mceButtonSelected',false);tinyMCE.switchClassSticky(editor_id+'_row_before','mceButtonNormal',false);tinyMCE.switchClassSticky(editor_id+'_row_after','mceButtonNormal',false);tinyMCE.switchClassSticky(editor_id+'_delete_row','mceButtonNormal',false);tinyMCE.switchClassSticky(editor_id+'_col_before','mceButtonNormal',false);tinyMCE.switchClassSticky(editor_id+'_col_after','mceButtonNormal',false);tinyMCE.switchClassSticky(editor_id+'_delete_col','mceButtonNormal',false);colspan=tinyMCE.getAttrib(tdElm,"colspan");rowspan=tinyMCE.getAttrib(tdElm,"rowspan");colspan=colspan==""?"1":colspan;rowspan=rowspan==""?"1":rowspan;if(colspan!="1"||rowspan!="1")tinyMCE.switchClassSticky(editor_id+'_split_cells','mceButtonNormal',false);}if(tinyMCE.getParentElement(node,"table")){tinyMCE.switchClassSticky(editor_id+'_table','mceButtonSelected');tinyMCE.switchClassSticky(editor_id+'_merge_cells','mceButtonNormal',false);}}
\ 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..fe77639
--- /dev/null
@@ -0,0 +1,1041 @@
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('table', 'en,ar,cs,da,de,el,es,fi,fr_ca,hu,it,ja,ko,nl,nb,pl,pt,pt_br,sv,tw,zh_cn,fr,de,he,nb,ru,ru_KOI8-R,ru_UTF-8,nn,cy,is,zh_tw,zh_tw_utf8,sk');\r
+\r
+function TinyMCE_table_getInfo() {\r
+       return {\r
+               longname : 'Tables',\r
+               author : 'Moxiecode Systems',\r
+               authorurl : 'http://tinymce.moxiecode.com',\r
+               infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_table.html',\r
+               version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+       };\r
+};\r
+\r
+function TinyMCE_table_initInstance(inst) {\r
+       if (tinyMCE.isGecko) {\r
+               var doc = inst.getDoc();\r
+               tinyMCE.addEvent(doc, "mouseup", TinyMCE_table_mouseDownHandler);\r
+       }\r
+\r
+       inst.tableRowClipboard = null;\r
+}\r
+\r
+function TinyMCE_table_mouseDownHandler(e) {\r
+       var elm = tinyMCE.isMSIE ? event.srcElement : e.target;\r
+       var focusElm = tinyMCE.selectedInstance.getFocusElement();\r
+\r
+       // If press on special Mozilla create TD/TR thingie\r
+       if (elm.nodeName == "BODY" && (focusElm.nodeName == "TD" || focusElm.nodeName == "TH" || (focusElm.parentNode && focusElm.parentNode.nodeName == "TD") ||(focusElm.parentNode && focusElm.parentNode.nodeName == "TH") )) {\r
+               window.setTimeout(function() {\r
+                       var tableElm = tinyMCE.getParentElement(focusElm, "table");\r
+                       tinyMCE.handleVisualAid(tableElm, true, tinyMCE.settings['visual'], tinyMCE.selectedInstance);\r
+               }, 10);\r
+       }\r
+}\r
+\r
+/**\r
+ * Returns the HTML contents of the table control.\r
+ */\r
+function TinyMCE_table_getControlHTML(control_name) {\r
+       var controls = new Array(\r
+               ['table', 'table.gif', '{$lang_table_desc}', 'mceInsertTable', true],\r
+               ['delete_col', 'table_delete_col.gif', '{$lang_table_delete_col_desc}', 'mceTableDeleteCol'],\r
+               ['delete_row', 'table_delete_row.gif', '{$lang_table_delete_row_desc}', 'mceTableDeleteRow'],\r
+               ['col_after', 'table_insert_col_after.gif', '{$lang_table_col_after_desc}', 'mceTableInsertColAfter'],\r
+               ['col_before', 'table_insert_col_before.gif', '{$lang_table_col_before_desc}', 'mceTableInsertColBefore'],\r
+               ['row_after', 'table_insert_row_after.gif', '{$lang_table_row_after_desc}', 'mceTableInsertRowAfter'],\r
+               ['row_before', 'table_insert_row_before.gif', '{$lang_table_row_before_desc}', 'mceTableInsertRowBefore'],\r
+               ['row_props', 'table_row_props.gif', '{$lang_table_row_desc}', 'mceTableRowProps', true],\r
+               ['cell_props', 'table_cell_props.gif', '{$lang_table_cell_desc}', 'mceTableCellProps', true],\r
+               ['split_cells', 'table_split_cells.gif', '{$lang_table_split_cells_desc}', 'mceTableSplitCells', true],\r
+               ['merge_cells', 'table_merge_cells.gif', '{$lang_table_merge_cells_desc}', 'mceTableMergeCells', true]);\r
+\r
+       // Render table control\r
+       for (var i=0; i<controls.length; i++) {\r
+               var but = controls[i];\r
+               var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'' + but[3] + '\', ' + (but.length > 4 ? but[4] : false) + (but.length > 5 ? ', \'' + but[5] + '\'' : '') + ');return false;';\r
+\r
+               if (but[0] == control_name && (tinyMCE.isMSIE || !tinyMCE.settings['button_tile_map']))\r
+                       return '<a href="javascript:' + cmd + '" onclick="' + cmd + '" onmousedown="return false;" target="_self"><img id="{$editor_id}_' + but[0] + '" src="{$pluginurl}/images/' + but[1] + '" title="' + but[2] + '" width="20" height="20" class="mceButtonDisabled" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';\r
+               else if (but[0] == control_name)\r
+                       return '<a href="javascript:' + cmd + '" onclick="' + cmd + '" onmousedown="return false;" target="_self"><img id="{$editor_id}_' + but[0] + '" src="{$themeurl}/images/spacer.gif" style="background-image:url({$pluginurl}/images/buttons.gif); background-position: ' + (0-(i*20)) + 'px 0px" title="' + but[2] + '" width="20" height="20" class="mceButtonDisabled" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';\r
+       }\r
+\r
+       // Special tablecontrols\r
+       if (control_name == "tablecontrols") {\r
+               var html = "";\r
+\r
+               html += tinyMCE.getControlHTML("table");\r
+               html += tinyMCE.getControlHTML("separator");\r
+               html += tinyMCE.getControlHTML("row_props");\r
+               html += tinyMCE.getControlHTML("cell_props");\r
+               html += tinyMCE.getControlHTML("separator");\r
+               html += tinyMCE.getControlHTML("row_before");\r
+               html += tinyMCE.getControlHTML("row_after");\r
+               html += tinyMCE.getControlHTML("delete_row");\r
+               html += tinyMCE.getControlHTML("separator");\r
+               html += tinyMCE.getControlHTML("col_before");\r
+               html += tinyMCE.getControlHTML("col_after");\r
+               html += tinyMCE.getControlHTML("delete_col");\r
+               html += tinyMCE.getControlHTML("separator");\r
+               html += tinyMCE.getControlHTML("split_cells");\r
+               html += tinyMCE.getControlHTML("merge_cells");\r
+\r
+               return html;\r
+       }\r
+\r
+       return "";\r
+}\r
+\r
+/**\r
+ * Executes the table commands.\r
+ */\r
+function TinyMCE_table_execCommand(editor_id, element, command, user_interface, value) {\r
+       // Is table command\r
+       switch (command) {\r
+               case "mceInsertTable":\r
+               case "mceTableRowProps":\r
+               case "mceTableCellProps":\r
+               case "mceTableSplitCells":\r
+               case "mceTableMergeCells":\r
+               case "mceTableInsertRowBefore":\r
+               case "mceTableInsertRowAfter":\r
+               case "mceTableDeleteRow":\r
+               case "mceTableInsertColBefore":\r
+               case "mceTableInsertColAfter":\r
+               case "mceTableDeleteCol":\r
+               case "mceTableCutRow":\r
+               case "mceTableCopyRow":\r
+               case "mceTablePasteRowBefore":\r
+               case "mceTablePasteRowAfter":\r
+               case "mceTableDelete":\r
+                       var inst = tinyMCE.getInstanceById(editor_id);\r
+\r
+                       inst.execCommand('mceBeginUndoLevel');\r
+                       TinyMCE_table_doExecCommand(editor_id, element, command, user_interface, value);\r
+                       inst.execCommand('mceEndUndoLevel');\r
+\r
+                       return true;\r
+       }\r
+\r
+       // Pass to next handler in chain\r
+       return false;\r
+}\r
+\r
+/**\r
+ * Executes the table commands.\r
+ */\r
+function TinyMCE_table_doExecCommand(editor_id, element, command, user_interface, value) {\r
+       var inst = tinyMCE.getInstanceById(editor_id);\r
+       var focusElm = inst.getFocusElement();\r
+       var trElm = tinyMCE.getParentElement(focusElm, "tr");\r
+       var tdElm = tinyMCE.getParentElement(focusElm, "td,th");\r
+       var tableElm = tinyMCE.getParentElement(focusElm, "table");\r
+       var doc = inst.contentWindow.document;\r
+       var tableBorder = tableElm ? tableElm.getAttribute("border") : "";\r
+\r
+       // Get first TD if no TD found\r
+       if (trElm && tdElm == null)\r
+               tdElm = trElm.cells[0];\r
+\r
+       // ------- Inner functions ---------\r
+       function inArray(ar, v) {\r
+               for (var i=0; i<ar.length; i++) {\r
+                       // Is array\r
+                       if (ar[i].length > 0 && inArray(ar[i], v))\r
+                               return true;\r
+\r
+                       // Found value\r
+                       if (ar[i] == v)\r
+                               return true;\r
+               }\r
+\r
+               return false;\r
+       }\r
+\r
+       function makeTD() {\r
+               var newTD = doc.createElement("td");\r
+               newTD.innerHTML = "&nbsp;";\r
+       }\r
+\r
+       function getColRowSpan(td) {\r
+               var colspan = tinyMCE.getAttrib(td, "colspan");\r
+               var rowspan = tinyMCE.getAttrib(td, "rowspan");\r
+\r
+               colspan = colspan == "" ? 1 : parseInt(colspan);\r
+               rowspan = rowspan == "" ? 1 : parseInt(rowspan);\r
+\r
+               return {colspan : colspan, rowspan : rowspan};\r
+       }\r
+\r
+       function getCellPos(grid, td) {\r
+               for (var y=0; y<grid.length; y++) {\r
+                       for (var x=0; x<grid[y].length; x++) {\r
+                               if (grid[y][x] == td)\r
+                                       return {cellindex : x, rowindex : y};\r
+                       }\r
+               }\r
+\r
+               return null;\r
+       }\r
+\r
+       function getCell(grid, row, col) {\r
+               if (grid[row] && grid[row][col])\r
+                       return grid[row][col];\r
+\r
+               return null;\r
+       }\r
+\r
+       function getTableGrid(table) {\r
+               var grid = new Array();\r
+               var rows = table.rows;\r
+\r
+               for (var y=0; y<rows.length; y++) {\r
+                       for (var x=0; x<rows[y].cells.length; x++) {\r
+                               var td = rows[y].cells[x];\r
+                               var sd = getColRowSpan(td);\r
+\r
+                               // All ready filled\r
+                               for (xstart = x; grid[y] && grid[y][xstart]; xstart++) ;\r
+\r
+                               // Fill box\r
+                               for (var y2=y; y2<y+sd['rowspan']; y2++) {\r
+                                       if (!grid[y2])\r
+                                               grid[y2] = new Array();\r
+\r
+                                       for (var x2=xstart; x2<xstart+sd['colspan']; x2++) {\r
+                                               grid[y2][x2] = td;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+\r
+               return grid;\r
+       }\r
+\r
+       function trimRow(table, tr, td, new_tr) {\r
+               var grid = getTableGrid(table);\r
+               var cpos = getCellPos(grid, td);\r
+\r
+               // Time to crop away some\r
+               if (new_tr.cells.length != tr.childNodes.length) {\r
+                       var cells = tr.childNodes;\r
+                       var lastElm = null;\r
+\r
+                       for (var x=0; td = getCell(grid, cpos.rowindex, x); x++) {\r
+                               var remove = true;\r
+                               var sd = getColRowSpan(td);\r
+\r
+                               // Remove due to rowspan\r
+                               if (inArray(cells, td)) {\r
+                                       new_tr.childNodes[x]._delete = true;\r
+                               } else if ((lastElm == null || td != lastElm) && sd.colspan > 1) { // Remove due to colspan\r
+                                       for (var i=x; i<x+td.colSpan; i++)\r
+                                               new_tr.childNodes[i]._delete = true;\r
+                               }\r
+\r
+                               if ((lastElm == null || td != lastElm) && sd.rowspan > 1)\r
+                                       td.rowSpan = sd.rowspan + 1;\r
+\r
+                               lastElm = td;\r
+                       }\r
+\r
+                       deleteMarked(tableElm);\r
+               }\r
+       }\r
+\r
+       function prevElm(node, name) {\r
+               while ((node = node.previousSibling) != null) {\r
+                       if (node.nodeName == name)\r
+                               return node;\r
+               }\r
+\r
+               return null;\r
+       }\r
+\r
+       function nextElm(node, names) {\r
+        var namesAr = names.split(',');\r
+\r
+               while ((node = node.nextSibling) != null) {\r
+            for (var i=0; i<namesAr.length; i++) {\r
+                if (node.nodeName.toLowerCase() == namesAr[i].toLowerCase() )\r
+                    return node;\r
+            }\r
+               }\r
+\r
+               return null;\r
+       }\r
+\r
+       function deleteMarked(tbl) {\r
+               if (tbl.rows == 0)\r
+                       return;\r
+\r
+               var tr = tbl.rows[0];\r
+               do {\r
+                       var next = nextElm(tr, "TR");\r
+\r
+                       // Delete row\r
+                       if (tr._delete) {\r
+                               tr.parentNode.removeChild(tr);\r
+                               continue;\r
+                       }\r
+\r
+                       // Delete cells\r
+                       var td = tr.cells[0];\r
+                       if (td.cells > 1) {\r
+                               do {\r
+                                       var nexttd = nextElm(td, "TD,TH");\r
+\r
+                                       if (td._delete)\r
+                                               td.parentNode.removeChild(td);\r
+                               } while ((td = nexttd) != null);\r
+                       }\r
+               } while ((tr = next) != null);\r
+       }\r
+\r
+       function addRows(td_elm, tr_elm, rowspan) {\r
+               // Add rows\r
+               td_elm.rowSpan = 1;\r
+               var trNext = nextElm(tr_elm, "TR");\r
+               for (var i=1; i<rowspan && trNext; i++) {\r
+                       var newTD = doc.createElement("td");\r
+                       newTD.innerHTML = "&nbsp;";\r
+\r
+                       if (tinyMCE.isMSIE)\r
+                               trNext.insertBefore(newTD, trNext.cells(td_elm.cellIndex));\r
+                       else\r
+                               trNext.insertBefore(newTD, trNext.cells[td_elm.cellIndex]);\r
+\r
+                       trNext = nextElm(trNext, "TR");\r
+               }\r
+       }\r
+\r
+       function copyRow(doc, table, tr) {\r
+               var grid = getTableGrid(table);\r
+               var newTR = tr.cloneNode(false);\r
+               var cpos = getCellPos(grid, tr.cells[0]);\r
+               var lastCell = null;\r
+               var tableBorder = tinyMCE.getAttrib(table, "border");\r
+               var tdElm = null;\r
+\r
+               for (var x=0; tdElm = getCell(grid, cpos.rowindex, x); x++) {\r
+                       var newTD = null;\r
+\r
+                       if (lastCell != tdElm) {\r
+                               for (var i=0; i<tr.cells.length; i++) {\r
+                                       if (tdElm == tr.cells[i]) {\r
+                                               newTD = tdElm.cloneNode(true);\r
+                                               break;\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       if (newTD == null) {\r
+                               newTD = doc.createElement("td");\r
+                               newTD.innerHTML = "&nbsp;";\r
+                       }\r
+\r
+                       // Reset col/row span\r
+                       newTD.colSpan = 1;\r
+                       newTD.rowSpan = 1;\r
+\r
+                       newTR.appendChild(newTD);\r
+\r
+                       lastCell = tdElm;\r
+               }\r
+\r
+               return newTR;\r
+       }\r
+\r
+       // ---- Commands -----\r
+\r
+       // Handle commands\r
+       switch (command) {\r
+               case "mceTableRowProps":\r
+                       if (trElm == null)\r
+                               return true;\r
+\r
+                       if (user_interface) {\r
+                               // Setup template\r
+                               var template = new Array();\r
+\r
+                               template['file'] = '../../plugins/table/row.htm';\r
+                               template['width'] = 380;\r
+                               template['height'] = 295;\r
+\r
+                               // Language specific width and height addons\r
+                               template['width'] += tinyMCE.getLang('lang_table_rowprops_delta_width', 0);\r
+                               template['height'] += tinyMCE.getLang('lang_table_rowprops_delta_height', 0);\r
+\r
+                               // Open window\r
+                               tinyMCE.openWindow(template, {editor_id : inst.editorId, inline : "yes"});\r
+                       }\r
+\r
+                       return true;\r
+\r
+               case "mceTableCellProps":\r
+                       if (tdElm == null)\r
+                               return true;\r
+\r
+                       if (user_interface) {\r
+                               // Setup template\r
+                               var template = new Array();\r
+\r
+                               template['file'] = '../../plugins/table/cell.htm';\r
+                               template['width'] = 380;\r
+                               template['height'] = 295;\r
+\r
+                               // Language specific width and height addons\r
+                               template['width'] += tinyMCE.getLang('lang_table_cellprops_delta_width', 0);\r
+                               template['height'] += tinyMCE.getLang('lang_table_cellprops_delta_height', 0);\r
+\r
+                               // Open window\r
+                               tinyMCE.openWindow(template, {editor_id : inst.editorId, inline : "yes"});\r
+                       }\r
+\r
+                       return true;\r
+\r
+               case "mceInsertTable":\r
+                       if (user_interface) {\r
+                               // Setup template\r
+                               var template = new Array();\r
+\r
+                               template['file'] = '../../plugins/table/table.htm';\r
+                               template['width'] = 380;\r
+                               template['height'] = 295;\r
+\r
+                               // Language specific width and height addons\r
+                               template['width'] += tinyMCE.getLang('lang_table_table_delta_width', 0);\r
+                               template['height'] += tinyMCE.getLang('lang_table_table_delta_height', 0);\r
+\r
+                               // Open window\r
+                               tinyMCE.openWindow(template, {editor_id : inst.editorId, inline : "yes", action : value});\r
+                       }\r
+\r
+                       return true;\r
+\r
+               case "mceTableDelete":\r
+                       var table = tinyMCE.getParentElement(inst.getFocusElement(), "table");\r
+                       if (table) {\r
+                               table.parentNode.removeChild(table);\r
+                               inst.repaint();\r
+                       }\r
+                       return true;\r
+\r
+               case "mceTableSplitCells":\r
+               case "mceTableMergeCells":\r
+               case "mceTableInsertRowBefore":\r
+               case "mceTableInsertRowAfter":\r
+               case "mceTableDeleteRow":\r
+               case "mceTableInsertColBefore":\r
+               case "mceTableInsertColAfter":\r
+               case "mceTableDeleteCol":\r
+               case "mceTableCutRow":\r
+               case "mceTableCopyRow":\r
+               case "mceTablePasteRowBefore":\r
+               case "mceTablePasteRowAfter":\r
+                       // No table just return (invalid command)\r
+                       if (!tableElm)\r
+                               return true;\r
+\r
+                       // Table has a tbody use that reference\r
+                       // Changed logic by ApTest 2005.07.12 (www.aptest.com)\r
+                       // Now lookk at the focused element and take its parentNode.  That will be a tbody or a table.\r
+                       if (tableElm != trElm.parentNode)\r
+                               tableElm = trElm.parentNode;\r
+\r
+                       if (tableElm && trElm) {\r
+                               switch (command) {\r
+                                       case "mceTableInsertRowBefore":\r
+                                               if (!trElm || !tdElm)\r
+                                                       return true;\r
+\r
+                                               var grid = getTableGrid(tableElm);\r
+                                               var cpos = getCellPos(grid, tdElm);\r
+                                               var newTR = doc.createElement("tr");\r
+                                               var lastTDElm = null;\r
+\r
+                                               cpos.rowindex--;\r
+                                               if (cpos.rowindex < 0)\r
+                                                       cpos.rowindex = 0;\r
+\r
+                                               // Create cells\r
+                                               for (var x=0; tdElm = getCell(grid, cpos.rowindex, x); x++) {\r
+                                                       if (tdElm != lastTDElm) {\r
+                                                               var sd = getColRowSpan(tdElm);\r
+\r
+                                                               if (sd['rowspan'] == 1) {\r
+                                                                       var newTD = doc.createElement("td");\r
+\r
+                                                                       newTD.innerHTML = "&nbsp;";\r
+                                                                       newTD.colSpan = tdElm.colSpan;\r
+\r
+                                                                       newTR.appendChild(newTD);\r
+                                                               } else\r
+                                                                       tdElm.rowSpan = sd['rowspan'] + 1;\r
+\r
+                                                               lastTDElm = tdElm;\r
+                                                       }\r
+                                               }\r
+\r
+                                               trElm.parentNode.insertBefore(newTR, trElm);\r
+                                       break;\r
+\r
+                                       case "mceTableCutRow":\r
+                                               if (!trElm || !tdElm)\r
+                                                       return true;\r
+\r
+                                               inst.tableRowClipboard = copyRow(doc, tableElm, trElm);\r
+                                               inst.execCommand("mceTableDeleteRow");\r
+                                               break;\r
+\r
+                                       case "mceTableCopyRow":\r
+                                               if (!trElm || !tdElm)\r
+                                                       return true;\r
+\r
+                                               inst.tableRowClipboard = copyRow(doc, tableElm, trElm);\r
+                                               break;\r
+\r
+                                       case "mceTablePasteRowBefore":\r
+                                               if (!trElm || !tdElm)\r
+                                                       return true;\r
+\r
+                                               var newTR = inst.tableRowClipboard.cloneNode(true);\r
+\r
+                                               var prevTR = prevElm(trElm, "TR");\r
+                                               if (prevTR != null)\r
+                                                       trimRow(tableElm, prevTR, prevTR.cells[0], newTR);\r
+\r
+                                               trElm.parentNode.insertBefore(newTR, trElm);\r
+                                               break;\r
+\r
+                                       case "mceTablePasteRowAfter":\r
+                                               if (!trElm || !tdElm)\r
+                                                       return true;\r
+                                               \r
+                                               var nextTR = nextElm(trElm, "TR");\r
+                                               var newTR = inst.tableRowClipboard.cloneNode(true);\r
+\r
+                                               trimRow(tableElm, trElm, tdElm, newTR);\r
+\r
+                                               if (nextTR == null)\r
+                                                       trElm.parentNode.appendChild(newTR);\r
+                                               else\r
+                                                       nextTR.parentNode.insertBefore(newTR, nextTR);\r
+\r
+                                               break;\r
+\r
+                                       case "mceTableInsertRowAfter":\r
+                                               if (!trElm || !tdElm)\r
+                                                       return true;\r
+\r
+                                               var grid = getTableGrid(tableElm);\r
+                                               var cpos = getCellPos(grid, tdElm);\r
+                                               var newTR = doc.createElement("tr");\r
+                                               var lastTDElm = null;\r
+\r
+                                               // Create cells\r
+                                               for (var x=0; tdElm = getCell(grid, cpos.rowindex, x); x++) {\r
+                                                       if (tdElm != lastTDElm) {\r
+                                                               var sd = getColRowSpan(tdElm);\r
+\r
+                                                               if (sd['rowspan'] == 1) {\r
+                                                                       var newTD = doc.createElement("td");\r
+\r
+                                                                       newTD.innerHTML = "&nbsp;";\r
+                                                                       newTD.colSpan = tdElm.colSpan;\r
+\r
+                                                                       newTR.appendChild(newTD);\r
+                                                               } else\r
+                                                                       tdElm.rowSpan = sd['rowspan'] + 1;\r
+\r
+                                                               lastTDElm = tdElm;\r
+                                                       }\r
+                                               }\r
+\r
+                                               if (newTR.hasChildNodes()) {\r
+                                                       var nextTR = nextElm(trElm, "TR");\r
+                                                       if (nextTR)\r
+                                                               nextTR.parentNode.insertBefore(newTR, nextTR);\r
+                                                       else\r
+                                                               tableElm.appendChild(newTR);\r
+                                               }\r
+                                       break;\r
+\r
+                                       case "mceTableDeleteRow":\r
+                                               if (!trElm || !tdElm)\r
+                                                       return true;\r
+       \r
+                                               var grid = getTableGrid(tableElm);\r
+                                               var cpos = getCellPos(grid, tdElm);\r
+\r
+                                               // Only one row, remove whole table\r
+                                               if (grid.length == 1) {\r
+                                                       tableElm.parentNode.removeChild(tableElm);\r
+                                                       return true;\r
+                                               }\r
+\r
+                                               // Move down row spanned cells\r
+                                               var cells = trElm.cells;\r
+                                               var nextTR = nextElm(trElm, "TR");\r
+                                               for (var x=0; x<cells.length; x++) {\r
+                                                       if (cells[x].rowSpan > 1) {\r
+                                                               var newTD = cells[x].cloneNode(true);\r
+                                                               var sd = getColRowSpan(cells[x]);\r
+\r
+                                                               newTD.rowSpan = sd.rowspan - 1;\r
+\r
+                                                               var nextTD = nextTR.cells[x];\r
+\r
+                                                               if (nextTD == null)\r
+                                                                       nextTR.appendChild(newTD);\r
+                                                               else\r
+                                                                       nextTR.insertBefore(newTD, nextTD);\r
+                                                       }\r
+                                               }\r
+\r
+                                               // Delete cells\r
+                                               var lastTDElm = null;\r
+                                               for (var x=0; tdElm = getCell(grid, cpos.rowindex, x); x++) {\r
+                                                       if (tdElm != lastTDElm) {\r
+                                                               var sd = getColRowSpan(tdElm);\r
+\r
+                                                               if (sd.rowspan > 1) {\r
+                                                                       tdElm.rowSpan = sd.rowspan - 1;\r
+                                                               } else {\r
+                                                                       trElm = tdElm.parentNode;\r
+\r
+                                                                       if (trElm.parentNode)\r
+                                                                               trElm._delete = true;\r
+                                                               }\r
+\r
+                                                               lastTDElm = tdElm;\r
+                                                       }\r
+                                               }\r
+\r
+                                               deleteMarked(tableElm);\r
+\r
+                                               cpos.rowindex--;\r
+                                               if (cpos.rowindex < 0)\r
+                                                       cpos.rowindex = 0;\r
+\r
+                                               inst.selectNode(getCell(grid, cpos.rowindex, 0), true, true);\r
+                                       break;\r
+\r
+                                       case "mceTableInsertColBefore":\r
+                                               if (!trElm || !tdElm)\r
+                                                       return true;\r
+\r
+                                               var grid = getTableGrid(tableElm);\r
+                                               var cpos = getCellPos(grid, tdElm);\r
+                                               var lastTDElm = null;\r
+\r
+                                               for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) {\r
+                                                       if (tdElm != lastTDElm) {\r
+                                                               var sd = getColRowSpan(tdElm);\r
+\r
+                                                               if (sd['colspan'] == 1) {\r
+                                                                       var newTD = doc.createElement(tdElm.nodeName);\r
+\r
+                                                                       newTD.innerHTML = "&nbsp;";\r
+                                                                       newTD.rowSpan = tdElm.rowSpan;\r
+\r
+                                                                       tdElm.parentNode.insertBefore(newTD, tdElm);\r
+                                                               } else\r
+                                                                       tdElm.colSpan++;\r
+\r
+                                                               lastTDElm = tdElm;\r
+                                                       }\r
+                                               }\r
+                                       break;\r
+\r
+                                       case "mceTableInsertColAfter":\r
+                                               if (!trElm || !tdElm)\r
+                                                       return true;\r
+\r
+                                               var grid = getTableGrid(tableElm);\r
+                                               var cpos = getCellPos(grid, tdElm);\r
+                                               var lastTDElm = null;\r
+\r
+                                               for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) {\r
+                                                       if (tdElm != lastTDElm) {\r
+                                                               var sd = getColRowSpan(tdElm);\r
+\r
+                                                               if (sd['colspan'] == 1) {\r
+                                                                       var newTD = doc.createElement(tdElm.nodeName);\r
+\r
+                                                                       newTD.innerHTML = "&nbsp;";\r
+                                                                       newTD.rowSpan = tdElm.rowSpan;\r
+\r
+                                                                       var nextTD = nextElm(tdElm, "TD,TH");\r
+                                                                       if (nextTD == null)\r
+                                                                               tdElm.parentNode.appendChild(newTD);\r
+                                                                       else\r
+                                                                               nextTD.parentNode.insertBefore(newTD, nextTD);\r
+                                                               } else\r
+                                                                       tdElm.colSpan++;\r
+\r
+                                                               lastTDElm = tdElm;\r
+                                                       }\r
+                                               }\r
+                                       break;\r
+\r
+                                       case "mceTableDeleteCol":\r
+                                               if (!trElm || !tdElm)\r
+                                                       return true;\r
+\r
+                                               var grid = getTableGrid(tableElm);\r
+                                               var cpos = getCellPos(grid, tdElm);\r
+                                               var lastTDElm = null;\r
+\r
+                                               // Only one col, remove whole table\r
+                                               if (grid.length > 1 && grid[0].length <= 1) {\r
+                                                       tableElm.parentNode.removeChild(tableElm);\r
+                                                       return true;\r
+                                               }\r
+\r
+                                               // Delete cells\r
+                                               for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) {\r
+                                                       if (tdElm != lastTDElm) {\r
+                                                               var sd = getColRowSpan(tdElm);\r
+\r
+                                                               if (sd['colspan'] > 1)\r
+                                                                       tdElm.colSpan = sd['colspan'] - 1;\r
+                                                               else {\r
+                                                                       if (tdElm.parentNode)\r
+                                                                               tdElm.parentNode.removeChild(tdElm);\r
+                                                               }\r
+\r
+                                                               lastTDElm = tdElm;\r
+                                                       }\r
+                                               }\r
+\r
+                                               cpos.cellindex--;\r
+                                               if (cpos.cellindex < 0)\r
+                                                       cpos.cellindex = 0;\r
+\r
+                                               inst.selectNode(getCell(grid, 0, cpos.cellindex), true, true);\r
+                                       break;\r
+\r
+                               case "mceTableSplitCells":\r
+                                       if (!trElm || !tdElm)\r
+                                               return true;\r
+\r
+                                       var spandata = getColRowSpan(tdElm);\r
+\r
+                                       var colspan = spandata["colspan"];\r
+                                       var rowspan = spandata["rowspan"];\r
+\r
+                                       // Needs splitting\r
+                                       if (colspan > 1 || rowspan > 1) {\r
+                                               // Generate cols\r
+                                               tdElm.colSpan = 1;\r
+                                               for (var i=1; i<colspan; i++) {\r
+                                                       var newTD = doc.createElement("td");\r
+\r
+                                                       newTD.innerHTML = "&nbsp;";\r
+\r
+                                                       trElm.insertBefore(newTD, nextElm(tdElm, "TD,TH"));\r
+\r
+                                                       if (rowspan > 1)\r
+                                                               addRows(newTD, trElm, rowspan);\r
+                                               }\r
+\r
+                                               addRows(tdElm, trElm, rowspan);\r
+                                       }\r
+\r
+                                       // Apply visual aids\r
+                                       tableElm = tinyMCE.getParentElement(inst.getFocusElement(), "table");\r
+                                       break;\r
+\r
+                               case "mceTableMergeCells":\r
+                                       var rows = new Array();\r
+                                       var sel = inst.getSel();\r
+                                       var grid = getTableGrid(tableElm);\r
+\r
+                                       if (tinyMCE.isMSIE || sel.rangeCount == 1) {\r
+                                               if (user_interface) {\r
+                                                       // Setup template\r
+                                                       var template = new Array();\r
+                                                       var sp = getColRowSpan(tdElm);\r
+\r
+                                                       template['file'] = '../../plugins/table/merge_cells.htm';\r
+                                                       template['width'] = 250;\r
+                                                       template['height'] = 105 + (tinyMCE.isNS7 ? 25 : 0);\r
+\r
+                                                       // Language specific width and height addons\r
+                                                       template['width'] += tinyMCE.getLang('lang_table_merge_cells_delta_width', 0);\r
+                                                       template['height'] += tinyMCE.getLang('lang_table_merge_cells_delta_height', 0);\r
+\r
+                                                       // Open window\r
+                                                       tinyMCE.openWindow(template, {editor_id : inst.editorId, inline : "yes", action : "update", numcols : sp.colspan, numrows : sp.rowspan});\r
+\r
+                                                       return true;\r
+                                               } else {\r
+                                                       var numRows = parseInt(value['numrows']);\r
+                                                       var numCols = parseInt(value['numcols']);\r
+                                                       var cpos = getCellPos(grid, tdElm);\r
+\r
+                                                       if (("" + numRows) == "NaN")\r
+                                                               numRows = 1;\r
+\r
+                                                       if (("" + numCols) == "NaN")\r
+                                                               numCols = 1;\r
+\r
+                                                       // Get rows and cells\r
+                                                       var tRows = tableElm.rows;\r
+                                                       for (var y=cpos.rowindex; y<grid.length; y++) {\r
+                                                               var rowCells = new Array();\r
+\r
+                                                               for (var x=cpos.cellindex; x<grid[y].length; x++) {\r
+                                                                       var td = getCell(grid, y, x);\r
+\r
+                                                                       if (td && !inArray(rows, td) && !inArray(rowCells, td)) {\r
+                                                                               var cp = getCellPos(grid, td);\r
+\r
+                                                                               // Within range\r
+                                                                               if (cp.cellindex < cpos.cellindex+numCols && cp.rowindex < cpos.rowindex+numRows)\r
+                                                                                       rowCells[rowCells.length] = td;\r
+                                                                       }\r
+                                                               }\r
+\r
+                                                               if (rowCells.length > 0)\r
+                                                                       rows[rows.length] = rowCells;\r
+                                                       }\r
+\r
+                                                       //return true;\r
+                                               }\r
+                                       } else {\r
+                                               var cells = new Array();\r
+                                               var sel = inst.getSel();\r
+                                               var lastTR = null;\r
+                                               var curRow = null;\r
+                                               var x1 = -1, y1 = -1, x2, y2;\r
+\r
+                                               // Only one cell selected, whats the point?\r
+                                               if (sel.rangeCount < 2)\r
+                                                       return true;\r
+\r
+                                               // Get all selected cells\r
+                                               for (var i=0; i<sel.rangeCount; i++) {\r
+                                                       var rng = sel.getRangeAt(i);\r
+                                                       var tdElm = rng.startContainer.childNodes[rng.startOffset];\r
+\r
+                                                       if (!tdElm)\r
+                                                               break;\r
+\r
+                                                       if (tdElm.nodeName == "TD")\r
+                                                               cells[cells.length] = tdElm;\r
+                                               }\r
+\r
+                                               // Get rows and cells\r
+                                               var tRows = tableElm.rows;\r
+                                               for (var y=0; y<tRows.length; y++) {\r
+                                                       var rowCells = new Array();\r
+\r
+                                                       for (var x=0; x<tRows[y].cells.length; x++) {\r
+                                                               var td = tRows[y].cells[x];\r
+\r
+                                                               for (var i=0; i<cells.length; i++) {\r
+                                                                       if (td == cells[i]) {\r
+                                                                               rowCells[rowCells.length] = td;\r
+                                                                       }\r
+                                                               }\r
+                                                       }\r
+\r
+                                                       if (rowCells.length > 0)\r
+                                                               rows[rows.length] = rowCells;\r
+                                               }\r
+\r
+                                               // Find selected cells in grid and box\r
+                                               var curRow = new Array();\r
+                                               var lastTR = null;\r
+                                               for (var y=0; y<grid.length; y++) {\r
+                                                       for (var x=0; x<grid[y].length; x++) {\r
+                                                               grid[y][x]._selected = false;\r
+\r
+                                                               for (var i=0; i<cells.length; i++) {\r
+                                                                       if (grid[y][x] == cells[i]) {\r
+                                                                               // Get start pos\r
+                                                                               if (x1 == -1) {\r
+                                                                                       x1 = x;\r
+                                                                                       y1 = y;\r
+                                                                               }\r
+\r
+                                                                               // Get end pos\r
+                                                                               x2 = x;\r
+                                                                               y2 = y;\r
+\r
+                                                                               grid[y][x]._selected = true;\r
+                                                                       }\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+\r
+                                               // Is there gaps, if so deny\r
+                                               for (var y=y1; y<=y2; y++) {\r
+                                                       for (var x=x1; x<=x2; x++) {\r
+                                                               if (!grid[y][x]._selected) {\r
+                                                                       alert("Invalid selection for merge.");\r
+                                                                       return true;\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+                                       }\r
+\r
+                                       // Validate selection and get total rowspan and colspan\r
+                                       var rowSpan = 1, colSpan = 1;\r
+\r
+                                       // Validate horizontal and get total colspan\r
+                                       var lastRowSpan = -1;\r
+                                       for (var y=0; y<rows.length; y++) {\r
+                                               var rowColSpan = 0;\r
+\r
+                                               for (var x=0; x<rows[y].length; x++) {\r
+                                                       var sd = getColRowSpan(rows[y][x]);\r
+\r
+                                                       rowColSpan += sd['colspan'];\r
+\r
+                                                       if (lastRowSpan != -1 && sd['rowspan'] != lastRowSpan) {\r
+                                                               alert("Invalid selection for merge.");\r
+                                                               return true;\r
+                                                       }\r
+\r
+                                                       lastRowSpan = sd['rowspan'];\r
+                                               }\r
+\r
+                                               if (rowColSpan > colSpan)\r
+                                                       colSpan = rowColSpan;\r
+\r
+                                               lastRowSpan = -1;\r
+                                       }\r
+\r
+                                       // Validate vertical and get total rowspan\r
+                                       var lastColSpan = -1;\r
+                                       for (var x=0; x<rows[0].length; x++) {\r
+                                               var colRowSpan = 0;\r
+\r
+                                               for (var y=0; y<rows.length; y++) {\r
+                                                       var sd = getColRowSpan(rows[y][x]);\r
+\r
+                                                       colRowSpan += sd['rowspan'];\r
+\r
+                                                       if (lastColSpan != -1 && sd['colspan'] != lastColSpan) {\r
+                                                               alert("Invalid selection for merge.");\r
+                                                               return true;\r
+                                                       }\r
+\r
+                                                       lastColSpan = sd['colspan'];\r
+                                               }\r
+\r
+                                               if (colRowSpan > rowSpan)\r
+                                                       rowSpan = colRowSpan;\r
+\r
+                                               lastColSpan = -1;\r
+                                       }\r
+\r
+                                       // Setup td\r
+                                       tdElm = rows[0][0];\r
+                                       tdElm.rowSpan = rowSpan;\r
+                                       tdElm.colSpan = colSpan;\r
+\r
+                                       // Merge cells\r
+                                       for (var y=0; y<rows.length; y++) {\r
+                                               for (var x=0; x<rows[y].length; x++) {\r
+                                                       var html = rows[y][x].innerHTML;\r
+                                                       var chk = tinyMCE.regexpReplace(html, "[ \t\r\n]", "");\r
+\r
+                                                       if (chk != "<br/>" && chk != "<br>" && chk != "&nbsp;" && (x+y > 0))\r
+                                                               tdElm.innerHTML += html;\r
+\r
+                                                       // Not current cell\r
+                                                       if (rows[y][x] != tdElm && !rows[y][x]._deleted) {\r
+                                                               var cpos = getCellPos(grid, rows[y][x]);\r
+                                                               var tr = rows[y][x].parentNode;\r
+\r
+                                                               tr.removeChild(rows[y][x]);\r
+                                                               rows[y][x]._deleted = true;\r
+\r
+                                                               // Empty TR, remove it\r
+                                                               if (!tr.hasChildNodes()) {\r
+                                                                       tr.parentNode.removeChild(tr);\r
+\r
+                                                                       var lastCell = null;\r
+                                                                       for (var x=0; cellElm = getCell(grid, cpos.rowindex, x); x++) {\r
+                                                                               if (cellElm != lastCell && cellElm.rowSpan > 1)\r
+                                                                                       cellElm.rowSpan--;\r
+\r
+                                                                               lastCell = cellElm;\r
+                                                                       }\r
+\r
+                                                                       if (tdElm.rowSpan > 1)\r
+                                                                               tdElm.rowSpan--;\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+                                       }\r
+\r
+                                       break;\r
+                               }\r
+\r
+                               tableElm = tinyMCE.getParentElement(inst.getFocusElement(), "table");\r
+                               tinyMCE.handleVisualAid(tableElm, true, tinyMCE.settings['visual'], tinyMCE.selectedInstance);\r
+                               tinyMCE.triggerNodeChange();\r
+                               inst.repaint();\r
+                       }\r
+\r
+               return true;\r
+       }\r
+\r
+       // Pass to next handler in chain\r
+       return false;\r
+}\r
+\r
+function TinyMCE_table_handleNodeChange(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {\r
+       var colspan = "1", rowspan = "1";\r
+\r
+       var inst = tinyMCE.getInstanceById(editor_id);\r
+\r
+       // Reset table controls\r
+       tinyMCE.switchClassSticky(editor_id + '_table', 'mceButtonNormal');\r
+       tinyMCE.switchClassSticky(editor_id + '_row_props', 'mceButtonDisabled', true);\r
+       tinyMCE.switchClassSticky(editor_id + '_cell_props', 'mceButtonDisabled', true);\r
+       tinyMCE.switchClassSticky(editor_id + '_row_before', 'mceButtonDisabled', true);\r
+       tinyMCE.switchClassSticky(editor_id + '_row_after', 'mceButtonDisabled', true);\r
+       tinyMCE.switchClassSticky(editor_id + '_delete_row', 'mceButtonDisabled', true);\r
+       tinyMCE.switchClassSticky(editor_id + '_col_before', 'mceButtonDisabled', true);\r
+       tinyMCE.switchClassSticky(editor_id + '_col_after', 'mceButtonDisabled', true);\r
+       tinyMCE.switchClassSticky(editor_id + '_delete_col', 'mceButtonDisabled', true);\r
+       tinyMCE.switchClassSticky(editor_id + '_split_cells', 'mceButtonDisabled', true);\r
+       tinyMCE.switchClassSticky(editor_id + '_merge_cells', 'mceButtonDisabled', true);\r
+\r
+       // Within a tr element\r
+       if (tinyMCE.getParentElement(node, "tr"))\r
+               tinyMCE.switchClassSticky(editor_id + '_row_props', 'mceButtonSelected', false);\r
+\r
+       // Within a td element\r
+       if (tdElm = tinyMCE.getParentElement(node, "td,th")) {\r
+               tinyMCE.switchClassSticky(editor_id + '_cell_props', 'mceButtonSelected', false);\r
+               tinyMCE.switchClassSticky(editor_id + '_row_before', 'mceButtonNormal', false);\r
+               tinyMCE.switchClassSticky(editor_id + '_row_after', 'mceButtonNormal', false);\r
+               tinyMCE.switchClassSticky(editor_id + '_delete_row', 'mceButtonNormal', false);\r
+               tinyMCE.switchClassSticky(editor_id + '_col_before', 'mceButtonNormal', false);\r
+               tinyMCE.switchClassSticky(editor_id + '_col_after', 'mceButtonNormal', false);\r
+               tinyMCE.switchClassSticky(editor_id + '_delete_col', 'mceButtonNormal', false);\r
+\r
+               colspan = tinyMCE.getAttrib(tdElm, "colspan");\r
+               rowspan = tinyMCE.getAttrib(tdElm, "rowspan");\r
+\r
+               colspan = colspan == "" ? "1" : colspan;\r
+               rowspan = rowspan == "" ? "1" : rowspan;\r
+\r
+               if (colspan != "1" || rowspan != "1")\r
+                       tinyMCE.switchClassSticky(editor_id + '_split_cells', 'mceButtonNormal', false);\r
+       }\r
+\r
+       // Within table\r
+       if (tinyMCE.getParentElement(node, "table")) {\r
+               tinyMCE.switchClassSticky(editor_id + '_table', 'mceButtonSelected');\r
+               tinyMCE.switchClassSticky(editor_id + '_merge_cells', 'mceButtonNormal', false);\r
+       }\r
+}\r
diff --git a/webcit/tiny_mce/plugins/table/images/buttons.gif b/webcit/tiny_mce/plugins/table/images/buttons.gif
new file mode 100644 (file)
index 0000000..bfc1568
Binary files /dev/null and b/webcit/tiny_mce/plugins/table/images/buttons.gif differ
diff --git a/webcit/tiny_mce/plugins/table/images/table.gif b/webcit/tiny_mce/plugins/table/images/table.gif
new file mode 100644 (file)
index 0000000..2911830
Binary files /dev/null and b/webcit/tiny_mce/plugins/table/images/table.gif differ
diff --git a/webcit/tiny_mce/plugins/table/images/table_cell_props.gif b/webcit/tiny_mce/plugins/table/images/table_cell_props.gif
new file mode 100644 (file)
index 0000000..bee7ed6
Binary files /dev/null and b/webcit/tiny_mce/plugins/table/images/table_cell_props.gif differ
diff --git a/webcit/tiny_mce/plugins/table/images/table_delete.gif b/webcit/tiny_mce/plugins/table/images/table_delete.gif
new file mode 100644 (file)
index 0000000..2a00e6a
Binary files /dev/null and b/webcit/tiny_mce/plugins/table/images/table_delete.gif differ
diff --git a/webcit/tiny_mce/plugins/table/images/table_delete_col.gif b/webcit/tiny_mce/plugins/table/images/table_delete_col.gif
new file mode 100644 (file)
index 0000000..91f53af
Binary files /dev/null and b/webcit/tiny_mce/plugins/table/images/table_delete_col.gif differ
diff --git a/webcit/tiny_mce/plugins/table/images/table_delete_row.gif b/webcit/tiny_mce/plugins/table/images/table_delete_row.gif
new file mode 100644 (file)
index 0000000..7025733
Binary files /dev/null and b/webcit/tiny_mce/plugins/table/images/table_delete_row.gif differ
diff --git a/webcit/tiny_mce/plugins/table/images/table_insert_col_after.gif b/webcit/tiny_mce/plugins/table/images/table_insert_col_after.gif
new file mode 100644 (file)
index 0000000..8505808
Binary files /dev/null and b/webcit/tiny_mce/plugins/table/images/table_insert_col_after.gif differ
diff --git a/webcit/tiny_mce/plugins/table/images/table_insert_col_before.gif b/webcit/tiny_mce/plugins/table/images/table_insert_col_before.gif
new file mode 100644 (file)
index 0000000..b669d4f
Binary files /dev/null and b/webcit/tiny_mce/plugins/table/images/table_insert_col_before.gif differ
diff --git a/webcit/tiny_mce/plugins/table/images/table_insert_row_after.gif b/webcit/tiny_mce/plugins/table/images/table_insert_row_after.gif
new file mode 100644 (file)
index 0000000..b9c1446
Binary files /dev/null and b/webcit/tiny_mce/plugins/table/images/table_insert_row_after.gif differ
diff --git a/webcit/tiny_mce/plugins/table/images/table_insert_row_before.gif b/webcit/tiny_mce/plugins/table/images/table_insert_row_before.gif
new file mode 100644 (file)
index 0000000..157d373
Binary files /dev/null and b/webcit/tiny_mce/plugins/table/images/table_insert_row_before.gif differ
diff --git a/webcit/tiny_mce/plugins/table/images/table_merge_cells.gif b/webcit/tiny_mce/plugins/table/images/table_merge_cells.gif
new file mode 100644 (file)
index 0000000..6834e61
Binary files /dev/null and b/webcit/tiny_mce/plugins/table/images/table_merge_cells.gif differ
diff --git a/webcit/tiny_mce/plugins/table/images/table_row_props.gif b/webcit/tiny_mce/plugins/table/images/table_row_props.gif
new file mode 100644 (file)
index 0000000..e5c7cc3
Binary files /dev/null and b/webcit/tiny_mce/plugins/table/images/table_row_props.gif differ
diff --git a/webcit/tiny_mce/plugins/table/images/table_split_cells.gif b/webcit/tiny_mce/plugins/table/images/table_split_cells.gif
new file mode 100644 (file)
index 0000000..8ccb1b5
Binary files /dev/null and b/webcit/tiny_mce/plugins/table/images/table_split_cells.gif differ
diff --git a/webcit/tiny_mce/plugins/table/jscripts/cell.js b/webcit/tiny_mce/plugins/table/jscripts/cell.js
new file mode 100644 (file)
index 0000000..436eaad
--- /dev/null
@@ -0,0 +1,249 @@
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table');\r
+       document.getElementById('bordercolor_pickcontainer').innerHTML = getColorPickerHTML('bordercolor_pick','bordercolor');\r
+       document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor')\r
+\r
+       var inst = tinyMCE.selectedInstance;\r
+       var tdElm = tinyMCE.getParentElement(inst.getFocusElement(), "td,th");\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(tinyMCE.getAttrib(tdElm, "style"));\r
+\r
+       // Get table cell data\r
+       var celltype = tdElm.nodeName.toLowerCase();\r
+       var align = tinyMCE.getAttrib(tdElm, 'align');\r
+       var valign = tinyMCE.getAttrib(tdElm, 'valign');\r
+       var width = trimSize(getStyle(tdElm, 'width', 'width'));\r
+       var height = trimSize(getStyle(tdElm, 'height', 'height'));\r
+       var bordercolor = convertRGBToHex(getStyle(tdElm, 'bordercolor', 'borderLeftColor'));\r
+       var bgcolor = convertRGBToHex(getStyle(tdElm, 'bgcolor', 'backgroundColor'));\r
+       var className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(tdElm, 'class'), false);\r
+       var backgroundimage = getStyle(tdElm, 'background', 'backgroundImage').replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");;\r
+       var id = tinyMCE.getAttrib(tdElm, 'id');\r
+       var lang = tinyMCE.getAttrib(tdElm, 'lang');\r
+       var dir = tinyMCE.getAttrib(tdElm, 'dir');\r
+       var scope = tinyMCE.getAttrib(tdElm, 'scope');\r
+\r
+       // Setup form\r
+       addClassesToList('class', 'table_cell_styles');\r
+       formObj.bordercolor.value = bordercolor;\r
+       formObj.bgcolor.value = bgcolor;\r
+       formObj.backgroundimage.value = backgroundimage;\r
+       formObj.width.value = width;\r
+       formObj.height.value = height;\r
+       formObj.id.value = id;\r
+       formObj.lang.value = lang;\r
+       formObj.style.value = tinyMCE.serializeStyle(st);\r
+       selectByValue(formObj, 'align', align);\r
+       selectByValue(formObj, 'valign', valign);\r
+       selectByValue(formObj, 'class', className);\r
+       selectByValue(formObj, 'celltype', celltype);\r
+       selectByValue(formObj, 'dir', dir);\r
+       selectByValue(formObj, 'scope', scope);\r
+\r
+       // Resize some elements\r
+       if (isVisible('backgroundimagebrowser'))\r
+               document.getElementById('backgroundimage').style.width = '180px';\r
+\r
+       updateColor('bordercolor_pick', 'bordercolor');\r
+       updateColor('bgcolor_pick', 'bgcolor');\r
+}\r
+\r
+function updateAction() {\r
+       tinyMCEPopup.restoreSelection();\r
+\r
+       var inst = tinyMCE.selectedInstance;\r
+       var tdElm = tinyMCE.getParentElement(inst.getFocusElement(), "td,th");\r
+       var trElm = tinyMCE.getParentElement(inst.getFocusElement(), "tr");\r
+       var tableElm = tinyMCE.getParentElement(inst.getFocusElement(), "table");\r
+       var formObj = document.forms[0];\r
+\r
+       inst.execCommand('mceBeginUndoLevel');\r
+\r
+       switch (getSelectValue(formObj, 'action')) {\r
+               case "cell":\r
+                       var celltype = getSelectValue(formObj, 'celltype');\r
+                       var scope = getSelectValue(formObj, 'scope');\r
+\r
+                       if (tinyMCE.getParam("accessibility_warnings")) {\r
+                               if (celltype == "th" && scope == "")\r
+                                       var answer = confirm(tinyMCE.getLang('lang_table_missing_scope', '', true));\r
+                               else\r
+                                       var answer = true;\r
+\r
+                               if (!answer)\r
+                                       return;\r
+                       }\r
+\r
+                       updateCell(tdElm);\r
+                       break;\r
+\r
+               case "row":\r
+                       var cell = trElm.firstChild;\r
+\r
+                       if (cell.nodeName != "TD" && cell.nodeName != "TH")\r
+                               cell = nextCell(cell);\r
+\r
+                       do {\r
+                               cell = updateCell(cell, true);\r
+                       } while ((cell = nextCell(cell)) != null);\r
+\r
+                       break;\r
+\r
+               case "all":\r
+                       var rows = tableElm.getElementsByTagName("tr");\r
+\r
+                       for (var i=0; i<rows.length; i++) {\r
+                               var cell = rows[i].firstChild;\r
+\r
+                               if (cell.nodeName != "TD" && cell.nodeName != "TH")\r
+                                       cell = nextCell(cell);\r
+\r
+                               do {\r
+                                       cell = updateCell(cell, true);\r
+                               } while ((cell = nextCell(cell)) != null);\r
+                       }\r
+\r
+                       break;\r
+       }\r
+\r
+       tinyMCE.handleVisualAid(inst.getBody(), true, inst.visualAid, inst);\r
+       tinyMCE.triggerNodeChange();\r
+       inst.execCommand('mceEndUndoLevel');\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function nextCell(elm) {\r
+       while ((elm = elm.nextSibling) != null) {\r
+               if (elm.nodeName == "TD" || elm.nodeName == "TH")\r
+                       return elm;\r
+       }\r
+\r
+       return null;\r
+}\r
+\r
+function updateCell(td, skip_id) {\r
+       var inst = tinyMCE.selectedInstance;\r
+       var formObj = document.forms[0];\r
+       var curCellType = td.nodeName.toLowerCase();\r
+       var celltype = getSelectValue(formObj, 'celltype');\r
+       var doc = inst.getDoc();\r
+\r
+       if (!skip_id)\r
+               td.setAttribute('id', formObj.id.value);\r
+\r
+       td.setAttribute('align', formObj.align.value);\r
+       td.setAttribute('vAlign', formObj.valign.value);\r
+       td.setAttribute('lang', formObj.lang.value);\r
+       td.setAttribute('dir', getSelectValue(formObj, 'dir'));\r
+       td.setAttribute('style', tinyMCE.serializeStyle(tinyMCE.parseStyle(formObj.style.value)));\r
+       td.setAttribute('scope', formObj.scope.value);\r
+       tinyMCE.setAttrib(td, 'class', getSelectValue(formObj, 'class'));\r
+\r
+       // Clear deprecated attributes\r
+       tinyMCE.setAttrib(td, 'width', '');\r
+       tinyMCE.setAttrib(td, 'height', '');\r
+       tinyMCE.setAttrib(td, 'bgColor', '');\r
+       tinyMCE.setAttrib(td, 'borderColor', '');\r
+       tinyMCE.setAttrib(td, 'background', '');\r
+\r
+       // Set styles\r
+       td.style.width = getCSSSize(formObj.width.value);\r
+       td.style.height = getCSSSize(formObj.height.value);\r
+       if (formObj.bordercolor.value != "") {\r
+               td.style.borderColor = formObj.bordercolor.value;\r
+               td.style.borderStyle = td.style.borderStyle == "" ? "solid" : td.style.borderStyle;\r
+               td.style.borderWidth = td.style.borderWidth == "" ? "1px" : td.style.borderWidth;\r
+       } else\r
+               td.style.borderColor = '';\r
+\r
+       td.style.backgroundColor = formObj.bgcolor.value;\r
+\r
+       if (formObj.backgroundimage.value != "")\r
+               td.style.backgroundImage = "url('" + formObj.backgroundimage.value + "')";\r
+       else\r
+               td.style.backgroundImage = '';\r
+\r
+       if (curCellType != celltype) {\r
+               // changing to a different node type\r
+               var newCell = doc.createElement(celltype);\r
+\r
+               for (var c=0; c<td.childNodes.length; c++)\r
+                       newCell.appendChild(td.childNodes[c].cloneNode(1));\r
+\r
+               for (var a=0; a<td.attributes.length; a++) {\r
+                       var attr = td.attributes[a];\r
+                       newCell.setAttribute(attr.name, attr.value);\r
+               }\r
+\r
+               td.parentNode.replaceChild(newCell, td);\r
+               td = newCell;\r
+       }\r
+\r
+       return td;\r
+}\r
+\r
+function changedBackgroundImage() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       st['background-image'] = "url('" + formObj.backgroundimage.value + "')";\r
+\r
+       formObj.style.value = tinyMCE.serializeStyle(st);\r
+}\r
+\r
+function changedSize() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       var width = formObj.width.value;\r
+       if (width != "")\r
+               st['width'] = getCSSSize(width);\r
+       else\r
+               st['width'] = "";\r
+\r
+       var height = formObj.height.value;\r
+       if (height != "")\r
+               st['height'] = getCSSSize(height);\r
+       else\r
+               st['height'] = "";\r
+\r
+       formObj.style.value = tinyMCE.serializeStyle(st);\r
+}\r
+\r
+function changedColor() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       st['background-color'] = formObj.bgcolor.value;\r
+       st['border-color'] = formObj.bordercolor.value;\r
+\r
+       formObj.style.value = tinyMCE.serializeStyle(st);\r
+}\r
+\r
+function changedStyle() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       if (st['background-image'])\r
+               formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");\r
+       else\r
+               formObj.backgroundimage.value = '';\r
+\r
+       if (st['width'])\r
+               formObj.width.value = trimSize(st['width']);\r
+\r
+       if (st['height'])\r
+               formObj.height.value = trimSize(st['height']);\r
+\r
+       if (st['background-color']) {\r
+               formObj.bgcolor.value = st['background-color'];\r
+               updateColor('bgcolor_pick','bgcolor');\r
+       }\r
+\r
+       if (st['border-color']) {\r
+               formObj.bordercolor.value = st['border-color'];\r
+               updateColor('bordercolor_pick','bordercolor');\r
+       }\r
+}\r
diff --git a/webcit/tiny_mce/plugins/table/jscripts/merge_cells.js b/webcit/tiny_mce/plugins/table/jscripts/merge_cells.js
new file mode 100644 (file)
index 0000000..51a2749
--- /dev/null
@@ -0,0 +1,19 @@
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       var formObj = document.forms[0];\r
+\r
+       formObj.numcols.value = tinyMCE.getWindowArg('numcols', 1);\r
+       formObj.numrows.value = tinyMCE.getWindowArg('numrows', 1);\r
+}\r
+\r
+function mergeCells() {\r
+       var args = new Array();\r
+       var formObj = document.forms[0];\r
+\r
+       args["numcols"] = formObj.numcols.value;\r
+       args["numrows"] = formObj.numrows.value;\r
+\r
+       tinyMCEPopup.execCommand("mceTableMergeCells", false, args);\r
+       tinyMCEPopup.close();\r
+}\r
diff --git a/webcit/tiny_mce/plugins/table/jscripts/row.js b/webcit/tiny_mce/plugins/table/jscripts/row.js
new file mode 100644 (file)
index 0000000..395ddf0
--- /dev/null
@@ -0,0 +1,200 @@
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table');\r
+       document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor');\r
+\r
+       var inst = tinyMCE.selectedInstance;\r
+       var trElm = tinyMCE.getParentElement(inst.getFocusElement(), "tr");\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(tinyMCE.getAttrib(trElm, "style"));\r
+\r
+       // Get table row data\r
+       var rowtype = trElm.parentNode.nodeName.toLowerCase();\r
+       var align = tinyMCE.getAttrib(trElm, 'align');\r
+       var valign = tinyMCE.getAttrib(trElm, 'valign');\r
+       var height = trimSize(getStyle(trElm, 'height', 'height'));\r
+       var className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(trElm, 'class'), false);\r
+       var bgcolor = convertRGBToHex(getStyle(trElm, 'bgcolor', 'backgroundColor'));\r
+       var backgroundimage = getStyle(trElm, 'background', 'backgroundImage').replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");;\r
+       var id = tinyMCE.getAttrib(trElm, 'id');\r
+       var lang = tinyMCE.getAttrib(trElm, 'lang');\r
+       var dir = tinyMCE.getAttrib(trElm, 'dir');\r
+\r
+       // Setup form\r
+       addClassesToList('class', 'table_row_styles');\r
+       formObj.bgcolor.value = bgcolor;\r
+       formObj.backgroundimage.value = backgroundimage;\r
+       formObj.height.value = height;\r
+       formObj.id.value = id;\r
+       formObj.lang.value = lang;\r
+       formObj.style.value = tinyMCE.serializeStyle(st);\r
+       selectByValue(formObj, 'align', align);\r
+       selectByValue(formObj, 'valign', valign);\r
+       selectByValue(formObj, 'class', className);\r
+       selectByValue(formObj, 'rowtype', rowtype);\r
+       selectByValue(formObj, 'dir', dir);\r
+\r
+       // Resize some elements\r
+       if (isVisible('backgroundimagebrowser'))\r
+               document.getElementById('backgroundimage').style.width = '180px';\r
+\r
+       updateColor('bgcolor_pick', 'bgcolor');\r
+}\r
+\r
+function updateAction() {\r
+       tinyMCEPopup.restoreSelection();\r
+\r
+       var inst = tinyMCE.selectedInstance;\r
+       var trElm = tinyMCE.getParentElement(inst.getFocusElement(), "tr");\r
+       var tableElm = tinyMCE.getParentElement(inst.getFocusElement(), "table");\r
+       var formObj = document.forms[0];\r
+       var action = getSelectValue(formObj, 'action');\r
+\r
+       inst.execCommand('mceBeginUndoLevel');\r
+\r
+       switch (action) {\r
+               case "row":\r
+                       updateRow(trElm);\r
+                       break;\r
+\r
+               case "all":\r
+                       var rows = tableElm.getElementsByTagName("tr");\r
+\r
+                       for (var i=0; i<rows.length; i++)\r
+                               updateRow(rows[i], true);\r
+\r
+                       break;\r
+\r
+               case "odd":\r
+               case "even":\r
+                       var rows = tableElm.getElementsByTagName("tr");\r
+\r
+                       for (var i=0; i<rows.length; i++) {\r
+                               if ((i % 2 == 0 && action == "odd") || (i % 2 != 0 && action == "even"))\r
+                                       updateRow(rows[i], true, true);\r
+                       }\r
+\r
+                       break;\r
+       }\r
+\r
+       tinyMCE.handleVisualAid(inst.getBody(), true, inst.visualAid, inst);\r
+       tinyMCE.triggerNodeChange();\r
+       inst.execCommand('mceEndUndoLevel');\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function updateRow(tr_elm, skip_id, skip_parent) {\r
+       var inst = tinyMCE.selectedInstance;\r
+       var formObj = document.forms[0];\r
+       var curRowType = tr_elm.parentNode.nodeName.toLowerCase();\r
+       var rowtype = getSelectValue(formObj, 'rowtype');\r
+       var doc = inst.getDoc();\r
+\r
+       // Update row element\r
+       if (!skip_id)\r
+               tr_elm.setAttribute('id', formObj.id.value);\r
+\r
+       tr_elm.setAttribute('align', getSelectValue(formObj, 'align'));\r
+       tr_elm.setAttribute('vAlign', getSelectValue(formObj, 'valign'));\r
+       tr_elm.setAttribute('lang', formObj.lang.value);\r
+       tr_elm.setAttribute('dir', getSelectValue(formObj, 'dir'));\r
+       tr_elm.setAttribute('style', tinyMCE.serializeStyle(tinyMCE.parseStyle(formObj.style.value)));\r
+       tinyMCE.setAttrib(tr_elm, 'class', getSelectValue(formObj, 'class'));\r
+\r
+       // Clear deprecated attributes\r
+       tr_elm.setAttribute('background', '');\r
+       tr_elm.setAttribute('bgColor', '');\r
+       tr_elm.setAttribute('height', '');\r
+\r
+       // Set styles\r
+       tr_elm.style.height = getCSSSize(formObj.height.value);\r
+       tr_elm.style.backgroundColor = formObj.bgcolor.value;\r
+\r
+       if (formObj.backgroundimage.value != "")\r
+               tr_elm.style.backgroundImage = "url('" + formObj.backgroundimage.value + "')";\r
+       else\r
+               tr_elm.style.backgroundImage = '';\r
+\r
+       // Setup new rowtype\r
+       if (curRowType != rowtype && !skip_parent) {\r
+               // first, clone the node we are working on\r
+               var newRow = tr_elm.cloneNode(1);\r
+\r
+               // next, find the parent of its new destination (creating it if necessary)\r
+               var theTable = tinyMCE.getParentElement(tr_elm, "table");\r
+               var dest = rowtype;\r
+               var newParent = null;\r
+               for (var i = 0; i < theTable.childNodes.length; i++) {\r
+                       if (theTable.childNodes[i].nodeName.toLowerCase() == dest)\r
+                               newParent = theTable.childNodes[i];\r
+               }\r
+\r
+               if (newParent == null) {\r
+                       newParent = doc.createElement(dest);\r
+\r
+                       if (dest == "thead")\r
+                               theTable.insertBefore(newParent, theTable.firstChild);\r
+                       else\r
+                               theTable.appendChild(newParent);\r
+               }\r
+\r
+               // append the row to the new parent\r
+               newParent.appendChild(newRow);\r
+\r
+               // remove the original\r
+               tr_elm.parentNode.removeChild(tr_elm);\r
+\r
+               // set tr_elm to the new node\r
+               tr_elm = newRow;\r
+       }\r
+}\r
+\r
+function changedBackgroundImage() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       st['background-image'] = "url('" + formObj.backgroundimage.value + "')";\r
+\r
+       formObj.style.value = tinyMCE.serializeStyle(st);\r
+}\r
+\r
+function changedStyle() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       if (st['background-image'])\r
+               formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");\r
+       else\r
+               formObj.backgroundimage.value = '';\r
+\r
+       if (st['height'])\r
+               formObj.height.value = trimSize(st['height']);\r
+\r
+       if (st['background-color']) {\r
+               formObj.bgcolor.value = st['background-color'];\r
+               updateColor('bgcolor_pick','bgcolor');\r
+       }\r
+}\r
+\r
+function changedSize() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       var height = formObj.height.value;\r
+       if (height != "")\r
+               st['height'] = getCSSSize(height);\r
+       else\r
+               st['height'] = "";\r
+\r
+       formObj.style.value = tinyMCE.serializeStyle(st);\r
+}\r
+\r
+function changedColor() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       st['background-color'] = formObj.bgcolor.value;\r
+\r
+       formObj.style.value = tinyMCE.serializeStyle(st);\r
+}\r
diff --git a/webcit/tiny_mce/plugins/table/jscripts/table.js b/webcit/tiny_mce/plugins/table/jscripts/table.js
new file mode 100644 (file)
index 0000000..8597775
--- /dev/null
@@ -0,0 +1,327 @@
+var action, orgTableWidth, orgTableHeight;\r
+\r
+function insertTable() {\r
+       tinyMCEPopup.restoreSelection();\r
+\r
+       var formObj = document.forms[0];\r
+       var inst = tinyMCE.selectedInstance;\r
+       var cols = 2, rows = 2, border = 0, cellpadding = -1, cellspacing = -1, align, width, height, className;\r
+       var html = '';\r
+       var elm = tinyMCE.tableElm;\r
+\r
+       // Get form data\r
+       cols = formObj.elements['cols'].value;\r
+       rows = formObj.elements['rows'].value;\r
+       border = formObj.elements['border'].value != "" ? formObj.elements['border'].value  : 0;\r
+       cellpadding = formObj.elements['cellpadding'].value != "" ? formObj.elements['cellpadding'].value : "";\r
+       cellspacing = formObj.elements['cellspacing'].value != "" ? formObj.elements['cellspacing'].value : "";\r
+       align = formObj.elements['align'].options[formObj.elements['align'].selectedIndex].value;\r
+       width = formObj.elements['width'].value;\r
+       height = formObj.elements['height'].value;\r
+       bordercolor = formObj.elements['bordercolor'].value;\r
+       bgcolor = formObj.elements['bgcolor'].value;\r
+       className = formObj.elements['class'].options[formObj.elements['class'].selectedIndex].value;\r
+       id = formObj.elements['id'].value;\r
+       summary = formObj.elements['summary'].value;\r
+       style = formObj.elements['style'].value;\r
+       dir = formObj.elements['dir'].value;\r
+       lang = formObj.elements['lang'].value;\r
+       background = formObj.elements['backgroundimage'].value;\r
+\r
+       // Update table\r
+       if (action == "update") {\r
+               inst.execCommand('mceBeginUndoLevel');\r
+\r
+               tinyMCE.setAttrib(elm, 'cellPadding', cellpadding, true);\r
+               tinyMCE.setAttrib(elm, 'cellSpacing', cellspacing, true);\r
+               tinyMCE.setAttrib(elm, 'border', border, true);\r
+               tinyMCE.setAttrib(elm, 'align', align);\r
+               tinyMCE.setAttrib(elm, 'class', className);\r
+               tinyMCE.setAttrib(elm, 'style', style);\r
+               tinyMCE.setAttrib(elm, 'id', id);\r
+               tinyMCE.setAttrib(elm, 'summary', summary);\r
+               tinyMCE.setAttrib(elm, 'dir', dir);\r
+               tinyMCE.setAttrib(elm, 'lang', lang);\r
+\r
+               // Not inline styles\r
+               if (!tinyMCE.getParam("inline_styles"))\r
+                       tinyMCE.setAttrib(elm, 'width', width, true);\r
+\r
+               // Remove these since they are not valid XHTML\r
+               tinyMCE.setAttrib(elm, 'borderColor', '');\r
+               tinyMCE.setAttrib(elm, 'bgColor', '');\r
+               tinyMCE.setAttrib(elm, 'background', '');\r
+               tinyMCE.setAttrib(elm, 'height', '');\r
+\r
+               if (background != '')\r
+                       elm.style.backgroundImage = "url('" + background + "')";\r
+               else\r
+                       elm.style.backgroundImage = '';\r
+\r
+               if (tinyMCE.getParam("inline_styles"))\r
+                       elm.style.borderWidth = border + "px";\r
+\r
+               if (tinyMCE.getParam("inline_styles")) {\r
+                       if (width != '')\r
+                               elm.style.width = getCSSSize(width);\r
+               }\r
+\r
+               if (bordercolor != "") {\r
+                       elm.style.borderColor = bordercolor;\r
+                       elm.style.borderStyle = elm.style.borderStyle == "" ? "solid" : elm.style.borderStyle;\r
+                       elm.style.borderWidth = border == "" ? "1px" : border;\r
+               } else\r
+                       elm.style.borderColor = '';\r
+\r
+               elm.style.backgroundColor = bgcolor;\r
+               elm.style.height = getCSSSize(height);\r
+\r
+               tinyMCE.handleVisualAid(tinyMCE.tableElm, false, inst.visualAid, inst);\r
+\r
+               // Fix for stange MSIE align bug\r
+               tinyMCE.tableElm.outerHTML = tinyMCE.tableElm.outerHTML;\r
+\r
+               tinyMCE.handleVisualAid(inst.getBody(), true, inst.visualAid, inst);\r
+               tinyMCE.triggerNodeChange();\r
+               inst.execCommand('mceEndUndoLevel');\r
+\r
+               // Repaint if dimensions changed\r
+               if (formObj.width.value != orgTableWidth || formObj.height.value != orgTableHeight)\r
+                       inst.repaint();\r
+\r
+               tinyMCEPopup.close();\r
+               return true;\r
+       }\r
+\r
+       // Create new table\r
+       html += '<table';\r
+\r
+       html += makeAttrib('id', id);\r
+       html += makeAttrib('border', border);\r
+       html += makeAttrib('cellpadding', cellpadding);\r
+       html += makeAttrib('cellspacing', cellspacing);\r
+       html += makeAttrib('width', width);\r
+       //html += makeAttrib('height', height);\r
+       //html += makeAttrib('bordercolor', bordercolor);\r
+       //html += makeAttrib('bgcolor', bgcolor);\r
+       html += makeAttrib('align', align);\r
+       html += makeAttrib('class', tinyMCE.getVisualAidClass(className, border == 0));\r
+       html += makeAttrib('style', style);\r
+       html += makeAttrib('summary', summary);\r
+       html += makeAttrib('dir', dir);\r
+       html += makeAttrib('lang', lang);\r
+\r
+       html += '>';\r
+\r
+       for (var y=0; y<rows; y++) {\r
+               html += "<tr>";\r
+\r
+               for (var x=0; x<cols; x++)\r
+                       html += '<td>&nbsp;</td>';\r
+\r
+               html += "</tr>";\r
+       }\r
+\r
+       html += "</table>";\r
+\r
+       inst.execCommand('mceBeginUndoLevel');\r
+       inst.execCommand('mceInsertContent', false, html);\r
+       tinyMCE.handleVisualAid(inst.getBody(), true, tinyMCE.settings['visual']);\r
+       inst.execCommand('mceEndUndoLevel');\r
+\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function makeAttrib(attrib, value) {\r
+       var formObj = document.forms[0];\r
+       var valueElm = formObj.elements[attrib];\r
+\r
+       if (typeof(value) == "undefined" || value == null) {\r
+               value = "";\r
+\r
+               if (valueElm)\r
+                       value = valueElm.value;\r
+       }\r
+\r
+       if (value == "")\r
+               return "";\r
+\r
+       // XML encode it\r
+       value = value.replace(/&/g, '&amp;');\r
+       value = value.replace(/\"/g, '&quot;');\r
+       value = value.replace(/</g, '&lt;');\r
+       value = value.replace(/>/g, '&gr;');\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 = 0, cellpadding = "", cellspacing = "";\r
+       var align = "", width = "", height = "", bordercolor = "", bgcolor = "", className = "";\r
+       var id = "", summary = "", style = "", dir = "", lang = "", background = "", bgcolor = "", bordercolor = "";\r
+       var inst = tinyMCE.selectedInstance;\r
+       var formObj = document.forms[0];\r
+       var elm = tinyMCE.getParentElement(inst.getFocusElement(), "table");\r
+\r
+       tinyMCE.tableElm = elm;\r
+       action = tinyMCE.getWindowArg('action');\r
+       if (action == null)\r
+               action = tinyMCE.tableElm ? "update" : "insert";\r
+\r
+       if (tinyMCE.tableElm && action != "insert") {\r
+               var rowsAr = tinyMCE.tableElm.rows;\r
+               var cols = 0;\r
+               for (var i=0; i<rowsAr.length; i++)\r
+                       if (rowsAr[i].cells.length > cols)\r
+                               cols = rowsAr[i].cells.length;\r
+\r
+               cols = cols;\r
+               rows = rowsAr.length;\r
+\r
+               st = tinyMCE.parseStyle(tinyMCE.getAttrib(tinyMCE.tableElm, "style"));\r
+               border = trimSize(getStyle(elm, 'border', 'borderWidth'));\r
+               cellpadding = tinyMCE.getAttrib(tinyMCE.tableElm, 'cellpadding', "");\r
+               cellspacing = tinyMCE.getAttrib(tinyMCE.tableElm, 'cellspacing', "");\r
+               width = trimSize(getStyle(elm, 'width', 'width'));\r
+               height = trimSize(getStyle(elm, 'height', 'height'));\r
+               bordercolor = convertRGBToHex(getStyle(elm, 'bordercolor', 'borderLeftColor'));\r
+               bgcolor = convertRGBToHex(getStyle(elm, 'bgcolor', 'backgroundColor'));\r
+               align = tinyMCE.getAttrib(tinyMCE.tableElm, 'align', align);\r
+               className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(tinyMCE.tableElm, 'class'), false);\r
+               id = tinyMCE.getAttrib(tinyMCE.tableElm, 'id');\r
+               summary = tinyMCE.getAttrib(tinyMCE.tableElm, 'summary');\r
+               style = tinyMCE.serializeStyle(st);\r
+               dir = tinyMCE.getAttrib(tinyMCE.tableElm, 'dir');\r
+               lang = tinyMCE.getAttrib(tinyMCE.tableElm, 'lang');\r
+               background = getStyle(elm, 'background', 'backgroundImage').replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");\r
+\r
+               orgTableWidth = width;\r
+               orgTableHeight = height;\r
+\r
+               action = "update";\r
+       }\r
+\r
+       addClassesToList('class', "table_styles");\r
+\r
+       // Update form\r
+       selectByValue(formObj, 'align', align);\r
+       selectByValue(formObj, 'class', className);\r
+       formObj.cols.value = cols;\r
+       formObj.rows.value = rows;\r
+       formObj.border.value = border;\r
+       formObj.cellpadding.value = cellpadding;\r
+       formObj.cellspacing.value = cellspacing;\r
+       formObj.width.value = width;\r
+       formObj.height.value = height;\r
+       formObj.bordercolor.value = bordercolor;\r
+       formObj.bgcolor.value = bgcolor;\r
+       formObj.id.value = id;\r
+       formObj.summary.value = summary;\r
+       formObj.style.value = style;\r
+       formObj.dir.value = dir;\r
+       formObj.lang.value = lang;\r
+       formObj.backgroundimage.value = background;\r
+       formObj.insert.value = tinyMCE.getLang('lang_' + action, 'Insert', true); \r
+\r
+       updateColor('bordercolor_pick', 'bordercolor');\r
+       updateColor('bgcolor_pick', 'bgcolor');\r
+\r
+       // Resize some elements\r
+       if (isVisible('backgroundimagebrowser'))\r
+               document.getElementById('backgroundimage').style.width = '180px';\r
+\r
+       // Disable some fields in update mode\r
+       if (action == "update") {\r
+               formObj.cols.disabled = true;\r
+               formObj.rows.disabled = true;\r
+       }\r
+}\r
+\r
+function changedSize() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       var width = formObj.width.value;\r
+       if (width != "")\r
+               st['width'] = tinyMCE.getParam("inline_styles") ? getCSSSize(width) : "";\r
+       else\r
+               st['width'] = "";\r
+\r
+       var height = formObj.height.value;\r
+       if (height != "")\r
+               st['height'] = getCSSSize(height);\r
+       else\r
+               st['height'] = "";\r
+\r
+       formObj.style.value = tinyMCE.serializeStyle(st);\r
+}\r
+\r
+function changedBackgroundImage() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       st['background-image'] = "url('" + formObj.backgroundimage.value + "')";\r
+\r
+       formObj.style.value = tinyMCE.serializeStyle(st);\r
+}\r
+\r
+function changedBorder() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       // Update border width if the element has a color\r
+       if (formObj.border.value != "" && formObj.bordercolor.value != "")\r
+               st['border-width'] = formObj.border.value + "px";\r
+\r
+       formObj.style.value = tinyMCE.serializeStyle(st);\r
+}\r
+\r
+function changedColor() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       st['background-color'] = formObj.bgcolor.value;\r
+\r
+       if (formObj.bordercolor.value != "") {\r
+               st['border-color'] = formObj.bordercolor.value;\r
+\r
+               // Add border-width if it's missing\r
+               if (!st['border-width'])\r
+                       st['border-width'] = formObj.border.value == "" ? "1px" : formObj.border.value + "px";\r
+       }\r
+\r
+       formObj.style.value = tinyMCE.serializeStyle(st);\r
+}\r
+\r
+function changedStyle() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       if (st['background-image'])\r
+               formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");\r
+       else\r
+               formObj.backgroundimage.value = '';\r
+\r
+       if (st['width'])\r
+               formObj.width.value = trimSize(st['width']);\r
+\r
+       if (st['height'])\r
+               formObj.height.value = trimSize(st['height']);\r
+\r
+       if (st['background-color']) {\r
+               formObj.bgcolor.value = st['background-color'];\r
+               updateColor('bgcolor_pick','bgcolor');\r
+       }\r
+\r
+       if (st['border-color']) {\r
+               formObj.bordercolor.value = st['border-color'];\r
+               updateColor('bordercolor_pick','bordercolor');\r
+       }\r
+}\r
diff --git a/webcit/tiny_mce/plugins/table/langs/ar.js b/webcit/tiny_mce/plugins/table/langs/ar.js
new file mode 100644 (file)
index 0000000..478ece6
--- /dev/null
@@ -0,0 +1,43 @@
+// Arabic lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+table_desc : '&#1573;&#1583;&#1585;&#1575;&#1580;/&#1578;&#1581;&#1585;&#1610;&#1585; &#1580;&#1583;&#1608;&#1604;',\r
+table_insert_row_before_desc : 'Insert row before',\r
+table_insert_row_after_desc : 'Insert row after',\r
+table_delete_row_desc : '&#1581;&#1584;&#1601; &#1589;&#1601;&#1608;&#1601;',\r
+table_insert_col_before_desc : 'Insert column before',\r
+table_insert_col_after_desc : 'Insert column after',\r
+table_delete_col_desc : '&#1581;&#1584;&#1601; &#1571;&#1593;&#1605;&#1583;&#1577;',\r
+insert_table_title : '&#1573;&#1583;&#1585;&#1575;&#1580;/&#1578;&#1581;&#1585;&#1610;&#1585; &#1580;&#1583;&#1608;&#1604;',\r
+insert_table_width : '&#1575;&#1604;&#1593;&#1585;&#1590;',\r
+insert_table_height : '&#1575;&#1604;&#1575;&#1585;&#1578;&#1601;&#1575;&#1593;',\r
+insert_table_cols : '&#1571;&#1593;&#1605;&#1583;&#1577;',\r
+insert_table_rows : '&#1589;&#1601;&#1608;&#1601;',\r
+insert_table_cellspacing : '&#1578;&#1576;&#1575;&#1593;&#1583; &#1575;&#1604;&#1582;&#1604;&#1575;&#1610;&#1575;',\r
+insert_table_cellpadding : '&#1575;&#1604;&#1605;&#1587;&#1575;&#1601;&#1577; &#1575;&#1604;&#1576;&#1575;&#1583;&#1574;&#1577;',\r
+insert_table_border : '&#1587;&#1605;&#1603; &#1575;&#1604;&#1581;&#1583;&#1608;&#1583;',\r
+insert_table_align : '&#1575;&#1604;&#1605;&#1581;&#1575;&#1584;&#1575;&#1577;',\r
+insert_table_align_default : 'Default',\r
+insert_table_align_left : '&#1610;&#1587;&#1575;&#1585;',\r
+insert_table_align_right : '&#1610;&#1605;&#1610;&#1606;',\r
+insert_table_align_middle : '&#1608;&#1587;&#1591;',\r
+insert_table_class : 'Class',\r
+table_row_title : 'Table row properties',\r
+table_cell_title : 'Table cell properties',\r
+table_row_desc : 'Table row properties',\r
+table_cell_desc : 'Table cell properties',\r
+insert_table_valign : 'Vertical alignment',\r
+insert_table_align_top : 'Top',\r
+insert_table_align_bottom : 'Bottom',\r
+table_props_desc : 'Table properties',\r
+table_bordercolor : 'Border color',\r
+table_bgcolor : 'Bg color',\r
+table_merge_cells_title : 'Merge table cells',\r
+table_split_cells_desc : 'Split table cells',\r
+table_merge_cells_desc : 'Merge table cells',\r
+table_cut_row_desc : 'Cut table row',\r
+table_copy_row_desc : 'Copy table row',\r
+table_paste_row_before_desc : 'Paste table row before',\r
+table_paste_row_after_desc : 'Paste table row after',\r
+table_insert_desc : 'Insert a new table'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/table/langs/cs.js b/webcit/tiny_mce/plugins/table/langs/cs.js
new file mode 100644 (file)
index 0000000..81979bb
--- /dev/null
@@ -0,0 +1,49 @@
+/**\r
+ * Czech lang variables \r
+ * encoding: utf-8\r
+ *  \r
+ * $Id: cs.js,v 1.10 2005/10/18 13:59:43 spocke Exp $ \r
+ */  \r
+\r
+tinyMCE.addToLang('',{\r
+table_desc : 'Vložit novou tabulku',\r
+table_insert_row_before_desc : 'Vložit řádek před',\r
+table_insert_row_after_desc : 'Vložit řádek po',\r
+table_delete_row_desc : 'Smazat řádek',\r
+table_insert_col_before_desc : 'Vložit sloupec před',\r
+table_insert_col_after_desc : 'Vložit sloupec po',\r
+table_delete_col_desc : 'Odstranit sloupec',\r
+insert_table_title : 'Vložit/upravit tabulku',\r
+insert_table_width : 'Šířka',\r
+insert_table_height : 'Výška',\r
+insert_table_cols : 'Sloupce',\r
+insert_table_rows : 'Řádky',\r
+insert_table_cellspacing : 'Vnější okraj buněk',\r
+insert_table_cellpadding : 'Vnitřní okraj buněk',\r
+insert_table_border : 'Rámeček',\r
+insert_table_align : 'Zarovnání',\r
+insert_table_align_default : 'Výchozí',\r
+insert_table_align_left : 'Vlevo',\r
+insert_table_align_right : 'Vpravo',\r
+insert_table_align_middle : 'Na střed',\r
+insert_table_class : 'Třída',\r
+table_row_title : 'Vlastnosti řádku',\r
+table_cell_title : 'Vlastnosti buňky',\r
+table_row_desc : 'Vlastnosti řádku',\r
+table_cell_desc : 'Vlastnosti řádku',\r
+insert_table_valign : 'Vertikální zarovnání',\r
+insert_table_align_top : 'Nahoru',\r
+insert_table_align_bottom : 'Dolů',\r
+table_props_desc : 'Vlastnosti tabulky',\r
+table_bordercolor : 'Barva rámečku',\r
+table_bgcolor : 'Barva pozadí',\r
+table_merge_cells_title : 'Sloučit buňky',\r
+table_split_cells_desc : 'Rozdělit buňky',\r
+table_merge_cells_desc : 'Sloučit buňky',\r
+table_cut_row_desc : 'Vyjmout řádek',\r
+table_copy_row_desc : 'Kopírovat řádek',\r
+table_paste_row_before_desc : 'Vložit řádek před',\r
+table_paste_row_after_desc : 'Vložit řádek za',\r
+table_insert_desc : 'Vložit tabulku'\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/table/langs/cy.js b/webcit/tiny_mce/plugins/table/langs/cy.js
new file mode 100644 (file)
index 0000000..8b54687
--- /dev/null
@@ -0,0 +1,76 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('table',{\r
+general_tab : 'Cyffredinol',\r
+advanced_tab : 'Uwch',\r
+general_props : 'Priodoleddau cyffredinol',\r
+advanced_props : 'Priodoleddau uwch',\r
+desc : 'Mewnosod tabl newydd',\r
+row_before_desc : 'Mewnosod rhes cyn',\r
+row_after_desc : 'Mewnosod rhes ar &ocirc;l',\r
+delete_row_desc : 'Dileu rhes',\r
+col_before_desc : 'Mewnosod colofn cyn',\r
+col_after_desc : 'Mewnosod colofn ar &ocirc;l',\r
+delete_col_desc : 'Dileu colofn',\r
+rowtype : 'Rhan tabl y rhes',\r
+title : 'Mewnosod/golygu tabl',\r
+width : 'Lled',\r
+height : 'Uchder',\r
+cols : 'Colofnau',\r
+rows : 'Rhesi',\r
+cellspacing : 'Bylchu celloedd',\r
+cellpadding : 'Padio celliodd',\r
+border : 'Ffin',\r
+align : 'Unioni',\r
+align_default : 'Arferol',\r
+align_left : 'Chwith',\r
+align_right : 'Dde',\r
+align_middle : 'Canol',\r
+row_title : 'Priodoleddau rhes tabl',\r
+cell_title : 'Priodoleddau cell tabl',\r
+cell_type : 'Math cell',\r
+row_desc : 'Priodoleddau rhes tabl',\r
+cell_desc : 'Priodoleddau cell tabl',\r
+valign : 'Unioni fertigol',\r
+align_top : 'Brig',\r
+align_bottom : 'Gwaelod',\r
+props_desc : 'Priodoleddau tabl',\r
+bordercolor : 'Lliw ffin',\r
+bgcolor : 'Lliw cefndir',\r
+merge_cells_title : 'Uno celloedd tabl',\r
+split_cells_desc : 'Rhannu celloedd tabl',\r
+merge_cells_desc : 'Uno celloedd tabl',\r
+cut_row_desc : 'Torri rhes tabl',\r
+copy_row_desc : 'Cop&iuml;o rhes tabl',\r
+paste_row_before_desc : 'Gludo rhes tabl cyn',\r
+paste_row_after_desc : 'Gludo rhes tabl ar &ocirc;l',\r
+id : 'Id',\r
+style: 'Arddull',\r
+langdir : 'Cyfeiriad iaith',\r
+langcode : 'C&ocirc;d iaith',\r
+mime : 'Math MIME y targed',\r
+ltr : 'Chwith i\'r dde',\r
+rtl : 'Dde i\'r chwith',\r
+bgimage : 'Delwedd cefndir',\r
+summary : 'Crynodeb',\r
+td : "Data",\r
+th : "Pennawd",\r
+cell_cell : 'Diweddaru\'r gell bresennoll',\r
+cell_row : 'Diweddaru holl gelloedd y rhes',\r
+cell_all : 'Diweddaru holl gelloedd y tabl',\r
+row_row : 'Diweddaru\'r rhes presennol',\r
+row_odd : 'Diweddaru rhesi odrif y tabl',\r
+row_even : 'Diweddaru rhesi eilrif y tabl',\r
+row_all : 'Diweddaru holl rhesi\'r tabl',\r
+thead : 'Pennawd Tabl',\r
+tbody : 'Corff Tabl',\r
+tfoot : 'Troedyn Tabl',\r
+del : 'Dileu tabl',\r
+scope : 'Maes',\r
+row : 'Rhes',\r
+col : 'Colofn',\r
+rowgroup : 'Gr&#373;p Rhesi',\r
+colgroup : 'Gr&#373;p Colofnau',\r
+missing_scope: 'Wyt ti\'n sicr eisiau parhau heb gynnwys maes ar gyfer y cell pennawd tabl hwn? Heb un, gallai fod yn anodd i rai defnyddwyr gydag anableddau ddeall cynnwys neu ddata y tabl.',\r
+cellprops_delta_width : 50\r
+});\r
diff --git a/webcit/tiny_mce/plugins/table/langs/da.js b/webcit/tiny_mce/plugins/table/langs/da.js
new file mode 100644 (file)
index 0000000..5cef2e8
--- /dev/null
@@ -0,0 +1,69 @@
+// DK lang variables contributed by Jan Moelgaard\r
+\r
+tinyMCE.addToLang('table',{\r
+general_tab : 'Generelt',\r
+advanced_tab : 'Avanceret',\r
+general_props : 'Generelle egenskaber',\r
+advanced_props : 'Avancerede egenskaber',\r
+desc : 'Inds&#230;tter ny tabel',\r
+row_before_desc : 'Inds&#230;t r&#230;kke foran',\r
+row_after_desc : 'Inds&#230;t r&#230;kke efter',\r
+delete_row_desc : 'Slet r&#230;kke',\r
+col_before_desc : 'Inds&#230;t kolonne foran',\r
+col_after_desc : 'Inds&#230;t kolonner efter',\r
+delete_col_desc : 'Fjern kolonne',\r
+rowtype : 'R&#230;kke i tabeldelen',\r
+title : 'Inds&#230;t eller rediger tabel',\r
+width : 'Bredde',\r
+height : 'Højde',\r
+cols : 'Kolonner',\r
+rows : 'R&#230;kker',\r
+cellspacing : 'Cellemargin',\r
+cellpadding : 'Indvendig margin',\r
+border : 'Kant',\r
+align : 'Justering',\r
+align_default : 'Standard',\r
+align_left : 'Venstre',\r
+align_right : 'Højre',\r
+align_middle : 'Centreret',\r
+row_title : 'R&#230;kkeegenskaber',\r
+cell_title : 'Celleegenskaber',\r
+cell_type : 'Celletype',\r
+row_desc : 'R&#230;kkeegenskaber',\r
+cell_desc : 'Celleegenskaber',\r
+valign : 'Vertikal justering',\r
+align_top : 'Top',\r
+align_bottom : 'Bund',\r
+props_desc : 'Tabelegenskaber',\r
+bordercolor : 'Kantfarve',\r
+bgcolor : 'Baaggrundfarve',\r
+merge_cells_title : 'Flet celler',\r
+split_cells_desc : 'Del celler',\r
+merge_cells_desc : 'Flet celler',\r
+cut_row_desc : 'Del kolonne',\r
+copy_row_desc : 'Kopier kolonne',\r
+paste_row_before_desc : 'Inds&#230;t kolonne foran',\r
+paste_row_after_desc : 'Inds&#230;t kolonne efter',\r
+id : 'Tabel-Id',\r
+style: 'Style',\r
+langdir : 'Tekstretning',\r
+langcode : 'Sprogkode',\r
+mime : 'Target MIME type',\r
+ltr : 'Venstre til h&#248;jre',\r
+rtl : 'H&#248;jre til venstre',\r
+bgimage : 'Baggrundbillede',\r
+summary : 'Opsummering',\r
+td : "Data",\r
+th : "Overskrift",\r
+cell_cell : 'Opdater aktuel celle',\r
+cell_row : 'Opdater alle celler i kolonnen',\r
+cell_all : 'Opdater alle celler i tabellen',\r
+row_row : 'Opdater aktuel kolonne',\r
+row_odd : 'Opdater ulige kolonner i tabellen',\r
+row_even : 'Opdater lige kolonner i tabellen',\r
+row_all : 'Opdater alle kolonner i tabellen',\r
+thead : 'Tabeloverskrift',\r
+tbody : 'Tabelindhold',\r
+tfoot : 'Tabelfodnote',\r
+del : 'Slet tabel'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/table/langs/de.js b/webcit/tiny_mce/plugins/table/langs/de.js
new file mode 100644 (file)
index 0000000..5465f4a
--- /dev/null
@@ -0,0 +1,76 @@
+// DE lang variables\r
+\r
+tinyMCE.addToLang('table',{\r
+general_tab : 'Allgemein',\r
+advanced_tab : 'Erweitert',\r
+general_props : 'Allgemeine Eigenschaften',\r
+advanced_props : 'Erweiterte Eigenschaften',\r
+desc : 'Neue Tabelle einf&uuml;gen',\r
+row_before_desc : 'Zeile oberhalb einf&uuml;gen',\r
+row_after_desc : 'Zeile unterhalb einf&uuml;gen',\r
+delete_row_desc : 'Zeile l&ouml;schen',\r
+col_before_desc : 'Spalte nach links einf&uuml;gen',\r
+col_after_desc : 'Spalte nach rechts einf&uuml;gen',\r
+delete_col_desc : 'Spalte l&ouml;schen',\r
+rowtype : 'Zeile in Tabellen-Teil',\r
+title : 'Tabelle hinzuf&uuml;gen/bearbeiten',\r
+width : 'Breite',\r
+height : 'H&ouml;he',\r
+cols : 'Spalten',\r
+rows : 'Zeilen',\r
+cellspacing : 'Zellenabstand',\r
+cellpadding : 'Zellenauff&uuml;llung',\r
+border : 'Rahmen',\r
+align : 'Ausrichtung',\r
+align_default : 'Standard',\r
+align_left : 'Links',\r
+align_right : 'Rechts',\r
+align_middle : 'Zentriert',\r
+row_title : 'Zeileneigenschaften',\r
+cell_title : 'Zelleneigenschaften',\r
+cell_type : 'Zellentyp',\r
+row_desc : 'Zeileneigenschaften',\r
+cell_desc : 'Zelleneigenschaften',\r
+valign : 'Vertikale Ausrichtung',\r
+align_top : 'Oben',\r
+align_bottom : 'Unten',\r
+props_desc : 'Tabelleneigenschaften',\r
+bordercolor : 'Rahmenfarbe',\r
+bgcolor : 'Hintergrundfarbe',\r
+merge_cells_title : 'Zellen zusammenf&uuml;gen',\r
+split_cells_desc : 'Zelle teilen',\r
+merge_cells_desc : 'Zellen zusammenf&uuml;gen',\r
+cut_row_desc : 'Zeile ausschneiden',\r
+copy_row_desc : 'Zeile kopieren',\r
+paste_row_before_desc : 'Zeile oberhalb einf&uuml;gen',\r
+paste_row_after_desc : 'Zeile unterhalb einf&uuml;gen',\r
+id : 'ID',\r
+style: 'CSS-Stil',\r
+langdir : 'Sprachrichtung',\r
+langcode : 'Sprachcode',\r
+mime : 'MIME-Typ',\r
+ltr : 'Von links nach rechts',\r
+rtl : 'Von rechts nach links',\r
+bgimage : 'Hintergrundfarbe',\r
+summary : 'Zusammenfassung',\r
+td : "Daten",\r
+th : "Kopfzeile",\r
+cell_cell : 'Diese Zelle aktualisieren',\r
+cell_row : 'Alle Zellen in dieser Zeile aktualisieren',\r
+cell_all : 'Alle Zellen in dieser Tabelle aktualisieren',\r
+row_row : 'Diese Zeile aktualisieren',\r
+row_odd : 'Ungerade Zeilen aktualisieren',\r
+row_even : 'Gerade Zeilen aktualisieren',\r
+row_all : 'Alle Zeilen in dieser Tabelle aktualisieren',\r
+thead : 'Tabellenkopf',\r
+tbody : 'Tabellenk&ouml;rper',\r
+tfoot : 'Tabellenfu&szlig;',\r
+del : 'Tabelle l&ouml;schen',\r
+scope : 'Scope',\r
+row : 'Row',\r
+col : 'Col',\r
+rowgroup : 'Row Group',\r
+colgroup : 'Col Group',\r
+missing_scope: 'Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.',\r
+table_delta_width : 45\r
+});\r
diff --git a/webcit/tiny_mce/plugins/table/langs/el.js b/webcit/tiny_mce/plugins/table/langs/el.js
new file mode 100644 (file)
index 0000000..7b32924
--- /dev/null
@@ -0,0 +1,43 @@
+// Greek lang variables by Jacaranda Bill\r
+\r
+tinyMCE.addToLang('',{\r
+table_desc : '&Aring;éóáãùãÞ ðßíáêá',\r
+table_insert_row_before_desc : '&Aring;éóáãùãÞ ãñáììÞò &aring;ðÜíù',\r
+table_insert_row_after_desc : '&Aring;éóáãùãÞ ãñáììÞò êÜôù',\r
+table_delete_row_desc : '&Auml;éáãñá&ouml;Þ ãñáììÞò',\r
+table_insert_col_before_desc : '&Aring;éóáãùãÞ óôÞëçò áñéóô&aring;ñÜ',\r
+table_insert_col_after_desc : '&Aring;éóáãùãÞ óôÞëçò &auml;&aring;îéÜ',\r
+table_delete_col_desc : '&Auml;éáãñá&ouml;Þ óôÞëçò',\r
+insert_table_title : '&Aring;éóáãùãÞ/&Auml;éüñèùóç ðßíáêá',\r
+insert_table_width : 'ÐëÜôïò',\r
+insert_table_height : '¾øïò',\r
+insert_table_cols : 'ÓôÞë&aring;ò',\r
+insert_table_rows : 'ÃñáììÝò',\r
+insert_table_cellspacing : '&Auml;éÜóôé÷ï',\r
+insert_table_cellpadding : 'ÃÝìéóìá',\r
+insert_table_border : 'Ð&aring;ñßãñáììá',\r
+insert_table_align : 'Óôïß÷éóç',\r
+insert_table_align_default : 'Ðñïêáè.',\r
+insert_table_align_left : 'Áñéóô&aring;ñÜ',\r
+insert_table_align_right : '&Auml;&aring;îéÜ',\r
+insert_table_align_middle : 'Óôï êÝíôñï',\r
+insert_table_class : 'ÊëÜóç',\r
+table_row_title : 'Table row properties',\r
+table_cell_title : 'Table cell properties',\r
+table_row_desc : 'Table row properties',\r
+table_cell_desc : 'Table cell properties',\r
+insert_table_valign : 'Vertical alignment',\r
+insert_table_align_top : 'Top',\r
+insert_table_align_bottom : 'Bottom',\r
+table_props_desc : 'Table properties',\r
+table_bordercolor : 'Border color',\r
+table_bgcolor : 'Bg color',\r
+table_merge_cells_title : 'Merge table cells',\r
+table_split_cells_desc : 'Split table cells',\r
+table_merge_cells_desc : 'Merge table cells',\r
+table_cut_row_desc : 'Cut table row',\r
+table_copy_row_desc : 'Copy table row',\r
+table_paste_row_before_desc : 'Paste table row before',\r
+table_paste_row_after_desc : 'Paste table row after',\r
+table_insert_desc : 'Insert a new table'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/table/langs/en.js b/webcit/tiny_mce/plugins/table/langs/en.js
new file mode 100644 (file)
index 0000000..b0f125c
--- /dev/null
@@ -0,0 +1,75 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('table',{\r
+general_tab : 'General',\r
+advanced_tab : 'Advanced',\r
+general_props : 'General properties',\r
+advanced_props : 'Advanced properties',\r
+desc : 'Inserts a new table',\r
+row_before_desc : 'Insert row before',\r
+row_after_desc : 'Insert row after',\r
+delete_row_desc : 'Delete row',\r
+col_before_desc : 'Insert column before',\r
+col_after_desc : 'Insert column after',\r
+delete_col_desc : 'Remove column',\r
+rowtype : 'Row in table part',\r
+title : 'Insert/Modify table',\r
+width : 'Width',\r
+height : 'Height',\r
+cols : 'Columns',\r
+rows : 'Rows',\r
+cellspacing : 'Cellspacing',\r
+cellpadding : 'Cellpadding',\r
+border : 'Border',\r
+align : 'Alignment',\r
+align_default : 'Default',\r
+align_left : 'Left',\r
+align_right : 'Right',\r
+align_middle : 'Center',\r
+row_title : 'Table row properties',\r
+cell_title : 'Table cell properties',\r
+cell_type : 'Cell type',\r
+row_desc : 'Table row properties',\r
+cell_desc : 'Table cell properties',\r
+valign : 'Vertical alignment',\r
+align_top : 'Top',\r
+align_bottom : 'Bottom',\r
+props_desc : 'Table properties',\r
+bordercolor : 'Border color',\r
+bgcolor : 'Background color',\r
+merge_cells_title : 'Merge table cells',\r
+split_cells_desc : 'Split table cells',\r
+merge_cells_desc : 'Merge table cells',\r
+cut_row_desc : 'Cut table row',\r
+copy_row_desc : 'Copy table row',\r
+paste_row_before_desc : 'Paste table row before',\r
+paste_row_after_desc : 'Paste table row after',\r
+id : 'Id',\r
+style: 'Style',\r
+langdir : 'Language direction',\r
+langcode : 'Language code',\r
+mime : 'Target MIME type',\r
+ltr : 'Left to right',\r
+rtl : 'Right to left',\r
+bgimage : 'Background image',\r
+summary : 'Summary',\r
+td : "Data",\r
+th : "Header",\r
+cell_cell : 'Update current cell',\r
+cell_row : 'Update all cells in row',\r
+cell_all : 'Update all cells in table',\r
+row_row : 'Update current row',\r
+row_odd : 'Update odd rows in table',\r
+row_even : 'Update even rows in table',\r
+row_all : 'Update all rows in table',\r
+thead : 'Table Head',\r
+tbody : 'Table Body',\r
+tfoot : 'Table Foot',\r
+del : 'Delete table',\r
+scope : 'Scope',\r
+row : 'Row',\r
+col : 'Col',\r
+rowgroup : 'Row Group',\r
+colgroup : 'Col Group',\r
+missing_scope: 'Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/table/langs/es.js b/webcit/tiny_mce/plugins/table/langs/es.js
new file mode 100644 (file)
index 0000000..8efb025
--- /dev/null
@@ -0,0 +1,84 @@
+/**\r
+ * ES lang variables\r
+ * \r
+ * Authors : Alvaro Velasco,\r
+ *           Adolfo Sanz De Diego (asanzdiego) <asanzdiego@yahoo.es>,\r
+ *           Carlos C Soto (eclipxe) <csoto@sia-solutions.com>\r
+ * Last Updated : October 17, 2005\r
+ * TinyMCE Version : 2.0RC3\r
+ */\r
+\r
+tinyMCE.addToLang('table',{\r
+general_tab : 'General',\r
+advanced_tab : 'Avanzado',\r
+general_props : 'Propiedades generales',\r
+advanced_props : 'Propiedades avanzadas',\r
+desc : 'Insertar/Modificar tabla',\r
+row_before_desc : 'Insertar una fila antes',\r
+row_after_desc : 'Insert una fila después',\r
+delete_row_desc : 'Eliminar fila',\r
+col_before_desc : 'Insertar una columna antes',\r
+col_after_desc : 'Insertar una columna después',\r
+delete_col_desc : 'Eliminar columna',\r
+rowtype : 'File en parte de tabla',\r
+title : 'Insertar/Modificar tabla',\r
+width : 'Ancho',\r
+height : 'ALto',\r
+cols : 'Columnas',\r
+rows : 'Filas',\r
+cellspacing : 'Espacio entre celdas',\r
+cellpadding : 'Borde interior de las celdas',\r
+border : 'Borde',\r
+align : 'Alineación horizontal',\r
+align_default : 'Defecto',\r
+align_left : 'Izquierda',\r
+align_right : 'Derecha',\r
+align_middle : 'Centrado',\r
+row_title : 'Propiedades de la fila',\r
+cell_title : 'Propiedades de la celda',\r
+cell_type : 'Tipo de celda',\r
+row_desc : 'Propiedades de la fila',\r
+cell_desc : 'Propiedades de la celda',\r
+valign : 'Alineación vertical',\r
+align_top : 'Arriba',\r
+align_bottom : 'Abajo',\r
+props_desc : 'Propiedades de la tabla',\r
+bordercolor : 'Color del borde',\r
+bgcolor : 'Color del fondo',\r
+merge_cells_title : 'Combinar celdas',\r
+split_cells_desc : 'Dividir celdas',\r
+merge_cells_desc : 'Combinar celdas',\r
+cut_row_desc : 'Cortar fila',\r
+copy_row_desc : 'Copiar fila',\r
+paste_row_before_desc : 'Pegar fila antes',\r
+paste_row_after_desc : 'Pegar fila después',\r
+id : 'Id',\r
+style: 'Estilo',\r
+langdir : 'Dirección del texto',\r
+langcode : 'Código del idioma',\r
+mime : 'Tipo MIME del target',\r
+ltr : 'De izquierda a derecha',\r
+rtl : 'De derecha a izquierda',\r
+bgimage : 'Imagen de fondo',\r
+summary : 'Resumen',\r
+td : "Datos",\r
+th : "Cabecera",\r
+cell_cell : 'Actualizar la celda actual',\r
+cell_row : 'Actualizar todas las celdas de la fila',\r
+cell_all : 'Actualizar todas las celdas de la tabla',\r
+row_row : 'Actualizar la fila actual',\r
+row_odd : 'Actualizar las filas impares de la tabla',\r
+row_even : 'Actualizar las filas pares de la tabla',\r
+row_all : 'Actualizar todas las filas de la tabla',\r
+thead : 'Cabecera de la tabla',\r
+tbody : 'Cuerpo de la tabla',\r
+tfoot : 'Pie de la tabla',\r
+del : 'Eliminar tabla',\r
+scope : 'Alcance',\r
+row : 'Fila',\r
+col : 'Columna',\r
+rowgroup : 'Grupo de filas',\r
+colgroup : 'Grupo de columnas',\r
+missing_scope: '¿Estás seguro que quieres continuar sin especificar el alcance para esta celda de tipo cabecera? Sin ello, puede dificultar a algunos usuarios con discapacidades el poder entender el contenido o los datos mostrados en la tabla.',\r
+cellprops_delta_width : 55\r
+});\r
diff --git a/webcit/tiny_mce/plugins/table/langs/fa.js b/webcit/tiny_mce/plugins/table/langs/fa.js
new file mode 100644 (file)
index 0000000..101519f
--- /dev/null
@@ -0,0 +1,47 @@
+// IR lang variables\r
+// Persian (Farsi) language pack (for IRAN)\r
+// By: Morteza Zafari\r
+// Lost@LostLord.com\r
+// http://www.LostLord.com\r
+\r
+tinyMCE.addToLang('',{\r
+table_desc : '??? ???? ????',\r
+table_insert_row_before_desc : '??? ??? ???? ??? ?? ??? ????',\r
+table_insert_row_after_desc : '??? ??? ???? ?? ?? ??? ????',\r
+table_delete_row_desc : '??? ???',\r
+table_insert_col_before_desc : '??? ???? ???? ??? ?? ???? ????',\r
+table_insert_col_after_desc : '??? ???? ???? ?? ?? ???? ????',\r
+table_delete_col_desc : '??? ????',\r
+insert_table_title : '??? ? ?????? ????',\r
+insert_table_width : '???',\r
+insert_table_height : '??????',\r
+insert_table_cols : '????? ??????',\r
+insert_table_rows : '????? ?????',\r
+insert_table_cellspacing : '????? ?? ???? ????',\r
+insert_table_cellpadding : '????? ??? ?? ?????? ????',\r
+insert_table_border : '?????',\r
+insert_table_align : '??? ???? ????',\r
+insert_table_align_default : '??? ???',\r
+insert_table_align_left : '??',\r
+insert_table_align_right : '????',\r
+insert_table_align_middle : '???',\r
+insert_table_class : '????',\r
+table_row_title : 'Table row properties',\r
+table_cell_title : 'Table cell properties',\r
+table_row_desc : 'Table row properties',\r
+table_cell_desc : 'Table cell properties',\r
+insert_table_valign : 'Vertical alignment',\r
+insert_table_align_top : 'Top',\r
+insert_table_align_bottom : 'Bottom',\r
+table_props_desc : 'Table properties',\r
+table_bordercolor : 'Border color',\r
+table_bgcolor : 'Bg color',\r
+table_merge_cells_title : 'Merge table cells',\r
+table_split_cells_desc : 'Split table cells',\r
+table_merge_cells_desc : 'Merge table cells',\r
+table_cut_row_desc : 'Cut table row',\r
+table_copy_row_desc : 'Copy table row',\r
+table_paste_row_before_desc : 'Paste table row before',\r
+table_paste_row_after_desc : 'Paste table row after',\r
+table_insert_desc : 'Insert a new table'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/table/langs/fi.js b/webcit/tiny_mce/plugins/table/langs/fi.js
new file mode 100644 (file)
index 0000000..1c144e3
--- /dev/null
@@ -0,0 +1,77 @@
+// FI lang variables by Urho Konttori from Absolutions\r
+// Updated by Tuomo Aura, Ateco.fi\r
+\r
+tinyMCE.addToLang('table',{\r
+general_tab : 'Yleiset',\r
+advanced_tab : 'Edistyneemm&auml;t',\r
+general_props : 'Yleisasetukset',\r
+advanced_props : 'Edistyneemm&auml;t asetukset',\r
+desc : 'Lis&auml;&auml; uusi taulukko',\r
+row_before_desc : 'Lis&auml;&auml; rivi edelle',\r
+row_after_desc : 'Lis&auml;&auml; rivi j&auml;lkeen',\r
+delete_row_desc : 'Poista rivi',\r
+col_before_desc : 'Lis&auml;&auml; sarake edelle',\r
+col_after_desc : 'Lis&auml;&auml; sarake j&auml;lkeen',\r
+delete_col_desc : 'Poista sarake',\r
+rowtype : 'Row in table part',\r
+title : 'Lis&auml;&auml;/Muokkaa taulukkoa',\r
+width : 'Leveys',\r
+height : 'Korkeus',\r
+cols : 'Saraketta',\r
+rows : 'Rivi&auml;',\r
+cellspacing : 'Cellspacing',\r
+cellpadding : 'Cellpadding',\r
+border : 'Reuna',\r
+align : 'Asettelu',\r
+align_default : 'Oletus',\r
+align_left : 'Vasen',\r
+align_right : 'Oikea',\r
+align_middle : 'Keskelle',\r
+row_title : 'Rivin ominaisuudet',\r
+cell_title : 'Sarakkeen ominaisuudet',\r
+cell_type : 'Solun tyyppi',\r
+row_desc : 'Rivin ominaisuudet',\r
+cell_desc : 'Solun ominaisuudet',\r
+valign : 'Pystysuora asettelu',\r
+align_top : 'Yl&auml;reuna',\r
+align_bottom : 'Alareuna',\r
+props_desc : 'Taulukon ominaisuudet',\r
+bordercolor : 'Reunan v&auml;ri',\r
+bgcolor : 'Taustav&auml;ri',\r
+merge_cells_title : 'Yhdist&auml; taulukon solut',\r
+split_cells_desc : 'Erota taulukon solut',\r
+merge_cells_desc : 'Yhdist&auml; taulukon solut',\r
+cut_row_desc : 'Leikkaa taulukon rivi',\r
+copy_row_desc : 'Kopioi taulukon rivi',\r
+paste_row_before_desc : 'Liit&auml; taulukon rivi edelle',\r
+paste_row_after_desc : 'Liit&auml; taulukon rivi j&auml;lkeen',\r
+id : 'Id',\r
+style: 'Tyyli',\r
+langdir : 'Kielen suunta',\r
+langcode : 'Kielikoodi',\r
+mime : 'Kohteen MIME-tyyppi',\r
+ltr : 'Vasemmalta oikealle',\r
+rtl : 'Oikealta vasemmalle',\r
+bgimage : 'Taustakuva',\r
+summary : 'Yhteenveto',\r
+td : "Data",\r
+th : "Otsikko",\r
+cell_cell : 'P&auml;ivit&auml; kyseinen solu',\r
+cell_row : 'P&auml;ivit&auml; kaikki solut riviss&auml;',\r
+cell_all : 'P&auml;ivit&auml; kaikki solut taulukossa',\r
+row_row : 'P&auml;ivit&auml; kyseinen rivi',\r
+row_odd : 'P&auml;ivit&auml; parittomat rivit',\r
+row_even : 'P&auml;ivit&auml; parilliset rivit',\r
+row_all : 'P&auml;ivit&auml; kaikki rivit',\r
+thead : 'Table Head',\r
+tbody : 'Table Body',\r
+tfoot : 'Table Foot',\r
+del : 'Poista taulukko',\r
+scope : 'Scope',\r
+row : 'Rivi',\r
+col : 'Sarake',\r
+rowgroup : 'Riviryhm&auml;',\r
+colgroup : 'Sarakeryhm&auml;',\r
+missing_scope: 'Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.',\r
+cellprops_delta_width : 50\r
+});\r
diff --git a/webcit/tiny_mce/plugins/table/langs/fr.js b/webcit/tiny_mce/plugins/table/langs/fr.js
new file mode 100644 (file)
index 0000000..f788aac
--- /dev/null
@@ -0,0 +1,77 @@
+// French lang variables by Laurent Dran\r
+// Modifié par Normand Lamoureux le 2005-11-12\r
+\r
+tinyMCE.addToLang('table',{\r
+general_tab : 'Général',\r
+advanced_tab : 'Avancé',\r
+general_props : 'Propriétés générales',\r
+advanced_props : 'Propriétés avancées',\r
+desc : 'Insérer/Modifier un tableau',\r
+row_before_desc : 'Insérer une rangée avant',\r
+row_after_desc : 'Insérer une rangée après',\r
+delete_row_desc : 'Effacer la rangée',\r
+col_before_desc : 'Insérer une colonne avant',\r
+col_after_desc : 'Insérer une colonne après',\r
+delete_col_desc : 'Effacer la colonne',\r
+rowtype : 'Type de rangée',\r
+title : 'Gestionnaire de tableau',\r
+width : 'Largeur',\r
+height : 'Hauteur',\r
+cols : 'Colonnes',\r
+rows : 'Rangées',\r
+cellspacing : 'Entre les cellules',\r
+cellpadding : 'Marges intérieures',\r
+border : 'Bordures',\r
+align : 'Alignement horizontal',\r
+align_default : 'Par défault',\r
+align_left : 'À gauche',\r
+align_right : 'À droite',\r
+align_middle : 'Centré',\r
+row_title : 'Propriétés des rangées',\r
+cell_title : 'Propriétés des cellules',\r
+cell_type : 'Type',\r
+row_desc : 'Propriétés des rangées',\r
+cell_desc : 'Propriétés des cellules',\r
+valign : 'Alignement vertical',\r
+align_top : 'Haut',\r
+align_bottom : 'Bas',\r
+props_desc : 'Propriétés du tableau',\r
+bordercolor : 'Couleur des bordures',\r
+bgcolor : 'Couleur d\'arrière-plan',\r
+merge_cells_title : 'Fusionner les cellules',\r
+split_cells_desc : 'Scinder les cellules',\r
+merge_cells_desc : 'Fusionner les cellules',\r
+cut_row_desc : 'Éliminer la rangée',\r
+copy_row_desc : 'Copier la rangée',\r
+paste_row_before_desc : 'Coller la rangée avant',\r
+paste_row_after_desc : 'Coller la rangée après',\r
+id : 'Id',\r
+style: 'Style en ligne',\r
+langdir : 'Sens d\'écriture',\r
+langcode : 'Code de langue',\r
+mime : 'Type MIME de la cible',\r
+ltr : 'Vers la droite',\r
+rtl : 'Vers la gauche',\r
+bgimage : 'Image d\'arrière-plan',\r
+summary : 'Descriptif',\r
+td : "Donnée",\r
+th : "En-tête",\r
+cell_cell : 'Appliquer à la cellule',\r
+cell_row : 'Appliquer à toute la rangée',\r
+cell_all : 'Appliquer à tout le tableau',\r
+row_row : 'Appliquer à la rangée',\r
+row_odd : 'Appliquer aux rangées pair',\r
+row_even : 'Appliquer aux rangées impair',\r
+row_all : 'Appliquer à toutes les rangées',\r
+thead : 'En-tête',\r
+tbody : 'Corps',\r
+tfoot : 'Pied',\r
+del : 'Effacer le tableau',\r
+scope : 'Attribut scope',\r
+row : 'Rangée',\r
+col : 'Colonne',\r
+rowgroup : 'Groupe de rangées',\r
+colgroup : 'Groupe de colonnes',\r
+missing_scope: 'Les attributs scope rendraient votre tableau de données plus\naccessible à certains groupes d\'utilisateurs.\n\nÊtes-vous sûr de ne pas vouloir spécifier\nd\'attribut scope aux cellules d\'en-tête ?\n\n',\r
+cellprops_delta_width : 50\r
+});\r
diff --git a/webcit/tiny_mce/plugins/table/langs/fr_ca.js b/webcit/tiny_mce/plugins/table/langs/fr_ca.js
new file mode 100644 (file)
index 0000000..282034c
--- /dev/null
@@ -0,0 +1,43 @@
+// Canadian French lang variables by Virtuelcom   last modification: 2005-06-15\r
+\r
+tinyMCE.addToLang('',{\r
+table_desc : 'Insérer un nouveau tableau',\r
+table_insert_row_before_desc : 'Insérer une ligne avant',\r
+table_insert_row_after_desc : 'Insérer une ligne après',\r
+table_delete_row_desc : 'Supprimer la ligne',\r
+table_insert_col_before_desc : 'Insérer une colonne avant',\r
+table_insert_col_after_desc : 'Insérer une colonne après',\r
+table_delete_col_desc : 'Supprimer la colonne',\r
+insert_table_title : 'Insérer/Modifier le tableau',\r
+insert_table_width : 'Largeur',\r
+insert_table_height : 'Hauteur',\r
+insert_table_cols : 'Colonnes',\r
+insert_table_rows : 'Lignes',\r
+insert_table_cellspacing : 'Cellspacing',\r
+insert_table_cellpadding : 'Cellpadding',\r
+insert_table_border : 'Bordure',\r
+insert_table_align : 'Alignement',\r
+insert_table_align_default : 'Défaut',\r
+insert_table_align_left : 'Gauche',\r
+insert_table_align_right : 'Droit',\r
+insert_table_align_middle : 'Milieu',\r
+insert_table_class_name : 'Classe CSS',\r
+table_row_title : 'Propriétés de ligne',\r
+table_cell_title : 'Propriétés de cellule',\r
+table_row_desc : 'Propriétés de ligne',\r
+table_cell_desc : 'Propriétés de cellule',\r
+insert_table_valign : 'Alignement vertical',\r
+insert_table_align_top : 'Haut',\r
+insert_table_align_bottom : 'Bas',\r
+table_props_desc : 'Table properties',\r
+table_bordercolor : 'Border color',\r
+table_bgcolor : 'Bg color',\r
+table_merge_cells_title : 'Merge table cells',\r
+table_split_cells_desc : 'Split table cells',\r
+table_merge_cells_desc : 'Merge table cells',\r
+table_cut_row_desc : 'Cut table row',\r
+table_copy_row_desc : 'Copy table row',\r
+table_paste_row_before_desc : 'Paste table row before',\r
+table_paste_row_after_desc : 'Paste table row after',\r
+table_insert_desc : 'Insert a new table'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/table/langs/he.js b/webcit/tiny_mce/plugins/table/langs/he.js
new file mode 100644 (file)
index 0000000..a68f6c0
--- /dev/null
@@ -0,0 +1,75 @@
+// HE lang variables\r
+\r
+tinyMCE.addToLang('table',{\r
+general_tab : 'ëììé',\r
+advanced_tab : 'îú÷ãí',\r
+general_props : 'îàôééðéí ëììééí',\r
+advanced_props : 'îàôééðéí îú÷ãîéí',\r
+desc : 'îëðéñ èáìä çãùä',\r
+row_before_desc : 'äëðñ ùåøä ìôðé',\r
+row_after_desc : 'äëðñ ùåøä àçøé',\r
+delete_row_desc : 'îç÷ ùåøä',\r
+col_before_desc : 'äëðñ èåø ìôðé',\r
+col_after_desc : 'äëðñ èåø àçøé',\r
+delete_col_desc : 'îç÷ èåø',\r
+rowtype : 'ùåøä áçì÷ ùì äèáìä',\r
+title : 'äëðñ/ùðä èáìä',\r
+width : 'øåçá',\r
+height : 'âåáä',\r
+cols : 'èåøéí',\r
+rows : 'ùåøåú',\r
+cellspacing : 'øéååç áéï úàéí',\r
+cellpadding : 'øéôåã úàéí',\r
+border : 'âáåì',\r
+align : 'éùåø',\r
+align_default : 'áøéøú îçãì',\r
+align_left : 'ùîàì',\r
+align_right : 'éîéï',\r
+align_middle : 'îøëæ',\r
+row_title : 'îàôééðé ùåøä áèáìä',\r
+cell_title : 'îàôééðé úà áèáìä',\r
+cell_type : 'ñåâ úà',\r
+row_desc : 'îàôééðé ùåøä áèáìä',\r
+cell_desc : 'îàôééðé úà áèáìä',\r
+valign : 'éùåø àðëé',\r
+align_top : 'ìîòìä',\r
+align_bottom : 'ìîèä',\r
+props_desc : 'îàôééðé èáìä',\r
+bordercolor : 'öáò âáåì',\r
+bgcolor : 'öáò ø÷ò',\r
+merge_cells_title : 'îæâ úàéí áèáìä',\r
+split_cells_desc : 'ôöì úàéí áèáìä',\r
+merge_cells_desc : 'îæâ úàéí áèáìä',\r
+cut_row_desc : 'âæåø ùåøä îäèáìä',\r
+copy_row_desc : 'äòú÷ ùåøä îäèáìä',\r
+paste_row_before_desc : 'äãá÷ ùåøä ìôðé',\r
+paste_row_after_desc : 'äãá÷ ùåøä àçøé',\r
+id : 'Id',\r
+style: 'ñâðåï',\r
+langdir : 'ëéååï ùôä',\r
+langcode : '÷åã ùôä',\r
+mime : 'ñåâ MIME ùì äéòã',\r
+ltr : 'ùîàì ìéîéï',\r
+rtl : 'éîéï ìùîàì',\r
+bgimage : 'úîåðú ø÷ò',\r
+summary : 'ñéëåí',\r
+td : "îéãò",\r
+th : "ëåúøú",\r
+cell_cell : 'òãëï úà ðåëçé',\r
+cell_row : 'òãëï àú ëì äúàéí áùåøä',\r
+cell_all : 'òãëï àú ëì äúàéí áèáìä',\r
+row_row : 'òãëï ùåøä ðåëçéú',\r
+row_odd : 'òãëï ùåøåú àé-æåâéåú áèáìä',\r
+row_even : 'òãëï ùåøåú æåâéåú áèáìä',\r
+row_all : 'òãëï àú ëì äùåøåú áèáìä',\r
+thead : 'ëåúøú äèáìä',\r
+tbody : 'âåó äèáìä',\r
+tfoot : 'ñéëåí äèáìä',\r
+del : 'îç÷ èáìä',\r
+scope : 'úçåí',\r
+row : 'ùåøä',\r
+col : 'èåø',\r
+rowgroup : '÷áåöú ùåøåú',\r
+colgroup : '÷áåöú èåøéí',\r
+missing_scope: 'äàí àúä áèåç ùáøöåðê ìäîùéê îáìé ìöééï àú úçåí äëåúøú ùì äèáìä? áìé ëåúøú îåâãøú, éúëï ëé îùúîùéí áòìé îåâáìåéåú éú÷ùå ìäáéï àú äúåëï àå äîéãò äîåöâéí áèáìä.'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/table/langs/hu.js b/webcit/tiny_mce/plugins/table/langs/hu.js
new file mode 100644 (file)
index 0000000..a649eb7
--- /dev/null
@@ -0,0 +1,75 @@
+// HU lang variables\r
+\r
+tinyMCE.addToLang('table',{\r
+general_tab : 'Általános',\r
+advanced_tab : 'Haladó',\r
+general_props : 'Általános beállítások',\r
+advanced_props : 'Haladó beállítások',\r
+desc : 'Új táblázat beszúrása',\r
+row_before_desc : 'Sor beszúrása elé',\r
+row_after_desc : 'Sor beszúrása mögé',\r
+delete_row_desc : 'Sor törlése',\r
+col_before_desc : 'Oszlop beszúrása elé',\r
+col_after_desc : 'Oszlop beszúrása mögé',\r
+delete_col_desc : 'Oszlop törlése',\r
+rowtype : 'Sor a táblázatrészben',\r
+title : 'Táblázat beszúrása/módosítása',\r
+width : 'Hosszúság',\r
+height : 'Szélesség',\r
+cols : 'Oszlopok',\r
+rows : 'Sorok',\r
+cellspacing : 'Cellaköz',\r
+cellpadding : 'Cellakitöltés',\r
+border : 'Keret',\r
+align : 'Elhelyezkedés',\r
+align_default : 'alapértelmezett',\r
+align_left : 'Bal',\r
+align_right : 'Jobb',\r
+align_middle : 'Közép',\r
+row_title : 'Táblázat sor tulajdonságai',\r
+cell_title : 'Táblázat cella tulajdonságai',\r
+cell_type : 'Cella típus',\r
+row_desc : 'Táblázat sor tulajdonságai',\r
+cell_desc : 'Táblázat cella tulajdonságai',\r
+valign : 'Függõleges elhelyezkedés',\r
+align_top : 'Felül',\r
+align_bottom : 'Alul',\r
+props_desc : 'Táblázat tulajdonságai',\r
+bordercolor : 'Keret szín',\r
+bgcolor : 'Háttér szín',\r
+merge_cells_title : 'Tábla celláinak egyesítése',\r
+split_cells_desc : 'Tábla celláinak felosztása',\r
+merge_cells_desc : 'Tábla celláinak egyesítése',\r
+cut_row_desc : 'Táblázat sor kivágása',\r
+copy_row_desc : 'Táblázat sor másolása',\r
+paste_row_before_desc : 'Táblázat sor beillesztése elé',\r
+paste_row_after_desc : 'Táblázat sor beillesztése mögé',\r
+id : 'Azonodító',\r
+style: 'Stílus',\r
+langdir : 'Szövegpozíció',\r
+langcode : 'Szöveg kód',\r
+mime : 'Cél MIME típus',\r
+ltr : 'Balról jobbra',\r
+rtl : 'Jobbról balra',\r
+bgimage : 'Háttérkép',\r
+summary : 'Összefoglaló',\r
+td : "Adat",\r
+th : "Fejléc",\r
+cell_cell : 'Aktuális cella frissítése',\r
+cell_row : 'Minden cella frissítése a sorban',\r
+cell_all : 'Minden cella frissítése a táblában',\r
+row_row : 'Aktuális sor frissítése',\r
+row_odd : 'Páratlan sorok frissítése a táblában',\r
+row_even : 'páros sorok frissítése a táblában',\r
+row_all : 'Minden sor frissítése a táblában',\r
+thead : 'Táblázat fejléc',\r
+tbody : 'Táblázat test',\r
+tfoot : 'Tálázat lábléc',\r
+del : 'Tábla törlése',\r
+scope : 'Scope',\r
+row : 'Row',\r
+col : 'Col',\r
+rowgroup : 'Row Group',\r
+colgroup : 'Col Group',\r
+missing_scope: 'Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/table/langs/is.js b/webcit/tiny_mce/plugins/table/langs/is.js
new file mode 100644 (file)
index 0000000..9b23d65
--- /dev/null
@@ -0,0 +1,76 @@
+// Iceland lang variables by Johannes Birgir Jensson\r
+\r
+tinyMCE.addToLang('table',{\r
+general_tab : 'Almennt',\r
+advanced_tab : 'S&eacute;rt&aelig;kt',\r
+general_props : 'Almennar stillingar',\r
+advanced_props : 'S&eacute;rt&aelig;kar stillingar',\r
+desc : 'Setja inn n&yacute;ja t&ouml;flu',\r
+row_before_desc : 'B&aelig;ta r&ouml;&eth; vi&eth; fyrir framan',\r
+row_after_desc : 'B&aelig;ta r&ouml;&eth; vi&eth; fyrir aftan',\r
+delete_row_desc : 'Ey&eth;a r&ouml;&eth;',\r
+col_before_desc : 'B&aelig;ta d&aacute;lk vi&eth; fyrir framan',\r
+col_after_desc : 'B&aelig;ta d&aacute;lk vi&eth; fyrir aftan',\r
+delete_col_desc : 'Ey&eth;a d&aacute;lki',\r
+rowtype : 'R&ouml;&eth; &iacute; t&ouml;fluhluta',\r
+title : 'B&aelig;ta vi&eth;/breyta t&ouml;flu',\r
+width : 'Breidd',\r
+height : 'H&aelig;&eth;',\r
+cols : 'D&aacute;lkar',\r
+rows : 'Ra&eth;ir',\r
+cellspacing : 'Reitabil',\r
+cellpadding : 'Reitab&oacute;lstrun',\r
+border : 'Rammi',\r
+align : 'Textastilling',\r
+align_default : 'Sj&aacute;lfgild',\r
+align_left : 'Vinstri',\r
+align_right : 'H&aelig;gri',\r
+align_middle : 'Mi&eth;ja',\r
+row_title : 'Stillingar t&ouml;flura&eth;ar',\r
+cell_title : 'Stillingar t&ouml;flud&aacute;lks',\r
+cell_type : 'Reitartegund',\r
+row_desc : 'Stillingar t&ouml;flura&eth;ar',\r
+cell_desc : 'Stillingar t&ouml;flureits',\r
+valign : 'L&oacute;&eth;r&eacute;tt stilling',\r
+align_top : 'Efst',\r
+align_bottom : 'Ne&eth;st',\r
+props_desc : 'Stillingar t&ouml;flu',\r
+bordercolor : 'Rammalitur',\r
+bgcolor : 'Bakgrunnslitur',\r
+merge_cells_title : 'Sameina t&ouml;flureiti',\r
+split_cells_desc : 'Tv&iacute;stra t&ouml;flureitum',\r
+merge_cells_desc : 'Sameina t&ouml;flureiti',\r
+cut_row_desc : 'Klippa t&ouml;flur&ouml;&eth;',\r
+copy_row_desc : 'Afrita t&ouml;flur&ouml;&eth;',\r
+paste_row_before_desc : 'Skeyta t&ouml;flur&ouml;&eth; fyrir ofan',\r
+paste_row_after_desc : 'Skeyta t&ouml;flur&ouml;&eth; fyrir ne&eth;an',\r
+id : 'Id',\r
+style: 'St&iacute;ll',\r
+langdir : 'Rith&aacute;ttur tungum&aacute;ls',\r
+langcode : 'Tungum&aacute;lskenni',\r
+mime : 'MIME-tegund tengils',\r
+ltr : 'Vinstri til h&aelig;gri',\r
+rtl : 'H&aelig;gri til vinstri',\r
+bgimage : 'Bakgrunnsmynd',\r
+summary : 'Samantekt',\r
+td : "G&ouml;gn",\r
+th : "Haus",\r
+cell_cell : 'Uppf&aelig;ra n&uacute;verandi reit',\r
+cell_row : 'Uppf&aelig;ra alla reiti í r&ouml;&eth;inni',\r
+cell_all : 'Uppf&aelig;ra alla reiti t&ouml;flunnar',\r
+row_row : 'Uppf&aelig;ra n&uacute;verandi r&ouml;&eth;',\r
+row_odd : 'Uppf&aelig;ra oddat&ouml;lura&eth;ir',\r
+row_even : 'Uppf&aelig;ra jafnt&ouml;lura&eth;ir',\r
+row_all : 'Uppf&aelig;ra allar ra&eth;ir',\r
+thead : 'Haus t&ouml;flu',\r
+tbody : 'Meginm&aacute;l t&ouml;flu',\r
+tfoot : 'F&oacute;tur t&ouml;flu',\r
+del : 'Ey&eth;a t&ouml;flu',\r
+scope : 'Gildissvi&eth;',\r
+row : 'R&ouml;&eth;',\r
+col : 'D&aacute;lkur',\r
+rowgroup : 'Ra&eth;ah&oacute;pur',\r
+colgroup : 'D&aacute;lkah&oacute;pur',\r
+missing_scope: 'Viltu halda áfram án þess að tilgreina gildissvið fyrir haus töflu? Án þess gæti það valdið sumum notendum, til dæmis sjónskertum, vandkvæðum við að skilja innihald töflunnar.',\r
+cellprops_delta_width : 55\r
+});\r
diff --git a/webcit/tiny_mce/plugins/table/langs/it.js b/webcit/tiny_mce/plugins/table/langs/it.js
new file mode 100644 (file)
index 0000000..b9166ad
--- /dev/null
@@ -0,0 +1,43 @@
+// Variabili di lingua IT - fabrix.xm@lombardiacom.it\r
+\r
+tinyMCE.addToLang('',{\r
+table_desc : 'Inserisci una nuova tabella',\r
+table_insert_row_before_desc : 'Inserisci una riga prima',\r
+table_insert_row_after_desc : 'Inserisci una riga dopo',\r
+table_delete_row_desc : 'Cancella riga',\r
+table_insert_col_before_desc : 'Inserisci colonna prima',\r
+table_insert_col_after_desc : 'Inserisci colonna dopo',\r
+table_delete_col_desc : 'Rimuovi colonna',\r
+insert_table_title : 'Inserisci/modifica tabella',\r
+insert_table_width : 'Larghezza',\r
+insert_table_height : 'Altezza',\r
+insert_table_cols : 'Colonne',\r
+insert_table_rows : 'Righe',\r
+insert_table_cellspacing : 'Cellspacing',\r
+insert_table_cellpadding : 'Cellpadding',\r
+insert_table_border : 'Bordo',\r
+insert_table_align : 'Allineamento',\r
+insert_table_align_default : 'Default',\r
+insert_table_align_left : 'Sinistra',\r
+insert_table_align_right : 'Destra',\r
+insert_table_align_middle : 'Centro',\r
+insert_table_class : 'Classe',\r
+table_row_title : 'Proprietà della riga',\r
+table_cell_title : 'Proprietà della cella',\r
+table_row_desc : 'Proprietà della riga',\r
+table_cell_desc : 'Proprietà della cella',\r
+insert_table_valign : 'Allineamento verticale',\r
+insert_table_align_top : 'In alto',\r
+insert_table_align_bottom : 'In basso',\r
+table_props_desc : 'Proprietà della tabella',\r
+table_bordercolor : 'Colore bordo',\r
+table_bgcolor : 'Colore sfondo',\r
+table_merge_cells_title : 'Unisci celle',\r
+table_split_cells_desc : 'Dividi celle',\r
+table_merge_cells_desc : 'Unisci le celle',\r
+table_cut_row_desc : 'Taglia riga',\r
+table_copy_row_desc : 'Copia riga',\r
+table_paste_row_before_desc : 'Incolla riga prima',\r
+table_paste_row_after_desc : 'Incolla riga dopo',\r
+table_insert_desc : 'Inserisci una nuova tabella'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/table/langs/ja.js b/webcit/tiny_mce/plugins/table/langs/ja.js
new file mode 100644 (file)
index 0000000..17e3088
--- /dev/null
@@ -0,0 +1,43 @@
+// JP lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+table_desc : '\e$B%F!<%V%k\e(B',\r
+table_insert_row_before_desc : '\e$B9TA^F~\e(B(\e$BA0\e(B)',\r
+table_insert_row_after_desc : '\e$B9TA^F~\e(B(\e$B8e\e(B)',\r
+table_delete_row_desc : '\e$B9T:o=|\e(B',\r
+table_insert_col_before_desc : '\e$BNsA^F~\e(B(\e$BA0\e(B)',\r
+table_insert_col_after_desc : '\e$BNsA^F~\e(B(\e$B8e\e(B)',\r
+table_delete_col_desc : '\e$BNs:o=|\e(B',\r
+insert_table_title : '\e$B%F!<%V%k$NA^F~\e(B/\e$BJT=8\e(B',\r
+insert_table_cols : '\e$BNs?t\e(B',\r
+insert_table_rows : '\e$B9T?t\e(B',\r
+insert_table_cellspacing : '\e$B%;%kM>Gr\e(B',\r
+insert_table_cellpadding : '\e$B%;%k5M$a\e(B',\r
+insert_table_align : '\e$B0LCVD4@0\e(B',\r
+insert_table_align_default : '\e$B0EL[\e(B',\r
+insert_table_align_left : '\e$B:85M$a\e(B',\r
+insert_table_align_right : '\e$B1&5M$a\e(B',\r
+insert_table_align_middle : '\e$BCf1{4s$;\e(B',\r
+insert_table_width : '\e$BI}\e(B',\r
+insert_table_height : '\e$B9b$5\e(B',\r
+insert_table_border : '\e$B6-3&@~\e(B',\r
+insert_table_class : '\e$B%/%i%9\e(B',\r
+table_row_title : 'Table row properties',\r
+table_cell_title : 'Table cell properties',\r
+table_row_desc : 'Table row properties',\r
+table_cell_desc : 'Table cell properties',\r
+insert_table_valign : 'Vertical alignment',\r
+insert_table_align_top : 'Top',\r
+insert_table_align_bottom : 'Bottom',\r
+table_props_desc : 'Table properties',\r
+table_bordercolor : 'Border color',\r
+table_bgcolor : 'Bg color',\r
+table_merge_cells_title : 'Merge table cells',\r
+table_split_cells_desc : 'Split table cells',\r
+table_merge_cells_desc : 'Merge table cells',\r
+table_cut_row_desc : 'Cut table row',\r
+table_copy_row_desc : 'Copy table row',\r
+table_paste_row_before_desc : 'Paste table row before',\r
+table_paste_row_after_desc : 'Paste table row after',\r
+table_insert_desc : 'Insert a new table'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/table/langs/ko.js b/webcit/tiny_mce/plugins/table/langs/ko.js
new file mode 100644 (file)
index 0000000..bd8b30e
--- /dev/null
@@ -0,0 +1,43 @@
+// KO lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+table_desc : 'Ç¥ ³&Ouml;±â',\r
+table_insert_row_before_desc : '¾Õ¿¡ Çà ³&Ouml;±â',\r
+table_insert_row_after_desc : 'µÚ¿¡ Çà ³&Ouml;±â',\r
+table_delete_row_desc : 'Çà Á&ouml;¿ì±â',\r
+table_insert_col_before_desc : '¾Õ¿¡ ¿­ ³&Ouml;±â',\r
+table_insert_col_after_desc : 'µÚ¿¡ ¿­ ³&Ouml;±â',\r
+table_delete_col_desc : '¿­ Á&ouml;¿ì±â',\r
+insert_table_title : 'Ç¥ ³&Ouml;±â/°í&Auml;¡±â',\r
+insert_table_width : '³Êºñ',\r
+insert_table_height : '³ôÀÌ',\r
+insert_table_cols : 'Çà',\r
+insert_table_rows : '¿­',\r
+insert_table_cellspacing : '¼¿ °£°Ý',\r
+insert_table_cellpadding : '¼¿ ¿©¹é',\r
+insert_table_border : '&Aring;׵θ®',\r
+insert_table_align : 'Á¤·&Auml;',\r
+insert_table_align_default : '±âº»°ª',\r
+insert_table_align_left : '¿ÞÂÊ',\r
+insert_table_align_right : '¿À¸¥ÂÊ',\r
+insert_table_align_middle : '°¡¿îµ¥',\r
+insert_table_class : '&Aring;¬·¡½º',\r
+table_row_title : 'Table row properties',\r
+table_cell_title : 'Table cell properties',\r
+table_row_desc : 'Table row properties',\r
+table_cell_desc : 'Table cell properties',\r
+insert_table_valign : 'Vertical alignment',\r
+insert_table_align_top : 'Top',\r
+insert_table_align_bottom : 'Bottom',\r
+table_props_desc : 'Table properties',\r
+table_bordercolor : 'Border color',\r
+table_bgcolor : 'Bg color',\r
+table_merge_cells_title : 'Merge table cells',\r
+table_split_cells_desc : 'Split table cells',\r
+table_merge_cells_desc : 'Merge table cells',\r
+table_cut_row_desc : 'Cut table row',\r
+table_copy_row_desc : 'Copy table row',\r
+table_paste_row_before_desc : 'Paste table row before',\r
+table_paste_row_after_desc : 'Paste table row after',\r
+table_insert_desc : 'Insert a new table'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/table/langs/nb.js b/webcit/tiny_mce/plugins/table/langs/nb.js
new file mode 100644 (file)
index 0000000..422017e
--- /dev/null
@@ -0,0 +1,75 @@
+// nb = Norwegian (bokm&aring;l) lang variables by Knut B. Jacobsen\r
+\r
+tinyMCE.addToLang('table',{\r
+general_tab : 'Generelt',\r
+advanced_tab : 'Avansert',\r
+general_props : 'Generelle egenskaper',\r
+advanced_props : 'Avanserte egenskaper',\r
+desc : 'Opprett/endre tabell',\r
+row_before_desc : 'Opprett rad foran',\r
+row_after_desc : 'Opprett rad etter',\r
+delete_row_desc : 'Fjern rad',\r
+col_before_desc : 'Opprett kolonne foran',\r
+col_after_desc : 'Opprett kolonne etter',\r
+delete_col_desc : 'Fjern kolonne',\r
+rowtype : 'Rad i tabell',\r
+title : 'Opprett/endre tabell',\r
+width : 'Bredde',\r
+height : 'H&oslash;yde',\r
+cols : 'Kolonner',\r
+rows : 'Rader',\r
+cellspacing : 'Celle mellomrom',\r
+cellpadding : 'Celle fylling',\r
+border : 'Rammebredde',\r
+align : 'Justering',\r
+align_default : 'Ingen',\r
+align_left : 'Venstre',\r
+align_right : 'H&oslash;yre',\r
+align_middle : 'Midtstilt',\r
+row_title : 'tabell rad egenskaper',\r
+cell_title : 'tabell celle egenskaper',\r
+cell_type : 'Celle type',\r
+row_desc : 'tabell rad egenskaper',\r
+cell_desc : 'tabell celle egenskaper',\r
+valign : 'Vertikal justering',\r
+align_top : 'Topp',\r
+align_bottom : 'Bunn',\r
+props_desc : 'tabell egenskaper',\r
+bordercolor : 'Rammefarge',\r
+bgcolor : 'Bakgrunnsfarge',\r
+merge_cells_title : 'Sl&aring; sammen tabell celler',\r
+split_cells_desc : 'Splitt tabell celler',\r
+merge_cells_desc : 'Sl&aring; sammen tabell celler',\r
+cut_row_desc : 'Fjern tabell rad',\r
+copy_row_desc : 'Kopier tabell rad',\r
+paste_row_before_desc : 'Lim inn tabell rad foran',\r
+paste_row_after_desc : 'Lim inn tabell rad etter',\r
+id : 'Id',\r
+style: 'Stil',\r
+langdir : 'Spr&aring;k retning',\r
+langcode : 'Spr&aring;k kode',\r
+mime : 'M&aring;lets MIME type',\r
+ltr : 'Venstre mot h&oslash;yre',\r
+rtl : 'H&oslash;yre mot venstre',\r
+bgimage : 'Bakgrunnsbilde',\r
+summary : 'Sum',\r
+td : "Data",\r
+th : "Overskrift",\r
+cell_cell : 'Oppdater valgt celle',\r
+cell_row : 'Oppdater alle celler i raden',\r
+cell_all : 'Oppdater alle celler i tabellen',\r
+row_row : 'Oppdater valgt rad',\r
+row_odd : 'Oppdater ulike rader i tabellen',\r
+row_even : 'Oppdater like rader i tabellen',\r
+row_all : 'Oppdater alle rader i tabellen',\r
+thead : 'Tabell Hode',\r
+tbody : 'Tabell Kropp',\r
+tfoot : 'Tabell Fot',\r
+del : 'Slett tabell',\r
+scope : 'Hensikt',\r
+row : 'Rad',\r
+col : 'Kolonne',\r
+rowgroup : 'Rad gruppe',\r
+colgroup : 'Kolonne gruppe',\r
+missing_scope: 'Er du sikker p&aring; at du vil fortsette uten &aring; oppgi hensikten med denne tabellens hode celle.'\r
+});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/table/langs/nl.js b/webcit/tiny_mce/plugins/table/langs/nl.js
new file mode 100644 (file)
index 0000000..503388b
--- /dev/null
@@ -0,0 +1,75 @@
+// NL lang variables\r
+\r
+tinyMCE.addToLang('table',{\r
+general_tab : 'Algemeen',\r
+advanced_tab : 'Geavanceerd',\r
+general_props : 'Algemene eigenschappen',\r
+advanced_props : 'Geavanceerde eigenschappen',\r
+desc : 'Nieuwe tabel invoegen',\r
+row_before_desc : 'Rij boven invoegen',\r
+row_after_desc : 'Rij onder invoegen',\r
+delete_row_desc : 'Rij verwijderen',\r
+col_before_desc : 'Kolom links invoegen',\r
+col_after_desc : 'Kolom rechts invoegen',\r
+delete_col_desc : 'Kolom verwijderen',\r
+rowtype : 'Row in table part',\r
+title : 'Tabel invoegen/bewerken',\r
+width : 'Breedte',\r
+height : 'Hoogte',\r
+cols : 'Kolommen',\r
+rows : 'Rijen',\r
+cellspacing : 'Ruimte om cel',\r
+cellpadding : 'Ruimte in cel',\r
+border : 'Rand',\r
+align : 'Uitlijning',\r
+align_default : 'Standaard',\r
+align_left : 'Links',\r
+align_right : 'Rechts',\r
+align_middle : 'Centreren',\r
+row_title : 'Tabelrij-eigenschappen',\r
+cell_title : 'Tabelcel-eigenschappen',\r
+cell_type : 'Celtype',\r
+row_desc : 'Tabelrij-eigenschappen',\r
+cell_desc : 'Tabelcel-eigenschappen',\r
+valign : 'Verticale uitlijning',\r
+align_top : 'Boven',\r
+align_bottom : 'Onder',\r
+props_desc : 'Tabeleigenschappen',\r
+bordercolor : 'Randkleur',\r
+bgcolor : 'Achtergrondkleur',\r
+merge_cells_title : 'Tabelcellen samenvoegen',\r
+split_cells_desc : 'Tabelcellen splitsen',\r
+merge_cells_desc : 'Tabelcellen samenvoegen',\r
+cut_row_desc : 'Tabelrij knippen',\r
+copy_row_desc : 'Tebelrij kopi&euml;ren',\r
+paste_row_before_desc : 'Tabelrij boven plakken',\r
+paste_row_after_desc : 'tabelrij onder plakken',\r
+id : 'Id',\r
+style: 'Stijl',\r
+langdir : 'Taalrichting',\r
+langcode : 'Taalcode',\r
+mime : 'MIME type',\r
+ltr : 'Links naar rechts',\r
+rtl : 'Rechts naar links',\r
+bgimage : 'Achtergrondafbeelding',\r
+summary : 'Samenvatting',\r
+td : "Data",\r
+th : "Kop",\r
+cell_cell : 'Huidige cel bijwerken',\r
+cell_row : 'Alle cellen in rij bijwerken',\r
+cell_all : 'Alle cellen in tabel bijwerken',\r
+row_row : 'Huidige rij bijwerken',\r
+row_odd : 'Oneven rijen in tabel bijwerken',\r
+row_even : 'Even rijen in tabel bijwerken',\r
+row_all : 'Alle rijen in tabel bijwerken',\r
+thead : 'Tabel-kop',\r
+tbody : 'Tabel-body',\r
+tfoot : 'Tabel-voet',\r
+del : 'Tabel verwijderen',\r
+scope : 'Bereik',\r
+row : 'Rij',\r
+col : 'Kolom',\r
+rowgroup : 'Rijgroep',\r
+colgroup : 'Kolomgroep',\r
+missing_scope: 'Zonder een bereik van een tabelkop, is het moeilijk voor mensen met een visuele handicap deze pagina te begrijpen. Weet u zeker dat u zonder bereik verder wilt gaan?'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/table/langs/nn.js b/webcit/tiny_mce/plugins/table/langs/nn.js
new file mode 100644 (file)
index 0000000..642ab23
--- /dev/null
@@ -0,0 +1,76 @@
+// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen\r
+\r
+tinyMCE.addToLang('table',{\r
+general_tab : 'Generelt',\r
+advanced_tab : 'Avansert',\r
+general_props : 'Generelle egenskaper',\r
+advanced_props : 'Avanserte egenskaper',\r
+desc : 'Opprett/endre tabell',\r
+row_before_desc : 'Opprett rad foran',\r
+row_after_desc : 'Opprett rad etter',\r
+delete_row_desc : 'Fjern rad',\r
+col_before_desc : 'Opprett kolonne foran',\r
+col_after_desc : 'Opprett kolonne etter',\r
+delete_col_desc : 'Fjern kolonne',\r
+rowtype : 'Rad i tabell',\r
+title : 'Opprett/endre tabell',\r
+width : 'Bredde',\r
+height : 'H&oslash;gde',\r
+cols : 'Kolonner',\r
+rows : 'Rader',\r
+cellspacing : 'Celle mellomrom',\r
+cellpadding : 'Celle fylling',\r
+border : 'Rammebredde',\r
+align : 'Justering',\r
+align_default : 'Ingen',\r
+align_left : 'Venstre',\r
+align_right : 'H&oslash;gre',\r
+align_middle : 'Midtstilt',\r
+row_title : 'tabell rad egenskaper',\r
+cell_title : 'tabell celle egenskaper',\r
+cell_type : 'Celle type',\r
+row_desc : 'tabell rad egenskaper',\r
+cell_desc : 'tabell celle egenskaper',\r
+valign : 'Vertikal justering',\r
+align_top : 'Topp',\r
+align_bottom : 'Bunn',\r
+props_desc : 'tabell egenskaper',\r
+bordercolor : 'Rammefarge',\r
+bgcolor : 'Bakgrunnsfarge',\r
+merge_cells_title : 'Sl&aring; sammen tabell celler',\r
+split_cells_desc : 'Splitt tabell celler',\r
+merge_cells_desc : 'Sl&aring; sammen tabell celler',\r
+cut_row_desc : 'Fjern tabell rad',\r
+copy_row_desc : 'Kopier tabell rad',\r
+paste_row_before_desc : 'Lim inn tabell rad foran',\r
+paste_row_after_desc : 'Lim inn tabell rad etter',\r
+id : 'Id',\r
+style: 'Stil',\r
+langdir : 'Spr&aring;k retning',\r
+langcode : 'Spr&aring;k kode',\r
+mime : 'M&aring;lets MIME type',\r
+ltr : 'Venstre mot h&oslash;gre',\r
+rtl : 'H&oslash;gre mot venstre',\r
+bgimage : 'Bakgrunnsbilde',\r
+summary : 'Sum',\r
+td : "Data",\r
+th : "Overskrift",\r
+cell_cell : 'Oppdater valgt celle',\r
+cell_row : 'Oppdater alle celler i raden',\r
+cell_all : 'Oppdater alle celler i tabellen',\r
+row_row : 'Oppdater valgt rad',\r
+row_odd : 'Oppdater ulike rader i tabellen',\r
+row_even : 'Oppdater like rader i tabellen',\r
+row_all : 'Oppdater alle rader i tabellen',\r
+thead : 'Tabell Hode',\r
+tbody : 'Tabell Kropp',\r
+tfoot : 'Tabell Fot',\r
+del : 'Slett tabell',\r
+scope : 'Hensikt',\r
+row : 'Rad',\r
+col : 'Kolonne',\r
+rowgroup : 'Rad gruppe',\r
+colgroup : 'Kolonne gruppe',\r
+missing_scope: 'Er du sikker p&aring; at du vil fortsette uten &aring; oppgi hensikten med denne tabellens hode celle.',\r
+cellprops_delta_width : 30\r
+});
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/table/langs/pl.js b/webcit/tiny_mce/plugins/table/langs/pl.js
new file mode 100644 (file)
index 0000000..b9f0050
--- /dev/null
@@ -0,0 +1,78 @@
+// PL lang variables\r
+// fixed by Wooya\r
+// http://www.mfusion.prv.pl\r
+\r
+tinyMCE.addToLang('table',{\r
+general_tab : 'G³ówne ustawienia',\r
+advanced_tab : 'Zaawansowane',\r
+general_props : 'G³ówne ustawienia',\r
+advanced_props : 'Zaawansowane ustawienia',\r
+desc : 'Wstawia now± tabelê',\r
+row_before_desc : 'Wstaw wiersz przed',\r
+row_after_desc : 'Wstaw wiersz za',\r
+delete_row_desc : 'Usuñ wiersz',\r
+col_before_desc : 'Wstaw kolumnê przed',\r
+col_after_desc : 'Wstaw kolumnê za',\r
+delete_col_desc : 'Usuñ kolumnê',\r
+rowtype : 'Wiersz w czê¶ci tabeli',\r
+title : 'Wstaw/Zmieñ tabelê',\r
+width : 'Szeroko¶æ',\r
+height : 'Wysoko¶æ',\r
+cols : 'Kolumn',\r
+rows : 'Wierszy',\r
+cellspacing : 'Odstêpy miêdzy komórkami',\r
+cellpadding : 'Margines wewn±trz komórek',\r
+border : 'Ramka',\r
+align : 'Wyrównanie',\r
+align_default : 'Domy¶lne',\r
+align_left : 'Lewo',\r
+align_right : 'Prawo',\r
+align_middle : '¦rodek',\r
+row_title : 'W³a¶ciwo¶ci wiersza',\r
+cell_title : 'W³a¶ciwo¶ci komórki',\r
+cell_type : 'Typ komórki',\r
+row_desc : 'W³a¶ciwo¶ci wiersza',\r
+cell_desc : 'W³a¶ciwo¶ci komórki',\r
+valign : 'Wyrównanie pionowe',\r
+align_top : 'Do góry',\r
+align_bottom : 'Do do³u',\r
+props_desc : 'W³a¶ciwo¶ci tabeli',\r
+bordercolor : 'Kolor ramki',\r
+bgcolor : 'Kolor t³a',\r
+merge_cells_title : 'Po³±cz komórki',\r
+split_cells_desc : 'Rozdziel komórki',\r
+merge_cells_desc : 'Po³±cz komórki',\r
+cut_row_desc : 'Wytnij wiersz',\r
+copy_row_desc : 'Kopiuj wiersz',\r
+paste_row_before_desc : 'Wklej wiersz przed',\r
+paste_row_after_desc : 'Wklej wiersz za',\r
+id : 'Id',\r
+style: 'Styl',\r
+langdir : 'Kierunek tekstu',\r
+langcode : 'Kod jêzyka',\r
+mime : 'Docelowy typ MIME',\r
+ltr : 'Lewy do prawego',\r
+rtl : 'Prawy do lewego',\r
+bgimage : 'Obrazek t³a',\r
+summary : 'Podsumowanie',\r
+td : "Dane",\r
+th : "Nag³ówek",\r
+cell_cell : 'Aktualizuj bie¿±c± komórkê',\r
+cell_row : 'Aktualizuj wszystkie komórki w wierszu',\r
+cell_all : 'Aktualizuj wszystkie komórki w tabeli',\r
+row_row : 'Aktualizuj bierz±c± komórkê',\r
+row_odd : 'Aktualizuj nieparzyste komórki w tabeli',\r
+row_even : 'Aktualizuj parzyste komórki w tabeli',\r
+row_all : 'Aktualizuj wszystkie komórki w tabeli',\r
+thead : 'Nag³ówek tabeli',\r
+tbody : 'Cia³o tabeli',\r
+tfoot : 'Stopka tabeli',\r
+del : 'Usuñ tabelê',\r
+scope : 'Zasiêg',\r
+row : 'Wiersz',\r
+col : 'Kolumna',\r
+rowgroup : 'Grupa wiersza',\r
+colgroup : 'Grupa kolumny',\r
+missing_scope: 'Czy jeste¶ pewien, ¿e chcesz kontynuowaæ bez sprecyzowania zasiêgu dla nag³ówka tej tabeli? Bez tego, niektórzy u¿ytkownicy mog± mieæ problem ze zrozumieniem zawarto¶ci tej tabeli, je¿eli maj± w³±czone jakie¶ ograniczenia w przegl±darkach.',\r
+cellprops_delta_width : 70\r
+});\r
diff --git a/webcit/tiny_mce/plugins/table/langs/pt.js b/webcit/tiny_mce/plugins/table/langs/pt.js
new file mode 100644 (file)
index 0000000..65d68c6
--- /dev/null
@@ -0,0 +1,84 @@
+/**\r
+ * pt_br lang variables\r
+ * Brazilian Portuguese\r
+ *\r
+ * Authors :\r
+ *           Marcio Barbosa (mpg) <mpg@mpg.com.br>\r
+ * Last Updated : November 26, 2005\r
+ * TinyMCE Version : 2.0RC4\r
+ */\r
+tinyMCE.addToLang('table',{\r
+general_tab : 'Geral',\r
+advanced_tab : 'Avançado',\r
+general_props : 'Propriedades Gerais',\r
+advanced_props : 'Propriedades Avançadas',\r
+desc : 'Inserir uma nova tabela',\r
+row_before_desc : 'Inserir uma linha antes',\r
+row_after_desc : 'Inserir uma linha depois',\r
+delete_row_desc : 'Apagar linha',\r
+col_before_desc : 'Inserir uma coluna antes',\r
+col_after_desc : 'Inserir uma coluna depois',\r
+delete_col_desc : 'Remover coluna',\r
+rowtype : 'Linhas na tabela parcial',\r
+title : 'Inserir/Modificar Tabela',\r
+width : 'Largura',\r
+height : 'Altura',\r
+cols : 'Colunas',\r
+rows : 'Linhas',\r
+cellspacing : 'Espaçamento das células',\r
+cellpadding : 'Margem interna',\r
+border : 'Borda',\r
+align : 'Alinhamento',\r
+align_default : 'Padrão',\r
+align_left : 'Esquerda',\r
+align_right : 'Direita',\r
+align_middle : 'Centrado',\r
+row_title : 'Propriedades das linha',\r
+cell_title : 'Propriedades da célula',\r
+cell_type : 'Tipo de célula',\r
+row_desc : 'Propriedades das linhas',\r
+cell_desc : 'Propriedades da célula',\r
+valign : 'Alinhamento vertical',\r
+align_top : 'Superior',\r
+align_bottom : 'Inferior',\r
+props_desc : 'Propriedades da tabela',\r
+bordercolor : 'Côr da borda',\r
+bgcolor : 'Côr do fundo',\r
+merge_cells_title : 'Juntar células',\r
+merge_cells_desc : 'Juntar células da tabela',\r
+split_cells_title : 'Separar células',\r
+split_cells_desc : 'Separar células',\r
+cut_row_desc : 'Apagar linha',\r
+copy_row_desc : 'Copiar linha',\r
+paste_row_before_desc : 'Colar linha antes',\r
+paste_row_after_desc : 'Colar linha depois',\r
+id : 'Id',\r
+style: 'Estilo',\r
+langdir : 'Direção do texto',\r
+langcode : 'Código do idioma',\r
+mime : 'Tipo de MIME do objeto',\r
+ltr : 'Esquerda para direita',\r
+rtl : 'Direita para esquerda',\r
+bgimage : 'Imagem de fundo',\r
+summary : 'Sumário',\r
+td : "Dados",\r
+th : "Cabeçalho",\r
+cell_cell : 'Atulizar célula atual',\r
+cell_row : 'Atualizar todas as cédulas na linha',\r
+cell_all : 'Atualizar todas as cédulas da tabela',\r
+row_row : 'Atualizar linha atual',\r
+row_odd : 'Atualizar linhas ímpares na tabela',\r
+row_even : 'Atualizar linhas pares na tabela',\r
+row_all : 'Atualizar todas as linhas na tabela',\r
+thead : 'Cabeçalho da tabela',\r
+tbody : 'Corpo da tabela',\r
+tfoot : 'Rodapé da tabela',\r
+del : 'Apagar tabela',\r
+dir : 'Direção',\r
+scope : 'Escopo',\r
+row : 'Linha',\r
+col : 'Coluna',\r
+rowgroup : 'Grupo de linhas',\r
+colgroup : 'Grupo de colunas',\r
+missing_scope: 'Tem certeza que deseja continuar sem especificar um escopo para este célula de cabeçalho. Sem isso talvez seja difícil para alguns usuários especiais entender ou conteúdo ou visualizar a tabela.'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/table/langs/pt_br.js b/webcit/tiny_mce/plugins/table/langs/pt_br.js
new file mode 100644 (file)
index 0000000..4736fd6
--- /dev/null
@@ -0,0 +1,85 @@
+/**\r
+ * pt_br lang variables\r
+ * Brazilian Portuguese\r
+ *\r
+ * Authors :\r
+ *           Marcio Barbosa (mpg) <mpg@mpg.com.br>\r
+ * Last Updated : November 26, 2005\r
+ * TinyMCE Version : 2.0RC4\r
+ */\r
+tinyMCE.addToLang('table',{\r
+general_tab : 'Geral',\r
+advanced_tab : 'Avançado',\r
+general_props : 'Propriedades Gerais',\r
+advanced_props : 'Propriedades Avançadas',\r
+desc : 'Inserir uma nova tabela',\r
+row_before_desc : 'Inserir uma linha antes',\r
+row_after_desc : 'Inserir uma linha depois',\r
+delete_row_desc : 'Apagar linha',\r
+col_before_desc : 'Inserir uma coluna antes',\r
+col_after_desc : 'Inserir uma coluna depois',\r
+delete_col_desc : 'Remover coluna',\r
+rowtype : 'Linhas na tabela parcial',\r
+title : 'Inserir/Modificar Tabela',\r
+width : 'Largura',\r
+height : 'Altura',\r
+cols : 'Colunas',\r
+rows : 'Linhas',\r
+cellspacing : 'Espaçamento das células',\r
+cellpadding : 'Margem interna',\r
+border : 'Borda',\r
+align : 'Alinhamento',\r
+align_default : 'Padrão',\r
+align_left : 'Esquerda',\r
+align_right : 'Direita',\r
+align_middle : 'Centrado',\r
+row_title : 'Propriedades das linha',\r
+cell_title : 'Propriedades da célula',\r
+cell_type : 'Tipo de célula',\r
+row_desc : 'Propriedades das linhas',\r
+cell_desc : 'Propriedades da célula',\r
+valign : 'Alinhamento vertical',\r
+align_top : 'Superior',\r
+align_bottom : 'Inferior',\r
+props_desc : 'Propriedades da tabela',\r
+bordercolor : 'Côr da borda',\r
+bgcolor : 'Côr do fundo',\r
+merge_cells_title : 'Juntar células',\r
+merge_cells_desc : 'Juntar células da tabela',\r
+split_cells_title : 'Separar células',\r
+split_cells_desc : 'Separar células',\r
+cut_row_desc : 'Apagar linha',\r
+copy_row_desc : 'Copiar linha',\r
+paste_row_before_desc : 'Colar linha antes',\r
+paste_row_after_desc : 'Colar linha depois',\r
+id : 'Id',\r
+style: 'Estilo',\r
+langdir : 'Direção do texto',\r
+langcode : 'Código do idioma',\r
+mime : 'Tipo de MIME do objeto',\r
+ltr : 'Esquerda para direita',\r
+rtl : 'Direita para esquerda',\r
+bgimage : 'Imagem de fundo',\r
+summary : 'Sumário',\r
+td : "Dados",\r
+th : "Cabeçalho",\r
+cell_cell : 'Atulizar célula atual',\r
+cell_row : 'Atualizar todas as cédulas na linha',\r
+cell_all : 'Atualizar todas as cédulas da tabela',\r
+row_row : 'Atualizar linha atual',\r
+row_odd : 'Atualizar linhas ímpares na tabela',\r
+row_even : 'Atualizar linhas pares na tabela',\r
+row_all : 'Atualizar todas as linhas na tabela',\r
+thead : 'Cabeçalho da tabela',\r
+tbody : 'Corpo da tabela',\r
+tfoot : 'Rodapé da tabela',\r
+del : 'Apagar tabela',\r
+dir : 'Direção',\r
+scope : 'Escopo',\r
+row : 'Linha',\r
+col : 'Coluna',\r
+rowgroup : 'Grupo de linhas',\r
+colgroup : 'Grupo de colunas',\r
+missing_scope: 'Tem certeza que deseja continuar sem especificar um escopo para este célula de cabeçalho. Sem isso talvez seja difícil para alguns usuários especiais entender ou conteúdo ou visualizar a tabela.',\r
+cellprops_delta_width : 55\r
+});\r
diff --git a/webcit/tiny_mce/plugins/table/langs/readme.txt b/webcit/tiny_mce/plugins/table/langs/readme.txt
new file mode 100644 (file)
index 0000000..ef48d2b
--- /dev/null
@@ -0,0 +1,4 @@
+Theme specific language packs.\r
+\r
+The language pack codes are based on ISO-639-2\r
+http://www.loc.gov/standards/iso639-2/englangn.html\r
diff --git a/webcit/tiny_mce/plugins/table/langs/ru.js b/webcit/tiny_mce/plugins/table/langs/ru.js
new file mode 100644 (file)
index 0000000..e224385
--- /dev/null
@@ -0,0 +1,77 @@
+// RU cp1251 lang variables\r
+\r
+tinyMCE.addToLang('table',{\r
+general_tab : 'Îñíîâíûå',\r
+advanced_tab : 'Ðàñøèðåííûå',\r
+general_props : 'Îñíîâíûå ñâîéñòâà',\r
+advanced_props : 'Ðàñøèðåííûå ñâîéñòâà',\r
+desc : 'Âñòàâèòü íîâóþ òàáëèöó',\r
+row_before_desc : 'Âñòàâèòü ñòðîêó ïåðåä',\r
+row_after_desc : 'Âñòàâèòü ñòðîêó ïîñëå',\r
+delete_row_desc : 'Óäàëèòü ñòðîêó',\r
+col_before_desc : 'Âñòàâèòü êîëîíêó ïåðåä',\r
+col_after_desc : 'Âñòàâèòü êîëîíêó ïîñëå',\r
+delete_col_desc : 'Óäàëèòü êîëîíêó',\r
+rowtype : 'Ñòðîêà â ÷àñòè òàáëèöû',\r
+title : 'Âñòàâèòü/Èçìåíèòü òàáëèöó',\r
+width : 'Øèðèíà',\r
+height : 'Âûñîòà',\r
+cols : 'Êîëîíêè',\r
+rows : 'Ñòðîêè',\r
+cellspacing : 'Ðàññòîÿíèå ìåæäó ÿ÷åéêàìè',\r
+cellpadding : 'Îòñòóï â ÿ÷åéêàõ',\r
+border : 'Ãðàíèöà',\r
+align : 'Âûðàâíèâàíèå',\r
+align_default : 'Ïî-óìîë÷àíèþ',\r
+align_left : 'Âñåâî',\r
+align_right : 'Âïðàâî',\r
+align_middle : 'Ïî öåíòðó',\r
+row_title : 'Ñâîéñòâà ñòðîêè òàáëèöû',\r
+cell_title : 'Ñâîéñòâà ÿ÷åéêè òàáëèöû',\r
+cell_type : 'Òèï ÿ÷åéêè',\r
+row_desc : 'Ñâîéñòâà ñòðîêè òàáëèöû',\r
+cell_desc : 'Ñâîéñòâà ÿ÷åéêè òàáëèöû',\r
+valign : 'Âåðòèêàëüíîå âûðàâíèâàíèå',\r
+align_top : 'Ïî âåðõó',\r
+align_bottom : 'Ïî íèçó',\r
+props_desc : 'Ñâîéñòâà òàáëèöû',\r
+bordercolor : 'Öâåò ðàìêè',\r
+bgcolor : 'Öâåò ôîíà',\r
+merge_cells_title : 'Îáúåäèíèòü ÿ÷åéêè òàáëèöû',\r
+split_cells_desc : 'Ðàçäåëèòü ÿ÷åéêè òàáëèöû',\r
+merge_cells_desc : 'Îáúåäèíèòü ÿ÷åéêè òàáëèöû',\r
+cut_row_desc : 'Âûëåçàòü ñòðîêó òàáëèöû',\r
+copy_row_desc : 'Ñêîïèðîâàòü ñòðîêó òàáëèöû',\r
+paste_row_before_desc : 'Âñòàâèòü ñòðîêó òàáëèöû ïåðåä',\r
+paste_row_after_desc : 'Âñòàâèòü ñòðîêó òàáëèöû ïîñëå',\r
+id : 'Id',\r
+style: 'Ñòèëü',\r
+langdir : 'Îïèñàíèå ÿçûêà',\r
+langcode : 'Êîä ÿçûêà',\r
+mime : 'Öåëåâîé MIME òèï',\r
+ltr : 'Ñëåâà íàïðàâî',\r
+rtl : 'Ñïðàâà íàëåâî',\r
+bgimage : 'Ôîíîâîå èçîáðàæåíèå',\r
+summary : 'Êðàòêîå îïèñàíèå',\r
+td : "Òåëî",\r
+th : "Çàãîëîâîê",\r
+cell_cell : 'Îáíîâèòü òåêóùóþ ÿ÷åéêó',\r
+cell_row : 'Îáíîâèòü òåêóùóþ ñòðîêó',\r
+cell_all : 'Îáíîâèòü âñå ÿ÷åéêè â òàáëèöå',\r
+row_row : 'Îáíîâèòü òåêóùóþ ñòðîêó',\r
+row_odd : 'Update odd rows in table',\r
+row_even : 'Update even rows in table',\r
+row_all : 'Îáíîâèòü âñå ñòðîêè â òàáëèöå',\r
+thead : 'Çàãîëîâîê òàáëèöû',\r
+tbody : 'Òåëî òàáëèöû',\r
+tfoot : 'Ôóòåð òàáëèöû',\r
+del : 'Óäàëèòü òàáëèöó',\r
+scope : 'Ãðàíèöû',\r
+row : 'Ñòðîêà',\r
+col : 'Êîëîíêà',\r
+rowgroup : 'Ãðóïïà ñòðîê',\r
+colgroup : 'Ãðóïïà êîëîíîê',\r
+missing_scope: 'Âû óâåðåíû, ÷òî õîòèòå ïðîäîëæàòü íå îáîçíà÷èâ ãðàíèöû ÿ÷ååê øàïêè òàáëèöû? Áåç ýòîãî, âîçìîæíî, íåêîòîðûì ïîëüçîâàòåëÿì áóäåò çàòðóäíèòåëüíî ïîíÿòü, ÷òî çà äàííûå íàõîäÿòñÿ â òàáëèöå.',\r
+table_delta_width : 30,\r
+cellprops_delta_width : 130\r
+});\r
diff --git a/webcit/tiny_mce/plugins/table/langs/ru_KOI8-R.js b/webcit/tiny_mce/plugins/table/langs/ru_KOI8-R.js
new file mode 100644 (file)
index 0000000..62ad5dd
--- /dev/null
@@ -0,0 +1,75 @@
+// RU KOI8-R lang variables\r
+\r
+tinyMCE.addToLang('table',{\r
+general_tab : 'ïÓÎÏ×ÎÙÅ',\r
+advanced_tab : 'òÁÓÛÉÒÅÎÎÙÅ',\r
+general_props : 'ïÓÎÏ×ÎÙÅ Ó×ÏÊÓÔ×Á',\r
+advanced_props : 'òÁÓÛÉÒÅÎÎÙÅ Ó×ÏÊÓÔ×Á',\r
+desc : '÷ÓÔÁ×ÉÔØ ÎÏ×ÕÀ ÔÁÂÌÉÃÕ',\r
+row_before_desc : '÷ÓÔÁ×ÉÔØ ÓÔÒÏËÕ ÐÅÒÅÄ',\r
+row_after_desc : '÷ÓÔÁ×ÉÔØ ÓÔÒÏËÕ ÐÏÓÌÅ',\r
+delete_row_desc : 'õÄÁÌÉÔØ ÓÔÒÏËÕ',\r
+col_before_desc : '÷ÓÔÁ×ÉÔØ ËÏÌÏÎËÕ ÐÅÒÅÄ',\r
+col_after_desc : '÷ÓÔÁ×ÉÔØ ËÏÌÏÎËÕ ÐÏÓÌÅ',\r
+delete_col_desc : 'õÄÁÌÉÔØ ËÏÌÏÎËÕ',\r
+rowtype : 'óÔÒÏËÁ × ÞÁÓÔÉ ÔÁÂÌÉÃÙ',\r
+title : '÷ÓÔÁ×ÉÔØ/éÚÍÅÎÉÔØ ÔÁÂÌÉÃÕ',\r
+width : 'ûÉÒÉÎÁ',\r
+height : '÷ÙÓÏÔÁ',\r
+cols : 'ëÏÌÏÎËÉ',\r
+rows : 'óÔÒÏËÉ',\r
+cellspacing : 'òÁÓÓÔÏÑÎÉÅ ÍÅÖÄÕ ÑÞÅÊËÁÍÉ',\r
+cellpadding : 'ïÔÓÔÕРנÑÞÅÊËÁÈ',\r
+border : 'çÒÁÎÉÃÁ',\r
+align : '÷ÙÒÁ×ÎÉ×ÁÎÉÅ',\r
+align_default : 'ðÏ-ÕÍÏÌÞÁÎÉÀ',\r
+align_left : '÷ÓÅ×Ï',\r
+align_right : '÷ÐÒÁ×Ï',\r
+align_middle : 'ðÏ ÃÅÎÔÒÕ',\r
+row_title : 'ó×ÏÊÓÔ×Á ÓÔÒÏËÉ ÔÁÂÌÉÃÙ',\r
+cell_title : 'ó×ÏÊÓÔ×Á ÑÞÅÊËÉ ÔÁÂÌÉÃÙ',\r
+cell_type : 'ôÉРÑÞÅÊËÉ',\r
+row_desc : 'ó×ÏÊÓÔ×Á ÓÔÒÏËÉ ÔÁÂÌÉÃÙ',\r
+cell_desc : 'ó×ÏÊÓÔ×Á ÑÞÅÊËÉ ÔÁÂÌÉÃÙ',\r
+valign : '÷ÅÒÔÉËÁÌØÎÏÅ ×ÙÒÁ×ÎÉ×ÁÎÉÅ',\r
+align_top : 'ðÏ ×ÅÒÈÕ',\r
+align_bottom : 'ðÏ ÎÉÚÕ',\r
+props_desc : 'ó×ÏÊÓÔ×Á ÔÁÂÌÉÃÙ',\r
+bordercolor : 'ã×ÅÔ ÒÁÍËÉ',\r
+bgcolor : 'ã×ÅÔ ÆÏÎÁ',\r
+merge_cells_title : 'ïÂßÅÄÉÎÉÔØ ÑÞÅÊËÉ ÔÁÂÌÉÃÙ',\r
+split_cells_desc : 'òÁÚÄÅÌÉÔØ ÑÞÅÊËÉ ÔÁÂÌÉÃÙ',\r
+merge_cells_desc : 'ïÂßÅÄÉÎÉÔØ ÑÞÅÊËÉ ÔÁÂÌÉÃÙ',\r
+cut_row_desc : '÷ÙÌÅÚÁÔØ ÓÔÒÏËÕ ÔÁÂÌÉÃÙ',\r
+copy_row_desc : 'óËÏÐÉÒÏ×ÁÔØ ÓÔÒÏËÕ ÔÁÂÌÉÃÙ',\r
+paste_row_before_desc : '÷ÓÔÁ×ÉÔØ ÓÔÒÏËÕ ÔÁÂÌÉÃÙ ÐÅÒÅÄ',\r
+paste_row_after_desc : '÷ÓÔÁ×ÉÔØ ÓÔÒÏËÕ ÔÁÂÌÉÃÙ ÐÏÓÌÅ',\r
+id : 'Id',\r
+style: 'óÔÉÌØ',\r
+langdir : 'ïÐÉÓÁÎÉÅ ÑÚÙËÁ',\r
+langcode : 'ëÏÄ ÑÚÙËÁ',\r
+mime : 'ãÅÌÅ×ÏÊ MIME ÔÉÐ',\r
+ltr : 'óÌÅ×Á ÎÁÐÒÁ×Ï',\r
+rtl : 'óÐÒÁ×Á ÎÁÌÅ×Ï',\r
+bgimage : 'æÏÎÏ×ÏÅ ÉÚÏÂÒÁÖÅÎÉÅ',\r
+summary : 'ëÒÁÔËÏÅ ÏÐÉÓÁÎÉÅ',\r
+td : "ôÅÌÏ",\r
+th : "úÁÇÏÌÏ×ÏË",\r
+cell_cell : 'ïÂÎÏ×ÉÔØ ÔÅËÕÝÕÀ ÑÞÅÊËÕ',\r
+cell_row : 'ïÂÎÏ×ÉÔØ ÔÅËÕÝÕÀ ÓÔÒÏËÕ',\r
+cell_all : 'ïÂÎÏ×ÉÔØ ×ÓÅ ÑÞÅÊËÉ × ÔÁÂÌÉÃÅ',\r
+row_row : 'ïÂÎÏ×ÉÔØ ÔÅËÕÝÕÀ ÓÔÒÏËÕ',\r
+row_odd : 'Update odd rows in table',\r
+row_even : 'Update even rows in table',\r
+row_all : 'ïÂÎÏ×ÉÔØ ×ÓÅ ÓÔÒÏËÉ × ÔÁÂÌÉÃÅ',\r
+thead : 'úÁÇÏÌÏ×ÏË ÔÁÂÌÉÃÙ',\r
+tbody : 'ôÅÌÏ ÔÁÂÌÉÃÙ',\r
+tfoot : 'æÕÔÅÒ ÔÁÂÌÉÃÙ',\r
+del : 'õÄÁÌÉÔØ ÔÁÂÌÉÃÕ',\r
+scope : 'çÒÁÎÉÃÙ',\r
+row : 'óÔÒÏËÁ',\r
+col : 'ëÏÌÏÎËÁ',\r
+rowgroup : 'çÒÕÐÐÁ ÓÔÒÏË',\r
+colgroup : 'çÒÕÐÐÁ ËÏÌÏÎÏË',\r
+missing_scope: '÷Ù Õ×ÅÒÅÎÙ, ÞÔÏ ÈÏÔÉÔÅ ÐÒÏÄÏÌÖÁÔØ ÎÅ ÏÂÏÚÎÁÞÉ× ÇÒÁÎÉÃÙ ÑÞÅÅË ÛÁÐËÉ ÔÁÂÌÉÃÙ? âÅÚ ÜÔÏÇÏ, ×ÏÚÍÏÖÎÏ, ÎÅËÏÔÏÒÙÍ ÐÏÌØÚÏ×ÁÔÅÌÑÍ ÂÕÄÅÔ ÚÁÔÒÕÄÎÉÔÅÌØÎÏ ÐÏÎÑÔØ, ÞÔÏ ÚÁ ÄÁÎÎÙÅ ÎÁÈÏÄÑÔÓÑ × ÔÁÂÌÉÃÅ.'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/table/langs/ru_UTF-8.js b/webcit/tiny_mce/plugins/table/langs/ru_UTF-8.js
new file mode 100644 (file)
index 0000000..f72dbab
--- /dev/null
@@ -0,0 +1,75 @@
+// RU UTF-8 lang variables\r
+\r
+tinyMCE.addToLang('table',{\r
+general_tab : 'Основные',\r
+advanced_tab : 'Расширенные',\r
+general_props : 'Основные свойства',\r
+advanced_props : 'Расширенные свойства',\r
+desc : 'Вставить новую таблицу',\r
+row_before_desc : 'Вставить строку перед',\r
+row_after_desc : 'Вставить строку после',\r
+delete_row_desc : 'Удалить строку',\r
+col_before_desc : 'Вставить колонку перед',\r
+col_after_desc : 'Вставить колонку после',\r
+delete_col_desc : 'Удалить колонку',\r
+rowtype : 'Строка в части таблицы',\r
+title : 'Вставить/Изменить таблицу',\r
+width : 'Ширина',\r
+height : 'Высота',\r
+cols : 'Колонки',\r
+rows : 'Строки',\r
+cellspacing : 'Расстояние между ячейками',\r
+cellpadding : 'Отступ в ячейках',\r
+border : 'Граница',\r
+align : 'Выравнивание',\r
+align_default : 'По-умолчанию',\r
+align_left : 'Всево',\r
+align_right : 'Вправо',\r
+align_middle : 'По центру',\r
+row_title : 'Свойства строки таблицы',\r
+cell_title : 'Свойства ячейки таблицы',\r
+cell_type : 'Тип ячейки',\r
+row_desc : 'Свойства строки таблицы',\r
+cell_desc : 'Свойства ячейки таблицы',\r
+valign : 'Вертикальное выравнивание',\r
+align_top : 'По верху',\r
+align_bottom : 'По низу',\r
+props_desc : 'Свойства таблицы',\r
+bordercolor : 'Цвет рамки',\r
+bgcolor : 'Цвет фона',\r
+merge_cells_title : 'Объединить ячейки таблицы',\r
+split_cells_desc : 'Разделить ячейки таблицы',\r
+merge_cells_desc : 'Объединить ячейки таблицы',\r
+cut_row_desc : 'Вылезать строку таблицы',\r
+copy_row_desc : 'Скопировать строку таблицы',\r
+paste_row_before_desc : 'Вставить строку таблицы перед',\r
+paste_row_after_desc : 'Вставить строку таблицы после',\r
+id : 'Id',\r
+style: 'Стиль',\r
+langdir : 'Описание языка',\r
+langcode : 'Код языка',\r
+mime : 'Целевой MIME тип',\r
+ltr : 'Слева направо',\r
+rtl : 'Справа налево',\r
+bgimage : 'Фоновое изображение',\r
+summary : 'Краткое описание',\r
+td : "Тело",\r
+th : "Заголовок",\r
+cell_cell : 'Обновить текущую ячейку',\r
+cell_row : 'Обновить текущую строку',\r
+cell_all : 'Обновить все ячейки в таблице',\r
+row_row : 'Обновить текущую строку',\r
+row_odd : 'Update odd rows in table',\r
+row_even : 'Update even rows in table',\r
+row_all : 'Обновить все строки в таблице',\r
+thead : 'Заголовок таблицы',\r
+tbody : 'Тело таблицы',\r
+tfoot : 'Футер таблицы',\r
+del : 'Удалить таблицу',\r
+scope : 'Границы',\r
+row : 'Строка',\r
+col : 'Колонка',\r
+rowgroup : 'Группа строк',\r
+colgroup : 'Группа колонок',\r
+missing_scope: 'Вы уверены, что хотите продолжать не обозначив границы ячеек шапки таблицы? Без этого, возможно, некоторым пользователям будет затруднительно понять, что за данные находятся в таблице.'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/table/langs/sk.js b/webcit/tiny_mce/plugins/table/langs/sk.js
new file mode 100644 (file)
index 0000000..86b0e61
--- /dev/null
@@ -0,0 +1,51 @@
+/**\r
+ * Slovak lang variables \r
+ * encoding: utf-8\r
+ * \r
+ * @author Vladimir VASIL vvasil@post.sk\r
+ *    \r
+ * $Id: sk.js,v 1.1 2005/11/22 20:56:44 spocke Exp $ \r
+ */  \r
+\r
+tinyMCE.addToLang('',{\r
+table_desc : 'Vložiť novú tabuľku',\r
+table_insert_row_before_desc : 'Vložiť riadok pred',\r
+table_insert_row_after_desc : 'Vložiť riadok po',\r
+table_delete_row_desc : 'Zmazať riadok',\r
+table_insert_col_before_desc : 'Vložiť stĺpec pred',\r
+table_insert_col_after_desc : 'Vložiť stĺpec po',\r
+table_delete_col_desc : 'Odstrániť stĺpec',\r
+insert_table_title : 'Vložiť/upraviť tabuľku',\r
+insert_table_width : 'Šírka',\r
+insert_table_height : 'Výška',\r
+insert_table_cols : 'Stĺpce',\r
+insert_table_rows : 'Riadky',\r
+insert_table_cellspacing : 'Vonkajší okraj buniek',\r
+insert_table_cellpadding : 'Vnutorný okraj buniek',\r
+insert_table_border : 'Riadok',\r
+insert_table_align : 'Zarovnanie',\r
+insert_table_align_default : 'Východzie',\r
+insert_table_align_left : 'Vľavo',\r
+insert_table_align_right : 'Vpravo',\r
+insert_table_align_middle : 'Na stred',\r
+insert_table_class : 'Trieda',\r
+table_row_title : 'Vlastnosti riadku',\r
+table_cell_title : 'Vlastnosti bunky',\r
+table_row_desc : 'Vlastnosti riadku',\r
+table_cell_desc : 'Vlastnosti riadku',\r
+insert_table_valign : 'Vertikálne zarovnávanie',\r
+insert_table_align_top : 'Nahor',\r
+insert_table_align_bottom : 'Dole',\r
+table_props_desc : 'Vlastnosti tabuľky',\r
+table_bordercolor : 'Farba rámčeku',\r
+table_bgcolor : 'Farba pozadia',\r
+table_merge_cells_title : 'Zlúčiť bunky',\r
+table_split_cells_desc : 'Rozdeliť bunky',\r
+table_merge_cells_desc : 'Zlúčiť bunky',\r
+table_cut_row_desc : 'Vyňať riadok',\r
+table_copy_row_desc : 'Kopírovať riadok',\r
+table_paste_row_before_desc : 'Vložiť riadok pred',\r
+table_paste_row_after_desc : 'Vložiť riadok za',\r
+table_insert_desc : 'Vložiť tabuľku'\r
+});\r
+\r
diff --git a/webcit/tiny_mce/plugins/table/langs/sv.js b/webcit/tiny_mce/plugins/table/langs/sv.js
new file mode 100644 (file)
index 0000000..a9f01ca
--- /dev/null
@@ -0,0 +1,76 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('table',{\r
+general_tab : 'Generella inst&auml;llningar',\r
+advanced_tab : 'Avancerade inst&auml;llningar',\r
+general_props : 'Generella inst&auml;llningar',\r
+advanced_props : 'Avancerade inst&auml;llningar',\r
+desc : 'Skapa ny tabell',\r
+before_desc : 'Skapa rad f&ouml;re',\r
+after_desc : 'Skapa rad efter',\r
+row_before_desc : 'Skapa rad f&ouml;re',\r
+row_after_desc : 'Skapa rad efter',\r
+delete_row_desc : 'Ta bort rad',\r
+col_before_desc : 'Skapa kolumn f&ouml;re',\r
+col_after_desc : 'Skapa kolumn efter',\r
+delete_col_desc : 'Ta bort kolumn',\r
+rowtype : 'Rad typ',\r
+title : 'Skapa/redigera ny tabell',\r
+width : 'Bredd',\r
+height : 'H&ouml;jd',\r
+cols : 'Columner',\r
+rows : 'Rader',\r
+cellspacing : 'Cellmellanrum',\r
+cellpadding : 'Cellutfyllnad',\r
+border : 'Ram',\r
+align : 'Justering',\r
+align_default : 'Ingen',\r
+align_left : 'V&auml;nster',\r
+align_right : 'H&ouml;ger',\r
+align_middle : 'Mitten',\r
+row_title : 'Tabell radsinst&auml;llningar',\r
+cell_title : 'Tabell cellsinst&auml;llningar',\r
+cell_type : 'Cell typ',\r
+row_desc : 'Tabell rads inst&auml;llningar',\r
+cell_desc : 'Tabell cells inst&auml;llningar',\r
+valign : 'Vertical justering',\r
+align_top : 'Toppen',\r
+align_bottom : 'Botten',\r
+props_desc : 'Tabell inst&auml;llningar',\r
+bordercolor : 'Ram f&auml;rg',\r
+bgcolor : 'Bakgrundsf&auml;rg',\r
+merge_cells_title : 'Sammanfoga tabell celler',\r
+split_cells_desc : 'Delaupp tabell celler',\r
+merge_cells_desc : 'Sammanfoga tabell celler',\r
+cut_row_desc : 'Klipput tabell rad',\r
+copy_row_desc : 'Kopiera tabell rad',\r
+paste_row_before_desc : 'Klistra in tabell rad f&ouml;re',\r
+paste_row_after_desc : 'Klistra in tabell rad efter',\r
+id : 'Id',\r
+style: 'Stil',\r
+langdir : 'Skrift riktning',\r
+langcode : 'Spr&aring;k k&aring;d',\r
+ltr : 'V&auml;nster till h&ouml;ger',\r
+rtl : 'H&ouml;ger till v&auml;nster',\r
+bgimage : 'Bakgrundsbild',\r
+summary : 'Sammanfattning',\r
+td : "Data",\r
+th : "Huvud",\r
+cell_cell : 'Updatera nuvarande cell',\r
+cell_row : 'Updatera alla celler i raden',\r
+cell_all : 'Updatera alla celler t tabellen',\r
+row_row : 'Updatera nuvarande rad',\r
+row_odd : 'Updatera udda rader i tabellen',\r
+row_even : 'Updatera j&auml;mna rader i tabellen',\r
+row_all : 'Updatera alla rader i tabellen',\r
+thead : 'Tabell Huvud',\r
+tbody : 'Tabell Kropp',\r
+tfoot : 'Tabell Fot',\r
+del : 'Tabort tabell',\r
+scope : 'Scope',\r
+row : 'Rad',\r
+col : 'Kolumn',\r
+rowgroup : 'Rad grupp',\r
+colgroup : 'Kolumn grupp',\r
+missing_scope: '&Auml;r du s&auml;ker p&aring; att du vill forts&auml;tta utan att specifisera ett scope, utan denna kan det bli sv&aring;rt f&ouml;r handikappade att f&ouml;rst&aring; tabellen.'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/table/langs/tw.js b/webcit/tiny_mce/plugins/table/langs/tw.js
new file mode 100644 (file)
index 0000000..847e202
--- /dev/null
@@ -0,0 +1,43 @@
+// TW lang variables contributed by Jim Kou\r
+\r
+tinyMCE.addToLang('',{\r
+insert_table_align : '¹ï»ô',\r
+insert_table_align_default : '¼Ð·Ç',\r
+insert_table_align_left : '»ô¥ª',\r
+insert_table_align_middle : '¸m¤¤',\r
+insert_table_align_right : '»ô¥k',\r
+insert_table_border : '®Ø½u',\r
+insert_table_cellpadding : '¦r&Aring;é»PÀx¦s®æ¶¡»Ø',\r
+insert_table_cellspacing : 'Àx¦s®æ¶¡»Ø',\r
+insert_table_class : '¼Ë¦¡',\r
+insert_table_cols : '¦æ',\r
+insert_table_height : '°ª«×',\r
+insert_table_rows : '¦C',\r
+insert_table_title : 'ªí®æ¼ÐÃD',\r
+insert_table_width : '¼e«×',\r
+table_delete_col_desc : '§R°£¤@¦æÀx¦s®æ',\r
+table_delete_row_desc : '§R°£¤@¦CÀx¦s®æ',\r
+table_desc : 'ªí®æ',\r
+table_insert_col_after_desc : '·s¼W¤@¦æÀx¦s®æ(«á)',\r
+table_insert_col_before_desc : '·s¼W¤@¦æÀx¦s®æ(«e)',\r
+table_insert_row_after_desc : '·s¼W¤@¦CÀx¦s®æ(«á)',\r
+table_insert_row_before_desc : '·s¼W¤@¦CÀx¦s®æ(«e)',\r
+table_row_title : 'Table row properties',\r
+table_cell_title : 'Table cell properties',\r
+table_row_desc : 'Table row properties',\r
+table_cell_desc : 'Table cell properties',\r
+insert_table_valign : 'Vertical alignment',\r
+insert_table_align_top : 'Top',\r
+insert_table_align_bottom : 'Bottom',\r
+table_props_desc : 'Table properties',\r
+table_bordercolor : 'Border color',\r
+table_bgcolor : 'Bg color',\r
+table_merge_cells_title : 'Merge table cells',\r
+table_split_cells_desc : 'Split table cells',\r
+table_merge_cells_desc : 'Merge table cells',\r
+table_cut_row_desc : 'Cut table row',\r
+table_copy_row_desc : 'Copy table row',\r
+table_paste_row_before_desc : 'Paste table row before',\r
+table_paste_row_after_desc : 'Paste table row after',\r
+table_insert_desc : 'Insert a new table'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/table/langs/zh_cn.js b/webcit/tiny_mce/plugins/table/langs/zh_cn.js
new file mode 100644 (file)
index 0000000..a3f59cf
--- /dev/null
@@ -0,0 +1,75 @@
+// Simplified Chinese lang variables contributed by tom_cat (thomaswangyang@gmail.com)\r
+\r
+tinyMCE.addToLang('table',{\r
+general_tab : 'Ò»°ã',\r
+advanced_tab : '¸ß¼¶',\r
+general_props : 'Ò»°ãÊôÐÔ',\r
+advanced_props : '¸ß¼¼ÊôÐÔ',\r
+desc : '²åÈëÒ»¸öбí',\r
+row_before_desc : 'ÏòÇ°²åÈëÒ»ÐÐ',\r
+row_after_desc : 'Ïòºó²åÈëÒ»ÐÐ',\r
+delete_row_desc : 'ɾ³ýÐÐ',\r
+col_before_desc : 'Ïò×ó²åÈëÒ»ÁÐ',\r
+col_after_desc : 'ÏòÓÒ²åÈëÒ»ÁÐ',\r
+delete_col_desc : 'ɾ³ýÁÐ',\r
+rowtype : 'ÐÐÖÖÀà',\r
+title : '²åÈë/Ð޸Ġ±í',\r
+width : '¿í',\r
+height : '¸ß',\r
+cols : 'ÁÐÊý',\r
+rows : 'ÐÐÊý',\r
+cellspacing : 'µ¥Ôª¸ñ¿Õ¼ä',\r
+cellpadding : 'µ¥Ôª¸ñÌî³ä',\r
+border : '±ß¿ò',\r
+align : '¶ÔÆë',\r
+align_default : 'ĬÈÏ',\r
+align_left : '¾Ó×ó',\r
+align_right : '¾ÓÓÒ',\r
+align_middle : '¾ÓÖÐ',\r
+row_title : 'ÐбêÌâ',\r
+cell_title : 'µ¥Ôª¸ñ±êÌâ',\r
+cell_type : 'µ¥Ôª¸ñÖÖÀà',\r
+row_desc : 'ÐÐÃèÊö',\r
+cell_desc : 'µ¥Ôª¸ñÃèÊö',\r
+valign : '´¹Ö±¶ÔÆë',\r
+align_top : '¶¥¶Ë',\r
+align_bottom : 'µ×¶Ë',\r
+props_desc : '±íÊôÐÔ',\r
+bordercolor : '±ß¿òÑÕÉ«',\r
+bgcolor : '±³¾°ÑÕÉ«',\r
+merge_cells_title : 'ºÏ²¢±íÖе¥Ôª¸ñ±êÌâ',\r
+split_cells_desc : '·ÖÀà±íÖе¥Ôª¸ñÃèÊö',\r
+merge_cells_desc : 'ºÏ²¢±íÖе¥Ôª¸ñÃèÊö',\r
+cut_row_desc : '¼ôÇÐÐÐ',\r
+copy_row_desc : '¸´ÖÆÐÐ',\r
+paste_row_before_desc : 'ÏòÇ°Õ³ÌùÒ»ÐÐ',\r
+paste_row_after_desc : 'ÏòºóÕ³ÌùÒ»ÐÐ',\r
+id : '±íʶ',\r
+style: 'Ñùʽ',\r
+langdir : 'Êéд·½Ïò',\r
+langcode : 'ÓïÑÔ±àÂë',\r
+mime : 'Ä¿±ê MIME ÖÖÀà',\r
+ltr : '´Ó×óµ½ÓÒ',\r
+rtl : '´ÓÓÒµ½×ó',\r
+bgimage : '±³¾°Í¼Æ¬',\r
+summary : 'С½á',\r
+td : "Êý¾Ý",\r
+th : "ҳü",\r
+cell_cell : '¸üе±Ç°µ¥Ôª¸ñ',\r
+cell_row : '¸üÐÂÐÐÖÐËùÓе¥Ôª¸ñ',\r
+cell_all : '¸üбíÖÐËùÓе¥Ôª¸ñ',\r
+row_row : '¸üе±Ç°ÐÐ',\r
+row_odd : '¸üÐÂÆæÊýÐÐ',\r
+row_even : '¸üÐÂżÊýÐÐ',\r
+row_all : '¸üбíÖÐËùÓÐÐÐ',\r
+thead : '±íÍ·',\r
+tbody : '±íÖÐ',\r
+tfoot : '±íβ',\r
+del : 'ɾ³ý±í',\r
+scope : 'ÇøÓò',\r
+row : 'ÐÐ',\r
+col : 'ÁÐ',\r
+rowgroup : 'Ðм¯ÍÅ',\r
+colgroup : 'Áм¯ÍÅ',\r
+missing_scope: 'ÄúÈ·ÈÏÒªÔÚûÓÐÉùÃ÷±à¼­ÇøÓòʱ¼ÌÐøÂð£¿Ã»ÓÐÉùÃ÷±à¼­ÇøÓò½«Ê¹ÔĶÁÕß¿´ÆðÀ´ºÜ·ÑÁ¦¡£'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/table/langs/zh_tw.js b/webcit/tiny_mce/plugins/table/langs/zh_tw.js
new file mode 100644 (file)
index 0000000..664d5f0
--- /dev/null
@@ -0,0 +1,76 @@
+// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// ÁcÅ餤¤å BIG-5 ¡F¼Æ¦ìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com\r
+\r
+tinyMCE.addToLang('table',{\r
+general_tab : '¤@¯ë',\r
+advanced_tab : '¶i¶¥',\r
+general_props : '¤@¯ëÄÝ©Ê',\r
+advanced_props : '¶i¶¥ÄÝ©Ê',\r
+desc : '´¡¤J·sªí®æ',\r
+row_before_desc : '¦b¤§«e´¡¤J¦C',\r
+row_after_desc : '¦b¤§«á´¡¤J¦C',\r
+delete_row_desc : '§R°£¦C',\r
+col_before_desc : '¦b¤§«e´¡¤J¦æ',\r
+col_after_desc : '¦b¤§«á´¡¤J¦æ',\r
+delete_col_desc : '§R°£¦æ',\r
+rowtype : 'ªí®æ¤¤ªº¦C',\r
+title : '´¡¤J©Î½Õ¾ãªí®æ',\r
+width : '¼e',\r
+height : '°ª',\r
+cols : '¦æ',\r
+rows : '¦C',\r
+cellspacing : 'Àx¦s®æ®æ½u¶¡¶Z',\r
+cellpadding : 'Àx¦s®æ¤º¤å»P®æ½u¶¡¶Z',\r
+border : '®Ø½u',\r
+align : '¦ì¸m',\r
+align_default : '¤º©w',\r
+align_left : '¾a¥ª',\r
+align_right : '¾a¥k',\r
+align_middle : '¸m¤¤',\r
+row_title : '¦CÄÝ©Ê',\r
+cell_title : 'Àx¦s®æÄÝ©Ê',\r
+cell_type : 'Àx¦s®æÃþ«¬',\r
+row_desc : '¦CÄÝ©Ê',\r
+cell_desc : 'Àx¦s®æÄÝ©Ê',\r
+valign : '««ª½¦ì¸m',\r
+align_top : '³»ºÝ',\r
+align_bottom : '©³³¡',\r
+props_desc : 'ªí®æÄÝ©Ê',\r
+bordercolor : '®Ø½uÃC¦â',\r
+bgcolor : '­I´ºÃC¦â',\r
+merge_cells_title : '¦X¨ÖÀx¦s®æ',\r
+split_cells_desc : '¤À³ÎÀx¦s®æ',\r
+merge_cells_desc : '¦X¨ÖÀx¦s®æ',\r
+cut_row_desc : '°Å¤U¦C',\r
+copy_row_desc : '½Æ»s¦C',\r
+paste_row_before_desc : '¦b¤§«e¶K¤W¦C',\r
+paste_row_after_desc : '¦b¤§«á¶K¤W¦C',\r
+id : '½s½X',\r
+style: '¦¡¼Ë',\r
+langdir : '»y¨¥¥Îªk',\r
+langcode : '»y½X',\r
+mime : '¹ï¶H MIME Ãþ«¬',\r
+ltr : '¥Ñ¥ª¦Ü¥k',\r
+rtl : '¥Ñ¥k¦Ü¥ª',\r
+bgimage : '­I´º¹ÏÀÉ',\r
+summary : '¤@Äý',\r
+td : "¸ê®Æ",\r
+th : "¼ÐÀY",\r
+cell_cell : '§ó·s©Ò¦bªºÀx¦s®æ',\r
+cell_row : '§ó·s¦C¤ºªºÀx¦s®æ',\r
+cell_all : '§ó·sªí®æ¤¤ªºÀx¦s®æ',\r
+row_row : '§ó·s©Ò¦bªº¦C',\r
+row_odd : '§ó·sªí®æ¤¤ªº©_¼Æ¦C',\r
+row_even : '§ó·sªí®æ¤¤ªº°¸¼Æ¦C',\r
+row_all : '§ó·sªí®æ¤¤ªº¦C',\r
+thead : 'ªí®æ¼ÐÀY',\r
+tbody : 'ªí®æ¹êÅé',\r
+tfoot : 'ªí®æ©³³¡',\r
+del : '§R°£ªí®æ',\r
+scope : '½d³ò',\r
+row : '¦C',\r
+col : '¦æ',\r
+rowgroup : '¸s¦C',\r
+colgroup : '¸s¦æ',\r
+missing_scope: '½T©w­n¦b¨S¦³¹ï¦¹ªí®æ¼ÐÀY³]©w½d³ò¤UÄ~Äò°õ¦æ¶Ü¡H\n¤£¥[¥H³]©wªº¸Ü¡A¥i¯à·|¾É­P¬Y¨Ç¨Ï¥ÎªÌµLªk¶¶§QŪ¨úªí®æ¤¤ªº³¡¥÷©Î¬O¾ãÅé¸ê°T¡C'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/table/langs/zh_tw_utf8.js b/webcit/tiny_mce/plugins/table/langs/zh_tw_utf8.js
new file mode 100644 (file)
index 0000000..e56bb1e
--- /dev/null
@@ -0,0 +1,76 @@
+// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// 繁體中文 UTF-8 ;數位應用坊製作; twapweb_AT_gmail_DOT_com\r
+\r
+tinyMCE.addToLang('table',{\r
+general_tab : '一般',\r
+advanced_tab : '進階',\r
+general_props : '一般屬性',\r
+advanced_props : '進階屬性',\r
+desc : '插入新表格',\r
+row_before_desc : '在之前插入列',\r
+row_after_desc : '在之後插入列',\r
+delete_row_desc : '刪除列',\r
+col_before_desc : '在之前插入行',\r
+col_after_desc : '在之後插入行',\r
+delete_col_desc : '刪除行',\r
+rowtype : '表格中的列',\r
+title : '插入或調整表格',\r
+width : '寬',\r
+height : '高',\r
+cols : '行',\r
+rows : '列',\r
+cellspacing : '儲存格格線間距',\r
+cellpadding : '儲存格內文與格線間距',\r
+border : '框線',\r
+align : '位置',\r
+align_default : '內定',\r
+align_left : '靠左',\r
+align_right : '靠右',\r
+align_middle : '置中',\r
+row_title : '列屬性',\r
+cell_title : '儲存格屬性',\r
+cell_type : '儲存格類型',\r
+row_desc : '列屬性',\r
+cell_desc : '儲存格屬性',\r
+valign : '垂直位置',\r
+align_top : '頂端',\r
+align_bottom : '底部',\r
+props_desc : '表格屬性',\r
+bordercolor : '框線顏色',\r
+bgcolor : '背景顏色',\r
+merge_cells_title : '合併儲存格',\r
+split_cells_desc : '分割儲存格',\r
+merge_cells_desc : '合併儲存格',\r
+cut_row_desc : '剪下列',\r
+copy_row_desc : '複製列',\r
+paste_row_before_desc : '在之前貼上列',\r
+paste_row_after_desc : '在之後貼上列',\r
+id : '編碼',\r
+style: '式樣',\r
+langdir : '語言用法',\r
+langcode : '語碼',\r
+mime : '對象 MIME 類型',\r
+ltr : '由左至右',\r
+rtl : '由右至左',\r
+bgimage : '背景圖檔',\r
+summary : '一覽',\r
+td : "資料",\r
+th : "標頭",\r
+cell_cell : '更新所在的儲存格',\r
+cell_row : '更新列內的儲存格',\r
+cell_all : '更新表格中的儲存格',\r
+row_row : '更新所在的列',\r
+row_odd : '更新表格中的奇數列',\r
+row_even : '更新表格中的偶數列',\r
+row_all : '更新表格中的列',\r
+thead : '表格標頭',\r
+tbody : '表格實體',\r
+tfoot : '表格底部',\r
+del : '刪除表格',\r
+scope : '範圍',\r
+row : '列',\r
+col : '行',\r
+rowgroup : '群列',\r
+colgroup : '群行',\r
+missing_scope: '確定要在沒有對此表格標頭設定範圍下繼續執行嗎?\n不加以設定的話,可能會導致某些使用者無法順利讀取表格中的部份或是整體資訊。'\r
+});\r
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..be723a9
--- /dev/null
@@ -0,0 +1,37 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_table_merge_cells_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/merge_cells.js"></script>\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="margin: 8px" style="display: none">\r
+<form onsubmit="insertTable();return false;" action="#">\r
+       <fieldset>\r
+               <legend>{$lang_table_merge_cells_title}</legend>\r
+                 <table border="0" cellpadding="0" cellspacing="3" width="100%">\r
+                         <tr>\r
+                               <td>{$lang_table_cols}:</td>\r
+                               <td align="right"><input type="text" name="numcols" value="" style="width: 30px" /></td>\r
+                               <td>\r
+                         </tr>\r
+                         <tr>\r
+                               <td>{$lang_table_rows}:</td>\r
+                               <td align="right"><input type="text" name="numrows" value="" style="width: 30px" /></td>\r
+                         </tr>\r
+                 </table>\r
+       </fieldset>\r
+\r
+       <div class="mceActionPanel">\r
+               <div style="float: left">\r
+                       <input type="button" id="insert" name="insert" value="{$lang_update}" onclick="mergeCells();" />\r
+               </div>\r
+\r
+               <div style="float: right">\r
+                       <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+               </div>\r
+       </div>\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/plugins/table/readme.txt b/webcit/tiny_mce/plugins/table/readme.txt
new file mode 100644 (file)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/webcit/tiny_mce/plugins/table/row.htm b/webcit/tiny_mce/plugins/table/row.htm
new file mode 100644 (file)
index 0000000..989e55b
--- /dev/null
@@ -0,0 +1,159 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_table_row_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/row.js"></script>\r
+       <link href="css/row.css" rel="stylesheet" type="text/css" />\r
+       <base target="_self" />\r
+</head>\r
+<body id="tablerow" onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+       <form onsubmit="updateAction();return false;">\r
+               <div class="tabs">\r
+                       <ul>\r
+                               <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{$lang_table_general_tab}</a></span></li>\r
+                               <li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{$lang_table_advanced_tab}</a></span></li>\r
+                       </ul>\r
+               </div>\r
+\r
+               <div class="panel_wrapper">\r
+                       <div id="general_panel" class="panel current">\r
+                               <fieldset>\r
+                                       <legend>{$lang_table_general_props}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td><label for="rowtype">{$lang_table_rowtype}</label></td>\r
+                                                       <td class="col2">\r
+                                                               <select id="rowtype" name="rowtype">\r
+                                                                       <option value="thead">{$lang_table_thead}</option>\r
+                                                                       <option value="tbody">{$lang_table_tbody}</option>\r
+                                                                       <option value="tfoot">{$lang_table_tfoot}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="align">{$lang_table_align}</label></td>\r
+                                                       <td class="col2">\r
+                                                               <select id="align" name="align">\r
+                                                                       <option value="">{$lang_not_set}</option>\r
+                                                                       <option value="center">{$lang_table_align_middle}</option>\r
+                                                                       <option value="left">{$lang_table_align_left}</option>\r
+                                                                       <option value="right">{$lang_table_align_right}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="valign">{$lang_table_valign}</label></td>\r
+                                                       <td class="col2">\r
+                                                               <select id="valign" name="valign">\r
+                                                                       <option value="">{$lang_not_set}</option>\r
+                                                                       <option value="top">{$lang_table_align_top}</option>\r
+                                                                       <option value="middle">{$lang_table_align_middle}</option>\r
+                                                                       <option value="bottom">{$lang_table_align_bottom}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="class">{$lang_class_name}</label></td>\r
+                                                       <td class="col2">\r
+                                                               <select id="class" name="class">\r
+                                                                       <option value="" selected="selected">{$lang_not_set}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="height">{$lang_table_height}</label></td>\r
+                                                       <td class="col2"><input name="height" type="text" id="height" value="" size="4" maxlength="4" onchange="changedSize();" /></td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+\r
+                       <div id="advanced_panel" class="panel">\r
+                               <fieldset>\r
+                                       <legend>{$lang_table_advanced_props}</legend>\r
+\r
+                                       <table border="0" cellpadding="0" cellspacing="4">\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="id">{$lang_table_id}</label></td> \r
+                                                       <td><input id="id" name="id" type="text" value="" style="width: 200px" /></td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="style">{$lang_table_style}</label></td>\r
+                                                       <td><input type="text" id="style" name="style" value="" style="width: 200px;" onchange="changedStyle();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="dir">{$lang_table_langdir}</label></td> \r
+                                                       <td>\r
+                                                               <select id="dir" name="dir" style="width: 200px"> \r
+                                                                               <option value="">{$lang_not_set}</option> \r
+                                                                               <option value="ltr">{$lang_table_ltr}</option> \r
+                                                                               <option value="rtl">{$lang_table_rtl}</option> \r
+                                                               </select>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="lang">{$lang_table_langcode}</label></td> \r
+                                                       <td>\r
+                                                               <input id="lang" name="lang" type="text" value="" style="width: 200px" />\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="backgroundimage">{$lang_table_bgimage}</label></td> \r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="backgroundimage" name="backgroundimage" type="text" value="" style="width: 200px" onchange="changedBackgroundImage();" /></td>\r
+                                                                               <td id="backgroundimagebrowsercontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="bgcolor">{$lang_table_bgcolor}</label></td> \r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');changedColor();" /></td>\r
+                                                                               <td id="bgcolor_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td> \r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+               </div>\r
+\r
+               <div class="mceActionPanel">\r
+                       <div>\r
+                               <select id="action" name="action">\r
+                                       <option value="row">{$lang_table_row_row}</option>\r
+                                       <option value="odd">{$lang_table_row_odd}</option>\r
+                                       <option value="even">{$lang_table_row_even}</option>\r
+                                       <option value="all">{$lang_table_row_all}</option>\r
+                               </select>\r
+                       </div>\r
+\r
+                       <div style="float: left">\r
+                               <div><input type="button" id="insert" name="insert" value="{$lang_update}" onclick="updateAction();" /></div>\r
+                       </div>\r
+\r
+                       <div style="float: right">\r
+                               <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+                       </div>\r
+               </div>\r
+       </form>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/plugins/table/table.htm b/webcit/tiny_mce/plugins/table/table.htm
new file mode 100644 (file)
index 0000000..70d1800
--- /dev/null
@@ -0,0 +1,155 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_table_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/table.js"></script>\r
+       <link href="css/table.css" rel="stylesheet" type="text/css" />\r
+       <base target="_self" />\r
+</head>\r
+<body id="table" onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+       <form onsubmit="insertTable();return false;" action="#">\r
+               <div class="tabs">\r
+                       <ul>\r
+                               <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{$lang_table_general_tab}</a></span></li>\r
+                               <li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{$lang_table_advanced_tab}</a></span></li>\r
+                       </ul>\r
+               </div>\r
+\r
+               <div class="panel_wrapper">\r
+                       <div id="general_panel" class="panel current">\r
+                               <fieldset>\r
+                                       <legend>{$lang_table_general_props}</legend>\r
+\r
+                                         <table border="0" cellpadding="4" cellspacing="0" width="100%">\r
+                                                         <tr>\r
+                                                               <td><label id="colslabel" for="cols">{$lang_table_cols}</label></td>\r
+                                                               <td><input id="cols" name="cols" type="text" value="" size="3" maxlength="3" /></td>\r
+                                                               <td><label id="rowslabel" for="rows">{$lang_table_rows}</label></td>\r
+                                                               <td><input id="rows" name="rows" type="text" value="" size="3" maxlength="3" /></td>\r
+                                                         </tr>\r
+                                                         <tr>\r
+                                                               <td><label id="cellpaddinglabel" for="cellpadding">{$lang_table_cellpadding}</label></td>\r
+                                                               <td><input id="cellpadding" name="cellpadding" type="text" value="" size="3" maxlength="3" /></td>\r
+                                                               <td><label id="cellspacinglabel" for="cellspacing">{$lang_table_cellspacing}</label></td>\r
+                                                               <td><input id="cellspacing" name="cellspacing" type="text" value="" size="3" maxlength="3" /></td>\r
+                                                         </tr>\r
+                                                         <tr>\r
+                                                               <td><label id="alignlabel" for="align">{$lang_table_align}</label></td>\r
+                                                               <td><select id="align" name="align">\r
+                                                                       <option value="">{$lang_not_set}</option>\r
+                                                                       <option value="center">{$lang_table_align_middle}</option>\r
+                                                                       <option value="left">{$lang_table_align_left}</option>\r
+                                                                       <option value="right">{$lang_table_align_right}</option>\r
+                                                                 </select></td>\r
+                                                               <td><label id="borderlabel" for="border">{$lang_table_border}</label></td>\r
+                                                               <td><input id="border" name="border" type="text" value="" size="3" maxlength="3" onchange="changedBorder();" /></td>\r
+                                                         </tr>\r
+                                                         <tr>\r
+                                                               <td><label id="widthlabel" for="width">{$lang_table_width}</label></td>\r
+                                                               <td><input name="width" type="text" id="width" value="" size="4" maxlength="4" onchange="changedSize();" /></td>\r
+                                                               <td><label id="heightlabel" for="height">{$lang_table_height}</label></td>\r
+                                                               <td><input name="height" type="text" id="height" value="" size="4" maxlength="4" onchange="changedSize();" /></td>\r
+                                                         </tr>\r
+                                                         <tr>\r
+                                                               <td><label id="classlabel" for="class">{$lang_class_name}</label></td>\r
+                                                               <td colspan="3">\r
+                                                                <select id="class" name="class">\r
+                                                                       <option value="" selected>{$lang_not_set}</option>\r
+                                                                </select></td>\r
+                                                         </tr>\r
+                                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+\r
+                       <div id="advanced_panel" class="panel">\r
+                               <fieldset>\r
+                                       <legend>{$lang_table_advanced_props}</legend>\r
+\r
+                                       <table border="0" cellpadding="0" cellspacing="4">\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="id">{$lang_table_id}</label></td> \r
+                                                       <td><input id="id" name="id" type="text" value="" class="advfield" /></td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="summary">{$lang_table_summary}</label></td> \r
+                                                       <td><input id="summary" name="summary" type="text" value="" class="advfield" /></td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="style">{$lang_table_style}</label></td>\r
+                                                       <td><input type="text" id="style" name="style" value="" class="advfield" onchange="changedStyle();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="dir">{$lang_table_langdir}</label></td> \r
+                                                       <td>\r
+                                                               <select id="dir" name="dir" class="advfield"> \r
+                                                                               <option value="">{$lang_not_set}</option> \r
+                                                                               <option value="ltr">{$lang_table_ltr}</option> \r
+                                                                               <option value="rtl">{$lang_table_rtl}</option> \r
+                                                               </select>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label id="langlabel" for="lang">{$lang_table_langcode}</label></td> \r
+                                                       <td>\r
+                                                               <input id="lang" name="lang" type="text" value="" class="advfield" />\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="backgroundimage">{$lang_table_bgimage}</label></td> \r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="backgroundimage" name="backgroundimage" type="text" value="" class="advfield" onchange="changedBackgroundImage();" /></td>\r
+                                                                               <td id="backgroundimagebrowsercontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="bordercolor">{$lang_table_bordercolor}</label></td> \r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="bordercolor" name="bordercolor" type="text" value="" size="9" onchange="updateColor('bordercolor_pick','bordercolor');changedColor();" /></td>\r
+                                                                               <td id="bordercolor_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="bgcolor">{$lang_table_bgcolor}</label></td> \r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');changedColor();" /></td>\r
+                                                                               <td id="bgcolor_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td> \r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+               </div>\r
+\r
+               <div class="mceActionPanel">\r
+                       <div style="float: left">\r
+                               <input type="button" id="insert" name="insert" value="{$lang_insert}" onclick="insertTable();" />\r
+                       </div>\r
+\r
+                       <div style="float: right">\r
+                               <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+                       </div>\r
+               </div>\r
+       </form>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/plugins/zoom/editor_plugin.js b/webcit/tiny_mce/plugins/zoom/editor_plugin.js
new file mode 100644 (file)
index 0000000..e18eaa3
--- /dev/null
@@ -0,0 +1,6 @@
+function TinyMCE_zoom_getInfo(){return{longname:'Zoom',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_zoom.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_zoom_getControlHTML(control_name){if(!tinyMCE.isMSIE||tinyMCE.isMSIE5_0||tinyMCE.isOpera)return "";switch(control_name){case "zoom":return '<select id="{$editor_id}_formatSelect" name="{$editor_id}_zoomSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceZoom\',false,this.options[this.selectedIndex].value);" class="mceSelectList">\\r
+                                       <option value="100%">+ 100%</option>\\r
+                                       <option value="150%">+ 150%</option>\\r
+                                       <option value="200%">+ 200%</option>\\r
+                                       <option value="250%">+ 250%</option>\\r
+                                       </select>';}return "";}function TinyMCE_zoom_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mceZoom":tinyMCE.getInstanceById(editor_id).contentDocument.body.style.zoom=value;tinyMCE.getInstanceById(editor_id).contentDocument.body.style.mozZoom=value;return true;}return false;}
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/zoom/editor_plugin_src.js b/webcit/tiny_mce/plugins/zoom/editor_plugin_src.js
new file mode 100644 (file)
index 0000000..698d704
--- /dev/null
@@ -0,0 +1,47 @@
+/* Import plugin specific language pack */\r
+\r
+function TinyMCE_zoom_getInfo() {\r
+       return {\r
+               longname : 'Zoom',\r
+               author : 'Moxiecode Systems',\r
+               authorurl : 'http://tinymce.moxiecode.com',\r
+               infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_zoom.html',\r
+               version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+       };\r
+};\r
+\r
+/**\r
+ * Returns the HTML contents of the zoom control.\r
+ */\r
+function TinyMCE_zoom_getControlHTML(control_name) {\r
+       if (!tinyMCE.isMSIE || tinyMCE.isMSIE5_0 || tinyMCE.isOpera)\r
+               return "";\r
+\r
+       switch (control_name) {\r
+               case "zoom":\r
+                       return '<select id="{$editor_id}_formatSelect" name="{$editor_id}_zoomSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceZoom\',false,this.options[this.selectedIndex].value);" class="mceSelectList">\\r
+                                       <option value="100%">+ 100%</option>\\r
+                                       <option value="150%">+ 150%</option>\\r
+                                       <option value="200%">+ 200%</option>\\r
+                                       <option value="250%">+ 250%</option>\\r
+                                       </select>';\r
+       }\r
+\r
+       return "";\r
+}\r
+\r
+/**\r
+ * Executes the mceZoom command.\r
+ */\r
+function TinyMCE_zoom_execCommand(editor_id, element, command, user_interface, value) {\r
+       // Handle commands\r
+       switch (command) {\r
+               case "mceZoom":\r
+                       tinyMCE.getInstanceById(editor_id).contentDocument.body.style.zoom = value;\r
+                       tinyMCE.getInstanceById(editor_id).contentDocument.body.style.mozZoom = value;\r
+                       return true;\r
+       }\r
+\r
+       // Pass to next handler in chain\r
+       return false;\r
+}\r
diff --git a/webcit/tiny_mce/plugins/zoom/langs/es.js b/webcit/tiny_mce/plugins/zoom/langs/es.js
new file mode 100644 (file)
index 0000000..3bc7aed
--- /dev/null
@@ -0,0 +1,3 @@
+// Español por matiasl-AR\r
+\r
+tinyMCELang['lang_zoom_prefix'] = 'Aumento de Tamaño';
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/zoom/langs/fr.js b/webcit/tiny_mce/plugins/zoom/langs/fr.js
new file mode 100644 (file)
index 0000000..8d48271
--- /dev/null
@@ -0,0 +1,3 @@
+// Traduit par Normand Lamoureux le 2005-11-12\r
+\r
+tinyMCELang['lang_zoom_prefix'] = 'Augmenter la taille';
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/zoom/langs/he.js b/webcit/tiny_mce/plugins/zoom/langs/he.js
new file mode 100644 (file)
index 0000000..134435a
--- /dev/null
@@ -0,0 +1,5 @@
+// HE lang variables by Liron Newman, http://eesh.net\r
+\r
+tinyMCE.addToLang('',{\r
+zoom_prefix : '&#230;&aring;í'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/zoom/langs/pt_br.js b/webcit/tiny_mce/plugins/zoom/langs/pt_br.js
new file mode 100644 (file)
index 0000000..e367600
--- /dev/null
@@ -0,0 +1,10 @@
+/**\r
+ * pt_br lang variables\r
+ * Brazilian Portuguese\r
+ *\r
+ * Authors :\r
+ *           Marcio Barbosa (mpg) <mpg@mpg.com.br>\r
+ * Last Updated : November 26, 2005\r
+ * TinyMCE Version : 2.0RC4\r
+ */\r
+tinyMCELang['lang_zoom_prefix'] = 'Aumentar de Tamanho';
\ No newline at end of file
diff --git a/webcit/tiny_mce/plugins/zoom/langs/ru.js b/webcit/tiny_mce/plugins/zoom/langs/ru.js
new file mode 100644 (file)
index 0000000..310ecbf
--- /dev/null
@@ -0,0 +1,5 @@
+// RU cp1251 lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+zoom_prefix : 'ìàñøòàá'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/zoom/langs/ru_KOI8-R.js b/webcit/tiny_mce/plugins/zoom/langs/ru_KOI8-R.js
new file mode 100644 (file)
index 0000000..b285dfd
--- /dev/null
@@ -0,0 +1,5 @@
+// RU KOI8-R lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+zoom_prefix : 'ÍÁÓÛÔÁÂ'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/zoom/langs/ru_UTF-8.js b/webcit/tiny_mce/plugins/zoom/langs/ru_UTF-8.js
new file mode 100644 (file)
index 0000000..0c81efc
--- /dev/null
@@ -0,0 +1,5 @@
+// RU UTF-8 lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+zoom_prefix : 'масштаб'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/zoom/langs/zh_tw.js b/webcit/tiny_mce/plugins/zoom/langs/zh_tw.js
new file mode 100644 (file)
index 0000000..c230077
--- /dev/null
@@ -0,0 +1,6 @@
+// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// ÁcÅ餤¤å BIG-5 ¡F¼Æ¦ìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com\r
+\r
+tinyMCE.addToLang('',{\r
+zoom_prefix : '©ñ¤j'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/zoom/langs/zh_tw_utf8.js b/webcit/tiny_mce/plugins/zoom/langs/zh_tw_utf8.js
new file mode 100644 (file)
index 0000000..bd56537
--- /dev/null
@@ -0,0 +1,6 @@
+// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// 繁體中文 UTF-8 ;數位應用坊製作; twapweb_AT_gmail_DOT_com\r
+\r
+tinyMCE.addToLang('',{\r
+zoom_prefix : '放大'\r
+});\r
diff --git a/webcit/tiny_mce/plugins/zoom/readme.txt b/webcit/tiny_mce/plugins/zoom/readme.txt
new file mode 100644 (file)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/webcit/tiny_mce/themes/advanced/about.htm b/webcit/tiny_mce/themes/advanced/about.htm
new file mode 100644 (file)
index 0000000..d57546b
--- /dev/null
@@ -0,0 +1,53 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_about_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/about.js"></script>\r
+       <link href="css/dialog_about.css" rel="stylesheet" type="text/css" />\r
+       <base target="_self" />\r
+</head>\r
+<body id="about" onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+               <div class="tabs">\r
+                       <ul>\r
+                               <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{$lang_about}</a></span></li>\r
+                               <li id="help_tab"><span><a href="javascript:mcTabs.displayTab('help_tab','help_panel');" onmousedown="return false;">{$lang_help}</a></span></li>\r
+                               <li id="plugins_tab"><span><a href="javascript:mcTabs.displayTab('plugins_tab','plugins_panel');" onmousedown="return false;">{$lang_plugins}</a></span></li>\r
+                       </ul>\r
+               </div>\r
+\r
+               <div class="panel_wrapper">\r
+                       <div id="general_panel" class="panel current">\r
+                               <h3>{$lang_about_title}</h3>\r
+                               <p>Version: {$tinymce_version} ({$tinymce_releasedate})</p>\r
+                               <p>TinyMCE is a platform independent web based Javascript HTML WYSIWYG editor control released as Open Source under <a href="../../license.txt" target="_blank">LGPL</a>\r
+                               by Moxiecode Systems AB. It has the ability to convert HTML TEXTAREA fields or other HTML elements to editor instances.</p>\r
+                               <p>Copyright &copy; 2005, <a href="http://www.moxiecode.com" target="_blank">Moxiecode Systems AB</a>, All rights reserved.</p>\r
+                               <p>For more information about this software visit the <a href="http://tinymce.moxiecode.com" target="_blank">TinyMCE website</a>.</p>\r
+\r
+                               <div id="buttoncontainer"></div>\r
+                       </div>\r
+\r
+                       <div id="plugins_panel" class="panel">\r
+                               <div id="pluginscontainer">\r
+                                       <h3>{$lang_loaded_plugins}</h3>\r
+\r
+                                       <div id="plugintablecontainer">\r
+                                       </div>\r
+\r
+                                       <p>&nbsp;</p>\r
+                               </div>\r
+                       </div>\r
+\r
+                       <div id="help_panel" class="panel noscroll" style="overflow: visible;">\r
+                               <div id="iframecontainer"></div>\r
+                       </div>\r
+               </div>\r
+\r
+               <div class="mceActionPanel">\r
+                       <div style="float: right">\r
+                               <input type="button" id="cancel" name="cancel" value="{$lang_close}" onclick="tinyMCEPopup.close();" />\r
+                       </div>\r
+               </div>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/themes/advanced/anchor.htm b/webcit/tiny_mce/themes/advanced/anchor.htm
new file mode 100644 (file)
index 0000000..53d7969
--- /dev/null
@@ -0,0 +1,33 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_insert_anchor_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/anchor.js"></script>\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+<form onsubmit="insertAnchor();return false;" action="#">\r
+\r
+       <table border="0" cellpadding="4" cellspacing="0">\r
+               <tr>\r
+                       <td colspan="2" class="title">{$lang_insert_anchor_title}</td>\r
+               </tr>\r
+               <tr>\r
+                       <td nowrap="nowrap">{$lang_insert_anchor_name}:</td>\r
+                       <td><input name="anchorName" type="text" id="anchorName" value="" style="width: 200px" /></td>\r
+               </tr>\r
+       </table>\r
+\r
+       <div class="mceActionPanel">\r
+               <div style="float: left">\r
+                       <input type="button" id="insert" name="insert" value="{$lang_update}" onclick="insertAnchor();" />\r
+               </div>\r
+\r
+               <div style="float: right">\r
+                       <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+               </div>\r
+       </div>\r
+\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/themes/advanced/charmap.htm b/webcit/tiny_mce/themes/advanced/charmap.htm
new file mode 100644 (file)
index 0000000..9aed1d4
--- /dev/null
@@ -0,0 +1,53 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_theme_charmap_title}</title>\r
+       <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/charmap.js"></script>\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+<table align="center" border="0" cellspacing="0" cellpadding="2">\r
+    <tr>\r
+        <td colspan="2" class="title">{$lang_theme_charmap_title}</td>\r
+    </tr>\r
+    <tr>\r
+        <td rowspan="2" align="left" valign="top">\r
+            <script language="javascript" type="text/javascript">renderCharMapHTML();</script>\r
+        </td>\r
+        <td width="100" align="center" valign="top">\r
+            <table border="0" cellpadding="0" cellspacing="0" width="100" style="height: 100px">\r
+                <tr>\r
+                    <td class="charmapOver" style="font-size: 40px; height:80px;" id="codeV">&nbsp;</td>\r
+                </tr>\r
+                <tr>\r
+                    <td style="font-size: 10px; font-family: Arial, Helvetica, sans-serif; text-align:center;" id="codeN">&nbsp;</td>\r
+                </tr>\r
+            </table>\r
+        </td>\r
+    </tr>\r
+    <tr>\r
+        <td valign="bottom" style="padding-bottom: 3px;">\r
+            <table width="100" align="center" border="0" cellpadding="2" cellspacing="0">\r
+                <tr>\r
+                    <td align="center" style="border-left: 1px solid #666699; border-top: 1px solid #666699; border-right: 1px solid #666699;">HTML-Code</td>\r
+                </tr>\r
+                <tr>\r
+                    <td style="font-size: 16px; font-weight: bold; border-left: 1px solid #666699; border-bottom: 1px solid #666699; border-right: 1px solid #666699;" id="codeA" align="center">&nbsp;</td>\r
+                </tr>\r
+                <tr>\r
+                    <td style="font-size: 1px;">&nbsp;</td>\r
+                </tr>\r
+                <tr>\r
+                    <td align="center" style="border-left: 1px solid #666699; border-top: 1px solid #666699; border-right: 1px solid #666699;">NUM-Code</td>\r
+                </tr>\r
+                <tr>\r
+                    <td style="font-size: 16px; font-weight: bold; border-left: 1px solid #666699; border-bottom: 1px solid #666699; border-right: 1px solid #666699;" id="codeB" align="center">&nbsp;</td>\r
+                </tr>\r
+            </table>\r
+        </td>\r
+    </tr>\r
+</table>\r
+\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/themes/advanced/color_picker.htm b/webcit/tiny_mce/themes/advanced/color_picker.htm
new file mode 100644 (file)
index 0000000..05db9b6
--- /dev/null
@@ -0,0 +1,13 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_theme_colorpicker_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/color_picker.js"></script>\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('init();');" marginheight="3" topmargin="3" leftmargin="3" marginwidth="3" style="display: none">\r
+       <div align="center">\r
+          <script language="javascript" type="text/javascript">renderColorMap();</script>\r
+       </div>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/themes/advanced/css/editor_content.css b/webcit/tiny_mce/themes/advanced/css/editor_content.css
new file mode 100644 (file)
index 0000000..1b41edb
--- /dev/null
@@ -0,0 +1,55 @@
+/* This file contains the CSS data for the editable area(iframe) of TinyMCE */\r
+/* You can extend this CSS by adding your own CSS file with the the content_css option */\r
+\r
+body {\r
+       background-color: #FFFFFF;\r
+       font-family: Verdana, Arial, Helvetica, sans-serif;\r
+       font-size: 10px;\r
+       scrollbar-3dlight-color: #F0F0EE;\r
+       scrollbar-arrow-color: #676662;\r
+       scrollbar-base-color: #F0F0EE;\r
+       scrollbar-darkshadow-color: #DDDDDD;\r
+       scrollbar-face-color: #E0E0DD;\r
+       scrollbar-highlight-color: #F0F0EE;\r
+       scrollbar-shadow-color: #F0F0EE;\r
+       scrollbar-track-color: #F5F5F5;\r
+}\r
+\r
+td {\r
+       font-family: Verdana, Arial, Helvetica, sans-serif;\r
+       font-size: 10px;\r
+}\r
+\r
+pre {\r
+       font-family: Verdana, Arial, Helvetica, sans-serif;\r
+       font-size: 10px;\r
+}\r
+\r
+.mceVisualAid {\r
+       border: 1px dashed #BBBBBB !important;\r
+}\r
+\r
+.mceItemAnchor {\r
+       width: 12px;\r
+       line-height: 6px;\r
+       overflow: hidden;\r
+       padding-left: 12px;\r
+       background-image: url('../images/anchor_symbol.gif');\r
+       background-position: bottom;\r
+       background-repeat: no-repeat;\r
+}\r
+\r
+/* Important is needed in Gecko browsers inorder to style links */\r
+/*\r
+a {\r
+       color: green !important;\r
+}\r
+*/\r
+\r
+/* Style selection range colors in Gecko browsers */\r
+/*\r
+::-moz-selection {\r
+       background-color: red;\r
+       color: green;\r
+}\r
+*/\r
diff --git a/webcit/tiny_mce/themes/advanced/css/editor_popup.css b/webcit/tiny_mce/themes/advanced/css/editor_popup.css
new file mode 100644 (file)
index 0000000..14f8322
--- /dev/null
@@ -0,0 +1,319 @@
+/* This file contains the CSS data for all popups in TinyMCE */\r
+\r
+body {\r
+       background-color: #F0F0EE;\r
+       font-family: Verdana, Arial, Helvetica, sans-serif;\r
+       font-size: 11px;\r
+       scrollbar-3dlight-color: #F0F0EE;\r
+       scrollbar-arrow-color: #676662;\r
+       scrollbar-base-color: #F0F0EE;\r
+       scrollbar-darkshadow-color: #DDDDDD;\r
+       scrollbar-face-color: #E0E0DD;\r
+       scrollbar-highlight-color: #F0F0EE;\r
+       scrollbar-shadow-color: #F0F0EE;\r
+       scrollbar-track-color: #F5F5F5;\r
+       margin: 8px;\r
+}\r
+\r
+td {\r
+       font-family: Verdana, Arial, Helvetica, sans-serif;\r
+       font-size: 11px;\r
+}\r
+\r
+input {\r
+       background: #FFFFFF;\r
+       border: 1px solid #cccccc;\r
+}\r
+\r
+td, input, select, textarea {\r
+       font-family: Verdana, Arial, Helvetica, sans-serif;\r
+       font-size: 10px;\r
+}\r
+\r
+input, select, textarea {\r
+       border: 1px solid #808080;\r
+}\r
+\r
+.input_noborder {\r
+       border: 0px solid #808080;\r
+}\r
+\r
+#insert {\r
+   font-weight: bold;\r
+   width: 90px;\r
+   height: 21px;\r
+   border: 0px;\r
+   background-image: url('../images/insert_button_bg.gif');\r
+   cursor: pointer;\r
+}\r
+\r
+#cancel {\r
+   font-weight: bold;\r
+   width: 90px;\r
+   height: 21px;\r
+   border: 0px;\r
+   background-image: url('../images/cancel_button_bg.gif');\r
+   cursor: pointer;\r
+}\r
+\r
+/* Mozilla only style */\r
+html>body #insert, html>body #cancel {\r
+       padding-bottom: 2px;\r
+}\r
+\r
+.title {\r
+       font-size: 12px;\r
+       font-weight: bold;\r
+       color: #2B6FB6;\r
+}\r
+\r
+table.charmap {\r
+       border-style: solid;\r
+       border-width: 1px;\r
+       border-color: #AAAAAA;\r
+}\r
+\r
+td.charmap, td.charmapOver {\r
+       color: #000000;\r
+       border-color: #AAAAAA;\r
+       border-style: solid;\r
+       border-width: 1px;\r
+       text-align: center;\r
+       font-size: 12px;\r
+}\r
+\r
+td.charmapOver {\r
+       background-color: #CCCCCC;\r
+       cursor: arrow;\r
+}\r
+\r
+a.charmap {\r
+       color: #000000;\r
+       text-decoration: none\r
+}\r
+\r
+.wordWrapCode {\r
+       vertical-align: middle;\r
+       border: 1px none #000000;\r
+       background-color: transparent;\r
+}\r
+\r
+input.radio {\r
+       border: 1px none #000000;\r
+       background-color: transparent;\r
+       vertical-align: middle;\r
+}\r
+\r
+input.checkbox {\r
+       border: 1px none #000000;\r
+       background-color: transparent;\r
+       vertical-align: middle;\r
+}\r
+\r
+.mceButtonNormal, .mceButtonOver, .mceButtonDown, .mceSeparator, .mceButtonDisabled, .mceButtonSelected {\r
+       margin-left: 1px;\r
+}\r
+\r
+.mceButtonNormal {\r
+       border-top: 1px solid;\r
+       border-left: 1px solid;\r
+       border-bottom: 1px solid;\r
+       border-right: 1px solid;\r
+       border-color: #F0F0EE;\r
+       cursor: arrow;\r
+}\r
+\r
+.mceButtonOver {\r
+       border: 1px solid #0A246A;\r
+       cursor: arrow;\r
+       background-color: #B6BDD2;\r
+}\r
+\r
+.mceButtonDown {\r
+       cursor: arrow;\r
+       border: 1px solid #0A246A;\r
+       background-color: #8592B5;\r
+}\r
+\r
+.mceButtonDisabled {\r
+       filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);\r
+       -moz-opacity:0.3;\r
+       opacity: 0.3;\r
+       border-top: 1px solid;\r
+       border-left: 1px solid;\r
+       border-bottom: 1px solid;\r
+       border-right: 1px solid;\r
+       border-color: #F0F0EE;\r
+       cursor: arrow;\r
+}\r
+\r
+.mceActionPanel {\r
+       margin-top: 5px;\r
+}\r
+\r
+/* Tabs classes */\r
+\r
+.tabs {\r
+       float: left;\r
+       width: 100%;\r
+       line-height: normal;\r
+       background-image: url("../images/xp/tabs_bg.gif");\r
+}\r
+\r
+.tabs ul {\r
+       margin: 0;\r
+       padding: 0px 0px 0;\r
+       list-style: none;\r
+}\r
+\r
+.tabs li {\r
+       float: left;\r
+       background: url("../images/xp/tab_bg.gif") no-repeat left top;\r
+       margin: 0;\r
+       margin-left: 0px;\r
+       margin-right: 2px;\r
+       padding: 0 0 0 10px;\r
+       line-height: 18px;\r
+}\r
+\r
+.tabs li.current {\r
+       background: url("../images/xp/tab_sel_bg.gif") no-repeat left top;\r
+       margin-right: 2px;\r
+}\r
+\r
+.tabs span {\r
+       float: left;\r
+       display: block;\r
+       background: url("../images/xp/tab_end.gif") no-repeat right top;\r
+       padding: 0px 10px 0px 0px;\r
+}\r
+\r
+.tabs .current span {\r
+       background: url("../images/xp/tab_sel_end.gif") no-repeat right top;\r
+}\r
+\r
+.tabs a {\r
+       text-decoration: none;\r
+       font-family: Verdana, Arial;\r
+       font-size: 10px;\r
+}\r
+\r
+.tabs a:link, .tabs a:visited, .tabs a:hover {\r
+       color: black;\r
+}\r
+\r
+.tabs a:hover {\r
+}\r
+\r
+.tabs .current {\r
+}\r
+\r
+.tabs .current a, .tabs .current a:link, .tabs .current a:visited {\r
+}\r
+\r
+.panel_wrapper div.panel {\r
+       display: none;\r
+}\r
+\r
+.panel_wrapper div.current {\r
+       display: block;\r
+       width: 100%;\r
+       height: 300px;\r
+       overflow: visible; /* Should be auto but that breaks Safari */\r
+}\r
+\r
+.panel_wrapper {\r
+       border: 1px solid #919B9C;\r
+       border-top: 0px;\r
+       padding: 10px;\r
+       padding-top: 5px;\r
+       clear: both;\r
+       background-color: white;\r
+}\r
+\r
+fieldset {\r
+       border: 1px solid #919B9C;\r
+       font-family: Verdana, Arial;\r
+       font-size: 10px;\r
+       padding: 0px;\r
+       margin: 0px;\r
+       padding: 4px;\r
+}\r
+\r
+legend {\r
+       color: #2B6FB6;\r
+       font-weight: bold;\r
+}\r
+\r
+.properties {\r
+       width: 100%;\r
+}\r
+\r
+.properties .column1 {\r
+}\r
+\r
+.properties .column2 {\r
+       text-align: left;\r
+}\r
+\r
+a:link, a:visited {\r
+       color: black;\r
+}\r
+\r
+a:hover {\r
+       color: #2B6FB6;\r
+}\r
+\r
+#plugintable thead {\r
+       font-weight: bold;\r
+       background-color: #DDDDDD;\r
+}\r
+\r
+#plugintable, #about #plugintable td {\r
+       border: 1px solid #919B9C;\r
+}\r
+\r
+#plugintable {\r
+       width: 99%;\r
+       margin-top: 10px;\r
+}\r
+\r
+#pluginscontainer {\r
+       height: 290px;\r
+       overflow: auto;\r
+}\r
+\r
+/* MSIE Specific styles */\r
+\r
+* html .panel_wrapper {\r
+       width: 100%;\r
+}\r
+\r
+.column {\r
+       float: left;\r
+}\r
+\r
+h1, h2, h3, h4 {\r
+       color: #2B6FB6;\r
+       margin: 0px;\r
+       padding: 0px;\r
+       padding-top: 5px;\r
+}\r
+\r
+h3 {\r
+       font-size: 14px;\r
+}\r
+\r
+/* Disables the advanced tab in the table plugin. */\r
+/*\r
+#table #advanced_tab {\r
+       display: none;\r
+}\r
+*/\r
+\r
+/* Disables the border input field and label in the table plugin. */\r
+/*\r
+#table #border, #table #borderlabel {\r
+       display: none;\r
+}\r
+*/\r
diff --git a/webcit/tiny_mce/themes/advanced/css/editor_ui.css b/webcit/tiny_mce/themes/advanced/css/editor_ui.css
new file mode 100644 (file)
index 0000000..77cc4b1
--- /dev/null
@@ -0,0 +1,173 @@
+/* This file contains the CSS data for the editor UI of TinyMCE instances */\r
+\r
+.mceToolbarTop a, .mceToolbarTop a:visited, .mceToolbarTop a:hover, .mceToolbarBottom a, .mceToolbarBottom a:visited, .mceToolbarBottom a:hover {\r
+       border: 0px; margin: 0px; padding: 0px; background: transparent;\r
+}\r
+\r
+.mceButtonNormal, .mceButtonOver, .mceButtonDown, .mceSeparator, .mceSeparatorLine, .mceButtonDisabled, .mceButtonSelected {\r
+       border: 0px; margin: 0px; padding: 0px; background: transparent;\r
+       margin-top: 1px;\r
+       margin-left: 1px;\r
+       padding: 0px;\r
+}\r
+\r
+.mceButtonNormal {\r
+       border: 1px solid #F0F0EE !important;\r
+       cursor: arrow;\r
+}\r
+\r
+.mceButtonOver {\r
+       border: 1px solid #0A246A !important;\r
+       cursor: arrow;\r
+       background-color: #B6BDD2;\r
+}\r
+\r
+.mceButtonDown {\r
+       cursor: arrow;\r
+       border: 1px solid #0A246A !important;\r
+       background-color: #8592B5;\r
+}\r
+\r
+.mceButtonSelected {\r
+       border: 1px solid #C0C0BB !important;\r
+       cursor: arrow;\r
+}\r
+\r
+.mceButtonDisabled {\r
+       filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);\r
+       -moz-opacity:0.3;\r
+       opacity: 0.3;\r
+       border: 1px solid #F0F0EE !important;\r
+       cursor: arrow;\r
+}\r
+\r
+.mceSeparator {\r
+       border-top: 1px solid buttonhighlight;\r
+       border-left: 1px solid buttonhighlight;\r
+       border-bottom: 1px solid buttonshadow;\r
+       border-right: 1px solid buttonshadow;\r
+       margin-right: 2px;\r
+       margin-left: 2px;\r
+}\r
+\r
+.mceSeparatorLine {\r
+       margin:2px;\r
+       margin-left: 4px;\r
+       background-color: #F0F0EE;\r
+       border-top: 1px solid buttonshadow;\r
+       border-left: 1px solid buttonshadow;\r
+       border-bottom: 1px solid buttonhighlight;\r
+       border-right: 1px solid buttonhighlight;\r
+       width: 0px;\r
+       height: 15px;\r
+}\r
+\r
+.mceSelectList {\r
+       font-family: 'MS Sans Serif', sans-serif, Verdana, Arial;\r
+       font-size: 7pt !important;\r
+       font-weight: normal;\r
+       margin-top: 3px;\r
+       padding: 0px;\r
+       display: inline;\r
+       vertical-align: top;\r
+       background-color: #F0F0EE\r
+}\r
+\r
+.mceLabel, .mceLabelDisabled {\r
+       font-family: 'MS Sans Serif', sans-serif, Verdana, Arial;\r
+       font-size: 9pt;\r
+}\r
+\r
+.mceLabel {\r
+       color: #000000;\r
+}\r
+\r
+.mceLabelDisabled {\r
+       cursor: text;\r
+       color: #999999;\r
+}\r
+\r
+.mceEditor {\r
+       background: #F0F0EE;\r
+       border: 1px solid #cccccc;\r
+       padding: 0px;\r
+       margin: 0px;\r
+}\r
+\r
+.mceEditorArea {\r
+       font-family: 'MS Sans Serif', sans-serif, Verdana, Arial;\r
+       background: #FFFFFF;\r
+       padding: 0px;\r
+       margin: 0px;\r
+}\r
+\r
+.mceToolbarTop, .mceToolbarBottom {\r
+       background: #F0F0EE;\r
+       line-height: 1px;\r
+       font-size: 1px;\r
+}\r
+\r
+.mceToolbarTop {\r
+       border-bottom: 1px solid #cccccc;\r
+}\r
+\r
+.mceToolbarBottom {\r
+       border-top: 1px solid #cccccc;\r
+}\r
+\r
+.mceStatusbarTop, .mceStatusbarBottom, .mceStatusbar {\r
+       height: 20px;\r
+}\r
+\r
+.mceStatusbarTop .mceStatusbarPathText, .mceStatusbarBottom .mceStatusbarPathText, .mceStatusbar .mceStatusbarPathText {\r
+       font-family: 'MS Sans Serif', sans-serif, Verdana, Arial;\r
+       font-size: 9pt;\r
+       padding: 2px;\r
+       line-height: 16px;\r
+       overflow: visible;\r
+}\r
+\r
+.mceStatusbarTop {\r
+       border-bottom: 1px solid #cccccc;\r
+}\r
+\r
+.mceStatusbarBottom {\r
+       border-top: 1px solid #cccccc;\r
+}\r
+\r
+.mceStatusbar {\r
+       border-bottom: 1px solid #cccccc;\r
+}\r
+\r
+.mcePathItem, .mcePathItem:link, .mcePathItem:visited, .mcePathItem:hover {\r
+       text-decoration: none;\r
+       font-family: 'MS Sans Serif', sans-serif, Verdana, Arial;\r
+       font-size: 9pt;\r
+       color: #000000;\r
+}\r
+\r
+.mcePathItem:hover {\r
+       text-decoration: underline;\r
+}\r
+\r
+.mceStatusbarPathText {\r
+       float: left;\r
+}\r
+\r
+.mceStatusbarResize {\r
+       float: right;\r
+       background-image: url('../images/statusbar_resize.gif');\r
+       background-repeat: no-repeat;\r
+       width: 11px;\r
+       height: 20px;\r
+       cursor: se-resize;\r
+}\r
+\r
+.mceResizeBox {\r
+       width: 10px;\r
+       height: 10px;\r
+       display: none;\r
+       border: 1px dotted gray;\r
+       margin: 0px;\r
+       padding: 0px;\r
+}\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/cs/about.htm b/webcit/tiny_mce/themes/advanced/docs/cs/about.htm
new file mode 100644 (file)
index 0000000..f51faa9
--- /dev/null
@@ -0,0 +1,31 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>O TinyMCE</TITLE>\r
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-2">\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">O TinyMCE</span></td>\r
+    <td align="right"><a href="index.htm">Obsah</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+TinyMCE je malý WYSIWYG editor pro webové prohlí¾eèe jako jsou MSIE nebo Mozilla,\r
+kterým lze HTML obsah upravovat mnohem jednodu¹eji. Obsahuje bì¾né funkce,\r
+je¾ lze nalézt ve vìt¹inì textových editorù, proto by jeho pou¾ívání nemìlo být slo¾ité.<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Jdi na: <a href="index.htm">Obsah</a></td>\r
+    <td align="right"><a href="#">Nahoru</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/cs/common_buttons.htm b/webcit/tiny_mce/themes/advanced/docs/cs/common_buttons.htm
new file mode 100644 (file)
index 0000000..c096703
--- /dev/null
@@ -0,0 +1,170 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Bì¾ná tlaèítka</TITLE>\r
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-2">\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Bì¾ná tlaèítka</span></td>\r
+    <td align="right"><a href="index.htm">Obsah</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Ní¾e je krátce popsáno ka¾dé tlaèítko.\r
+<img src="../../images/spacer.gif" width="1" height="1"> \r
+<br>\r
+<br>\r
+<table border="1" cellpadding="3" cellspacing="0">\r
+  <tr>\r
+    <td><img src="../../images/cut.gif" width="20" height="20"></td>\r
+    <td>Zkopíruje aktuálnì vybraný obsah do schránky. (Ctrl+C)</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/copy.gif" width="20" height="20"></td>\r
+    <td>Vyjme aktuálnì vybraný obsah do schránky. (Ctrl+X)</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/paste.gif" width="20" height="20"></td>\r
+    <td>Vlo¾í obsah schránky do okna editoru. (Ctrl+P)</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/bold.gif" width="20" height="20"></td>\r
+    <td>Ztuèní text.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/italic.gif" width="20" height="20"></td>\r
+    <td>Naformátuje text kurzívou.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/underline.gif" width="20" height="20"></td>\r
+    <td>Podtrhne text.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/strikethrough.gif" width="20" height="20"></td>\r
+    <td>Pøe¹krtne text.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyleft.gif" width="20" height="20"></td>\r
+    <td>Zarovná vlevo.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifycenter.gif" width="20" height="20"></td>\r
+    <td>Zarovná na støed.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyright.gif" width="20" height="20"></td>\r
+    <td>Zarovná vpravo.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyfull.gif" width="20" height="20"></td>\r
+    <td>Zarovná do bloku.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/bullist.gif" width="20" height="20"></td>\r
+    <td>Neøazený seznam/seznam s odrá¾ky.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/numlist.gif" width="20" height="20"></td>\r
+    <td>Øazený seznam/èíslovaný seznam.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/outdent.gif" width="20" height="20"></td>\r
+    <td>Pøedsadí/sní¾í odsazení.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/indent.gif" width="20" height="20"></td>\r
+    <td>Odsadí/zvý¹í odsazení.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/undo.gif" width="20" height="20"></td>\r
+    <td>Vrátí zpìt naposledy provedenou akci.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/redo.gif" width="20" height="20"></td>\r
+    <td>Obnoví poslední akci.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/link.gif" width="20" height="20"></td>\r
+    <td>Vlo¾í nový odkaz, více o této funkci v èásti <a href="insert_link_button.htm">Vlo¾it odkaz</a>.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/unlink.gif" width="20" height="20"></td>\r
+    <td>Zru¹í odkaz v aktuálním výbìru/odstranit v¹echny vybrané odkazy.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/image.gif" width="20" height="20"></td>\r
+    <td>Vlo¾í nový obrázek, více o této funkci v èásti <a href="insert_image_button.htm">Vlo¾it obrázek</a>.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/cleanup.gif" width="20" height="20"></td>\r
+    <td>Vyèistí kód/odstraní nechtìné formátování. Tato funkce se hodí kdy¾\r
+      kopírujete obsah napøíklad z kanceláøského balíku.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/help.gif" width="20" height="20"></td>\r
+    <td>Zobrazí tuto nápovìdu.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/code.gif" width="20" height="20"></td>\r
+    <td>Otevøe editor s HTML zdrojem. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/table.gif" width="20" height="20"></td>\r
+    <td>Do aktuální pozice vlo¾í novou 2x2 tabulku.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/table_insert_row_before.gif" width="20" height="20"></td>\r
+    <td>Pøidá øádek pøed aktuální. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/table_insert_row_after.gif" width="20" height="20"></td>\r
+    <td>Pøidá øádek pod aktuální. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/table_delete_row.gif" width="20" height="20"></td>\r
+    <td>Odstraní øádek. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/table_insert_col_before.gif" width="20" height="20"></td>\r
+    <td>Pøidá sloupec pøed aktuální.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/table_insert_col_after.gif" width="20" height="20"></td>\r
+    <td>Pøidá sloupec za aktuální.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/table_delete_col.gif" width="20" height="20"></td>\r
+    <td>Odstraní aktuální sloupec.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/hr.gif" width="20" height="20"></td>\r
+    <td>Pøidá nový vodorovný oddìlovaè.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/removeformat.gif" width="20" height="20"></td>\r
+    <td>Odstraní z výbìru formátování. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/sub.gif" width="20" height="20"></td>\r
+    <td>Vytvoøí z vybraného textu dolní index. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/sup.gif" width="20" height="20"></td>\r
+    <td>Vytvoøí z vybraného textu horní index. </td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Jdi na: <a href="index.htm">Obsah</a></td>\r
+    <td align="right"><a href="#">Nahoru</a></td>\r
+  </tr>\r
+</table>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/cs/images/insert_image_window.png b/webcit/tiny_mce/themes/advanced/docs/cs/images/insert_image_window.png
new file mode 100644 (file)
index 0000000..5d9ea98
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/cs/images/insert_image_window.png differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/cs/images/insert_link_window.png b/webcit/tiny_mce/themes/advanced/docs/cs/images/insert_link_window.png
new file mode 100644 (file)
index 0000000..94a0c2e
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/cs/images/insert_link_window.png differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/cs/images/insert_table_window.png b/webcit/tiny_mce/themes/advanced/docs/cs/images/insert_table_window.png
new file mode 100644 (file)
index 0000000..17c46d0
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/cs/images/insert_table_window.png differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/cs/index.htm b/webcit/tiny_mce/themes/advanced/docs/cs/index.htm
new file mode 100644 (file)
index 0000000..88c8c8f
--- /dev/null
@@ -0,0 +1,26 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Nápovìda</TITLE>\r
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-2">\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+<BODY onload="window.focus();">\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Obsah</span></td>\r
+    <td align="right">&nbsp;</td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Kliknutím na odkazy ní¾e zvolte po¾adovanou èást nápovìdy.\r
+<ul class="toc_ul">\r
+  <li class="toc_li"><a href="about.htm">O TinyMCE</a></li>\r
+  <li class="toc_li"><a href="common_buttons.htm">Bì¾ná tlaèítka</a></li>\r
+  <li class="toc_li"><a href="insert_image_button.htm">Tlaèítko vlo¾it obrázek</a></li>\r
+  <li class="toc_li"><a href="insert_link_button.htm">Tlaèítko vlo¾it odkaz</a></li>\r
+  <li class="toc_li"><a href="insert_table_button.htm">Tlaèítko vlo¾it tabulku</a></li>\r
+</ul>\r
+<hr noshade>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/cs/insert_image_button.htm b/webcit/tiny_mce/themes/advanced/docs/cs/insert_image_button.htm
new file mode 100644 (file)
index 0000000..360102d
--- /dev/null
@@ -0,0 +1,66 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Tlaèítko vlo¾it obrázek</TITLE>\r
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-2">\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Tlaèítko vlo¾it obrázek</span></td>\r
+    <td align="right"><a href="index.htm">Obsah</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Tlaèítko vlo¾it obrázek otevøe následující okno.<br>\r
+<br>\r
+<img src="images/insert_image_window.png" width="348" height="290"><br>\r
+<br>\r
+Jen vlo¾te URL obrázku, který chcete pøidat a zadáte jeho popis, jen¾ bude\r
+zobrazován jako alternativní popisek obrázku.<br>\r
+<br>\r
+<strong>Popis políèek:</strong><br>\r
+<table border="1" cellspacing="0">\r
+  <tr>\r
+    <td width="150"><strong>URL obrázku</strong></td>\r
+    <td>URL/cesta k obrázku.</td>\r
+  </tr>\r
+  <tr>\r
+    <td width="150"><strong>Popis obrázku</strong></td>\r
+    <td>Alternativní popis toho, co je na obrázku.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Rozmìry</strong></td>\r
+    <td>©íøka/vý¹ka obrázku. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Zarovnání</strong></td>\r
+    <td>Zarovnání obrázku, vhodné pro obtékání obrázku textem.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Rámeèek</strong></td>\r
+    <td>Tlou¹»ka rámeèku. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Vertikální okraj</strong></td>\r
+    <td>Vertikální okraj, vhodné pro zalomení textu kolem obrázku.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Horizontální okraj</strong></td>\r
+    <td>Horizontální okraj, vhodné pro zalomení textu kolem obrázku.</td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Jdi na: <a href="index.htm">Obsah</a></td>\r
+    <td align="right"><a href="#">Nahoru</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/cs/insert_link_button.htm b/webcit/tiny_mce/themes/advanced/docs/cs/insert_link_button.htm
new file mode 100644 (file)
index 0000000..3508078
--- /dev/null
@@ -0,0 +1,34 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Tlaèítko vlo¾it odkaz</TITLE>\r
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-2">\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Tlaèítko vlo¾it odkaz</span></td>\r
+    <td align="right"><a href="index.htm">Obsah</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Toto tlaèítko otevøe nové okno s mo¾ností vlo¾ení/úpravy odkazu.<br>\r
+<br>\r
+<img src="images/insert_link_window.png" width="328" height="160"><br>\r
+<br>\r
+V tomto oknì jsou dvì políèka. &quot;URL odkazu&quot; je adresa stránky, na \r
+kterou odkazujeme. &quot;Cíl&quot; urèuje, jak má být odkazovaná stránka otevøena.<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Jdi na: <a href="index.htm">Obsah</a></td>\r
+    <td align="right"><a href="#">Nahoru</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/cs/insert_table_button.htm b/webcit/tiny_mce/themes/advanced/docs/cs/insert_table_button.htm
new file mode 100644 (file)
index 0000000..fcb63b6
--- /dev/null
@@ -0,0 +1,68 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Tlaèítko vlo¾it tabulku</TITLE>\r
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-2">\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Tlaèítko vlo¾it tabulku</span></td>\r
+    <td align="right"><a href="index.htm">Obsah</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Tlaèítko vlo¾it tabulku otevøe následující okno, v nìm¾ mù¾ete definovat novou tabulku.<br>\r
+<br>\r
+<img src="images/insert_table_window.png" width="338" height="210"><br>\r
+<br>\r
+<strong>Popis políèek:</strong><br>\r
+<table border="1" cellspacing="0">\r
+  <tr>\r
+    <td width="150"><strong>Sloupce</strong></td>\r
+    <td>Poèet sloupcù v tabulce.</td>\r
+  </tr>\r
+  <tr>\r
+    <td width="150"><strong>Øádky</strong></td>\r
+    <td>Poèet øádkù v tabulce.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Vnitøní okraj bunìk</strong></td>\r
+    <td>Vnitøní okraj bunìk tabulky.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Vnìj¹í okraj bunìk</strong></td>\r
+    <td>Vnitøní okraj bunìk tabulky.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Zarovnání</strong></td>\r
+    <td>Zarovnání tabulky.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Rámeèek</strong></td>\r
+    <td>Tlou¹»ka rámeèku tabulky.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>©íøka</strong></td>\r
+    <td>©íøka tabulky v pixelech.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Vý¹ka</strong></td>\r
+    <td>Vý¹ka tabulky v pixelech.</td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Jdi na: <a href="index.htm">Obsah</a></td>\r
+    <td align="right"><a href="#">Nahoru</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/cs/style.css b/webcit/tiny_mce/themes/advanced/docs/cs/style.css
new file mode 100644 (file)
index 0000000..f988e2a
--- /dev/null
@@ -0,0 +1,28 @@
+body { background-color: #FFFFFF; }\r
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }\r
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }\r
+.subtitle { font-size: 12px; font-weight: bold; }\r
+\r
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }\r
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }\r
+img { border: 0; }\r
+\r
+a:visited { color: #666666; text-decoration: underline; }\r
+a:active { color: #666666; text-decoration: underline; }\r
+a:hover { color: #666666; text-decoration: underline; }\r
+a { color: #666666; text-decoration: underline; }\r
+\r
+.pageheader { border: #E0E0E0 solid 1px; }\r
+.pagefooter { border: #E0E0E0 solid 1px; }\r
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.samplecontent { font-size: 10px; }\r
+\r
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.codecontent { font-size: 10px; }\r
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }\r
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }\r
+\r
+hr { height: 1px; }\r
+\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/da/about.htm b/webcit/tiny_mce/themes/advanced/docs/da/about.htm
new file mode 100644 (file)
index 0000000..fc228f8
--- /dev/null
@@ -0,0 +1,31 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>About TinyMCE</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Om TinyMCE</span></td>\r
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+TinyMCE er et kompakt WYSIWYG editeringsmodul, der kan anvendes i browsere som MS Internet \r
+Explorer eller Mozilla. Modulet gør det muligt for dig at redigere HTML-indhold \r
+på en mere brugervenlig måde. Den er forsynet med de samme funktioner, som man \r
+finder i de fleste tekstbehandlingssystemer og skulle ikke være svær at anvende. <br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Tilbage til: <a href="index.htm">Indholdfortegnelse</a></td>\r
+    <td align="right"><a href="#">Top</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/da/common_buttons.htm b/webcit/tiny_mce/themes/advanced/docs/da/common_buttons.htm
new file mode 100644 (file)
index 0000000..297a22c
--- /dev/null
@@ -0,0 +1,162 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Common buttons</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">De mest almindelige knapper</span></td>\r
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">IF</acronym></a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Herunder finder du en beskrivelse af de enkelte knapper.<br>\r
+<br>\r
+<table border="1" cellpadding="3" cellspacing="0">\r
+  <tr>\r
+    <td><img src="../../images/bold.gif" width="20" height="20" alt="Bold text icon" /></td>\r
+    <td>Fed tekst (Ctrl+B).</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/italic.gif" width="20" height="20" alt="Italic text icon" /></td>\r
+    <td>Kursiv (Ctrl+I).</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/underline.gif" width="20" height="20" alt="Underline text icon." /></td>\r
+    <td>Understregning (Ctrl+U).</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/strikethrough.gif" width="20" height="20" alt="Strikethrough text icon." /></td>\r
+    <td>Gennemstregning.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyleft.gif" width="20" height="20" alt="Align left icon." /></td>\r
+    <td>Juster til venstre.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifycenter.gif" width="20" height="20" alt="Align center icon." /></td>\r
+    <td>Centrer.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyright.gif" width="20" height="20" alt="Align right icon." /></td>\r
+    <td>Juster til højre.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyfull.gif" width="20" height="20" alt="Align full icon." /></td>\r
+    <td>Lige højre margen.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/bullist.gif" width="20" height="20" alt="Unordered list/bullet list icon." /></td>\r
+    <td>Uordnet list med bullets.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/numlist.gif" width="20" height="20" alt="Ordered list/numbered list icon." /></td>\r
+    <td>Ordnet liste med tal</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/outdent.gif" width="20" height="20" alt="Outdent/decrease indentation icon." /></td>\r
+    <td>Flyt tekst til venstre.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/indent.gif" width="20" height="20" alt="Indent/increase indentation icon." /></td>\r
+    <td>Flyt tekst til højre.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/undo.gif" width="20" height="20" alt="Undo the last operation." /></td>\r
+    <td>Fortryd sidste valg (Ctrl+Z).</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/redo.gif" width="20" height="20" alt="Redo the last operation icon." /></td>\r
+    <td>Gentag sidste valg (Ctrl+Y).</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/link.gif" width="20" height="20" alt="Insert a new link icon." /></td>\r
+    <td>Indsæt nyt link - læs mere om denne funktion i afsnittet <a href="insert_link_button.htm">Indsættelse \r
+       af link</a>.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/unlink.gif" width="20" height="20" alt="Unlinks the current selection icon." /></td>\r
+    <td>Fjern aktuelt valgte link(s).</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/anchor.gif" width="20" height="20" alt="Insert a new anchor icon." /></td>\r
+    <td>Indsæt nyt bogmærke - læs mere om denne funktion i afsnittet om\r
+       <a href="insert_anchor_button.htm">Bogmærker.</a></td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/image.gif" width="20" height="20" alt="Insert a new image icon." /></td>\r
+    <td>Indsæt nyt billede - læs mere om denne funktion i afsnittet om\r
+       <a href="insert_image_button.htm">Billedbehandling</a>.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/cleanup.gif" width="20" height="20" alt="Cleanup code icon." /></td>\r
+    <td>Ryd op i koden / fjern uønsket formatering. Denne funktion er brugbar, \r
+       når man indsætter tekst f. eks. fra et office-produkt.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/help.gif" width="20" height="20" alt="Show help icon." /></td>\r
+    <td>Viser dette hjælpevindue.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/code.gif" width="20" height="20" alt="Source code editor icon." /></td>\r
+    <td>Åbner editoren til redigering af HTML-kode. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table.gif" width="20" height="20" alt="Insert table icon." /></td>\r
+    <td>Indsætter en ny tabel, hvor cursoren aktuelt er anbragt. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_row_before.gif" width="20" height="20" alt="Adds a row above icon." /></td>\r
+    <td>Tilføjer en række over den aktuelle. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_row_after.gif" width="20" height="20" alt="Adds a row under icon." /></td>\r
+    <td>Tilføjer en række under den aktuelle. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_delete_row.gif" width="20" height="20" alt="Remove row icon." /></td>\r
+    <td>Fjerner en række. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_col_before.gif" width="20" height="20" alt="Add column before icon." /></td>\r
+    <td>Tilføjer en kolonne før den aktuelle.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_col_after.gif" width="20" height="20" alt="Add column after icon." /></td>\r
+    <td>Tilføjer en kolonne efter den aktuelle.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_delete_col.gif" width="20" height="20" alt="Remove column icon." /></td>\r
+    <td>Fjerner den aktuelle kolonne.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/hr.gif" width="20" height="20" alt="Insert horizontal ruler icon." /></td>\r
+    <td>Indsætter en vandret streg </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/removeformat.gif" width="20" height="20" alt="Remove formatting icon." /></td>\r
+    <td>Fjerner al formatering fra den aktuelt valgte tekst. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/sub.gif" width="20" height="20" alt="Subscript icon." /></td>\r
+    <td>Sætter det valgte som sænket skrift. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/sup.gif" width="20" height="20" alt="Superscript icon." /></td>\r
+    <td>Sætter det valgte som hævet skrift. </td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<hr noshade="noshade" />\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Tilbage til: <a href="index.htm">Indholdsfortegnelse</a></td>\r
+    <td align="right"><a href="#">Top</a></td>\r
+  </tr>\r
+</table>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/da/create_accessible_content.htm b/webcit/tiny_mce/themes/advanced/docs/da/create_accessible_content.htm
new file mode 100644 (file)
index 0000000..b855eb7
--- /dev/null
@@ -0,0 +1,76 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Insert table button</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Skabe tilgængeligt indhold</span></td>\r
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<p>TinyMCE kan producere HTML, der vil være tilgængeligt for alle brugere, også \r
+dem med handicaps, som anvender forskellige hjælpeteknikker. Den kan også skabe \r
+indhold, der er tilgængeligt for brugere, som anvender tekstbaserede browsere \r
+eller dem, der browser uden at vise billederne frem på siderne.&nbsp; </p>\r
+\r
+<p><strong>Ting du selv kan gøre, for at gøre dine tekste tilgængelige:</strong></p>\r
+<ol>\r
+<li><strong>Lav en billedbeskrivelse:</strong> Blinde brugere eller andre, som \r
+ikke er i stand til at se billeder, er helt afhængige af billedbeskrivelsen \r
+eller alt-teksten, som erstatter selve billedet. Hvis et billede ingen betydning \r
+har - dvs. hvis det blot fungerer som dekoration eller som et blankt område, så \r
+lad billedbeskrivelsen stå tom.&nbsp; Så vil TinyMCE indsætte et tomt alt-felt, \r
+der vil tvinge hjælpeprogrammerne til at ignorere billedet. <br /><br /></li>\r
+\r
+<li> <strong>Tilføj udstrækning til en tabels overskriftsceller:</strong> I den \r
+dialog, som gør det muligt at styre en tabels attributter, bør man angive en \r
+overskrifts udstrækning. Det vil fungere sådan, at overskriften automatisk \r
+knyttes til alle værdier i tabellen, hvilket gør det nemmere for blinde brugere \r
+at forstå, hvad indholdet i den enkelte celle betyder.&nbsp; <br /><br /></li>\r
+\r
+<li><strong> Strukturer indholdet med fornuftige overskrifter:</strong> Vælg \r
+standardformaterede overskrifter (som f. eks. H1-6) for at lave overskrifter til \r
+dit indhold - går det i stedet for at lave dine egne standarder. Blinde brugere \r
+anvender en læser, der kan genkende disse standardformater og på den måde lave \r
+en indholdsfortegnelse over siden. På den måde kan en blind bruger lettere \r
+bevæge sig rundt på siden og springe fra afsnit til afsnit.<br>\r
+&nbsp;<br /></li>\r
+\r
+<li><strong> Husk at lave alternativt indhold:</strong> Lav en alternativ side \r
+der repræsenterer ikke-HTML-formateret indhold - så som Flash, Java applets \r
+eller indlejrede videosekvenser. Denne kan laves som et stykke statisk grafik \r
+kombineret med en beskrivelse af billedet og en beskrivelse af det indhold, som&nbsp; \r
+ville være dukket op, hvis man havde set siden på normal vis. En alternativ \r
+HTML-side kan også laves, hvorefter man så kan lægge et link på til den ved \r
+siden af Falsh-referencen eller referencen til Java appletten. På denne måde \r
+sikrer du, at indholdet også er tilgængeligt for folk, som bruger \r
+hjælpeteknologier, som ikke er i stand til at vise eller afvikle dit indhold \r
+eller som mangler den relevante player eller plugin.<br /><br /></li>\r
+\r
+<li><strong> Kontroller tilgængeligheden: </strong> Når AChecker plugin'en er \r
+installeret sammen med TinyMCE, kan du blot trykke på den relevante knap for at \r
+blive adviseret om mulige tilgængelighedsproblemer.<br /><br /></li>\r
+\r
+</ol>\r
+\r
+<p>Besøg <a href="http://checker.atrc.utoronto.ca" target="_new">ACheckers \r
+hjemmeside</a> for at se yderligere informationer om, hvordan man skaber \r
+indhold, som alle brugere kan tilgå.<br />\r
+</p>\r
+\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Tilbage til: <a href="index.htm">Indholdsfortegnelse</a></td>\r
+    <td align="right"><a href="#">Top</a></td>\r
+  </tr>\r
+</table>\r
+\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/da/images/insert_anchor_window.gif b/webcit/tiny_mce/themes/advanced/docs/da/images/insert_anchor_window.gif
new file mode 100644 (file)
index 0000000..5b5f528
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/da/images/insert_anchor_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/da/images/insert_image_window.gif b/webcit/tiny_mce/themes/advanced/docs/da/images/insert_image_window.gif
new file mode 100644 (file)
index 0000000..cdc617e
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/da/images/insert_image_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/da/images/insert_link_window.gif b/webcit/tiny_mce/themes/advanced/docs/da/images/insert_link_window.gif
new file mode 100644 (file)
index 0000000..7bad758
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/da/images/insert_link_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/da/images/insert_table_window.gif b/webcit/tiny_mce/themes/advanced/docs/da/images/insert_table_window.gif
new file mode 100644 (file)
index 0000000..23b3814
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/da/images/insert_table_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/da/index.htm b/webcit/tiny_mce/themes/advanced/docs/da/index.htm
new file mode 100644 (file)
index 0000000..1671fe4
--- /dev/null
@@ -0,0 +1,28 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Help Index</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+<BODY onload="window.focus();">\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Indholdsfortegnelse</span></td>\r
+    <td align="right">&nbsp;</td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Klik på et link herunder for at springe til en hjælpetekst. \r
+<ul class="toc_ul">\r
+  <li class="toc_li"><a href="about.htm">Om TinyMCE</a></li>\r
+  <li class="toc_li"><a href="common_buttons.htm">De mest almindelige knapper</a></li>\r
+  <li class="toc_li"><a href="insert_image_button.htm">Indsæt billeder</a></li>\r
+  <li class="toc_li"><a href="insert_link_button.htm">Indsæt links</a></li>\r
+  <li class="toc_li"><a href="insert_anchor_button.htm">Indsæt bogmærker</a></li>\r
+  <li class="toc_li"><a href="insert_table_button.htm">Indsæt tabeller</a></li>\r
+ <li class="toc_li"><a href="create_accessible_content.htm">Skab tilgængeligt \r
+       indhold</a></li>\r
+</ul>\r
+<hr noshade>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/da/insert_anchor_button.htm b/webcit/tiny_mce/themes/advanced/docs/da/insert_anchor_button.htm
new file mode 100644 (file)
index 0000000..3bc9d29
--- /dev/null
@@ -0,0 +1,33 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Insert anchor button</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Indsæt bogmærke</span></td>\r
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Denne knap åbner et nyt vindue, som rummer bogmærkefunktionen.<br>\r
+<br>\r
+<img src="images/insert_anchor_window.gif" width="330" height="139" alt="Anchor dialog/window" /><br>\r
+<br>\r
+Der er kun et enkelt felt i dette vindue - i det skriver du navnet på dit \r
+bogmærke. Husk at to bogmærker ikke kan hedde det samme. <br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Tilbage til: <a href="index.htm">Indholdsfortegnelse</a></td>\r
+    <td align="right"><a href="#">Top</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/da/insert_image_button.htm b/webcit/tiny_mce/themes/advanced/docs/da/insert_image_button.htm
new file mode 100644 (file)
index 0000000..ed7c81f
--- /dev/null
@@ -0,0 +1,67 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Insert image button</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Indsæt billeder</span></td>\r
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Knappen &quot;Indsæt billede&quot; åbner et vindue, der ser ud som nedenfor.<br>\r
+<br>\r
+<img src="images/insert_image_window.gif" alt="Insert image dialog/window" /><br>\r
+<br>\r
+Her indskriver man ganske enkelt adressen på det billede, man vil linke til samt \r
+en billedbeskrivelse. Denne beskrivelse bliver derefter vist som den alternative \r
+tekstbeskrivelse af billedet. <br>\r
+<br>\r
+<strong>Feltbeskrivelser:</strong><br>\r
+<table border="1" cellspacing="0">\r
+  <tr>\r
+    <td width="150"><strong>Image URL </strong></td>\r
+    <td>Adressen på eller stien til billedet.</td>\r
+  </tr>\r
+  <tr>\r
+    <td width="150"><strong>Image description </strong></td>\r
+    <td>Alternativ tekstbeskrivelse af billedet.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Dimentions</strong></td>\r
+    <td>Billedets bredde / højde. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Alignment</strong></td>\r
+    <td>Billedets justering - brugbar når der skal sættes tekst på plads omkring \r
+       et billede.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Border</strong></td>\r
+    <td>Ramme bredde. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>VSpace</strong></td>\r
+    <td>Vertikal margen - brugbart når billedet skal placeres i en tekst.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>HSpace</strong></td>\r
+    <td>Horisontal margen - brugbart når billedet skal placeres i en tekst.</td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Tilbage til: <a href="index.htm">Indholdsfortegnelse</a></td>\r
+    <td align="right"><a href="#">Top</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/da/insert_link_button.htm b/webcit/tiny_mce/themes/advanced/docs/da/insert_link_button.htm
new file mode 100644 (file)
index 0000000..3c34441
--- /dev/null
@@ -0,0 +1,34 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Insert link button</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Indsæt link</span></td>\r
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Denne knap åbner et nyt vindue, som rummer linkfunktionen.<br>\r
+<br>\r
+<img src="images/insert_link_window.gif" width="330" height="159" alt="Insert link dialog/window" /><br>\r
+<br>\r
+Der er to felter i dette vindue. I det første skal man indskrive adressen på \r
+linket - i det andet det &quot;target&quot;, som linket skal pege på - dvs. hvordan linket \r
+åbnes, når brugeren trykker på det.<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Tilbage til: <a href="index.htm">Indholdsfortegnelse</a></td>\r
+    <td align="right"><a href="#">Top</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/da/insert_table_button.htm b/webcit/tiny_mce/themes/advanced/docs/da/insert_table_button.htm
new file mode 100644 (file)
index 0000000..9fc9901
--- /dev/null
@@ -0,0 +1,72 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Insert table button</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Indsæt tabel</span></td>\r
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Trykker man på indsæt tabel knappen åbnes det vindue, som du kan se herunder. I \r
+dette vindue kan du oprette nye tabeller. <br>\r
+<br>\r
+<img border="0" src="images/insert_table_window.gif" width="384" height="321"><br>\r
+<br>\r
+<strong>Feltbeskrivelser:</strong><br>\r
+<table border="1" cellspacing="0">\r
+  <tr>\r
+    <td width="150"><strong>Kolonner</strong></td>\r
+    <td>Antal kolonner i tabellen. </td>\r
+  </tr>\r
+  <tr>\r
+    <td width="150"><strong>Rækker</strong></td>\r
+    <td>Antal rækker i tabellen.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Cellemargin</strong></td>\r
+    <td>Tabellens cellemargin. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Indvendig margin</strong></td>\r
+    <td>Indvendig margin i cellerne.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Justering</strong></td>\r
+    <td>Tabellens justering. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Kant</strong></td>\r
+    <td>Kantbredden i tabellen.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Bredde</strong></td>\r
+    <td>Tabellens bredde i pixels.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Højde</strong></td>\r
+    <td>Tabellens højde i pixels.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Klasse</strong></td>\r
+    <td>Style eller stylesheet klasse for tabellen.</td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Tilbage til: <a href="index.htm">Indholdsfortegnelse</a></td>\r
+    <td align="right"><a href="#">Top</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/da/style.css b/webcit/tiny_mce/themes/advanced/docs/da/style.css
new file mode 100644 (file)
index 0000000..722f537
--- /dev/null
@@ -0,0 +1,28 @@
+body { background-color: #FFFFFF; }\r
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }\r
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }\r
+.subtitle { font-size: 12px; font-weight: bold; }\r
+\r
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }\r
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }\r
+img { border: #000000 solid 1px; }\r
+\r
+a:visited { color: #666666; text-decoration: underline; }\r
+a:active { color: #666666; text-decoration: underline; }\r
+a:hover { color: #666666; text-decoration: underline; }\r
+a { color: #666666; text-decoration: underline; }\r
+\r
+.pageheader { border: #E0E0E0 solid 1px; }\r
+.pagefooter { border: #E0E0E0 solid 1px; }\r
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.samplecontent { font-size: 10px; }\r
+\r
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.codecontent { font-size: 10px; }\r
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }\r
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }\r
+\r
+hr { height: 1px; }\r
+\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/de/about.htm b/webcit/tiny_mce/themes/advanced/docs/de/about.htm
new file mode 100644 (file)
index 0000000..c546f30
--- /dev/null
@@ -0,0 +1,31 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>&Uuml;ber TinyMCE</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">&Uuml;ber TinyMCE</span></td>\r
+    <td align="right"><a href="index.htm">Inhalt</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+TinyMCE ist ein kompakter WYSIWYG-Editor f&uuml;r Webbrowser wie MSIE oder Mozilla\r
+der es Ihnen erm&ouml;glicht HTML-Inhalte auf eine benutzerfreundliche Weise zu\r
+editieren. Es verf&uuml;gt über die wichtigsten Funktionen die in den meisten\r
+Textverarbeitungen vorkommen und sollte einfach zu benutzen sein.<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Gehe zu: <a href="index.htm">Inhaltsverzeichnis</a></td>\r
+    <td align="right"><a href="#">nach oben</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/de/common_buttons.htm b/webcit/tiny_mce/themes/advanced/docs/de/common_buttons.htm
new file mode 100644 (file)
index 0000000..3dc058d
--- /dev/null
@@ -0,0 +1,107 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Allgemeine Schaltfl&auml;chen</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Allgemeine Schaltfl&auml;chen</span></td>\r
+    <td align="right"><a href="index.htm">Inhalt</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Untenstehend eine kurze Beschreibung jeder Schaltfl&auml;che.<br>\r
+<br>\r
+<table border="1" cellpadding="3" cellspacing="0">\r
+  <tr>\r
+    <td><img src="../../images/bold_de_se.gif" width="20" height="20"></td>\r
+    <td>Fetter Text.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/italic_de_se.gif" width="20" height="20"></td>\r
+    <td>Kursiver Text.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/underline.gif" width="20" height="20"></td>\r
+    <td>Unterstrichener Text.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/strikethrough.gif" width="20" height="20"></td>\r
+    <td>Durchgestrichener Text.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyleft.gif" width="20" height="20"></td>\r
+    <td>Linksb&uuml;ndig.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifycenter.gif" width="20" height="20"></td>\r
+    <td>Zentriert.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyright.gif" width="20" height="20"></td>\r
+    <td>Rechtsb&uuml;ndig.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyfull.gif" width="20" height="20"></td>\r
+    <td>Blocksatz.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/bullist.gif" width="20" height="20"></td>\r
+    <td>Unsortierte Liste / Punktierte Liste.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/numlist.gif" width="20" height="20"></td>\r
+    <td>Sortierte Liste / Nummerierte Liste.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/outdent.gif" width="20" height="20"></td>\r
+    <td>Einzug verkleinern.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/indent.gif" width="20" height="20"></td>\r
+    <td>Einzug vergr&ouml;ssern.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/undo.gif" width="20" height="20"></td>\r
+    <td>Letzte Aktion r&uuml;ckg&auml;ngig machen.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/redo.gif" width="20" height="20"></td>\r
+    <td>Letzte Aktion wiederholen.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/link.gif" width="20" height="20"></td>\r
+    <td>Einen neuen Hyperlink einf&uuml;gen, lesen Sie mehr &uuml;ber diese Funktion im Kapitel <a href="insert_link_button.htm">Hyperlink einf&uuml;gen</a>.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/unlink.gif" width="20" height="20"></td>\r
+    <td>Den gegenw&auml;rtige markierten Hyperlink entfernen / Alle gegenw&auml;rtig markierten Hyperlinks entfernen.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/image.gif" width="20" height="20"></td>\r
+    <td>Ein neues Bild einf&uuml;gen, lesen Sie mehr &uuml;ber diese Funktion im Kapitel <a href="insert_image_button.htm">Bild einf&uuml;gen</a>.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/cleanup.gif" width="20" height="20"></td>\r
+    <td>unsauberen Code aufr&auml;umen / Entfernt ungewollte Formatierungen. Diese Funktion ist n&uuml;tzlich,\r
+               wenn Sie beispielsweise Inhalte aus einem Office Produkt kopieren.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/help.gif" width="20" height="20"></td>\r
+    <td>Zeigt diese Hilfe an.</td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Gehe zu: <a href="index.htm">Inhaltsverzeichnis</a></td>\r
+    <td align="right"><a href="#">nach oben</a></td>\r
+  </tr>\r
+</table>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/de/images/insert_image_window.gif b/webcit/tiny_mce/themes/advanced/docs/de/images/insert_image_window.gif
new file mode 100644 (file)
index 0000000..751de28
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/de/images/insert_image_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/de/images/insert_link_window.gif b/webcit/tiny_mce/themes/advanced/docs/de/images/insert_link_window.gif
new file mode 100644 (file)
index 0000000..14871d7
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/de/images/insert_link_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/de/index.htm b/webcit/tiny_mce/themes/advanced/docs/de/index.htm
new file mode 100644 (file)
index 0000000..d0d39e1
--- /dev/null
@@ -0,0 +1,24 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Inhaltsverzeichnis der Hilfe</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+<BODY onload="window.focus();">\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Inhaltsverzeichnis</span></td>\r
+    <td align="right">&nbsp;</td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Klicken Sie auf die untenstehenden Links um die verschiedenen Bereiche der Hilfe zu betrachten. \r
+<ul class="toc_ul">\r
+  <li class="toc_li"><a href="about.htm">&Uuml;ber TinyMCE</a></li>\r
+  <li class="toc_li"><a href="common_buttons.htm">Allgemeine Schaltfl&auml;chen</a></li>\r
+  <li class="toc_li"><a href="insert_image_button.htm">Schaltfl&auml;che Bild einf&uuml;gen</a></li>\r
+  <li class="toc_li"><a href="insert_link_button.htm">Schaltfl&auml;che Hyperlink einf&uuml;gen</a></li>\r
+</ul>\r
+<hr noshade>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/de/insert_image_button.htm b/webcit/tiny_mce/themes/advanced/docs/de/insert_image_button.htm
new file mode 100644 (file)
index 0000000..7fcb2c6
--- /dev/null
@@ -0,0 +1,33 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Schaltfl&auml;che Bild einf&uuml;gen</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Schaltfl&auml;che Bild einf&uuml;gen</span></td>\r
+    <td align="right"><a href="index.htm">Inhalt</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Die Schaltfl&auml;che &quot;Bild einf&uuml;gen&quot; &ouml;ffnet das unten gezeigte Fenster.<br>\r
+<br>\r
+<img src="images/insert_image_window.gif" width="350" height="166"><br>\r
+<br>\r
+Sie geben einfach die URL zu dem Bild ein, das Sie verknüpfen möchten und eine\r
+Beschreibung des Bildes, welche dann als alternative Textbeschreibung verwendet wird.\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Gehe zu: <a href="index.htm">Inhaltsverzeichnis</a></td>\r
+    <td align="right"><a href="#">nach oben</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/de/insert_link_button.htm b/webcit/tiny_mce/themes/advanced/docs/de/insert_link_button.htm
new file mode 100644 (file)
index 0000000..fbbd54f
--- /dev/null
@@ -0,0 +1,34 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Schaltfl&auml;che Hyperlink einf&uuml;gen</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Schaltfl&auml;che Hyperlink einf&uuml;gen</span></td>\r
+    <td align="right"><a href="index.htm">Inhalt</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Diese Schaltfl&auml;che &ouml;ffnet das Fenster f&uuml;r die &quot;Hyperlink einf&uuml;gen / bearbeiten&quot;-Funktion.<br>\r
+<br>\r
+<img src="images/insert_link_window.gif" width="330" height="166"><br>\r
+<br>\r
+Zwei Felder sind in diesem Fenster auszufüllen. Das Erste, &quot;Hyperlink URL&quot;, ist f&uuml;r\r
+die URL der Verknüpfung. Das &quot;Ziel&quot; erlaubt Ihnen auszuwählen wie die Verkn&uuml;pfung\r
+ge&ouml;ffnet werden soll.\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Gehe zu: <a href="index.htm">Inhaltsverzeichnis</a></td>\r
+    <td align="right"><a href="#">nach oben</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/de/style.css b/webcit/tiny_mce/themes/advanced/docs/de/style.css
new file mode 100644 (file)
index 0000000..722f537
--- /dev/null
@@ -0,0 +1,28 @@
+body { background-color: #FFFFFF; }\r
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }\r
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }\r
+.subtitle { font-size: 12px; font-weight: bold; }\r
+\r
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }\r
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }\r
+img { border: #000000 solid 1px; }\r
+\r
+a:visited { color: #666666; text-decoration: underline; }\r
+a:active { color: #666666; text-decoration: underline; }\r
+a:hover { color: #666666; text-decoration: underline; }\r
+a { color: #666666; text-decoration: underline; }\r
+\r
+.pageheader { border: #E0E0E0 solid 1px; }\r
+.pagefooter { border: #E0E0E0 solid 1px; }\r
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.samplecontent { font-size: 10px; }\r
+\r
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.codecontent { font-size: 10px; }\r
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }\r
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }\r
+\r
+hr { height: 1px; }\r
+\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/en/about.htm b/webcit/tiny_mce/themes/advanced/docs/en/about.htm
new file mode 100644 (file)
index 0000000..a6957a6
--- /dev/null
@@ -0,0 +1,31 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>About TinyMCE</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">About TinyMCE</span></td>\r
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+TinyMCE is a small WYSIWYG editor control for web browsers such as MSIE or Mozilla \r
+that enables you to edit HTML contents in a more user friendly way. It has common \r
+features that are found in most word processors and should not be difficult to \r
+use.<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Go to: <a href="index.htm">Table of contents</a></td>\r
+    <td align="right"><a href="#">Top</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/en/common_buttons.htm b/webcit/tiny_mce/themes/advanced/docs/en/common_buttons.htm
new file mode 100644 (file)
index 0000000..a3bab47
--- /dev/null
@@ -0,0 +1,162 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Common buttons</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Common buttons</span></td>\r
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Below is a short description about each button.\r
+<br>\r
+<br>\r
+<table border="1" cellpadding="3" cellspacing="0">\r
+  <tr>\r
+    <td><img src="../../images/bold.gif" width="20" height="20" alt="Bold text icon" /></td>\r
+    <td>Bold text style (Ctrl+B).</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/italic.gif" width="20" height="20" alt="Italic text icon" /></td>\r
+    <td>Italic text style (Ctrl+I).</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/underline.gif" width="20" height="20" alt="Underline text icon." /></td>\r
+    <td>Underline text style (Ctrl+U).</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/strikethrough.gif" width="20" height="20" alt="Strikethrough text icon." /></td>\r
+    <td>Strikethrough text style.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyleft.gif" width="20" height="20" alt="Align left icon." /></td>\r
+    <td>Align left.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifycenter.gif" width="20" height="20" alt="Align center icon." /></td>\r
+    <td>Align center.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyright.gif" width="20" height="20" alt="Align right icon." /></td>\r
+    <td>Align right.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyfull.gif" width="20" height="20" alt="Align full icon." /></td>\r
+    <td>Align full.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/bullist.gif" width="20" height="20" alt="Unordered list/bullet list icon." /></td>\r
+    <td>Unordered list/bullet list.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/numlist.gif" width="20" height="20" alt="Ordered list/numbered list icon." /></td>\r
+    <td>Ordered list/numbered list</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/outdent.gif" width="20" height="20" alt="Outdent/decrease indentation icon." /></td>\r
+    <td>Outdent/decrease indentation.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/indent.gif" width="20" height="20" alt="Indent/increase indentation icon." /></td>\r
+    <td>Indent/increase indentation.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/undo.gif" width="20" height="20" alt="Undo the last operation." /></td>\r
+    <td>Undo the last operation (Ctrl+Z).</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/redo.gif" width="20" height="20" alt="Redo the last operation icon." /></td>\r
+    <td>Redo the last operation (Ctrl+Y).</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/link.gif" width="20" height="20" alt="Insert a new link icon." /></td>\r
+    <td>Insert a new link, read more about this function in the <a href="insert_link_button.htm">Insert \r
+      link section</a>.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/unlink.gif" width="20" height="20" alt="Unlinks the current selection icon." /></td>\r
+    <td>Unlinks the current selection/removes all selected links.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/anchor.gif" width="20" height="20" alt="Insert a new anchor icon." /></td>\r
+    <td>Insert a new anchor, read more about this function in the <a href="insert_anchor_button.htm">Insert anchor section.</a></td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/image.gif" width="20" height="20" alt="Insert a new image icon." /></td>\r
+    <td>Insert a new image, read more about this function in the <a href="insert_image_button.htm">Insert \r
+      image section</a>.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/cleanup.gif" width="20" height="20" alt="Cleanup code icon." /></td>\r
+    <td>Cleanup code/Removes unwanted formating. This function is useful when \r
+      you copy contents from for example a office product.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/help.gif" width="20" height="20" alt="Show help icon." /></td>\r
+    <td>Shows this help window.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/code.gif" width="20" height="20" alt="Source code editor icon." /></td>\r
+    <td>Opens HTML source code editor. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table.gif" width="20" height="20" alt="Insert table icon." /></td>\r
+    <td>Inserts a new table at the current location. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_row_before.gif" width="20" height="20" alt="Adds a row above icon." /></td>\r
+    <td>Adds a row above the current one. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_row_after.gif" width="20" height="20" alt="Adds a row under icon." /></td>\r
+    <td>Adds a row under the current one. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_delete_row.gif" width="20" height="20" alt="Remove row icon." /></td>\r
+    <td>Removes the row. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_col_before.gif" width="20" height="20" alt="Add column before icon." /></td>\r
+    <td>Adds a column before the current one.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_col_after.gif" width="20" height="20" alt="Add column after icon." /></td>\r
+    <td>Adds a column after the current one.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_delete_col.gif" width="20" height="20" alt="Remove column icon." /></td>\r
+    <td>Removes the current column.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/hr.gif" width="20" height="20" alt="Insert horizontal ruler icon." /></td>\r
+    <td>Inserts a new horizontal ruler </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/removeformat.gif" width="20" height="20" alt="Remove formatting icon." /></td>\r
+    <td>Removes formatting from the selection. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/sub.gif" width="20" height="20" alt="Subscript icon." /></td>\r
+    <td>Makes the selection to be subscript. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/sup.gif" width="20" height="20" alt="Superscript icon." /></td>\r
+    <td>Makes the selection to be superscripted. </td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<hr noshade="noshade" />\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Go to: <a href="index.htm">Table of contents</a></td>\r
+    <td align="right"><a href="#">Top</a></td>\r
+  </tr>\r
+</table>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/en/create_accessible_content.htm b/webcit/tiny_mce/themes/advanced/docs/en/create_accessible_content.htm
new file mode 100644 (file)
index 0000000..f4070a3
--- /dev/null
@@ -0,0 +1,45 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Insert table button</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Create accessible content</span></td>\r
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<p>TinyMCE can create HTML content that will be accessible to all users, including those with disabilities using assistive technologies, as well as those using text-based browsers, or those browsing the Web with images turned off. </p>\r
+\r
+<p><strong>Things you can do to make your content accessible:</strong></p>\r
+<ol>\r
+<li><strong>Include an Image Description:</strong> Blind users, or others who are unable to view images, will rely on the Image Description (or Alt text) to take the place of the image. If an image contains no meaning, such as a decoration or a spacer image, leave the Image Description empty. TinyMCE will then insert an empty Alt text attribute that will force assistive technologies to ignore the image. <br /><br /></li>\r
+\r
+<li> <strong>Add Scope to data table header cells:</strong> In the table cell editor dialog window, choose a Scope when creating Header cells so the column or row label in that cell becomes explicitely associated with its data cells. Table cell headers will then be announced with each data cell, making it easier for blind users using a screen reader to understand what the content of each cell represents. <br /><br /></li>\r
+\r
+<li><strong> Structure content with properly nested headings:</strong> In the format selection menu choose Heading 1 to Heading 6 to represent headings in your content,  rather than using other font formating options. Blind users using a screen reader can then extract the headings from the page to generate a summary of the content it contains, and use those headings to navigate quickly to subsections within the page.<br /><br /></li>\r
+\r
+<li><strong> Include alternate content:</strong> Create an alternate page for non-HTML content such as Flash, Java applets, or  embedded movies. This might be a static image, with a description of the image, and a description of the content that would have appeared in its place. An alternate HTML page could also be created, and a link to it included next to the non-HTML object. This will ensure that the content will be accessible to users of assistive technologies that can not view or play the content, and ensure the content will be available to those who do not have the appropriate plugin or helper application installed.<br /><br /></li>\r
+\r
+<li><strong> Check accessbility: </strong> When the AChecker plugin is installed with TinyMCE, click on the Check Accessibility button to generate a report of potential accessibility problems.<br /><br /></li>\r
+\r
+</ol>\r
+\r
+<p>See the <a href="http://checker.atrc.utoronto.ca" target="_new">AChecker Web Site</a> for further details about creating content that will be accessible to all users.<br />\r
+</p>\r
+\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Go to: <a href="index.htm">Table of contents</a></td>\r
+    <td align="right"><a href="#">Top</a></td>\r
+  </tr>\r
+</table>\r
+\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/en/images/insert_anchor_window.gif b/webcit/tiny_mce/themes/advanced/docs/en/images/insert_anchor_window.gif
new file mode 100644 (file)
index 0000000..5b5f528
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/en/images/insert_anchor_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/en/images/insert_image_window.gif b/webcit/tiny_mce/themes/advanced/docs/en/images/insert_image_window.gif
new file mode 100644 (file)
index 0000000..cdc617e
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/en/images/insert_image_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/en/images/insert_link_window.gif b/webcit/tiny_mce/themes/advanced/docs/en/images/insert_link_window.gif
new file mode 100644 (file)
index 0000000..7bad758
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/en/images/insert_link_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/en/images/insert_table_window.gif b/webcit/tiny_mce/themes/advanced/docs/en/images/insert_table_window.gif
new file mode 100644 (file)
index 0000000..6a032c5
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/en/images/insert_table_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/en/index.htm b/webcit/tiny_mce/themes/advanced/docs/en/index.htm
new file mode 100644 (file)
index 0000000..9810a93
--- /dev/null
@@ -0,0 +1,27 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Help Index</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+<BODY onload="window.focus();">\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Table of contents</span></td>\r
+    <td align="right">&nbsp;</td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Click the links below to go to the different help sections. \r
+<ul class="toc_ul">\r
+  <li class="toc_li"><a href="about.htm">About TinyMCE</a></li>\r
+  <li class="toc_li"><a href="common_buttons.htm">Common buttons</a></li>\r
+  <li class="toc_li"><a href="insert_image_button.htm">Insert image button</a></li>\r
+  <li class="toc_li"><a href="insert_link_button.htm">Insert link button</a></li>\r
+  <li class="toc_li"><a href="insert_anchor_button.htm">Insert anchor button</a></li>\r
+  <li class="toc_li"><a href="insert_table_button.htm">Insert table button</a></li>\r
+ <li class="toc_li"><a href="create_accessible_content.htm">Create accessible content</a></li>\r
+</ul>\r
+<hr noshade>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/en/insert_anchor_button.htm b/webcit/tiny_mce/themes/advanced/docs/en/insert_anchor_button.htm
new file mode 100644 (file)
index 0000000..332cbc6
--- /dev/null
@@ -0,0 +1,32 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Insert anchor button</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Insert anchor button</span></td>\r
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+This button opens a new window with the insert/edit anchor function.<br>\r
+<br>\r
+<img src="images/insert_anchor_window.gif" width="330" height="139" alt="Anchor dialog/window" /><br>\r
+<br>\r
+There are one field in this window, this is where you enter the name of you anchor point. Remember the anchor name needs to be unique. <br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Go to: <a href="index.htm">Table of contents</a></td>\r
+    <td align="right"><a href="#">Top</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/en/insert_image_button.htm b/webcit/tiny_mce/themes/advanced/docs/en/insert_image_button.htm
new file mode 100644 (file)
index 0000000..1529648
--- /dev/null
@@ -0,0 +1,65 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Insert image button</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Insert image button</span></td>\r
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+The insert image button opens the window shown below.<br>\r
+<br>\r
+<img src="images/insert_image_window.gif" alt="Insert image dialog/window" /><br>\r
+<br>\r
+You simply enter a URL to the image you want to link to and enter a image description, \r
+this is then displayed as an alternative text descripton of the image on the page.<br>\r
+<br>\r
+<strong>Field descriptions:</strong><br>\r
+<table border="1" cellspacing="0">\r
+  <tr>\r
+    <td width="150"><strong>Image URL </strong></td>\r
+    <td>URL/path to the image.</td>\r
+  </tr>\r
+  <tr>\r
+    <td width="150"><strong>Image description </strong></td>\r
+    <td>Alternative description of image contents.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Dimentions</strong></td>\r
+    <td>Image width/height. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Alignment</strong></td>\r
+    <td>Image alignment, useful when wrapping text around images.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Border</strong></td>\r
+    <td>Border thickness. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>VSpace</strong></td>\r
+    <td>Vertical space, useful when wrapping text around images.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>HSpace</strong></td>\r
+    <td>Horizontal space, useful when wrapping text around images.</td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Go to: <a href="index.htm">Table of contents</a></td>\r
+    <td align="right"><a href="#">Top</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/en/insert_link_button.htm b/webcit/tiny_mce/themes/advanced/docs/en/insert_link_button.htm
new file mode 100644 (file)
index 0000000..4f64450
--- /dev/null
@@ -0,0 +1,33 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Insert link button</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Insert link button</span></td>\r
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+This button opens a new window with the insert/edit link function.<br>\r
+<br>\r
+<img src="images/insert_link_window.gif" width="330" height="159" alt="Insert link dialog/window" /><br>\r
+<br>\r
+There are two fields in this window the first one &quot;Link URL&quot; is the \r
+URL of the link. The target enables you to select how the link is to be opened.<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Go to: <a href="index.htm">Table of contents</a></td>\r
+    <td align="right"><a href="#">Top</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/en/insert_table_button.htm b/webcit/tiny_mce/themes/advanced/docs/en/insert_table_button.htm
new file mode 100644 (file)
index 0000000..f352a05
--- /dev/null
@@ -0,0 +1,71 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Insert table button</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Insert table button</span></td>\r
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+The insert table button opens the window shown below. This action enables you to create tables. <br>\r
+<br>\r
+<img src="images/insert_table_window.gif" width="340" height="229" alt="Image of table window" /><br>\r
+<br>\r
+<strong>Field descriptions:</strong><br>\r
+<table border="1" cellspacing="0">\r
+  <tr>\r
+    <td width="150"><strong>Columns</strong></td>\r
+    <td>Number of columns in the  table. </td>\r
+  </tr>\r
+  <tr>\r
+    <td width="150"><strong>Rows</strong></td>\r
+    <td>Number of rows in the new table.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Cellpadding</strong></td>\r
+    <td>Cellpadding of the table . </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Cellspacing</strong></td>\r
+    <td>Cellspacing of the table .</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Alignment</strong></td>\r
+    <td>Table alignment . </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Border</strong></td>\r
+    <td>Border thinkness of table.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Width</strong></td>\r
+    <td>Width in pixels of table .</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Height</strong></td>\r
+    <td>Height in pixels of table.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Class</strong></td>\r
+    <td>Style or CSS class of table.</td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Go to: <a href="index.htm">Table of contents</a></td>\r
+    <td align="right"><a href="#">Top</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/en/style.css b/webcit/tiny_mce/themes/advanced/docs/en/style.css
new file mode 100644 (file)
index 0000000..722f537
--- /dev/null
@@ -0,0 +1,28 @@
+body { background-color: #FFFFFF; }\r
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }\r
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }\r
+.subtitle { font-size: 12px; font-weight: bold; }\r
+\r
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }\r
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }\r
+img { border: #000000 solid 1px; }\r
+\r
+a:visited { color: #666666; text-decoration: underline; }\r
+a:active { color: #666666; text-decoration: underline; }\r
+a:hover { color: #666666; text-decoration: underline; }\r
+a { color: #666666; text-decoration: underline; }\r
+\r
+.pageheader { border: #E0E0E0 solid 1px; }\r
+.pagefooter { border: #E0E0E0 solid 1px; }\r
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.samplecontent { font-size: 10px; }\r
+\r
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.codecontent { font-size: 10px; }\r
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }\r
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }\r
+\r
+hr { height: 1px; }\r
+\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/es/about.htm b/webcit/tiny_mce/themes/advanced/docs/es/about.htm
new file mode 100644 (file)
index 0000000..055c820
--- /dev/null
@@ -0,0 +1,28 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Acerca de TinyMCE</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Acerca de  TinyMCE</span></td>\r
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+TinyMCE es un editor WYSIWYG para navegadores como  MSIE o Mozilla que te permite editar el contenido HTML de una manera m&aacute;s amigable. Tiene la mayor&iacute;a de las opciones de un procesador de texto y no deber&iacute;a ser dificil de usar.<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Ir a: <a href="index.htm">Lista de contenidos</a></td>\r
+    <td align="right"><a href="#">Top</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/es/common_buttons.htm b/webcit/tiny_mce/themes/advanced/docs/es/common_buttons.htm
new file mode 100644 (file)
index 0000000..458a4fd
--- /dev/null
@@ -0,0 +1,155 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Botones de uso com&uacute;n</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Botones de uso com&uacute;n</span></td>\r
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Peque&ntilde;a descripci&oacute;n de cada boto&oacute;n.<img src="../../images/spacer.gif" width="1" height="1"> \r
+<br>\r
+<br>\r
+<table border="1" cellpadding="3" cellspacing="0">\r
+  <tr>\r
+    <td><img src="../../images/bold.gif" width="20" height="20"></td>\r
+    <td>Texto en negrita.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/italic.gif" width="20" height="20"></td>\r
+    <td>Texto en cursiva.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/underline.gif" width="20" height="20"></td>\r
+    <td>Texto subrayado.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/strikethrough.gif" width="20" height="20"></td>\r
+    <td>Texto tachado.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyleft.gif" width="20" height="20"></td>\r
+    <td>Alinear a la izquierda.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifycenter.gif" width="20" height="20"></td>\r
+    <td>Alinear al centro.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyright.gif" width="20" height="20"></td>\r
+    <td>Alinear a la derecha.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyfull.gif" width="20" height="20"></td>\r
+    <td>Alinear justificado.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/bullist.gif" width="20" height="20"></td>\r
+    <td>Lista desordenada/lista por puntos.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/numlist.gif" width="20" height="20"></td>\r
+    <td>Lista ordenada/lista numerada</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/outdent.gif" width="20" height="20"></td>\r
+    <td>Disminuir la sangr&iacute;a.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/indent.gif" width="20" height="20"></td>\r
+    <td>Aumentar la sangr&iacute;a.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/undo.gif" width="20" height="20"></td>\r
+    <td>Deshacer la &uacute;ltima operaci&oacute;n.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/redo.gif" width="20" height="20"></td>\r
+    <td>Rehacer la &uacute;ltima operaci&oacute;n.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/link.gif" width="20" height="20"></td>\r
+    <td>Insertar un enlace, m&aacute;s informaci&oacute;n en <a href="insert_link_button.htm">insertar enlace</a>.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/unlink.gif" width="20" height="20"></td>\r
+    <td>Quita el enlace al texto seleccionado.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/image.gif" width="20" height="20"></td>\r
+    <td>Insertar un imagen, m&aacute;s informaci&oacute;n en <a href="insert_image_button.htm">insertar imagen</a>.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/cleanup.gif" width="20" height="20"></td>\r
+    <td>Limpiar c&oacute;digo, esta funci&oacute;n es &uacute;til cuando copias el c&oacute;digo de otra p&aacute;gina.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/help.gif" width="20" height="20"></td>\r
+    <td>Muestra esta ventana de ayuda.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/code.gif" width="20" height="20"></td>\r
+    <td>Abre el editor de HTML. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table.gif" width="20" height="20"></td>\r
+    <td>Inserta una nueva tabla de 2x2. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_row_before.gif" width="20" height="20"></td>\r
+    <td>A&ntilde;ade una fila encima. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_row_after.gif" width="20" height="20"></td>\r
+    <td>A&ntilde;ade una fila debajo. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_delete_row.gif" width="20" height="20"></td>\r
+    <td>Elimina una fila. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_col_before.gif" width="20" height="20"></td>\r
+    <td>A&ntilde;ade una columna antes de la actual .</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_col_after.gif" width="20" height="20"></td>\r
+    <td>A&ntilde;ade una columna despu&eacute;s de la actual.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_delete_col.gif" width="20" height="20"></td>\r
+    <td>Elimina la columna actual.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/hr.gif" width="20" height="20"></td>\r
+    <td>Inserta un separador horizontal </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/removeformat.gif" width="20" height="20"></td>\r
+    <td>Elimina el formato de la selecci&oacute;n. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/sub.gif" width="20" height="20"></td>\r
+    <td>Sub&iacute;ndice. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/sup.gif" width="20" height="20"></td>\r
+    <td>Super&iacute;ndice. </td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Ir a: <a href="index.htm">Lista de contenidos</a></td>\r
+    <td align="right"><a href="#">Top</a></td>\r
+  </tr>\r
+</table>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/es/images/insert_image_window.gif b/webcit/tiny_mce/themes/advanced/docs/es/images/insert_image_window.gif
new file mode 100644 (file)
index 0000000..cdc617e
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/es/images/insert_image_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/es/images/insert_link_window.gif b/webcit/tiny_mce/themes/advanced/docs/es/images/insert_link_window.gif
new file mode 100644 (file)
index 0000000..7bad758
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/es/images/insert_link_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/es/images/insert_table_window.gif b/webcit/tiny_mce/themes/advanced/docs/es/images/insert_table_window.gif
new file mode 100644 (file)
index 0000000..5e8497f
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/es/images/insert_table_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/es/index.htm b/webcit/tiny_mce/themes/advanced/docs/es/index.htm
new file mode 100644 (file)
index 0000000..081f039
--- /dev/null
@@ -0,0 +1,25 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>&Iacute;ndice de la ayuda</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+<BODY onload="window.focus();">\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Lista de contenidos</span></td>\r
+    <td align="right">&nbsp;</td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Selecciona una secci&oacute;n para ver la ayuda. \r
+<ul class="toc_ul">\r
+  <li class="toc_li"><a href="about.htm">Acerca de  TinyMCE</a></li>\r
+  <li class="toc_li"><a href="common_buttons.htm">Botones</a></li>\r
+  <li class="toc_li"><a href="insert_image_button.htm">Insertar imagen</a></li>\r
+  <li class="toc_li"><a href="insert_link_button.htm">Insertar enlaces</a></li>\r
+  <li class="toc_li"><a href="insert_table_button.htm">Insertar tabla</a></li>\r
+</ul>\r
+<hr noshade>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/es/insert_image_button.htm b/webcit/tiny_mce/themes/advanced/docs/es/insert_image_button.htm
new file mode 100644 (file)
index 0000000..fdaa1a0
--- /dev/null
@@ -0,0 +1,64 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Insertar imagen</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Insertar imagen</span></td>\r
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+El bot&oacute;n insertar imagen abre la siguiente ventana.<br>\r
+<br>\r
+<img src="images/insert_image_window.gif"><br>\r
+<br>\r
+Tu s&oacute;lo tienes que escribir la URL de la imagen que quieres que aparezca y escribir una descripci&oacute;n de esta, esta descripci&oacute;n aparecera como un texto alternativo que describa la imagen.<br>\r
+<br>\r
+<strong>Descripci&oacute;n de los campos:</strong><br>\r
+<table border="1" cellspacing="0">\r
+  <tr>\r
+    <td width="150"><strong>Image URL </strong></td>\r
+    <td>URL de la imagen.</td>\r
+  </tr>\r
+  <tr>\r
+    <td width="150"><strong>Image description </strong></td>\r
+    <td>Descripci&oacute;n alternativa del contenido de la imagen.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Dimentions</strong></td>\r
+    <td>Altura/anchura de la imagen. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Alignment</strong></td>\r
+    <td>Alineamiento, &uacute;til cuando colocas texto alrededor de la imagen.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Border</strong></td>\r
+    <td>Anchura del borde. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>VSpace</strong></td>\r
+    <td>Espacio vertical, &uacute;til cuando colocas texto alrededor de la imagen.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>HSpace</strong></td>\r
+    <td>Espacio horizontal, &uacute;til cuando colocas texto alrededor de la imagen.</td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Ir a: <a href="index.htm">Lista de contenidos</a></td>\r
+    <td align="right"><a href="#">Top</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/es/insert_link_button.htm b/webcit/tiny_mce/themes/advanced/docs/es/insert_link_button.htm
new file mode 100644 (file)
index 0000000..0993035
--- /dev/null
@@ -0,0 +1,32 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Insertar enlaces</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Insertar enlaces</span></td>\r
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Este bot&oacute;n abre una nueva ventana con la funci&oacute;n insertar/editar enlace.<br>\r
+<br>\r
+<img src="images/insert_link_window.gif" width="330" height="159"><br>\r
+<br>\r
+Hay dos campos en esta ventana, el primero &quot;Link URL&quot; es donde hay que escribir la direcci&oacute;n del enlace. El segundo &quot;Target&quot; indica c&oacute;mo se abrir&aacute; el enlace.<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Ir a: <a href="index.htm">Lista de contenidos</a></td>\r
+    <td align="right"><a href="#">Top</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/es/insert_table_button.htm b/webcit/tiny_mce/themes/advanced/docs/es/insert_table_button.htm
new file mode 100644 (file)
index 0000000..5950e48
--- /dev/null
@@ -0,0 +1,67 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Insertar tabla</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Insertar tabla</span></td>\r
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+El bot&oacute;n insertar tabla abre la siguiente ventana. Esta acci&ocaute;n te permite crear tablas.<br>\r
+<br>\r
+<img src="images/insert_table_window.gif" width="340" height="209"><br>\r
+<br>\r
+<strong>Descripci&oacute;n de los campos:</strong><br>\r
+<table border="1" cellspacing="0">\r
+  <tr>\r
+    <td width="150"><strong>Columns</strong></td>\r
+    <td>N&uacute;mero de columnas.</td>\r
+  </tr>\r
+  <tr>\r
+    <td width="150"><strong>Rows</strong></td>\r
+    <td>NA&uacute;mero de filas.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Cellpadding</strong></td>\r
+    <td>Desplazamiento entre celdas . </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Cellspacing</strong></td>\r
+    <td>Espacio entre celdas .</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Alignment</strong></td>\r
+    <td>Alineamiento de la tabla. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Border</strong></td>\r
+    <td>Anchura del borde de la tabla.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Width</strong></td>\r
+    <td>Anchura de la tabla en pixels .</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Height</strong></td>\r
+    <td>Altura de la tabla en pixels.</td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Ir a: <a href="index.htm">Tabla de contenidos</a></td>\r
+    <td align="right"><a href="#">Top</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/es/style.css b/webcit/tiny_mce/themes/advanced/docs/es/style.css
new file mode 100644 (file)
index 0000000..722f537
--- /dev/null
@@ -0,0 +1,28 @@
+body { background-color: #FFFFFF; }\r
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }\r
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }\r
+.subtitle { font-size: 12px; font-weight: bold; }\r
+\r
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }\r
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }\r
+img { border: #000000 solid 1px; }\r
+\r
+a:visited { color: #666666; text-decoration: underline; }\r
+a:active { color: #666666; text-decoration: underline; }\r
+a:hover { color: #666666; text-decoration: underline; }\r
+a { color: #666666; text-decoration: underline; }\r
+\r
+.pageheader { border: #E0E0E0 solid 1px; }\r
+.pagefooter { border: #E0E0E0 solid 1px; }\r
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.samplecontent { font-size: 10px; }\r
+\r
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.codecontent { font-size: 10px; }\r
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }\r
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }\r
+\r
+hr { height: 1px; }\r
+\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/fi/about.htm b/webcit/tiny_mce/themes/advanced/docs/fi/about.htm
new file mode 100644 (file)
index 0000000..75df8e5
--- /dev/null
@@ -0,0 +1,28 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>About TinyMCE</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Lisätietoa TinyMCE:stä</span></td>\r
+    <td align="right"><a href="index.htm">Sisällysluettelo</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+TinyMCE on pieni WYSIWYG sisällönmuokkausohjain webbiselaimille kuten MSIE tai Mozilla joka mahdollistaa HTML sisällön muokkauksen käyttäjäystävällisellä tavalla. Se tarjoaa yleiset tekstinkäsittelyohjelmien tarjoamat toiminnot eikä ole vaikea käyttää.<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Mene: <a href="index.htm">Sisällysluetteloon</a></td>\r
+    <td align="right"><a href="#">Alkuun</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/fi/common_buttons.htm b/webcit/tiny_mce/themes/advanced/docs/fi/common_buttons.htm
new file mode 100644 (file)
index 0000000..7d423df
--- /dev/null
@@ -0,0 +1,156 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Common buttons</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Yleiset napit</span></td>\r
+    <td align="right"><a href="index.htm">Sisällysluettelo</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Alla on lyhyt selostus kaikista toimintonapeista.<img src="../../images/spacer.gif" width="1" height="1"> \r
+<br>\r
+<br>\r
+<table border="1" cellpadding="3" cellspacing="0">\r
+  <tr>\r
+    <td><img src="../../images/bold.gif" width="20" height="20"></td>\r
+    <td>Lihavointi.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/italic.gif" width="20" height="20"></td>\r
+    <td>Kursivointi.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/underline.gif" width="20" height="20"></td>\r
+    <td>Alleviivaus.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/strikethrough.gif" width="20" height="20"></td>\r
+    <td>Yliviivaus.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyleft.gif" width="20" height="20"></td>\r
+    <td>vasen tasaus.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifycenter.gif" width="20" height="20"></td>\r
+    <td>Keskitys.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyright.gif" width="20" height="20"></td>\r
+    <td>Oikea tasaus.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyfull.gif" width="20" height="20"></td>\r
+    <td>Pakotettu tasaus.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/bullist.gif" width="20" height="20"></td>\r
+    <td>Järjestämätön lista.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/numlist.gif" width="20" height="20"></td>\r
+    <td>Järjestetty lista/numeroitu lista</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/outdent.gif" width="20" height="20"></td>\r
+    <td>Poista / vähennä sisennystä.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/indent.gif" width="20" height="20"></td>\r
+    <td>Sisennä.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/undo.gif" width="20" height="20"></td>\r
+    <td>Peruuta viimeinen muutos.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/redo.gif" width="20" height="20"></td>\r
+    <td>Tee uudelleen viimeinen peruutettu muutos.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/link.gif" width="20" height="20"></td>\r
+    <td>Lisää linkki. Lisätietoa tästä toiminnosta <a href="insert_link_button.htm">lisää linkki -osiosta</a>.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/unlink.gif" width="20" height="20"></td>\r
+    <td>Poista linkki valitusta tekstistä.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/image.gif" width="20" height="20"></td>\r
+    <td>Lisää kuva. Lue lisää tästä toiminnosta <a href="insert_image_button.htm"> lisää kuva -osiosta</a>.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/cleanup.gif" width="20" height="20"></td>\r
+    <td>Siisti koodi. Tämä toiminto on käytännöllinen kun liität tekstiä toimistosovelluksista.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/help.gif" width="20" height="20"></td>\r
+    <td>Näyttäää tämän apuikkunan.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/code.gif" width="20" height="20"></td>\r
+    <td>Avaa HTML lähdekoodieditorin. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table.gif" width="20" height="20"></td>\r
+    <td>Lisää tualu. Lue lisää tästä toiminnosta <a href="insert_table_button.htm"> lisää taulu -osiosta</a>. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_row_before.gif" width="20" height="20"></td>\r
+    <td>Lisää rivi valitun rivin edelle. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_row_after.gif" width="20" height="20"></td>\r
+    <td>Lisää rivi valitun rivin jälkeen. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_delete_row.gif" width="20" height="20"></td>\r
+    <td>Poista valittu rivi. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_col_before.gif" width="20" height="20"></td>\r
+    <td>Lisää saraka valitun sarakkeen jälkeen.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_col_after.gif" width="20" height="20"></td>\r
+    <td>Lisää sarake valitun sarakkeen edelle.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_delete_col.gif" width="20" height="20"></td>\r
+    <td>Poistaa valitun sarakkeen.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/hr.gif" width="20" height="20"></td>\r
+    <td>Lisää vaakaviiva. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/removeformat.gif" width="20" height="20"></td>\r
+    <td>Poista muotoilu valitusta tekstistä. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/sub.gif" width="20" height="20"></td>\r
+    <td>Tekee valitusta tekstistä alamääreistä. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/sup.gif" width="20" height="20"></td>\r
+    <td>Tekee valitusta tekstistä ylämääreistä. </td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Mene: <a href="index.htm">Sisällysluetteloon</a></td>\r
+    <td align="right"><a href="#">Alkuun</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/fi/images/insert_image_window.gif b/webcit/tiny_mce/themes/advanced/docs/fi/images/insert_image_window.gif
new file mode 100644 (file)
index 0000000..29dc616
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/fi/images/insert_image_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/fi/images/insert_link_window.gif b/webcit/tiny_mce/themes/advanced/docs/fi/images/insert_link_window.gif
new file mode 100644 (file)
index 0000000..6406a6f
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/fi/images/insert_link_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/fi/images/insert_table_window.gif b/webcit/tiny_mce/themes/advanced/docs/fi/images/insert_table_window.gif
new file mode 100644 (file)
index 0000000..b243646
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/fi/images/insert_table_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/fi/index.htm b/webcit/tiny_mce/themes/advanced/docs/fi/index.htm
new file mode 100644 (file)
index 0000000..f047b99
--- /dev/null
@@ -0,0 +1,25 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Apua sisällysluettelo</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+<BODY onload="window.focus();">\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Sisällysluettelo</span></td>\r
+    <td align="right">&nbsp;</td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Napsauta alla olevista linkeistä mennäksesi eri osa-alueisiin. \r
+<ul class="toc_ul">\r
+  <li class="toc_li"><a href="about.htm">Lisätietoa TinyMCE:stä</a></li>\r
+  <li class="toc_li"><a href="common_buttons.htm">Toimintonapit</a></li>\r
+  <li class="toc_li"><a href="insert_image_button.htm">Kuvan lisäysnapit</a></li>\r
+  <li class="toc_li"><a href="insert_link_button.htm">Linkin lisäysnapit</a></li>\r
+  <li class="toc_li"><a href="insert_table_button.htm">Taulun lisäysnapit</a></li>\r
+</ul>\r
+<hr noshade>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/fi/insert_image_button.htm b/webcit/tiny_mce/themes/advanced/docs/fi/insert_image_button.htm
new file mode 100644 (file)
index 0000000..84628a8
--- /dev/null
@@ -0,0 +1,65 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Insert image button</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Lisää linkki -nappi</span></td>\r
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Lisää linkki -nappi avaa alla näkyvän ikkunan.<br>\r
+<br>\r
+<img src="images/insert_image_window.gif"><br>\r
+<br>\r
+Kirjoita haluamasi kuvan URL osoite ja lisää kuvalle selite. Selite näytetään vaihtoehtoisena selitteenä sivulla. \r
+<br>\r
+<br>\r
+<strong>Kenttien selitykset:</strong><br>\r
+<table border="1" cellspacing="0">\r
+  <tr>\r
+    <td width="150"><strong>Kuvan URL</strong></td>\r
+    <td>Kuvan URL tai polku.</td>\r
+  </tr>\r
+  <tr>\r
+    <td width="150"><strong>Kuvan selite</strong></td>\r
+    <td>Vaihtoehtoinen selite kuvan sisällöstä.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Ulottuvuudet</strong></td>\r
+    <td>Kuvan leveys ja korkeus. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Asettelu</strong></td>\r
+    <td>Kuvan asettelu, käytännöllinen kun halutaan tekstin rivittyvän kuvan ympärille.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Reuna</strong></td>\r
+    <td>Kuvaa ympäröivän reunan leveys. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Pystyväli</strong></td>\r
+    <td>Pystyväli, käytännöllinen kun halutaan tekstin rivittyvän kuvan ympärille.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Vaakaväli</strong></td>\r
+    <td>Vaakaväli, useful when wrapping text around images.</td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Mene: <a href="index.htm">Sisällysluetteloon</a></td>\r
+    <td align="right"><a href="#">Alkuun</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/fi/insert_link_button.htm b/webcit/tiny_mce/themes/advanced/docs/fi/insert_link_button.htm
new file mode 100644 (file)
index 0000000..857ef3a
--- /dev/null
@@ -0,0 +1,35 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Insert link button</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Lisää linkki</span></td>\r
+    <td align="right"><a href="index.htm">Sisällysluettelo</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Tämä nappi avaa uuden ikkunan jossa on linkin lisäys- ja muokkaustoiminnallisuus.<br>\r
+<br>\r
+<img src="images/insert_link_window.gif" width="336" height="208"><br>\r
+<br>\r
+\r
+Tässä ikkunassa on kaksi kenttää. Ensimmäinen kenttä, &quot;Linkin URL&quot;, on linkin osoittama URL -osoite. \r
+Toinen kenttä, &quot;kohde&quot;, vaikuttaa siihen miten linkki avataan. \r
+The target enables you to select how the link is to be opened.<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Mene: <a href="index.htm">Sisällysluetteloon</a></td>\r
+    <td align="right"><a href="#">Alkuun</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/fi/insert_table_button.htm b/webcit/tiny_mce/themes/advanced/docs/fi/insert_table_button.htm
new file mode 100644 (file)
index 0000000..8891a5b
--- /dev/null
@@ -0,0 +1,67 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Insert table button</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Lisää taulu -nappi</span></td>\r
+    <td align="right"><a href="index.htm">Sisällysluettelo</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Lisää taulu -nappi avaa alla näkyvän ikkunan. Tämä toimonto mahdollistaa taulujen luonnin.<br>\r
+<br>\r
+<img src="images/insert_table_window.gif" width="340" height="209"><br>\r
+<br>\r
+<strong>Kenttien selitteet:</strong><br>\r
+<table border="1" cellspacing="0">\r
+  <tr>\r
+    <td width="150"><strong>Sarakkeet</strong></td>\r
+    <td>Taulussa olevien saraakkeiden määrä. </td>\r
+  </tr>\r
+  <tr>\r
+    <td width="150"><strong>Rivit</strong></td>\r
+    <td>Taulussa olevien rivien määrä.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Solun reunan ja sisällön väli</strong></td>\r
+    <td>Taulun sisällä olevan solun reunan ja sisällön väli. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Solujen väli</strong></td>\r
+    <td>Taulun sisällä olevien solujen väli.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Asettelu</strong></td>\r
+    <td>Taulun asettelu. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Reuna</strong></td>\r
+    <td>Reunan leveys.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Leveys</strong></td>\r
+    <td>Taulun leveys pikseleinä.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Korkeus</strong></td>\r
+    <td>Taulun korkeus pikseleinä.</td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Mene: <a href="index.htm">Sisällysluetteloon</a></td>\r
+    <td align="right"><a href="#">Alkuun</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/fi/style.css b/webcit/tiny_mce/themes/advanced/docs/fi/style.css
new file mode 100644 (file)
index 0000000..722f537
--- /dev/null
@@ -0,0 +1,28 @@
+body { background-color: #FFFFFF; }\r
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }\r
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }\r
+.subtitle { font-size: 12px; font-weight: bold; }\r
+\r
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }\r
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }\r
+img { border: #000000 solid 1px; }\r
+\r
+a:visited { color: #666666; text-decoration: underline; }\r
+a:active { color: #666666; text-decoration: underline; }\r
+a:hover { color: #666666; text-decoration: underline; }\r
+a { color: #666666; text-decoration: underline; }\r
+\r
+.pageheader { border: #E0E0E0 solid 1px; }\r
+.pagefooter { border: #E0E0E0 solid 1px; }\r
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.samplecontent { font-size: 10px; }\r
+\r
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.codecontent { font-size: 10px; }\r
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }\r
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }\r
+\r
+hr { height: 1px; }\r
+\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/fr/about.htm b/webcit/tiny_mce/themes/advanced/docs/fr/about.htm
new file mode 100644 (file)
index 0000000..51d9e57
--- /dev/null
@@ -0,0 +1,32 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>&Agrave; propos de TinyMCE</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">&Agrave; propos de TinyMCE</span></td>\r
+    <td align="right"><a href="index.htm">Table des mati&egrave;res</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+TinyMCE est un petit &eacute;diteur "WYSIWYG" pour page Web comme MSIE ou Mozilla qui\r
+vous permet de manipuler du contenu HTML d'une fa&ccedil;on plus intuitive.\r
+Il est simple d'utilisation et poss&egrave;de les fonctionalit&eacute;s ls plus r&eacute;pendues que l'on peut retrouver dans\r
+les traitements de texte.\r
+<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Aller &agrave;: <a href="index.htm">Table des mati&egrave;res</a></td>\r
+    <td align="right"><a href="#">Haut de page</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/fr/common_buttons.htm b/webcit/tiny_mce/themes/advanced/docs/fr/common_buttons.htm
new file mode 100644 (file)
index 0000000..aa9c237
--- /dev/null
@@ -0,0 +1,160 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Outils communs</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Outils communs</span></td>\r
+    <td align="right"><a href="index.htm">Table des mati&egrave;res</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Ci-dessous une courte description de chacuns des outils.<img src="../../images/spacer.gif" width="1" height="1"> \r
+<br>\r
+<br>\r
+<table border="1" cellpadding="3" cellspacing="0">\r
+  <tr>\r
+    <td><img src="../../images/bold_fr.gif" width="20" height="20"></td>\r
+    <td>Met le texte s&eacute;lectionn&eacute; en gras.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/italic.gif" width="20" height="20"></td>\r
+    <td>Met le texte s&eacute;lectionn&eacute; en italique.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/underline.gif" width="20" height="20"></td>\r
+    <td>Souligne le texte s&eacute;lectionn&eacute;.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/strikethrough.gif" width="20" height="20"></td>\r
+    <td>Barre le texte s&eacute;lectionn&eacute;.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyleft.gif" width="20" height="20"></td>\r
+    <td>Alignement &agrave; gauche.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifycenter.gif" width="20" height="20"></td>\r
+    <td>Alignement au centr&eacute;.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyright.gif" width="20" height="20"></td>\r
+    <td>Alignement &agrave; droite.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyfull.gif" width="20" height="20"></td>\r
+    <td>Texte justifi&eacute;.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/bullist.gif" width="20" height="20"></td>\r
+    <td>Liste &agrave; puces.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/numlist.gif" width="20" height="20"></td>\r
+    <td>Liste num&eacute;rot&eacute;e</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/outdent.gif" width="20" height="20"></td>\r
+    <td>R&eacute;duit l'indentation.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/indent.gif" width="20" height="20"></td>\r
+    <td>Augmente l'indentation.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/undo.gif" width="20" height="20"></td>\r
+    <td>Annule la derni&egrave;re op&eacute;ration.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/redo.gif" width="20" height="20"></td>\r
+    <td>Refait la derni&egrave;re op&eacute;ration annul&eacute;e.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/link.gif" width="20" height="20"></td>\r
+    <td>Ins&egrave;re ou modifie un hyperlien. Allez &agrave; la page <a href="insert_link_button.htm">\r
+        Outil d'ajout d'hyperliens</a> pour plus de d&eacute;tails.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/unlink.gif" width="20" height="20"></td>\r
+    <td>Efface les hyperliens qui sont s&eacute;lection&eacute;es.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/image.gif" width="20" height="20"></td>\r
+    <td>Ins&egrave;re ou modifie une image. Allez &agrave; la page <a href="insert_image_button.htm">\r
+        Outil d'ajout d'images</a> pour plus de d&eacute;tails.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/cleanup.gif" width="20" height="20"></td>\r
+    <td>Nettoie le code et retire les param&egrave;tres non d&eacute;sir&eacute;s.  Cet outil\r
+    est tr&egrave;s utile lorsque vous copiez du contenu provenant de logiciels\r
+    de bureatique.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/help.gif" width="20" height="20"></td>\r
+    <td>Affiche cette page d'aide.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/code.gif" width="20" height="20"></td>\r
+    <td>Ouvre un &eacute;diteur permettant de modifier le code HTML. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table.gif" width="20" height="20"></td>\r
+    <td>Ins&egrave;re un nouveau tableau &agrave; la position actuelle.  Allez &agrave; la page <a href="insert_table_button.htm">\r
+        Outil d'ajout de tableau</a> pour plus de d&eacute;tails.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_row_before.gif" width="20" height="20"></td>\r
+    <td>Ajoute une ligne au tableau avant la ligne courante. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_row_after.gif" width="20" height="20"></td>\r
+    <td>Ajoute une ligne au tableau apr&egrave;s la ligne courante. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_delete_row.gif" width="20" height="20"></td>\r
+    <td>Supprime la ligne courante. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_col_before.gif" width="20" height="20"></td>\r
+    <td>Ajoute une colonne au tableau avant la colonne courante. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_col_after.gif" width="20" height="20"></td>\r
+    <td>Ajoute une colonne au tableau apr&egrave;s la colonne courante. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_delete_col.gif" width="20" height="20"></td>\r
+    <td>Supprime la colonne courante. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/hr.gif" width="20" height="20"></td>\r
+    <td>Ins&egrave;re un s&eacute;parateur horizontal. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/removeformat.gif" width="20" height="20"></td>\r
+    <td>Supprime les formattages du texte s&eacute;lectionn&eacute;. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/sub.gif" width="20" height="20"></td>\r
+    <td>Transforme le texte s&eacute;lectionn&eacute; en texte souscrit. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/sup.gif" width="20" height="20"></td>\r
+    <td>Transforme le texte s&eacute;lectionn&eacute; en indice sup&eacute;rieur. </td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Aller &agrave;: <a href="index.htm">Table des mati&egrave;res</a></td>\r
+    <td align="right"><a href="#">Haut de page</a></td>\r
+  </tr>\r
+</table>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/fr/images/insert_image_window.gif b/webcit/tiny_mce/themes/advanced/docs/fr/images/insert_image_window.gif
new file mode 100644 (file)
index 0000000..4ee31bd
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/fr/images/insert_image_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/fr/images/insert_link_window.gif b/webcit/tiny_mce/themes/advanced/docs/fr/images/insert_link_window.gif
new file mode 100644 (file)
index 0000000..9700921
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/fr/images/insert_link_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/fr/images/insert_table_window.gif b/webcit/tiny_mce/themes/advanced/docs/fr/images/insert_table_window.gif
new file mode 100644 (file)
index 0000000..1a26522
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/fr/images/insert_table_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/fr/index.htm b/webcit/tiny_mce/themes/advanced/docs/fr/index.htm
new file mode 100644 (file)
index 0000000..0fe6f53
--- /dev/null
@@ -0,0 +1,25 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Table des mati&egrave;res de l'aide</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+<BODY onload="window.focus();">\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Table des mati&egrave;res</span></td>\r
+    <td align="right">&nbsp;</td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Faites votre s&eacute;lection parmis les th&egrave;mes suivants:\r
+<ul class="toc_ul">\r
+  <li class="toc_li"><a href="about.htm">&Agrave; propos de TinyMCE</a></li>\r
+  <li class="toc_li"><a href="common_buttons.htm">Outils communs</a></li>\r
+  <li class="toc_li"><a href="insert_image_button.htm">Outil d'ajout d'images</a></li>\r
+  <li class="toc_li"><a href="insert_link_button.htm">Outil d'ajout d'hyperliens</a></li>\r
+  <li class="toc_li"><a href="insert_table_button.htm">Outil d'ajout de tableau</a></li>\r
+</ul>\r
+<hr noshade>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/fr/insert_image_button.htm b/webcit/tiny_mce/themes/advanced/docs/fr/insert_image_button.htm
new file mode 100644 (file)
index 0000000..d8f38b1
--- /dev/null
@@ -0,0 +1,66 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Outil d'ajout d'images</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Outil d'ajout d'images</span></td>\r
+    <td align="right"><a href="index.htm">Table des mati&egrave;res</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+L'outil d'ajout d'images ouvre la fen&ecirc;tre ci-dessous.<br>\r
+<br>\r
+<img src="images/insert_image_window.gif"><br>\r
+<br>\r
+Vous entrez tout simplement l'adresse de l'image que vous d&eacute;sirez ajouter et\r
+entrez une description facultative.  La description sera affich&eacute;e en texte alternatif\r
+sur l'image lorsqu'elle sera publi&eacute;e.<br>\r
+<br>\r
+<strong>Description des champs:</strong><br>\r
+<table border="1" cellspacing="0">\r
+  <tr>\r
+    <td width="150"><strong>Adresse de l'image </strong></td>\r
+    <td>Adresse URL de l'image &agrave; ins&eacute;rer.</td>\r
+  </tr>\r
+  <tr>\r
+    <td width="150"><strong>Description de l'image </strong></td>\r
+    <td>Description alternative de l'image.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Dimensions</strong></td>\r
+    <td>Largeur et Hauteur de l'image en pixel. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Alignement</strong></td>\r
+    <td>Alignement de l'image. Tr&egrave;s utile pour faire contourner le texte autour des images.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Bordure</strong></td>\r
+    <td>&Eacute;paisseur en pixel de la bordure. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>VSpace</strong></td>\r
+    <td>Espacement vertical. Tr&egrave;s utile pour faire contourner le texte autour des images.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>HSpace</strong></td>\r
+    <td>Espacement horizontal. Tr&egrave;s utile pour faire contourner le texte autour des images.</td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Aller &agrave;: <a href="index.htm">Table des mati&egrave;res</a></td>\r
+    <td align="right"><a href="#">Haut de page</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/fr/insert_link_button.htm b/webcit/tiny_mce/themes/advanced/docs/fr/insert_link_button.htm
new file mode 100644 (file)
index 0000000..d691d6b
--- /dev/null
@@ -0,0 +1,34 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Outil d'ajout d'hyperliens</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Outil d'ajout d'hyperliens</span></td>\r
+    <td align="right"><a href="index.htm">Table des mati&egrave;res</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+L'outil d'ajout d'hyperlien ouvre la fen&ecirc;tre ci-dessous.<br>\r
+<br>\r
+<img src="images/insert_link_window.gif"><br>\r
+<br>\r
+Il y a deux champs dans cette fen&ecirc;tre. L'Adresse URL est l'adresse\r
+de l'hyperlien.  La destination vous permet de choisir de quelle fa&ccedil;on\r
+l'hyperlien sera ouvert.<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Aller &agrave;: <a href="index.htm">Table des mati&egrave;res</a></td>\r
+    <td align="right"><a href="#">Haut de page</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/fr/insert_table_button.htm b/webcit/tiny_mce/themes/advanced/docs/fr/insert_table_button.htm
new file mode 100644 (file)
index 0000000..9ba3b7c
--- /dev/null
@@ -0,0 +1,71 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Outil d'ajout de tableau</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Outil d'ajout de tableau</span></td>\r
+    <td align="right"><a href="index.htm">Table des mati&egrave;res</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+L'outil d'ajout de tableau ouvre la fen&ecirc;tre ci-dessous.  Elle vous permet de créer dfes talbeaux.<br>\r
+<br>\r
+<img src="images/insert_table_window.gif"><br>\r
+<br>\r
+<strong>Description des champs:</strong><br>\r
+<table border="1" cellspacing="0">\r
+  <tr>\r
+    <td width="150"><strong>Colonnes</strong></td>\r
+    <td>Nombre de colonnes du tableau. </td>\r
+  </tr>\r
+  <tr>\r
+    <td width="150"><strong>Lignes</strong></td>\r
+    <td>Nombre de lignes du tableau. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Cellpadding</strong></td>\r
+    <td>Marge à l'intérieur des cellules du tableau. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Cellspacing</strong></td>\r
+    <td>Espacement entre les cellules du tableau. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Alignement</strong></td>\r
+    <td>Alignement du tableau. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Bordure</strong></td>\r
+    <td>Épaisseur des bordures du tableau.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Largeur</strong></td>\r
+    <td>Largeur en pixel du tableau.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Hauteur</strong></td>\r
+    <td>Hauteur en pixel du tableau.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Classe CSS</strong></td>\r
+    <td>Nom de la classe CSS pour appliquer un style.</td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Aller &agrave;: <a href="index.htm">Table des mati&egrave;res</a></td>\r
+    <td align="right"><a href="#">Haut de page</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/fr/style.css b/webcit/tiny_mce/themes/advanced/docs/fr/style.css
new file mode 100644 (file)
index 0000000..722f537
--- /dev/null
@@ -0,0 +1,28 @@
+body { background-color: #FFFFFF; }\r
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }\r
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }\r
+.subtitle { font-size: 12px; font-weight: bold; }\r
+\r
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }\r
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }\r
+img { border: #000000 solid 1px; }\r
+\r
+a:visited { color: #666666; text-decoration: underline; }\r
+a:active { color: #666666; text-decoration: underline; }\r
+a:hover { color: #666666; text-decoration: underline; }\r
+a { color: #666666; text-decoration: underline; }\r
+\r
+.pageheader { border: #E0E0E0 solid 1px; }\r
+.pagefooter { border: #E0E0E0 solid 1px; }\r
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.samplecontent { font-size: 10px; }\r
+\r
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.codecontent { font-size: 10px; }\r
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }\r
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }\r
+\r
+hr { height: 1px; }\r
+\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/fr_ca/about.htm b/webcit/tiny_mce/themes/advanced/docs/fr_ca/about.htm
new file mode 100644 (file)
index 0000000..51d9e57
--- /dev/null
@@ -0,0 +1,32 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>&Agrave; propos de TinyMCE</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">&Agrave; propos de TinyMCE</span></td>\r
+    <td align="right"><a href="index.htm">Table des mati&egrave;res</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+TinyMCE est un petit &eacute;diteur "WYSIWYG" pour page Web comme MSIE ou Mozilla qui\r
+vous permet de manipuler du contenu HTML d'une fa&ccedil;on plus intuitive.\r
+Il est simple d'utilisation et poss&egrave;de les fonctionalit&eacute;s ls plus r&eacute;pendues que l'on peut retrouver dans\r
+les traitements de texte.\r
+<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Aller &agrave;: <a href="index.htm">Table des mati&egrave;res</a></td>\r
+    <td align="right"><a href="#">Haut de page</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/fr_ca/common_buttons.htm b/webcit/tiny_mce/themes/advanced/docs/fr_ca/common_buttons.htm
new file mode 100644 (file)
index 0000000..aa9c237
--- /dev/null
@@ -0,0 +1,160 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Outils communs</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Outils communs</span></td>\r
+    <td align="right"><a href="index.htm">Table des mati&egrave;res</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Ci-dessous une courte description de chacuns des outils.<img src="../../images/spacer.gif" width="1" height="1"> \r
+<br>\r
+<br>\r
+<table border="1" cellpadding="3" cellspacing="0">\r
+  <tr>\r
+    <td><img src="../../images/bold_fr.gif" width="20" height="20"></td>\r
+    <td>Met le texte s&eacute;lectionn&eacute; en gras.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/italic.gif" width="20" height="20"></td>\r
+    <td>Met le texte s&eacute;lectionn&eacute; en italique.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/underline.gif" width="20" height="20"></td>\r
+    <td>Souligne le texte s&eacute;lectionn&eacute;.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/strikethrough.gif" width="20" height="20"></td>\r
+    <td>Barre le texte s&eacute;lectionn&eacute;.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyleft.gif" width="20" height="20"></td>\r
+    <td>Alignement &agrave; gauche.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifycenter.gif" width="20" height="20"></td>\r
+    <td>Alignement au centr&eacute;.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyright.gif" width="20" height="20"></td>\r
+    <td>Alignement &agrave; droite.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyfull.gif" width="20" height="20"></td>\r
+    <td>Texte justifi&eacute;.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/bullist.gif" width="20" height="20"></td>\r
+    <td>Liste &agrave; puces.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/numlist.gif" width="20" height="20"></td>\r
+    <td>Liste num&eacute;rot&eacute;e</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/outdent.gif" width="20" height="20"></td>\r
+    <td>R&eacute;duit l'indentation.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/indent.gif" width="20" height="20"></td>\r
+    <td>Augmente l'indentation.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/undo.gif" width="20" height="20"></td>\r
+    <td>Annule la derni&egrave;re op&eacute;ration.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/redo.gif" width="20" height="20"></td>\r
+    <td>Refait la derni&egrave;re op&eacute;ration annul&eacute;e.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/link.gif" width="20" height="20"></td>\r
+    <td>Ins&egrave;re ou modifie un hyperlien. Allez &agrave; la page <a href="insert_link_button.htm">\r
+        Outil d'ajout d'hyperliens</a> pour plus de d&eacute;tails.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/unlink.gif" width="20" height="20"></td>\r
+    <td>Efface les hyperliens qui sont s&eacute;lection&eacute;es.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/image.gif" width="20" height="20"></td>\r
+    <td>Ins&egrave;re ou modifie une image. Allez &agrave; la page <a href="insert_image_button.htm">\r
+        Outil d'ajout d'images</a> pour plus de d&eacute;tails.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/cleanup.gif" width="20" height="20"></td>\r
+    <td>Nettoie le code et retire les param&egrave;tres non d&eacute;sir&eacute;s.  Cet outil\r
+    est tr&egrave;s utile lorsque vous copiez du contenu provenant de logiciels\r
+    de bureatique.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/help.gif" width="20" height="20"></td>\r
+    <td>Affiche cette page d'aide.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/code.gif" width="20" height="20"></td>\r
+    <td>Ouvre un &eacute;diteur permettant de modifier le code HTML. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table.gif" width="20" height="20"></td>\r
+    <td>Ins&egrave;re un nouveau tableau &agrave; la position actuelle.  Allez &agrave; la page <a href="insert_table_button.htm">\r
+        Outil d'ajout de tableau</a> pour plus de d&eacute;tails.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_row_before.gif" width="20" height="20"></td>\r
+    <td>Ajoute une ligne au tableau avant la ligne courante. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_row_after.gif" width="20" height="20"></td>\r
+    <td>Ajoute une ligne au tableau apr&egrave;s la ligne courante. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_delete_row.gif" width="20" height="20"></td>\r
+    <td>Supprime la ligne courante. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_col_before.gif" width="20" height="20"></td>\r
+    <td>Ajoute une colonne au tableau avant la colonne courante. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_col_after.gif" width="20" height="20"></td>\r
+    <td>Ajoute une colonne au tableau apr&egrave;s la colonne courante. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_delete_col.gif" width="20" height="20"></td>\r
+    <td>Supprime la colonne courante. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/hr.gif" width="20" height="20"></td>\r
+    <td>Ins&egrave;re un s&eacute;parateur horizontal. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/removeformat.gif" width="20" height="20"></td>\r
+    <td>Supprime les formattages du texte s&eacute;lectionn&eacute;. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/sub.gif" width="20" height="20"></td>\r
+    <td>Transforme le texte s&eacute;lectionn&eacute; en texte souscrit. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/sup.gif" width="20" height="20"></td>\r
+    <td>Transforme le texte s&eacute;lectionn&eacute; en indice sup&eacute;rieur. </td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Aller &agrave;: <a href="index.htm">Table des mati&egrave;res</a></td>\r
+    <td align="right"><a href="#">Haut de page</a></td>\r
+  </tr>\r
+</table>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/fr_ca/images/insert_anchor_window.gif b/webcit/tiny_mce/themes/advanced/docs/fr_ca/images/insert_anchor_window.gif
new file mode 100644 (file)
index 0000000..71f4179
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/fr_ca/images/insert_anchor_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/fr_ca/images/insert_image_window.gif b/webcit/tiny_mce/themes/advanced/docs/fr_ca/images/insert_image_window.gif
new file mode 100644 (file)
index 0000000..4ee31bd
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/fr_ca/images/insert_image_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/fr_ca/images/insert_link_window.gif b/webcit/tiny_mce/themes/advanced/docs/fr_ca/images/insert_link_window.gif
new file mode 100644 (file)
index 0000000..9700921
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/fr_ca/images/insert_link_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/fr_ca/images/insert_table_window.gif b/webcit/tiny_mce/themes/advanced/docs/fr_ca/images/insert_table_window.gif
new file mode 100644 (file)
index 0000000..1a26522
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/fr_ca/images/insert_table_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/fr_ca/index.htm b/webcit/tiny_mce/themes/advanced/docs/fr_ca/index.htm
new file mode 100644 (file)
index 0000000..0fe6f53
--- /dev/null
@@ -0,0 +1,25 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Table des mati&egrave;res de l'aide</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+<BODY onload="window.focus();">\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Table des mati&egrave;res</span></td>\r
+    <td align="right">&nbsp;</td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Faites votre s&eacute;lection parmis les th&egrave;mes suivants:\r
+<ul class="toc_ul">\r
+  <li class="toc_li"><a href="about.htm">&Agrave; propos de TinyMCE</a></li>\r
+  <li class="toc_li"><a href="common_buttons.htm">Outils communs</a></li>\r
+  <li class="toc_li"><a href="insert_image_button.htm">Outil d'ajout d'images</a></li>\r
+  <li class="toc_li"><a href="insert_link_button.htm">Outil d'ajout d'hyperliens</a></li>\r
+  <li class="toc_li"><a href="insert_table_button.htm">Outil d'ajout de tableau</a></li>\r
+</ul>\r
+<hr noshade>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/fr_ca/insert_anchor_button.htm b/webcit/tiny_mce/themes/advanced/docs/fr_ca/insert_anchor_button.htm
new file mode 100644 (file)
index 0000000..f63bc74
--- /dev/null
@@ -0,0 +1,32 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Outil d'ajout d'ancres</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Outil d'ajout d'ancres</span></td>\r
+    <td align="right"><a href="index.htm">Table des mati&egrave;res</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+L'outil d'ajout d'ancres ouvre la fen&ecirc;tre ci-dessous.<br>\r
+<br>\r
+<img src="images/insert_anchor_window.gif"><br>\r
+<br>\r
+Il y a un seul champ dans cette fenêtre, c'est le nom de cette ancre.  Rappelez-vous, les noms doivent être unique dans la page.<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Aller &agrave;: <a href="index.htm">Table des mati&egrave;res</a></td>\r
+    <td align="right"><a href="#">Haut de page</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/fr_ca/insert_image_button.htm b/webcit/tiny_mce/themes/advanced/docs/fr_ca/insert_image_button.htm
new file mode 100644 (file)
index 0000000..d8f38b1
--- /dev/null
@@ -0,0 +1,66 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Outil d'ajout d'images</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Outil d'ajout d'images</span></td>\r
+    <td align="right"><a href="index.htm">Table des mati&egrave;res</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+L'outil d'ajout d'images ouvre la fen&ecirc;tre ci-dessous.<br>\r
+<br>\r
+<img src="images/insert_image_window.gif"><br>\r
+<br>\r
+Vous entrez tout simplement l'adresse de l'image que vous d&eacute;sirez ajouter et\r
+entrez une description facultative.  La description sera affich&eacute;e en texte alternatif\r
+sur l'image lorsqu'elle sera publi&eacute;e.<br>\r
+<br>\r
+<strong>Description des champs:</strong><br>\r
+<table border="1" cellspacing="0">\r
+  <tr>\r
+    <td width="150"><strong>Adresse de l'image </strong></td>\r
+    <td>Adresse URL de l'image &agrave; ins&eacute;rer.</td>\r
+  </tr>\r
+  <tr>\r
+    <td width="150"><strong>Description de l'image </strong></td>\r
+    <td>Description alternative de l'image.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Dimensions</strong></td>\r
+    <td>Largeur et Hauteur de l'image en pixel. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Alignement</strong></td>\r
+    <td>Alignement de l'image. Tr&egrave;s utile pour faire contourner le texte autour des images.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Bordure</strong></td>\r
+    <td>&Eacute;paisseur en pixel de la bordure. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>VSpace</strong></td>\r
+    <td>Espacement vertical. Tr&egrave;s utile pour faire contourner le texte autour des images.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>HSpace</strong></td>\r
+    <td>Espacement horizontal. Tr&egrave;s utile pour faire contourner le texte autour des images.</td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Aller &agrave;: <a href="index.htm">Table des mati&egrave;res</a></td>\r
+    <td align="right"><a href="#">Haut de page</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/fr_ca/insert_link_button.htm b/webcit/tiny_mce/themes/advanced/docs/fr_ca/insert_link_button.htm
new file mode 100644 (file)
index 0000000..d691d6b
--- /dev/null
@@ -0,0 +1,34 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Outil d'ajout d'hyperliens</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Outil d'ajout d'hyperliens</span></td>\r
+    <td align="right"><a href="index.htm">Table des mati&egrave;res</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+L'outil d'ajout d'hyperlien ouvre la fen&ecirc;tre ci-dessous.<br>\r
+<br>\r
+<img src="images/insert_link_window.gif"><br>\r
+<br>\r
+Il y a deux champs dans cette fen&ecirc;tre. L'Adresse URL est l'adresse\r
+de l'hyperlien.  La destination vous permet de choisir de quelle fa&ccedil;on\r
+l'hyperlien sera ouvert.<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Aller &agrave;: <a href="index.htm">Table des mati&egrave;res</a></td>\r
+    <td align="right"><a href="#">Haut de page</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/fr_ca/insert_table_button.htm b/webcit/tiny_mce/themes/advanced/docs/fr_ca/insert_table_button.htm
new file mode 100644 (file)
index 0000000..9ba3b7c
--- /dev/null
@@ -0,0 +1,71 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Outil d'ajout de tableau</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Outil d'ajout de tableau</span></td>\r
+    <td align="right"><a href="index.htm">Table des mati&egrave;res</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+L'outil d'ajout de tableau ouvre la fen&ecirc;tre ci-dessous.  Elle vous permet de créer dfes talbeaux.<br>\r
+<br>\r
+<img src="images/insert_table_window.gif"><br>\r
+<br>\r
+<strong>Description des champs:</strong><br>\r
+<table border="1" cellspacing="0">\r
+  <tr>\r
+    <td width="150"><strong>Colonnes</strong></td>\r
+    <td>Nombre de colonnes du tableau. </td>\r
+  </tr>\r
+  <tr>\r
+    <td width="150"><strong>Lignes</strong></td>\r
+    <td>Nombre de lignes du tableau. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Cellpadding</strong></td>\r
+    <td>Marge à l'intérieur des cellules du tableau. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Cellspacing</strong></td>\r
+    <td>Espacement entre les cellules du tableau. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Alignement</strong></td>\r
+    <td>Alignement du tableau. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Bordure</strong></td>\r
+    <td>Épaisseur des bordures du tableau.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Largeur</strong></td>\r
+    <td>Largeur en pixel du tableau.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Hauteur</strong></td>\r
+    <td>Hauteur en pixel du tableau.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Classe CSS</strong></td>\r
+    <td>Nom de la classe CSS pour appliquer un style.</td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Aller &agrave;: <a href="index.htm">Table des mati&egrave;res</a></td>\r
+    <td align="right"><a href="#">Haut de page</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/fr_ca/style.css b/webcit/tiny_mce/themes/advanced/docs/fr_ca/style.css
new file mode 100644 (file)
index 0000000..722f537
--- /dev/null
@@ -0,0 +1,28 @@
+body { background-color: #FFFFFF; }\r
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }\r
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }\r
+.subtitle { font-size: 12px; font-weight: bold; }\r
+\r
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }\r
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }\r
+img { border: #000000 solid 1px; }\r
+\r
+a:visited { color: #666666; text-decoration: underline; }\r
+a:active { color: #666666; text-decoration: underline; }\r
+a:hover { color: #666666; text-decoration: underline; }\r
+a { color: #666666; text-decoration: underline; }\r
+\r
+.pageheader { border: #E0E0E0 solid 1px; }\r
+.pagefooter { border: #E0E0E0 solid 1px; }\r
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.samplecontent { font-size: 10px; }\r
+\r
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.codecontent { font-size: 10px; }\r
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }\r
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }\r
+\r
+hr { height: 1px; }\r
+\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/hu/about.htm b/webcit/tiny_mce/themes/advanced/docs/hu/about.htm
new file mode 100644 (file)
index 0000000..08f8391
--- /dev/null
@@ -0,0 +1,28 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>&Uuml;ber TinyMCE</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">A TinyMCE-r&#337;l</span></td>\r
+    <td align="right"><a href="index.htm">Tartalom</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+A TinyMCE egy kompakt WYSIWYG-szerkeszt&#337; az MSIE-hoz &eacute;s a Mozill&aacute;hoz hasonl&oacute; webb&ouml;ng&eacute;sz&#337;k sz&aacute;m&aacute;ra, mely lehet&#337;s&eacute;get ny&uacute;jt &ouml;nnek a HTML tartalmak egyszer&#369; szerkeszt&eacute;s&eacute;re. A legt&ouml;bb sz&ouml;vegszerkeszt&#337;ben el&eacute;rhet&#337; funkci&oacute;kat ny&uacute;jtja egyszer&#369;en kezelhet&#337; form&aacute;ban.<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Ugr&aacute;s a <a href="index.htm">Tartalomjegyz&eacute;kre</a></td>\r
+    <td align="right"><a href="#">ugr&aacute;s a lap tetej&eacute;re </a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/hu/common_buttons.htm b/webcit/tiny_mce/themes/advanced/docs/hu/common_buttons.htm
new file mode 100644 (file)
index 0000000..e665373
--- /dev/null
@@ -0,0 +1,106 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Allgemeine Schaltfl&auml;chen</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Allgemeine Schaltfl&auml;chen</span></td>\r
+    <td align="right"><a href="index.htm">Tartalom</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Untenstehend eine kurze Beschreibung jeder Schaltfl&auml;che.<br>\r
+<br>\r
+<table border="1" cellpadding="3" cellspacing="0">\r
+  <tr>\r
+    <td><img src="../../images/bold.gif" width="20" height="20"></td>\r
+    <td>Félkövér szöveg.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/italic.gif" width="20" height="20"></td>\r
+    <td>Dõlt szöveg .</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/underline.gif" width="20" height="20"></td>\r
+    <td>Aláhúzott szöveg .</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/strikethrough.gif" width="20" height="20"></td>\r
+    <td>Áthúzott szöveg .</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyleft.gif" width="20" height="20"></td>\r
+    <td>Balra igazítás .</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifycenter.gif" width="20" height="20"></td>\r
+    <td>Középre igazítás .</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyright.gif" width="20" height="20"></td>\r
+    <td>Jobbra igazíás .</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyfull.gif" width="20" height="20"></td>\r
+    <td>Sorkizárt.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/bullist.gif" width="20" height="20"></td>\r
+    <td>Felsorolás / pontozott lista. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/numlist.gif" width="20" height="20"></td>\r
+    <td>Felsorolás / számozott lista.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/outdent.gif" width="20" height="20"></td>\r
+    <td>Behúzás balra .</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/indent.gif" width="20" height="20"></td>\r
+    <td>behúzás jobbra .</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/undo.gif" width="20" height="20"></td>\r
+    <td>Utolsó parancs visszavonása .</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/redo.gif" width="20" height="20"></td>\r
+    <td>Utolsó parancs ismétlése .</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/link.gif" width="20" height="20"></td>\r
+    <td>Új link beillesztése, bõvebb információért olvassa el a <a href="insert_link_button.htm">Link beillesztését</a>.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/unlink.gif" width="20" height="20"></td>\r
+    <td>A kijelölt link eltávolítása  / Az összes kijelölt link eltávolítása.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/image.gif" width="20" height="20"></td>\r
+    <td>Egy új kép beillesztése, bõvebb információért olvassa el a <a href="insert_image_button.htm">Kép beillesztését </a>.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/cleanup.gif" width="20" height="20"></td>\r
+    <td>Kód tisztítása  / Eltávolítja a nemkívánt formázásokat. Ez a funkció akkor hasznos, ha például Office dokumentumból másol tartalmat.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/help.gif" width="20" height="20"></td>\r
+    <td>Ennek a segítségnek az elérése.</td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Ugrás a <a href="index.htm">Tartalomjegyzékre</a></td>\r
+    <td align="right"><a href="#">ugrás a lap tetejére </a></td>\r
+  </tr>\r
+</table>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/hu/images/insert_image_window.gif b/webcit/tiny_mce/themes/advanced/docs/hu/images/insert_image_window.gif
new file mode 100644 (file)
index 0000000..a60e1fa
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/hu/images/insert_image_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/hu/images/insert_link_window.gif b/webcit/tiny_mce/themes/advanced/docs/hu/images/insert_link_window.gif
new file mode 100644 (file)
index 0000000..e72357b
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/hu/images/insert_link_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/hu/index.htm b/webcit/tiny_mce/themes/advanced/docs/hu/index.htm
new file mode 100644 (file)
index 0000000..43b81a2
--- /dev/null
@@ -0,0 +1,24 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Inhaltsverzeichnis der Hilfe</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+<BODY onload="window.focus();">\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Tartalomjegyzék</span></td>\r
+    <td align="right">&nbsp;</td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Kattintson az alábbi linkekre a segítség különbözõ részeinek eléréséhez.\r
+<ul class="toc_ul">\r
+  <li class="toc_li"><a href="about.htm">A TinyMCE-rõl</a></li>\r
+  <li class="toc_li"><a href="common_buttons.htm">Általános gombok </a></li>\r
+  <li class="toc_li"><a href="insert_image_button.htm">Kép beillesztése gomb </a></li>\r
+  <li class="toc_li"><a href="insert_link_button.htm">Link beillesztése gomb </a></li>\r
+</ul>\r
+<hr noshade>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/hu/insert_image_button.htm b/webcit/tiny_mce/themes/advanced/docs/hu/insert_image_button.htm
new file mode 100644 (file)
index 0000000..e7860bf
--- /dev/null
@@ -0,0 +1,32 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Schaltfl&auml;che Bild einf&uuml;gen</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">K&eacute;p beilleszt&eacute;se gomb </span></td>\r
+    <td align="right"><a href="index.htm">Tartalom</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br> \r
+A K&eacute;p beilleszt&eacute;se gomb az al&aacute;bbi ablakot nyitja meg.\r
+<br>\r
+<br>\r
+<img src="images/insert_image_window.gif" width="350" height="166"><br>\r
+<br>\r
+Egyszer&#369;en meg kell adni a beilleszteni k&iacute;v&aacute;nt k&eacute;p el&eacute;r&eacute;s&eacute;nek URL-j&eacute;t, valamint egy r&ouml;vd le&iacute;r&aacute;st, mely alternat&iacute;v sz&ouml;vegk&eacute;nt ker&uuml;l megjelen&iacute;t&eacute;sre (pl. nem grafikus b&ouml;ng&eacute;sz&#337;kben).<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Ugr&aacute;s a <a href="index.htm">Tartalomjegyz&eacute;kre</a></td>\r
+    <td align="right"><a href="#">ugr&aacute;s a lap tetej&eacute;re </a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/hu/insert_link_button.htm b/webcit/tiny_mce/themes/advanced/docs/hu/insert_link_button.htm
new file mode 100644 (file)
index 0000000..95b3750
--- /dev/null
@@ -0,0 +1,31 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Schaltfl&auml;che Hyperlink einf&uuml;gen</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Link beilleszt&eacute;se gomb </span></td>\r
+    <td align="right"><a href="index.htm">Tartalom</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+A Link beilleszt&eacute;se gomb az al&aacute;bbi ablakot nyitja meg.<br>\r
+<br>\r
+<img src="images/insert_link_window.gif" width="330" height="166"><br>\r
+<br>\r
+K&eacute;t mez&#337;t kell kit&ouml;ltenie ebben az ablakban. Az els&#337; - &quot;Link URL&quot; - a hivatkoz&aacute;s URL-je. A m&aacute;sodik lehet&#337;s&eacute;get ad &Ouml;nnek a hivatkozt&aacute;s megjelen&iacute;t&eacute;s&eacute;nek kiv&aacute;laszt&aacute;s&aacute;hoz.<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Ugr&aacute;s a <a href="index.htm">Tartalomjegyz&eacute;kre</a></td>\r
+    <td align="right"><a href="#">ugr&aacute;s a lap tetej&eacute;re </a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/hu/style.css b/webcit/tiny_mce/themes/advanced/docs/hu/style.css
new file mode 100644 (file)
index 0000000..722f537
--- /dev/null
@@ -0,0 +1,28 @@
+body { background-color: #FFFFFF; }\r
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }\r
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }\r
+.subtitle { font-size: 12px; font-weight: bold; }\r
+\r
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }\r
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }\r
+img { border: #000000 solid 1px; }\r
+\r
+a:visited { color: #666666; text-decoration: underline; }\r
+a:active { color: #666666; text-decoration: underline; }\r
+a:hover { color: #666666; text-decoration: underline; }\r
+a { color: #666666; text-decoration: underline; }\r
+\r
+.pageheader { border: #E0E0E0 solid 1px; }\r
+.pagefooter { border: #E0E0E0 solid 1px; }\r
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.samplecontent { font-size: 10px; }\r
+\r
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.codecontent { font-size: 10px; }\r
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }\r
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }\r
+\r
+hr { height: 1px; }\r
+\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/images/table.gif b/webcit/tiny_mce/themes/advanced/docs/images/table.gif
new file mode 100644 (file)
index 0000000..f8a0054
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/images/table.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/images/table_delete_col.gif b/webcit/tiny_mce/themes/advanced/docs/images/table_delete_col.gif
new file mode 100644 (file)
index 0000000..0b2f0fb
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/images/table_delete_col.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/images/table_delete_row.gif b/webcit/tiny_mce/themes/advanced/docs/images/table_delete_row.gif
new file mode 100644 (file)
index 0000000..1997065
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/images/table_delete_row.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/images/table_insert_col_after.gif b/webcit/tiny_mce/themes/advanced/docs/images/table_insert_col_after.gif
new file mode 100644 (file)
index 0000000..c30dafa
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/images/table_insert_col_after.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/images/table_insert_col_before.gif b/webcit/tiny_mce/themes/advanced/docs/images/table_insert_col_before.gif
new file mode 100644 (file)
index 0000000..5d1ff37
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/images/table_insert_col_before.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/images/table_insert_row_after.gif b/webcit/tiny_mce/themes/advanced/docs/images/table_insert_row_after.gif
new file mode 100644 (file)
index 0000000..c3aa15f
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/images/table_insert_row_after.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/images/table_insert_row_before.gif b/webcit/tiny_mce/themes/advanced/docs/images/table_insert_row_before.gif
new file mode 100644 (file)
index 0000000..c3271e5
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/images/table_insert_row_before.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/it/about.htm b/webcit/tiny_mce/themes/advanced/docs/it/about.htm
new file mode 100644 (file)
index 0000000..e1bca0f
--- /dev/null
@@ -0,0 +1,37 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+  <title>Informazioni su TinyMCE</title>\r
+  <link href="style.css" rel="stylesheet" type="text/css">\r
+</head>\r
+<body>\r
+<table class="pageheader" border="0" cellpadding="1" cellspacing="3"\r
+ width="100%">\r
+  <tbody>\r
+    <tr>\r
+      <td><span class="title">Informazioni su TinyMCE</span></td>\r
+      <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+    </tr>\r
+  </tbody>\r
+</table>\r
+<hr noshade="noshade">\r
+<br>\r
+TinyMCE &egrave; un piccolo WYSIWYG (What You See Is What You Get,\r
+quello che vedi &egrave; quello che ottieni) editor per i web browser\r
+come MSIE o Mozilla che permette di editare HTML in modo comodo. Ha le\r
+funzionalit&agrave; comuni di molti word processor e non dovrebbe\r
+essere difficile da usare.<br>\r
+<br>\r
+<hr noshade="noshade">\r
+<table class="pagefooter" border="0" cellpadding="1" cellspacing="3"\r
+ width="100%">\r
+  <tbody>\r
+    <tr>\r
+      <td>Vai a: <a href="index.htm">Tavola dei contenuti</a></td>\r
+      <td align="right"><a href="#">Su</a></td>\r
+    </tr>\r
+  </tbody>\r
+</table>\r
+<br>\r
+<br>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/it/common_buttons.htm b/webcit/tiny_mce/themes/advanced/docs/it/common_buttons.htm
new file mode 100644 (file)
index 0000000..7dc7a79
--- /dev/null
@@ -0,0 +1,180 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+  <title>Pulsanti comuni</title>\r
+  <link href="style.css" rel="stylesheet" type="text/css">\r
+</head>\r
+<body>\r
+<table class="pageheader" border="0" cellpadding="1" cellspacing="3"\r
+ width="100%">\r
+  <tbody>\r
+    <tr>\r
+      <td><span class="title">Pulsanti comuni<br>\r
+      </span></td>\r
+      <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+    </tr>\r
+  </tbody>\r
+</table>\r
+<hr noshade="noshade">\r
+<br>\r
+Di seguito una breve descrizione di ogni pulsante.<br>\r
+<br>\r
+<table border="1" cellpadding="3" cellspacing="0">\r
+  <tbody>\r
+    <tr>\r
+      <td><img src="../../images/bold.gif" height="20" width="20"></td>\r
+      <td>Testo <span style="font-weight: bold;">grassetto</span>.</td>\r
+    </tr>\r
+    <tr>\r
+      <td><img src="../../images/italic.gif" height="20" width="20"></td>\r
+      <td>Testo <span style="font-style: italic;">corsivo</span>.</td>\r
+    </tr>\r
+    <tr>\r
+      <td><img src="../../images/underline.gif" height="20" width="20"></td>\r
+      <td>Testo <span style="text-decoration: underline;">sottolineato</span>.</td>\r
+    </tr>\r
+    <tr>\r
+      <td><img src="../../images/strikethrough.gif" height="20"\r
+ width="20"></td>\r
+      <td>Testo <span style="text-decoration: line-through;">barrato</span>.</td>\r
+    </tr>\r
+    <tr>\r
+      <td><img src="../../images/justifyleft.gif" height="20" width="20"></td>\r
+      <td>Allinea a sinistra.</td>\r
+    </tr>\r
+    <tr>\r
+      <td><img src="../../images/justifycenter.gif" height="20" width="20"></td>\r
+      <td>Allinea al centro.</td>\r
+    </tr>\r
+    <tr>\r
+      <td><img src="../../images/justifyright.gif" height="20" width="20"></td>\r
+      <td>Allinea a destra.</td>\r
+    </tr>\r
+    <tr>\r
+      <td><img src="../../images/justifyfull.gif" height="20" width="20"></td>\r
+      <td>Giustifica.</td>\r
+    </tr>\r
+    <tr>\r
+      <td><img src="../../images/bullist.gif" height="20" width="20"></td>\r
+      <td>Lista non ordinata.</td>\r
+    </tr>\r
+    <tr>\r
+      <td><img src="../../images/numlist.gif" height="20" width="20"></td>\r
+      <td>Lista ordianta.<br>\r
+      </td>\r
+    </tr>\r
+    <tr>\r
+      <td><img src="../../images/outdent.gif" height="20" width="20"></td>\r
+      <td>Diminuisci l'indentazione.<br>\r
+      </td>\r
+    </tr>\r
+    <tr>\r
+      <td><img src="../../images/indent.gif" height="20" width="20"></td>\r
+      <td>Aumenta l'indentazione.</td>\r
+    </tr>\r
+    <tr>\r
+      <td><img src="../../images/undo.gif" height="20" width="20"></td>\r
+      <td>Annulla l'ultima operazione.</td>\r
+    </tr>\r
+    <tr>\r
+      <td><img src="../../images/redo.gif" height="20" width="20"></td>\r
+      <td>Ripeti l'ultima operazione.</td>\r
+    </tr>\r
+    <tr>\r
+      <td><img src="../../images/link.gif" height="20" width="20"></td>\r
+      <td>Inserieci un nuovo collegamento, maggiori informazioni su\r
+questa funzione nella <a href="insert_link_button.htm">Sezione\r
+'Inserisci un collegamento'</a></td>\r
+    </tr>\r
+    <tr>\r
+      <td><img src="../../images/unlink.gif" height="20" width="20"></td>\r
+      <td>Rimuovi tutti i collegamenti selezionati<br>\r
+      </td>\r
+    </tr>\r
+    <tr>\r
+    <td><img src="../../images/anchor.gif" height="20" width="20"></td>\r
+    <td>Inserisci una nuova &agrave;ncora, maggiori informazioni su\r
+questa funzione nella <a href="insert_anchor_button.htm">Sezione 'Inserisci un'&agrave;ncora'.</a></td>\r
+  </tr>\r
+    <tr>\r
+      <td><img src="../../images/image.gif" height="20" width="20"></td>\r
+      <td>Inserieci una nuova immagine, maggiori informazioni su questa\r
+funzione nella <a href="insert_image_button.htm">Sezione 'Inserisci\r
+una immagine'</a>.</td>\r
+    </tr>\r
+    <tr>\r
+      <td><img src="../../images/cleanup.gif" height="20" width="20"></td>\r
+      <td>Ripulisci il codice/rimuovi la formattazione non voluta.\r
+Questa funzione &egrave; utile quando si copia per esempio da un\r
+programma office<br>\r
+      </td>\r
+    </tr>\r
+    <tr>\r
+      <td><img src="../../images/help.gif" height="20" width="20"></td>\r
+      <td>Mostra questa guida<br>\r
+      </td>\r
+    </tr>\r
+\r
+  <tr>\r
+    <td><img src="../../images/code.gif" width="20" height="20"></td>\r
+    <td>Apre l'editor del sorgente HTML. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table.gif" width="20" height="20"></td>\r
+    <td>Inserisce una nuova tabella 2x2 alla posizione corrente.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_row_before.gif" width="20" height="20"></td>\r
+    <td>Aggiunge una riga sopra quella corrente.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_row_after.gif" width="20" height="20"></td>\r
+    <td>Aggiunge una roga sotto quella corrente.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_delete_row.gif" width="20" height="20"></td>\r
+    <td>Rimuove la riga corrente. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_col_before.gif" width="20" height="20"></td>\r
+    <td>Aggiunge una colonna prima di quella corrente.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_col_after.gif" width="20" height="20"></td>\r
+    <td>Aggiunge una colonna dopo quella corrente.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_delete_col.gif" width="20" height="20"></td>\r
+    <td>Rimuove la colonna corrente.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/hr.gif" width="20" height="20"></td>\r
+    <td>Inserisce una nuova riga orizzontale.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/removeformat.gif" width="20" height="20"></td>\r
+    <td>Rimuove la formattazione dalla selezione. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/sub.gif" width="20" height="20"></td>\r
+    <td>Formatta la selezione come pedice. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/sup.gif" width="20" height="20"></td>\r
+    <td>Formatta la selezione come apice. </td>\r
+  </tr>\r
+\r
+  </tbody>\r
+</table>\r
+<br>\r
+<hr noshade="noshade">\r
+<table class="pagefooter" border="0" cellpadding="1" cellspacing="3"\r
+ width="100%">\r
+  <tbody>\r
+    <tr>\r
+      <td>Vai a: <a href="index.htm">Tavola dei contenuti</a></td>\r
+      <td align="right"><a href="#">Su</a></td>\r
+    </tr>\r
+  </tbody>\r
+</table>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/it/images/insert_anchor_window.gif b/webcit/tiny_mce/themes/advanced/docs/it/images/insert_anchor_window.gif
new file mode 100644 (file)
index 0000000..cc9fc9d
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/it/images/insert_anchor_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/it/images/insert_image_window.gif b/webcit/tiny_mce/themes/advanced/docs/it/images/insert_image_window.gif
new file mode 100644 (file)
index 0000000..2b5b8e9
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/it/images/insert_image_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/it/images/insert_link_window.gif b/webcit/tiny_mce/themes/advanced/docs/it/images/insert_link_window.gif
new file mode 100644 (file)
index 0000000..9c778e2
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/it/images/insert_link_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/it/images/insert_table_window.gif b/webcit/tiny_mce/themes/advanced/docs/it/images/insert_table_window.gif
new file mode 100644 (file)
index 0000000..5cb25cf
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/it/images/insert_table_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/it/index.htm b/webcit/tiny_mce/themes/advanced/docs/it/index.htm
new file mode 100644 (file)
index 0000000..4e57afb
--- /dev/null
@@ -0,0 +1,30 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+  <title>Indice della guida</title>\r
+  <link href="style.css" rel="stylesheet" type="text/css">\r
+</head>\r
+<body onload="window.focus();">\r
+<table class="pageheader" border="0" cellpadding="1" cellspacing="3"\r
+ width="100%">\r
+  <tbody>\r
+    <tr>\r
+      <td><span class="title">Tavola dei contenuti<br>\r
+      </span></td>\r
+      <td align="right">&nbsp;</td>\r
+    </tr>\r
+  </tbody>\r
+</table>\r
+<hr noshade="noshade">\r
+<br>\r
+Seleziona un argomento:<br>\r
+<ul class="toc_ul">\r
+  <li class="toc_li"><a href="about.htm">Informazioni su TinyMCE</a></li>\r
+  <li class="toc_li"><a href="common_buttons.htm">Pulsanti comuni</a></li>\r
+  <li class="toc_li"><a href="insert_image_button.htm">Pulsante 'Inserisci immagine'<br></a></li>\r
+  <li class="toc_li"><a href="insert_link_button.htm">Pulsante 'Inserisci collegamento'</a></li>\r
+  <li class="toc_li"><a href="insert_anchor_button.htm">Pulsante 'Inserisci &agrave;ncora'</a></li>\r
+  <li class="toc_li"><a href="insert_table_button.htm">Pulsante 'Inserisci tabella'</a></li>\r
+</ul>\r
+<hr noshade="noshade">\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/it/insert_anchor_button.htm b/webcit/tiny_mce/themes/advanced/docs/it/insert_anchor_button.htm
new file mode 100644 (file)
index 0000000..c4a0111
--- /dev/null
@@ -0,0 +1,32 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Bottone 'Inserisci &agrave;ncora'</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Bottone 'Inserisci &agrave;ncora'</span></td>\r
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Questo bottone apre una nuova finestra che permette di aggiungere o modificare un'&agrave;ncora<br>\r
+<br>\r
+<img src="images/insert_anchor_window.gif" width="326" height="117"><br>\r
+<br>\r
+C'&egrave; un solo campo in questa finestra, dove devi inserire il nome del tuo punto di &agrave;ncoraggio. Ricorda che il nome dell' &agrave;ncora deve essere univoco. <br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Vai a: <a href="index.htm">Tavola dei contenuti</a></td>\r
+    <td align="right"><a href="#">Top</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/it/insert_image_button.htm b/webcit/tiny_mce/themes/advanced/docs/it/insert_image_button.htm
new file mode 100644 (file)
index 0000000..9d30923
--- /dev/null
@@ -0,0 +1,66 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Pulsante 'Inserisci immagine'</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Pulsante 'Inserisci immagine'</span></td>\r
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Il pulsante 'inserisci immagine' apre la finestra mostrata qui sotto.<br>\r
+<br>\r
+<img src="images/insert_image_window.gif"><br>\r
+<br>\r
+Si inserisce semplicemente l'url dell'immagine che si vuole collegare e una descrizione di quell'immagine,\r
+che sar&agrave; mostrato come testo alternativo dell'immagine sulla pagina.\r
+<br>\r
+<br>\r
+<strong>Descrizione dei parametri:</strong><br>\r
+<table border="1" cellspacing="0">\r
+  <tr>\r
+    <td width="150"><strong>URL immagine </strong></td>\r
+    <td>URL/indirizzo dell'immagine.</td>\r
+  </tr>\r
+  <tr>\r
+    <td width="150"><strong>Descrizione dell'immagine </strong></td>\r
+    <td>Descrizione alternativa del contenuto dell'immagine.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Dimensioni</strong></td>\r
+    <td>Larghezza/Altezza dell'immagine. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Allineamento</strong></td>\r
+    <td>Allineamento dell'immagine, utile quando si inserisce del testo attorno all'immagine.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Bordo</strong></td>\r
+    <td>Spessore del bordo. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Spazio verticale</strong></td>\r
+    <td>Spazio verticale,  utile quando si inserisce del testo attorno all'immagine.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Spazio orizzontale</strong></td>\r
+    <td>Spazio orizzontale, utile quando si inserisce del testo attorno all'immagine.</td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Vai a: <a href="index.htm">Tavola dei contenuti</a></td>\r
+    <td align="right"><a href="#">Su</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/it/insert_link_button.htm b/webcit/tiny_mce/themes/advanced/docs/it/insert_link_button.htm
new file mode 100644 (file)
index 0000000..0aad824
--- /dev/null
@@ -0,0 +1,41 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+  <title>Pulsante 'Inserisci collegamento'</title>\r
+  <link href="style.css" rel="stylesheet" type="text/css">\r
+</head>\r
+<body>\r
+<table class="pageheader" border="0" cellpadding="1" cellspacing="3"\r
+ width="100%">\r
+  <tbody>\r
+    <tr>\r
+      <td><span class="title">Pulsante 'Inserisci collegamento'<br>\r
+      </span></td>\r
+      <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+    </tr>\r
+  </tbody>\r
+</table>\r
+<hr noshade="noshade">\r
+<br>\r
+Questo pulsante apre una nuova finstra con le funzioni di\r
+inserimento/modifica del collegamento.<br>\r
+<br>\r
+<img src="images/insert_link_window.gif" height="156" width="326"><br>\r
+<br>\r
+Ci sono due campi in questa finestra: il primo, "Link URL" &egrave;\r
+l'indirizzo del collegamento. Il 'target' permette di selezionare come\r
+il collegamento deve essere aperto.<br>\r
+<br>\r
+<hr noshade="noshade">\r
+<table class="pagefooter" border="0" cellpadding="1" cellspacing="3"\r
+ width="100%">\r
+  <tbody>\r
+    <tr>\r
+      <td>Vai a: <a href="index.htm">Tavola dei contenuti</a></td>\r
+      <td align="right"><a href="#">Su</a></td>\r
+    </tr>\r
+  </tbody>\r
+</table>\r
+<br>\r
+<br>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/it/insert_table_button.htm b/webcit/tiny_mce/themes/advanced/docs/it/insert_table_button.htm
new file mode 100644 (file)
index 0000000..f75e4df
--- /dev/null
@@ -0,0 +1,71 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Pulsante 'Inserisci tabella'</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Pulsante 'Inserisci tabella'</span></td>\r
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Il pulsante 'Inserisci tabella' apre la finestra mostrata qui sotto. Questa azione permette di creare tabelle.<br>\r
+<br>\r
+<img src="images/insert_table_window.gif" width="346" height="225"><br>\r
+<br>\r
+<strong>Descrizione dei parametri:</strong><br>\r
+<table border="1" cellspacing="0">\r
+  <tr>\r
+    <td width="150"><strong>Colonne</strong></td>\r
+    <td>Numero di colonne nella nuova tabella. </td>\r
+  </tr>\r
+  <tr>\r
+    <td width="150"><strong>Righe</strong></td>\r
+    <td>Numero di righe nella nuova tabella.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Cellpadding</strong></td>\r
+    <td>Spazio tra il bordo di una cella e il suo contenuto. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Cellspacing</strong></td>\r
+    <td>Spazio tra le celle della tabella.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Allineamento</strong></td>\r
+    <td>Allineamento della tabella. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Bordo</strong></td>\r
+    <td>Spessore del bordo della tabella.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Larghezza</strong></td>\r
+    <td>Larghezza, in pixel, della tabella.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Altezza</strong></td>\r
+    <td>Altezza, in pixel, della tabella.</td>\r
+  </tr>\r
+    <tr>\r
+    <td><strong>Classe</strong></td>\r
+    <td>Stile o classe CSS della tabella.</td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Vai a: <a href="index.htm">Tavola dei contenuti</a></td>\r
+    <td align="right"><a href="#">Su</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/it/style.css b/webcit/tiny_mce/themes/advanced/docs/it/style.css
new file mode 100644 (file)
index 0000000..722f537
--- /dev/null
@@ -0,0 +1,28 @@
+body { background-color: #FFFFFF; }\r
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }\r
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }\r
+.subtitle { font-size: 12px; font-weight: bold; }\r
+\r
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }\r
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }\r
+img { border: #000000 solid 1px; }\r
+\r
+a:visited { color: #666666; text-decoration: underline; }\r
+a:active { color: #666666; text-decoration: underline; }\r
+a:hover { color: #666666; text-decoration: underline; }\r
+a { color: #666666; text-decoration: underline; }\r
+\r
+.pageheader { border: #E0E0E0 solid 1px; }\r
+.pagefooter { border: #E0E0E0 solid 1px; }\r
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.samplecontent { font-size: 10px; }\r
+\r
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.codecontent { font-size: 10px; }\r
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }\r
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }\r
+\r
+hr { height: 1px; }\r
+\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/nb/about.htm b/webcit/tiny_mce/themes/advanced/docs/nb/about.htm
new file mode 100644 (file)
index 0000000..f2cf656
--- /dev/null
@@ -0,0 +1,32 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>About TinyMCE</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Om TinyMCE</span></td>\r
+    <td align="right"><a href="index.htm">IF</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+TinyMCE er en liten WYSIWYG-editor for weblesere som\r
+f.eks. MSIE, Mozilla og Firefox og gj&oslash;r det mulig &aring; redigere\r
+HTML-innhold p&aring; et mer anvendervennlig vis.\r
+Applikasjonen har funksjoner som ligner dem man finner i vanlige tekstbehandlere\r
+og burde ikke v&aelig;re spesielt vanskelig &aring; benytte.<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>G&aring; til: <a href="index.htm">Innholdsoversikt</a></td>\r
+    <td align="right"><a href="#">Toppen</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/nb/common_buttons.htm b/webcit/tiny_mce/themes/advanced/docs/nb/common_buttons.htm
new file mode 100644 (file)
index 0000000..09857ea
--- /dev/null
@@ -0,0 +1,163 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Vanlige knapper</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Grunnleggende knapper</span></td>\r
+    <td align="right"><a href="index.htm">IF</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Nedenfor finner du en kort beskrivelse av hver knapp/funksjon.<br>\r
+<br>\r
+<table border="1" cellpadding="3" cellspacing="0">\r
+  <tr>\r
+    <td><img src="../../images/bold_de_se.gif" width="20" height="20"></td>\r
+    <td>Fet tekst.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/italic_de_se.gif" width="20" height="20"></td>\r
+    <td>Kursiv tekst.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/underline.gif" width="20" height="20"></td>\r
+    <td>Understreket tekst.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/strikethrough.gif" width="20" height="20"></td>\r
+    <td>Gjennomstreket tekst.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyleft.gif" width="20" height="20"></td>\r
+    <td>Rett venstremarg.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifycenter.gif" width="20" height="20"></td>\r
+    <td>Sentrer.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyright.gif" width="20" height="20"></td>\r
+    <td>Rett h&oslash;yremarg.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyfull.gif" width="20" height="20"></td>\r
+    <td>Rette marger.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/bullist.gif" width="20" height="20"></td>\r
+    <td>Punktliste.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/numlist.gif" width="20" height="20"></td>\r
+    <td>Nummerliste</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/outdent.gif" width="20" height="20"></td>\r
+    <td>Reduser innrykk.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/indent.gif" width="20" height="20"></td>\r
+    <td>&Oslash;k innrykk.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/undo.gif" width="20" height="20"></td>\r
+    <td>Angre seneste endring.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/redo.gif" width="20" height="20"></td>\r
+    <td>Gj&oslash;r om seneste endring.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/link.gif" width="20" height="20"></td>\r
+    <td>Lage/Redigere lenke, l&aelig;r mer om denne funksjonen i\r
+      kapittelet <a href="insert_link_button.htm">Lage/Redigere lenke</a>.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/unlink.gif" width="20" height="20"></td>\r
+    <td>Ta bort lenker fra markerte lenker.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/anchor.gif" width="20" height="20"></td>\r
+    <td>Lage/Redigere anker, l&aelig;r mer om denne funksjonen i\r
+      kapittelet <a href="insert_anchor_button.htm">Lage/Redigere anker</a>.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/image.gif" width="20" height="20"></td>\r
+    <td>Lage/Redigere bilde, l&aelig;r mer om denne funksjonen i \r
+      kapittelet <a href="insert_image_button.htm">Lage/Redigere bilde</a>.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/cleanup.gif" width="20" height="20"></td>\r
+    <td>Rense/Ordne koden. Denne funksjonen tar bort un&oslash;dvendig\r
+      formatering. B&oslash;r anvendes n&aring;r man f.eks. kopierer tekst\r
+      fra Office-program. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/help.gif" width="20" height="20"></td>\r
+    <td>Viser denne hjelp.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/code.gif" width="20" height="20"></td>\r
+    <td>&Aring;pner en HTML-kodeeditor. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table.gif" width="20" height="20"></td>\r
+    <td>Lager en ny tabell (2x2). </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_row_before.gif" width="20" height="20"></td>\r
+    <td>Lager en rad ovenfor den n&aring;v&aelig;rende raden. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_row_after.gif" width="20" height="20"></td>\r
+    <td>Lager en rad under den n&aring;v&aelig;rende raden. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_delete_row.gif" width="20" height="20"></td>\r
+    <td>Tar bort en rad. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_col_before.gif" width="20" height="20"></td>\r
+    <td>Lager en kolonne f&oslash;r den n&aring;v&aelig;rende kolonnen. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_col_after.gif" width="20" height="20"></td>\r
+    <td>Lager en kolonne etter den n&aring;v&aelig;rende kolonnen. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_delete_col.gif" width="20" height="20"></td>\r
+    <td>Tar bort en kolonne. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/hr.gif" width="20" height="20"></td>\r
+    <td>Lager en horisontal linje. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/removeformat.gif" width="20" height="20"></td>\r
+    <td>Tar bort formatering fra markert omr&aring;de. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/sub.gif" width="20" height="20"></td>\r
+    <td>Lager nedsenket tekst. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/sup.gif" width="20" height="20"></td>\r
+    <td>Lager opph&oslash;yd tekst. </td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>G&aring; til: <a href="index.htm">Innholdsoversikt</a></td>\r
+    <td align="right"><a href="#">Toppen</a></td>\r
+  </tr>\r
+</table>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/nb/images/insert_anchor_window.gif b/webcit/tiny_mce/themes/advanced/docs/nb/images/insert_anchor_window.gif
new file mode 100644 (file)
index 0000000..1c38437
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/nb/images/insert_anchor_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/nb/images/insert_image_window.gif b/webcit/tiny_mce/themes/advanced/docs/nb/images/insert_image_window.gif
new file mode 100644 (file)
index 0000000..c3d7379
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/nb/images/insert_image_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/nb/images/insert_link_window.gif b/webcit/tiny_mce/themes/advanced/docs/nb/images/insert_link_window.gif
new file mode 100644 (file)
index 0000000..2a56e79
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/nb/images/insert_link_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/nb/images/insert_table_window.gif b/webcit/tiny_mce/themes/advanced/docs/nb/images/insert_table_window.gif
new file mode 100644 (file)
index 0000000..e8b69ef
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/nb/images/insert_table_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/nb/index.htm b/webcit/tiny_mce/themes/advanced/docs/nb/index.htm
new file mode 100644 (file)
index 0000000..6293012
--- /dev/null
@@ -0,0 +1,27 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Hjelp Index</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+<BODY onload="window.focus();">\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Innholdsoversikt</span></td>\r
+    <td align="right">&nbsp;</td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Klikk p&aring; lenkene nedenfor for &aring; g&aring; til de ulike\r
+hjelp-kapitlene.\r
+<ul class="toc_ul">\r
+  <li class="toc_li"><a href="about.htm">Om TinyMCE</a></li>\r
+  <li class="toc_li"><a href="common_buttons.htm">Grunnleggende funksjoner</a></li>\r
+  <li class="toc_li"><a href="insert_image_button.htm">Lage/Redigere bilde</a></li>\r
+  <li class="toc_li"><a href="insert_link_button.htm">Lage/Redigere lenke</a></li>\r
+  <li class="toc_li"><a href="insert_anchor_button.htm">Lage/Redigere anker </a></li>\r
+  <li class="toc_li"><a href="insert_table_button.htm">Lage/Redigere tabell</a></li>\r
+</ul>\r
+<hr noshade>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/nb/insert_anchor_button.htm b/webcit/tiny_mce/themes/advanced/docs/nb/insert_anchor_button.htm
new file mode 100644 (file)
index 0000000..83d8870
--- /dev/null
@@ -0,0 +1,34 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Lage/Redigere anker</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Lage/Redigere anker</span></td>\r
+    <td align="right"><a href="index.htm">IF</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Denne funksjon &aring;pner et nytt vindu lik det nedenfor.<br>\r
+<br>\r
+<img src="images/insert_anchor_window.gif" width="330" height="139"><br>\r
+<br>\r
+Dette vinduet har et felt som man skal fylle i med et unikt\r
+navn, denne funksjon  gj&oslash;r det mulig &aring; skape\r
+ankerpunkter/bokmerker.<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>G&aring; til: <a href="index.htm">Innholdsoversikt</a></td>\r
+    <td align="right"><a href="#">Toppen</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/nb/insert_image_button.htm b/webcit/tiny_mce/themes/advanced/docs/nb/insert_image_button.htm
new file mode 100644 (file)
index 0000000..40fb90e
--- /dev/null
@@ -0,0 +1,71 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Lage/Redigere bilde</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Lage/Redigere bilde</span></td>\r
+    <td align="right"><a href="index.htm">IF</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Funksjonen "Lage/Redigere bilde" &aring;pner et nytt vindu som ser ut som \r
+bildet nedenfor.<br>\r
+<br>\r
+<img src="images/insert_image_window.gif"><br>\r
+<br>\r
+I dette vinduet skriver du inn URL:en til bildet du vil lenke til\r
+samt en bildebeskrivelse, denne beskrivelsen kommer til &aring; vises som en alternativ \r
+tekst til bildet.<br>\r
+<br>\r
+<strong>Feltforklaring:</strong><br>\r
+<table border="1" cellspacing="0">\r
+  <tr>\r
+    <td width="150"><strong>Bildets URL </strong></td>\r
+    <td>URL/s&oslash;kevei til bildet.</td>\r
+  </tr>\r
+  <tr>\r
+    <td width="150"><strong>Bildets beskrivelse</strong></td>\r
+    <td>Bildets beskrivelse, denne beskrivelsen kommer til &aring; vises som en\r
+      alternativ tekst til bildet.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Dimensjoner</strong></td>\r
+    <td>Bildets bredde og h&oslash;yde. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Justering</strong></td>\r
+    <td>Bildets justering, kan v&aelig;re anvendelig n&aring;r man vil at\r
+      tekst skal flyte rundt bildet. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Ramme</strong></td>\r
+    <td>Bilderammens bredde. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Vertikalt tomrom </strong></td>\r
+    <td>Vertikalt tomrom , kan v&aelig;ra anvendelig n&aring;r man vil\r
+      at tekst skal flyte rundt bildet. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Horisontalt tomrom</strong></td>\r
+    <td>Horisontalt tomrom, kan v&aelig;re anvendelig n&aring;r man vil\r
+      at tekst skal flyte rundt bildet. </td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>G&aring; til: <a href="index.htm">Innholdsoversikt</a></td>\r
+    <td align="right"><a href="#">Toppen</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/nb/insert_link_button.htm b/webcit/tiny_mce/themes/advanced/docs/nb/insert_link_button.htm
new file mode 100644 (file)
index 0000000..5430f6a
--- /dev/null
@@ -0,0 +1,33 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Lage/Redigere lenke</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Lage/Redigere lenke</span></td>\r
+    <td align="right"><a href="index.htm">IF</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Denne funksjon &aring;pner et nytt vindu lik det nedenfor.<br>\r
+<br>\r
+<img src="images/insert_link_window.gif" width="330" height="159"><br>\r
+<br>\r
+Dette vinduet har to felt, lenkens URL/addresse samt hvordan lenken \r
+skal &aring;pnes.<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>G&aring; til: <a href="index.htm">Innholdsoversikt</a></td>\r
+    <td align="right"><a href="#">Toppen</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/nb/insert_table_button.htm b/webcit/tiny_mce/themes/advanced/docs/nb/insert_table_button.htm
new file mode 100644 (file)
index 0000000..6e620df
--- /dev/null
@@ -0,0 +1,72 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Lage/Redigere tabell</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Lage/Redigere tabell </span></td>\r
+    <td align="right"><a href="index.htm">IF</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Lage tabell-knappen &aring;pner et nytt vindu, ved hjelp av\r
+dette vinduet kan du lage tabeller.<br>\r
+<br>\r
+<img src="images/insert_table_window.gif" width="340" height="229"><br>\r
+<br>\r
+<strong>Feltforklaring:</strong><br>\r
+<table border="1" cellspacing="0">\r
+  <tr>\r
+    <td width="150"><strong>Kolonner</strong></td>\r
+    <td>Antall kolonner i tabellen.</td>\r
+  </tr>\r
+  <tr>\r
+    <td width="150"><strong>Rader</strong></td>\r
+    <td>Antall rader i tabellen.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Celleutfylling</strong></td>\r
+    <td>Antall pixler utfylling i hver celle. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Cellemellomrom</strong></td>\r
+    <td>Antall pixler mellomrom mellom cellene.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Justering</strong></td>\r
+    <td>Tabellens justering. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Rammebredde</strong></td>\r
+    <td>Rammens bredde.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Bredde</strong></td>\r
+    <td>Bredde i pixler.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>H&oslash;yde</strong></td>\r
+    <td>H&oslash;yde i pixler. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Stil</strong></td>\r
+    <td>Stilmal p&aring; tabellen. </td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>G&aring; til: <a href="index.htm">Innholdsoversikt</a></td>\r
+    <td align="right"><a href="#">Toppen</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/nb/style.css b/webcit/tiny_mce/themes/advanced/docs/nb/style.css
new file mode 100644 (file)
index 0000000..722f537
--- /dev/null
@@ -0,0 +1,28 @@
+body { background-color: #FFFFFF; }\r
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }\r
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }\r
+.subtitle { font-size: 12px; font-weight: bold; }\r
+\r
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }\r
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }\r
+img { border: #000000 solid 1px; }\r
+\r
+a:visited { color: #666666; text-decoration: underline; }\r
+a:active { color: #666666; text-decoration: underline; }\r
+a:hover { color: #666666; text-decoration: underline; }\r
+a { color: #666666; text-decoration: underline; }\r
+\r
+.pageheader { border: #E0E0E0 solid 1px; }\r
+.pagefooter { border: #E0E0E0 solid 1px; }\r
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.samplecontent { font-size: 10px; }\r
+\r
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.codecontent { font-size: 10px; }\r
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }\r
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }\r
+\r
+hr { height: 1px; }\r
+\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/nl/about.htm b/webcit/tiny_mce/themes/advanced/docs/nl/about.htm
new file mode 100644 (file)
index 0000000..7ac0211
--- /dev/null
@@ -0,0 +1,31 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Over TinyMCE</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Over TinyMCE</span></td>\r
+    <td align="right"><a href="index.htm">Inhoudsopgave</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+TinyMCE is een kleine <i>What-You-See-Is-What-You-Get</i> (WYSIWYG)\r
+editor voor teksten. De bediening vindt plaats in de web browser, zoals MSIE of Mozilla.\r
+Het werken met deze editor is eenvoudig, omdat de bediening veel lijkt op het werken\r
+met teksten in (office-)tekstverwerkers.\r
+<br><br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr>\r
+    <td>Ga naar: <a href="index.htm">Inhoudsopgave</a></td>\r
+    <td align="right"><a href="#">Naar boven</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/nl/common_buttons.htm b/webcit/tiny_mce/themes/advanced/docs/nl/common_buttons.htm
new file mode 100644 (file)
index 0000000..5b03318
--- /dev/null
@@ -0,0 +1,188 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Functies van TinyMCE</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr>\r
+    <td><span class="title">Functies van TinyMCE</span></td>\r
+    <td align="right"><a href="index.htm">Inhoudsopgave</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Het werken met de editor komt sterk overeen met wat u gewend bent van uw tekstverwerker:\r
+Dubbel-klik op een woord in de tekst, of trek een kader met de muis terwijl u\r
+de linkerknop inhoudt om een gedeelte van de tekst te kiezen. Het aldus gemarkeerde woord of\r
+tekstfragment noemen we 'selecteerd'. Met de knoppen en stijl-keuzelijsten\r
+in de editor kunt u hiervan vervolgens de opmaak aanpassen of (indien deze reeds was toegekend) verwijderen.\r
+<br><br>\r
+De meeste functies voert u eenvoudig uit door het klikken\r
+van de knoppen (buttons) boven het tekstvenster in de editor. Hieronder vindt u van elk van deze\r
+knoppen een beknopte beschrijving.\r
+<br>\r
+<br>\r
+<table width=100% border="1" cellpadding="3" cellspacing="0">\r
+  <tr>\r
+    <td width=20><img src="../../images/bold.gif" width="20" height="20"></td>\r
+    <td>Gekozen tekstfragment 'Vet' (Bold) maken.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/italic.gif" width="20" height="20"></td>\r
+    <td>Gekozen tekstfragment 'Cursief' (Italic) maken.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/underline.gif" width="20" height="20"></td>\r
+    <td>Gekozen tekstfragment 'Onderstrepen' (Underline).</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/strikethrough.gif" width="20" height="20"></td>\r
+    <td>Gekozen tekstfragment 'Doorstrepen' (Strikethrough).</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyleft.gif" width="20" height="20"></td>\r
+    <td>Gekozen tekstfragment naar links uitlijnen.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifycenter.gif" width="20" height="20"></td>\r
+    <td>Gekozen tekstfragment centreren.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyright.gif" width="20" height="20"></td>\r
+    <td>Gekozen tekstfragment naar rechts uitlijnen.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyfull.gif" width="20" height="20"></td>\r
+    <td>Gekozen tekstfragment 'uitvullen' tot complete regels.</td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<table width=100% border="1" cellpadding="3" cellspacing="0">\r
+  <tr>\r
+    <td><img src="../../images/bullist.gif" width="20" height="20"></td>\r
+    <td>Gekozen tekstfragment omzetten naar ongeordende (bullet-)lijst of opsomming.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/numlist.gif" width="20" height="20"></td>\r
+    <td>Gekozen tekstfragment omzetten naar doorgenummerde lijst.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/outdent.gif" width="20" height="20"></td>\r
+    <td>Inspringniveau van het gekozen tekstfragment verkleinen.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/indent.gif" width="20" height="20"></td>\r
+    <td>Inspringniveau van het gekozen tekstfragment vergroten.</td>\r
+  </tr>\r
+  <tr>\r
+    <td width=20><img src="../../images/undo.gif" width="20" height="20"></td>\r
+    <td>De laaste bewerking ongedaan maken. De toetscombinatie CRTL-Z doet hetzelfde.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/redo.gif" width="20" height="20"></td>\r
+    <td>De laatste bewerking opnieuw uitvoeren.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/link.gif" width="20" height="20"></td>\r
+    <td>Invoegen van een <i>Link</i> (Cross-Link) via dialoogmenu.<br>\r
+                 Zie de beschrijving bij <a href="insert_link_button.htm">Links en verwijzingen in tekst invoegen</a>.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/unlink.gif" width="20" height="20"></td>\r
+    <td>Verwijdert alle gevonden <i>Links</i> (Cross-Links) uit de tekstselectie.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/anchor.gif" width="20" height="20"></td>\r
+    <td>Anker aan de tekstselectie toekennen of wijzigen.<br>\r
+                 Zie de beschrijving bij <a href="insert_anchor_button.htm">Anker Toevoegen.</a></td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/image.gif" width="20" height="20"></td>\r
+    <td>Voegt een afbeelding in.<br>\r
+                 Zie de beschrijving bij <a href="insert_image_button.htm">Afbeeldingen invoegen</a>.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/cleanup.gif" width="20" height="20"></td>\r
+    <td>Schoont ongewenste opmaak en codering van de tekstselectie op. Deze functie is erg nuttig na het\r
+                 overkopi&euml;ren van teksten vanuit uw (Office-)tekstverwerker.</td>\r
+  </tr>\r
+       <tr>\r
+    <td><img src="../../images/help.gif" width="20" height="20"></td>\r
+    <td>Toont dit helpvenster met uitleg van alle functionaliteit van de editor.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/code.gif" width="20" height="20"></td>\r
+    <td>Opent het venster met de HTML-broncode voor het direct maken van wijzigingen\r
+                 in de achterliggende pagina-codering. Kennis van de HTML-taal is vereist.</td>\r
+  </tr>\r
+</table>\r
+\r
+<br>\r
+<table width=100% border="1" cellpadding="3" cellspacing="0">\r
+  <tr>\r
+    <td><img src="../images/table.gif" width="20" height="20"></td>\r
+    <td>Voegt een nieuwe tabel met 2 rijen en kolommen in op de huidige positie in te tekst. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_row_before.gif" width="20" height="20"></td>\r
+    <td>Voegt een nieuwe rij toe aan de tabel boven de huidige.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_row_after.gif" width="20" height="20"></td>\r
+    <td>Voegt een nieuwe rij toe aan de tabel onder de huidige.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_delete_row.gif" width="20" height="20"></td>\r
+    <td>Verwijdert de huidige rij uit de tabel.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_col_before.gif" width="20" height="20"></td>\r
+    <td>Voegt een nieuwe kolom toe aan de tabel voor de huidige.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_col_after.gif" width="20" height="20"></td>\r
+    <td>Voegt een nieuwe kolom toe aan de tabel achter de huidige.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_delete_col.gif" width="20" height="20"></td>\r
+    <td>Verwijdert de huidige kolom uit de tabel.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/hr.gif" width="20" height="20"></td>\r
+    <td>Voegt een horizontale lijn in de tekst toe.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/removeformat.gif" width="20" height="20"></td>\r
+    <td>Verwijdert alle tekst-opmaak van de tekstselectie.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/visualaid.gif" width="20" height="20"></td>\r
+    <td>Toon of verberg hulplijnen voor tabellen in het tekstvenster.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/sub.gif" width="20" height="20"></td>\r
+    <td>Verandert het gekozen tekstfragment in <i>Subscript</i>.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/sup.gif" width="20" height="20"></td>\r
+    <td>Verandert het gekozen tekstfragment in <i>Superscript</i>.</td>\r
+  </tr>\r
+       <tr>\r
+    <td><img src="../../images/charmap.gif" width="20" height="20"></td>\r
+    <td>De <i>Karaktertabel</i> maakt het eenvoudig invoegen van bijzondere karakters mogelijk.<br>\r
+                 Zie de beschrijving bij <a href="insert_specchar_button.htm">Bijzondere karakers in de tekst invoegen.</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr>\r
+    <td>Ga naar: <a href="index.htm">Inhoudsopgave</a></td>\r
+    <td align="right"><a href="#">Naar boven</a></td>\r
+  </tr>\r
+</table>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/nl/images/html_source_window.gif b/webcit/tiny_mce/themes/advanced/docs/nl/images/html_source_window.gif
new file mode 100644 (file)
index 0000000..db933dc
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/nl/images/html_source_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/nl/images/insert_anchor_window.gif b/webcit/tiny_mce/themes/advanced/docs/nl/images/insert_anchor_window.gif
new file mode 100644 (file)
index 0000000..17dde58
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/nl/images/insert_anchor_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/nl/images/insert_image_window.gif b/webcit/tiny_mce/themes/advanced/docs/nl/images/insert_image_window.gif
new file mode 100644 (file)
index 0000000..05354a4
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/nl/images/insert_image_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/nl/images/insert_link_window.gif b/webcit/tiny_mce/themes/advanced/docs/nl/images/insert_link_window.gif
new file mode 100644 (file)
index 0000000..e1d01a8
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/nl/images/insert_link_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/nl/images/insert_specchar_window.gif b/webcit/tiny_mce/themes/advanced/docs/nl/images/insert_specchar_window.gif
new file mode 100644 (file)
index 0000000..986fa51
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/nl/images/insert_specchar_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/nl/images/insert_table_window.gif b/webcit/tiny_mce/themes/advanced/docs/nl/images/insert_table_window.gif
new file mode 100644 (file)
index 0000000..e65679d
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/nl/images/insert_table_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/nl/index.htm b/webcit/tiny_mce/themes/advanced/docs/nl/index.htm
new file mode 100644 (file)
index 0000000..84fe119
--- /dev/null
@@ -0,0 +1,27 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Help Index</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+<BODY onload="window.focus();">\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Inhoudsopgave</span></td>\r
+    <td align="right">&nbsp;</td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Klik op de onderwerpen in onderstaande inhoudsopgave voor meer informatie.\r
+<ul class="toc_ul">\r
+  <li class="toc_li"><a href="about.htm">Over TinyMCE</a></li>\r
+  <li class="toc_li"><a href="common_buttons.htm">Functies van TinyMCE</a></li>\r
+       <li class="toc_li"><a href="insert_image_button.htm">Afbeeldingen invoegen</a></li>\r
+       <li class="toc_li"><a href="insert_link_button.htm">Links en verwijzingen in tekst invoegen</a></li>\r
+  <li class="toc_li"><a href="insert_specchar_button.htm">Bijzondere karakers in de tekst invoegen</a></li>\r
+  <li class="toc_li"><a href="insert_anchor_button.htm">Ankers in de tekst gebruiken</a></li>\r
+  <li class="toc_li"><a href="insert_table_button.htm">Tabellen invoegen en aanpassen</a></li>\r
+</ul>\r
+<hr noshade>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/nl/insert_anchor_button.htm b/webcit/tiny_mce/themes/advanced/docs/nl/insert_anchor_button.htm
new file mode 100644 (file)
index 0000000..4cd1ec8
--- /dev/null
@@ -0,0 +1,37 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Ankers in de tekst gebruiken</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+<BODY>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr>\r
+    <td><span class="title">Ankers in de tekst gebruiken</span></td>\r
+    <td align="right"><a href="index.htm">Inhoudsopgave</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Met de knop 'Invoegen Anker' kunt u in de tekst z.g. HTML-ankers invoegen en\r
+aanpassen. Deze ankers maken het mogelijk snel naar bepaalde tekstfragmenten te springen.\r
+Door het toevoegen van de ankernaam (voorafgegaan door een '#')\r
+aan de link naar een pagina (Zie <a href="insert_link_button.htm">'Links en verwijzingen in tekst invoegen'</a>)\r
+kan op deze wijze desgewenst direct naar een bepaalde passage in een pagina worden doorgelinkt.\r
+<br><br>\r
+Voor het toevoegen of aanpassen van een anker wordt onderstaand dialoogvenster getoond.<br>\r
+<br>\r
+<center><img src="images/insert_anchor_window.gif"></center>\r
+<br>\r
+Bij het veld 'Anker naam' kan de gewenste naam van het anker worden ingevuld.\r
+Let op: Binnen een complete pagina binnen uw website dient de naam van dit anker uniek zijn.<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr>\r
+    <td>Ga naar: <a href="index.htm">Inhoudsopgave</a></td>\r
+    <td align="right"><a href="#">Naar boven</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/nl/insert_image_button.htm b/webcit/tiny_mce/themes/advanced/docs/nl/insert_image_button.htm
new file mode 100644 (file)
index 0000000..2648553
--- /dev/null
@@ -0,0 +1,65 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Afbeeldingen invoegen</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Afbeeldingen invoegen</span></td>\r
+    <td align="right"><a href="index.htm">Inhoudsopgave</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Voer simpelweg de URL van de afbeelding en de beschrijving in.\r
+De omschrijvende tekst wordt in sommige browsers bij de muiswijzer getoond\r
+wanneer deze boven de afbeelding wordt stilgehouden.\r
+De knop 'Afbeelding Invoegen' opent onderstaand dialoogvenster.<br>\r
+<br>\r
+<center><img src="images/insert_image_window.gif"></center>\r
+<br>\r
+<strong>Omschrijving van de velden:</strong><br>\r
+<table border="1" cellspacing="0">\r
+  <tr>\r
+    <td width="150"><strong>Afbeelding</strong></td>\r
+    <td>In dit veld dient u een complete URL op te geven van de afbeelding.</td>\r
+  </tr>\r
+  <tr>\r
+    <td width="150"><strong>Beschrijving</strong></td>\r
+    <td>Omschrijvende tekst die in sommige browsers bij de muiswijzer wordt getoond wanneer deze boven de afbeelding wordt stilgehouden.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Uitlijning</strong></td>\r
+    <td>Uit de lijst kan worden gekozen op welke wijze de afbeelding in de tekst wordt ingebed.</td>\r
+  </tr>\r
+       <tr>\r
+    <td><strong>Afmetingen</strong></td>\r
+    <td>De breedte en hoogte van de afbeelding in pixels. Laat deze velden leeg als de originele afmetingen gewenst zijn.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Omranding</strong></td>\r
+    <td>De dikte (in pixels) van de omranding om de afbeelding.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Verticale marge</strong></td>\r
+    <td>De verticale marge (in pixels) gebruikt voor de omloop van teksten om de afbeelding.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Horizontale marge</strong></td>\r
+    <td>De horizontale marge (in pixels) gebruikt voor de omloop van teksten om de afbeelding.</td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr>\r
+    <td>Ga naar: <a href="index.htm">Inhoudsopgave</a></td>\r
+    <td align="right"><a href="#">Naar boven</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/nl/insert_link_button.htm b/webcit/tiny_mce/themes/advanced/docs/nl/insert_link_button.htm
new file mode 100644 (file)
index 0000000..073dbc5
--- /dev/null
@@ -0,0 +1,35 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Links en verwijzingen in tekst invoegen</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Links en verwijzingen in tekst invoegen</span></td>\r
+    <td align="right"><a href="index.htm">Inhoudsopgave</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+De knop 'Link Invoegen' leidt u naar onderstaand dialoogvenster waarmee u eenvoudig\r
+een <i>Link</i> (Cross-Link) kunt aanbrengen in uw teksten.\r
+<br><br>\r
+<center><img src="images/insert_link_window.gif"></center>\r
+<br>\r
+Bij 'Link URL' dient de de url van\r
+de link te worden ingevuld (desgewenst voorafgegaan door 'http://' voor een externe\r
+website), bij 'target' kan worden bepaald hoe de link moet openen.\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr>\r
+    <td>Ga naar: <a href="index.htm">Inhoudsopgave</a></td>\r
+    <td align="right"><a href="#">Naar boven</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/nl/insert_specchar_button.htm b/webcit/tiny_mce/themes/advanced/docs/nl/insert_specchar_button.htm
new file mode 100644 (file)
index 0000000..32868ba
--- /dev/null
@@ -0,0 +1,32 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Bijzondere karakers in de tekst invoegen</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+<BODY>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr>\r
+    <td><span class="title">Bijzondere karakers in de tekst invoegen</span></td>\r
+    <td align="right"><a href="index.htm">Inhoudsopgave</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Met de knop 'Bijzondere Karakters' kunt u in de tekst bijzondere karakters, die soms\r
+op het toetsenbord lastig te vinden zijn, invoegen.\r
+<br><br>\r
+Voor het invoegen van een deze karakters wordt onderstaand keuzevenster getoond.\r
+Door het eenvoudigweg klikken op het gewenste karakter in het overzicht, wordt het op de huidige positie in de tekst ingevoegd.<br>\r
+<br>\r
+<center><img src="images/insert_specchar_window.gif"></center>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr>\r
+    <td>Ga naar: <a href="index.htm">Inhoudsopgave</a></td>\r
+    <td align="right"><a href="#">Naar boven</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/nl/insert_table_button.htm b/webcit/tiny_mce/themes/advanced/docs/nl/insert_table_button.htm
new file mode 100644 (file)
index 0000000..5e91d9f
--- /dev/null
@@ -0,0 +1,73 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Tabellen invoegen en aanpassen</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Tabellen invoegen en aanpassen</span></td>\r
+    <td align="right"><a href="index.htm">Inhoudsopgave</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+De knop 'Invoegen Tabel' stelt u in staat op de huidige plek een nieuwe tabel\r
+in uw tekst in te voegen en opent onderstaand dialoogvenster.<br>\r
+<br>\r
+<center><img src="images/insert_table_window.gif"></center>\r
+<br>\r
+<strong>Omschrijving van de velden:</strong><br>\r
+<table border="1" cellspacing="0">\r
+  <tr>\r
+    <td width="150"><strong>Kolommen</strong></td>\r
+    <td>Het gewenste aantal kolommen in de tabel.</td>\r
+  </tr>\r
+  <tr>\r
+    <td width="150"><strong>Rijen</strong></td>\r
+    <td>Het gewenste aantal rijen in de tabel.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Celvulling</strong></td>\r
+    <td>De 'Celvulling' (Cellpadding)<br>\r
+               De opvulmarge rondom binnen elke cel in de tabel in pixels.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Celafstand</strong></td>\r
+    <td>De 'Celafstand' (Cellspacing)<br>\r
+               De ruimte tussen de cellen onderling binnen de tabel in pixels.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Positionering</strong></td>\r
+    <td>De positionering van de tabel in de paragraaf.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Omranding</strong></td>\r
+    <td>De dikte in pixels van de omranding van de tabel.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Breedte</strong></td>\r
+    <td>De breedte van de tabel (in pixels of percentuele notatie).</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Hoogte</strong></td>\r
+    <td>De breedte van de tabel (in pixels of percentuele notatie).</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>CSS-Stijl</strong></td>\r
+    <td>Optionele stijlkeuze uit de voor de website aangemaakte <i>Cascading Style Sheet</i> (CSS).</td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr>\r
+    <td>Ga naar: <a href="index.htm">Inhoudsopgave</a></td>\r
+    <td align="right"><a href="#">Naar boven</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/nl/style.css b/webcit/tiny_mce/themes/advanced/docs/nl/style.css
new file mode 100644 (file)
index 0000000..f36b629
--- /dev/null
@@ -0,0 +1,28 @@
+/* body { background-color: #FFFFFF; } */\r
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }\r
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }\r
+.subtitle { font-size: 12px; font-weight: bold; }\r
+\r
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }\r
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }\r
+img { border: #000000 solid 1px; }\r
+\r
+a:visited { color: #666666; text-decoration: underline; }\r
+a:active { color: #666666; text-decoration: underline; }\r
+a:hover { color: #666666; text-decoration: underline; }\r
+a { color: #666666; text-decoration: underline; }\r
+\r
+.pageheader { border: #E0E0E0 solid 1px; }\r
+.pagefooter { border: #E0E0E0 solid 1px; }\r
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.samplecontent { font-size: 10px; }\r
+\r
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.codecontent { font-size: 10px; }\r
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }\r
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }\r
+\r
+hr { height: 1px; }\r
+\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/nn/about.htm b/webcit/tiny_mce/themes/advanced/docs/nn/about.htm
new file mode 100644 (file)
index 0000000..0602218
--- /dev/null
@@ -0,0 +1,32 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>About TinyMCE</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Om TinyMCE</span></td>\r
+    <td align="right"><a href="index.htm">IF</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+TinyMCE er ein liten WYSIWYG-editor for weblesere som\r
+f.eks. MSIE, Mozilla og Firefox og gjer det mulig &aring; redigere\r
+HTML-innhald p&aring; eit meir anvendervennlig vis.\r
+Applikasjonen har funksjoner som likner dem man finner i vanlege tekstbehandlere\r
+og burde ikkje vere spesielt vanskelig &aring; benytte.<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>G&aring; til: <a href="index.htm">Innhaldsoversikt</a></td>\r
+    <td align="right"><a href="#">Toppen</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/nn/common_buttons.htm b/webcit/tiny_mce/themes/advanced/docs/nn/common_buttons.htm
new file mode 100644 (file)
index 0000000..2907a28
--- /dev/null
@@ -0,0 +1,163 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Vanlege knapper</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Grunnleggende knapper</span></td>\r
+    <td align="right"><a href="index.htm">IF</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Nedanfor finner du ein kort beskrivelse av kvar knapp/funksjon.<br>\r
+<br>\r
+<table border="1" cellpadding="3" cellspacing="0">\r
+  <tr>\r
+    <td><img src="../../images/bold_de_se.gif" width="20" height="20"></td>\r
+    <td>Feit tekst.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/italic_de_se.gif" width="20" height="20"></td>\r
+    <td>Kursiv tekst.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/underline.gif" width="20" height="20"></td>\r
+    <td>Understreket tekst.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/strikethrough.gif" width="20" height="20"></td>\r
+    <td>Gjennomstreket tekst.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyleft.gif" width="20" height="20"></td>\r
+    <td>Rett venstremarg.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifycenter.gif" width="20" height="20"></td>\r
+    <td>Sentrer.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyright.gif" width="20" height="20"></td>\r
+    <td>Rett h&oslash;gremarg.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyfull.gif" width="20" height="20"></td>\r
+    <td>Rette marger.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/bullist.gif" width="20" height="20"></td>\r
+    <td>Punktliste.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/numlist.gif" width="20" height="20"></td>\r
+    <td>Nummerliste</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/outdent.gif" width="20" height="20"></td>\r
+    <td>Reduser innrykk.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/indent.gif" width="20" height="20"></td>\r
+    <td>Auk innrykk.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/undo.gif" width="20" height="20"></td>\r
+    <td>Angre seinaste endring.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/redo.gif" width="20" height="20"></td>\r
+    <td>Gjer om seinaste endring.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/link.gif" width="20" height="20"></td>\r
+    <td>Lage/Redigere lenke, l&aelig;r meir om denne funksjonen i\r
+      kapittelet <a href="insert_link_button.htm">Lage/Redigere lenke</a>.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/unlink.gif" width="20" height="20"></td>\r
+    <td>Ta bort lenker fr&aring; markerte lenker.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/anchor.gif" width="20" height="20"></td>\r
+    <td>Lage/Redigere anker, l&aelig;r meir om denne funksjonen i\r
+      kapittelet <a href="insert_anchor_button.htm">Lage/Redigere anker</a>.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/image.gif" width="20" height="20"></td>\r
+    <td>Lage/Redigere bilde, l&aelig;r meir om denne funksjonen i \r
+      kapittelet <a href="insert_image_button.htm">Lage/Redigere bilde</a>.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/cleanup.gif" width="20" height="20"></td>\r
+    <td>Rense/Ordne koden. Denne funksjonen tar bort un&oslash;dvendig\r
+      formatering. B&oslash;r anvendes n&aring;r man f.eks. kopierer tekst\r
+      fr&aring; Office-program. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/help.gif" width="20" height="20"></td>\r
+    <td>Viser denne hjelp.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/code.gif" width="20" height="20"></td>\r
+    <td>&Aring;pner ein HTML-kodeeditor. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table.gif" width="20" height="20"></td>\r
+    <td>Lager ein ny tabell (2x2). </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_row_before.gif" width="20" height="20"></td>\r
+    <td>Lager ei rad ovenfor den noverande raden. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_row_after.gif" width="20" height="20"></td>\r
+    <td>Lager ei rad under den noverande raden. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_delete_row.gif" width="20" height="20"></td>\r
+    <td>Tar bort ei rad. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_col_before.gif" width="20" height="20"></td>\r
+    <td>Lager ei kolonne f&oslash;r den noverande kolonnen. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_col_after.gif" width="20" height="20"></td>\r
+    <td>Lager ei kolonne etter den noverande kolonnen. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_delete_col.gif" width="20" height="20"></td>\r
+    <td>Tar bort ei kolonne. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/hr.gif" width="20" height="20"></td>\r
+    <td>Lager ei horisontal linje. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/removeformat.gif" width="20" height="20"></td>\r
+    <td>Tar bort formatering fr&aring; markert omr&aring;de. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/sub.gif" width="20" height="20"></td>\r
+    <td>Lager nedsenket tekst. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/sup.gif" width="20" height="20"></td>\r
+    <td>Lager opph&oslash;gd tekst. </td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>G&aring; til: <a href="index.htm">Innhaldsoversikt</a></td>\r
+    <td align="right"><a href="#">Toppen</a></td>\r
+  </tr>\r
+</table>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/nn/images/html_source_window.gif b/webcit/tiny_mce/themes/advanced/docs/nn/images/html_source_window.gif
new file mode 100644 (file)
index 0000000..db933dc
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/nn/images/html_source_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/nn/images/insert_anchor_window.gif b/webcit/tiny_mce/themes/advanced/docs/nn/images/insert_anchor_window.gif
new file mode 100644 (file)
index 0000000..1c38437
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/nn/images/insert_anchor_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/nn/images/insert_image_window.gif b/webcit/tiny_mce/themes/advanced/docs/nn/images/insert_image_window.gif
new file mode 100644 (file)
index 0000000..c3d7379
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/nn/images/insert_image_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/nn/images/insert_link_window.gif b/webcit/tiny_mce/themes/advanced/docs/nn/images/insert_link_window.gif
new file mode 100644 (file)
index 0000000..2a56e79
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/nn/images/insert_link_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/nn/images/insert_specchar_window.gif b/webcit/tiny_mce/themes/advanced/docs/nn/images/insert_specchar_window.gif
new file mode 100644 (file)
index 0000000..986fa51
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/nn/images/insert_specchar_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/nn/images/insert_table_window.gif b/webcit/tiny_mce/themes/advanced/docs/nn/images/insert_table_window.gif
new file mode 100644 (file)
index 0000000..e8b69ef
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/nn/images/insert_table_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/nn/index.htm b/webcit/tiny_mce/themes/advanced/docs/nn/index.htm
new file mode 100644 (file)
index 0000000..ec6695a
--- /dev/null
@@ -0,0 +1,27 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Hjelp Index</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+<BODY onload="window.focus();">\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Innhaldsoversikt</span></td>\r
+    <td align="right">&nbsp;</td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Klikk p&aring; lenkene nedanfor for &aring; g&aring; til dei ulike\r
+hjelp-kapitlene.\r
+<ul class="toc_ul">\r
+  <li class="toc_li"><a href="about.htm">Om TinyMCE</a></li>\r
+  <li class="toc_li"><a href="common_buttons.htm">Grunnleggende funksjoner</a></li>\r
+  <li class="toc_li"><a href="insert_image_button.htm">Lage/Redigere bilde</a></li>\r
+  <li class="toc_li"><a href="insert_link_button.htm">Lage/Redigere lenke</a></li>\r
+  <li class="toc_li"><a href="insert_anchor_button.htm">Lage/Redigere anker </a></li>\r
+  <li class="toc_li"><a href="insert_table_button.htm">Lage/Redigere tabell</a></li>\r
+</ul>\r
+<hr noshade>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/nn/insert_anchor_button.htm b/webcit/tiny_mce/themes/advanced/docs/nn/insert_anchor_button.htm
new file mode 100644 (file)
index 0000000..8fb63bb
--- /dev/null
@@ -0,0 +1,34 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Lage/Redigere anker</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Lage/Redigere anker</span></td>\r
+    <td align="right"><a href="index.htm">IF</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Denne funksjon &aring;pner eit nytt vindauge lik det nedanfor.<br>\r
+<br>\r
+<img src="images/insert_anchor_window.gif" width="330" height="139"><br>\r
+<br>\r
+Dette vindauget har eit felt som man skal fylle i med eit unikt\r
+navn, denne funksjon  gjer det mulig &aring; skape\r
+ankerpunkter/bokmerker.<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>G&aring; til: <a href="index.htm">Innhaldsoversikt</a></td>\r
+    <td align="right"><a href="#">Toppen</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/nn/insert_image_button.htm b/webcit/tiny_mce/themes/advanced/docs/nn/insert_image_button.htm
new file mode 100644 (file)
index 0000000..47d483f
--- /dev/null
@@ -0,0 +1,71 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Lage/Redigere bilde</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Lage/Redigere bilde</span></td>\r
+    <td align="right"><a href="index.htm">IF</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Funksjonen "Lage/Redigere bilde" &aring;pner eit nytt vindauge som ser ut som \r
+bildet nedanfor.<br>\r
+<br>\r
+<img src="images/insert_image_window.gif"><br>\r
+<br>\r
+I dette vindauget skriver du inn URL:en til bildet du vil lenke til\r
+samt ein bildebeskrivelse, denne beskrivelsen kommer til &aring; vises som ein alternativ \r
+tekst til bildet.<br>\r
+<br>\r
+<strong>Feltforklaring:</strong><br>\r
+<table border="1" cellspacing="0">\r
+  <tr>\r
+    <td width="150"><strong>Bildets URL </strong></td>\r
+    <td>URL/s&oslash;kevei til bildet.</td>\r
+  </tr>\r
+  <tr>\r
+    <td width="150"><strong>Bildets beskrivelse</strong></td>\r
+    <td>Bildets beskrivelse, denne beskrivelsen kommer til &aring; vises som ein\r
+      alternativ tekst til bildet.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Dimensjoner</strong></td>\r
+    <td>Bildets bredde og h&oslash;gde. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Justering</strong></td>\r
+    <td>Bildets justering, kan vere anvendelig n&aring;r man vil at\r
+      tekst skal flyte rundt bildet. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Ramme</strong></td>\r
+    <td>Bilderammens bredde. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Vertikalt tomrom </strong></td>\r
+    <td>Vertikalt tomrom , kan vere anvendelig n&aring;r man vil\r
+      at tekst skal flyte rundt bildet. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Horisontalt tomrom</strong></td>\r
+    <td>Horisontalt tomrom, kan vere anvendelig n&aring;r man vil\r
+      at tekst skal flyte rundt bildet. </td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>G&aring; til: <a href="index.htm">Innhaldsoversikt</a></td>\r
+    <td align="right"><a href="#">Toppen</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/nn/insert_link_button.htm b/webcit/tiny_mce/themes/advanced/docs/nn/insert_link_button.htm
new file mode 100644 (file)
index 0000000..972bbcd
--- /dev/null
@@ -0,0 +1,33 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Lage/Redigere lenke</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Lage/Redigere lenke</span></td>\r
+    <td align="right"><a href="index.htm">IF</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Denne funksjon &aring;pner eit nytt vindauge lik det nedanfor.<br>\r
+<br>\r
+<img src="images/insert_link_window.gif" width="330" height="159"><br>\r
+<br>\r
+Dette vindauget har to felt, lenkens URL/addresse samt hvordan lenken \r
+skal &aring;pnes.<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>G&aring; til: <a href="index.htm">Innhaldsoversikt</a></td>\r
+    <td align="right"><a href="#">Toppen</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/nn/insert_table_button.htm b/webcit/tiny_mce/themes/advanced/docs/nn/insert_table_button.htm
new file mode 100644 (file)
index 0000000..8aad70a
--- /dev/null
@@ -0,0 +1,72 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Lage/Redigere tabell</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Lage/Redigere tabell </span></td>\r
+    <td align="right"><a href="index.htm">IF</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Lage tabell-knappen &aring;pner et nytt vindauge, ved hjelp av\r
+dette vindauget kan du lage tabeller.<br>\r
+<br>\r
+<img src="images/insert_table_window.gif" width="340" height="229"><br>\r
+<br>\r
+<strong>Feltforklaring:</strong><br>\r
+<table border="1" cellspacing="0">\r
+  <tr>\r
+    <td width="150"><strong>Kolonner</strong></td>\r
+    <td>Antall kolonner i tabellen.</td>\r
+  </tr>\r
+  <tr>\r
+    <td width="150"><strong>Rader</strong></td>\r
+    <td>Antall rader i tabellen.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Celleutfylling</strong></td>\r
+    <td>Antall pixler utfylling i kvar celle. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Cellemellomrom</strong></td>\r
+    <td>Antall pixler mellomrom mellom cellene.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Justering</strong></td>\r
+    <td>Tabellens justering. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Rammebredde</strong></td>\r
+    <td>Rammens bredde.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Bredde</strong></td>\r
+    <td>Bredde i pixler.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>H&oslash;gde</strong></td>\r
+    <td>H&oslash;gde i pixler. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Stil</strong></td>\r
+    <td>Stilmal p&aring; tabellen. </td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>G&aring; til: <a href="index.htm">Innhaldsoversikt</a></td>\r
+    <td align="right"><a href="#">Toppen</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/nn/style.css b/webcit/tiny_mce/themes/advanced/docs/nn/style.css
new file mode 100644 (file)
index 0000000..722f537
--- /dev/null
@@ -0,0 +1,28 @@
+body { background-color: #FFFFFF; }\r
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }\r
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }\r
+.subtitle { font-size: 12px; font-weight: bold; }\r
+\r
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }\r
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }\r
+img { border: #000000 solid 1px; }\r
+\r
+a:visited { color: #666666; text-decoration: underline; }\r
+a:active { color: #666666; text-decoration: underline; }\r
+a:hover { color: #666666; text-decoration: underline; }\r
+a { color: #666666; text-decoration: underline; }\r
+\r
+.pageheader { border: #E0E0E0 solid 1px; }\r
+.pagefooter { border: #E0E0E0 solid 1px; }\r
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.samplecontent { font-size: 10px; }\r
+\r
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.codecontent { font-size: 10px; }\r
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }\r
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }\r
+\r
+hr { height: 1px; }\r
+\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/pl/about.htm b/webcit/tiny_mce/themes/advanced/docs/pl/about.htm
new file mode 100644 (file)
index 0000000..81c947c
--- /dev/null
@@ -0,0 +1,33 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<meta name="generator" content="WebSite PRO 4.3" />\r
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-2">\r
+<TITLE>O TinyMCE</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">O TinyMCE</span></td>\r
+    <td align="right"><a href="index.htm">Spis tre¶ci</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+TinyMCE jest ma³ym edytorem WYSWIWYG dla przegl±darek internetowych takich jak MSIE\r
+lub Mozilla, pozwalaj±cym na edytowanie zawarto¶ci strony HTML w sposób przyjazny dla\r
+u¿ytkownika. Posiada szeref funkcji znanych z popularnych edytorów tekstu, wiêc powinien\r
+byæ ³atwy w u¿yciu.<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Go to: <a href="index.htm">Spis tre¶ci</a></td>\r
+    <td align="right"><a href="#">Do góry</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/pl/common_buttons.htm b/webcit/tiny_mce/themes/advanced/docs/pl/common_buttons.htm
new file mode 100644 (file)
index 0000000..00a0b04
--- /dev/null
@@ -0,0 +1,164 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<meta name="generator" content="WebSite PRO 4.3" />\r
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-2">\r
+<TITLE>Wa¿niejsze przyciski</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Wa¿niejsze przyciski</span></td>\r
+    <td align="right"><a href="index.htm">Spis tre¶ci</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Poni¿ej znajduje siê krótki opis ka¿dego przycisku<img src="../../images/spacer.gif" width="1" height="1">\r
+<br>\r
+<br>\r
+<table border="1" cellpadding="3" cellspacing="0">\r
+  <tr>\r
+    <td><img src="../../images/bold.gif" width="20" height="20"></td>\r
+    <td>Pogrubienie tekstu.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/italic.gif" width="20" height="20"></td>\r
+    <td>Pochylenie tekstu.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/underline.gif" width="20" height="20"></td>\r
+    <td>Podkre¶lenie tekstu.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/strikethrough.gif" width="20" height="20"></td>\r
+    <td>Przekre¶lenie tekstu.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyleft.gif" width="20" height="20"></td>\r
+    <td>Wyrównanie do lewej</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifycenter.gif" width="20" height="20"></td>\r
+    <td>Wy¶rodkowanie.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyright.gif" width="20" height="20"></td>\r
+    <td>Wyrównanie do prawej.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyfull.gif" width="20" height="20"></td>\r
+    <td>Wyjustowanie.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/bullist.gif" width="20" height="20"></td>\r
+    <td>Lista nieuporz±dkowana/lista punktów.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/numlist.gif" width="20" height="20"></td>\r
+    <td>Lista uporz±dkowana/lista ponumerowana</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/outdent.gif" width="20" height="20"></td>\r
+    <td>Wysuniêcie/zmniejsz wciêcie.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/indent.gif" width="20" height="20"></td>\r
+    <td>Wciêcie/zwiêksz wciêcie.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/undo.gif" width="20" height="20"></td>\r
+    <td>Cofniêcie ostatnio wykonanej czynno¶ci</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/redo.gif" width="20" height="20"></td>\r
+    <td>Ponowienie ostatnio wykonanej czynno¶ci</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/link.gif" width="20" height="20"></td>\r
+    <td>Wstawienie nowego ³±cza, przeczytaj wiêcej o tej funkcji sekcji <a href="insert_link_button.htm">Wstaw\r
+      ³±cze</a>.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/unlink.gif" width="20" height="20"></td>\r
+    <td>Usuniêcie ³±cz z zaznaczonej czê¶ci/usuniêcie wszystkich zaznaczonych ³±cz.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/anchor.gif" width="20" height="20"></td>\r
+    <td>Wstawienie nowego zakotwiczenia, przeczytaj wiêcej o tej funkcji w sekcji <a href="insert_anchor_button.htm">Wstaw zakotwiczenie.</a></td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/image.gif" width="20" height="20"></td>\r
+    <td>Wstawienie nowego zdjêcia, przeczytaj wiêcej o tej funkcji w sekcji <a href="insert_image_button.htm">Wstaw\r
+      zdjêcie</a>.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/cleanup.gif" width="20" height="20"></td>\r
+    <td>Oczyszczenie kodu/usuniêcie niechcianeg formatowania. Ta funkcja jest pomocna kiedy\r
+      kopiujesz zawarto¶æ np. z worda.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/help.gif" width="20" height="20"></td>\r
+    <td>Pokazanie tego okna pomocy.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/code.gif" width="20" height="20"></td>\r
+    <td>Otwarcie edytora kodu HTML.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table.gif" width="20" height="20"></td>\r
+    <td>Wstawienie nowej tabeli 2x2 w bie¿±cej pozycji.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_row_before.gif" width="20" height="20"></td>\r
+    <td>Wstawienie wiersza ponad aktualnie zaznaczonym.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_row_after.gif" width="20" height="20"></td>\r
+    <td>Wstawienie wiersz poni¿ej aktualnie zaznaczonego.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_delete_row.gif" width="20" height="20"></td>\r
+    <td>Usuniêcie wiersza.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_col_before.gif" width="20" height="20"></td>\r
+    <td>Wstawienie kolumny przed aktualnie zaznaczon±.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_col_after.gif" width="20" height="20"></td>\r
+    <td>Wstawienie kolumny za aktualnie zaznaczon±.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_delete_col.gif" width="20" height="20"></td>\r
+    <td>Usuniêcie kolumny.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/hr.gif" width="20" height="20"></td>\r
+    <td>Wstawienie poziomej linii.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/removeformat.gif" width="20" height="20"></td>\r
+    <td>Usuniêcie formatowania z zaznaczonej czê¶ci.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/sub.gif" width="20" height="20"></td>\r
+    <td>Przekszta³cenie w indeks dolny. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/sup.gif" width="20" height="20"></td>\r
+    <td>Przekszta³cenie w indeks górny. </td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Id¼ do: <a href="index.htm">Spis tre¶ci</a></td>\r
+    <td align="right"><a href="#">Góra</a></td>\r
+  </tr>\r
+</table>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/pl/images/insert_anchor_window.gif b/webcit/tiny_mce/themes/advanced/docs/pl/images/insert_anchor_window.gif
new file mode 100644 (file)
index 0000000..c2e0833
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/pl/images/insert_anchor_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/pl/images/insert_image_window.gif b/webcit/tiny_mce/themes/advanced/docs/pl/images/insert_image_window.gif
new file mode 100644 (file)
index 0000000..3dbae3c
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/pl/images/insert_image_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/pl/images/insert_link_window.gif b/webcit/tiny_mce/themes/advanced/docs/pl/images/insert_link_window.gif
new file mode 100644 (file)
index 0000000..559def6
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/pl/images/insert_link_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/pl/images/insert_table_window.gif b/webcit/tiny_mce/themes/advanced/docs/pl/images/insert_table_window.gif
new file mode 100644 (file)
index 0000000..b02e34e
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/pl/images/insert_table_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/pl/index.htm b/webcit/tiny_mce/themes/advanced/docs/pl/index.htm
new file mode 100644 (file)
index 0000000..4a48d42
--- /dev/null
@@ -0,0 +1,28 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<meta name="generator" content="WebSite PRO 4.3" />\r
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-2">\r
+<TITLE>Spis pomocy</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+<BODY onload="window.focus();">\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Spis tre¶ci</span></td>\r
+    <td align="right">&nbsp;</td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Aby zobaczyæ poszczególne sekcje pomocy kliknij jeden z poni¿szych linków\r
+<ul class="toc_ul">\r
+  <li class="toc_li"><a href="about.htm">O TinyMCE</a></li>\r
+  <li class="toc_li"><a href="common_buttons.htm">Lista wa¿niejszych przycisków</a></li>\r
+  <li class="toc_li"><a href="insert_image_button.htm">Przycisk "Wstaw zdjêcie"</a></li>\r
+  <li class="toc_li"><a href="insert_link_button.htm">Przycisk "Wstaw ³±cze"</a></li>\r
+  <li class="toc_li"><a href="insert_anchor_button.htm">Przycisk "Wstaw zakotwiczenie"</a></li>\r
+  <li class="toc_li"><a href="insert_table_button.htm">Przycisk "Wstaw tabelê"</a></li>\r
+</ul>\r
+<hr noshade>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/pl/insert_anchor_button.htm b/webcit/tiny_mce/themes/advanced/docs/pl/insert_anchor_button.htm
new file mode 100644 (file)
index 0000000..3858714
--- /dev/null
@@ -0,0 +1,33 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<meta name="generator" content="WebSite PRO 4.3" />\r
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-2">\r
+<TITLE>Przycisk "Wstaw zakotwiczenie"</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+<BODY>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Przycisk "Wstaw zakotwiczenie"</span></td>\r
+    <td align="right"><a href="index.htm">Spis tre¶ci</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Ten przycisk otwiera nowe okno z funkcj± wstawienia/edycja zakotwiczenia.<br>\r
+<br>\r
+<img src="images/insert_anchor_window.gif" width="330" height="139"><br>\r
+<br>\r
+Jest tylko jedno pole w tym oknie, nale¿y tam wpisaæ nazwê punktu zakotwiczenia. Nale¿y pamiêtaæ, ¿e nazwa musi byæ\r
+unikatowa, nie powtarzaj±ca siê.\r
+<br><br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Id¼ do: <a href="index.htm">Spis tre¶ci</a></td>\r
+    <td align="right"><a href="#">Do góry</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/pl/insert_image_button.htm b/webcit/tiny_mce/themes/advanced/docs/pl/insert_image_button.htm
new file mode 100644 (file)
index 0000000..1578e9e
--- /dev/null
@@ -0,0 +1,65 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<meta name="generator" content="WebSite PRO 4.3" />\r
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-2">\r
+<TITLE>Przycisk "Wstaw zdjêcie"</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+<BODY>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Przycisk "Wstaw ³±cze"</span></td>\r
+    <td align="right"><a href="index.htm">Spis tre¶ci</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Przycisk "Wstaw zdjêcie" otwiera okno pokazane poni¿ej.<br>\r
+<br>\r
+<img src="images/insert_image_window.gif"><br>\r
+<br>\r
+Nale¿y podaæ adres URL lub scie¿kê dostêpu do zdjêcia które ma byæ wstawione i podaæ krótki opis\r
+zdjêcia, jest on wy¶wietlany jako alternatyny tekstowy opis zdjêcia umieszczonego na stronie.\r
+<br><br>\r
+<strong>Opis pól:</strong><br>\r
+<table border="1" cellspacing="0">\r
+  <tr>\r
+    <td width="150"><strong>Adres URL lub ¶cie¿ka dostêpu do zdjêcia</strong></td>\r
+    <td>URL/scie¿ka dostêpu do zdjêcia.</td>\r
+  </tr>\r
+  <tr>\r
+    <td width="150"><strong>Opis zdjêcia</strong></td>\r
+    <td>Tekst opisuj±cy zdjêcia.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Wymiary</strong></td>\r
+    <td>D³ugo¶æ/szeroko¶æ zdjêcia . </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Wyrównanie</strong></td>\r
+    <td>Wyrównanie zdjêcia, u¿yteczne przy zawijaniu tekstu wokó³ zdjêcia.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Krawêdzie</strong></td>\r
+    <td>Grubo¶æ krawêdzi.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Odstêp poziomy</strong></td>\r
+    <td>Odstêp poziomy, pomocne przy zawijaniu tesktu wokó³ zdjêcia.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Odstêp pionowy</strong></td>\r
+    <td>Odstêp pionowy, pomocne przy zawijaniu tesktu wokó³ zdjêcia.</td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Id¼ do: <a href="index.htm">Spis tre¶ci</a></td>\r
+    <td align="right"><a href="#">Do góry</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/pl/insert_link_button.htm b/webcit/tiny_mce/themes/advanced/docs/pl/insert_link_button.htm
new file mode 100644 (file)
index 0000000..5ad8263
--- /dev/null
@@ -0,0 +1,35 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<meta name="generator" content="WebSite PRO 4.3" />\r
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-2">\r
+<TITLE>Przycisk "Wstaw ³±cze"</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Przycisk "Wstaw ³±cze"</span></td>\r
+    <td align="right"><a href="index.htm">Spis tre¶ci</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Ten przycisk otwiera nowe okno, pozwalaj±ce na wstawienie lub edytowanie ³±cza.<br>\r
+<br>\r
+<img src="images/insert_link_window.gif" width="330" height="159"><br>\r
+<br>\r
+S± dwa pola w tym oknie, pierwsze &quot;Adres URL&quot; jest adresem URL ³±cza\r
+. "Cel" umo¿liwia ustalenie jak ³±cze ma byæ otwarte.<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Id¼ do: <a href="index.htm">Spis tre¶ci</a></td>\r
+    <td align="right"><a href="#">Do góry</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/pl/insert_table_button.htm b/webcit/tiny_mce/themes/advanced/docs/pl/insert_table_button.htm
new file mode 100644 (file)
index 0000000..b3a448c
--- /dev/null
@@ -0,0 +1,73 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<meta name="generator" content="WebSite PRO 4.3" />\r
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-2">\r
+<TITLE>Przycisk "Wstaw tabelê"</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Przycisk "Wstaw tabelê"</span></td>\r
+    <td align="right"><a href="index.htm">Spis tre¶ci</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Przycisk "Wstaw tabelê" otwiera okno pokazane poni¿ej. Mo¿na w ten sposób stworzyæ now± tabelê. <br>\r
+<br>\r
+<img src="images/insert_table_window.gif" width="340" height="229"><br>\r
+<br>\r
+<strong>Opis pól:</strong><br>\r
+<table border="1" cellspacing="0">\r
+  <tr>\r
+    <td width="150"><strong>Kolumny</strong></td>\r
+    <td>Liczba kolumn w tabeli. </td>\r
+  </tr>\r
+  <tr>\r
+    <td width="150"><strong>Wiersze</strong></td>\r
+    <td>Liczba wierszy w tabeli.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Cellpadding</strong></td>\r
+    <td>Odleg³o¶æ akapitu od krawêdzi komórki tabeli.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Cellspacing</strong></td>\r
+    <td>Szeroko¶æ krawêdzi komórek tabeli.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Wyrównanie</strong></td>\r
+    <td>Wyrównanie tabeli.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Krawêdzie</strong></td>\r
+    <td>Grubo¶æ krawêdzi tabeli.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Szeroko¶æ</strong></td>\r
+    <td>Szeroko¶æ tabeli w pikselach.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Wysoko¶æ</strong></td>\r
+    <td>Wysoko¶æ tabeli w pikselach.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Klasa</strong></td>\r
+    <td>Styl lub klasa CSS tabeli.</td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Id¼ do: <a href="index.htm">Spis tre¶ci</a></td>\r
+    <td align="right"><a href="#">Do góry</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/pl/style.css b/webcit/tiny_mce/themes/advanced/docs/pl/style.css
new file mode 100644 (file)
index 0000000..722f537
--- /dev/null
@@ -0,0 +1,28 @@
+body { background-color: #FFFFFF; }\r
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }\r
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }\r
+.subtitle { font-size: 12px; font-weight: bold; }\r
+\r
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }\r
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }\r
+img { border: #000000 solid 1px; }\r
+\r
+a:visited { color: #666666; text-decoration: underline; }\r
+a:active { color: #666666; text-decoration: underline; }\r
+a:hover { color: #666666; text-decoration: underline; }\r
+a { color: #666666; text-decoration: underline; }\r
+\r
+.pageheader { border: #E0E0E0 solid 1px; }\r
+.pagefooter { border: #E0E0E0 solid 1px; }\r
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.samplecontent { font-size: 10px; }\r
+\r
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.codecontent { font-size: 10px; }\r
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }\r
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }\r
+\r
+hr { height: 1px; }\r
+\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/sk/about.htm b/webcit/tiny_mce/themes/advanced/docs/sk/about.htm
new file mode 100644 (file)
index 0000000..e0dbac0
--- /dev/null
@@ -0,0 +1,32 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>O TinyMCE</TITLE>\r
+<meta http-equiv="content-type" content="text/html; charset=UTF-8">\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">O TinyMCE</span></td>\r
+    <td align="right"><a href="index.htm">Obsah</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+TinyMCE je malý WYSIWYG editor pre webovské prehliadače� ako sú MSIE nebo Mozilla,\r
+ktorým je možné upravovať obsah HTML omnoho jednoduchšie. Obsahuje bežné funkcie,\r
+ktoré je možné nájsť vo väčšine textových editorov, preto by jeho používanie nemalo\r
+byť zložité<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Choď na: <a href="index.htm">Obsah</a></td>\r
+    <td align="right"><a href="#">Nahor</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/sk/common_buttons.htm b/webcit/tiny_mce/themes/advanced/docs/sk/common_buttons.htm
new file mode 100644 (file)
index 0000000..7f9b7a8
--- /dev/null
@@ -0,0 +1,170 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>B��tla�tka</TITLE>\r
+<meta http-equiv="content-type" content="text/html; charset=UTF-8">\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Bežné tlačítka</span></td>\r
+    <td align="right"><a href="index.htm">Obsah</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Nižšie je popísané každé tlačitko.\r
+<img src="../../images/spacer.gif" width="1" height="1"> \r
+<br>\r
+<br>\r
+<table border="1" cellpadding="3" cellspacing="0">\r
+  <tr>\r
+    <td><img src="../../images/cut.gif" width="20" height="20"></td>\r
+    <td>Kopíruje aktuálne vybraný obsah do schránky. (Ctrl+C)</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/copy.gif" width="20" height="20"></td>\r
+    <td>Odstráni aktuálne vybraný obsah do schránky. (Ctrl+X)</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/paste.gif" width="20" height="20"></td>\r
+    <td>Vloží obsah schránky do okna editoru. (Ctrl+P)</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/bold.gif" width="20" height="20"></td>\r
+    <td>Zhrubne text.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/italic.gif" width="20" height="20"></td>\r
+    <td>Naformatuje text kurzívou.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/underline.gif" width="20" height="20"></td>\r
+    <td>Podčiarkne text.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/strikethrough.gif" width="20" height="20"></td>\r
+    <td>Preškrtne text.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyleft.gif" width="20" height="20"></td>\r
+    <td>Zarovná vľavo.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifycenter.gif" width="20" height="20"></td>\r
+    <td>Zarovná na sted.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyright.gif" width="20" height="20"></td>\r
+    <td>Zarovná vpravo.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyfull.gif" width="20" height="20"></td>\r
+    <td>Zarovná do bloku.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/bullist.gif" width="20" height="20"></td>\r
+    <td>Zoznam s odrážkami.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/numlist.gif" width="20" height="20"></td>\r
+    <td>Číslovaný zoznam.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/outdent.gif" width="20" height="20"></td>\r
+    <td>Predsadí/zníži odsadenie</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/indent.gif" width="20" height="20"></td>\r
+    <td>Odsadenie/zvýši odsadenie</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/undo.gif" width="20" height="20"></td>\r
+    <td>Vráti späť naposledy vykonanú akciu.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/redo.gif" width="20" height="20"></td>\r
+    <td>Obnový poslednú akciu.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/link.gif" width="20" height="20"></td>\r
+    <td>Vloží nový odkaz, viac o tejto funkcií v časti<a href="insert_link_button.htm">Vložiť odkaz</a>.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/unlink.gif" width="20" height="20"></td>\r
+    <td>Zruši odkaz v aktuálnom výbere/odstráni všetky vybrané odkazy.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/image.gif" width="20" height="20"></td>\r
+    <td>Vloží nový obrázok, viac o tejto funkcii v časti<a href="insert_image_button.htm">Vložiť obrázok</a>.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/cleanup.gif" width="20" height="20"></td>\r
+    <td>Vyčistí kód/odstráni nechcené formatovanie. Táto funkcia sa hodí keď kopírujete \r
+        obsah napríklad z kancelárskeho balíka.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/help.gif" width="20" height="20"></td>\r
+    <td>Zobrazí túto nápovedu.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/code.gif" width="20" height="20"></td>\r
+    <td>Otevorý editor s HTML zdrojom. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/table.gif" width="20" height="20"></td>\r
+    <td>Do aktuálnej pozície vloží novú 2x2 tabulku.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/table_insert_row_before.gif" width="20" height="20"></td>\r
+    <td>Pridá riadok pred akruálny.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/table_insert_row_after.gif" width="20" height="20"></td>\r
+    <td>Pridá riadok po aktuálny.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/table_delete_row.gif" width="20" height="20"></td>\r
+    <td>Odstráni riadok.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/table_insert_col_before.gif" width="20" height="20"></td>\r
+    <td>Pridá stĺpec pred aktuálny.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/table_insert_col_after.gif" width="20" height="20"></td>\r
+    <td>Pridá stĺpec za aktuálny.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/table_delete_col.gif" width="20" height="20"></td>\r
+    <td>Odstráni aktuálny stĺpec.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/hr.gif" width="20" height="20"></td>\r
+    <td>Pridá nový vodorovný oddeľovač.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/removeformat.gif" width="20" height="20"></td>\r
+    <td>Odstráni z výberu formatovanie.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/sub.gif" width="20" height="20"></td>\r
+    <td>Vytvorý z vybraného textu dolný index. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/sup.gif" width="20" height="20"></td>\r
+    <td>Vytvorý z vybreného textu horný index. </td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Choď na: <a href="index.htm">Obsah</a></td>\r
+    <td align="right"><a href="#">Nahor</a></td>\r
+  </tr>\r
+</table>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/sk/images/insert_image_window.png b/webcit/tiny_mce/themes/advanced/docs/sk/images/insert_image_window.png
new file mode 100644 (file)
index 0000000..5d9ea98
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/sk/images/insert_image_window.png differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/sk/images/insert_link_window.png b/webcit/tiny_mce/themes/advanced/docs/sk/images/insert_link_window.png
new file mode 100644 (file)
index 0000000..94a0c2e
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/sk/images/insert_link_window.png differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/sk/images/insert_table_window.png b/webcit/tiny_mce/themes/advanced/docs/sk/images/insert_table_window.png
new file mode 100644 (file)
index 0000000..17c46d0
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/sk/images/insert_table_window.png differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/sk/index.htm b/webcit/tiny_mce/themes/advanced/docs/sk/index.htm
new file mode 100644 (file)
index 0000000..e7b0ce5
--- /dev/null
@@ -0,0 +1,26 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>N�ov�a</TITLE>\r
+<meta http-equiv="content-type" content="text/html; charset=UTF-8">\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+<BODY onload="window.focus();">\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Obsah</span></td>\r
+    <td align="right">&nbsp;</td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Kliknutím na odkaz zvolíte požadovanú voľbu.\r
+<ul class="toc_ul">\r
+  <li class="toc_li"><a href="about.htm">O TinyMCE</a></li>\r
+  <li class="toc_li"><a href="common_buttons.htm">Bežné tlačítka</a></li>\r
+  <li class="toc_li"><a href="insert_image_button.htm">Tlačítko vložiť obrázok</a></li>\r
+  <li class="toc_li"><a href="insert_link_button.htm">Tlačítko vložiť odkaz</a></li>\r
+  <li class="toc_li"><a href="insert_table_button.htm">Tlačítko vložiť tabuľku</a></li>\r
+</ul>\r
+<hr noshade>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/sk/insert_image_button.htm b/webcit/tiny_mce/themes/advanced/docs/sk/insert_image_button.htm
new file mode 100644 (file)
index 0000000..5a9bb45
--- /dev/null
@@ -0,0 +1,66 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Tla�tko vloit obr�ek</TITLE>\r
+<meta http-equiv="content-type" content="text/html; charset=UTF-8">\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Tlačitko vložiť obrázok</span></td>\r
+    <td align="right"><a href="index.htm">Obsah</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Tlačitko vložiť obrázok otvorý následujúce okno.<br>\r
+<br>\r
+<img src="images/insert_image_window.png" width="348" height="290"><br>\r
+<br>\r
+Iba vložte URL obrázku, ktorý chcete pridať a zadajte jeho popis, ten bude\r
+zobrazovaný ako alternatívny popisok obrázku.<br>\r
+<br>\r
+<strong>Popis položiek:</strong><br>\r
+<table border="1" cellspacing="0">\r
+  <tr>\r
+    <td width="150"><strong>URL obrázku</strong></td>\r
+    <td>URL/cesta k obrázku.</td>\r
+  </tr>\r
+  <tr>\r
+    <td width="150"><strong>Popis obrázku</strong></td>\r
+    <td>Alternatívny popis toho, co je na obrázku.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Rozmery</strong></td>\r
+    <td>šírka/výška obrázku. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Zarovnávanie</strong></td>\r
+    <td>Zarovnávanie obrázku, vhodné pre obtekanie obrázku textom.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Ramček</strong></td>\r
+    <td>Hrúbka ramčeku.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Vertikálny okraj</strong></td>\r
+    <td>Vertikálny okraj, vhodné pre zalomenie textu okolo obrázku.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Horizontálny okraj</strong></td>\r
+    <td>Horizontány okraj, vhodné pre zalomenie textu okolo obrázku.</td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Choď na: <a href="index.htm">Obsah</a></td>\r
+    <td align="right"><a href="#">Nahor</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/sk/insert_link_button.htm b/webcit/tiny_mce/themes/advanced/docs/sk/insert_link_button.htm
new file mode 100644 (file)
index 0000000..d2e14c8
--- /dev/null
@@ -0,0 +1,34 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Tla�tko vloit odkaz</TITLE>\r
+<meta http-equiv="content-type" content="text/html; charset=UTF-8">\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Tlačitko vložiť odkaz</span></td>\r
+    <td align="right"><a href="index.htm">Obsah</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Toto tlačitko otvorý nové okno s možnosťou vložiť/upraviť odkaz.<br>\r
+<br>\r
+<img src="images/insert_link_window.png" width="328" height="160"><br>\r
+<br>\r
+V tomto okne sú dve položky. &quot;URL odkazu&quot; je adresa stráky, na \r
+ktorú odkazujeme. &quot;Cieľ&quot; určuje, ako môže byť odkazovaná stránka otvorená.<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Choď na: <a href="index.htm">Obsah</a></td>\r
+    <td align="right"><a href="#">Nahor</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/sk/insert_table_button.htm b/webcit/tiny_mce/themes/advanced/docs/sk/insert_table_button.htm
new file mode 100644 (file)
index 0000000..36a7d21
--- /dev/null
@@ -0,0 +1,68 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Tla�tko vloit tabulku</TITLE>\r
+<meta http-equiv="content-type" content="text/html; charset=UTF-8">\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Tlačítko vložiť tabuľku</span></td>\r
+    <td align="right"><a href="index.htm">Obsah</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Tlačítko vložiť tabuľku otvorý následujúce okno, vňom môžete definovať novú tabuľku.<br>\r
+<br>\r
+<img src="images/insert_table_window.png" width="338" height="210"><br>\r
+<br>\r
+<strong>Popis položiek:</strong><br>\r
+<table border="1" cellspacing="0">\r
+  <tr>\r
+    <td width="150"><strong>Stĺpce</strong></td>\r
+    <td>Počet stĺpcov v tabuľke.</td>\r
+  </tr>\r
+  <tr>\r
+    <td width="150"><strong>Riadky</strong></td>\r
+    <td>Počet riadkov v tabuľke.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Vnútorný okraj bunky</strong></td>\r
+    <td>Vnútorný okraj bunky.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Vnútorný okraj tabuľky�</strong></td>\r
+    <td>Vnútorný okraj tabuľky.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Zarovnanie</strong></td>\r
+    <td>Zarovnať tabuľky.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Riadok</strong></td>\r
+    <td>Hrúbka riadku tabuľky.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Šírka</strong></td>\r
+    <td>Šírka tabuľky v pixelech.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Výškaka</strong></td>\r
+    <td>Výška tabuľky v pixelech.</td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Choď na: <a href="index.htm">Obsah</a></td>\r
+    <td align="right"><a href="#">Nahor</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/sk/style.css b/webcit/tiny_mce/themes/advanced/docs/sk/style.css
new file mode 100644 (file)
index 0000000..f988e2a
--- /dev/null
@@ -0,0 +1,28 @@
+body { background-color: #FFFFFF; }\r
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }\r
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }\r
+.subtitle { font-size: 12px; font-weight: bold; }\r
+\r
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }\r
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }\r
+img { border: 0; }\r
+\r
+a:visited { color: #666666; text-decoration: underline; }\r
+a:active { color: #666666; text-decoration: underline; }\r
+a:hover { color: #666666; text-decoration: underline; }\r
+a { color: #666666; text-decoration: underline; }\r
+\r
+.pageheader { border: #E0E0E0 solid 1px; }\r
+.pagefooter { border: #E0E0E0 solid 1px; }\r
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.samplecontent { font-size: 10px; }\r
+\r
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.codecontent { font-size: 10px; }\r
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }\r
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }\r
+\r
+hr { height: 1px; }\r
+\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/sv/about.htm b/webcit/tiny_mce/themes/advanced/docs/sv/about.htm
new file mode 100644 (file)
index 0000000..8ea096a
--- /dev/null
@@ -0,0 +1,32 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>About TinyMCE</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Om TinyMCE</span></td>\r
+    <td align="right"><a href="index.htm">IF</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+TinyMCE &auml;r en liten WYSIWYG-editor f&ouml;r webl&auml;sare som\r
+MSIE och Mozilla vilken m&ouml;jligg&ouml;r f&ouml;r anv&auml;ndare att redigera \r
+HTML-inneh&aring;ll p&aring; ett mer anv&auml;ndarv&auml;nligt s&auml;tt.\r
+Applikationen har funktioner som liknar dem man finner i vanliga ordbehandlare\r
+och borde inte vara speciellt sv&aring;rt att anv&auml;nda.<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>G&aring; till: <a href="index.htm">Inneh&aring;llsf&ouml;rteckning</a></td>\r
+    <td align="right"><a href="#">Toppen</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/sv/common_buttons.htm b/webcit/tiny_mce/themes/advanced/docs/sv/common_buttons.htm
new file mode 100644 (file)
index 0000000..d256fa5
--- /dev/null
@@ -0,0 +1,163 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Common buttons</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Grundl&auml;ggande knappar</span></td>\r
+    <td align="right"><a href="index.htm">IF</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Nedan finner du en kort beskrivning av varje knapp/funktion.<br>\r
+<br>\r
+<table border="1" cellpadding="3" cellspacing="0">\r
+  <tr>\r
+    <td><img src="../../images/bold_de_se.gif" width="20" height="20"></td>\r
+    <td>Fet text.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/italic_de_se.gif" width="20" height="20"></td>\r
+    <td>Kursiv text.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/underline.gif" width="20" height="20"></td>\r
+    <td>Understruken text.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/strikethrough.gif" width="20" height="20"></td>\r
+    <td>Genomstruken text.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyleft.gif" width="20" height="20"></td>\r
+    <td>Rak v&auml;nstermarginal.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifycenter.gif" width="20" height="20"></td>\r
+    <td>Centrera.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyright.gif" width="20" height="20"></td>\r
+    <td>Rak h&ouml;germarginal.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyfull.gif" width="20" height="20"></td>\r
+    <td>Raka marginaler.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/bullist.gif" width="20" height="20"></td>\r
+    <td>Punktlista.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/numlist.gif" width="20" height="20"></td>\r
+    <td>Numrerad lista</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/outdent.gif" width="20" height="20"></td>\r
+    <td>Minska indrag.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/indent.gif" width="20" height="20"></td>\r
+    <td>&Ouml;ka utdrag.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/undo.gif" width="20" height="20"></td>\r
+    <td>&Aring;ngra senaste &auml;ndringen.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/redo.gif" width="20" height="20"></td>\r
+    <td>G&ouml;r om senaste &auml;ndringen.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/link.gif" width="20" height="20"></td>\r
+    <td>Skapa/Redigera l&auml;nk, l&auml;s mer om denna funktion i\r
+      kapitlet <a href="insert_link_button.htm">Skapa/Redigera l&auml;nk</a>.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/unlink.gif" width="20" height="20"></td>\r
+    <td>Ta bort l&auml;nkar fr&aring;n markerade l&auml;nkar.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/anchor.gif" width="20" height="20"></td>\r
+    <td>Skapa/Redigera ankare, l&auml;r mer om denna funktion i\r
+      kapitlet <a href="insert_anchor_button.htm">Skapa/Redigera ankare</a>.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/image.gif" width="20" height="20"></td>\r
+    <td>Skapa/Redigera bild, l&auml;r mer om denna funktion i \r
+      kapitlet <a href="insert_image_button.htm">Skapa/Redigera bild</a>.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/cleanup.gif" width="20" height="20"></td>\r
+    <td>Rensa/St&auml;da k&aring;den. Denna funktion tar bort on&ouml;dig\r
+      formatering. B&ouml;r anv&auml;ndas n&auml;r man t.ex. kopierar text\r
+      fr&aring;n Office-program. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/help.gif" width="20" height="20"></td>\r
+    <td>Visad denna hj&auml;lp.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/code.gif" width="20" height="20"></td>\r
+    <td>&Ouml;ppnar en HTML-k&auml;kodseditor . </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table.gif" width="20" height="20"></td>\r
+    <td>Skapar en ny tabell (2x2) . </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_row_before.gif" width="20" height="20"></td>\r
+    <td>Skapar en rad ovanf&ouml;r den nuvarande raden . </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_row_after.gif" width="20" height="20"></td>\r
+    <td>Skapar en rad under den nuvarande raden . </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_delete_row.gif" width="20" height="20"></td>\r
+    <td>Tar bort en rad. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_col_before.gif" width="20" height="20"></td>\r
+    <td>Skapar en kolumn f&ouml;re den nuvarande kolumnen. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_insert_col_after.gif" width="20" height="20"></td>\r
+    <td>Skapar en kolumn efter den nuvarande kolumnen. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../images/table_delete_col.gif" width="20" height="20"></td>\r
+    <td>Tar bort en kolumn. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/hr.gif" width="20" height="20"></td>\r
+    <td>Skapar en horisontell linje. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/removeformat.gif" width="20" height="20"></td>\r
+    <td>Tar bort formatering fr&aring;n markerat omr&aring;de. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/sub.gif" width="20" height="20"></td>\r
+    <td>Skapar neds&auml;nkt text. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/sup.gif" width="20" height="20"></td>\r
+    <td>Skapar upph&ouml;jd text. </td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>G&aring; till: <a href="index.htm">Inneh&aring;llsf&ouml;rteckning</a></td>\r
+    <td align="right"><a href="#">Toppen</a></td>\r
+  </tr>\r
+</table>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/sv/images/insert_anchor_window.gif b/webcit/tiny_mce/themes/advanced/docs/sv/images/insert_anchor_window.gif
new file mode 100644 (file)
index 0000000..1c38437
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/sv/images/insert_anchor_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/sv/images/insert_image_window.gif b/webcit/tiny_mce/themes/advanced/docs/sv/images/insert_image_window.gif
new file mode 100644 (file)
index 0000000..c3d7379
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/sv/images/insert_image_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/sv/images/insert_link_window.gif b/webcit/tiny_mce/themes/advanced/docs/sv/images/insert_link_window.gif
new file mode 100644 (file)
index 0000000..2a56e79
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/sv/images/insert_link_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/sv/images/insert_table_window.gif b/webcit/tiny_mce/themes/advanced/docs/sv/images/insert_table_window.gif
new file mode 100644 (file)
index 0000000..e8b69ef
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/sv/images/insert_table_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/sv/index.htm b/webcit/tiny_mce/themes/advanced/docs/sv/index.htm
new file mode 100644 (file)
index 0000000..afeb5ca
--- /dev/null
@@ -0,0 +1,27 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Help Index</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+<BODY onload="window.focus();">\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Inneh&aring;llsf&ouml;rteckning</span></td>\r
+    <td align="right">&nbsp;</td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Klicka p&aring; l&auml;nkarna nedan f&ouml;r att g&aring; till olika\r
+hj&auml;lp-kapitel. \r
+<ul class="toc_ul">\r
+  <li class="toc_li"><a href="about.htm">Om TinyMCE</a></li>\r
+  <li class="toc_li"><a href="common_buttons.htm">Grundl&auml;ggande funktioner</a></li>\r
+  <li class="toc_li"><a href="insert_image_button.htm">Skapa/Redigera bild</a></li>\r
+  <li class="toc_li"><a href="insert_link_button.htm">Skapa/Redigera l&auml;nk</a></li>\r
+  <li class="toc_li"><a href="insert_anchor_button.htm">Skapa/Redigera ankare </a></li>\r
+  <li class="toc_li"><a href="insert_table_button.htm">Skapa/Redigera tabell</a></li>\r
+</ul>\r
+<hr noshade>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/sv/insert_anchor_button.htm b/webcit/tiny_mce/themes/advanced/docs/sv/insert_anchor_button.htm
new file mode 100644 (file)
index 0000000..9aa4846
--- /dev/null
@@ -0,0 +1,34 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Skapa/Redigera l&auml;nk</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Skapa/Redigera ankare </span></td>\r
+    <td align="right"><a href="index.htm">IF</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Denna funktion &ouml;ppnar ett nytt f&ouml;nster liknande det nedan.<br>\r
+<br>\r
+<img src="images/insert_anchor_window.gif" width="330" height="139"><br>\r
+<br>\r
+Detta f&ouml;nster har ett f&auml;lt som man skall fylla i med ett unik\r
+namn, denna funktion  g&ouml;r det m&ouml;jligt att skapa\r
+ankarpunkter/bokm&auml;rken.<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>G&aring; till: <a href="index.htm">Inneh&aring;llsf&ouml;rteckning</a></td>\r
+    <td align="right"><a href="#">Toppen</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/sv/insert_image_button.htm b/webcit/tiny_mce/themes/advanced/docs/sv/insert_image_button.htm
new file mode 100644 (file)
index 0000000..9a583a1
--- /dev/null
@@ -0,0 +1,71 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Skapa/Redigera bild</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Skapa/Redigera bild</span></td>\r
+    <td align="right"><a href="index.htm">IF</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Funktionen "Skapa/Redigera bild" &ouml;ppnar ett nytt f&ouml;nster som ser ut som \r
+bilden nedan.<br>\r
+<br>\r
+<img src="images/insert_image_window.gif"><br>\r
+<br>\r
+I detta f&ouml;nster skriver du in URL:en till bilden du vill l&auml;nka till \r
+samt en bildbeskrivning, denna beskrivning kommer att visas som en alternativ \r
+text till bilden.<br>\r
+<br>\r
+<strong>Fältförklaring:</strong><br>\r
+<table border="1" cellspacing="0">\r
+  <tr>\r
+    <td width="150"><strong>Bilderns URL </strong></td>\r
+    <td>URL/s&ouml;kv&auml;g till bilden.</td>\r
+  </tr>\r
+  <tr>\r
+    <td width="150"><strong>Bildens beskrivning</strong></td>\r
+    <td>Bildens beskrivning, denna beskrivning kommer att visas som en\r
+      alternativ text till bilden.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Dimensioner</strong></td>\r
+    <td>Bildens bredd och h&ouml;jd. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Justering</strong></td>\r
+    <td>Bildens justering, kan vara anv&auml;ndbart n&auml;r man vill att\r
+      text skall flyta runt bilden. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Ram</strong></td>\r
+    <td>Bildramens bredd. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Vertikalt tomrum </strong></td>\r
+    <td>Vertikalt tomrum , kan vara anv&auml;ndbart n&auml;r man vill\r
+      att text skall flyta runt bilden. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Horizontellt tomrom</strong></td>\r
+    <td>Horisontellt tomrum, kan vara anv&auml;ndbart n&auml;r man vill\r
+      att text skall flyta runt bilden. </td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>G&aring; till: <a href="index.htm">Inneh&aring;llsf&ouml;rteckning</a></td>\r
+    <td align="right"><a href="#">Toppen</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/sv/insert_link_button.htm b/webcit/tiny_mce/themes/advanced/docs/sv/insert_link_button.htm
new file mode 100644 (file)
index 0000000..cc428aa
--- /dev/null
@@ -0,0 +1,33 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Skapa/Redigera l&auml;nk</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Skapa/Redigera l&auml;nk</span></td>\r
+    <td align="right"><a href="index.htm">IF</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Denna funktion &ouml;ppnar ett nytt f&ouml;nster liknande det nedan.<br>\r
+<br>\r
+<img src="images/insert_link_window.gif" width="330" height="159"><br>\r
+<br>\r
+Detta f&ouml;nster har tv&aring; f&auml;lt l&auml;nkens URL/adress samt hur l&auml;nken \r
+skall &ouml;ppnas.<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>G&aring; till: <a href="index.htm">Inneh&aring;llsf&ouml;rteckning</a></td>\r
+    <td align="right"><a href="#">Toppen</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/sv/insert_table_button.htm b/webcit/tiny_mce/themes/advanced/docs/sv/insert_table_button.htm
new file mode 100644 (file)
index 0000000..8cc1c95
--- /dev/null
@@ -0,0 +1,72 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Skapa/Redigera tabell</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css" />\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Skapa/Redigera tabell </span></td>\r
+    <td align="right"><a href="index.htm">IF</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Skapa tabell-knappen &ouml;ppnar ett nytt f&ouml;nster, med hj&auml;lp av\r
+detta f&ouml;nster kan du skapa tabeller. <br>\r
+<br>\r
+<img src="images/insert_table_window.gif" width="340" height="229"><br>\r
+<br>\r
+<strong>Fältförklaring:</strong><br>\r
+<table border="1" cellspacing="0">\r
+  <tr>\r
+    <td width="150"><strong>Kolumner</strong></td>\r
+    <td>Antal kolumner i tabellen. </td>\r
+  </tr>\r
+  <tr>\r
+    <td width="150"><strong>Rader</strong></td>\r
+    <td>Antal rader i tabellen .</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Cellutfyllnad</strong></td>\r
+    <td>Antal pixlars utfyllnad i varje cell. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Cellmellanrum</strong></td>\r
+    <td>Antal pixlars mellanrum mellan cellerna.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Justering</strong></td>\r
+    <td>Tabellens justering. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Rambredd</strong></td>\r
+    <td>Ramens bredd .</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Bredd</strong></td>\r
+    <td>Bredd i pixlar.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>H&ouml;jd</strong></td>\r
+    <td>H&ouml;jd i pixlar. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Stil</strong></td>\r
+    <td>Stilmall p&aring; tabellen. </td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Gå till: <a href="index.htm">Innehållsförteckning</a></td>\r
+    <td align="right"><a href="#">Toppen</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/sv/style.css b/webcit/tiny_mce/themes/advanced/docs/sv/style.css
new file mode 100644 (file)
index 0000000..722f537
--- /dev/null
@@ -0,0 +1,28 @@
+body { background-color: #FFFFFF; }\r
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }\r
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }\r
+.subtitle { font-size: 12px; font-weight: bold; }\r
+\r
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }\r
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }\r
+img { border: #000000 solid 1px; }\r
+\r
+a:visited { color: #666666; text-decoration: underline; }\r
+a:active { color: #666666; text-decoration: underline; }\r
+a:hover { color: #666666; text-decoration: underline; }\r
+a { color: #666666; text-decoration: underline; }\r
+\r
+.pageheader { border: #E0E0E0 solid 1px; }\r
+.pagefooter { border: #E0E0E0 solid 1px; }\r
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.samplecontent { font-size: 10px; }\r
+\r
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.codecontent { font-size: 10px; }\r
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }\r
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }\r
+\r
+hr { height: 1px; }\r
+\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/zh_cn/about.htm b/webcit/tiny_mce/themes/advanced/docs/zh_cn/about.htm
new file mode 100644 (file)
index 0000000..4d3c8b3
--- /dev/null
@@ -0,0 +1,29 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>¹ØÓÚTinyMCE</TITLE>\r
+<meta http-equiv="Content-Type" content="text/html; charset=gb2312">\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">¹ØÓÚ TinyMCE</span></td>\r
+    <td align="right"><a href="index.htm">ÄÚÈÝÌáÒª</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+TinyMCEÊÇÒ»ÖÖÊÊÓÃÓÚMSIEºÍMozillaµÈä¯ÀÀÆ÷µÄÇáÁ¿¼¶Ëù¼û¼´ËùµÃ±à¼­Æ÷£¬ÒÔ¸ü¼ÓÓѺõķ½Ê½¹©Óû§±à¼­HTMLÄÚÈÝ¡£Ëü¾ßÓд󲿷ÖÎÄ×Ö´¦ÀíÆ÷Ëù³£¼ûµÄ¹¦ÄÜ£¬²¢ÇÒÒ×ÓÚʹÓá£<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>·µ»Ø <a href="index.htm">ÄÚÈÝÌáÒª</a></td>\r
+    <td align="right"><a href="#">¶¥²¿</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/zh_cn/common_buttons.htm b/webcit/tiny_mce/themes/advanced/docs/zh_cn/common_buttons.htm
new file mode 100644 (file)
index 0000000..167a830
--- /dev/null
@@ -0,0 +1,160 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>³£Óð´Å¥</TITLE>\r
+<meta http-equiv="Content-Type" content="text/html; charset=gb2312">\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">³£Óð´Å¥</span></td>\r
+    <td align="right"><a href="index.htm">ÄÚÈÝÌáÒª</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+ÒÔÏÂÊÇÿ¸ö°´Å¥µÄ¼ò¶Ì˵Ã÷<img src="../../images/spacer.gif" width="1" height="1"> \r
+<br>\r
+<br>\r
+<table cellpadding="3" cellspacing="1" bgcolor="#000000">\r
+  <tr bgcolor="#FFFFFF">\r
+    <td><img src="../../images/bold.gif" width="20" height="20"></td>\r
+    <td>´ÖÌåÎÄ×ÖÑùʽ</td>\r
+  </tr>\r
+  <tr bgcolor="#FFFFFF">\r
+    <td><img src="../../images/italic.gif" width="20" height="20"></td>\r
+    <td>бÌåÎÄ×ÖÑùʽ</td>\r
+  </tr>\r
+  <tr bgcolor="#FFFFFF">\r
+    <td><img src="../../images/underline.gif" width="20" height="20"></td>\r
+    <td>Ï»®ÏßÎÄ×ÖÑùʽ</td>\r
+  </tr>\r
+  <tr bgcolor="#FFFFFF">\r
+    <td><img src="../../images/strikethrough.gif" width="20" height="20"></td>\r
+    <td>ɾ³ýÏßÎÄ×ÖÑùʽ</td>\r
+  </tr>\r
+  <tr bgcolor="#FFFFFF">\r
+    <td><img src="../../images/justifyleft.gif" width="20" height="20"></td>\r
+    <td>×ó¶ÔÆë</td>\r
+  </tr>\r
+  <tr bgcolor="#FFFFFF">\r
+    <td><img src="../../images/justifycenter.gif" width="20" height="20"></td>\r
+    <td>¾ÓÖжÔÆë</td>\r
+  </tr>\r
+  <tr bgcolor="#FFFFFF">\r
+    <td><img src="../../images/justifyright.gif" width="20" height="20"></td>\r
+    <td>ÓÒ¶ÔÆë</td>\r
+  </tr>\r
+  <tr bgcolor="#FFFFFF">\r
+    <td><img src="../../images/justifyfull.gif" width="20" height="20"></td>\r
+    <td>Á½¶Ë¶ÔÆë</td>\r
+  </tr>\r
+  <tr bgcolor="#FFFFFF">\r
+    <td><img src="../../images/bullist.gif" width="20" height="20"></td>\r
+    <td>ÎÞÐòÁбí</td>\r
+  </tr>\r
+  <tr bgcolor="#FFFFFF">\r
+    <td><img src="../../images/numlist.gif" width="20" height="20"></td>\r
+    <td>ÓÐÐòÁбí</td>\r
+  </tr>\r
+  <tr bgcolor="#FFFFFF">\r
+    <td><img src="../../images/outdent.gif" width="20" height="20"></td>\r
+    <td>¼õÉÙËõ½øÁ¿</td>\r
+  </tr>\r
+  <tr bgcolor="#FFFFFF">\r
+    <td><img src="../../images/indent.gif" width="20" height="20"></td>\r
+    <td>Ôö¼ÓËõ½øÁ¿</td>\r
+  </tr>\r
+  <tr bgcolor="#FFFFFF">\r
+    <td><img src="../../images/undo.gif" width="20" height="20"></td>\r
+    <td>³·ÏûÉÏÒ»²Ù×÷</td>\r
+  </tr>\r
+  <tr bgcolor="#FFFFFF">\r
+    <td><img src="../../images/redo.gif" width="20" height="20"></td>\r
+    <td>ÖØ×öÉÏÒ»²Ù×÷</td>\r
+  </tr>\r
+  <tr bgcolor="#FFFFFF">\r
+    <td><img src="../../images/link.gif" width="20" height="20"></td>\r
+    <td>²åÈëÐÂÁ´½Ó£¬µã»÷ <a href="insert_link_button.htm">²åÈëÁ´½Ó°´Å¥</a> Õ½ÚÒԲ鿴¸ü¶àÄÚÈÝ¡£</td>\r
+  </tr>\r
+  <tr bgcolor="#FFFFFF">\r
+    <td><img src="../../images/unlink.gif" width="20" height="20"></td>\r
+    <td>ɾ³ýµ±Ç°Ñ¡¶¨µÄÁ´½Ó/ÒƳýÈ«²¿Ñ¡¶¨µÄÁ´½Ó</td>\r
+  </tr>\r
+  <tr bgcolor="#FFFFFF">\r
+    <td><img src="../../images/anchor.gif" width="20" height="20"></td>\r
+    <td>²åÈëÐÂêµã£¬µã»÷ <a href="insert_anchor_button.htm">²åÈëêµã°´Å¥</a> Õ½ÚÒԲ鿴¸ü¶àÄÚÈÝ¡£</td>\r
+  </tr>\r
+  <tr bgcolor="#FFFFFF">\r
+    <td><img src="../../images/image.gif" width="20" height="20"></td>\r
+    <td>²åÈëÐÂͼÏñ£¬µã»÷ <a href="insert_image_button.htm">²åÈëͼÏñ°´Å¥</a> Õ½ÚÒԲ鿴¸ü¶àÄÚÈÝ¡£</td>\r
+  </tr>\r
+  <tr bgcolor="#FFFFFF">\r
+    <td><img src="../../images/cleanup.gif" width="20" height="20"></td>\r
+    <td>ÇåÀí´úÂë/Çå³ýËùÓв»ÐèÒªµÄ¸ñʽ¡£´Ë¹¦ÄÜÔÚÄã´ÓofficeµÈ²úÆ·Öи´ÖÆÄÚÈݽøÀ´µÄʱºòÌرðÓÐÓá£</td>\r
+  </tr>\r
+  <tr bgcolor="#FFFFFF">\r
+    <td><img src="../../images/help.gif" width="20" height="20"></td>\r
+    <td>ÏÔʾ´Ë°ïÖú´°¿Ú</td>\r
+  </tr>\r
+  <tr bgcolor="#FFFFFF">\r
+    <td><img src="../../images/code.gif" width="20" height="20"></td>\r
+    <td>´ò¿ªHTML´úÂë±à¼­Æ÷</td>\r
+  </tr>\r
+  <tr bgcolor="#FFFFFF">\r
+    <td><img src="../images/table.gif" width="20" height="20"></td>\r
+    <td>ÔÚµ±Ç°Î»ÖòåÈëÒ»ÕÅ2¡Á2µÄ±í¸ñ</td>\r
+  </tr>\r
+  <tr bgcolor="#FFFFFF">\r
+    <td><img src="../images/table_insert_row_before.gif" width="20" height="20"></td>\r
+    <td>ÔÚµ±Ç°ÐеÄÇ°Ãæ²åÈëÐÂÐÐ</td>\r
+  </tr>\r
+  <tr bgcolor="#FFFFFF">\r
+    <td><img src="../images/table_insert_row_after.gif" width="20" height="20"></td>\r
+    <td>ÔÚµ±Ç°ÐеĺóÃæ²åÈëÐÂÐÐ</td>\r
+  </tr>\r
+  <tr bgcolor="#FFFFFF">\r
+    <td><img src="../images/table_delete_row.gif" width="20" height="20"></td>\r
+    <td>ɾ³ýµ±Ç°ÐÐ</td>\r
+  </tr>\r
+  <tr bgcolor="#FFFFFF">\r
+    <td><img src="../images/table_insert_col_before.gif" width="20" height="20"></td>\r
+    <td>ÔÚµ±Ç°ÁеÄÇ°Ãæ²åÈëÐÂÁÐ</td>\r
+  </tr>\r
+  <tr bgcolor="#FFFFFF">\r
+    <td><img src="../images/table_insert_col_after.gif" width="20" height="20"></td>\r
+    <td>ÔÚµ±Ç°ÁеĺóÃæ²åÈëÐÂÁÐ</td>\r
+  </tr>\r
+  <tr bgcolor="#FFFFFF">\r
+    <td><img src="../images/table_delete_col.gif" width="20" height="20"></td>\r
+    <td>ɾ³ýµ±Ç°ÁÐ</td>\r
+  </tr>\r
+  <tr bgcolor="#FFFFFF">\r
+    <td><img src="../../images/hr.gif" width="20" height="20"></td>\r
+    <td>²åÈëˮƽÏß</td>\r
+  </tr>\r
+  <tr bgcolor="#FFFFFF">\r
+    <td><img src="../../images/removeformat.gif" width="20" height="20"></td>\r
+    <td>ÒƳýËùÑ¡ÎÄ×ֵĸñʽ</td>\r
+  </tr>\r
+  <tr bgcolor="#FFFFFF">\r
+    <td><img src="../../images/sub.gif" width="20" height="20"></td>\r
+    <td>½«ËùÑ¡ÎÄ×Ö×öΪϱê</td>\r
+  </tr>\r
+  <tr bgcolor="#FFFFFF">\r
+    <td><img src="../../images/sup.gif" width="20" height="20"></td>\r
+    <td>½«ËùÑ¡ÎÄ×Ö×öΪÉϱê</td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>·µ»Ø <a href="index.htm">ÄÚÈÝÌáÒª</a></td>\r
+    <td align="right"><a href="#">¶¥²¿</a></td>\r
+  </tr>\r
+</table>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/zh_cn/images/insert_anchor_window.gif b/webcit/tiny_mce/themes/advanced/docs/zh_cn/images/insert_anchor_window.gif
new file mode 100644 (file)
index 0000000..21513ad
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/zh_cn/images/insert_anchor_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/zh_cn/images/insert_image_window.gif b/webcit/tiny_mce/themes/advanced/docs/zh_cn/images/insert_image_window.gif
new file mode 100644 (file)
index 0000000..1a92b07
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/zh_cn/images/insert_image_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/zh_cn/images/insert_link_window.gif b/webcit/tiny_mce/themes/advanced/docs/zh_cn/images/insert_link_window.gif
new file mode 100644 (file)
index 0000000..bcb3976
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/zh_cn/images/insert_link_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/zh_cn/images/insert_table_window.gif b/webcit/tiny_mce/themes/advanced/docs/zh_cn/images/insert_table_window.gif
new file mode 100644 (file)
index 0000000..e9d114b
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/docs/zh_cn/images/insert_table_window.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/docs/zh_cn/index.htm b/webcit/tiny_mce/themes/advanced/docs/zh_cn/index.htm
new file mode 100644 (file)
index 0000000..1dd52cd
--- /dev/null
@@ -0,0 +1,27 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>°ïÖúË÷Òý</TITLE>\r
+<meta http-equiv="Content-Type" content="text/html; charset=gb2312">\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+<BODY onload="window.focus();">\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">ÄÚÈÝÌáÒª</span></td>\r
+    <td align="right">&nbsp;</td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Çëµã»÷ÒÔÏÂÁ´½ÓÀ´²é¿´°ïÖúÄÚÈÝÖеIJ»Í¬Õ½Ú. \r
+<ul class="toc_ul">\r
+  <li class="toc_li"><a href="about.htm">¹ØÓÚTinyMCE</a></li>\r
+  <li class="toc_li"><a href="common_buttons.htm">³£Óð´Å¥</a></li>\r
+  <li class="toc_li"><a href="insert_image_button.htm">²åÈëͼÏñ°´Å¥</a></li>\r
+  <li class="toc_li"><a href="insert_link_button.htm">²åÈëÁ´½Ó°´Å¥</a></li>\r
+  <li class="toc_li"><a href="insert_anchor_button.htm">²åÈëêµã°´Å¥</a></li>\r
+  <li class="toc_li"><a href="insert_table_button.htm">²åÈë±í¸ñ°´Å¥</a></li>\r
+</ul>\r
+<hr noshade>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/zh_cn/insert_anchor_button.htm b/webcit/tiny_mce/themes/advanced/docs/zh_cn/insert_anchor_button.htm
new file mode 100644 (file)
index 0000000..bbb7558
--- /dev/null
@@ -0,0 +1,31 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>²åÈëêµã°´Å¥</TITLE>\r
+<meta http-equiv="Content-Type" content="text/html; charset=gb2312">\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">²åÈëêµã°´Å¥</span></td>\r
+    <td align="right"><a href="index.htm">ÄÚÈÝÌáÒª</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>´Ë°´Å¥»á´ò¿ª²åÈë/±à¼­ÃªµãµÄ¶Ô»°´°¿Ú£º<br>\r
+<br>\r
+<img src="images/insert_anchor_window.gif" width="320" height="127"><br>\r
+<br>´°¿ÚÖÐÖ»ÓÐÒ»¸öÎı¾Óò£¬Äã¿ÉÒÔÔÚ´ËÊäÈëêµãÃû³Æ£¬ÐèҪעÒâµÄÊÇêµãÃû³Æ±ØÐëÊÇΨһµÄ¡£<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>·µ»Ø <a href="index.htm">ÄÚÈÝÌáÒª</a></td>\r
+    <td align="right"><a href="#">¶¥²¿</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/zh_cn/insert_image_button.htm b/webcit/tiny_mce/themes/advanced/docs/zh_cn/insert_image_button.htm
new file mode 100644 (file)
index 0000000..68bd326
--- /dev/null
@@ -0,0 +1,63 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>²åÈëͼÏñ°´Å¥</TITLE>\r
+<meta http-equiv="Content-Type" content="text/html; charset=gb2312">\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">²åÈëͼÏñ°´Å¥</span></td>\r
+    <td align="right"><a href="index.htm">ÄÚÈÝÌáÒª</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>µã»÷<U>²åÈëͼƬ</U>°´Å¥ºó»á´ò¿ªÒÔÏ´°¿Ú£º<br>\r
+<br>\r
+<img src="images/insert_image_window.gif" width="340" height="295"><br>\r
+<br>ÄãÖ»Ðè¼òµ¥µÄÊäÈëÐèÒªÁ¬½ÓµÄͼÏñµØÖ·¼°Í¼ÏñÃèÊö£¨Í¼ÏñµÄÌæ´úÎÄ×Ö£©<br>\r
+<br>\r
+<strong>²ÎÊý˵Ã÷£º</strong><br>\r
+<table cellpadding="3" cellspacing="1" bgcolor="#000000">\r
+  <tr>\r
+    <td width="150" bgcolor="#EEEEEE"><strong>ͼÏñµØÖ·</strong></td>\r
+    <td bgcolor="#FFFFFF">Òª²åÈëµÄͼƬµÄURL</td>\r
+  </tr>\r
+  <tr>\r
+    <td width="150" bgcolor="#EEEEEE"><strong>ͼÏñÃèÊö</strong></td>\r
+    <td bgcolor="#FFFFFF">ͼƬÄÚÈݵÄÌæ´úÎÄ×ÖÃèÊö</td>\r
+  </tr>\r
+  <tr>\r
+    <td bgcolor="#EEEEEE"><strong>άÊý</strong></td>\r
+    <td bgcolor="#FFFFFF">ͼÏñ¿í¶ÈÓë¸ß¶È</td>\r
+  </tr>\r
+  <tr>\r
+    <td bgcolor="#EEEEEE"><strong>¶ÔÆ뷽ʽ</strong></td>\r
+    <td bgcolor="#FFFFFF">ͼÏñµÄ¶ÔÆ뷽ʽ£¬ÔÚÎÄ×Ö»·ÈÆͼÏñʱÌرðÓÐÓá£</td>\r
+  </tr>\r
+  <tr>\r
+    <td bgcolor="#EEEEEE"><strong>±ß¿ò</strong></td>\r
+    <td bgcolor="#FFFFFF">ͼÏñ±ß¿òµÄºñ¶È</td>\r
+  </tr>\r
+  <tr>\r
+    <td bgcolor="#EEEEEE"><strong>ˮƽ¼ä¾à</strong></td>\r
+    <td bgcolor="#FFFFFF">ͼÏñˮƽ¼ä¾à£¬ÔÚÎÄ×Ö»·ÈÆͼÏñʱÌرðÓÐÓá£</td>\r
+  </tr>\r
+  <tr>\r
+    <td bgcolor="#EEEEEE"><strong>´¹Ö±¼ä¾à</strong></td>\r
+    <td bgcolor="#FFFFFF">ͼÏñ´¹Ö±¼ä¾à£¬ÔÚÎÄ×Ö»·ÈÆͼÏñʱÌرðÓÐÓá£</td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>·µ»Ø <a href="index.htm">ÄÚÈÝÌáÒª</a></td>\r
+    <td align="right"><a href="#">¶¥²¿</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/zh_cn/insert_link_button.htm b/webcit/tiny_mce/themes/advanced/docs/zh_cn/insert_link_button.htm
new file mode 100644 (file)
index 0000000..64944e3
--- /dev/null
@@ -0,0 +1,32 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>²åÈëÁ´½Ó°´Å¥</TITLE>\r
+<meta http-equiv="Content-Type" content="text/html; charset=gb2312">\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">²åÈëÁ´½Ó°´Å¥</span></td>\r
+    <td align="right"><a href="index.htm">ÄÚÈÝÌáÒª</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>´Ë°´Å¥»á´ò¿ª²åÈë/±à¼­Á´½ÓµÄ¶Ô»°´°¿Ú£º<br>\r
+<br>\r
+<img src="images/insert_link_window.gif" width="320" height="155" border="0"><br>\r
+<br>´°¿ÚÖÐÓÐÁ½¸ö±íµ¥Óò£¬µÚÒ»¸öÊÇÁ´½ÓµÄµØÖ·£¬µÚ¶þ¸öÊÇÁ´½ÓµÄ´ò¿ª·½Ê½¡£\r
+<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>·µ»Ø <a href="index.htm">ÄÚÈÝÌáÒª</a></td>\r
+    <td align="right"><a href="#">¶¥²¿</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/zh_cn/insert_table_button.htm b/webcit/tiny_mce/themes/advanced/docs/zh_cn/insert_table_button.htm
new file mode 100644 (file)
index 0000000..b34ca1f
--- /dev/null
@@ -0,0 +1,71 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>²åÈë±í¸ñ°´Å¥</TITLE>\r
+<meta http-equiv="Content-Type" content="text/html; charset=gb2312">\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">²åÈë±í¸ñ°´Å¥</span></td>\r
+    <td align="right"><a href="index.htm">ÄÚÈÝÌáÒª</a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>µã»÷<U>²åÈë±í¸ñ</U>°´Å¥»á´ò¿ªÒÔÏ´°¿Ú£¬´Ë²Ù×÷ÔÊÐíÄã´´½¨±í¸ñ¡£<br>\r
+<br>\r
+<img src="images/insert_table_window.gif" width="340" height="239" border="0"><br>\r
+<br>\r
+<strong>²ÎÊý˵Ã÷£º</strong><br>\r
+<table cellpadding="3" cellspacing="1" bgcolor="#000000">\r
+  <tr>\r
+    <td width="150" bgcolor="#EEEEEE"><strong>ÁÐÊý</strong></td>\r
+    <td bgcolor="#FFFFFF">±í¸ñÁÐÊý</td>\r
+  </tr>\r
+  <tr>\r
+    <td width="150" bgcolor="#EEEEEE"><strong>ÐÐÊý</strong></td>\r
+    <td bgcolor="#FFFFFF">±í¸ñÐÐÊý</td>\r
+  </tr>\r
+  <tr>\r
+    <td bgcolor="#EEEEEE"><strong>Ìî³ä</strong></td>\r
+    <td bgcolor="#FFFFFF">±í¸ñµ¥Ôª¸ñµÄÌî³äÖµ</td>\r
+  </tr>\r
+  <tr>\r
+    <td bgcolor="#EEEEEE"><strong>¼ä¾à</strong></td>\r
+    <td bgcolor="#FFFFFF">±í¸ñµ¥Ôª¸ñ¼ä¾à</td>\r
+  </tr>\r
+  <tr>\r
+    <td bgcolor="#EEEEEE"><strong>¶ÔÆ뷽ʽ</strong></td>\r
+    <td bgcolor="#FFFFFF">±í¸ñ¶ÔÆ뷽ʽ</td>\r
+  </tr>\r
+  <tr>\r
+    <td bgcolor="#EEEEEE"><strong>±ß¿ò</strong></td>\r
+    <td bgcolor="#FFFFFF">±í¸ñ±ß¿ò¿í¶È</td>\r
+  </tr>\r
+  <tr>\r
+    <td bgcolor="#EEEEEE"><strong>¿í¶È</strong></td>\r
+    <td bgcolor="#FFFFFF">±í¸ñ¿í¶È£¬ÒÔÏóËØΪµ¥Î»¡£</td>\r
+  </tr>\r
+  <tr>\r
+    <td bgcolor="#EEEEEE"><strong>¸ß¶È</strong></td>\r
+    <td bgcolor="#FFFFFF">±í¸ñ¸ß¶È£¬ÒÔÏóËØΪµ¥Î»¡£</td>\r
+  </tr>\r
+  <tr>\r
+    <td bgcolor="#EEEEEE"><strong>ÀàÃû</strong></td>\r
+    <td bgcolor="#FFFFFF">±í¸ñcssÑùʽÃû</td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>·µ»Ø <a href="index.htm">ÄÚÈÝÌáÒª</a></td>\r
+    <td align="right"><a href="#">¶¥²¿</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/webcit/tiny_mce/themes/advanced/docs/zh_cn/style.css b/webcit/tiny_mce/themes/advanced/docs/zh_cn/style.css
new file mode 100644 (file)
index 0000000..722f537
--- /dev/null
@@ -0,0 +1,28 @@
+body { background-color: #FFFFFF; }\r
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }\r
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }\r
+.subtitle { font-size: 12px; font-weight: bold; }\r
+\r
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }\r
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }\r
+img { border: #000000 solid 1px; }\r
+\r
+a:visited { color: #666666; text-decoration: underline; }\r
+a:active { color: #666666; text-decoration: underline; }\r
+a:hover { color: #666666; text-decoration: underline; }\r
+a { color: #666666; text-decoration: underline; }\r
+\r
+.pageheader { border: #E0E0E0 solid 1px; }\r
+.pagefooter { border: #E0E0E0 solid 1px; }\r
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.samplecontent { font-size: 10px; }\r
+\r
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.codecontent { font-size: 10px; }\r
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }\r
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }\r
+\r
+hr { height: 1px; }\r
+\r
diff --git a/webcit/tiny_mce/themes/advanced/editor_template.js b/webcit/tiny_mce/themes/advanced/editor_template.js
new file mode 100644 (file)
index 0000000..1b1d9a2
--- /dev/null
@@ -0,0 +1,12 @@
+tinyMCE.importThemeLanguagePack('advanced');var TinyMCE_advanced_autoImportCSSClasses=true;var TinyMCE_advanced_resizer=new Object();var TinyMCE_advanced_buttons=[['bold','{$lang_bold_img}','{$lang_bold_desc}','Bold'],['italic','{$lang_italic_img}','{$lang_italic_desc}','Italic'],['underline','{$lang_underline_img}','{$lang_underline_desc}','Underline'],['strikethrough','strikethrough.gif','{$lang_striketrough_desc}','Strikethrough'],['justifyleft','justifyleft.gif','{$lang_justifyleft_desc}','JustifyLeft'],['justifycenter','justifycenter.gif','{$lang_justifycenter_desc}','JustifyCenter'],['justifyright','justifyright.gif','{$lang_justifyright_desc}','JustifyRight'],['justifyfull','justifyfull.gif','{$lang_justifyfull_desc}','JustifyFull'],['bullist','bullist.gif','{$lang_bullist_desc}','InsertUnorderedList'],['numlist','numlist.gif','{$lang_numlist_desc}','InsertOrderedList'],['outdent','outdent.gif','{$lang_outdent_desc}','Outdent'],['indent','indent.gif','{$lang_indent_desc}','Indent'],['cut','cut.gif','{$lang_cut_desc}','Cut'],['copy','copy.gif','{$lang_copy_desc}','Copy'],['paste','paste.gif','{$lang_paste_desc}','Paste'],['undo','undo.gif','{$lang_undo_desc}','Undo'],['redo','redo.gif','{$lang_redo_desc}','Redo'],['link','link.gif','{$lang_link_desc}','mceLink',true],['unlink','unlink.gif','{$lang_unlink_desc}','unlink'],['image','image.gif','{$lang_image_desc}','mceImage',true],['cleanup','cleanup.gif','{$lang_cleanup_desc}','mceCleanup'],['help','help.gif','{$lang_help_desc}','mceHelp'],['code','code.gif','{$lang_theme_code_desc}','mceCodeEditor'],['hr','hr.gif','{$lang_theme_hr_desc}','inserthorizontalrule'],['removeformat','removeformat.gif','{$lang_theme_removeformat_desc}','removeformat'],['sub','sub.gif','{$lang_theme_sub_desc}','subscript'],['sup','sup.gif','{$lang_theme_sup_desc}','superscript'],['forecolor','forecolor.gif','{$lang_theme_forecolor_desc}','mceForeColor',true],['backcolor','backcolor.gif','{$lang_theme_backcolor_desc}','mceBackColor',true],['charmap','charmap.gif','{$lang_theme_charmap_desc}','mceCharMap'],['visualaid','visualaid.gif','{$lang_theme_visualaid_desc}','mceToggleVisualAid'],['anchor','anchor.gif','{$lang_theme_anchor_desc}','mceInsertAnchor'],['newdocument','newdocument.gif','{$lang_newdocument_desc}','mceNewDocument']];function TinyMCE_advanced_getControlHTML(button_name){var buttonTileMap=new Array('anchor.gif','backcolor.gif','bullist.gif','justifycenter.gif','charmap.gif','cleanup.gif','code.gif','copy.gif','custom_1.gif','cut.gif','forecolor.gif','justifyfull.gif','help.gif','hr.gif','image.gif','indent.gif','justifyleft.gif','link.gif','numlist.gif','outdent.gif','paste.gif','redo.gif','removeformat.gif','justifyright.gif','strikethrough.gif','sub.gif','sup.gif','undo.gif','unlink.gif','visualaid.gif');for(var i=0;i<TinyMCE_advanced_buttons.length;i++){var but=TinyMCE_advanced_buttons[i];if(but[0]==button_name){if(tinyMCE.settings['button_tile_map']){for(var x=0;!tinyMCE.isMSIE&&x<buttonTileMap.length;x++){if(buttonTileMap[x]==but[1]){var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\''+but[3]+'\','+(but.length>4?but[4]:false)+(but.length>5?',\''+but[5]+'\'':'')+')';return '<a href="javascript:'+cmd+'" onclick="'+cmd+';return false;" onmousedown="return false;" target="_self"><img id="{$editor_id}_'+but[0]+'" src="{$themeurl}/images/spacer.gif" style="background-image:url({$themeurl}/images/buttons.gif); background-position: '+(0-(x*20))+'px 0px" title="'+but[2]+'" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';}}}var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\''+but[3]+'\','+(but.length>4?but[4]:false)+(but.length>5?',\''+but[5]+'\'':'')+')';return '<a href="javascript:'+cmd+'" onclick="'+cmd+';return false;" onmousedown="return false;" target="_self"><img id="{$editor_id}_'+but[0]+'" src="{$themeurl}/images/'+but[1]+'" title="'+but[2]+'" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';}}switch(button_name){case "formatselect":var html='<select id="{$editor_id}_formatSelect" name="{$editor_id}_formatSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'FormatBlock\',false,this.options[this.selectedIndex].value);" class="mceSelectList">';var formats=tinyMCE.getParam("theme_advanced_blockformats","p,address,pre,h1,h2,h3,h4,h5,h6",true).split(',');var lookup=[['p','{$lang_theme_paragraph}'],['address','{$lang_theme_address}'],['pre','{$lang_theme_pre}'],['h1','{$lang_theme_h1}'],['h2','{$lang_theme_h2}'],['h3','{$lang_theme_h3}'],['h4','{$lang_theme_h4}'],['h5','{$lang_theme_h5}'],['h6','{$lang_theme_h6}']];html+='<option value="">{$lang_theme_block}</option>';for(var i=0;i<formats.length;i++){for(var x=0;x<lookup.length;x++){if(formats[i]==lookup[x][0]){html+='<option value="<'+lookup[x][0]+'>">'+lookup[x][1]+'</option>';}}}html+='</select>';return html;case "styleselect":return '<select id="{$editor_id}_styleSelect" onmousedown="TinyMCE_advanced_setupCSSClasses(\'{$editor_id}\');" name="{$editor_id}_styleSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceSetCSSClass\',false,this.options[this.selectedIndex].value);" class="mceSelectList">{$style_select_options}</select>';case "fontselect":var fontHTML='<select id="{$editor_id}_fontNameSelect" name="{$editor_id}_fontNameSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'FontName\',false,this.options[this.selectedIndex].value);" class="mceSelectList"><option value="">{$lang_theme_fontdefault}</option>';var iFonts='Arial=arial,helvetica,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,times new roman,times,serif;Tahoma=tahoma,arial,helvetica,sans-serif;Times New Roman=times new roman,times,serif;Verdana=verdana,arial,helvetica,sans-serif;Impact=impact;WingDings=wingdings';var nFonts='Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sand;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats';var fonts=tinyMCE.getParam("theme_advanced_fonts",nFonts).split(';');for(var i=0;i<fonts.length;i++){if(fonts[i]!=''){var parts=fonts[i].split('=');fontHTML+='<option value="'+parts[1]+'">'+parts[0]+'</option>';}}fontHTML+='</select>';return fontHTML;case "fontsizeselect":return '<select id="{$editor_id}_fontSizeSelect" name="{$editor_id}_fontSizeSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'FontSize\',false,this.options[this.selectedIndex].value);" class="mceSelectList">\\r
+               <option value="0">{$lang_theme_font_size}</option>\\r
+               <option value="1">1 (8 pt)</option>\\r
+               <option value="2">2 (10 pt)</option>\\r
+               <option value="3">3 (12 pt)</option>\\r
+               <option value="4">4 (14 pt)</option>\\r
+               <option value="5">5 (18 pt)</option>\\r
+               <option value="6">6 (24 pt)</option>\\r
+               <option value="7">7 (36 pt)</option>\\r
+               </select>';case "|":case "separator":return '<img src="{$themeurl}/images/spacer.gif" width="1" height="15" class="mceSeparatorLine">';case "spacer":return '<img src="{$themeurl}/images/spacer.gif" width="1" height="15" border="0" class="mceSeparatorLine" style="vertical-align: middle" />';case "rowseparator":return '<br />';}return "";}function TinyMCE_advanced_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mceForeColor":var template=new Array();var elm=tinyMCE.selectedInstance.getFocusElement();var inputColor=tinyMCE.getAttrib(elm,"color");if(inputColor=='')inputColor=elm.style.color;if(!inputColor)inputColor="#000000";template['file']='color_picker.htm';template['width']=220;template['height']=190;tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes",command:"forecolor",input_color:inputColor});return true;case "mceBackColor":var template=new Array();var elm=tinyMCE.selectedInstance.getFocusElement();var inputColor=elm.style.backgroundColor;if(!inputColor)inputColor="#000000";template['file']='color_picker.htm';template['width']=220;template['height']=190;template['width']+=tinyMCE.getLang('lang_theme_advanced_backcolor_delta_width',0);template['height']+=tinyMCE.getLang('lang_theme_advanced_backcolor_delta_height',0);tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes",command:"HiliteColor",input_color:inputColor});return true;case "mceColorPicker":if(user_interface){var template=new Array();var inputColor=value['document'].getElementById(value['element_id']).value;template['file']='color_picker.htm';template['width']=220;template['height']=190;template['close_previous']="no";template['width']+=tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_width',0);template['height']+=tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_height',0);if(typeof(value['store_selection'])=="undefined")value['store_selection']=true;tinyMCE.lastColorPickerValue=value;tinyMCE.openWindow(template,{editor_id:editor_id,mce_store_selection:value['store_selection'],inline:"yes",command:"mceColorPicker",input_color:inputColor});}else{var savedVal=tinyMCE.lastColorPickerValue;var elm=savedVal['document'].getElementById(savedVal['element_id']);elm.value=value;eval('elm.onchange();');}return true;case "mceCodeEditor":var template=new Array();template['file']='source_editor.htm';template['width']=parseInt(tinyMCE.getParam("theme_advanced_source_editor_width",500));template['height']=parseInt(tinyMCE.getParam("theme_advanced_source_editor_height",400));tinyMCE.openWindow(template,{editor_id:editor_id,resizable:"yes",scrollbars:"no",inline:"yes"});return true;case "mceCharMap":var template=new Array();template['file']='charmap.htm';template['width']=550+(tinyMCE.isOpera?40:0);template['height']=250;template['width']+=tinyMCE.getLang('lang_theme_advanced_charmap_delta_width',0);template['height']+=tinyMCE.getLang('lang_theme_advanced_charmap_delta_height',0);tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes"});return true;case "mceInsertAnchor":var template=new Array();template['file']='anchor.htm';template['width']=320;template['height']=90+(tinyMCE.isNS7?30:0);template['width']+=tinyMCE.getLang('lang_theme_advanced_anchor_delta_width',0);template['height']+=tinyMCE.getLang('lang_theme_advanced_anchor_delta_height',0);tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes"});return true;case "mceNewDocument":if(confirm(tinyMCE.getLang('lang_newdocument')))tinyMCE.execInstanceCommand(editor_id,'mceSetContent',false,'');return true;}return false;}function TinyMCE_advanced_getEditorTemplate(settings,editorId){function removeFromArray(in_array,remove_array){var outArray=new Array();for(var i=0;i<in_array.length;i++){skip=false;for(var j=0;j<remove_array.length;j++){if(in_array[i]==remove_array[j]){skip=true;}}if(!skip){outArray[outArray.length]=in_array[i];}}return outArray;}function addToArray(in_array,add_array){for(var i=0;i<add_array.length;i++){in_array[in_array.length]=add_array[i];}return in_array;}var template=new Array();var deltaHeight=0;var resizing=tinyMCE.getParam("theme_advanced_resizing",false);var path=tinyMCE.getParam("theme_advanced_path",true);var statusbarHTML='<div id="{$editor_id}_path" class="mceStatusbarPathText" style="display: '+(path?"block":"none")+'">&nbsp;</div><div id="{$editor_id}_resize" class="mceStatusbarResize" style="display: '+(resizing?"block":"none")+'" onmousedown="TinyMCE_advanced_setResizing(event,\'{$editor_id}\',true);"></div><br style="clear: both" />';var layoutManager=tinyMCE.getParam("theme_advanced_layout_manager","SimpleLayout");var styleSelectHTML='<option value="">{$lang_theme_style_select}</option>';if(settings['theme_advanced_styles']){var stylesAr=settings['theme_advanced_styles'].split(';');for(var i=0;i<stylesAr.length;i++){var key,value;key=stylesAr[i].split('=')[0];value=stylesAr[i].split('=')[1];styleSelectHTML+='<option value="'+value+'">'+key+'</option>';}TinyMCE_advanced_autoImportCSSClasses=false;}switch(layoutManager){case "SimpleLayout":var toolbarHTML="";var toolbarLocation=tinyMCE.getParam("theme_advanced_toolbar_location","bottom");var toolbarAlign=tinyMCE.getParam("theme_advanced_toolbar_align","center");var pathLocation=tinyMCE.getParam("theme_advanced_path_location","none");var statusbarLocation=tinyMCE.getParam("theme_advanced_statusbar_location",pathLocation);var defVals={theme_advanced_buttons1:"bold,italic,underline,strikethrough,separator,justifyleft,justifycenter,justifyright,justifyfull,separator,styleselect,formatselect",theme_advanced_buttons2:"bullist,numlist,separator,outdent,indent,separator,undo,redo,separator,link,unlink,anchor,image,cleanup,help,code",theme_advanced_buttons3:"hr,removeformat,visualaid,separator,sub,sup,separator,charmap"};toolbarHTML+='<a href="#" accesskey="q" title="'+tinyMCE.getLang("lang_toolbar_focus")+'"></a>';for(var i=1;i<100;i++){var def=defVals["theme_advanced_buttons"+i];var buttons=tinyMCE.getParam("theme_advanced_buttons"+i,def==null?'':def,true,',');if(buttons.length==0)break;buttons=removeFromArray(buttons,tinyMCE.getParam("theme_advanced_disable","",true,','));buttons=addToArray(buttons,tinyMCE.getParam("theme_advanced_buttons"+i+"_add","",true,','));buttons=addToArray(tinyMCE.getParam("theme_advanced_buttons"+i+"_add_before","",true,','),buttons);for(var b=0;b<buttons.length;b++)toolbarHTML+=tinyMCE.getControlHTML(buttons[b]);if(buttons.length>0){toolbarHTML+="<br />";deltaHeight-=23;}}toolbarHTML+='<a href="#" accesskey="z" onfocus="tinyMCE.getInstanceById(\''+editorId+'\').getWin().focus();"></a>';template['html']='<table class="mceEditor" border="0" cellpadding="0" cellspacing="0" width="{$width}" height="{$height}" style="width:{$width}px;height:{$height}px"><tbody>';if(toolbarLocation=="top"){template['html']+='<tr><td class="mceToolbarTop" align="'+toolbarAlign+'" height="1" nowrap="nowrap">'+toolbarHTML+'</td></tr>';}if(statusbarLocation=="top"){template['html']+='<tr><td class="mceStatusbarTop" height="1">'+statusbarHTML+'</td></tr>';deltaHeight-=23;}template['html']+='<tr><td align="center"><span id="{$editor_id}"></span></td></tr>';if(toolbarLocation=="bottom"){template['html']+='<tr><td class="mceToolbarBottom" align="'+toolbarAlign+'" height="1">'+toolbarHTML+'</td></tr>';}if(toolbarLocation=="external"){var bod=document.body;var elm=document.createElement("div");toolbarHTML=tinyMCE.replaceVars(toolbarHTML,tinyMCE.settings);toolbarHTML=tinyMCE.replaceVars(toolbarHTML,tinyMCELang);toolbarHTML=tinyMCE.replaceVar(toolbarHTML,'style_select_options',styleSelectHTML);toolbarHTML=tinyMCE.replaceVar(toolbarHTML,"editor_id",editorId);toolbarHTML=tinyMCE.applyTemplate(toolbarHTML);elm.className="mceToolbarExternal";elm.id=editorId+"_toolbar";elm.innerHTML='<table width="100%" border="0" align="center"><tr><td align="center">'+toolbarHTML+'</td></tr></table>';bod.appendChild(elm);deltaHeight=0;tinyMCE.getInstanceById(editorId).toolbarElement=elm;}else{tinyMCE.getInstanceById(editorId).toolbarElement=null;}if(statusbarLocation=="bottom"){template['html']+='<tr><td class="mceStatusbarBottom" height="1">'+statusbarHTML+'</td></tr>';deltaHeight-=23;}template['html']+='</tbody></table>';break;case "RowLayout":template['html']='<table class="mceEditor" border="0" cellpadding="0" cellspacing="0" width="{$width}" height="{$height}" style="width:{$width}px;height:{$height}px"><tbody>';var containers=tinyMCE.getParam("theme_advanced_containers","",true,",");var defaultContainerCSS=tinyMCE.getParam("theme_advanced_containers_default_class","container");var defaultContainerAlign=tinyMCE.getParam("theme_advanced_containers_default_align","center");for(var i=0;i<containers.length;i++){if(containers[i]=="mceEditor"){template['html']+='<tr><td align="center" class="mceEditor_border">\\r
+                                                                                               <span id="{$editor_id}"></span>\\r
+                                                                                               </td></tr>';}else if(containers[i]=="mceElementpath"||containers[i]=="mceStatusbar"){var pathClass="mceStatusbar";if(i==containers.length-1){pathClass="mceStatusbarBottom";}else if(i==0){pathClass="mceStatusbar";}else{deltaHeight-=2;}template['html']+='<tr><td class="'+pathClass+'" height="1">'+statusbarHTML+'</td></tr>';deltaHeight-=22;}else{var curContainer=tinyMCE.getParam("theme_advanced_container_"+containers[i],"",true,',');var curContainerHTML="";var curAlign=tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_align",defaultContainerAlign);var curCSS=tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_class",defaultContainerCSS);for(var j=0;j<curContainer.length;j++){curContainerHTML+=tinyMCE.getControlHTML(curContainer[j]);}if(curContainer.length>0){curContainerHTML+="<br />";deltaHeight-=23;}template['html']+='<tr><td class="'+curCSS+'" align="'+curAlign+'" height="1">'+curContainerHTML+'</td></tr>';}}template['html']+='</tbody></table>';break;case "BorderLayout":break;case "CustomLayout":var customLayout=tinyMCE.getParam("theme_advanced_custom_layout","");if(customLayout!=""&&eval("typeof("+customLayout+")")!="undefined"){template=eval(customLayout+"(template);");}break;default:alert('UNDEFINED LAYOUT MANAGER! PLEASE CHECK YOUR TINYMCE CONFIG!');break;}if(resizing)template['html']+='<span id="{$editor_id}_resize_box" class="mceResizeBox"></span>';template['html']=tinyMCE.replaceVar(template['html'],'style_select_options',styleSelectHTML);template['delta_width']=0;template['delta_height']=deltaHeight;return template;}function TinyMCE_advanced_setResizing(e,editor_id,state){e=typeof(e)=="undefined"?window.event:e;var resizer=TinyMCE_advanced_resizer;var editorContainer=document.getElementById(editor_id+'_parent');var editorArea=document.getElementById(editor_id+'_parent').firstChild;var resizeBox=document.getElementById(editor_id+'_resize_box');var inst=tinyMCE.getInstanceById(editor_id);if(state){var width=editorArea.clientWidth;var height=editorArea.clientHeight;resizeBox.style.width=width+"px";resizeBox.style.height=height+"px";resizer.iframeWidth=inst.iframeElement.clientWidth;resizer.iframeHeight=inst.iframeElement.clientHeight;editorArea.style.display="none";resizeBox.style.display="block";if(!resizer.eventHandlers){if(tinyMCE.isMSIE)tinyMCE.addEvent(document,"mousemove",TinyMCE_advanced_resizeEventHandler);else tinyMCE.addEvent(window,"mousemove",TinyMCE_advanced_resizeEventHandler);tinyMCE.addEvent(document,"mouseup",TinyMCE_advanced_resizeEventHandler);resizer.eventHandlers=true;}resizer.resizing=true;resizer.downX=e.screenX;resizer.downY=e.screenY;resizer.width=parseInt(resizeBox.style.width);resizer.height=parseInt(resizeBox.style.height);resizer.editorId=editor_id;resizer.resizeBox=resizeBox;resizer.horizontal=tinyMCE.getParam("theme_advanced_resize_horizontal",true);}else{resizer.resizing=false;resizeBox.style.display="none";editorArea.style.display=tinyMCE.isMSIE?"block":"table";tinyMCE.execCommand('mceResetDesignMode');}}function TinyMCE_advanced_initInstance(inst){if(tinyMCE.getParam("theme_advanced_resizing",false)){if(tinyMCE.getParam("theme_advanced_resizing_use_cookie",true)){var w=TinyMCE_advanced_getCookie("TinyMCE_"+inst.editorId+"_width");var h=TinyMCE_advanced_getCookie("TinyMCE_"+inst.editorId+"_height");TinyMCE_advanced_resizeTo(inst,w,h,tinyMCE.getParam("theme_advanced_resize_horizontal",true));}}}function TinyMCE_advanced_setCookie(name,value,expires,path,domain,secure){var curCookie=name+"="+escape(value)+((expires)?"; expires="+expires.toGMTString():"")+((path)?"; path="+escape(path):"")+((domain)?"; domain="+domain:"")+((secure)?"; secure":"");document.cookie=curCookie;}function TinyMCE_advanced_getCookie(name){var dc=document.cookie;var prefix=name+"=";var begin=dc.indexOf("; "+prefix);if(begin==-1){begin=dc.indexOf(prefix);if(begin!=0)return null;}else begin+=2;var end=document.cookie.indexOf(";",begin);if(end==-1)end=dc.length;return unescape(dc.substring(begin+prefix.length,end));}function TinyMCE_advanced_resizeTo(inst,w,h,set_w){var editorContainer=document.getElementById(inst.editorId+'_parent');var tableElm=editorContainer.firstChild;var iframe=inst.iframeElement;if(w==null||w=="null"){set_w=false;w=0;}if(h==null||h=="null")return;w=parseInt(w);h=parseInt(h);if(tinyMCE.isGecko){w+=2;h+=2;}var dx=w-tableElm.clientWidth;var dy=h-tableElm.clientHeight;w=w<1?30:w;h=h<1?30:h;if(set_w)tableElm.style.width=w+"px";tableElm.style.height=h+"px";iw=iframe.clientWidth+dx;ih=iframe.clientHeight+dy;iw=iw<1?30:iw;ih=ih<1?30:ih;if(tinyMCE.isGecko){iw-=2;ih-=2;}if(set_w)iframe.style.width=iw+"px";iframe.style.height=ih+"px";if(set_w){var tableBodyElm=tableElm.firstChild;var minIframeWidth=tableBodyElm.scrollWidth;if(inst.iframeElement.clientWidth<minIframeWidth){dx=minIframeWidth-inst.iframeElement.clientWidth;inst.iframeElement.style.width=(iw+dx)+"px";}}}function TinyMCE_advanced_resizeEventHandler(e){var resizer=TinyMCE_advanced_resizer;if(!resizer.resizing)return;e=typeof(e)=="undefined"?window.event:e;var dx=e.screenX-resizer.downX;var dy=e.screenY-resizer.downY;var resizeBox=resizer.resizeBox;var editorId=resizer.editorId;switch(e.type){case "mousemove":var w,h;w=resizer.width+dx;h=resizer.height+dy;w=w<1?1:w;h=h<1?1:h;if(resizer.horizontal)resizeBox.style.width=w+"px";resizeBox.style.height=h+"px";break;case "mouseup":TinyMCE_advanced_setResizing(e,editorId,false);TinyMCE_advanced_resizeTo(tinyMCE.getInstanceById(editorId),resizer.width+dx,resizer.height+dy,resizer.horizontal);if(tinyMCE.getParam("theme_advanced_resizing_use_cookie",true)){var expires=new Date();expires.setTime(expires.getTime()+3600000*24*30);TinyMCE_advanced_setCookie("TinyMCE_"+editorId+"_width",""+(resizer.horizontal?resizer.width+dx:""),expires);TinyMCE_advanced_setCookie("TinyMCE_"+editorId+"_height",""+(resizer.height+dy),expires);}break;}}function TinyMCE_advanced_getInsertLinkTemplate(){var template=new Array();template['file']='link.htm';template['width']=330;template['height']=170+(tinyMCE.isMSIE?25:0);template['width']+=tinyMCE.getLang('lang_insert_link_delta_width',0);template['height']+=tinyMCE.getLang('lang_insert_link_delta_height',0);return template;};function TinyMCE_advanced_getInsertImageTemplate(){var template=new Array();template['file']='image.htm?src={$src}';template['width']=340;template['height']=250+(tinyMCE.isMSIE?25:0);template['width']+=tinyMCE.getLang('lang_insert_image_delta_width',0);template['height']+=tinyMCE.getLang('lang_insert_image_delta_height',0);return template;};function TinyMCE_advanced_handleNodeChange(editor_id,node,undo_index,undo_levels,visual_aid,any_selection,setup_content){function selectByValue(select_elm,value,first_index){first_index=typeof(first_index)=="undefined"?false:true;if(select_elm){for(var i=0;i<select_elm.options.length;i++){var ov=""+select_elm.options[i].value;if(first_index&&ov.toLowerCase().indexOf(value.toLowerCase())==0){select_elm.selectedIndex=i;return true;}if(ov==value){select_elm.selectedIndex=i;return true;}}}return false;};function getAttrib(elm,name){return elm.getAttribute(name)?elm.getAttribute(name):"";};if(node==null){return;}var pathElm=document.getElementById(editor_id+"_path");var inst=tinyMCE.getInstanceById(editor_id);var doc=inst.getDoc();if(pathElm){var parentNode=node;var path=new Array();while(parentNode!=null){if(parentNode.nodeName.toUpperCase()=="BODY"){break;}if(parentNode.nodeType==1){path[path.length]=parentNode;}parentNode=parentNode.parentNode;}var html="";for(var i=path.length-1;i>=0;i--){var nodeName=path[i].nodeName.toLowerCase();var nodeData="";if(nodeName=="b"){nodeName="strong";}if(nodeName=="i"){nodeName="em";}if(nodeName=="span"){var cn=tinyMCE.getAttrib(path[i],"class");if(cn!=""&&cn.indexOf('mceItem')==-1)nodeData+="class: "+cn+" ";var st=tinyMCE.getAttrib(path[i],"style");if(st!=""){st=tinyMCE.serializeStyle(tinyMCE.parseStyle(st));nodeData+="style: "+st+" ";}}if(nodeName=="font"){if(tinyMCE.getParam("convert_fonts_to_spans"))nodeName="span";var face=tinyMCE.getAttrib(path[i],"face");if(face!="")nodeData+="font: "+face+" ";var size=tinyMCE.getAttrib(path[i],"size");if(size!="")nodeData+="size: "+size+" ";var color=tinyMCE.getAttrib(path[i],"color");if(color!="")nodeData+="color: "+color+" ";}if(getAttrib(path[i],'id')!=""){nodeData+="id: "+path[i].getAttribute('id')+" ";}var className=tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i],"class"),false);if(className!=""&&className.indexOf('mceItem')==-1)nodeData+="class: "+className+" ";if(getAttrib(path[i],'src')!=""){var src=tinyMCE.getAttrib(path[i],"mce_src");if(src=="")src=tinyMCE.getAttrib(path[i],"src");nodeData+="src: "+src+" ";}if(getAttrib(path[i],'href')!=""){var href=tinyMCE.getAttrib(path[i],"mce_href");if(href=="")href=tinyMCE.getAttrib(path[i],"href");nodeData+="href: "+href+" ";}if(nodeName=="img"&&tinyMCE.getAttrib(path[i],"class").indexOf('mceItemFlash')!=-1){nodeName="flash";nodeData="src: "+path[i].getAttribute('title');}if(nodeName=="a"&&(anchor=tinyMCE.getAttrib(path[i],"name"))!=""){nodeName="a";nodeName+="#"+anchor;nodeData="";}if(getAttrib(path[i],'name').indexOf("mce_")!=0){var className=tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i],"class"),false);if(className!=""&&className.indexOf('mceItem')==-1){nodeName+="."+className;}}var cmd='tinyMCE.execInstanceCommand(\''+editor_id+'\',\'mceSelectNodeDepth\',false,\''+i+'\');';html+='<a title="'+nodeData+'" href="javascript:'+cmd+'" onclick="'+cmd+'return false;" onmousedown="return false;" target="_self" class="mcePathItem">'+nodeName+'</a>';if(i>0){html+=" &raquo; ";}}pathElm.innerHTML='<a href="#" accesskey="x"></a>'+tinyMCE.getLang('lang_theme_path')+": "+html+'&nbsp;';}tinyMCE.switchClassSticky(editor_id+'_justifyleft','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_justifyright','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_justifycenter','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_justifyfull','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_bold','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_italic','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_underline','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_strikethrough','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_bullist','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_numlist','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_sub','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_sup','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_anchor','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_link','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_unlink','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_outdent','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_image','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_hr','mceButtonNormal');if(node.nodeName=="A"&&tinyMCE.getAttrib(node,"class").indexOf('mceItemAnchor')!=-1)tinyMCE.switchClassSticky(editor_id+'_anchor','mceButtonSelected');var anchorLink=tinyMCE.getParentElement(node,"a","href");if(anchorLink||any_selection){tinyMCE.switchClassSticky(editor_id+'_link',anchorLink?'mceButtonSelected':'mceButtonNormal',false);tinyMCE.switchClassSticky(editor_id+'_unlink',anchorLink?'mceButtonSelected':'mceButtonNormal',false);}tinyMCE.switchClassSticky(editor_id+'_visualaid',visual_aid?'mceButtonSelected':'mceButtonNormal',false);if(undo_levels!=-1){tinyMCE.switchClassSticky(editor_id+'_undo','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_redo','mceButtonDisabled',true);}if(tinyMCE.getParentElement(node,"li,blockquote")){tinyMCE.switchClassSticky(editor_id+'_outdent','mceButtonNormal',false);}if(undo_index!=-1&&(undo_index<undo_levels-1&&undo_levels>0)){tinyMCE.switchClassSticky(editor_id+'_redo','mceButtonNormal',false);}if(undo_index!=-1&&(undo_index>0&&undo_levels>0)){tinyMCE.switchClassSticky(editor_id+'_undo','mceButtonNormal',false);}var selectElm=document.getElementById(editor_id+"_styleSelect");if(selectElm){TinyMCE_advanced_setupCSSClasses(editor_id);classNode=node;breakOut=false;var index=0;do{if(classNode&&classNode.className){for(var i=0;i<selectElm.options.length;i++){if(selectElm.options[i].value==classNode.className){index=i;breakOut=true;break;}}}}while(!breakOut&&classNode!=null&&(classNode=classNode.parentNode)!=null);selectElm.selectedIndex=index;}var selectElm=document.getElementById(editor_id+"_formatSelect");if(selectElm){var elm=tinyMCE.getParentElement(node,"p,div,h1,h2,h3,h4,h5,h6,pre,address");if(elm)selectByValue(selectElm,"<"+elm.nodeName.toLowerCase()+">");else selectByValue(selectElm,"");}var selectElm=document.getElementById(editor_id+"_fontNameSelect");if(selectElm){if(!tinyMCE.isSafari&&!(tinyMCE.isMSIE&&!tinyMCE.isOpera)){var face=inst.queryCommandValue('FontName');face=face==null||face==""?"":face;selectByValue(selectElm,face,face!="");}else{var elm=tinyMCE.getParentElement(node,"font","face");if(elm){var family=tinyMCE.getAttrib(elm,"face");if(family=='')family=''+elm.style.fontFamily;if(!selectByValue(selectElm,family,family!=""))selectByValue(selectElm,"");}else selectByValue(selectElm,"");}}var selectElm=document.getElementById(editor_id+"_fontSizeSelect");if(selectElm){if(!tinyMCE.isSafari&&!tinyMCE.isOpera){var size=inst.queryCommandValue('FontSize');selectByValue(selectElm,size==null||size==""?"0":size);}else{var elm=tinyMCE.getParentElement(node,"font","size");if(elm){var size=tinyMCE.getAttrib(elm,"size");if(size==''){var sizes=new Array('','8px','10px','12px','14px','18px','24px','36px');size=''+elm.style.fontSize;for(var i=0;i<sizes.length;i++){if((''+sizes[i])==size){size=i;break;}}}if(!selectByValue(selectElm,size))selectByValue(selectElm,"");}else selectByValue(selectElm,"0");}}alignNode=node;breakOut=false;do{if(!alignNode.getAttribute||!alignNode.getAttribute('align')){continue;}switch(alignNode.getAttribute('align').toLowerCase()){case "left":tinyMCE.switchClassSticky(editor_id+'_justifyleft','mceButtonSelected');breakOut=true;break;case "right":tinyMCE.switchClassSticky(editor_id+'_justifyright','mceButtonSelected');breakOut=true;break;case "middle":case "center":tinyMCE.switchClassSticky(editor_id+'_justifycenter','mceButtonSelected');breakOut=true;break;case "justify":tinyMCE.switchClassSticky(editor_id+'_justifyfull','mceButtonSelected');breakOut=true;break;}}while(!breakOut&&(alignNode=alignNode.parentNode)!=null);var div=tinyMCE.getParentElement(node,"div");if(div&&div.style.textAlign=="center")tinyMCE.switchClassSticky(editor_id+'_justifycenter','mceButtonSelected');if(!setup_content){var ar=new Array("Bold","_bold","Italic","_italic","Strikethrough","_strikethrough","superscript","_sup","subscript","_sub");for(var i=0;i<ar.length;i+=2){if(inst.queryCommandState(ar[i]))tinyMCE.switchClassSticky(editor_id+ar[i+1],'mceButtonSelected');}if(inst.queryCommandState("Underline")&&(node.parentNode==null||node.parentNode.nodeName!="A")){tinyMCE.switchClassSticky(editor_id+'_underline','mceButtonSelected');}}do{switch(node.nodeName){case "UL":tinyMCE.switchClassSticky(editor_id+'_bullist','mceButtonSelected');break;case "OL":tinyMCE.switchClassSticky(editor_id+'_numlist','mceButtonSelected');break;case "HR":tinyMCE.switchClassSticky(editor_id+'_hr','mceButtonSelected');break;case "IMG":if(getAttrib(node,'name').indexOf('mce_')!=0){tinyMCE.switchClassSticky(editor_id+'_image','mceButtonSelected');}break;}}while((node=node.parentNode)!=null);};function TinyMCE_advanced_setupCSSClasses(editor_id){if(!TinyMCE_advanced_autoImportCSSClasses){return;}var selectElm=document.getElementById(editor_id+'_styleSelect');if(selectElm&&selectElm.getAttribute('cssImported')!='true'){var csses=tinyMCE.getCSSClasses(editor_id);if(csses&&selectElm){for(var i=0;i<csses.length;i++){selectElm.options[selectElm.length]=new Option(csses[i],csses[i]);}}if(csses!=null&&csses.length>0){selectElm.setAttribute('cssImported','true');}}};
\ 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..e2a04b7
--- /dev/null
@@ -0,0 +1,1208 @@
+/* Import theme specific language pack */\r
+tinyMCE.importThemeLanguagePack('advanced');\r
+\r
+// Variable declarations\r
+var TinyMCE_advanced_autoImportCSSClasses = true;\r
+var TinyMCE_advanced_resizer = new Object();\r
+var TinyMCE_advanced_buttons = [\r
+       // Control id, button img, button title, command, user_interface, value\r
+       ['bold', '{$lang_bold_img}', '{$lang_bold_desc}', 'Bold'],\r
+       ['italic', '{$lang_italic_img}', '{$lang_italic_desc}', 'Italic'],\r
+       ['underline', '{$lang_underline_img}', '{$lang_underline_desc}', 'Underline'],\r
+       ['strikethrough', 'strikethrough.gif', '{$lang_striketrough_desc}', 'Strikethrough'],\r
+       ['justifyleft', 'justifyleft.gif', '{$lang_justifyleft_desc}', 'JustifyLeft'],\r
+       ['justifycenter', 'justifycenter.gif', '{$lang_justifycenter_desc}', 'JustifyCenter'],\r
+       ['justifyright', 'justifyright.gif', '{$lang_justifyright_desc}', 'JustifyRight'],\r
+       ['justifyfull', 'justifyfull.gif', '{$lang_justifyfull_desc}', 'JustifyFull'],\r
+       ['bullist', 'bullist.gif', '{$lang_bullist_desc}', 'InsertUnorderedList'],\r
+       ['numlist', 'numlist.gif', '{$lang_numlist_desc}', 'InsertOrderedList'],\r
+       ['outdent', 'outdent.gif', '{$lang_outdent_desc}', 'Outdent'],\r
+       ['indent', 'indent.gif', '{$lang_indent_desc}', 'Indent'],\r
+       ['cut', 'cut.gif', '{$lang_cut_desc}', 'Cut'],\r
+       ['copy', 'copy.gif', '{$lang_copy_desc}', 'Copy'],\r
+       ['paste', 'paste.gif', '{$lang_paste_desc}', 'Paste'],\r
+       ['undo', 'undo.gif', '{$lang_undo_desc}', 'Undo'],\r
+       ['redo', 'redo.gif', '{$lang_redo_desc}', 'Redo'],\r
+       ['link', 'link.gif', '{$lang_link_desc}', 'mceLink', true],\r
+       ['unlink', 'unlink.gif', '{$lang_unlink_desc}', 'unlink'],\r
+       ['image', 'image.gif', '{$lang_image_desc}', 'mceImage', true],\r
+       ['cleanup', 'cleanup.gif', '{$lang_cleanup_desc}', 'mceCleanup'],\r
+       ['help', 'help.gif', '{$lang_help_desc}', 'mceHelp'],\r
+       ['code', 'code.gif', '{$lang_theme_code_desc}', 'mceCodeEditor'],\r
+       ['hr', 'hr.gif', '{$lang_theme_hr_desc}', 'inserthorizontalrule'],\r
+       ['removeformat', 'removeformat.gif', '{$lang_theme_removeformat_desc}', 'removeformat'],\r
+       ['sub', 'sub.gif', '{$lang_theme_sub_desc}', 'subscript'],\r
+       ['sup', 'sup.gif', '{$lang_theme_sup_desc}', 'superscript'],\r
+       ['forecolor', 'forecolor.gif', '{$lang_theme_forecolor_desc}', 'mceForeColor', true],\r
+       ['backcolor', 'backcolor.gif', '{$lang_theme_backcolor_desc}', 'mceBackColor', true],\r
+       ['charmap', 'charmap.gif', '{$lang_theme_charmap_desc}', 'mceCharMap'],\r
+       ['visualaid', 'visualaid.gif', '{$lang_theme_visualaid_desc}', 'mceToggleVisualAid'],\r
+       ['anchor', 'anchor.gif', '{$lang_theme_anchor_desc}', 'mceInsertAnchor'],\r
+       ['newdocument', 'newdocument.gif', '{$lang_newdocument_desc}', 'mceNewDocument']\r
+];\r
+\r
+/**\r
+ * Returns HTML code for the specificed control.\r
+ */\r
+function TinyMCE_advanced_getControlHTML(button_name)\r
+{\r
+       var buttonTileMap = new Array('anchor.gif','backcolor.gif','bullist.gif','justifycenter.gif',\r
+                                                                                       'charmap.gif','cleanup.gif','code.gif','copy.gif','custom_1.gif',\r
+                                                                                       'cut.gif','forecolor.gif','justifyfull.gif','help.gif','hr.gif',\r
+                                                                                       'image.gif','indent.gif','justifyleft.gif','link.gif','numlist.gif',\r
+                                                                                       'outdent.gif','paste.gif','redo.gif','removeformat.gif',\r
+                                                                                       'justifyright.gif','strikethrough.gif','sub.gif','sup.gif','undo.gif',\r
+                                                                                       'unlink.gif','visualaid.gif');\r
+\r
+       // Lookup button in button list\r
+       for (var i=0; i<TinyMCE_advanced_buttons.length; i++)\r
+       {\r
+               var but = TinyMCE_advanced_buttons[i];\r
+\r
+               if (but[0] == button_name)\r
+               {\r
+                       // Check for it in tilemap\r
+                       if (tinyMCE.settings['button_tile_map'])\r
+                       {\r
+                               for (var x=0; !tinyMCE.isMSIE && x<buttonTileMap.length; x++)\r
+                               {\r
+                                       if (buttonTileMap[x] == but[1])\r
+                                       {\r
+                                               var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'' + but[3] + '\',' + (but.length > 4 ? but[4] : false) + (but.length > 5 ? ',\'' + but[5] + '\'' : '') + ')';\r
+                                               return '<a href="javascript:' + cmd + '" onclick="' + cmd + ';return false;" onmousedown="return false;" target="_self"><img id="{$editor_id}_' + but[0] +'" src="{$themeurl}/images/spacer.gif" style="background-image:url({$themeurl}/images/buttons.gif); background-position: ' + (0-(x*20)) + 'px 0px" title="' + but[2] + '" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       // Old style\r
+                       var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'' + but[3] + '\',' + (but.length > 4 ? but[4] : false) + (but.length > 5 ? ',\'' + but[5] + '\'' : '') + ')';\r
+                       return '<a href="javascript:' + cmd + '" onclick="' + cmd + ';return false;" onmousedown="return false;" target="_self"><img id="{$editor_id}_' + but[0] + '" src="{$themeurl}/images/' + but[1] + '" title="' + but[2] + '" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');" /></a>';\r
+               }\r
+       }\r
+\r
+       // Custom controlls other than buttons\r
+       switch (button_name)\r
+       {\r
+               case "formatselect":\r
+                       var html = '<select id="{$editor_id}_formatSelect" name="{$editor_id}_formatSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'FormatBlock\',false,this.options[this.selectedIndex].value);" class="mceSelectList">';\r
+                       var formats = tinyMCE.getParam("theme_advanced_blockformats", "p,address,pre,h1,h2,h3,h4,h5,h6", true).split(',');\r
+                       var lookup = [\r
+                               ['p', '{$lang_theme_paragraph}'],\r
+                               ['address', '{$lang_theme_address}'],\r
+                               ['pre', '{$lang_theme_pre}'],\r
+                               ['h1', '{$lang_theme_h1}'],\r
+                               ['h2', '{$lang_theme_h2}'],\r
+                               ['h3', '{$lang_theme_h3}'],\r
+                               ['h4', '{$lang_theme_h4}'],\r
+                               ['h5', '{$lang_theme_h5}'],\r
+                               ['h6', '{$lang_theme_h6}']\r
+                       ];\r
+\r
+                       html += '<option value="">{$lang_theme_block}</option>';\r
+\r
+                       // Build format select\r
+                       for (var i=0; i<formats.length; i++)\r
+                       {\r
+                               for (var x=0; x<lookup.length; x++)\r
+                               {\r
+                                       if (formats[i] == lookup[x][0])\r
+                                       {\r
+                                               html += '<option value="<' + lookup[x][0] + '>">' + lookup[x][1] + '</option>';\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       html += '</select>';\r
+                       //formatselect\r
+               return html;\r
+\r
+               case "styleselect":\r
+                       //styleselect\r
+               return '<select id="{$editor_id}_styleSelect" onmousedown="TinyMCE_advanced_setupCSSClasses(\'{$editor_id}\');" name="{$editor_id}_styleSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceSetCSSClass\',false,this.options[this.selectedIndex].value);" class="mceSelectList">{$style_select_options}</select>';\r
+\r
+               case "fontselect":\r
+                       var fontHTML = '<select id="{$editor_id}_fontNameSelect" name="{$editor_id}_fontNameSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'FontName\',false,this.options[this.selectedIndex].value);" class="mceSelectList"><option value="">{$lang_theme_fontdefault}</option>';\r
+                       var iFonts = 'Arial=arial,helvetica,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,times new roman,times,serif;Tahoma=tahoma,arial,helvetica,sans-serif;Times New Roman=times new roman,times,serif;Verdana=verdana,arial,helvetica,sans-serif;Impact=impact;WingDings=wingdings';\r
+                       var nFonts = 'Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sand;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats';\r
+                       var fonts = tinyMCE.getParam("theme_advanced_fonts", nFonts).split(';');\r
+                       for (var i=0; i<fonts.length; i++) {\r
+                               if (fonts[i] != '') {\r
+                                       var parts = fonts[i].split('=');\r
+                                       fontHTML += '<option value="' + parts[1] + '">' + parts[0] + '</option>';\r
+                               }\r
+                       }\r
+\r
+                       fontHTML += '</select>';\r
+                       return fontHTML;\r
+\r
+               case "fontsizeselect":\r
+                       //fontsizeselect\r
+               return '<select id="{$editor_id}_fontSizeSelect" name="{$editor_id}_fontSizeSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'FontSize\',false,this.options[this.selectedIndex].value);" class="mceSelectList">\\r
+               <option value="0">{$lang_theme_font_size}</option>\\r
+               <option value="1">1 (8 pt)</option>\\r
+               <option value="2">2 (10 pt)</option>\\r
+               <option value="3">3 (12 pt)</option>\\r
+               <option value="4">4 (14 pt)</option>\\r
+               <option value="5">5 (18 pt)</option>\\r
+               <option value="6">6 (24 pt)</option>\\r
+               <option value="7">7 (36 pt)</option>\\r
+               </select>';\r
+\r
+               case "|":\r
+               case "separator":\r
+               return '<img src="{$themeurl}/images/spacer.gif" width="1" height="15" class="mceSeparatorLine">';\r
+\r
+               case "spacer":\r
+               return '<img src="{$themeurl}/images/spacer.gif" width="1" height="15" border="0" class="mceSeparatorLine" style="vertical-align: middle" />';\r
+\r
+               case "rowseparator":\r
+               return '<br />';\r
+       }\r
+\r
+       return "";\r
+}\r
+\r
+/**\r
+ * Theme specific exec command handeling.\r
+ */\r
+function TinyMCE_advanced_execCommand(editor_id, element, command, user_interface, value)\r
+{\r
+       switch (command)\r
+       {\r
+               case "mceForeColor":\r
+                       var template = new Array();\r
+                       var elm = tinyMCE.selectedInstance.getFocusElement();\r
+                       var inputColor = tinyMCE.getAttrib(elm, "color");\r
+\r
+                       if (inputColor == '')\r
+                               inputColor = elm.style.color;\r
+\r
+                       if (!inputColor)\r
+                               inputColor = "#000000";\r
+\r
+                       template['file'] = 'color_picker.htm';\r
+                       template['width'] = 220;\r
+                       template['height'] = 190;\r
+\r
+                       tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes", command : "forecolor", input_color : inputColor});\r
+               return true;\r
+\r
+               case "mceBackColor":\r
+                       var template = new Array();\r
+                       var elm = tinyMCE.selectedInstance.getFocusElement();\r
+                       var inputColor = elm.style.backgroundColor;\r
+\r
+                       if (!inputColor)\r
+                               inputColor = "#000000";\r
+\r
+                       template['file'] = 'color_picker.htm';\r
+                       template['width'] = 220;\r
+                       template['height'] = 190;\r
+\r
+                       template['width'] += tinyMCE.getLang('lang_theme_advanced_backcolor_delta_width', 0);\r
+                       template['height'] += tinyMCE.getLang('lang_theme_advanced_backcolor_delta_height', 0);\r
+\r
+                       tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes", command : "HiliteColor", input_color : inputColor});\r
+                       //mceBackColor\r
+               return true;\r
+\r
+               case "mceColorPicker":\r
+                       if (user_interface) {\r
+                               var template = new Array();\r
+                               var inputColor = value['document'].getElementById(value['element_id']).value;\r
+\r
+                               template['file'] = 'color_picker.htm';\r
+                               template['width'] = 220;\r
+                               template['height'] = 190;\r
+                               template['close_previous'] = "no";\r
+\r
+                               template['width'] += tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_width', 0);\r
+                               template['height'] += tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_height', 0);\r
+\r
+                               if (typeof(value['store_selection']) == "undefined")\r
+                                       value['store_selection'] = true;\r
+\r
+                               tinyMCE.lastColorPickerValue = value;\r
+                               tinyMCE.openWindow(template, {editor_id : editor_id, mce_store_selection : value['store_selection'], inline : "yes", command : "mceColorPicker", input_color : inputColor});\r
+                       } else {\r
+                               var savedVal = tinyMCE.lastColorPickerValue;\r
+                               var elm = savedVal['document'].getElementById(savedVal['element_id']);\r
+                               elm.value = value;\r
+                               eval('elm.onchange();');\r
+                       }\r
+               return true;\r
+\r
+               case "mceCodeEditor":\r
+                       var template = new Array();\r
+\r
+                       template['file'] = 'source_editor.htm';\r
+                       template['width'] = parseInt(tinyMCE.getParam("theme_advanced_source_editor_width", 500));\r
+                       template['height'] = parseInt(tinyMCE.getParam("theme_advanced_source_editor_height", 400));\r
+\r
+                       tinyMCE.openWindow(template, {editor_id : editor_id, resizable : "yes", scrollbars : "no", inline : "yes"});\r
+                       //mceCodeEditor\r
+               return true;\r
+\r
+               case "mceCharMap":\r
+                       var template = new Array();\r
+\r
+                       template['file'] = 'charmap.htm';\r
+                       template['width'] = 550 + (tinyMCE.isOpera ? 40 : 0);\r
+                       template['height'] = 250;\r
+\r
+                       template['width'] += tinyMCE.getLang('lang_theme_advanced_charmap_delta_width', 0);\r
+                       template['height'] += tinyMCE.getLang('lang_theme_advanced_charmap_delta_height', 0);\r
+\r
+                       tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes"});\r
+                       //mceCharMap\r
+               return true;\r
+\r
+               case "mceInsertAnchor":\r
+                       var template = new Array();\r
+\r
+                       template['file'] = 'anchor.htm';\r
+                       template['width'] = 320;\r
+                       template['height'] = 90 + (tinyMCE.isNS7 ? 30 : 0);\r
+\r
+                       template['width'] += tinyMCE.getLang('lang_theme_advanced_anchor_delta_width', 0);\r
+                       template['height'] += tinyMCE.getLang('lang_theme_advanced_anchor_delta_height', 0);\r
+\r
+                       tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes"});\r
+               return true;\r
+\r
+               case "mceNewDocument":\r
+                       if (confirm(tinyMCE.getLang('lang_newdocument')))\r
+                               tinyMCE.execInstanceCommand(editor_id, 'mceSetContent', false, '');\r
+\r
+                       return true;\r
+       }\r
+\r
+       // Default behavior\r
+       return false;\r
+}\r
+\r
+/**\r
+ * Editor instance template function.\r
+ */\r
+function TinyMCE_advanced_getEditorTemplate(settings, editorId)\r
+{\r
+       function removeFromArray(in_array, remove_array)\r
+       {\r
+               var outArray = new Array();\r
+               \r
+               for (var i=0; i<in_array.length; i++)\r
+               {\r
+                       skip = false;\r
+\r
+                       for (var j=0; j<remove_array.length; j++)\r
+                       {\r
+                               if (in_array[i] == remove_array[j])\r
+                               {\r
+                                       skip = true;\r
+                               }\r
+                       }\r
+\r
+                       if (!skip)\r
+                       {\r
+                               outArray[outArray.length] = in_array[i];\r
+                       }\r
+               }\r
+\r
+               return outArray;\r
+       }\r
+\r
+       function addToArray(in_array, add_array)\r
+       {\r
+               for (var i=0; i<add_array.length; i++)\r
+               {\r
+                       in_array[in_array.length] = add_array[i];\r
+               }\r
+\r
+               return in_array;\r
+       }\r
+\r
+       var template = new Array();\r
+       var deltaHeight = 0;\r
+\r
+       var resizing = tinyMCE.getParam("theme_advanced_resizing", false);\r
+       var path = tinyMCE.getParam("theme_advanced_path", true);\r
+       var statusbarHTML = '<div id="{$editor_id}_path" class="mceStatusbarPathText" style="display: ' + (path ? "block" : "none") + '">&nbsp;</div><div id="{$editor_id}_resize" class="mceStatusbarResize" style="display: ' + (resizing ? "block" : "none") + '" onmousedown="TinyMCE_advanced_setResizing(event,\'{$editor_id}\',true);"></div><br style="clear: both" />';\r
+       var layoutManager = tinyMCE.getParam("theme_advanced_layout_manager", "SimpleLayout");\r
+\r
+       // Setup style select options -- MOVED UP FOR EXTERNAL TOOLBAR COMPATABILITY!\r
+       var styleSelectHTML = '<option value="">{$lang_theme_style_select}</option>';\r
+       if (settings['theme_advanced_styles']) {\r
+               var stylesAr = settings['theme_advanced_styles'].split(';');\r
+               \r
+               for (var i=0; i<stylesAr.length; i++) {\r
+                       var key, value;\r
+\r
+                       key = stylesAr[i].split('=')[0];\r
+                       value = stylesAr[i].split('=')[1];\r
+\r
+                       styleSelectHTML += '<option value="' + value + '">' + key + '</option>';\r
+               }\r
+\r
+               TinyMCE_advanced_autoImportCSSClasses = false;\r
+       }\r
+\r
+       switch(layoutManager) {\r
+               case "SimpleLayout" : //the default TinyMCE Layout (for backwards compatibility)...\r
+                       var toolbarHTML = "";\r
+                       var toolbarLocation = tinyMCE.getParam("theme_advanced_toolbar_location", "bottom");\r
+                       var toolbarAlign = tinyMCE.getParam("theme_advanced_toolbar_align", "center");\r
+                       var pathLocation = tinyMCE.getParam("theme_advanced_path_location", "none"); // Compatiblity\r
+                       var statusbarLocation = tinyMCE.getParam("theme_advanced_statusbar_location", pathLocation);\r
+                       var defVals = {\r
+                               theme_advanced_buttons1 : "bold,italic,underline,strikethrough,separator,justifyleft,justifycenter,justifyright,justifyfull,separator,styleselect,formatselect",\r
+                               theme_advanced_buttons2 : "bullist,numlist,separator,outdent,indent,separator,undo,redo,separator,link,unlink,anchor,image,cleanup,help,code",\r
+                               theme_advanced_buttons3 : "hr,removeformat,visualaid,separator,sub,sup,separator,charmap"\r
+                       };\r
+\r
+                       // Add accessibility control\r
+                       toolbarHTML += '<a href="#" accesskey="q" title="' + tinyMCE.getLang("lang_toolbar_focus") + '"></a>';\r
+\r
+                       // Render rows\r
+                       for (var i=1; i<100; i++) {\r
+                               var def = defVals["theme_advanced_buttons" + i];\r
+\r
+                               var buttons = tinyMCE.getParam("theme_advanced_buttons" + i, def == null ? '' : def, true, ',');\r
+                               if (buttons.length == 0)\r
+                                       break;\r
+\r
+                               buttons = removeFromArray(buttons, tinyMCE.getParam("theme_advanced_disable", "", true, ','));\r
+                               buttons = addToArray(buttons, tinyMCE.getParam("theme_advanced_buttons" + i + "_add", "", true, ','));\r
+                               buttons = addToArray(tinyMCE.getParam("theme_advanced_buttons" + i + "_add_before", "", true, ','), buttons);\r
+\r
+                               for (var b=0; b<buttons.length; b++)\r
+                                       toolbarHTML += tinyMCE.getControlHTML(buttons[b]);\r
+\r
+                               if (buttons.length > 0) {\r
+                                       toolbarHTML += "<br />";\r
+                                       deltaHeight -= 23;\r
+                               }\r
+                       }\r
+\r
+                       // Add accessibility control\r
+                       toolbarHTML += '<a href="#" accesskey="z" onfocus="tinyMCE.getInstanceById(\'' + editorId + '\').getWin().focus();"></a>';\r
+\r
+                       // Setup template html\r
+                       template['html'] = '<table class="mceEditor" border="0" cellpadding="0" cellspacing="0" width="{$width}" height="{$height}" style="width:{$width}px;height:{$height}px"><tbody>';\r
+\r
+                       if (toolbarLocation == "top")\r
+                       {\r
+                               template['html'] += '<tr><td class="mceToolbarTop" align="' + toolbarAlign + '" height="1" nowrap="nowrap">' + toolbarHTML + '</td></tr>';\r
+                       }\r
+\r
+                       if (statusbarLocation == "top")\r
+                       {\r
+                               template['html'] += '<tr><td class="mceStatusbarTop" height="1">' + statusbarHTML + '</td></tr>';\r
+                               deltaHeight -= 23;\r
+                       }\r
+\r
+                       template['html'] += '<tr><td align="center"><span id="{$editor_id}"></span></td></tr>';\r
+\r
+                       if (toolbarLocation == "bottom")\r
+                       {\r
+                               template['html'] += '<tr><td class="mceToolbarBottom" align="' + toolbarAlign + '" height="1">' + toolbarHTML + '</td></tr>';\r
+                       }\r
+\r
+                       // External toolbar changes\r
+                       if (toolbarLocation == "external")\r
+                       {\r
+                               var bod = document.body;\r
+                               var elm = document.createElement ("div");\r
+                               \r
+                               toolbarHTML = tinyMCE.replaceVars(toolbarHTML, tinyMCE.settings);\r
+                               toolbarHTML = tinyMCE.replaceVars(toolbarHTML, tinyMCELang);\r
+                               toolbarHTML = tinyMCE.replaceVar(toolbarHTML, 'style_select_options', styleSelectHTML);\r
+                               toolbarHTML = tinyMCE.replaceVar(toolbarHTML, "editor_id", editorId);\r
+                               toolbarHTML = tinyMCE.applyTemplate(toolbarHTML);\r
+\r
+                               elm.className = "mceToolbarExternal";\r
+                               elm.id = editorId+"_toolbar";\r
+                               elm.innerHTML = '<table width="100%" border="0" align="center"><tr><td align="center">'+toolbarHTML+'</td></tr></table>';\r
+                               bod.appendChild (elm);\r
+                               // bod.style.marginTop = elm.offsetHeight + "px";\r
+\r
+                               deltaHeight = 0;\r
+                               tinyMCE.getInstanceById(editorId).toolbarElement = elm;\r
+\r
+                               //template['html'] = '<div id="mceExternalToolbar" align="center" class="mceToolbarExternal"><table width="100%" border="0" align="center"><tr><td align="center">'+toolbarHTML+'</td></tr></table></div>' + template["html"];\r
+                       }\r
+                       else\r
+                       {\r
+                               tinyMCE.getInstanceById(editorId).toolbarElement = null;\r
+                       }\r
+\r
+                       if (statusbarLocation == "bottom")\r
+                       {\r
+                               template['html'] += '<tr><td class="mceStatusbarBottom" height="1">' + statusbarHTML + '</td></tr>';\r
+                               deltaHeight -= 23;\r
+                       }\r
+\r
+                       template['html'] += '</tbody></table>';\r
+                       //"SimpleLayout"\r
+               break;\r
+\r
+               case "RowLayout" : //Container Layout - containers defined in "theme_advanced_containers" are rendered from top to bottom.\r
+                       template['html'] = '<table class="mceEditor" border="0" cellpadding="0" cellspacing="0" width="{$width}" height="{$height}" style="width:{$width}px;height:{$height}px"><tbody>';\r
+\r
+                       var containers = tinyMCE.getParam("theme_advanced_containers", "", true, ",");\r
+                       var defaultContainerCSS = tinyMCE.getParam("theme_advanced_containers_default_class", "container");\r
+                       var defaultContainerAlign = tinyMCE.getParam("theme_advanced_containers_default_align", "center");\r
+\r
+                       //Render Containers:\r
+                       for (var i = 0; i < containers.length; i++)\r
+                       {\r
+                               if (containers[i] == "mceEditor") //Exceptions for mceEditor and ...\r
+                               {\r
+                                       template['html'] += '<tr><td align="center" class="mceEditor_border">\\r
+                                                                                               <span id="{$editor_id}"></span>\\r
+                                                                                               </td></tr>';\r
+                               }\r
+                               else if (containers[i] == "mceElementpath" || containers[i] == "mceStatusbar") // ... mceElementpath:\r
+                               {\r
+                                       var pathClass = "mceStatusbar";\r
+\r
+                                       if (i == containers.length-1)\r
+                                       {\r
+                                               pathClass = "mceStatusbarBottom";\r
+                                       }\r
+                                       else if (i == 0)\r
+                                       {\r
+                                               pathClass = "mceStatusbar";\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               deltaHeight-=2;\r
+                                       }\r
+\r
+                                       template['html'] += '<tr><td class="' + pathClass + '" height="1">' + statusbarHTML + '</td></tr>';\r
+                                       deltaHeight -= 22;\r
+                               }\r
+                               else //Render normal Container:\r
+                               {\r
+                                       var curContainer = tinyMCE.getParam("theme_advanced_container_"+containers[i], "", true, ',');\r
+                                       var curContainerHTML = "";\r
+                                       var curAlign = tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_align", defaultContainerAlign);\r
+                                       var curCSS = tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_class", defaultContainerCSS);\r
+\r
+                                       for (var j=0; j<curContainer.length; j++)\r
+                                       {\r
+                                               curContainerHTML += tinyMCE.getControlHTML(curContainer[j]);\r
+                                       }\r
+\r
+                                       if (curContainer.length > 0)\r
+                                       {\r
+                                               curContainerHTML += "<br />";\r
+                                               deltaHeight -= 23;\r
+                                       }\r
+\r
+                                       template['html'] += '<tr><td class="' + curCSS + '" align="' + curAlign + '" height="1">' + curContainerHTML + '</td></tr>';\r
+                               }\r
+                       }\r
+\r
+                       template['html'] += '</tbody></table>';\r
+                       //RowLayout\r
+               break;\r
+\r
+               case "BorderLayout" : //will be like java.awt.BorderLayout of SUN Java...\r
+                       // Not implemented yet... \r
+               break;\r
+\r
+               case "CustomLayout" : //User defined layout callback...\r
+                       var customLayout = tinyMCE.getParam("theme_advanced_custom_layout","");\r
+                       \r
+                       if (customLayout != "" && eval("typeof(" + customLayout + ")") != "undefined")\r
+                       {\r
+                               template = eval(customLayout + "(template);");\r
+                       }\r
+               break;\r
+                       \r
+               default:\r
+                       alert('UNDEFINED LAYOUT MANAGER! PLEASE CHECK YOUR TINYMCE CONFIG!');\r
+                       //CustomLayout\r
+               break;\r
+       }\r
+\r
+       if (resizing)\r
+               template['html'] += '<span id="{$editor_id}_resize_box" class="mceResizeBox"></span>';\r
+\r
+       template['html'] = tinyMCE.replaceVar(template['html'], 'style_select_options', styleSelectHTML);\r
+       template['delta_width'] = 0;\r
+       template['delta_height'] = deltaHeight;\r
+\r
+       return template;\r
+}\r
+\r
+/**\r
+ * Starts/stops the editor resizing.\r
+ */\r
+function TinyMCE_advanced_setResizing(e, editor_id, state) {\r
+       e = typeof(e) == "undefined" ? window.event : e;\r
+\r
+       var resizer = TinyMCE_advanced_resizer;\r
+       var editorContainer = document.getElementById(editor_id + '_parent');\r
+       var editorArea = document.getElementById(editor_id + '_parent').firstChild;\r
+       var resizeBox = document.getElementById(editor_id + '_resize_box');\r
+       var inst = tinyMCE.getInstanceById(editor_id);\r
+\r
+       if (state) {\r
+               // Place box over editor area\r
+               var width = editorArea.clientWidth;\r
+               var height = editorArea.clientHeight;\r
+\r
+               resizeBox.style.width = width + "px";\r
+               resizeBox.style.height = height + "px";\r
+\r
+               resizer.iframeWidth = inst.iframeElement.clientWidth;\r
+               resizer.iframeHeight = inst.iframeElement.clientHeight;\r
+\r
+               // Hide editor and show resize box\r
+               editorArea.style.display = "none";\r
+               resizeBox.style.display = "block";\r
+\r
+               // Add event handlers, only once\r
+               if (!resizer.eventHandlers) {\r
+                       if (tinyMCE.isMSIE)\r
+                               tinyMCE.addEvent(document, "mousemove", TinyMCE_advanced_resizeEventHandler);\r
+                       else\r
+                               tinyMCE.addEvent(window, "mousemove", TinyMCE_advanced_resizeEventHandler);\r
+\r
+                       tinyMCE.addEvent(document, "mouseup", TinyMCE_advanced_resizeEventHandler);\r
+\r
+                       resizer.eventHandlers = true;\r
+               }\r
+\r
+               resizer.resizing = true;\r
+               resizer.downX = e.screenX;\r
+               resizer.downY = e.screenY;\r
+               resizer.width = parseInt(resizeBox.style.width);\r
+               resizer.height = parseInt(resizeBox.style.height);\r
+               resizer.editorId = editor_id;\r
+               resizer.resizeBox = resizeBox;\r
+               resizer.horizontal = tinyMCE.getParam("theme_advanced_resize_horizontal", true);\r
+       } else {\r
+               resizer.resizing = false;\r
+               resizeBox.style.display = "none";\r
+               editorArea.style.display = tinyMCE.isMSIE ? "block" : "table";\r
+               tinyMCE.execCommand('mceResetDesignMode');\r
+       }\r
+}\r
+\r
+function TinyMCE_advanced_initInstance(inst) {\r
+       if (tinyMCE.getParam("theme_advanced_resizing", false)) {\r
+               if (tinyMCE.getParam("theme_advanced_resizing_use_cookie", true)) {\r
+                       var w = TinyMCE_advanced_getCookie("TinyMCE_" + inst.editorId + "_width");\r
+                       var h = TinyMCE_advanced_getCookie("TinyMCE_" + inst.editorId + "_height");\r
+\r
+                       TinyMCE_advanced_resizeTo(inst, w, h, tinyMCE.getParam("theme_advanced_resize_horizontal", true));\r
+               }\r
+       }\r
+}\r
+\r
+function TinyMCE_advanced_setCookie(name, value, expires, path, domain, secure) {\r
+       var curCookie = name + "=" + escape(value) +\r
+               ((expires) ? "; expires=" + expires.toGMTString() : "") +\r
+               ((path) ? "; path=" + escape(path) : "") +\r
+               ((domain) ? "; domain=" + domain : "") +\r
+               ((secure) ? "; secure" : "");\r
+\r
+       document.cookie = curCookie;\r
+}\r
+\r
+function TinyMCE_advanced_getCookie(name) {\r
+       var dc = document.cookie;\r
+       var prefix = name + "=";\r
+       var begin = dc.indexOf("; " + prefix);\r
+\r
+       if (begin == -1) {\r
+               begin = dc.indexOf(prefix);\r
+\r
+               if (begin != 0)\r
+                       return null;\r
+       } else\r
+               begin += 2;\r
+\r
+       var end = document.cookie.indexOf(";", begin);\r
+\r
+       if (end == -1)\r
+               end = dc.length;\r
+\r
+       return unescape(dc.substring(begin + prefix.length, end));\r
+}\r
+\r
+function TinyMCE_advanced_resizeTo(inst, w, h, set_w) {\r
+       var editorContainer = document.getElementById(inst.editorId + '_parent');\r
+       var tableElm = editorContainer.firstChild;\r
+       var iframe = inst.iframeElement;\r
+\r
+       if (w == null || w == "null") {\r
+               set_w = false;\r
+               w = 0;\r
+       }\r
+\r
+       if (h == null || h == "null")\r
+               return;\r
+\r
+       w = parseInt(w);\r
+       h = parseInt(h);\r
+\r
+       if (tinyMCE.isGecko) {\r
+               w += 2;\r
+               h += 2;\r
+       }\r
+\r
+       var dx = w - tableElm.clientWidth;\r
+       var dy = h - tableElm.clientHeight;\r
+\r
+       w = w < 1 ? 30 : w;\r
+       h = h < 1 ? 30 : h;\r
+\r
+       if (set_w)\r
+               tableElm.style.width = w + "px";\r
+\r
+       tableElm.style.height = h + "px";\r
+\r
+       iw = iframe.clientWidth + dx;\r
+       ih = iframe.clientHeight + dy;\r
+\r
+       iw = iw < 1 ? 30 : iw;\r
+       ih = ih < 1 ? 30 : ih;\r
+\r
+       if (tinyMCE.isGecko) {\r
+               iw -= 2;\r
+               ih -= 2;\r
+       }\r
+\r
+       if (set_w)\r
+               iframe.style.width = iw + "px";\r
+\r
+       iframe.style.height = ih + "px";\r
+\r
+       // Is it to small, make it bigger again\r
+       if (set_w) {\r
+               var tableBodyElm = tableElm.firstChild;\r
+               var minIframeWidth = tableBodyElm.scrollWidth;\r
+               if (inst.iframeElement.clientWidth < minIframeWidth) {\r
+                       dx = minIframeWidth - inst.iframeElement.clientWidth;\r
+\r
+                       inst.iframeElement.style.width = (iw + dx) + "px";\r
+               }\r
+       }\r
+}\r
+\r
+/**\r
+ * Handles resizing events.\r
+ */\r
+function TinyMCE_advanced_resizeEventHandler(e) {\r
+       var resizer = TinyMCE_advanced_resizer;\r
+\r
+       // Do nothing\r
+       if (!resizer.resizing)\r
+               return;\r
+\r
+       e = typeof(e) == "undefined" ? window.event : e;\r
+\r
+       var dx = e.screenX - resizer.downX;\r
+       var dy = e.screenY - resizer.downY;\r
+       var resizeBox = resizer.resizeBox;\r
+       var editorId = resizer.editorId;\r
+\r
+       switch (e.type) {\r
+               case "mousemove":\r
+                       var w, h;\r
+\r
+                       w = resizer.width + dx;\r
+                       h = resizer.height + dy;\r
+\r
+                       w = w < 1 ? 1 : w;\r
+                       h = h < 1 ? 1 : h;\r
+\r
+                       if (resizer.horizontal)\r
+                               resizeBox.style.width = w + "px";\r
+\r
+                       resizeBox.style.height = h + "px";\r
+                       break;\r
+\r
+               case "mouseup":\r
+                       TinyMCE_advanced_setResizing(e, editorId, false);\r
+                       TinyMCE_advanced_resizeTo(tinyMCE.getInstanceById(editorId), resizer.width + dx, resizer.height + dy, resizer.horizontal);\r
+\r
+                       // Expire in a month\r
+                       if (tinyMCE.getParam("theme_advanced_resizing_use_cookie", true)) {\r
+                               var expires = new Date();\r
+                               expires.setTime(expires.getTime() + 3600000 * 24 * 30);\r
+\r
+                               // Set the cookies\r
+                               TinyMCE_advanced_setCookie("TinyMCE_" + editorId + "_width", "" + (resizer.horizontal ? resizer.width + dx : ""), expires);\r
+                               TinyMCE_advanced_setCookie("TinyMCE_" + editorId + "_height", "" + (resizer.height + dy), expires);\r
+                       }\r
+                       break;\r
+       }\r
+}\r
+\r
+/**\r
+ * Insert link template function.\r
+ */\r
+function TinyMCE_advanced_getInsertLinkTemplate()\r
+{\r
+       var template = new Array();\r
+\r
+       template['file'] = 'link.htm';\r
+       template['width'] = 330;\r
+       template['height'] = 170 + (tinyMCE.isMSIE ? 25 : 0);\r
+\r
+       // Language specific width and height addons\r
+       template['width'] += tinyMCE.getLang('lang_insert_link_delta_width', 0);\r
+       template['height'] += tinyMCE.getLang('lang_insert_link_delta_height', 0);\r
+\r
+       return template;\r
+};\r
+\r
+/**\r
+ * Insert image template function.\r
+ */\r
+function TinyMCE_advanced_getInsertImageTemplate() {\r
+       var template = new Array();\r
+\r
+       template['file'] = 'image.htm?src={$src}';\r
+       template['width'] = 340;\r
+       template['height'] = 250 + (tinyMCE.isMSIE ? 25 : 0);\r
+\r
+       // Language specific width and height addons\r
+       template['width'] += tinyMCE.getLang('lang_insert_image_delta_width', 0);\r
+       template['height'] += tinyMCE.getLang('lang_insert_image_delta_height', 0);\r
+\r
+       return template;\r
+};\r
+\r
+/**\r
+ * Node change handler.\r
+ */\r
+function TinyMCE_advanced_handleNodeChange(editor_id, node, undo_index, undo_levels, visual_aid, any_selection, setup_content) {\r
+       function selectByValue(select_elm, value, first_index) {\r
+               first_index = typeof(first_index) == "undefined" ? false : true;\r
+\r
+               if (select_elm) {\r
+                       for (var i=0; i<select_elm.options.length; i++) {\r
+                               var ov = "" + select_elm.options[i].value;\r
+\r
+                               if (first_index && ov.toLowerCase().indexOf(value.toLowerCase()) == 0) {\r
+                                       select_elm.selectedIndex = i;\r
+                                       return true;\r
+                               }\r
+\r
+                               if (ov == value) {\r
+                                       select_elm.selectedIndex = i;\r
+                                       return true;\r
+                               }\r
+                       }\r
+               }\r
+\r
+               return false;\r
+       };\r
+\r
+       function getAttrib(elm, name) {\r
+               return elm.getAttribute(name) ? elm.getAttribute(name) : "";\r
+       };\r
+\r
+       // No node provided\r
+       if (node == null)\r
+       {\r
+               return;\r
+       }\r
+\r
+       // Update path\r
+       var pathElm = document.getElementById(editor_id + "_path");\r
+       var inst = tinyMCE.getInstanceById(editor_id);\r
+       var doc = inst.getDoc();\r
+\r
+       if (pathElm) {\r
+               // Get node path\r
+               var parentNode = node;\r
+               var path = new Array();\r
+               \r
+               while (parentNode != null) {\r
+                       if (parentNode.nodeName.toUpperCase() == "BODY") {\r
+                               break;\r
+                       }\r
+\r
+                       // Only append element nodes to path\r
+                       if (parentNode.nodeType == 1) {\r
+                               path[path.length] = parentNode;\r
+                       }\r
+\r
+                       parentNode = parentNode.parentNode;\r
+               }\r
+\r
+               // Setup HTML\r
+               var html = "";\r
+               for (var i=path.length-1; i>=0; i--) {\r
+                       var nodeName = path[i].nodeName.toLowerCase();\r
+                       var nodeData = "";\r
+\r
+                       if (nodeName == "b") {\r
+                               nodeName = "strong";\r
+                       }\r
+\r
+                       if (nodeName == "i") {\r
+                               nodeName = "em";\r
+                       }\r
+\r
+                       if (nodeName == "span") {\r
+                               var cn = tinyMCE.getAttrib(path[i], "class");\r
+                               if (cn != "" && cn.indexOf('mceItem') == -1)\r
+                                       nodeData += "class: " + cn + " ";\r
+\r
+                               var st = tinyMCE.getAttrib(path[i], "style");\r
+                               if (st != "") {\r
+                                       st = tinyMCE.serializeStyle(tinyMCE.parseStyle(st));\r
+                                       nodeData += "style: " + st + " ";\r
+                               }\r
+                       }\r
+\r
+                       if (nodeName == "font") {\r
+                               if (tinyMCE.getParam("convert_fonts_to_spans"))\r
+                                       nodeName = "span";\r
+\r
+                               var face = tinyMCE.getAttrib(path[i], "face");\r
+                               if (face != "")\r
+                                       nodeData += "font: " + face + " ";\r
+\r
+                               var size = tinyMCE.getAttrib(path[i], "size");\r
+                               if (size != "")\r
+                                       nodeData += "size: " + size + " ";\r
+\r
+                               var color = tinyMCE.getAttrib(path[i], "color");\r
+                               if (color != "")\r
+                                       nodeData += "color: " + color + " ";\r
+                       }\r
+\r
+                       if (getAttrib(path[i], 'id') != "") {\r
+                               nodeData += "id: " + path[i].getAttribute('id') + " ";\r
+                       }\r
+\r
+                       var className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i], "class"), false);\r
+                       if (className != "" && className.indexOf('mceItem') == -1)\r
+                               nodeData += "class: " + className + " ";\r
+\r
+                       if (getAttrib(path[i], 'src') != "") {\r
+                               var src = tinyMCE.getAttrib(path[i], "mce_src");\r
+\r
+                               if (src == "")\r
+                                        src = tinyMCE.getAttrib(path[i], "src");\r
+\r
+                               nodeData += "src: " + src + " ";\r
+                       }\r
+\r
+                       if (getAttrib(path[i], 'href') != "") {\r
+                               var href = tinyMCE.getAttrib(path[i], "mce_href");\r
+\r
+                               if (href == "")\r
+                                        href = tinyMCE.getAttrib(path[i], "href");\r
+\r
+                               nodeData += "href: " + href + " ";\r
+                       }\r
+\r
+                       if (nodeName == "img" && tinyMCE.getAttrib(path[i], "class").indexOf('mceItemFlash') != -1) {\r
+                               nodeName = "flash";\r
+                               nodeData = "src: " + path[i].getAttribute('title');\r
+                       }\r
+\r
+                       if (nodeName == "a" && (anchor = tinyMCE.getAttrib(path[i], "name")) != "") {\r
+                               nodeName = "a";\r
+                               nodeName += "#" + anchor;\r
+                               nodeData = "";\r
+                       }\r
+\r
+                       if (getAttrib(path[i], 'name').indexOf("mce_") != 0) {\r
+                               var className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i], "class"), false);\r
+                               if (className != "" && className.indexOf('mceItem') == -1) {\r
+                                       nodeName += "." + className;\r
+                               }\r
+                       }\r
+\r
+                       var cmd = 'tinyMCE.execInstanceCommand(\'' + editor_id + '\',\'mceSelectNodeDepth\',false,\'' + i + '\');';\r
+                       html += '<a title="' + nodeData + '" href="javascript:' + cmd + '" onclick="' + cmd + 'return false;" onmousedown="return false;" target="_self" class="mcePathItem">' + nodeName + '</a>';\r
+\r
+                       if (i > 0) {\r
+                               html += " &raquo; ";\r
+                       }\r
+               }\r
+\r
+               pathElm.innerHTML = '<a href="#" accesskey="x"></a>' + tinyMCE.getLang('lang_theme_path') + ": " + html + '&nbsp;';\r
+       }\r
+\r
+       // Reset old states\r
+       tinyMCE.switchClassSticky(editor_id + '_justifyleft', 'mceButtonNormal');\r
+       tinyMCE.switchClassSticky(editor_id + '_justifyright', 'mceButtonNormal');\r
+       tinyMCE.switchClassSticky(editor_id + '_justifycenter', 'mceButtonNormal');\r
+       tinyMCE.switchClassSticky(editor_id + '_justifyfull', 'mceButtonNormal');\r
+       tinyMCE.switchClassSticky(editor_id + '_bold', 'mceButtonNormal');\r
+       tinyMCE.switchClassSticky(editor_id + '_italic', 'mceButtonNormal');\r
+       tinyMCE.switchClassSticky(editor_id + '_underline', 'mceButtonNormal');\r
+       tinyMCE.switchClassSticky(editor_id + '_strikethrough', 'mceButtonNormal');\r
+       tinyMCE.switchClassSticky(editor_id + '_bullist', 'mceButtonNormal');\r
+       tinyMCE.switchClassSticky(editor_id + '_numlist', 'mceButtonNormal');\r
+       tinyMCE.switchClassSticky(editor_id + '_sub', 'mceButtonNormal');\r
+       tinyMCE.switchClassSticky(editor_id + '_sup', 'mceButtonNormal');\r
+       tinyMCE.switchClassSticky(editor_id + '_anchor', 'mceButtonNormal');\r
+       tinyMCE.switchClassSticky(editor_id + '_link', 'mceButtonDisabled', true);\r
+       tinyMCE.switchClassSticky(editor_id + '_unlink', 'mceButtonDisabled', true);\r
+       tinyMCE.switchClassSticky(editor_id + '_outdent', 'mceButtonDisabled', true);\r
+       tinyMCE.switchClassSticky(editor_id + '_image', 'mceButtonNormal');\r
+       tinyMCE.switchClassSticky(editor_id + '_hr', 'mceButtonNormal');\r
+\r
+       if (node.nodeName == "A" && tinyMCE.getAttrib(node, "class").indexOf('mceItemAnchor') != -1)\r
+               tinyMCE.switchClassSticky(editor_id + '_anchor', 'mceButtonSelected');\r
+\r
+       // Get link\r
+       var anchorLink = tinyMCE.getParentElement(node, "a", "href");\r
+\r
+       if (anchorLink || any_selection)\r
+       {\r
+               tinyMCE.switchClassSticky(editor_id + '_link', anchorLink ? 'mceButtonSelected' : 'mceButtonNormal', false);\r
+               tinyMCE.switchClassSticky(editor_id + '_unlink', anchorLink ? 'mceButtonSelected' : 'mceButtonNormal', false);\r
+       }\r
+\r
+       // Handle visual aid\r
+       tinyMCE.switchClassSticky(editor_id + '_visualaid', visual_aid ? 'mceButtonSelected' : 'mceButtonNormal', false);\r
+\r
+       if (undo_levels != -1)\r
+       {\r
+               tinyMCE.switchClassSticky(editor_id + '_undo', 'mceButtonDisabled', true);\r
+               tinyMCE.switchClassSticky(editor_id + '_redo', 'mceButtonDisabled', true);\r
+       }\r
+\r
+       // Within li, blockquote\r
+       if (tinyMCE.getParentElement(node, "li,blockquote"))\r
+       {\r
+               tinyMCE.switchClassSticky(editor_id + '_outdent', 'mceButtonNormal', false);\r
+       }\r
+\r
+       // Has redo levels\r
+       if (undo_index != -1 && (undo_index < undo_levels-1 && undo_levels > 0))\r
+       {\r
+               tinyMCE.switchClassSticky(editor_id + '_redo', 'mceButtonNormal', false);\r
+       }\r
+\r
+       // Has undo levels\r
+       if (undo_index != -1 && (undo_index > 0 && undo_levels > 0))\r
+       {\r
+               tinyMCE.switchClassSticky(editor_id + '_undo', 'mceButtonNormal', false);\r
+       }\r
+\r
+       // Select class in select box\r
+       var selectElm = document.getElementById(editor_id + "_styleSelect");\r
+       \r
+       if (selectElm)\r
+       {\r
+               TinyMCE_advanced_setupCSSClasses(editor_id);\r
+\r
+               classNode = node;\r
+               breakOut = false;\r
+               var index = 0;\r
+\r
+               do\r
+               {\r
+                       if (classNode && classNode.className)\r
+                       {\r
+                               for (var i=0; i<selectElm.options.length; i++)\r
+                               {\r
+                                       if (selectElm.options[i].value == classNode.className)\r
+                                       {\r
+                                               index = i;\r
+                                               breakOut = true;\r
+                                               break;\r
+                                       }\r
+                               }\r
+                       }\r
+               } while (!breakOut && classNode != null && (classNode = classNode.parentNode) != null);\r
+\r
+               selectElm.selectedIndex = index;\r
+       }\r
+\r
+       // Select formatblock\r
+       var selectElm = document.getElementById(editor_id + "_formatSelect");\r
+       if (selectElm) {\r
+               var elm = tinyMCE.getParentElement(node, "p,div,h1,h2,h3,h4,h5,h6,pre,address");\r
+\r
+               if (elm)\r
+                       selectByValue(selectElm, "<" + elm.nodeName.toLowerCase() + ">");\r
+               else\r
+                       selectByValue(selectElm, "");\r
+       }\r
+\r
+       // Select fontselect\r
+       var selectElm = document.getElementById(editor_id + "_fontNameSelect");\r
+       if (selectElm) {\r
+               if (!tinyMCE.isSafari && !(tinyMCE.isMSIE && !tinyMCE.isOpera)) {\r
+                       var face = inst.queryCommandValue('FontName');\r
+\r
+                       face = face == null || face == "" ? "" : face;\r
+\r
+                       selectByValue(selectElm, face, face != "");\r
+               } else {\r
+                       var elm = tinyMCE.getParentElement(node, "font", "face");\r
+\r
+                       if (elm) {\r
+                               var family = tinyMCE.getAttrib(elm, "face");\r
+\r
+                               if (family == '')\r
+                                       family = '' + elm.style.fontFamily;\r
+\r
+                               if (!selectByValue(selectElm, family, family != ""))\r
+                                       selectByValue(selectElm, "");\r
+                       } else\r
+                               selectByValue(selectElm, "");\r
+               }\r
+       }\r
+\r
+       // Select fontsize\r
+       var selectElm = document.getElementById(editor_id + "_fontSizeSelect");\r
+       if (selectElm) {\r
+               if (!tinyMCE.isSafari && !tinyMCE.isOpera) {\r
+                       var size = inst.queryCommandValue('FontSize');\r
+                       selectByValue(selectElm, size == null || size == "" ? "0" : size);\r
+               } else {\r
+                       var elm = tinyMCE.getParentElement(node, "font", "size");\r
+                       if (elm) {\r
+                               var size = tinyMCE.getAttrib(elm, "size");\r
+\r
+                               if (size == '') {\r
+                                       var sizes = new Array('', '8px', '10px', '12px', '14px', '18px', '24px', '36px');\r
+\r
+                                       size = '' + elm.style.fontSize;\r
+\r
+                                       for (var i=0; i<sizes.length; i++) {\r
+                                               if (('' + sizes[i]) == size) {\r
+                                                       size = i;\r
+                                                       break;\r
+                                               }\r
+                                       }\r
+                               }\r
+\r
+                               if (!selectByValue(selectElm, size))\r
+                                       selectByValue(selectElm, "");\r
+                       } else\r
+                               selectByValue(selectElm, "0");\r
+               }\r
+       }\r
+\r
+       // Handle align attributes\r
+       alignNode = node;\r
+       breakOut = false;\r
+       do {\r
+               if (!alignNode.getAttribute || !alignNode.getAttribute('align')) {\r
+                       continue;\r
+               }\r
+\r
+               switch (alignNode.getAttribute('align').toLowerCase()) {\r
+                       case "left":\r
+                               tinyMCE.switchClassSticky(editor_id + '_justifyleft', 'mceButtonSelected');\r
+                               breakOut = true;\r
+                       break;\r
+\r
+                       case "right":\r
+                               tinyMCE.switchClassSticky(editor_id + '_justifyright', 'mceButtonSelected');\r
+                               breakOut = true;\r
+                       break;\r
+\r
+                       case "middle":\r
+                       case "center":\r
+                               tinyMCE.switchClassSticky(editor_id + '_justifycenter', 'mceButtonSelected');\r
+                               breakOut = true;\r
+                       break;\r
+\r
+                       case "justify":\r
+                               tinyMCE.switchClassSticky(editor_id + '_justifyfull', 'mceButtonSelected');\r
+                               breakOut = true;\r
+                       break;\r
+               }\r
+       } while (!breakOut && (alignNode = alignNode.parentNode) != null);\r
+\r
+       // Div justification\r
+       var div = tinyMCE.getParentElement(node, "div");\r
+       if (div && div.style.textAlign == "center")\r
+               tinyMCE.switchClassSticky(editor_id + '_justifycenter', 'mceButtonSelected');\r
+\r
+       // Do special text\r
+       if (!setup_content) {\r
+               // , "JustifyLeft", "_justifyleft", "JustifyCenter", "justifycenter", "JustifyRight", "justifyright", "JustifyFull", "justifyfull", "InsertUnorderedList", "bullist", "InsertOrderedList", "numlist", "InsertUnorderedList", "bullist", "Outdent", "outdent", "Indent", "indent", "subscript", "sub"\r
+               var ar = new Array("Bold", "_bold", "Italic", "_italic", "Strikethrough", "_strikethrough", "superscript", "_sup", "subscript", "_sub");\r
+               for (var i=0; i<ar.length; i+=2) {\r
+                       if (inst.queryCommandState(ar[i]))\r
+                               tinyMCE.switchClassSticky(editor_id + ar[i+1], 'mceButtonSelected');\r
+               }\r
+\r
+               if (inst.queryCommandState("Underline") && (node.parentNode == null || node.parentNode.nodeName != "A")) {\r
+                       tinyMCE.switchClassSticky(editor_id + '_underline', 'mceButtonSelected');\r
+               }\r
+       }\r
+\r
+       // Handle elements\r
+       do {\r
+               switch (node.nodeName) {\r
+/*                     case "B":\r
+                       case "STRONG":\r
+                               tinyMCE.switchClassSticky(editor_id + '_bold', 'mceButtonSelected');\r
+                       break;\r
+\r
+                       case "I":\r
+                       case "EM":\r
+                               tinyMCE.switchClassSticky(editor_id + '_italic', 'mceButtonSelected');\r
+                       break;\r
+\r
+                       case "U":\r
+                               tinyMCE.switchClassSticky(editor_id + '_underline', 'mceButtonSelected');\r
+                       break;\r
+\r
+                       case "STRIKE":\r
+                               tinyMCE.switchClassSticky(editor_id + '_strikethrough', 'mceButtonSelected');\r
+                       break;*/\r
+\r
+                       case "UL":\r
+                               tinyMCE.switchClassSticky(editor_id + '_bullist', 'mceButtonSelected');\r
+                       break;\r
+\r
+                       case "OL":\r
+                               tinyMCE.switchClassSticky(editor_id + '_numlist', 'mceButtonSelected');\r
+                       break;\r
+\r
+                       case "HR":\r
+                                tinyMCE.switchClassSticky(editor_id + '_hr', 'mceButtonSelected');\r
+                       break;\r
+\r
+                       case "IMG":\r
+                       if (getAttrib(node, 'name').indexOf('mce_') != 0) {\r
+                               tinyMCE.switchClassSticky(editor_id + '_image', 'mceButtonSelected');\r
+                       }\r
+                       break;\r
+               }\r
+       } while ((node = node.parentNode) != null);\r
+};\r
+\r
+// This function auto imports CSS classes into the class selection droplist\r
+function TinyMCE_advanced_setupCSSClasses(editor_id) {\r
+       if (!TinyMCE_advanced_autoImportCSSClasses)     {\r
+               return;\r
+       }\r
+\r
+       var selectElm = document.getElementById(editor_id + '_styleSelect');\r
+\r
+       if (selectElm && selectElm.getAttribute('cssImported') != 'true') {\r
+               var csses = tinyMCE.getCSSClasses(editor_id);\r
+               if (csses && selectElm) {\r
+                       for (var i=0; i<csses.length; i++) {\r
+                               selectElm.options[selectElm.length] = new Option(csses[i], csses[i]);\r
+                       }\r
+               }\r
+\r
+               // Only do this once\r
+               if (csses != null && csses.length > 0) {\r
+                       selectElm.setAttribute('cssImported', 'true');\r
+               }\r
+       }\r
+};\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..7c95344
--- /dev/null
@@ -0,0 +1,91 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_insert_image_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/image.js"></script>\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+<form onsubmit="insertImage();return false;">\r
+  <table border="0" cellpadding="0" cellspacing="0" width="200">\r
+    <tr>\r
+      <td align="center" valign="middle"><table border="0" cellpadding="4" cellspacing="0">\r
+          <tr>\r
+            <td colspan="2" class="title" nowrap="nowrap">{$lang_insert_image_title}</td>\r
+          </tr>\r
+          <tr>\r
+            <td nowrap="nowrap">{$lang_insert_image_src}:</td>\r
+            <td><table border="0" cellspacing="0" cellpadding="0">\r
+                <tr>\r
+                  <td><input name="src" type="text" id="src" value="" style="width: 200px" onchange="getImageData();"></td>\r
+                  <td id="srcbrowsercontainer">&nbsp;</td>\r
+                </tr>\r
+              </table></td>\r
+          </tr>\r
+                 <!-- Image list -->\r
+                 <script language="javascript">\r
+                       if (typeof(tinyMCEImageList) != "undefined" && tinyMCEImageList.length > 0) {\r
+                               var html = "";\r
+\r
+                               html += '<tr><td>{$lang_image_list}:</td>';\r
+                               html += '<td><select name="image_list" style="width: 200px" onchange="this.form.src.value=this.options[this.selectedIndex].value;resetImageData();getImageData();">';\r
+                               html += '<option value="">---</option>';\r
+\r
+                               for (var i=0; i<tinyMCEImageList.length; i++)\r
+                                       html += '<option value="' + tinyMCEImageList[i][1] + '">' + tinyMCEImageList[i][0] + '</option>';\r
+\r
+                               html += '</select></td></tr>';\r
+\r
+                               document.write(html);\r
+                       }\r
+                 </script>\r
+                 <!-- /Image list -->\r
+          <tr>\r
+            <td nowrap="nowrap">{$lang_insert_image_alt}:</td>\r
+            <td><input name="alt" type="text" id="alt" value="" style="width: 200px"></td>\r
+          </tr>\r
+          <tr>\r
+            <td nowrap="nowrap">{$lang_insert_image_align}:</td>\r
+            <td><select name="align">\r
+                <option value="">{$lang_insert_image_align_default}</option>\r
+                <option value="baseline">{$lang_insert_image_align_baseline}</option>\r
+                <option value="top">{$lang_insert_image_align_top}</option>\r
+                <option value="middle">{$lang_insert_image_align_middle}</option>\r
+                <option value="bottom">{$lang_insert_image_align_bottom}</option>\r
+                <option value="texttop">{$lang_insert_image_align_texttop}</option>\r
+                <option value="absmiddle">{$lang_insert_image_align_absmiddle}</option>\r
+                <option value="absbottom">{$lang_insert_image_align_absbottom}</option>\r
+                <option value="left">{$lang_insert_image_align_left}</option>\r
+                <option value="right">{$lang_insert_image_align_right}</option>\r
+              </select></td>\r
+          </tr>\r
+          <tr>\r
+            <td nowrap="nowrap">{$lang_insert_image_dimensions}:</td>\r
+            <td><input name="width" type="text" id="width" value="" size="3" maxlength="3">\r
+              x\r
+              <input name="height" type="text" id="height" value="" size="3" maxlength="3"></td>\r
+          </tr>\r
+          <tr>\r
+            <td nowrap="nowrap">{$lang_insert_image_border}:</td>\r
+            <td><input name="border" type="text" id="border" value="" size="3" maxlength="3"></td>\r
+          </tr>\r
+          <tr>\r
+            <td nowrap="nowrap">{$lang_insert_image_vspace}:</td>\r
+            <td><input name="vspace" type="text" id="vspace" value="" size="3" maxlength="3"></td>\r
+          </tr>\r
+          <tr>\r
+            <td nowrap="nowrap">{$lang_insert_image_hspace}:</td>\r
+            <td><input name="hspace" type="text" id="hspace" value="" size="3" maxlength="3"></td>\r
+          </tr>\r
+          <tr>\r
+            <td nowrap="nowrap"><input type="button" id="insert" name="insert" value="{$lang_insert}" onclick="insertImage();">\r
+            </td>\r
+            <td align="right"><input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();"></td>\r
+          </tr>\r
+        </table></td>\r
+    </tr>\r
+  </table>\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/themes/advanced/images/anchor.gif b/webcit/tiny_mce/themes/advanced/images/anchor.gif
new file mode 100644 (file)
index 0000000..34ab715
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/anchor.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/anchor_symbol.gif b/webcit/tiny_mce/themes/advanced/images/anchor_symbol.gif
new file mode 100644 (file)
index 0000000..2eafd79
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/anchor_symbol.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/backcolor.gif b/webcit/tiny_mce/themes/advanced/images/backcolor.gif
new file mode 100644 (file)
index 0000000..8a532e5
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/backcolor.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/bold.gif b/webcit/tiny_mce/themes/advanced/images/bold.gif
new file mode 100644 (file)
index 0000000..d6a9cc2
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/bold.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/bold_de_se.gif b/webcit/tiny_mce/themes/advanced/images/bold_de_se.gif
new file mode 100644 (file)
index 0000000..9b129de
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/bold_de_se.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/bold_es.gif b/webcit/tiny_mce/themes/advanced/images/bold_es.gif
new file mode 100644 (file)
index 0000000..ea341e6
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/bold_es.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/bold_fr.gif b/webcit/tiny_mce/themes/advanced/images/bold_fr.gif
new file mode 100644 (file)
index 0000000..2816454
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/bold_fr.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/bold_ru.gif b/webcit/tiny_mce/themes/advanced/images/bold_ru.gif
new file mode 100644 (file)
index 0000000..e000d46
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/bold_ru.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/bold_tw.gif b/webcit/tiny_mce/themes/advanced/images/bold_tw.gif
new file mode 100644 (file)
index 0000000..8208543
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/bold_tw.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/browse.gif b/webcit/tiny_mce/themes/advanced/images/browse.gif
new file mode 100644 (file)
index 0000000..c786d0b
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/browse.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/bullist.gif b/webcit/tiny_mce/themes/advanced/images/bullist.gif
new file mode 100644 (file)
index 0000000..6e19467
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/bullist.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/buttons.gif b/webcit/tiny_mce/themes/advanced/images/buttons.gif
new file mode 100644 (file)
index 0000000..5d5e08b
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/buttons.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/cancel_button_bg.gif b/webcit/tiny_mce/themes/advanced/images/cancel_button_bg.gif
new file mode 100644 (file)
index 0000000..4b4aeef
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/cancel_button_bg.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/charmap.gif b/webcit/tiny_mce/themes/advanced/images/charmap.gif
new file mode 100644 (file)
index 0000000..3cdc4ac
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/charmap.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/cleanup.gif b/webcit/tiny_mce/themes/advanced/images/cleanup.gif
new file mode 100644 (file)
index 0000000..16491f6
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/cleanup.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/close.gif b/webcit/tiny_mce/themes/advanced/images/close.gif
new file mode 100644 (file)
index 0000000..679ca2a
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/close.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/code.gif b/webcit/tiny_mce/themes/advanced/images/code.gif
new file mode 100644 (file)
index 0000000..c5d5a67
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/code.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/color.gif b/webcit/tiny_mce/themes/advanced/images/color.gif
new file mode 100644 (file)
index 0000000..1ecd574
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/color.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/copy.gif b/webcit/tiny_mce/themes/advanced/images/copy.gif
new file mode 100644 (file)
index 0000000..dc14686
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/copy.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/custom_1.gif b/webcit/tiny_mce/themes/advanced/images/custom_1.gif
new file mode 100644 (file)
index 0000000..4cbccda
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/custom_1.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/cut.gif b/webcit/tiny_mce/themes/advanced/images/cut.gif
new file mode 100644 (file)
index 0000000..4e9a70b
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/cut.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/forecolor.gif b/webcit/tiny_mce/themes/advanced/images/forecolor.gif
new file mode 100644 (file)
index 0000000..d5e3814
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/forecolor.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/help.gif b/webcit/tiny_mce/themes/advanced/images/help.gif
new file mode 100644 (file)
index 0000000..51a1ee4
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/help.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/hr.gif b/webcit/tiny_mce/themes/advanced/images/hr.gif
new file mode 100644 (file)
index 0000000..1a1ba2a
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/hr.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/image.gif b/webcit/tiny_mce/themes/advanced/images/image.gif
new file mode 100644 (file)
index 0000000..4b88edd
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/image.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/indent.gif b/webcit/tiny_mce/themes/advanced/images/indent.gif
new file mode 100644 (file)
index 0000000..acd315b
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/indent.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/insert_button_bg.gif b/webcit/tiny_mce/themes/advanced/images/insert_button_bg.gif
new file mode 100644 (file)
index 0000000..69c131c
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/insert_button_bg.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/italic.gif b/webcit/tiny_mce/themes/advanced/images/italic.gif
new file mode 100644 (file)
index 0000000..8bb330b
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/italic.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/italic_de_se.gif b/webcit/tiny_mce/themes/advanced/images/italic_de_se.gif
new file mode 100644 (file)
index 0000000..feb0309
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/italic_de_se.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/italic_es.gif b/webcit/tiny_mce/themes/advanced/images/italic_es.gif
new file mode 100644 (file)
index 0000000..4572cdb
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/italic_es.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/italic_ru.gif b/webcit/tiny_mce/themes/advanced/images/italic_ru.gif
new file mode 100644 (file)
index 0000000..a2bb69a
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/italic_ru.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/italic_tw.gif b/webcit/tiny_mce/themes/advanced/images/italic_tw.gif
new file mode 100644 (file)
index 0000000..4f6eeaa
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/italic_tw.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/justifycenter.gif b/webcit/tiny_mce/themes/advanced/images/justifycenter.gif
new file mode 100644 (file)
index 0000000..42d609a
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/justifycenter.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/justifyfull.gif b/webcit/tiny_mce/themes/advanced/images/justifyfull.gif
new file mode 100644 (file)
index 0000000..c8504f6
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/justifyfull.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/justifyleft.gif b/webcit/tiny_mce/themes/advanced/images/justifyleft.gif
new file mode 100644 (file)
index 0000000..e8f7e42
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/justifyleft.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/justifyright.gif b/webcit/tiny_mce/themes/advanced/images/justifyright.gif
new file mode 100644 (file)
index 0000000..e4cea97
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/justifyright.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/link.gif b/webcit/tiny_mce/themes/advanced/images/link.gif
new file mode 100644 (file)
index 0000000..1accf42
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/link.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/newdocument.gif b/webcit/tiny_mce/themes/advanced/images/newdocument.gif
new file mode 100644 (file)
index 0000000..a9d2938
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/newdocument.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/numlist.gif b/webcit/tiny_mce/themes/advanced/images/numlist.gif
new file mode 100644 (file)
index 0000000..a268352
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/numlist.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/opacity.png b/webcit/tiny_mce/themes/advanced/images/opacity.png
new file mode 100644 (file)
index 0000000..b4217cb
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/opacity.png differ
diff --git a/webcit/tiny_mce/themes/advanced/images/outdent.gif b/webcit/tiny_mce/themes/advanced/images/outdent.gif
new file mode 100644 (file)
index 0000000..23f6aa4
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/outdent.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/paste.gif b/webcit/tiny_mce/themes/advanced/images/paste.gif
new file mode 100644 (file)
index 0000000..1b45000
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/paste.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/redo.gif b/webcit/tiny_mce/themes/advanced/images/redo.gif
new file mode 100644 (file)
index 0000000..3af9069
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/redo.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/removeformat.gif b/webcit/tiny_mce/themes/advanced/images/removeformat.gif
new file mode 100644 (file)
index 0000000..0fa3cb7
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/removeformat.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/spacer.gif b/webcit/tiny_mce/themes/advanced/images/spacer.gif
new file mode 100644 (file)
index 0000000..3884865
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/spacer.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/statusbar_resize.gif b/webcit/tiny_mce/themes/advanced/images/statusbar_resize.gif
new file mode 100644 (file)
index 0000000..af89d80
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/statusbar_resize.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/strikethrough.gif b/webcit/tiny_mce/themes/advanced/images/strikethrough.gif
new file mode 100644 (file)
index 0000000..3264635
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/strikethrough.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/sub.gif b/webcit/tiny_mce/themes/advanced/images/sub.gif
new file mode 100644 (file)
index 0000000..4d7ce30
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/sub.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/sup.gif b/webcit/tiny_mce/themes/advanced/images/sup.gif
new file mode 100644 (file)
index 0000000..a7145e0
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/sup.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/table.gif b/webcit/tiny_mce/themes/advanced/images/table.gif
new file mode 100644 (file)
index 0000000..2911830
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/table.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/table_delete_col.gif b/webcit/tiny_mce/themes/advanced/images/table_delete_col.gif
new file mode 100644 (file)
index 0000000..91f53af
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/table_delete_col.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/table_delete_row.gif b/webcit/tiny_mce/themes/advanced/images/table_delete_row.gif
new file mode 100644 (file)
index 0000000..7025733
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/table_delete_row.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/table_insert_col_after.gif b/webcit/tiny_mce/themes/advanced/images/table_insert_col_after.gif
new file mode 100644 (file)
index 0000000..8505808
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/table_insert_col_after.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/table_insert_col_before.gif b/webcit/tiny_mce/themes/advanced/images/table_insert_col_before.gif
new file mode 100644 (file)
index 0000000..b669d4f
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/table_insert_col_before.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/table_insert_row_after.gif b/webcit/tiny_mce/themes/advanced/images/table_insert_row_after.gif
new file mode 100644 (file)
index 0000000..b9c1446
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/table_insert_row_after.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/table_insert_row_before.gif b/webcit/tiny_mce/themes/advanced/images/table_insert_row_before.gif
new file mode 100644 (file)
index 0000000..157d373
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/table_insert_row_before.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/underline.gif b/webcit/tiny_mce/themes/advanced/images/underline.gif
new file mode 100644 (file)
index 0000000..1dfeb5f
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/underline.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/underline_es.gif b/webcit/tiny_mce/themes/advanced/images/underline_es.gif
new file mode 100644 (file)
index 0000000..551d914
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/underline_es.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/underline_fr.gif b/webcit/tiny_mce/themes/advanced/images/underline_fr.gif
new file mode 100644 (file)
index 0000000..551d914
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/underline_fr.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/underline_ru.gif b/webcit/tiny_mce/themes/advanced/images/underline_ru.gif
new file mode 100644 (file)
index 0000000..b78e2a4
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/underline_ru.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/underline_tw.gif b/webcit/tiny_mce/themes/advanced/images/underline_tw.gif
new file mode 100644 (file)
index 0000000..b715390
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/underline_tw.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/undo.gif b/webcit/tiny_mce/themes/advanced/images/undo.gif
new file mode 100644 (file)
index 0000000..520796d
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/undo.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/unlink.gif b/webcit/tiny_mce/themes/advanced/images/unlink.gif
new file mode 100644 (file)
index 0000000..5c8a33d
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/unlink.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/visualaid.gif b/webcit/tiny_mce/themes/advanced/images/visualaid.gif
new file mode 100644 (file)
index 0000000..63caf18
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/visualaid.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/xp/tab_bg.gif b/webcit/tiny_mce/themes/advanced/images/xp/tab_bg.gif
new file mode 100644 (file)
index 0000000..897a01f
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/xp/tab_bg.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/xp/tab_end.gif b/webcit/tiny_mce/themes/advanced/images/xp/tab_end.gif
new file mode 100644 (file)
index 0000000..aee442b
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/xp/tab_end.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/xp/tab_sel_bg.gif b/webcit/tiny_mce/themes/advanced/images/xp/tab_sel_bg.gif
new file mode 100644 (file)
index 0000000..9dc8abe
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/xp/tab_sel_bg.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/xp/tab_sel_end.gif b/webcit/tiny_mce/themes/advanced/images/xp/tab_sel_end.gif
new file mode 100644 (file)
index 0000000..616a889
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/xp/tab_sel_end.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/images/xp/tabs_bg.gif b/webcit/tiny_mce/themes/advanced/images/xp/tabs_bg.gif
new file mode 100644 (file)
index 0000000..c303f66
Binary files /dev/null and b/webcit/tiny_mce/themes/advanced/images/xp/tabs_bg.gif differ
diff --git a/webcit/tiny_mce/themes/advanced/jscripts/about.js b/webcit/tiny_mce/themes/advanced/jscripts/about.js
new file mode 100644 (file)
index 0000000..fc33f85
--- /dev/null
@@ -0,0 +1,74 @@
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       // Give FF some time\r
+       window.setTimeout('insertHelpIFrame();', 10);\r
+\r
+       var tcont = document.getElementById('plugintablecontainer');\r
+       var plugins = tinyMCE.getParam('plugins', '', true, ',');\r
+       if (plugins.length == 0)\r
+               document.getElementById('plugins_tab').style.display = 'none';\r
+\r
+       var html = "";\r
+       html += '<table id="plugintable">';\r
+       html += '<thead>';\r
+       html += '<tr>';\r
+       html += '<td>' + tinyMCE.getLang('lang_plugin') + '</td>';\r
+       html += '<td>' + tinyMCE.getLang('lang_author') + '</td>';\r
+       html += '<td>' + tinyMCE.getLang('lang_version') + '</td>';\r
+       html += '</tr>';\r
+       html += '</thead>';\r
+       html += '<tbody>';\r
+\r
+       for (var i=0; i<plugins.length; i++) {\r
+               var info = getPluginInfo(plugins[i]);\r
+\r
+               html += '<tr>';\r
+\r
+               if (info.infourl != null && info.infourl != '')\r
+                       html += '<td width="50%" title="' + plugins[i] + '"><a href="' + info.infourl + '" target="mceplugin">' + info.longname + '</a></td>';\r
+               else\r
+                       html += '<td width="50%" title="' + plugins[i] + '">' + info.longname + '</td>';\r
+\r
+               if (info.authorurl != null && info.authorurl != '')\r
+                       html += '<td width="35%"><a href="' + info.authorurl + '" target="mceplugin">' + info.author + '</a></td>';\r
+               else\r
+                       html += '<td width="35%">' + info.author + '</td>';\r
+\r
+               html += '<td width="15%">' + info.version + '</td>';\r
+               html += '</tr>';\r
+       }\r
+\r
+       html += '</tbody>';\r
+       html += '</table>';\r
+\r
+       tcont.innerHTML = html;\r
+}\r
+\r
+function getPluginInfo(name) {\r
+       var fn = eval('tinyMCEPopup.windowOpener.TinyMCE_' + name + '_getInfo');\r
+\r
+       if (typeof(fn) != 'undefined')\r
+               return fn();\r
+\r
+       return {\r
+               longname : name,\r
+               authorurl : '',\r
+               infourl : '',\r
+               author : '--',\r
+               version : '--'\r
+       };\r
+}\r
+\r
+function insertHelpIFrame() {\r
+       var html = '<iframe width="100%" height="300" src="' + tinyMCE.themeURL + "/docs/" + tinyMCE.settings['docs_language'] + "/index.htm" + '"></iframe>';\r
+\r
+       document.getElementById('iframecontainer').innerHTML = html;\r
+\r
+       html = '';\r
+       html += '<a href="http://www.moxiecode.com" target="_blank"><img src="http://tinymce.moxiecode.com/images/gotmoxie.png" alt="Got Moxie?" border="0" /></a> ';\r
+       html += '<a href="http://sourceforge.net/projects/tinymce/" target="_blank"><img src="http://sourceforge.net/sflogo.php?group_id=103281" alt="Hosted By Sourceforge" border="0" /></a> ';\r
+       html += '<a href="http://www.freshmeat.net/projects/tinymce" target="_blank"><img src="http://tinymce.moxiecode.com/images/fm.gif" alt="Also on freshmeat" border="0" /></a> ';\r
+\r
+       document.getElementById('buttoncontainer').innerHTML = html;\r
+}\r
diff --git a/webcit/tiny_mce/themes/advanced/jscripts/anchor.js b/webcit/tiny_mce/themes/advanced/jscripts/anchor.js
new file mode 100644 (file)
index 0000000..446a3ce
--- /dev/null
@@ -0,0 +1,59 @@
+var action, element;\r
+\r
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));\r
+       var anchor = tinyMCE.getParentElement(inst.getFocusElement(), "a", "name");\r
+       var img = inst.getFocusElement();\r
+       action = 'insert';\r
+\r
+       if (anchor != null) {\r
+               element = anchor;\r
+               action = "update";\r
+       }\r
+\r
+       if (tinyMCE.getAttrib(img, "class") == "mceItemAnchor") {\r
+               element = img;\r
+               action = "update";\r
+       }\r
+\r
+       if (action == "update")\r
+               document.forms[0].anchorName.value = element.nodeName == "IMG" ? element.getAttribute("title") : element.getAttribute("name");\r
+\r
+       document.forms[0].insert.value = tinyMCE.getLang('lang_' + action, 'Insert', true);\r
+}\r
+\r
+function insertAnchor() {\r
+       var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));\r
+       var name = document.forms[0].anchorName.value;\r
+\r
+       tinyMCEPopup.execCommand("mceBeginUndoLevel");\r
+\r
+       if (action == "update") {\r
+               if (element.nodeName == "IMG")\r
+                       element.setAttribute("title", name);\r
+               else\r
+                       element.setAttribute("name", name);\r
+       } else {\r
+               var rng = inst.getRng();\r
+\r
+               if (rng.collapse)\r
+                       rng.collapse(false);\r
+\r
+               name = name.replace(/&/g, '&amp;');\r
+               name = name.replace(/\"/g, '&quot;');\r
+               name = name.replace(/</g, '&lt;');\r
+               name = name.replace(/>/g, '&gr;');\r
+\r
+               html = '<a name="' + name + '"></a>';\r
+\r
+               tinyMCEPopup.execCommand("mceInsertContent", false, html);\r
+               tinyMCE.handleVisualAid(inst.getBody(), true, inst.visualAid, inst);\r
+       }\r
+\r
+       tinyMCEPopup.execCommand("mceEndUndoLevel");\r
+\r
+       tinyMCE.triggerNodeChange();\r
+       tinyMCEPopup.close();\r
+}\r
diff --git a/webcit/tiny_mce/themes/advanced/jscripts/charmap.js b/webcit/tiny_mce/themes/advanced/jscripts/charmap.js
new file mode 100644 (file)
index 0000000..bc9df27
--- /dev/null
@@ -0,0 +1,324 @@
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+}\r
+\r
+var charmap = new Array();\r
+\r
+// for mor details please see w3c.org\r
+// now here is the complete list ;)\r
+\r
+charmap = [\r
+       ['&nbsp;',    '&#160;',  true, 'no-break space'],\r
+       ['&amp;',     '&#38;',   true, 'ampersand'],\r
+       ['&quot;',    '&#34;',   true, 'quotation mark'],\r
+// finance\r
+       ['&cent;',    '&#162;',  true, 'cent sign'],\r
+       ['&euro;',    '&#8364;', true, 'euro sign'],\r
+       ['&pound;',   '&#163;',  true, 'pound sign'],\r
+       ['&yen;',     '&#165;',  true, 'yen sign'],\r
+// signs\r
+       ['&copy;',    '&#169;',  true, 'copyright sign'],\r
+       ['&reg;',     '&#174;',  true, 'registered sign'],\r
+       ['&trade;',   '&#8482;', true, 'trade mark sign'],\r
+       ['&permil;',  '&#8240;', true, 'per mille sign'],\r
+       ['&micro;',   '&#181;',  true, 'micro sign'],\r
+       ['&middot;',  '&#183;',  true, 'middle dot'],\r
+       ['&bull;',    '&#8226;', true, 'bullet'],\r
+       ['&hellip;',  '&#8230;', true, 'three dot leader'],\r
+       ['&prime;',   '&#8242;', true, 'minutes / feet'],\r
+       ['&Prime;',   '&#8243;', true, 'seconds / inches'],\r
+       ['&sect;',    '&#167;',  true, 'section sign'],\r
+       ['&para;',    '&#182;',  true, 'paragraph sign'],\r
+       ['&szlig;',   '&#223;',  true, 'sharp s / ess-zed'],\r
+// quotations\r
+       ['&lsaquo;',  '&#8249;', true, 'single left-pointing angle quotation mark'],\r
+       ['&rsaquo;',  '&#8250;', true, 'single right-pointing angle quotation mark'],\r
+       ['&laquo;',   '&#171;',  true, 'left pointing guillemet'],\r
+       ['&raquo;',   '&#187;',  true, 'right pointing guillemet'],\r
+       ['&lsquo;',   '&#8216;', true, 'left single quotation mark'],\r
+       ['&rsquo;',   '&#8217;', true, 'right single quotation mark'],\r
+       ['&ldquo;',   '&#8220;', true, 'left double quotation mark'],\r
+       ['&rdquo;',   '&#8221;', true, 'right double quotation mark'],\r
+       ['&sbquo;',   '&#8218;', true, 'single low-9 quotation mark'],\r
+       ['&bdquo;',   '&#8222;', true, 'double low-9 quotation mark'],\r
+       ['&lt;',      '&#60;',   true, 'less-than sign'],\r
+       ['&gt;',      '&#62;',   true, 'greater-than sign'],\r
+       ['&le;',      '&#8804;', true, 'less-than or equal to'],\r
+       ['&ge;',      '&#8805;', true, 'greater-than or equal to'],\r
+       ['&ndash;',   '&#8211;', true, 'en dash'],\r
+       ['&mdash;',   '&#8212;', true, 'em dash'],\r
+       ['&macr;',    '&#175;',  true, 'macron'],\r
+       ['&oline;',   '&#8254;', true, 'overline'],\r
+       ['&curren;',  '&#164;',  true, 'currency sign'],\r
+       ['&brvbar;',  '&#166;',  true, 'broken bar'],\r
+       ['&uml;',     '&#168;',  true, 'diaeresis'],\r
+       ['&iexcl;',   '&#161;',  true, 'inverted exclamation mark'],\r
+       ['&iquest;',  '&#191;',  true, 'turned question mark'],\r
+       ['&circ;',    '&#710;',  true, 'circumflex accent'],\r
+       ['&tilde;',   '&#732;',  true, 'small tilde'],\r
+       ['&deg;',     '&#176;',  true, 'degree sign'],\r
+       ['&minus;',   '&#8722;', true, 'minus sign'],\r
+       ['&plusmn;',  '&#177;',  true, 'plus-minus sign'],\r
+       ['&divide;',  '&#247;',  true, 'division sign'],\r
+       ['&frasl;',   '&#8260;', true, 'fraction slash'],\r
+       ['&times;',   '&#215;',  true, 'multiplication sign'],\r
+       ['&sup1;',    '&#185;',  true, 'superscript one'],\r
+       ['&sup2;',    '&#178;',  true, 'superscript two'],\r
+       ['&sup3;',    '&#179;',  true, 'superscript three'],\r
+       ['&frac14;',  '&#188;',  true, 'fraction one quarter'],\r
+       ['&frac12;',  '&#189;',  true, 'fraction one half'],\r
+       ['&frac34;',  '&#190;',  true, 'fraction three quarters'],\r
+// math / logical\r
+       ['&fnof;',    '&#402;',  true, 'function / florin'],\r
+       ['&int;',     '&#8747;', true, 'integral'],\r
+       ['&sum;',     '&#8721;', true, 'n-ary sumation'],\r
+       ['&infin;',   '&#8734;', true, 'infinity'],\r
+       ['&radic;',   '&#8730;', true, 'square root'],\r
+       ['&sim;',     '&#8764;', false,'similar to'],\r
+       ['&cong;',    '&#8773;', false,'approximately equal to'],\r
+       ['&asymp;',   '&#8776;', true, 'almost equal to'],\r
+       ['&ne;',      '&#8800;', true, 'not equal to'],\r
+       ['&equiv;',   '&#8801;', true, 'identical to'],\r
+       ['&isin;',    '&#8712;', false,'element of'],\r
+       ['&notin;',   '&#8713;', false,'not an element of'],\r
+       ['&ni;',      '&#8715;', false,'contains as member'],\r
+       ['&prod;',    '&#8719;', true, 'n-ary product'],\r
+       ['&and;',     '&#8743;', false,'logical and'],\r
+       ['&or;',      '&#8744;', false,'logical or'],\r
+       ['&not;',     '&#172;',  true, 'not sign'],\r
+       ['&cap;',     '&#8745;', true, 'intersection'],\r
+       ['&cup;',     '&#8746;', false,'union'],\r
+       ['&part;',    '&#8706;', true, 'partial differential'],\r
+       ['&forall;',  '&#8704;', false,'for all'],\r
+       ['&exist;',   '&#8707;', false,'there exists'],\r
+       ['&empty;',   '&#8709;', false,'diameter'],\r
+       ['&nabla;',   '&#8711;', false,'backward difference'],\r
+       ['&lowast;',  '&#8727;', false,'asterisk operator'],\r
+       ['&prop;',    '&#8733;', false,'proportional to'],\r
+       ['&ang;',     '&#8736;', false,'angle'],\r
+// undefined\r
+       ['&acute;',   '&#180;',  true, 'acute accent'],\r
+       ['&cedil;',   '&#184;',  true, 'cedilla'],\r
+       ['&ordf;',    '&#170;',  true, 'feminine ordinal indicator'],\r
+       ['&ordm;',    '&#186;',  true, 'masculine ordinal indicator'],\r
+       ['&dagger;',  '&#8224;', true, 'dagger'],\r
+       ['&Dagger;',  '&#8225;', true, 'double dagger'],\r
+// alphabetical special chars\r
+       ['&Agrave;',  '&#192;',  true, 'A - grave'],\r
+       ['&Aacute;',  '&#193;',  true, 'A - acute'],\r
+       ['&Acirc;',   '&#194;',  true, 'A - circumflex'],\r
+       ['&Atilde;',  '&#195;',  true, 'A - tilde'],\r
+       ['&Auml;',    '&#196;',  true, 'A - diaeresis'],\r
+       ['&Aring;',   '&#197;',  true, 'A - ring above'],\r
+       ['&AElig;',   '&#198;',  true, 'ligature AE'],\r
+       ['&Ccedil;',  '&#199;',  true, 'C - cedilla'],\r
+       ['&Egrave;',  '&#200;',  true, 'E - grave'],\r
+       ['&Eacute;',  '&#201;',  true, 'E - acute'],\r
+       ['&Ecirc;',   '&#202;',  true, 'E - circumflex'],\r
+       ['&Euml;',    '&#203;',  true, 'E - diaeresis'],\r
+       ['&Igrave;',  '&#204;',  true, 'I - grave'],\r
+       ['&Iacute;',  '&#205;',  true, 'I - acute'],\r
+       ['&Icirc;',   '&#206;',  true, 'I - circumflex'],\r
+       ['&Iuml;',    '&#207;',  true, 'I - diaeresis'],\r
+       ['&ETH;',     '&#208;',  true, 'ETH'],\r
+       ['&Ntilde;',  '&#209;',  true, 'N - tilde'],\r
+       ['&Ograve;',  '&#210;',  true, 'O - grave'],\r
+       ['&Oacute;',  '&#211;',  true, 'O - acute'],\r
+       ['&Ocirc;',   '&#212;',  true, 'O - circumflex'],\r
+       ['&Otilde;',  '&#213;',  true, 'O - tilde'],\r
+       ['&Ouml;',    '&#214;',  true, 'O - diaeresis'],\r
+       ['&Oslash;',  '&#216;',  true, 'O - slash'],\r
+       ['&OElig;',   '&#338;',  true, 'ligature OE'],\r
+       ['&Scaron;',  '&#352;',  true, 'S - caron'],\r
+       ['&Ugrave;',  '&#217;',  true, 'U - grave'],\r
+       ['&Uacute;',  '&#218;',  true, 'U - acute'],\r
+       ['&Ucirc;',   '&#219;',  true, 'U - circumflex'],\r
+       ['&Uuml;',    '&#220;',  true, 'U - diaeresis'],\r
+       ['&Yacute;',  '&#221;',  true, 'Y - acute'],\r
+       ['&Yuml;',    '&#376;',  true, 'Y - diaeresis'],\r
+       ['&THORN;',   '&#222;',  true, 'THORN'],\r
+       ['&agrave;',  '&#224;',  true, 'a - grave'],\r
+       ['&aacute;',  '&#225;',  true, 'a - acute'],\r
+       ['&acirc;',   '&#226;',  true, 'a - circumflex'],\r
+       ['&atilde;',  '&#227;',  true, 'a - tilde'],\r
+       ['&auml;',    '&#228;',  true, 'a - diaeresis'],\r
+       ['&aring;',   '&#229;',  true, 'a - ring above'],\r
+       ['&aelig;',   '&#230;',  true, 'ligature ae'],\r
+       ['&ccedil;',  '&#231;',  true, 'c - cedilla'],\r
+       ['&egrave;',  '&#232;',  true, 'e - grave'],\r
+       ['&eacute;',  '&#233;',  true, 'e - acute'],\r
+       ['&ecirc;',   '&#234;',  true, 'e - circumflex'],\r
+       ['&euml;',    '&#235;',  true, 'e - diaeresis'],\r
+       ['&igrave;',  '&#236;',  true, 'i - grave'],\r
+       ['&iacute;',  '&#237;',  true, 'i - acute'],\r
+       ['&icirc;',   '&#238;',  true, 'i - circumflex'],\r
+       ['&iuml;',    '&#239;',  true, 'i - diaeresis'],\r
+       ['&eth;',     '&#240;',  true, 'eth'],\r
+       ['&ntilde;',  '&#241;',  true, 'n - tilde'],\r
+       ['&ograve;',  '&#242;',  true, 'o - grave'],\r
+       ['&oacute;',  '&#243;',  true, 'o - acute'],\r
+       ['&ocirc;',   '&#244;',  true, 'o - circumflex'],\r
+       ['&otilde;',  '&#245;',  true, 'o - tilde'],\r
+       ['&ouml;',    '&#246;',  true, 'o - diaeresis'],\r
+       ['&oslash;',  '&#248;',  true, 'o slash'],\r
+       ['&oelig;',   '&#339;',  true, 'ligature oe'],\r
+       ['&scaron;',  '&#353;',  true, 's - caron'],\r
+       ['&ugrave;',  '&#249;',  true, 'u - grave'],\r
+       ['&uacute;',  '&#250;',  true, 'u - acute'],\r
+       ['&ucirc;',   '&#251;',  true, 'u - circumflex'],\r
+       ['&uuml;',    '&#252;',  true, 'u - diaeresis'],\r
+       ['&yacute;',  '&#253;',  true, 'y - acute'],\r
+       ['&thorn;',   '&#254;',  true, 'thorn'],\r
+       ['&yuml;',    '&#255;',  true, 'y - diaeresis'],\r
+// ['&Alpha;',   '&#913;',  true, 'Alpha'],\r
+       ['&Beta;',    '&#914;',  true, 'Beta'],\r
+       ['&Gamma;',   '&#915;',  true, 'Gamma'],\r
+       ['&Delta;',   '&#916;',  true, 'Delta'],\r
+       ['&Epsilon;', '&#917;',  true, 'Epsilon'],\r
+       ['&Zeta;',    '&#918;',  true, 'Zeta'],\r
+       ['&Eta;',     '&#919;',  true, 'Eta'],\r
+       ['&Theta;',   '&#920;',  true, 'Theta'],\r
+       ['&Iota;',    '&#921;',  true, 'Iota'],\r
+       ['&Kappa;',   '&#922;',  true, 'Kappa'],\r
+       ['&Lambda;',  '&#923;',  true, 'Lambda'],\r
+       ['&Mu;',      '&#924;',  true, 'Mu'],\r
+       ['&Nu;',      '&#925;',  true, 'Nu'],\r
+       ['&Xi;',      '&#926;',  true, 'Xi'],\r
+       ['&Omicron;', '&#927;',  true, 'Omicron'],\r
+       ['&Pi;',      '&#928;',  true, 'Pi'],\r
+       ['&Rho;',     '&#929;',  true, 'Rho'],\r
+       ['&Sigma;',   '&#931;',  true, 'Sigma'],\r
+       ['&Tau;',     '&#932;',  true, 'Tau'],\r
+       ['&Upsilon;', '&#933;',  true, 'Upsilon'],\r
+       ['&Phi;',     '&#934;',  true, 'Phi'],\r
+       ['&Chi;',     '&#935;',  true, 'Chi'],\r
+       ['&Psi;',     '&#936;',  true, 'Psi'],\r
+       ['&Omega;',   '&#937;',  true, 'Omega'],\r
+       ['&alpha;',   '&#945;',  true, 'alpha'],\r
+       ['&beta;',    '&#946;',  true, 'beta'],\r
+       ['&gamma;',   '&#947;',  true, 'gamma'],\r
+       ['&delta;',   '&#948;',  true, 'delta'],\r
+       ['&epsilon;', '&#949;',  true, 'epsilon'],\r
+       ['&zeta;',    '&#950;',  true, 'zeta'],\r
+       ['&eta;',     '&#951;',  true, 'eta'],\r
+       ['&theta;',   '&#952;',  true, 'theta'],\r
+       ['&iota;',    '&#953;',  true, 'iota'],\r
+       ['&kappa;',   '&#954;',  true, 'kappa'],\r
+       ['&lambda;',  '&#955;',  true, 'lambda'],\r
+       ['&mu;',      '&#956;',  true, 'mu'],\r
+       ['&nu;',      '&#957;',  true, 'nu'],\r
+       ['&xi;',      '&#958;',  true, 'xi'],\r
+       ['&omicron;', '&#959;',  true, 'omicron'],\r
+       ['&pi;',      '&#960;',  true, 'pi'],\r
+       ['&rho;',     '&#961;',  true, 'rho'],\r
+       ['&sigmaf;',  '&#962;',  true, 'final sigma'],\r
+       ['&sigma;',   '&#963;',  true, 'sigma'],\r
+       ['&tau;',     '&#964;',  true, 'tau'],\r
+       ['&upsilon;', '&#965;',  true, 'upsilon'],\r
+       ['&phi;',     '&#966;',  true, 'phi'],\r
+       ['&chi;',     '&#967;',  true, 'chi'],\r
+       ['&psi;',     '&#968;',  true, 'psi'],\r
+       ['&omega;',   '&#969;',  true, 'omega'],\r
+// symbols\r
+       ['&alefsym;', '&#8501;', false,'alef symbol'],\r
+       ['&piv;',     '&#982;',  false,'pi symbol'],\r
+       ['&real;',    '&#8476;', false,'real part symbol'],\r
+       ['&thetasym;','&#977;',  false,'theta symbol'],\r
+       ['&upsih;',   '&#978;',  false,'upsilon - hook symbol'],\r
+       ['&weierp;',  '&#8472;', false,'Weierstrass p'],\r
+       ['&image;',   '&#8465;', false,'imaginary part'],\r
+// arrows\r
+       ['&larr;',    '&#8592;', true, 'leftwards arrow'],\r
+       ['&uarr;',    '&#8593;', true, 'upwards arrow'],\r
+       ['&rarr;',    '&#8594;', true, 'rightwards arrow'],\r
+       ['&darr;',    '&#8595;', true, 'downwards arrow'],\r
+       ['&harr;',    '&#8596;', true, 'left right arrow'],\r
+       ['&crarr;',   '&#8629;', false,'carriage return'],\r
+       ['&lArr;',    '&#8656;', false,'leftwards double arrow'],\r
+       ['&uArr;',    '&#8657;', false,'upwards double arrow'],\r
+       ['&rArr;',    '&#8658;', false,'rightwards double arrow'],\r
+       ['&dArr;',    '&#8659;', false,'downwards double arrow'],\r
+       ['&hArr;',    '&#8660;', false,'left right double arrow'],\r
+       ['&there4;',  '&#8756;', false,'therefore'],\r
+       ['&sub;',     '&#8834;', false,'subset of'],\r
+       ['&sup;',     '&#8835;', false,'superset of'],\r
+       ['&nsub;',    '&#8836;', false,'not a subset of'],\r
+       ['&sube;',    '&#8838;', false,'subset of or equal to'],\r
+       ['&supe;',    '&#8839;', false,'superset of or equal to'],\r
+       ['&oplus;',   '&#8853;', false,'circled plus'],\r
+       ['&otimes;',  '&#8855;', false,'circled times'],\r
+       ['&perp;',    '&#8869;', false,'perpendicular'],\r
+       ['&sdot;',    '&#8901;', false,'dot operator'],\r
+       ['&lceil;',   '&#8968;', false,'left ceiling'],\r
+       ['&rceil;',   '&#8969;', false,'right ceiling'],\r
+       ['&lfloor;',  '&#8970;', false,'left floor'],\r
+       ['&rfloor;',  '&#8971;', false,'right floor'],\r
+       ['&lang;',    '&#9001;', false,'left-pointing angle bracket'],\r
+       ['&rang;',    '&#9002;', false,'right-pointing angle bracket'],\r
+       ['&loz;',     '&#9674;', true,'lozenge'],\r
+       ['&spades;',  '&#9824;', false,'black spade suit'],\r
+       ['&clubs;',   '&#9827;', true, 'black club suit'],\r
+       ['&hearts;',  '&#9829;', true, 'black heart suit'],\r
+       ['&diams;',   '&#9830;', true, 'black diamond suit'],\r
+       ['&ensp;',    '&#8194;', false,'en space'],\r
+       ['&emsp;',    '&#8195;', false,'em space'],\r
+       ['&thinsp;',  '&#8201;', false,'thin space'],\r
+       ['&zwnj;',    '&#8204;', false,'zero width non-joiner'],\r
+       ['&zwj;',     '&#8205;', false,'zero width joiner'],\r
+       ['&lrm;',     '&#8206;', false,'left-to-right mark'],\r
+       ['&rlm;',     '&#8207;', false,'right-to-left mark'],\r
+       ['&shy;',     '&#173;',  false,'soft hyphen']\r
+];\r
+\r
+function renderCharMapHTML() {\r
+       var charsPerRow = 20, tdWidth=20, tdHeight=20;\r
+       var html = '<table border="0" cellspacing="1" cellpadding="0" width="' + (tdWidth*charsPerRow) + '"><tr height="' + tdHeight + '">';\r
+       var cols=-1;\r
+       for (var i=0; i<charmap.length; i++) {\r
+               if (charmap[i][2]==true) {\r
+                       cols++;\r
+                       html += ''\r
+                               + '<td width="' + tdWidth + '" height="' + tdHeight + '" class="charmap"'\r
+                               + ' onmouseover="tinyMCE.switchClass(this,\'charmapOver\');'\r
+                               + 'previewChar(\'' + charmap[i][1].substring(1,charmap[i][1].length) + '\',\'' + charmap[i][0].substring(1,charmap[i][0].length) + '\',\'' + charmap[i][3] + '\');"'\r
+                               + ' onmouseout="tinyMCE.restoreClass(this,\'charmapOver\');"'\r
+                               + ' nowrap="nowrap" onclick="insertChar(\'' + charmap[i][1].substring(2,charmap[i][1].length-1) + '\');"><a style="text-decoration: none;" onfocus="previewChar(\'' + charmap[i][1].substring(1,charmap[i][1].length) + '\',\'' + charmap[i][0].substring(1,charmap[i][0].length) + '\',\'' + charmap[i][3] + '\');" href="javascript:insertChar(\'' + charmap[i][1].substring(2,charmap[i][1].length-1) + '\');" onclick="return false;" onmousedown="return false;" title="' + charmap[i][3] + '">'\r
+                               + charmap[i][1]\r
+                               + '</a></td>';\r
+                       if ((cols+1) % charsPerRow == 0)\r
+                               html += '</tr><tr height="' + tdHeight + '">';\r
+               }\r
+        }\r
+       if (cols % charsPerRow > 0) {\r
+               var padd = charsPerRow - (cols % charsPerRow);\r
+               for (var i=0; i<padd-1; i++)\r
+                       html += '<td width="' + tdWidth + '" height="' + tdHeight + '" class="charmap">&nbsp;</td>';\r
+       }\r
+       html += '</tr></table>';\r
+       document.write(html);\r
+}\r
+\r
+function insertChar(chr) {\r
+       tinyMCEPopup.execCommand('mceInsertContent', false, '\&#' + chr + ';');\r
+\r
+       // Refocus in window\r
+       if (tinyMCEPopup.isWindow)\r
+               window.focus();\r
+}\r
+\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/jscripts/color_picker.js b/webcit/tiny_mce/themes/advanced/jscripts/color_picker.js
new file mode 100644 (file)
index 0000000..aab668e
--- /dev/null
@@ -0,0 +1,107 @@
+function init() {\r
+       if (tinyMCE.isMSIE)\r
+               tinyMCEPopup.resizeToInnerSize();\r
+}\r
+\r
+function selectColor() {\r
+       var color = document.getElementById("selectedColorBox").value;\r
+\r
+       tinyMCEPopup.execCommand(tinyMCE.getWindowArg('command'), false, color);\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function showColor(color) {\r
+       document.getElementById("selectedColor").style.backgroundColor = color;\r
+       document.getElementById("selectedColorBox").value = color;\r
+}\r
+\r
+var colors = new Array(\r
+       "#000000","#000033","#000066","#000099","#0000cc","#0000ff","#330000","#330033",\r
+       "#330066","#330099","#3300cc","#3300ff","#660000","#660033","#660066","#660099",\r
+       "#6600cc","#6600ff","#990000","#990033","#990066","#990099","#9900cc","#9900ff",\r
+       "#cc0000","#cc0033","#cc0066","#cc0099","#cc00cc","#cc00ff","#ff0000","#ff0033",\r
+       "#ff0066","#ff0099","#ff00cc","#ff00ff","#003300","#003333","#003366","#003399",\r
+       "#0033cc","#0033ff","#333300","#333333","#333366","#333399","#3333cc","#3333ff",\r
+       "#663300","#663333","#663366","#663399","#6633cc","#6633ff","#993300","#993333",\r
+       "#993366","#993399","#9933cc","#9933ff","#cc3300","#cc3333","#cc3366","#cc3399",\r
+       "#cc33cc","#cc33ff","#ff3300","#ff3333","#ff3366","#ff3399","#ff33cc","#ff33ff",\r
+       "#006600","#006633","#006666","#006699","#0066cc","#0066ff","#336600","#336633",\r
+       "#336666","#336699","#3366cc","#3366ff","#666600","#666633","#666666","#666699",\r
+       "#6666cc","#6666ff","#996600","#996633","#996666","#996699","#9966cc","#9966ff",\r
+       "#cc6600","#cc6633","#cc6666","#cc6699","#cc66cc","#cc66ff","#ff6600","#ff6633",\r
+       "#ff6666","#ff6699","#ff66cc","#ff66ff","#009900","#009933","#009966","#009999",\r
+       "#0099cc","#0099ff","#339900","#339933","#339966","#339999","#3399cc","#3399ff",\r
+       "#669900","#669933","#669966","#669999","#6699cc","#6699ff","#999900","#999933",\r
+       "#999966","#999999","#9999cc","#9999ff","#cc9900","#cc9933","#cc9966","#cc9999",\r
+       "#cc99cc","#cc99ff","#ff9900","#ff9933","#ff9966","#ff9999","#ff99cc","#ff99ff",\r
+       "#00cc00","#00cc33","#00cc66","#00cc99","#00cccc","#00ccff","#33cc00","#33cc33",\r
+       "#33cc66","#33cc99","#33cccc","#33ccff","#66cc00","#66cc33","#66cc66","#66cc99",\r
+       "#66cccc","#66ccff","#99cc00","#99cc33","#99cc66","#99cc99","#99cccc","#99ccff",\r
+       "#cccc00","#cccc33","#cccc66","#cccc99","#cccccc","#ccccff","#ffcc00","#ffcc33",\r
+       "#ffcc66","#ffcc99","#ffcccc","#ffccff","#00ff00","#00ff33","#00ff66","#00ff99",\r
+       "#00ffcc","#00ffff","#33ff00","#33ff33","#33ff66","#33ff99","#33ffcc","#33ffff",\r
+       "#66ff00","#66ff33","#66ff66","#66ff99","#66ffcc","#66ffff","#99ff00","#99ff33",\r
+       "#99ff66","#99ff99","#99ffcc","#99ffff","#ccff00","#ccff33","#ccff66","#ccff99",\r
+       "#ccffcc","#ccffff","#ffff00","#ffff33","#ffff66","#ffff99","#ffffcc","#ffffff"\r
+);\r
+\r
+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 renderColorMap() {\r
+       var html = "";\r
+       var inputColor = convertRGBToHex(tinyMCE.getWindowArg('input_color'));\r
+\r
+       html += '<table border="0" cellspacing="1" cellpadding="0">'\r
+               + '<tr>';\r
+       for (var i=0; i<colors.length; i++) {\r
+               html += '<td bgcolor="' + colors[i] + '">'\r
+                       + '<a href="javascript:selectColor();" onfocus="showColor(\'' + colors[i] +  '\');" onmouseover="showColor(\'' + colors[i] +  '\');">'\r
+                       + '<img border="0" src="images/spacer.gif" width="10" height="10" title="' + colors[i] +  '" alt="' + colors[i] +  '" /></a></td>';\r
+               if ((i+1) % 18 == 0)\r
+                       html += '</tr><tr>';\r
+       }\r
+       html += '<tr><td colspan="18">'\r
+               + '<table width="100%" border="0" cellspacing="0" cellpadding="0">'\r
+               + '<tr><td>'\r
+               + '<img id="selectedColor" style="background-color:' + tinyMCE.getWindowArg('input_color') + '" border="0" src="images/spacer.gif" width="80" height="16" />'\r
+               + '</td><td align="right">'\r
+               + '<input id="selectedColorBox" name="selectedColorBox" type="text" size="7" maxlength="7" style="width:65px" value="' + inputColor + '" />'\r
+               + '</td></tr>'\r
+               + '</table>'\r
+               + '<input type="button" id="insert" name="insert" value="{$lang_theme_colorpicker_apply}" style="margin-top:3px" onclick="selectColor();">'\r
+               + '</td></tr>'\r
+               + '</table>';\r
+\r
+       document.write(html);\r
+}
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/advanced/jscripts/image.js b/webcit/tiny_mce/themes/advanced/jscripts/image.js
new file mode 100644 (file)
index 0000000..18899f3
--- /dev/null
@@ -0,0 +1,81 @@
+var url = tinyMCE.getParam("external_image_list_url");\r
+if (url != null) {\r
+       // Fix relative\r
+       if (url.charAt(0) != '/' && url.indexOf('://') == -1)\r
+               url = tinyMCE.documentBasePath + "/" + url;\r
+\r
+       document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + url + '"></sc'+'ript>');\r
+}\r
+\r
+function insertImage() {\r
+       var src = document.forms[0].src.value;\r
+       var alt = document.forms[0].alt.value;\r
+       var border = document.forms[0].border.value;\r
+       var vspace = document.forms[0].vspace.value;\r
+       var hspace = document.forms[0].hspace.value;\r
+       var width = document.forms[0].width.value;\r
+       var height = document.forms[0].height.value;\r
+       var align = document.forms[0].align.options[document.forms[0].align.selectedIndex].value;\r
+\r
+       tinyMCEPopup.restoreSelection();\r
+       tinyMCE.insertImage(src, alt, border, hspace, vspace, width, height, align);\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       document.getElementById('srcbrowsercontainer').innerHTML = getBrowserHTML('srcbrowser','src','image','theme_advanced_image');\r
+\r
+       var formObj = document.forms[0];\r
+\r
+       for (var i=0; i<document.forms[0].align.options.length; i++) {\r
+               if (document.forms[0].align.options[i].value == tinyMCE.getWindowArg('align'))\r
+                       document.forms[0].align.options.selectedIndex = i;\r
+       }\r
+\r
+       formObj.src.value = tinyMCE.getWindowArg('src');\r
+       formObj.alt.value = tinyMCE.getWindowArg('alt');\r
+       formObj.border.value = tinyMCE.getWindowArg('border');\r
+       formObj.vspace.value = tinyMCE.getWindowArg('vspace');\r
+       formObj.hspace.value = tinyMCE.getWindowArg('hspace');\r
+       formObj.width.value = tinyMCE.getWindowArg('width');\r
+       formObj.height.value = tinyMCE.getWindowArg('height');\r
+       formObj.insert.value = tinyMCE.getLang('lang_' + tinyMCE.getWindowArg('action'), 'Insert', true); \r
+\r
+       // Handle file browser\r
+       if (isVisible('srcbrowser'))\r
+               document.getElementById('src').style.width = '180px';\r
+\r
+       // Auto select image in list\r
+       if (typeof(tinyMCEImageList) != "undefined" && tinyMCEImageList.length > 0) {\r
+               for (var i=0; i<formObj.image_list.length; i++) {\r
+                       if (formObj.image_list.options[i].value == tinyMCE.getWindowArg('src'))\r
+                               formObj.image_list.options[i].selected = true;\r
+               }\r
+       }\r
+}\r
+\r
+var preloadImg = new Image();\r
+\r
+function resetImageData() {\r
+       var formObj = document.forms[0];\r
+       formObj.width.value = formObj.height.value = "";        \r
+}\r
+\r
+function updateImageData() {\r
+       var formObj = document.forms[0];\r
+\r
+       if (formObj.width.value == "")\r
+               formObj.width.value = preloadImg.width;\r
+\r
+       if (formObj.height.value == "")\r
+               formObj.height.value = preloadImg.height;\r
+}\r
+\r
+function getImageData() {\r
+       preloadImg = new Image();\r
+       tinyMCE.addEvent(preloadImg, "load", updateImageData);\r
+       tinyMCE.addEvent(preloadImg, "error", function () {var formObj = document.forms[0];formObj.width.value = formObj.height.value = "";});\r
+       preloadImg.src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], document.forms[0].src.value);\r
+}\r
diff --git a/webcit/tiny_mce/themes/advanced/jscripts/link.js b/webcit/tiny_mce/themes/advanced/jscripts/link.js
new file mode 100644 (file)
index 0000000..62204ce
--- /dev/null
@@ -0,0 +1,69 @@
+var url = tinyMCE.getParam("external_link_list_url");\r
+if (url != null) {\r
+       // Fix relative\r
+       if (url.charAt(0) != '/' && url.indexOf('://') == -1)\r
+               url = tinyMCE.documentBasePath + "/" + url;\r
+\r
+       document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + url + '"></sc'+'ript>');\r
+}\r
+\r
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser','href','file','theme_advanced_link');\r
+\r
+       var formObj = document.forms[0];\r
+\r
+       for (var i=0; i<document.forms[0].target.options.length; i++) {\r
+               var option = document.forms[0].target.options[i];\r
+\r
+               if (option.value == tinyMCE.getWindowArg('target'))\r
+                       option.selected = true;\r
+       }\r
+\r
+       document.forms[0].href.value = tinyMCE.getWindowArg('href');\r
+       document.forms[0].linktitle.value = tinyMCE.getWindowArg('title');\r
+       document.forms[0].insert.value = tinyMCE.getLang('lang_' + tinyMCE.getWindowArg('action'), 'Insert', true); \r
+\r
+       addClassesToList('styleSelect', 'theme_advanced_link_styles');\r
+       selectByValue(formObj, 'styleSelect', tinyMCE.getWindowArg('className'), true);\r
+\r
+       // Hide css select row if no CSS classes\r
+       if (formObj.styleSelect && formObj.styleSelect.options.length <= 1) {\r
+               document.getElementById('styleSelectRow').style.display = 'none';\r
+               window.resizeBy(0, -20);\r
+       }\r
+\r
+       // Handle file browser\r
+       if (isVisible('hrefbrowser'))\r
+               document.getElementById('href').style.width = '180px';\r
+\r
+       // Auto select link in list\r
+       if (typeof(tinyMCELinkList) != "undefined" && tinyMCELinkList.length > 0) {\r
+               var formObj = document.forms[0];\r
+\r
+               for (var i=0; i<formObj.link_list.length; i++) {\r
+                       if (formObj.link_list.options[i].value == tinyMCE.getWindowArg('href'))\r
+                               formObj.link_list.options[i].selected = true;\r
+               }\r
+       }\r
+}\r
+\r
+function insertLink() {\r
+       var href = document.forms[0].href.value;\r
+       var target = document.forms[0].target.options[document.forms[0].target.selectedIndex].value;\r
+       var title = document.forms[0].linktitle.value;\r
+       var style_class = document.forms[0].styleSelect.value;\r
+       var dummy;\r
+\r
+       // Make anchors absolute\r
+       if (href.charAt(0) == '#')\r
+               href = tinyMCE.settings['document_base_url'] + href;\r
+\r
+       if (target == '_self')\r
+               target = '';\r
+\r
+       tinyMCEPopup.restoreSelection();\r
+       tinyMCE.insertLink(href, target, title, dummy, style_class);\r
+       tinyMCEPopup.close();\r
+}\r
diff --git a/webcit/tiny_mce/themes/advanced/jscripts/source_editor.js b/webcit/tiny_mce/themes/advanced/jscripts/source_editor.js
new file mode 100644 (file)
index 0000000..bfbee3f
--- /dev/null
@@ -0,0 +1,53 @@
+function saveContent() {\r
+       tinyMCE.setContent(document.getElementById('htmlSource').value);\r
+       tinyMCE.closeWindow(window);\r
+}\r
+\r
+// Fixes some charcode issues\r
+function fixContent(html) {\r
+       html = html.replace(new RegExp('<(p|hr|table|tr|td|ol|ul|object|embed|li|blockquote)', 'gi'),'\n<$1');\r
+       html = html.replace(new RegExp('<\/(p|ol|ul|li|table|tr|td|blockquote|object)>', 'gi'),'</$1>\n');\r
+       html = tinyMCE.regexpReplace(html, '<br />','<br />\n','gi');\r
+       html = tinyMCE.regexpReplace(html, '\n\n','\n','gi');\r
+       return html;\r
+}\r
+\r
+function onLoadInit() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       document.forms[0].htmlSource.value = fixContent(tinyMCE.getContent(tinyMCE.getWindowArg('editor_id')));\r
+       resizeInputs();\r
+       setWrap('off');\r
+}\r
+\r
+function setWrap(val) {\r
+       // hard soft off\r
+       document.forms[0].htmlSource.wrap = val;\r
+}\r
+\r
+function toggleWordWrap(elm) {\r
+       if (elm.checked)\r
+               setWrap('soft');\r
+       else\r
+               setWrap('off');\r
+}\r
+\r
+var wHeight=0, wWidth=0, owHeight=0, owWidth=0;\r
+\r
+function resizeInputs() {\r
+       if (!tinyMCE.isMSIE) {\r
+                wHeight = self.innerHeight-80;\r
+                wWidth = self.innerWidth-16;\r
+       } else {\r
+                wHeight = document.body.clientHeight - 80;\r
+                wWidth = document.body.clientWidth - 16;\r
+       }\r
+\r
+       document.forms[0].htmlSource.style.height = Math.abs(wHeight) + 'px';\r
+       document.forms[0].htmlSource.style.width  = Math.abs(wWidth) + 'px';\r
+}\r
+\r
+function renderWordWrap() {\r
+       if (tinyMCE.isMSIE)\r
+               document.write('<input type="checkbox" name="wraped" id="wraped" onclick="toggleWordWrap(this);" class="wordWrapCode" /><label for="wraped">{$lang_theme_code_wordwrap}</label>');\r
+}\r
diff --git a/webcit/tiny_mce/themes/advanced/langs/ar.js b/webcit/tiny_mce/themes/advanced/langs/ar.js
new file mode 100644 (file)
index 0000000..83c7062
--- /dev/null
@@ -0,0 +1,63 @@
+// Arabic lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+theme_style_select : '&#1578;&#1589;&#1575;&#1605;&#1610;&#1605;',\r
+theme_code_desc : '&#1588;&#1601;&#1585;&#1577; &#1575;&#1604;&#1605;&#1589;&#1583;&#1585;',\r
+theme_code_title : '&#1588;&#1601;&#1585;&#1577; &#1575;&#1604;&#1605;&#1589;&#1583;&#1585;',\r
+theme_code_wordwrap : 'Word wrap',\r
+theme_sub_desc : '&#1605;&#1606;&#1582;&#1601;&#1590;',\r
+theme_sup_desc : '&#1605;&#1585;&#1578;&#1601;&#1593;',\r
+theme_hr_desc : '&#1573;&#1583;&#1585;&#1575;&#1580; &#1582;&#1591; &#1601;&#1575;&#1589;&#1604;',\r
+theme_removeformat_desc : '&#1573;&#1586;&#1575;&#1604;&#1577; &#1575;&#1604;&#1578;&#1606;&#1587;&#1610;&#1602;&#1575;&#1578;',\r
+theme_custom1_desc : 'Your custom description here',\r
+insert_image_border : '&#1587;&#1605;&#1603; &#1575;&#1604;&#1581;&#1583;&#1608;&#1583;',\r
+insert_image_dimensions : '&#1575;&#1604;&#1605;&#1608;&#1575;&#1589;&#1601;&#1575;&#1578;',\r
+insert_image_vspace : '&#1578;&#1576;&#1575;&#1593;&#1583; &#1593;&#1605;&#1608;&#1583;&#1610;',\r
+insert_image_hspace : '&#1578;&#1576;&#1575;&#1593;&#1583; &#1571;&#1601;&#1602;&#1610;',\r
+insert_image_align : '&#1605;&#1581;&#1575;&#1584;&#1575;&#1577;',\r
+insert_image_align_default : 'Default',\r
+insert_image_align_baseline : '&#1593;&#1604;&#1609; &#1575;&#1604;&#1587;&#1591;&#1585;',\r
+insert_image_align_top : '&#1571;&#1593;&#1604;&#1609;',\r
+insert_image_align_middle : '&#1608;&#1587;&#1591;',\r
+insert_image_align_bottom : '&#1571;&#1587;&#1601;&#1604;',\r
+insert_image_align_texttop : '&#1571;&#1593;&#1604;&#1609; &#1575;&#1604;&#1606;&#1589;',\r
+insert_image_align_absmiddle : '&#1608;&#1587;&#1591; &#1575;&#1604;&#1587;&#1591;&#1585;',\r
+insert_image_align_absbottom : '&#1571;&#1587;&#1601;&#1604; &#1575;&#1604;&#1606;&#1589;',\r
+insert_image_align_left : '&#1610;&#1587;&#1575;&#1585;',\r
+insert_image_align_right : '&#1610;&#1605;&#1610;&#1606;',\r
+theme_font_size : '-- Font size --',\r
+theme_fontdefault : '-- Font family --',\r
+theme_block : '-- Format --',\r
+theme_paragraph : 'Paragraph',\r
+theme_div : 'Div',\r
+theme_address : 'Address',\r
+theme_pre : 'Preformatted',\r
+theme_h1 : 'Heading 1',\r
+theme_h2 : 'Heading 2',\r
+theme_h3 : 'Heading 3',\r
+theme_h4 : 'Heading 4',\r
+theme_h5 : 'Heading 5',\r
+theme_h6 : 'Heading 6',\r
+theme_colorpicker_title : '&#1604;&#1608;&#1606; &#1575;&#1604;&#1606;&#1589;',\r
+theme_colorpicker_apply : 'Apply',\r
+theme_forecolor_desc : '&#1604;&#1608;&#1606; &#1575;&#1604;&#1606;&#1589;',\r
+theme_backcolor_desc : 'Select background color',\r
+theme_charmap_title : '&#1573;&#1583;&#1585;&#1575;&#1580;  &#1585;&#1605;&#1586;..&#1616;',\r
+theme_charmap_desc : '&#1573;&#1583;&#1585;&#1575;&#1580;  &#1585;&#1605;&#1586;..&#1616;',\r
+theme_visualaid_desc : 'Toggle guidelines/invisible elements',\r
+insert_anchor_title : 'Insert/edit anchor',\r
+insert_anchor_name : 'Anchor name',\r
+theme_anchor_desc : 'Insert/edit anchor',\r
+theme_insert_link_titlefield : 'Title',\r
+theme_clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?',\r
+theme_path : 'Path',\r
+cut_desc : 'Cut',\r
+copy_desc : 'Copy',\r
+paste_desc : 'Paste',\r
+link_list : 'Link list',\r
+image_list : 'Image list',\r
+browse : 'Browse',\r
+image_props_desc : 'Image properties',\r
+newdocument_desc : 'New document',\r
+newdocument : 'Are you sure you want clear all contents?'\r
+});\r
diff --git a/webcit/tiny_mce/themes/advanced/langs/ca.js b/webcit/tiny_mce/themes/advanced/langs/ca.js
new file mode 100644 (file)
index 0000000..ebd5e15
--- /dev/null
@@ -0,0 +1,64 @@
+// CA lang variables by Marc Bria\r
+\r
+tinyMCE.addToLang('',{\r
+theme_style_select : 'Estils',\r
+theme_code_desc : 'Editar codi HTML',\r
+theme_code_title : 'Editor codi HTML',\r
+theme_code_wordwrap : 'Ajustar salt de línea',\r
+theme_sub_desc : 'Subíndex',\r
+theme_sup_desc : 'Superíndex',\r
+theme_hr_desc : 'Insertar un separador horitzontal',\r
+theme_removeformat_desc : 'Eliminar format',\r
+theme_custom1_desc : 'La teva descripció',\r
+insert_image_border : 'Marc',\r
+insert_image_dimensions : 'Dimensions',\r
+insert_image_vspace : 'Espai vertical',\r
+insert_image_hspace : 'Espai horizontal',\r
+insert_image_align : 'Alineament',\r
+insert_image_align_default : 'Per defecte',\r
+insert_image_align_baseline : 'Línea base',\r
+insert_image_align_top : 'Superior',\r
+insert_image_align_middle : 'Centre',\r
+insert_image_align_bottom : 'Inferior',\r
+insert_image_align_texttop : 'Alinear text amunt',\r
+insert_image_align_absmiddle : 'Centrat horitzontal',\r
+insert_image_align_absbottom : 'Centrat a baix',\r
+insert_image_align_left : 'Esquerra',\r
+insert_image_align_right : 'Dreta',\r
+insert_image_delta_height : 10,\r
+theme_font_size : '-- Mida font --',\r
+theme_fontdefault : '-- Font family --',\r
+theme_block : '-- Format --',\r
+theme_paragraph : 'Paragraph',\r
+theme_div : 'Div',\r
+theme_address : 'Address',\r
+theme_pre : 'Preformatejat',\r
+theme_h1 : 'Capçalera 1',\r
+theme_h2 : 'Capçalera 2',\r
+theme_h3 : 'Capçalera 3',\r
+theme_h4 : 'Capçalera 4',\r
+theme_h5 : 'Capçalera 5',\r
+theme_h6 : 'Capçalera 6',\r
+theme_colorpicker_title : 'Selecciona el color',\r
+theme_colorpicker_apply : 'Apply',\r
+theme_forecolor_desc : 'Selecciona color frontal',\r
+theme_backcolor_desc : 'Selecciona color de fons',\r
+theme_charmap_title : 'Selecciona un caràcter especial',\r
+theme_charmap_desc : 'Inserta un caràcter especial',\r
+theme_visualaid_desc : 'Alterna líniesguia/elements invisibles',\r
+insert_anchor_title : 'Inserta/edita àncora',\r
+insert_anchor_name : 'Nom de l´àncora',\r
+theme_anchor_desc : 'Inserta/edita un àncora',\r
+theme_insert_link_titlefield : 'Títlo',\r
+theme_clipboard_msg : 'Copiar/Tallar/Enganxar no és possible amb Mozilla i Firefox.\nVols més informació sobre aquest problema de seguretat?',\r
+theme_path : 'Camí',\r
+cut_desc : 'Retallar',\r
+copy_desc : 'Copiar',\r
+paste_desc : 'Enganxar',\r
+link_list : 'Llistat d´enllaços',\r
+image_list : 'Llistat d´imatges',\r
+browse : 'Explorar',\r
+image_props_desc : 'Image properties',\r
+newdocument_desc : 'New document',\r
+newdocument : 'Are you sure you want clear all contents?'\r
+});\r
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..f6a66a3
--- /dev/null
@@ -0,0 +1,70 @@
+/**\r
+ * Czech lang variables \r
+ * encoding: utf-8\r
+ *  \r
+ * $Id: cs.js,v 1.10 2005/10/18 13:55:39 spocke Exp $ \r
+ */  \r
+\r
+\r
+tinyMCE.addToLang('',{\r
+theme_style_select : 'Styly',\r
+theme_code_desc : 'Zobrazit HTML',\r
+theme_code_title : 'Editace HTML',\r
+theme_code_wordwrap : 'Bez dělení slov',\r
+theme_sub_desc : 'Dolní index',\r
+theme_sup_desc : 'Horní index',\r
+theme_hr_desc : 'Vložit vodorovný oddělovač',\r
+theme_removeformat_desc : 'Zrušit formátování',\r
+theme_custom1_desc : 'Libovolný popisek',\r
+insert_image_border : 'Rámeček',\r
+insert_image_dimensions : 'Rozměry',\r
+insert_image_vspace : 'Vertikální okraj',\r
+insert_image_hspace : 'Horizontální okraj',\r
+insert_image_align : 'Zarovnání',\r
+insert_image_align_default : 'Výchozí',\r
+insert_image_align_baseline : 'Na účaří',\r
+insert_image_align_top : 'Nahoru',\r
+insert_image_align_middle : 'Na střed',\r
+insert_image_align_bottom : 'Dolů',\r
+insert_image_align_texttop : 'Nejvyšší bod textu',\r
+insert_image_align_absmiddle : 'Střed řádku',\r
+insert_image_align_absbottom : 'Spodek řádku',\r
+insert_image_align_left : 'Vlevo',\r
+insert_image_align_right : 'Vpravo',\r
+theme_font_size : '-- Velikost textu --',\r
+theme_fontdefault : '-- Písmo --',\r
+theme_block : '-- Formát --',\r
+theme_paragraph : 'Odstavec',\r
+theme_div : 'Div',\r
+theme_address : 'Adresa',\r
+theme_pre : 'Předformát',\r
+theme_h1 : 'Nadpis 1',\r
+theme_h2 : 'Nadpis 2',\r
+theme_h3 : 'Nadpis 3',\r
+theme_h4 : 'Nadpis 4',\r
+theme_h5 : 'Nadpis 5',\r
+theme_h6 : 'Nadpis 6',\r
+theme_colorpicker_title : 'Výběr barvy',\r
+theme_colorpicker_apply : 'Vybrat',\r
+theme_forecolor_desc : 'Barva popředí',\r
+theme_backcolor_desc : 'Barva pozadí',\r
+theme_charmap_title : 'Výběr znaku',\r
+theme_charmap_desc : 'Vložit znak',\r
+theme_visualaid_desc : 'Zapnout značky/neviditelné prvky',\r
+insert_anchor_title : 'Vložení/editace záložky',\r
+insert_anchor_name : 'Název',\r
+theme_anchor_desc : 'Vložit/editovat záložku',\r
+theme_insert_link_titlefield : 'Název',\r
+theme_clipboard_msg : 'Funkce Kopírovat/vyjmout/vložit nejsou použitelné v Mozille a Firefoxu.\nChcete více informací o tomto problému?',\r
+theme_path : 'Cesta',\r
+cut_desc : 'Vyjmout',\r
+copy_desc : 'Kopírovat',\r
+paste_desc : 'Vložit',\r
+link_list : 'Seznam',\r
+image_list : 'Seznam',\r
+browse : 'Procházet',\r
+image_props_desc : 'Vlastnosti obrázku',\r
+newdocument_desc : 'Nový dokument',\r
+newdocument : 'Jste si opravdu jistý(á), že chcete vymazat veškerý obsah?'\r
+});\r
+\r
diff --git a/webcit/tiny_mce/themes/advanced/langs/cy.js b/webcit/tiny_mce/themes/advanced/langs/cy.js
new file mode 100644 (file)
index 0000000..43636a3
--- /dev/null
@@ -0,0 +1,76 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+theme_style_select : '-- Arddulliau --',\r
+theme_code_desc : 'Golygu c&ocirc;d HTML',\r
+theme_code_title : 'Golygydd C&ocirc;d HTML',\r
+theme_code_wordwrap : 'Amlapio geiriau',\r
+theme_sub_desc : 'Is-sgript',\r
+theme_sup_desc : 'Uwch-sgript',\r
+theme_hr_desc : 'Mewnosod llinell llorweddol',\r
+theme_removeformat_desc : 'Diddymu fformatio',\r
+theme_custom1_desc : 'Dy ddisgrifiad fan hyn',\r
+insert_image_border : 'Ymyl',\r
+insert_image_dimensions : 'Meintiau',\r
+insert_image_vspace : 'Gofod fertigol',\r
+insert_image_hspace : 'Gofod llorweddol',\r
+insert_image_align : 'Unioniad',\r
+insert_image_align_default : '-- Heb ddewis --',\r
+insert_image_align_baseline : 'Gwaelodlin',\r
+insert_image_align_top : 'Brig',\r
+insert_image_align_middle : 'Canol',\r
+insert_image_align_bottom : 'Gwaelod',\r
+insert_image_align_texttop : 'Brig Testun',\r
+insert_image_align_absmiddle : 'Canol Union',\r
+insert_image_align_absbottom : 'Gwaelod Union',\r
+insert_image_align_left : 'Chwith',\r
+insert_image_align_right : 'Dde',\r
+theme_font_size : '-- Maint ffont --',\r
+theme_fontdefault : '-- Teulu ffont --',\r
+theme_block : '-- Fformat --',\r
+theme_paragraph : 'Paragraff',\r
+theme_div : 'Div',\r
+theme_address : 'Cyfeiriad',\r
+theme_pre : 'Rhag-fformatiwyd',\r
+theme_h1 : 'Pennawd 1',\r
+theme_h2 : 'Pennawd 2',\r
+theme_h3 : 'Pennawd 3',\r
+theme_h4 : 'Pennawd 4',\r
+theme_h5 : 'Pennawd 5',\r
+theme_h6 : 'Pennawd 6',\r
+theme_colorpicker_title : 'Dewis lliw',\r
+theme_colorpicker_apply : 'Gosod',\r
+theme_forecolor_desc : 'Dewis lliw testun',\r
+theme_backcolor_desc : 'Dewis lliw cefndir',\r
+theme_charmap_title : 'Dewis llythyren arbennig',\r
+theme_charmap_desc : 'Gosod llythyren arbennig',\r
+theme_visualaid_desc : 'Gwrthdroi canllawiau/elfennau anweledig',\r
+insert_anchor_title : 'Mewnosod/golygu angor',\r
+insert_anchor_name : 'Enw angor',\r
+theme_anchor_desc : 'Mewnosod/golygu angor',\r
+theme_insert_link_titlefield : 'Teitl',\r
+theme_clipboard_msg : 'Dyw Cop&iuml;o/Torri/Gludo ddim ar gael ym Mozilla na Firefox.\nHoffet ti ragor o wybodaeth ynghylch hyn?',\r
+theme_path : 'Llwybr',\r
+cut_desc : 'Torri',\r
+copy_desc : 'Cop&iuml;o',\r
+paste_desc : 'Gludo',\r
+link_list : 'Rhestr dolenni',\r
+image_list : 'Rhestr delweddau',\r
+browse : 'Pori',\r
+image_props_desc : 'Priodoleddau delwedd',\r
+newdocument_desc : 'Dogfen newydd',\r
+class_name : 'Dosbarth',\r
+newdocument : 'Wyt ti\'n sicr eisiau clirio\'r holl gynnwys?',\r
+about_title : 'Yngl&#375;n &acirc; TinyMCE',\r
+about : 'Yngl&#375;n &acirc;',\r
+license : 'Trwydded',\r
+plugins : 'Ategynnau',\r
+plugin : 'Ategyn',\r
+author : 'Awdur',\r
+version : 'Fersiwn',\r
+loaded_plugins : 'Ategynnau gweithredol',\r
+help : 'Cymorth',\r
+not_set : '-- Heb ddewis --',\r
+close : 'Cau',\r
+toolbar_focus : 'Neidio i fotymau offer - Alt+Q, Neidio i\'r golygydd - Alt+Z, Neidio i lwybr y elfen - Alt+X'\r
+});\r
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..b4f8c9f
--- /dev/null
@@ -0,0 +1,75 @@
+// DK lang variables contributed by Jan Moelgaard\r
+\r
+tinyMCE.addToLang('',{\r
+theme_style_select : '-- Styles --',\r
+theme_code_desc : 'Rediger HTML kode',\r
+theme_code_title : 'HTML Kodeeditor',\r
+theme_code_wordwrap : 'Ombrydning',\r
+theme_sub_desc : 'S&#230;nket skrift',\r
+theme_sup_desc : 'H&#230;vet skrift',\r
+theme_hr_desc : 'Inds&#230;t horisontal linje',\r
+theme_removeformat_desc : 'Fjern formatering',\r
+theme_custom1_desc : 'Inds&#230;t din egen beskrivelse her',\r
+insert_image_border : 'Kant',\r
+insert_image_dimensions : 'Dimensioner',\r
+insert_image_vspace : 'Flyt til venstre',\r
+insert_image_hspace : 'Flyt til h&#248;jre',\r
+insert_image_align : 'Justering',\r
+insert_image_align_default : 'Standard',\r
+insert_image_align_baseline : 'Bundlinje',\r
+insert_image_align_top : 'Top',\r
+insert_image_align_middle : 'Midt i',\r
+insert_image_align_bottom : 'I bunden',\r
+insert_image_align_texttop : 'I toppen af teksten',\r
+insert_image_align_absmiddle : 'Absolut midte',\r
+insert_image_align_absbottom : 'Absolut bund',\r
+insert_image_align_left : 'Venstre',\r
+insert_image_align_right : 'H&#248;jre',\r
+theme_font_size : '-- Font st&#248;rrelse --',\r
+theme_fontdefault : '-- Font gruppe --',\r
+theme_block : '-- Typografi --',\r
+theme_paragraph : 'Afsnit',\r
+theme_div : 'Div',\r
+theme_address : 'Addresse',\r
+theme_pre : 'Pr&#230;formateret',\r
+theme_h1 : 'Overskrift 1',\r
+theme_h2 : 'Overskrift 2',\r
+theme_h3 : 'Overskrift 3',\r
+theme_h4 : 'Overskrift 4',\r
+theme_h5 : 'Overskrift 5',\r
+theme_h6 : 'Overskrift 6',\r
+theme_colorpicker_title : 'V&#230;lg en farve',\r
+theme_colorpicker_apply : 'Anvend',\r
+theme_forecolor_desc : 'V&#230;lg forgrundsfarve',\r
+theme_backcolor_desc : 'V&#230;lg baggrundsfarve',\r
+theme_charmap_title : 'V&#230;lg specialkarakter',\r
+theme_charmap_desc : 'Inds&#230;t specialkarakter',\r
+theme_visualaid_desc : 'Sl&#229; linjer/usynlige elementer til og fra',\r
+insert_anchor_title : 'Inds&#230;t/rediger bogm&#230;rke',\r
+insert_anchor_name : 'Bogm&#230;rkets navn',\r
+theme_anchor_desc : 'Inds&#230;t/rediger bogm&#230;rke',\r
+theme_insert_link_titlefield : 'Title',\r
+theme_clipboard_msg : 'Kopier/Klip/Inds&#230;t virker ikke i Mozilla og Firefox.\nVil du vide mere om dette?',\r
+theme_path : 'Sti',\r
+cut_desc : 'Klip',\r
+copy_desc : 'Kopier',\r
+paste_desc : 'Inds&#230;t',\r
+link_list : 'Linkliste',\r
+image_list : 'Billedliste',\r
+browse : 'Gennemse',\r
+image_props_desc : 'Billedegenskaber',\r
+newdocument_desc : 'Nyt dokument',\r
+class_name : 'Klasse',\r
+newdocument : 'Er du sikker p&#229;, at du vil slette alt?',\r
+about_title : 'Om TinyMCE',\r
+about : 'Om',\r
+license : 'Licens',\r
+plugins : 'Plugins',\r
+plugin : 'Plugin',\r
+author : 'Forfatter',\r
+version : 'Version',\r
+loaded_plugins : 'Indl&#230;ste plugins',\r
+help : 'Hj&#230;lp',\r
+not_set : '-- Ikke defineret --',\r
+close : 'Luk'\r
+});\r
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..b17ae13
--- /dev/null
@@ -0,0 +1,76 @@
+// DE lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+theme_style_select : '-- CSS-Stile --',\r
+theme_code_desc : 'HTML-Quelltext editieren',\r
+theme_code_title : 'HTML-Quelltexteditor',\r
+theme_code_wordwrap : 'Zeilenumbruch',\r
+theme_sub_desc : 'Tiefergestellt',\r
+theme_sup_desc : 'Hochgestellt',\r
+theme_hr_desc : 'Horizontalen Balken einf&uuml;gen',\r
+theme_removeformat_desc : 'Formatierung l&ouml;schen',\r
+theme_custom1_desc : 'Eigene Beschreibung',\r
+insert_image_border : 'Rahmen',\r
+insert_image_dimensions : 'Gr&ouml;&szlig;e',\r
+insert_image_vspace : 'Vertikaler Raum',\r
+insert_image_hspace : 'Horizontaler Raum',\r
+insert_image_align : 'Ausrichtung',\r
+insert_image_align_default : '-- Nicht festgelegt --',\r
+insert_image_align_baseline : 'Grundlinie',\r
+insert_image_align_top : 'Oben',\r
+insert_image_align_middle : 'Mitte',\r
+insert_image_align_bottom : 'Unten',\r
+insert_image_align_texttop : 'Mit dem Text',\r
+insert_image_align_absmiddle : 'Absolute mittig',\r
+insert_image_align_absbottom : 'Absolut unten',\r
+insert_image_align_left : 'Links',\r
+insert_image_align_right : 'Rechts',\r
+theme_font_size : '-- Schriftgr&ouml;&szlig;e --',\r
+theme_fontdefault : '-- Schriftfamilie --',\r
+theme_block : '-- Format --',\r
+theme_paragraph : 'Absatz',\r
+theme_div : 'Block',\r
+theme_address : 'Adresse',\r
+theme_pre : 'Vorformatiert',\r
+theme_h1 : '&Uuml;berschrift 1',\r
+theme_h2 : '&Uuml;berschrift 2',\r
+theme_h3 : '&Uuml;berschrift 3',\r
+theme_h4 : '&Uuml;berschrift 4',\r
+theme_h5 : '&Uuml;berschrift 5',\r
+theme_h6 : '&Uuml;berschrift 6',\r
+theme_colorpicker_title : 'Farbe ausw&auml;hlen',\r
+theme_colorpicker_apply : 'Farbe festlegen',\r
+theme_forecolor_desc : 'Schriftfarbe ausw&auml;hlen',\r
+theme_backcolor_desc : 'Hintergrundfarbe ausw&auml;hlen',\r
+theme_charmap_title : 'Sonderzeichen einf&uuml;gen',\r
+theme_charmap_desc : 'Sonderzeichen einf&uuml;gen',\r
+theme_visualaid_desc : 'Hilfslinen/Unsichtbare Elemente anzeigen',\r
+insert_anchor_title : 'Anker einf&uuml;gen/bearbeiten',\r
+insert_anchor_name : 'Ankername',\r
+theme_anchor_desc : 'Anker einf&uuml;gen/bearbeiten',\r
+theme_insert_link_titlefield : 'Titel',\r
+theme_clipboard_msg : 'Zwischenablagefunktionen sind in Mozilla und Firefox nicht verf&uuml;gbar.\nW&uuml;nschen Sie hierzu weitere Informationen?',\r
+theme_path : 'Pfad',\r
+cut_desc : 'Ausschneiden',\r
+copy_desc : 'Kopieren',\r
+paste_desc : 'Einf&uuml;gen',\r
+link_list : 'Hyperlink-Liste',\r
+image_list : 'Bild-Liste',\r
+browse : 'Durchsuchen',\r
+image_props_desc : 'Bildeigenschaften',\r
+newdocument_desc : 'Neues Dokument',\r
+class_name : 'CSS-Klasse',\r
+newdocument : 'Sind Sie sicher, dass Sie alle Inhalte l&ouml;schen wollen?',\r
+about_title : '&Uuml;ber TinyMCE',\r
+about : '&Uuml;ber',\r
+license : 'Lizenz',\r
+plugins : 'Plugins',\r
+plugin : 'Plugin',\r
+author : 'Autor',\r
+version : 'Version',\r
+loaded_plugins : 'Geladene Plugins',\r
+help : 'Hilfe',\r
+not_set : '-- Nicht festgelegt --',\r
+close : 'Schlie&szlig;en',\r
+toolbar_focus : 'Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X'\r
+});\r
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..7a02eec
--- /dev/null
@@ -0,0 +1,64 @@
+// Greek lang variables by Jacaranda Bill\r
+\r
+tinyMCE.addToLang('',{\r
+theme_style_select : 'ÈÝìáôá',\r
+theme_code_desc : '&Aring;ð&aring;î&aring;ñãáóßá HTML êþ&auml;éêá',\r
+theme_code_title : '&Aring;ð&aring;î&aring;ñãáóôÞò HTML',\r
+theme_code_wordwrap : 'Word wrap',\r
+theme_sub_desc : '&Auml;&aring;ßêôçò',\r
+theme_sup_desc : '&Aring;êèÝôçò',\r
+theme_hr_desc : '&Aring;éóáãùãÞ ïñéæüíôéáò ãñáììÞò',\r
+theme_removeformat_desc : 'Áðáëïé&ouml;Þ ìïñ&ouml;ïðïßçóçò',\r
+theme_custom1_desc : 'Ð&aring;ñéãñá&ouml;Þ',\r
+insert_image_border : 'Ð&aring;ñßãñáììá',\r
+insert_image_dimensions : '&Auml;éáóôÜó&aring;éò',\r
+insert_image_vspace : 'ÊÜè. ð&aring;ñéèþñéï',\r
+insert_image_hspace : 'Ïñéæ. ð&aring;ñéèþñéï',\r
+insert_image_align : 'Óôïß÷éóç',\r
+insert_image_align_default : 'ÐñïêáèïñéóìÝíç',\r
+insert_image_align_baseline : 'Ó&aring; &aring;õèõãñÜììéóç ì&aring; ôï ê&aring;ßì&aring;íï',\r
+insert_image_align_top : 'ÐÜíù',\r
+insert_image_align_middle : 'Óôï êÝíôñï',\r
+insert_image_align_bottom : 'ÊÜôù',\r
+insert_image_align_texttop : 'Ôï ê&aring;ßì&aring;íï ðÜíù',\r
+insert_image_align_absmiddle : 'Áðüëõôá óôï êÝíôñï',\r
+insert_image_align_absbottom : 'Áðüëõôá êÜôù',\r
+insert_image_align_left : 'Áñéóô&aring;ñÜ',\r
+insert_image_align_right : '&Auml;&aring;îéÜ',\r
+theme_font_size : '-- Font size --',\r
+theme_fontdefault : '-- Font family --',\r
+theme_block : '-- Format --',\r
+theme_paragraph : 'ÐáñÜãñá&ouml;ïò',\r
+theme_div : 'Div',\r
+theme_address : '&Auml;é&aring;ýèõíóç',\r
+theme_pre : 'Preformatted',\r
+theme_h1 : '&Aring;ðéê&aring;&ouml;áëß&auml;á 1',\r
+theme_h2 : '&Aring;ðéê&aring;&ouml;áëß&auml;á 2',\r
+theme_h3 : '&Aring;ðéê&aring;&ouml;áëß&auml;á 3',\r
+theme_h4 : '&Aring;ðéê&aring;&ouml;áëß&auml;á 4',\r
+theme_h5 : '&Aring;ðéê&aring;&ouml;áëß&auml;á 5',\r
+theme_h6 : '&Aring;ðéê&aring;&ouml;áëß&auml;á 6',\r
+theme_colorpicker_title : '×ñþìáôá',\r
+theme_colorpicker_apply : '&Aring;&ouml;áñìïãÞ',\r
+theme_forecolor_desc : '&Aring;ðéëïãÞ ÷ñþìáôïò ãñáììáôïó&aring;éñÜò',\r
+theme_backcolor_desc : 'Select background color',\r
+theme_charmap_title : '&Aring;ðéëïãÞ &aring;é&auml;éêïý ÷áñáêôÞñá',\r
+theme_charmap_desc : '&Aring;éóáãùãÞ &aring;é&auml;éêïý ÷áñáêôÞñá',\r
+theme_visualaid_desc : '&Aring;ì&ouml;Üíéóç/Áðüêñõøç ãñáììþí',\r
+insert_anchor_title : '&Aring;éóáãùãÞ/&Auml;éüñèùóç Üãêõñáò',\r
+insert_anchor_name : 'Ïíïìáóßá Üãêõñáò',\r
+theme_anchor_desc : '&Aring;éóáãùãÞ/&Auml;éüñèùóç Üãêõñáò',\r
+theme_insert_link_titlefield : 'Ôßôëïò',\r
+theme_clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?',\r
+theme_path : 'Path',\r
+cut_desc : 'Cut',\r
+copy_desc : 'Copy',\r
+paste_desc : 'Paste',\r
+link_list : 'Link list',\r
+image_list : 'Image list',\r
+browse : 'Browse',\r
+image_props_desc : 'Image properties',\r
+newdocument_desc : 'New document',\r
+class_name : 'ÊëÜóç', \r
+newdocument : 'Are you sure you want clear all contents?'\r
+});\r
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..ca72676
--- /dev/null
@@ -0,0 +1,76 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+theme_style_select : '-- Styles --',\r
+theme_code_desc : 'Edit HTML Source',\r
+theme_code_title : 'HTML Source Editor',\r
+theme_code_wordwrap : 'Word wrap',\r
+theme_sub_desc : 'Subscript',\r
+theme_sup_desc : 'Superscript',\r
+theme_hr_desc : 'Insert horizontal ruler',\r
+theme_removeformat_desc : 'Remove formatting',\r
+theme_custom1_desc : 'Your custom description here',\r
+insert_image_border : 'Border',\r
+insert_image_dimensions : 'Dimensions',\r
+insert_image_vspace : 'Vertical space',\r
+insert_image_hspace : 'Horizontal space',\r
+insert_image_align : 'Alignment',\r
+insert_image_align_default : '-- Not set --',\r
+insert_image_align_baseline : 'Baseline',\r
+insert_image_align_top : 'Top',\r
+insert_image_align_middle : 'Middle',\r
+insert_image_align_bottom : 'Bottom',\r
+insert_image_align_texttop : 'TextTop',\r
+insert_image_align_absmiddle : 'Absolute Middle',\r
+insert_image_align_absbottom : 'Absolute Bottom',\r
+insert_image_align_left : 'Left',\r
+insert_image_align_right : 'Right',\r
+theme_font_size : '-- Font size --',\r
+theme_fontdefault : '-- Font family --',\r
+theme_block : '-- Format --',\r
+theme_paragraph : 'Paragraph',\r
+theme_div : 'Div',\r
+theme_address : 'Address',\r
+theme_pre : 'Preformatted',\r
+theme_h1 : 'Heading 1',\r
+theme_h2 : 'Heading 2',\r
+theme_h3 : 'Heading 3',\r
+theme_h4 : 'Heading 4',\r
+theme_h5 : 'Heading 5',\r
+theme_h6 : 'Heading 6',\r
+theme_colorpicker_title : 'Select a color',\r
+theme_colorpicker_apply : 'Apply',\r
+theme_forecolor_desc : 'Select text color',\r
+theme_backcolor_desc : 'Select background color',\r
+theme_charmap_title : 'Select custom character',\r
+theme_charmap_desc : 'Insert custom character',\r
+theme_visualaid_desc : 'Toggle guidelines/invisible elements',\r
+insert_anchor_title : 'Insert/edit anchor',\r
+insert_anchor_name : 'Anchor name',\r
+theme_anchor_desc : 'Insert/edit anchor',\r
+theme_insert_link_titlefield : 'Title',\r
+theme_clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?',\r
+theme_path : 'Path',\r
+cut_desc : 'Cut',\r
+copy_desc : 'Copy',\r
+paste_desc : 'Paste',\r
+link_list : 'Link list',\r
+image_list : 'Image list',\r
+browse : 'Browse',\r
+image_props_desc : 'Image properties',\r
+newdocument_desc : 'New document',\r
+class_name : 'Class',\r
+newdocument : 'Are you sure you want clear all contents?',\r
+about_title : 'About TinyMCE',\r
+about : 'About',\r
+license : 'License',\r
+plugins : 'Plugins',\r
+plugin : 'Plugin',\r
+author : 'Author',\r
+version : 'Version',\r
+loaded_plugins : 'Loaded plugins',\r
+help : 'Help',\r
+not_set : '-- Not set --',\r
+close : 'Close',\r
+toolbar_focus : 'Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X'\r
+});\r
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..97dff89
--- /dev/null
@@ -0,0 +1,101 @@
+/**\r
+ * ES lang variables\r
+ * \r
+ * Authors : Alvaro Velasco,\r
+ *           Adolfo Sanz De Diego (asanzdiego) <asanzdiego@yahoo.es>,\r
+ *           Carlos C Soto (eclipxe) <csoto@sia-solutions.com>\r
+ * Last Updated : October 17, 2005\r
+ * TinyMCE Version : 2.0RC3\r
+ */\r
+\r
+tinyMCE.addToLang('',{\r
+theme_style_select : '-- Estilos --',\r
+theme_code_desc : 'Editar código HTML',\r
+theme_code_title : 'Editor código HTML',\r
+theme_code_wordwrap : 'Ajuste de línea',\r
+theme_sub_desc : 'Subíndice',\r
+theme_sup_desc : 'Superíndice',\r
+theme_hr_desc : 'Insertar una barra horizontal',\r
+theme_removeformat_desc : 'Quitar formato',\r
+theme_custom1_desc : 'Tu descripción aquí',\r
+insert_image_border : 'Borde',\r
+insert_image_dimensions : 'Dimensiones',\r
+insert_image_vspace : 'Espacio vertical',\r
+insert_image_hspace : 'Espacio horizontal',\r
+insert_image_align : 'Alineación',\r
+insert_image_align_default : '-- Por defecto --',\r
+insert_image_align_baseline : 'Linea base',\r
+insert_image_align_top : 'Arriba',\r
+insert_image_align_middle : 'Centrado',\r
+insert_image_align_bottom : 'Abajo',\r
+insert_image_align_texttop : 'Texto arriba',\r
+insert_image_align_absmiddle : 'Centrado total',\r
+insert_image_align_absbottom : 'Abajo total',\r
+insert_image_align_left : 'Izquierda',\r
+insert_image_align_right : 'Derecha',\r
+theme_font_size : '-- Tamaño del texto --',\r
+theme_fontdefault : '-- Tipo de fuente --',\r
+theme_block : '-- Formato del texto --',\r
+theme_paragraph : 'Párrafo',\r
+theme_div : 'Capa',\r
+theme_address : 'Dirección',\r
+theme_pre : 'Preformateado',\r
+theme_h1 : 'Título 1',\r
+theme_h2 : 'Título 2',\r
+theme_h3 : 'Título 3',\r
+theme_h4 : 'Título 4',\r
+theme_h5 : 'Título 5',\r
+theme_h6 : 'Título 6',\r
+theme_colorpicker_title : 'Selecciona un color',\r
+theme_colorpicker_apply : 'Aplicar',\r
+theme_forecolor_desc : 'Selecciona un color para el texto',\r
+theme_backcolor_desc : 'Selecciona un color de fondo',\r
+theme_charmap_title : 'Selecciona un carácter especial',\r
+theme_charmap_desc : 'Inserta un carácter especial',\r
+theme_charmap_all_title : 'Todos',\r
+theme_charmap_all_desc : 'Todos los caracteres',\r
+theme_charmap_alpha_title : 'Alfabéticos',\r
+theme_charmap_alpha_desc : 'Caracteres alfabéticos',\r
+theme_charmap_arrows_title : 'Flechas',\r
+theme_charmap_arrows_desc : 'Caracteres de flechas',\r
+theme_charmap_greek_title : 'Griegos',\r
+theme_charmap_greek_desc : 'Caracteres Griegos',\r
+theme_charmap_math_title : 'Mathemáticos',\r
+theme_charmap_math_desc : 'Caracteres mathemáticos',\r
+theme_charmap_misc_title : 'Misceláneos',\r
+theme_charmap_misc_desc : 'Caracteres misceláneos',\r
+theme_charmap_money_title : 'Monedas',\r
+theme_charmap_money_desc : 'Caracteres de monedas',\r
+theme_charmap_quotaion_title : 'Comillas',\r
+theme_charmap_quotaion_desc : 'Caracteres de comillas',\r
+theme_visualaid_desc : 'Cambiar las líneas de ayuda por elementos invisibles',\r
+insert_anchor_title : 'Insertar/editar ancla',\r
+insert_anchor_name : 'Nombre del ancla',\r
+theme_anchor_desc : 'Insertar/editar ancla',\r
+theme_insert_link_titlefield : 'Título',\r
+theme_clipboard_msg : 'No se pueden utilizar los comandos Copiar / Cortar / Pegar en Mozilla y en Firefox.\r\nUse el teclado Copiar (Ctrl+C) / Cortar (Ctrl+X) / Pegar (Ctrl+V)\r\n¿Quieres obtener más información?',\r
+theme_path : 'Ruta',\r
+cut_desc : 'Cortar (Ctrl+X)',\r
+copy_desc : 'Copiar (Ctrl+C)',\r
+paste_desc : 'Pegar (Ctrl+V)',\r
+link_list : 'Lista de enlaces',\r
+image_list : 'Lista de imágenes',\r
+browse : 'Navegar',\r
+image_props_desc : 'Propiedades de la imagen',\r
+newdocument_desc : 'Nuevo documento',\r
+class_name : 'Clase',\r
+newdocument : '¿Estás seguro de que quieres borrar todo el contenido?',\r
+about_title : 'Acerca de TinyMCE',\r
+about : 'Acerca',\r
+license : 'Licencia',\r
+plugins : 'Plugins',\r
+plugin : 'Plugin',\r
+author : 'Autor',\r
+version : 'Versión',\r
+loaded_plugins : 'Plugins cargados',\r
+help : 'Ayuda',\r
+not_set : '-- Por defecto --',\r
+close : 'Cerrar',\r
+toolbar_focus : 'Saltar a la barra de herramientas - Alt+Q, Saltar al editor - Alt+Z, Saltar al elemento de la ruta - Alt+X',\r
+theme_advanced_anchor_delta_width : 20\r
+});\r
diff --git a/webcit/tiny_mce/themes/advanced/langs/fa.js b/webcit/tiny_mce/themes/advanced/langs/fa.js
new file mode 100644 (file)
index 0000000..2e01f43
--- /dev/null
@@ -0,0 +1,65 @@
+// IR lang variables\r
+// Persian (Farsi) language pack (for IRAN)\r
+// By: Morteza Zafari\r
+// Lost@LostLord.com\r
+// http://www.LostLord.com\r
+\r
+tinyMCE.addToLang('',{\r
+dir : 'rtl',\r
+theme_style_select : '????',\r
+theme_code_desc : '?????? ????',\r
+theme_code_title : 'HTML ???????? ????',\r
+theme_code_wordwrap : '?? ???',\r
+theme_sub_desc : '??? ????',\r
+theme_sup_desc : '???? ????',\r
+theme_hr_desc : '??? ?? ????',\r
+theme_removeformat_desc : '??? ?? ??? ???? ????',\r
+theme_custom1_desc : 'Your custom description here',\r
+insert_image_border : '?????',\r
+insert_image_dimensions : '?????',\r
+insert_image_vspace : '????? ?????',\r
+insert_image_hspace : '????? ????',\r
+insert_image_align : '??? ????????',\r
+insert_image_align_default : '??? ???',\r
+insert_image_align_baseline : '?? ????',\r
+insert_image_align_top : '????',\r
+insert_image_align_middle : '???',\r
+insert_image_align_bottom : '?????',\r
+insert_image_align_texttop : '????? ???',\r
+insert_image_align_absmiddle : '??? ????',\r
+insert_image_align_absbottom : '????? ????',\r
+insert_image_align_left : '??',\r
+insert_image_align_right : '????',\r
+theme_font_size : '-- Font size --',\r
+theme_fontdefault : '-- Font family --',\r
+theme_block : '-- Format --',\r
+theme_paragraph : '????????',\r
+theme_div : 'Div',\r
+theme_address : '????',\r
+theme_pre : '?? ??? ????? ???',\r
+theme_h1 : '???? 1',\r
+theme_h2 : '???? 2',\r
+theme_h3 : '???? 3',\r
+theme_h4 : '???? 4',\r
+theme_h5 : '???? 5',\r
+theme_h6 : '???? 6',\r
+theme_colorpicker_title : '??? ?? ?????? ????',\r
+theme_colorpicker_apply : '?????',\r
+theme_forecolor_desc : '?????? ??? ???',\r
+theme_backcolor_desc : '?????? ??? ?????',\r
+theme_charmap_title : '?????? ??????? ????',\r
+theme_charmap_desc : '??? ??????? ????',\r
+theme_visualaid_desc : '????? ???? ???? ? ????? ??????',\r
+insert_anchor_title : '??? ? ?????? Anchor',\r
+insert_anchor_name : '??? Anchor',\r
+theme_anchor_desc : '??? ? ?????? Anchor',\r
+theme_insert_link_titlefield : '?????',\r
+theme_clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?',\r
+theme_path : '????',\r
+cut_desc : 'Cut',\r
+copy_desc : 'Copy',\r
+paste_desc : 'Paste',\r
+image_props_desc : 'Image properties',\r
+newdocument_desc : 'New document',\r
+newdocument : 'Are you sure you want clear all contents?'\r
+});\r
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..2eaa941
--- /dev/null
@@ -0,0 +1,77 @@
+// FI lang variables by Urho Konttori from Absolutions\r
+// Updated by Tuomo Aura from Ateco.fi\r
+\r
+tinyMCE.addToLang('',{\r
+theme_style_select : '-- Tyylit --',\r
+theme_code_desc : 'Muokkaa HTML-l&auml;hdekoodia',\r
+theme_code_title : 'HTML-L&auml;hdekoodin muokkaus',\r
+theme_code_wordwrap : 'Word wrap',\r
+theme_sub_desc : 'Alaindeksi',\r
+theme_sup_desc : 'Yl&auml;indeksi',\r
+theme_hr_desc : 'Lis&auml;&auml; vaakaviiva',\r
+theme_removeformat_desc : 'Poista muotoilu',\r
+theme_custom1_desc : 'Kirjoita oma selityksesi t&auml;h&auml;n',\r
+insert_image_border : 'Reuna',\r
+insert_image_dimensions : 'Mitat',\r
+insert_image_vspace : 'Pystyv&auml;li',\r
+insert_image_hspace : 'Vaakav&auml;li',\r
+insert_image_align : 'Asettelu',\r
+insert_image_align_default : 'Oletus',\r
+insert_image_align_baseline : 'Perustasoon',\r
+insert_image_align_top : 'Yl&auml;laitaan',\r
+insert_image_align_middle : 'Keskelle',\r
+insert_image_align_bottom : 'Alalaitaan',\r
+insert_image_align_texttop : 'Tekstin yl&auml;laitaan',\r
+insert_image_align_absmiddle : 'Absoluuttisen keskelle',\r
+insert_image_align_absbottom : 'Absoluuttisen alas',\r
+insert_image_align_left : 'Vasemmalle',\r
+insert_image_align_right : 'Oikealle',\r
+theme_font_size : '-- Fonttikoko --',\r
+theme_fontdefault : '-- Fontti --',\r
+theme_block : '-- Muotoilu --',\r
+theme_paragraph : 'Kappale',\r
+theme_div : 'Div',\r
+theme_address : 'Osoite',\r
+theme_pre : 'Etuk&auml;teen muotoiltu',\r
+theme_h1 : 'Otsikko 1',\r
+theme_h2 : 'Otsikko 2',\r
+theme_h3 : 'Otsikko 3',\r
+theme_h4 : 'Otsikko 4',\r
+theme_h5 : 'Otsikko 5',\r
+theme_h6 : 'Otsikko 6',\r
+theme_colorpicker_title : 'Valitse v&auml;ri',\r
+theme_colorpicker_apply : 'Aseta v&auml;ri',\r
+theme_forecolor_desc : 'Valitse fontin v&auml;ri',\r
+theme_backcolor_desc : 'Valitse taustav&auml;ri',\r
+theme_charmap_title : 'Valitse erikoismerkki',\r
+theme_charmap_desc : 'Lis&auml;&auml; oma erikoismerkki',\r
+theme_visualaid_desc : 'N&auml;yt&auml;/piilota apuviivat',\r
+insert_anchor_title : 'Lis&auml;&auml;/muokkaa ankkuria',\r
+insert_anchor_name : 'Ankkurin nimi',\r
+theme_anchor_desc : 'Lis&auml;&auml;/muokkaa ankkuria',\r
+theme_insert_link_titlefield : 'Title',\r
+theme_clipboard_msg : 'Leikkaus/Kopiointi/Liit&auml;minen ei onnistu Mozilla eik&auml; Firefox -selaimilla tietoturvasyist&auml;. \n Haluatko lis&auml;tietoa aiheesta?',\r
+theme_path : 'Polku',\r
+cut_desc : 'Leikkaa',\r
+copy_desc : 'Kopioi',\r
+paste_desc : 'Liit&auml;',\r
+link_list : 'Linkkilista',\r
+image_list : 'Kuvalista',\r
+browse : 'Selaa',\r
+image_props_desc : 'Kuvan ominaisuudet',\r
+newdocument_desc : 'Uusi dokumentti',\r
+class_name : 'Luokka',\r
+newdocument : 'Oletko varma, ett&auml; haluat poistaa kaiken sis&auml;ll&ouml;n?',\r
+about_title : 'TinyMCE:n tiedot',\r
+about : 'Tiedot',\r
+license : 'Lisenssi',\r
+plugins : 'Pluginit',\r
+plugin : 'Plugini',\r
+author : 'Tekij&auml;',\r
+version : 'Versio',\r
+loaded_plugins : 'Ladatut pluginit',\r
+help : 'Apua',\r
+not_set : '-- Ei asetettu --',\r
+close : 'Sulje',\r
+toolbar_focus : 'Hypp&auml;&auml; ty&ouml;kalupainikkeisiin - Alt+Q, Hypp&auml;&auml; editoriin - Alt-Z, Hypp&auml;&auml; polkuun - Alt-X'\r
+});\r
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..49ebb75
--- /dev/null
@@ -0,0 +1,78 @@
+// Canadian French lang variables by Virtuelcom\r
+// Modify by Laurent Dran 13-02-2006\r
+// Modifié par Normand Lamoureux le 2005-11-12\r
+\r
+tinyMCE.addToLang('',{\r
+theme_style_select : '-- Style --',\r
+theme_code_desc : 'Afficher le code source',\r
+theme_code_title : 'Édititon du code source',\r
+theme_code_wordwrap : 'Retour à la ligne automatique',\r
+theme_sub_desc : 'Indice',\r
+theme_sup_desc : 'Exposant',\r
+theme_hr_desc : 'Insérer une règle horizontale ordinaire',\r
+theme_removeformat_desc : 'Supprimer le formattage',\r
+theme_custom1_desc : 'Votre description personnalisée ici',\r
+insert_image_border : 'Bordure',\r
+insert_image_dimensions : 'Dimensions',\r
+insert_image_vspace : 'Espacement vertical',\r
+insert_image_hspace : 'Espacement horizontal',\r
+insert_image_align : 'Alignement',\r
+insert_image_align_default : '-- Indéfini --',\r
+insert_image_align_baseline : 'Ligne de base',\r
+insert_image_align_top : 'Haut',\r
+insert_image_align_middle : 'Milieu',\r
+insert_image_align_bottom : 'Bas',\r
+insert_image_align_texttop : 'Haut du texte',\r
+insert_image_align_absmiddle : 'Milieu absolu',\r
+insert_image_align_absbottom : 'Bas absolu',\r
+insert_image_align_left : 'En flottement à gauche',\r
+insert_image_align_right : 'En flottement à droite',\r
+theme_font_size : '-- Taille --',\r
+theme_fontdefault : '-- Police --',\r
+theme_block : '-- Bloc de texte --',\r
+theme_paragraph : 'Paragraphe',\r
+theme_div : 'Div',\r
+theme_address : 'Infos sur l\'auteur',\r
+theme_pre : 'Texte préformaté',\r
+theme_h1 : 'Titre de niveau 1',\r
+theme_h2 : 'Titre de niveau 2',\r
+theme_h3 : 'Titre de niveau 3',\r
+theme_h4 : 'Titre de niveau 4',\r
+theme_h5 : 'Titre de niveau 5',\r
+theme_h6 : 'Titre de niveau 6',\r
+theme_colorpicker_title : 'Choisir une couleur',\r
+theme_colorpicker_apply : 'Appliquer',\r
+theme_forecolor_desc : 'Couleur du texte',\r
+theme_backcolor_desc : 'Couleur d\'arrière-plan',\r
+theme_charmap_title : 'Sélectionner un charactère spécial',\r
+theme_charmap_desc : 'Insérer un charactère spécial',\r
+theme_visualaid_desc : 'Activer/Désactiver les lignes guides et les éléments invisibles',\r
+insert_anchor_title : 'Gestionnaire d\'ancre',\r
+insert_anchor_name : 'Nom de l\'ancre',\r
+theme_anchor_desc : 'Insérer/Modifier une ancre',\r
+theme_insert_link_titlefield : 'Info-bulle',\r
+theme_clipboard_msg : 'Pour des raisons de sécurité, les fonctions « Copier », « Couper » et « Coller »\nne sont pas disponibles dans Mozilla et Firefox.\n\n\nVoulez-vous plus d\'information à ce sujet?\n',\r
+theme_path : 'Élément(s) en cours ',\r
+cut_desc : 'Couper',\r
+copy_desc : 'Copier',\r
+paste_desc : 'Coller',\r
+link_list : 'Lien de la liste',\r
+image_list : 'Image de la liste',\r
+browse : 'Naviguer',\r
+image_props_desc : 'Propriétés de l\'image',\r
+newdocument_desc : 'Nouveau document',\r
+class_name : 'Classe CSS',\r
+newdocument : 'Êtes-vous sûr de vouloir supprimer tout le contenu ?',\r
+about_title : 'À propos de TinyMCE',\r
+about : 'À propos',\r
+license : 'License',\r
+plugins : 'Extensions',\r
+plugin : 'Extension',\r
+author : 'Auteur',\r
+version : 'Version',\r
+loaded_plugins : 'Extensions installées',\r
+help : 'Aide',\r
+not_set : '-- Indéfini --',\r
+close : 'Fermer',\r
+toolbar_focus : 'Atteindre la barre d\'outils (Alt+Q), Atteindre l\'éditeur (Alt-Z), Atteindre l\'élément en cours (Alt-X)'\r
+});\r
diff --git a/webcit/tiny_mce/themes/advanced/langs/fr_ca.js b/webcit/tiny_mce/themes/advanced/langs/fr_ca.js
new file mode 100644 (file)
index 0000000..2e15b58
--- /dev/null
@@ -0,0 +1,64 @@
+// Canadian French lang variables by Virtuelcom   last modification: 2005-06-15\r
+\r
+tinyMCE.addToLang('',{\r
+theme_style_select : '-- Styles --',\r
+theme_code_desc : 'Modifier le code source HTML',\r
+theme_code_title : 'Éditeur de code source HTML',\r
+theme_code_wordwrap : 'Word wrap',\r
+theme_sub_desc : 'Souscrit',\r
+theme_sup_desc : 'Indice supérieur',\r
+theme_hr_desc : 'Insérer un séparateur horizontal',\r
+theme_removeformat_desc : 'Supprimer le formattage',\r
+theme_custom1_desc : 'Votre description personnalisée ici',\r
+insert_image_border : 'Bordure',\r
+insert_image_dimensions : 'Dimensions',\r
+insert_image_vspace : 'VSpace',\r
+insert_image_hspace : 'HSpace',\r
+insert_image_align : 'Alignement',\r
+insert_image_align_default : 'Défaut',\r
+insert_image_align_baseline : 'Baseline',\r
+insert_image_align_top : 'Haut',\r
+insert_image_align_middle : 'Milieu',\r
+insert_image_align_bottom : 'Bas',\r
+insert_image_align_texttop : 'TextTop',\r
+insert_image_align_absmiddle : 'Milieu absolu',\r
+insert_image_align_absbottom : 'Bas absolu',\r
+insert_image_align_left : 'Gauche',\r
+insert_image_align_right : 'Droit',\r
+theme_font_size : 'Taille',\r
+theme_fontdefault : '-- Police --',\r
+theme_block : '-- Format --',\r
+theme_paragraph : 'Paragraphe',\r
+theme_div : 'Div',\r
+theme_address : 'Addresse',\r
+theme_pre : 'Préformatté',\r
+theme_h1 : 'Entête 1',\r
+theme_h2 : 'Entête 2',\r
+theme_h3 : 'Entête 3',\r
+theme_h4 : 'Entête 4',\r
+theme_h5 : 'Entête 5',\r
+theme_h6 : 'Entête 6',\r
+theme_colorpicker_title : 'Choisir une couleur',\r
+theme_colorpicker_apply : 'Appliquer',\r
+theme_forecolor_desc : 'Choisir la couleur d\'avant plan',\r
+theme_backcolor_desc : 'Choisir une couleur d\'arrière plan',\r
+theme_charmap_title : 'Sélectionner un charactère spécial',\r
+theme_charmap_desc : 'Insérer un charactère spécial',\r
+theme_visualaid_desc : 'Active/Désactive les lignes guides et les éléments invisibles',\r
+insert_anchor_title : 'Insérer/Modifier une ancre',\r
+insert_anchor_name : 'Nom de l\'ancre',\r
+theme_anchor_desc : 'Insérer / Modifier une ancre',\r
+theme_insert_link_titlefield : 'Titre',\r
+theme_clipboard_msg : 'Copier/Couper/Coller ne sont pas disponibles dans Mozilla et FireFox.\nDésirez-vous consulter de plus amples informations à ce sujet?',\r
+theme_path : 'Chemin',\r
+cut_desc : 'Couper',\r
+copy_desc : 'Copier',\r
+paste_desc : 'Coller',\r
+link_list : 'Liste de liens',\r
+image_list : 'Liste d\'images',\r
+browse : 'Sélectionner',\r
+image_props_desc : 'Propriétés de l\'image',\r
+newdocument_desc : 'Nouveau Document',\r
+class_name : 'Classe',\r
+newdocument : 'Are you sure you want clear all contents?'\r
+});\r
diff --git a/webcit/tiny_mce/themes/advanced/langs/he.js b/webcit/tiny_mce/themes/advanced/langs/he.js
new file mode 100644 (file)
index 0000000..87778f3
--- /dev/null
@@ -0,0 +1,76 @@
+// HE lang variables by Liron Newman, http://eesh.net\r
+\r
+tinyMCE.addToLang('',{\r
+theme_style_select : '-- ñéâðåðåú --',\r
+theme_code_desc : 'òøåê àú ÷åã ä-HTML',\r
+theme_code_title : 'òåøê ÷åã HTML',\r
+theme_code_wordwrap : 'âìéùú ùåøåú',\r
+theme_sub_desc : 'ëúá úçúé',\r
+theme_sup_desc : 'ëúá òéìé',\r
+theme_hr_desc : 'äëðñ ÷å àåô÷é',\r
+theme_removeformat_desc : 'äñø òéöåá',\r
+theme_custom1_desc : 'äúéàåø ùìê ëàï',\r
+insert_image_border : 'âáåì',\r
+insert_image_dimensions : 'îéîãéí',\r
+insert_image_vspace : 'çìì àðëé',\r
+insert_image_hspace : 'çìì àåô÷é',\r
+insert_image_align : 'ééùåø',\r
+insert_image_align_default : 'áøéøú îçãì',\r
+insert_image_align_baseline : 'ì÷å äáñéñ',\r
+insert_image_align_top : 'ìîòìä',\r
+insert_image_align_middle : 'ìàîöò',\r
+insert_image_align_bottom : 'ìîèä',\r
+insert_image_align_texttop : 'ìøàù äè÷ñè',\r
+insert_image_align_absmiddle : 'ìàîöò îåçìè',\r
+insert_image_align_absbottom : 'ì÷öä úçúåï îåçìè',\r
+insert_image_align_left : 'ìùîàì',\r
+insert_image_align_right : 'ìéîéï',\r
+theme_font_size : 'âåãì âåôï',\r
+theme_fontdefault : '-- îùôçú âåôðéí --',\r
+theme_block : '-- òéöåá --',\r
+theme_paragraph : 'ôñ÷ä',\r
+theme_div : '÷èò',\r
+theme_address : 'ëúåáú',\r
+theme_pre : 'îòåöá îøàù',\r
+theme_h1 : 'ëåúøú 1',\r
+theme_h2 : 'ëåúøú 2',\r
+theme_h3 : 'ëåúøú 3',\r
+theme_h4 : 'ëåúøú 4',\r
+theme_h5 : 'ëåúøú 5',\r
+theme_h6 : 'ëåúøú 6',\r
+theme_colorpicker_title : 'áçø öáò',\r
+theme_colorpicker_apply : 'äçì',\r
+theme_forecolor_desc : 'áçø öáò è÷ñè',\r
+theme_backcolor_desc : 'áçø öáò ø÷ò',\r
+theme_charmap_title : 'áçø úå îéåçã',\r
+theme_charmap_desc : 'äëðñ úå îéåçã',\r
+theme_visualaid_desc : 'äçìó îöá ÷ååéí îðçéí/øëéáéí áìúé-ðøàéí',\r
+insert_anchor_title : 'äëðñ/òøåê òåâï',\r
+insert_anchor_name : 'ùí äòåâï',\r
+theme_anchor_desc : 'äëðñ/òøåê òåâï',\r
+theme_insert_link_titlefield : 'ëåúøú',\r
+theme_clipboard_msg : 'ôòåìåú äòú÷ä/âæéøä/äãá÷ä àéðï ðúîëåú úçú Mozilla å-Firefox.\näàí áøöåðê ì÷áì îéãò ðåñó àåãåú ðåùà æä?',\r
+theme_path : 'ðúéá',\r
+cut_desc : 'âæåø',\r
+copy_desc : 'äòú÷',\r
+paste_desc : 'äãá÷',\r
+link_list : 'øùéîú ÷éùåøéí',\r
+image_list : 'øùéîú úîåðåú',\r
+browse : 'ñééø',\r
+image_props_desc : 'îàôééðé úîåðä',\r
+newdocument_desc : 'îñîê çãù',\r
+class_name : 'îçì÷ä',\r
+newdocument : 'äàí àúä áèåç ùáøöåðê ìð÷åú àú ëì äúåëï?',\r
+about_title : 'àåãåú TinyMCE',\r
+about : 'àåãåú',\r
+license : 'øéùéåï',\r
+plugins : 'úåñôéí',\r
+plugin : 'úåñó',\r
+author : 'îçáø',\r
+version : 'âøñä',\r
+loaded_plugins : 'úåñôéí ôòéìéí',\r
+help : 'òæøä',\r
+not_set : '-- ìà îåâãø --',\r
+close : 'ñâéøä',\r
+toolbar_focus : 'òáåø àì ëôúåøé äëìéí - Alt+Q, òáåø àì äòåøê - Alt-Z, òáåø àì ðúéá òéöåá - Alt-X'\r
+});\r
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..49535b0
--- /dev/null
@@ -0,0 +1,75 @@
+// HU lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+theme_style_select : '-- Stílusok --',\r
+theme_code_desc : 'HTML forrás szerkesztése',\r
+theme_code_title : 'HTML forrás szerkesztõ',\r
+theme_code_wordwrap : 'Sortördelés',\r
+theme_sub_desc : 'Alsóindex',\r
+theme_sup_desc : 'Felsõindex',\r
+theme_hr_desc : 'Vizszíntes vonal beszúrása',\r
+theme_removeformat_desc : 'Formázás eltávolítása',\r
+theme_custom1_desc : 'Az egyéni leírásod jön ide',\r
+insert_image_border : 'Keret',\r
+insert_image_dimensions : 'Kiterjedés',\r
+insert_image_vspace : 'Függõleges terület',\r
+insert_image_hspace : 'Vizszintes terület',\r
+insert_image_align : 'Elhelyezkedés',\r
+insert_image_align_default : '-- Nincs beállítva --',\r
+insert_image_align_baseline : 'Baseline',\r
+insert_image_align_top : 'Felül',\r
+insert_image_align_middle : 'Középen',\r
+insert_image_align_bottom : 'Alul',\r
+insert_image_align_texttop : 'Szövegfelett',\r
+insert_image_align_absmiddle : 'Abszolút közép',\r
+insert_image_align_absbottom : 'Abszolút alatt',\r
+insert_image_align_left : 'Balra',\r
+insert_image_align_right : 'Jobbra',\r
+theme_font_size : '-- Betûméret --',\r
+theme_fontdefault : '-- Betûcsalád --',\r
+theme_block : '-- Formátum --',\r
+theme_paragraph : 'Bekezdés',\r
+theme_div : 'Div',\r
+theme_address : 'Cím',\r
+theme_pre : 'Elõreformázott',\r
+theme_h1 : 'Fejléc 1',\r
+theme_h2 : 'Fejléc 2',\r
+theme_h3 : 'Fejléc 3',\r
+theme_h4 : 'Fejléc 4',\r
+theme_h5 : 'Fejléc 5',\r
+theme_h6 : 'Fejléc 6',\r
+theme_colorpicker_title : 'Színválasztás',\r
+theme_colorpicker_apply : 'Alkalmaz',\r
+theme_forecolor_desc : 'Szövegszín választás',\r
+theme_backcolor_desc : 'Háttérszín választás',\r
+theme_charmap_title : 'Egyéni karakter választás',\r
+theme_charmap_desc : 'Egyéni karakter beszúrás',\r
+theme_visualaid_desc : 'Sorjelölõk/láthatatlan elemek kapcsolása',\r
+insert_anchor_title : 'Horgony nbeillesztése/szerkesztése',\r
+insert_anchor_name : 'Horgony név',\r
+theme_anchor_desc : 'Horgony nbeillesztése/szerkesztése',\r
+theme_insert_link_titlefield : 'Cím',\r
+theme_clipboard_msg : 'A Másolás/Kivágás/Beillesztés nem elérhetõ Mozillában and Firefox-ban.\nSzeretnél több információt errõl a problémáról?',\r
+theme_path : 'Útvonal',\r
+cut_desc : 'Kivágás',\r
+copy_desc : 'Másolás',\r
+paste_desc : 'Beillesztés',\r
+link_list : 'Link lista',\r
+image_list : 'Kép lista',\r
+browse : 'Tallózás',\r
+image_props_desc : 'Kép tulajdonságai',\r
+newdocument_desc : 'Új dokumentum',\r
+class_name : 'Osztály',\r
+newdocument : 'Biztos hogy törölni akarod az összes tartalmat?',\r
+about_title : 'TinyMCE névjegye',\r
+about : 'Névjegy',\r
+license : 'Licensz',\r
+plugins : 'Bõvítmények',\r
+plugin : 'Bõvítmény',\r
+author : 'Szerzõ',\r
+version : 'Verzió',\r
+loaded_plugins : 'Betöltött bõvítmények',\r
+help : 'Súgó',\r
+not_set : '-- Nincs beállítva --',\r
+close : 'Bezárás'\r
+});\r
diff --git a/webcit/tiny_mce/themes/advanced/langs/is.js b/webcit/tiny_mce/themes/advanced/langs/is.js
new file mode 100644 (file)
index 0000000..dc92c62
--- /dev/null
@@ -0,0 +1,76 @@
+// Iceland lang variables by Johannes Birgir Jensson\r
+\r
+tinyMCE.addToLang('',{\r
+theme_style_select : '-- St&iacute;lar --',\r
+theme_code_desc : 'Breyta HTML k&oacute;&eth;a',\r
+theme_code_title : 'HTML k&oacute;&eth;aritill',\r
+theme_code_wordwrap : 'Word wrap',\r
+theme_sub_desc : 'L&aacute;gskrift',\r
+theme_sup_desc : 'H&aacute;skrift',\r
+theme_hr_desc : 'Setja inn stiku',\r
+theme_removeformat_desc : 'Fjarl&aelig;gja textasni&eth;',\r
+theme_custom1_desc : 'Þ&iacute;n l&yacute;sing h&eacute;r',\r
+insert_image_border : 'Rammi',\r
+insert_image_dimensions : 'V&iacute;ddir',\r
+insert_image_vspace : 'Bil fyrir ofan og ne&eth;an',\r
+insert_image_hspace : 'Bil til vinstri og h&aelig;gri',\r
+insert_image_align : 'J&ouml;fnun',\r
+insert_image_align_default : '-- Ekki valin --',\r
+insert_image_align_baseline : 'Sama l&iacute;na',\r
+insert_image_align_top : 'Uppi',\r
+insert_image_align_middle : 'Mi&eth;ja',\r
+insert_image_align_bottom : 'Ni&eth;ri',\r
+insert_image_align_texttop : 'Texti efst',\r
+insert_image_align_absmiddle : 'Alveg &iacute; mi&eth;ju',\r
+insert_image_align_absbottom : 'Alveg ne&eth;st',\r
+insert_image_align_left : 'Vinstri',\r
+insert_image_align_right : 'H&aelig;gri',\r
+theme_font_size : '-- Textast&aelig;r&eth; --',\r
+theme_fontdefault : '-- Leturger&eth; --',\r
+theme_block : '-- Textasni&eth; --',\r
+theme_paragraph : 'M&aacute;lsgrein',\r
+theme_div : 'Div',\r
+theme_address : 'Heimilisfang',\r
+theme_pre : 'Ritv&eacute;l',\r
+theme_h1 : 'Haus 1',\r
+theme_h2 : 'Haus 2',\r
+theme_h3 : 'Haus 3',\r
+theme_h4 : 'Haus 4',\r
+theme_h5 : 'Haus 5',\r
+theme_h6 : 'Haus 6',\r
+theme_colorpicker_title : 'Veldu lit',\r
+theme_colorpicker_apply : 'Sta&eth;festa',\r
+theme_forecolor_desc : 'Veldu textalit',\r
+theme_backcolor_desc : 'Veldu bakgrunnslit',\r
+theme_charmap_title : 'Veldu s&eacute;rstaf',\r
+theme_charmap_desc : 'Setja s&eacute;rstaf inn',\r
+theme_visualaid_desc : 'S&yacute;na/fela t&ouml;flur, akkeri og fleira',\r
+insert_anchor_title : 'Setja inn/breyta akkeri',\r
+insert_anchor_name : 'Heiti akkeris',\r
+theme_anchor_desc : 'Setja inn/breyta akkeri',\r
+theme_insert_link_titlefield : 'Titill',\r
+theme_clipboard_msg : 'Afrita/klippa/l&iacute;ma er ekki virkt &iacute; Mozilla og Firefox.\nViltu f&aacute; uppl&yacute;singar um hvernig &thorn;&uacute; getur kveikt &aacute; &thorn;eim?',\r
+theme_path : 'Sl&oacute;&eth;',\r
+cut_desc : 'Klippa',\r
+copy_desc : 'Afrita',\r
+paste_desc : 'Skeyta',\r
+link_list : 'Tenglalisti',\r
+image_list : 'Myndalisti',\r
+browse : 'Vafra',\r
+image_props_desc : 'Stillingar myndar',\r
+newdocument_desc : 'N&yacute;tt skjal',\r
+class_name : 'Class',\r
+newdocument : 'Ertu viss um a&eth; &thorn;&uacute; viljir hreinsa allt burtu?',\r
+about_title : 'Um TinyMCE',\r
+about : 'Um',\r
+license : 'Leyfi',\r
+plugins : 'Vi&eth;b&aelig;tur',\r
+plugin : 'Vi&eth;b&oacute;t',\r
+author : 'H&ouml;fundur',\r
+version : '&Uacute;tg&aacute;fa',\r
+loaded_plugins : 'Virkar vi&eth;b&aelig;tur',\r
+help : 'Hj&aacute;lp',\r
+not_set : '-- Ekki vali&eth; --',\r
+close : 'Loka',\r
+toolbar_focus : 'Fl&yacute;tilykill fyrir takka - Alt+Q, Fl&yacute;tilykill fyrir ritil - Alt-Z, Fl&yacute;tilykill fyrir sl&oacute;&eth; - Alt-X'\r
+});\r
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..6ec4370
--- /dev/null
@@ -0,0 +1,64 @@
+// Variabili di lingua IT - fabrix.xm@lombardiacom.it\r
+\r
+tinyMCE.addToLang('',{\r
+theme_style_select : 'Stili',\r
+theme_code_desc : 'Edita il sorgente HTML',\r
+theme_code_title : 'Editor Sorgente HTML',\r
+theme_code_wordwrap : 'Word wrap',\r
+theme_sub_desc : 'Pedice',\r
+theme_sup_desc : 'Apice',\r
+theme_hr_desc : 'Inserisci linea orizzontale',\r
+theme_removeformat_desc : 'Rimuovi formattazione',\r
+theme_custom1_desc : 'Scrivi qui la tua descrizione personalizzata',\r
+insert_image_border : 'Bordo',\r
+insert_image_dimensions : 'Dimensioni',\r
+insert_image_vspace : 'Spazio verticale',\r
+insert_image_hspace : 'Spazio orizzontale',\r
+insert_image_align : 'Allineamento',\r
+insert_image_align_default : 'Default',\r
+insert_image_align_baseline : 'Baseline',\r
+insert_image_align_top : 'Superiore',\r
+insert_image_align_middle : 'Centrale',\r
+insert_image_align_bottom : 'Inferiore',\r
+insert_image_align_texttop : 'TextTop',\r
+insert_image_align_absmiddle : 'Centro assoluto',\r
+insert_image_align_absbottom : 'Inferiore assoluto',\r
+insert_image_align_left : 'Sinistra',\r
+insert_image_align_right : 'Destra',\r
+theme_font_size : '-- Font size --',\r
+theme_fontdefault : '-- Font family --',\r
+theme_block : '-- Format --',\r
+theme_paragraph : 'Paragrafo',\r
+theme_div : 'Div',\r
+theme_address : 'Indirizzo',\r
+theme_pre : 'Preformattato',\r
+theme_h1 : 'Intestazione 1',\r
+theme_h2 : 'Intestazione 2',\r
+theme_h3 : 'Intestazione 3',\r
+theme_h4 : 'Intestazione 4',\r
+theme_h5 : 'Intestazione 5',\r
+theme_h6 : 'Intestazione 6',\r
+theme_colorpicker_title : 'Seleziona un colore',\r
+theme_colorpicker_apply : 'Applica',\r
+theme_forecolor_desc : 'Seleziona il colore',\r
+theme_backcolor_desc : 'Seleziona il colore di sfondo',\r
+theme_charmap_title : 'Seleziona un carattere custom',\r
+theme_charmap_desc : 'Inserisci un carattere custom',\r
+theme_visualaid_desc : 'Mostra/nascondi linee guida e elementi invisibili',\r
+insert_anchor_title : 'Inserisci/modifica &agrave;ncora',\r
+insert_anchor_name : 'Nome &agrave;ncora',\r
+theme_anchor_desc : 'Inserisci/modifica &agrave;ncora',\r
+theme_insert_link_titlefield : 'Titolo',\r
+theme_clipboard_msg : 'Copia, Taglia e Incolla non sono disponibili in Mozilla e Firefox.\nVuoi maggiori dettegli su questo problema?',\r
+theme_path : 'Percorso',\r
+cut_desc : 'Taglia',\r
+copy_desc : 'Copia',\r
+paste_desc : 'Incolla',\r
+link_list : 'Lista link',\r
+image_list : 'Lista immagini',\r
+browse : 'Sfoglia',\r
+image_props_desc : 'Proprietà dell\'immagine',\r
+newdocument_desc : 'Nuovo documento',\r
+class_name : 'Classe', \r
+newdocument : 'Sicuro di voler cancellare l\'intero contenuto?'\r
+});\r
diff --git a/webcit/tiny_mce/themes/advanced/langs/ja.js b/webcit/tiny_mce/themes/advanced/langs/ja.js
new file mode 100644 (file)
index 0000000..08d0abf
--- /dev/null
@@ -0,0 +1,62 @@
+// JP lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+theme_style_select : '\e$B%9%?%$%k\e(B',\r
+theme_paragraph : '\e$BJ8L.\e(B',\r
+theme_address : '\e$B%"%I%l%9\e(B',\r
+theme_pre : '\e$B@07A:Q$_\e(B',\r
+theme_h1 : 'H1',\r
+theme_h2 : 'H2',\r
+theme_h3 : 'H3',\r
+theme_h4 : 'H4',\r
+theme_h5 : 'H5',\r
+theme_h6 : 'H6',\r
+theme_div : 'Div',\r
+insert_anchor_title : '\e$B%"%s%+!<$NA^F~\e(B/\e$BJT=8\e(B',\r
+insert_anchor_name : '\e$B%"%s%+!<$NL>A0\e(B',\r
+theme_anchor_desc : '\e$B%"%s%+!<$NA^F~\e(B/\e$BJT=8\e(B',\r
+theme_code_desc : 'HTML\e$B$ND>@\JT=8\e(B',\r
+theme_code_title : 'HTML\e$B$NJT=8\e(B',\r
+theme_code_wordwrap : 'Word wrap',\r
+theme_hr_desc : '\e$B?eJ?@~\e(B',\r
+theme_removeformat_desc : '\e$B@07A>pJs:o=|\e(B',\r
+theme_visualaid_desc : '\e$BJd=u>pJs$N;k3P2=\e(B(\e$B%H%0%k\e(B)',\r
+theme_sub_desc : '\e$BE:;z2<\e(B',\r
+theme_sup_desc : '\e$BE:;z>e\e(B',\r
+theme_charmap_desc : '\e$BFC<lJ8;z$NF~NO\e(B',\r
+theme_charmap_title : '\e$BFC<lJ8;z$rA*Br$7$F2<$5$$\e(B',\r
+insert_image_dimensions : '\e$BBg$-$5;XDj\e(B',\r
+insert_image_border : '\e$B6-3&I}\e(B',\r
+insert_image_vspace : '\e$B=DM>Gr\e(B',\r
+insert_image_hspace : '\e$B2#M>Gr\e(B',\r
+insert_image_align : '\e$B0LCV9g$o$;\e(B',\r
+insert_image_align_default : '\e$B0EL[\e(B',\r
+insert_image_align_baseline : '\e$B4p=`@~\e(B',\r
+insert_image_align_top : '\e$B>e\e(B',\r
+insert_image_align_middle : '\e$BCf\e(B',\r
+insert_image_align_bottom : '\e$B2<\e(B',\r
+insert_image_align_texttop : '\e$BJ8;z$N>e\e(B',\r
+insert_image_align_absmiddle : '\e$B@dBP$KCf\e(B',\r
+insert_image_align_absbottom : '\e$B@dBP$K2<\e(B',\r
+insert_image_align_left : '\e$B:8\e(B',\r
+insert_image_align_right : '\e$B1&\e(B',\r
+theme_font_size : '-- Font size --',\r
+theme_fontdefault : '-- Font family --',\r
+theme_block : '-- Format --',\r
+theme_colorpicker_title : '\e$B?\'$N;XDj\e(B',\r
+theme_colorpicker_apply : '\e$BE,MQ\e(B',\r
+theme_forecolor_desc : '\e$BA07J?\'\e(B',\r
+theme_backcolor_desc : 'Select background color',\r
+theme_clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?',\r
+theme_path : 'Path',\r
+cut_desc : 'Cut',\r
+copy_desc : 'Copy',\r
+paste_desc : 'Paste',\r
+link_list : 'Link list',\r
+image_list : 'Image list',\r
+browse : 'Browse',\r
+image_props_desc : 'Image properties',\r
+newdocument_desc : 'New document',\r
+class_name : '\e$B%/%i%9\e(B',\r
+newdocument : 'Are you sure you want clear all contents?'\r
+});\r
diff --git a/webcit/tiny_mce/themes/advanced/langs/ko.js b/webcit/tiny_mce/themes/advanced/langs/ko.js
new file mode 100644 (file)
index 0000000..cff48a8
--- /dev/null
@@ -0,0 +1,65 @@
+// KO lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+theme_style_select : '½º&Aring;¸ÀÏ',\r
+theme_code_desc : 'HTML ¼Ò½º °í&Auml;¡±â',\r
+theme_code_title : 'HTML ¼Ò½º ÆíÁý±â',\r
+theme_code_wordwrap : 'Word wrap',\r
+theme_code_save : 'ÀúÀ&aring;',\r
+theme_sub_desc : '¾Æ·¡Ã·ÀÚ',\r
+theme_sup_desc : 'À§Ã·ÀÚ',\r
+theme_hr_desc : '°¡·ÎÁÙ ³&Ouml;±â',\r
+theme_removeformat_desc : '¼Ó¼º Á&ouml;¿ì±â',\r
+theme_custom1_desc : 'Your custom description here',\r
+insert_image_border : '&Aring;׵θ®',\r
+insert_image_dimensions : '&Aring;©±â',\r
+insert_image_vspace : '¼¼·Î ¿©¹é',\r
+insert_image_hspace : '°¡·Î ¿©¹é',\r
+insert_image_align : 'Á¤·&Auml;',\r
+insert_image_align_default : '±âº»°ª',\r
+insert_image_align_baseline : 'Baseline',\r
+insert_image_align_top : 'Top',\r
+insert_image_align_middle : 'Middle',\r
+insert_image_align_bottom : 'Bottom',\r
+insert_image_align_texttop : 'TextTop',\r
+insert_image_align_absmiddle : 'Absolute Middle',\r
+insert_image_align_absbottom : 'Absolute Bottom',\r
+insert_image_align_left : 'Left',\r
+insert_image_align_right : 'Right',\r
+theme_font_size : '-- Font size --',\r
+theme_fontdefault : '-- Font family --',\r
+theme_block : '-- Format --',\r
+theme_paragraph : '´Ü¶ô',\r
+theme_div : 'Div',\r
+theme_address : 'Á&Ouml;¼Ò',\r
+theme_pre : '¼­½&Auml; À&Ouml;À½',\r
+theme_h1 : 'Á¦¸ñ 1',\r
+theme_h2 : 'Á¦¸ñ 2',\r
+theme_h3 : 'Á¦¸ñ 3',\r
+theme_h4 : 'Á¦¸ñ 4',\r
+theme_h5 : 'Á¦¸ñ 5',\r
+theme_h6 : 'Á¦¸ñ 6',\r
+theme_colorpicker_title : '»&ouml;»ó ¼±&Aring;Ã',\r
+theme_colorpicker_apply : 'Àû¿ë',\r
+theme_forecolor_desc : '±ÛÀÚ »&ouml;»ó',\r
+theme_backcolor_desc : 'Select background color',\r
+theme_charmap_title : 'Select custom character',\r
+theme_charmap_desc : 'Insert custom character',\r
+theme_visualaid_desc : 'Toggle guidelines/invisible elements',\r
+insert_anchor_title : '¾Þ&Auml;¿ ³&Ouml;±â/°í&Auml;¡±â',\r
+insert_anchor_name : '¾Þ&Auml;¿ À̸§',\r
+theme_anchor_desc : '¾Þ&Auml;¿ ³&Ouml;±â/°í&Auml;¡±â',\r
+theme_insert_link_titlefield : 'Á¦¸ñ',\r
+theme_clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?',\r
+theme_path : 'Path',\r
+cut_desc : 'Cut',\r
+copy_desc : 'Copy',\r
+paste_desc : 'Paste',\r
+link_list : 'Link list',\r
+image_list : 'Image list',\r
+browse : 'Browse',\r
+image_props_desc : 'Image properties',\r
+newdocument_desc : 'New document',\r
+class_name : '&Aring;¬·¡½º',\r
+newdocument : 'Are you sure you want clear all contents?'\r
+});\r
diff --git a/webcit/tiny_mce/themes/advanced/langs/nb.js b/webcit/tiny_mce/themes/advanced/langs/nb.js
new file mode 100644 (file)
index 0000000..9dd4311
--- /dev/null
@@ -0,0 +1,77 @@
+// nb = Norwegian (bokm&aring;l) lang variables by Knut B. Jacobsen\r
+\r
+tinyMCE.addToLang('',{\r
+theme_style_select : 'Stiler',\r
+theme_code_desc : 'Redigere HTML Koden',\r
+theme_code_title : 'HTML Kildekode Redigering',\r
+theme_code_wordwrap : 'Ord deling',\r
+theme_sub_desc : 'Nedsenket skrift',\r
+theme_sup_desc : 'Opph&oslash;yd skrift',\r
+theme_hr_desc : 'Sett inn horisontal linje',\r
+theme_removeformat_desc : 'Fjern formatering',\r
+theme_custom1_desc : 'Din spesialfunksjons beskrivelse her',\r
+insert_image_border : 'Ramme',\r
+insert_image_dimensions : 'Dimensjoner',\r
+insert_image_vspace : 'Vertikalt tomrom',\r
+insert_image_hspace : 'Horisontalt tomrom',\r
+insert_image_align : 'Justering',\r
+insert_image_align_default : 'Intet',\r
+insert_image_align_baseline : 'Bunnlinjen',\r
+insert_image_align_top : 'Lengst opp',\r
+insert_image_align_middle : 'Midten',\r
+insert_image_align_bottom : 'Lengst ned',\r
+insert_image_align_texttop : 'Tekstens topp',\r
+insert_image_align_absmiddle : 'Absolutt midten',\r
+insert_image_align_absbottom : 'Absolutt lengst ned',\r
+insert_image_align_left : 'Venstre',\r
+insert_image_align_right : 'H&oslash;yre',\r
+insert_image_delta_width : 30,\r
+insert_image_delta_height : 10,\r
+theme_font_size : '-- Font st&oslash;rrelse --',\r
+theme_fontdefault : '-- Font familie --',\r
+theme_block : '-- Format --',\r
+theme_paragraph : 'Paragraf',\r
+theme_div : 'Div',\r
+theme_address : 'Adresse',\r
+theme_pre : 'Pre-formattert',\r
+theme_h1 : 'Overskrift 1',\r
+theme_h2 : 'Overskrift 2',\r
+theme_h3 : 'Overskrift 3',\r
+theme_h4 : 'Overskrift 4',\r
+theme_h5 : 'Overskrift 5',\r
+theme_h6 : 'Overskrift 6',\r
+theme_colorpicker_title : 'Velg en farge',\r
+theme_colorpicker_apply : 'Bruk',\r
+theme_forecolor_desc : 'Velg forgrunnsfarge',\r
+theme_backcolor_desc : 'Velg bakgrunnsfarge',\r
+theme_charmap_title : 'Velg spesialtegn',\r
+theme_charmap_desc : 'Sett inn spesialtegn',\r
+theme_visualaid_desc : 'Sl&aring; av/p&aring; usynlige elementer',\r
+insert_anchor_title : 'Opprette/endre anker',\r
+insert_anchor_name : 'Ankernavn',\r
+theme_anchor_desc : 'Opprette/endre anker',\r
+theme_insert_link_titlefield : 'Tittel',\r
+theme_clipboard_msg : 'Kopier/Klipp ut/Lim inn er ikke tilgjengelig i Mozilla/Firefox.\nVil du ha mere informasjon om dette?',\r
+theme_path : 'S&oslash;kevei',\r
+cut_desc : 'Klipp ut',\r
+copy_desc : 'Kopier',\r
+paste_desc : 'Lim inn',\r
+link_list : 'Lenke liste',\r
+image_list : 'Bilde liste',\r
+browse : 'Bla gjennom',\r
+image_props_desc : 'Bilde egenskaper',\r
+newdocument_desc : 'Nytt dokument',\r
+class_name : 'Stil',\r
+newdocument : 'Er du sikker p&aring; at du vil t&oslash;mme hele redigeringsomr&aring;det?',\r
+about_title : 'Om TinyMCE',\r
+about : 'Om',\r
+license : 'Lisens',\r
+plugins : 'Innstikksprogrammer',\r
+plugin : 'Innstikksprogram',\r
+author : 'Utviklere',\r
+version : 'Versjon',\r
+loaded_plugins : 'Lastet innstikksprogram',\r
+help : 'Hjelp',\r
+not_set : '-- Ikke satt --',\r
+close : 'Stopp'\r
+});\r
diff --git a/webcit/tiny_mce/themes/advanced/langs/nl.js b/webcit/tiny_mce/themes/advanced/langs/nl.js
new file mode 100644 (file)
index 0000000..bad5922
--- /dev/null
@@ -0,0 +1,76 @@
+// NL lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+theme_style_select : '-- Stijlen --',\r
+theme_code_desc : 'HTML bron bewerken',\r
+theme_code_title : 'HTML code-editor',\r
+theme_code_wordwrap : 'Terugloop',\r
+theme_sub_desc : 'Subscript',\r
+theme_sup_desc : 'Superscript',\r
+theme_hr_desc : 'Horizontale lijn invoegen',\r
+theme_removeformat_desc : 'Opmaak verwijderen',\r
+theme_custom1_desc : 'Tik hier een omschrijving',\r
+insert_image_border : 'Rand',\r
+insert_image_dimensions : 'Afmetingen',\r
+insert_image_vspace : 'Verticale marge',\r
+insert_image_hspace : 'Horizontale marge',\r
+insert_image_align : 'Uitlijning',\r
+insert_image_align_default : '-- geen --',\r
+insert_image_align_baseline : 'Basislijn',\r
+insert_image_align_top : 'Boven',\r
+insert_image_align_middle : 'Midden',\r
+insert_image_align_bottom : 'Onder',\r
+insert_image_align_texttop : 'Bovenkant tekst',\r
+insert_image_align_absmiddle : 'Absoluut midden',\r
+insert_image_align_absbottom : 'Absoluut onder',\r
+insert_image_align_left : 'Links',\r
+insert_image_align_right : 'Rechts',\r
+theme_font_size : '-- Lettergrootte --',\r
+theme_fontdefault : '-- Lettertype --',\r
+theme_block : '-- Paragraaf --',\r
+theme_paragraph : 'Paragraaf',\r
+theme_div : 'Blok',\r
+theme_address : 'Adres',\r
+theme_pre : 'Opgemaakt',\r
+theme_h1 : 'Kop 1',\r
+theme_h2 : 'Kop 2',\r
+theme_h3 : 'Kop 3',\r
+theme_h4 : 'Kop 4',\r
+theme_h5 : 'Kop 5',\r
+theme_h6 : 'Kop 6',\r
+theme_colorpicker_title : 'Selecteer een kleur',\r
+theme_colorpicker_apply : 'Toepassen',\r
+theme_forecolor_desc : 'Een tekstkleur selecteren',\r
+theme_backcolor_desc : 'Een achtergrondkleur selecteren',\r
+theme_charmap_title : 'Speciale tekens invoegen',\r
+theme_charmap_desc : 'Speciale tekens invoegen',\r
+theme_visualaid_desc : 'Onzichtbare elementen en hulplijnen aan/uit',\r
+insert_anchor_title : 'Bladwijzer invoegen/bewerken',\r
+insert_anchor_name : 'Bladwijzer naam',\r
+theme_anchor_desc : 'Bladwijzer invoegen/bewerken',\r
+theme_insert_link_titlefield : 'titel',\r
+theme_clipboard_msg : 'Kopi&euml;ren/Knippen/Plakken is uit veiligheidsoverwegingen niet direct beschikbaar in Mozilla en Firefox.\nWilt u meer informatie over deze kwestie?',\r
+theme_path : 'Pad',\r
+cut_desc : 'Knippen',\r
+copy_desc : 'Kopiëren',\r
+paste_desc : 'Plakken',\r
+link_list : 'Hyperlinklijst',\r
+image_list : 'Afbeeldinglijst',\r
+browse : 'Bladeren',\r
+image_props_desc : 'Eigenschappen van afbeelding',\r
+newdocument_desc : 'Nieuw document',\r
+class_name : 'Stijl',\r
+newdocument : 'Weet u zeker dat u de hele inhoud wilt wissen?',\r
+about_title : 'Over TinyMCE',\r
+about : 'Over',\r
+license : 'Licentie',\r
+plugins : 'Plugins',\r
+plugin : 'Plugin',\r
+author : 'Author',\r
+version : 'Versie',\r
+loaded_plugins : 'Ingeladen plugins',\r
+help : 'Help',\r
+not_set : '-- geen --',\r
+close : 'Sluiten',\r
+toolbar_focus : 'Ga naar werkbalk knoppen - Alt+Q, Ga naar editor - Alt-Z, Ga naar pad - Alt-X'\r
+});\r
diff --git a/webcit/tiny_mce/themes/advanced/langs/nn.js b/webcit/tiny_mce/themes/advanced/langs/nn.js
new file mode 100644 (file)
index 0000000..720982f
--- /dev/null
@@ -0,0 +1,77 @@
+// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen\r
+\r
+tinyMCE.addToLang('',{\r
+theme_style_select : 'Stiler',\r
+theme_code_desc : 'Redigere HTML Koden',\r
+theme_code_title : 'HTML Kildekode Redigering',\r
+theme_code_wordwrap : 'Ord deling',\r
+theme_sub_desc : 'Nedsenket skrift',\r
+theme_sup_desc : 'Opph&oslash;gd skrift',\r
+theme_hr_desc : 'Sett inn horisontal linje',\r
+theme_removeformat_desc : 'Fjern formatering',\r
+theme_custom1_desc : 'Din spesialfunksjons beskrivelse her',\r
+insert_image_border : 'Ramme',\r
+insert_image_dimensions : 'Dimensjoner',\r
+insert_image_vspace : 'Vertikalt tomrom',\r
+insert_image_hspace : 'Horisontalt tomrom',\r
+insert_image_align : 'Justering',\r
+insert_image_align_default : 'Intet',\r
+insert_image_align_baseline : 'Bunnlinjen',\r
+insert_image_align_top : 'Lengst opp',\r
+insert_image_align_middle : 'Midten',\r
+insert_image_align_bottom : 'Lengst ned',\r
+insert_image_align_texttop : 'Tekstens topp',\r
+insert_image_align_absmiddle : 'Absolutt midten',\r
+insert_image_align_absbottom : 'Absolutt lengst ned',\r
+insert_image_align_left : 'Venstre',\r
+insert_image_align_right : 'H&oslash;gre',\r
+insert_image_delta_width : 30,\r
+insert_image_delta_height : 10,\r
+theme_font_size : '-- Font st&oslash;rrelse --',\r
+theme_fontdefault : '-- Font familie --',\r
+theme_block : '-- Format --',\r
+theme_paragraph : 'Paragraf',\r
+theme_div : 'Div',\r
+theme_address : 'Adresse',\r
+theme_pre : 'Pre-formattert',\r
+theme_h1 : 'Overskrift 1',\r
+theme_h2 : 'Overskrift 2',\r
+theme_h3 : 'Overskrift 3',\r
+theme_h4 : 'Overskrift 4',\r
+theme_h5 : 'Overskrift 5',\r
+theme_h6 : 'Overskrift 6',\r
+theme_colorpicker_title : 'Velg en farge',\r
+theme_colorpicker_apply : 'Bruk',\r
+theme_forecolor_desc : 'Velg forgrunnsfarge',\r
+theme_backcolor_desc : 'Velg bakgrunnsfarge',\r
+theme_charmap_title : 'Velg spesialtegn',\r
+theme_charmap_desc : 'Sett inn spesialtegn',\r
+theme_visualaid_desc : 'Sl&aring; av/p&aring; usynlige elementer',\r
+insert_anchor_title : 'Opprette/endre anker',\r
+insert_anchor_name : 'Ankernavn',\r
+theme_anchor_desc : 'Opprette/endre anker',\r
+theme_insert_link_titlefield : 'Tittel',\r
+theme_clipboard_msg : 'Kopier/Klipp ut/Lim inn er ikke tilgjengelig i Mozilla/Firefox.\nVil du ha mere informasjon om dette?',\r
+theme_path : 'S&oslash;kevei',\r
+cut_desc : 'Klipp ut',\r
+copy_desc : 'Kopier',\r
+paste_desc : 'Lim inn',\r
+link_list : 'Lenke liste',\r
+image_list : 'Bilde liste',\r
+browse : 'Bla gjennom',\r
+image_props_desc : 'Bilde egenskaper',\r
+newdocument_desc : 'Nytt dokument',\r
+class_name : 'Stil',\r
+newdocument : 'Er du sikker p&aring; at du vil t&oslash;mme hele redigeringsomr&aring;det?',\r
+about_title : 'Om TinyMCE',\r
+about : 'Om',\r
+license : 'Lisens',\r
+plugins : 'Innstikksprogrammer',\r
+plugin : 'Innstikksprogram',\r
+author : 'Utviklere',\r
+version : 'Versjon',\r
+loaded_plugins : 'Lastet innstikksprogram',\r
+help : 'Hjelp',\r
+not_set : '-- Ikkje satt --',\r
+close : 'Stopp'\r
+});\r
diff --git a/webcit/tiny_mce/themes/advanced/langs/pl.js b/webcit/tiny_mce/themes/advanced/langs/pl.js
new file mode 100644 (file)
index 0000000..3abfee6
--- /dev/null
@@ -0,0 +1,79 @@
+// PL lang variables\r
+// fixed by Wooya\r
+// http://www.mfusion.prv.pl\r
+// fixed by lemiel 14.11.2005\r
+\r
+tinyMCE.addToLang('',{\r
+theme_style_select : 'Styl',\r
+theme_code_desc : 'Edytuj zródd³o html',\r
+theme_code_title : 'Edytor zród³a html',\r
+theme_code_wordwrap : 'Zawijanie wierszy',\r
+theme_sub_desc : 'Nadpisywanie',\r
+theme_sup_desc : 'Podpisywanie',\r
+theme_hr_desc : 'Wstaw poziom± liniê',\r
+theme_removeformat_desc : 'Usuñ formatowanie',\r
+theme_custom1_desc : 'Wstaw w³asny opis',\r
+insert_image_border : 'Ramka',\r
+insert_image_dimensions : 'Wymiary',\r
+insert_image_vspace : 'Pionowy odstêp',\r
+insert_image_hspace : 'Poziomy odstêp',\r
+insert_image_align : 'Otaczanie',\r
+insert_image_align_default : 'Domy¶lne',\r
+insert_image_align_baseline : 'Do linii bazowej',\r
+insert_image_align_top : 'Górne',\r
+insert_image_align_middle : '¦rodkowe',\r
+insert_image_align_bottom : 'Dolne',\r
+insert_image_align_texttop : 'Tekst powy¿ej',\r
+insert_image_align_absmiddle : 'Absolutny ¶rodek',\r
+insert_image_align_absbottom : 'Absolutny dó³',\r
+insert_image_align_left : 'Lewe',\r
+insert_image_align_right : 'Prawe',\r
+theme_font_size : '-- Rozmiar czcionki --',\r
+theme_fontdefault : '-- Rodzina czcionki --',\r
+theme_block : '-- Format --',\r
+theme_paragraph : '-- Paragraf --',\r
+theme_div : 'Div',\r
+theme_address : 'Adres',\r
+theme_pre : 'Preformatowanie',\r
+theme_h1 : 'Nag³ówek 1',\r
+theme_h2 : 'Nag³ówek 2',\r
+theme_h3 : 'Nag³ówek 3',\r
+theme_h4 : 'Nag³ówek 4',\r
+theme_h5 : 'Nag³ówek 5',\r
+theme_h6 : 'Nag³ówek 6',\r
+theme_colorpicker_title : 'Wybierz kolor',\r
+theme_colorpicker_apply : 'Wybierz',\r
+theme_forecolor_desc : 'Wybierz kolor tekstu',\r
+theme_backcolor_desc : 'Wybierz kolor t³a',\r
+theme_charmap_title : 'Wybierz znak',\r
+theme_charmap_desc : 'Wstaw znak',\r
+theme_visualaid_desc : 'Prze³±cz linie prowadz±ce/niewidoczne elementy',\r
+insert_anchor_title : 'Kotwica',\r
+insert_anchor_name : 'Nazwa kotwicy',\r
+theme_anchor_desc : 'Wstaw/Edytuj kotwicê',\r
+theme_insert_link_titlefield : 'Tytu³',\r
+theme_clipboard_msg : 'Kopiuj/Edytuj/Wklej nie jest dostêpne w przegl±darkach Mozilla i Firefox.\nPotrzebujesz wiêcej informacji na ten temat?',\r
+theme_path : '\8ccie¿ka',\r
+cut_desc : 'Wytnij',\r
+copy_desc : 'Kopiuj',\r
+paste_desc : 'Wklej',\r
+link_list : 'Lista linków',\r
+image_list : 'Lista obrazków',\r
+browse : 'Przegl±daj',\r
+image_props_desc : 'W³a¶ciwosci obrazka',\r
+newdocument_desc : 'Nowy dokument',\r
+class_name : 'Klasa',\r
+newdocument : 'Czy jeste¶ pewien, ¿e chcesz wyczy¶ciæ zawarto¶æ tego dokumentu?',\r
+about_title : 'O TinyMCE ...',\r
+about : 'O ...',\r
+license : 'Licencja',\r
+plugins : 'Pluginy',\r
+plugin : 'Plugin',\r
+author : 'Autor',\r
+version : 'Wersja',\r
+loaded_plugins : 'Za³adowane pluginy',\r
+help : 'Pomoc',\r
+not_set : '-- Nie wybrano --',\r
+close : 'Zamknij',\r
+toolbar_focus : 'Skocz do przycisków narzêdzi - Alt+Q, Skocz do edytora - Alt-Z, Skocz do ¶cie¿ki elementu - Alt-X'\r
+});\r
diff --git a/webcit/tiny_mce/themes/advanced/langs/pt.js b/webcit/tiny_mce/themes/advanced/langs/pt.js
new file mode 100644 (file)
index 0000000..3980d6c
--- /dev/null
@@ -0,0 +1,65 @@
+// PT lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+theme_style_select : 'Estilos CSS',\r
+theme_code_desc : 'Editar Fonte HTML',\r
+theme_code_title : 'Editor de fonte HTML',\r
+theme_code_save : 'Guardar',\r
+theme_code_wordwrap : 'Translinear palavras',\r
+theme_sub_desc : 'Subscrito',\r
+theme_sup_desc : 'Superscrito',\r
+theme_hr_desc : 'Inserir linha horizontal',\r
+theme_removeformat_desc : 'Remover formatação',\r
+theme_custom1_desc : 'Descrição customizada aqui',\r
+insert_image_border : 'Borda',\r
+insert_image_dimensions : 'Dimensões',\r
+insert_image_vspace : 'Espaçamento Vert.',\r
+insert_image_hspace : 'Espaçamento Horiz.',\r
+insert_image_align : 'Alinhamento',\r
+insert_image_align_default : 'Por omissão',\r
+insert_image_align_baseline : 'Linha de base',\r
+insert_image_align_top : 'Topo',\r
+insert_image_align_middle : 'Centrado',\r
+insert_image_align_bottom : 'Fundo',\r
+insert_image_align_texttop : 'Topo do Texto',\r
+insert_image_align_absmiddle : 'Centrado absoluto',\r
+insert_image_align_absbottom : 'Fundo absoluto',\r
+insert_image_align_left : 'Esquerda',\r
+insert_image_align_right : 'Direita',\r
+theme_font_size : '-- Font size --',\r
+theme_fontdefault : '-- Font family --',\r
+theme_block : '-- Format --',\r
+theme_paragraph : 'Parágrafo',\r
+theme_div : 'Bloco HTML',\r
+theme_address : 'Morada',\r
+theme_pre : 'Pré formatado',\r
+theme_h1 : 'Título 1',\r
+theme_h2 : 'Título 2',\r
+theme_h3 : 'Título 3',\r
+theme_h4 : 'Título 4',\r
+theme_h5 : 'Título 5',\r
+theme_h6 : 'Título 6',\r
+theme_colorpicker_title : 'Seleccione uma côr',\r
+theme_colorpicker_apply : 'Aplicar',\r
+theme_forecolor_desc : 'Seleccione côr da frente',\r
+theme_backcolor_desc : 'Select background color',\r
+theme_charmap_title : 'Seleccione símbolo customizado',\r
+theme_charmap_desc : 'Inserir símbolo customizado',\r
+theme_visualaid_desc : 'Ligar/Desligar guias/elementos invisíveis',\r
+insert_anchor_title : 'Inserir/editar âncora',\r
+insert_anchor_name : 'Nome da âncora',\r
+theme_anchor_desc : 'Inserir/editar âncora',\r
+theme_insert_link_titlefield : 'Título',\r
+theme_clipboard_msg : 'Copiar/Cortar/Colar não está disponível em Mozilla e Firefox.\nPretende obter mais informação acerca deste assunto?',\r
+theme_path : 'Path',\r
+cut_desc : 'Cortar',\r
+copy_desc : 'Copiar',\r
+paste_desc : 'Colar',\r
+link_list : 'Link list',\r
+image_list : 'Image list',\r
+browse : 'Browse',\r
+image_props_desc : 'Image properties',\r
+newdocument_desc : 'New document',\r
+class_name : 'Classe de CSS',\r
+newdocument : 'Are you sure you want clear all contents?'\r
+});\r
diff --git a/webcit/tiny_mce/themes/advanced/langs/pt_br.js b/webcit/tiny_mce/themes/advanced/langs/pt_br.js
new file mode 100644 (file)
index 0000000..5f37864
--- /dev/null
@@ -0,0 +1,115 @@
+/**\r
+ * pt_br lang variables\r
+ * Brazilian Portuguese\r
+ *\r
+ * Authors : ????\r
+ * Revision and modifications:\r
+ *           Marcio Barbosa (mpg) <mpg@mpg.com.br>\r
+ * Last Updated : November 26, 2005\r
+ * TinyMCE Version : 2.0RC4\r
+ */\r
+tinyMCE.addToLang('',{\r
+theme_style_select : 'Estilos',\r
+theme_code_desc : 'Editar Código HTML',\r
+theme_code_title : 'Editor de Código HTML',\r
+theme_code_wordwrap : 'Quebrar Linhas',\r
+theme_sub_desc : 'Subscrito',\r
+theme_sup_desc : 'Subrescrito',\r
+theme_hr_desc : 'Inserir linha horizontal',\r
+theme_removeformat_desc : 'Remover formatação',\r
+theme_custom1_desc : 'Sua descrição personalizada aqui',\r
+insert_image_border : 'Borda',\r
+insert_image_dimensions : 'Dimensões',\r
+insert_image_vspace : 'Espaço Vertical',\r
+insert_image_hspace : 'Espaço Horizontal',\r
+insert_image_align : 'Alinhamento',\r
+insert_image_align_default : 'Padrão',\r
+insert_image_align_baseline : 'Linha base',\r
+insert_image_align_top : 'Topo',\r
+insert_image_align_middle : 'Centro',\r
+insert_image_align_bottom : 'Fundo',\r
+insert_image_align_texttop : 'Texto ao Topo',\r
+insert_image_align_absmiddle : 'Centro Absoluto',\r
+insert_image_align_absbottom : 'Fundo Absoluto',\r
+insert_image_align_left : 'Esquerda',\r
+insert_image_align_right : 'Direita',\r
+theme_font_size : '-- Corpo --',\r
+theme_fontdefault : '-- Tipo de Fonte --',\r
+theme_block : '-- Formato --',\r
+theme_paragraph : 'Parágrafo',\r
+theme_div : 'Div',\r
+theme_address : 'Endereço',\r
+theme_pre : 'Pré-formatado',\r
+theme_h1 : 'Cabeçalho 1',\r
+theme_h2 : 'Cabeçalho 2',\r
+theme_h3 : 'Cabeçalho 3',\r
+theme_h4 : 'Cabeçalho 4',\r
+theme_h5 : 'Cabeçalho 5',\r
+theme_h6 : 'Cabeçalho 6',\r
+theme_colorpicker_title : 'Selecionar côr',\r
+theme_colorpicker_apply : 'Aplicar',\r
+theme_forecolor_desc : 'Selecionar côr do texto',\r
+theme_backcolor_desc : 'Selecionar côr de fundo',\r
+theme_charmap_title : 'Selecionar caracter especial',\r
+theme_charmap_desc : 'Inserir caracter especial',\r
+theme_charmap_alpha_desc : 'Caracteres alfabéticos',\r
+theme_charmap_arrows_title : 'Flechas',\r
+theme_charmap_arrows_desc : 'Caracteres de flechas',\r
+theme_charmap_greek_title : 'Gregos',\r
+theme_charmap_greek_desc : 'Caracteres Gregos',\r
+theme_charmap_math_title : 'Mathematicos',\r
+theme_charmap_math_desc : 'Caracteres mathematicos',\r
+theme_charmap_misc_title : 'Diversos',\r
+theme_charmap_misc_desc : 'Caracteres diversos',\r
+theme_charmap_money_title : 'Moedas',\r
+theme_charmap_money_desc : 'Caracteres de moedas',\r
+theme_charmap_quotaion_title : 'Apóstrofes',\r
+theme_charmap_quotaion_desc : 'Caracteres de Apóstrofe',\r
+theme_visualaid_desc : 'Trocar as linhas de ajuda por elementos invisíveis',\r
+insert_anchor_title : 'Inserir/editar âncora',\r
+insert_anchor_name : 'Nome da âncora',\r
+theme_anchor_desc : 'Inserir/editar âncora',\r
+theme_insert_link_titlefield : 'Título',\r
+theme_clipboard_msg : 'Não se pode utiliza os comando de Copiar / Cortar / Colar no Mozilla e Firefox.\r\nUse o teclado para Copiar (Ctrl+C) / Cortar (Ctrl+X) / Colar (Ctrl+V)\r\nQuer obter mais informação?',\r
+theme_path : 'Rota',\r
+cut_desc : 'Cortar (Ctrl+X)',\r
+copy_desc : 'Copiar (Ctrl+C)',\r
+paste_desc : 'Colar (Ctrl+V)',\r
+link_list : 'Lista de links',\r
+image_list : 'Lista de imagens',\r
+browse : 'Navegar',\r
+image_props_desc : 'Propriedades da imagem',\r
+newdocument_desc : 'Novo documento',\r
+class_name : 'Classe',\r
+newdocument : 'Tem certesa que deseja apagar todo o conteúdo?',\r
+about_title : 'Sobre o TinyMCE',\r
+about : 'Sobre',\r
+license : 'Licença',\r
+plugins : 'Plugins',\r
+plugin : 'Plugin',\r
+author : 'Autor',\r
+version : 'Versão',\r
+loaded_plugins : 'Plugins carregados',\r
+help : 'Ajuda',\r
+not_set : '-- Por padrão --',\r
+close : 'Fechar',\r
+toolbar_focus : 'Ir para a barra de ferramentas - Alt+Q, Ir para o editor - Alt+Z, Ir para o elemento de destino - Alt+X',\r
+theme_visualaid_desc : 'Tornar linhas visíveis/invisíveis',\r
+insert_anchor_title : 'Inserir/editar âncora',\r
+insert_anchor_name : 'Nome da âncora',\r
+theme_anchor_desc : 'Inserir/editar âncora',\r
+theme_insert_link_titlefield : 'Título',\r
+theme_clipboard_msg : 'Copiar/Recortar/Colar não é permitido no Mozilla e Firefox.\nQuer mais informações sobre isso?',\r
+theme_path : 'Caminho',\r
+cut_desc : 'Recortar',\r
+copy_desc : 'Copiar',\r
+paste_desc : 'Colar',\r
+link_list : 'Lista de Links',\r
+image_list : 'Lista de Imagens',\r
+browse : 'Navegar',\r
+image_props_desc : 'Propriedades da Imagem',\r
+newdocument_desc : 'Novo Documento',\r
+class_name : 'Classe',\r
+newdocument : 'Tem certeza que deseja limpar todo o conteúdo?',\r
+theme_advanced_anchor_delta_width : 20\r
+});\r
diff --git a/webcit/tiny_mce/themes/advanced/langs/readme.txt b/webcit/tiny_mce/themes/advanced/langs/readme.txt
new file mode 100644 (file)
index 0000000..ef48d2b
--- /dev/null
@@ -0,0 +1,4 @@
+Theme specific language packs.\r
+\r
+The language pack codes are based on ISO-639-2\r
+http://www.loc.gov/standards/iso639-2/englangn.html\r
diff --git a/webcit/tiny_mce/themes/advanced/langs/ru.js b/webcit/tiny_mce/themes/advanced/langs/ru.js
new file mode 100644 (file)
index 0000000..c042cc4
--- /dev/null
@@ -0,0 +1,76 @@
+// Russian lang variables cp1251\r
+\r
+tinyMCE.addToLang('',{\r
+theme_style_select : '-- Ñòèëè --',\r
+theme_code_desc : 'Ðåäàêòèðîâàòü HTML êîäû',\r
+theme_code_title : 'Ðåäàêòîð HTML êîäîâ',\r
+theme_code_wordwrap : 'Ïåðåíîñ ïî ñëîâàì',\r
+theme_sub_desc : 'Íèæíèé èíäåêñ',\r
+theme_sup_desc : 'Âåðõíèé èíäåêñ',\r
+theme_hr_desc : 'Âñòàâèòü ãîðèçîíòàëüíûé ðàçäåëèòåëü',\r
+theme_removeformat_desc : 'Óáðàòü ôîðìàòèðîâàíèå',\r
+theme_custom1_desc : 'Âàøå ïðîèçâîëüíîå îïèñàíèå',\r
+insert_image_border : 'Ðàìêà',\r
+insert_image_dimensions : 'Ðàçìåðû',\r
+insert_image_vspace : 'Âåðòèêàëüíûé îòñòóï',\r
+insert_image_hspace : 'Ãîðèçîíòàëüíûé îòñòóï',\r
+insert_image_align : 'Âûðàâíèâàíèå',\r
+insert_image_align_default : '-- Íå çàäàíî --',\r
+insert_image_align_baseline : 'Ïî áàçîâîé ëèíèè',\r
+insert_image_align_top : 'Ïî âåðõó',\r
+insert_image_align_middle : 'Ïîñðåäèíå',\r
+insert_image_align_bottom : 'Ïî íèçó',\r
+insert_image_align_texttop : 'Ïî âåðõó òåêñòà',\r
+insert_image_align_absmiddle : 'Àáñîëþòíî ïîñðåäèíå',\r
+insert_image_align_absbottom : 'Àáñîëþòíî ñâåðõó',\r
+insert_image_align_left : 'Âëåâî',\r
+insert_image_align_right : 'Âïðàâî',\r
+theme_font_size : '-- Ðàçìåð øðèôòà --',\r
+theme_fontdefault : '-- Ñåìåéñòâî øðèôòîâ --',\r
+theme_block : '-- Ôîðìàò --',\r
+theme_paragraph : 'Àáçàö',\r
+theme_div : 'Div',\r
+theme_address : 'Ñòèëü àäðåñà',\r
+theme_pre : ':`Ïðåäâàðèòåëüíî ôîðìàòèðîâàííûé',\r
+theme_h1 : 'Çàãîëîâîê 1',\r
+theme_h2 : 'Çàãîëîâîê 2',\r
+theme_h3 : 'Çàãîëîâîê 3',\r
+theme_h4 : 'Çàãîëîâîê 4',\r
+theme_h5 : 'Çàãîëîâîê 5',\r
+theme_h6 : 'Çàãîëîâîê 6',\r
+theme_colorpicker_title : 'Âûáðàòü öâåò',\r
+theme_colorpicker_apply : 'Ïðèìåíèòü',\r
+theme_forecolor_desc : 'Âûáðàòü öâåò òåêñòà',\r
+theme_backcolor_desc : 'Âûáðàòü öâåò ôîíà',\r
+theme_charmap_title : 'Âûáîð ïðîèçâîëüíîãî ñèìâîëà',\r
+theme_charmap_desc : 'Âñòàâèòü ïðîèçâîëüíûé ñèìâîë',\r
+theme_visualaid_desc : 'Ïîêàçàòü ãðàíèöû ñêðûòûõ ýëåìåíòîâ',\r
+insert_anchor_title : 'Âñòàâèòü/ðåäàêòèðîâàòü ÿêîðü',\r
+insert_anchor_name : 'Èìÿ ÿêîðÿ',\r
+theme_anchor_desc : 'Âñòàâèòü/ðåäàêòèðîâàòü ÿêîðü',\r
+theme_insert_link_titlefield : 'Çàãîëîâîê',\r
+theme_clipboard_msg : 'Êîïèðîâàòü/Âûðåçàòü/Âñòàâèòü íåäîñòóïíû äëÿ Mozilla è Firefox.\nÕîòèòå óçíàòü îá ýòîì ïîäðîáíåå?',\r
+theme_path : 'Ïóòü',\r
+cut_desc : 'Âûðåçàòü',\r
+copy_desc : 'Êîïèðîâàòü',\r
+paste_desc : 'Âñòàâèòü',\r
+link_list : 'Ïåðå÷àíü ññûëîê',\r
+image_list : 'Ïåðå÷åíü êàðòèíîê',\r
+browse : 'Ïîäîáðàòü',\r
+image_props_desc : 'Ñâîéñòâà êàðòèíêè',\r
+newdocument_desc : 'Íîâûé äîêóìåíò',\r
+class_name : 'Êëàññ',\r
+newdocument : 'Âû óâåðåíû, ÷òî õîòèòå î÷èñòèòü âñ¸ ñîäåðæèìîå?',\r
+about_title : 'ΠTinyMCE',\r
+about : 'ΠTinyMCE',\r
+license : 'Ëèöåíçèÿ',\r
+plugins : 'Ïëàãèíû',\r
+plugin : 'Ïëàãèí',\r
+author : 'Àâòîð',\r
+version : 'Âåðñèÿ',\r
+loaded_plugins : 'Çàãðóæåííûå ïëàãèíû',\r
+help : 'Ïîìîùü',\r
+not_set : '-- íå óñòàíîâëåíî --',\r
+close : 'Çàêðûòü',\r
+toolbar_focus : 'Ïåðåìåñòèòü ôîêóñ íà ïàíåëü èíñòðóìåíòîâ - Alt+Q, Ïåðåìåñòèòü ôîêóñ â ðåäàêòîð - Alt-Z, Ïåðåìåñòèòü ôîêóñ íà ýëåìåíò ïóòè - Alt-X'\r
+});\r
diff --git a/webcit/tiny_mce/themes/advanced/langs/ru_KOI8-R.js b/webcit/tiny_mce/themes/advanced/langs/ru_KOI8-R.js
new file mode 100644 (file)
index 0000000..3149c7c
--- /dev/null
@@ -0,0 +1,76 @@
+// Russian lang variables KOI8-R\r
+\r
+tinyMCE.addToLang('',{\r
+theme_style_select : '-- óÔÉÌÉ --',\r
+theme_code_desc : 'òÅÄÁËÔÉÒÏ×ÁÔØ HTML ËÏÄÙ',\r
+theme_code_title : 'òÅÄÁËÔÏÒ HTML ËÏÄÏ×',\r
+theme_code_wordwrap : 'ðÅÒÅÎÏÓ ÐÏ ÓÌÏ×ÁÍ',\r
+theme_sub_desc : 'îÉÖÎÉÊ ÉÎÄÅËÓ',\r
+theme_sup_desc : '÷ÅÒÈÎÉÊ ÉÎÄÅËÓ',\r
+theme_hr_desc : '÷ÓÔÁ×ÉÔØ ÇÏÒÉÚÏÎÔÁÌØÎÙÊ ÒÁÚÄÅÌÉÔÅÌØ',\r
+theme_removeformat_desc : 'õÂÒÁÔØ ÆÏÒÍÁÔÉÒÏ×ÁÎÉÅ',\r
+theme_custom1_desc : '÷ÁÛÅ ÐÒÏÉÚ×ÏÌØÎÏÅ ÏÐÉÓÁÎÉÅ',\r
+insert_image_border : 'òÁÍËÁ',\r
+insert_image_dimensions : 'òÁÚÍÅÒÙ',\r
+insert_image_vspace : '÷ÅÒÔÉËÁÌØÎÙÊ ÏÔÓÔÕÐ',\r
+insert_image_hspace : 'çÏÒÉÚÏÎÔÁÌØÎÙÊ ÏÔÓÔÕÐ',\r
+insert_image_align : '÷ÙÒÁ×ÎÉ×ÁÎÉÅ',\r
+insert_image_align_default : '-- îÅ ÚÁÄÁÎÏ --',\r
+insert_image_align_baseline : 'ðÏ ÂÁÚÏ×ÏÊ ÌÉÎÉÉ',\r
+insert_image_align_top : 'ðÏ ×ÅÒÈÕ',\r
+insert_image_align_middle : 'ðÏÓÒÅÄÉÎÅ',\r
+insert_image_align_bottom : 'ðÏ ÎÉÚÕ',\r
+insert_image_align_texttop : 'ðÏ ×ÅÒÈÕ ÔÅËÓÔÁ',\r
+insert_image_align_absmiddle : 'áÂÓÏÌÀÔÎÏ ÐÏÓÒÅÄÉÎÅ',\r
+insert_image_align_absbottom : 'áÂÓÏÌÀÔÎÏ Ó×ÅÒÈÕ',\r
+insert_image_align_left : '÷ÌÅ×Ï',\r
+insert_image_align_right : '÷ÐÒÁ×Ï',\r
+theme_font_size : '-- òÁÚÍÅÒ ÛÒÉÆÔÁ --',\r
+theme_fontdefault : '-- óÅÍÅÊÓÔ×Ï ÛÒÉÆÔÏ× --',\r
+theme_block : '-- æÏÒÍÁÔ --',\r
+theme_paragraph : 'áÂÚÁÃ',\r
+theme_div : 'Div',\r
+theme_address : 'óÔÉÌØ ÁÄÒÅÓÁ',\r
+theme_pre : ':`ðÒÅÄ×ÁÒÉÔÅÌØÎÏ ÆÏÒÍÁÔÉÒÏ×ÁÎÎÙÊ',\r
+theme_h1 : 'úÁÇÏÌÏ×ÏË 1',\r
+theme_h2 : 'úÁÇÏÌÏ×ÏË 2',\r
+theme_h3 : 'úÁÇÏÌÏ×ÏË 3',\r
+theme_h4 : 'úÁÇÏÌÏ×ÏË 4',\r
+theme_h5 : 'úÁÇÏÌÏ×ÏË 5',\r
+theme_h6 : 'úÁÇÏÌÏ×ÏË 6',\r
+theme_colorpicker_title : '÷ÙÂÒÁÔØ Ã×ÅÔ',\r
+theme_colorpicker_apply : 'ðÒÉÍÅÎÉÔØ',\r
+theme_forecolor_desc : '÷ÙÂÒÁÔØ Ã×ÅÔ ÔÅËÓÔÁ',\r
+theme_backcolor_desc : '÷ÙÂÒÁÔØ Ã×ÅÔ ÆÏÎÁ',\r
+theme_charmap_title : '÷ÙÂÏÒ ÐÒÏÉÚ×ÏÌØÎÏÇÏ ÓÉÍ×ÏÌÁ',\r
+theme_charmap_desc : '÷ÓÔÁ×ÉÔØ ÐÒÏÉÚ×ÏÌØÎÙÊ ÓÉÍ×ÏÌ',\r
+theme_visualaid_desc : 'ðÏËÁÚÁÔØ ÇÒÁÎÉÃÙ ÓËÒÙÔÙÈ ÜÌÅÍÅÎÔÏ×',\r
+insert_anchor_title : '÷ÓÔÁ×ÉÔØ/ÒÅÄÁËÔÉÒÏ×ÁÔØ ÑËÏÒØ',\r
+insert_anchor_name : 'éÍÑ ÑËÏÒÑ',\r
+theme_anchor_desc : '÷ÓÔÁ×ÉÔØ/ÒÅÄÁËÔÉÒÏ×ÁÔØ ÑËÏÒØ',\r
+theme_insert_link_titlefield : 'úÁÇÏÌÏ×ÏË',\r
+theme_clipboard_msg : 'ëÏÐÉÒÏ×ÁÔØ/÷ÙÒÅÚÁÔØ/÷ÓÔÁ×ÉÔØ ÎÅÄÏÓÔÕÐÎÙ ÄÌÑ Mozilla É Firefox.\nèÏÔÉÔÅ ÕÚÎÁÔØ Ï ÜÔÏÍ ÐÏÄÒÏÂÎÅÅ?',\r
+theme_path : 'ðÕÔØ',\r
+cut_desc : '÷ÙÒÅÚÁÔØ',\r
+copy_desc : 'ëÏÐÉÒÏ×ÁÔØ',\r
+paste_desc : '÷ÓÔÁ×ÉÔØ',\r
+link_list : 'ðÅÒÅÞÁÎØ ÓÓÙÌÏË',\r
+image_list : 'ðÅÒÅÞÅÎØ ËÁÒÔÉÎÏË',\r
+browse : 'ðÏÄÏÂÒÁÔØ',\r
+image_props_desc : 'ó×ÏÊÓÔ×Á ËÁÒÔÉÎËÉ',\r
+newdocument_desc : 'îÏ×ÙÊ ÄÏËÕÍÅÎÔ',\r
+class_name : 'ëÌÁÓÓ',\r
+newdocument : '÷Ù Õ×ÅÒÅÎÙ, ÞÔÏ ÈÏÔÉÔÅ ÏÞÉÓÔÉÔØ ×Ó£ ÓÏÄÅÒÖÉÍÏÅ?',\r
+about_title : 'ï TinyMCE',\r
+about : 'ï TinyMCE',\r
+license : 'ìÉÃÅÎÚÉÑ',\r
+plugins : 'ðÌÁÇÉÎÙ',\r
+plugin : 'ðÌÁÇÉÎ',\r
+author : 'á×ÔÏÒ',\r
+version : '÷ÅÒÓÉÑ',\r
+loaded_plugins : 'úÁÇÒÕÖÅÎÎÙÅ ÐÌÁÇÉÎÙ',\r
+help : 'ðÏÍÏÝØ',\r
+not_set : '-- ÎÅ ÕÓÔÁÎÏ×ÌÅÎÏ --',\r
+close : 'úÁËÒÙÔØ',\r
+toolbar_focus : 'ðÅÒÅÍÅÓÔÉÔØ ÆÏËÕÓ ÎÁ ÐÁÎÅÌØ ÉÎÓÔÒÕÍÅÎÔÏ× - Alt+Q, ðÅÒÅÍÅÓÔÉÔØ ÆÏËÕÓ × ÒÅÄÁËÔÏÒ - Alt-Z, ðÅÒÅÍÅÓÔÉÔØ ÆÏËÕÓ ÎÁ ÜÌÅÍÅÎÔ ÐÕÔÉ - Alt-X'\r
+});\r
diff --git a/webcit/tiny_mce/themes/advanced/langs/ru_UTF-8.js b/webcit/tiny_mce/themes/advanced/langs/ru_UTF-8.js
new file mode 100644 (file)
index 0000000..ccb1987
--- /dev/null
@@ -0,0 +1,76 @@
+// Russian lang variables UTF-8\r
+\r
+tinyMCE.addToLang('',{\r
+theme_style_select : '-- Стили --',\r
+theme_code_desc : 'Редактировать HTML коды',\r
+theme_code_title : 'Редактор HTML кодов',\r
+theme_code_wordwrap : 'Перенос по словам',\r
+theme_sub_desc : 'Нижний индекс',\r
+theme_sup_desc : 'Верхний индекс',\r
+theme_hr_desc : 'Вставить горизонтальный разделитель',\r
+theme_removeformat_desc : 'Убрать форматирование',\r
+theme_custom1_desc : 'Ваше произвольное описание',\r
+insert_image_border : 'Рамка',\r
+insert_image_dimensions : 'Размеры',\r
+insert_image_vspace : 'Вертикальный отступ',\r
+insert_image_hspace : 'Горизонтальный отступ',\r
+insert_image_align : 'Выравнивание',\r
+insert_image_align_default : '-- Не задано --',\r
+insert_image_align_baseline : 'По базовой линии',\r
+insert_image_align_top : 'По верху',\r
+insert_image_align_middle : 'Посредине',\r
+insert_image_align_bottom : 'По низу',\r
+insert_image_align_texttop : 'По верху текста',\r
+insert_image_align_absmiddle : 'Абсолютно посредине',\r
+insert_image_align_absbottom : 'Абсолютно сверху',\r
+insert_image_align_left : 'Влево',\r
+insert_image_align_right : 'Вправо',\r
+theme_font_size : '-- Размер шрифта --',\r
+theme_fontdefault : '-- Семейство шрифтов --',\r
+theme_block : '-- Формат --',\r
+theme_paragraph : 'Абзац',\r
+theme_div : 'Div',\r
+theme_address : 'Стиль адреса',\r
+theme_pre : ':`Предварительно форматированный',\r
+theme_h1 : 'Заголовок 1',\r
+theme_h2 : 'Заголовок 2',\r
+theme_h3 : 'Заголовок 3',\r
+theme_h4 : 'Заголовок 4',\r
+theme_h5 : 'Заголовок 5',\r
+theme_h6 : 'Заголовок 6',\r
+theme_colorpicker_title : 'Выбрать цвет',\r
+theme_colorpicker_apply : 'Применить',\r
+theme_forecolor_desc : 'Выбрать цвет текста',\r
+theme_backcolor_desc : 'Выбрать цвет фона',\r
+theme_charmap_title : 'Выбор произвольного символа',\r
+theme_charmap_desc : 'Вставить произвольный символ',\r
+theme_visualaid_desc : 'Показать границы скрытых элементов',\r
+insert_anchor_title : 'Вставить/редактировать якорь',\r
+insert_anchor_name : 'Имя якоря',\r
+theme_anchor_desc : 'Вставить/редактировать якорь',\r
+theme_insert_link_titlefield : 'Заголовок',\r
+theme_clipboard_msg : 'Копировать/Вырезать/Вставить недоступны для Mozilla и Firefox.\nХотите узнать об этом подробнее?',\r
+theme_path : 'Путь',\r
+cut_desc : 'Вырезать',\r
+copy_desc : 'Копировать',\r
+paste_desc : 'Вставить',\r
+link_list : 'Перечань ссылок',\r
+image_list : 'Перечень картинок',\r
+browse : 'Подобрать',\r
+image_props_desc : 'Свойства картинки',\r
+newdocument_desc : 'Новый документ',\r
+class_name : 'Класс',\r
+newdocument : 'Вы уверены, что хотите очистить всё содержимое?',\r
+about_title : 'О TinyMCE',\r
+about : 'О TinyMCE',\r
+license : 'Лицензия',\r
+plugins : 'Плагины',\r
+plugin : 'Плагин',\r
+author : 'Автор',\r
+version : 'Версия',\r
+loaded_plugins : 'Загруженные плагины',\r
+help : 'Помощь',\r
+not_set : '-- не установлено --',\r
+close : 'Закрыть',\r
+toolbar_focus : 'Переместить фокус на панель инструментов - Alt+Q, Переместить фокус в редактор - Alt-Z, Переместить фокус на элемент пути - Alt-X'\r
+});\r
diff --git a/webcit/tiny_mce/themes/advanced/langs/sk.js b/webcit/tiny_mce/themes/advanced/langs/sk.js
new file mode 100644 (file)
index 0000000..d3b2d15
--- /dev/null
@@ -0,0 +1,72 @@
+/**\r
+ * Slovak lang variables \r
+ * encoding: utf-8\r
+ * \r
+ * @author Vladimir VASIL vvasil@post.sk\r
+ *    \r
+ * $Id: sk.js,v 1.1 2005/11/22 20:56:45 spocke Exp $ \r
+ */  \r
+\r
+\r
+tinyMCE.addToLang('',{\r
+theme_style_select : 'Štýly',\r
+theme_code_desc : 'Zobraziť HTML',\r
+theme_code_title : 'Editácia HTML',\r
+theme_code_wordwrap : 'Bez delení slov',\r
+theme_sub_desc : 'Dolný index',\r
+theme_sup_desc : 'Horný index',\r
+theme_hr_desc : 'Vložiť vodorovný oddeľovač',\r
+theme_removeformat_desc : 'Zrušiť formátovanie',\r
+theme_custom1_desc : 'Ľubovolný popisok',\r
+insert_image_border : 'Rámček',\r
+insert_image_dimensions : 'Rozmery',\r
+insert_image_vspace : 'Vertikálný okraj',\r
+insert_image_hspace : 'Horizontálný okraj',\r
+insert_image_align : 'Zarovnánie',\r
+insert_image_align_default : 'Výchozi',\r
+insert_image_align_baseline : 'Na čiare',\r
+insert_image_align_top : 'Nahor',\r
+insert_image_align_middle : 'Na stred',\r
+insert_image_align_bottom : 'Dole',\r
+insert_image_align_texttop : 'Najvyšší bod textu',\r
+insert_image_align_absmiddle : 'Stred riadku',\r
+insert_image_align_absbottom : 'Spodok riadku',\r
+insert_image_align_left : 'Vľavo',\r
+insert_image_align_right : 'Vpravo',\r
+theme_font_size : '-- Veľkosť textu --',\r
+theme_fontdefault : '-- Písmo --',\r
+theme_block : '-- Formát --',\r
+theme_paragraph : 'Odstavec',\r
+theme_div : 'Div',\r
+theme_address : 'Adresa',\r
+theme_pre : 'Predformát',\r
+theme_h1 : 'Nádpis 1',\r
+theme_h2 : 'Nádpis 2',\r
+theme_h3 : 'Nádpis 3',\r
+theme_h4 : 'Nádpis 4',\r
+theme_h5 : 'Nádpis 5',\r
+theme_h6 : 'Nádpis 6',\r
+theme_colorpicker_title : 'Výber farby',\r
+theme_colorpicker_apply : 'Vybrať',\r
+theme_forecolor_desc : 'Farba popredia',\r
+theme_backcolor_desc : 'Farba pozadia',\r
+theme_charmap_title : 'Výber znaku',\r
+theme_charmap_desc : 'Vložiť znak',\r
+theme_visualaid_desc : 'Zapnúť značky/neviditeľné prvky',\r
+insert_anchor_title : 'Vloženie/editácia záložky',\r
+insert_anchor_name : 'Názov',\r
+theme_anchor_desc : 'Vložiť/editovať záložku',\r
+theme_insert_link_titlefield : 'Názov',\r
+theme_clipboard_msg : 'Funkcie Kopírovať/vystrihnúť/vložiť niesú použiteľné v Mozille a Firefoxe.\nChcete viac informacií o tomto probléme?',\r
+theme_path : 'Cesta',\r
+cut_desc : 'Vystrihnúť',\r
+copy_desc : 'Kopírovať',\r
+paste_desc : 'Vložiť',\r
+link_list : 'Zoznam',\r
+image_list : 'Zoznam',\r
+browse : 'Prechádzať',\r
+image_props_desc : 'Vlastnosti obrázku',\r
+newdocument_desc : 'Nový dokument',\r
+newdocument : 'Ste si istý(á), že chcete vymazať všetok obsah?'\r
+});\r
+\r
diff --git a/webcit/tiny_mce/themes/advanced/langs/sv.js b/webcit/tiny_mce/themes/advanced/langs/sv.js
new file mode 100644 (file)
index 0000000..fc25a7f
--- /dev/null
@@ -0,0 +1,77 @@
+// SE lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+theme_style_select : '-- Stilar --',\r
+theme_code_desc : 'Editera HTML-koden',\r
+theme_code_title : 'HTML-k&auml;llkodseditor',\r
+theme_code_wordwrap : 'Automatiskt radbyte',\r
+theme_sub_desc : 'Neds&auml;nkt text',\r
+theme_sup_desc : 'Upph&ouml;jd text',\r
+theme_hr_desc : 'S&auml;tt in horisontell linje',\r
+theme_removeformat_desc : 'Ta bort formatering',\r
+theme_custom1_desc : 'Din specialbeskriving h&auml;r',\r
+insert_image_border : 'Ram',\r
+insert_image_dimensions : 'Dimensioner',\r
+insert_image_vspace : 'Vertikalt tomrum',\r
+insert_image_hspace : 'Horisontellt tomrum',\r
+insert_image_align : 'Justering',\r
+insert_image_align_default : 'Ingen',\r
+insert_image_align_baseline : 'Bottenlinjen',\r
+insert_image_align_top : 'L&auml;ngst upp',\r
+insert_image_align_middle : 'Mitten',\r
+insert_image_align_bottom : 'L&auml;ngst ner',\r
+insert_image_align_texttop : 'Textens top',\r
+insert_image_align_absmiddle : 'Absoluta mitten',\r
+insert_image_align_absbottom : 'Absolut l&auml;ngst ner',\r
+insert_image_align_left : 'V&auml;nster',\r
+insert_image_align_right : 'H&ouml;ger',\r
+insert_image_delta_width : 30,\r
+insert_image_delta_height : 10,\r
+theme_font_size : '-- Fontstorlek --',\r
+theme_fontdefault : '-- Font familj --',\r
+theme_block : '-- Stycke --',\r
+theme_paragraph : 'Paragraf',\r
+theme_div : 'Div',\r
+theme_address : 'Adress',\r
+theme_pre : 'F&ouml;rformatterad',\r
+theme_h1 : 'Rubrik 1',\r
+theme_h2 : 'Rubrik 2',\r
+theme_h3 : 'Rubrik 3',\r
+theme_h4 : 'Rubrik 4',\r
+theme_h5 : 'Rubrik 5',\r
+theme_h6 : 'Rubrik 6',\r
+theme_colorpicker_title : 'V&auml;lj en f&auml;rg',\r
+theme_colorpicker_apply : 'Verkst&auml;ll',\r
+theme_forecolor_desc : 'V&auml;lj f&ouml;rgrundsf&auml;rg',\r
+theme_backcolor_desc : 'V&auml;lj bakgrundsf&auml;rg',\r
+theme_charmap_title : 'V&auml;lj specialtecken',\r
+theme_charmap_desc : 'S&auml;tt in specialtecken',\r
+theme_visualaid_desc : 'Sl&aring; av/p&aring; osynliga element',\r
+insert_anchor_title : 'Skapa/redigera ankare',\r
+insert_anchor_name : 'Ankarnamn',\r
+theme_anchor_desc : 'Skapa/redigera ankare',\r
+theme_insert_link_titlefield : 'Titel',\r
+theme_clipboard_msg : 'Klipput/Kopiera/Klistra fungerar inte Mozilla och Firefox. Vill du veta mer om detta?',\r
+theme_path : 'S&ouml;kv&auml;g',\r
+cut_desc : 'Klipp ut',\r
+copy_desc : 'Kopiera',\r
+paste_desc : 'Klistra in',\r
+link_list : 'L&auml;nkar',\r
+image_list : 'Bilder',\r
+browse : 'Bl&auml;ddra',\r
+image_props_desc : 'Bild egenskaper',\r
+newdocument_desc : 'Nytt dokument',\r
+class_name : 'Stil',\r
+newdocument : '&Auml;r du s&auml;ker p&aring; att du vill t&ouml;mma hela redigerings ytan?',\r
+about_title : 'Om TinyMCE',\r
+about : 'Om',\r
+license : 'Licens',\r
+plugins : 'Insticksprogram',\r
+plugin : 'Insticksprogram',\r
+author : 'Utvecklare',\r
+version : 'Version',\r
+loaded_plugins : 'Laddade insticksprogram',\r
+help : 'Hj&auml;lp',\r
+not_set : '-- Inte satt --',\r
+close : 'St&auml;ng'\r
+});\r
diff --git a/webcit/tiny_mce/themes/advanced/langs/tw.js b/webcit/tiny_mce/themes/advanced/langs/tw.js
new file mode 100644 (file)
index 0000000..4c9ba44
--- /dev/null
@@ -0,0 +1,91 @@
+// TW lang variables contributed by Jim Kou\r
+\r
+tinyMCE.addToLang('',{\r
+bold_desc : '²Ê&Aring;é',\r
+bold_img : "bold.gif",\r
+bullist_desc : '²&Aring;¸¹¶µ¥Ø',\r
+cancel : '¨ú®ø',\r
+cleanup_desc : '²M°£',\r
+help_desc : '»²§U»¡©ú',\r
+image_desc : '¹Ï¤ù',\r
+indent_desc : 'ÁY±Æ',\r
+insert : '·s¼W',\r
+insert_anchor_name : '¼Ðµù¦WºÙ',\r
+insert_anchor_title : '·s¼W¼Ðµù',\r
+insert_image_align : '¹ï»ô',\r
+insert_image_align_absbottom : '±j¨î»ô¤U',\r
+insert_image_align_absmiddle : '±j¨î¸m¤¤',\r
+insert_image_align_baseline : '°ò·Ç½u',\r
+insert_image_align_bottom : '»ô¤U',\r
+insert_image_align_default : '¼Ð·Ç',\r
+insert_image_align_left : '»ô¥ª',\r
+insert_image_align_middle : '¸m¤¤',\r
+insert_image_align_right : '»ô¥k',\r
+insert_image_align_texttop : '¤&aring;¦r¤W¤è',\r
+insert_image_align_top : '»ô¤W',\r
+insert_image_alt : '¹Ï¤ù»¡©ú',\r
+insert_image_border : '¥~®Ø',\r
+insert_image_dimensions : '¤Ø¤o',\r
+insert_image_hspace : '¤ô¥­¶¡»Ø',\r
+insert_image_src : '¹Ï¤ù¨Ó·½',\r
+insert_image_title : '·s¼W¹Ï¤ù',\r
+insert_image_vspace : '««ª½¶¡»Ø',\r
+insert_link_target : '¥Ø¼Ð',\r
+insert_link_target_blank : '&Aring;ã¥Ü©ó·sµøµ¡¤¤',\r
+insert_link_target_same : '&Aring;ã¥Ü©ó¦P¤@µøµ¡¤¤',\r
+insert_link_title : '·s¼W¶W³sµ²',\r
+insert_link_url : '¶W³sµ²',\r
+italic_desc : '±×&Aring;é',\r
+italic_img : "italic.gif",\r
+justifycenter_desc : '»ô¤¤',\r
+justifyfull_desc : '¶ñº¡',\r
+justifyleft_desc : '»ô¥ª',\r
+justifyright_desc : '»ô¥k',\r
+link_desc : '«Ø¥ß³sµ²',\r
+numlist_desc : '¼Æ¦r¶µ¥Ø',\r
+outdent_desc : '¥Y±Æ',\r
+redo_desc : '­«°µ',\r
+striketrough_desc : '§R°£½u',\r
+theme_address : '¦a§}',\r
+theme_anchor_desc : '¼Ðµù',\r
+theme_charmap_desc : '¯S®í¦r¤¸',\r
+theme_charmap_title : '¯S®í¦r¤¸²M³æ',\r
+theme_code_desc : '&Aring;ã¥Ü HTML ­ì©l½X',\r
+theme_code_wordwrap : 'Word wrap',\r
+theme_code_title : 'HTML ­ì©l½X',\r
+theme_colorpicker_apply : '&Aring;ܧó',\r
+theme_colorpicker_title : 'ÃC¦â',\r
+theme_font_size : '-- Font size --',\r
+theme_fontdefault : '-- Font family --',\r
+theme_block : '-- Format --',\r
+theme_forecolor_desc : '¦r«¬ÃC¦â',\r
+theme_backcolor_desc : 'Select background color',\r
+theme_h1 : '¼ÐÃD1',\r
+theme_h2 : '¼ÐÃD2',\r
+theme_h3 : '¼ÐÃD3',\r
+theme_h4 : '¼ÐÃD4',\r
+theme_h5 : '¼ÐÃD5',\r
+theme_h6 : '¼ÐÃD6',\r
+theme_hr_desc : '·s¼W¾î½u',\r
+theme_paragraph : '¬q¸¨',\r
+theme_pre : '¤º©w®æ¦¡',\r
+theme_removeformat_desc : '²M°£®æ¦¡³]©w',\r
+theme_style_select : '¼Ë¦¡',\r
+theme_sub_desc : '¤U¼Ð',\r
+theme_sup_desc : '¤W¼Ð',\r
+theme_visualaid_desc : '&Aring;ã¥Ü/ÁôÂëD¥i¨£ªº¤¸¯À',\r
+underline_desc : '©³½u',\r
+undo_desc : '´_­ì',\r
+unlink_desc : '¨ú®ø³sµ²',\r
+theme_clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?',\r
+theme_path : 'Path',\r
+cut_desc : 'Cut',\r
+copy_desc : 'Copy',\r
+paste_desc : 'Paste',\r
+link_list : 'Link list',\r
+image_list : 'Image list',\r
+browse : 'Browse',\r
+image_props_desc : 'Image properties',\r
+newdocument_desc : 'New document',\r
+newdocument : 'Are you sure you want clear all contents?'\r
+});\r
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..f471ec1
--- /dev/null
@@ -0,0 +1,76 @@
+// Simplified Chinese lang variables contributed by tom_cat (thomaswangyang@gmail.com)\r
+\r
+tinyMCE.addToLang('',{\r
+theme_style_select : '-- ¸ñʽ --',\r
+theme_code_desc : '±à¼­HTMLÔ´´úÂë',\r
+theme_code_title : 'HTMLÔ´´úÂë±à¼­Æ÷',\r
+theme_code_wordwrap : '×Ô¶¯»»ÐÐ',\r
+theme_sub_desc : 'ϱê',\r
+theme_sup_desc : 'Éϱê',\r
+theme_hr_desc : '²åÈëˮƽÏß',\r
+theme_removeformat_desc : 'ÒƳý¸ñʽ',\r
+theme_custom1_desc : 'ÕâÀïÌîдÓû§×Ô¶¨ÒåÃèÊö',\r
+insert_image_border : '±ß¿ò',\r
+insert_image_dimensions : 'άÊý',\r
+insert_image_vspace : '´¹Ö±¼ä¾à',\r
+insert_image_hspace : 'ˮƽ¼ä¾à',\r
+insert_image_align : '¶ÔÆ뷽ʽ',\r
+insert_image_align_default : '-- Ä¬ÈÏ --',\r
+insert_image_align_baseline : '»ùÏß',\r
+insert_image_align_top : '¶¥¶Ë',\r
+insert_image_align_middle : '¾ÓÖÐ',\r
+insert_image_align_bottom : 'µ×²¿',\r
+insert_image_align_texttop : 'ÎÄ×ÖÉÏ·½',\r
+insert_image_align_absmiddle : '¾ø¶Ô¾ÓÖÐ',\r
+insert_image_align_absbottom : '¾ø¶Ôµ×²¿',\r
+insert_image_align_left : '×ó¶ÔÆë',\r
+insert_image_align_right : 'ÓÒ¶ÔÆë',\r
+theme_font_size : '-- ×ֺŠ--',\r
+theme_fontdefault : '-- ×ÖÌå --',\r
+theme_block : '-- ¸ñʽ --',\r
+theme_paragraph : '¶ÎÂä',\r
+theme_div : '²ã',\r
+theme_address : 'µØÖ·',\r
+theme_pre : 'Ô¤¸ñʽ»¯',\r
+theme_h1 : '±êÌâ 1',\r
+theme_h2 : '±êÌâ 2',\r
+theme_h3 : '±êÌâ 3',\r
+theme_h4 : '±êÌâ 4',\r
+theme_h5 : '±êÌâ 5',\r
+theme_h6 : '±êÌâ 6',\r
+theme_colorpicker_title : 'Ñ¡ÔñÑÕÉ«',\r
+theme_colorpicker_apply : 'Ó¦ÓÃ',\r
+theme_forecolor_desc : 'Ñ¡ÔñÎÄ×ÖÑÕÉ«',\r
+theme_backcolor_desc : 'Ñ¡Ôñ±³¾°ÑÕÉ«',\r
+theme_charmap_title : 'Ñ¡ÔñÌØÊâ·ûºÅ',\r
+theme_charmap_desc : '²åÈëÌØÊâ·ûºÅ',\r
+theme_visualaid_desc : '¿ª¹Ø²»¿É¼ûÔªËØ',\r
+insert_anchor_title : '²åÈë/±à¼­ Ãªµã',\r
+insert_anchor_name : 'êµãÃû³Æ',\r
+theme_anchor_desc : '²åÈë/±à¼­ Ãªµã',\r
+theme_insert_link_titlefield : '±êÌâ',\r
+theme_clipboard_msg : '¼ôÇÐ/¸´ÖÆ/Õ³Ìù¹¦ÄÜÔÚ Mozilla ºÍ Firefox ä¯ÀÀÆ÷Öв»Ö§³Ö¡£\nÄúÏ£Íû»ñµÃ¸ü¶àµÄÐÅÏ¢Âð£¿',\r
+theme_path : '·¾¶',\r
+cut_desc : '¼ôÇÐ',\r
+copy_desc : '¸´ÖÆ',\r
+paste_desc : 'Õ³Ìù',\r
+link_list : 'Á´½ÓÁбí',\r
+image_list : 'ͼÏñÁбí',\r
+browse : 'ä¯ÀÀ',\r
+image_props_desc : 'ͼÏñÊôÐÔ',\r
+newdocument_desc : 'н¨¼äµµ',\r
+class_name : 'Àà',\r
+newdocument : 'ÄúÈ·ÈÏÒªÇå³ýËùÓÐÄÚÈÝÂð£¿',\r
+about_title : '¹ØÓÚ TinyMCE',\r
+about : '¹ØÓÚ',\r
+license : 'ÊÚȨÊé',\r
+plugins : 'ËùÓвå¼þ',\r
+plugin : '²å¼þ',\r
+author : '×÷Õß',\r
+version : '°æ±¾',\r
+loaded_plugins : '¶ÁÈ¡²å¼þ',\r
+help : '°ïÖú',\r
+not_set : '-- ¿ÕÉ趨 --',\r
+close : '¹Ø±Õ',\r
+toolbar_focus : 'Ìøµ½¹¤¾ß°´Å¥ - Alt+Q, Ìøµ½±à¼­Æ÷ - Alt-Z, Ìøµ½ÔªËØ·¾¶ - Alt-X'\r
+});\r
diff --git a/webcit/tiny_mce/themes/advanced/langs/zh_tw.js b/webcit/tiny_mce/themes/advanced/langs/zh_tw.js
new file mode 100644 (file)
index 0000000..d148b26
--- /dev/null
@@ -0,0 +1,78 @@
+// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// ÁcÅ餤¤å BIG-5 ¡F¼Æ¦ìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com\r
+\r
+\r
+tinyMCE.addToLang('',{\r
+theme_style_select : '-- ¦¡¼Ë --',\r
+theme_code_desc : '½s¿è HTML ½X',\r
+theme_code_title : 'HTML ½X½s¿è¾¹',\r
+theme_code_wordwrap : '¦rµüÀô¶',\r
+theme_sub_desc : '¤U¼Ð',\r
+theme_sup_desc : '¤W¼Ð',\r
+theme_hr_desc : '´¡¤J¤ô¥­½u',\r
+theme_removeformat_desc : '²M°£®æ¦¡³]©w',\r
+theme_custom1_desc : '¦Û­q»¡©ú¦b¦¹¿é¤J',\r
+insert_image_border : '®Ø½u',\r
+insert_image_dimensions : '¤Ø¤o',\r
+insert_image_vspace : '¹Ï¹³¤W¤U°¼¶¡¶Z',\r
+insert_image_hspace : '¹Ï¹³¥ª¥kÃ䶡¶Z',\r
+insert_image_align : '««ª½¹ï»ô',\r
+insert_image_align_default : '-- ¥¼³]¸m --',\r
+insert_image_align_baseline : '©³½u',\r
+insert_image_align_top : '³»ºÝ',\r
+insert_image_align_middle : '¤¤½u',\r
+insert_image_align_bottom : '©³³¡',\r
+insert_image_align_texttop : '¤å¦r³»ºÝ',\r
+insert_image_align_absmiddle : 'µ´¹ï¤¤½u',\r
+insert_image_align_absbottom : 'µ´¹ï©³³¡',\r
+insert_image_align_left : '¥ª',\r
+insert_image_align_right : '¥k',\r
+theme_font_size : '-- ¦rÅé¤j¤p --',\r
+theme_fontdefault : '-- ¦rÅé¿ï¾Ü --',\r
+theme_block : '-- ®æ¦¡ --',\r
+theme_paragraph : '¬q¸¨',\r
+theme_div : '¤À¬É',\r
+theme_address : '¦ì¸m',\r
+theme_pre : '¤º©w®æ¦¡',\r
+theme_h1 : '¼ÐÃD¤@',\r
+theme_h2 : '¼ÐÃD¤G',\r
+theme_h3 : '¼ÐÃD¤T',\r
+theme_h4 : '¼ÐÃD¥|',\r
+theme_h5 : '¼ÐÃD¤­',\r
+theme_h6 : '¼ÐÃD¤»',\r
+theme_colorpicker_title : '¿ï¨úÃC¦â',\r
+theme_colorpicker_apply : '®M¥Î',\r
+theme_forecolor_desc : '¿ï¨ú¤å¦rÃC¦â',\r
+theme_backcolor_desc : '¿ï¨ú­I´ºÃC¦â',\r
+theme_charmap_title : '¿ï¨ú¦Û­q¦r¤¸',\r
+theme_charmap_desc : '´¡¤J¦Û­q¦r¤¸',\r
+theme_visualaid_desc : '¤Á´««ü¥Ü©Î«D¥i¨£¤¸¥ó',\r
+insert_anchor_title : '´¡¤J©Î½s¿è³sµ²ÂI',\r
+insert_anchor_name : '³sµ²ÂI¦WºÙ',\r
+theme_anchor_desc : '´¡¤J©Î½s¿è³sµ²ÂI',\r
+theme_insert_link_titlefield : '¼ÐÃD',\r
+theme_clipboard_msg : '¦b Mozilla ©M Firefox ¤¤µLªk¨Ï¥Î½Æ»s©Î°Å¤U©Î¶K¤W¥\¯à¡C\n»Ý­n§ó¦hÃö©ó¦¹ªº°T®§¶Ü¡H',\r
+theme_path : '¸ô®|',\r
+cut_desc : '°Å¤U',\r
+copy_desc : '½Æ»s',\r
+paste_desc : '¶K¤W',\r
+link_list : '³sµ²¦Cªí',\r
+image_list : '¹ÏÀɦCªí',\r
+browse : 'ÂsÄý',\r
+image_props_desc : '¹ÏÀÉÄÝ©Ê',\r
+newdocument_desc : '·s¤å¥ó',\r
+class_name : '¤ÀÃþ',\r
+newdocument : '½T©w­n²M°£¥þ³¡¤º®e¡H',\r
+about_title : 'Ãö©ó TinyMCE',\r
+about : 'Ãö©ó',\r
+license : '±ÂÅv',\r
+plugins : 'À³¥Î®M¥ó',\r
+plugin : 'À³¥Î®M¥ó',\r
+author : '§@ªÌ',\r
+version : 'ª©¥»',\r
+loaded_plugins : '¤w¸ü¤JÀ³¥Î®M¥ó',\r
+help : '¨ó§U',\r
+not_set : '-- ¥¼³]¸m --',\r
+close : 'Ãö³¬',\r
+toolbar_focus : '§Ö³t±Ò¥Î¤u¨ã¯Ã - Alt+Q¡F§Ö³t±Ò¥Î½s¿è¾¹ - Alt-Z¡F§Ö³t²¾¦Ü¤¸¥ó¸ô®| - Alt-X'\r
+});\r
diff --git a/webcit/tiny_mce/themes/advanced/langs/zh_tw_utf8.js b/webcit/tiny_mce/themes/advanced/langs/zh_tw_utf8.js
new file mode 100644 (file)
index 0000000..c45307a
--- /dev/null
@@ -0,0 +1,78 @@
+// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com\r
+// 繁體中文 UTF-8 ;數位應用坊製作; twapweb_AT_gmail_DOT_com\r
+\r
+\r
+tinyMCE.addToLang('',{\r
+theme_style_select : '-- 式樣 --',\r
+theme_code_desc : '編輯 HTML 碼',\r
+theme_code_title : 'HTML 碼編輯器',\r
+theme_code_wordwrap : '字詞環繞',\r
+theme_sub_desc : '下標',\r
+theme_sup_desc : '上標',\r
+theme_hr_desc : '插入水平線',\r
+theme_removeformat_desc : '清除格式設定',\r
+theme_custom1_desc : '自訂說明在此輸入',\r
+insert_image_border : '框線',\r
+insert_image_dimensions : '尺寸',\r
+insert_image_vspace : '圖像上下側間距',\r
+insert_image_hspace : '圖像左右邊間距',\r
+insert_image_align : '垂直對齊',\r
+insert_image_align_default : '-- 未設置 --',\r
+insert_image_align_baseline : '底線',\r
+insert_image_align_top : '頂端',\r
+insert_image_align_middle : '中線',\r
+insert_image_align_bottom : '底部',\r
+insert_image_align_texttop : '文字頂端',\r
+insert_image_align_absmiddle : '絕對中線',\r
+insert_image_align_absbottom : '絕對底部',\r
+insert_image_align_left : '左',\r
+insert_image_align_right : '右',\r
+theme_font_size : '-- 字體大小 --',\r
+theme_fontdefault : '-- 字體選擇 --',\r
+theme_block : '-- 格式 --',\r
+theme_paragraph : '段落',\r
+theme_div : '分界',\r
+theme_address : '位置',\r
+theme_pre : '內定格式',\r
+theme_h1 : '標題一',\r
+theme_h2 : '標題二',\r
+theme_h3 : '標題三',\r
+theme_h4 : '標題四',\r
+theme_h5 : '標題五',\r
+theme_h6 : '標題六',\r
+theme_colorpicker_title : '選取顏色',\r
+theme_colorpicker_apply : '套用',\r
+theme_forecolor_desc : '選取文字顏色',\r
+theme_backcolor_desc : '選取背景顏色',\r
+theme_charmap_title : '選取自訂字元',\r
+theme_charmap_desc : '插入自訂字元',\r
+theme_visualaid_desc : '切換指示或非可見元件',\r
+insert_anchor_title : '插入或編輯連結點',\r
+insert_anchor_name : '連結點名稱',\r
+theme_anchor_desc : '插入或編輯連結點',\r
+theme_insert_link_titlefield : '標題',\r
+theme_clipboard_msg : '在 Mozilla 和 Firefox 中無法使用複製或剪下或貼上功能。\n需要更多關於此的訊息嗎?',\r
+theme_path : '路徑',\r
+cut_desc : '剪下',\r
+copy_desc : '複製',\r
+paste_desc : '貼上',\r
+link_list : '連結列表',\r
+image_list : '圖檔列表',\r
+browse : '瀏覽',\r
+image_props_desc : '圖檔屬性',\r
+newdocument_desc : '新文件',\r
+class_name : '分類',\r
+newdocument : '確定要清除全部內容?',\r
+about_title : '關於 TinyMCE',\r
+about : '關於',\r
+license : '授權',\r
+plugins : '應用套件',\r
+plugin : '應用套件',\r
+author : '作者',\r
+version : '版本',\r
+loaded_plugins : '已載入應用套件',\r
+help : '協助',\r
+not_set : '-- 未設置 --',\r
+close : '關閉',\r
+toolbar_focus : '快速啟用工具紐 - Alt+Q;快速啟用編輯器 - Alt-Z;快速移至元件路徑 - Alt-X'\r
+});\r
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..c61994d
--- /dev/null
@@ -0,0 +1,92 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_insert_link_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/link.js"></script>\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+<form onsubmit="insertLink();return false;">\r
+  <table border="0" cellpadding="0" cellspacing="0" width="100">\r
+    <tr>\r
+      <td align="center" valign="middle"><table border="0" cellpadding="4" cellspacing="0">\r
+          <tr>\r
+            <td colspan="2" class="title" nowrap="nowrap">{$lang_insert_link_title}</td>\r
+          </tr>\r
+          <tr>\r
+            <td nowrap="nowrap">{$lang_insert_link_url}:</td>\r
+            <td>              <table border="0" cellspacing="0" cellpadding="0">\r
+                <tr>\r
+                  <td><input name="href" type="text" id="href" value="" style="width: 200px"></td>\r
+                  <td id="hrefbrowsercontainer">&nbsp;</td>\r
+                </tr>\r
+              </table></td>\r
+          </tr>\r
+                 <!-- Link list -->\r
+                 <script language="javascript">\r
+                       if (typeof(tinyMCELinkList) != "undefined" && tinyMCELinkList.length > 0) {\r
+                               var html = "";\r
+\r
+                               html += '<tr><td>{$lang_link_list}:</td>';\r
+                               html += '<td><select name="link_list" style="width: 200px" onchange="this.form.href.value=this.options[this.selectedIndex].value;">';\r
+                               html += '<option value="">---</option>';\r
+\r
+                               for (var i=0; i<tinyMCELinkList.length; i++)\r
+                                       html += '<option value="' + tinyMCELinkList[i][1] + '">' + tinyMCELinkList[i][0] + '</option>';\r
+\r
+                               html += '</select></td></tr>';\r
+\r
+                               document.write(html);\r
+                       }\r
+                 </script>\r
+                 <!-- /Link list -->\r
+          <tr>\r
+            <td nowrap="nowrap">{$lang_insert_link_target}:</td>\r
+            <td><select name="target" style="width: 200px">\r
+                <option value="_self">{$lang_insert_link_target_same}</option>\r
+                <option value="_blank">{$lang_insert_link_target_blank}</option>\r
+                               <script language="javascript">\r
+                                       var html = "";\r
+                                       var targets = tinyMCE.getParam('theme_advanced_link_targets', '').split(';');\r
+\r
+                                       for (var i=0; i<targets.length; i++) {\r
+                                               var key, value;\r
+\r
+                                               if (targets[i] == "")\r
+                                                       continue;\r
+\r
+                                               key = targets[i].split('=')[0];\r
+                                               value = targets[i].split('=')[1];\r
+\r
+                                               html += '<option value="' + value + '">' + key + '</option>';\r
+                                       }\r
+\r
+                                       document.write(html);\r
+                               </script>\r
+            </select></td>\r
+          </tr>\r
+          <tr>\r
+            <td nowrap="nowrap">{$lang_theme_insert_link_titlefield}:</td>\r
+            <td><input name="linktitle" type="text" id="linktitle" value="" style="width: 200px"></td>\r
+          </tr>\r
+          <tr id="styleSelectRow">\r
+            <td>{$lang_class_name}:</td>\r
+            <td>\r
+                        <select id="styleSelect" name="styleSelect">\r
+                <option value="" selected>{$lang_theme_style_select}</option>\r
+             </select></td>\r
+            <td align="right">&nbsp;</td>\r
+            <td align="right">&nbsp;</td>\r
+          </tr>\r
+          <tr>\r
+            <td><input type="button" id="insert" name="insert" value="{$lang_insert}" onclick="insertLink();">\r
+            </td>\r
+            <td align="right"><input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();"></td>\r
+          </tr>\r
+        </table></td>\r
+    </tr>\r
+  </table>\r
+</form>\r
+</body>\r
+</html>\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..a671fb0
--- /dev/null
@@ -0,0 +1,30 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />\r
+       <title>{$lang_theme_code_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/source_editor.js"></script>\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('onLoadInit();');" onresize="resizeInputs();" style="display: none">\r
+       <form name="source" onsubmit="saveContent();" action="#">\r
+               <div style="float: left" class="title">{$lang_theme_code_title}</div>\r
+\r
+               <div style="float: right">\r
+                       <script language="javascript" type="text/javascript">renderWordWrap();</script>\r
+               </div>\r
+\r
+               <textarea name="htmlSource" id="htmlSource" rows="15" cols="100" style="width: 100%; height: 100%; font-family: 'Courier New',Courier,mono; font-size: 12px;" dir="ltr" wrap="soft"></textarea>\r
+\r
+               <div class="mceActionPanel">\r
+                       <div style="float: left">\r
+                               <input type="button" name="insert" value="{$lang_update}" onclick="saveContent();" id="insert" />\r
+                       </div>\r
+\r
+                       <div style="float: right">\r
+                               <input type="button" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" id="cancel" />\r
+                       </div>\r
+               </div>\r
+       </form>\r
+</body>\r
+</html>\r
diff --git a/webcit/tiny_mce/themes/simple/css/editor_content.css b/webcit/tiny_mce/themes/simple/css/editor_content.css
new file mode 100644 (file)
index 0000000..75290ee
--- /dev/null
@@ -0,0 +1,27 @@
+body {\r
+       background-color: #FFFFFF;\r
+       font-family: Verdana, Arial, Helvetica, sans-serif;\r
+       font-size: 10px;\r
+       scrollbar-3dlight-color: #F0F0EE;\r
+       scrollbar-arrow-color: #676662;\r
+       scrollbar-base-color: #F0F0EE;\r
+       scrollbar-darkshadow-color: #DDDDDD;\r
+       scrollbar-face-color: #E0E0DD;\r
+       scrollbar-highlight-color: #F0F0EE;\r
+       scrollbar-shadow-color: #F0F0EE;\r
+       scrollbar-track-color: #F5F5F5;\r
+}\r
+\r
+td {\r
+       font-family: Verdana, Arial, Helvetica, sans-serif;\r
+       font-size: 10px;\r
+}\r
+\r
+pre {\r
+       font-family: Verdana, Arial, Helvetica, sans-serif;\r
+       font-size: 10px;\r
+}\r
+\r
+.mceVisualAid {\r
+       border: 1px dashed #BBBBBB;\r
+}\r
diff --git a/webcit/tiny_mce/themes/simple/css/editor_popup.css b/webcit/tiny_mce/themes/simple/css/editor_popup.css
new file mode 100644 (file)
index 0000000..81a58d5
--- /dev/null
@@ -0,0 +1,41 @@
+body {\r
+       background-color: #F0F0EE;\r
+       font-family: Verdana, Arial, Helvetica, sans-serif;\r
+       font-size: 11px;\r
+       scrollbar-3dlight-color: #F0F0EE;\r
+       scrollbar-arrow-color: #676662;\r
+       scrollbar-base-color: #F0F0EE;\r
+       scrollbar-darkshadow-color: #DDDDDD;\r
+       scrollbar-face-color: #E0E0DD;\r
+       scrollbar-highlight-color: #F0F0EE;\r
+       scrollbar-shadow-color: #F0F0EE;\r
+       scrollbar-track-color: #F5F5F5;\r
+}\r
+\r
+td {\r
+       font-family: Verdana, Arial, Helvetica, sans-serif;\r
+       font-size: 11px;\r
+}\r
+\r
+input {\r
+       background: #FFFFFF;\r
+       border: 1px solid #cccccc;\r
+}\r
+\r
+td, input, select, textarea {\r
+       font-family: Verdana, Arial, Helvetica, sans-serif;\r
+       font-size: 10px;\r
+}\r
+\r
+input, select, textarea {\r
+       border: 1px solid #808080;\r
+}\r
+\r
+.input_noborder {\r
+       border: 0px solid #808080;\r
+}\r
+\r
+.title {\r
+       font-size: 12px;\r
+       font-weight: bold;\r
+}
\ No newline at end of file
diff --git a/webcit/tiny_mce/themes/simple/css/editor_ui.css b/webcit/tiny_mce/themes/simple/css/editor_ui.css
new file mode 100644 (file)
index 0000000..88d42e6
--- /dev/null
@@ -0,0 +1,92 @@
+.mceButtonNormal, .mceButtonOver, .mceButtonDown, .mceSeparator, .mceButtonDisabled, .mceButtonSelected {\r
+       margin-top: 1px;\r
+       margin-left: 1px;\r
+}\r
+\r
+.mceButtonNormal {\r
+       border: 1px solid #F0F0EE !important;\r
+       cursor: arrow;\r
+}\r
+\r
+.mceButtonOver {\r
+       border: 1px solid #0A246A;\r
+       cursor: arrow;\r
+       background-color: #B6BDD2;\r
+}\r
+\r
+.mceButtonDown {\r
+       cursor: arrow;\r
+       border: 1px solid #0A246A;\r
+       background-color: #8592B5;\r
+}\r
+\r
+.mceButtonSelected {\r
+       border: 1px solid;\r
+       border-color: #C0C0BB;\r
+       cursor: arrow;\r
+}\r
+\r
+.mceButtonDisabled {\r
+       filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);\r
+       -moz-opacity:0.3;\r
+       opacity: 0.3;\r
+       border: 1px solid #F0F0EE !important;\r
+       cursor: arrow;\r
+}\r
+\r
+.mceSeparator {\r
+       border-top: 1px solid buttonhighlight;\r
+       border-left: 1px solid buttonhighlight;\r
+       border-bottom: 1px solid buttonshadow;\r
+       border-right: 1px solid buttonshadow;\r
+       margin-right: 2px;\r
+       margin-left: 2px;\r
+}\r
+\r
+.mceSeparatorLine {\r
+       margin:2px;\r
+       margin-left: 4px;\r
+       background-color: #F0F0EE;\r
+       border-top: 1px solid buttonshadow;\r
+       border-left: 1px solid buttonshadow;\r
+       border-bottom: 1px solid buttonhighlight;\r
+       border-right: 1px solid buttonhighlight;\r
+       width: 0px;\r
+       height: 15px;\r
+}\r
+\r
+.mceSelectList {\r
+       font-family: "MS Sans Serif";\r
+       font-size: 7pt;\r
+       font-weight: normal;\r
+       margin-top: 2px;\r
+}\r
+\r
+.mceLabel, .mceLabelDisabled {\r
+       font-family: "MS Sans Serif";\r
+       font-size: 9pt;\r
+}\r
+\r
+.mceLabel {\r
+       color: #000000;\r
+}\r
+\r
+.mceLabelDisabled {\r
+       cursor: text;\r
+       color: #999999;\r
+}\r
+\r
+.mceEditor {\r
+       background: #F0F0EE;\r
+       border: 1px solid #cccccc;\r
+}\r
+\r
+.mceEditorArea {\r
+       font-family: "MS Sans Serif";\r
+       background: #FFFFFF;\r
+}\r
+\r
+.mceToolbar {\r
+       background: #F0F0EE;\r
+       border-top: 1px solid #cccccc;\r
+}
\ No newline at end of file
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..4d44783
--- /dev/null
@@ -0,0 +1,20 @@
+function TinyMCE_simple_getEditorTemplate(){var template=new Array();template['html']='\\r
+<table class="mceEditor" border="0" cellpadding="0" cellspacing="0" width="{$width}" height="{$height}">\\r
+<tr><td align="center">\\r
+<span id="{$editor_id}">IFRAME</span>\\r
+</td></tr>\\r
+<tr><td class="mceToolbar" align="center" height="1">\\r
+<a href="javascript:void(0);" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Bold\');" onmousedown="return false;"><img id="{$editor_id}_bold" src="{$themeurl}/images/{$lang_bold_img}" title="{$lang_bold_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');"></a>\\r
+<a href="javascript:void(0);" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Italic\');" onmousedown="return false;"><img id="{$editor_id}_italic" src="{$themeurl}/images/{$lang_italic_img}" title="{$lang_italic_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');">\\r
+<a href="javascript:void(0);" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Underline\');" onmousedown="return false;"><img id="{$editor_id}_underline" src="{$themeurl}/images/{$lang_underline_img}" title="{$lang_underline_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');">\\r
+<a href="javascript:void(0);" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Strikethrough\');" onmousedown="return false;"><img id="{$editor_id}_strikethrough" src="{$themeurl}/images/strikethrough.gif" title="{$lang_striketrough_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');">\\r
+<img src="{$themeurl}/images/spacer.gif" width="1" height="15" class="mceSeparatorLine">\\r
+<a href="javascript:void(0);" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Undo\');" onmousedown="return false;"><img src="{$themeurl}/images/undo.gif" title="{$lang_undo_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');">\\r
+<a href="javascript:void(0);" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Redo\');" onmousedown="return false;"><img src="{$themeurl}/images/redo.gif" title="{$lang_redo_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');">\\r
+<img src="{$themeurl}/images/spacer.gif" width="1" height="15" class="mceSeparatorLine">\\r
+<a href="javascript:void(0);" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceCleanup\');" onmousedown="return false;"><img src="{$themeurl}/images/cleanup.gif" title="{$lang_cleanup_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');">\\r
+<img src="{$themeurl}/images/spacer.gif" width="1" height="15" class="mceSeparatorLine">\\r
+<a href="javascript:void(0);" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'InsertUnorderedList\');" onmousedown="return false;"><img id="{$editor_id}_bullist" src="{$themeurl}/images/bullist.gif" title="{$lang_bullist_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');">\\r
+<a href="javascript:void(0);" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'InsertOrderedList\');" onmousedown="return false;"><img id="{$editor_id}_numlist" src="{$themeurl}/images/numlist.gif" title="{$lang_numlist_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');">\\r
+</td></tr>\\r
+</table>';template['delta_width']=0;template['delta_height']=-20;return template;}function TinyMCE_simple_handleNodeChange(editor_id,node){tinyMCE.switchClassSticky(editor_id+'_bold','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_italic','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_underline','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_strikethrough','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_bullist','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_numlist','mceButtonNormal');do{switch(node.nodeName.toLowerCase()){case "b":case "strong":tinyMCE.switchClassSticky(editor_id+'_bold','mceButtonSelected');break;case "i":case "em":tinyMCE.switchClassSticky(editor_id+'_italic','mceButtonSelected');break;case "u":tinyMCE.switchClassSticky(editor_id+'_underline','mceButtonSelected');break;case "strike":tinyMCE.switchClassSticky(editor_id+'_strikethrough','mceButtonSelected');break;case "ul":tinyMCE.switchClassSticky(editor_id+'_bullist','mceButtonSelected');break;case "ol":tinyMCE.switchClassSticky(editor_id+'_numlist','mceButtonSelected');break;}}while((node=node.parentNode)!=null);}
\ 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..66eca18
--- /dev/null
@@ -0,0 +1,70 @@
+function TinyMCE_simple_getEditorTemplate() {\r
+       var template = new Array();\r
+\r
+       template['html'] = '\\r
+<table class="mceEditor" border="0" cellpadding="0" cellspacing="0" width="{$width}" height="{$height}">\\r
+<tr><td align="center">\\r
+<span id="{$editor_id}">IFRAME</span>\\r
+</td></tr>\\r
+<tr><td class="mceToolbar" align="center" height="1">\\r
+<a href="javascript:void(0);" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Bold\');" onmousedown="return false;"><img id="{$editor_id}_bold" src="{$themeurl}/images/{$lang_bold_img}" title="{$lang_bold_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');"></a>\\r
+<a href="javascript:void(0);" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Italic\');" onmousedown="return false;"><img id="{$editor_id}_italic" src="{$themeurl}/images/{$lang_italic_img}" title="{$lang_italic_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');">\\r
+<a href="javascript:void(0);" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Underline\');" onmousedown="return false;"><img id="{$editor_id}_underline" src="{$themeurl}/images/{$lang_underline_img}" title="{$lang_underline_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');">\\r
+<a href="javascript:void(0);" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Strikethrough\');" onmousedown="return false;"><img id="{$editor_id}_strikethrough" src="{$themeurl}/images/strikethrough.gif" title="{$lang_striketrough_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');">\\r
+<img src="{$themeurl}/images/spacer.gif" width="1" height="15" class="mceSeparatorLine">\\r
+<a href="javascript:void(0);" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Undo\');" onmousedown="return false;"><img src="{$themeurl}/images/undo.gif" title="{$lang_undo_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');">\\r
+<a href="javascript:void(0);" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Redo\');" onmousedown="return false;"><img src="{$themeurl}/images/redo.gif" title="{$lang_redo_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');">\\r
+<img src="{$themeurl}/images/spacer.gif" width="1" height="15" class="mceSeparatorLine">\\r
+<a href="javascript:void(0);" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceCleanup\');" onmousedown="return false;"><img src="{$themeurl}/images/cleanup.gif" title="{$lang_cleanup_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');">\\r
+<img src="{$themeurl}/images/spacer.gif" width="1" height="15" class="mceSeparatorLine">\\r
+<a href="javascript:void(0);" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'InsertUnorderedList\');" onmousedown="return false;"><img id="{$editor_id}_bullist" src="{$themeurl}/images/bullist.gif" title="{$lang_bullist_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');">\\r
+<a href="javascript:void(0);" onclick="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'InsertOrderedList\');" onmousedown="return false;"><img id="{$editor_id}_numlist" src="{$themeurl}/images/numlist.gif" title="{$lang_numlist_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');">\\r
+</td></tr>\\r
+</table>';\r
+\r
+       template['delta_width'] = 0;\r
+       template['delta_height'] = -20;\r
+\r
+       return template;\r
+}\r
+\r
+function TinyMCE_simple_handleNodeChange(editor_id, node) {\r
+       // Reset old states\r
+       tinyMCE.switchClassSticky(editor_id + '_bold', 'mceButtonNormal');\r
+       tinyMCE.switchClassSticky(editor_id + '_italic', 'mceButtonNormal');\r
+       tinyMCE.switchClassSticky(editor_id + '_underline', 'mceButtonNormal');\r
+       tinyMCE.switchClassSticky(editor_id + '_strikethrough', 'mceButtonNormal');\r
+       tinyMCE.switchClassSticky(editor_id + '_bullist', 'mceButtonNormal');\r
+       tinyMCE.switchClassSticky(editor_id + '_numlist', 'mceButtonNormal');\r
+\r
+       // Handle elements\r
+       do {\r
+               switch (node.nodeName.toLowerCase()) {\r
+                       case "b":\r
+                       case "strong":\r
+                               tinyMCE.switchClassSticky(editor_id + '_bold', 'mceButtonSelected');\r
+                       break;\r
+\r
+                       case "i":\r
+                       case "em":\r
+                               tinyMCE.switchClassSticky(editor_id + '_italic', 'mceButtonSelected');\r
+                       break;\r
+\r
+                       case "u":\r
+                               tinyMCE.switchClassSticky(editor_id + '_underline', 'mceButtonSelected');\r
+                       break;\r
+\r
+                       case "strike":\r
+                               tinyMCE.switchClassSticky(editor_id + '_strikethrough', 'mceButtonSelected');\r
+                       break;\r
+                       \r
+                       case "ul":\r
+                               tinyMCE.switchClassSticky(editor_id + '_bullist', 'mceButtonSelected');\r
+                       break;\r
+\r
+                       case "ol":\r
+                               tinyMCE.switchClassSticky(editor_id + '_numlist', 'mceButtonSelected');\r
+                       break;\r
+               }\r
+       } while ((node = node.parentNode) != null);\r
+}\r
diff --git a/webcit/tiny_mce/themes/simple/images/bold.gif b/webcit/tiny_mce/themes/simple/images/bold.gif
new file mode 100644 (file)
index 0000000..d6a9cc2
Binary files /dev/null and b/webcit/tiny_mce/themes/simple/images/bold.gif differ
diff --git a/webcit/tiny_mce/themes/simple/images/bold_de_se.gif b/webcit/tiny_mce/themes/simple/images/bold_de_se.gif
new file mode 100644 (file)
index 0000000..9b129de
Binary files /dev/null and b/webcit/tiny_mce/themes/simple/images/bold_de_se.gif differ
diff --git a/webcit/tiny_mce/themes/simple/images/bold_fr.gif b/webcit/tiny_mce/themes/simple/images/bold_fr.gif
new file mode 100644 (file)
index 0000000..2816454
Binary files /dev/null and b/webcit/tiny_mce/themes/simple/images/bold_fr.gif differ
diff --git a/webcit/tiny_mce/themes/simple/images/bold_ru.gif b/webcit/tiny_mce/themes/simple/images/bold_ru.gif
new file mode 100644 (file)
index 0000000..e000d46
Binary files /dev/null and b/webcit/tiny_mce/themes/simple/images/bold_ru.gif differ
diff --git a/webcit/tiny_mce/themes/simple/images/bold_tw.gif b/webcit/tiny_mce/themes/simple/images/bold_tw.gif
new file mode 100644 (file)
index 0000000..8208543
Binary files /dev/null and b/webcit/tiny_mce/themes/simple/images/bold_tw.gif differ
diff --git a/webcit/tiny_mce/themes/simple/images/bullist.gif b/webcit/tiny_mce/themes/simple/images/bullist.gif
new file mode 100644 (file)
index 0000000..6e19467
Binary files /dev/null and b/webcit/tiny_mce/themes/simple/images/bullist.gif differ
diff --git a/webcit/tiny_mce/themes/simple/images/cleanup.gif b/webcit/tiny_mce/themes/simple/images/cleanup.gif
new file mode 100644 (file)
index 0000000..16491f6
Binary files /dev/null and b/webcit/tiny_mce/themes/simple/images/cleanup.gif differ
diff --git a/webcit/tiny_mce/themes/simple/images/italic.gif b/webcit/tiny_mce/themes/simple/images/italic.gif
new file mode 100644 (file)
index 0000000..8bb330b
Binary files /dev/null and b/webcit/tiny_mce/themes/simple/images/italic.gif differ
diff --git a/webcit/tiny_mce/themes/simple/images/italic_de_se.gif b/webcit/tiny_mce/themes/simple/images/italic_de_se.gif
new file mode 100644 (file)
index 0000000..feb0309
Binary files /dev/null and b/webcit/tiny_mce/themes/simple/images/italic_de_se.gif differ
diff --git a/webcit/tiny_mce/themes/simple/images/italic_ru.gif b/webcit/tiny_mce/themes/simple/images/italic_ru.gif
new file mode 100644 (file)
index 0000000..a2bb69a
Binary files /dev/null and b/webcit/tiny_mce/themes/simple/images/italic_ru.gif differ
diff --git a/webcit/tiny_mce/themes/simple/images/italic_tw.gif b/webcit/tiny_mce/themes/simple/images/italic_tw.gif
new file mode 100644 (file)
index 0000000..4f6eeaa
Binary files /dev/null and b/webcit/tiny_mce/themes/simple/images/italic_tw.gif differ
diff --git a/webcit/tiny_mce/themes/simple/images/numlist.gif b/webcit/tiny_mce/themes/simple/images/numlist.gif
new file mode 100644 (file)
index 0000000..a268352
Binary files /dev/null and b/webcit/tiny_mce/themes/simple/images/numlist.gif differ
diff --git a/webcit/tiny_mce/themes/simple/images/redo.gif b/webcit/tiny_mce/themes/simple/images/redo.gif
new file mode 100644 (file)
index 0000000..3af9069
Binary files /dev/null and b/webcit/tiny_mce/themes/simple/images/redo.gif differ
diff --git a/webcit/tiny_mce/themes/simple/images/spacer.gif b/webcit/tiny_mce/themes/simple/images/spacer.gif
new file mode 100644 (file)
index 0000000..3884865
Binary files /dev/null and b/webcit/tiny_mce/themes/simple/images/spacer.gif differ
diff --git a/webcit/tiny_mce/themes/simple/images/strikethrough.gif b/webcit/tiny_mce/themes/simple/images/strikethrough.gif
new file mode 100644 (file)
index 0000000..3264635
Binary files /dev/null and b/webcit/tiny_mce/themes/simple/images/strikethrough.gif differ
diff --git a/webcit/tiny_mce/themes/simple/images/underline.gif b/webcit/tiny_mce/themes/simple/images/underline.gif
new file mode 100644 (file)
index 0000000..1dfeb5f
Binary files /dev/null and b/webcit/tiny_mce/themes/simple/images/underline.gif differ
diff --git a/webcit/tiny_mce/themes/simple/images/underline_fr.gif b/webcit/tiny_mce/themes/simple/images/underline_fr.gif
new file mode 100644 (file)
index 0000000..551d914
Binary files /dev/null and b/webcit/tiny_mce/themes/simple/images/underline_fr.gif differ
diff --git a/webcit/tiny_mce/themes/simple/images/underline_ru.gif b/webcit/tiny_mce/themes/simple/images/underline_ru.gif
new file mode 100644 (file)
index 0000000..b78e2a4
Binary files /dev/null and b/webcit/tiny_mce/themes/simple/images/underline_ru.gif differ
diff --git a/webcit/tiny_mce/themes/simple/images/underline_tw.gif b/webcit/tiny_mce/themes/simple/images/underline_tw.gif
new file mode 100644 (file)
index 0000000..b715390
Binary files /dev/null and b/webcit/tiny_mce/themes/simple/images/underline_tw.gif differ
diff --git a/webcit/tiny_mce/themes/simple/images/undo.gif b/webcit/tiny_mce/themes/simple/images/undo.gif
new file mode 100644 (file)
index 0000000..520796d
Binary files /dev/null and b/webcit/tiny_mce/themes/simple/images/undo.gif differ
diff --git a/webcit/tiny_mce/tiny_mce.js b/webcit/tiny_mce/tiny_mce.js
new file mode 100644 (file)
index 0000000..05e29c9
--- /dev/null
@@ -0,0 +1,3 @@
+function TinyMCE(){this.majorVersion="2";this.minorVersion="0";this.releaseDate="2005-12-01";this.instances=new Array();this.stickyClassesLookup=new Array();this.windowArgs=new Array();this.loadedFiles=new Array();this.configs=new Array();this.currentConfig=0;this.eventHandlers=new Array();var ua=navigator.userAgent;this.isMSIE=(navigator.appName=="Microsoft Internet Explorer");this.isMSIE5=this.isMSIE&&(ua.indexOf('MSIE 5')!=-1);this.isMSIE5_0=this.isMSIE&&(ua.indexOf('MSIE 5.0')!=-1);this.isGecko=ua.indexOf('Gecko')!=-1;this.isSafari=ua.indexOf('Safari')!=-1;this.isOpera=ua.indexOf('Opera')!=-1;this.isMac=ua.indexOf('Mac')!=-1;this.isNS7=ua.indexOf('Netscape/7')!=-1;this.isNS71=ua.indexOf('Netscape/7.1')!=-1;this.dialogCounter=0;if(this.isOpera){this.isMSIE=true;this.isGecko=false;this.isSafari=false;}this.idCounter=0;};TinyMCE.prototype.defParam=function(key,def_val){this.settings[key]=tinyMCE.getParam(key,def_val);};TinyMCE.prototype.init=function(settings){var theme;this.settings=settings;if(typeof(document.execCommand)=='undefined')return;if(!tinyMCE.baseURL){var elements=document.getElementsByTagName('script');for(var i=0;i<elements.length;i++){if(elements[i].src&&(elements[i].src.indexOf("tiny_mce.js")!=-1||elements[i].src.indexOf("tiny_mce_src.js")!=-1||elements[i].src.indexOf("tiny_mce_gzip")!=-1)){var src=elements[i].src;tinyMCE.srcMode=(src.indexOf('_src')!=-1)?'_src':'';src=src.substring(0,src.lastIndexOf('/'));tinyMCE.baseURL=src;break;}}}this.documentBasePath=document.location.href;if(this.documentBasePath.indexOf('?')!=-1)this.documentBasePath=this.documentBasePath.substring(0,this.documentBasePath.indexOf('?'));this.documentURL=this.documentBasePath;this.documentBasePath=this.documentBasePath.substring(0,this.documentBasePath.lastIndexOf('/'));if(tinyMCE.baseURL.indexOf('://')==-1&&tinyMCE.baseURL.charAt(0)!='/'){tinyMCE.baseURL=this.documentBasePath+"/"+tinyMCE.baseURL;}this.defParam("mode","none");this.defParam("theme","advanced");this.defParam("plugins","",true);this.defParam("language","en");this.defParam("docs_language",this.settings['language']);this.defParam("elements","");this.defParam("textarea_trigger","mce_editable");this.defParam("editor_selector","");this.defParam("editor_deselector","mceNoEditor");this.defParam("valid_elements","+a[id|style|rel|rev|charset|hreflang|dir|lang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],-strong/b[class|style],-em/i[class|style],-strike[class|style],-u[class|style],+p[style|dir|class|align],-ol[class|style],-ul[class|style],-li[class|style],br,img[id|dir|lang|longdesc|usemap|style|class|src|onmouseover|onmouseout|border=0|alt|title|hspace|vspace|width|height|align],-sub[style|class],-sup[style|class],-blockquote[dir|style],-table[border=0|cellspacing|cellpadding|width|height|class|align|summary|style|dir|id|lang|bgcolor|background|bordercolor],-tr[id|lang|dir|class|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor],tbody[id|class],thead[id|class],tfoot[id|class],-td[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor|scope],-th[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|scope],caption[id|lang|dir|class|style],-div[id|dir|class|align|style],-span[style|class|align],-pre[class|align|style],address[class|align|style],-h1[style|dir|class|align],-h2[style|dir|class|align],-h3[style|dir|class|align],-h4[style|dir|class|align],-h5[style|dir|class|align],-h6[style|dir|class|align],hr[class|style],font[face|size|style|id|class|dir|color]");this.defParam("extended_valid_elements","");this.defParam("invalid_elements","");this.defParam("encoding","");this.defParam("urlconverter_callback",tinyMCE.getParam("urlconvertor_callback","TinyMCE.prototype.convertURL"));this.defParam("save_callback","");this.defParam("debug",false);this.defParam("force_br_newlines",false);this.defParam("force_p_newlines",true);this.defParam("add_form_submit_trigger",true);this.defParam("relative_urls",true);this.defParam("remove_script_host",true);this.defParam("focus_alert",true);this.defParam("document_base_url",this.documentURL);this.defParam("visual",true);this.defParam("visual_table_class","mceVisualAid");this.defParam("setupcontent_callback","");this.defParam("fix_content_duplication",true);this.defParam("custom_undo_redo",true);this.defParam("custom_undo_redo_levels",-1);this.defParam("custom_undo_redo_keyboard_shortcuts",true);this.defParam("verify_css_classes",false);this.defParam("verify_html",true);this.defParam("apply_source_formatting",false);this.defParam("directionality","ltr");this.defParam("cleanup_on_startup",false);this.defParam("inline_styles",false);this.defParam("convert_newlines_to_brs",false);this.defParam("auto_reset_designmode",true);this.defParam("entities","160,nbsp,38,amp,34,quot,162,cent,8364,euro,163,pound,165,yen,169,copy,174,reg,8482,trade,8240,permil,181,micro,183,middot,8226,bull,8230,hellip,8242,prime,8243,Prime,167,sect,182,para,223,szlig,8249,lsaquo,8250,rsaquo,171,laquo,187,raquo,8216,lsquo,8217,rsquo,8220,ldquo,8221,rdquo,8218,sbquo,8222,bdquo,60,lt,62,gt,8804,le,8805,ge,8211,ndash,8212,mdash,175,macr,8254,oline,164,curren,166,brvbar,168,uml,161,iexcl,191,iquest,710,circ,732,tilde,176,deg,8722,minus,177,plusmn,247,divide,8260,frasl,215,times,185,sup1,178,sup2,179,sup3,188,frac14,189,frac12,190,frac34,402,fnof,8747,int,8721,sum,8734,infin,8730,radic,8764,sim,8773,cong,8776,asymp,8800,ne,8801,equiv,8712,isin,8713,notin,8715,ni,8719,prod,8743,and,8744,or,172,not,8745,cap,8746,cup,8706,part,8704,forall,8707,exist,8709,empty,8711,nabla,8727,lowast,8733,prop,8736,ang,180,acute,184,cedil,170,ordf,186,ordm,8224,dagger,8225,Dagger,192,Agrave,194,Acirc,195,Atilde,196,Auml,197,Aring,198,AElig,199,Ccedil,200,Egrave,202,Ecirc,203,Euml,204,Igrave,206,Icirc,207,Iuml,208,ETH,209,Ntilde,210,Ograve,212,Ocirc,213,Otilde,214,Ouml,216,Oslash,338,OElig,217,Ugrave,219,Ucirc,220,Uuml,376,Yuml,222,THORN,224,agrave,226,acirc,227,atilde,228,auml,229,aring,230,aelig,231,ccedil,232,egrave,234,ecirc,235,euml,236,igrave,238,icirc,239,iuml,240,eth,241,ntilde,242,ograve,244,ocirc,245,otilde,246,ouml,248,oslash,339,oelig,249,ugrave,251,ucirc,252,uuml,254,thorn,255,yuml,914,Beta,915,Gamma,916,Delta,917,Epsilon,918,Zeta,919,Eta,920,Theta,921,Iota,922,Kappa,923,Lambda,924,Mu,925,Nu,926,Xi,927,Omicron,928,Pi,929,Rho,931,Sigma,932,Tau,933,Upsilon,934,Phi,935,Chi,936,Psi,937,Omega,945,alpha,946,beta,947,gamma,948,delta,949,epsilon,950,zeta,951,eta,952,theta,953,iota,954,kappa,955,lambda,956,mu,957,nu,958,xi,959,omicron,960,pi,961,rho,962,sigmaf,963,sigma,964,tau,965,upsilon,966,phi,967,chi,968,psi,969,omega,8501,alefsym,982,piv,8476,real,977,thetasym,978,upsih,8472,weierp,8465,image,8592,larr,8593,uarr,8594,rarr,8595,darr,8596,harr,8629,crarr,8656,lArr,8657,uArr,8658,rArr,8659,dArr,8660,hArr,8756,there4,8834,sub,8835,sup,8836,nsub,8838,sube,8839,supe,8853,oplus,8855,otimes,8869,perp,8901,sdot,8968,lceil,8969,rceil,8970,lfloor,8971,rfloor,9001,lang,9002,rang,9674,loz,9824,spades,9827,clubs,9829,hearts,9830,diams,8194,ensp,8195,emsp,8201,thinsp,8204,zwnj,8205,zwj,8206,lrm,8207,rlm,173,shy,233,eacute,237,iacute,243,oacute,250,uacute,193,Aacute,225,aacute,201,Eacute,205,Iacute,211,Oacute,218,Uacute,221,Yacute,253,yacute");this.defParam("entity_encoding","named");this.defParam("cleanup_callback","");this.defParam("add_unload_trigger",true);this.defParam("ask",false);this.defParam("nowrap",false);this.defParam("auto_resize",false);this.defParam("auto_focus",false);this.defParam("cleanup",true);this.defParam("remove_linebreaks",true);this.defParam("button_tile_map",false);this.defParam("submit_patch",true);this.defParam("browsers","msie,safari,gecko,opera");this.defParam("dialog_type","window");this.defParam("accessibility_warnings",true);this.defParam("merge_styles_invalid_parents","");this.defParam("force_hex_style_colors",true);this.defParam("trim_span_elements",true);this.defParam("convert_fonts_to_spans",false);this.defParam("doctype",'<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">');this.defParam("font_size_classes",'');this.defParam("font_size_style_values",'xx-small,x-small,small,medium,large,x-large,xx-large');this.defParam("event_elements",'a,img');this.defParam("convert_urls",true);this.defParam("table_inline_editing",false);this.defParam("object_resizing",true);if(this.isMSIE&&this.settings['browsers'].indexOf('msie')==-1)return;if(this.isGecko&&this.settings['browsers'].indexOf('gecko')==-1)return;if(this.isSafari&&this.settings['browsers'].indexOf('safari')==-1)return;if(this.isOpera&&this.settings['browsers'].indexOf('opera')==-1)return;var baseHREF=tinyMCE.settings['document_base_url'];var h=document.location.href;var p=h.indexOf('://');if(p>0&&document.location.protocol!="file:"){p=h.indexOf('/',p+3);h=h.substring(0,p);if(baseHREF.indexOf('://')==-1)baseHREF=h+baseHREF;tinyMCE.settings['document_base_url']=baseHREF;tinyMCE.settings['document_base_prefix']=h;}if(baseHREF.indexOf('?')!=-1)baseHREF=baseHREF.substring(0,baseHREF.indexOf('?'));this.settings['base_href']=baseHREF.substring(0,baseHREF.lastIndexOf('/'))+"/";theme=this.settings['theme'];this.blockRegExp=new RegExp("^(h[1-6]|p|div|address|pre|form|table|li|ol|ul|td|blockquote|center|dl|dir|fieldset|form|noscript|noframes|menu|isindex)$","i");this.posKeyCodes=new Array(13,45,36,35,33,34,37,38,39,40);this.uniqueURL='http://tinymce.moxiecode.cp/mce_temp_url';this.uniqueTag='<div id="mceTMPElement" style="display: none">TMP</div>';this.settings['theme_href']=tinyMCE.baseURL+"/themes/"+theme;if(!tinyMCE.isMSIE)this.settings['force_br_newlines']=false;if(tinyMCE.getParam("content_css",false)){var cssPath=tinyMCE.getParam("content_css","");if(cssPath.indexOf('://')==-1&&cssPath.charAt(0)!='/')this.settings['content_css']=this.documentBasePath+"/"+cssPath;else this.settings['content_css']=cssPath;}else this.settings['content_css']='';if(tinyMCE.getParam("popups_css",false)){var cssPath=tinyMCE.getParam("popups_css","");if(cssPath.indexOf('://')==-1&&cssPath.charAt(0)!='/')this.settings['popups_css']=this.documentBasePath+"/"+cssPath;else this.settings['popups_css']=cssPath;}else this.settings['popups_css']=tinyMCE.baseURL+"/themes/"+theme+"/css/editor_popup.css";if(tinyMCE.getParam("editor_css",false)){var cssPath=tinyMCE.getParam("editor_css","");if(cssPath.indexOf('://')==-1&&cssPath.charAt(0)!='/')this.settings['editor_css']=this.documentBasePath+"/"+cssPath;else this.settings['editor_css']=cssPath;}else this.settings['editor_css']=tinyMCE.baseURL+"/themes/"+theme+"/css/editor_ui.css";if(tinyMCE.settings['debug']){var msg="Debug: \n";msg+="baseURL: "+this.baseURL+"\n";msg+="documentBasePath: "+this.documentBasePath+"\n";msg+="content_css: "+this.settings['content_css']+"\n";msg+="popups_css: "+this.settings['popups_css']+"\n";msg+="editor_css: "+this.settings['editor_css']+"\n";alert(msg);}this._initCleanup();if(this.configs.length==0){if(this.isSafari&&this.getParam('safari_warning',true))alert("Safari support is very limited and should be considered experimental.\nSo there is no need to even submit bugreports on this early version.\nYou can disable this message by setting: safari_warning option to false");tinyMCE.addEvent(window,"load",TinyMCE.prototype.onLoad);if(tinyMCE.isMSIE){if(tinyMCE.settings['add_unload_trigger']){tinyMCE.addEvent(window,"unload",TinyMCE.prototype.unloadHandler);tinyMCE.addEvent(window.document,"beforeunload",TinyMCE.prototype.unloadHandler);}}else{if(tinyMCE.settings['add_unload_trigger'])tinyMCE.addEvent(window,"unload",function(){tinyMCE.triggerSave(true,true);});}}this.loadScript(tinyMCE.baseURL+'/themes/'+this.settings['theme']+'/editor_template'+tinyMCE.srcMode+'.js');this.loadScript(tinyMCE.baseURL+'/langs/'+this.settings['language']+'.js');this.loadCSS(this.settings['editor_css']);var themePlugins=tinyMCE.getParam('plugins','',true,',');if(this.settings['plugins']!=''){for(var i=0;i<themePlugins.length;i++)this.loadScript(tinyMCE.baseURL+'/plugins/'+themePlugins[i]+'/editor_plugin'+tinyMCE.srcMode+'.js');}settings['cleanup_entities']=new Array();var entities=tinyMCE.getParam('entities','',true,',');for(var i=0;i<entities.length;i+=2)settings['cleanup_entities']['c'+entities[i]]=entities[i+1];settings['index']=this.configs.length;this.configs[this.configs.length]=settings;};TinyMCE.prototype.loadScript=function(url){for(var i=0;i<this.loadedFiles.length;i++){if(this.loadedFiles[i]==url)return;}document.write('<sc'+'ript language="javascript" type="text/javascript" src="'+url+'"></script>');this.loadedFiles[this.loadedFiles.length]=url;};TinyMCE.prototype.loadCSS=function(url){for(var i=0;i<this.loadedFiles.length;i++){if(this.loadedFiles[i]==url)return;}document.write('<link href="'+url+'" rel="stylesheet" type="text/css" />');this.loadedFiles[this.loadedFiles.length]=url;};TinyMCE.prototype.importCSS=function(doc,css_file){if(css_file=='')return;if(typeof(doc.createStyleSheet)=="undefined"){var elm=doc.createElement("link");elm.rel="stylesheet";elm.href=css_file;if((headArr=doc.getElementsByTagName("head"))!=null&&headArr.length>0)headArr[0].appendChild(elm);}else var styleSheet=doc.createStyleSheet(css_file);};TinyMCE.prototype.confirmAdd=function(e,settings){var elm=tinyMCE.isMSIE?event.srcElement:e.target;var elementId=elm.name?elm.name:elm.id;tinyMCE.settings=settings;if(!elm.getAttribute('mce_noask')&&confirm(tinyMCELang['lang_edit_confirm']))tinyMCE.addMCEControl(elm,elementId);elm.setAttribute('mce_noask','true');};TinyMCE.prototype.updateContent=function(form_element_name){var formElement=document.getElementById(form_element_name);for(var n in tinyMCE.instances){var inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;inst.switchSettings();if(inst.formElement==formElement){var doc=inst.getDoc();tinyMCE._setHTML(doc,inst.formElement.value);if(!tinyMCE.isMSIE)doc.body.innerHTML=tinyMCE._cleanupHTML(inst,doc,this.settings,doc.body,inst.visualAid);}}};TinyMCE.prototype.addMCEControl=function(replace_element,form_element_name,target_document){var id="mce_editor_"+tinyMCE.idCounter++;var inst=new TinyMCEControl(tinyMCE.settings);inst.editorId=id;this.instances[id]=inst;inst.onAdd(replace_element,form_element_name,target_document);};TinyMCE.prototype.triggerSave=function(skip_cleanup,skip_callback){for(var n in tinyMCE.instances){var inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;inst.switchSettings();tinyMCE.settings['preformatted']=false;if(typeof(skip_cleanup)=="undefined")skip_cleanup=false;if(typeof(skip_callback)=="undefined")skip_callback=false;tinyMCE._setHTML(inst.getDoc(),inst.getBody().innerHTML);if(inst.settings['cleanup']==false){tinyMCE.handleVisualAid(inst.getBody(),true,false,inst);tinyMCE._setEventsEnabled(inst.getBody(),true);}tinyMCE._customCleanup(inst,"submit_content_dom",inst.contentWindow.document.body);var htm=skip_cleanup?inst.getBody().innerHTML:tinyMCE._cleanupHTML(inst,inst.getDoc(),this.settings,inst.getBody(),this.visualAid,true);htm=tinyMCE._customCleanup(inst,"submit_content",htm);if(tinyMCE.settings["encoding"]=="xml"||tinyMCE.settings["encoding"]=="html")htm=tinyMCE.convertStringToXML(htm);if(!skip_callback&&tinyMCE.settings['save_callback']!="")var content=eval(tinyMCE.settings['save_callback']+"(inst.formTargetElementId,htm,inst.getBody());");if((typeof(content)!="undefined")&&content!=null)htm=content;htm=tinyMCE.regexpReplace(htm,"&#40;","(","gi");htm=tinyMCE.regexpReplace(htm,"&#41;",")","gi");htm=tinyMCE.regexpReplace(htm,"&#59;",";","gi");htm=tinyMCE.regexpReplace(htm,"&#34;","&quot;","gi");htm=tinyMCE.regexpReplace(htm,"&#94;","^","gi");if(inst.formElement)inst.formElement.value=htm;}};TinyMCE.prototype._setEventsEnabled=function(node,state){var events=new Array('onfocus','onblur','onclick','ondblclick','onmousedown','onmouseup','onmouseover','onmousemove','onmouseout','onkeypress','onkeydown','onkeydown','onkeyup');var evs=tinyMCE.settings['event_elements'].split(',');for(var y=0;y<evs.length;y++){var elms=node.getElementsByTagName(evs[y]);for(var i=0;i<elms.length;i++){var event="";for(var x=0;x<events.length;x++){if((event=tinyMCE.getAttrib(elms[i],events[x]))!=''){event=tinyMCE.cleanupEventStr(""+event);if(!state)event="return true;"+event;else event=event.replace(/^return true;/gi,'');elms[i].removeAttribute(events[x]);elms[i].setAttribute(events[x],event);}}}}};TinyMCE.prototype.resetForm=function(form_index){var formObj=document.forms[form_index];for(var n in tinyMCE.instances){var inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;inst.switchSettings();for(var i=0;i<formObj.elements.length;i++){if(inst.formTargetElementId==formObj.elements[i].name)inst.getBody().innerHTML=inst.startContent;}}};TinyMCE.prototype.execInstanceCommand=function(editor_id,command,user_interface,value,focus){var inst=tinyMCE.getInstanceById(editor_id);if(inst){if(typeof(focus)=="undefined")focus=true;if(focus)inst.contentWindow.focus();inst.autoResetDesignMode();this.selectedElement=inst.getFocusElement();this.selectedInstance=inst;tinyMCE.execCommand(command,user_interface,value);if(tinyMCE.isMSIE&&window.event!=null)tinyMCE.cancelEvent(window.event);}};TinyMCE.prototype.execCommand=function(command,user_interface,value){user_interface=user_interface?user_interface:false;value=value?value:null;if(tinyMCE.selectedInstance)tinyMCE.selectedInstance.switchSettings();switch(command){case 'mceHelp':var template=new Array();template['file']='about.htm';template['width']=480;template['height']=380;tinyMCE.openWindow(template,{tinymce_version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion,tinymce_releasedate:tinyMCE.releaseDate,inline:"yes"});return;case 'mceFocus':var inst=tinyMCE.getInstanceById(value);if(inst)inst.contentWindow.focus();return;case "mceAddControl":case "mceAddEditor":tinyMCE.addMCEControl(tinyMCE._getElementById(value),value);return;case "mceAddFrameControl":tinyMCE.addMCEControl(tinyMCE._getElementById(value),value['element'],value['document']);return;case "mceRemoveControl":case "mceRemoveEditor":tinyMCE.removeMCEControl(value);return;case "mceResetDesignMode":if(!tinyMCE.isMSIE){for(var n in tinyMCE.instances){if(!tinyMCE.isInstance(tinyMCE.instances[n]))continue;try{tinyMCE.instances[n].getDoc().designMode="on";}catch(e){}}}return;}if(this.selectedInstance){this.selectedInstance.execCommand(command,user_interface,value);}else if(tinyMCE.settings['focus_alert'])alert(tinyMCELang['lang_focus_alert']);};TinyMCE.prototype.eventPatch=function(editor_id){if(typeof(tinyMCE)=="undefined")return true;for(var i=0;i<document.frames.length;i++){try{if(document.frames[i].event){var event=document.frames[i].event;if(!event.target)event.target=event.srcElement;TinyMCE.prototype.handleEvent(event);return;}}catch(ex){}}};TinyMCE.prototype.unloadHandler=function(){tinyMCE.triggerSave(true,true);};TinyMCE.prototype.addEventHandlers=function(editor_id){if(tinyMCE.isMSIE){var doc=document.frames[editor_id].document;tinyMCE.addEvent(doc,"keypress",TinyMCE.prototype.eventPatch);tinyMCE.addEvent(doc,"keyup",TinyMCE.prototype.eventPatch);tinyMCE.addEvent(doc,"keydown",TinyMCE.prototype.eventPatch);tinyMCE.addEvent(doc,"mouseup",TinyMCE.prototype.eventPatch);tinyMCE.addEvent(doc,"click",TinyMCE.prototype.eventPatch);}else{var inst=tinyMCE.instances[editor_id];var doc=inst.getDoc();inst.switchSettings();tinyMCE.addEvent(doc,"keypress",tinyMCE.handleEvent);tinyMCE.addEvent(doc,"keydown",tinyMCE.handleEvent);tinyMCE.addEvent(doc,"keyup",tinyMCE.handleEvent);tinyMCE.addEvent(doc,"click",tinyMCE.handleEvent);tinyMCE.addEvent(doc,"mouseup",tinyMCE.handleEvent);tinyMCE.addEvent(doc,"mousedown",tinyMCE.handleEvent);tinyMCE.addEvent(doc,"focus",tinyMCE.handleEvent);tinyMCE.addEvent(doc,"blur",tinyMCE.handleEvent);eval('try { doc.designMode = "On"; } catch(e) {}');}};TinyMCE.prototype._createIFrame=function(replace_element){var iframe=document.createElement("iframe");var id=replace_element.getAttribute("id");var aw,ah;aw=""+tinyMCE.settings['area_width'];ah=""+tinyMCE.settings['area_height'];if(aw.indexOf('%')==-1){aw=parseInt(aw);aw=aw<0?300:aw;aw=aw+"px";}if(ah.indexOf('%')==-1){ah=parseInt(ah);ah=ah<0?240:ah;ah=ah+"px";}iframe.setAttribute("id",id);iframe.setAttribute("border","0");iframe.setAttribute("frameBorder","0");iframe.setAttribute("marginWidth","0");iframe.setAttribute("marginHeight","0");iframe.setAttribute("leftMargin","0");iframe.setAttribute("topMargin","0");iframe.setAttribute("width",aw);iframe.setAttribute("height",ah);iframe.setAttribute("allowtransparency","true");if(tinyMCE.settings["auto_resize"])iframe.setAttribute("scrolling","no");if(tinyMCE.isMSIE&&!tinyMCE.isOpera)iframe.setAttribute("src",this.settings['default_document']);iframe.style.width=aw;iframe.style.height=ah;if(tinyMCE.isMSIE&&!tinyMCE.isOpera)replace_element.outerHTML=iframe.outerHTML;else replace_element.parentNode.replaceChild(iframe,replace_element);if(tinyMCE.isMSIE)return window.frames[id];else return iframe;};TinyMCE.prototype.setupContent=function(editor_id){var inst=tinyMCE.instances[editor_id];var doc=inst.getDoc();var head=doc.getElementsByTagName('head').item(0);var content=inst.startContent;tinyMCE.operaOpacityCounter=100*tinyMCE.idCounter;inst.switchSettings();if(!tinyMCE.isMSIE&&tinyMCE.getParam("setupcontent_reload",false)&&doc.title!="blank_page"){try{doc.location.href=tinyMCE.baseURL+"/blank.htm";}catch(ex){}window.setTimeout("tinyMCE.setupContent('"+editor_id+"');",1000);return;}if(!head){window.setTimeout("tinyMCE.setupContent('"+editor_id+"');",10);return;}tinyMCE.importCSS(inst.getDoc(),tinyMCE.baseURL+"/themes/"+inst.settings['theme']+"/css/editor_content.css");tinyMCE.importCSS(inst.getDoc(),inst.settings['content_css']);tinyMCE.executeCallback('init_instance_callback','_initInstance',0,inst);if(tinyMCE.getParam("convert_fonts_to_spans"))inst.getDoc().body.setAttribute('id','mceSpanFonts');if(tinyMCE.settings['nowrap'])doc.body.style.whiteSpace="nowrap";doc.body.dir=this.settings['directionality'];doc.editorId=editor_id;if(!tinyMCE.isMSIE)doc.documentElement.editorId=editor_id;var base=doc.createElement("base");base.setAttribute('href',tinyMCE.settings['base_href']);head.appendChild(base);if(tinyMCE.settings['convert_newlines_to_brs']){content=tinyMCE.regexpReplace(content,"\r\n","<br />","gi");content=tinyMCE.regexpReplace(content,"\r","<br />","gi");content=tinyMCE.regexpReplace(content,"\n","<br />","gi");}content=tinyMCE.storeAwayURLs(content);content=tinyMCE._customCleanup(inst,"insert_to_editor",content);if(tinyMCE.isMSIE){window.setInterval('try{tinyMCE.getCSSClasses(document.frames["'+editor_id+'"].document, "'+editor_id+'");}catch(e){}',500);if(tinyMCE.settings["force_br_newlines"])document.frames[editor_id].document.styleSheets[0].addRule("p","margin: 0px;");var body=document.frames[editor_id].document.body;tinyMCE.addEvent(body,"beforepaste",TinyMCE.prototype.eventPatch);tinyMCE.addEvent(body,"beforecut",TinyMCE.prototype.eventPatch);body.editorId=editor_id;}content=tinyMCE.cleanupHTMLCode(content);if(!tinyMCE.isMSIE){var contentElement=inst.getDoc().createElement("body");var doc=inst.getDoc();contentElement.innerHTML=content;if(tinyMCE.isGecko&&tinyMCE.settings['remove_lt_gt'])content=content.replace(new RegExp('&lt;&gt;','g'),"");if(tinyMCE.settings['cleanup_on_startup'])tinyMCE.setInnerHTML(inst.getBody(),tinyMCE._cleanupHTML(inst,doc,this.settings,contentElement));else{content=tinyMCE.regexpReplace(content,"<strong","<b","gi");content=tinyMCE.regexpReplace(content,"<em(/?)>","<i$1>","gi");content=tinyMCE.regexpReplace(content,"<em ","<i ","gi");content=tinyMCE.regexpReplace(content,"</strong>","</b>","gi");content=tinyMCE.regexpReplace(content,"</em>","</i>","gi");tinyMCE.setInnerHTML(inst.getBody(),content);}inst.convertAllRelativeURLs();}else{if(tinyMCE.settings['cleanup_on_startup']){tinyMCE._setHTML(inst.getDoc(),content);eval('try {tinyMCE.setInnerHTML(inst.getBody(), tinyMCE._cleanupHTML(inst, inst.contentDocument, this.settings, inst.getBody()));} catch(e) {}');}else tinyMCE._setHTML(inst.getDoc(),content);}var parentElm=document.getElementById(inst.editorId+'_parent');if(parentElm.lastChild.nodeName=="INPUT")inst.formElement=tinyMCE.isGecko?parentElm.firstChild:parentElm.lastChild;else inst.formElement=tinyMCE.isGecko?parentElm.previousSibling:parentElm.nextSibling;tinyMCE.handleVisualAid(inst.getBody(),true,tinyMCE.settings['visual'],inst);tinyMCE.executeCallback('setupcontent_callback','_setupContent',0,editor_id,inst.getBody(),inst.getDoc());if(!tinyMCE.isMSIE)TinyMCE.prototype.addEventHandlers(editor_id);if(tinyMCE.isMSIE)tinyMCE.addEvent(inst.getBody(),"blur",TinyMCE.prototype.eventPatch);tinyMCE.selectedInstance=inst;tinyMCE.selectedElement=inst.contentWindow.document.body;if(!inst.isHidden())tinyMCE.triggerNodeChange(false,true);tinyMCE._customCleanup(inst,"insert_to_editor_dom",inst.getBody());tinyMCE._customCleanup(inst,"setup_content_dom",inst.getBody());tinyMCE._setEventsEnabled(inst.getBody(),false);tinyMCE.cleanupAnchors(inst.getDoc());if(tinyMCE.getParam("convert_fonts_to_spans"))tinyMCE.convertSpansToFonts(inst.getDoc());inst.startContent=tinyMCE.trim(inst.getBody().innerHTML);inst.undoLevels[inst.undoLevels.length]=inst.startContent;tinyMCE.operaOpacityCounter=-1;};TinyMCE.prototype.cleanupHTMLCode=function(s){s=s.replace(/<p\/>/gi,'<p>&nbsp;</p>');s=s.replace(/<p>\s*<\/p>/gi,'<p>&nbsp;</p>');s=s.replace(/<(h[1-6]|p|div|address|pre|form|table|li|ol|ul|td|b|em|strong|i|strike|u|span|a|ul|ol|li|blockquote)([a-z]*)([^\\|>]*?)\/>/gi,'<$1$2$3></$1$2>');s=s.replace(new RegExp('\\s+></','gi'),'></');s=s.replace(/<(img|br|hr)(.*?)><\/(img|br|hr)>/gi,'<$1$2 />');if(tinyMCE.isMSIE)s=s.replace(/<p><hr\/><\/p>/gi,"<hr>");s=s.replace(new RegExp('(href=\"?)(\\s*?#)','gi'),'$1'+tinyMCE.settings['document_base_url']+"#");return s;};TinyMCE.prototype.storeAwayURLs=function(s){s=s.replace(new RegExp('mce_src\\s*=\\s*\"[^ >\"]*\"','gi'),'');s=s.replace(new RegExp('mce_href\\s*=\\s*\"[^ >\"]*\"','gi'),'');s=s.replace(new RegExp('src\\s*=\\s*\"([^ >\"]*)\"','gi'),'src="$1" mce_src="$1"');s=s.replace(new RegExp('href\\s*=\\s*\"([^ >\"]*)\"','gi'),'href="$1" mce_href="$1"');return s;};TinyMCE.prototype.cancelEvent=function(e){if(tinyMCE.isMSIE){e.returnValue=false;e.cancelBubble=true;}else e.preventDefault();};TinyMCE.prototype.removeTinyMCEFormElements=function(form_obj){if(typeof(form_obj)=="undefined"||form_obj==null)return;if(form_obj.nodeName!="FORM"){if(form_obj.form)form_obj=form_obj.form;else form_obj=tinyMCE.getParentElement(form_obj,"form");}if(form_obj==null)return;for(var i=0;i<form_obj.elements.length;i++){var elementId=form_obj.elements[i].name?form_obj.elements[i].name:form_obj.elements[i].id;if(elementId.indexOf('mce_editor_')==0)form_obj.elements[i].disabled=true;}};TinyMCE.prototype.accessibleEventHandler=function(e){var win=this._win;e=tinyMCE.isMSIE?win.event:e;var elm=tinyMCE.isMSIE?e.srcElement:e.target;if(elm.nodeName=="SELECT"&&!elm.oldonchange){elm.oldonchange=elm.onchange;elm.onchange=null;}if(e.keyCode==13||e.keyCode==32){elm.onchange=elm.oldonchange;elm.onchange();elm.oldonchange=null;tinyMCE.cancelEvent(e);}};TinyMCE.prototype.addSelectAccessibility=function(e,select,win){if(!select._isAccessible){select.onkeydown=tinyMCE.accessibleEventHandler;select._isAccessible=true;select._win=win;}};TinyMCE.prototype.handleEvent=function(e){if(typeof(tinyMCE)=="undefined")return true;switch(e.type){case "blur":if(tinyMCE.selectedInstance)tinyMCE.selectedInstance.execCommand('mceEndTyping');return;case "submit":tinyMCE.removeTinyMCEFormElements(tinyMCE.isMSIE?window.event.srcElement:e.target);tinyMCE.triggerSave();tinyMCE.isNotDirty=true;return;case "reset":var formObj=tinyMCE.isMSIE?window.event.srcElement:e.target;for(var i=0;i<document.forms.length;i++){if(document.forms[i]==formObj)window.setTimeout('tinyMCE.resetForm('+i+');',10);}return;case "keypress":if(e.target.editorId){tinyMCE.selectedInstance=tinyMCE.instances[e.target.editorId];}else{if(e.target.ownerDocument.editorId)tinyMCE.selectedInstance=tinyMCE.instances[e.target.ownerDocument.editorId];}if(tinyMCE.selectedInstance)tinyMCE.selectedInstance.switchSettings();if(tinyMCE.isGecko&&tinyMCE.settings['force_p_newlines']&&e.keyCode==13&&!e.shiftKey){if(tinyMCE.selectedInstance._insertPara(e)){tinyMCE.execCommand("mceAddUndoLevel");tinyMCE.cancelEvent(e);return false;}}if(tinyMCE.isGecko&&tinyMCE.settings['force_p_newlines']&&(e.keyCode==8||e.keyCode==46)&&!e.shiftKey){if(tinyMCE.selectedInstance._handleBackSpace(e.type)){tinyMCE.execCommand("mceAddUndoLevel");tinyMCE.cancelEvent(e);return false;}}if(tinyMCE.isGecko&&(e.ctrlKey&&!e.altKey)&&tinyMCE.settings['custom_undo_redo']){if(tinyMCE.settings['custom_undo_redo_keyboard_shortcuts']){if(e.charCode==122){tinyMCE.selectedInstance.execCommand("Undo");tinyMCE.cancelEvent(e);return false;}if(e.charCode==121){tinyMCE.selectedInstance.execCommand("Redo");tinyMCE.cancelEvent(e);return false;}}if(e.charCode==98){tinyMCE.selectedInstance.execCommand("Bold");tinyMCE.cancelEvent(e);return false;}if(e.charCode==105){tinyMCE.selectedInstance.execCommand("Italic");tinyMCE.cancelEvent(e);return false;}if(e.charCode==117){tinyMCE.selectedInstance.execCommand("Underline");tinyMCE.cancelEvent(e);return false;}}if(tinyMCE.isMSIE&&tinyMCE.settings['force_br_newlines']&&e.keyCode==13){if(e.target.editorId)tinyMCE.selectedInstance=tinyMCE.instances[e.target.editorId];if(tinyMCE.selectedInstance){var sel=tinyMCE.selectedInstance.getDoc().selection;var rng=sel.createRange();if(tinyMCE.getParentElement(rng.parentElement(),"li")!=null)return false;e.returnValue=false;e.cancelBubble=true;rng.pasteHTML("<br />");rng.collapse(false);rng.select();tinyMCE.execCommand("mceAddUndoLevel");tinyMCE.triggerNodeChange(false);return false;}}if(e.keyCode==8||e.keyCode==46){tinyMCE.selectedElement=e.target;tinyMCE.linkElement=tinyMCE.getParentElement(e.target,"a");tinyMCE.imgElement=tinyMCE.getParentElement(e.target,"img");tinyMCE.triggerNodeChange(false);}return false;break;case "keyup":case "keydown":if(e.target.editorId)tinyMCE.selectedInstance=tinyMCE.instances[e.target.editorId];else return;if(tinyMCE.selectedInstance)tinyMCE.selectedInstance.switchSettings();var inst=tinyMCE.selectedInstance;if(tinyMCE.isGecko&&tinyMCE.settings['force_p_newlines']&&(e.keyCode==8||e.keyCode==46)&&!e.shiftKey){if(tinyMCE.selectedInstance._handleBackSpace(e.type)){tinyMCE.execCommand("mceAddUndoLevel");e.preventDefault();return false;}}tinyMCE.selectedElement=null;tinyMCE.selectedNode=null;var elm=tinyMCE.selectedInstance.getFocusElement();tinyMCE.linkElement=tinyMCE.getParentElement(elm,"a");tinyMCE.imgElement=tinyMCE.getParentElement(elm,"img");tinyMCE.selectedElement=elm;if(tinyMCE.isGecko&&e.type=="keyup"&&e.keyCode==9)tinyMCE.handleVisualAid(tinyMCE.selectedInstance.getBody(),true,tinyMCE.settings['visual'],tinyMCE.selectedInstance);if(tinyMCE.isMSIE&&e.type=="keydown"&&e.keyCode==13)tinyMCE.enterKeyElement=tinyMCE.selectedInstance.getFocusElement();if(tinyMCE.isMSIE&&e.type=="keyup"&&e.keyCode==13){var elm=tinyMCE.enterKeyElement;if(elm){var re=new RegExp('^HR|IMG|BR$','g');var dre=new RegExp('^H[1-6]$','g');if(!elm.hasChildNodes()&&!re.test(elm.nodeName)){if(dre.test(elm.nodeName))elm.innerHTML="&nbsp;&nbsp;";else elm.innerHTML="&nbsp;";}}}var keys=tinyMCE.posKeyCodes;var posKey=false;for(var i=0;i<keys.length;i++){if(keys[i]==e.keyCode){posKey=true;break;}}if(tinyMCE.isMSIE&&tinyMCE.settings['custom_undo_redo']){var keys=new Array(8,46);for(var i=0;i<keys.length;i++){if(keys[i]==e.keyCode){if(e.type=="keyup")tinyMCE.triggerNodeChange(false);}}if(tinyMCE.settings['custom_undo_redo_keyboard_shortcuts']){if(e.keyCode==90&&(e.ctrlKey&&!e.altKey)&&e.type=="keydown"){tinyMCE.selectedInstance.execCommand("Undo");tinyMCE.triggerNodeChange(false);}if(e.keyCode==89&&(e.ctrlKey&&!e.altKey)&&e.type=="keydown"){tinyMCE.selectedInstance.execCommand("Redo");tinyMCE.triggerNodeChange(false);}if((e.keyCode==90||e.keyCode==89)&&(e.ctrlKey&&!e.altKey)){e.returnValue=false;e.cancelBubble=true;return false;}}}if((e.keyCode==90||e.keyCode==89)&&(e.ctrlKey&&!e.altKey))return true;if(e.keyCode==17)return true;if(!posKey&&e.type=="keyup")tinyMCE.execCommand("mceStartTyping");if(e.type=="keyup"&&(posKey||e.ctrlKey))tinyMCE.execCommand("mceEndTyping");if(posKey&&e.type=="keyup")tinyMCE.triggerNodeChange(false);if(tinyMCE.isMSIE&&e.ctrlKey)window.setTimeout('tinyMCE.triggerNodeChange(false);',1);break;case "mousedown":case "mouseup":case "click":case "focus":if(tinyMCE.selectedInstance)tinyMCE.selectedInstance.switchSettings();var targetBody=tinyMCE.getParentElement(e.target,"body");for(var instanceName in tinyMCE.instances){if(!tinyMCE.isInstance(tinyMCE.instances[instanceName]))continue;var inst=tinyMCE.instances[instanceName];inst.autoResetDesignMode();if(inst.getBody()==targetBody){tinyMCE.selectedInstance=inst;tinyMCE.selectedElement=e.target;tinyMCE.linkElement=tinyMCE.getParentElement(tinyMCE.selectedElement,"a");tinyMCE.imgElement=tinyMCE.getParentElement(tinyMCE.selectedElement,"img");break;}}if(tinyMCE.isSafari){tinyMCE.selectedInstance.lastSafariSelection=tinyMCE.selectedInstance.getBookmark();tinyMCE.selectedInstance.lastSafariSelectedElement=tinyMCE.selectedElement;var lnk=tinyMCE.getParentElement(tinyMCE.selectedElement,"a");if(lnk&&e.type=="mousedown"){lnk.setAttribute("mce_real_href",lnk.getAttribute("href"));lnk.setAttribute("href","javascript:void(0);");}if(lnk&&e.type=="click"){window.setTimeout(function(){lnk.setAttribute("href",lnk.getAttribute("mce_real_href"));lnk.removeAttribute("mce_real_href");},10);}}if(e.type!="focus")tinyMCE.selectedNode=null;tinyMCE.triggerNodeChange(false);tinyMCE.execCommand("mceEndTyping");if(e.type=="mouseup")tinyMCE.execCommand("mceAddUndoLevel");if(!tinyMCE.selectedInstance&&e.target.editorId)tinyMCE.selectedInstance=tinyMCE.instances[e.target.editorId];return false;break;}};TinyMCE.prototype.switchClass=function(element,class_name,lock_state){var lockChanged=false;if(typeof(lock_state)!="undefined"&&element!=null){element.classLock=lock_state;lockChanged=true;}if(element!=null&&(lockChanged||!element.classLock)){element.oldClassName=element.className;element.className=class_name;}};TinyMCE.prototype.restoreAndSwitchClass=function(element,class_name){if(element!=null&&!element.classLock){this.restoreClass(element);this.switchClass(element,class_name);}};TinyMCE.prototype.switchClassSticky=function(element_name,class_name,lock_state){var element,lockChanged=false;if(!this.stickyClassesLookup[element_name])this.stickyClassesLookup[element_name]=document.getElementById(element_name);element=this.stickyClassesLookup[element_name];if(typeof(lock_state)!="undefined"&&element!=null){element.classLock=lock_state;lockChanged=true;}if(element!=null&&(lockChanged||!element.classLock)){element.className=class_name;element.oldClassName=class_name;if(tinyMCE.isOpera){if(class_name=="mceButtonDisabled"){var suffix="";if(!element.mceOldSrc)element.mceOldSrc=element.src;if(this.operaOpacityCounter>-1)suffix='?rnd='+this.operaOpacityCounter++;element.src=tinyMCE.baseURL+"/themes/"+tinyMCE.getParam("theme")+"/images/opacity.png"+suffix;element.style.backgroundImage="url('"+element.mceOldSrc+"')";}else{if(element.mceOldSrc){element.src=element.mceOldSrc;element.parentNode.style.backgroundImage="";element.mceOldSrc=null;}}}}};TinyMCE.prototype.restoreClass=function(element){if(element!=null&&element.oldClassName&&!element.classLock){element.className=element.oldClassName;element.oldClassName=null;}};TinyMCE.prototype.setClassLock=function(element,lock_state){if(element!=null)element.classLock=lock_state;};TinyMCE.prototype.addEvent=function(obj,name,handler){if(tinyMCE.isMSIE){obj.attachEvent("on"+name,handler);}else obj.addEventListener(name,handler,false);};TinyMCE.prototype.submitPatch=function(){tinyMCE.removeTinyMCEFormElements(this);tinyMCE.triggerSave();this.mceOldSubmit();tinyMCE.isNotDirty=true;};TinyMCE.prototype.onLoad=function(){for(var c=0;c<tinyMCE.configs.length;c++){tinyMCE.settings=tinyMCE.configs[c];var selector=tinyMCE.getParam("editor_selector");var deselector=tinyMCE.getParam("editor_deselector");var elementRefAr=new Array();if(document.forms&&tinyMCE.settings['add_form_submit_trigger']&&!tinyMCE.submitTriggers){for(var i=0;i<document.forms.length;i++){var form=document.forms[i];tinyMCE.addEvent(form,"submit",TinyMCE.prototype.handleEvent);tinyMCE.addEvent(form,"reset",TinyMCE.prototype.handleEvent);tinyMCE.submitTriggers=true;if(tinyMCE.settings['submit_patch']){try{form.mceOldSubmit=form.submit;form.submit=TinyMCE.prototype.submitPatch;}catch(e){}}}}var mode=tinyMCE.settings['mode'];switch(mode){case "exact":var elements=tinyMCE.getParam('elements','',true,',');for(var i=0;i<elements.length;i++){var element=tinyMCE._getElementById(elements[i]);var trigger=element?element.getAttribute(tinyMCE.settings['textarea_trigger']):"";if(tinyMCE.getAttrib(element,"class").indexOf(deselector)!=-1)continue;if(trigger=="false")continue;if(tinyMCE.settings['ask']&&element){elementRefAr[elementRefAr.length]=element;continue;}if(element)tinyMCE.addMCEControl(element,elements[i]);else if(tinyMCE.settings['debug'])alert("Error: Could not find element by id or name: "+elements[i]);}break;case "specific_textareas":case "textareas":var nodeList=document.getElementsByTagName("textarea");for(var i=0;i<nodeList.length;i++){var elm=nodeList.item(i);var trigger=elm.getAttribute(tinyMCE.settings['textarea_trigger']);if(selector!=''&&tinyMCE.getAttrib(elm,"class").indexOf(selector)==-1)continue;if(selector!='')trigger=selector!=""?"true":"";if(tinyMCE.getAttrib(elm,"class").indexOf(deselector)!=-1)continue;if((mode=="specific_textareas"&&trigger=="true")||(mode=="textareas"&&trigger!="false"))elementRefAr[elementRefAr.length]=elm;}break;}for(var i=0;i<elementRefAr.length;i++){var element=elementRefAr[i];var elementId=element.name?element.name:element.id;if(tinyMCE.settings['ask']){if(tinyMCE.isGecko){var settings=tinyMCE.settings;tinyMCE.addEvent(element,"focus",function(e){window.setTimeout(function(){TinyMCE.prototype.confirmAdd(e,settings);},10);});}else{var settings=tinyMCE.settings;tinyMCE.addEvent(element,"focus",function(){TinyMCE.prototype.confirmAdd(null,settings);});}}else tinyMCE.addMCEControl(element,elementId);}if(tinyMCE.settings['auto_focus']){window.setTimeout(function(){var inst=tinyMCE.getInstanceById(tinyMCE.settings['auto_focus']);inst.selectNode(inst.getBody(),true,true);inst.contentWindow.focus();},10);}tinyMCE.executeCallback('oninit','_oninit',0);}};TinyMCE.prototype.removeMCEControl=function(editor_id){var inst=tinyMCE.getInstanceById(editor_id);if(inst){inst.switchSettings();editor_id=inst.editorId;var html=tinyMCE.getContent(editor_id);var tmpInstances=new Array();for(var instanceName in tinyMCE.instances){var instance=tinyMCE.instances[instanceName];if(!tinyMCE.isInstance(instance))continue;if(instanceName!=editor_id)tmpInstances[instanceName]=instance;}tinyMCE.instances=tmpInstances;tinyMCE.selectedElement=null;tinyMCE.selectedInstance=null;var replaceElement=document.getElementById(editor_id+"_parent");var oldTargetElement=inst.oldTargetElement;var targetName=oldTargetElement.nodeName.toLowerCase();if(targetName=="textarea"||targetName=="input"){replaceElement.parentNode.removeChild(replaceElement);oldTargetElement.style.display="inline";oldTargetElement.value=html;}else{oldTargetElement.innerHTML=html;replaceElement.parentNode.insertBefore(oldTargetElement,replaceElement);replaceElement.parentNode.removeChild(replaceElement);}}};TinyMCE.prototype._cleanupElementName=function(element_name,element){var name="";element_name=element_name.toLowerCase();if(element_name=="body")return null;if(tinyMCE.cleanup_verify_html){for(var i=0;i<tinyMCE.cleanup_invalidElements.length;i++){if(tinyMCE.cleanup_invalidElements[i]==element_name)return null;}var validElement=false;var elementAttribs=null;for(var i=0;i<tinyMCE.cleanup_validElements.length&&!elementAttribs;i++){for(var x=0,n=tinyMCE.cleanup_validElements[i][0].length;x<n;x++){var elmMatch=tinyMCE.cleanup_validElements[i][0][x];if(elmMatch.charAt(0)=='+'||elmMatch.charAt(0)=='-')elmMatch=elmMatch.substring(1);if(elmMatch.match(new RegExp('\\*|\\?|\\+','g'))!=null){elmMatch=elmMatch.replace(new RegExp('\\?','g'),'(\\S?)');elmMatch=elmMatch.replace(new RegExp('\\+','g'),'(\\S+)');elmMatch=elmMatch.replace(new RegExp('\\*','g'),'(\\S*)');elmMatch="^"+elmMatch+"$";if(element_name.match(new RegExp(elmMatch,'g'))){elementAttribs=tinyMCE.cleanup_validElements[i];validElement=true;break;}}if(element_name==elmMatch){elementAttribs=tinyMCE.cleanup_validElements[i];validElement=true;element_name=elementAttribs[0][0];break;}}}if(!validElement)return null;}if(element_name.charAt(0)=='+'||element_name.charAt(0)=='-')name=element_name.substring(1);if(!tinyMCE.isMSIE){if(name=="strong"&&!tinyMCE.cleanup_on_save)element_name="b";else if(name=="em"&&!tinyMCE.cleanup_on_save)element_name="i";}var elmData=new Object();elmData.element_name=element_name;elmData.valid_attribs=elementAttribs;return elmData;};TinyMCE.prototype._moveStyle=function(elm,style,attrib){if(tinyMCE.cleanup_inline_styles){var val=tinyMCE.getAttrib(elm,attrib);if(val!=''){val=''+val;switch(attrib){case "background":val="url('"+val+"')";break;case "bordercolor":if(elm.style.borderStyle==''||elm.style.borderStyle=='none')elm.style.borderStyle='solid';break;case "border":case "width":case "height":if(attrib=="border"&&elm.style.borderWidth>0)return;if(val.indexOf('%')==-1)val+='px';break;case "vspace":case "hspace":elm.style.marginTop=val+"px";elm.style.marginBottom=val+"px";elm.removeAttribute(attrib);return;case "align":if(elm.nodeName=="IMG"){if(tinyMCE.isMSIE)elm.style.styleFloat=val;else elm.style.cssFloat=val;}else elm.style.textAlign=val;elm.removeAttribute(attrib);return;}if(val!=''){eval('elm.style.'+style+' = val;');elm.removeAttribute(attrib);}}}else{if(style=='')return;var val=eval('elm.style.'+style)==''?tinyMCE.getAttrib(elm,attrib):eval('elm.style.'+style);val=val==null?'':''+val;switch(attrib){case "background":if(val.indexOf('url')==-1&&val!='')val="url('"+val+"');";if(val!=''){elm.style.backgroundImage=val;elm.removeAttribute(attrib);}return;case "border":case "width":case "height":val=val.replace('px','');break;case "align":if(tinyMCE.getAttrib(elm,'align')==''){if(elm.nodeName=="IMG"){if(tinyMCE.isMSIE&&elm.style.styleFloat!=''){val=elm.style.styleFloat;style='styleFloat';}else if(tinyMCE.isGecko&&elm.style.cssFloat!=''){val=elm.style.cssFloat;style='cssFloat';}}}break;}if(val!=''){elm.removeAttribute(attrib);elm.setAttribute(attrib,val);eval('elm.style.'+style+' = "";');}}};TinyMCE.prototype._cleanupAttribute=function(valid_attributes,element_name,attribute_node,element_node){var attribName=attribute_node.nodeName.toLowerCase();var attribValue=attribute_node.nodeValue;var attribMustBeValue=null;var verified=false;if(attribName.indexOf('moz_')!=-1)return null;if(!tinyMCE.cleanup_on_save&&(attribName=="mce_href"||attribName=="mce_src"))return{name:attribName,value:attribValue};if(tinyMCE.cleanup_verify_html&&!verified){for(var i=1;i<valid_attributes.length;i++){var attribMatch=valid_attributes[i][0];var re=null;if(attribMatch.match(new RegExp('\\*|\\?|\\+','g'))!=null){attribMatch=attribMatch.replace(new RegExp('\\?','g'),'(\\S?)');attribMatch=attribMatch.replace(new RegExp('\\+','g'),'(\\S+)');attribMatch=attribMatch.replace(new RegExp('\\*','g'),'(\\S*)');attribMatch="^"+attribMatch+"$";re=new RegExp(attribMatch,'g');}if((re&&attribName.match(re)!=null)||attribName==attribMatch){verified=true;attribMustBeValue=valid_attributes[i][3];break;}}if(!verified)return false;}else verified=true;switch(attribName){case "size":if(tinyMCE.isMSIE5&&element_name=="font")attribValue=element_node.size;break;case "width":case "height":case "border":if(tinyMCE.isMSIE5)attribValue=eval("element_node."+attribName);break;case "shape":attribValue=attribValue.toLowerCase();break;case "cellspacing":if(tinyMCE.isMSIE5)attribValue=element_node.cellSpacing;break;case "cellpadding":if(tinyMCE.isMSIE5)attribValue=element_node.cellPadding;break;case "color":if(tinyMCE.isMSIE5&&element_name=="font")attribValue=element_node.color;break;case "class":if(tinyMCE.cleanup_on_save&&attribValue.indexOf('mceItemAnchor')!=-1)attribValue=attribValue.replace(/mceItem[a-z0-9]+/gi,'');if(element_name=="table"||element_name=="td"){if(tinyMCE.cleanup_visual_table_class!="")attribValue=tinyMCE.getVisualAidClass(attribValue,!tinyMCE.cleanup_on_save);}if(!tinyMCE._verifyClass(element_node)||attribValue=="")return null;break;case "onfocus":case "onblur":case "onclick":case "ondblclick":case "onmousedown":case "onmouseup":case "onmouseover":case "onmousemove":case "onmouseout":case "onkeypress":case "onkeydown":case "onkeydown":case "onkeyup":attribValue=tinyMCE.cleanupEventStr(""+attribValue);if(attribValue.indexOf('return false;')==0)attribValue=attribValue.substring(14);break;case "style":attribValue=tinyMCE.serializeStyle(tinyMCE.parseStyle(tinyMCE.getAttrib(element_node,"style")));break;case "href":case "src":case "longdesc":attribValue=tinyMCE.getAttrib(element_node,attribName);var href=tinyMCE.getAttrib(element_node,"mce_href");if(attribName=="href"&&href!="")attribValue=href;var src=tinyMCE.getAttrib(element_node,"mce_src");if(attribName=="src"&&src!="")attribValue=src;if(!tinyMCE.cleanup_on_save)attribValue=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'],attribValue);else if(tinyMCE.getParam('convert_urls'))attribValue=eval(tinyMCE.cleanup_urlconverter_callback+"(attribValue, element_node, tinyMCE.cleanup_on_save);");break;case "colspan":case "rowspan":if(attribValue=="1")return null;break;case "_moz-userdefined":case "editorid":case "mce_href":case "mce_src":return null;}if(attribMustBeValue!=null){var isCorrect=false;for(var i=0;i<attribMustBeValue.length;i++){if(attribValue==attribMustBeValue[i]){isCorrect=true;break;}}if(!isCorrect)return null;}var attrib=new Object();attrib.name=attribName;attrib.value=attribValue;return attrib;};TinyMCE.prototype.clearArray=function(ar){for(var key in ar)ar[key]=null;};TinyMCE.prototype.isInstance=function(inst){return inst!=null&&typeof(inst)=="object"&&inst.isTinyMCEControl;};TinyMCE.prototype.parseStyle=function(str){var ar=new Array();if(str==null)return ar;var st=str.split(';');tinyMCE.clearArray(ar);for(var i=0;i<st.length;i++){if(st[i]=='')continue;var re=new RegExp('^\\s*([^:]*):\\s*(.*)\\s*$');var pa=st[i].replace(re,'$1||$2').split('||');if(pa.length==2)ar[pa[0].toLowerCase()]=pa[1];}return ar;};TinyMCE.prototype.compressStyle=function(ar,pr,sf,res){var box=new Array();box[0]=ar[pr+'-top'+sf];box[1]=ar[pr+'-left'+sf];box[2]=ar[pr+'-right'+sf];box[3]=ar[pr+'-bottom'+sf];for(var i=0;i<box.length;i++){if(box[i]==null)return;for(var a=0;a<box.length;a++){if(box[a]!=box[i])return;}}ar[res]=box[0];ar[pr+'-top'+sf]=null;ar[pr+'-left'+sf]=null;ar[pr+'-right'+sf]=null;ar[pr+'-bottom'+sf]=null;};TinyMCE.prototype.serializeStyle=function(ar){var str="";tinyMCE.compressStyle(ar,"border","","border");tinyMCE.compressStyle(ar,"border","-width","border-width");tinyMCE.compressStyle(ar,"border","-color","border-color");for(var key in ar){var val=ar[key];if(typeof(val)=='function')continue;if(val!=null&&val!=''){val=''+val;val=val.replace(new RegExp("url\\(\\'?([^\\']*)\\'?\\)",'gi'),"url('$1')");if(val.indexOf('url(')!=-1&&tinyMCE.getParam('convert_urls')){var m=new RegExp("url\\('(.*?)'\\)").exec(val);if(m.length>1)val="url('"+eval(tinyMCE.getParam('urlconverter_callback')+"(m[1], null, true);")+"')";}if(tinyMCE.getParam("force_hex_style_colors"))val=tinyMCE.convertRGBToHex(val,true);if(val!="url('')")str+=key.toLowerCase()+": "+val+"; ";}}if(new RegExp('; $').test(str))str=str.substring(0,str.length-2);return str;};TinyMCE.prototype.convertRGBToHex=function(s,k){if(s.toLowerCase().indexOf('rgb')!=-1){var re=new RegExp("(.*?)rgb\\s*?\\(\\s*?([0-9]+).*?,\\s*?([0-9]+).*?,\\s*?([0-9]+).*?\\)(.*?)","gi");var rgb=s.replace(re,"$1,$2,$3,$4,$5").split(',');if(rgb.length==5){r=parseInt(rgb[1]).toString(16);g=parseInt(rgb[2]).toString(16);b=parseInt(rgb[3]).toString(16);r=r.length==1?'0'+r:r;g=g.length==1?'0'+g:g;b=b.length==1?'0'+b:b;s="#"+r+g+b;if(k)s=rgb[0]+s+rgb[4];}}return s;};TinyMCE.prototype.convertHexToRGB=function(s){if(s.indexOf('#')!=-1){s=s.replace(new RegExp('[^0-9A-F]','gi'),'');return "rgb("+parseInt(s.substring(0,2),16)+","+parseInt(s.substring(2,4),16)+","+parseInt(s.substring(4,6),16)+")";}return s;};TinyMCE.prototype._verifyClass=function(node){if(tinyMCE.isGecko){var className=node.getAttribute('class');if(!className)return false;}if(tinyMCE.isMSIE)var className=node.getAttribute('className');if(tinyMCE.cleanup_verify_css_classes&&tinyMCE.cleanup_on_save){var csses=tinyMCE.getCSSClasses();nonDefinedCSS=true;for(var c=0;c<csses.length;c++){if(csses[c]==className){nonDefinedCSS=false;break;}}if(nonDefinedCSS&&className.indexOf('mce_')!=0){node.removeAttribute('className');node.removeAttribute('class');return false;}}return true;};TinyMCE.prototype.cleanupNode=function(node){var output="";switch(node.nodeType){case 1:var elementData=tinyMCE._cleanupElementName(node.nodeName,node);var elementName=elementData?elementData.element_name:null;var elementValidAttribs=elementData?elementData.valid_attribs:null;var elementAttribs="";var openTag=false,nonEmptyTag=false;if(elementName!=null&&elementName.charAt(0)=='+'){elementName=elementName.substring(1);openTag=true;}if(elementName!=null&&elementName.charAt(0)=='-'){elementName=elementName.substring(1);nonEmptyTag=true;}if(tinyMCE.isMSIE&&tinyMCE.settings['fix_content_duplication']){var lookup=tinyMCE.cleanup_elementLookupTable;for(var i=0;i<lookup.length;i++){if(lookup[i]==node)return output;}lookup[lookup.length]=node;}if(!elementName){if(node.hasChildNodes()){for(var i=0;i<node.childNodes.length;i++)output+=this.cleanupNode(node.childNodes[i]);}return output;}if(tinyMCE.cleanup_on_save){if(node.nodeName=="A"&&node.className=="mceItemAnchor"){if(node.hasChildNodes()){for(var i=0;i<node.childNodes.length;i++)output+=this.cleanupNode(node.childNodes[i]);}return '<a name="'+this.convertStringToXML(node.getAttribute("name"))+'"></a>'+output;}}var re=new RegExp("^(TABLE|TD|TR)$");if(re.test(node.nodeName)){if((node.nodeName!="TABLE"||tinyMCE.cleanup_inline_styles)&&(width=tinyMCE.getAttrib(node,"width"))!=''){node.style.width=width.indexOf('%')!=-1?width:width.replace(/[^0-9]/gi,'')+"px";node.removeAttribute("width");}if((node.nodeName=="TABLE"&&!tinyMCE.cleanup_inline_styles)&&node.style.width!=''){tinyMCE.setAttrib(node,"width",node.style.width.replace('px',''));node.style.width='';}if((height=tinyMCE.getAttrib(node,"height"))!=''){height=""+height;node.style.height=height.indexOf('%')!=-1?height:height.replace(/[^0-9]/gi,'')+"px";node.removeAttribute("height");}}if(tinyMCE.cleanup_inline_styles){var re=new RegExp("^(TABLE|TD|TR|IMG|HR)$");if(re.test(node.nodeName)&&tinyMCE.getAttrib(node,"class").indexOf('mceItem')==-1){tinyMCE._moveStyle(node,'width','width');tinyMCE._moveStyle(node,'height','height');tinyMCE._moveStyle(node,'borderWidth','border');tinyMCE._moveStyle(node,'','vspace');tinyMCE._moveStyle(node,'','hspace');tinyMCE._moveStyle(node,'textAlign','align');tinyMCE._moveStyle(node,'backgroundColor','bgColor');tinyMCE._moveStyle(node,'borderColor','borderColor');tinyMCE._moveStyle(node,'backgroundImage','background');if(tinyMCE.isMSIE5)node.outerHTML=node.outerHTML;}else if(tinyMCE.isBlockElement(node))tinyMCE._moveStyle(node,'textAlign','align');if(node.nodeName=="FONT")tinyMCE._moveStyle(node,'color','color');}if(elementValidAttribs){for(var a=1;a<elementValidAttribs.length;a++){var attribName,attribDefaultValue,attribForceValue,attribValue;attribName=elementValidAttribs[a][0];attribDefaultValue=elementValidAttribs[a][1];attribForceValue=elementValidAttribs[a][2];if(attribDefaultValue!=null||attribForceValue!=null){var attribValue=node.getAttribute(attribName);if(node.getAttribute(attribName)==null||node.getAttribute(attribName)=="")attribValue=attribDefaultValue;attribValue=attribForceValue?attribForceValue:attribValue;if(attribValue=="{$uid}")attribValue="uid_"+(tinyMCE.cleanup_idCount++);if(attribName=="class")attribValue=tinyMCE.getVisualAidClass(attribValue,tinyMCE.cleanup_on_save);node.setAttribute(attribName,attribValue);}}}if((tinyMCE.isMSIE&&!tinyMCE.isOpera)&&elementName=="style")return "<style>"+node.innerHTML+"</style>";if(elementName=="table"&&!node.hasChildNodes())return "";if(node.attributes.length>0){var lastAttrib="";for(var i=0;i<node.attributes.length;i++){if(node.attributes[i].specified){if(tinyMCE.isOpera){if(node.attributes[i].nodeName==lastAttrib)continue;lastAttrib=node.attributes[i].nodeName;}var attrib=tinyMCE._cleanupAttribute(elementValidAttribs,elementName,node.attributes[i],node);if(attrib&&attrib.value!="")elementAttribs+=" "+attrib.name+"="+'"'+this.convertStringToXML(""+attrib.value)+'"';}}}if(tinyMCE.isMSIE&&elementName=="table"&&node.getAttribute("summary")!=null&&elementAttribs.indexOf('summary')==-1){var summary=tinyMCE.getAttrib(node,'summary');if(summary!='')elementAttribs+=" summary="+'"'+this.convertStringToXML(summary)+'"';}if(tinyMCE.isMSIE5&&/^(td|img|a)$/.test(elementName)){var ma=new Array("scope","longdesc","hreflang","charset","type");for(var u=0;u<ma.length;u++){if(node.getAttribute(ma[u])!=null){var s=tinyMCE.getAttrib(node,ma[u]);if(s!='')elementAttribs+=" "+ma[u]+"="+'"'+this.convertStringToXML(s)+'"';}}}if(tinyMCE.isMSIE&&elementName=="input"){if(node.type){if(!elementAttribs.match(/type=/g))elementAttribs+=" type="+'"'+node.type+'"';}if(node.value){if(!elementAttribs.match(/value=/g))elementAttribs+=" value="+'"'+node.value+'"';}}if((elementName=="p"||elementName=="td")&&(node.innerHTML==""||node.innerHTML=="&nbsp;"))return "<"+elementName+elementAttribs+">"+this.convertStringToXML(String.fromCharCode(160))+"</"+elementName+">";if(tinyMCE.isMSIE&&elementName=="script")return "<"+elementName+elementAttribs+">"+node.text+"</"+elementName+">";if(node.hasChildNodes()){if(!(elementName=="span"&&elementAttribs==""&&tinyMCE.getParam("trim_span_elements"))){if(elementName=="p"&&tinyMCE.cleanup_force_br_newlines)output+="<div"+elementAttribs+">";else output+="<"+elementName+elementAttribs+">";}for(var i=0;i<node.childNodes.length;i++)output+=this.cleanupNode(node.childNodes[i]);if(!(elementName=="span"&&elementAttribs==""&&tinyMCE.getParam("trim_span_elements"))){if(elementName=="p"&&tinyMCE.cleanup_force_br_newlines)output+="</div><br />";else output+="</"+elementName+">";}}else{if(!nonEmptyTag){if(openTag)output+="<"+elementName+elementAttribs+"></"+elementName+">";else output+="<"+elementName+elementAttribs+" />";}}return output;case 3:if(node.parentNode.nodeName=="SCRIPT"||node.parentNode.nodeName=="NOSCRIPT"||node.parentNode.nodeName=="STYLE")return node.nodeValue;return this.convertStringToXML(node.nodeValue);case 8:return "<!--"+node.nodeValue+"-->";default:return "[UNKNOWN NODETYPE "+node.nodeType+"]";}};TinyMCE.prototype.convertStringToXML=function(html_data){var output="";for(var i=0;i<html_data.length;i++){var chr=html_data.charCodeAt(i);if(tinyMCE.settings['entity_encoding']=="numeric"){if(chr>127)output+='&#'+chr+";";else output+=String.fromCharCode(chr);continue;}if(tinyMCE.settings['entity_encoding']=="raw"){output+=String.fromCharCode(chr);continue;}if(typeof(tinyMCE.settings['cleanup_entities']["c"+chr])!='undefined'&&tinyMCE.settings['cleanup_entities']["c"+chr]!='')output+='&'+tinyMCE.settings['cleanup_entities']["c"+chr]+';';else output+=''+String.fromCharCode(chr);}return output;};TinyMCE.prototype._getCleanupElementName=function(chunk){var pos;if(chunk.charAt(0)=='+')chunk=chunk.substring(1);if(chunk.charAt(0)=='-')chunk=chunk.substring(1);if((pos=chunk.indexOf('/'))!=-1)chunk=chunk.substring(0,pos);if((pos=chunk.indexOf('['))!=-1)chunk=chunk.substring(0,pos);return chunk;};TinyMCE.prototype._initCleanup=function(){var validElements=tinyMCE.settings["valid_elements"];validElements=validElements.split(',');var extendedValidElements=tinyMCE.settings["extended_valid_elements"];extendedValidElements=extendedValidElements.split(',');for(var i=0;i<extendedValidElements.length;i++){var elementName=this._getCleanupElementName(extendedValidElements[i]);var skipAdd=false;for(var x=0;x<validElements.length;x++){if(this._getCleanupElementName(validElements[x])==elementName){validElements[x]=extendedValidElements[i];skipAdd=true;break;}}if(!skipAdd)validElements[validElements.length]=extendedValidElements[i];}for(var i=0;i<validElements.length;i++){var item=validElements[i];item=item.replace('[','|');item=item.replace(']','');var attribs=item.split('|');for(var x=0;x<attribs.length;x++)attribs[x]=attribs[x].toLowerCase();attribs[0]=attribs[0].split('/');for(var x=1;x<attribs.length;x++){var attribName=attribs[x];var attribDefault=null;var attribForce=null;var attribMustBe=null;if((pos=attribName.indexOf('='))!=-1){attribDefault=attribName.substring(pos+1);attribName=attribName.substring(0,pos);}if((pos=attribName.indexOf(':'))!=-1){attribForce=attribName.substring(pos+1);attribName=attribName.substring(0,pos);}if((pos=attribName.indexOf('<'))!=-1){attribMustBe=attribName.substring(pos+1).split('?');attribName=attribName.substring(0,pos);}attribs[x]=new Array(attribName,attribDefault,attribForce,attribMustBe);}validElements[i]=attribs;}var invalidElements=tinyMCE.settings['invalid_elements'].split(',');for(var i=0;i<invalidElements.length;i++)invalidElements[i]=invalidElements[i].toLowerCase();tinyMCE.settings['cleanup_validElements']=validElements;tinyMCE.settings['cleanup_invalidElements']=invalidElements;};TinyMCE.prototype._cleanupHTML=function(inst,doc,config,element,visual,on_save){if(!tinyMCE.settings['cleanup']){tinyMCE.handleVisualAid(inst.getBody(),true,false,inst);var html=element.innerHTML;html=html.replace(new RegExp('(mce_href|mce_src)=".*?"','gi'),'');html=html.replace(/\s+>/gi,'>');return html;}if(on_save&&tinyMCE.getParam("convert_fonts_to_spans"))tinyMCE.convertFontsToSpans(doc);tinyMCE._customCleanup(inst,on_save?"get_from_editor_dom":"insert_to_editor_dom",doc.body);var n=doc.getElementsByTagName("font");for(var i=0;i<n.length;i++){var c="";if((c=tinyMCE.getAttrib(n[i],"bgcolor"))!=""){n[i].style.backgroundColor=c;tinyMCE.setAttrib(n[i],"bgcolor","");}}tinyMCE.cleanup_validElements=tinyMCE.settings['cleanup_validElements'];tinyMCE.cleanup_invalidElements=tinyMCE.settings['cleanup_invalidElements'];tinyMCE.cleanup_verify_html=tinyMCE.settings['verify_html'];tinyMCE.cleanup_force_br_newlines=tinyMCE.settings['force_br_newlines'];tinyMCE.cleanup_urlconverter_callback=tinyMCE.settings['urlconverter_callback'];tinyMCE.cleanup_verify_css_classes=tinyMCE.settings['verify_css_classes'];tinyMCE.cleanup_visual_table_class=tinyMCE.settings['visual_table_class'];tinyMCE.cleanup_apply_source_formatting=tinyMCE.settings['apply_source_formatting'];tinyMCE.cleanup_inline_styles=tinyMCE.settings['inline_styles'];tinyMCE.cleanup_visual_aid=visual;tinyMCE.cleanup_on_save=on_save;tinyMCE.cleanup_idCount=0;tinyMCE.cleanup_elementLookupTable=new Array();var startTime=new Date().getTime();if(tinyMCE.isMSIE){var nodes=element.getElementsByTagName("hr");for(var i=0;i<nodes.length;i++){if(nodes[i].id=="null")nodes[i].removeAttribute("id");}tinyMCE.setInnerHTML(element,tinyMCE.regexpReplace(element.innerHTML,'<p>[ \n\r]*<hr.*>[ \n\r]*</p>','<hr />','gi'));tinyMCE.setInnerHTML(element,tinyMCE.regexpReplace(element.innerHTML,'<!([^-(DOCTYPE)]* )|<!/[^-]*>','','gi'));}var html=this.cleanupNode(element);if(tinyMCE.settings['debug'])tinyMCE.debug("Cleanup process executed in: "+(new Date().getTime()-startTime)+" ms.");html=tinyMCE.regexpReplace(html,'<p><hr /></p>','<hr />');html=tinyMCE.regexpReplace(html,'<p>&nbsp;</p><hr /><p>&nbsp;</p>','<hr />');html=tinyMCE.regexpReplace(html,'<td>\\s*<br />\\s*</td>','<td>&nbsp;</td>');html=tinyMCE.regexpReplace(html,'<p>\\s*<br />\\s*</p>','<p>&nbsp;</p>');html=tinyMCE.regexpReplace(html,'<p>\\s*&nbsp;\\s*<br />\\s*&nbsp;\\s*</p>','<p>&nbsp;</p>');html=tinyMCE.regexpReplace(html,'<p>\\s*&nbsp;\\s*<br />\\s*</p>','<p>&nbsp;</p>');html=tinyMCE.regexpReplace(html,'<p>\\s*<br />\\s*&nbsp;\\s*</p>','<p>&nbsp;</p>');html=html.replace(new RegExp('<a>(.*?)</a>','gi'),'$1');if(!tinyMCE.isMSIE)html=html.replace(new RegExp('<o:p _moz-userdefined="" />','g'),"");if(tinyMCE.settings['remove_linebreaks'])html=html.replace(new RegExp('\r|\n','g'),' ');if(tinyMCE.getParam('apply_source_formatting')){html=html.replace(new RegExp('<(p|div)([^>]*)>','g'),"\n<$1$2>\n");html=html.replace(new RegExp('<\/(p|div)([^>]*)>','g'),"\n</$1$2>\n");html=html.replace(new RegExp('<br />','g'),"<br />\n");}if(tinyMCE.settings['force_br_newlines']){var re=new RegExp('<p>&nbsp;</p>','g');html=html.replace(re,"<br />");}if(tinyMCE.isGecko&&tinyMCE.settings['remove_lt_gt']){var re=new RegExp('&lt;&gt;','g');html=html.replace(re,"");}html=tinyMCE._customCleanup(inst,on_save?"get_from_editor":"insert_to_editor",html);var chk=tinyMCE.regexpReplace(html,"[ \t\r\n]","").toLowerCase();if(chk=="<br/>"||chk=="<br>"||chk=="<p>&nbsp;</p>"||chk=="<p>&#160;</p>"||chk=="<p></p>")html="";if(tinyMCE.settings["preformatted"])return "<pre>"+html+"</pre>";return html;};TinyMCE.prototype.insertLink=function(href,target,title,onclick,style_class){tinyMCE.execCommand('mceBeginUndoLevel');if(this.selectedInstance&&this.selectedElement&&this.selectedElement.nodeName.toLowerCase()=="img"){var doc=this.selectedInstance.getDoc();var linkElement=tinyMCE.getParentElement(this.selectedElement,"a");var newLink=false;if(!linkElement){linkElement=doc.createElement("a");newLink=true;}var mhref=href;var thref=eval(tinyMCE.settings['urlconverter_callback']+"(href, linkElement);");mhref=tinyMCE.getParam('convert_urls')?href:mhref;tinyMCE.setAttrib(linkElement,'href',thref);tinyMCE.setAttrib(linkElement,'mce_href',mhref);tinyMCE.setAttrib(linkElement,'target',target);tinyMCE.setAttrib(linkElement,'title',title);tinyMCE.setAttrib(linkElement,'onclick',onclick);tinyMCE.setAttrib(linkElement,'class',style_class);if(newLink){linkElement.appendChild(this.selectedElement.cloneNode(true));this.selectedElement.parentNode.replaceChild(linkElement,this.selectedElement);}return;}if(!this.linkElement&&this.selectedInstance){if(tinyMCE.isSafari){tinyMCE.execCommand("mceInsertContent",false,'<a href="'+tinyMCE.uniqueURL+'">'+this.selectedInstance.getSelectedHTML()+'</a>');}else this.selectedInstance.contentDocument.execCommand("createlink",false,tinyMCE.uniqueURL);tinyMCE.linkElement=this.getElementByAttributeValue(this.selectedInstance.contentDocument.body,"a","href",tinyMCE.uniqueURL);var elementArray=this.getElementsByAttributeValue(this.selectedInstance.contentDocument.body,"a","href",tinyMCE.uniqueURL);for(var i=0;i<elementArray.length;i++){var mhref=href;var thref=eval(tinyMCE.settings['urlconverter_callback']+"(href, elementArray[i]);");mhref=tinyMCE.getParam('convert_urls')?href:mhref;tinyMCE.setAttrib(elementArray[i],'href',thref);tinyMCE.setAttrib(elementArray[i],'mce_href',mhref);tinyMCE.setAttrib(elementArray[i],'target',target);tinyMCE.setAttrib(elementArray[i],'title',title);tinyMCE.setAttrib(elementArray[i],'onclick',onclick);tinyMCE.setAttrib(elementArray[i],'class',style_class);}tinyMCE.linkElement=elementArray[0];}if(this.linkElement){var mhref=href;href=eval(tinyMCE.settings['urlconverter_callback']+"(href, this.linkElement);");mhref=tinyMCE.getParam('convert_urls')?href:mhref;tinyMCE.setAttrib(this.linkElement,'href',href);tinyMCE.setAttrib(this.linkElement,'mce_href',mhref);tinyMCE.setAttrib(this.linkElement,'target',target);tinyMCE.setAttrib(this.linkElement,'title',title);tinyMCE.setAttrib(this.linkElement,'onclick',onclick);tinyMCE.setAttrib(this.linkElement,'class',style_class);}tinyMCE.execCommand('mceEndUndoLevel');};TinyMCE.prototype.insertImage=function(src,alt,border,hspace,vspace,width,height,align,title,onmouseover,onmouseout){tinyMCE.execCommand('mceBeginUndoLevel');if(src=="")return;if(!this.imgElement&&tinyMCE.isSafari){var html="";html+='<img src="'+src+'" alt="'+alt+'"';html+=' border="'+border+'" hspace="'+hspace+'"';html+=' vspace="'+vspace+'" width="'+width+'"';html+=' height="'+height+'" align="'+align+'" title="'+title+'" onmouseover="'+onmouseover+'" onmouseout="'+onmouseout+'" />';tinyMCE.execCommand("mceInsertContent",false,html);}else{if(!this.imgElement&&this.selectedInstance){if(tinyMCE.isSafari)tinyMCE.execCommand("mceInsertContent",false,'<img src="'+tinyMCE.uniqueURL+'" />');else this.selectedInstance.contentDocument.execCommand("insertimage",false,tinyMCE.uniqueURL);tinyMCE.imgElement=this.getElementByAttributeValue(this.selectedInstance.contentDocument.body,"img","src",tinyMCE.uniqueURL);}}if(this.imgElement){var needsRepaint=false;var msrc=src;src=eval(tinyMCE.settings['urlconverter_callback']+"(src, tinyMCE.imgElement);");if(tinyMCE.getParam('convert_urls'))msrc=src;if(onmouseover&&onmouseover!="")onmouseover="this.src='"+eval(tinyMCE.settings['urlconverter_callback']+"(onmouseover, tinyMCE.imgElement);")+"';";if(onmouseout&&onmouseout!="")onmouseout="this.src='"+eval(tinyMCE.settings['urlconverter_callback']+"(onmouseout, tinyMCE.imgElement);")+"';";if(typeof(title)=="undefined")title=alt;if(width!=this.imgElement.getAttribute("width")||height!=this.imgElement.getAttribute("height")||align!=this.imgElement.getAttribute("align"))needsRepaint=true;tinyMCE.setAttrib(this.imgElement,'src',src);tinyMCE.setAttrib(this.imgElement,'mce_src',msrc);tinyMCE.setAttrib(this.imgElement,'alt',alt);tinyMCE.setAttrib(this.imgElement,'title',title);tinyMCE.setAttrib(this.imgElement,'align',align);tinyMCE.setAttrib(this.imgElement,'border',border,true);tinyMCE.setAttrib(this.imgElement,'hspace',hspace,true);tinyMCE.setAttrib(this.imgElement,'vspace',vspace,true);tinyMCE.setAttrib(this.imgElement,'width',width,true);tinyMCE.setAttrib(this.imgElement,'height',height,true);tinyMCE.setAttrib(this.imgElement,'onmouseover',onmouseover);tinyMCE.setAttrib(this.imgElement,'onmouseout',onmouseout);if(width&&width!="")this.imgElement.style.pixelWidth=width;if(height&&height!="")this.imgElement.style.pixelHeight=height;if(needsRepaint)tinyMCE.selectedInstance.repaint();}tinyMCE.execCommand('mceEndUndoLevel');};TinyMCE.prototype.getElementByAttributeValue=function(node,element_name,attrib,value){var elements=this.getElementsByAttributeValue(node,element_name,attrib,value);if(elements.length==0)return null;return elements[0];};TinyMCE.prototype.getElementsByAttributeValue=function(node,element_name,attrib,value){var elements=new Array();if(node&&node.nodeName.toLowerCase()==element_name){if(node.getAttribute(attrib)&&node.getAttribute(attrib).indexOf(value)!=-1)elements[elements.length]=node;}if(node&&node.hasChildNodes()){for(var x=0,n=node.childNodes.length;x<n;x++){var childElements=this.getElementsByAttributeValue(node.childNodes[x],element_name,attrib,value);for(var i=0,m=childElements.length;i<m;i++)elements[elements.length]=childElements[i];}}return elements;};TinyMCE.prototype.isBlockElement=function(node){return node!=null&&node.nodeType==1&&this.blockRegExp.test(node.nodeName);};TinyMCE.prototype.getParentBlockElement=function(node){while(node){if(this.blockRegExp.test(node.nodeName))return node;node=node.parentNode;}return null;};TinyMCE.prototype.getNodeTree=function(node,node_array,type,node_name){if(typeof(type)=="undefined"||node.nodeType==type&&(typeof(node_name)=="undefined"||node.nodeName==node_name))node_array[node_array.length]=node;if(node.hasChildNodes()){for(var i=0;i<node.childNodes.length;i++)tinyMCE.getNodeTree(node.childNodes[i],node_array,type,node_name);}return node_array;};TinyMCE.prototype.getParentElement=function(node,names,attrib_name,attrib_value){if(typeof(names)=="undefined"){if(node.nodeType==1)return node;while((node=node.parentNode)!=null&&node.nodeType!=1);return node;}var namesAr=names.split(',');if(node==null)return null;do{for(var i=0;i<namesAr.length;i++){if(node.nodeName.toLowerCase()==namesAr[i].toLowerCase()||names=="*"){if(typeof(attrib_name)=="undefined")return node;else if(node.getAttribute(attrib_name)){if(typeof(attrib_value)=="undefined"){if(node.getAttribute(attrib_name)!="")return node;}else if(node.getAttribute(attrib_name)==attrib_value)return node;}}}}while((node=node.parentNode)!=null);return null;};TinyMCE.prototype.convertURL=function(url,node,on_save){var prot=document.location.protocol;var host=document.location.hostname;var port=document.location.port;if(prot=="file:")return url;url=tinyMCE.regexpReplace(url,'(http|https):///','/');if(url.indexOf('mailto:')!=-1||url.indexOf('javascript:')!=-1||tinyMCE.regexpReplace(url,'[ \t\r\n\+]|%20','').charAt(0)=="#")return url;if(!tinyMCE.isMSIE&&!on_save&&url.indexOf("://")==-1&&url.charAt(0)!='/')return tinyMCE.settings['base_href']+url;if(on_save&&tinyMCE.getParam('relative_urls')){var curl=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'],url);if(curl.charAt(0)=='/')curl=tinyMCE.settings['document_base_prefix']+curl;var urlParts=tinyMCE.parseURL(curl);var tmpUrlParts=tinyMCE.parseURL(tinyMCE.settings['document_base_url']);if(urlParts['host']==tmpUrlParts['host']&&(urlParts['port']==tmpUrlParts['port']))return tinyMCE.convertAbsoluteURLToRelativeURL(tinyMCE.settings['document_base_url'],curl);}if(!tinyMCE.getParam('relative_urls')){var urlParts=tinyMCE.parseURL(url);var baseUrlParts=tinyMCE.parseURL(tinyMCE.settings['base_href']);url=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'],url);if(urlParts['anchor']&&urlParts['path']==baseUrlParts['path'])return "#"+urlParts['anchor'];}if(tinyMCE.getParam('remove_script_host')){var start="",portPart="";if(port!="")portPart=":"+port;start=prot+"//"+host+portPart+"/";if(url.indexOf(start)==0)url=url.substring(start.length-1);}return url;};TinyMCE.prototype.parseURL=function(url_str){var urlParts=new Array();if(url_str){var pos,lastPos;pos=url_str.indexOf('://');if(pos!=-1){urlParts['protocol']=url_str.substring(0,pos);lastPos=pos+3;}for(var i=lastPos;i<url_str.length;i++){var chr=url_str.charAt(i);if(chr==':')break;if(chr=='/')break;}pos=i;urlParts['host']=url_str.substring(lastPos,pos);urlParts['port']="";lastPos=pos;if(url_str.charAt(pos)==':'){pos=url_str.indexOf('/',lastPos);urlParts['port']=url_str.substring(lastPos+1,pos);}lastPos=pos;pos=url_str.indexOf('?',lastPos);if(pos==-1)pos=url_str.indexOf('#',lastPos);if(pos==-1)pos=url_str.length;urlParts['path']=url_str.substring(lastPos,pos);lastPos=pos;if(url_str.charAt(pos)=='?'){pos=url_str.indexOf('#');pos=(pos==-1)?url_str.length:pos;urlParts['query']=url_str.substring(lastPos+1,pos);}lastPos=pos;if(url_str.charAt(pos)=='#'){pos=url_str.length;urlParts['anchor']=url_str.substring(lastPos+1,pos);}}return urlParts;};TinyMCE.prototype.serializeURL=function(up){var url="";if(up['protocol'])url+=up['protocol']+"://";if(up['host'])url+=up['host'];if(up['port'])url+=":"+up['port'];if(up['path'])url+=up['path'];if(up['query'])url+="?"+up['query'];if(up['anchor'])url+="#"+up['anchor'];return url;};TinyMCE.prototype.convertAbsoluteURLToRelativeURL=function(base_url,url_to_relative){var baseURL=this.parseURL(base_url);var targetURL=this.parseURL(url_to_relative);var strTok1;var strTok2;var breakPoint=0;var outPath="";var forceSlash=false;if(targetURL.path=="")targetURL.path="/";else forceSlash=true;base_url=baseURL.path.substring(0,baseURL.path.lastIndexOf('/'));strTok1=base_url.split('/');strTok2=targetURL.path.split('/');if(strTok1.length>=strTok2.length){for(var i=0;i<strTok1.length;i++){if(i>=strTok2.length||strTok1[i]!=strTok2[i]){breakPoint=i+1;break;}}}if(strTok1.length<strTok2.length){for(var i=0;i<strTok2.length;i++){if(i>=strTok1.length||strTok1[i]!=strTok2[i]){breakPoint=i+1;break;}}}if(breakPoint==1)return targetURL.path;for(var i=0;i<(strTok1.length-(breakPoint-1));i++)outPath+="../";for(var i=breakPoint-1;i<strTok2.length;i++){if(i!=(breakPoint-1))outPath+="/"+strTok2[i];else outPath+=strTok2[i];}targetURL.protocol=null;targetURL.host=null;targetURL.port=null;targetURL.path=outPath==""&&forceSlash?"/":outPath;var fileName=baseURL.path;var pos;if((pos=fileName.lastIndexOf('/'))!=-1)fileName=fileName.substring(pos+1);if(fileName==targetURL.path&&targetURL.anchor!="")targetURL.path="";return this.serializeURL(targetURL);};TinyMCE.prototype.convertRelativeToAbsoluteURL=function(base_url,relative_url){var baseURL=TinyMCE.prototype.parseURL(base_url);var relURL=TinyMCE.prototype.parseURL(relative_url);if(relative_url==""||relative_url.charAt(0)=='/'||relative_url.indexOf('://')!=-1||relative_url.indexOf('mailto:')!=-1||relative_url.indexOf('javascript:')!=-1)return relative_url;baseURLParts=baseURL['path'].split('/');relURLParts=relURL['path'].split('/');var newBaseURLParts=new Array();for(var i=baseURLParts.length-1;i>=0;i--){if(baseURLParts[i].length==0)continue;newBaseURLParts[newBaseURLParts.length]=baseURLParts[i];}baseURLParts=newBaseURLParts.reverse();var newRelURLParts=new Array();var numBack=0;for(var i=relURLParts.length-1;i>=0;i--){if(relURLParts[i].length==0||relURLParts[i]==".")continue;if(relURLParts[i]=='..'){numBack++;continue;}if(numBack>0){numBack--;continue;}newRelURLParts[newRelURLParts.length]=relURLParts[i];}relURLParts=newRelURLParts.reverse();var len=baseURLParts.length-numBack;var absPath=(len<=0?"":"/")+baseURLParts.slice(0,len).join('/')+"/"+relURLParts.join('/');var start="",end="";relURL.protocol=baseURL.protocol;relURL.host=baseURL.host;relURL.port=baseURL.port;if(relURL.path.charAt(relURL.path.length-1)=="/")absPath+="/";relURL.path=absPath;return TinyMCE.prototype.serializeURL(relURL);};TinyMCE.prototype.getParam=function(name,default_value,strip_whitespace,split_chr){var value=(typeof(this.settings[name])=="undefined")?default_value:this.settings[name];if(value=="true"||value=="false")return(value=="true");if(strip_whitespace)value=tinyMCE.regexpReplace(value,"[ \t\r\n]","");if(typeof(split_chr)!="undefined"&&split_chr!=null){value=value.split(split_chr);var outArray=new Array();for(var i=0;i<value.length;i++){if(value[i]&&value[i]!="")outArray[outArray.length]=value[i];}value=outArray;}return value;};TinyMCE.prototype.getLang=function(name,default_value,parse_entities){var value=(typeof(tinyMCELang[name])=="undefined")?default_value:tinyMCELang[name];if(parse_entities)value=tinyMCE.entityDecode(value);return value;};TinyMCE.prototype.entityDecode=function(s){var e=document.createElement("div");e.innerHTML=s;return e.innerHTML;};TinyMCE.prototype.addToLang=function(prefix,ar){for(var key in ar){if(typeof(ar[key])=='function')continue;tinyMCELang[(key.indexOf('lang_')==-1?'lang_':'')+(prefix!=''?(prefix+"_"):'')+key]=ar[key];}};TinyMCE.prototype.replaceVar=function(replace_haystack,replace_var,replace_str){var re=new RegExp('{\\\$'+replace_var+'}','g');return replace_haystack.replace(re,replace_str);};TinyMCE.prototype.replaceVars=function(replace_haystack,replace_vars){for(var key in replace_vars){var value=replace_vars[key];if(typeof(value)=='function')continue;replace_haystack=tinyMCE.replaceVar(replace_haystack,key,value);}return replace_haystack;};TinyMCE.prototype.triggerNodeChange=function(focus,setup_content){if(tinyMCE.settings['handleNodeChangeCallback']){if(tinyMCE.selectedInstance){var inst=tinyMCE.selectedInstance;var editorId=inst.editorId;var elm=(typeof(setup_content)!="undefined"&&setup_content)?tinyMCE.selectedElement:inst.getFocusElement();var undoIndex=-1;var undoLevels=-1;var anySelection=false;var selectedText=inst.getSelectedText();inst.switchSettings();if(tinyMCE.settings["auto_resize"]){var doc=inst.getDoc();inst.iframeElement.style.width=doc.body.offsetWidth+"px";inst.iframeElement.style.height=doc.body.offsetHeight+"px";}if(tinyMCE.selectedElement)anySelection=(tinyMCE.selectedElement.nodeName.toLowerCase()=="img")||(selectedText&&selectedText.length>0);if(tinyMCE.settings['custom_undo_redo']){undoIndex=inst.undoIndex;undoLevels=inst.undoLevels.length;}tinyMCE.executeCallback('handleNodeChangeCallback','_handleNodeChange',0,editorId,elm,undoIndex,undoLevels,inst.visualAid,anySelection,setup_content);}}if(this.selectedInstance&&(typeof(focus)=="undefined"||focus))this.selectedInstance.contentWindow.focus();};TinyMCE.prototype._customCleanup=function(inst,type,content){var customCleanup=tinyMCE.settings['cleanup_callback'];if(customCleanup!=""&&eval("typeof("+customCleanup+")")!="undefined")content=eval(customCleanup+"(type, content, inst);");var plugins=tinyMCE.getParam('plugins','',true,',');for(var i=0;i<plugins.length;i++){if(eval("typeof(TinyMCE_"+plugins[i]+"_cleanup)")!="undefined")content=eval("TinyMCE_"+plugins[i]+"_cleanup(type, content, inst);");}return content;};TinyMCE.prototype.getContent=function(editor_id){if(typeof(editor_id)!="undefined")tinyMCE.selectedInstance=tinyMCE.getInstanceById(editor_id);if(tinyMCE.selectedInstance){var old=this.selectedInstance.getBody().innerHTML;var html=tinyMCE._cleanupHTML(this.selectedInstance,this.selectedInstance.getDoc(),tinyMCE.settings,this.selectedInstance.getBody(),false,true);tinyMCE.setInnerHTML(this.selectedInstance.getBody(),old);return html;}return null;};TinyMCE.prototype.setContent=function(html_content){if(tinyMCE.selectedInstance){tinyMCE.selectedInstance.execCommand('mceSetContent',false,html_content);tinyMCE.selectedInstance.repaint();}};TinyMCE.prototype.importThemeLanguagePack=function(name){if(typeof(name)=="undefined")name=tinyMCE.settings['theme'];tinyMCE.loadScript(tinyMCE.baseURL+'/themes/'+name+'/langs/'+tinyMCE.settings['language']+'.js');};TinyMCE.prototype.importPluginLanguagePack=function(name,valid_languages){var lang="en";valid_languages=valid_languages.split(',');for(var i=0;i<valid_languages.length;i++){if(tinyMCE.settings['language']==valid_languages[i])lang=tinyMCE.settings['language'];}tinyMCE.loadScript(tinyMCE.baseURL+'/plugins/'+name+'/langs/'+lang+'.js');};TinyMCE.prototype.applyTemplate=function(html,args){html=tinyMCE.replaceVar(html,"themeurl",tinyMCE.themeURL);if(typeof(args)!="undefined")html=tinyMCE.replaceVars(html,args);html=tinyMCE.replaceVars(html,tinyMCE.settings);html=tinyMCE.replaceVars(html,tinyMCELang);return html;};TinyMCE.prototype.openWindow=function(template,args){var html,width,height,x,y,resizable,scrollbars,url;args['mce_template_file']=template['file'];args['mce_width']=template['width'];args['mce_height']=template['height'];tinyMCE.windowArgs=args;html=template['html'];if(!(width=parseInt(template['width'])))width=320;if(!(height=parseInt(template['height'])))height=200;if(tinyMCE.isMSIE)height+=40;else height+=20;x=parseInt(screen.width/2.0)-(width/2.0);y=parseInt(screen.height/2.0)-(height/2.0);resizable=(args&&args['resizable'])?args['resizable']:"no";scrollbars=(args&&args['scrollbars'])?args['scrollbars']:"no";if(template['file'].charAt(0)!='/'&&template['file'].indexOf('://')==-1)url=tinyMCE.baseURL+"/themes/"+tinyMCE.getParam("theme")+"/"+template['file'];else url=template['file'];for(var name in args){if(typeof(args[name])=='function')continue;url=tinyMCE.replaceVar(url,name,escape(args[name]));}if(html){html=tinyMCE.replaceVar(html,"css",this.settings['popups_css']);html=tinyMCE.applyTemplate(html,args);var win=window.open("","mcePopup"+new Date().getTime(),"top="+y+",left="+x+",scrollbars="+scrollbars+",dialog=yes,minimizable="+resizable+",modal=yes,width="+width+",height="+height+",resizable="+resizable);if(win==null){alert(tinyMCELang['lang_popup_blocked']);return;}win.document.write(html);win.document.close();win.resizeTo(width,height);win.focus();}else{if((tinyMCE.isMSIE&&!tinyMCE.isOpera)&&resizable!='yes'&&tinyMCE.settings["dialog_type"]=="modal"){var features="resizable:"+resizable+";scroll:"+scrollbars+";status:yes;center:yes;help:no;dialogWidth:"+width+"px;dialogHeight:"+height+"px;";window.showModalDialog(url,window,features);}else{var modal=(resizable=="yes")?"no":"yes";if(tinyMCE.isGecko&&tinyMCE.isMac)modal="no";if(template['close_previous']!="no")try{tinyMCE.lastWindow.close();}catch(ex){}var win=window.open(url,"mcePopup"+new Date().getTime(),"top="+y+",left="+x+",scrollbars="+scrollbars+",dialog="+modal+",minimizable="+resizable+",modal="+modal+",width="+width+",height="+height+",resizable="+resizable);if(win==null){alert(tinyMCELang['lang_popup_blocked']);return;}if(template['close_previous']!="no")tinyMCE.lastWindow=win;eval('try { win.resizeTo(width, height); } catch(e) { }');if(tinyMCE.isGecko){if(win.document.defaultView.statusbar.visible)win.resizeBy(0,tinyMCE.isMac?10:24);}win.focus();}}};TinyMCE.prototype.closeWindow=function(win){win.close();};TinyMCE.prototype.getVisualAidClass=function(class_name,state){var aidClass=tinyMCE.settings['visual_table_class'];if(typeof(state)=="undefined")state=tinyMCE.settings['visual'];var classNames=new Array();var ar=class_name.split(' ');for(var i=0;i<ar.length;i++){if(ar[i]==aidClass)ar[i]="";if(ar[i]!="")classNames[classNames.length]=ar[i];}if(state)classNames[classNames.length]=aidClass;var className="";for(var i=0;i<classNames.length;i++){if(i>0)className+=" ";className+=classNames[i];}return className;};TinyMCE.prototype.handleVisualAid=function(el,deep,state,inst){if(!el)return;var tableElement=null;switch(el.nodeName){case "TABLE":var oldW=el.style.width;var oldH=el.style.height;var bo=tinyMCE.getAttrib(el,"border");bo=bo==""||bo=="0"?true:false;tinyMCE.setAttrib(el,"class",tinyMCE.getVisualAidClass(tinyMCE.getAttrib(el,"class"),state&&bo));el.style.width=oldW;el.style.height=oldH;for(var y=0;y<el.rows.length;y++){for(var x=0;x<el.rows[y].cells.length;x++){var cn=tinyMCE.getVisualAidClass(tinyMCE.getAttrib(el.rows[y].cells[x],"class"),state&&bo);tinyMCE.setAttrib(el.rows[y].cells[x],"class",cn);}}break;case "A":var anchorName=tinyMCE.getAttrib(el,"name");if(anchorName!=''&&state){el.title=anchorName;el.className='mceItemAnchor';}else if(anchorName!=''&&!state)el.className='';break;}if(deep&&el.hasChildNodes()){for(var i=0;i<el.childNodes.length;i++)tinyMCE.handleVisualAid(el.childNodes[i],deep,state,inst);}};TinyMCE.prototype.getAttrib=function(elm,name,default_value){if(typeof(default_value)=="undefined")default_value="";if(!elm||elm.nodeType!=1)return default_value;var v=elm.getAttribute(name);if(name=="class"&&!v)v=elm.className;if(tinyMCE.isGecko&&name=="src"&&elm.src!=null&&elm.src!="")v=elm.src;if(tinyMCE.isGecko&&name=="href"&&elm.href!=null&&elm.href!="")v=elm.href;if(name=="style"&&!tinyMCE.isOpera)v=elm.style.cssText;return(v&&v!="")?v:default_value;};TinyMCE.prototype.setAttrib=function(element,name,value,fix_value){if(typeof(value)=="number"&&value!=null)value=""+value;if(fix_value){if(value==null)value="";var re=new RegExp('[^0-9%]','g');value=value.replace(re,'');}if(name=="style")element.style.cssText=value;if(name=="class")element.className=value;if(value!=null&&value!=""&&value!=-1)element.setAttribute(name,value);else element.removeAttribute(name);};TinyMCE.prototype.setStyleAttrib=function(elm,name,value){eval('elm.style.'+name+'=value;');if(tinyMCE.isMSIE&&value==null||value==''){var str=tinyMCE.serializeStyle(tinyMCE.parseStyle(elm.style.cssText));elm.style.cssText=str;elm.setAttribute("style",str);}};TinyMCE.prototype.convertSpansToFonts=function(doc){var sizes=tinyMCE.getParam('font_size_style_values').replace(/\s+/,'').split(',');var h=doc.body.innerHTML;h=h.replace(/<span/gi,'<font');h=h.replace(/<\/span/gi,'</font');doc.body.innerHTML=h;var s=doc.getElementsByTagName("font");for(var i=0;i<s.length;i++){var size=tinyMCE.trim(s[i].style.fontSize).toLowerCase();var fSize=0;for(var x=0;x<sizes.length;x++){if(sizes[x]==size){fSize=x+1;break;}}if(fSize>0){tinyMCE.setAttrib(s[i],'size',fSize);s[i].style.fontSize='';}var fFace=s[i].style.fontFamily;if(fFace!=null&&fFace!=""){tinyMCE.setAttrib(s[i],'face',fFace);s[i].style.fontFamily='';}var fColor=s[i].style.color;if(fColor!=null&&fColor!=""){tinyMCE.setAttrib(s[i],'color',tinyMCE.convertRGBToHex(fColor));s[i].style.color='';}}};TinyMCE.prototype.convertFontsToSpans=function(doc){var sizes=tinyMCE.getParam('font_size_style_values').replace(/\s+/,'').split(',');var h=doc.body.innerHTML;h=h.replace(/<font/gi,'<span');h=h.replace(/<\/font/gi,'</span');doc.body.innerHTML=h;var fsClasses=tinyMCE.getParam('font_size_classes');if(fsClasses!='')fsClasses=fsClasses.replace(/\s+/,'').split(',');else fsClasses=null;var s=doc.getElementsByTagName("span");for(var i=0;i<s.length;i++){var fSize,fFace,fColor;fSize=tinyMCE.getAttrib(s[i],'size');fFace=tinyMCE.getAttrib(s[i],'face');fColor=tinyMCE.getAttrib(s[i],'color');if(fSize!=""){fSize=parseInt(fSize);if(fSize>0&&fSize<8){if(fsClasses!=null)tinyMCE.setAttrib(s[i],'class',fsClasses[fSize-1]);else s[i].style.fontSize=sizes[fSize-1];}s[i].removeAttribute('size');}if(fFace!=""){s[i].style.fontFamily=fFace;s[i].removeAttribute('face');}if(fColor!=""){s[i].style.color=fColor;s[i].removeAttribute('color');}}};TinyMCE.prototype.setInnerHTML=function(e,h){if(tinyMCE.isMSIE&&!tinyMCE.isOpera){e.innerHTML=tinyMCE.uniqueTag+h;e.firstChild.removeNode(true);}else{h=this.fixGeckoBaseHREFBug(1,e,h);e.innerHTML=h;this.fixGeckoBaseHREFBug(2,e,h);}};TinyMCE.prototype.fixGeckoBaseHREFBug=function(m,e,h){if(tinyMCE.isGecko){if(m==1){h=h.replace(/\ssrc=/gi," xsrc=");h=h.replace(/\shref=/gi," xhref=");return h;}else{if(h.indexOf(' xsrc')!=-1){var n=e.getElementsByTagName("img");for(var i=0;i<n.length;i++){var xsrc=tinyMCE.getAttrib(n[i],"xsrc");if(xsrc!=""){n[i].src=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'],xsrc);n[i].removeAttribute("xsrc");}}var n=e.getElementsByTagName("select");for(var i=0;i<n.length;i++){var xsrc=tinyMCE.getAttrib(n[i],"xsrc");if(xsrc!=""){n[i].src=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'],xsrc);n[i].removeAttribute("xsrc");}}var n=e.getElementsByTagName("iframe");for(var i=0;i<n.length;i++){var xsrc=tinyMCE.getAttrib(n[i],"xsrc");if(xsrc!=""){n[i].src=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'],xsrc);n[i].removeAttribute("xsrc");}}}if(h.indexOf(' xhref')!=-1){var n=e.getElementsByTagName("a");for(var i=0;i<n.length;i++){var xhref=tinyMCE.getAttrib(n[i],"xhref");if(xhref!=""){n[i].href=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'],xhref);n[i].removeAttribute("xhref");}}}}}return h;};TinyMCE.prototype.getOuterHTML=function(e){if(tinyMCE.isMSIE)return e.outerHTML;var d=e.ownerDocument.createElement("body");d.appendChild(e);return d.innerHTML;};TinyMCE.prototype.setOuterHTML=function(doc,e,h){if(tinyMCE.isMSIE){e.outerHTML=h;return;}var d=e.ownerDocument.createElement("body");d.innerHTML=h;e.parentNode.replaceChild(d.firstChild,e);};TinyMCE.prototype.insertAfter=function(nc,rc){if(rc.nextSibling)rc.parentNode.insertBefore(nc,rc.nextSibling);else rc.parentNode.appendChild(nc);};TinyMCE.prototype.cleanupAnchors=function(doc){var an=doc.getElementsByTagName("a");for(var i=0;i<an.length;i++){if(tinyMCE.getAttrib(an[i],"name")!=""){var cn=an[i].childNodes;for(var x=cn.length-1;x>=0;x--)tinyMCE.insertAfter(cn[x],an[i]);}}};TinyMCE.prototype._setHTML=function(doc,html_content){html_content=tinyMCE.cleanupHTMLCode(html_content);try{tinyMCE.setInnerHTML(doc.body,html_content);}catch(e){if(this.isMSIE)doc.body.createTextRange().pasteHTML(html_content);}if(tinyMCE.isMSIE&&tinyMCE.settings['fix_content_duplication']){var paras=doc.getElementsByTagName("P");for(var i=0;i<paras.length;i++){var node=paras[i];while((node=node.parentNode)!=null){if(node.nodeName=="P")node.outerHTML=node.innerHTML;}}var html=doc.body.innerHTML;if(html.indexOf('="mso')!=-1){for(var i=0;i<doc.body.all.length;i++){var el=doc.body.all[i];el.removeAttribute("className","",0);el.removeAttribute("style","",0);}html=doc.body.innerHTML;html=tinyMCE.regexpReplace(html,"<o:p><\/o:p>","<br />");html=tinyMCE.regexpReplace(html,"<o:p>&nbsp;<\/o:p>","");html=tinyMCE.regexpReplace(html,"<st1:.*?>","");html=tinyMCE.regexpReplace(html,"<p><\/p>","");html=tinyMCE.regexpReplace(html,"<p><\/p>\r\n<p><\/p>","");html=tinyMCE.regexpReplace(html,"<p>&nbsp;<\/p>","<br />");html=tinyMCE.regexpReplace(html,"<p>\s*(<p>\s*)?","<p>");html=tinyMCE.regexpReplace(html,"<\/p>\s*(<\/p>\s*)?","</p>");}tinyMCE.setInnerHTML(doc.body,html);}tinyMCE.cleanupAnchors(doc);if(tinyMCE.getParam("convert_fonts_to_spans"))tinyMCE.convertSpansToFonts(doc);};TinyMCE.prototype.getImageSrc=function(str){var pos=-1;if(!str)return "";if((pos=str.indexOf('this.src='))!=-1){var src=str.substring(pos+10);src=src.substring(0,src.indexOf('\''));return src;}return "";};TinyMCE.prototype._getElementById=function(element_id){var elm=document.getElementById(element_id);if(!elm){for(var j=0;j<document.forms.length;j++){for(var k=0;k<document.forms[j].elements.length;k++){if(document.forms[j].elements[k].name==element_id){elm=document.forms[j].elements[k];break;}}}}return elm;};TinyMCE.prototype.getEditorId=function(form_element){var inst=this.getInstanceById(form_element);if(!inst)return null;return inst.editorId;};TinyMCE.prototype.getInstanceById=function(editor_id){var inst=this.instances[editor_id];if(!inst){for(var n in tinyMCE.instances){var instance=tinyMCE.instances[n];if(!tinyMCE.isInstance(instance))continue;if(instance.formTargetElementId==editor_id){inst=instance;break;}}}return inst;};TinyMCE.prototype.queryInstanceCommandValue=function(editor_id,command){var inst=tinyMCE.getInstanceById(editor_id);if(inst)return inst.queryCommandValue(command);return false;};TinyMCE.prototype.queryInstanceCommandState=function(editor_id,command){var inst=tinyMCE.getInstanceById(editor_id);if(inst)return inst.queryCommandState(command);return null;};TinyMCE.prototype.setWindowArg=function(name,value){this.windowArgs[name]=value;};TinyMCE.prototype.getWindowArg=function(name,default_value){return(typeof(this.windowArgs[name])=="undefined")?default_value:this.windowArgs[name];};TinyMCE.prototype.getCSSClasses=function(editor_id,doc){var output=new Array();if(typeof(tinyMCE.cssClasses)!="undefined")return tinyMCE.cssClasses;if(typeof(editor_id)=="undefined"&&typeof(doc)=="undefined"){var instance;for(var instanceName in tinyMCE.instances){instance=tinyMCE.instances[instanceName];if(!tinyMCE.isInstance(instance))continue;break;}doc=instance.getDoc();}if(typeof(doc)=="undefined"){var instance=tinyMCE.getInstanceById(editor_id);doc=instance.getDoc();}if(doc){var styles=tinyMCE.isMSIE?doc.styleSheets:doc.styleSheets;if(styles&&styles.length>0){for(var x=0;x<styles.length;x++){var csses=null;eval("try {var csses = tinyMCE.isMSIE ? doc.styleSheets("+x+").rules : doc.styleSheets["+x+"].cssRules;} catch(e) {}");if(!csses)return new Array();for(var i=0;i<csses.length;i++){var selectorText=csses[i].selectorText;if(selectorText){var rules=selectorText.split(',');for(var c=0;c<rules.length;c++){if(rules[c].indexOf(' ')!=-1||rules[c].indexOf(':')!=-1||rules[c].indexOf('mceItem')!=-1)continue;if(rules[c]=="."+tinyMCE.settings['visual_table_class'])continue;if(rules[c].indexOf('.')!=-1){output[output.length]=rules[c].substring(rules[c].indexOf('.')+1);}}}}}}}if(output.length>0)tinyMCE.cssClasses=output;return output;};TinyMCE.prototype.regexpReplace=function(in_str,reg_exp,replace_str,opts){if(in_str==null)return in_str;if(typeof(opts)=="undefined")opts='g';var re=new RegExp(reg_exp,opts);return in_str.replace(re,replace_str);};TinyMCE.prototype.trim=function(str){return str.replace(/^\s*|\s*$/g,"");};TinyMCE.prototype.cleanupEventStr=function(str){str=""+str;str=str.replace('function anonymous()\n{\n','');str=str.replace('\n}','');str=str.replace(/^return true;/gi,'');return str;};TinyMCE.prototype.getAbsPosition=function(node){var pos=new Object();pos.absLeft=pos.absTop=0;var parentNode=node;while(parentNode){pos.absLeft+=parentNode.offsetLeft;pos.absTop+=parentNode.offsetTop;parentNode=parentNode.offsetParent;}return pos;};TinyMCE.prototype.getControlHTML=function(control_name){var themePlugins=tinyMCE.getParam('plugins','',true,',');var templateFunction;for(var i=themePlugins.length;i>=0;i--){templateFunction='TinyMCE_'+themePlugins[i]+"_getControlHTML";if(eval("typeof("+templateFunction+")")!='undefined'){var html=eval(templateFunction+"('"+control_name+"');");if(html!="")return tinyMCE.replaceVar(html,"pluginurl",tinyMCE.baseURL+"/plugins/"+themePlugins[i]);}}return eval('TinyMCE_'+tinyMCE.settings['theme']+"_getControlHTML"+"('"+control_name+"');");};TinyMCE.prototype._themeExecCommand=function(editor_id,element,command,user_interface,value){var themePlugins=tinyMCE.getParam('plugins','',true,',');var templateFunction;for(var i=themePlugins.length;i>=0;i--){templateFunction='TinyMCE_'+themePlugins[i]+"_execCommand";if(eval("typeof("+templateFunction+")")!='undefined'){if(eval(templateFunction+"(editor_id, element, command, user_interface, value);"))return true;}}templateFunction='TinyMCE_'+tinyMCE.settings['theme']+"_execCommand";if(eval("typeof("+templateFunction+")")!='undefined')return eval(templateFunction+"(editor_id, element, command, user_interface, value);");return false;};TinyMCE.prototype._getThemeFunction=function(suffix,skip_plugins){if(skip_plugins)return 'TinyMCE_'+tinyMCE.settings['theme']+suffix;var themePlugins=tinyMCE.getParam('plugins','',true,',');var templateFunction;for(var i=themePlugins.length;i>=0;i--){templateFunction='TinyMCE_'+themePlugins[i]+suffix;if(eval("typeof("+templateFunction+")")!='undefined')return templateFunction;}return 'TinyMCE_'+tinyMCE.settings['theme']+suffix;};TinyMCE.prototype.isFunc=function(func_name){if(func_name==null||func_name=="")return false;return eval("typeof("+func_name+")")!="undefined";};TinyMCE.prototype.exec=function(func_name,args){var str=func_name+'(';for(var i=3;i<args.length;i++){str+='args['+i+']';if(i<args.length-1)str+=',';}str+=');';return eval(str);};TinyMCE.prototype.executeCallback=function(param,suffix,mode){switch(mode){case 0:var state=false;var plugins=tinyMCE.getParam('plugins','',true,',');for(var i=0;i<plugins.length;i++){var func="TinyMCE_"+plugins[i]+suffix;if(tinyMCE.isFunc(func)){tinyMCE.exec(func,this.executeCallback.arguments);state=true;}}var func='TinyMCE_'+tinyMCE.settings['theme']+suffix;if(tinyMCE.isFunc(func)){tinyMCE.exec(func,this.executeCallback.arguments);state=true;}var func=tinyMCE.getParam(param,'');if(tinyMCE.isFunc(func)){tinyMCE.exec(func,this.executeCallback.arguments);state=true;}return state;case 1:var plugins=tinyMCE.getParam('plugins','',true,',');for(var i=0;i<plugins.length;i++){var func="TinyMCE_"+plugins[i]+suffix;if(tinyMCE.isFunc(func)){if(tinyMCE.exec(func,this.executeCallback.arguments))return true;}}var func='TinyMCE_'+tinyMCE.settings['theme']+suffix;if(tinyMCE.isFunc(func)){if(tinyMCE.exec(func,this.executeCallback.arguments))return true;}var func=tinyMCE.getParam(param,'');if(tinyMCE.isFunc(func)){if(tinyMCE.exec(func,this.executeCallback.arguments))return true;}return false;}};TinyMCE.prototype.debug=function(){var msg="";var elm=document.getElementById("tinymce_debug");if(!elm){var debugDiv=document.createElement("div");debugDiv.setAttribute("className","debugger");debugDiv.className="debugger";debugDiv.innerHTML='\\r
+                       Debug output:\\r
+                       <textarea id="tinymce_debug" style="width: 100%; height: 300px" wrap="nowrap"></textarea>';document.body.appendChild(debugDiv);elm=document.getElementById("tinymce_debug");}var args=this.debug.arguments;for(var i=0;i<args.length;i++){msg+=args[i];if(i<args.length-1)msg+=', ';}elm.value+=msg+"\n";};function TinyMCEControl(settings){this.undoLevels=new Array();this.undoIndex=0;this.typingUndoIndex=-1;this.undoRedo=true;this.isTinyMCEControl=true;this.settings=settings;this.settings['theme']=tinyMCE.getParam("theme","default");this.settings['width']=tinyMCE.getParam("width",-1);this.settings['height']=tinyMCE.getParam("height",-1);};TinyMCEControl.prototype.repaint=function(){if(tinyMCE.isMSIE&&!tinyMCE.isOpera)return;try{this.getBody().style.display='none';this.getDoc().execCommand('selectall',false,null);this.getSel().collapseToStart();this.getBody().style.display='block';}catch(ex){}};TinyMCEControl.prototype.switchSettings=function(){if(tinyMCE.configs.length>1&&tinyMCE.currentConfig!=this.settings['index']){tinyMCE.settings=this.settings;tinyMCE.currentConfig=this.settings['index'];}};TinyMCEControl.prototype.convertAllRelativeURLs=function(){var body=this.getBody();var elms=body.getElementsByTagName("img");for(var i=0;i<elms.length;i++){var src=tinyMCE.getAttrib(elms[i],'src');var msrc=tinyMCE.getAttrib(elms[i],'mce_src');if(msrc!="")src=msrc;if(src!=""){src=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'],src);elms[i].setAttribute("src",src);}}var elms=body.getElementsByTagName("a");for(var i=0;i<elms.length;i++){var href=tinyMCE.getAttrib(elms[i],'href');var mhref=tinyMCE.getAttrib(elms[i],'mce_href');if(mhref!="")href=mhref;if(href&&href!=""){href=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'],href);elms[i].setAttribute("href",href);}}};TinyMCEControl.prototype.getSelectedHTML=function(){if(tinyMCE.isSafari){return this.getRng().toString();}var elm=document.createElement("body");if(tinyMCE.isGecko)elm.appendChild(this.getRng().cloneContents());else elm.innerHTML=this.getRng().htmlText;return tinyMCE._cleanupHTML(this,this.contentDocument,this.settings,elm,this.visualAid);};TinyMCEControl.prototype.getBookmark=function(){var rng=this.getRng();if(tinyMCE.isSafari)return rng;if(tinyMCE.isMSIE)return rng;if(tinyMCE.isGecko)return rng.cloneRange();return null;};TinyMCEControl.prototype.moveToBookmark=function(bookmark){if(tinyMCE.isSafari){var sel=this.getSel().realSelection;sel.setBaseAndExtent(bookmark.startContainer,bookmark.startOffset,bookmark.endContainer,bookmark.endOffset);return true;}if(tinyMCE.isMSIE)return bookmark.select();if(tinyMCE.isGecko){var rng=this.getDoc().createRange();var sel=this.getSel();rng.setStart(bookmark.startContainer,bookmark.startOffset);rng.setEnd(bookmark.endContainer,bookmark.endOffset);sel.removeAllRanges();sel.addRange(rng);return true;}return false;};TinyMCEControl.prototype.getSelectedText=function(){if(tinyMCE.isMSIE){var doc=this.getDoc();if(doc.selection.type=="Text"){var rng=doc.selection.createRange();selectedText=rng.text;}else selectedText='';}else{var sel=this.getSel();if(sel&&sel.toString)selectedText=sel.toString();else selectedText='';}return selectedText;};TinyMCEControl.prototype.selectNode=function(node,collapse,select_text_node,to_start){if(!node)return;if(typeof(collapse)=="undefined")collapse=true;if(typeof(select_text_node)=="undefined")select_text_node=false;if(typeof(to_start)=="undefined")to_start=true;if(tinyMCE.isMSIE){var rng=this.getBody().createTextRange();try{rng.moveToElementText(node);if(collapse)rng.collapse(to_start);rng.select();}catch(e){}}else{var sel=this.getSel();if(!sel)return;if(tinyMCE.isSafari){sel.realSelection.setBaseAndExtent(node,0,node,node.innerText.length);if(collapse){if(to_start)sel.realSelection.collapseToStart();else sel.realSelection.collapseToEnd();}this.scrollToNode(node);return;}var rng=this.getDoc().createRange();if(select_text_node){var nodes=tinyMCE.getNodeTree(node,new Array(),3);if(nodes.length>0)rng.selectNodeContents(nodes[0]);else rng.selectNodeContents(node);}else rng.selectNode(node);if(collapse){if(!to_start&&node.nodeType==3){rng.setStart(node,node.nodeValue.length);rng.setEnd(node,node.nodeValue.length);}else rng.collapse(to_start);}sel.removeAllRanges();sel.addRange(rng);}this.scrollToNode(node);tinyMCE.selectedElement=null;if(node.nodeType==1)tinyMCE.selectedElement=node;};TinyMCEControl.prototype.scrollToNode=function(node){var pos=tinyMCE.getAbsPosition(node);var doc=this.getDoc();var scrollX=doc.body.scrollLeft+doc.documentElement.scrollLeft;var scrollY=doc.body.scrollTop+doc.documentElement.scrollTop;var height=tinyMCE.isMSIE?document.getElementById(this.editorId).style.pixelHeight:this.targetElement.clientHeight;if(!tinyMCE.settings['auto_resize']&&!(pos.absTop>scrollY&&pos.absTop<(scrollY-25+height)))this.contentWindow.scrollTo(pos.absLeft,pos.absTop-height+25);};TinyMCEControl.prototype.getBody=function(){return this.getDoc().body;};TinyMCEControl.prototype.getDoc=function(){return this.contentWindow.document;};TinyMCEControl.prototype.getWin=function(){return this.contentWindow;};TinyMCEControl.prototype.getSel=function(){if(tinyMCE.isMSIE&&!tinyMCE.isOpera)return this.getDoc().selection;var sel=this.contentWindow.getSelection();if(tinyMCE.isSafari&&!sel.getRangeAt){var newSel=new Object();var doc=this.getDoc();function getRangeAt(idx){var rng=new Object();rng.startContainer=this.focusNode;rng.endContainer=this.anchorNode;rng.commonAncestorContainer=this.focusNode;rng.createContextualFragment=function(html){if(html.charAt(0)=='<'){var elm=doc.createElement("div");elm.innerHTML=html;return elm.firstChild;}return doc.createTextNode("UNSUPPORTED, DUE TO LIMITATIONS IN SAFARI!");};rng.deleteContents=function(){doc.execCommand("Delete",false,"");};return rng;}newSel.focusNode=sel.baseNode;newSel.focusOffset=sel.baseOffset;newSel.anchorNode=sel.extentNode;newSel.anchorOffset=sel.extentOffset;newSel.getRangeAt=getRangeAt;newSel.text=""+sel;newSel.realSelection=sel;newSel.toString=function(){return this.text;};return newSel;}return sel;};TinyMCEControl.prototype.getRng=function(){var sel=this.getSel();if(sel==null)return null;if(tinyMCE.isMSIE&&!tinyMCE.isOpera)return sel.createRange();if(tinyMCE.isSafari){var rng=this.getDoc().createRange();var sel=this.getSel().realSelection;rng.setStart(sel.baseNode,sel.baseOffset);rng.setEnd(sel.extentNode,sel.extentOffset);return rng;}return this.getSel().getRangeAt(0);};TinyMCEControl.prototype._insertPara=function(e){function isEmpty(para){function isEmptyHTML(html){return html.replace(new RegExp('[ \t\r\n]+','g'),'').toLowerCase()=="";}if(para.getElementsByTagName("img").length>0)return false;if(para.getElementsByTagName("table").length>0)return false;if(para.getElementsByTagName("hr").length>0)return false;var nodes=tinyMCE.getNodeTree(para,new Array(),3);for(var i=0;i<nodes.length;i++){if(!isEmptyHTML(nodes[i].nodeValue))return false;}return true;}var doc=this.getDoc();var sel=this.getSel();var win=this.contentWindow;var rng=sel.getRangeAt(0);var body=doc.body;var rootElm=doc.documentElement;var self=this;var blockName="P";var rngBefore=doc.createRange();rngBefore.setStart(sel.anchorNode,sel.anchorOffset);rngBefore.collapse(true);var rngAfter=doc.createRange();rngAfter.setStart(sel.focusNode,sel.focusOffset);rngAfter.collapse(true);var direct=rngBefore.compareBoundaryPoints(rngBefore.START_TO_END,rngAfter)<0;var startNode=direct?sel.anchorNode:sel.focusNode;var startOffset=direct?sel.anchorOffset:sel.focusOffset;var endNode=direct?sel.focusNode:sel.anchorNode;var endOffset=direct?sel.focusOffset:sel.anchorOffset;startNode=startNode.nodeName=="BODY"?startNode.firstChild:startNode;endNode=endNode.nodeName=="BODY"?endNode.firstChild:endNode;var startBlock=tinyMCE.getParentBlockElement(startNode);var endBlock=tinyMCE.getParentBlockElement(endNode);if(startBlock!=null){blockName=startBlock.nodeName;if(blockName=="TD"||blockName=="TABLE"||(blockName=="DIV"&&new RegExp('left|right','gi').test(startBlock.style.cssFloat)))blockName="P";}if(tinyMCE.getParentElement(startBlock,"OL,UL")!=null)return false;if((startBlock!=null&&startBlock.nodeName=="TABLE")||(endBlock!=null&&endBlock.nodeName=="TABLE"))startBlock=endBlock=null;var paraBefore=(startBlock!=null&&startBlock.nodeName==blockName)?startBlock.cloneNode(false):doc.createElement(blockName);var paraAfter=(endBlock!=null&&endBlock.nodeName==blockName)?endBlock.cloneNode(false):doc.createElement(blockName);if(/^(H[1-6])$/.test(blockName))paraAfter=doc.createElement("p");var startChop=startNode;var endChop=endNode;node=startChop;do{if(node==body||node.nodeType==9||tinyMCE.isBlockElement(node))break;startChop=node;}while((node=node.previousSibling?node.previousSibling:node.parentNode));node=endChop;do{if(node==body||node.nodeType==9||tinyMCE.isBlockElement(node))break;endChop=node;}while((node=node.nextSibling?node.nextSibling:node.parentNode));if(startChop.nodeName=="TD")startChop=startChop.firstChild;if(endChop.nodeName=="TD")endChop=endChop.lastChild;if(startBlock==null){rng.deleteContents();sel.removeAllRanges();if(startChop!=rootElm&&endChop!=rootElm){rngBefore=rng.cloneRange();if(startChop==body)rngBefore.setStart(startChop,0);else rngBefore.setStartBefore(startChop);paraBefore.appendChild(rngBefore.cloneContents());if(endChop.parentNode.nodeName==blockName)endChop=endChop.parentNode;rng.setEndAfter(endChop);if(endChop.nodeName!="#text"&&endChop.nodeName!="BODY")rngBefore.setEndAfter(endChop);var contents=rng.cloneContents();if(contents.firstChild&&(contents.firstChild.nodeName==blockName||contents.firstChild.nodeName=="BODY"))paraAfter.innerHTML=contents.firstChild.innerHTML;else paraAfter.appendChild(contents);if(isEmpty(paraBefore))paraBefore.innerHTML="&nbsp;";if(isEmpty(paraAfter))paraAfter.innerHTML="&nbsp;";rng.deleteContents();rngAfter.deleteContents();rngBefore.deleteContents();paraAfter.normalize();rngBefore.insertNode(paraAfter);paraBefore.normalize();rngBefore.insertNode(paraBefore);}else{body.innerHTML="<"+blockName+">&nbsp;</"+blockName+"><"+blockName+">&nbsp;</"+blockName+">";paraAfter=body.childNodes[1];}this.selectNode(paraAfter,true,true);return true;}if(startChop.nodeName==blockName)rngBefore.setStart(startChop,0);else rngBefore.setStartBefore(startChop);rngBefore.setEnd(startNode,startOffset);paraBefore.appendChild(rngBefore.cloneContents());rngAfter.setEndAfter(endChop);rngAfter.setStart(endNode,endOffset);var contents=rngAfter.cloneContents();if(contents.firstChild&&contents.firstChild.nodeName==blockName){paraAfter.innerHTML=contents.firstChild.innerHTML;}else paraAfter.appendChild(contents);if(isEmpty(paraBefore))paraBefore.innerHTML="&nbsp;";if(isEmpty(paraAfter))paraAfter.innerHTML="&nbsp;";var rng=doc.createRange();if(!startChop.previousSibling&&startChop.parentNode.nodeName.toUpperCase()==blockName){rng.setStartBefore(startChop.parentNode);}else{if(rngBefore.startContainer.nodeName.toUpperCase()==blockName&&rngBefore.startOffset==0)rng.setStartBefore(rngBefore.startContainer);else rng.setStart(rngBefore.startContainer,rngBefore.startOffset);}if(!endChop.nextSibling&&endChop.parentNode.nodeName.toUpperCase()==blockName)rng.setEndAfter(endChop.parentNode);else rng.setEnd(rngAfter.endContainer,rngAfter.endOffset);rng.deleteContents();rng.insertNode(paraAfter);rng.insertNode(paraBefore);paraAfter.normalize();paraBefore.normalize();this.selectNode(paraAfter,true,true);return true;};TinyMCEControl.prototype._handleBackSpace=function(evt_type){var doc=this.getDoc();var sel=this.getSel();if(sel==null)return false;var rng=sel.getRangeAt(0);var node=rng.startContainer;var elm=node.nodeType==3?node.parentNode:node;if(node==null)return;if(elm&&elm.nodeName==""){var para=doc.createElement("p");while(elm.firstChild)para.appendChild(elm.firstChild);elm.parentNode.insertBefore(para,elm);elm.parentNode.removeChild(elm);var rng=rng.cloneRange();rng.setStartBefore(node.nextSibling);rng.setEndAfter(node.nextSibling);rng.extractContents();this.selectNode(node.nextSibling,true,true);}var para=tinyMCE.getParentBlockElement(node);if(para!=null&&para.nodeName.toLowerCase()=='p'&&evt_type=="keypress"){var htm=para.innerHTML;var block=tinyMCE.getParentBlockElement(node);if(htm==""||htm=="&nbsp;"||block.nodeName.toLowerCase()=="li"){var prevElm=para.previousSibling;while(prevElm!=null&&prevElm.nodeType!=1)prevElm=prevElm.previousSibling;if(prevElm==null)return false;var nodes=tinyMCE.getNodeTree(prevElm,new Array(),3);var lastTextNode=nodes.length==0?null:nodes[nodes.length-1];if(lastTextNode!=null)this.selectNode(lastTextNode,true,false,false);para.parentNode.removeChild(para);return true;}}return false;};TinyMCEControl.prototype._insertSpace=function(){return true;};TinyMCEControl.prototype.autoResetDesignMode=function(){if(!tinyMCE.isMSIE&&tinyMCE.settings['auto_reset_designmode']&&this.isHidden())eval('try { this.getDoc().designMode = "On"; } catch(e) {}');};TinyMCEControl.prototype.isHidden=function(){if(tinyMCE.isMSIE)return false;var sel=this.getSel();return(!sel||!sel.rangeCount||sel.rangeCount==0);};TinyMCEControl.prototype.isDirty=function(){return this.startContent!=tinyMCE.trim(this.getBody().innerHTML)&&!tinyMCE.isNotDirty;};TinyMCEControl.prototype._mergeElements=function(scmd,pa,ch,override){if(scmd=="removeformat"){pa.className="";pa.style.cssText="";ch.className="";ch.style.cssText="";return;}var st=tinyMCE.parseStyle(tinyMCE.getAttrib(pa,"style"));var stc=tinyMCE.parseStyle(tinyMCE.getAttrib(ch,"style"));var className=tinyMCE.getAttrib(pa,"class");className+=" "+tinyMCE.getAttrib(ch,"class");if(override){for(var n in st){if(typeof(st[n])=='function')continue;stc[n]=st[n];}}else{for(var n in stc){if(typeof(stc[n])=='function')continue;st[n]=stc[n];}}tinyMCE.setAttrib(pa,"style",tinyMCE.serializeStyle(st));tinyMCE.setAttrib(pa,"class",tinyMCE.trim(className));ch.className="";ch.style.cssText="";ch.removeAttribute("class");ch.removeAttribute("style");};TinyMCEControl.prototype.setUseCSS=function(b){var doc=this.getDoc();try{doc.execCommand("useCSS",false,!b);}catch(ex){}try{doc.execCommand("styleWithCSS",false,b);}catch(ex){}if(!tinyMCE.getParam("table_inline_editing"))try{doc.execCommand('enableInlineTableEditing',false,"false");}catch(ex){}if(!tinyMCE.getParam("object_resizing"))try{doc.execCommand('enableObjectResizing',false,"false");}catch(ex){}};TinyMCEControl.prototype.execCommand=function(command,user_interface,value){var doc=this.getDoc();var win=this.getWin();var focusElm=this.getFocusElement();if(this.lastSafariSelection&&!new RegExp('mceStartTyping|mceEndTyping|mceBeginUndoLevel|mceEndUndoLevel|mceAddUndoLevel','gi').test(command)){this.moveToBookmark(this.lastSafariSelection);tinyMCE.selectedElement=this.lastSafariSelectedElement;}if(!tinyMCE.isMSIE&&!this.useCSS){this.setUseCSS(false);this.useCSS=true;}this.contentDocument=doc;if(tinyMCE._themeExecCommand(this.editorId,this.getBody(),command,user_interface,value))return;if(focusElm&&focusElm.nodeName=="IMG"){var align=focusElm.getAttribute('align');var img=command=="JustifyCenter"?focusElm.cloneNode(false):focusElm;switch(command){case "JustifyLeft":if(align=='left')img.removeAttribute('align');else img.setAttribute('align','left');var div=focusElm.parentNode;if(div&&div.nodeName=="DIV"&&div.childNodes.length==1&&div.parentNode)div.parentNode.replaceChild(img,div);this.selectNode(img);this.repaint();tinyMCE.triggerNodeChange();return;case "JustifyCenter":img.removeAttribute('align');var div=tinyMCE.getParentElement(focusElm,"div");if(div&&div.style.textAlign=="center"){if(div.nodeName=="DIV"&&div.childNodes.length==1&&div.parentNode)div.parentNode.replaceChild(img,div);}else{var div=this.getDoc().createElement("div");div.style.textAlign='center';div.appendChild(img);focusElm.parentNode.replaceChild(div,focusElm);}this.selectNode(img);this.repaint();tinyMCE.triggerNodeChange();return;case "JustifyRight":if(align=='right')img.removeAttribute('align');else img.setAttribute('align','right');var div=focusElm.parentNode;if(div&&div.nodeName=="DIV"&&div.childNodes.length==1&&div.parentNode)div.parentNode.replaceChild(img,div);this.selectNode(img);this.repaint();tinyMCE.triggerNodeChange();return;}}if(tinyMCE.settings['force_br_newlines']){var alignValue="";if(doc.selection.type!="Control"){switch(command){case "JustifyLeft":alignValue="left";break;case "JustifyCenter":alignValue="center";break;case "JustifyFull":alignValue="justify";break;case "JustifyRight":alignValue="right";break;}if(alignValue!=""){var rng=doc.selection.createRange();if((divElm=tinyMCE.getParentElement(rng.parentElement(),"div"))!=null)divElm.setAttribute("align",alignValue);else if(rng.pasteHTML&&rng.htmlText.length>0)rng.pasteHTML('<div align="'+alignValue+'">'+rng.htmlText+"</div>");tinyMCE.triggerNodeChange();return;}}}switch(command){case "mceRepaint":this.repaint();return true;case "mceStoreSelection":this.selectionBookmark=this.getBookmark();return true;case "mceRestoreSelection":this.moveToBookmark(this.selectionBookmark);return true;case "InsertUnorderedList":case "InsertOrderedList":var tag=(command=="InsertUnorderedList")?"ul":"ol";if(tinyMCE.isSafari)this.execCommand("mceInsertContent",false,"<"+tag+"><li>&nbsp;</li><"+tag+">");else this.getDoc().execCommand(command,user_interface,value);tinyMCE.triggerNodeChange();break;case "Strikethrough":if(tinyMCE.isSafari)this.execCommand("mceInsertContent",false,"<strike>"+this.getSelectedHTML()+"</strike>");else this.getDoc().execCommand(command,user_interface,value);tinyMCE.triggerNodeChange();break;case "mceSelectNode":this.selectNode(value);tinyMCE.triggerNodeChange();tinyMCE.selectedNode=value;break;case "FormatBlock":if(value==null||value==""){var elm=tinyMCE.getParentElement(this.getFocusElement(),"p,div,h1,h2,h3,h4,h5,h6,pre,address");if(elm)this.execCommand("mceRemoveNode",false,elm);}else this.getDoc().execCommand("FormatBlock",false,value);tinyMCE.triggerNodeChange();break;case "mceRemoveNode":if(!value)value=tinyMCE.getParentElement(this.getFocusElement());if(tinyMCE.isMSIE){value.outerHTML=value.innerHTML;}else{var rng=value.ownerDocument.createRange();rng.setStartBefore(value);rng.setEndAfter(value);rng.deleteContents();rng.insertNode(rng.createContextualFragment(value.innerHTML));}tinyMCE.triggerNodeChange();break;case "mceSelectNodeDepth":var parentNode=this.getFocusElement();for(var i=0;parentNode;i++){if(parentNode.nodeName.toLowerCase()=="body")break;if(parentNode.nodeName.toLowerCase()=="#text"){i--;parentNode=parentNode.parentNode;continue;}if(i==value){this.selectNode(parentNode,false);tinyMCE.triggerNodeChange();tinyMCE.selectedNode=parentNode;return;}parentNode=parentNode.parentNode;}break;case "SetStyleInfo":var rng=this.getRng();var sel=this.getSel();var scmd=value['command'];var sname=value['name'];var svalue=value['value']==null?'':value['value'];var wrapper=value['wrapper']?value['wrapper']:"span";var parentElm=null;var invalidRe=new RegExp("^BODY|HTML$","g");var invalidParentsRe=tinyMCE.settings['merge_styles_invalid_parents']!=''?new RegExp(tinyMCE.settings['merge_styles_invalid_parents'],"gi"):null;if(tinyMCE.isMSIE){if(rng.item)parentElm=rng.item(0);else{var pelm=rng.parentElement();var prng=doc.selection.createRange();prng.moveToElementText(pelm);if(rng.htmlText==prng.htmlText||rng.boundingWidth==0){if(invalidParentsRe==null||!invalidParentsRe.test(pelm.nodeName))parentElm=pelm;}}}else{var felm=this.getFocusElement();if(sel.isCollapsed||(/td|tr|tbody|table/ig.test(felm.nodeName)&&sel.anchorNode==felm.parentNode))parentElm=felm;}if(parentElm&&!invalidRe.test(parentElm.nodeName)){if(scmd=="setstyle")tinyMCE.setStyleAttrib(parentElm,sname,svalue);if(scmd=="setattrib")tinyMCE.setAttrib(parentElm,sname,svalue);if(scmd=="removeformat"){parentElm.style.cssText='';tinyMCE.setAttrib(parentElm,'class','');}var ch=tinyMCE.getNodeTree(parentElm,new Array(),1);for(var z=0;z<ch.length;z++){if(ch[z]==parentElm)continue;if(scmd=="setstyle")tinyMCE.setStyleAttrib(ch[z],sname,'');if(scmd=="setattrib")tinyMCE.setAttrib(ch[z],sname,'');if(scmd=="removeformat"){ch[z].style.cssText='';tinyMCE.setAttrib(ch[z],'class','');}}}else{doc.execCommand("fontname",false,"#mce_temp_font#");var elementArray=tinyMCE.getElementsByAttributeValue(this.getBody(),"font","face","#mce_temp_font#");for(var x=0;x<elementArray.length;x++){elm=elementArray[x];if(elm){var spanElm=doc.createElement(wrapper);if(scmd=="setstyle")tinyMCE.setStyleAttrib(spanElm,sname,svalue);if(scmd=="setattrib")tinyMCE.setAttrib(spanElm,sname,svalue);if(scmd=="removeformat"){spanElm.style.cssText='';tinyMCE.setAttrib(spanElm,'class','');}if(elm.hasChildNodes()){for(var i=0;i<elm.childNodes.length;i++)spanElm.appendChild(elm.childNodes[i].cloneNode(true));}spanElm.setAttribute("mce_new","true");elm.parentNode.replaceChild(spanElm,elm);var ch=tinyMCE.getNodeTree(spanElm,new Array(),1);for(var z=0;z<ch.length;z++){if(ch[z]==spanElm)continue;if(scmd=="setstyle")tinyMCE.setStyleAttrib(ch[z],sname,'');if(scmd=="setattrib")tinyMCE.setAttrib(ch[z],sname,'');if(scmd=="removeformat"){ch[z].style.cssText='';tinyMCE.setAttrib(ch[z],'class','');}}}}}var nodes=doc.getElementsByTagName(wrapper);for(var i=nodes.length-1;i>=0;i--){var elm=nodes[i];var isNew=tinyMCE.getAttrib(elm,"mce_new")=="true";elm.removeAttribute("mce_new");if(elm.childNodes&&elm.childNodes.length==1&&elm.childNodes[0].nodeType==1){this._mergeElements(scmd,elm,elm.childNodes[0],isNew);continue;}if(elm.parentNode.childNodes.length==1&&!invalidRe.test(elm.nodeName)&&!invalidRe.test(elm.parentNode.nodeName)){if(invalidParentsRe==null||!invalidParentsRe.test(elm.parentNode.nodeName))this._mergeElements(scmd,elm.parentNode,elm,false);}}var nodes=doc.getElementsByTagName(wrapper);for(var i=nodes.length-1;i>=0;i--){var elm=nodes[i];var isEmpty=true;var tmp=doc.createElement("body");tmp.appendChild(elm.cloneNode(false));tmp.innerHTML=tmp.innerHTML.replace(new RegExp('style=""|class=""','gi'),'');if(new RegExp('<span>','gi').test(tmp.innerHTML)){for(var x=0;x<elm.childNodes.length;x++){if(elm.parentNode!=null)elm.parentNode.insertBefore(elm.childNodes[x].cloneNode(true),elm);}elm.parentNode.removeChild(elm);}}if(scmd=="removeformat")tinyMCE.handleVisualAid(this.getBody(),true,this.visualAid,this);tinyMCE.triggerNodeChange();break;case "FontName":if(value==null){var s=this.getSel();if(tinyMCE.isGecko&&s.isCollapsed){var f=tinyMCE.getParentElement(this.getFocusElement(),"font");if(f!=null)this.selectNode(f,false);}this.getDoc().execCommand("RemoveFormat",false,null);if(f!=null&&tinyMCE.isGecko){var r=this.getRng().cloneRange();r.collapse(true);s.removeAllRanges();s.addRange(r);}}else this.getDoc().execCommand('FontName',false,value);if(tinyMCE.isGecko)window.setTimeout('tinyMCE.triggerNodeChange(false);',1);return;case "FontSize":this.getDoc().execCommand('FontSize',false,value);if(tinyMCE.isGecko)window.setTimeout('tinyMCE.triggerNodeChange(false);',1);return;case "forecolor":this.getDoc().execCommand('forecolor',false,value);break;case "HiliteColor":if(tinyMCE.isGecko){this.setUseCSS(true);this.getDoc().execCommand('hilitecolor',false,value);this.setUseCSS(false);}else this.getDoc().execCommand('BackColor',false,value);break;case "Cut":case "Copy":case "Paste":var cmdFailed=false;eval('try {this.getDoc().execCommand(command, user_interface, value);} catch (e) {cmdFailed = true;}');if(tinyMCE.isOpera&&cmdFailed)alert('Currently not supported by your browser, use keyboard shortcuts instead.');if(tinyMCE.isGecko&&cmdFailed){if(confirm(tinyMCE.getLang('lang_clipboard_msg')))window.open('http://www.mozilla.org/editor/midasdemo/securityprefs.html','mceExternal');return;}else tinyMCE.triggerNodeChange();break;case "mceSetContent":if(!value)value="";value=tinyMCE.storeAwayURLs(value);value=tinyMCE._customCleanup(this,"insert_to_editor",value);tinyMCE._setHTML(doc,value);tinyMCE.setInnerHTML(doc.body,tinyMCE._cleanupHTML(this,doc,tinyMCE.settings,doc.body));this.convertAllRelativeURLs();tinyMCE.handleVisualAid(doc.body,true,this.visualAid,this);tinyMCE._setEventsEnabled(doc.body,false);return true;case "mceLink":var selectedText="";if(tinyMCE.isMSIE){var rng=doc.selection.createRange();selectedText=rng.text;}else selectedText=this.getSel().toString();if(!tinyMCE.linkElement){if((tinyMCE.selectedElement.nodeName.toLowerCase()!="img")&&(selectedText.length<=0))return;}var href="",target="",title="",onclick="",action="insert",style_class="";if(tinyMCE.selectedElement.nodeName.toLowerCase()=="a")tinyMCE.linkElement=tinyMCE.selectedElement;if(tinyMCE.linkElement!=null&&tinyMCE.getAttrib(tinyMCE.linkElement,'href')=="")tinyMCE.linkElement=null;if(tinyMCE.linkElement){href=tinyMCE.getAttrib(tinyMCE.linkElement,'href');target=tinyMCE.getAttrib(tinyMCE.linkElement,'target');title=tinyMCE.getAttrib(tinyMCE.linkElement,'title');onclick=tinyMCE.getAttrib(tinyMCE.linkElement,'onclick');style_class=tinyMCE.getAttrib(tinyMCE.linkElement,'class');if(onclick=="")onclick=tinyMCE.getAttrib(tinyMCE.linkElement,'onclick');onclick=tinyMCE.cleanupEventStr(onclick);href=eval(tinyMCE.settings['urlconverter_callback']+"(href, tinyMCE.linkElement, true);");mceRealHref=tinyMCE.getAttrib(tinyMCE.linkElement,'mce_href');if(mceRealHref!=""){href=mceRealHref;if(tinyMCE.getParam('convert_urls'))href=eval(tinyMCE.settings['urlconverter_callback']+"(href, tinyMCE.linkElement, true);");}action="update";}if(this.settings['insertlink_callback']){var returnVal=eval(this.settings['insertlink_callback']+"(href, target, title, onclick, action, style_class);");if(returnVal&&returnVal['href'])tinyMCE.insertLink(returnVal['href'],returnVal['target'],returnVal['title'],returnVal['onclick'],returnVal['style_class']);}else{tinyMCE.openWindow(this.insertLinkTemplate,{href:href,target:target,title:title,onclick:onclick,action:action,className:style_class,inline:"yes"});}break;case "mceImage":var src="",alt="",border="",hspace="",vspace="",width="",height="",align="";var title="",onmouseover="",onmouseout="",action="insert";var img=tinyMCE.imgElement;if(tinyMCE.selectedElement!=null&&tinyMCE.selectedElement.nodeName.toLowerCase()=="img"){img=tinyMCE.selectedElement;tinyMCE.imgElement=img;}if(img){if(tinyMCE.getAttrib(img,'name').indexOf('mce_')==0)return;src=tinyMCE.getAttrib(img,'src');alt=tinyMCE.getAttrib(img,'alt');if(alt=="")alt=tinyMCE.getAttrib(img,'title');if(tinyMCE.isGecko){var w=img.style.width;if(w!=null&&w!="")img.setAttribute("width",w);var h=img.style.height;if(h!=null&&h!="")img.setAttribute("height",h);}border=tinyMCE.getAttrib(img,'border');hspace=tinyMCE.getAttrib(img,'hspace');vspace=tinyMCE.getAttrib(img,'vspace');width=tinyMCE.getAttrib(img,'width');height=tinyMCE.getAttrib(img,'height');align=tinyMCE.getAttrib(img,'align');onmouseover=tinyMCE.getAttrib(img,'onmouseover');onmouseout=tinyMCE.getAttrib(img,'onmouseout');title=tinyMCE.getAttrib(img,'title');if(tinyMCE.isMSIE){width=img.attributes['width'].specified?width:"";height=img.attributes['height'].specified?height:"";}onmouseover=tinyMCE.getImageSrc(tinyMCE.cleanupEventStr(onmouseover));onmouseout=tinyMCE.getImageSrc(tinyMCE.cleanupEventStr(onmouseout));src=eval(tinyMCE.settings['urlconverter_callback']+"(src, img, true);");mceRealSrc=tinyMCE.getAttrib(img,'mce_src');if(mceRealSrc!=""){src=mceRealSrc;if(tinyMCE.getParam('convert_urls'))src=eval(tinyMCE.settings['urlconverter_callback']+"(src, img, true);");}if(onmouseover!="")onmouseover=eval(tinyMCE.settings['urlconverter_callback']+"(onmouseover, img, true);");if(onmouseout!="")onmouseout=eval(tinyMCE.settings['urlconverter_callback']+"(onmouseout, img, true);");action="update";}if(this.settings['insertimage_callback']){var returnVal=eval(this.settings['insertimage_callback']+"(src, alt, border, hspace, vspace, width, height, align, title, onmouseover, onmouseout, action);");if(returnVal&&returnVal['src'])tinyMCE.insertImage(returnVal['src'],returnVal['alt'],returnVal['border'],returnVal['hspace'],returnVal['vspace'],returnVal['width'],returnVal['height'],returnVal['align'],returnVal['title'],returnVal['onmouseover'],returnVal['onmouseout']);}else tinyMCE.openWindow(this.insertImageTemplate,{src:src,alt:alt,border:border,hspace:hspace,vspace:vspace,width:width,height:height,align:align,title:title,onmouseover:onmouseover,onmouseout:onmouseout,action:action,inline:"yes"});break;case "mceCleanup":tinyMCE._setHTML(this.contentDocument,this.getBody().innerHTML);tinyMCE.setInnerHTML(this.getBody(),tinyMCE._cleanupHTML(this,this.contentDocument,this.settings,this.getBody(),this.visualAid));this.convertAllRelativeURLs();tinyMCE.handleVisualAid(this.getBody(),true,this.visualAid,this);tinyMCE._setEventsEnabled(this.getBody(),false);this.repaint();tinyMCE.triggerNodeChange();break;case "mceReplaceContent":this.getWin().focus();var selectedText="";if(tinyMCE.isMSIE){var rng=doc.selection.createRange();selectedText=rng.text;}else selectedText=this.getSel().toString();if(selectedText.length>0){value=tinyMCE.replaceVar(value,"selection",selectedText);tinyMCE.execCommand('mceInsertContent',false,value);}tinyMCE.triggerNodeChange();break;case "mceSetAttribute":if(typeof(value)=='object'){var targetElms=(typeof(value['targets'])=="undefined")?"p,img,span,div,td,h1,h2,h3,h4,h5,h6,pre,address":value['targets'];var targetNode=tinyMCE.getParentElement(this.getFocusElement(),targetElms);if(targetNode){targetNode.setAttribute(value['name'],value['value']);tinyMCE.triggerNodeChange();}}break;case "mceSetCSSClass":this.execCommand("SetStyleInfo",false,{command:"setattrib",name:"class",value:value});break;case "mceInsertRawHTML":var key='tiny_mce_marker';this.execCommand('mceBeginUndoLevel');this.execCommand('mceInsertContent',false,key);var scrollX=this.getDoc().body.scrollLeft+this.getDoc().documentElement.scrollLeft;var scrollY=this.getDoc().body.scrollTop+this.getDoc().documentElement.scrollTop;var html=this.getBody().innerHTML;if((pos=html.indexOf(key))!=-1)tinyMCE.setInnerHTML(this.getBody(),html.substring(0,pos)+value+html.substring(pos+key.length));this.contentWindow.scrollTo(scrollX,scrollY);this.execCommand('mceEndUndoLevel');break;case "mceInsertContent":var insertHTMLFailed=false;this.getWin().focus();if(tinyMCE.isGecko||tinyMCE.isOpera){try{if(value.indexOf('<')==-1){var r=this.getRng();var n=this.getDoc().createTextNode(tinyMCE.entityDecode(value));var s=this.getSel();var r2=r.cloneRange();s.removeAllRanges();r.deleteContents();r.insertNode(n);r2.selectNode(n);r2.collapse(false);s.removeAllRanges();s.addRange(r2);}else{value=tinyMCE.fixGeckoBaseHREFBug(1,this.getDoc(),value);this.getDoc().execCommand('inserthtml',false,value);tinyMCE.fixGeckoBaseHREFBug(2,this.getDoc(),value);}}catch(ex){insertHTMLFailed=true;}if(!insertHTMLFailed){tinyMCE.triggerNodeChange();return;}}if(tinyMCE.isOpera&&insertHTMLFailed){this.getDoc().execCommand("insertimage",false,tinyMCE.uniqueURL);var ar=tinyMCE.getElementsByAttributeValue(this.getBody(),"img","src",tinyMCE.uniqueURL);ar[0].outerHTML=value;return;}if(!tinyMCE.isMSIE){var isHTML=value.indexOf('<')!=-1;var sel=this.getSel();var rng=this.getRng();if(isHTML){if(tinyMCE.isSafari){var tmpRng=this.getDoc().createRange();tmpRng.setStart(this.getBody(),0);tmpRng.setEnd(this.getBody(),0);value=tmpRng.createContextualFragment(value);}else value=rng.createContextualFragment(value);}else{var el=document.createElement("div");el.innerHTML=value;value=el.firstChild.nodeValue;value=doc.createTextNode(value);}if(tinyMCE.isSafari&&!isHTML){this.execCommand('InsertText',false,value.nodeValue);tinyMCE.triggerNodeChange();return true;}else if(tinyMCE.isSafari&&isHTML){rng.deleteContents();rng.insertNode(value);tinyMCE.triggerNodeChange();return true;}rng.deleteContents();if(rng.startContainer.nodeType==3){var node=rng.startContainer.splitText(rng.startOffset);node.parentNode.insertBefore(value,node);}else rng.insertNode(value);if(!isHTML){sel.selectAllChildren(doc.body);sel.removeAllRanges();var rng=doc.createRange();rng.selectNode(value);rng.collapse(false);sel.addRange(rng);}else rng.collapse(false);}else{var rng=doc.selection.createRange();var c=value.indexOf('<!--')!=-1;if(c)value=tinyMCE.uniqueTag+value;if(rng.item)rng.item(0).outerHTML=value;else rng.pasteHTML(value);if(c){var e=this.getDoc().getElementById('mceTMPElement');e.parentNode.removeChild(e);}}tinyMCE.triggerNodeChange();break;case "mceStartTyping":if(tinyMCE.settings['custom_undo_redo']&&this.typingUndoIndex==-1){this.typingUndoIndex=this.undoIndex;this.execCommand('mceAddUndoLevel');}break;case "mceEndTyping":if(tinyMCE.settings['custom_undo_redo']&&this.typingUndoIndex!=-1){this.execCommand('mceAddUndoLevel');this.typingUndoIndex=-1;}break;case "mceBeginUndoLevel":this.undoRedo=false;break;case "mceEndUndoLevel":this.undoRedo=true;this.execCommand('mceAddUndoLevel');break;case "mceAddUndoLevel":if(tinyMCE.settings['custom_undo_redo']&&this.undoRedo){if(this.typingUndoIndex!=-1){this.undoIndex=this.typingUndoIndex;}var newHTML=tinyMCE.trim(this.getBody().innerHTML);if(newHTML!=this.undoLevels[this.undoIndex]){tinyMCE.executeCallback('onchange_callback','_onchange',0,this);var customUndoLevels=tinyMCE.settings['custom_undo_redo_levels'];if(customUndoLevels!=-1&&this.undoLevels.length>customUndoLevels){for(var i=0;i<this.undoLevels.length-1;i++){this.undoLevels[i]=this.undoLevels[i+1];}this.undoLevels.length--;this.undoIndex--;}this.undoIndex++;this.undoLevels[this.undoIndex]=newHTML;this.undoLevels.length=this.undoIndex+1;tinyMCE.triggerNodeChange(false);}}break;case "Undo":if(tinyMCE.settings['custom_undo_redo']){tinyMCE.execCommand("mceEndTyping");if(this.undoIndex>0){this.undoIndex--;tinyMCE.setInnerHTML(this.getBody(),this.undoLevels[this.undoIndex]);this.repaint();}tinyMCE.triggerNodeChange();}else this.getDoc().execCommand(command,user_interface,value);break;case "Redo":if(tinyMCE.settings['custom_undo_redo']){tinyMCE.execCommand("mceEndTyping");if(this.undoIndex<(this.undoLevels.length-1)){this.undoIndex++;tinyMCE.setInnerHTML(this.getBody(),this.undoLevels[this.undoIndex]);this.repaint();}tinyMCE.triggerNodeChange();}else this.getDoc().execCommand(command,user_interface,value);break;case "mceToggleVisualAid":this.visualAid=!this.visualAid;tinyMCE.handleVisualAid(this.getBody(),true,this.visualAid,this);tinyMCE.triggerNodeChange();break;case "Indent":this.getDoc().execCommand(command,user_interface,value);tinyMCE.triggerNodeChange();if(tinyMCE.isMSIE){var n=tinyMCE.getParentElement(this.getFocusElement(),"blockquote");do{if(n&&n.nodeName=="BLOCKQUOTE"){n.removeAttribute("dir");n.removeAttribute("style");}}while(n!=null&&(n=n.parentNode)!=null);}break;case "removeformat":var text=this.getSelectedText();if(tinyMCE.isOpera){this.getDoc().execCommand("RemoveFormat",false,null);return;}if(tinyMCE.isMSIE){try{var rng=doc.selection.createRange();rng.execCommand("RemoveFormat",false,null);}catch(e){}this.execCommand("SetStyleInfo",false,{command:"removeformat"});}else{this.getDoc().execCommand(command,user_interface,value);this.execCommand("SetStyleInfo",false,{command:"removeformat"});}if(text.length==0)this.execCommand("mceSetCSSClass",false,"");tinyMCE.triggerNodeChange();break;default:this.getDoc().execCommand(command,user_interface,value);if(tinyMCE.isGecko)window.setTimeout('tinyMCE.triggerNodeChange(false);',1);else tinyMCE.triggerNodeChange();}if(command!="mceAddUndoLevel"&&command!="Undo"&&command!="Redo"&&command!="mceStartTyping"&&command!="mceEndTyping")tinyMCE.execCommand("mceAddUndoLevel");};TinyMCEControl.prototype.queryCommandValue=function(command){try{return this.getDoc().queryCommandValue(command);}catch(ex){return null;}};TinyMCEControl.prototype.queryCommandState=function(command){return this.getDoc().queryCommandState(command);};TinyMCEControl.prototype.onAdd=function(replace_element,form_element_name,target_document){var targetDoc=target_document?target_document:document;this.targetDoc=targetDoc;tinyMCE.themeURL=tinyMCE.baseURL+"/themes/"+this.settings['theme'];this.settings['themeurl']=tinyMCE.themeURL;if(!replace_element){alert("Error: Could not find the target element.");return false;}var templateFunction=tinyMCE._getThemeFunction('_getInsertLinkTemplate');if(eval("typeof("+templateFunction+")")!='undefined')this.insertLinkTemplate=eval(templateFunction+'(this.settings);');var templateFunction=tinyMCE._getThemeFunction('_getInsertImageTemplate');if(eval("typeof("+templateFunction+")")!='undefined')this.insertImageTemplate=eval(templateFunction+'(this.settings);');var templateFunction=tinyMCE._getThemeFunction('_getEditorTemplate');if(eval("typeof("+templateFunction+")")=='undefined'){alert("Error: Could not find the template function: "+templateFunction);return false;}var editorTemplate=eval(templateFunction+'(this.settings, this.editorId);');var deltaWidth=editorTemplate['delta_width']?editorTemplate['delta_width']:0;var deltaHeight=editorTemplate['delta_height']?editorTemplate['delta_height']:0;var html='<span id="'+this.editorId+'_parent">'+editorTemplate['html'];var templateFunction=tinyMCE._getThemeFunction('_handleNodeChange',true);if(eval("typeof("+templateFunction+")")!='undefined')this.settings['handleNodeChangeCallback']=templateFunction;html=tinyMCE.replaceVar(html,"editor_id",this.editorId);this.settings['default_document']=tinyMCE.baseURL+"/blank.htm";this.settings['old_width']=this.settings['width'];this.settings['old_height']=this.settings['height'];if(this.settings['width']==-1)this.settings['width']=replace_element.offsetWidth;if(this.settings['height']==-1)this.settings['height']=replace_element.offsetHeight;if(this.settings['width']==0)this.settings['width']=replace_element.style.width;if(this.settings['height']==0)this.settings['height']=replace_element.style.height;if(this.settings['width']==0)this.settings['width']=320;if(this.settings['height']==0)this.settings['height']=240;this.settings['area_width']=parseInt(this.settings['width']);this.settings['area_height']=parseInt(this.settings['height']);this.settings['area_width']+=deltaWidth;this.settings['area_height']+=deltaHeight;if((""+this.settings['width']).indexOf('%')!=-1)this.settings['area_width']="100%";if((""+this.settings['height']).indexOf('%')!=-1)this.settings['area_height']="100%";if((""+replace_element.style.width).indexOf('%')!=-1){this.settings['width']=replace_element.style.width;this.settings['area_width']="100%";}if((""+replace_element.style.height).indexOf('%')!=-1){this.settings['height']=replace_element.style.height;this.settings['area_height']="100%";}html=tinyMCE.applyTemplate(html);this.settings['width']=this.settings['old_width'];this.settings['height']=this.settings['old_height'];this.visualAid=this.settings['visual'];this.formTargetElementId=form_element_name;if(replace_element.nodeName=="TEXTAREA"||replace_element.nodeName=="INPUT")this.startContent=replace_element.value;else this.startContent=replace_element.innerHTML;if(replace_element.nodeName.toLowerCase()!="textarea"){this.oldTargetElement=replace_element.cloneNode(true);if(tinyMCE.settings['debug'])html+='<textarea wrap="off" id="'+form_element_name+'" name="'+form_element_name+'" cols="100" rows="15"></textarea>';else html+='<input type="hidden" type="text" id="'+form_element_name+'" name="'+form_element_name+'" />';html+='</span>';if(!tinyMCE.isMSIE){var rng=replace_element.ownerDocument.createRange();rng.setStartBefore(replace_element);var fragment=rng.createContextualFragment(html);replace_element.parentNode.replaceChild(fragment,replace_element);}else replace_element.outerHTML=html;}else{html+='</span>';this.oldTargetElement=replace_element;if(!tinyMCE.settings['debug'])this.oldTargetElement.style.display="none";if(!tinyMCE.isMSIE){var rng=replace_element.ownerDocument.createRange();rng.setStartBefore(replace_element);var fragment=rng.createContextualFragment(html);if(tinyMCE.isGecko)tinyMCE.insertAfter(fragment,replace_element);else replace_element.parentNode.insertBefore(fragment,replace_element);}else replace_element.insertAdjacentHTML("beforeBegin",html);}var dynamicIFrame=false;var tElm=targetDoc.getElementById(this.editorId);if(!tinyMCE.isMSIE){if(tElm&&tElm.nodeName.toLowerCase()=="span"){tElm=tinyMCE._createIFrame(tElm);dynamicIFrame=true;}this.targetElement=tElm;this.iframeElement=tElm;this.contentDocument=tElm.contentDocument;this.contentWindow=tElm.contentWindow;}else{if(tElm&&tElm.nodeName.toLowerCase()=="span")tElm=tinyMCE._createIFrame(tElm);else tElm=targetDoc.frames[this.editorId];this.targetElement=tElm;this.iframeElement=targetDoc.getElementById(this.editorId);if(tinyMCE.isOpera){this.contentDocument=this.iframeElement.contentDocument;this.contentWindow=this.iframeElement.contentWindow;dynamicIFrame=true;}else{this.contentDocument=tElm.window.document;this.contentWindow=tElm.window;}this.getDoc().designMode="on";}var doc=this.contentDocument;if(dynamicIFrame){var html=tinyMCE.getParam('doctype')+'<html><head xmlns="http://www.w3.org/1999/xhtml"><base href="'+tinyMCE.settings['base_href']+'" /><title>blank_page</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body class="mceContentBody"></body></html>';try{if(!this.isHidden())this.getDoc().designMode="on";doc.open();doc.write(html);doc.close();}catch(e){this.getDoc().location.href=tinyMCE.baseURL+"/blank.htm";}}if(tinyMCE.isMSIE)window.setTimeout("TinyMCE.prototype.addEventHandlers('"+this.editorId+"');",1);tinyMCE.setupContent(this.editorId,true);return true;};TinyMCEControl.prototype.getFocusElement=function(){if(tinyMCE.isMSIE&&!tinyMCE.isOpera){var doc=this.getDoc();var rng=doc.selection.createRange();var elm=rng.item?rng.item(0):rng.parentElement();}else{if(this.isHidden())return this.getBody();var sel=this.getSel();var rng=this.getRng();var elm=rng.commonAncestorContainer;if(!rng.collapsed){if(rng.startContainer==rng.endContainer){if(rng.startOffset-rng.endOffset<2){if(rng.startContainer.hasChildNodes())elm=rng.startContainer.childNodes[rng.startOffset];}}}elm=tinyMCE.getParentElement(elm);}return elm;};var tinyMCE=new TinyMCE();var tinyMCELang=new Array();
\ 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..4c27a3f
--- /dev/null
@@ -0,0 +1,253 @@
+/**\r
+ * $RCSfile: tiny_mce_popup.js,v $\r
+ * $Revision: 1.21 $\r
+ * $Date: 2005/11/27 18:11:16 $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+var tinyMCE = null, tinyMCELang = null;\r
+\r
+function TinyMCEPopup() {\r
+};\r
+\r
+TinyMCEPopup.prototype.init = function() {\r
+       var win = window.opener ? window.opener : window.dialogArguments;\r
+\r
+       if (!win) {\r
+               // Try parent\r
+               win = parent.parent;\r
+\r
+               // Try top\r
+               if (typeof(win.tinyMCE) == "undefined")\r
+                       win = top;\r
+       }\r
+\r
+       window.opener = win;\r
+       this.windowOpener = win;\r
+       this.onLoadEval = "";\r
+\r
+       // Setup parent references\r
+       tinyMCE = win.tinyMCE;\r
+       tinyMCELang = win.tinyMCELang;\r
+\r
+       if (!tinyMCE) {\r
+               alert("tinyMCE object reference not found from popup.");\r
+               return;\r
+       }\r
+\r
+       this.isWindow = tinyMCE.getWindowArg('mce_inside_iframe', false) == false;\r
+       this.storeSelection = (tinyMCE.isMSIE && !tinyMCE.isOpera) && !this.isWindow && tinyMCE.getWindowArg('mce_store_selection', true);\r
+\r
+       if (this.isWindow)\r
+               window.focus();\r
+\r
+       // Store selection\r
+       if (this.storeSelection)\r
+               tinyMCE.selectedInstance.execCommand('mceStoreSelection');\r
+\r
+       // Setup dir\r
+       if (tinyMCELang['lang_dir'])\r
+               document.dir = tinyMCELang['lang_dir'];\r
+\r
+       // Setup title\r
+       var re = new RegExp('{|\\\$|}', 'g');\r
+       var title = document.title.replace(re, "");\r
+       if (typeof tinyMCELang[title] != "undefined") {\r
+               var divElm = document.createElement("div");\r
+               divElm.innerHTML = tinyMCELang[title];\r
+               document.title = divElm.innerHTML;\r
+\r
+               if (tinyMCE.setWindowTitle != null)\r
+                       tinyMCE.setWindowTitle(window, divElm.innerHTML);\r
+       }\r
+\r
+       // Output Popup CSS class\r
+       document.write('<link href="' + tinyMCE.getParam("popups_css") + '" rel="stylesheet" type="text/css">');\r
+\r
+       tinyMCE.addEvent(window, "load", this.onLoad);\r
+};\r
+\r
+TinyMCEPopup.prototype.onLoad = function() {\r
+       var body = document.body;\r
+\r
+       if (tinyMCE.getWindowArg('mce_replacevariables', true))\r
+               body.innerHTML = tinyMCE.applyTemplate(body.innerHTML, tinyMCE.windowArgs);\r
+\r
+       var dir = tinyMCE.selectedInstance.settings['directionality'];\r
+       if (dir == "rtl") {\r
+               var elms = document.forms[0].elements;\r
+               for (var i=0; i<elms.length; i++) {\r
+                       if ((elms[i].type == "text" || elms[i].type == "textarea") && elms[i].getAttribute("dir") != "ltr")\r
+                               elms[i].dir = dir;\r
+               }\r
+       }\r
+\r
+       if (body.style.display == 'none')\r
+               body.style.display = 'block';\r
+\r
+       // Execute real onload (Opera fix)\r
+       if (tinyMCEPopup.onLoadEval != "") {\r
+               eval(tinyMCEPopup.onLoadEval);\r
+       }\r
+};\r
+\r
+TinyMCEPopup.prototype.executeOnLoad = function(str) {\r
+       if (tinyMCE.isOpera)\r
+               this.onLoadEval = str;\r
+       else\r
+               eval(str);\r
+};\r
+\r
+TinyMCEPopup.prototype.resizeToInnerSize = function() {\r
+       // Netscape 7.1 workaround\r
+       if (this.isWindow && tinyMCE.isNS71) {\r
+               window.resizeBy(0, 10);\r
+               return;\r
+       }\r
+\r
+       if (this.isWindow) {\r
+               var doc = document;\r
+               var body = doc.body;\r
+               var oldMargin, wrapper, iframe, nodes, dx, dy;\r
+\r
+               if (body.style.display == 'none')\r
+                       body.style.display = 'block';\r
+\r
+               // Remove margin\r
+               oldMargin = body.style.margin;\r
+               body.style.margin = '0px';\r
+\r
+               // Create wrapper\r
+               wrapper = doc.createElement("div");\r
+               wrapper.id = 'mcBodyWrapper';\r
+               wrapper.style.display = 'none';\r
+               wrapper.style.margin = '0px';\r
+\r
+               // Wrap body elements\r
+               nodes = doc.body.childNodes;\r
+               for (var i=nodes.length-1; i>=0; i--) {\r
+                       if (wrapper.hasChildNodes())\r
+                               wrapper.insertBefore(nodes[i].cloneNode(true), wrapper.firstChild);\r
+                       else\r
+                               wrapper.appendChild(nodes[i].cloneNode(true));\r
+\r
+                       nodes[i].parentNode.removeChild(nodes[i]);\r
+               }\r
+\r
+               // Add wrapper\r
+               doc.body.appendChild(wrapper);\r
+\r
+               // Create iframe\r
+               iframe = document.createElement("iframe");\r
+               iframe.id = "mcWinIframe";\r
+               iframe.src = document.location.href.toLowerCase().indexOf('https') == -1 ? "about:blank" : tinyMCE.settings['default_document'];\r
+               iframe.width = "100%";\r
+               iframe.height = "100%";\r
+               iframe.style.margin = '0px';\r
+\r
+               // Add iframe\r
+               doc.body.appendChild(iframe);\r
+\r
+               // Measure iframe\r
+               iframe = document.getElementById('mcWinIframe');\r
+               dx = tinyMCE.getWindowArg('mce_width') - iframe.clientWidth;\r
+               dy = tinyMCE.getWindowArg('mce_height') - iframe.clientHeight;\r
+\r
+               // Resize window\r
+               // tinyMCE.debug(tinyMCE.getWindowArg('mce_width') + "," + tinyMCE.getWindowArg('mce_height') + " - " + dx + "," + dy);\r
+               window.resizeBy(dx, dy);\r
+\r
+               // Hide iframe and show wrapper\r
+               body.style.margin = oldMargin;\r
+               iframe.style.display = 'none';\r
+               wrapper.style.display = 'block';\r
+       }\r
+};\r
+\r
+TinyMCEPopup.prototype.resizeToContent = function() {\r
+       var isMSIE = (navigator.appName == "Microsoft Internet Explorer");\r
+       var isOpera = (navigator.userAgent.indexOf("Opera") != -1);\r
+\r
+       if (isOpera)\r
+               return;\r
+\r
+       if (isMSIE) {\r
+               try { window.resizeTo(10, 10); } catch (e) {}\r
+\r
+               var elm = document.body;\r
+               var width = elm.offsetWidth;\r
+               var height = elm.offsetHeight;\r
+               var dx = (elm.scrollWidth - width) + 4;\r
+               var dy = elm.scrollHeight - height;\r
+\r
+               try { window.resizeBy(dx, dy); } catch (e) {}\r
+       } else {\r
+               window.scrollBy(1000, 1000);\r
+               if (window.scrollX > 0 || window.scrollY > 0) {\r
+                       window.resizeBy(window.innerWidth * 2, window.innerHeight * 2);\r
+                       window.sizeToContent();\r
+                       window.scrollTo(0, 0);\r
+                       var x = parseInt(screen.width / 2.0) - (window.outerWidth / 2.0);\r
+                       var y = parseInt(screen.height / 2.0) - (window.outerHeight / 2.0);\r
+                       window.moveTo(x, y);\r
+               }\r
+       }\r
+};\r
+\r
+TinyMCEPopup.prototype.getWindowArg = function(name, default_value) {\r
+       return tinyMCE.getWindowArg(name, default_value);\r
+};\r
+\r
+TinyMCEPopup.prototype.restoreSelection = function() {\r
+       if (this.storeSelection) {\r
+               var inst = tinyMCE.selectedInstance;\r
+\r
+               inst.getWin().focus();\r
+               inst.execCommand('mceRestoreSelection');\r
+       }\r
+};\r
+\r
+TinyMCEPopup.prototype.execCommand = function(command, user_interface, value) {\r
+       var inst = tinyMCE.selectedInstance;\r
+\r
+       this.restoreSelection();\r
+       inst.execCommand(command, user_interface, value);\r
+\r
+       // Store selection\r
+       if (this.storeSelection)\r
+               inst.execCommand('mceStoreSelection');\r
+};\r
+\r
+TinyMCEPopup.prototype.close = function() {\r
+       tinyMCE.closeWindow(window);\r
+};\r
+\r
+TinyMCEPopup.prototype.pickColor = function(e, element_id) {\r
+       tinyMCE.selectedInstance.execCommand('mceColorPicker', true, {\r
+               element_id : element_id,\r
+               document : document,\r
+               window : window,\r
+               store_selection : false\r
+       });\r
+};\r
+\r
+TinyMCEPopup.prototype.openBrowser = function(element_id, type, option) {\r
+       var cb = tinyMCE.getParam(option, tinyMCE.getParam("file_browser_callback"));\r
+       var url = document.getElementById(element_id).value;\r
+\r
+       tinyMCE.setWindowArg("window", window);\r
+       tinyMCE.setWindowArg("document", document);\r
+\r
+       // Call to external callback\r
+       if (eval('typeof(tinyMCEPopup.windowOpener.' + cb + ')') == "undefined")\r
+               alert("Callback function: " + cb + " could not be found.");\r
+       else\r
+               eval("tinyMCEPopup.windowOpener." + cb + "(element_id, url, type, window);");\r
+};\r
+\r
+// Setup global instance\r
+var tinyMCEPopup = new TinyMCEPopup();\r
+\r
+tinyMCEPopup.init();\r
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..09fa85c
--- /dev/null
@@ -0,0 +1,6077 @@
+/**\r
+ * $RCSfile: tiny_mce_src.js,v $\r
+ * $Revision: 1.281 $\r
+ * $Date: 2005/12/02 08:12:07 $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+function TinyMCE() {\r
+       this.majorVersion = "2";\r
+       this.minorVersion = "0";\r
+       this.releaseDate = "2005-12-01";\r
+\r
+       this.instances = new Array();\r
+       this.stickyClassesLookup = new Array();\r
+       this.windowArgs = new Array();\r
+       this.loadedFiles = new Array();\r
+       this.configs = new Array();\r
+       this.currentConfig = 0;\r
+       this.eventHandlers = new Array();\r
+\r
+       // Browser check\r
+       var ua = navigator.userAgent;\r
+       this.isMSIE = (navigator.appName == "Microsoft Internet Explorer");\r
+       this.isMSIE5 = this.isMSIE && (ua.indexOf('MSIE 5') != -1);\r
+       this.isMSIE5_0 = this.isMSIE && (ua.indexOf('MSIE 5.0') != -1);\r
+       this.isGecko = ua.indexOf('Gecko') != -1;\r
+       this.isSafari = ua.indexOf('Safari') != -1;\r
+       this.isOpera = ua.indexOf('Opera') != -1;\r
+       this.isMac = ua.indexOf('Mac') != -1;\r
+       this.isNS7 = ua.indexOf('Netscape/7') != -1;\r
+       this.isNS71 = ua.indexOf('Netscape/7.1') != -1;\r
+       this.dialogCounter = 0;\r
+\r
+       // Fake MSIE on Opera and if Opera fakes IE, Gecko or Safari cancel those\r
+       if (this.isOpera) {\r
+               this.isMSIE = true;\r
+               this.isGecko = false;\r
+               this.isSafari =  false;\r
+       }\r
+\r
+       // TinyMCE editor id instance counter\r
+       this.idCounter = 0;\r
+};\r
+\r
+TinyMCE.prototype.defParam = function(key, def_val) {\r
+       this.settings[key] = tinyMCE.getParam(key, def_val);\r
+};\r
+\r
+TinyMCE.prototype.init = function(settings) {\r
+       var theme;\r
+\r
+       this.settings = settings;\r
+\r
+       // Check if valid browser has execcommand support\r
+       if (typeof(document.execCommand) == 'undefined')\r
+               return;\r
+\r
+       // Get script base path\r
+       if (!tinyMCE.baseURL) {\r
+               var elements = document.getElementsByTagName('script');\r
+\r
+               for (var i=0; i<elements.length; i++) {\r
+                       if (elements[i].src && (elements[i].src.indexOf("tiny_mce.js") != -1 || elements[i].src.indexOf("tiny_mce_src.js") != -1 || elements[i].src.indexOf("tiny_mce_gzip") != -1)) {\r
+                               var src = elements[i].src;\r
+\r
+                               tinyMCE.srcMode = (src.indexOf('_src') != -1) ? '_src' : '';\r
+                               src = src.substring(0, src.lastIndexOf('/'));\r
+\r
+                               tinyMCE.baseURL = src;\r
+                               break;\r
+                       }\r
+               }\r
+       }\r
+\r
+       // Get document base path\r
+       this.documentBasePath = document.location.href;\r
+       if (this.documentBasePath.indexOf('?') != -1)\r
+               this.documentBasePath = this.documentBasePath.substring(0, this.documentBasePath.indexOf('?'));\r
+       this.documentURL = this.documentBasePath;\r
+       this.documentBasePath = this.documentBasePath.substring(0, this.documentBasePath.lastIndexOf('/'));\r
+\r
+       // If not HTTP absolute\r
+       if (tinyMCE.baseURL.indexOf('://') == -1 && tinyMCE.baseURL.charAt(0) != '/') {\r
+               // If site absolute\r
+               tinyMCE.baseURL = this.documentBasePath + "/" + tinyMCE.baseURL;\r
+       }\r
+\r
+       // Set default values on settings\r
+       this.defParam("mode", "none");\r
+       this.defParam("theme", "advanced");\r
+       this.defParam("plugins", "", true);\r
+       this.defParam("language", "en");\r
+       this.defParam("docs_language", this.settings['language']);\r
+       this.defParam("elements", "");\r
+       this.defParam("textarea_trigger", "mce_editable");\r
+       this.defParam("editor_selector", "");\r
+       this.defParam("editor_deselector", "mceNoEditor");\r
+       this.defParam("valid_elements", "+a[id|style|rel|rev|charset|hreflang|dir|lang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],-strong/b[class|style],-em/i[class|style],-strike[class|style],-u[class|style],+p[style|dir|class|align],-ol[class|style],-ul[class|style],-li[class|style],br,img[id|dir|lang|longdesc|usemap|style|class|src|onmouseover|onmouseout|border=0|alt|title|hspace|vspace|width|height|align],-sub[style|class],-sup[style|class],-blockquote[dir|style],-table[border=0|cellspacing|cellpadding|width|height|class|align|summary|style|dir|id|lang|bgcolor|background|bordercolor],-tr[id|lang|dir|class|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor],tbody[id|class],thead[id|class],tfoot[id|class],-td[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor|scope],-th[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|scope],caption[id|lang|dir|class|style],-div[id|dir|class|align|style],-span[style|class|align],-pre[class|align|style],address[class|align|style],-h1[style|dir|class|align],-h2[style|dir|class|align],-h3[style|dir|class|align],-h4[style|dir|class|align],-h5[style|dir|class|align],-h6[style|dir|class|align],hr[class|style],font[face|size|style|id|class|dir|color]");\r
+       this.defParam("extended_valid_elements", "");\r
+       this.defParam("invalid_elements", "");\r
+       this.defParam("encoding", "");\r
+       this.defParam("urlconverter_callback", tinyMCE.getParam("urlconvertor_callback", "TinyMCE.prototype.convertURL"));\r
+       this.defParam("save_callback", "");\r
+       this.defParam("debug", false);\r
+       this.defParam("force_br_newlines", false);\r
+       this.defParam("force_p_newlines", true);\r
+       this.defParam("add_form_submit_trigger", true);\r
+       this.defParam("relative_urls", true);\r
+       this.defParam("remove_script_host", true);\r
+       this.defParam("focus_alert", true);\r
+       this.defParam("document_base_url", this.documentURL);\r
+       this.defParam("visual", true);\r
+       this.defParam("visual_table_class", "mceVisualAid");\r
+       this.defParam("setupcontent_callback", "");\r
+       this.defParam("fix_content_duplication", true);\r
+       this.defParam("custom_undo_redo", true);\r
+       this.defParam("custom_undo_redo_levels", -1);\r
+       this.defParam("custom_undo_redo_keyboard_shortcuts", true);\r
+       this.defParam("verify_css_classes", false);\r
+       this.defParam("verify_html", true);\r
+       this.defParam("apply_source_formatting", false);\r
+       this.defParam("directionality", "ltr");\r
+       this.defParam("cleanup_on_startup", false);\r
+       this.defParam("inline_styles", false);\r
+       this.defParam("convert_newlines_to_brs", false);\r
+       this.defParam("auto_reset_designmode", true);\r
+       this.defParam("entities", "160,nbsp,38,amp,34,quot,162,cent,8364,euro,163,pound,165,yen,169,copy,174,reg,8482,trade,8240,permil,181,micro,183,middot,8226,bull,8230,hellip,8242,prime,8243,Prime,167,sect,182,para,223,szlig,8249,lsaquo,8250,rsaquo,171,laquo,187,raquo,8216,lsquo,8217,rsquo,8220,ldquo,8221,rdquo,8218,sbquo,8222,bdquo,60,lt,62,gt,8804,le,8805,ge,8211,ndash,8212,mdash,175,macr,8254,oline,164,curren,166,brvbar,168,uml,161,iexcl,191,iquest,710,circ,732,tilde,176,deg,8722,minus,177,plusmn,247,divide,8260,frasl,215,times,185,sup1,178,sup2,179,sup3,188,frac14,189,frac12,190,frac34,402,fnof,8747,int,8721,sum,8734,infin,8730,radic,8764,sim,8773,cong,8776,asymp,8800,ne,8801,equiv,8712,isin,8713,notin,8715,ni,8719,prod,8743,and,8744,or,172,not,8745,cap,8746,cup,8706,part,8704,forall,8707,exist,8709,empty,8711,nabla,8727,lowast,8733,prop,8736,ang,180,acute,184,cedil,170,ordf,186,ordm,8224,dagger,8225,Dagger,192,Agrave,194,Acirc,195,Atilde,196,Auml,197,Aring,198,AElig,199,Ccedil,200,Egrave,202,Ecirc,203,Euml,204,Igrave,206,Icirc,207,Iuml,208,ETH,209,Ntilde,210,Ograve,212,Ocirc,213,Otilde,214,Ouml,216,Oslash,338,OElig,217,Ugrave,219,Ucirc,220,Uuml,376,Yuml,222,THORN,224,agrave,226,acirc,227,atilde,228,auml,229,aring,230,aelig,231,ccedil,232,egrave,234,ecirc,235,euml,236,igrave,238,icirc,239,iuml,240,eth,241,ntilde,242,ograve,244,ocirc,245,otilde,246,ouml,248,oslash,339,oelig,249,ugrave,251,ucirc,252,uuml,254,thorn,255,yuml,914,Beta,915,Gamma,916,Delta,917,Epsilon,918,Zeta,919,Eta,920,Theta,921,Iota,922,Kappa,923,Lambda,924,Mu,925,Nu,926,Xi,927,Omicron,928,Pi,929,Rho,931,Sigma,932,Tau,933,Upsilon,934,Phi,935,Chi,936,Psi,937,Omega,945,alpha,946,beta,947,gamma,948,delta,949,epsilon,950,zeta,951,eta,952,theta,953,iota,954,kappa,955,lambda,956,mu,957,nu,958,xi,959,omicron,960,pi,961,rho,962,sigmaf,963,sigma,964,tau,965,upsilon,966,phi,967,chi,968,psi,969,omega,8501,alefsym,982,piv,8476,real,977,thetasym,978,upsih,8472,weierp,8465,image,8592,larr,8593,uarr,8594,rarr,8595,darr,8596,harr,8629,crarr,8656,lArr,8657,uArr,8658,rArr,8659,dArr,8660,hArr,8756,there4,8834,sub,8835,sup,8836,nsub,8838,sube,8839,supe,8853,oplus,8855,otimes,8869,perp,8901,sdot,8968,lceil,8969,rceil,8970,lfloor,8971,rfloor,9001,lang,9002,rang,9674,loz,9824,spades,9827,clubs,9829,hearts,9830,diams,8194,ensp,8195,emsp,8201,thinsp,8204,zwnj,8205,zwj,8206,lrm,8207,rlm,173,shy,233,eacute,237,iacute,243,oacute,250,uacute,193,Aacute,225,aacute,201,Eacute,205,Iacute,211,Oacute,218,Uacute,221,Yacute,253,yacute");\r
+       this.defParam("entity_encoding", "named");\r
+       this.defParam("cleanup_callback", "");\r
+       this.defParam("add_unload_trigger", true);\r
+       this.defParam("ask", false);\r
+       this.defParam("nowrap", false);\r
+       this.defParam("auto_resize", false);\r
+       this.defParam("auto_focus", false);\r
+       this.defParam("cleanup", true);\r
+       this.defParam("remove_linebreaks", true);\r
+       this.defParam("button_tile_map", false);\r
+       this.defParam("submit_patch", true);\r
+       this.defParam("browsers", "msie,safari,gecko,opera");\r
+       this.defParam("dialog_type", "window");\r
+       this.defParam("accessibility_warnings", true);\r
+       this.defParam("merge_styles_invalid_parents", "");\r
+       this.defParam("force_hex_style_colors", true);\r
+       this.defParam("trim_span_elements", true);\r
+       this.defParam("convert_fonts_to_spans", false);\r
+       this.defParam("doctype", '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">');\r
+       this.defParam("font_size_classes", '');\r
+       this.defParam("font_size_style_values", 'xx-small,x-small,small,medium,large,x-large,xx-large');\r
+       this.defParam("event_elements", 'a,img');\r
+       this.defParam("convert_urls", true);\r
+       this.defParam("table_inline_editing", false);\r
+       this.defParam("object_resizing", true);\r
+\r
+       // Browser check IE\r
+       if (this.isMSIE && this.settings['browsers'].indexOf('msie') == -1)\r
+               return;\r
+\r
+       // Browser check Gecko\r
+       if (this.isGecko && this.settings['browsers'].indexOf('gecko') == -1)\r
+               return;\r
+\r
+       // Browser check Safari\r
+       if (this.isSafari && this.settings['browsers'].indexOf('safari') == -1)\r
+               return;\r
+\r
+       // Browser check Opera\r
+       if (this.isOpera && this.settings['browsers'].indexOf('opera') == -1)\r
+               return;\r
+\r
+       // If not super absolute make it so\r
+       var baseHREF = tinyMCE.settings['document_base_url'];\r
+       var h = document.location.href;\r
+       var p = h.indexOf('://');\r
+       if (p > 0 && document.location.protocol != "file:") {\r
+               p = h.indexOf('/', p + 3);\r
+               h = h.substring(0, p);\r
+\r
+               if (baseHREF.indexOf('://') == -1)\r
+                       baseHREF = h + baseHREF;\r
+\r
+               tinyMCE.settings['document_base_url'] = baseHREF;\r
+               tinyMCE.settings['document_base_prefix'] = h;\r
+       }\r
+\r
+       // Trim away query part\r
+       if (baseHREF.indexOf('?') != -1)\r
+               baseHREF = baseHREF.substring(0, baseHREF.indexOf('?'));\r
+\r
+       this.settings['base_href'] = baseHREF.substring(0, baseHREF.lastIndexOf('/')) + "/";\r
+\r
+       theme = this.settings['theme'];\r
+       this.blockRegExp = new RegExp("^(h[1-6]|p|div|address|pre|form|table|li|ol|ul|td|blockquote|center|dl|dir|fieldset|form|noscript|noframes|menu|isindex)$", "i");\r
+       this.posKeyCodes = new Array(13,45,36,35,33,34,37,38,39,40);\r
+       this.uniqueURL = 'http://tinymce.moxiecode.cp/mce_temp_url'; // Make unique URL non real URL\r
+       this.uniqueTag = '<div id="mceTMPElement" style="display: none">TMP</div>';\r
+\r
+       // Theme url\r
+       this.settings['theme_href'] = tinyMCE.baseURL + "/themes/" + theme;\r
+\r
+       if (!tinyMCE.isMSIE)\r
+               this.settings['force_br_newlines'] = false;\r
+\r
+       if (tinyMCE.getParam("content_css", false)) {\r
+               var cssPath = tinyMCE.getParam("content_css", "");\r
+\r
+               // Is relative\r
+               if (cssPath.indexOf('://') == -1 && cssPath.charAt(0) != '/')\r
+                       this.settings['content_css'] = this.documentBasePath + "/" + cssPath;\r
+               else\r
+                       this.settings['content_css'] = cssPath;\r
+       } else\r
+               this.settings['content_css'] = '';\r
+\r
+       if (tinyMCE.getParam("popups_css", false)) {\r
+               var cssPath = tinyMCE.getParam("popups_css", "");\r
+\r
+               // Is relative\r
+               if (cssPath.indexOf('://') == -1 && cssPath.charAt(0) != '/')\r
+                       this.settings['popups_css'] = this.documentBasePath + "/" + cssPath;\r
+               else\r
+                       this.settings['popups_css'] = cssPath;\r
+       } else\r
+               this.settings['popups_css'] = tinyMCE.baseURL + "/themes/" + theme + "/css/editor_popup.css";\r
+\r
+       if (tinyMCE.getParam("editor_css", false)) {\r
+               var cssPath = tinyMCE.getParam("editor_css", "");\r
+\r
+               // Is relative\r
+               if (cssPath.indexOf('://') == -1 && cssPath.charAt(0) != '/')\r
+                       this.settings['editor_css'] = this.documentBasePath + "/" + cssPath;\r
+               else\r
+                       this.settings['editor_css'] = cssPath;\r
+       } else\r
+               this.settings['editor_css'] = tinyMCE.baseURL + "/themes/" + theme + "/css/editor_ui.css";\r
+\r
+       if (tinyMCE.settings['debug']) {\r
+               var msg = "Debug: \n";\r
+\r
+               msg += "baseURL: " + this.baseURL + "\n";\r
+               msg += "documentBasePath: " + this.documentBasePath + "\n";\r
+               msg += "content_css: " + this.settings['content_css'] + "\n";\r
+               msg += "popups_css: " + this.settings['popups_css'] + "\n";\r
+               msg += "editor_css: " + this.settings['editor_css'] + "\n";\r
+\r
+               alert(msg);\r
+       }\r
+\r
+       // Init HTML cleanup\r
+       this._initCleanup();\r
+\r
+       // Only do this once\r
+       if (this.configs.length == 0) {\r
+               // Is Safari enabled\r
+               if (this.isSafari && this.getParam('safari_warning', true))\r
+                       alert("Safari support is very limited and should be considered experimental.\nSo there is no need to even submit bugreports on this early version.\nYou can disable this message by setting: safari_warning option to false");\r
+\r
+               tinyMCE.addEvent(window, "load", TinyMCE.prototype.onLoad);\r
+\r
+               if (tinyMCE.isMSIE) {\r
+                       if (tinyMCE.settings['add_unload_trigger']) {\r
+                               tinyMCE.addEvent(window, "unload", TinyMCE.prototype.unloadHandler);\r
+                               tinyMCE.addEvent(window.document, "beforeunload", TinyMCE.prototype.unloadHandler);\r
+                       }\r
+               } else {\r
+                       if (tinyMCE.settings['add_unload_trigger'])\r
+                               tinyMCE.addEvent(window, "unload", function () {tinyMCE.triggerSave(true, true);});\r
+               }\r
+       }\r
+\r
+       this.loadScript(tinyMCE.baseURL + '/themes/' + this.settings['theme'] + '/editor_template' + tinyMCE.srcMode + '.js');\r
+       this.loadScript(tinyMCE.baseURL + '/langs/' + this.settings['language'] +  '.js');\r
+       this.loadCSS(this.settings['editor_css']);\r
+\r
+       // Add plugins\r
+       var themePlugins = tinyMCE.getParam('plugins', '', true, ',');\r
+       if (this.settings['plugins'] != '') {\r
+               for (var i=0; i<themePlugins.length; i++)\r
+                       this.loadScript(tinyMCE.baseURL + '/plugins/' + themePlugins[i] + '/editor_plugin' + tinyMCE.srcMode + '.js');\r
+       }\r
+\r
+       // Setup entities\r
+       settings['cleanup_entities'] = new Array();\r
+       var entities = tinyMCE.getParam('entities', '', true, ',');\r
+       for (var i=0; i<entities.length; i+=2)\r
+               settings['cleanup_entities']['c' + entities[i]] = entities[i+1];\r
+\r
+       // Save away this config\r
+       settings['index'] = this.configs.length;\r
+       this.configs[this.configs.length] = settings;\r
+};\r
+\r
+TinyMCE.prototype.loadScript = function(url) {\r
+       for (var i=0; i<this.loadedFiles.length; i++) {\r
+               if (this.loadedFiles[i] == url)\r
+                       return;\r
+       }\r
+\r
+       document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + url + '"></script>');\r
+\r
+       this.loadedFiles[this.loadedFiles.length] = url;\r
+};\r
+\r
+TinyMCE.prototype.loadCSS = function(url) {\r
+       for (var i=0; i<this.loadedFiles.length; i++) {\r
+               if (this.loadedFiles[i] == url)\r
+                       return;\r
+       }\r
+\r
+       document.write('<link href="' + url + '" rel="stylesheet" type="text/css" />');\r
+\r
+       this.loadedFiles[this.loadedFiles.length] = url;\r
+};\r
+\r
+TinyMCE.prototype.importCSS = function(doc, css_file) {\r
+       if (css_file == '')\r
+               return;\r
+\r
+       if (typeof(doc.createStyleSheet) == "undefined") {\r
+               var elm = doc.createElement("link");\r
+\r
+               elm.rel = "stylesheet";\r
+               elm.href = css_file;\r
+\r
+               if ((headArr = doc.getElementsByTagName("head")) != null && headArr.length > 0)\r
+                       headArr[0].appendChild(elm);\r
+       } else\r
+               var styleSheet = doc.createStyleSheet(css_file);\r
+};\r
+\r
+TinyMCE.prototype.confirmAdd = function(e, settings) {\r
+       var elm = tinyMCE.isMSIE ? event.srcElement : e.target;\r
+       var elementId = elm.name ? elm.name : elm.id;\r
+\r
+       tinyMCE.settings = settings;\r
+\r
+       if (!elm.getAttribute('mce_noask') && confirm(tinyMCELang['lang_edit_confirm']))\r
+               tinyMCE.addMCEControl(elm, elementId);\r
+\r
+       elm.setAttribute('mce_noask', 'true');\r
+};\r
+\r
+TinyMCE.prototype.updateContent = function(form_element_name) {\r
+       // Find MCE instance linked to given form element and copy it's value\r
+       var formElement = document.getElementById(form_element_name);\r
+       for (var n in tinyMCE.instances) {\r
+               var inst = tinyMCE.instances[n];\r
+               if (!tinyMCE.isInstance(inst))\r
+                       continue;\r
+\r
+               inst.switchSettings();\r
+\r
+               if (inst.formElement == formElement) {\r
+                       var doc = inst.getDoc();\r
+       \r
+                       tinyMCE._setHTML(doc, inst.formElement.value);\r
+\r
+                       if (!tinyMCE.isMSIE)\r
+                               doc.body.innerHTML = tinyMCE._cleanupHTML(inst, doc, this.settings, doc.body, inst.visualAid);\r
+               }\r
+       }\r
+};\r
+\r
+TinyMCE.prototype.addMCEControl = function(replace_element, form_element_name, target_document) {\r
+       var id = "mce_editor_" + tinyMCE.idCounter++;\r
+       var inst = new TinyMCEControl(tinyMCE.settings);\r
+\r
+       inst.editorId = id;\r
+       this.instances[id] = inst;\r
+\r
+       inst.onAdd(replace_element, form_element_name, target_document);\r
+};\r
+\r
+TinyMCE.prototype.triggerSave = function(skip_cleanup, skip_callback) {\r
+       // Cleanup and set all form fields\r
+       for (var n in tinyMCE.instances) {\r
+               var inst = tinyMCE.instances[n];\r
+               if (!tinyMCE.isInstance(inst))\r
+                       continue;\r
+\r
+               inst.switchSettings();\r
+\r
+               tinyMCE.settings['preformatted'] = false;\r
+\r
+               // Default to false\r
+               if (typeof(skip_cleanup) == "undefined")\r
+                       skip_cleanup = false;\r
+\r
+               // Default to false\r
+               if (typeof(skip_callback) == "undefined")\r
+                       skip_callback = false;\r
+\r
+               tinyMCE._setHTML(inst.getDoc(), inst.getBody().innerHTML);\r
+\r
+               // Remove visual aids when cleanup is disabled\r
+               if (inst.settings['cleanup'] == false) {\r
+                       tinyMCE.handleVisualAid(inst.getBody(), true, false, inst);\r
+                       tinyMCE._setEventsEnabled(inst.getBody(), true);\r
+               }\r
+\r
+               tinyMCE._customCleanup(inst, "submit_content_dom", inst.contentWindow.document.body);\r
+               var htm = skip_cleanup ? inst.getBody().innerHTML : tinyMCE._cleanupHTML(inst, inst.getDoc(), this.settings, inst.getBody(), this.visualAid, true);\r
+               htm = tinyMCE._customCleanup(inst, "submit_content", htm);\r
+\r
+               if (tinyMCE.settings["encoding"] == "xml" || tinyMCE.settings["encoding"] == "html")\r
+                       htm = tinyMCE.convertStringToXML(htm);\r
+\r
+               if (!skip_callback && tinyMCE.settings['save_callback'] != "")\r
+                       var content = eval(tinyMCE.settings['save_callback'] + "(inst.formTargetElementId,htm,inst.getBody());");\r
+\r
+               // Use callback content if available\r
+               if ((typeof(content) != "undefined") && content != null)\r
+                       htm = content;\r
+\r
+               // Replace some weird entities (Bug: #1056343)\r
+               htm = tinyMCE.regexpReplace(htm, "&#40;", "(", "gi");\r
+               htm = tinyMCE.regexpReplace(htm, "&#41;", ")", "gi");\r
+               htm = tinyMCE.regexpReplace(htm, "&#59;", ";", "gi");\r
+               htm = tinyMCE.regexpReplace(htm, "&#34;", "&quot;", "gi");\r
+               htm = tinyMCE.regexpReplace(htm, "&#94;", "^", "gi");\r
+\r
+               if (inst.formElement)\r
+                       inst.formElement.value = htm;\r
+       }\r
+};\r
+\r
+TinyMCE.prototype._setEventsEnabled = function(node, state) {\r
+       var events = new Array('onfocus','onblur','onclick','ondblclick',\r
+                               'onmousedown','onmouseup','onmouseover','onmousemove',\r
+                               'onmouseout','onkeypress','onkeydown','onkeydown','onkeyup');\r
+\r
+       var evs = tinyMCE.settings['event_elements'].split(',');\r
+    for (var y=0; y<evs.length; y++){\r
+               var elms = node.getElementsByTagName(evs[y]);\r
+               for (var i=0; i<elms.length; i++) {\r
+                       var event = "";\r
+\r
+                       for (var x=0; x<events.length; x++) {\r
+                               if ((event = tinyMCE.getAttrib(elms[i], events[x])) != '') {\r
+                                       event = tinyMCE.cleanupEventStr("" + event);\r
+\r
+                                       if (!state)\r
+                                               event = "return true;" + event;\r
+                                       else\r
+                                               event = event.replace(/^return true;/gi, '');\r
+\r
+                                       elms[i].removeAttribute(events[x]);\r
+                                       elms[i].setAttribute(events[x], event);\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+};\r
+\r
+TinyMCE.prototype.resetForm = function(form_index) {\r
+       var formObj = document.forms[form_index];\r
+\r
+       for (var n in tinyMCE.instances) {\r
+               var inst = tinyMCE.instances[n];\r
+               if (!tinyMCE.isInstance(inst))\r
+                       continue;\r
+\r
+               inst.switchSettings();\r
+\r
+               for (var i=0; i<formObj.elements.length; i++) {\r
+                       if (inst.formTargetElementId == formObj.elements[i].name)\r
+                               inst.getBody().innerHTML = inst.startContent;\r
+               }\r
+       }\r
+};\r
+\r
+TinyMCE.prototype.execInstanceCommand = function(editor_id, command, user_interface, value, focus) {\r
+       var inst = tinyMCE.getInstanceById(editor_id);\r
+       if (inst) {\r
+               if (typeof(focus) == "undefined")\r
+                       focus = true;\r
+\r
+               if (focus)\r
+                       inst.contentWindow.focus();\r
+\r
+               // Reset design mode if lost\r
+               inst.autoResetDesignMode();\r
+\r
+               this.selectedElement = inst.getFocusElement();\r
+               this.selectedInstance = inst;\r
+               tinyMCE.execCommand(command, user_interface, value);\r
+\r
+               // Cancel event so it doesn't call onbeforeonunlaod\r
+               if (tinyMCE.isMSIE && window.event != null)\r
+                       tinyMCE.cancelEvent(window.event);\r
+       }\r
+};\r
+\r
+TinyMCE.prototype.execCommand = function(command, user_interface, value) {\r
+       // Default input\r
+       user_interface = user_interface ? user_interface : false;\r
+       value = value ? value : null;\r
+\r
+       if (tinyMCE.selectedInstance)\r
+               tinyMCE.selectedInstance.switchSettings();\r
+\r
+       switch (command) {\r
+               case 'mceHelp':\r
+                       var template = new Array();\r
+\r
+                       template['file']   = 'about.htm';\r
+                       template['width']  = 480;\r
+                       template['height'] = 380;\r
+\r
+                       tinyMCE.openWindow(template, {\r
+                               tinymce_version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion,\r
+                               tinymce_releasedate : tinyMCE.releaseDate,\r
+                               inline : "yes"\r
+                       });\r
+               return;\r
+\r
+               case 'mceFocus':\r
+                       var inst = tinyMCE.getInstanceById(value);\r
+                       if (inst)\r
+                               inst.contentWindow.focus();\r
+               return;\r
+\r
+               case "mceAddControl":\r
+               case "mceAddEditor":\r
+                       tinyMCE.addMCEControl(tinyMCE._getElementById(value), value);\r
+                       return;\r
+\r
+               case "mceAddFrameControl":\r
+                       tinyMCE.addMCEControl(tinyMCE._getElementById(value), value['element'], value['document']);\r
+                       return;\r
+\r
+               case "mceRemoveControl":\r
+               case "mceRemoveEditor":\r
+                       tinyMCE.removeMCEControl(value);\r
+                       return;\r
+\r
+               case "mceResetDesignMode":\r
+                       // Resets the designmode state of the editors in Gecko\r
+                       if (!tinyMCE.isMSIE) {\r
+                               for (var n in tinyMCE.instances) {\r
+                                       if (!tinyMCE.isInstance(tinyMCE.instances[n]))\r
+                                               continue;\r
+\r
+                                       try {\r
+                                               tinyMCE.instances[n].getDoc().designMode = "on";\r
+                                       } catch (e) {\r
+                                               // Ignore any errors\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       return;\r
+       }\r
+\r
+       if (this.selectedInstance) {\r
+               this.selectedInstance.execCommand(command, user_interface, value);\r
+       } else if (tinyMCE.settings['focus_alert'])\r
+               alert(tinyMCELang['lang_focus_alert']);\r
+};\r
+\r
+TinyMCE.prototype.eventPatch = function(editor_id) {\r
+       // Remove odd, error\r
+       if (typeof(tinyMCE) == "undefined")\r
+               return true;\r
+\r
+       for (var i=0; i<document.frames.length; i++) {\r
+               try {\r
+                       if (document.frames[i].event) {\r
+                               var event = document.frames[i].event;\r
+\r
+                               if (!event.target)\r
+                                       event.target = event.srcElement;\r
+\r
+                               TinyMCE.prototype.handleEvent(event);\r
+                               return;\r
+                       }\r
+               } catch (ex) {\r
+                       // Ignore error if iframe is pointing to external URL\r
+               }\r
+       }\r
+};\r
+\r
+TinyMCE.prototype.unloadHandler = function() {\r
+       tinyMCE.triggerSave(true, true);\r
+};\r
+\r
+TinyMCE.prototype.addEventHandlers = function(editor_id) {\r
+       if (tinyMCE.isMSIE) {\r
+               var doc = document.frames[editor_id].document;\r
+\r
+               // Event patch\r
+               tinyMCE.addEvent(doc, "keypress", TinyMCE.prototype.eventPatch);\r
+               tinyMCE.addEvent(doc, "keyup", TinyMCE.prototype.eventPatch);\r
+               tinyMCE.addEvent(doc, "keydown", TinyMCE.prototype.eventPatch);\r
+               tinyMCE.addEvent(doc, "mouseup", TinyMCE.prototype.eventPatch);\r
+               tinyMCE.addEvent(doc, "click", TinyMCE.prototype.eventPatch);\r
+       } else {\r
+               var inst = tinyMCE.instances[editor_id];\r
+               var doc = inst.getDoc();\r
+\r
+               inst.switchSettings();\r
+\r
+               tinyMCE.addEvent(doc, "keypress", tinyMCE.handleEvent);\r
+               tinyMCE.addEvent(doc, "keydown", tinyMCE.handleEvent);\r
+               tinyMCE.addEvent(doc, "keyup", tinyMCE.handleEvent);\r
+               tinyMCE.addEvent(doc, "click", tinyMCE.handleEvent);\r
+               tinyMCE.addEvent(doc, "mouseup", tinyMCE.handleEvent);\r
+               tinyMCE.addEvent(doc, "mousedown", tinyMCE.handleEvent);\r
+               tinyMCE.addEvent(doc, "focus", tinyMCE.handleEvent);\r
+               tinyMCE.addEvent(doc, "blur", tinyMCE.handleEvent);\r
+\r
+               eval('try { doc.designMode = "On"; } catch(e) {}');\r
+       }\r
+};\r
+\r
+TinyMCE.prototype._createIFrame = function(replace_element) {\r
+       var iframe = document.createElement("iframe");\r
+       var id = replace_element.getAttribute("id");\r
+       var aw, ah;\r
+\r
+       aw = "" + tinyMCE.settings['area_width'];\r
+       ah = "" + tinyMCE.settings['area_height'];\r
+\r
+       if (aw.indexOf('%') == -1) {\r
+               aw = parseInt(aw);\r
+               aw = aw < 0 ? 300 : aw;\r
+               aw = aw + "px";\r
+       }\r
+\r
+       if (ah.indexOf('%') == -1) {\r
+               ah = parseInt(ah);\r
+               ah = ah < 0 ? 240 : ah;\r
+               ah = ah + "px";\r
+       }\r
+\r
+       iframe.setAttribute("id", id);\r
+       //iframe.setAttribute("className", "mceEditorArea");\r
+       iframe.setAttribute("border", "0");\r
+       iframe.setAttribute("frameBorder", "0");\r
+       iframe.setAttribute("marginWidth", "0");\r
+       iframe.setAttribute("marginHeight", "0");\r
+       iframe.setAttribute("leftMargin", "0");\r
+       iframe.setAttribute("topMargin", "0");\r
+       iframe.setAttribute("width", aw);\r
+       iframe.setAttribute("height", ah);\r
+       iframe.setAttribute("allowtransparency", "true");\r
+\r
+       if (tinyMCE.settings["auto_resize"])\r
+               iframe.setAttribute("scrolling", "no");\r
+\r
+       // Must have a src element in MSIE HTTPs breaks aswell as absoute URLs\r
+       if (tinyMCE.isMSIE && !tinyMCE.isOpera)\r
+               iframe.setAttribute("src", this.settings['default_document']);\r
+\r
+       iframe.style.width = aw;\r
+       iframe.style.height = ah;\r
+\r
+       // MSIE 5.0 issue\r
+       if (tinyMCE.isMSIE && !tinyMCE.isOpera)\r
+               replace_element.outerHTML = iframe.outerHTML;\r
+       else\r
+               replace_element.parentNode.replaceChild(iframe, replace_element);\r
+\r
+       if (tinyMCE.isMSIE)\r
+               return window.frames[id];\r
+       else\r
+               return iframe;\r
+};\r
+\r
+TinyMCE.prototype.setupContent = function(editor_id) {\r
+       var inst = tinyMCE.instances[editor_id];\r
+       var doc = inst.getDoc();\r
+       var head = doc.getElementsByTagName('head').item(0);\r
+       var content = inst.startContent;\r
+\r
+       tinyMCE.operaOpacityCounter = 100 * tinyMCE.idCounter;\r
+\r
+       inst.switchSettings();\r
+\r
+       // Not loaded correctly hit it again, Mozilla bug #997860\r
+       if (!tinyMCE.isMSIE && tinyMCE.getParam("setupcontent_reload", false) && doc.title != "blank_page") {\r
+               // This part will remove the designMode status\r
+               // Failes first time in Firefox 1.5b2 on Mac\r
+               try {doc.location.href = tinyMCE.baseURL + "/blank.htm";} catch (ex) {}\r
+               window.setTimeout("tinyMCE.setupContent('" + editor_id + "');", 1000);\r
+               return;\r
+       }\r
+\r
+       if (!head) {\r
+               window.setTimeout("tinyMCE.setupContent('" + editor_id + "');", 10);\r
+               return;\r
+       }\r
+\r
+       // Import theme specific content CSS the user specific\r
+       tinyMCE.importCSS(inst.getDoc(), tinyMCE.baseURL + "/themes/" + inst.settings['theme'] + "/css/editor_content.css");\r
+       tinyMCE.importCSS(inst.getDoc(), inst.settings['content_css']);\r
+       tinyMCE.executeCallback('init_instance_callback', '_initInstance', 0, inst);\r
+\r
+       // Setup span styles\r
+       if (tinyMCE.getParam("convert_fonts_to_spans"))\r
+               inst.getDoc().body.setAttribute('id', 'mceSpanFonts');\r
+\r
+       if (tinyMCE.settings['nowrap'])\r
+               doc.body.style.whiteSpace = "nowrap";\r
+\r
+       doc.body.dir = this.settings['directionality'];\r
+       doc.editorId = editor_id;\r
+\r
+       // Add on document element in Mozilla\r
+       if (!tinyMCE.isMSIE)\r
+               doc.documentElement.editorId = editor_id;\r
+\r
+       // Setup base element\r
+       var base = doc.createElement("base");\r
+       base.setAttribute('href', tinyMCE.settings['base_href']);\r
+       head.appendChild(base);\r
+\r
+       // Replace new line characters to BRs\r
+       if (tinyMCE.settings['convert_newlines_to_brs']) {\r
+               content = tinyMCE.regexpReplace(content, "\r\n", "<br />", "gi");\r
+               content = tinyMCE.regexpReplace(content, "\r", "<br />", "gi");\r
+               content = tinyMCE.regexpReplace(content, "\n", "<br />", "gi");\r
+       }\r
+\r
+       // Open closed anchors\r
+//     content = content.replace(new RegExp('<a(.*?)/>', 'gi'), '<a$1></a>');\r
+\r
+       // Call custom cleanup code\r
+       content = tinyMCE.storeAwayURLs(content);\r
+       content = tinyMCE._customCleanup(inst, "insert_to_editor", content);\r
+\r
+       if (tinyMCE.isMSIE) {\r
+               // Ugly!!!\r
+               window.setInterval('try{tinyMCE.getCSSClasses(document.frames["' + editor_id + '"].document, "' + editor_id + '");}catch(e){}', 500);\r
+\r
+               if (tinyMCE.settings["force_br_newlines"])\r
+                       document.frames[editor_id].document.styleSheets[0].addRule("p", "margin: 0px;");\r
+\r
+               var body = document.frames[editor_id].document.body;\r
+\r
+               tinyMCE.addEvent(body, "beforepaste", TinyMCE.prototype.eventPatch);\r
+               tinyMCE.addEvent(body, "beforecut", TinyMCE.prototype.eventPatch);\r
+\r
+               body.editorId = editor_id;\r
+       }\r
+\r
+       content = tinyMCE.cleanupHTMLCode(content);\r
+\r
+       // Fix for bug #958637\r
+       if (!tinyMCE.isMSIE) {\r
+               var contentElement = inst.getDoc().createElement("body");\r
+               var doc = inst.getDoc();\r
+\r
+               contentElement.innerHTML = content;\r
+\r
+               // Remove weridness!\r
+               if (tinyMCE.isGecko && tinyMCE.settings['remove_lt_gt'])\r
+                       content = content.replace(new RegExp('&lt;&gt;', 'g'), "");\r
+\r
+               if (tinyMCE.settings['cleanup_on_startup'])\r
+                       tinyMCE.setInnerHTML(inst.getBody(), tinyMCE._cleanupHTML(inst, doc, this.settings, contentElement));\r
+               else {\r
+                       // Convert all strong/em to b/i\r
+                       content = tinyMCE.regexpReplace(content, "<strong", "<b", "gi");\r
+                       content = tinyMCE.regexpReplace(content, "<em(/?)>", "<i$1>", "gi");\r
+                       content = tinyMCE.regexpReplace(content, "<em ", "<i ", "gi");\r
+                       content = tinyMCE.regexpReplace(content, "</strong>", "</b>", "gi");\r
+                       content = tinyMCE.regexpReplace(content, "</em>", "</i>", "gi");\r
+                       tinyMCE.setInnerHTML(inst.getBody(), content);\r
+               }\r
+\r
+               inst.convertAllRelativeURLs();\r
+       } else {\r
+               if (tinyMCE.settings['cleanup_on_startup']) {\r
+                       tinyMCE._setHTML(inst.getDoc(), content);\r
+\r
+                       // Produces permission denied error in MSIE 5.5\r
+                       eval('try {tinyMCE.setInnerHTML(inst.getBody(), tinyMCE._cleanupHTML(inst, inst.contentDocument, this.settings, inst.getBody()));} catch(e) {}');\r
+               } else\r
+                       tinyMCE._setHTML(inst.getDoc(), content);\r
+       }\r
+\r
+       // Fix for bug #957681\r
+       //inst.getDoc().designMode = inst.getDoc().designMode;\r
+\r
+       // Setup element references\r
+       var parentElm = document.getElementById(inst.editorId + '_parent');\r
+       if (parentElm.lastChild.nodeName == "INPUT")\r
+               inst.formElement = tinyMCE.isGecko ? parentElm.firstChild : parentElm.lastChild;\r
+       else\r
+               inst.formElement = tinyMCE.isGecko ? parentElm.previousSibling : parentElm.nextSibling;\r
+\r
+       tinyMCE.handleVisualAid(inst.getBody(), true, tinyMCE.settings['visual'], inst);\r
+       tinyMCE.executeCallback('setupcontent_callback', '_setupContent', 0, editor_id, inst.getBody(), inst.getDoc());\r
+\r
+       // Re-add design mode on mozilla\r
+       if (!tinyMCE.isMSIE)\r
+               TinyMCE.prototype.addEventHandlers(editor_id);\r
+\r
+       // Add blur handler\r
+       if (tinyMCE.isMSIE)\r
+               tinyMCE.addEvent(inst.getBody(), "blur", TinyMCE.prototype.eventPatch);\r
+\r
+       // Trigger node change, this call locks buttons for tables and so forth\r
+       tinyMCE.selectedInstance = inst;\r
+       tinyMCE.selectedElement = inst.contentWindow.document.body;\r
+\r
+       if (!inst.isHidden())\r
+               tinyMCE.triggerNodeChange(false, true);\r
+\r
+       // Call custom DOM cleanup\r
+       tinyMCE._customCleanup(inst, "insert_to_editor_dom", inst.getBody());\r
+       tinyMCE._customCleanup(inst, "setup_content_dom", inst.getBody());\r
+       tinyMCE._setEventsEnabled(inst.getBody(), false);\r
+       tinyMCE.cleanupAnchors(inst.getDoc());\r
+\r
+       if (tinyMCE.getParam("convert_fonts_to_spans"))\r
+               tinyMCE.convertSpansToFonts(inst.getDoc());\r
+\r
+       inst.startContent = tinyMCE.trim(inst.getBody().innerHTML);\r
+       inst.undoLevels[inst.undoLevels.length] = inst.startContent;\r
+\r
+       tinyMCE.operaOpacityCounter = -1;\r
+};\r
+\r
+TinyMCE.prototype.cleanupHTMLCode = function(s) {\r
+       s = s.replace(/<p \/>/gi, '<p>&nbsp;</p>');\r
+       s = s.replace(/<p>\s*<\/p>/gi, '<p>&nbsp;</p>');\r
+\r
+       // Open closed tags like <b/> to <b></b>\r
+//     tinyMCE.debug("f:" + s);\r
+       s = s.replace(/<(h[1-6]|p|div|address|pre|form|table|li|ol|ul|td|b|em|strong|i|strike|u|span|a|ul|ol|li|blockquote)([a-z]*)([^\\|>]*?)\/>/gi, '<$1$2$3></$1$2>');\r
+//     tinyMCE.debug("e:" + s);\r
+\r
+       // Remove trailing space <b > to <b>\r
+       s = s.replace(new RegExp('\\s+></', 'gi'), '></');\r
+\r
+       // Close tags <img></img> to <img/>\r
+       s = s.replace(/<(img|br|hr)(.*?)><\/(img|br|hr)>/gi, '<$1$2 />');\r
+\r
+       // Weird MSIE bug, <p><hr /></p> breaks runtime?\r
+       if (tinyMCE.isMSIE)\r
+               s = s.replace(/<p><hr \/><\/p>/gi, "<hr>");\r
+\r
+       // Convert relative anchors to absolute URLs ex: #something to file.htm#something\r
+       s = s.replace(new RegExp('(href=\"?)(\\s*?#)', 'gi'), '$1' + tinyMCE.settings['document_base_url'] + "#");\r
+\r
+       return s;\r
+};\r
+\r
+TinyMCE.prototype.storeAwayURLs = function(s) {\r
+       // Remove all mce_src, mce_href and replace them with new ones\r
+       s = s.replace(new RegExp('mce_src\\s*=\\s*\"[^ >\"]*\"', 'gi'), '');\r
+       s = s.replace(new RegExp('mce_href\\s*=\\s*\"[^ >\"]*\"', 'gi'), '');\r
+       s = s.replace(new RegExp('src\\s*=\\s*\"([^ >\"]*)\"', 'gi'), 'src="$1" mce_src="$1"');\r
+       s = s.replace(new RegExp('href\\s*=\\s*\"([^ >\"]*)\"', 'gi'), 'href="$1" mce_href="$1"');\r
+\r
+       return s;\r
+};\r
+\r
+TinyMCE.prototype.cancelEvent = function(e) {\r
+       if (tinyMCE.isMSIE) {\r
+               e.returnValue = false;\r
+               e.cancelBubble = true;\r
+       } else\r
+               e.preventDefault();\r
+};\r
+\r
+TinyMCE.prototype.removeTinyMCEFormElements = function(form_obj) {\r
+       // Check if form is valid\r
+       if (typeof(form_obj) == "undefined" || form_obj == null)\r
+               return;\r
+\r
+       // If not a form, find the form\r
+       if (form_obj.nodeName != "FORM") {\r
+               if (form_obj.form)\r
+                       form_obj = form_obj.form;\r
+               else\r
+                       form_obj = tinyMCE.getParentElement(form_obj, "form");\r
+       }\r
+\r
+       // Still nothing\r
+       if (form_obj == null)\r
+               return;\r
+\r
+       // Disable all UI form elements that TinyMCE created\r
+       for (var i=0; i<form_obj.elements.length; i++) {\r
+               var elementId = form_obj.elements[i].name ? form_obj.elements[i].name : form_obj.elements[i].id;\r
+\r
+               if (elementId.indexOf('mce_editor_') == 0)\r
+                       form_obj.elements[i].disabled = true;\r
+       }\r
+};\r
+\r
+TinyMCE.prototype.accessibleEventHandler = function(e) {\r
+       var win = this._win;\r
+       e = tinyMCE.isMSIE ? win.event : e;\r
+       var elm = tinyMCE.isMSIE ? e.srcElement : e.target;\r
+\r
+       // Piggyback onchange\r
+       if (elm.nodeName == "SELECT" && !elm.oldonchange) {\r
+               elm.oldonchange = elm.onchange;\r
+               elm.onchange = null;\r
+       }\r
+\r
+       // Execute onchange and remove piggyback\r
+       if (e.keyCode == 13 || e.keyCode == 32) {\r
+               elm.onchange = elm.oldonchange;\r
+               elm.onchange();\r
+               elm.oldonchange = null;\r
+               tinyMCE.cancelEvent(e);\r
+       }\r
+};\r
+\r
+TinyMCE.prototype.addSelectAccessibility = function(e, select, win) {\r
+       // Add event handlers \r
+       if (!select._isAccessible) {\r
+               select.onkeydown = tinyMCE.accessibleEventHandler;\r
+               select._isAccessible = true;\r
+               select._win = win;\r
+       }\r
+};\r
+\r
+TinyMCE.prototype.handleEvent = function(e) {\r
+       // Remove odd, error\r
+       if (typeof(tinyMCE) == "undefined")\r
+               return true;\r
+\r
+       //tinyMCE.debug(e.type + " " + e.target.nodeName + " " + (e.relatedTarget ? e.relatedTarget.nodeName : ""));\r
+\r
+       switch (e.type) {\r
+               case "blur":\r
+                       if (tinyMCE.selectedInstance)\r
+                               tinyMCE.selectedInstance.execCommand('mceEndTyping');\r
+\r
+                       return;\r
+\r
+               case "submit":\r
+                       tinyMCE.removeTinyMCEFormElements(tinyMCE.isMSIE ? window.event.srcElement : e.target);\r
+                       tinyMCE.triggerSave();\r
+                       tinyMCE.isNotDirty = true;\r
+                       return;\r
+\r
+               case "reset":\r
+                       var formObj = tinyMCE.isMSIE ? window.event.srcElement : e.target;\r
+\r
+                       for (var i=0; i<document.forms.length; i++) {\r
+                               if (document.forms[i] == formObj)\r
+                                       window.setTimeout('tinyMCE.resetForm(' + i + ');', 10);\r
+                       }\r
+\r
+                       return;\r
+\r
+               case "keypress":\r
+                       if (e.target.editorId) {\r
+                               tinyMCE.selectedInstance = tinyMCE.instances[e.target.editorId];\r
+                       } else {\r
+                               if (e.target.ownerDocument.editorId)\r
+                                       tinyMCE.selectedInstance = tinyMCE.instances[e.target.ownerDocument.editorId];\r
+                       }\r
+\r
+                       if (tinyMCE.selectedInstance)\r
+                               tinyMCE.selectedInstance.switchSettings();\r
+\r
+                       // Insert space instead of &nbsp;\r
+/*                     if (tinyMCE.isGecko && e.charCode == 32) {\r
+                               if (tinyMCE.selectedInstance._insertSpace()) {\r
+                                       // Cancel event\r
+                                       e.preventDefault();\r
+                                       return false;\r
+                               }\r
+                       }*/\r
+\r
+                       // Insert P element\r
+                       if (tinyMCE.isGecko && tinyMCE.settings['force_p_newlines'] && e.keyCode == 13 && !e.shiftKey) {\r
+                               // Insert P element instead of BR\r
+                               if (tinyMCE.selectedInstance._insertPara(e)) {\r
+                                       // Cancel event\r
+                                       tinyMCE.execCommand("mceAddUndoLevel");\r
+                                       tinyMCE.cancelEvent(e);\r
+                                       return false;\r
+                               }\r
+                       }\r
+\r
+                       // Handle backspace\r
+                       if (tinyMCE.isGecko && tinyMCE.settings['force_p_newlines'] && (e.keyCode == 8 || e.keyCode == 46) && !e.shiftKey) {\r
+                               // Insert P element instead of BR\r
+                               if (tinyMCE.selectedInstance._handleBackSpace(e.type)) {\r
+                                       // Cancel event\r
+                                       tinyMCE.execCommand("mceAddUndoLevel");\r
+                                       tinyMCE.cancelEvent(e);\r
+                                       return false;\r
+                               }\r
+                       }\r
+\r
+                       // Mozilla custom key handling\r
+                       if (tinyMCE.isGecko && (e.ctrlKey && !e.altKey) && tinyMCE.settings['custom_undo_redo']) {\r
+                               if (tinyMCE.settings['custom_undo_redo_keyboard_shortcuts']) {\r
+                                       if (e.charCode == 122) { // Ctrl+Z\r
+                                               tinyMCE.selectedInstance.execCommand("Undo");\r
+                                               tinyMCE.cancelEvent(e);\r
+                                               return false;\r
+                                       }\r
+\r
+                                       if (e.charCode == 121) { // Ctrl+Y\r
+                                               tinyMCE.selectedInstance.execCommand("Redo");\r
+                                               tinyMCE.cancelEvent(e);\r
+                                               return false;\r
+                                       }\r
+                               }\r
+\r
+                               if (e.charCode == 98) { // Ctrl+B\r
+                                       tinyMCE.selectedInstance.execCommand("Bold");\r
+                                       tinyMCE.cancelEvent(e);\r
+                                       return false;\r
+                               }\r
+\r
+                               if (e.charCode == 105) { // Ctrl+I\r
+                                       tinyMCE.selectedInstance.execCommand("Italic");\r
+                                       tinyMCE.cancelEvent(e);\r
+                                       return false;\r
+                               }\r
+\r
+                               if (e.charCode == 117) { // Ctrl+U\r
+                                       tinyMCE.selectedInstance.execCommand("Underline");\r
+                                       tinyMCE.cancelEvent(e);\r
+                                       return false;\r
+                               }\r
+                       }\r
+\r
+                       // Return key pressed\r
+                       if (tinyMCE.isMSIE && tinyMCE.settings['force_br_newlines'] && e.keyCode == 13) {\r
+                               if (e.target.editorId)\r
+                                       tinyMCE.selectedInstance = tinyMCE.instances[e.target.editorId];\r
+\r
+                               if (tinyMCE.selectedInstance) {\r
+                                       var sel = tinyMCE.selectedInstance.getDoc().selection;\r
+                                       var rng = sel.createRange();\r
+\r
+                                       if (tinyMCE.getParentElement(rng.parentElement(), "li") != null)\r
+                                               return false;\r
+\r
+                                       // Cancel event\r
+                                       e.returnValue = false;\r
+                                       e.cancelBubble = true;\r
+\r
+                                       // Insert BR element\r
+                                       rng.pasteHTML("<br />");\r
+                                       rng.collapse(false);\r
+                                       rng.select();\r
+\r
+                                       tinyMCE.execCommand("mceAddUndoLevel");\r
+                                       tinyMCE.triggerNodeChange(false);\r
+                                       return false;\r
+                               }\r
+                       }\r
+\r
+                       // Backspace or delete\r
+                       if (e.keyCode == 8 || e.keyCode == 46) {\r
+                               tinyMCE.selectedElement = e.target;\r
+                               tinyMCE.linkElement = tinyMCE.getParentElement(e.target, "a");\r
+                               tinyMCE.imgElement = tinyMCE.getParentElement(e.target, "img");\r
+                               tinyMCE.triggerNodeChange(false);\r
+                       }\r
+\r
+                       return false;\r
+               break;\r
+\r
+               case "keyup":\r
+               case "keydown":\r
+                       if (e.target.editorId)\r
+                               tinyMCE.selectedInstance = tinyMCE.instances[e.target.editorId];\r
+                       else\r
+                               return;\r
+\r
+                       if (tinyMCE.selectedInstance)\r
+                               tinyMCE.selectedInstance.switchSettings();\r
+\r
+                       var inst = tinyMCE.selectedInstance;\r
+\r
+                       // Handle backspace\r
+                       if (tinyMCE.isGecko && tinyMCE.settings['force_p_newlines'] && (e.keyCode == 8 || e.keyCode == 46) && !e.shiftKey) {\r
+                               // Insert P element instead of BR\r
+                               if (tinyMCE.selectedInstance._handleBackSpace(e.type)) {\r
+                                       // Cancel event\r
+                                       tinyMCE.execCommand("mceAddUndoLevel");\r
+                                       e.preventDefault();\r
+                                       return false;\r
+                               }\r
+                       }\r
+\r
+                       tinyMCE.selectedElement = null;\r
+                       tinyMCE.selectedNode = null;\r
+                       var elm = tinyMCE.selectedInstance.getFocusElement();\r
+                       tinyMCE.linkElement = tinyMCE.getParentElement(elm, "a");\r
+                       tinyMCE.imgElement = tinyMCE.getParentElement(elm, "img");\r
+                       tinyMCE.selectedElement = elm;\r
+\r
+                       // Update visualaids on tabs\r
+                       if (tinyMCE.isGecko && e.type == "keyup" && e.keyCode == 9)\r
+                               tinyMCE.handleVisualAid(tinyMCE.selectedInstance.getBody(), true, tinyMCE.settings['visual'], tinyMCE.selectedInstance);\r
+\r
+                       // Fix empty elements on return/enter, check where enter occured\r
+                       if (tinyMCE.isMSIE && e.type == "keydown" && e.keyCode == 13)\r
+                               tinyMCE.enterKeyElement = tinyMCE.selectedInstance.getFocusElement();\r
+\r
+                       // Fix empty elements on return/enter\r
+                       if (tinyMCE.isMSIE && e.type == "keyup" && e.keyCode == 13) {\r
+                               var elm = tinyMCE.enterKeyElement;\r
+                               if (elm) {\r
+                                       var re = new RegExp('^HR|IMG|BR$','g'); // Skip these\r
+                                       var dre = new RegExp('^H[1-6]$','g'); // Add double on these\r
+\r
+                                       if (!elm.hasChildNodes() && !re.test(elm.nodeName)) {\r
+                                               if (dre.test(elm.nodeName))\r
+                                                       elm.innerHTML = "&nbsp;&nbsp;";\r
+                                               else\r
+                                                       elm.innerHTML = "&nbsp;";\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       // Check if it's a position key\r
+                       var keys = tinyMCE.posKeyCodes;\r
+                       var posKey = false;\r
+                       for (var i=0; i<keys.length; i++) {\r
+                               if (keys[i] == e.keyCode) {\r
+                                       posKey = true;\r
+                                       break;\r
+                               }\r
+                       }\r
+\r
+                       // MSIE custom key handling\r
+                       if (tinyMCE.isMSIE && tinyMCE.settings['custom_undo_redo']) {\r
+                               var keys = new Array(8,46); // Backspace,Delete\r
+                               for (var i=0; i<keys.length; i++) {\r
+                                       if (keys[i] == e.keyCode) {\r
+                                               if (e.type == "keyup")\r
+                                                       tinyMCE.triggerNodeChange(false);\r
+                                       }\r
+                               }\r
+\r
+                               if (tinyMCE.settings['custom_undo_redo_keyboard_shortcuts']) {\r
+                                       if (e.keyCode == 90 && (e.ctrlKey && !e.altKey) && e.type == "keydown") { // Ctrl+Z\r
+                                               tinyMCE.selectedInstance.execCommand("Undo");\r
+                                               tinyMCE.triggerNodeChange(false);\r
+                                       }\r
+\r
+                                       if (e.keyCode == 89 && (e.ctrlKey && !e.altKey) && e.type == "keydown") { // Ctrl+Y\r
+                                               tinyMCE.selectedInstance.execCommand("Redo");\r
+                                               tinyMCE.triggerNodeChange(false);\r
+                                       }\r
+\r
+                                       if ((e.keyCode == 90 || e.keyCode == 89) && (e.ctrlKey && !e.altKey)) {\r
+                                               // Cancel event\r
+                                               e.returnValue = false;\r
+                                               e.cancelBubble = true;\r
+                                               return false;\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       // If undo/redo key\r
+                       if ((e.keyCode == 90 || e.keyCode == 89) && (e.ctrlKey && !e.altKey))\r
+                               return true;\r
+\r
+                       // If Ctrl key\r
+                       if (e.keyCode == 17)\r
+                               return true;\r
+\r
+                       // Handle Undo/Redo when typing content\r
+\r
+                       // Start typing (non position key)\r
+                       if (!posKey && e.type == "keyup")\r
+                               tinyMCE.execCommand("mceStartTyping");\r
+\r
+                       // End typing (position key) or some Ctrl event\r
+                       if (e.type == "keyup" && (posKey || e.ctrlKey))\r
+                               tinyMCE.execCommand("mceEndTyping");\r
+\r
+                       if (posKey && e.type == "keyup")\r
+                               tinyMCE.triggerNodeChange(false);\r
+\r
+                       if (tinyMCE.isMSIE && e.ctrlKey)\r
+                               window.setTimeout('tinyMCE.triggerNodeChange(false);', 1);\r
+               break;\r
+\r
+               case "mousedown":\r
+               case "mouseup":\r
+               case "click":\r
+               case "focus":\r
+                       if (tinyMCE.selectedInstance)\r
+                               tinyMCE.selectedInstance.switchSettings();\r
+\r
+                       // Check instance event trigged on\r
+                       var targetBody = tinyMCE.getParentElement(e.target, "body");\r
+                       for (var instanceName in tinyMCE.instances) {\r
+                               if (!tinyMCE.isInstance(tinyMCE.instances[instanceName]))\r
+                                       continue;\r
+\r
+                               var inst = tinyMCE.instances[instanceName];\r
+\r
+                               // Reset design mode if lost (on everything just in case)\r
+                               inst.autoResetDesignMode();\r
+\r
+                               if (inst.getBody() == targetBody) {\r
+                                       tinyMCE.selectedInstance = inst;\r
+                                       tinyMCE.selectedElement = e.target;\r
+                                       tinyMCE.linkElement = tinyMCE.getParentElement(tinyMCE.selectedElement, "a");\r
+                                       tinyMCE.imgElement = tinyMCE.getParentElement(tinyMCE.selectedElement, "img");\r
+                                       break;\r
+                               }\r
+                       }\r
+\r
+                       if (tinyMCE.isSafari) {\r
+                               tinyMCE.selectedInstance.lastSafariSelection = tinyMCE.selectedInstance.getBookmark();\r
+                               tinyMCE.selectedInstance.lastSafariSelectedElement = tinyMCE.selectedElement;\r
+\r
+                               var lnk = tinyMCE.getParentElement(tinyMCE.selectedElement, "a");\r
+\r
+                               // Patch the darned link\r
+                               if (lnk && e.type == "mousedown") {\r
+                                       lnk.setAttribute("mce_real_href", lnk.getAttribute("href"));\r
+                                       lnk.setAttribute("href", "javascript:void(0);");\r
+                               }\r
+\r
+                               // Patch back\r
+                               if (lnk && e.type == "click") {\r
+                                       window.setTimeout(function() {\r
+                                               lnk.setAttribute("href", lnk.getAttribute("mce_real_href"));\r
+                                               lnk.removeAttribute("mce_real_href");\r
+                                       }, 10);\r
+                               }\r
+                       }\r
+\r
+                       // Reset selected node\r
+                       if (e.type != "focus")\r
+                               tinyMCE.selectedNode = null;\r
+\r
+                       tinyMCE.triggerNodeChange(false);\r
+                       tinyMCE.execCommand("mceEndTyping");\r
+\r
+                       if (e.type == "mouseup")\r
+                               tinyMCE.execCommand("mceAddUndoLevel");\r
+\r
+                       // Just in case\r
+                       if (!tinyMCE.selectedInstance && e.target.editorId)\r
+                               tinyMCE.selectedInstance = tinyMCE.instances[e.target.editorId];\r
+\r
+                       return false;\r
+               break;\r
+    } // end switch\r
+}; // end function\r
+\r
+TinyMCE.prototype.switchClass = function(element, class_name, lock_state) {\r
+       var lockChanged = false;\r
+\r
+       if (typeof(lock_state) != "undefined" && element != null) {\r
+               element.classLock = lock_state;\r
+               lockChanged = true;\r
+       }\r
+\r
+       if (element != null && (lockChanged || !element.classLock)) {\r
+               element.oldClassName = element.className;\r
+               element.className = class_name;\r
+       }\r
+};\r
+\r
+TinyMCE.prototype.restoreAndSwitchClass = function(element, class_name) {\r
+       if (element != null && !element.classLock) {\r
+               this.restoreClass(element);\r
+               this.switchClass(element, class_name);\r
+       }\r
+};\r
+\r
+TinyMCE.prototype.switchClassSticky = function(element_name, class_name, lock_state) {\r
+       var element, lockChanged = false;\r
+\r
+       // Performance issue\r
+       if (!this.stickyClassesLookup[element_name])\r
+               this.stickyClassesLookup[element_name] = document.getElementById(element_name);\r
+\r
+//     element = document.getElementById(element_name);\r
+       element = this.stickyClassesLookup[element_name];\r
+\r
+       if (typeof(lock_state) != "undefined" && element != null) {\r
+               element.classLock = lock_state;\r
+               lockChanged = true;\r
+       }\r
+\r
+       if (element != null && (lockChanged || !element.classLock)) {\r
+               element.className = class_name;\r
+               element.oldClassName = class_name;\r
+\r
+               // Fix opacity in Opera\r
+               if (tinyMCE.isOpera) {\r
+                       if (class_name == "mceButtonDisabled") {\r
+                               var suffix = "";\r
+\r
+                               if (!element.mceOldSrc)\r
+                                       element.mceOldSrc = element.src;\r
+\r
+                               if (this.operaOpacityCounter > -1)\r
+                                       suffix = '?rnd=' + this.operaOpacityCounter++;\r
+\r
+                               element.src = tinyMCE.baseURL + "/themes/" + tinyMCE.getParam("theme") + "/images/opacity.png" + suffix;\r
+                               element.style.backgroundImage = "url('" + element.mceOldSrc + "')";\r
+                       } else {\r
+                               if (element.mceOldSrc) {\r
+                                       element.src = element.mceOldSrc;\r
+                                       element.parentNode.style.backgroundImage = "";\r
+                                       element.mceOldSrc = null;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+};\r
+\r
+TinyMCE.prototype.restoreClass = function(element) {\r
+       if (element != null && element.oldClassName && !element.classLock) {\r
+               element.className = element.oldClassName;\r
+               element.oldClassName = null;\r
+       }\r
+};\r
+\r
+TinyMCE.prototype.setClassLock = function(element, lock_state) {\r
+       if (element != null)\r
+               element.classLock = lock_state;\r
+};\r
+\r
+TinyMCE.prototype.addEvent = function(obj, name, handler) {\r
+       if (tinyMCE.isMSIE) {\r
+               obj.attachEvent("on" + name, handler);\r
+       } else\r
+               obj.addEventListener(name, handler, false);\r
+};\r
+\r
+TinyMCE.prototype.submitPatch = function() {\r
+       tinyMCE.removeTinyMCEFormElements(this);\r
+       tinyMCE.triggerSave();\r
+       this.mceOldSubmit();\r
+       tinyMCE.isNotDirty = true;\r
+};\r
+\r
+TinyMCE.prototype.onLoad = function() {\r
+       for (var c=0; c<tinyMCE.configs.length; c++) {\r
+               tinyMCE.settings = tinyMCE.configs[c];\r
+\r
+               var selector = tinyMCE.getParam("editor_selector");\r
+               var deselector = tinyMCE.getParam("editor_deselector");\r
+               var elementRefAr = new Array();\r
+\r
+               // Add submit triggers\r
+               if (document.forms && tinyMCE.settings['add_form_submit_trigger'] && !tinyMCE.submitTriggers) {\r
+                       for (var i=0; i<document.forms.length; i++) {\r
+                               var form = document.forms[i];\r
+\r
+                               tinyMCE.addEvent(form, "submit", TinyMCE.prototype.handleEvent);\r
+                               tinyMCE.addEvent(form, "reset", TinyMCE.prototype.handleEvent);\r
+                               tinyMCE.submitTriggers = true; // Do it only once\r
+\r
+                               // Patch the form.submit function\r
+                               if (tinyMCE.settings['submit_patch']) {\r
+                                       try {\r
+                                               form.mceOldSubmit = form.submit;\r
+                                               form.submit = TinyMCE.prototype.submitPatch;\r
+                                       } catch (e) {\r
+                                               // Do nothing\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+\r
+               // Add editor instances based on mode\r
+               var mode = tinyMCE.settings['mode'];\r
+               switch (mode) {\r
+                       case "exact":\r
+                               var elements = tinyMCE.getParam('elements', '', true, ',');\r
+\r
+                               for (var i=0; i<elements.length; i++) {\r
+                                       var element = tinyMCE._getElementById(elements[i]);\r
+                                       var trigger = element ? element.getAttribute(tinyMCE.settings['textarea_trigger']) : "";\r
+\r
+                                       if (tinyMCE.getAttrib(element, "class").indexOf(deselector) != -1)\r
+                                               continue;\r
+\r
+                                       if (trigger == "false")\r
+                                               continue;\r
+\r
+                                       if (tinyMCE.settings['ask'] && element) {\r
+                                               elementRefAr[elementRefAr.length] = element;\r
+                                               continue;\r
+                                       }\r
+\r
+                                       if (element)\r
+                                               tinyMCE.addMCEControl(element, elements[i]);\r
+                                       else if (tinyMCE.settings['debug'])\r
+                                               alert("Error: Could not find element by id or name: " + elements[i]);\r
+                               }\r
+                       break;\r
+\r
+                       case "specific_textareas":\r
+                       case "textareas":\r
+                               var nodeList = document.getElementsByTagName("textarea");\r
+\r
+                               for (var i=0; i<nodeList.length; i++) {\r
+                                       var elm = nodeList.item(i);\r
+                                       var trigger = elm.getAttribute(tinyMCE.settings['textarea_trigger']);\r
+\r
+                                       if (selector != '' && tinyMCE.getAttrib(elm, "class").indexOf(selector) == -1)\r
+                                               continue;\r
+\r
+                                       if (selector != '')\r
+                                               trigger = selector != "" ? "true" : "";\r
+\r
+                                       if (tinyMCE.getAttrib(elm, "class").indexOf(deselector) != -1)\r
+                                               continue;\r
+\r
+                                       if ((mode == "specific_textareas" && trigger == "true") || (mode == "textareas" && trigger != "false"))\r
+                                               elementRefAr[elementRefAr.length] = elm;\r
+                               }\r
+                       break;\r
+               }\r
+\r
+               for (var i=0; i<elementRefAr.length; i++) {\r
+                       var element = elementRefAr[i];\r
+                       var elementId = element.name ? element.name : element.id;\r
+\r
+                       if (tinyMCE.settings['ask']) {\r
+                               // Focus breaks in Mozilla\r
+                               if (tinyMCE.isGecko) {\r
+                                       var settings = tinyMCE.settings;\r
+\r
+                                       tinyMCE.addEvent(element, "focus", function (e) {window.setTimeout(function() {TinyMCE.prototype.confirmAdd(e, settings);}, 10);});\r
+                               } else {\r
+                                       var settings = tinyMCE.settings;\r
+\r
+                                       tinyMCE.addEvent(element, "focus", function () { TinyMCE.prototype.confirmAdd(null, settings); });\r
+                               }\r
+                       } else\r
+                               tinyMCE.addMCEControl(element, elementId);\r
+               }\r
+\r
+               // Handle auto focus\r
+               if (tinyMCE.settings['auto_focus']) {\r
+                       window.setTimeout(function () {\r
+                               var inst = tinyMCE.getInstanceById(tinyMCE.settings['auto_focus']);\r
+                               inst.selectNode(inst.getBody(), true, true);\r
+                               inst.contentWindow.focus();\r
+                       }, 10);\r
+               }\r
+\r
+               tinyMCE.executeCallback('oninit', '_oninit', 0);\r
+       }\r
+};\r
+\r
+TinyMCE.prototype.removeMCEControl = function(editor_id) {\r
+       var inst = tinyMCE.getInstanceById(editor_id);\r
+\r
+       if (inst) {\r
+               inst.switchSettings();\r
+\r
+               editor_id = inst.editorId;\r
+               var html = tinyMCE.getContent(editor_id);\r
+\r
+               // Remove editor instance from instances array\r
+               var tmpInstances = new Array();\r
+               for (var instanceName in tinyMCE.instances) {\r
+                       var instance = tinyMCE.instances[instanceName];\r
+                       if (!tinyMCE.isInstance(instance))\r
+                               continue;\r
+\r
+                       if (instanceName != editor_id)\r
+                                       tmpInstances[instanceName] = instance;\r
+               }\r
+               tinyMCE.instances = tmpInstances;\r
+\r
+               tinyMCE.selectedElement = null;\r
+               tinyMCE.selectedInstance = null;\r
+\r
+               // Remove element\r
+               var replaceElement = document.getElementById(editor_id + "_parent");\r
+               var oldTargetElement = inst.oldTargetElement;\r
+               var targetName = oldTargetElement.nodeName.toLowerCase();\r
+\r
+               if (targetName == "textarea" || targetName == "input") {\r
+                       // Just show the old text area\r
+                       replaceElement.parentNode.removeChild(replaceElement);\r
+                       oldTargetElement.style.display = "inline";\r
+                       oldTargetElement.value = html;\r
+               } else {\r
+                       oldTargetElement.innerHTML = html;\r
+\r
+                       replaceElement.parentNode.insertBefore(oldTargetElement, replaceElement);\r
+                       replaceElement.parentNode.removeChild(replaceElement);\r
+               }\r
+       }\r
+};\r
+\r
+TinyMCE.prototype._cleanupElementName = function(element_name, element) {\r
+       var name = "";\r
+\r
+       element_name = element_name.toLowerCase();\r
+\r
+       // Never include body\r
+       if (element_name == "body")\r
+               return null;\r
+\r
+       // If verification mode\r
+       if (tinyMCE.cleanup_verify_html) {\r
+               // Check if invalid element\r
+               for (var i=0; i<tinyMCE.cleanup_invalidElements.length; i++) {\r
+                       if (tinyMCE.cleanup_invalidElements[i] == element_name)\r
+                               return null;\r
+               }\r
+\r
+               // Check if valid element\r
+               var validElement = false;\r
+               var elementAttribs = null;\r
+               for (var i=0; i<tinyMCE.cleanup_validElements.length && !elementAttribs; i++) {\r
+                       for (var x=0, n=tinyMCE.cleanup_validElements[i][0].length; x<n; x++) {\r
+                               var elmMatch = tinyMCE.cleanup_validElements[i][0][x];\r
+\r
+                               if (elmMatch.charAt(0) == '+' || elmMatch.charAt(0) == '-')\r
+                                       elmMatch = elmMatch.substring(1);\r
+\r
+                               // Handle wildcard/regexp\r
+                               if (elmMatch.match(new RegExp('\\*|\\?|\\+', 'g')) != null) {\r
+                                       elmMatch = elmMatch.replace(new RegExp('\\?', 'g'), '(\\S?)');\r
+                                       elmMatch = elmMatch.replace(new RegExp('\\+', 'g'), '(\\S+)');\r
+                                       elmMatch = elmMatch.replace(new RegExp('\\*', 'g'), '(\\S*)');\r
+                                       elmMatch = "^" + elmMatch + "$";\r
+                                       if (element_name.match(new RegExp(elmMatch, 'g'))) {\r
+                                               elementAttribs = tinyMCE.cleanup_validElements[i];\r
+                                               validElement = true;\r
+                                               break;\r
+                                       }\r
+                               }\r
+\r
+                               // Handle non regexp\r
+                               if (element_name == elmMatch) {\r
+                                       elementAttribs = tinyMCE.cleanup_validElements[i];\r
+                                       validElement = true;\r
+                                       element_name = elementAttribs[0][0];\r
+                                       break;\r
+                               }\r
+                       }\r
+               }\r
+\r
+               if (!validElement)\r
+                       return null;\r
+       }\r
+\r
+       if (element_name.charAt(0) == '+' || element_name.charAt(0) == '-')\r
+               name = element_name.substring(1);\r
+\r
+       // Special Mozilla stuff\r
+       if (!tinyMCE.isMSIE) {\r
+               // Fix for bug #958498\r
+               if (name == "strong" && !tinyMCE.cleanup_on_save)\r
+                       element_name = "b";\r
+               else if (name == "em" && !tinyMCE.cleanup_on_save)\r
+                       element_name = "i";\r
+       }\r
+\r
+       var elmData = new Object();\r
+\r
+       elmData.element_name = element_name;\r
+       elmData.valid_attribs = elementAttribs;\r
+\r
+       return elmData;\r
+};\r
+\r
+/**\r
+ * This function moves CSS styles to/from attributes.\r
+ */\r
+TinyMCE.prototype._moveStyle = function(elm, style, attrib) {\r
+       if (tinyMCE.cleanup_inline_styles) {\r
+               var val = tinyMCE.getAttrib(elm, attrib);\r
+\r
+               if (val != '') {\r
+                       val = '' + val;\r
+\r
+                       switch (attrib) {\r
+                               case "background":\r
+                                       val = "url('" + val + "')";\r
+                                       break;\r
+\r
+                               case "bordercolor":\r
+                                       if (elm.style.borderStyle == '' || elm.style.borderStyle == 'none')\r
+                                               elm.style.borderStyle = 'solid';\r
+                                       break;\r
+\r
+                               case "border":\r
+                               case "width":\r
+                               case "height":\r
+                                       if (attrib == "border" && elm.style.borderWidth > 0)\r
+                                               return;\r
+\r
+                                       if (val.indexOf('%') == -1)\r
+                                               val += 'px';\r
+                                       break;\r
+\r
+                               case "vspace":\r
+                               case "hspace":\r
+                                       elm.style.marginTop = val + "px";\r
+                                       elm.style.marginBottom = val + "px";\r
+                                       elm.removeAttribute(attrib);\r
+                                       return;\r
+\r
+                               case "align":\r
+                                       if (elm.nodeName == "IMG") {\r
+                                               if (tinyMCE.isMSIE)\r
+                                                       elm.style.styleFloat = val;\r
+                                               else\r
+                                                       elm.style.cssFloat = val;\r
+                                       } else\r
+                                               elm.style.textAlign = val;\r
+\r
+                                       elm.removeAttribute(attrib);\r
+                                       return;\r
+                       }\r
+\r
+                       if (val != '') {\r
+                               eval('elm.style.' + style + ' = val;');\r
+                               elm.removeAttribute(attrib);\r
+                       }\r
+               }\r
+       } else {\r
+               if (style == '')\r
+                       return;\r
+\r
+               var val = eval('elm.style.' + style) == '' ? tinyMCE.getAttrib(elm, attrib) : eval('elm.style.' + style);\r
+               val = val == null ? '' : '' + val;\r
+\r
+               switch (attrib) {\r
+                       // Always move background to style\r
+                       case "background":\r
+                               if (val.indexOf('url') == -1 && val != '')\r
+                                       val = "url('" + val + "');";\r
+\r
+                               if (val != '') {\r
+                                       elm.style.backgroundImage = val;\r
+                                       elm.removeAttribute(attrib);\r
+                               }\r
+                               return;\r
+\r
+                       case "border":\r
+                       case "width":\r
+                       case "height":\r
+                               val = val.replace('px', '');\r
+                               break;\r
+\r
+                       case "align":\r
+                               if (tinyMCE.getAttrib(elm, 'align') == '') {\r
+                                       if (elm.nodeName == "IMG") {\r
+                                               if (tinyMCE.isMSIE && elm.style.styleFloat != '') {\r
+                                                       val = elm.style.styleFloat;\r
+                                                       style = 'styleFloat';\r
+                                               } else if (tinyMCE.isGecko && elm.style.cssFloat != '') {\r
+                                                       val = elm.style.cssFloat;\r
+                                                       style = 'cssFloat';\r
+                                               }\r
+                                       }\r
+                               }\r
+                               break;\r
+               }\r
+\r
+               if (val != '') {\r
+                       elm.removeAttribute(attrib);\r
+                       elm.setAttribute(attrib, val);\r
+                       eval('elm.style.' + style + ' = "";');\r
+               }\r
+       }\r
+};\r
+\r
+TinyMCE.prototype._cleanupAttribute = function(valid_attributes, element_name, attribute_node, element_node) {\r
+       var attribName = attribute_node.nodeName.toLowerCase();\r
+       var attribValue = attribute_node.nodeValue;\r
+       var attribMustBeValue = null;\r
+       var verified = false;\r
+\r
+       // Mozilla attibute, remove them\r
+       if (attribName.indexOf('moz_') != -1)\r
+               return null;\r
+\r
+       if (!tinyMCE.cleanup_on_save && (attribName == "mce_href" || attribName == "mce_src"))\r
+               return {name : attribName, value : attribValue};\r
+\r
+       // Verify attrib\r
+       if (tinyMCE.cleanup_verify_html && !verified) {\r
+               for (var i=1; i<valid_attributes.length; i++) {\r
+                       var attribMatch = valid_attributes[i][0];\r
+                       var re = null;\r
+\r
+                       // Build regexp from wildcard\r
+                       if (attribMatch.match(new RegExp('\\*|\\?|\\+', 'g')) != null) {\r
+                               attribMatch = attribMatch.replace(new RegExp('\\?', 'g'), '(\\S?)');\r
+                               attribMatch = attribMatch.replace(new RegExp('\\+', 'g'), '(\\S+)');\r
+                               attribMatch = attribMatch.replace(new RegExp('\\*', 'g'), '(\\S*)');\r
+                               attribMatch = "^" + attribMatch + "$";\r
+                               re = new RegExp(attribMatch, 'g');\r
+                       }\r
+\r
+                       if ((re && attribName.match(re) != null) || attribName == attribMatch) {\r
+                               verified = true;\r
+                               attribMustBeValue = valid_attributes[i][3];\r
+                               break;\r
+                       }\r
+               }\r
+\r
+               if (!verified)\r
+                       return false;\r
+       } else\r
+               verified = true;\r
+\r
+       // Treat some attribs diffrent\r
+       switch (attribName) {\r
+               case "size":\r
+                       if (tinyMCE.isMSIE5 && element_name == "font")\r
+                               attribValue = element_node.size;\r
+                       break;\r
+\r
+               case "width":\r
+               case "height":\r
+               case "border":\r
+                       // Old MSIE needs this\r
+                       if (tinyMCE.isMSIE5)\r
+                               attribValue = eval("element_node." + attribName);\r
+                       break;\r
+\r
+               case "shape":\r
+                       attribValue = attribValue.toLowerCase();\r
+                       break;\r
+\r
+               case "cellspacing":\r
+                       if (tinyMCE.isMSIE5)\r
+                               attribValue = element_node.cellSpacing;\r
+                       break;\r
+\r
+               case "cellpadding":\r
+                       if (tinyMCE.isMSIE5)\r
+                               attribValue = element_node.cellPadding;\r
+                       break;\r
+\r
+               case "color":\r
+                       if (tinyMCE.isMSIE5 && element_name == "font")\r
+                               attribValue = element_node.color;\r
+                       break;\r
+\r
+               case "class":\r
+                       // Remove mceItem classes from anchors\r
+                       if (tinyMCE.cleanup_on_save && attribValue.indexOf('mceItemAnchor') != -1)\r
+                               attribValue = attribValue.replace(/mceItem[a-z0-9]+/gi, '');\r
+\r
+                       if (element_name == "table" || element_name == "td") {\r
+                               // Handle visual aid\r
+                               if (tinyMCE.cleanup_visual_table_class != "")\r
+                                       attribValue = tinyMCE.getVisualAidClass(attribValue, !tinyMCE.cleanup_on_save);\r
+                       }\r
+\r
+                       if (!tinyMCE._verifyClass(element_node) || attribValue == "")\r
+                               return null;\r
+\r
+                       break;\r
+\r
+               case "onfocus":\r
+               case "onblur":\r
+               case "onclick":\r
+               case "ondblclick":\r
+               case "onmousedown":\r
+               case "onmouseup":\r
+               case "onmouseover":\r
+               case "onmousemove":\r
+               case "onmouseout":\r
+               case "onkeypress":\r
+               case "onkeydown":\r
+               case "onkeydown":\r
+               case "onkeyup":\r
+                       attribValue = tinyMCE.cleanupEventStr("" + attribValue);\r
+\r
+                       if (attribValue.indexOf('return false;') == 0)\r
+                               attribValue = attribValue.substring(14);\r
+\r
+                       break;\r
+\r
+               case "style":\r
+                       attribValue = tinyMCE.serializeStyle(tinyMCE.parseStyle(tinyMCE.getAttrib(element_node, "style")));\r
+                       break;\r
+\r
+               // Convert the URLs of these\r
+               case "href":\r
+               case "src":\r
+               case "longdesc":\r
+                       attribValue = tinyMCE.getAttrib(element_node, attribName);\r
+\r
+                       // Use mce_href instead\r
+                       var href = tinyMCE.getAttrib(element_node, "mce_href");\r
+                       if (attribName == "href" && href != "")\r
+                               attribValue = href;\r
+\r
+                       // Use mce_src instead\r
+                       var src = tinyMCE.getAttrib(element_node, "mce_src");\r
+                       if (attribName == "src" && src != "")\r
+                               attribValue = src;\r
+\r
+                       // Always use absolute URLs within TinyMCE\r
+                       if (!tinyMCE.cleanup_on_save)\r
+                               attribValue = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], attribValue);\r
+                       else if (tinyMCE.getParam('convert_urls'))\r
+                               attribValue = eval(tinyMCE.cleanup_urlconverter_callback + "(attribValue, element_node, tinyMCE.cleanup_on_save);");\r
+\r
+                       break;\r
+\r
+               case "colspan":\r
+               case "rowspan":\r
+                       // Not needed\r
+                       if (attribValue == "1")\r
+                               return null;\r
+                       break;\r
+\r
+               // Skip these\r
+               case "_moz-userdefined":\r
+               case "editorid":\r
+               case "mce_href":\r
+               case "mce_src":\r
+                       return null;\r
+       }\r
+\r
+       // Not the must be value\r
+       if (attribMustBeValue != null) {\r
+               var isCorrect = false;\r
+               for (var i=0; i<attribMustBeValue.length; i++) {\r
+                       if (attribValue == attribMustBeValue[i]) {\r
+                               isCorrect = true;\r
+                               break;\r
+                       }\r
+               }\r
+\r
+               if (!isCorrect)\r
+                       return null;\r
+       }\r
+\r
+       var attrib = new Object();\r
+\r
+       attrib.name = attribName;\r
+       attrib.value = attribValue;\r
+\r
+       return attrib;\r
+};\r
+\r
+TinyMCE.prototype.clearArray = function(ar) {\r
+       // Since stupid people tend to extend core objects like\r
+       // Array with their own crap I needed to make functions that clean away\r
+       // this junk so the arrays get clean and nice as they should be\r
+       for (var key in ar)\r
+               ar[key] = null;\r
+};\r
+\r
+TinyMCE.prototype.isInstance = function(inst) {\r
+       return inst != null && typeof(inst) == "object" && inst.isTinyMCEControl;\r
+};\r
+\r
+TinyMCE.prototype.parseStyle = function(str) {\r
+       var ar = new Array();\r
+\r
+       if (str == null)\r
+               return ar;\r
+\r
+       var st = str.split(';');\r
+\r
+       tinyMCE.clearArray(ar);\r
+\r
+       for (var i=0; i<st.length; i++) {\r
+               if (st[i] == '')\r
+                       continue;\r
+\r
+               var re = new RegExp('^\\s*([^:]*):\\s*(.*)\\s*$');\r
+               var pa = st[i].replace(re, '$1||$2').split('||');\r
+//tinyMCE.debug(str, pa[0] + "=" + pa[1], st[i].replace(re, '$1||$2'));\r
+               if (pa.length == 2)\r
+                       ar[pa[0].toLowerCase()] = pa[1];\r
+       }\r
+\r
+       return ar;\r
+};\r
+\r
+TinyMCE.prototype.compressStyle = function(ar, pr, sf, res) {\r
+       var box = new Array();\r
+\r
+       box[0] = ar[pr + '-top' + sf];\r
+       box[1] = ar[pr + '-left' + sf];\r
+       box[2] = ar[pr + '-right' + sf];\r
+       box[3] = ar[pr + '-bottom' + sf];\r
+\r
+       for (var i=0; i<box.length; i++) {\r
+               if (box[i] == null)\r
+                       return;\r
+\r
+               for (var a=0; a<box.length; a++) {\r
+                       if (box[a] != box[i])\r
+                               return;\r
+               }\r
+       }\r
+\r
+       // They are all the same\r
+       ar[res] = box[0];\r
+       ar[pr + '-top' + sf] = null;\r
+       ar[pr + '-left' + sf] = null;\r
+       ar[pr + '-right' + sf] = null;\r
+       ar[pr + '-bottom' + sf] = null;\r
+};\r
+\r
+TinyMCE.prototype.serializeStyle = function(ar) {\r
+       var str = "";\r
+\r
+       // Compress box\r
+       tinyMCE.compressStyle(ar, "border", "", "border");\r
+       tinyMCE.compressStyle(ar, "border", "-width", "border-width");\r
+       tinyMCE.compressStyle(ar, "border", "-color", "border-color");\r
+\r
+       for (var key in ar) {\r
+               var val = ar[key];\r
+               if (typeof(val) == 'function')\r
+                       continue;\r
+\r
+               if (val != null && val != '') {\r
+                       val = '' + val; // Force string\r
+\r
+                       // Fix style URL\r
+                       val = val.replace(new RegExp("url\\(\\'?([^\\']*)\\'?\\)", 'gi'), "url('$1')");\r
+\r
+                       // Convert URL\r
+                       if (val.indexOf('url(') != -1 && tinyMCE.getParam('convert_urls')) {\r
+                               var m = new RegExp("url\\('(.*?)'\\)").exec(val);\r
+\r
+                               if (m.length > 1)\r
+                                       val = "url('" + eval(tinyMCE.getParam('urlconverter_callback') + "(m[1], null, true);") + "')";\r
+                       }\r
+\r
+                       // Force HEX colors\r
+                       if (tinyMCE.getParam("force_hex_style_colors"))\r
+                               val = tinyMCE.convertRGBToHex(val, true);\r
+\r
+                       if (val != "url('')")\r
+                               str += key.toLowerCase() + ": " + val + "; ";\r
+               }\r
+       }\r
+\r
+       if (new RegExp('; $').test(str))\r
+               str = str.substring(0, str.length - 2);\r
+\r
+       return str;\r
+};\r
+\r
+TinyMCE.prototype.convertRGBToHex = function(s, k) {\r
+       if (s.toLowerCase().indexOf('rgb') != -1) {\r
+               var re = new RegExp("(.*?)rgb\\s*?\\(\\s*?([0-9]+).*?,\\s*?([0-9]+).*?,\\s*?([0-9]+).*?\\)(.*?)", "gi");\r
+               var rgb = s.replace(re, "$1,$2,$3,$4,$5").split(',');\r
+               if (rgb.length == 5) {\r
+                       r = parseInt(rgb[1]).toString(16);\r
+                       g = parseInt(rgb[2]).toString(16);\r
+                       b = parseInt(rgb[3]).toString(16);\r
+\r
+                       r = r.length == 1 ? '0' + r : r;\r
+                       g = g.length == 1 ? '0' + g : g;\r
+                       b = b.length == 1 ? '0' + b : b;\r
+\r
+                       s = "#" + r + g + b;\r
+\r
+                       if (k)\r
+                               s = rgb[0] + s + rgb[4];\r
+               }\r
+       }\r
+\r
+       return s;\r
+};\r
+\r
+TinyMCE.prototype.convertHexToRGB = function(s) {\r
+       if (s.indexOf('#') != -1) {\r
+               s = s.replace(new RegExp('[^0-9A-F]', 'gi'), '');\r
+               return "rgb(" + parseInt(s.substring(0, 2), 16) + "," + parseInt(s.substring(2, 4), 16) + "," + parseInt(s.substring(4, 6), 16) + ")";\r
+       }\r
+\r
+       return s;\r
+};\r
+\r
+TinyMCE.prototype._verifyClass = function(node) {\r
+       // Sometimes the class gets set to null, weird Gecko bug?\r
+       if (tinyMCE.isGecko) {\r
+               var className = node.getAttribute('class');\r
+               if (!className)\r
+                       return false;\r
+       }\r
+\r
+       // Trim CSS class\r
+       if (tinyMCE.isMSIE)\r
+               var className = node.getAttribute('className');\r
+\r
+       if (tinyMCE.cleanup_verify_css_classes && tinyMCE.cleanup_on_save) {\r
+               var csses = tinyMCE.getCSSClasses();\r
+               nonDefinedCSS = true;\r
+               for (var c=0; c<csses.length; c++) {\r
+                       if (csses[c] == className) {\r
+                               nonDefinedCSS = false;\r
+                               break;\r
+                       }\r
+               }\r
+\r
+               if (nonDefinedCSS && className.indexOf('mce_') != 0) {\r
+                       node.removeAttribute('className');\r
+                       node.removeAttribute('class');\r
+                       return false;\r
+               }\r
+       }\r
+\r
+       return true;\r
+};\r
+\r
+TinyMCE.prototype.cleanupNode = function(node) {\r
+       var output = "";\r
+\r
+       switch (node.nodeType) {\r
+               case 1: // Element\r
+                       var elementData = tinyMCE._cleanupElementName(node.nodeName, node);\r
+                       var elementName = elementData ? elementData.element_name : null;\r
+                       var elementValidAttribs = elementData ? elementData.valid_attribs : null;\r
+                       var elementAttribs = "";\r
+                       var openTag = false, nonEmptyTag = false;\r
+\r
+                       if (elementName != null && elementName.charAt(0) == '+') {\r
+                               elementName = elementName.substring(1);\r
+                               openTag = true;\r
+                       }\r
+\r
+                       if (elementName != null && elementName.charAt(0) == '-') {\r
+                               elementName = elementName.substring(1);\r
+                               nonEmptyTag = true;\r
+                       }\r
+\r
+                       // Checking DOM tree for MSIE weirdness!!\r
+                       if (tinyMCE.isMSIE && tinyMCE.settings['fix_content_duplication']) {\r
+                               var lookup = tinyMCE.cleanup_elementLookupTable;\r
+\r
+                               for (var i=0; i<lookup.length; i++) {\r
+                                       // Found element reference else were, hmm?\r
+                                       if (lookup[i] == node)\r
+                                               return output;\r
+                               }\r
+\r
+                               // Add element to lookup table\r
+                               lookup[lookup.length] = node;\r
+                       }\r
+\r
+                       // Element not valid (only render children)\r
+                       if (!elementName) {\r
+                               if (node.hasChildNodes()) {\r
+                                       for (var i=0; i<node.childNodes.length; i++)\r
+                                               output += this.cleanupNode(node.childNodes[i]);\r
+                               }\r
+\r
+                               return output;\r
+                       }\r
+\r
+                       if (tinyMCE.cleanup_on_save) {\r
+                               if (node.nodeName == "A" && node.className == "mceItemAnchor") {\r
+                                       if (node.hasChildNodes()) {\r
+                                               for (var i=0; i<node.childNodes.length; i++)\r
+                                                       output += this.cleanupNode(node.childNodes[i]);\r
+                                       }\r
+\r
+                                       return '<a name="' + this.convertStringToXML(node.getAttribute("name")) + '"></a>' + output;\r
+                               }\r
+                       }\r
+\r
+                       // Remove deprecated attributes\r
+                       var re = new RegExp("^(TABLE|TD|TR)$");\r
+                       if (re.test(node.nodeName)) {\r
+                               // Move attrib to style\r
+                               if ((node.nodeName != "TABLE" || tinyMCE.cleanup_inline_styles) && (width = tinyMCE.getAttrib(node, "width")) != '') {\r
+                                       node.style.width = width.indexOf('%') != -1 ? width : width.replace(/[^0-9]/gi, '') + "px";\r
+                                       node.removeAttribute("width");\r
+                               }\r
+\r
+                               // Is table and not inline\r
+                               if ((node.nodeName == "TABLE" && !tinyMCE.cleanup_inline_styles) && node.style.width != '') {\r
+                                       tinyMCE.setAttrib(node, "width", node.style.width.replace('px',''));\r
+                                       node.style.width = '';\r
+                               }\r
+\r
+                               // Move attrib to style\r
+                               if ((height = tinyMCE.getAttrib(node, "height")) != '') {\r
+                                       height = "" + height; // Force string\r
+                                       node.style.height = height.indexOf('%') != -1 ? height : height.replace(/[^0-9]/gi, '') + "px";\r
+                                       node.removeAttribute("height");\r
+                               }\r
+                       }\r
+\r
+                       // Handle inline/outline styles\r
+                       if (tinyMCE.cleanup_inline_styles) {\r
+                               var re = new RegExp("^(TABLE|TD|TR|IMG|HR)$");\r
+                               if (re.test(node.nodeName) && tinyMCE.getAttrib(node, "class").indexOf('mceItem') == -1) {\r
+                                       tinyMCE._moveStyle(node, 'width', 'width');\r
+                                       tinyMCE._moveStyle(node, 'height', 'height');\r
+                                       tinyMCE._moveStyle(node, 'borderWidth', 'border');\r
+                                       tinyMCE._moveStyle(node, '', 'vspace');\r
+                                       tinyMCE._moveStyle(node, '', 'hspace');\r
+                                       tinyMCE._moveStyle(node, 'textAlign', 'align');\r
+                                       tinyMCE._moveStyle(node, 'backgroundColor', 'bgColor');\r
+                                       tinyMCE._moveStyle(node, 'borderColor', 'borderColor');\r
+                                       tinyMCE._moveStyle(node, 'backgroundImage', 'background');\r
+\r
+                                       // Refresh element in old MSIE\r
+                                       if (tinyMCE.isMSIE5)\r
+                                               node.outerHTML = node.outerHTML;\r
+                               } else if (tinyMCE.isBlockElement(node))\r
+                                       tinyMCE._moveStyle(node, 'textAlign', 'align');\r
+\r
+                               if (node.nodeName == "FONT")\r
+                                       tinyMCE._moveStyle(node, 'color', 'color');\r
+                       }\r
+\r
+                       // Set attrib data\r
+                       if (elementValidAttribs) {\r
+                               for (var a=1; a<elementValidAttribs.length; a++) {\r
+                                       var attribName, attribDefaultValue, attribForceValue, attribValue;\r
+\r
+                                       attribName = elementValidAttribs[a][0];\r
+                                       attribDefaultValue = elementValidAttribs[a][1];\r
+                                       attribForceValue = elementValidAttribs[a][2];\r
+\r
+                                       if (attribDefaultValue != null || attribForceValue != null) {\r
+                                               var attribValue = node.getAttribute(attribName);\r
+\r
+                                               if (node.getAttribute(attribName) == null || node.getAttribute(attribName) == "")\r
+                                                       attribValue = attribDefaultValue;\r
+\r
+                                               attribValue = attribForceValue ? attribForceValue : attribValue;\r
+\r
+                                               // Is to generate id\r
+                                               if (attribValue == "{$uid}")\r
+                                                       attribValue = "uid_" + (tinyMCE.cleanup_idCount++);\r
+\r
+                                               // Add visual aid class\r
+                                               if (attribName == "class")\r
+                                                       attribValue = tinyMCE.getVisualAidClass(attribValue, tinyMCE.cleanup_on_save);\r
+\r
+                                               node.setAttribute(attribName, attribValue);\r
+                                               //alert(attribName + "=" + attribValue);\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       if ((tinyMCE.isMSIE && !tinyMCE.isOpera) && elementName == "style")\r
+                               return "<style>" + node.innerHTML + "</style>";\r
+\r
+                       // Remove empty tables\r
+                       if (elementName == "table" && !node.hasChildNodes())\r
+                               return "";\r
+\r
+                       // Handle element attributes\r
+                       if (node.attributes.length > 0) {\r
+                               var lastAttrib = "";\r
+\r
+                               for (var i=0; i<node.attributes.length; i++) {\r
+                                       if (node.attributes[i].specified) {\r
+                                               // Is the attrib already processed (removed duplicate attributes in opera TD[align=left])\r
+                                               if (tinyMCE.isOpera) {\r
+                                                       if (node.attributes[i].nodeName == lastAttrib)\r
+                                                               continue;\r
+\r
+                                                       lastAttrib = node.attributes[i].nodeName;\r
+                                               }\r
+\r
+                                               // tinyMCE.debug(node.nodeName, node.attributes[i].nodeName, node.attributes[i].nodeValue, node.innerHTML);\r
+                                               var attrib = tinyMCE._cleanupAttribute(elementValidAttribs, elementName, node.attributes[i], node);\r
+                                               if (attrib && attrib.value != "")\r
+                                                       elementAttribs += " " + attrib.name + "=" + '"' + this.convertStringToXML("" + attrib.value) + '"';\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       // MSIE table summary fix (MSIE 5.5)\r
+                       if (tinyMCE.isMSIE && elementName == "table" && node.getAttribute("summary") != null && elementAttribs.indexOf('summary') == -1) {\r
+                               var summary = tinyMCE.getAttrib(node, 'summary');\r
+                               if (summary != '')\r
+                                       elementAttribs += " summary=" + '"' + this.convertStringToXML(summary) + '"';\r
+                       }\r
+\r
+                       // Handle missing attributes in MSIE 5.5\r
+                       if (tinyMCE.isMSIE5 && /^(td|img|a)$/.test(elementName)) {\r
+                               var ma = new Array("scope", "longdesc", "hreflang", "charset", "type");\r
+\r
+                               for (var u=0; u<ma.length; u++) {\r
+                                       if (node.getAttribute(ma[u]) != null) {\r
+                                               var s = tinyMCE.getAttrib(node, ma[u]);\r
+\r
+                                               if (s != '')\r
+                                                       elementAttribs += " " + ma[u] + "=" + '"' + this.convertStringToXML(s) + '"';\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       // MSIE form element issue\r
+                       if (tinyMCE.isMSIE && elementName == "input") {\r
+                               if (node.type) {\r
+                                       if (!elementAttribs.match(/ type=/g))\r
+                                               elementAttribs += " type=" + '"' + node.type + '"';\r
+                               }\r
+\r
+                               if (node.value) {\r
+                                       if (!elementAttribs.match(/ value=/g))\r
+                                               elementAttribs += " value=" + '"' + node.value + '"';\r
+                               }\r
+                       }\r
+\r
+                       // Add nbsp to some elements\r
+                       if ((elementName == "p" || elementName == "td") && (node.innerHTML == "" || node.innerHTML == "&nbsp;"))\r
+                               return "<" + elementName + elementAttribs + ">" + this.convertStringToXML(String.fromCharCode(160)) + "</" + elementName + ">";\r
+\r
+                       // Is MSIE script element\r
+                       if (tinyMCE.isMSIE && elementName == "script")\r
+                               return "<" + elementName + elementAttribs + ">" + node.text + "</" + elementName + ">";\r
+\r
+                       // Clean up children\r
+                       if (node.hasChildNodes()) {\r
+                               // If not empty span\r
+                               if (!(elementName == "span" && elementAttribs == "" && tinyMCE.getParam("trim_span_elements"))) {\r
+                                       // Force BR\r
+                                       if (elementName == "p" && tinyMCE.cleanup_force_br_newlines)\r
+                                               output += "<div" + elementAttribs + ">";\r
+                                       else\r
+                                               output += "<" + elementName + elementAttribs + ">";\r
+                               }\r
+\r
+                               for (var i=0; i<node.childNodes.length; i++)\r
+                                       output += this.cleanupNode(node.childNodes[i]);\r
+\r
+                               // If not empty span\r
+                               if (!(elementName == "span" && elementAttribs == "" && tinyMCE.getParam("trim_span_elements"))) {\r
+                                       // Force BR\r
+                                       if (elementName == "p" && tinyMCE.cleanup_force_br_newlines)\r
+                                               output += "</div><br />";\r
+                                       else\r
+                                               output += "</" + elementName + ">";\r
+                               }\r
+                       } else {\r
+                               if (!nonEmptyTag) {\r
+                                       if (openTag)\r
+                                               output += "<" + elementName + elementAttribs + "></" + elementName + ">";\r
+                                       else\r
+                                               output += "<" + elementName + elementAttribs + " />";\r
+                               }\r
+                       }\r
+\r
+                       return output;\r
+\r
+               case 3: // Text\r
+                       // Do not convert script elements\r
+                       if (node.parentNode.nodeName == "SCRIPT" || node.parentNode.nodeName == "NOSCRIPT" || node.parentNode.nodeName == "STYLE")\r
+                               return node.nodeValue;\r
+\r
+                       return this.convertStringToXML(node.nodeValue);\r
+\r
+               case 8: // Comment\r
+                       return "<!--" + node.nodeValue + "-->";\r
+\r
+               default: // Unknown\r
+                       return "[UNKNOWN NODETYPE " + node.nodeType + "]";\r
+       }\r
+};\r
+\r
+TinyMCE.prototype.convertStringToXML = function(html_data) {\r
+    var output = "";\r
+\r
+       for (var i=0; i<html_data.length; i++) {\r
+               var chr = html_data.charCodeAt(i);\r
+\r
+               // Numeric entities\r
+               if (tinyMCE.settings['entity_encoding'] == "numeric") {\r
+                       if (chr > 127)\r
+                               output += '&#' + chr + ";";\r
+                       else\r
+                               output += String.fromCharCode(chr);\r
+\r
+                       continue;\r
+               }\r
+\r
+               // Raw entities\r
+               if (tinyMCE.settings['entity_encoding'] == "raw") {\r
+                       output += String.fromCharCode(chr);\r
+                       continue;\r
+               }\r
+\r
+               // Named entities\r
+               if (typeof(tinyMCE.settings['cleanup_entities']["c" + chr]) != 'undefined' && tinyMCE.settings['cleanup_entities']["c" + chr] != '')\r
+                       output += '&' + tinyMCE.settings['cleanup_entities']["c" + chr] + ';';\r
+               else\r
+                       output += '' + String.fromCharCode(chr);\r
+    }\r
+\r
+    return output;\r
+};\r
+\r
+TinyMCE.prototype._getCleanupElementName = function(chunk) {\r
+       var pos;\r
+\r
+       if (chunk.charAt(0) == '+')\r
+               chunk = chunk.substring(1);\r
+\r
+       if (chunk.charAt(0) == '-')\r
+               chunk = chunk.substring(1);\r
+\r
+       if ((pos = chunk.indexOf('/')) != -1)\r
+               chunk = chunk.substring(0, pos);\r
+\r
+       if ((pos = chunk.indexOf('[')) != -1)\r
+               chunk = chunk.substring(0, pos);\r
+\r
+       return chunk;\r
+};\r
+\r
+TinyMCE.prototype._initCleanup = function() {\r
+       // Parse valid elements and attributes\r
+       var validElements = tinyMCE.settings["valid_elements"];\r
+       validElements = validElements.split(',');\r
+\r
+       // Handle extended valid elements\r
+       var extendedValidElements = tinyMCE.settings["extended_valid_elements"];\r
+       extendedValidElements = extendedValidElements.split(',');\r
+       for (var i=0; i<extendedValidElements.length; i++) {\r
+               var elementName = this._getCleanupElementName(extendedValidElements[i]);\r
+               var skipAdd = false;\r
+\r
+               // Check if it's defined before, if so override that one\r
+               for (var x=0; x<validElements.length; x++) {\r
+                       if (this._getCleanupElementName(validElements[x]) == elementName) {\r
+                               validElements[x] = extendedValidElements[i];\r
+                               skipAdd = true;\r
+                               break;\r
+                       }\r
+               }\r
+\r
+               if (!skipAdd)\r
+                       validElements[validElements.length] = extendedValidElements[i];\r
+       }\r
+\r
+       for (var i=0; i<validElements.length; i++) {\r
+               var item = validElements[i];\r
+\r
+               item = item.replace('[','|');\r
+               item = item.replace(']','');\r
+\r
+               // Split and convert\r
+               var attribs = item.split('|');\r
+               for (var x=0; x<attribs.length; x++)\r
+                       attribs[x] = attribs[x].toLowerCase();\r
+\r
+               // Handle change elements\r
+               attribs[0] = attribs[0].split('/');\r
+\r
+               // Handle default attribute values\r
+               for (var x=1; x<attribs.length; x++) {\r
+                       var attribName = attribs[x];\r
+                       var attribDefault = null;\r
+                       var attribForce = null;\r
+                       var attribMustBe = null;\r
+\r
+                       // Default value\r
+                       if ((pos = attribName.indexOf('=')) != -1) {\r
+                               attribDefault = attribName.substring(pos+1);\r
+                               attribName = attribName.substring(0, pos);\r
+                       }\r
+\r
+                       // Force check\r
+                       if ((pos = attribName.indexOf(':')) != -1) {\r
+                               attribForce = attribName.substring(pos+1);\r
+                               attribName = attribName.substring(0, pos);\r
+                       }\r
+\r
+                       // Force check\r
+                       if ((pos = attribName.indexOf('<')) != -1) {\r
+                               attribMustBe = attribName.substring(pos+1).split('?');\r
+                               attribName = attribName.substring(0, pos);\r
+                       }\r
+\r
+                       attribs[x] = new Array(attribName, attribDefault, attribForce, attribMustBe);\r
+               }\r
+\r
+               validElements[i] = attribs;\r
+       }\r
+\r
+       var invalidElements = tinyMCE.settings['invalid_elements'].split(',');\r
+       for (var i=0; i<invalidElements.length; i++)\r
+               invalidElements[i] = invalidElements[i].toLowerCase();\r
+\r
+       // Set these for performance\r
+       tinyMCE.settings['cleanup_validElements'] = validElements;\r
+       tinyMCE.settings['cleanup_invalidElements'] = invalidElements;\r
+};\r
+\r
+TinyMCE.prototype._cleanupHTML = function(inst, doc, config, element, visual, on_save) {\r
+       if (!tinyMCE.settings['cleanup']) {\r
+               tinyMCE.handleVisualAid(inst.getBody(), true, false, inst);\r
+\r
+               var html = element.innerHTML;\r
+\r
+               // Remove mce_href/mce_src\r
+               html = html.replace(new RegExp('(mce_href|mce_src)=".*?"', 'gi'), '');\r
+               html = html.replace(/\s+>/gi, '>');\r
+\r
+               return html;\r
+       }\r
+\r
+       if (on_save && tinyMCE.getParam("convert_fonts_to_spans"))\r
+               tinyMCE.convertFontsToSpans(doc);\r
+\r
+       // Call custom cleanup code\r
+       tinyMCE._customCleanup(inst, on_save ? "get_from_editor_dom" : "insert_to_editor_dom", doc.body);\r
+\r
+       // Move bgcolor to style\r
+       var n = doc.getElementsByTagName("font");\r
+       for (var i=0; i<n.length; i++) {\r
+               var c = "";\r
+               if ((c = tinyMCE.getAttrib(n[i], "bgcolor")) != "") {\r
+                       n[i].style.backgroundColor = c;\r
+                       tinyMCE.setAttrib(n[i], "bgcolor", "");\r
+               }\r
+       }\r
+\r
+       // Set these for performance\r
+       tinyMCE.cleanup_validElements = tinyMCE.settings['cleanup_validElements'];\r
+       tinyMCE.cleanup_invalidElements = tinyMCE.settings['cleanup_invalidElements'];\r
+       tinyMCE.cleanup_verify_html = tinyMCE.settings['verify_html'];\r
+       tinyMCE.cleanup_force_br_newlines = tinyMCE.settings['force_br_newlines'];\r
+       tinyMCE.cleanup_urlconverter_callback = tinyMCE.settings['urlconverter_callback'];\r
+       tinyMCE.cleanup_verify_css_classes = tinyMCE.settings['verify_css_classes'];\r
+       tinyMCE.cleanup_visual_table_class = tinyMCE.settings['visual_table_class'];\r
+       tinyMCE.cleanup_apply_source_formatting = tinyMCE.settings['apply_source_formatting'];\r
+       tinyMCE.cleanup_inline_styles = tinyMCE.settings['inline_styles'];\r
+       tinyMCE.cleanup_visual_aid = visual;\r
+       tinyMCE.cleanup_on_save = on_save;\r
+       tinyMCE.cleanup_idCount = 0;\r
+       tinyMCE.cleanup_elementLookupTable = new Array();\r
+\r
+       var startTime = new Date().getTime();\r
+\r
+       // Cleanup madness that breaks the editor in MSIE\r
+       if (tinyMCE.isMSIE) {\r
+               // Remove null ids from HR elements, results in runtime error\r
+               var nodes = element.getElementsByTagName("hr");\r
+               for (var i=0; i<nodes.length; i++) {\r
+                       if (nodes[i].id == "null")\r
+                               nodes[i].removeAttribute("id");\r
+               }\r
+\r
+               tinyMCE.setInnerHTML(element, tinyMCE.regexpReplace(element.innerHTML, '<p>[ \n\r]*<hr.*>[ \n\r]*</p>', '<hr />', 'gi'));\r
+               tinyMCE.setInnerHTML(element, tinyMCE.regexpReplace(element.innerHTML, '<!([^-(DOCTYPE)]* )|<!/[^-]*>', '', 'gi'));\r
+       }\r
+\r
+       var html = this.cleanupNode(element);\r
+\r
+       if (tinyMCE.settings['debug'])\r
+               tinyMCE.debug("Cleanup process executed in: " + (new Date().getTime()-startTime) + " ms.");\r
+\r
+       // Remove pesky HR paragraphs and other crap\r
+       html = tinyMCE.regexpReplace(html, '<p><hr /></p>', '<hr />');\r
+       html = tinyMCE.regexpReplace(html, '<p>&nbsp;</p><hr /><p>&nbsp;</p>', '<hr />');\r
+       html = tinyMCE.regexpReplace(html, '<td>\\s*<br />\\s*</td>', '<td>&nbsp;</td>');\r
+       html = tinyMCE.regexpReplace(html, '<p>\\s*<br />\\s*</p>', '<p>&nbsp;</p>');\r
+       html = tinyMCE.regexpReplace(html, '<p>\\s*&nbsp;\\s*<br />\\s*&nbsp;\\s*</p>', '<p>&nbsp;</p>');\r
+       html = tinyMCE.regexpReplace(html, '<p>\\s*&nbsp;\\s*<br />\\s*</p>', '<p>&nbsp;</p>');\r
+       html = tinyMCE.regexpReplace(html, '<p>\\s*<br />\\s*&nbsp;\\s*</p>', '<p>&nbsp;</p>');\r
+\r
+       // Remove empty anchors\r
+       html = html.replace(new RegExp('<a>(.*?)</a>', 'gi'), '$1');\r
+\r
+       // Remove some mozilla crap\r
+       if (!tinyMCE.isMSIE)\r
+               html = html.replace(new RegExp('<o:p _moz-userdefined="" />', 'g'), "");\r
+\r
+       if (tinyMCE.settings['remove_linebreaks'])\r
+               html = html.replace(new RegExp('\r|\n', 'g'), ' ');\r
+\r
+       if (tinyMCE.getParam('apply_source_formatting')) {\r
+               html = html.replace(new RegExp('<(p|div)([^>]*)>', 'g'), "\n<$1$2>\n");\r
+               html = html.replace(new RegExp('<\/(p|div)([^>]*)>', 'g'), "\n</$1$2>\n");\r
+               html = html.replace(new RegExp('<br />', 'g'), "<br />\n");\r
+       }\r
+\r
+       if (tinyMCE.settings['force_br_newlines']) {\r
+               var re = new RegExp('<p>&nbsp;</p>', 'g');\r
+               html = html.replace(re, "<br />");\r
+       }\r
+\r
+       if (tinyMCE.isGecko && tinyMCE.settings['remove_lt_gt']) {\r
+               // Remove weridness!\r
+               var re = new RegExp('&lt;&gt;', 'g');\r
+               html = html.replace(re, "");\r
+       }\r
+\r
+       // Call custom cleanup code\r
+       html = tinyMCE._customCleanup(inst, on_save ? "get_from_editor" : "insert_to_editor", html);\r
+\r
+       // Emtpy node, return empty\r
+       var chk = tinyMCE.regexpReplace(html, "[ \t\r\n]", "").toLowerCase();\r
+       if (chk == "<br/>" || chk == "<br>" || chk == "<p>&nbsp;</p>" || chk == "<p>&#160;</p>" || chk == "<p></p>")\r
+               html = "";\r
+\r
+       if (tinyMCE.settings["preformatted"])\r
+               return "<pre>" + html + "</pre>";\r
+\r
+       return html;\r
+};\r
+\r
+TinyMCE.prototype.insertLink = function(href, target, title, onclick, style_class) {\r
+       tinyMCE.execCommand('mceBeginUndoLevel');\r
+\r
+       if (this.selectedInstance && this.selectedElement && this.selectedElement.nodeName.toLowerCase() == "img") {\r
+               var doc = this.selectedInstance.getDoc();\r
+               var linkElement = tinyMCE.getParentElement(this.selectedElement, "a");\r
+               var newLink = false;\r
+\r
+               if (!linkElement) {\r
+                       linkElement = doc.createElement("a");\r
+                       newLink = true;\r
+               }\r
+\r
+               var mhref = href;\r
+               var thref = eval(tinyMCE.settings['urlconverter_callback'] + "(href, linkElement);");\r
+               mhref = tinyMCE.getParam('convert_urls') ? href : mhref;\r
+\r
+               tinyMCE.setAttrib(linkElement, 'href', thref);\r
+               tinyMCE.setAttrib(linkElement, 'mce_href', mhref);\r
+               tinyMCE.setAttrib(linkElement, 'target', target);\r
+               tinyMCE.setAttrib(linkElement, 'title', title);\r
+        tinyMCE.setAttrib(linkElement, 'onclick', onclick);\r
+               tinyMCE.setAttrib(linkElement, 'class', style_class);\r
+\r
+               if (newLink) {\r
+                       linkElement.appendChild(this.selectedElement.cloneNode(true));\r
+                       this.selectedElement.parentNode.replaceChild(linkElement, this.selectedElement);\r
+               }\r
+\r
+               return;\r
+       }\r
+\r
+       if (!this.linkElement && this.selectedInstance) {\r
+               if (tinyMCE.isSafari) {\r
+                       tinyMCE.execCommand("mceInsertContent", false, '<a href="' + tinyMCE.uniqueURL + '">' + this.selectedInstance.getSelectedHTML() + '</a>');\r
+               } else\r
+                       this.selectedInstance.contentDocument.execCommand("createlink", false, tinyMCE.uniqueURL);\r
+\r
+               tinyMCE.linkElement = this.getElementByAttributeValue(this.selectedInstance.contentDocument.body, "a", "href", tinyMCE.uniqueURL);\r
+\r
+               var elementArray = this.getElementsByAttributeValue(this.selectedInstance.contentDocument.body, "a", "href", tinyMCE.uniqueURL);\r
+\r
+               for (var i=0; i<elementArray.length; i++) {\r
+                       var mhref = href;\r
+                       var thref = eval(tinyMCE.settings['urlconverter_callback'] + "(href, elementArray[i]);");\r
+                       mhref = tinyMCE.getParam('convert_urls') ? href : mhref;\r
+\r
+                       tinyMCE.setAttrib(elementArray[i], 'href', thref);\r
+                       tinyMCE.setAttrib(elementArray[i], 'mce_href', mhref);\r
+                       tinyMCE.setAttrib(elementArray[i], 'target', target);\r
+                       tinyMCE.setAttrib(elementArray[i], 'title', title);\r
+            tinyMCE.setAttrib(elementArray[i], 'onclick', onclick);\r
+                       tinyMCE.setAttrib(elementArray[i], 'class', style_class);\r
+               }\r
+\r
+               tinyMCE.linkElement = elementArray[0];\r
+       }\r
+\r
+       if (this.linkElement) {\r
+               var mhref = href;\r
+               href = eval(tinyMCE.settings['urlconverter_callback'] + "(href, this.linkElement);");\r
+               mhref = tinyMCE.getParam('convert_urls') ? href : mhref;\r
+\r
+               tinyMCE.setAttrib(this.linkElement, 'href', href);\r
+               tinyMCE.setAttrib(this.linkElement, 'mce_href', mhref);\r
+               tinyMCE.setAttrib(this.linkElement, 'target', target);\r
+               tinyMCE.setAttrib(this.linkElement, 'title', title);\r
+        tinyMCE.setAttrib(this.linkElement, 'onclick', onclick);\r
+               tinyMCE.setAttrib(this.linkElement, 'class', style_class);\r
+       }\r
+\r
+       tinyMCE.execCommand('mceEndUndoLevel');\r
+};\r
+\r
+TinyMCE.prototype.insertImage = function(src, alt, border, hspace, vspace, width, height, align, title, onmouseover, onmouseout) {\r
+       tinyMCE.execCommand('mceBeginUndoLevel');\r
+\r
+       if (src == "")\r
+               return;\r
+\r
+       if (!this.imgElement && tinyMCE.isSafari) {\r
+               var html = "";\r
+\r
+               html += '<img src="' + src + '" alt="' + alt + '"';\r
+               html += ' border="' + border + '" hspace="' + hspace + '"';\r
+               html += ' vspace="' + vspace + '" width="' + width + '"';\r
+               html += ' height="' + height + '" align="' + align + '" title="' + title + '" onmouseover="' + onmouseover + '" onmouseout="' + onmouseout + '" />';\r
+\r
+               tinyMCE.execCommand("mceInsertContent", false, html);\r
+       } else {\r
+               if (!this.imgElement && this.selectedInstance) {\r
+                       if (tinyMCE.isSafari)\r
+                               tinyMCE.execCommand("mceInsertContent", false, '<img src="' + tinyMCE.uniqueURL + '" />');\r
+                       else\r
+                               this.selectedInstance.contentDocument.execCommand("insertimage", false, tinyMCE.uniqueURL);\r
+\r
+                       tinyMCE.imgElement = this.getElementByAttributeValue(this.selectedInstance.contentDocument.body, "img", "src", tinyMCE.uniqueURL);\r
+               }\r
+       }\r
+\r
+       if (this.imgElement) {\r
+               var needsRepaint = false;\r
+               var msrc = src;\r
+\r
+               src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, tinyMCE.imgElement);");\r
+\r
+               if (tinyMCE.getParam('convert_urls'))\r
+                       msrc = src;\r
+\r
+               if (onmouseover && onmouseover != "")\r
+                       onmouseover = "this.src='" + eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseover, tinyMCE.imgElement);") + "';";\r
+\r
+               if (onmouseout && onmouseout != "")\r
+                       onmouseout = "this.src='" + eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseout, tinyMCE.imgElement);") + "';";\r
+\r
+               // Use alt as title if it's undefined\r
+               if (typeof(title) == "undefined")\r
+                       title = alt;\r
+\r
+               if (width != this.imgElement.getAttribute("width") || height != this.imgElement.getAttribute("height") || align != this.imgElement.getAttribute("align"))\r
+                       needsRepaint = true;\r
+\r
+               tinyMCE.setAttrib(this.imgElement, 'src', src);\r
+               tinyMCE.setAttrib(this.imgElement, 'mce_src', msrc);\r
+               tinyMCE.setAttrib(this.imgElement, 'alt', alt);\r
+               tinyMCE.setAttrib(this.imgElement, 'title', title);\r
+               tinyMCE.setAttrib(this.imgElement, 'align', align);\r
+               tinyMCE.setAttrib(this.imgElement, 'border', border, true);\r
+               tinyMCE.setAttrib(this.imgElement, 'hspace', hspace, true);\r
+               tinyMCE.setAttrib(this.imgElement, 'vspace', vspace, true);\r
+               tinyMCE.setAttrib(this.imgElement, 'width', width, true);\r
+               tinyMCE.setAttrib(this.imgElement, 'height', height, true);\r
+               tinyMCE.setAttrib(this.imgElement, 'onmouseover', onmouseover);\r
+               tinyMCE.setAttrib(this.imgElement, 'onmouseout', onmouseout);\r
+\r
+               // Fix for bug #989846 - Image resize bug\r
+               if (width && width != "")\r
+                       this.imgElement.style.pixelWidth = width;\r
+\r
+               if (height && height != "")\r
+                       this.imgElement.style.pixelHeight = height;\r
+\r
+               if (needsRepaint)\r
+                       tinyMCE.selectedInstance.repaint();\r
+       }\r
+\r
+       tinyMCE.execCommand('mceEndUndoLevel');\r
+};\r
+\r
+TinyMCE.prototype.getElementByAttributeValue = function(node, element_name, attrib, value) {\r
+       var elements = this.getElementsByAttributeValue(node, element_name, attrib, value);\r
+       if (elements.length == 0)\r
+               return null;\r
+\r
+       return elements[0];\r
+};\r
+\r
+TinyMCE.prototype.getElementsByAttributeValue = function(node, element_name, attrib, value) {\r
+       var elements = new Array();\r
+\r
+       if (node && node.nodeName.toLowerCase() == element_name) {\r
+               if (node.getAttribute(attrib) && node.getAttribute(attrib).indexOf(value) != -1)\r
+                       elements[elements.length] = node;\r
+       }\r
+\r
+       if (node && node.hasChildNodes()) {\r
+               for (var x=0, n=node.childNodes.length; x<n; x++) {\r
+                       var childElements = this.getElementsByAttributeValue(node.childNodes[x], element_name, attrib, value);\r
+                       for (var i=0, m=childElements.length; i<m; i++)\r
+                               elements[elements.length] = childElements[i];\r
+               }\r
+       }\r
+\r
+       return elements;\r
+};\r
+\r
+TinyMCE.prototype.isBlockElement = function(node) {\r
+       return node != null && node.nodeType == 1 && this.blockRegExp.test(node.nodeName);\r
+};\r
+\r
+TinyMCE.prototype.getParentBlockElement = function(node) {\r
+       // Search up the tree for block element\r
+       while (node) {\r
+               if (this.blockRegExp.test(node.nodeName))\r
+                       return node;\r
+\r
+               node = node.parentNode;\r
+       }\r
+\r
+       return null;\r
+};\r
+\r
+TinyMCE.prototype.getNodeTree = function(node, node_array, type, node_name) {\r
+       if (typeof(type) == "undefined" || node.nodeType == type && (typeof(node_name) == "undefined" || node.nodeName == node_name))\r
+               node_array[node_array.length] = node;\r
+\r
+       if (node.hasChildNodes()) {\r
+               for (var i=0; i<node.childNodes.length; i++)\r
+                       tinyMCE.getNodeTree(node.childNodes[i], node_array, type, node_name);\r
+       }\r
+\r
+       return node_array;\r
+};\r
+\r
+TinyMCE.prototype.getParentElement = function(node, names, attrib_name, attrib_value) {\r
+       if (typeof(names) == "undefined") {\r
+               if (node.nodeType == 1)\r
+                       return node;\r
+\r
+               // Find parent node that is a element\r
+               while ((node = node.parentNode) != null && node.nodeType != 1) ;\r
+\r
+               return node;\r
+       }\r
+\r
+       var namesAr = names.split(',');\r
+\r
+       if (node == null)\r
+               return null;\r
+\r
+       do {\r
+               for (var i=0; i<namesAr.length; i++) {\r
+                       if (node.nodeName.toLowerCase() == namesAr[i].toLowerCase() || names == "*") {\r
+                               if (typeof(attrib_name) == "undefined")\r
+                                       return node;\r
+                               else if (node.getAttribute(attrib_name)) {\r
+                                       if (typeof(attrib_value) == "undefined") {\r
+                                               if (node.getAttribute(attrib_name) != "")\r
+                                                       return node;\r
+                                       } else if (node.getAttribute(attrib_name) == attrib_value)\r
+                                               return node;\r
+                               }\r
+                       }\r
+               }\r
+       } while ((node = node.parentNode) != null);\r
+\r
+       return null;\r
+};\r
+\r
+TinyMCE.prototype.convertURL = function(url, node, on_save) {\r
+       var prot = document.location.protocol;\r
+       var host = document.location.hostname;\r
+       var port = document.location.port;\r
+\r
+       // Pass through file protocol\r
+       if (prot == "file:")\r
+               return url;\r
+\r
+       // Something is wrong, remove weirdness\r
+       url = tinyMCE.regexpReplace(url, '(http|https):///', '/');\r
+\r
+       // Mailto link or anchor (Pass through)\r
+       if (url.indexOf('mailto:') != -1 || url.indexOf('javascript:') != -1 || tinyMCE.regexpReplace(url,'[ \t\r\n\+]|%20','').charAt(0) == "#")\r
+               return url;\r
+\r
+       // Fix relative/Mozilla\r
+       if (!tinyMCE.isMSIE && !on_save && url.indexOf("://") == -1 && url.charAt(0) != '/')\r
+               return tinyMCE.settings['base_href'] + url;\r
+\r
+       // Handle relative URLs\r
+       if (on_save && tinyMCE.getParam('relative_urls')) {\r
+               var curl = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], url);\r
+               if (curl.charAt(0) == '/')\r
+                       curl = tinyMCE.settings['document_base_prefix'] + curl;\r
+\r
+               var urlParts = tinyMCE.parseURL(curl);\r
+               var tmpUrlParts = tinyMCE.parseURL(tinyMCE.settings['document_base_url']);\r
+\r
+               // Force relative\r
+               if (urlParts['host'] == tmpUrlParts['host'] && (urlParts['port'] == tmpUrlParts['port']))\r
+                       return tinyMCE.convertAbsoluteURLToRelativeURL(tinyMCE.settings['document_base_url'], curl);\r
+       }\r
+\r
+       // Handle absolute URLs\r
+       if (!tinyMCE.getParam('relative_urls')) {\r
+               var urlParts = tinyMCE.parseURL(url);\r
+               var baseUrlParts = tinyMCE.parseURL(tinyMCE.settings['base_href']);\r
+\r
+               // Force absolute URLs from relative URLs\r
+               url = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], url);\r
+\r
+               // If anchor and path is the same page\r
+               if (urlParts['anchor'] && urlParts['path'] == baseUrlParts['path'])\r
+                       return "#" + urlParts['anchor'];\r
+       }\r
+\r
+       // Remove current domain\r
+       if (tinyMCE.getParam('remove_script_host')) {\r
+               var start = "", portPart = "";\r
+\r
+               if (port != "")\r
+                       portPart = ":" + port;\r
+\r
+               start = prot + "//" + host + portPart + "/";\r
+\r
+               if (url.indexOf(start) == 0)\r
+                       url = url.substring(start.length-1);\r
+       }\r
+\r
+       return url;\r
+};\r
+\r
+/**\r
+ * Parses a URL in to its diffrent components.\r
+ */\r
+TinyMCE.prototype.parseURL = function(url_str) {\r
+       var urlParts = new Array();\r
+\r
+       if (url_str) {\r
+               var pos, lastPos;\r
+\r
+               // Parse protocol part\r
+               pos = url_str.indexOf('://');\r
+               if (pos != -1) {\r
+                       urlParts['protocol'] = url_str.substring(0, pos);\r
+                       lastPos = pos + 3;\r
+               }\r
+\r
+               // Find port or path start\r
+               for (var i=lastPos; i<url_str.length; i++) {\r
+                       var chr = url_str.charAt(i);\r
+\r
+                       if (chr == ':')\r
+                               break;\r
+\r
+                       if (chr == '/')\r
+                               break;\r
+               }\r
+               pos = i;\r
+\r
+               // Get host\r
+               urlParts['host'] = url_str.substring(lastPos, pos);\r
+\r
+               // Get port\r
+               urlParts['port'] = "";\r
+               lastPos = pos;\r
+               if (url_str.charAt(pos) == ':') {\r
+                       pos = url_str.indexOf('/', lastPos);\r
+                       urlParts['port'] = url_str.substring(lastPos+1, pos);\r
+               }\r
+\r
+               // Get path\r
+               lastPos = pos;\r
+               pos = url_str.indexOf('?', lastPos);\r
+\r
+               if (pos == -1)\r
+                       pos = url_str.indexOf('#', lastPos);\r
+\r
+               if (pos == -1)\r
+                       pos = url_str.length;\r
+\r
+               urlParts['path'] = url_str.substring(lastPos, pos);\r
+\r
+               // Get query\r
+               lastPos = pos;\r
+               if (url_str.charAt(pos) == '?') {\r
+                       pos = url_str.indexOf('#');\r
+                       pos = (pos == -1) ? url_str.length : pos;\r
+                       urlParts['query'] = url_str.substring(lastPos+1, pos);\r
+               }\r
+\r
+               // Get anchor\r
+               lastPos = pos;\r
+               if (url_str.charAt(pos) == '#') {\r
+                       pos = url_str.length;\r
+                       urlParts['anchor'] = url_str.substring(lastPos+1, pos);\r
+               }\r
+       }\r
+\r
+       return urlParts;\r
+};\r
+\r
+TinyMCE.prototype.serializeURL = function(up) {\r
+       var url = "";\r
+\r
+       if (up['protocol'])\r
+               url += up['protocol'] + "://";\r
+\r
+       if (up['host'])\r
+               url += up['host'];\r
+\r
+       if (up['port'])\r
+               url += ":" + up['port'];\r
+\r
+       if (up['path'])\r
+               url += up['path'];\r
+\r
+       if (up['query'])\r
+               url += "?" + up['query'];\r
+\r
+       if (up['anchor'])\r
+               url += "#" + up['anchor'];\r
+\r
+       return url;\r
+};\r
+\r
+/**\r
+ * Converts an absolute path to relative path.\r
+ */\r
+TinyMCE.prototype.convertAbsoluteURLToRelativeURL = function(base_url, url_to_relative) {\r
+       var baseURL = this.parseURL(base_url);\r
+       var targetURL = this.parseURL(url_to_relative);\r
+       var strTok1;\r
+       var strTok2;\r
+       var breakPoint = 0;\r
+       var outPath = "";\r
+       var forceSlash = false;\r
+\r
+       if (targetURL.path == "")\r
+               targetURL.path = "/";\r
+       else\r
+               forceSlash = true;\r
+\r
+       // Crop away last path part\r
+       base_url = baseURL.path.substring(0, baseURL.path.lastIndexOf('/'));\r
+       strTok1 = base_url.split('/');\r
+       strTok2 = targetURL.path.split('/');\r
+\r
+       if (strTok1.length >= strTok2.length) {\r
+               for (var i=0; i<strTok1.length; i++) {\r
+                       if (i >= strTok2.length || strTok1[i] != strTok2[i]) {\r
+                               breakPoint = i + 1;\r
+                               break;\r
+                       }\r
+               }\r
+       }\r
+\r
+       if (strTok1.length < strTok2.length) {\r
+               for (var i=0; i<strTok2.length; i++) {\r
+                       if (i >= strTok1.length || strTok1[i] != strTok2[i]) {\r
+                               breakPoint = i + 1;\r
+                               break;\r
+                       }\r
+               }\r
+       }\r
+\r
+       if (breakPoint == 1)\r
+               return targetURL.path;\r
+\r
+       for (var i=0; i<(strTok1.length-(breakPoint-1)); i++)\r
+               outPath += "../";\r
+\r
+       for (var i=breakPoint-1; i<strTok2.length; i++) {\r
+               if (i != (breakPoint-1))\r
+                       outPath += "/" + strTok2[i];\r
+               else\r
+                       outPath += strTok2[i];\r
+       }\r
+\r
+       targetURL.protocol = null;\r
+       targetURL.host = null;\r
+       targetURL.port = null;\r
+       targetURL.path = outPath == "" && forceSlash ? "/" : outPath;\r
+\r
+       // Remove document prefix from local anchors\r
+       var fileName = baseURL.path;\r
+       var pos;\r
+\r
+       if ((pos = fileName.lastIndexOf('/')) != -1)\r
+               fileName = fileName.substring(pos + 1);\r
+\r
+       // Is local anchor\r
+       if (fileName == targetURL.path && targetURL.anchor != "")\r
+               targetURL.path = "";\r
+\r
+       return this.serializeURL(targetURL);\r
+};\r
+\r
+TinyMCE.prototype.convertRelativeToAbsoluteURL = function(base_url, relative_url) {\r
+       var baseURL = TinyMCE.prototype.parseURL(base_url);\r
+       var relURL = TinyMCE.prototype.parseURL(relative_url);\r
+\r
+       if (relative_url == "" || relative_url.charAt(0) == '/' || relative_url.indexOf('://') != -1 || relative_url.indexOf('mailto:') != -1 || relative_url.indexOf('javascript:') != -1)\r
+               return relative_url;\r
+\r
+       // Split parts\r
+       baseURLParts = baseURL['path'].split('/');\r
+       relURLParts = relURL['path'].split('/');\r
+\r
+       // Remove empty chunks\r
+       var newBaseURLParts = new Array();\r
+       for (var i=baseURLParts.length-1; i>=0; i--) {\r
+               if (baseURLParts[i].length == 0)\r
+                       continue;\r
+\r
+               newBaseURLParts[newBaseURLParts.length] = baseURLParts[i];\r
+       }\r
+       baseURLParts = newBaseURLParts.reverse();\r
+\r
+       // Merge relURLParts chunks\r
+       var newRelURLParts = new Array();\r
+       var numBack = 0;\r
+       for (var i=relURLParts.length-1; i>=0; i--) {\r
+               if (relURLParts[i].length == 0 || relURLParts[i] == ".")\r
+                       continue;\r
+\r
+               if (relURLParts[i] == '..') {\r
+                       numBack++;\r
+                       continue;\r
+               }\r
+\r
+               if (numBack > 0) {\r
+                       numBack--;\r
+                       continue;\r
+               }\r
+\r
+               newRelURLParts[newRelURLParts.length] = relURLParts[i];\r
+       }\r
+\r
+       relURLParts = newRelURLParts.reverse();\r
+\r
+       // Remove end from absolute path\r
+       var len = baseURLParts.length-numBack;\r
+       var absPath = (len <= 0 ? "" : "/") + baseURLParts.slice(0, len).join('/') + "/" + relURLParts.join('/');\r
+       var start = "", end = "";\r
+\r
+       // Build output URL\r
+       relURL.protocol = baseURL.protocol;\r
+       relURL.host = baseURL.host;\r
+       relURL.port = baseURL.port;\r
+\r
+       // Re-add trailing slash if it's removed\r
+       if (relURL.path.charAt(relURL.path.length-1) == "/")\r
+               absPath += "/";\r
+\r
+       relURL.path = absPath;\r
+\r
+       return TinyMCE.prototype.serializeURL(relURL);\r
+};\r
+\r
+TinyMCE.prototype.getParam = function(name, default_value, strip_whitespace, split_chr) {\r
+       var value = (typeof(this.settings[name]) == "undefined") ? default_value : this.settings[name];\r
+\r
+       // Fix bool values\r
+       if (value == "true" || value == "false")\r
+               return (value == "true");\r
+\r
+       if (strip_whitespace)\r
+               value = tinyMCE.regexpReplace(value, "[ \t\r\n]", "");\r
+\r
+       if (typeof(split_chr) != "undefined" && split_chr != null) {\r
+               value = value.split(split_chr);\r
+               var outArray = new Array();\r
+\r
+               for (var i=0; i<value.length; i++) {\r
+                       if (value[i] && value[i] != "")\r
+                               outArray[outArray.length] = value[i];\r
+               }\r
+\r
+               value = outArray;\r
+       }\r
+\r
+       return value;\r
+};\r
+\r
+TinyMCE.prototype.getLang = function(name, default_value, parse_entities) {\r
+       var value = (typeof(tinyMCELang[name]) == "undefined") ? default_value : tinyMCELang[name];\r
+\r
+       if (parse_entities)\r
+               value = tinyMCE.entityDecode(value);\r
+\r
+       return value;\r
+};\r
+\r
+TinyMCE.prototype.entityDecode = function(s) {\r
+       var e = document.createElement("div");\r
+       e.innerHTML = s;\r
+       return e.innerHTML;\r
+};\r
+\r
+TinyMCE.prototype.addToLang = function(prefix, ar) {\r
+       for (var key in ar) {\r
+               if (typeof(ar[key]) == 'function')\r
+                       continue;\r
+\r
+               tinyMCELang[(key.indexOf('lang_') == -1 ? 'lang_' : '') + (prefix != '' ? (prefix + "_") : '') + key] = ar[key];\r
+       }\r
+\r
+//     for (var key in ar)\r
+//             tinyMCELang[(key.indexOf('lang_') == -1 ? 'lang_' : '') + (prefix != '' ? (prefix + "_") : '') + key] = "|" + ar[key] + "|";\r
+};\r
+\r
+TinyMCE.prototype.replaceVar = function(replace_haystack, replace_var, replace_str) {\r
+       var re = new RegExp('{\\\$' + replace_var + '}', 'g');\r
+       return replace_haystack.replace(re, replace_str);\r
+};\r
+\r
+TinyMCE.prototype.replaceVars = function(replace_haystack, replace_vars) {\r
+       for (var key in replace_vars) {\r
+               var value = replace_vars[key];\r
+               if (typeof(value) == 'function')\r
+                       continue;\r
+\r
+               replace_haystack = tinyMCE.replaceVar(replace_haystack, key, value);\r
+       }\r
+\r
+       return replace_haystack;\r
+};\r
+\r
+TinyMCE.prototype.triggerNodeChange = function(focus, setup_content) {\r
+       if (tinyMCE.settings['handleNodeChangeCallback']) {\r
+               if (tinyMCE.selectedInstance) {\r
+                       var inst = tinyMCE.selectedInstance;\r
+                       var editorId = inst.editorId;\r
+                       var elm = (typeof(setup_content) != "undefined" && setup_content) ? tinyMCE.selectedElement : inst.getFocusElement();\r
+                       var undoIndex = -1;\r
+                       var undoLevels = -1;\r
+                       var anySelection = false;\r
+                       var selectedText = inst.getSelectedText();\r
+\r
+                       inst.switchSettings();\r
+\r
+                       if (tinyMCE.settings["auto_resize"]) {\r
+                               var doc = inst.getDoc();\r
+\r
+                               inst.iframeElement.style.width = doc.body.offsetWidth + "px";\r
+                               inst.iframeElement.style.height = doc.body.offsetHeight + "px";\r
+                       }\r
+\r
+                       if (tinyMCE.selectedElement)\r
+                               anySelection = (tinyMCE.selectedElement.nodeName.toLowerCase() == "img") || (selectedText && selectedText.length > 0);\r
+\r
+                       if (tinyMCE.settings['custom_undo_redo']) {\r
+                               undoIndex = inst.undoIndex;\r
+                               undoLevels = inst.undoLevels.length;\r
+                       }\r
+\r
+                       tinyMCE.executeCallback('handleNodeChangeCallback', '_handleNodeChange', 0, editorId, elm, undoIndex, undoLevels, inst.visualAid, anySelection, setup_content);\r
+               }\r
+       }\r
+\r
+       if (this.selectedInstance && (typeof(focus) == "undefined" || focus))\r
+               this.selectedInstance.contentWindow.focus();\r
+};\r
+\r
+TinyMCE.prototype._customCleanup = function(inst, type, content) {\r
+       // Call custom cleanup\r
+       var customCleanup = tinyMCE.settings['cleanup_callback'];\r
+       if (customCleanup != "" && eval("typeof(" + customCleanup + ")") != "undefined")\r
+               content = eval(customCleanup + "(type, content, inst);");\r
+\r
+       // Trigger plugin cleanups\r
+       var plugins = tinyMCE.getParam('plugins', '', true, ',');\r
+       for (var i=0; i<plugins.length; i++) {\r
+               if (eval("typeof(TinyMCE_" + plugins[i] +  "_cleanup)") != "undefined")\r
+                       content = eval("TinyMCE_" + plugins[i] +  "_cleanup(type, content, inst);");\r
+       }\r
+\r
+       return content;\r
+};\r
+\r
+TinyMCE.prototype.getContent = function(editor_id) {\r
+       if (typeof(editor_id) != "undefined")\r
+               tinyMCE.selectedInstance = tinyMCE.getInstanceById(editor_id);\r
+\r
+       if (tinyMCE.selectedInstance) {\r
+               var old = this.selectedInstance.getBody().innerHTML;\r
+               var html = tinyMCE._cleanupHTML(this.selectedInstance, this.selectedInstance.getDoc(), tinyMCE.settings, this.selectedInstance.getBody(), false, true);\r
+               tinyMCE.setInnerHTML(this.selectedInstance.getBody(), old);\r
+               return html;\r
+       }\r
+\r
+       return null;\r
+};\r
+\r
+TinyMCE.prototype.setContent = function(html_content) {\r
+       if (tinyMCE.selectedInstance) {\r
+               tinyMCE.selectedInstance.execCommand('mceSetContent', false, html_content);\r
+               tinyMCE.selectedInstance.repaint();\r
+       }\r
+};\r
+\r
+TinyMCE.prototype.importThemeLanguagePack = function(name) {\r
+       if (typeof(name) == "undefined")\r
+               name = tinyMCE.settings['theme'];\r
+\r
+       tinyMCE.loadScript(tinyMCE.baseURL + '/themes/' + name + '/langs/' + tinyMCE.settings['language'] + '.js');\r
+};\r
+\r
+TinyMCE.prototype.importPluginLanguagePack = function(name, valid_languages) {\r
+       var lang = "en";\r
+\r
+       valid_languages = valid_languages.split(',');\r
+       for (var i=0; i<valid_languages.length; i++) {\r
+               if (tinyMCE.settings['language'] == valid_languages[i])\r
+                       lang = tinyMCE.settings['language'];\r
+       }\r
+\r
+       tinyMCE.loadScript(tinyMCE.baseURL + '/plugins/' + name + '/langs/' + lang +  '.js');\r
+};\r
+\r
+/**\r
+ * Adds themeurl, settings and lang to HTML code.\r
+ */\r
+TinyMCE.prototype.applyTemplate = function(html, args) {\r
+       html = tinyMCE.replaceVar(html, "themeurl", tinyMCE.themeURL);\r
+\r
+       if (typeof(args) != "undefined")\r
+               html = tinyMCE.replaceVars(html, args);\r
+\r
+       html = tinyMCE.replaceVars(html, tinyMCE.settings);\r
+       html = tinyMCE.replaceVars(html, tinyMCELang);\r
+\r
+       return html;\r
+};\r
+\r
+TinyMCE.prototype.openWindow = function(template, args) {\r
+       var html, width, height, x, y, resizable, scrollbars, url;\r
+\r
+       args['mce_template_file'] = template['file'];\r
+       args['mce_width'] = template['width'];\r
+       args['mce_height'] = template['height'];\r
+       tinyMCE.windowArgs = args;\r
+\r
+       html = template['html'];\r
+       if (!(width = parseInt(template['width'])))\r
+               width = 320;\r
+\r
+       if (!(height = parseInt(template['height'])))\r
+               height = 200;\r
+\r
+       // Add to height in M$ due to SP2 WHY DON'T YOU GUYS IMPLEMENT innerWidth of windows!!\r
+       if (tinyMCE.isMSIE)\r
+               height += 40;\r
+       else\r
+               height += 20;\r
+\r
+       x = parseInt(screen.width / 2.0) - (width / 2.0);\r
+       y = parseInt(screen.height / 2.0) - (height / 2.0);\r
+\r
+       resizable = (args && args['resizable']) ? args['resizable'] : "no";\r
+       scrollbars = (args && args['scrollbars']) ? args['scrollbars'] : "no";\r
+\r
+       if (template['file'].charAt(0) != '/' && template['file'].indexOf('://') == -1)\r
+               url = tinyMCE.baseURL + "/themes/" + tinyMCE.getParam("theme") + "/" + template['file'];\r
+       else\r
+               url = template['file'];\r
+\r
+       // Replace all args as variables in URL\r
+       for (var name in args) {\r
+               if (typeof(args[name]) == 'function')\r
+                       continue;\r
+\r
+               url = tinyMCE.replaceVar(url, name, escape(args[name]));\r
+       }\r
+\r
+       if (html) {\r
+               html = tinyMCE.replaceVar(html, "css", this.settings['popups_css']);\r
+               html = tinyMCE.applyTemplate(html, args);\r
+\r
+               var win = window.open("", "mcePopup" + new Date().getTime(), "top=" + y + ",left=" + x + ",scrollbars=" + scrollbars + ",dialog=yes,minimizable=" + resizable + ",modal=yes,width=" + width + ",height=" + height + ",resizable=" + resizable);\r
+               if (win == null) {\r
+                       alert(tinyMCELang['lang_popup_blocked']);\r
+                       return;\r
+               }\r
+\r
+               win.document.write(html);\r
+               win.document.close();\r
+               win.resizeTo(width, height);\r
+               win.focus();\r
+       } else {\r
+               if ((tinyMCE.isMSIE && !tinyMCE.isOpera) && resizable != 'yes' && tinyMCE.settings["dialog_type"] == "modal") {\r
+            var features = "resizable:" + resizable \r
+                + ";scroll:"\r
+                + scrollbars + ";status:yes;center:yes;help:no;dialogWidth:"\r
+                + width + "px;dialogHeight:" + height + "px;";\r
+\r
+                       window.showModalDialog(url, window, features);\r
+               } else {\r
+                       var modal = (resizable == "yes") ? "no" : "yes";\r
+\r
+                       if (tinyMCE.isGecko && tinyMCE.isMac)\r
+                               modal = "no";\r
+\r
+                       if (template['close_previous'] != "no")\r
+                               try {tinyMCE.lastWindow.close();} catch (ex) {}\r
+\r
+                       var win = window.open(url, "mcePopup" + new Date().getTime(), "top=" + y + ",left=" + x + ",scrollbars=" + scrollbars + ",dialog=" + modal + ",minimizable=" + resizable + ",modal=" + modal + ",width=" + width + ",height=" + height + ",resizable=" + resizable);\r
+                       if (win == null) {\r
+                               alert(tinyMCELang['lang_popup_blocked']);\r
+                               return;\r
+                       }\r
+\r
+                       if (template['close_previous'] != "no")\r
+                               tinyMCE.lastWindow = win;\r
+\r
+                       eval('try { win.resizeTo(width, height); } catch(e) { }');\r
+\r
+                       // Make it bigger if statusbar is forced\r
+                       if (tinyMCE.isGecko) {\r
+                               if (win.document.defaultView.statusbar.visible)\r
+                                       win.resizeBy(0, tinyMCE.isMac ? 10 : 24);\r
+                       }\r
+\r
+                       win.focus();\r
+               }\r
+       }\r
+};\r
+\r
+TinyMCE.prototype.closeWindow = function(win) {\r
+       win.close();\r
+};\r
+\r
+TinyMCE.prototype.getVisualAidClass = function(class_name, state) {\r
+       var aidClass = tinyMCE.settings['visual_table_class'];\r
+\r
+       if (typeof(state) == "undefined")\r
+               state = tinyMCE.settings['visual'];\r
+\r
+       // Split\r
+       var classNames = new Array();\r
+       var ar = class_name.split(' ');\r
+       for (var i=0; i<ar.length; i++) {\r
+               if (ar[i] == aidClass)\r
+                       ar[i] = "";\r
+\r
+               if (ar[i] != "")\r
+                       classNames[classNames.length] = ar[i];\r
+       }\r
+\r
+       if (state)\r
+               classNames[classNames.length] = aidClass;\r
+\r
+       // Glue\r
+       var className = "";\r
+       for (var i=0; i<classNames.length; i++) {\r
+               if (i > 0)\r
+                       className += " ";\r
+\r
+               className += classNames[i];\r
+       }\r
+\r
+       return className;\r
+};\r
+\r
+TinyMCE.prototype.handleVisualAid = function(el, deep, state, inst) {\r
+       if (!el)\r
+               return;\r
+\r
+       var tableElement = null;\r
+\r
+       switch (el.nodeName) {\r
+               case "TABLE":\r
+                       var oldW = el.style.width;\r
+                       var oldH = el.style.height;\r
+                       var bo = tinyMCE.getAttrib(el, "border");\r
+\r
+                       bo = bo == "" || bo == "0" ? true : false;\r
+\r
+                       tinyMCE.setAttrib(el, "class", tinyMCE.getVisualAidClass(tinyMCE.getAttrib(el, "class"), state && bo));\r
+\r
+                       el.style.width = oldW;\r
+                       el.style.height = oldH;\r
+\r
+                       for (var y=0; y<el.rows.length; y++) {\r
+                               for (var x=0; x<el.rows[y].cells.length; x++) {\r
+                                       var cn = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(el.rows[y].cells[x], "class"), state && bo);\r
+                                       tinyMCE.setAttrib(el.rows[y].cells[x], "class", cn);\r
+                               }\r
+                       }\r
+\r
+                       break;\r
+\r
+               case "A":\r
+                       var anchorName = tinyMCE.getAttrib(el, "name");\r
+\r
+                       if (anchorName != '' && state) {\r
+                               el.title = anchorName;\r
+                               el.className = 'mceItemAnchor';\r
+                       } else if (anchorName != '' && !state)\r
+                               el.className = '';\r
+\r
+                       break;\r
+       }\r
+\r
+       if (deep && el.hasChildNodes()) {\r
+               for (var i=0; i<el.childNodes.length; i++)\r
+                       tinyMCE.handleVisualAid(el.childNodes[i], deep, state, inst);\r
+       }\r
+};\r
+\r
+TinyMCE.prototype.getAttrib = function(elm, name, default_value) {\r
+       if (typeof(default_value) == "undefined")\r
+               default_value = "";\r
+\r
+       // Not a element\r
+       if (!elm || elm.nodeType != 1)\r
+               return default_value;\r
+\r
+       var v = elm.getAttribute(name);\r
+\r
+       // Try className for class attrib\r
+       if (name == "class" && !v)\r
+               v = elm.className;\r
+\r
+       // Workaround for a issue with Firefox 1.5rc2+\r
+       if (tinyMCE.isGecko && name == "src" && elm.src != null && elm.src != "")\r
+               v = elm.src;\r
+\r
+       // Workaround for a issue with Firefox 1.5rc2+\r
+       if (tinyMCE.isGecko && name == "href" && elm.href != null && elm.href != "")\r
+               v = elm.href;\r
+\r
+       if (name == "style" && !tinyMCE.isOpera)\r
+               v = elm.style.cssText;\r
+\r
+       return (v && v != "") ? v : default_value;\r
+};\r
+\r
+TinyMCE.prototype.setAttrib = function(element, name, value, fix_value) {\r
+       if (typeof(value) == "number" && value != null)\r
+               value = "" + value;\r
+\r
+       if (fix_value) {\r
+               if (value == null)\r
+                       value = "";\r
+\r
+               var re = new RegExp('[^0-9%]', 'g');\r
+               value = value.replace(re, '');\r
+       }\r
+\r
+       if (name == "style")\r
+               element.style.cssText = value;\r
+\r
+       if (name == "class")\r
+               element.className = value;\r
+\r
+       if (value != null && value != "" && value != -1)\r
+               element.setAttribute(name, value);\r
+       else\r
+               element.removeAttribute(name);\r
+};\r
+\r
+TinyMCE.prototype.setStyleAttrib = function(elm, name, value) {\r
+       eval('elm.style.' + name + '=value;');\r
+\r
+       // Style attrib deleted\r
+       if (tinyMCE.isMSIE && value == null || value == '') {\r
+               var str = tinyMCE.serializeStyle(tinyMCE.parseStyle(elm.style.cssText));\r
+               elm.style.cssText = str;\r
+               elm.setAttribute("style", str);\r
+       }\r
+};\r
+\r
+TinyMCE.prototype.convertSpansToFonts = function(doc) {\r
+       var sizes = tinyMCE.getParam('font_size_style_values').replace(/\s+/, '').split(',');\r
+\r
+       var h = doc.body.innerHTML;\r
+       h = h.replace(/<span/gi, '<font');\r
+       h = h.replace(/<\/span/gi, '</font');\r
+       doc.body.innerHTML = h;\r
+\r
+       var s = doc.getElementsByTagName("font");\r
+       for (var i=0; i<s.length; i++) {\r
+               var size = tinyMCE.trim(s[i].style.fontSize).toLowerCase();\r
+               var fSize = 0;\r
+\r
+               for (var x=0; x<sizes.length; x++) {\r
+                       if (sizes[x] == size) {\r
+                               fSize = x + 1;\r
+                               break;\r
+                       }\r
+               }\r
+\r
+               if (fSize > 0) {\r
+                       tinyMCE.setAttrib(s[i], 'size', fSize);\r
+                       s[i].style.fontSize = '';\r
+               }\r
+\r
+               var fFace = s[i].style.fontFamily;\r
+               if (fFace != null && fFace != "") {\r
+                       tinyMCE.setAttrib(s[i], 'face', fFace);\r
+                       s[i].style.fontFamily = '';\r
+               }\r
+\r
+               var fColor = s[i].style.color;\r
+               if (fColor != null && fColor != "") {\r
+                       tinyMCE.setAttrib(s[i], 'color', tinyMCE.convertRGBToHex(fColor));\r
+                       s[i].style.color = '';\r
+               }\r
+       }\r
+};\r
+\r
+TinyMCE.prototype.convertFontsToSpans = function(doc) {\r
+       var sizes = tinyMCE.getParam('font_size_style_values').replace(/\s+/, '').split(',');\r
+\r
+       var h = doc.body.innerHTML;\r
+       h = h.replace(/<font/gi, '<span');\r
+       h = h.replace(/<\/font/gi, '</span');\r
+       doc.body.innerHTML = h;\r
+\r
+       var fsClasses = tinyMCE.getParam('font_size_classes');\r
+       if (fsClasses != '')\r
+               fsClasses = fsClasses.replace(/\s+/, '').split(',');\r
+       else\r
+               fsClasses = null;\r
+\r
+       var s = doc.getElementsByTagName("span");\r
+       for (var i=0; i<s.length; i++) {\r
+               var fSize, fFace, fColor;\r
+\r
+               fSize = tinyMCE.getAttrib(s[i], 'size');\r
+               fFace = tinyMCE.getAttrib(s[i], 'face');\r
+               fColor = tinyMCE.getAttrib(s[i], 'color');\r
+\r
+               if (fSize != "") {\r
+                       fSize = parseInt(fSize);\r
+\r
+                       if (fSize > 0 && fSize < 8) {\r
+                               if (fsClasses != null)\r
+                                       tinyMCE.setAttrib(s[i], 'class', fsClasses[fSize-1]);\r
+                               else\r
+                                       s[i].style.fontSize = sizes[fSize-1];\r
+                       }\r
+\r
+                       s[i].removeAttribute('size');\r
+               }\r
+\r
+               if (fFace != "") {\r
+                       s[i].style.fontFamily = fFace;\r
+                       s[i].removeAttribute('face');\r
+               }\r
+\r
+               if (fColor != "") {\r
+                       s[i].style.color = fColor;\r
+                       s[i].removeAttribute('color');\r
+               }\r
+       }\r
+};\r
+\r
+/*\r
+TinyMCE.prototype.applyClassesToFonts = function(doc, size) {\r
+       var f = doc.getElementsByTagName("font");\r
+       for (var i=0; i<f.length; i++) {\r
+               var s = tinyMCE.getAttrib(f[i], "size");\r
+\r
+               if (s != "")\r
+                       tinyMCE.setAttrib(f[i], 'class', "mceItemFont" + s);\r
+       }\r
+\r
+       if (typeof(size) != "undefined") {\r
+               var css = "";\r
+\r
+               for (var x=0; x<doc.styleSheets.length; x++) {\r
+                       for (var i=0; i<doc.styleSheets[x].rules.length; i++) {\r
+                               if (doc.styleSheets[x].rules[i].selectorText == '#mceSpanFonts .mceItemFont' + size) {\r
+                                       css = doc.styleSheets[x].rules[i].style.cssText;\r
+                                       break;\r
+                               }\r
+                       }\r
+\r
+                       if (css != "")\r
+                               break;\r
+               }\r
+\r
+               if (doc.styleSheets[0].rules[0].selectorText == "FONT")\r
+                       doc.styleSheets[0].removeRule(0);\r
+\r
+               doc.styleSheets[0].addRule("FONT", css, 0);\r
+       }\r
+};\r
+*/\r
+\r
+TinyMCE.prototype.setInnerHTML = function(e, h) {\r
+       if (tinyMCE.isMSIE && !tinyMCE.isOpera) {\r
+               e.innerHTML = tinyMCE.uniqueTag + h;\r
+               e.firstChild.removeNode(true);\r
+       } else {\r
+               h = this.fixGeckoBaseHREFBug(1, e, h);\r
+               e.innerHTML = h;\r
+               this.fixGeckoBaseHREFBug(2, e, h);\r
+       }\r
+};\r
+\r
+TinyMCE.prototype.fixGeckoBaseHREFBug = function(m, e, h) {\r
+       if (tinyMCE.isGecko) {\r
+               if (m == 1) {\r
+                       h = h.replace(/\ssrc=/gi, " xsrc=");\r
+                       h = h.replace(/\shref=/gi, " xhref=");\r
+\r
+                       return h;\r
+               } else {\r
+                       if (h.indexOf(' xsrc') != -1) {\r
+                               var n = e.getElementsByTagName("img");\r
+                               for (var i=0; i<n.length; i++) {\r
+                                       var xsrc = tinyMCE.getAttrib(n[i], "xsrc");\r
+\r
+                                       if (xsrc != "") {\r
+                                               n[i].src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], xsrc);\r
+                                               n[i].removeAttribute("xsrc");\r
+                                       }\r
+                               }\r
+\r
+                               // Select image form fields\r
+                               var n = e.getElementsByTagName("select");\r
+                               for (var i=0; i<n.length; i++) {\r
+                                       var xsrc = tinyMCE.getAttrib(n[i], "xsrc");\r
+\r
+                                       if (xsrc != "") {\r
+                                               n[i].src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], xsrc);\r
+                                               n[i].removeAttribute("xsrc");\r
+                                       }\r
+                               }\r
+\r
+                               // iframes\r
+                               var n = e.getElementsByTagName("iframe");\r
+                               for (var i=0; i<n.length; i++) {\r
+                                       var xsrc = tinyMCE.getAttrib(n[i], "xsrc");\r
+\r
+                                       if (xsrc != "") {\r
+                                               n[i].src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], xsrc);\r
+                                               n[i].removeAttribute("xsrc");\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       if (h.indexOf(' xhref') != -1) {\r
+                               var n = e.getElementsByTagName("a");\r
+                               for (var i=0; i<n.length; i++) {\r
+                                       var xhref = tinyMCE.getAttrib(n[i], "xhref");\r
+\r
+                                       if (xhref != "") {\r
+                                               n[i].href = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], xhref);\r
+                                               n[i].removeAttribute("xhref");\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       return h;\r
+};\r
+\r
+TinyMCE.prototype.getOuterHTML = function(e) {\r
+       if (tinyMCE.isMSIE)\r
+               return e.outerHTML;\r
+\r
+       var d = e.ownerDocument.createElement("body");\r
+       d.appendChild(e);\r
+       return d.innerHTML;\r
+};\r
+\r
+TinyMCE.prototype.setOuterHTML = function(doc, e, h) {\r
+       if (tinyMCE.isMSIE) {\r
+               e.outerHTML = h;\r
+               return;\r
+       }\r
+\r
+       var d = e.ownerDocument.createElement("body");\r
+       d.innerHTML = h;\r
+       e.parentNode.replaceChild(d.firstChild, e);\r
+};\r
+\r
+TinyMCE.prototype.insertAfter = function(nc, rc){\r
+       if (rc.nextSibling)\r
+               rc.parentNode.insertBefore(nc, rc.nextSibling);\r
+       else\r
+               rc.parentNode.appendChild(nc);\r
+};\r
+\r
+TinyMCE.prototype.cleanupAnchors = function(doc) {\r
+       var an = doc.getElementsByTagName("a");\r
+\r
+       for (var i=0; i<an.length; i++) {\r
+               if (tinyMCE.getAttrib(an[i], "name") != "") {\r
+                       var cn = an[i].childNodes;\r
+                       for (var x=cn.length-1; x>=0; x--)\r
+                               tinyMCE.insertAfter(cn[x], an[i]);\r
+               }\r
+       }\r
+};\r
+\r
+TinyMCE.prototype._setHTML = function(doc, html_content) {\r
+       // Force closed anchors open\r
+       //html_content = html_content.replace(new RegExp('<a(.*?)/>', 'gi'), '<a$1></a>');\r
+\r
+       html_content = tinyMCE.cleanupHTMLCode(html_content);\r
+\r
+       // Try innerHTML if it fails use pasteHTML in MSIE\r
+       try {\r
+               tinyMCE.setInnerHTML(doc.body, html_content);\r
+       } catch (e) {\r
+               if (this.isMSIE)\r
+                       doc.body.createTextRange().pasteHTML(html_content);\r
+       }\r
+\r
+       // Content duplication bug fix\r
+       if (tinyMCE.isMSIE && tinyMCE.settings['fix_content_duplication']) {\r
+               // Remove P elements in P elements\r
+               var paras = doc.getElementsByTagName("P");\r
+               for (var i=0; i<paras.length; i++) {\r
+                       var node = paras[i];\r
+                       while ((node = node.parentNode) != null) {\r
+                               if (node.nodeName == "P")\r
+                                       node.outerHTML = node.innerHTML;\r
+                       }\r
+               }\r
+\r
+               // Content duplication bug fix (Seems to be word crap)\r
+               var html = doc.body.innerHTML;\r
+\r
+               if (html.indexOf('="mso') != -1) {\r
+                       for (var i=0; i<doc.body.all.length; i++) {\r
+                               var el = doc.body.all[i];\r
+                               el.removeAttribute("className","",0);\r
+                               el.removeAttribute("style","",0);\r
+                       }\r
+\r
+                       html = doc.body.innerHTML;\r
+                       html = tinyMCE.regexpReplace(html, "<o:p><\/o:p>", "<br />");\r
+                       html = tinyMCE.regexpReplace(html, "<o:p>&nbsp;<\/o:p>", "");\r
+                       html = tinyMCE.regexpReplace(html, "<st1:.*?>", "");\r
+                       html = tinyMCE.regexpReplace(html, "<p><\/p>", "");\r
+                       html = tinyMCE.regexpReplace(html, "<p><\/p>\r\n<p><\/p>", "");\r
+                       html = tinyMCE.regexpReplace(html, "<p>&nbsp;<\/p>", "<br />");\r
+                       html = tinyMCE.regexpReplace(html, "<p>\s*(<p>\s*)?", "<p>");\r
+                       html = tinyMCE.regexpReplace(html, "<\/p>\s*(<\/p>\s*)?", "</p>");\r
+               }\r
+\r
+               // Always set the htmlText output\r
+               tinyMCE.setInnerHTML(doc.body, html);\r
+       }\r
+\r
+       tinyMCE.cleanupAnchors(doc);\r
+\r
+       if (tinyMCE.getParam("convert_fonts_to_spans"))\r
+               tinyMCE.convertSpansToFonts(doc);\r
+};\r
+\r
+TinyMCE.prototype.getImageSrc = function(str) {\r
+       var pos = -1;\r
+\r
+       if (!str)\r
+               return "";\r
+\r
+       if ((pos = str.indexOf('this.src=')) != -1) {\r
+               var src = str.substring(pos + 10);\r
+\r
+               src = src.substring(0, src.indexOf('\''));\r
+\r
+               return src;\r
+       }\r
+\r
+       return "";\r
+};\r
+\r
+TinyMCE.prototype._getElementById = function(element_id) {\r
+       var elm = document.getElementById(element_id);\r
+       if (!elm) {\r
+               // Check for element in forms\r
+               for (var j=0; j<document.forms.length; j++) {\r
+                       for (var k=0; k<document.forms[j].elements.length; k++) {\r
+                               if (document.forms[j].elements[k].name == element_id) {\r
+                                       elm = document.forms[j].elements[k];\r
+                                       break;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       return elm;\r
+};\r
+\r
+TinyMCE.prototype.getEditorId = function(form_element) {\r
+       var inst = this.getInstanceById(form_element);\r
+       if (!inst)\r
+               return null;\r
+\r
+       return inst.editorId;\r
+};\r
+\r
+TinyMCE.prototype.getInstanceById = function(editor_id) {\r
+       var inst = this.instances[editor_id];\r
+       if (!inst) {\r
+               for (var n in tinyMCE.instances) {\r
+                       var instance = tinyMCE.instances[n];\r
+                       if (!tinyMCE.isInstance(instance))\r
+                               continue;\r
+\r
+                       if (instance.formTargetElementId == editor_id) {\r
+                               inst = instance;\r
+                               break;\r
+                       }\r
+               }\r
+       }\r
+\r
+       return inst;\r
+};\r
+\r
+TinyMCE.prototype.queryInstanceCommandValue = function(editor_id, command) {\r
+       var inst = tinyMCE.getInstanceById(editor_id);\r
+       if (inst)\r
+               return inst.queryCommandValue(command);\r
+\r
+       return false;\r
+};\r
+\r
+TinyMCE.prototype.queryInstanceCommandState = function(editor_id, command) {\r
+       var inst = tinyMCE.getInstanceById(editor_id);\r
+       if (inst)\r
+               return inst.queryCommandState(command);\r
+\r
+       return null;\r
+};\r
+\r
+TinyMCE.prototype.setWindowArg = function(name, value) {\r
+       this.windowArgs[name] = value;\r
+};\r
+\r
+TinyMCE.prototype.getWindowArg = function(name, default_value) {\r
+       return (typeof(this.windowArgs[name]) == "undefined") ? default_value : this.windowArgs[name];\r
+};\r
+\r
+TinyMCE.prototype.getCSSClasses = function(editor_id, doc) {\r
+       var output = new Array();\r
+\r
+       // Is cached, use that\r
+       if (typeof(tinyMCE.cssClasses) != "undefined")\r
+               return tinyMCE.cssClasses;\r
+\r
+       if (typeof(editor_id) == "undefined" && typeof(doc) == "undefined") {\r
+               var instance;\r
+\r
+               for (var instanceName in tinyMCE.instances) {\r
+                       instance = tinyMCE.instances[instanceName];\r
+                       if (!tinyMCE.isInstance(instance))\r
+                               continue;\r
+\r
+                       break;\r
+               }\r
+\r
+               doc = instance.getDoc();\r
+       }\r
+\r
+       if (typeof(doc) == "undefined") {\r
+               var instance = tinyMCE.getInstanceById(editor_id);\r
+               doc = instance.getDoc();\r
+       }\r
+\r
+       if (doc) {\r
+               var styles = tinyMCE.isMSIE ? doc.styleSheets : doc.styleSheets;\r
+\r
+               if (styles && styles.length > 0) {\r
+                       for (var x=0; x<styles.length; x++) {\r
+                               var csses = null;\r
+\r
+                               // Just ignore any errors\r
+                               eval("try {var csses = tinyMCE.isMSIE ? doc.styleSheets(" + x + ").rules : doc.styleSheets[" + x + "].cssRules;} catch(e) {}");\r
+                               if (!csses)\r
+                                       return new Array();\r
+\r
+                               for (var i=0; i<csses.length; i++) {\r
+                                       var selectorText = csses[i].selectorText;\r
+\r
+                                       // Can be multiple rules per selector\r
+                                       if (selectorText) {\r
+                                               var rules = selectorText.split(',');\r
+                                               for (var c=0; c<rules.length; c++) {\r
+                                                       // Invalid rule\r
+                                                       if (rules[c].indexOf(' ') != -1 || rules[c].indexOf(':') != -1 || rules[c].indexOf('mceItem') != -1)\r
+                                                               continue;\r
+\r
+                                                       if (rules[c] == "." + tinyMCE.settings['visual_table_class'])\r
+                                                               continue;\r
+\r
+                                                       // Is class rule\r
+                                                       if (rules[c].indexOf('.') != -1) {\r
+                                                               //alert(rules[c].substring(rules[c].indexOf('.')));\r
+                                                               output[output.length] = rules[c].substring(rules[c].indexOf('.')+1);\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       // Cache em\r
+       if (output.length > 0)\r
+               tinyMCE.cssClasses = output;\r
+\r
+       return output;\r
+};\r
+\r
+TinyMCE.prototype.regexpReplace = function(in_str, reg_exp, replace_str, opts) {\r
+       if (in_str == null)\r
+               return in_str;\r
+\r
+       if (typeof(opts) == "undefined")\r
+               opts = 'g';\r
+\r
+       var re = new RegExp(reg_exp, opts);\r
+       return in_str.replace(re, replace_str);\r
+};\r
+\r
+TinyMCE.prototype.trim = function(str) {\r
+       return str.replace(/^\s*|\s*$/g, "");\r
+};\r
+\r
+TinyMCE.prototype.cleanupEventStr = function(str) {\r
+       str = "" + str;\r
+       str = str.replace('function anonymous()\n{\n', '');\r
+       str = str.replace('\n}', '');\r
+       str = str.replace(/^return true;/gi, ''); // Remove event blocker\r
+\r
+       return str;\r
+};\r
+\r
+TinyMCE.prototype.getAbsPosition = function(node) {\r
+       var pos = new Object();\r
+\r
+       pos.absLeft = pos.absTop = 0;\r
+\r
+       var parentNode = node;\r
+       while (parentNode) {\r
+               pos.absLeft += parentNode.offsetLeft;\r
+               pos.absTop += parentNode.offsetTop;\r
+\r
+               parentNode = parentNode.offsetParent;\r
+       }\r
+\r
+       return pos;\r
+};\r
+\r
+TinyMCE.prototype.getControlHTML = function(control_name) {\r
+       var themePlugins = tinyMCE.getParam('plugins', '', true, ',');\r
+       var templateFunction;\r
+\r
+       // Is it defined in any plugins\r
+       for (var i=themePlugins.length; i>=0; i--) {\r
+               templateFunction = 'TinyMCE_' + themePlugins[i] + "_getControlHTML";\r
+               if (eval("typeof(" + templateFunction + ")") != 'undefined') {\r
+                       var html = eval(templateFunction + "('" + control_name + "');");\r
+                       if (html != "")\r
+                               return tinyMCE.replaceVar(html, "pluginurl", tinyMCE.baseURL + "/plugins/" + themePlugins[i]);\r
+               }\r
+       }\r
+\r
+       return eval('TinyMCE_' + tinyMCE.settings['theme'] + "_getControlHTML" + "('" + control_name + "');");\r
+};\r
+\r
+TinyMCE.prototype._themeExecCommand = function(editor_id, element, command, user_interface, value) {\r
+       var themePlugins = tinyMCE.getParam('plugins', '', true, ',');\r
+       var templateFunction;\r
+\r
+       // Is it defined in any plugins\r
+       for (var i=themePlugins.length; i>=0; i--) {\r
+               templateFunction = 'TinyMCE_' + themePlugins[i] + "_execCommand";\r
+               if (eval("typeof(" + templateFunction + ")") != 'undefined') {\r
+                       if (eval(templateFunction + "(editor_id, element, command, user_interface, value);"))\r
+                               return true;\r
+               }\r
+       }\r
+\r
+       // Theme funtion\r
+       templateFunction = 'TinyMCE_' + tinyMCE.settings['theme'] + "_execCommand";\r
+       if (eval("typeof(" + templateFunction + ")") != 'undefined')\r
+               return eval(templateFunction + "(editor_id, element, command, user_interface, value);");\r
+\r
+       // Pass to normal\r
+       return false;\r
+};\r
+\r
+TinyMCE.prototype._getThemeFunction = function(suffix, skip_plugins) {\r
+       if (skip_plugins)\r
+               return 'TinyMCE_' + tinyMCE.settings['theme'] + suffix;\r
+\r
+       var themePlugins = tinyMCE.getParam('plugins', '', true, ',');\r
+       var templateFunction;\r
+\r
+       // Is it defined in any plugins\r
+       for (var i=themePlugins.length; i>=0; i--) {\r
+               templateFunction = 'TinyMCE_' + themePlugins[i] + suffix;\r
+               if (eval("typeof(" + templateFunction + ")") != 'undefined')\r
+                       return templateFunction;\r
+       }\r
+\r
+       return 'TinyMCE_' + tinyMCE.settings['theme'] + suffix;\r
+};\r
+\r
+\r
+TinyMCE.prototype.isFunc = function(func_name) {\r
+       if (func_name == null || func_name == "")\r
+               return false;\r
+\r
+       return eval("typeof(" + func_name + ")") != "undefined";\r
+};\r
+\r
+TinyMCE.prototype.exec = function(func_name, args) {\r
+       var str = func_name + '(';\r
+\r
+       // Add all arguments\r
+       for (var i=3; i<args.length; i++) {\r
+               str += 'args[' + i + ']';\r
+\r
+               if (i < args.length-1)\r
+                       str += ',';\r
+       }\r
+\r
+       str += ');';\r
+\r
+       return eval(str);\r
+};\r
+\r
+TinyMCE.prototype.executeCallback = function(param, suffix, mode) {\r
+       switch (mode) {\r
+               // No chain\r
+               case 0:\r
+                       var state = false;\r
+\r
+                       // Execute each plugin callback\r
+                       var plugins = tinyMCE.getParam('plugins', '', true, ',');\r
+                       for (var i=0; i<plugins.length; i++) {\r
+                               var func = "TinyMCE_" + plugins[i] + suffix;\r
+                               if (tinyMCE.isFunc(func)) {\r
+                                       tinyMCE.exec(func, this.executeCallback.arguments);\r
+                                       state = true;\r
+                               }\r
+                       }\r
+\r
+                       // Execute theme callback\r
+                       var func = 'TinyMCE_' + tinyMCE.settings['theme'] + suffix;\r
+                       if (tinyMCE.isFunc(func)) {\r
+                               tinyMCE.exec(func, this.executeCallback.arguments);\r
+                               state = true;\r
+                       }\r
+\r
+                       // Execute settings callback\r
+                       var func = tinyMCE.getParam(param, '');\r
+                       if (tinyMCE.isFunc(func)) {\r
+                               tinyMCE.exec(func, this.executeCallback.arguments);\r
+                               state = true;\r
+                       }\r
+\r
+                       return state;\r
+\r
+               // Chain mode\r
+               case 1:\r
+                       // Execute each plugin callback\r
+                       var plugins = tinyMCE.getParam('plugins', '', true, ',');\r
+                       for (var i=0; i<plugins.length; i++) {\r
+                               var func = "TinyMCE_" + plugins[i] + suffix;\r
+                               if (tinyMCE.isFunc(func)) {\r
+                                       if (tinyMCE.exec(func, this.executeCallback.arguments))\r
+                                               return true;\r
+                               }\r
+                       }\r
+\r
+                       // Execute theme callback\r
+                       var func = 'TinyMCE_' + tinyMCE.settings['theme'] + suffix;\r
+                       if (tinyMCE.isFunc(func)) {\r
+                               if (tinyMCE.exec(func, this.executeCallback.arguments))\r
+                                       return true;\r
+                       }\r
+\r
+                       // Execute settings callback\r
+                       var func = tinyMCE.getParam(param, '');\r
+                       if (tinyMCE.isFunc(func)) {\r
+                               if (tinyMCE.exec(func, this.executeCallback.arguments))\r
+                                       return true;\r
+                       }\r
+\r
+                       return false;\r
+       }\r
+};\r
+\r
+TinyMCE.prototype.debug = function() {\r
+       var msg = "";\r
+\r
+       var elm = document.getElementById("tinymce_debug");\r
+       if (!elm) {\r
+               var debugDiv = document.createElement("div");\r
+               debugDiv.setAttribute("className", "debugger");\r
+               debugDiv.className = "debugger";\r
+               debugDiv.innerHTML = '\\r
+                       Debug output:\\r
+                       <textarea id="tinymce_debug" style="width: 100%; height: 300px" wrap="nowrap"></textarea>';\r
+\r
+               document.body.appendChild(debugDiv);\r
+               elm = document.getElementById("tinymce_debug");\r
+       }\r
+\r
+       var args = this.debug.arguments;\r
+       for (var i=0; i<args.length; i++) {\r
+               msg += args[i];\r
+               if (i<args.length-1)\r
+                       msg += ', ';\r
+       }\r
+\r
+       elm.value += msg + "\n";\r
+};\r
+\r
+// TinyMCEControl\r
+function TinyMCEControl(settings) {\r
+       // Undo levels\r
+       this.undoLevels = new Array();\r
+       this.undoIndex = 0;\r
+       this.typingUndoIndex = -1;\r
+       this.undoRedo = true;\r
+       this.isTinyMCEControl = true;\r
+\r
+       // Default settings\r
+       this.settings = settings;\r
+       this.settings['theme'] = tinyMCE.getParam("theme", "default");\r
+       this.settings['width'] = tinyMCE.getParam("width", -1);\r
+       this.settings['height'] = tinyMCE.getParam("height", -1);\r
+};\r
+\r
+TinyMCEControl.prototype.repaint = function() {\r
+       if (tinyMCE.isMSIE && !tinyMCE.isOpera)\r
+               return;\r
+\r
+       // Ugly mozilla hack to remove ghost resize handles\r
+       try {\r
+               this.getBody().style.display = 'none';\r
+               this.getDoc().execCommand('selectall', false, null);\r
+               this.getSel().collapseToStart();\r
+               this.getBody().style.display = 'block';\r
+       } catch (ex) {\r
+               // Could I care less!!\r
+       }\r
+};\r
+\r
+TinyMCEControl.prototype.switchSettings = function() {\r
+       if (tinyMCE.configs.length > 1 && tinyMCE.currentConfig != this.settings['index']) {\r
+               tinyMCE.settings = this.settings;\r
+               tinyMCE.currentConfig = this.settings['index'];\r
+       }\r
+};\r
+\r
+TinyMCEControl.prototype.convertAllRelativeURLs = function() {\r
+       var body = this.getBody();\r
+\r
+       // Convert all image URL:s to absolute URL\r
+       var elms = body.getElementsByTagName("img");\r
+       for (var i=0; i<elms.length; i++) {\r
+               var src = tinyMCE.getAttrib(elms[i], 'src');\r
+\r
+               var msrc = tinyMCE.getAttrib(elms[i], 'mce_src');\r
+               if (msrc != "")\r
+                       src = msrc;\r
+\r
+               if (src != "") {\r
+                       src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], src);\r
+                       elms[i].setAttribute("src", src);\r
+               }\r
+       }\r
+\r
+       // Convert all link URL:s to absolute URL\r
+       var elms = body.getElementsByTagName("a");\r
+       for (var i=0; i<elms.length; i++) {\r
+               var href = tinyMCE.getAttrib(elms[i], 'href');\r
+\r
+               var mhref = tinyMCE.getAttrib(elms[i], 'mce_href');\r
+               if (mhref != "")\r
+                       href = mhref;\r
+\r
+               if (href && href != "") {\r
+                       href = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], href);\r
+                       elms[i].setAttribute("href", href);\r
+               }\r
+       }\r
+};\r
+\r
+TinyMCEControl.prototype.getSelectedHTML = function() {\r
+       if (tinyMCE.isSafari) {\r
+               // Not realy perfect!!\r
+\r
+               return this.getRng().toString();\r
+       }\r
+\r
+       var elm = document.createElement("body");\r
+\r
+       if (tinyMCE.isGecko)\r
+               elm.appendChild(this.getRng().cloneContents());\r
+       else\r
+               elm.innerHTML = this.getRng().htmlText;\r
+\r
+       return tinyMCE._cleanupHTML(this, this.contentDocument, this.settings, elm, this.visualAid);\r
+};\r
+\r
+TinyMCEControl.prototype.getBookmark = function() {\r
+       var rng = this.getRng();\r
+\r
+       if (tinyMCE.isSafari)\r
+               return rng;\r
+\r
+       if (tinyMCE.isMSIE)\r
+               return rng;\r
+\r
+       if (tinyMCE.isGecko)\r
+               return rng.cloneRange();\r
+\r
+       return null;\r
+};\r
+\r
+TinyMCEControl.prototype.moveToBookmark = function(bookmark) {\r
+       if (tinyMCE.isSafari) {\r
+               var sel = this.getSel().realSelection;\r
+\r
+               sel.setBaseAndExtent(bookmark.startContainer, bookmark.startOffset, bookmark.endContainer, bookmark.endOffset);\r
+\r
+               return true;\r
+       }\r
+\r
+       if (tinyMCE.isMSIE)\r
+               return bookmark.select();\r
+\r
+       if (tinyMCE.isGecko) {\r
+               var rng = this.getDoc().createRange();\r
+               var sel = this.getSel();\r
+\r
+               rng.setStart(bookmark.startContainer, bookmark.startOffset);\r
+               rng.setEnd(bookmark.endContainer, bookmark.endOffset);\r
+\r
+               sel.removeAllRanges();\r
+               sel.addRange(rng);\r
+\r
+               return true;\r
+       }\r
+\r
+       return false;\r
+};\r
+\r
+TinyMCEControl.prototype.getSelectedText = function() {\r
+       if (tinyMCE.isMSIE) {\r
+               var doc = this.getDoc();\r
+\r
+               if (doc.selection.type == "Text") {\r
+                       var rng = doc.selection.createRange();\r
+                       selectedText = rng.text;\r
+               } else\r
+                       selectedText = '';\r
+       } else {\r
+               var sel = this.getSel();\r
+\r
+               if (sel && sel.toString)\r
+                       selectedText = sel.toString();\r
+               else\r
+                       selectedText = '';\r
+       }\r
+\r
+       return selectedText;\r
+};\r
+\r
+TinyMCEControl.prototype.selectNode = function(node, collapse, select_text_node, to_start) {\r
+       if (!node)\r
+               return;\r
+\r
+       if (typeof(collapse) == "undefined")\r
+               collapse = true;\r
+\r
+       if (typeof(select_text_node) == "undefined")\r
+               select_text_node = false;\r
+\r
+       if (typeof(to_start) == "undefined")\r
+               to_start = true;\r
+\r
+       if (tinyMCE.isMSIE) {\r
+               var rng = this.getBody().createTextRange();\r
+\r
+               try {\r
+                       rng.moveToElementText(node);\r
+\r
+                       if (collapse)\r
+                               rng.collapse(to_start);\r
+\r
+                       rng.select();\r
+               } catch (e) {\r
+                       // Throws illigal agrument in MSIE some times\r
+               }\r
+       } else {\r
+               var sel = this.getSel();\r
+\r
+               if (!sel)\r
+                       return;\r
+\r
+               if (tinyMCE.isSafari) {\r
+                       sel.realSelection.setBaseAndExtent(node, 0, node, node.innerText.length);\r
+\r
+                       if (collapse) {\r
+                               if (to_start)\r
+                                       sel.realSelection.collapseToStart();\r
+                               else\r
+                                       sel.realSelection.collapseToEnd();\r
+                       }\r
+\r
+                       this.scrollToNode(node);\r
+\r
+                       return;\r
+               }\r
+\r
+               var rng = this.getDoc().createRange();\r
+\r
+               if (select_text_node) {\r
+                       // Find first textnode in tree\r
+                       var nodes = tinyMCE.getNodeTree(node, new Array(), 3);\r
+                       if (nodes.length > 0)\r
+                               rng.selectNodeContents(nodes[0]);\r
+                       else\r
+                               rng.selectNodeContents(node);\r
+               } else\r
+                       rng.selectNode(node);\r
+\r
+               if (collapse) {\r
+                       // Special treatment of textnode collapse\r
+                       if (!to_start && node.nodeType == 3) {\r
+                               rng.setStart(node, node.nodeValue.length);\r
+                               rng.setEnd(node, node.nodeValue.length);\r
+                       } else\r
+                               rng.collapse(to_start);\r
+               }\r
+\r
+               sel.removeAllRanges();\r
+               sel.addRange(rng);\r
+       }\r
+\r
+       this.scrollToNode(node);\r
+\r
+       // Set selected element\r
+       tinyMCE.selectedElement = null;\r
+       if (node.nodeType == 1)\r
+               tinyMCE.selectedElement = node;\r
+};\r
+\r
+TinyMCEControl.prototype.scrollToNode = function(node) {\r
+       // Scroll to node position\r
+       var pos = tinyMCE.getAbsPosition(node);\r
+       var doc = this.getDoc();\r
+       var scrollX = doc.body.scrollLeft + doc.documentElement.scrollLeft;\r
+       var scrollY = doc.body.scrollTop + doc.documentElement.scrollTop;\r
+       var height = tinyMCE.isMSIE ? document.getElementById(this.editorId).style.pixelHeight : this.targetElement.clientHeight;\r
+\r
+       // Only scroll if out of visible area\r
+       if (!tinyMCE.settings['auto_resize'] && !(pos.absTop > scrollY && pos.absTop < (scrollY - 25 + height)))\r
+               this.contentWindow.scrollTo(pos.absLeft, pos.absTop - height + 25); \r
+};\r
+\r
+TinyMCEControl.prototype.getBody = function() {\r
+       return this.getDoc().body;\r
+};\r
+\r
+TinyMCEControl.prototype.getDoc = function() {\r
+       return this.contentWindow.document;\r
+};\r
+\r
+TinyMCEControl.prototype.getWin = function() {\r
+       return this.contentWindow;\r
+};\r
+\r
+TinyMCEControl.prototype.getSel = function() {\r
+       if (tinyMCE.isMSIE && !tinyMCE.isOpera)\r
+               return this.getDoc().selection;\r
+\r
+       var sel = this.contentWindow.getSelection();\r
+\r
+       // Fake getRangeAt\r
+       if (tinyMCE.isSafari && !sel.getRangeAt) {\r
+               var newSel = new Object();\r
+               var doc = this.getDoc();\r
+\r
+               function getRangeAt(idx) {\r
+                       var rng = new Object();\r
+\r
+                       rng.startContainer = this.focusNode;\r
+                       rng.endContainer = this.anchorNode;\r
+                       rng.commonAncestorContainer = this.focusNode;\r
+                       rng.createContextualFragment = function (html) {\r
+                               // Seems to be a tag\r
+                               if (html.charAt(0) == '<') {\r
+                                       var elm = doc.createElement("div");\r
+\r
+                                       elm.innerHTML = html;\r
+\r
+                                       return elm.firstChild;\r
+                               }\r
+\r
+                               return doc.createTextNode("UNSUPPORTED, DUE TO LIMITATIONS IN SAFARI!");\r
+                       };\r
+\r
+                       rng.deleteContents = function () {\r
+                               doc.execCommand("Delete", false, "");\r
+                       };\r
+\r
+                       return rng;\r
+               }\r
+\r
+               // Patch selection\r
+\r
+               newSel.focusNode = sel.baseNode;\r
+               newSel.focusOffset = sel.baseOffset;\r
+               newSel.anchorNode = sel.extentNode;\r
+               newSel.anchorOffset = sel.extentOffset;\r
+               newSel.getRangeAt = getRangeAt;\r
+               newSel.text = "" + sel;\r
+               newSel.realSelection = sel;\r
+\r
+               newSel.toString = function () {return this.text;};\r
+\r
+               return newSel;\r
+       }\r
+\r
+       return sel;\r
+};\r
+\r
+TinyMCEControl.prototype.getRng = function() {\r
+       var sel = this.getSel();\r
+       if (sel == null)\r
+               return null;\r
+\r
+       if (tinyMCE.isMSIE && !tinyMCE.isOpera)\r
+               return sel.createRange();\r
+\r
+       if (tinyMCE.isSafari) {\r
+               var rng = this.getDoc().createRange();\r
+               var sel = this.getSel().realSelection;\r
+\r
+               rng.setStart(sel.baseNode, sel.baseOffset);\r
+               rng.setEnd(sel.extentNode, sel.extentOffset);\r
+\r
+               return rng;\r
+       }\r
+\r
+       return this.getSel().getRangeAt(0);\r
+};\r
+\r
+TinyMCEControl.prototype._insertPara = function(e) {\r
+       function isEmpty(para) {\r
+               function isEmptyHTML(html) {\r
+                       return html.replace(new RegExp('[ \t\r\n]+', 'g'), '').toLowerCase() == "";\r
+               }\r
+\r
+               // Check for images\r
+               if (para.getElementsByTagName("img").length > 0)\r
+                       return false;\r
+\r
+               // Check for tables\r
+               if (para.getElementsByTagName("table").length > 0)\r
+                       return false;\r
+\r
+               // Check for HRs\r
+               if (para.getElementsByTagName("hr").length > 0)\r
+                       return false;\r
+\r
+               // Check all textnodes\r
+               var nodes = tinyMCE.getNodeTree(para, new Array(), 3);\r
+               for (var i=0; i<nodes.length; i++) {\r
+                       if (!isEmptyHTML(nodes[i].nodeValue))\r
+                               return false;\r
+               }\r
+\r
+               // No images, no tables, no hrs, no text content then it's empty\r
+               return true;\r
+       }\r
+\r
+       var doc = this.getDoc();\r
+       var sel = this.getSel();\r
+       var win = this.contentWindow;\r
+       var rng = sel.getRangeAt(0);\r
+       var body = doc.body;\r
+       var rootElm = doc.documentElement;\r
+       var self = this;\r
+       var blockName = "P";\r
+\r
+//     tinyMCE.debug(body.innerHTML);\r
+\r
+//     debug(e.target, sel.anchorNode.nodeName, sel.focusNode.nodeName, rng.startContainer, rng.endContainer, rng.commonAncestorContainer, sel.anchorOffset, sel.focusOffset, rng.toString());\r
+\r
+       // Setup before range\r
+       var rngBefore = doc.createRange();\r
+       rngBefore.setStart(sel.anchorNode, sel.anchorOffset);\r
+       rngBefore.collapse(true);\r
+\r
+       // Setup after range\r
+       var rngAfter = doc.createRange();\r
+       rngAfter.setStart(sel.focusNode, sel.focusOffset);\r
+       rngAfter.collapse(true);\r
+\r
+       // Setup start/end points\r
+       var direct = rngBefore.compareBoundaryPoints(rngBefore.START_TO_END, rngAfter) < 0;\r
+       var startNode = direct ? sel.anchorNode : sel.focusNode;\r
+       var startOffset = direct ? sel.anchorOffset : sel.focusOffset;\r
+       var endNode = direct ? sel.focusNode : sel.anchorNode;\r
+       var endOffset = direct ? sel.focusOffset : sel.anchorOffset;\r
+\r
+       startNode = startNode.nodeName == "BODY" ? startNode.firstChild : startNode;\r
+       endNode = endNode.nodeName == "BODY" ? endNode.firstChild : endNode;\r
+\r
+       // tinyMCE.debug(startNode, endNode);\r
+\r
+       // Get block elements\r
+       var startBlock = tinyMCE.getParentBlockElement(startNode);\r
+       var endBlock = tinyMCE.getParentBlockElement(endNode);\r
+\r
+       // Use current block name\r
+       if (startBlock != null) {\r
+               blockName = startBlock.nodeName;\r
+\r
+               // Use P instead\r
+               if (blockName == "TD" || blockName == "TABLE" || (blockName == "DIV" && new RegExp('left|right', 'gi').test(startBlock.style.cssFloat)))\r
+                       blockName = "P";\r
+       }\r
+\r
+       // Within a list use normal behaviour\r
+       if (tinyMCE.getParentElement(startBlock, "OL,UL") != null)\r
+               return false;\r
+\r
+       // Within a table create new paragraphs\r
+       if ((startBlock != null && startBlock.nodeName == "TABLE") || (endBlock != null && endBlock.nodeName == "TABLE"))\r
+               startBlock = endBlock = null;\r
+\r
+       // Setup new paragraphs\r
+       var paraBefore = (startBlock != null && startBlock.nodeName == blockName) ? startBlock.cloneNode(false) : doc.createElement(blockName);\r
+       var paraAfter = (endBlock != null && endBlock.nodeName == blockName) ? endBlock.cloneNode(false) : doc.createElement(blockName);\r
+\r
+       // Is header, then force paragraph under\r
+       if (/^(H[1-6])$/.test(blockName))\r
+               paraAfter = doc.createElement("p");\r
+\r
+       // Setup chop nodes\r
+       var startChop = startNode;\r
+       var endChop = endNode;\r
+\r
+       // Get startChop node\r
+       node = startChop;\r
+       do {\r
+               if (node == body || node.nodeType == 9 || tinyMCE.isBlockElement(node))\r
+                       break;\r
+\r
+               startChop = node;\r
+       } while ((node = node.previousSibling ? node.previousSibling : node.parentNode));\r
+\r
+       // Get endChop node\r
+       node = endChop;\r
+       do {\r
+               if (node == body || node.nodeType == 9 || tinyMCE.isBlockElement(node))\r
+                       break;\r
+\r
+               endChop = node;\r
+       } while ((node = node.nextSibling ? node.nextSibling : node.parentNode));\r
+\r
+       // Fix when only a image is within the TD\r
+       if (startChop.nodeName == "TD")\r
+               startChop = startChop.firstChild;\r
+\r
+       if (endChop.nodeName == "TD")\r
+               endChop = endChop.lastChild;\r
+\r
+       // If not in a block element\r
+       if (startBlock == null) {\r
+               // Delete selection\r
+               rng.deleteContents();\r
+               sel.removeAllRanges();\r
+\r
+               if (startChop != rootElm && endChop != rootElm) {\r
+                       // Insert paragraph before\r
+                       rngBefore = rng.cloneRange();\r
+\r
+                       if (startChop == body)\r
+                               rngBefore.setStart(startChop, 0);\r
+                       else\r
+                               rngBefore.setStartBefore(startChop);\r
+\r
+                       paraBefore.appendChild(rngBefore.cloneContents());\r
+\r
+                       // Insert paragraph after\r
+                       if (endChop.parentNode.nodeName == blockName)\r
+                               endChop = endChop.parentNode;\r
+\r
+                       // If not after image\r
+                       //if (rng.startContainer.nodeName != "BODY" && rng.endContainer.nodeName != "BODY")\r
+                               rng.setEndAfter(endChop);\r
+\r
+                       if (endChop.nodeName != "#text" && endChop.nodeName != "BODY")\r
+                               rngBefore.setEndAfter(endChop);\r
+\r
+                       var contents = rng.cloneContents();\r
+                       if (contents.firstChild && (contents.firstChild.nodeName == blockName || contents.firstChild.nodeName == "BODY"))\r
+                               paraAfter.innerHTML = contents.firstChild.innerHTML;\r
+                       else\r
+                               paraAfter.appendChild(contents);\r
+\r
+                       // Check if it's a empty paragraph\r
+                       if (isEmpty(paraBefore))\r
+                               paraBefore.innerHTML = "&nbsp;";\r
+\r
+                       // Check if it's a empty paragraph\r
+                       if (isEmpty(paraAfter))\r
+                               paraAfter.innerHTML = "&nbsp;";\r
+\r
+                       // Delete old contents\r
+                       rng.deleteContents();\r
+                       rngAfter.deleteContents();\r
+                       rngBefore.deleteContents();\r
+\r
+                       // Insert new paragraphs\r
+                       paraAfter.normalize();\r
+                       rngBefore.insertNode(paraAfter);\r
+                       paraBefore.normalize();\r
+                       rngBefore.insertNode(paraBefore);\r
+\r
+                       // tinyMCE.debug("1: ", paraBefore.innerHTML, paraAfter.innerHTML);\r
+               } else {\r
+                       body.innerHTML = "<" + blockName + ">&nbsp;</" + blockName + "><" + blockName + ">&nbsp;</" + blockName + ">";\r
+                       paraAfter = body.childNodes[1];\r
+               }\r
+\r
+               this.selectNode(paraAfter, true, true);\r
+\r
+               return true;\r
+       }\r
+\r
+       // Place first part within new paragraph\r
+       if (startChop.nodeName == blockName)\r
+               rngBefore.setStart(startChop, 0);\r
+       else\r
+               rngBefore.setStartBefore(startChop);\r
+\r
+       rngBefore.setEnd(startNode, startOffset);\r
+       paraBefore.appendChild(rngBefore.cloneContents());\r
+\r
+       // Place secound part within new paragraph\r
+       rngAfter.setEndAfter(endChop);\r
+       rngAfter.setStart(endNode, endOffset);\r
+       var contents = rngAfter.cloneContents();\r
+\r
+       if (contents.firstChild && contents.firstChild.nodeName == blockName) {\r
+/*             var nodes = contents.firstChild.childNodes;\r
+               for (var i=0; i<nodes.length; i++) {\r
+                       //tinyMCE.debug(nodes[i].nodeName);\r
+                       if (nodes[i].nodeName != "BODY")\r
+                               paraAfter.appendChild(nodes[i]);\r
+               }\r
+*/\r
+               paraAfter.innerHTML = contents.firstChild.innerHTML;\r
+       } else\r
+               paraAfter.appendChild(contents);\r
+\r
+       // Check if it's a empty paragraph\r
+       if (isEmpty(paraBefore))\r
+               paraBefore.innerHTML = "&nbsp;";\r
+\r
+       // Check if it's a empty paragraph\r
+       if (isEmpty(paraAfter))\r
+               paraAfter.innerHTML = "&nbsp;";\r
+\r
+       // Create a range around everything\r
+       var rng = doc.createRange();\r
+\r
+       if (!startChop.previousSibling && startChop.parentNode.nodeName.toUpperCase() == blockName) {\r
+               rng.setStartBefore(startChop.parentNode);\r
+       } else {\r
+               if (rngBefore.startContainer.nodeName.toUpperCase() == blockName && rngBefore.startOffset == 0)\r
+                       rng.setStartBefore(rngBefore.startContainer);\r
+               else\r
+                       rng.setStart(rngBefore.startContainer, rngBefore.startOffset);\r
+       }\r
+\r
+       if (!endChop.nextSibling && endChop.parentNode.nodeName.toUpperCase() == blockName)\r
+               rng.setEndAfter(endChop.parentNode);\r
+       else\r
+               rng.setEnd(rngAfter.endContainer, rngAfter.endOffset);\r
+\r
+       // Delete all contents and insert new paragraphs\r
+       rng.deleteContents();\r
+       rng.insertNode(paraAfter);\r
+       rng.insertNode(paraBefore);\r
+       //tinyMCE.debug("2", paraBefore.innerHTML, paraAfter.innerHTML);\r
+\r
+       // Normalize\r
+       paraAfter.normalize();\r
+       paraBefore.normalize();\r
+\r
+       this.selectNode(paraAfter, true, true);\r
+\r
+       return true;\r
+};\r
+\r
+TinyMCEControl.prototype._handleBackSpace = function(evt_type) {\r
+       var doc = this.getDoc();\r
+       var sel = this.getSel();\r
+       if (sel == null)\r
+               return false;\r
+\r
+       var rng = sel.getRangeAt(0);\r
+       var node = rng.startContainer;\r
+       var elm = node.nodeType == 3 ? node.parentNode : node;\r
+\r
+       if (node == null)\r
+               return;\r
+\r
+       // Empty node, wrap contents in paragraph\r
+       if (elm && elm.nodeName == "") {\r
+               var para = doc.createElement("p");\r
+\r
+               while (elm.firstChild)\r
+                       para.appendChild(elm.firstChild);\r
+\r
+               elm.parentNode.insertBefore(para, elm);\r
+               elm.parentNode.removeChild(elm);\r
+\r
+               var rng = rng.cloneRange();\r
+               rng.setStartBefore(node.nextSibling);\r
+               rng.setEndAfter(node.nextSibling);\r
+               rng.extractContents();\r
+\r
+               this.selectNode(node.nextSibling, true, true);\r
+       }\r
+\r
+       // Remove empty paragraphs\r
+       var para = tinyMCE.getParentBlockElement(node);\r
+       if (para != null && para.nodeName.toLowerCase() == 'p' && evt_type == "keypress") {\r
+               var htm = para.innerHTML;\r
+               var block = tinyMCE.getParentBlockElement(node);\r
+\r
+               // Empty node, we do the killing!!\r
+               if (htm == "" || htm == "&nbsp;" || block.nodeName.toLowerCase() == "li") {\r
+                       var prevElm = para.previousSibling;\r
+\r
+                       while (prevElm != null && prevElm.nodeType != 1)\r
+                               prevElm = prevElm.previousSibling;\r
+\r
+                       if (prevElm == null)\r
+                               return false;\r
+\r
+                       // Get previous elements last text node\r
+                       var nodes = tinyMCE.getNodeTree(prevElm, new Array(), 3);\r
+                       var lastTextNode = nodes.length == 0 ? null : nodes[nodes.length-1];\r
+\r
+                       // Select the last text node and move curstor to end\r
+                       if (lastTextNode != null)\r
+                               this.selectNode(lastTextNode, true, false, false);\r
+\r
+                       // Remove the empty paragrapsh\r
+                       para.parentNode.removeChild(para);\r
+\r
+                       //debug("within p element" + para.innerHTML);\r
+                       //showHTML(this.getBody().innerHTML);\r
+                       return true;\r
+               }\r
+       }\r
+\r
+       // Remove BR elements\r
+/*     while (node != null && (node = node.nextSibling) != null) {\r
+               if (node.nodeName.toLowerCase() == 'br')\r
+                       node.parentNode.removeChild(node);\r
+               else if (node.nodeType == 1) // Break at other element\r
+                       break;\r
+       }*/\r
+\r
+       //showHTML(this.getBody().innerHTML);\r
+\r
+       return false;\r
+};\r
+\r
+TinyMCEControl.prototype._insertSpace = function() {\r
+       return true;\r
+};\r
+\r
+TinyMCEControl.prototype.autoResetDesignMode = function() {\r
+       // Add fix for tab/style.display none/block problems in Gecko\r
+       if (!tinyMCE.isMSIE && tinyMCE.settings['auto_reset_designmode'] && this.isHidden())\r
+               eval('try { this.getDoc().designMode = "On"; } catch(e) {}');\r
+};\r
+\r
+TinyMCEControl.prototype.isHidden = function() {\r
+       if (tinyMCE.isMSIE)\r
+               return false;\r
+\r
+       var sel = this.getSel();\r
+\r
+       // Weird, wheres that cursor selection?\r
+       return (!sel || !sel.rangeCount || sel.rangeCount == 0);\r
+};\r
+\r
+TinyMCEControl.prototype.isDirty = function() {\r
+       // Is content modified and not in a submit procedure\r
+       return this.startContent != tinyMCE.trim(this.getBody().innerHTML) && !tinyMCE.isNotDirty;\r
+};\r
+\r
+TinyMCEControl.prototype._mergeElements = function(scmd, pa, ch, override) {\r
+       if (scmd == "removeformat") {\r
+               pa.className = "";\r
+               pa.style.cssText = "";\r
+               ch.className = "";\r
+               ch.style.cssText = "";\r
+               return;\r
+       }\r
+\r
+       var st = tinyMCE.parseStyle(tinyMCE.getAttrib(pa, "style"));\r
+       var stc = tinyMCE.parseStyle(tinyMCE.getAttrib(ch, "style"));\r
+       var className = tinyMCE.getAttrib(pa, "class");\r
+\r
+       className += " " + tinyMCE.getAttrib(ch, "class");\r
+\r
+       if (override) {\r
+               for (var n in st) {\r
+                       if (typeof(st[n]) == 'function')\r
+                               continue;\r
+\r
+                       stc[n] = st[n];\r
+               }\r
+       } else {\r
+               for (var n in stc) {\r
+                       if (typeof(stc[n]) == 'function')\r
+                               continue;\r
+\r
+                       st[n] = stc[n];\r
+               }\r
+       }\r
+\r
+       tinyMCE.setAttrib(pa, "style", tinyMCE.serializeStyle(st));\r
+       tinyMCE.setAttrib(pa, "class", tinyMCE.trim(className));\r
+       ch.className = "";\r
+       ch.style.cssText = "";\r
+       ch.removeAttribute("class");\r
+       ch.removeAttribute("style");\r
+};\r
+\r
+TinyMCEControl.prototype.setUseCSS = function(b) {\r
+       var doc = this.getDoc();\r
+       try {doc.execCommand("useCSS", false, !b);} catch (ex) {}\r
+       try {doc.execCommand("styleWithCSS", false, b);} catch (ex) {}\r
+\r
+       if (!tinyMCE.getParam("table_inline_editing"))\r
+               try {doc.execCommand('enableInlineTableEditing', false, "false");} catch (ex) {}\r
+\r
+       if (!tinyMCE.getParam("object_resizing"))\r
+               try {doc.execCommand('enableObjectResizing', false, "false");} catch (ex) {}\r
+};\r
+\r
+TinyMCEControl.prototype.execCommand = function(command, user_interface, value) {\r
+       var doc = this.getDoc();\r
+       var win = this.getWin();\r
+       var focusElm = this.getFocusElement();\r
+\r
+       if (this.lastSafariSelection && !new RegExp('mceStartTyping|mceEndTyping|mceBeginUndoLevel|mceEndUndoLevel|mceAddUndoLevel', 'gi').test(command)) {\r
+               this.moveToBookmark(this.lastSafariSelection);\r
+               tinyMCE.selectedElement = this.lastSafariSelectedElement;\r
+       }\r
+\r
+       // Mozilla issue\r
+       if (!tinyMCE.isMSIE && !this.useCSS) {\r
+               this.setUseCSS(false);\r
+               this.useCSS = true;\r
+       }\r
+\r
+       //debug("command: " + command + ", user_interface: " + user_interface + ", value: " + value);\r
+       this.contentDocument = doc; // <-- Strange, unless this is applied Mozilla 1.3 breaks\r
+\r
+       // Call theme execcommand\r
+       if (tinyMCE._themeExecCommand(this.editorId, this.getBody(), command, user_interface, value))\r
+               return;\r
+\r
+       // Fix align on images\r
+       if (focusElm && focusElm.nodeName == "IMG") {\r
+               var align = focusElm.getAttribute('align');\r
+               var img = command == "JustifyCenter" ? focusElm.cloneNode(false) : focusElm;\r
+\r
+               switch (command) {\r
+                       case "JustifyLeft":\r
+                               if (align == 'left')\r
+                                       img.removeAttribute('align');\r
+                               else\r
+                                       img.setAttribute('align', 'left');\r
+\r
+                               // Remove the div\r
+                               var div = focusElm.parentNode;\r
+                               if (div && div.nodeName == "DIV" && div.childNodes.length == 1 && div.parentNode)\r
+                                       div.parentNode.replaceChild(img, div);\r
+\r
+                               this.selectNode(img);\r
+                               this.repaint();\r
+                               tinyMCE.triggerNodeChange();\r
+                               return;\r
+\r
+                       case "JustifyCenter":\r
+                               img.removeAttribute('align');\r
+\r
+                               // Is centered\r
+                               var div = tinyMCE.getParentElement(focusElm, "div");\r
+                               if (div && div.style.textAlign == "center") {\r
+                                       // Remove div\r
+                                       if (div.nodeName == "DIV" && div.childNodes.length == 1 && div.parentNode)\r
+                                               div.parentNode.replaceChild(img, div);\r
+                               } else {\r
+                                       // Add div\r
+                                       var div = this.getDoc().createElement("div");\r
+                                       div.style.textAlign = 'center';\r
+                                       div.appendChild(img);\r
+                                       focusElm.parentNode.replaceChild(div, focusElm);\r
+                               }\r
+\r
+                               this.selectNode(img);\r
+                               this.repaint();\r
+                               tinyMCE.triggerNodeChange();\r
+                               return;\r
+\r
+                       case "JustifyRight":\r
+                               if (align == 'right')\r
+                                       img.removeAttribute('align');\r
+                               else\r
+                                       img.setAttribute('align', 'right');\r
+\r
+                               // Remove the div\r
+                               var div = focusElm.parentNode;\r
+                               if (div && div.nodeName == "DIV" && div.childNodes.length == 1 && div.parentNode)\r
+                                       div.parentNode.replaceChild(img, div);\r
+\r
+                               this.selectNode(img);\r
+                               this.repaint();\r
+                               tinyMCE.triggerNodeChange();\r
+                               return;\r
+               }\r
+       }\r
+\r
+       if (tinyMCE.settings['force_br_newlines']) {\r
+               var alignValue = "";\r
+\r
+               if (doc.selection.type != "Control") {\r
+                       switch (command) {\r
+                                       case "JustifyLeft":\r
+                                               alignValue = "left";\r
+                                               break;\r
+\r
+                                       case "JustifyCenter":\r
+                                               alignValue = "center";\r
+                                               break;\r
+\r
+                                       case "JustifyFull":\r
+                                               alignValue = "justify";\r
+                                               break;\r
+\r
+                                       case "JustifyRight":\r
+                                               alignValue = "right";\r
+                                               break;\r
+                       }\r
+\r
+                       if (alignValue != "") {\r
+                               var rng = doc.selection.createRange();\r
+\r
+                               if ((divElm = tinyMCE.getParentElement(rng.parentElement(), "div")) != null)\r
+                                       divElm.setAttribute("align", alignValue);\r
+                               else if (rng.pasteHTML && rng.htmlText.length > 0)\r
+                                       rng.pasteHTML('<div align="' + alignValue + '">' + rng.htmlText + "</div>");\r
+\r
+                               tinyMCE.triggerNodeChange();\r
+                               return;\r
+                       }\r
+               }\r
+       }\r
+\r
+       switch (command) {\r
+               case "mceRepaint":\r
+                       this.repaint();\r
+                       return true;\r
+\r
+               case "mceStoreSelection":\r
+                       this.selectionBookmark = this.getBookmark();\r
+                       return true;\r
+\r
+               case "mceRestoreSelection":\r
+                       this.moveToBookmark(this.selectionBookmark);\r
+                       return true;\r
+\r
+               case "InsertUnorderedList":\r
+               case "InsertOrderedList":\r
+                       var tag = (command == "InsertUnorderedList") ? "ul" : "ol";\r
+\r
+                       if (tinyMCE.isSafari)\r
+                               this.execCommand("mceInsertContent", false, "<" + tag + "><li>&nbsp;</li><" + tag + ">");\r
+                       else\r
+                               this.getDoc().execCommand(command, user_interface, value);\r
+\r
+                       tinyMCE.triggerNodeChange();\r
+                       break;\r
+\r
+               case "Strikethrough":\r
+                       if (tinyMCE.isSafari)\r
+                               this.execCommand("mceInsertContent", false, "<strike>" + this.getSelectedHTML() + "</strike>");\r
+                       else\r
+                               this.getDoc().execCommand(command, user_interface, value);\r
+\r
+                       tinyMCE.triggerNodeChange();\r
+                       break;\r
+\r
+               case "mceSelectNode":\r
+                       this.selectNode(value);\r
+                       tinyMCE.triggerNodeChange();\r
+                       tinyMCE.selectedNode = value;\r
+                       break;\r
+\r
+               case "FormatBlock":\r
+                       if (value == null || value == "") {\r
+                               var elm = tinyMCE.getParentElement(this.getFocusElement(), "p,div,h1,h2,h3,h4,h5,h6,pre,address");\r
+\r
+                               if (elm)\r
+                                       this.execCommand("mceRemoveNode", false, elm);\r
+                       } else\r
+                               this.getDoc().execCommand("FormatBlock", false, value);\r
+\r
+                       tinyMCE.triggerNodeChange();\r
+\r
+                       break;\r
+\r
+               case "mceRemoveNode":\r
+                       if (!value)\r
+                               value = tinyMCE.getParentElement(this.getFocusElement());\r
+\r
+                       if (tinyMCE.isMSIE) {\r
+                               value.outerHTML = value.innerHTML;\r
+                       } else {\r
+                               var rng = value.ownerDocument.createRange();\r
+                               rng.setStartBefore(value);\r
+                               rng.setEndAfter(value);\r
+                               rng.deleteContents();\r
+                               rng.insertNode(rng.createContextualFragment(value.innerHTML));\r
+                       }\r
+\r
+                       tinyMCE.triggerNodeChange();\r
+\r
+                       break;\r
+\r
+               case "mceSelectNodeDepth":\r
+                       var parentNode = this.getFocusElement();\r
+                       for (var i=0; parentNode; i++) {\r
+                               if (parentNode.nodeName.toLowerCase() == "body")\r
+                                       break;\r
+\r
+                               if (parentNode.nodeName.toLowerCase() == "#text") {\r
+                                       i--;\r
+                                       parentNode = parentNode.parentNode;\r
+                                       continue;\r
+                               }\r
+\r
+                               if (i == value) {\r
+                                       this.selectNode(parentNode, false);\r
+                                       tinyMCE.triggerNodeChange();\r
+                                       tinyMCE.selectedNode = parentNode;\r
+                                       return;\r
+                               }\r
+\r
+                               parentNode = parentNode.parentNode;\r
+                       }\r
+\r
+                       break;\r
+\r
+               case "SetStyleInfo":\r
+                       var rng = this.getRng();\r
+                       var sel = this.getSel();\r
+                       var scmd = value['command'];\r
+                       var sname = value['name'];\r
+                       var svalue = value['value'] == null ? '' : value['value'];\r
+                       //var svalue = value['value'] == null ? '' : value['value'];\r
+                       var wrapper = value['wrapper'] ? value['wrapper'] : "span";\r
+                       var parentElm = null;\r
+                       var invalidRe = new RegExp("^BODY|HTML$", "g");\r
+                       var invalidParentsRe = tinyMCE.settings['merge_styles_invalid_parents'] != '' ? new RegExp(tinyMCE.settings['merge_styles_invalid_parents'], "gi") : null;\r
+\r
+                       // Whole element selected check\r
+                       if (tinyMCE.isMSIE) {\r
+                               // Control range\r
+                               if (rng.item)\r
+                                       parentElm = rng.item(0);\r
+                               else {\r
+                                       var pelm = rng.parentElement();\r
+                                       var prng = doc.selection.createRange();\r
+                                       prng.moveToElementText(pelm);\r
+\r
+                                       if (rng.htmlText == prng.htmlText || rng.boundingWidth == 0) {\r
+                                               if (invalidParentsRe == null || !invalidParentsRe.test(pelm.nodeName))\r
+                                                       parentElm = pelm;\r
+                                       }\r
+                               }\r
+                       } else {\r
+                               var felm = this.getFocusElement();\r
+                               if (sel.isCollapsed || (/td|tr|tbody|table/ig.test(felm.nodeName) && sel.anchorNode == felm.parentNode))\r
+                                       parentElm = felm;\r
+                       }\r
+\r
+                       // Whole element selected\r
+                       if (parentElm && !invalidRe.test(parentElm.nodeName)) {\r
+                               if (scmd == "setstyle")\r
+                                       tinyMCE.setStyleAttrib(parentElm, sname, svalue);\r
+\r
+                               if (scmd == "setattrib")\r
+                                       tinyMCE.setAttrib(parentElm, sname, svalue);\r
+\r
+                               if (scmd == "removeformat") {\r
+                                       parentElm.style.cssText = '';\r
+                                       tinyMCE.setAttrib(parentElm, 'class', '');\r
+                               }\r
+\r
+                               // Remove style/attribs from all children\r
+                               var ch = tinyMCE.getNodeTree(parentElm, new Array(), 1);\r
+                               for (var z=0; z<ch.length; z++) {\r
+                                       if (ch[z] == parentElm)\r
+                                               continue;\r
+\r
+                                       if (scmd == "setstyle")\r
+                                               tinyMCE.setStyleAttrib(ch[z], sname, '');\r
+\r
+                                       if (scmd == "setattrib")\r
+                                               tinyMCE.setAttrib(ch[z], sname, '');\r
+\r
+                                       if (scmd == "removeformat") {\r
+                                               ch[z].style.cssText = '';\r
+                                               tinyMCE.setAttrib(ch[z], 'class', '');\r
+                                       }\r
+                               }\r
+                       } else {\r
+                               doc.execCommand("fontname", false, "#mce_temp_font#");\r
+                               var elementArray = tinyMCE.getElementsByAttributeValue(this.getBody(), "font", "face", "#mce_temp_font#");\r
+\r
+                               // Change them all\r
+                               for (var x=0; x<elementArray.length; x++) {\r
+                                       elm = elementArray[x];\r
+                                       if (elm) {\r
+                                               var spanElm = doc.createElement(wrapper);\r
+\r
+                                               if (scmd == "setstyle")\r
+                                                       tinyMCE.setStyleAttrib(spanElm, sname, svalue);\r
+\r
+                                               if (scmd == "setattrib")\r
+                                                       tinyMCE.setAttrib(spanElm, sname, svalue);\r
+\r
+                                               if (scmd == "removeformat") {\r
+                                                       spanElm.style.cssText = '';\r
+                                                       tinyMCE.setAttrib(spanElm, 'class', '');\r
+                                               }\r
+\r
+                                               if (elm.hasChildNodes()) {\r
+                                                       for (var i=0; i<elm.childNodes.length; i++)\r
+                                                               spanElm.appendChild(elm.childNodes[i].cloneNode(true));\r
+                                               }\r
+\r
+                                               spanElm.setAttribute("mce_new", "true");\r
+                                               elm.parentNode.replaceChild(spanElm, elm);\r
+\r
+                                               // Remove style/attribs from all children\r
+                                               var ch = tinyMCE.getNodeTree(spanElm, new Array(), 1);\r
+                                               for (var z=0; z<ch.length; z++) {\r
+                                                       if (ch[z] == spanElm)\r
+                                                               continue;\r
+\r
+                                                       if (scmd == "setstyle")\r
+                                                               tinyMCE.setStyleAttrib(ch[z], sname, '');\r
+\r
+                                                       if (scmd == "setattrib")\r
+                                                               tinyMCE.setAttrib(ch[z], sname, '');\r
+\r
+                                                       if (scmd == "removeformat") {\r
+                                                               ch[z].style.cssText = '';\r
+                                                               tinyMCE.setAttrib(ch[z], 'class', '');\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       // Cleaup wrappers\r
+                       var nodes = doc.getElementsByTagName(wrapper);\r
+                       for (var i=nodes.length-1; i>=0; i--) {\r
+                               var elm = nodes[i];\r
+                               var isNew = tinyMCE.getAttrib(elm, "mce_new") == "true";\r
+\r
+                               elm.removeAttribute("mce_new");\r
+\r
+                               // Is only child a element\r
+                               if (elm.childNodes && elm.childNodes.length == 1 && elm.childNodes[0].nodeType == 1) {\r
+                                       //tinyMCE.debug("merge1" + isNew);\r
+                                       this._mergeElements(scmd, elm, elm.childNodes[0], isNew);\r
+                                       continue;\r
+                               }\r
+\r
+                               // Is I the only child\r
+                               if (elm.parentNode.childNodes.length == 1 && !invalidRe.test(elm.nodeName) && !invalidRe.test(elm.parentNode.nodeName)) {\r
+                                       //tinyMCE.debug("merge2" + isNew + "," + elm.nodeName + "," + elm.parentNode.nodeName);\r
+                                       if (invalidParentsRe == null || !invalidParentsRe.test(elm.parentNode.nodeName))\r
+                                               this._mergeElements(scmd, elm.parentNode, elm, false);\r
+                               }\r
+                       }\r
+\r
+                       // Remove empty wrappers\r
+                       var nodes = doc.getElementsByTagName(wrapper);\r
+                       for (var i=nodes.length-1; i>=0; i--) {\r
+                               var elm = nodes[i];\r
+                               var isEmpty = true;\r
+\r
+                               // Check if it has any attribs\r
+                               var tmp = doc.createElement("body");\r
+                               tmp.appendChild(elm.cloneNode(false));\r
+\r
+                               // Is empty span, remove it\r
+                               tmp.innerHTML = tmp.innerHTML.replace(new RegExp('style=""|class=""', 'gi'), '');\r
+                               //tinyMCE.debug(tmp.innerHTML);\r
+                               if (new RegExp('<span>', 'gi').test(tmp.innerHTML)) {\r
+                                       for (var x=0; x<elm.childNodes.length; x++) {\r
+                                               if (elm.parentNode != null)\r
+                                                       elm.parentNode.insertBefore(elm.childNodes[x].cloneNode(true), elm);\r
+                                       }\r
+\r
+                                       elm.parentNode.removeChild(elm);\r
+                               }\r
+                       }\r
+\r
+                       // Re add the visual aids\r
+                       if (scmd == "removeformat")\r
+                               tinyMCE.handleVisualAid(this.getBody(), true, this.visualAid, this);\r
+\r
+                       tinyMCE.triggerNodeChange();\r
+\r
+                       break;\r
+\r
+               case "FontName":\r
+                       if (value == null) {\r
+                               var s = this.getSel();\r
+\r
+                               // Find font and select it\r
+                               if (tinyMCE.isGecko && s.isCollapsed) {\r
+                                       var f = tinyMCE.getParentElement(this.getFocusElement(), "font");\r
+\r
+                                       if (f != null)\r
+                                               this.selectNode(f, false);\r
+                               }\r
+\r
+                               // Remove format\r
+                               this.getDoc().execCommand("RemoveFormat", false, null);\r
+\r
+                               // Collapse range if font was found\r
+                               if (f != null && tinyMCE.isGecko) {\r
+                                       var r = this.getRng().cloneRange();\r
+                                       r.collapse(true);\r
+                                       s.removeAllRanges();\r
+                                       s.addRange(r);\r
+                               }\r
+                       } else\r
+                               this.getDoc().execCommand('FontName', false, value);\r
+\r
+                       if (tinyMCE.isGecko)\r
+                               window.setTimeout('tinyMCE.triggerNodeChange(false);', 1);\r
+\r
+                       return;\r
+\r
+               case "FontSize":\r
+                       this.getDoc().execCommand('FontSize', false, value);\r
+\r
+                       if (tinyMCE.isGecko)\r
+                               window.setTimeout('tinyMCE.triggerNodeChange(false);', 1);\r
+\r
+                       return;\r
+\r
+               case "forecolor":\r
+                       this.getDoc().execCommand('forecolor', false, value);\r
+                       break;\r
+\r
+               case "HiliteColor":\r
+                       if (tinyMCE.isGecko) {\r
+                               this.setUseCSS(true);\r
+                               this.getDoc().execCommand('hilitecolor', false, value);\r
+                               this.setUseCSS(false);\r
+                       } else\r
+                               this.getDoc().execCommand('BackColor', false, value);\r
+                       break;\r
+\r
+               case "Cut":\r
+               case "Copy":\r
+               case "Paste":\r
+                       var cmdFailed = false;\r
+\r
+                       // Try executing command\r
+                       eval('try {this.getDoc().execCommand(command, user_interface, value);} catch (e) {cmdFailed = true;}');\r
+\r
+                       if (tinyMCE.isOpera && cmdFailed)\r
+                               alert('Currently not supported by your browser, use keyboard shortcuts instead.');\r
+\r
+                       // Alert error in gecko if command failed\r
+                       if (tinyMCE.isGecko && cmdFailed) {\r
+                               // Confirm more info\r
+                               if (confirm(tinyMCE.getLang('lang_clipboard_msg')))\r
+                                       window.open('http://www.mozilla.org/editor/midasdemo/securityprefs.html', 'mceExternal');\r
+\r
+                               return;\r
+                       } else\r
+                               tinyMCE.triggerNodeChange();\r
+               break;\r
+\r
+               case "mceSetContent":\r
+                       if (!value)\r
+                               value = "";\r
+\r
+                       // Call custom cleanup code\r
+                       value = tinyMCE.storeAwayURLs(value);\r
+                       value = tinyMCE._customCleanup(this, "insert_to_editor", value);\r
+                       tinyMCE._setHTML(doc, value);\r
+                       tinyMCE.setInnerHTML(doc.body, tinyMCE._cleanupHTML(this, doc, tinyMCE.settings, doc.body));\r
+                       this.convertAllRelativeURLs();\r
+                       tinyMCE.handleVisualAid(doc.body, true, this.visualAid, this);\r
+                       tinyMCE._setEventsEnabled(doc.body, false);\r
+                       return true;\r
+\r
+               case "mceLink":\r
+                       var selectedText = "";\r
+\r
+                       if (tinyMCE.isMSIE) {\r
+                               var rng = doc.selection.createRange();\r
+                               selectedText = rng.text;\r
+                       } else\r
+                               selectedText = this.getSel().toString();\r
+\r
+                       if (!tinyMCE.linkElement) {\r
+                               if ((tinyMCE.selectedElement.nodeName.toLowerCase() != "img") && (selectedText.length <= 0))\r
+                                       return;\r
+                       }\r
+\r
+                       var href = "", target = "", title = "", onclick = "", action = "insert", style_class = "";\r
+\r
+                       if (tinyMCE.selectedElement.nodeName.toLowerCase() == "a")\r
+                               tinyMCE.linkElement = tinyMCE.selectedElement;\r
+\r
+                       // Is anchor not a link\r
+                       if (tinyMCE.linkElement != null && tinyMCE.getAttrib(tinyMCE.linkElement, 'href') == "")\r
+                               tinyMCE.linkElement = null;\r
+\r
+                       if (tinyMCE.linkElement) {\r
+                               href = tinyMCE.getAttrib(tinyMCE.linkElement, 'href');\r
+                               target = tinyMCE.getAttrib(tinyMCE.linkElement, 'target');\r
+                               title = tinyMCE.getAttrib(tinyMCE.linkElement, 'title');\r
+                onclick = tinyMCE.getAttrib(tinyMCE.linkElement, 'onclick');\r
+                               style_class = tinyMCE.getAttrib(tinyMCE.linkElement, 'class');\r
+\r
+                               // Try old onclick to if copy/pasted content\r
+                               if (onclick == "")\r
+                                       onclick = tinyMCE.getAttrib(tinyMCE.linkElement, 'onclick');\r
+\r
+                               onclick = tinyMCE.cleanupEventStr(onclick);\r
+\r
+                               href = eval(tinyMCE.settings['urlconverter_callback'] + "(href, tinyMCE.linkElement, true);");\r
+\r
+                               // Use mce_href if defined\r
+                               mceRealHref = tinyMCE.getAttrib(tinyMCE.linkElement, 'mce_href');\r
+                               if (mceRealHref != "") {\r
+                                       href = mceRealHref;\r
+\r
+                                       if (tinyMCE.getParam('convert_urls'))\r
+                                               href = eval(tinyMCE.settings['urlconverter_callback'] + "(href, tinyMCE.linkElement, true);");\r
+                               }\r
+\r
+                               action = "update";\r
+                       }\r
+\r
+                       if (this.settings['insertlink_callback']) {\r
+                               var returnVal = eval(this.settings['insertlink_callback'] + "(href, target, title, onclick, action, style_class);");\r
+                               if (returnVal && returnVal['href'])\r
+                                       tinyMCE.insertLink(returnVal['href'], returnVal['target'], returnVal['title'], returnVal['onclick'], returnVal['style_class']);\r
+                       } else {\r
+                               tinyMCE.openWindow(this.insertLinkTemplate, {href : href, target : target, title : title, onclick : onclick, action : action, className : style_class, inline : "yes"});\r
+                       }\r
+               break;\r
+\r
+               case "mceImage":\r
+                       var src = "", alt = "", border = "", hspace = "", vspace = "", width = "", height = "", align = "";\r
+                       var title = "", onmouseover = "", onmouseout = "", action = "insert";\r
+                       var img = tinyMCE.imgElement;\r
+\r
+                       if (tinyMCE.selectedElement != null && tinyMCE.selectedElement.nodeName.toLowerCase() == "img") {\r
+                               img = tinyMCE.selectedElement;\r
+                               tinyMCE.imgElement = img;\r
+                       }\r
+\r
+                       if (img) {\r
+                               // Is it a internal MCE visual aid image, then skip this one.\r
+                               if (tinyMCE.getAttrib(img, 'name').indexOf('mce_') == 0)\r
+                                       return;\r
+\r
+                               src = tinyMCE.getAttrib(img, 'src');\r
+                               alt = tinyMCE.getAttrib(img, 'alt');\r
+\r
+                               // Try polling out the title\r
+                               if (alt == "")\r
+                                       alt = tinyMCE.getAttrib(img, 'title');\r
+\r
+                               // Fix width/height attributes if the styles is specified\r
+                               if (tinyMCE.isGecko) {\r
+                                       var w = img.style.width;\r
+                                       if (w != null && w != "")\r
+                                               img.setAttribute("width", w);\r
+\r
+                                       var h = img.style.height;\r
+                                       if (h != null && h != "")\r
+                                               img.setAttribute("height", h);\r
+                               }\r
+\r
+                               border = tinyMCE.getAttrib(img, 'border');\r
+                               hspace = tinyMCE.getAttrib(img, 'hspace');\r
+                               vspace = tinyMCE.getAttrib(img, 'vspace');\r
+                               width = tinyMCE.getAttrib(img, 'width');\r
+                               height = tinyMCE.getAttrib(img, 'height');\r
+                               align = tinyMCE.getAttrib(img, 'align');\r
+                onmouseover = tinyMCE.getAttrib(img, 'onmouseover');\r
+                onmouseout = tinyMCE.getAttrib(img, 'onmouseout');\r
+                title = tinyMCE.getAttrib(img, 'title');\r
+\r
+                               // Is realy specified?\r
+                               if (tinyMCE.isMSIE) {\r
+                                       width = img.attributes['width'].specified ? width : "";\r
+                                       height = img.attributes['height'].specified ? height : "";\r
+                               }\r
+\r
+                               onmouseover = tinyMCE.getImageSrc(tinyMCE.cleanupEventStr(onmouseover));\r
+                               onmouseout = tinyMCE.getImageSrc(tinyMCE.cleanupEventStr(onmouseout));\r
+\r
+                               src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, img, true);");\r
+\r
+                               // Use mce_src if defined\r
+                               mceRealSrc = tinyMCE.getAttrib(img, 'mce_src');\r
+                               if (mceRealSrc != "") {\r
+                                       src = mceRealSrc;\r
+\r
+                                       if (tinyMCE.getParam('convert_urls'))\r
+                                               src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, img, true);");\r
+                               }\r
+\r
+                               if (onmouseover != "")\r
+                                       onmouseover = eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseover, img, true);");\r
+\r
+                               if (onmouseout != "")\r
+                                       onmouseout = eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseout, img, true);");\r
+\r
+                               action = "update";\r
+                       }\r
+\r
+                       if (this.settings['insertimage_callback']) {\r
+                               var returnVal = eval(this.settings['insertimage_callback'] + "(src, alt, border, hspace, vspace, width, height, align, title, onmouseover, onmouseout, action);");\r
+                               if (returnVal && returnVal['src'])\r
+                                       tinyMCE.insertImage(returnVal['src'], returnVal['alt'], returnVal['border'], returnVal['hspace'], returnVal['vspace'], returnVal['width'], returnVal['height'], returnVal['align'], returnVal['title'], returnVal['onmouseover'], returnVal['onmouseout']);\r
+                       } else\r
+                               tinyMCE.openWindow(this.insertImageTemplate, {src : src, alt : alt, border : border, hspace : hspace, vspace : vspace, width : width, height : height, align : align, title : title, onmouseover : onmouseover, onmouseout : onmouseout, action : action, inline : "yes"});\r
+               break;\r
+\r
+               case "mceCleanup":\r
+                       tinyMCE._setHTML(this.contentDocument, this.getBody().innerHTML);\r
+                       tinyMCE.setInnerHTML(this.getBody(), tinyMCE._cleanupHTML(this, this.contentDocument, this.settings, this.getBody(), this.visualAid));\r
+                       this.convertAllRelativeURLs();\r
+                       tinyMCE.handleVisualAid(this.getBody(), true, this.visualAid, this);\r
+                       tinyMCE._setEventsEnabled(this.getBody(), false);\r
+                       this.repaint();\r
+                       tinyMCE.triggerNodeChange();\r
+               break;\r
+\r
+               case "mceReplaceContent":\r
+                       this.getWin().focus();\r
+\r
+                       var selectedText = "";\r
+\r
+                       if (tinyMCE.isMSIE) {\r
+                               var rng = doc.selection.createRange();\r
+                               selectedText = rng.text;\r
+                       } else\r
+                               selectedText = this.getSel().toString();\r
+\r
+                       if (selectedText.length > 0) {\r
+                               value = tinyMCE.replaceVar(value, "selection", selectedText);\r
+                               tinyMCE.execCommand('mceInsertContent', false, value);\r
+                       }\r
+\r
+                       tinyMCE.triggerNodeChange();\r
+               break;\r
+\r
+               case "mceSetAttribute":\r
+                       if (typeof(value) == 'object') {\r
+                               var targetElms = (typeof(value['targets']) == "undefined") ? "p,img,span,div,td,h1,h2,h3,h4,h5,h6,pre,address" : value['targets'];\r
+                               var targetNode = tinyMCE.getParentElement(this.getFocusElement(), targetElms);\r
+\r
+                               if (targetNode) {\r
+                                       targetNode.setAttribute(value['name'], value['value']);\r
+                                       tinyMCE.triggerNodeChange();\r
+                               }\r
+                       }\r
+               break;\r
+\r
+               case "mceSetCSSClass":\r
+                       this.execCommand("SetStyleInfo", false, {command : "setattrib", name : "class", value : value});\r
+               break;\r
+\r
+               case "mceInsertRawHTML":\r
+                       var key = 'tiny_mce_marker';\r
+\r
+                       this.execCommand('mceBeginUndoLevel');\r
+\r
+                       // Insert marker key\r
+                       this.execCommand('mceInsertContent', false, key);\r
+\r
+                       // Store away scroll pos\r
+                       var scrollX = this.getDoc().body.scrollLeft + this.getDoc().documentElement.scrollLeft;\r
+                       var scrollY = this.getDoc().body.scrollTop + this.getDoc().documentElement.scrollTop;\r
+\r
+                       // Find marker and replace with RAW HTML\r
+                       var html = this.getBody().innerHTML;\r
+                       if ((pos = html.indexOf(key)) != -1)\r
+                               tinyMCE.setInnerHTML(this.getBody(), html.substring(0, pos) + value + html.substring(pos + key.length));\r
+\r
+                       // Restore scoll pos\r
+                       this.contentWindow.scrollTo(scrollX, scrollY);\r
+\r
+                       this.execCommand('mceEndUndoLevel');\r
+\r
+                       break;\r
+\r
+               case "mceInsertContent":\r
+                       var insertHTMLFailed = false;\r
+                       this.getWin().focus();\r
+\r
+                       if (tinyMCE.isGecko || tinyMCE.isOpera) {\r
+                               try {\r
+                                       // Is plain text or HTML\r
+                                       if (value.indexOf('<') == -1) {\r
+                                               var r = this.getRng();\r
+                                               var n = this.getDoc().createTextNode(tinyMCE.entityDecode(value));\r
+                                               var s = this.getSel();\r
+                                               var r2 = r.cloneRange();\r
+\r
+                                               // Insert text at cursor position\r
+                                               s.removeAllRanges();\r
+                                               r.deleteContents();\r
+                                               r.insertNode(n);\r
+\r
+                                               // Move the cursor to the end of text\r
+                                               r2.selectNode(n);\r
+                                               r2.collapse(false);\r
+                                               s.removeAllRanges();\r
+                                               s.addRange(r2);\r
+                                       } else {\r
+                                               value = tinyMCE.fixGeckoBaseHREFBug(1, this.getDoc(), value);\r
+                                               this.getDoc().execCommand('inserthtml', false, value);\r
+                                               tinyMCE.fixGeckoBaseHREFBug(2, this.getDoc(), value);\r
+                                       }\r
+                               } catch (ex) {\r
+                                       insertHTMLFailed = true;\r
+                               }\r
+\r
+                               if (!insertHTMLFailed) {\r
+                                       tinyMCE.triggerNodeChange();\r
+                                       return;\r
+                               }\r
+                       }\r
+\r
+                       // Ugly hack in Opera due to non working "inserthtml"\r
+                       if (tinyMCE.isOpera && insertHTMLFailed) {\r
+                               this.getDoc().execCommand("insertimage", false, tinyMCE.uniqueURL);\r
+                               var ar = tinyMCE.getElementsByAttributeValue(this.getBody(), "img", "src", tinyMCE.uniqueURL);\r
+                               ar[0].outerHTML = value;\r
+                               return;\r
+                       }\r
+\r
+                       if (!tinyMCE.isMSIE) {\r
+                               var isHTML = value.indexOf('<') != -1;\r
+                               var sel = this.getSel();\r
+                               var rng = this.getRng();\r
+\r
+                               if (isHTML) {\r
+                                       if (tinyMCE.isSafari) {\r
+                                               var tmpRng = this.getDoc().createRange();\r
+\r
+                                               tmpRng.setStart(this.getBody(), 0);\r
+                                               tmpRng.setEnd(this.getBody(), 0);\r
+\r
+                                               value = tmpRng.createContextualFragment(value);\r
+                                       } else\r
+                                               value = rng.createContextualFragment(value);\r
+                               } else {\r
+                                       // Setup text node\r
+                                       var el = document.createElement("div");\r
+                                       el.innerHTML = value;\r
+                                       value = el.firstChild.nodeValue;\r
+                                       value = doc.createTextNode(value);\r
+                               }\r
+\r
+                               // Insert plain text in Safari\r
+                               if (tinyMCE.isSafari && !isHTML) {\r
+                                       this.execCommand('InsertText', false, value.nodeValue);\r
+                                       tinyMCE.triggerNodeChange();\r
+                                       return true;\r
+                               } else if (tinyMCE.isSafari && isHTML) {\r
+                                       rng.deleteContents();\r
+                                       rng.insertNode(value);\r
+                                       tinyMCE.triggerNodeChange();\r
+                                       return true;\r
+                               }\r
+\r
+                               rng.deleteContents();\r
+\r
+                               // If target node is text do special treatment, (Mozilla 1.3 fix)\r
+                               if (rng.startContainer.nodeType == 3) {\r
+                                       var node = rng.startContainer.splitText(rng.startOffset);\r
+                                       node.parentNode.insertBefore(value, node); \r
+                               } else\r
+                                       rng.insertNode(value);\r
+\r
+                               if (!isHTML) {\r
+                                       // Removes weird selection trails\r
+                                       sel.selectAllChildren(doc.body);\r
+                                       sel.removeAllRanges();\r
+\r
+                                       // Move cursor to end of content\r
+                                       var rng = doc.createRange();\r
+\r
+                                       rng.selectNode(value);\r
+                                       rng.collapse(false);\r
+\r
+                                       sel.addRange(rng);\r
+                               } else\r
+                                       rng.collapse(false);\r
+                       } else {\r
+                               var rng = doc.selection.createRange();\r
+                               var c = value.indexOf('<!--') != -1;\r
+\r
+                               // Fix comment bug, add tag before comments\r
+                               if (c)\r
+                                       value = tinyMCE.uniqueTag + value;\r
+\r
+                               if (rng.item)\r
+                                       rng.item(0).outerHTML = value;\r
+                               else\r
+                                       rng.pasteHTML(value);\r
+\r
+                               // Remove unique tag\r
+                               if (c) {\r
+                                       var e = this.getDoc().getElementById('mceTMPElement');\r
+                                       e.parentNode.removeChild(e);\r
+                               }\r
+                       }\r
+\r
+                       tinyMCE.triggerNodeChange();\r
+               break;\r
+\r
+               case "mceStartTyping":\r
+                       if (tinyMCE.settings['custom_undo_redo'] && this.typingUndoIndex == -1) {\r
+                               this.typingUndoIndex = this.undoIndex;\r
+                               this.execCommand('mceAddUndoLevel');\r
+                               //tinyMCE.debug("mceStartTyping");\r
+                       }\r
+                       break;\r
+\r
+               case "mceEndTyping":\r
+                       if (tinyMCE.settings['custom_undo_redo'] && this.typingUndoIndex != -1) {\r
+                               this.execCommand('mceAddUndoLevel');\r
+                               this.typingUndoIndex = -1;\r
+                               //tinyMCE.debug("mceEndTyping");\r
+                       }\r
+                       break;\r
+\r
+               case "mceBeginUndoLevel":\r
+                       this.undoRedo = false;\r
+                       break;\r
+\r
+               case "mceEndUndoLevel":\r
+                       this.undoRedo = true;\r
+                       this.execCommand('mceAddUndoLevel');\r
+                       break;\r
+\r
+               case "mceAddUndoLevel":\r
+                       if (tinyMCE.settings['custom_undo_redo'] && this.undoRedo) {\r
+                               // tinyMCE.debug("add level");\r
+\r
+                               if (this.typingUndoIndex != -1) {\r
+                                       this.undoIndex = this.typingUndoIndex;\r
+                                       // tinyMCE.debug("Override: " + this.undoIndex);\r
+                               }\r
+\r
+                               var newHTML = tinyMCE.trim(this.getBody().innerHTML);\r
+                               if (newHTML != this.undoLevels[this.undoIndex]) {\r
+                                       tinyMCE.executeCallback('onchange_callback', '_onchange', 0, this);\r
+\r
+                                       // Time to compress\r
+                                       var customUndoLevels = tinyMCE.settings['custom_undo_redo_levels'];\r
+                                       if (customUndoLevels != -1 && this.undoLevels.length > customUndoLevels) {\r
+                                               for (var i=0; i<this.undoLevels.length-1; i++) {\r
+                                                       //tinyMCE.debug(this.undoLevels[i] + "=" + this.undoLevels[i+1]);\r
+                                                       this.undoLevels[i] = this.undoLevels[i+1];\r
+                                               }\r
+\r
+                                               this.undoLevels.length--;\r
+                                               this.undoIndex--;\r
+                                       }\r
+\r
+                                       this.undoIndex++;\r
+                                       this.undoLevels[this.undoIndex] = newHTML;\r
+                                       this.undoLevels.length = this.undoIndex + 1;\r
+\r
+                                       // tinyMCE.debug("level added" + this.undoIndex);\r
+                                       tinyMCE.triggerNodeChange(false);\r
+\r
+                                       // tinyMCE.debug(this.undoIndex + "," + (this.undoLevels.length-1));\r
+                               }\r
+                       }\r
+                       break;\r
+\r
+               case "Undo":\r
+                       if (tinyMCE.settings['custom_undo_redo']) {\r
+                               tinyMCE.execCommand("mceEndTyping");\r
+\r
+                               // Do undo\r
+                               if (this.undoIndex > 0) {\r
+                                       this.undoIndex--;\r
+                                       tinyMCE.setInnerHTML(this.getBody(), this.undoLevels[this.undoIndex]);\r
+                                       this.repaint();\r
+                               }\r
+\r
+                               // tinyMCE.debug("Undo - undo levels:" + this.undoLevels.length + ", undo index: " + this.undoIndex);\r
+                               tinyMCE.triggerNodeChange();\r
+                       } else\r
+                               this.getDoc().execCommand(command, user_interface, value);\r
+                       break;\r
+\r
+               case "Redo":\r
+                       if (tinyMCE.settings['custom_undo_redo']) {\r
+                               tinyMCE.execCommand("mceEndTyping");\r
+\r
+                               if (this.undoIndex < (this.undoLevels.length-1)) {\r
+                                       this.undoIndex++;\r
+                                       tinyMCE.setInnerHTML(this.getBody(), this.undoLevels[this.undoIndex]);\r
+                                       this.repaint();\r
+                                       // tinyMCE.debug("Redo - undo levels:" + this.undoLevels.length + ", undo index: " + this.undoIndex);\r
+                               }\r
+\r
+                               tinyMCE.triggerNodeChange();\r
+                       } else\r
+                               this.getDoc().execCommand(command, user_interface, value);\r
+                       break;\r
+\r
+               case "mceToggleVisualAid":\r
+                       this.visualAid = !this.visualAid;\r
+                       tinyMCE.handleVisualAid(this.getBody(), true, this.visualAid, this);\r
+                       tinyMCE.triggerNodeChange();\r
+                       break;\r
+\r
+               case "Indent":\r
+                       this.getDoc().execCommand(command, user_interface, value);\r
+                       tinyMCE.triggerNodeChange();\r
+                       if (tinyMCE.isMSIE) {\r
+                               var n = tinyMCE.getParentElement(this.getFocusElement(), "blockquote");\r
+                               do {\r
+                                       if (n && n.nodeName == "BLOCKQUOTE") {\r
+                                               n.removeAttribute("dir");\r
+                                               n.removeAttribute("style");\r
+                                       }\r
+                               } while (n != null && (n = n.parentNode) != null);\r
+                       }\r
+                       break;\r
+\r
+               case "removeformat":\r
+                       var text = this.getSelectedText();\r
+\r
+                       if (tinyMCE.isOpera) {\r
+                               this.getDoc().execCommand("RemoveFormat", false, null);\r
+                               return;\r
+                       }\r
+\r
+                       if (tinyMCE.isMSIE) {\r
+                               try {\r
+                                       var rng = doc.selection.createRange();\r
+                                       rng.execCommand("RemoveFormat", false, null);\r
+                               } catch (e) {\r
+                                       // Do nothing\r
+                               }\r
+\r
+                               this.execCommand("SetStyleInfo", false, {command : "removeformat"});\r
+                       } else {\r
+                               this.getDoc().execCommand(command, user_interface, value);\r
+\r
+                               this.execCommand("SetStyleInfo", false, {command : "removeformat"});\r
+                       }\r
+\r
+                       // Remove class\r
+                       if (text.length == 0)\r
+                               this.execCommand("mceSetCSSClass", false, "");\r
+\r
+                       tinyMCE.triggerNodeChange();\r
+                       break;\r
+\r
+               default:\r
+                       this.getDoc().execCommand(command, user_interface, value);\r
+\r
+                       if (tinyMCE.isGecko)\r
+                               window.setTimeout('tinyMCE.triggerNodeChange(false);', 1);\r
+                       else\r
+                               tinyMCE.triggerNodeChange();\r
+       }\r
+\r
+       // Add undo level after modification\r
+       if (command != "mceAddUndoLevel" && command != "Undo" && command != "Redo" && command != "mceStartTyping" && command != "mceEndTyping")\r
+               tinyMCE.execCommand("mceAddUndoLevel");\r
+};\r
+\r
+TinyMCEControl.prototype.queryCommandValue = function(command) {\r
+       try {\r
+               return this.getDoc().queryCommandValue(command);\r
+       } catch (ex) {\r
+               return null;\r
+       }\r
+};\r
+\r
+TinyMCEControl.prototype.queryCommandState = function(command) {\r
+       return this.getDoc().queryCommandState(command);\r
+};\r
+\r
+TinyMCEControl.prototype.onAdd = function(replace_element, form_element_name, target_document) {\r
+       var targetDoc = target_document ? target_document : document;\r
+\r
+       this.targetDoc = targetDoc;\r
+\r
+       tinyMCE.themeURL = tinyMCE.baseURL + "/themes/" + this.settings['theme'];\r
+       this.settings['themeurl'] = tinyMCE.themeURL;\r
+\r
+       if (!replace_element) {\r
+               alert("Error: Could not find the target element.");\r
+               return false;\r
+       }\r
+\r
+       var templateFunction = tinyMCE._getThemeFunction('_getInsertLinkTemplate');\r
+       if (eval("typeof(" + templateFunction + ")") != 'undefined')\r
+               this.insertLinkTemplate = eval(templateFunction + '(this.settings);');\r
+\r
+       var templateFunction = tinyMCE._getThemeFunction('_getInsertImageTemplate');\r
+       if (eval("typeof(" + templateFunction + ")") != 'undefined')\r
+               this.insertImageTemplate = eval(templateFunction + '(this.settings);');\r
+\r
+       var templateFunction = tinyMCE._getThemeFunction('_getEditorTemplate');\r
+       if (eval("typeof(" + templateFunction + ")") == 'undefined') {\r
+               alert("Error: Could not find the template function: " + templateFunction);\r
+               return false;\r
+       }\r
+\r
+       var editorTemplate = eval(templateFunction + '(this.settings, this.editorId);');\r
+\r
+       var deltaWidth = editorTemplate['delta_width'] ? editorTemplate['delta_width'] : 0;\r
+       var deltaHeight = editorTemplate['delta_height'] ? editorTemplate['delta_height'] : 0;\r
+       var html = '<span id="' + this.editorId + '_parent">' + editorTemplate['html'];\r
+\r
+       var templateFunction = tinyMCE._getThemeFunction('_handleNodeChange', true);\r
+       if (eval("typeof(" + templateFunction + ")") != 'undefined')\r
+               this.settings['handleNodeChangeCallback'] = templateFunction;\r
+\r
+       html = tinyMCE.replaceVar(html, "editor_id", this.editorId);\r
+       this.settings['default_document'] = tinyMCE.baseURL + "/blank.htm";\r
+\r
+       this.settings['old_width'] = this.settings['width'];\r
+       this.settings['old_height'] = this.settings['height'];\r
+\r
+       // Set default width, height\r
+       if (this.settings['width'] == -1)\r
+               this.settings['width'] = replace_element.offsetWidth;\r
+\r
+       if (this.settings['height'] == -1)\r
+               this.settings['height'] = replace_element.offsetHeight;\r
+\r
+       // Try the style width\r
+       if (this.settings['width'] == 0)\r
+               this.settings['width'] = replace_element.style.width;\r
+\r
+       // Try the style height\r
+       if (this.settings['height'] == 0)\r
+               this.settings['height'] = replace_element.style.height; \r
+\r
+       // If no width/height then default to 320x240, better than nothing\r
+       if (this.settings['width'] == 0)\r
+               this.settings['width'] = 320;\r
+\r
+       if (this.settings['height'] == 0)\r
+               this.settings['height'] = 240;\r
+\r
+       this.settings['area_width'] = parseInt(this.settings['width']);\r
+       this.settings['area_height'] = parseInt(this.settings['height']);\r
+       this.settings['area_width'] += deltaWidth;\r
+       this.settings['area_height'] += deltaHeight;\r
+\r
+       // Special % handling\r
+       if (("" + this.settings['width']).indexOf('%') != -1)\r
+               this.settings['area_width'] = "100%";\r
+\r
+       if (("" + this.settings['height']).indexOf('%') != -1)\r
+               this.settings['area_height'] = "100%";\r
+\r
+       if (("" + replace_element.style.width).indexOf('%') != -1) {\r
+               this.settings['width'] = replace_element.style.width;\r
+               this.settings['area_width'] = "100%";\r
+       }\r
+\r
+       if (("" + replace_element.style.height).indexOf('%') != -1) {\r
+               this.settings['height'] = replace_element.style.height;\r
+               this.settings['area_height'] = "100%";\r
+       }\r
+\r
+       html = tinyMCE.applyTemplate(html);\r
+\r
+       this.settings['width'] = this.settings['old_width'];\r
+       this.settings['height'] = this.settings['old_height'];\r
+\r
+       this.visualAid = this.settings['visual'];\r
+       this.formTargetElementId = form_element_name;\r
+\r
+       // Get replace_element contents\r
+       if (replace_element.nodeName == "TEXTAREA" || replace_element.nodeName == "INPUT")\r
+               this.startContent = replace_element.value;\r
+       else\r
+               this.startContent = replace_element.innerHTML;\r
+\r
+       // If not text area\r
+       if (replace_element.nodeName.toLowerCase() != "textarea") {\r
+               this.oldTargetElement = replace_element.cloneNode(true);\r
+\r
+               // Debug mode\r
+               if (tinyMCE.settings['debug'])\r
+                       html += '<textarea wrap="off" id="' + form_element_name + '" name="' + form_element_name + '" cols="100" rows="15"></textarea>';\r
+               else\r
+                       html += '<input type="hidden" type="text" id="' + form_element_name + '" name="' + form_element_name + '" />';\r
+\r
+               html += '</span>';\r
+\r
+               // Output HTML and set editable\r
+               if (!tinyMCE.isMSIE) {\r
+                       var rng = replace_element.ownerDocument.createRange();\r
+                       rng.setStartBefore(replace_element);\r
+\r
+                       var fragment = rng.createContextualFragment(html);\r
+                       replace_element.parentNode.replaceChild(fragment, replace_element);\r
+               } else\r
+                       replace_element.outerHTML = html;\r
+       } else {\r
+               html += '</span>';\r
+\r
+               // Just hide the textarea element\r
+               this.oldTargetElement = replace_element;\r
+\r
+               if (!tinyMCE.settings['debug'])\r
+                       this.oldTargetElement.style.display = "none";\r
+\r
+               // Output HTML and set editable\r
+               if (!tinyMCE.isMSIE) {\r
+                       var rng = replace_element.ownerDocument.createRange();\r
+                       rng.setStartBefore(replace_element);\r
+\r
+                       var fragment = rng.createContextualFragment(html);\r
+\r
+                       if (tinyMCE.isGecko)\r
+                               tinyMCE.insertAfter(fragment, replace_element);\r
+                       else\r
+                               replace_element.parentNode.insertBefore(fragment, replace_element);\r
+               } else\r
+                       replace_element.insertAdjacentHTML("beforeBegin", html);\r
+       }\r
+\r
+       // Setup iframe\r
+       var dynamicIFrame = false;\r
+       var tElm = targetDoc.getElementById(this.editorId);\r
+\r
+       if (!tinyMCE.isMSIE) {\r
+               if (tElm && tElm.nodeName.toLowerCase() == "span") {\r
+                       tElm = tinyMCE._createIFrame(tElm);\r
+                       dynamicIFrame = true;\r
+               }\r
+\r
+               this.targetElement = tElm;\r
+               this.iframeElement = tElm;\r
+               this.contentDocument = tElm.contentDocument;\r
+               this.contentWindow = tElm.contentWindow;\r
+\r
+               //this.getDoc().designMode = "on";\r
+       } else {\r
+               if (tElm && tElm.nodeName.toLowerCase() == "span")\r
+                       tElm = tinyMCE._createIFrame(tElm);\r
+               else\r
+                       tElm = targetDoc.frames[this.editorId];\r
+\r
+               this.targetElement = tElm;\r
+               this.iframeElement = targetDoc.getElementById(this.editorId);\r
+\r
+               if (tinyMCE.isOpera) {\r
+                       this.contentDocument = this.iframeElement.contentDocument;\r
+                       this.contentWindow = this.iframeElement.contentWindow;\r
+                       dynamicIFrame = true;\r
+               } else {\r
+                       this.contentDocument = tElm.window.document;\r
+                       this.contentWindow = tElm.window;\r
+               }\r
+\r
+               this.getDoc().designMode = "on";\r
+       }\r
+\r
+       // Setup base HTML\r
+       var doc = this.contentDocument;\r
+       if (dynamicIFrame) {\r
+               var html = tinyMCE.getParam('doctype') + '<html><head xmlns="http://www.w3.org/1999/xhtml"><base href="' + tinyMCE.settings['base_href'] + '" /><title>blank_page</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body class="mceContentBody"></body></html>';\r
+\r
+               try {\r
+                       if (!this.isHidden())\r
+                               this.getDoc().designMode = "on";\r
+\r
+                       doc.open();\r
+                       doc.write(html);\r
+                       doc.close();\r
+               } catch (e) {\r
+                       // Failed Mozilla 1.3\r
+                       this.getDoc().location.href = tinyMCE.baseURL + "/blank.htm";\r
+               }\r
+       }\r
+\r
+       // This timeout is needed in MSIE 5.5 for some odd reason\r
+       // it seems that the document.frames isn't initialized yet?\r
+       if (tinyMCE.isMSIE)\r
+               window.setTimeout("TinyMCE.prototype.addEventHandlers('" + this.editorId + "');", 1);\r
+\r
+       tinyMCE.setupContent(this.editorId, true);\r
+\r
+       return true;\r
+};\r
+\r
+TinyMCEControl.prototype.getFocusElement = function() {\r
+       if (tinyMCE.isMSIE && !tinyMCE.isOpera) {\r
+               var doc = this.getDoc();\r
+               var rng = doc.selection.createRange();\r
+\r
+//             if (rng.collapse)\r
+//                     rng.collapse(true);\r
+\r
+               var elm = rng.item ? rng.item(0) : rng.parentElement();\r
+       } else {\r
+               if (this.isHidden())\r
+                       return this.getBody();\r
+\r
+               var sel = this.getSel();\r
+               var rng = this.getRng();\r
+\r
+               var elm = rng.commonAncestorContainer;\r
+               //var elm = (sel && sel.anchorNode) ? sel.anchorNode : null;\r
+\r
+               // Handle selection a image or other control like element such as anchors\r
+               if (!rng.collapsed) {\r
+                       // Is selection small\r
+                       if (rng.startContainer == rng.endContainer) {\r
+                               if (rng.startOffset - rng.endOffset < 2) {\r
+                                       if (rng.startContainer.hasChildNodes())\r
+                                               elm = rng.startContainer.childNodes[rng.startOffset];\r
+                               }\r
+                       }\r
+               }\r
+\r
+               // Get the element parent of the node\r
+               elm = tinyMCE.getParentElement(elm);\r
+\r
+               //if (tinyMCE.selectedElement != null && tinyMCE.selectedElement.nodeName.toLowerCase() == "img")\r
+               //      elm = tinyMCE.selectedElement;\r
+       }\r
+\r
+       return elm;\r
+};\r
+\r
+// Global instances\r
+var tinyMCE = new TinyMCE();\r
+var tinyMCELang = new Array();\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..8fba405
--- /dev/null
@@ -0,0 +1,203 @@
+/**\r
+ * $RCSfile: form_utils.js,v $\r
+ * $Revision: 1.5 $\r
+ * $Date: 2005/10/25 16:01:51 $\r
+ *\r
+ * Various form utilitiy functions.\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2005, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+function getColorPickerHTML(id, target_form_element) {\r
+       var html = "";\r
+\r
+       html += '<a id="' + id + '_link" href="javascript:void(0);" onkeydown="pickColor(event,\'' + target_form_element +'\');" onmousedown="pickColor(event,\'' + target_form_element +'\');return false;">';\r
+       html += '<img id="' + id + '" src="../../themes/advanced/images/color.gif"';\r
+       html += ' onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');"';\r
+       html += ' onmouseout="tinyMCE.restoreClass(this);"';\r
+       html += ' onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');"';\r
+       html += ' width="20" height="16" border="0" title="' + tinyMCE.getLang('lang_browse') + '"';\r
+       html += ' class="mceButtonNormal" alt="' + tinyMCE.getLang('lang_browse') + '" /></a>';\r
+\r
+       return html;\r
+}\r
+\r
+function pickColor(e, target_form_element) {\r
+       if ((e.keyCode == 32 || e.keyCode == 13) || e.type == "mousedown")\r
+               tinyMCEPopup.pickColor(e, target_form_element);\r
+}\r
+\r
+function updateColor(img_id, form_element_id) {\r
+       document.getElementById(img_id).style.backgroundColor = document.forms[0].elements[form_element_id].value;\r
+}\r
+\r
+function setBrowserDisabled(id, state) {\r
+       var img = document.getElementById(id);\r
+       var lnk = document.getElementById(id + "_link");\r
+\r
+       if (lnk) {\r
+               if (state) {\r
+                       lnk.setAttribute("realhref", lnk.getAttribute("href"));\r
+                       lnk.removeAttribute("href");\r
+                       tinyMCE.switchClass(img, 'mceButtonDisabled', true);\r
+               } else {\r
+                       lnk.setAttribute("href", lnk.getAttribute("realhref"));\r
+                       tinyMCE.switchClass(img, 'mceButtonNormal', false);\r
+               }\r
+       }\r
+}\r
+\r
+function getBrowserHTML(id, target_form_element, type, prefix) {\r
+       var option = prefix + "_" + type + "_browser_callback";\r
+       var cb = tinyMCE.getParam(option, tinyMCE.getParam("file_browser_callback"));\r
+       if (cb == null)\r
+               return "";\r
+\r
+       var html = "";\r
+\r
+       html += '<a id="' + id + '_link" href="javascript:openBrower(\'' + id + '\',\'' + target_form_element + '\', \'' + type + '\',\'' + option + '\');" onmousedown="return false;">';\r
+       html += '<img id="' + id + '" src="../../themes/advanced/images/browse.gif"';\r
+       html += ' onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');"';\r
+       html += ' onmouseout="tinyMCE.restoreClass(this);"';\r
+       html += ' onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');"';\r
+       html += ' width="20" height="18" border="0" title="' + tinyMCE.getLang('lang_browse') + '"';\r
+       html += ' class="mceButtonNormal" alt="' + tinyMCE.getLang('lang_browse') + '" /></a>';\r
+\r
+       return html;\r
+}\r
+\r
+function openBrower(img_id, target_form_element, type, option) {\r
+       var img = document.getElementById(img_id);\r
+\r
+       if (img.className != "mceButtonDisabled")\r
+               tinyMCEPopup.openBrowser(target_form_element, type, option);\r
+}\r
+\r
+function selectByValue(form_obj, field_name, value, add_custom) {\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) {\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 getSelectValue(form_obj, field_name) {\r
+       var elm = form_obj.elements[field_name];\r
+\r
+       if (elm == null || elm.options == null)\r
+               return "";\r
+\r
+       return elm.options[elm.selectedIndex].value;\r
+}\r
+\r
+function addClassesToList(list_id, specific_option) {\r
+       // Setup class droplist\r
+       var styleSelectElm = document.getElementById(list_id);\r
+       var styles = tinyMCE.getParam('theme_advanced_styles', false);\r
+       styles = tinyMCE.getParam(specific_option, styles);\r
+\r
+       if (styles) {\r
+               var stylesAr = styles.split(';');\r
+\r
+               for (var i=0; i<stylesAr.length; i++) {\r
+                       if (stylesAr != "") {\r
+                               var key, value;\r
+\r
+                               key = stylesAr[i].split('=')[0];\r
+                               value = stylesAr[i].split('=')[1];\r
+\r
+                               styleSelectElm.options[styleSelectElm.length] = new Option(key, value);\r
+                       }\r
+               }\r
+       } else {\r
+               // Use auto impored classes\r
+               var csses = tinyMCE.getCSSClasses(tinyMCE.getWindowArg('editor_id'));\r
+               for (var i=0; i<csses.length; i++)\r
+                       styleSelectElm.options[styleSelectElm.length] = new Option(csses[i], csses[i]);\r
+       }\r
+}\r
+\r
+function isVisible(element_id) {\r
+       var elm = document.getElementById(element_id);\r
+\r
+       return elm && elm.style.display != "none";\r
+}\r
+\r
+function convertRGBToHex(col) {\r
+       var re = new RegExp("rgb\\s*\\(\\s*([0-9]+).*,\\s*([0-9]+).*,\\s*([0-9]+).*\\)", "gi");\r
+\r
+       var rgb = col.replace(re, "$1,$2,$3").split(',');\r
+       if (rgb.length == 3) {\r
+               r = parseInt(rgb[0]).toString(16);\r
+               g = parseInt(rgb[1]).toString(16);\r
+               b = parseInt(rgb[2]).toString(16);\r
+\r
+               r = r.length == 1 ? '0' + r : r;\r
+               g = g.length == 1 ? '0' + g : g;\r
+               b = b.length == 1 ? '0' + b : b;\r
+\r
+               return "#" + r + g + b;\r
+       }\r
+\r
+       return col;\r
+}\r
+\r
+function convertHexToRGB(col) {\r
+       if (col.indexOf('#') != -1) {\r
+               col = col.replace(new RegExp('[^0-9A-F]', 'gi'), '');\r
+\r
+               r = parseInt(col.substring(0, 2), 16);\r
+               g = parseInt(col.substring(2, 4), 16);\r
+               b = parseInt(col.substring(4, 6), 16);\r
+\r
+               return "rgb(" + r + "," + g + "," + b + ")";\r
+       }\r
+\r
+       return col;\r
+}\r
+\r
+function trimSize(size) {\r
+       return size.replace(new RegExp('[^0-9%]', 'gi'), '');\r
+}\r
+\r
+function getCSSSize(size) {\r
+       size = trimSize(size);\r
+\r
+       if (size == "")\r
+               return "";\r
+\r
+       return size.indexOf('%') != -1 ? size : size + "px";\r
+}\r
+\r
+function getStyle(elm, attrib, style) {\r
+       var val = tinyMCE.getAttrib(elm, attrib);\r
+\r
+       if (val != '')\r
+               return '' + val;\r
+\r
+       if (typeof(style) == 'undefined')\r
+               style = attrib;\r
+\r
+       val = eval('elm.style.' + style);\r
+\r
+       return val == null ? '' : '' + val;\r
+}\r
diff --git a/webcit/tiny_mce/utils/mctabs.js b/webcit/tiny_mce/utils/mctabs.js
new file mode 100644 (file)
index 0000000..9554f8f
--- /dev/null
@@ -0,0 +1,76 @@
+/**\r
+ * $RCSfile: mctabs.js,v $\r
+ * $Revision: 1.1 $\r
+ * $Date: 2005/08/01 18:36:35 $\r
+ *\r
+ * Moxiecode DHTML Tabs script.\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+function MCTabs() {\r
+       this.settings = new Array();\r
+};\r
+\r
+MCTabs.prototype.init = function(settings) {\r
+       this.settings = settings;\r
+};\r
+\r
+MCTabs.prototype.getParam = function(name, default_value) {\r
+       var value = null;\r
+\r
+       value = (typeof(this.settings[name]) == "undefined") ? default_value : this.settings[name];\r
+\r
+       // Fix bool values\r
+       if (value == "true" || value == "false")\r
+               return (value == "true");\r
+\r
+       return value;\r
+};\r
+\r
+MCTabs.prototype.displayTab = function(tab_id, panel_id) {\r
+       var panelElm = document.getElementById(panel_id);\r
+       var panelContainerElm = panelElm ? panelElm.parentNode : null;\r
+       var tabElm = document.getElementById(tab_id);\r
+       var tabContainerElm = tabElm ? tabElm.parentNode : null;\r
+       var selectionClass = this.getParam('selection_class', 'current');\r
+\r
+       if (tabElm && tabContainerElm) {\r
+               var nodes = tabContainerElm.childNodes;\r
+\r
+               // Hide all other tabs\r
+               for (var i=0; i<nodes.length; i++) {\r
+                       if (nodes[i].nodeName == "LI")\r
+                               nodes[i].className = '';\r
+               }\r
+\r
+               // Show selected tab\r
+               tabElm.className = 'current';\r
+       }\r
+\r
+       if (panelElm && panelContainerElm) {\r
+               var nodes = panelContainerElm.childNodes;\r
+\r
+               // Hide all other panels\r
+               for (var i=0; i<nodes.length; i++) {\r
+                       if (nodes[i].nodeName == "DIV")\r
+                               nodes[i].className = 'panel';\r
+               }\r
+\r
+               // Show selected panel\r
+               panelElm.className = 'current';\r
+       }\r
+};\r
+\r
+MCTabs.prototype.getAnchor = function() {\r
+       var pos, url = document.location.href;\r
+\r
+       if ((pos = url.lastIndexOf('#')) != -1)\r
+               return url.substring(pos + 1);\r
+\r
+       return "";\r
+};\r
+\r
+// Global instance\r
+var mcTabs = new MCTabs();\r
diff --git a/webcit/tiny_mce/utils/validate.js b/webcit/tiny_mce/utils/validate.js
new file mode 100644 (file)
index 0000000..95ae4d3
--- /dev/null
@@ -0,0 +1,50 @@
+/**\r
+ * $RCSfile: validate.js,v $\r
+ * $Revision: 1.2 $\r
+ * $Date: 2005/08/13 12:20:37 $\r
+ *\r
+ * Various form validation methods.\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2005, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+function testRegExp(form_name, element_name, re) {\r
+       return new RegExp(re).test(document.forms[form_name].elements[element_name].value);\r
+}\r
+\r
+function validateString(form_name, element_name) {\r
+       return (document.forms[form_name].elements[element_name].value.length > 0);\r
+}\r
+\r
+function validateSelection(form_name, element_name) {\r
+       return (document.forms[form_name].elements[element_name].selectedIndex > 0);\r
+}\r
+\r
+function validateCheckBox(form_name, element_name) {\r
+       return document.forms[form_name].elements[element_name].checked;\r
+}\r
+\r
+function validateCleanString(form_name, element_name) {\r
+       return testRegExp(form_name, element_name, '^[A-Za-z0-9_]+$');\r
+}\r
+\r
+function validateEmail(form_name, element_name) {\r
+       return testRegExp(form_name, element_name, '^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+@[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$');\r
+}\r
+\r
+function validateAbsUrl(form_name, element_name) {\r
+       return testRegExp(form_name, element_name, '^(news|telnet|nttp|file|http|ftp|https)://[-A-Za-z0-9\\.]+$');\r
+}\r
+\r
+function validateNumber(form_name, element_name, allow_blank) {\r
+       return (!allow_blank && value == '') ? false : testRegExp(form_name, element_name, '^-?[0-9]*\\.?[0-9]*$');\r
+}\r
+\r
+function validateSize(form_name, element_name,) {\r
+       return testRegExp(form_name, element_name, '^[0-9]+(px|%)?$');\r
+}\r
+\r
+function validateID(form_name, element_name,) {\r
+       return testRegExp(form_name, element_name, '^[A-Za-z_]([A-Za-z0-9_])*$');\r
+}\r
diff --git a/webcit/tools.c b/webcit/tools.c
new file mode 100644 (file)
index 0000000..0a07183
--- /dev/null
@@ -0,0 +1,618 @@
+/*
+ * $Id$
+ */
+/**
+ * \defgroup MiscRout Miscellaneous routines 
+ * \ingroup tools
+ */
+
+/*@{*/
+#include "webcit.h"
+#include "webserver.h"
+
+
+typedef unsigned char byte; /**< byte data type */
+
+#define FALSE 0 /**< no. */
+#define TRUE 1  /**< yes. */
+
+static byte dtable[256];       /**< base64 encode / decode table */
+
+/**
+ * \brief sanitize strncopy.
+ * \param dest destination string
+ * \param src source string
+ * \param n length of source to copy 
+ * \return result string
+ */
+char *safestrncpy(char *dest, const char *src, size_t n)
+{
+       if (dest == NULL || src == NULL) {
+               abort();
+       }
+       strncpy(dest, src, n);
+       dest[n - 1] = 0;
+       return dest;
+}
+
+
+
+/**
+ * \brief discover number of parameters/tokens in a string
+ * \param source string to inspect
+ * \param tok seperation token
+ * \return number of tokenized parts found
+ */
+int num_tokens(char *source, char tok)
+{
+       int a = 0;
+       int count = 1;
+
+       if (source == NULL)
+               return (0);
+       for (a = 0; a < strlen(source); ++a) {
+               if (source[a] == tok)
+                       ++count;
+       }
+       return (count);
+}
+
+/**
+ * brief a string tokenizer
+ * \param dest destination string 
+ * \param source the string to grab tokens from
+ * \param parmnum the n'th token to grab
+ * \param separator the tokenizer string
+ * \param maxlen the length of dest
+ */
+void extract_token(char *dest, const char *source, int parmnum, char separator, int maxlen)
+{
+       char *d;                /* dest */
+       const char *s;          /* source */
+       int count = 0;
+       int len = 0;
+
+       dest[0] = 0;
+
+       /* Locate desired parameter */
+       s = source;
+       while (count < parmnum) {
+               /* End of string, bail! */
+               if (!*s) {
+                       s = NULL;
+                       break;
+               }
+               if (*s == separator) {
+                       count++;
+               }
+               s++;
+       }
+       if (!s) return;         /* Parameter not found */
+
+       for (d = dest; *s && *s != separator && ++len<maxlen; s++, d++) {
+               *d = *s;
+       }
+       *d = 0;
+}
+
+
+
+/**
+ * \brief a tokenizer that kills, maims, and destroys
+ * \param source the string to process
+ * \param parmnum which token to kill
+ * \param separator the tokenizer string
+ */
+void remove_token(char *source, int parmnum, char separator)
+{
+       int i;
+       int len;
+       int curr_parm;
+       int start, end;
+
+       len = 0;
+       curr_parm = 0;
+       start = (-1);
+       end = (-1);
+
+       if (strlen(source) == 0) {
+               return;
+       }
+
+       for (i = 0; i < strlen(source); ++i) {
+               if ((start < 0) && (curr_parm == parmnum)) {
+                       start = i;
+               }
+
+               if ((end < 0) && (curr_parm == (parmnum + 1))) {
+                       end = i;
+               }
+
+               if (source[i] == separator) {
+                       ++curr_parm;
+               }
+       }
+
+       if (end < 0)
+               end = strlen(source);
+
+       strcpy(&source[start], &source[end]);
+}
+
+
+
+
+/**
+ * \brief extract an int parm w/o supplying a buffer
+ * \param source the string to locate the int in
+ * \param parmnum the n'th token to grab the int from
+ * \return the integer
+ */
+int extract_int(const char *source, int parmnum)
+{
+       char buf[32];
+       
+       extract_token(buf, source, parmnum, '|', sizeof buf);
+       return(atoi(buf));
+}
+
+/**
+ * \brief extract an long parm w/o supplying a buffer
+ * \param source string to examine
+ * \param parmnum n'th token to search long in
+ * \return the found long value
+ */
+long extract_long(const char *source, int parmnum)
+{
+       char buf[32];
+       
+       extract_token(buf, source, parmnum, '|', sizeof buf);
+       return(atol(buf));
+}
+
+
+
+
+
+
+/**
+ * \brief check for the presence of a character within a string (returns count)
+ * \param st the string to examine
+ * \param ch the char to search
+ * \return the position inside of st
+ */
+int haschar(char *st,char ch)
+{
+       int a, b;
+       b = 0;
+       for (a = 0; a < strlen(st); ++a)
+               if (st[a] == ch)
+                       ++b;
+       return (b);
+}
+
+
+/** 
+ * \brief Utility function to "readline" from memory
+ * \param start Location in memory from which we are reading.
+ * \param buf the buffer to place the string in.
+ * \param maxlen Size of string buffer
+ * \return Pointer to the source memory right after we stopped reading.
+ */
+char *memreadline(char *start, char *buf, int maxlen)
+{
+       char ch;
+       char *ptr;
+       int len = 0;            /**< tally our own length to avoid strlen() delays */
+
+       ptr = start;
+       memset(buf, 0, maxlen);
+
+       while (1) {
+               ch = *ptr++;
+               if ((len < (maxlen - 1)) && (ch != 13) && (ch != 10)) {
+                       buf[strlen(buf) + 1] = 0;
+                       buf[strlen(buf)] = ch;
+                       ++len;
+               }
+               if ((ch == 10) || (ch == 0)) {
+                       return ptr;
+               }
+       }
+}
+
+
+
+/**
+ * \brief searches for a  paternn within asearch string
+ * \param search the string to search 
+ * \param patn the pattern to find in string
+ * \returns position in string
+ */
+int pattern2(char *search, char *patn)
+{
+       int a;
+       for (a = 0; a < strlen(search); ++a) {
+               if (!strncasecmp(&search[a], patn, strlen(patn)))
+                       return (a);
+       }
+       return (-1);
+}
+
+
+/**
+ * \brief Strip leading and trailing spaces from a string
+ * \param buf the string to modify
+ */
+void striplt(char *buf)
+{
+       if (strlen(buf) == 0) return;
+       while ((strlen(buf) > 0) && (isspace(buf[0])))
+               strcpy(buf, &buf[1]);
+       if (strlen(buf) == 0) return;
+       while (isspace(buf[strlen(buf) - 1]))
+               buf[strlen(buf) - 1] = 0;
+}
+
+
+/**
+ * \brief Determine whether the specified message number is contained within the
+ * specified set.
+ *
+ * \param mset Message set string
+ * \param msgnum Message number we are looking for
+ *
+ * \return Nonzero if the specified message number is in the specified message set string.
+ */
+int is_msg_in_mset(char *mset, long msgnum) {
+       int num_sets;
+       int s;
+       char setstr[SIZ], lostr[SIZ], histr[SIZ];       /* was 1024 */
+       long lo, hi;
+
+       /*
+        * Now set it for all specified messages.
+        */
+       num_sets = num_tokens(mset, ',');
+       for (s=0; s<num_sets; ++s) {
+               extract_token(setstr, mset, s, ',', sizeof setstr);
+
+               extract_token(lostr, setstr, 0, ':', sizeof lostr);
+               if (num_tokens(setstr, ':') >= 2) {
+                       extract_token(histr, setstr, 1, ':', sizeof histr);
+                       if (!strcmp(histr, "*")) {
+                               snprintf(histr, sizeof histr, "%ld", LONG_MAX);
+                       }
+               } 
+               else {
+                       strcpy(histr, lostr);
+               }
+               lo = atol(lostr);
+               hi = atol(histr);
+
+               if ((msgnum >= lo) && (msgnum <= hi)) return(1);
+       }
+
+       return(0);
+}
+
+
+
+/**
+ * \brief Strip a boundarized substring out of a string
+ * (for example, remove
+ * parentheses and anything inside them).
+ *
+ * This improved version can strip out *multiple* boundarized substrings.
+ * \param str the string to process
+ * \param leftboundary the boundary character on the left side of the target string 
+ * \param rightboundary the boundary character on the right side of the target string
+ */
+void stripout(char *str, char leftboundary, char rightboundary)
+{
+       int a;
+       int lb = (-1);
+       int rb = (-1);
+
+       do {
+               lb = (-1);
+               rb = (-1);
+
+               for (a = 0; a < strlen(str); ++a) {
+                       if (str[a] == leftboundary)
+                               lb = a;
+                       if (str[a] == rightboundary)
+                               rb = a;
+               }
+
+               if ((lb > 0) && (rb > lb)) {
+                       strcpy(&str[lb - 1], &str[rb + 1]);
+               }
+
+       } while ((lb > 0) && (rb > lb));
+
+}
+
+
+
+/**
+ * \brief Replacement for sleep() that uses select() in order to avoid SIGALRM
+ * \param seconds how many seconds should we sleep?
+ */
+void sleeeeeeeeeep(int seconds)
+{
+       struct timeval tv;
+
+       tv.tv_sec = seconds;
+       tv.tv_usec = 0;
+       select(0, NULL, NULL, NULL, &tv);
+}
+
+
+
+/**
+ * \brief encode a string into base64 to for example tunnel it through mail transport
+ * CtdlDecodeBase64() and CtdlEncodeBase64() are adaptations of code by
+ * John Walker, copied over from the Citadel server.
+ * \param dest encrypted string
+ * \param source the string to encrypt
+ * \param sourcelen the length of the source data (may contain string terminators)
+ */
+
+void CtdlEncodeBase64(char *dest, const char *source, size_t sourcelen)
+{
+       int i, hiteof = FALSE;
+       int spos = 0;
+       int dpos = 0;
+       int thisline = 0;
+
+       /**  Fill dtable with character encodings.  */
+
+       for (i = 0; i < 26; i++) {
+               dtable[i] = 'A' + i;
+               dtable[26 + i] = 'a' + i;
+       }
+       for (i = 0; i < 10; i++) {
+               dtable[52 + i] = '0' + i;
+       }
+       dtable[62] = '+';
+       dtable[63] = '/';
+
+       while (!hiteof) {
+               byte igroup[3], ogroup[4];
+               int c, n;
+
+               igroup[0] = igroup[1] = igroup[2] = 0;
+               for (n = 0; n < 3; n++) {
+                       if (spos >= sourcelen) {
+                               hiteof = TRUE;
+                               break;
+                       }
+                       c = source[spos++];
+                       igroup[n] = (byte) c;
+               }
+               if (n > 0) {
+                       ogroup[0] = dtable[igroup[0] >> 2];
+                       ogroup[1] =
+                           dtable[((igroup[0] & 3) << 4) |
+                                  (igroup[1] >> 4)];
+                       ogroup[2] =
+                           dtable[((igroup[1] & 0xF) << 2) |
+                                  (igroup[2] >> 6)];
+                       ogroup[3] = dtable[igroup[2] & 0x3F];
+
+                       /**
+                        * Replace characters in output stream with "=" pad
+                        * characters if fewer than three characters were
+                        * read from the end of the input stream. 
+                        */
+
+                       if (n < 3) {
+                               ogroup[3] = '=';
+                               if (n < 2) {
+                                       ogroup[2] = '=';
+                               }
+                       }
+                       for (i = 0; i < 4; i++) {
+                               dest[dpos++] = ogroup[i];
+                               dest[dpos] = 0;
+                       }
+                       thisline += 4;
+                       if (thisline > 70) {
+                               dest[dpos++] = '\r';
+                               dest[dpos++] = '\n';
+                               dest[dpos] = 0;
+                               thisline = 0;
+                       }
+               }
+       }
+       if (thisline > 70) {
+               dest[dpos++] = '\r';
+               dest[dpos++] = '\n';
+               dest[dpos] = 0;
+               thisline = 0;
+       }
+}
+
+
+/**
+ * \brief Convert base64-encoded to binary.  
+ * It will stop after reading 'length' bytes.
+ *
+ * \param dest The destination buffer 
+ * \param source The base64 data to be decoded.
+ * \param length The number of bytes to decode.
+ * \return The actual length of the decoded data.
+ */
+int CtdlDecodeBase64(char *dest, const char *source, size_t length)
+{
+       int i, c;
+       int dpos = 0;
+       int spos = 0;
+
+       for (i = 0; i < 255; i++) {
+               dtable[i] = 0x80;
+       }
+       for (i = 'A'; i <= 'Z'; i++) {
+               dtable[i] = 0 + (i - 'A');
+       }
+       for (i = 'a'; i <= 'z'; i++) {
+               dtable[i] = 26 + (i - 'a');
+       }
+       for (i = '0'; i <= '9'; i++) {
+               dtable[i] = 52 + (i - '0');
+       }
+       dtable['+'] = 62;
+       dtable['/'] = 63;
+       dtable['='] = 0;
+
+       /**CONSTANTCONDITION*/ while (TRUE) {
+               byte a[4], b[4], o[3];
+
+               for (i = 0; i < 4; i++) {
+                       if (spos >= length) {
+                               return (dpos);
+                       }
+                       c = source[spos++];
+
+                       if (c == 0) {
+                               if (i > 0) {
+                                       return (dpos);
+                               }
+                               return (dpos);
+                       }
+                       if (dtable[c] & 0x80) {
+                               /** Ignoring errors: discard invalid character */
+                               i--;
+                               continue;
+                       }
+                       a[i] = (byte) c;
+                       b[i] = (byte) dtable[c];
+               }
+               o[0] = (b[0] << 2) | (b[1] >> 4);
+               o[1] = (b[1] << 4) | (b[2] >> 2);
+               o[2] = (b[2] << 6) | b[3];
+               i = a[2] == '=' ? 1 : (a[3] == '=' ? 2 : 3);
+               if (i >= 1)
+                       dest[dpos++] = o[0];
+               if (i >= 2)
+                       dest[dpos++] = o[1];
+               if (i >= 3)
+                       dest[dpos++] = o[2];
+               dest[dpos] = 0;
+               if (i < 3) {
+                       return (dpos);
+               }
+       }
+}
+
+
+
+/**
+ * \brief Generate a new, globally unique UID parameter for a calendar etc. object
+ *
+ * \param buf String buffer into which our newly created UUID should be placed
+ */
+void generate_uuid(char *buf) {
+       static int seq = 0;
+
+       sprintf(buf, "%s-%lx-%x-%x",
+               serv_info.serv_nodename,
+               (long)time(NULL),
+               getpid(),
+               (seq++)
+       );
+}
+
+
+/**
+ * \brief Local replacement for controversial C library function that generates
+ * names for temporary files.  Included to shut up compiler warnings.
+ * \todo return a fd to the file instead of the name for security reasons
+ * \param name the created filename
+ * \param len the length of the filename
+ */
+void CtdlMakeTempFileName(char *name, int len) {
+       int i = 0;
+
+       while (i++, i < 100) {
+               snprintf(name, len, "/tmp/ctdl.%04x.%04x",
+                       getpid(),
+                       rand()
+               );
+               if (!access(name, F_OK)) {
+                       return;
+               }
+       }
+}
+
+
+
+/*
+ * \brief      case-insensitive substring search
+ *
+ *             This uses the Boyer-Moore search algorithm and is therefore quite fast.
+ *             The code is roughly based on the strstr() replacement from 'tin' written
+ *             by Urs Jannsen.
+ *
+ * \param      text    String to be searched
+ * \param      pattern String to search for
+ */
+char *bmstrcasestr(char *text, char *pattern) {
+
+       register unsigned char *p, *t;
+       register int i, j, *delta;
+       register size_t p1;
+       int deltaspace[256];
+       size_t textlen;
+       size_t patlen;
+
+       textlen = strlen (text);
+       patlen = strlen (pattern);
+
+       /* algorithm fails if pattern is empty */
+       if ((p1 = patlen) == 0)
+               return (text);
+
+       /* code below fails (whenever i is unsigned) if pattern too long */
+       if (p1 > textlen)
+               return (NULL);
+
+       /* set up deltas */
+       delta = deltaspace;
+       for (i = 0; i <= 255; i++)
+               delta[i] = p1;
+       for (p = (unsigned char *) pattern, i = p1; --i > 0;)
+               delta[tolower(*p++)] = i;
+
+       /*
+        * From now on, we want patlen - 1.
+        * In the loop below, p points to the end of the pattern,
+        * t points to the end of the text to be tested against the
+        * pattern, and i counts the amount of text remaining, not
+        * including the part to be tested.
+        */
+       p1--;
+       p = (unsigned char *) pattern + p1;
+       t = (unsigned char *) text + p1;
+       i = textlen - patlen;
+       while(1) {
+               if (tolower(p[0]) == tolower(t[0])) {
+                       if (strncasecmp ((const char *)(p - p1), (const char *)(t - p1), p1) == 0) {
+                               return ((char *)t - p1);
+                       }
+               }
+               j = delta[tolower(t[0])];
+               if (i < j)
+                       break;
+               i -= j;
+               t += j;
+       }
+       return (NULL);
+}
+
+
+
+
+
+/*@}*/
diff --git a/webcit/useredit.c b/webcit/useredit.c
new file mode 100644 (file)
index 0000000..265f915
--- /dev/null
@@ -0,0 +1,500 @@
+/*
+ * $Id$
+ */
+/**
+ * \defgroup AdminTasks Administrative screen to add/change/delete user accounts
+ * \ingroup CitadelConfig
+ *
+ */
+/*@{*/
+
+#include "webcit.h"
+#include "webserver.h"
+
+
+/**
+ * \brief show a list of available users to edit them
+ * \param message the header message???
+ * \param preselect which user should be selected in the browser
+ */
+void select_user_to_edit(char *message, char *preselect)
+{
+       char buf[SIZ];
+       char username[SIZ];
+
+       output_headers(1, 1, 2, 0, 0, 0);
+       wprintf("<div id=\"banner\">\n");
+       wprintf("<table width=100%% border=0 bgcolor=#444455><tr>"
+               "<td>"
+               "<span class=\"titlebar\">"
+               "<img src=\"static/usermanag_48x.gif\">");
+       wprintf(_("Edit or delete users"));
+       wprintf("</span></td></tr></table>\n"
+               "</div>\n<div id=\"content\">\n"
+       );
+
+       if (message != NULL) wprintf(message);
+
+       wprintf("<table border=0 cellspacing=10><tr valign=top><td>\n");
+
+       svprintf("BOXTITLE", WCS_STRING, _("Add users"));
+       do_template("beginbox");
+
+       wprintf(_("To create a new user account, enter the desired "
+               "user name in the box below and click 'Create'."));
+       wprintf("<br /><br />");
+
+        wprintf("<center><form method=\"POST\" action=\"create_user\">\n");
+        wprintf(_("New user: "));
+        wprintf("<input type=\"text\" name=\"username\"><br />\n"
+               "<input type=\"submit\" name=\"create_button\" value=\"%s\">"
+               "</form></center>\n", _("Create"));
+
+       do_template("endbox");
+
+       wprintf("</td><td>");
+
+       svprintf("BOXTITLE", WCS_STRING, _("Edit or Delete users"));
+       do_template("beginbox");
+
+       wprintf(_("To edit an existing user account, select the user "
+               "name from the list and click 'Edit'."));
+       wprintf("<br /><br />");
+       
+        wprintf("<center>"
+               "<form method=\"POST\" action=\"display_edituser\">\n");
+        wprintf("<select name=\"username\" size=10 style=\"width:100%%\">\n");
+        serv_puts("LIST");
+        serv_getln(buf, sizeof buf);
+        if (buf[0] == '1') {
+                while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+                        extract_token(username, buf, 0, '|', sizeof username);
+                        wprintf("<option");
+                       if (preselect != NULL)
+                          if (!strcasecmp(username, preselect))
+                             wprintf(" selected");
+                       wprintf(">");
+                        escputs(username);
+                        wprintf("\n");
+                }
+        }
+        wprintf("</select><br />\n");
+
+        wprintf("<input type=\"submit\" name=\"edit_config_button\" value=\"%s\">", _("Edit configuration"));
+        wprintf("<input type=\"submit\" name=\"edit_abe_button\" value=\"%s\">", _("Edit address book entry"));
+        wprintf("<input type=\"submit\" name=\"delete_button\" value=\"%s\" "
+               "onClick=\"return confirm('%s');\">", _("Delete user"), _("Delete this user?"));
+        wprintf("</form></center>\n");
+       do_template("endbox");
+
+       wprintf("</td></tr></table>\n");
+
+       wDumpContent(1);
+}
+
+
+
+/**
+ * \brief Locate the message number of a user's vCard in the current room
+ * \param username the plaintext name of the user
+ * \param usernum the number of the user on the citadel server
+ * \return the message id of his vcard
+ */
+long locate_user_vcard(char *username, long usernum) {
+       char buf[SIZ];
+       long vcard_msgnum = (-1L);
+       char content_type[SIZ];
+       char partnum[SIZ];
+       int already_tried_creating_one = 0;
+
+       struct stuff_t {
+               struct stuff_t *next;
+               long msgnum;
+       };
+
+       struct stuff_t *stuff = NULL;
+       struct stuff_t *ptr;
+
+TRYAGAIN:
+       /** Search for the user's vCard */
+       serv_puts("MSGS ALL");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '1') while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+               ptr = malloc(sizeof(struct stuff_t));
+               ptr->msgnum = atol(buf);
+               ptr->next = stuff;
+               stuff = ptr;
+       }
+
+       /** Iterate through the message list looking for vCards */
+       while (stuff != NULL) {
+               serv_printf("MSG0 %ld|2", stuff->msgnum);
+               serv_getln(buf, sizeof buf);
+               if (buf[0]=='1') {
+                       while(serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+                               if (!strncasecmp(buf, "part=", 5)) {
+                                       extract_token(partnum, &buf[5], 2, '|', sizeof partnum);
+                                       extract_token(content_type, &buf[5], 4, '|', sizeof content_type);
+                                       if (!strcasecmp(content_type,
+                                          "text/x-vcard")) {
+                                               vcard_msgnum = stuff->msgnum;
+                                       }
+                               }
+                       }
+               }
+
+               ptr = stuff->next;
+               free(stuff);
+               stuff = ptr;
+       }
+
+       /** If there's no vcard, create one */
+       if (vcard_msgnum < 0) if (already_tried_creating_one == 0) {
+               already_tried_creating_one = 1;
+               serv_puts("ENT0 1|||4");
+               serv_getln(buf, sizeof buf);
+               if (buf[0] == '4') {
+                       serv_puts("Content-type: text/x-vcard");
+                       serv_puts("");
+                       serv_puts("begin:vcard");
+                       serv_puts("end:vcard");
+                       serv_puts("000");
+               }
+               goto TRYAGAIN;
+       }
+
+       return(vcard_msgnum);
+}
+
+
+/**
+ * \brief Display the form for editing a user's address book entry
+ * \param username the name of the user
+ * \param usernum the citadel-uid of the user
+ */
+void display_edit_address_book_entry(char *username, long usernum) {
+       char roomname[SIZ];
+       char buf[SIZ];
+       char error_message[SIZ];
+       long vcard_msgnum = (-1L);
+
+       /** Locate the user's config room, creating it if necessary */
+       sprintf(roomname, "%010ld.%s", usernum, USERCONFIGROOM);
+       serv_printf("GOTO %s||1", roomname);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '2') {
+               serv_printf("CRE8 1|%s|5|||1|", roomname);
+               serv_getln(buf, sizeof buf);
+               serv_printf("GOTO %s||1", roomname);
+               serv_getln(buf, sizeof buf);
+               if (buf[0] != '2') {
+                       sprintf(error_message,
+                               "<img src=\"static/error.gif\" align=center>"
+                               "%s<br /><br />\n", &buf[4]);
+                       select_user_to_edit(error_message, username);
+                       return;
+               }
+       }
+
+       vcard_msgnum = locate_user_vcard(username, usernum);
+
+       if (vcard_msgnum < 0) {
+               sprintf(error_message,
+                       "<img src=\"static/error.gif\" align=center>%s<br /><br />\n",
+                       _("An error occurred while trying to create or edit this address book entry.")
+               );
+               select_user_to_edit(error_message, username);
+               return;
+       }
+
+       do_edit_vcard(vcard_msgnum, "1", "select_user_to_edit");
+}
+
+
+
+
+/**
+ * \brief Edit a user.  
+ * If supplied_username is null, look in the "username"
+ * web variable for the name of the user to edit.
+ * 
+ * If "is_new" is set to nonzero, this screen will set the web variables
+ * to send the user to the vCard editor next.
+ * \param supplied_username user to look up or NULL if to search in the environment
+ * \param is_new should we create the user?
+ */
+void display_edituser(char *supplied_username, int is_new) {
+       char buf[1024];
+       char error_message[1024];
+       time_t now;
+
+       char username[256];
+       char password[256];
+       unsigned int flags;
+       int timescalled;
+       int msgsposted;
+       int axlevel;
+       long usernum;
+       time_t lastcall;
+       int purgedays;
+       int i;
+
+       if (supplied_username != NULL) {
+               safestrncpy(username, supplied_username, sizeof username);
+       }
+       else {
+               safestrncpy(username, bstr("username"), sizeof username);
+       }
+
+       serv_printf("AGUP %s", username);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '2') {
+               sprintf(error_message,
+                       "<img src=\"static/error.gif\" align=center>"
+                       "%s<br /><br />\n", &buf[4]);
+               select_user_to_edit(error_message, username);
+               return;
+       }
+
+       extract_token(username, &buf[4], 0, '|', sizeof username);
+       extract_token(password, &buf[4], 1, '|', sizeof password);
+       flags = extract_int(&buf[4], 2);
+       timescalled = extract_int(&buf[4], 3);
+       msgsposted = extract_int(&buf[4], 4);
+       axlevel = extract_int(&buf[4], 5);
+       usernum = extract_long(&buf[4], 6);
+       lastcall = extract_long(&buf[4], 7);
+       purgedays = extract_long(&buf[4], 8);
+
+       if (strlen(bstr("edit_abe_button")) > 0) {
+               display_edit_address_book_entry(username, usernum);
+               return;
+       }
+
+       if (strlen(bstr("delete_button")) > 0) {
+               delete_user(username);
+               return;
+       }
+
+       output_headers(1, 1, 2, 0, 0, 0);
+       wprintf("<div id=\"banner\">\n");
+       wprintf("<table width=100%% border=0 bgcolor=\"#444455\"><tr><td>");
+       wprintf("<span class=\"titlebar\">");
+       wprintf(_("Edit user account: "));
+       escputs(username);
+       wprintf("</span></td></tr></table>\n");
+       wprintf("</div>\n<div id=\"content\">\n");
+
+       wprintf("<div class=\"fix_scrollbar_bug\">"
+               "<table border=0 width=100%% bgcolor=\"#ffffff\"><tr><td>\n");
+       wprintf("<form method=\"POST\" action=\"edituser\">\n"
+               "<input type=\"hidden\" name=\"username\" value=\"");
+       escputs(username);
+       wprintf("\">\n");
+       wprintf("<input type=\"hidden\" name=\"is_new\" value=\"%d\">\n"
+               "<input type=\"hidden\" name=\"usernum\" value=\"%ld\">\n",
+               is_new, usernum);
+
+       wprintf("<input type=\"hidden\" name=\"flags\" value=\"%d\">\n", flags);
+
+       wprintf("<center><table>");
+
+       wprintf("<tr><td>");
+       wprintf(_("Password"));
+       wprintf("</td><td>"
+               "<input type=\"password\" name=\"password\" value=\"");
+       escputs(password);
+       wprintf("\" maxlength=\"20\"></td></tr>\n");
+
+       wprintf("<tr><td>");
+       wprintf(_("Permission to send Internet mail"));
+       wprintf("</td><td>");
+       wprintf("<input type=\"checkbox\" name=\"inetmail\" value=\"yes\" ");
+       if (flags & US_INTERNET) {
+               wprintf("checked ");
+       }
+       wprintf("></td></tr>\n");
+
+       wprintf("<tr><td>");
+       wprintf(_("Number of logins"));
+       wprintf("</td><td>"
+               "<input type=\"text\" name=\"timescalled\" value=\"");
+       wprintf("%d", timescalled);
+       wprintf("\" maxlength=\"6\"></td></tr>\n");
+
+       wprintf("<tr><td>");
+       wprintf(_("Messages submitted"));
+       wprintf("</td><td>"
+               "<input type=\"text\" name=\"msgsposted\" value=\"");
+       wprintf("%d", msgsposted);
+       wprintf("\" maxlength=\"6\"></td></tr>\n");
+
+       wprintf("<tr><td>");
+       wprintf(_("Access level"));
+       wprintf("</td><td>"
+               "<select name=\"axlevel\">\n");
+       for (i=0; i<7; ++i) {
+               wprintf("<option ");
+               if (axlevel == i) {
+                       wprintf("selected ");
+               }
+               wprintf("value=\"%d\">%d - %s</option>\n",
+                       i, i, axdefs[i]);
+       }
+       wprintf("</select></td></tr>\n");
+
+       wprintf("<tr><td>");
+       wprintf(_("User ID number"));
+       wprintf("</td><td>"
+               "<input type=\"text\" name=\"usernum\" value=\"");
+       wprintf("%ld", usernum);
+       wprintf("\" maxlength=\"7\"></td></tr>\n");
+
+       now = time(NULL);
+       wprintf("<tr><td>");
+       wprintf(_("Date and time of last login"));
+       wprintf("</td><td>"
+               "<select name=\"lastcall\">\n");
+
+       wprintf("<option selected value=\"%ld\">", lastcall);
+       escputs(asctime(localtime(&lastcall)));
+       wprintf("</option>\n");
+
+       wprintf("<option value=\"%ld\">", now);
+       escputs(asctime(localtime(&now)));
+       wprintf("</option>\n");
+
+       wprintf("</select></td></tr>");
+
+       wprintf("<tr><td>");
+       wprintf(_("Auto-purge after this many days"));
+       wprintf("</td><td>"
+               "<input type=\"text\" name=\"purgedays\" value=\"");
+       wprintf("%d", purgedays);
+       wprintf("\" maxlength=\"5\"></td></tr>\n");
+
+       wprintf("</table>\n");
+
+       wprintf("<input type=\"submit\" name=\"ok_button\" value=\"%s\">\n"
+               "&nbsp;"
+               "<input type=\"submit\" name=\"cancel\" value=\"%s\">\n"
+               "<br /><br /></form>\n", _("Save changes"), _("Cancel"));
+
+       wprintf("</center>\n");
+       wprintf("</td></tr></table></div>\n");
+       wDumpContent(1);
+
+}
+
+
+/**
+ * \brief do the backend operation of the user edit on the server
+ */
+void edituser(void) {
+       char message[SIZ];
+       char buf[SIZ];
+       int is_new = 0;
+       unsigned int flags = 0;
+
+       is_new = atoi(bstr("is_new"));
+
+       if (strlen(bstr("ok_button")) == 0) {
+               safestrncpy(message, _("Changes were not saved."), sizeof message);
+       }
+       else {
+               flags = atoi(bstr("flags"));
+               if (!strcasecmp(bstr("inetmail"), "yes")) {
+                       flags |= US_INTERNET;
+               }
+               else {
+                       flags &= ~US_INTERNET ;
+               }
+
+               serv_printf("ASUP %s|%s|%d|%s|%s|%s|%s|%s|%s|",
+                       bstr("username"),
+                       bstr("password"),
+                       flags,
+                       bstr("timescalled"),
+                       bstr("msgsposted"),
+                       bstr("axlevel"),
+                       bstr("usernum"),
+                       bstr("lastcall"),
+                       bstr("purgedays")
+               );
+               serv_getln(buf, sizeof buf);
+               if (buf[0] != '2') {
+                       sprintf(message,
+                               "<img src=\"static/error.gif\" align=center>"
+                               "%s<br /><br />\n", &buf[4]);
+               }
+               else {
+                       safestrncpy(message, "", sizeof message);
+               }
+       }
+
+       /**
+        * 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( bstr("username"), atol(bstr("usernum")) );
+       }
+       else {
+               select_user_to_edit(message, bstr("username"));
+       }
+}
+
+/**
+ * \brief burge a user 
+ * \param username the name of the user to remove
+ */
+void delete_user(char *username) {
+       char buf[SIZ];
+       char message[SIZ];
+
+       serv_printf("ASUP %s|0|0|0|0|0|", username);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '2') {
+               sprintf(message,
+                       "<img src=\"static/error.gif\" align=center>"
+                       "%s<br /><br />\n", &buf[4]);
+       }
+       else {
+               safestrncpy(message, "", sizeof message);
+       }
+       select_user_to_edit(message, bstr("username"));
+}
+               
+
+
+/**
+ * \brief create a new user
+ * take the web environment username and create it on the citadel server
+ */
+void create_user(void) {
+       char buf[SIZ];
+       char error_message[SIZ];
+       char username[SIZ];
+
+       safestrncpy(username, bstr("username"), sizeof username);
+
+       serv_printf("CREU %s", username);
+       serv_getln(buf, sizeof buf);
+
+       if (buf[0] == '2') {
+               sprintf(WC->ImportantMessage,
+                       _("A new user has been created."));
+               display_edituser(username, 1);
+       }
+       else {
+               sprintf(error_message,
+                       "<img src=\"static/error.gif\" align=center>"
+                       "%s<br /><br />\n", &buf[4]);
+               select_user_to_edit(error_message, NULL);
+       }
+
+}
+
+
+
+/*@}*/
diff --git a/webcit/userlist.c b/webcit/userlist.c
new file mode 100644 (file)
index 0000000..cbd6c66
--- /dev/null
@@ -0,0 +1,174 @@
+/*
+ * $Id$
+ */
+/**
+ * \defgroup AccDisplay Display a list of all accounts on a Citadel system.
+ * \ingroup CitadelConfig
+ */
+
+/*@{*/
+#include "webcit.h"
+
+/** 
+ * \brief structure to keep namelists in
+ */
+struct namelist {
+       struct namelist *next; /**< next item of the linked list */
+       char name[32];         /**< name of the userentry */
+};
+
+/**
+ * \brief display the userlist
+ */
+void userlist(void)
+{
+       char buf[256];
+       char fl[256];
+       char title[256];
+       struct tm tmbuf;
+       time_t lc;
+       struct namelist *bio = NULL;
+       struct namelist *bptr;
+       int has_bio;
+       int bg = 0;
+
+       serv_puts("LBIO");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '1')
+               while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+                       bptr = (struct namelist *) malloc(sizeof(struct namelist));
+                       bptr->next = bio;
+                       strcpy(bptr->name, buf);
+                       bio = bptr;
+               }
+       output_headers(1, 1, 2, 0, 0, 0);
+       wprintf("<div id=\"banner\">\n"
+               "<table width=100%% border=0 bgcolor=\"#444455\"><tr><td>"
+               "<span class=\"titlebar\">");
+       snprintf(title, sizeof title, _("User list for %s"), serv_info.serv_humannode);
+       escputs(title);
+       wprintf("</span>"
+               "</td></tr></table>\n"
+               "</div>\n<div id=\"content\">\n"
+       );
+
+       serv_puts("LIST");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '1') {
+               wprintf("<em>%s</em><br />\n", &buf[4]);
+               goto DONE;
+       }
+
+       wprintf("<div class=\"fix_scrollbar_bug\">"
+               "<table border=0 width=100%% bgcolor=\"#ffffff\"><tr><td>\n");
+       wprintf("<tr><th>%s</th><th>%s</th><th>%s</th>"
+                       "<th>%s</th><th>%s</th><th>%s</th></tr>",
+                       _("User Name"),
+                       _("Number"),
+                       _("Access Level"),
+                       _("Last Login"),
+                       _("Total Logins"),
+                       _("Total Posts"));
+
+       while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+               extract_token(fl, buf, 0, '|', sizeof fl);
+               has_bio = 0;
+               for (bptr = bio; bptr != NULL; bptr = bptr->next) {
+                       if (!strcasecmp(fl, bptr->name))
+                               has_bio = 1;
+               }
+               bg = 1 - bg;
+               wprintf("<tr bgcolor=\"#%s\"><td>",
+                       (bg ? "DDDDDD" : "FFFFFF")
+               );
+               if (has_bio) {
+                       wprintf("<a href=\"showuser&who=");
+                       urlescputs(fl);
+                       wprintf("\">");
+                       escputs(fl);
+                       wprintf("</A>");
+               } else {
+                       escputs(fl);
+               }
+               wprintf("</td><td>%ld</td><td>%d</td><td>",
+                       extract_long(buf, 2),
+                       extract_int(buf, 1));
+               lc = extract_long(buf, 3);
+               localtime_r(&lc, &tmbuf);
+               wprintf("%02d/%02d/%04d ",
+                       (tmbuf.tm_mon + 1),
+                       tmbuf.tm_mday,
+                       (tmbuf.tm_year + 1900));
+
+
+               wprintf("</td><td>%ld</td><td>%5ld</td></tr>\n",
+                       extract_long(buf, 4), extract_long(buf, 5));
+
+       }
+       wprintf("</table></div>\n");
+DONE:  wDumpContent(1);
+}
+
+
+/**
+ * \brief Display (non confidential) information about a particular user
+ */
+void showuser(void)
+{
+       char who[256];
+       char buf[256];
+       int have_pic;
+
+       strcpy(who, bstr("who"));
+
+       output_headers(1, 1, 2, 0, 0, 0);
+       wprintf("<div id=\"banner\">\n"
+               "<table width=100%% border=0 bgcolor=\"#444455\"><tr>"
+               "<td><img src=\"static/usermanag_48x.gif\"></td>"
+               "<td align=left><span class=\"titlebar\">");
+       wprintf(_("User profile"));
+       wprintf("</span>"
+               "</td></tr></table>\n"
+               "</div>\n<div id=\"content\">\n"
+       );
+
+       wprintf("<div class=\"fix_scrollbar_bug\">"
+               "<table border=0 width=100%% bgcolor=\"#ffffff\"><tr><td>\n");
+
+       serv_printf("OIMG _userpic_|%s", who);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '2') {
+               have_pic = 1;
+               serv_puts("CLOS");
+               serv_getln(buf, sizeof buf);
+       } else {
+               have_pic = 0;
+       }
+
+       wprintf("<center><table><tr><td>");
+       if (have_pic == 1) {
+               wprintf("<img src=\"image&name=_userpic_&parm=");
+               urlescputs(who);
+               wprintf("\">");
+       }
+       wprintf("</td><td><h1>%s</h1></td></tr></table></center>\n", who);
+       serv_printf("RBIO %s", who);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '1') {
+               fmout("JUSTIFY");
+       }
+       wprintf("<br /><a href=\"display_page?recp=");
+       urlescputs(who);
+       wprintf("\">"
+               "<img src=\"static/citadelchat_24x.gif\" "
+               "align=middle border=0>&nbsp;&nbsp;");
+       snprintf(buf, sizeof buf, _("Click here to send an instant message to %s"), who);
+       escputs(buf);
+       wprintf("</a>\n");
+
+       wprintf("</td></tr></table></div>\n");
+       wDumpContent(1);
+}
+
+
+/*@}*/
diff --git a/webcit/vcard.c b/webcit/vcard.c
new file mode 100644 (file)
index 0000000..1f86625
--- /dev/null
@@ -0,0 +1,376 @@
+/*
+ * $Id$
+ * Copyright (C) 1999-2006 by Art Cancro
+ * This code is freely redistributable under the terms of the GNU General
+ * Public License.  All other rights reserved.
+ */
+/**
+ * \defgroup VCardMain vCard data type implementation for the Citadel system.
+ * \ingroup VCards
+ */
+/*@{*/
+#include "webcit.h"
+#include "webserver.h"
+#include "vcard.h"
+
+/** 
+ * \brief Constructor (empty vCard)
+ * \return an empty vcard
+ */
+struct vCard *vcard_new() {
+       struct vCard *v;
+
+       v = (struct vCard *) malloc(sizeof(struct vCard));
+       if (v == NULL) return v;
+
+       v->magic = CTDL_VCARD_MAGIC;
+       v->numprops = 0;
+       v->prop = NULL;
+
+       return v;
+}
+
+/**
+ * \brief      Remove the "charset=" attribute from a vCard property name
+ *
+ * \param      strbuf          The property name string to be stripped
+ */
+void remove_charset_attribute(char *strbuf)
+{
+       int i, t;
+       char compare[256];
+
+       t = num_tokens(strbuf, ';');
+       for (i=0; i<t; ++i) {
+               extract_token(compare, strbuf, i, ';', sizeof compare);
+               striplt(compare);
+               if (!strncasecmp(compare, "charset=", 8)) {
+                       remove_token(strbuf, i, ';');
+               }
+       }
+       if (strlen(strbuf) > 0) {
+               if (strbuf[strlen(strbuf)-1] == ';') {
+                       strbuf[strlen(strbuf)-1] = 0;
+               }
+       }
+}
+
+
+/*
+ * \brief      Add a property to a vCard
+ *
+ * \param      v               vCard structure to which we are adding
+ * \param      propname        name of new property
+ * \param      propvalue       value of new property
+ */
+void vcard_add_prop(struct vCard *v, char *propname, char *propvalue) {
+       ++v->numprops;
+       v->prop = realloc(v->prop,
+               (v->numprops * sizeof(struct vCardProp)) );
+       v->prop[v->numprops-1].name = strdup(propname);
+       v->prop[v->numprops-1].value = strdup(propvalue);
+}
+
+
+
+/**
+ * \brief Constructor (supply serialized vCard)
+ * \param vtext the text to parse into the new vcard
+ * \return the parsed VCard
+ */
+struct vCard *vcard_load(char *vtext) {
+       struct vCard *v;
+       int valid = 0;
+       char *mycopy, *ptr;
+       char *namebuf, *valuebuf;
+       int i;
+       int colonpos, nlpos;
+
+       if (vtext == NULL) return vcard_new();
+       mycopy = strdup(vtext);
+       if (mycopy == NULL) return NULL;
+
+       /**
+        * First, fix this big pile o' vCard to make it more parseable.
+        * To make it easier to parse, we convert CRLF to LF, and unfold any
+        * multi-line fields into single lines.
+        */
+       for (i=0; i<strlen(mycopy); ++i) {
+               if (!strncmp(&mycopy[i], "\r\n", 2)) {
+                       strcpy(&mycopy[i], &mycopy[i+1]);
+               }
+               if ( (mycopy[i]=='\n') && (isspace(mycopy[i+1])) ) {
+                       strcpy(&mycopy[i], &mycopy[i+1]);
+               }
+       }
+
+       v = vcard_new();
+       if (v == NULL) return v;
+
+       ptr = mycopy;
+       while (strlen(ptr)>0) {
+               colonpos = (-1);
+               nlpos = (-1);
+               colonpos = pattern2(ptr, ":");
+               nlpos = pattern2(ptr, "\n");
+
+               if ((nlpos > colonpos) && (colonpos > 0)) {
+                       namebuf = malloc(colonpos + 1);
+                       valuebuf = malloc(nlpos - colonpos + 1);
+                       strncpy(namebuf, ptr, colonpos);
+                       namebuf[colonpos] = 0;
+                       strncpy(valuebuf, &ptr[colonpos+1], nlpos-colonpos-1);
+                       valuebuf[nlpos-colonpos-1] = 0;
+
+                       if (!strcasecmp(namebuf, "end")) {
+                               valid = 0;
+                       }
+                       if (    (!strcasecmp(namebuf, "begin"))
+                               && (!strcasecmp(valuebuf, "vcard"))
+                       ) {
+                               valid = 1;
+                       }
+
+                       if ( (valid) && (strcasecmp(namebuf, "begin")) ) {
+                               remove_charset_attribute(namebuf);
+                               ++v->numprops;
+                               v->prop = realloc(v->prop,
+                                       (v->numprops * sizeof(struct vCardProp))
+                               );
+                               v->prop[v->numprops-1].name = namebuf;
+                               v->prop[v->numprops-1].value = valuebuf;
+                       } 
+                       else {
+                               free(namebuf);
+                               free(valuebuf);
+                       }
+
+               }
+
+               while ( (*ptr != '\n') && (strlen(ptr)>0) ) {
+                       ++ptr;
+               }
+               if (*ptr == '\n') ++ptr;
+       }
+
+       free(mycopy);
+       return v;
+}
+
+
+/**
+ * \brief Fetch the value of a particular key.
+ * If is_partial is set to 1, a partial match is ok (for example,
+ * a key of "tel;home" will satisfy a search for "tel").
+ * Set "instance" to a value higher than 0 to return subsequent instances
+ * of the same key.
+ * Set "get_propname" to nonzero to fetch the property name instead of value.
+ * \param v vCard to get keyvalue from
+ * \param propname key to retrieve
+ * \param is_partial dunno???
+ * \param instance if >0 return a later token of the value
+ * \param get_propname if nonzero get the real property name???
+ * \return the requested value / token / propertyname
+ */
+char *vcard_get_prop(struct vCard *v, char *propname,
+                       int is_partial, int instance, int get_propname) {
+       int i;
+       int found_instance = 0;
+
+       if (v->numprops) for (i=0; i<(v->numprops); ++i) {
+               if ( (!strcasecmp(v->prop[i].name, propname))
+                  || (propname[0] == 0)
+                  || (  (!strncasecmp(v->prop[i].name,
+                                       propname, strlen(propname)))
+                        && (v->prop[i].name[strlen(propname)] == ';')
+                        && (is_partial) ) ) {
+                       if (instance == found_instance++) {
+                               if (get_propname) {
+                                       return(v->prop[i].name);
+                               }
+                               else {
+                                       return(v->prop[i].value);
+                               }
+                       }
+               }
+       }
+
+       return NULL;
+}
+
+
+
+
+/**
+ * \brief Destructor
+ * kill a vCard
+ * \param v the vCard to purge from memory
+ */
+void vcard_free(struct vCard *v) {
+       int i;
+       
+       if (v->magic != CTDL_VCARD_MAGIC) return;       /* Self-check */
+       
+       if (v->numprops) for (i=0; i<(v->numprops); ++i) {
+               free(v->prop[i].name);
+               free(v->prop[i].value);
+       }
+
+       if (v->prop != NULL) free(v->prop);
+       
+       memset(v, 0, sizeof(struct vCard));
+       free(v);
+}
+
+
+
+
+/**
+ * \brief Set a name/value pair in the card
+ * \param v vCard to inspect
+ * \param name key to set
+ * \param value the value to assign to key
+ * \param append should we append the value to an existing one?
+ */
+void vcard_set_prop(struct vCard *v, char *name, char *value, int append) {
+       int i;
+
+       if (v->magic != CTDL_VCARD_MAGIC) return;       /** Self-check */
+
+       /** If this key is already present, replace it */
+       if (!append) if (v->numprops) for (i=0; i<(v->numprops); ++i) {
+               if (!strcasecmp(v->prop[i].name, name)) {
+                       free(v->prop[i].name);
+                       free(v->prop[i].value);
+                       v->prop[i].name = strdup(name);
+                       v->prop[i].value = strdup(value);
+                       return;
+               }
+       }
+
+       /** Otherwise, append it */
+       ++v->numprops;
+       v->prop = realloc(v->prop,
+               (v->numprops * sizeof(struct vCardProp)) );
+       v->prop[v->numprops-1].name = strdup(name);
+       v->prop[v->numprops-1].value = strdup(value);
+}
+
+
+
+
+/**
+ * \brief Serialize a struct vcard into a standard text/x-vcard MIME type.
+ * \param v vCard to serialize
+ * \return the serialized vCard
+ */
+char *vcard_serialize(struct vCard *v)
+{
+       char *ser;
+       int i, j;
+       size_t len;
+       int is_utf8 = 0;
+
+       if (v->magic != CTDL_VCARD_MAGIC) return NULL;  /** self check */
+
+       /** Figure out how big a buffer we need to allocate */
+       len = 64;       /** for begin, end, and a little padding for safety */
+       if (v->numprops) for (i=0; i<(v->numprops); ++i) {
+               len = len +
+                       strlen(v->prop[i].name) +
+                       strlen(v->prop[i].value) + 16;
+       }
+
+       ser = malloc(len);
+       if (ser == NULL) return NULL;
+
+       safestrncpy(ser, "begin:vcard\r\n", len);
+       if (v->numprops) for (i=0; i<(v->numprops); ++i) {
+               if ( (strcasecmp(v->prop[i].name, "end")) && (v->prop[i].value != NULL) ) {
+                       is_utf8 = 0;
+                       for (j=0; j<strlen(v->prop[i].value); ++j) {
+                               if ( (v->prop[i].value[j] < 32) || (v->prop[i].value[j] > 126) ) {
+                                       is_utf8 = 1;
+                               }
+                       }
+                       strcat(ser, v->prop[i].name);
+                       if (is_utf8) {
+                               strcat(ser, ";charset=UTF-8");
+                       }
+                       strcat(ser, ":");
+                       strcat(ser, v->prop[i].value);
+                       strcat(ser, "\r\n");
+               }
+       }
+       strcat(ser, "end:vcard\r\n");
+
+       return ser;
+}
+
+
+
+/*
+ * \brief      Convert FN (Friendly Name) into N (Name)
+ *
+ * \param      vname           Supplied friendly-name
+ * \param      n               Target buffer to store Name
+ * \param      vname_size      Size of buffer
+ */
+void vcard_fn_to_n(char *vname, char *n, size_t vname_size) {
+       char lastname[256];
+       char firstname[256];
+       char middlename[256];
+       char honorific_prefixes[256];
+       char honorific_suffixes[256];
+       char buf[256];
+
+       safestrncpy(buf, n, sizeof buf);
+
+       /* Try to intelligently convert the screen name to a
+        * fully expanded vCard name based on the number of
+        * words in the name
+        */
+       safestrncpy(lastname, "", sizeof lastname);
+       safestrncpy(firstname, "", sizeof firstname);
+       safestrncpy(middlename, "", sizeof middlename);
+       safestrncpy(honorific_prefixes, "", sizeof honorific_prefixes);
+       safestrncpy(honorific_suffixes, "", sizeof honorific_suffixes);
+
+       /* Honorific suffixes */
+       if (num_tokens(buf, ',') > 1) {
+               extract_token(honorific_suffixes, buf, (num_tokens(buf, ' ') - 1), ',',
+                       sizeof honorific_suffixes);
+               remove_token(buf, (num_tokens(buf, ',') - 1), ',');
+       }
+
+       /* Find a last name */
+       extract_token(lastname, buf, (num_tokens(buf, ' ') - 1), ' ', sizeof lastname);
+       remove_token(buf, (num_tokens(buf, ' ') - 1), ' ');
+
+       /* Find honorific prefixes */
+       if (num_tokens(buf, ' ') > 2) {
+               extract_token(honorific_prefixes, buf, 0, ' ', sizeof honorific_prefixes);
+               remove_token(buf, 0, ' ');
+       }
+
+       /* Find a middle name */
+       if (num_tokens(buf, ' ') > 1) {
+               extract_token(middlename, buf, (num_tokens(buf, ' ') - 1), ' ', sizeof middlename);
+               remove_token(buf, (num_tokens(buf, ' ') - 1), ' ');
+       }
+
+       /* Anything left is probably the first name */
+       safestrncpy(firstname, buf, sizeof firstname);
+       striplt(firstname);
+
+       /* Compose the structured name */
+       snprintf(vname, vname_size, "%s;%s;%s;%s;%s", lastname, firstname, middlename,
+               honorific_prefixes, honorific_suffixes);
+}
+
+
+
+
+
+
+/*@}*/
diff --git a/webcit/vcard.h b/webcit/vcard.h
new file mode 100644 (file)
index 0000000..33a4559
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * $Id$
+ * Copyright (C) 1999 by Art Cancro
+ * This code is freely redistributable under the terms of the GNU General
+ * Public License.  All other rights reserved.
+ */
+/**
+ * \defgroup VcardHeader vCard implementation for Citadel
+ * \ingroup VCards
+ *
+ */
+
+/*@{ */
+#define CTDL_VCARD_MAGIC       0xa1f9 /**< magic byte vcards start with??? */
+
+/**
+ * \brief This data structure represents a vCard object currently in memory.
+ */
+struct vCard {
+       int magic;          /**< the Magic Byte */
+       int numprops;       /**< number of properties this vcard will have */
+       struct vCardProp {  
+               char *name;         /**< Keyname of the property */
+               char *value;        /**< value of the property */
+       } *prop;            /**< Vcard Property. Linked list??? */
+};
+
+
+struct vCard *vcard_new(void);
+struct vCard *vcard_load(char *);
+void vcard_free(struct vCard *);
+void vcard_set_prop(struct vCard *v, char *name, char *value, int append);
+char *vcard_get_prop(struct vCard *v, char *propname, int is_partial,
+                       int instance, int return_propname);
+char *vcard_serialize(struct vCard *);
+void vcard_add_prop(struct vCard *v, char *propname, char *propvalue);
+
+
+/*@}*/
diff --git a/webcit/vcard_edit.c b/webcit/vcard_edit.c
new file mode 100644 (file)
index 0000000..22ade62
--- /dev/null
@@ -0,0 +1,459 @@
+/*
+ * $Id$
+ */
+/**
+ * \defgroup vCardEdit Handles on-screen editing of vCard objects.
+ * \ingroup VCards
+ */
+/*@{*/
+#include "webcit.h"
+#include "vcard.h"
+
+/**
+ * \brief 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.
+ * \param msgnum number of the item on the citadel server
+ * \param partnum what???
+ * \param return_to where to go back in the browser after edit ????
+ */
+void do_edit_vcard(long msgnum, char *partnum, char *return_to) {
+       char buf[SIZ];
+       char *serialized_vcard = NULL;
+       size_t total_len = 0;
+       struct vCard *v;
+       int i;
+       char *key, *value;
+       char whatuser[256];
+
+       char lastname[256];
+       char firstname[256];
+       char middlename[256];
+       char prefix[256];
+       char suffix[256];
+       char pobox[256];
+       char extadr[256];
+       char street[256];
+       char city[256];
+       char state[256];
+       char zipcode[256];
+       char country[256];
+       char hometel[256];
+       char worktel[256];
+       char primary_inetemail[256];
+       char other_inetemail[SIZ];
+       char extrafields[SIZ];
+       char fullname[256];
+       char title[256];
+       char org[256];
+
+       lastname[0] = 0;
+       firstname[0] = 0;
+       middlename[0] = 0;
+       prefix[0] = 0;
+       suffix[0] = 0;
+       pobox[0] = 0;
+       extadr[0] = 0;
+       street[0] = 0;
+       city[0] = 0;
+       state[0] = 0;
+       zipcode[0] = 0;
+       country[0] = 0;
+       hometel[0] = 0;
+       worktel[0] = 0;
+       primary_inetemail[0] = 0;
+       other_inetemail[0] = 0;
+       title[0] = 0;
+       org[0] = 0;
+       extrafields[0] = 0;
+       fullname[0] = 0;
+
+       safestrncpy(whatuser, "", sizeof whatuser);
+
+       if (msgnum >= 0) {
+               sprintf(buf, "MSG0 %ld|1", msgnum);
+               serv_puts(buf);
+               serv_getln(buf, sizeof buf);
+               if (buf[0] != '1') {
+                       convenience_page("770000", _("Error"), &buf[4]);
+                       return;
+               }
+               while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+                       if (!strncasecmp(buf, "from=", 5)) {
+                               safestrncpy(whatuser, &buf[5], sizeof whatuser);
+                       }
+                       else if (!strncasecmp(buf, "node=", 5)) {
+                               strcat(whatuser, " @ ");
+                               strcat(whatuser, &buf[5]);
+                       }
+               }
+       
+               sprintf(buf, "OPNA %ld|%s", msgnum, partnum);
+               serv_puts(buf);
+               serv_getln(buf, sizeof buf);
+               if (buf[0] != '2') {
+                       convenience_page("770000", "Error", &buf[4]);
+                       return;
+               }
+       
+               total_len = atoi(&buf[4]);
+               serialized_vcard = malloc(total_len + 2);
+       
+               read_server_binary(serialized_vcard, total_len);
+       
+               serv_puts("CLOS");
+               serv_getln(buf, sizeof buf);
+               serialized_vcard[total_len] = 0;
+       
+               v = vcard_load(serialized_vcard);
+               free(serialized_vcard);
+       
+               /* Populate the variables for our form */
+               i = 0;
+               while (key = vcard_get_prop(v, "", 0, i, 1), key != NULL) {
+                       value = vcard_get_prop(v, "", 0, i++, 0);
+       
+                       if (!strcasecmp(key, "n")) {
+                               extract_token(lastname, value, 0, ';', sizeof lastname);
+                               extract_token(firstname, value, 1, ';', sizeof firstname);
+                               extract_token(middlename, value, 2, ';', sizeof middlename);
+                               extract_token(prefix, value, 3, ';', sizeof prefix);
+                               extract_token(suffix, value, 4, ';', sizeof suffix);
+                       }
+
+                       else if (!strcasecmp(key, "fn")) {
+                               safestrncpy(fullname, value, sizeof fullname);
+                       }
+
+                       else if (!strcasecmp(key, "title")) {
+                               safestrncpy(title, value, sizeof title);
+                       }
+       
+                       else if (!strcasecmp(key, "org")) {
+                               safestrncpy(org, value, sizeof org);
+                       }
+       
+                       else if (!strcasecmp(key, "adr")) {
+                               extract_token(pobox, value, 0, ';', sizeof pobox);
+                               extract_token(extadr, value, 1, ';', sizeof extadr);
+                               extract_token(street, value, 2, ';', sizeof street);
+                               extract_token(city, value, 3, ';', sizeof city);
+                               extract_token(state, value, 4, ';', sizeof state);
+                               extract_token(zipcode, value, 5, ';', sizeof zipcode);
+                               extract_token(country, value, 6, ';', sizeof country);
+                       }
+       
+                       else if (!strcasecmp(key, "tel;home")) {
+                               extract_token(hometel, value, 0, ';', sizeof hometel);
+                       }
+       
+                       else if (!strcasecmp(key, "tel;work")) {
+                               extract_token(worktel, value, 0, ';', sizeof worktel);
+                       }
+       
+                       else if (!strcasecmp(key, "email;internet")) {
+                               if (primary_inetemail[0] == 0) {
+                                       safestrncpy(primary_inetemail, value, sizeof primary_inetemail);
+                               }
+                               else {
+                                       if (other_inetemail[0] != 0) {
+                                               strcat(other_inetemail, "\n");
+                                       }
+                                       strcat(other_inetemail, value);
+                               }
+                       }
+       
+                       else {
+                               strcat(extrafields, key);
+                               strcat(extrafields, ":");
+                               strcat(extrafields, value);
+                               strcat(extrafields, "\n");
+                       }
+       
+               }
+       
+               vcard_free(v);
+       }
+
+       /** Display the form */
+       output_headers(1, 1, 2, 0, 0, 0);
+       wprintf("<div id=\"banner\">\n"
+               "<table width=100%% border=0 bgcolor=\"#444455\"><tr><td>"
+               "<span class=\"titlebar\">"
+               "<img src=\"static/savecontact_48x.gif\">");
+       wprintf(_("Edit contact information"));
+       wprintf("</span>"
+               "</td></tr></table>\n"
+               "</div>\n<div id=\"content\">\n"
+       );
+
+       wprintf("<form method=\"POST\" action=\"submit_vcard\">\n");
+       wprintf("<div class=\"fix_scrollbar_bug\">"
+               "<table border=0 width=100%% bgcolor=\"#ffffff\"><tr><td>\n");
+
+       wprintf("<table border=0><tr>"
+               "<td>%s</td>"
+               "<td>%s</td>"
+               "<td>%s</td>"
+               "<td>%s</td>"
+               "<td>%s</td></tr>\n",
+               _("Prefix"), _("First"), _("Middle"), _("Last"), _("Suffix")
+       );
+       wprintf("<tr><td><input type=\"text\" name=\"prefix\" "
+               "value=\"%s\" maxlength=\"5\" size=\"5\"></td>",
+               prefix);
+       wprintf("<td><input type=\"text\" name=\"firstname\" "
+               "value=\"%s\" maxlength=\"29\"></td>",
+               firstname);
+       wprintf("<td><input type=\"text\" name=\"middlename\" "
+               "value=\"%s\" maxlength=\"29\"></td>",
+               middlename);
+       wprintf("<td><input type=\"text\" name=\"lastname\" "
+               "value=\"%s\" maxlength=\"29\"></td>",
+               lastname);
+       wprintf("<td><input type=\"text\" name=\"suffix\" "
+               "value=\"%s\" maxlength=\"10\" size=\"10\"></td></tr></table>\n",
+               suffix);
+
+       wprintf("<table border=0 width=100%% bgcolor=\"#dddddd\">");
+       wprintf("<tr><td>");
+
+       wprintf(_("Display name:"));
+       wprintf("<br>"
+               "<input type=\"text\" name=\"fullname\" "
+               "value=\"%s\" maxlength=\"40\"><br><br>\n",
+               fullname
+       );
+
+       wprintf(_("Title:"));
+       wprintf("<br>"
+               "<input type=\"text\" name=\"title\" "
+               "value=\"%s\" maxlength=\"40\"><br><br>\n",
+               title
+       );
+
+       wprintf(_("Organization:"));
+       wprintf("<br>"
+               "<input type=\"text\" name=\"org\" "
+               "value=\"%s\" maxlength=\"40\"><br><br>\n",
+               org
+       );
+
+       wprintf("</td><td>");
+
+       wprintf("<table border=0>");
+       wprintf("<tr><td>");
+       wprintf(_("PO box:"));
+       wprintf("</td><td>"
+               "<input type=\"text\" name=\"pobox\" "
+               "value=\"%s\" maxlength=\"29\"></td></tr>\n",
+               pobox);
+       wprintf("<tr><td>");
+       wprintf(_("Address:"));
+       wprintf("</td><td>"
+               "<input type=\"text\" name=\"extadr\" "
+               "value=\"%s\" maxlength=\"29\"></td></tr>\n",
+               extadr);
+       wprintf("<tr><td> </td><td>"
+               "<input type=\"text\" name=\"street\" "
+               "value=\"%s\" maxlength=\"29\"></td></tr>\n",
+               street);
+       wprintf("<tr><td>");
+       wprintf(_("City:"));
+       wprintf("</td><td>"
+               "<input type=\"text\" name=\"city\" "
+               "value=\"%s\" maxlength=\"29\"></td></tr>\n",
+               city);
+       wprintf("<tr><td>");
+       wprintf(_("State:"));
+       wprintf("</td><td>"
+               "<input type=\"text\" name=\"state\" "
+               "value=\"%s\" maxlength=\"2\"></td></tr>\n",
+               state);
+       wprintf("<tr><td>");
+       wprintf(_("ZIP code:"));
+       wprintf("</td><td>"
+               "<input type=\"text\" name=\"zipcode\" "
+               "value=\"%s\" maxlength=\"10\"></td></tr>\n",
+               zipcode);
+       wprintf("<tr><td>");
+       wprintf(_("Country:"));
+       wprintf("</td><td>"
+               "<input type=\"text\" name=\"country\" "
+               "value=\"%s\" maxlength=\"29\" width=\"5\"></td></tr>\n",
+               country);
+       wprintf("</table>\n");
+
+       wprintf("</table>\n");
+
+       wprintf("<table border=0><tr><td>");
+       wprintf(_("Home telephone:"));
+       wprintf("</td>"
+               "<td><input type=\"text\" name=\"hometel\" "
+               "value=\"%s\" maxlength=\"29\"></td>\n",
+               hometel);
+       wprintf("<td>");
+       wprintf(_("Work telephone:"));
+       wprintf("</td>"
+               "<td><input type=\"text\" name=\"worktel\" "
+               "value=\"%s\" maxlength=\"29\"></td></tr></table>\n",
+               worktel);
+
+       wprintf("<table border=0 width=100%% bgcolor=\"#dddddd\">");
+       wprintf("<tr><td>");
+
+       wprintf("<table border=0><TR>"
+               "<td valign=top>");
+       wprintf(_("Primary Internet e-mail address"));
+       wprintf("<br />"
+               "<input type=\"text\" name=\"primary_inetemail\" "
+               "size=40 maxlength=40 value=\"");
+       escputs(primary_inetemail);
+       wprintf("\"><br />"
+               "</td><td valign=top>");
+       wprintf(_("Internet e-mail aliases"));
+       wprintf("<br />"
+               "<textarea name=\"other_inetemail\" rows=5 cols=40 width=40>");
+       escputs(other_inetemail);
+       wprintf("</textarea></td></tr></table>\n");
+
+       wprintf("</td></tr></table>\n");
+
+       wprintf("<input type=\"hidden\" name=\"extrafields\" value=\"");
+       escputs(extrafields);
+       wprintf("\">\n");
+
+       wprintf("<input type=\"hidden\" name=\"return_to\" value=\"");
+       urlescputs(return_to);
+       wprintf("\">\n");
+
+       wprintf("<center>\n"
+               "<input type=\"submit\" name=\"ok_button\" value=\"%s\">"
+               "&nbsp;"
+               "<input type=\"submit\" name=\"cancel_button\" value=\"%s\">"
+               "</center></form>\n",
+               _("Save changes"),
+               _("Cancel")
+       );
+       
+       wprintf("</td></tr></table></div>\n");
+       wDumpContent(1);
+}
+
+
+/**
+ * \brief commit the edits to the citadel server
+ */
+void edit_vcard(void) {
+       long msgnum;
+       char *partnum;
+
+       msgnum = atol(bstr("msgnum"));
+       partnum = bstr("partnum");
+       do_edit_vcard(msgnum, partnum, "");
+}
+
+
+
+/**
+ * \brief parse edited vcard from the browser
+ */
+void submit_vcard(void) {
+       struct vCard *v;
+       char *serialized_vcard;
+       char buf[SIZ];
+       int i;
+
+       if (strlen(bstr("ok_button")) == 0) { 
+               readloop("readnew");
+               return;
+       }
+
+       sprintf(buf, "ENT0 1|||4||");
+       serv_puts(buf);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] != '4') {
+               edit_vcard();
+               return;
+       }
+
+       /** Make a vCard structure out of the data supplied in the form */
+
+       snprintf(buf, sizeof buf, "begin:vcard\r\n%s\r\nend:vcard\r\n",
+               bstr("extrafields")
+       );
+       v = vcard_load(buf);    /** Start with the extra fields */
+       if (v == NULL) {
+               safestrncpy(WC->ImportantMessage,
+                       _("An error has occurred."),
+                       sizeof WC->ImportantMessage
+               );
+               edit_vcard();
+               return;
+       }
+
+       snprintf(buf, sizeof buf, "%s;%s;%s;%s;%s",
+               bstr("lastname"),
+               bstr("firstname"),
+               bstr("middlename"),
+               bstr("prefix"),
+               bstr("suffix") );
+       vcard_add_prop(v, "n", buf);
+       
+       vcard_add_prop(v, "title", bstr("title"));
+       vcard_add_prop(v, "fn", bstr("fullname"));
+       vcard_add_prop(v, "org", bstr("org"));
+
+       snprintf(buf, sizeof buf, "%s;%s;%s;%s;%s;%s;%s",
+               bstr("pobox"),
+               bstr("extadr"),
+               bstr("street"),
+               bstr("city"),
+               bstr("state"),
+               bstr("zipcode"),
+               bstr("country") );
+       vcard_add_prop(v, "adr", buf);
+
+       vcard_add_prop(v, "tel;home", bstr("hometel"));
+       vcard_add_prop(v, "tel;work", bstr("worktel"));
+       vcard_add_prop(v, "email;internet", bstr("primary_inetemail"));
+
+       for (i=0; i<num_tokens(bstr("other_inetemail"), '\n'); ++i) {
+               extract_token(buf, bstr("other_inetemail"), i, '\n', sizeof buf);
+               if (strlen(buf) > 0) {
+                       vcard_add_prop(v, "email;internet", buf);
+               }
+       }
+
+       serialized_vcard = vcard_serialize(v);
+       vcard_free(v);
+       if (serialized_vcard == NULL) {
+               safestrncpy(WC->ImportantMessage,
+                       _("An error has occurred."),
+                       sizeof WC->ImportantMessage
+               );
+               edit_vcard();
+               return;
+       }
+
+       serv_puts("Content-type: text/x-vcard; charset=UTF-8");
+       serv_puts("");
+       serv_printf("%s\r\n", serialized_vcard);
+       serv_puts("000");
+       free(serialized_vcard);
+
+       if (!strcmp(bstr("return_to"), "select_user_to_edit")) {
+               select_user_to_edit(NULL, NULL);
+       }
+       else if (!strcmp(bstr("return_to"), "do_welcome")) {
+               do_welcome();
+       }
+       else {
+               readloop("readnew");
+       }
+}
+
+
+
+/*@}*/
diff --git a/webcit/webcit.c b/webcit/webcit.c
new file mode 100644 (file)
index 0000000..dd3503d
--- /dev/null
@@ -0,0 +1,1668 @@
+/*
+ * $Id$
+ */
+/**
+ * \defgroup MainServer 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.
+ * \ingroup WebcitHttpServer
+ */
+/*@{*/
+#include "webcit.h"
+#include "groupdav.h"
+#include "webserver.h"
+#include "mime_parser.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";
+
+/**
+ * \brief remove escaped strings from i.e. the url string (like %20 for blanks)
+ * \param buf the buffer to examine
+ */
+void unescape_input(char *buf)
+{
+       int a, b;
+       char hex[3];
+
+       while ((isspace(buf[strlen(buf) - 1])) && (strlen(buf) > 0))
+               buf[strlen(buf) - 1] = 0;
+
+       for (a = 0; a < strlen(buf); ++a) {
+               if (buf[a] == '+')
+                       buf[a] = ' ';
+               if (buf[a] == '%') {
+                       hex[0] = buf[a + 1];
+                       hex[1] = buf[a + 2];
+                       hex[2] = 0;
+                       b = 0;
+                       sscanf(hex, "%02x", &b);
+                       buf[a] = (char) b;
+                       strcpy(&buf[a + 1], &buf[a + 3]);
+               }
+       }
+
+}
+
+/**
+ * \brief Extract variables from the URL.
+ * \param url URL supplied by the HTTP parser
+ */
+void addurls(char *url)
+{
+       char *up, *ptr;
+       char buf[SIZ];
+       int a, b;
+       struct urlcontent *u;
+
+       up = url;
+       while (strlen(up) > 0) {
+
+               /** locate the = sign */
+               safestrncpy(buf, up, sizeof buf);
+               b = (-1);
+               for (a = 255; a >= 0; --a)
+                       if (buf[a] == '=')
+                               b = a;
+               if (b < 0)
+                       return;
+               buf[b] = 0;
+
+               u = (struct urlcontent *) malloc(sizeof(struct urlcontent));
+               u->next = WC->urlstrings;
+               WC->urlstrings = u;
+               safestrncpy(u->url_key, buf, sizeof u->url_key);
+
+               /** now chop that part off */
+               for (a = 0; a <= b; ++a)
+                       ++up;
+
+               /** locate "&" and "?" delimiters */
+               ptr = up;
+               b = strlen(up);
+               for (a = 0; a < strlen(up); ++a) {
+                       if ( (ptr[0] == '&') || (ptr[0] == '?') ) {
+                               b = a;
+                               break;
+                       }
+                       ++ptr;
+               }
+               ptr = up;
+               for (a = 0; a < b; ++a)
+                       ++ptr;
+               strcpy(ptr, "");
+
+               u->url_data = malloc(strlen(up) + 2);
+               safestrncpy(u->url_data, up, strlen(up) + 1);
+               u->url_data[b] = 0;
+               unescape_input(u->url_data);
+               up = ptr;
+               ++up;
+       }
+}
+
+/**
+ * \brief free urlstring memory
+ */
+void free_urls(void)
+{
+       struct urlcontent *u;
+
+       while (WC->urlstrings != NULL) {
+               free(WC->urlstrings->url_data);
+               u = WC->urlstrings->next;
+               free(WC->urlstrings);
+               WC->urlstrings = u;
+       }
+}
+
+/**
+ * \brief Diagnostic function to display the contents of all variables
+ */
+void dump_vars(void)
+{
+       struct urlcontent *u;
+
+       for (u = WC->urlstrings; u != NULL; u = u->next) {
+               wprintf("%38s = %s\n", u->url_key, u->url_data);
+       }
+}
+
+/**
+ * \brief Return the value of a variable supplied to the current web page (from the url or a form)
+ * \param key The name of the variable we want
+ */
+char *bstr(char *key)
+{
+       struct urlcontent *u;
+
+       for (u = WC->urlstrings; u != NULL; u = u->next) {
+               if (!strcasecmp(u->url_key, key))
+                       return (u->url_data);
+       }
+       return ("");
+}
+
+/**
+ * \brief web-printing funcion. uses our vsnprintf wrapper
+ * \param format printf format string 
+ * \param ... the varargs to put into formatstring
+ */
+void wprintf(const char *format,...)
+{
+       va_list arg_ptr;
+       char wbuf[4096];
+
+       va_start(arg_ptr, format);
+       vsnprintf(wbuf, sizeof wbuf, format, arg_ptr);
+       va_end(arg_ptr);
+
+       client_write(wbuf, strlen(wbuf));
+}
+
+
+/**
+ * \brief wrap up an HTTP session, closes tags, etc.
+ * \todo multiline params?
+ * \param print_standard_html_footer should be set to 0 to transmit only, 1 to
+ * append the main menu and closing tags, or 2 to
+ * append the closing tags only.
+ */
+void wDumpContent(int print_standard_html_footer)
+{
+       if (print_standard_html_footer) {
+               wprintf("</div>\n");    /* end of "text" div */
+               do_template("trailing");
+       }
+
+       /* If we've been saving it all up for one big output burst,
+        * go ahead and do that now.
+        */
+       end_burst();
+}
+
+
+/**
+ * \brief Copy a string, escaping characters which have meaning in HTML.  
+ * \param target target buffer
+ * \param strbuf source buffer
+ * \param nbsp If nonzero, spaces are converted to non-breaking spaces.
+ * \param nolinebreaks if set, linebreaks are removed from the string.
+ */
+void stresc(char *target, char *strbuf, int nbsp, int nolinebreaks)
+{
+       int a;
+       strcpy(target, "");
+
+       for (a = 0; a < strlen(strbuf); ++a) {
+               if (strbuf[a] == '<')
+                       strcat(target, "&lt;");
+               else if (strbuf[a] == '>')
+                       strcat(target, "&gt;");
+               else if (strbuf[a] == '&')
+                       strcat(target, "&amp;");
+               else if (strbuf[a] == '\"')
+                       strcat(target, "&quot;");
+               else if (strbuf[a] == '\'') 
+                       strcat(target, "&#39;");
+               else if (strbuf[a] == LB)
+                       strcat(target, "<");
+               else if (strbuf[a] == RB)
+                       strcat(target, ">");
+               else if (strbuf[a] == QU)
+                       strcat(target, "\"");
+               else if ((strbuf[a] == 32) && (nbsp == 1))
+                       strcat(target, "&nbsp;");
+               else if ((strbuf[a] == '\n') && (nolinebreaks))
+                       strcat(target, "");     /* nothing */
+               else if ((strbuf[a] == '\r') && (nolinebreaks))
+                       strcat(target, "");     /* nothing */
+               else
+                       strncat(target, &strbuf[a], 1);
+       }
+}
+
+/**
+ * \brief WHAT???
+ * \param strbuf what???
+ * \param nbsp If nonzero, spaces are converted to non-breaking spaces.
+ * \param nolinebreaks if set, linebreaks are removed from the string.
+ */ 
+void escputs1(char *strbuf, int nbsp, int nolinebreaks)
+{
+       char *buf;
+
+       if (strbuf == NULL) return;
+       buf = malloc( (3 * strlen(strbuf)) + SIZ );
+       stresc(buf, strbuf, nbsp, nolinebreaks);
+       wprintf("%s", buf);
+       free(buf);
+}
+
+/** 
+ * \brief static wrapper for ecsputs1
+ * \param strbuf buffer to print escaped to client
+ */
+void escputs(char *strbuf)
+{
+       escputs1(strbuf, 0, 0);
+}
+
+/** 
+ * \brief Escape a string for feeding out as a URL.
+ * Returns a pointer to a buffer that must be freed by the caller!
+ * \param outbuf the output buffer
+ * \param strbuf the input buffer
+ */
+void urlesc(char *outbuf, char *strbuf)
+{
+       int a, b, c;
+       char *ec = " #&;`'|*?-~<>^()[]{}$\"\\";
+
+       strcpy(outbuf, "");
+
+       for (a = 0; a < strlen(strbuf); ++a) {
+               c = 0;
+               for (b = 0; b < strlen(ec); ++b) {
+                       if (strbuf[a] == ec[b])
+                               c = 1;
+               }
+               b = strlen(outbuf);
+               if (c == 1)
+                       sprintf(&outbuf[b], "%%%02x", strbuf[a]);
+               else
+                       sprintf(&outbuf[b], "%c", strbuf[a]);
+       }
+}
+
+/**
+ * \brief urlescape buffer and print it to the client
+ * \param strbuf buffer to urlescape
+ */
+void urlescputs(char *strbuf)
+{
+       char outbuf[SIZ];
+       
+       urlesc(outbuf, strbuf);
+       wprintf("%s", outbuf);
+}
+
+
+/**
+ * \brief Copy a string, escaping characters for JavaScript strings.
+ * \param target output string
+ * \param strbuf input string
+ */
+void jsesc(char *target, char *strbuf)
+{
+       int a;
+       strcpy(target, "");
+
+       for (a = 0; a < strlen(strbuf); ++a) {
+               if (strbuf[a] == '<')
+                       strcat(target, "[");
+               else if (strbuf[a] == '>')
+                       strcat(target, "]");
+               else if (strbuf[a] == '\"')
+                       strcat(target, "&quot;");
+               else if (strbuf[a] == '&')
+                       strcat(target, "&amp;;");
+               else if (strbuf[a] == '\'') 
+                       strcat(target, "\\'");
+               else {
+                       strncat(target, &strbuf[a], 1);
+               }
+       }
+}
+
+/**
+ * \brief escape and print java script
+ * \param strbuf the js code
+ */
+void jsescputs(char *strbuf)
+{
+       char outbuf[SIZ];
+       
+       jsesc(outbuf, strbuf);
+       wprintf("%s", outbuf);
+}
+
+/**
+ * \brief Copy a string, escaping characters for message text hold
+ * \param target target buffer
+ * \param strbuf source buffer
+ */
+void msgesc(char *target, char *strbuf)
+{
+       int a;
+       strcpy(target, "");
+
+       for (a = 0; a < strlen(strbuf); ++a) {
+               if (strbuf[a] == '\n')
+                       strcat(target, " ");
+               else if (strbuf[a] == '\r')
+                       strcat(target, " ");
+               else if (strbuf[a] == '\'')
+                       strcat(target, "&#39;");
+               else {
+                       strncat(target, &strbuf[a], 1);
+               }
+       }
+}
+
+/**
+ * \brief print a string to the client after cleaning it with msgesc()
+ * \param strbuf string to be printed
+ */
+void msgescputs(char *strbuf) {
+       char *outbuf;
+
+       if (strbuf == NULL) return;
+       outbuf = malloc( (3 * strlen(strbuf)) + SIZ);
+       msgesc(outbuf, strbuf);
+       wprintf("%s", outbuf);
+       free(outbuf);
+}
+
+
+
+
+/**
+ * \brief Output all that important stuff that the browser will want to see
+ */
+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,     /**< 0=no, 1=yes,                                     
+                                                                * 2 = I'm going to embed my own, so don't open the 
+                                                                *     <div id="content"> either.                   
+                                                                */
+
+                       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 cookie[1024];
+       char httpnow[128];
+
+       wprintf("HTTP/1.1 200 OK\n");
+       http_datestring(httpnow, sizeof httpnow, time(NULL));
+
+       if (do_httpheaders) {
+               wprintf("Content-type: text/html; charset=utf-8\r\n"
+                       "Server: %s / %s\n"
+                       "Connection: close\r\n",
+                       SERVER, serv_info.serv_software
+               );
+       }
+
+       if (cache) {
+               wprintf("Pragma: public\r\n"
+                       "Cache-Control: max-age=3600, must-revalidate\r\n"
+                       "Last-modified: %s\r\n",
+                       httpnow
+               );
+       }
+       else {
+               wprintf("Pragma: no-cache\r\n"
+                       "Cache-Control: no-store\r\n"
+               );
+       }
+
+       stuff_to_cookie(cookie, WC->wc_session, WC->wc_username,
+                       WC->wc_password, WC->wc_roomname);
+
+       if (unset_cookies) {
+               wprintf("Set-cookie: webcit=%s; path=/\r\n", unset);
+       } else {
+               wprintf("Set-cookie: webcit=%s; path=/\r\n", cookie);
+               if (server_cookie != NULL) {
+                       wprintf("%s\n", server_cookie);
+               }
+       }
+
+       if (do_htmlhead) {
+               begin_burst();
+               do_template("head");
+       }
+
+       /** ICONBAR */
+       if (do_htmlhead) {
+
+
+               /** check for ImportantMessages (these display in a div overlaying the main screen) */
+               if (strlen(WC->ImportantMessage) > 0) {
+                       wprintf("<div id=\"important_message\">\n");
+                       wprintf("<span class=\"imsg\">"
+                               "%s</span><br />\n", WC->ImportantMessage);
+                       wprintf("</div>\n");
+                       wprintf("<script type=\"text/javascript\">\n"
+                               "        setTimeout('hide_imsg_popup()', 3000); \n"
+                               "</script>\n");
+                       safestrncpy(WC->ImportantMessage, "", sizeof WC->ImportantMessage);
+               }
+
+               if ( (WC->logged_in) && (!unset_cookies) ) {
+                       wprintf("<div id=\"iconbar\">");
+                       do_selected_iconbar();
+                       /** check for instant messages (these display in a new window) */
+                       page_popup();
+                       wprintf("</div>");
+               }
+
+               if (do_room_banner == 1) {
+                       wprintf("<div id=\"banner\">\n");
+                       embed_room_banner(NULL, navbar_default);
+                       wprintf("</div>\n");
+               }
+       }
+
+       if (do_room_banner == 1) {
+               wprintf("<div id=\"content\">\n");
+       }
+}
+
+
+/**
+ * \brief Generic function to do an HTTP redirect.  Easy and fun.
+ * \param whichpage target url to 302 to
+ */
+void http_redirect(char *whichpage) {
+       wprintf("HTTP/1.1 302 Moved Temporarily\n");
+       wprintf("Location: %s\r\n", whichpage);
+       wprintf("URI: %s\r\n", whichpage);
+       wprintf("Content-type: text/html; charset=utf-8\r\n\r\n");
+       wprintf("<html><body>");
+       wprintf("Go <a href=\"%s\">here</A>.", whichpage);
+       wprintf("</body></html>\n");
+}
+
+
+
+/**
+ * \brief Output a piece of content to the web browser
+ */
+void http_transmit_thing(char *thing, size_t length, char *content_type,
+                        int is_static) {
+
+       output_headers(0, 0, 0, 0, 0, is_static);
+
+       wprintf("Content-type: %s\r\n"
+               "Server: %s\r\n"
+               "Connection: close\r\n",
+               content_type,
+               SERVER);
+
+#ifdef HAVE_ZLIB
+       /** If we can send the data out compressed, please do so. */
+       if (WC->gzip_ok) {
+               char *compressed_data = NULL;
+               uLongf compressed_len;
+
+               compressed_len = (uLongf) ((length * 101) / 100) + 100;
+               compressed_data = malloc(compressed_len);
+
+               if (compress_gzip((Bytef *) compressed_data,
+                                 &compressed_len,
+                                 (Bytef *) thing,
+                                 (uLongf) length, Z_BEST_SPEED) == Z_OK) {
+                       wprintf("Content-encoding: gzip\r\n"
+                               "Content-length: %ld\r\n"
+                               "\r\n",
+                               (long) compressed_len
+                       );
+                       client_write(compressed_data, (size_t)compressed_len);
+                       free(compressed_data);
+                       return;
+               }
+       }
+#endif
+
+       /** No compression ... just send it out as-is */
+       wprintf("Content-length: %ld\r\n"
+               "\r\n",
+               (long) length
+       );
+       client_write(thing, (size_t)length);
+}
+
+
+
+/**
+ * \brief dump out static pages from disk
+ * \param what the file urs to print
+ */
+void output_static(char *what)
+{
+       FILE *fp;
+       struct stat statbuf;
+       off_t bytes;
+       char *bigbuffer;
+       char content_type[128];
+
+       fp = fopen(what, "rb");
+       if (fp == NULL) {
+               lprintf(9, "output_static('%s')  -- NOT FOUND --\n", what);
+               wprintf("HTTP/1.1 404 %s\n", strerror(errno));
+               wprintf("Content-Type: text/plain\r\n");
+               wprintf("\r\n");
+               wprintf("Cannot open %s: %s\n", what, strerror(errno));
+       } else {
+               if (!strncasecmp(&what[strlen(what) - 4], ".gif", 4))
+                       safestrncpy(content_type, "image/gif", sizeof content_type);
+               else if (!strncasecmp(&what[strlen(what) - 4], ".txt", 4))
+                       safestrncpy(content_type, "text/plain", sizeof content_type);
+               else if (!strncasecmp(&what[strlen(what) - 4], ".css", 4))
+                       safestrncpy(content_type, "text/css", sizeof content_type);
+               else if (!strncasecmp(&what[strlen(what) - 4], ".jpg", 4))
+                       safestrncpy(content_type, "image/jpeg", sizeof content_type);
+               else if (!strncasecmp(&what[strlen(what) - 4], ".png", 4))
+                       safestrncpy(content_type, "image/png", sizeof content_type);
+               else if (!strncasecmp(&what[strlen(what) - 4], ".ico", 4))
+                       safestrncpy(content_type, "image/x-icon", sizeof content_type);
+               else if (!strncasecmp(&what[strlen(what) - 5], ".html", 5))
+                       safestrncpy(content_type, "text/html", sizeof content_type);
+               else if (!strncasecmp(&what[strlen(what) - 4], ".htm", 4))
+                       safestrncpy(content_type, "text/html", sizeof content_type);
+               else if (!strncasecmp(&what[strlen(what) - 4], ".wml", 4))
+                       safestrncpy(content_type, "text/vnd.wap.wml", sizeof content_type);
+               else if (!strncasecmp(&what[strlen(what) - 5], ".wmls", 5))
+                       safestrncpy(content_type, "text/vnd.wap.wmlscript", sizeof content_type);
+               else if (!strncasecmp(&what[strlen(what) - 5], ".wmlc", 5))
+                       safestrncpy(content_type, "application/vnd.wap.wmlc", sizeof content_type);
+               else if (!strncasecmp(&what[strlen(what) - 6], ".wmlsc", 6))
+                       safestrncpy(content_type, "application/vnd.wap.wmlscriptc", sizeof content_type);
+               else if (!strncasecmp(&what[strlen(what) - 5], ".wbmp", 5))
+                       safestrncpy(content_type, "image/vnd.wap.wbmp", sizeof content_type);
+               else if (!strncasecmp(&what[strlen(what) - 3], ".js", 3))
+                       safestrncpy(content_type, "text/javascript", sizeof content_type);
+               else
+                       safestrncpy(content_type, "application/octet-stream", sizeof content_type);
+
+               fstat(fileno(fp), &statbuf);
+               bytes = statbuf.st_size;
+               bigbuffer = malloc(bytes + 2);
+               fread(bigbuffer, bytes, 1, fp);
+               fclose(fp);
+
+               lprintf(9, "output_static('%s')  %s\n", what, content_type);
+               http_transmit_thing(bigbuffer, (size_t)bytes, content_type, 1);
+               free(bigbuffer);
+       }
+       if (!strcasecmp(bstr("force_close_session"), "yes")) {
+               end_webcit_session();
+       }
+}
+
+
+/**
+ * \brief When the browser requests an image file from the Citadel server,
+ * this function is called to transmit it.
+ */
+void output_image()
+{
+       char buf[SIZ];
+       char *xferbuf = NULL;
+       off_t bytes;
+
+       serv_printf("OIMG %s|%s", bstr("name"), bstr("parm"));
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '2') {
+               bytes = extract_long(&buf[4], 0);
+               xferbuf = malloc(bytes + 2);
+
+               /** Read it from the server */
+               read_server_binary(xferbuf, bytes);
+               serv_puts("CLOS");
+               serv_getln(buf, sizeof buf);
+
+               /** Write it to the browser */
+               http_transmit_thing(xferbuf, (size_t)bytes, "image/gif", 0);
+               free(xferbuf);
+
+       } else {
+               /**
+                * Instead of an ugly 404, send a 1x1 transparent GIF
+                * when there's no such image on the server.
+                */
+               output_static("static/blank.gif");
+       }
+
+
+
+}
+
+/**
+ * \brief Generic function to output an arbitrary MIME part from an arbitrary
+ *        message number on the server.
+ *
+ * \param msgnum               Number of the item on the citadel server
+ * \param partnum              The MIME part to be output
+ * \param force_download       Nonzero to force set the Content-Type: header
+ *                              to "application/octet-stream"
+ */
+void mimepart(char *msgnum, char *partnum, int force_download)
+{
+       char buf[256];
+       off_t bytes;
+       char content_type[256];
+       char *content = NULL;
+       
+       serv_printf("OPNA %s|%s", msgnum, partnum);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '2') {
+               bytes = extract_long(&buf[4], 0);
+               content = malloc(bytes + 2);
+               if (force_download) {
+                       strcpy(content_type, "application/octet-stream");
+               }
+               else {
+                       extract_token(content_type, &buf[4], 3, '|', sizeof content_type);
+               }
+               output_headers(0, 0, 0, 0, 0, 0);
+               read_server_binary(content, bytes);
+               serv_puts("CLOS");
+               serv_getln(buf, sizeof buf);
+               http_transmit_thing(content, bytes, content_type, 0);
+               free(content);
+       } else {
+               wprintf("HTTP/1.1 404 %s\n", &buf[4]);
+               output_headers(0, 0, 0, 0, 0, 0);
+               wprintf("Content-Type: text/plain\r\n");
+               wprintf("\r\n");
+               wprintf(_("An error occurred while retrieving this part: %s\n"), &buf[4]);
+       }
+
+}
+
+
+/**
+ * \brief Read any MIME part of a message, from the server, into memory.
+ * \param msgnum number of the message on the citadel server
+ * \param partnum the MIME part to be loaded
+ */
+char *load_mimepart(long msgnum, char *partnum)
+{
+       char buf[SIZ];
+       off_t bytes;
+       char content_type[SIZ];
+       char *content;
+       
+       serv_printf("OPNA %ld|%s", msgnum, partnum);
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '2') {
+               bytes = extract_long(&buf[4], 0);
+               extract_token(content_type, &buf[4], 3, '|', sizeof content_type);
+
+               content = malloc(bytes + 2);
+               read_server_binary(content, bytes);
+
+               serv_puts("CLOS");
+               serv_getln(buf, sizeof buf);
+               content[bytes] = 0;     /* null terminate for good measure */
+               return(content);
+       }
+       else {
+               return(NULL);
+       }
+
+}
+
+
+/**
+ * \brief Convenience functions to display a page containing only a string
+ * \param titlebarcolor color of the titlebar of the frame
+ * \param titlebarmsg text to display in the title bar
+ * \param messagetext body of the box
+ */
+void convenience_page(char *titlebarcolor, char *titlebarmsg, char *messagetext)
+{
+       wprintf("HTTP/1.1 200 OK\n");
+       output_headers(1, 1, 2, 0, 0, 0);
+       wprintf("<div id=\"banner\">\n");
+       wprintf("<table width=100%% border=0 bgcolor=\"#%s\"><tr><td>", titlebarcolor);
+       wprintf("<span class=\"titlebar\">%s</span>\n", titlebarmsg);
+       wprintf("</td></tr></table>\n");
+       wprintf("</div>\n<div id=\"content\">\n");
+       escputs(messagetext);
+
+       wprintf("<hr />\n");
+       wDumpContent(1);
+}
+
+
+/**
+ * \brief Display a blank page.
+ */
+void blank_page(void) {
+       output_headers(1, 1, 0, 0, 0, 0);
+       wDumpContent(2);
+}
+
+
+/**
+ * \brief A template has been requested
+ */
+void url_do_template(void) {
+       do_template(bstr("template"));
+}
+
+
+
+/**
+ * \brief Offer to make any page the user's "start page."
+ */
+void offer_start_page(void) {
+       wprintf("<a href=\"change_start_page?startpage=");
+       urlescputs(WC->this_page);
+       wprintf("\"><font size=-2 color=\"#AAAAAA\">");
+       wprintf(_("Make this my start page"));
+       wprintf("</font></a>");
+/*
+       wprintf("<br/><a href=\"rss?room=");
+       urlescputs(WC->wc_roomname);
+       wprintf("\" title=\"RSS 2.0 feed for ");
+       escputs(WC->wc_roomname);
+       wprintf("\"><img alt=\"RSS\" border=\"0\" src=\"static/xml_button.gif\"/></a>\n");
+*/
+}
+
+
+/**
+ * \brief Change the user's start page
+ */
+void change_start_page(void) {
+
+       if (bstr("startpage") == NULL) {
+               safestrncpy(WC->ImportantMessage,
+                       _("You no longer have a start page selected."),
+                       sizeof WC->ImportantMessage);
+               display_main_menu();
+               return;
+       }
+
+       set_preference("startpage", bstr("startpage"), 1);
+
+       output_headers(1, 1, 0, 0, 0, 0);
+       do_template("newstartpage");
+       wDumpContent(1);
+}
+
+
+
+/**
+ * \brief convenience function to indicate success
+ * \param successmessage the mesage itself
+ */
+void display_success(char *successmessage)
+{
+       convenience_page("007700", "OK", successmessage);
+}
+
+
+/**
+ * \brief Authorization required page 
+ * This is probably temporary and should be revisited 
+ * \param message message to put in header
+*/
+void authorization_required(const char *message)
+{
+       wprintf("HTTP/1.1 401 Authorization Required\r\n");
+       wprintf("WWW-Authenticate: Basic realm=\"\"\r\n", serv_info.serv_humannode);
+       wprintf("Content-Type: text/html\r\n\r\n");
+       wprintf("<h1>");
+       wprintf(_("Authorization Required"));
+       wprintf("</h1>\r\n");
+       wprintf(_("The resource you requested requires a valid username and password. "
+               "You could not be logged in: %s\n"), message);
+       wDumpContent(0);
+}
+
+/**
+ * \brief 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.
+ *
+ * \param name Name of the item being uploaded
+ * \param filename Filename of the item being uploaded
+ * \param partnum MIME part identifier (not needed)
+ * \param disp MIME content disposition (not needed)
+ * \param content The actual data
+ * \param cbtype MIME content-type
+ * \param cbcharset Character set
+ * \param length Content length
+ * \param encoding MIME encoding type (not needed)
+ * \param 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, void *userdata)
+{
+       struct urlcontent *u;
+
+       /* lprintf(9, "upload_handler() name=%s, type=%s, len=%d\n",
+               name, cbtype, length); */
+
+       /* Form fields */
+       if ( (length > 0) && (strlen(cbtype) == 0) ) {
+               u = (struct urlcontent *) malloc(sizeof(struct urlcontent));
+               u->next = WC->urlstrings;
+               WC->urlstrings = u;
+               safestrncpy(u->url_key, name, sizeof(u->url_key));
+               u->url_data = malloc(length + 1);
+               memcpy(u->url_data, content, length);
+               u->url_data[length] = 0;
+       }
+
+       /** Uploaded files */
+       if ( (length > 0) && (strlen(cbtype) > 0) ) {
+               WC->upload = malloc(length);
+               if (WC->upload != NULL) {
+                       WC->upload_length = length;
+                       safestrncpy(WC->upload_filename, filename,
+                                       sizeof(WC->upload_filename));
+                       safestrncpy(WC->upload_content_type, cbtype,
+                                       sizeof(WC->upload_content_type));
+                       memcpy(WC->upload, content, length);
+               }
+               else {
+                       lprintf(3, "malloc() failed: %s\n", strerror(errno));
+               }
+       }
+
+}
+
+/**
+ * \brief Convenience functions to wrap around asynchronous ajax responses
+ */
+void begin_ajax_response(void) {
+        output_headers(0, 0, 0, 0, 0, 0);
+
+        wprintf("Content-type: text/html; charset=UTF-8\r\n"
+                "Server: %s\r\n"
+                "Connection: close\r\n"
+                "Pragma: no-cache\r\n"
+                "Cache-Control: no-cache\r\n",
+                SERVER);
+        begin_burst();
+}
+
+/**
+ * \brief print ajax response footer 
+ */
+void end_ajax_response(void) {
+        wprintf("\r\n");
+        wDumpContent(0);
+}
+
+/**
+ * \brief Wraps a Citadel server command in an AJAX transaction.
+ */
+void ajax_servcmd(void)
+{
+       char buf[1024];
+       char gcontent[1024];
+       char *junk;
+       size_t len;
+
+       begin_ajax_response();
+
+       serv_printf("%s", bstr("g_cmd"));
+       serv_getln(buf, sizeof buf);
+       wprintf("%s\n", buf);
+
+       if (buf[0] == '8') {
+               serv_printf("\n\n000");
+       }
+       if ((buf[0] == '1') || (buf[0] == '8')) {
+               while (serv_getln(gcontent, sizeof gcontent), strcmp(gcontent, "000")) {
+                       wprintf("%s\n", gcontent);
+               }
+               wprintf("000");
+       }
+       if (buf[0] == '4') {
+               text_to_server(bstr("g_input"));
+               serv_puts("000");
+       }
+       if (buf[0] == '6') {
+               len = atol(&buf[4]);
+               junk = malloc(len);
+               serv_read(junk, len);
+               free(junk);
+       }
+       if (buf[0] == '7') {
+               len = atol(&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.
+        */
+       if (!strncasecmp(bstr("g_cmd"), "GEXP", 4)) {
+               WC->last_pager_check = time(NULL);
+       }
+}
+
+
+/**
+ * \brief 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];
+
+       begin_ajax_response();
+       if ( (time(NULL) - WC->last_pager_check) < 30) {
+               wprintf("NO\n");
+       }
+       else {
+               serv_puts("NOOP");
+               serv_getln(buf, sizeof buf);
+               if (buf[3] == '*') {
+                       wprintf("YES");
+               }
+               else {
+                       wprintf("NO");
+               }
+       }
+       end_ajax_response();
+}
+
+
+
+
+/**
+ * \brief Entry point for WebCit transaction
+ */
+void session_loop(struct httprequest *req)
+{
+       char cmd[1024];
+       char action[1024];
+       char arg1[128];
+       char arg2[128];
+       char arg3[128];
+       char arg4[128];
+       char arg5[128];
+       char arg6[128];
+       char arg7[128];
+       char buf[SIZ];
+       char request_method[128];
+       char pathname[1024];
+       int a, b;
+       int ContentLength = 0;
+       int BytesRead = 0;
+       char ContentType[512];
+       char *content = NULL;
+       char *content_end = NULL;
+       struct httprequest *hptr;
+       char browser_host[256];
+       char user_agent[256];
+       int body_start = 0;
+       int is_static = 0;
+
+       /**
+        * 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.
+        */
+       char c_username[SIZ];
+       char c_password[SIZ];
+       char c_roomname[SIZ];
+       char c_httpauth_string[SIZ];
+       char c_httpauth_user[SIZ];
+       char c_httpauth_pass[SIZ];
+       char cookie[SIZ];
+
+       safestrncpy(c_username, "", sizeof c_username);
+       safestrncpy(c_password, "", sizeof c_password);
+       safestrncpy(c_roomname, "", sizeof c_roomname);
+       safestrncpy(c_httpauth_string, "", sizeof c_httpauth_string);
+       safestrncpy(c_httpauth_user, DEFAULT_HTTPAUTH_USER, sizeof c_httpauth_user);
+       safestrncpy(c_httpauth_pass, DEFAULT_HTTPAUTH_PASS, sizeof c_httpauth_pass);
+       strcpy(browser_host, "");
+
+       WC->upload_length = 0;
+       WC->upload = NULL;
+       WC->vars = NULL;
+       WC->is_wap = 0;
+
+       hptr = req;
+       if (hptr == NULL) return;
+
+       safestrncpy(cmd, hptr->line, sizeof cmd);
+       hptr = hptr->next;
+       extract_token(request_method, cmd, 0, ' ', sizeof request_method);
+       extract_token(pathname, cmd, 1, ' ', sizeof pathname);
+
+       /** Figure out the action */
+       extract_token(action, pathname, 1, '/', sizeof action);
+       if (strstr(action, "?")) *strstr(action, "?") = 0;
+       if (strstr(action, "&")) *strstr(action, "&") = 0;
+       if (strstr(action, " ")) *strstr(action, " ") = 0;
+
+       extract_token(arg1, pathname, 2, '/', sizeof arg1);
+       if (strstr(arg1, "?")) *strstr(arg1, "?") = 0;
+       if (strstr(arg1, "&")) *strstr(arg1, "&") = 0;
+       if (strstr(arg1, " ")) *strstr(arg1, " ") = 0;
+
+       extract_token(arg2, pathname, 3, '/', sizeof arg2);
+       if (strstr(arg2, "?")) *strstr(arg2, "?") = 0;
+       if (strstr(arg2, "&")) *strstr(arg2, "&") = 0;
+       if (strstr(arg2, " ")) *strstr(arg2, " ") = 0;
+
+       extract_token(arg3, pathname, 4, '/', sizeof arg3);
+       if (strstr(arg3, "?")) *strstr(arg3, "?") = 0;
+       if (strstr(arg3, "&")) *strstr(arg3, "&") = 0;
+       if (strstr(arg3, " ")) *strstr(arg3, " ") = 0;
+
+       extract_token(arg4, pathname, 5, '/', sizeof arg4);
+       if (strstr(arg4, "?")) *strstr(arg4, "?") = 0;
+       if (strstr(arg4, "&")) *strstr(arg4, "&") = 0;
+       if (strstr(arg4, " ")) *strstr(arg4, " ") = 0;
+
+       extract_token(arg5, pathname, 6, '/', sizeof arg5);
+       if (strstr(arg5, "?")) *strstr(arg5, "?") = 0;
+       if (strstr(arg5, "&")) *strstr(arg5, "&") = 0;
+       if (strstr(arg5, " ")) *strstr(arg5, " ") = 0;
+
+       extract_token(arg6, pathname, 7, '/', sizeof arg6);
+       if (strstr(arg6, "?")) *strstr(arg6, "?") = 0;
+       if (strstr(arg6, "&")) *strstr(arg6, "&") = 0;
+       if (strstr(arg6, " ")) *strstr(arg6, " ") = 0;
+
+       extract_token(arg7, pathname, 8, '/', sizeof arg7);
+       if (strstr(arg7, "?")) *strstr(arg7, "?") = 0;
+       if (strstr(arg7, "&")) *strstr(arg7, "&") = 0;
+       if (strstr(arg7, " ")) *strstr(arg7, " ") = 0;
+
+       while (hptr != NULL) {
+               safestrncpy(buf, hptr->line, sizeof buf);
+               /* lprintf(9, "HTTP HEADER: %s\n", buf); */
+               hptr = hptr->next;
+
+               if (!strncasecmp(buf, "Cookie: webcit=", 15)) {
+                       safestrncpy(cookie, &buf[15], sizeof cookie);
+                       cookie_to_stuff(cookie, NULL,
+                                       c_username, sizeof c_username,
+                                       c_password, sizeof c_password,
+                                       c_roomname, sizeof c_roomname);
+               }
+               else if (!strncasecmp(buf, "Authorization: Basic ", 21)) {
+                       CtdlDecodeBase64(c_httpauth_string, &buf[21], strlen(&buf[21]));
+                       extract_token(c_httpauth_user, c_httpauth_string, 0, ':', sizeof c_httpauth_user);
+                       extract_token(c_httpauth_pass, c_httpauth_string, 1, ':', sizeof c_httpauth_pass);
+               }
+               else if (!strncasecmp(buf, "Content-length: ", 16)) {
+                       ContentLength = atoi(&buf[16]);
+               }
+               else if (!strncasecmp(buf, "Content-type: ", 14)) {
+                       safestrncpy(ContentType, &buf[14], sizeof ContentType);
+               }
+               else if (!strncasecmp(buf, "User-agent: ", 12)) {
+                       safestrncpy(user_agent, &buf[12], sizeof user_agent);
+               }
+               else if (!strncasecmp(buf, "X-Forwarded-Host: ", 18)) {
+                       if (follow_xff) {
+                               safestrncpy(WC->http_host, &buf[18], sizeof WC->http_host);
+                       }
+               }
+               else if (!strncasecmp(buf, "Host: ", 6)) {
+                       if (strlen(WC->http_host) == 0) {
+                               safestrncpy(WC->http_host, &buf[6], sizeof WC->http_host);
+                       }
+               }
+               else if (!strncasecmp(buf, "X-Forwarded-For: ", 17)) {
+                       safestrncpy(browser_host, &buf[17], sizeof browser_host);
+                       while (num_tokens(browser_host, ',') > 1) {
+                               remove_token(browser_host, 0, ',');
+                       }
+                       striplt(browser_host);
+               }
+               /** Only WAP gateways explicitly name this content-type */
+               else if (strstr(buf, "text/vnd.wap.wml")) {
+                       WC->is_wap = 1;
+               }
+       }
+
+       if (ContentLength > 0) {
+               content = malloc(ContentLength + SIZ);
+               memset(content, 0, ContentLength + SIZ);
+               sprintf(content, "Content-type: %s\n"
+                               "Content-length: %d\n\n",
+                               ContentType, ContentLength);
+               body_start = strlen(content);
+
+               /** Read the entire input data at once. */
+               client_read(WC->http_sock, &content[BytesRead+body_start],
+                       ContentLength);
+
+               if (!strncasecmp(ContentType,
+                             "application/x-www-form-urlencoded", 33)) {
+                       addurls(&content[body_start]);
+               } else if (!strncasecmp(ContentType, "multipart", 9)) {
+                       content_end = content + ContentLength + body_start;
+                       mime_parser(content, content_end, *upload_handler,
+                                       NULL, NULL, NULL, 0);
+               }
+       } else {
+               content = NULL;
+       }
+
+       /** make a note of where we are in case the user wants to save it */
+       safestrncpy(WC->this_page, cmd, sizeof(WC->this_page));
+       remove_token(WC->this_page, 2, ' ');
+       remove_token(WC->this_page, 0, ' ');
+
+       /** If there are variables in the URL, we must grab them now */
+       for (a = 0; a < strlen(cmd); ++a) {
+               if ((cmd[a] == '?') || (cmd[a] == '&')) {
+                       for (b = a; b < strlen(cmd); ++b)
+                               if (isspace(cmd[b]))
+                                       cmd[b] = 0;
+                       addurls(&cmd[a + 1]);
+                       cmd[a] = 0;
+               }
+       }
+
+       /** If it's a "force 404" situation then display the error and bail. */
+       if (!strcmp(action, "404")) {
+               wprintf("HTTP/1.1 404 Not found\r\n");
+               wprintf("Content-Type: text/plain\r\n");
+               wprintf("\r\n");
+               wprintf("Not found\r\n");
+               goto SKIP_ALL_THIS_CRAP;
+       }
+
+       /** Static content can be sent without connecting to Citadel. */
+       is_static = 0;
+       for (a=0; a<ndirs; ++a) {
+               if (!strcasecmp(action, (char*)static_content_dirs[a])) { /* map web to disk location */
+                       is_static = 1;
+               }
+       }
+       if (is_static) {
+               snprintf(buf, sizeof buf, "%s/%s/%s/%s/%s/%s/%s/%s",
+                       action, arg1, arg2, arg3, arg4, arg5, arg6, arg7);
+               for (a=0; a<8; ++a) {
+                       if (buf[strlen(buf)-1] == '/') {
+                               buf[strlen(buf)-1] = 0;
+                       }
+               }
+               for (a = 0; a < strlen(buf); ++a) {
+                       if (isspace(buf[a])) {
+                               buf[a] = 0;
+                       }
+               }
+               output_static(buf);
+               goto SKIP_ALL_THIS_CRAP;        /* Don't try to connect */
+       }
+
+       /**
+        * If we're not connected to a Citadel server, try to hook up the
+        * connection now.
+        */
+       if (!WC->connected) {
+               if (!strcasecmp(ctdlhost, "uds")) {
+                       /* unix domain socket */
+                       sprintf(buf, "%s/citadel.socket", ctdlport);
+                       WC->serv_sock = uds_connectsock(buf);
+               }
+               else {
+                       /* tcp socket */
+                       WC->serv_sock = tcp_connectsock(ctdlhost, ctdlport);
+               }
+
+               if (WC->serv_sock < 0) {
+                       do_logout();
+                       goto SKIP_ALL_THIS_CRAP;
+               }
+               else {
+                       WC->connected = 1;
+                       serv_getln(buf, sizeof buf);    /** get the server welcome message */
+
+                       /**
+                        * 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) || (strlen(browser_host) == 0) ) {
+                               locate_host(browser_host, WC->http_sock);
+                       }
+
+                       get_serv_info(browser_host, user_agent);
+                       if (serv_info.serv_rev_level < MINIMUM_CIT_VERSION) {
+                               wprintf(_("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"),
+                                               serv_info.serv_rev_level / 100,
+                                               serv_info.serv_rev_level % 100,
+                                               MINIMUM_CIT_VERSION / 100,
+                                               MINIMUM_CIT_VERSION % 100
+                                       );
+                               end_webcit_session();
+                               goto SKIP_ALL_THIS_CRAP;
+                       }
+               }
+       }
+
+       /**
+        * Functions which can be performed without logging in
+        */
+       if (!strcasecmp(action, "listsub")) {
+               do_listsub();
+               goto SKIP_ALL_THIS_CRAP;
+       }
+#ifdef WEBCIT_WITH_CALENDAR_SERVICE
+       if (!strcasecmp(action, "freebusy")) {
+               do_freebusy(cmd);
+               goto SKIP_ALL_THIS_CRAP;
+       }
+#endif
+
+       /**
+        * If we're not logged in, but we have HTTP Authentication data,
+        * try logging in to Citadel using that.
+        */
+       if ((!WC->logged_in)
+          && (strlen(c_httpauth_user) > 0)
+          && (strlen(c_httpauth_pass) > 0)) {
+               serv_printf("USER %s", c_httpauth_user);
+               serv_getln(buf, sizeof buf);
+               if (buf[0] == '3') {
+                       serv_printf("PASS %s", c_httpauth_pass);
+                       serv_getln(buf, sizeof buf);
+                       if (buf[0] == '2') {
+                               become_logged_in(c_httpauth_user,
+                                               c_httpauth_pass, buf);
+                               safestrncpy(WC->httpauth_user, c_httpauth_user, sizeof WC->httpauth_user);
+                               safestrncpy(WC->httpauth_pass, c_httpauth_pass, sizeof WC->httpauth_pass);
+                       } else {
+                               /** Should only display when password is wrong */
+                               authorization_required(&buf[4]);
+                               goto SKIP_ALL_THIS_CRAP;
+                       }
+               }
+       }
+
+       /** This needs to run early */
+       if (!strcasecmp(action, "rss")) {
+               display_rss(bstr("room"), request_method);
+               goto SKIP_ALL_THIS_CRAP;
+       }
+
+       /** 
+        * The GroupDAV stuff relies on HTTP authentication instead of
+        * our session's authentication.
+        */
+       if (!strncasecmp(action, "groupdav", 8)) {
+               groupdav_main(req, ContentType, /* do GroupDAV methods */
+                       ContentLength, content+body_start);
+               if (!WC->logged_in) {
+                       WC->killthis = 1;       /* If not logged in, don't */
+               }                               /* keep the session active */
+               goto SKIP_ALL_THIS_CRAP;
+       }
+
+
+       /**
+        * Automatically send requests with any method other than GET or
+        * POST to the GroupDAV code as well.
+        */
+       if ((strcasecmp(request_method, "GET")) && (strcasecmp(request_method, "POST"))) {
+               groupdav_main(req, ContentType, /** do GroupDAV methods */
+                       ContentLength, content+body_start);
+               if (!WC->logged_in) {
+                       WC->killthis = 1;       /** If not logged in, don't */
+               }                               /** keep the session active */
+               goto SKIP_ALL_THIS_CRAP;
+       }
+
+       /**
+        * If we're not logged in, but we have username and password cookies
+        * supplied by the browser, try using them to log in.
+        */
+       if ((!WC->logged_in)
+          && (strlen(c_username) > 0)
+          && (strlen(c_password) > 0)) {
+               serv_printf("USER %s", c_username);
+               serv_getln(buf, sizeof buf);
+               if (buf[0] == '3') {
+                       serv_printf("PASS %s", c_password);
+                       serv_getln(buf, sizeof buf);
+                       if (buf[0] == '2') {
+                               become_logged_in(c_username, c_password, buf);
+                       }
+               }
+       }
+       /**
+        * If we don't have a current room, but a cookie specifying the
+        * current room is supplied, make an effort to go there.
+        */
+       if ((strlen(WC->wc_roomname) == 0) && (strlen(c_roomname) > 0)) {
+               serv_printf("GOTO %s", c_roomname);
+               serv_getln(buf, sizeof buf);
+               if (buf[0] == '2') {
+                       safestrncpy(WC->wc_roomname, c_roomname, sizeof WC->wc_roomname);
+               }
+       }
+
+       if (!strcasecmp(action, "image")) {
+               output_image();
+
+               /**
+                * All functions handled below this point ... make sure we log in
+                * before doing anything else!
+                */
+       } else if ((!WC->logged_in) && (!strcasecmp(action, "login"))) {
+               do_login();
+       } else if (!WC->logged_in) {
+               display_login(NULL);
+       }
+
+       /**
+        * Various commands...
+        */
+
+       else if (!strcasecmp(action, "do_welcome")) {
+               do_welcome();
+       } else if (!strcasecmp(action, "blank")) {
+               blank_page();
+       } else if (!strcasecmp(action, "do_template")) {
+               url_do_template();
+       } else if (!strcasecmp(action, "display_aide_menu")) {
+               display_aide_menu();
+       } else if (!strcasecmp(action, "display_main_menu")) {
+               display_main_menu();
+       } else if (!strcasecmp(action, "who")) {
+               who();
+       } else if (!strcasecmp(action, "sslg")) {
+               seconds_since_last_gexp();
+       } else if (!strcasecmp(action, "who_inner_html")) {
+               begin_ajax_response();
+               who_inner_div();
+               end_ajax_response();
+       } else if (!strcasecmp(action, "iconbar_ajax_menu")) {
+               begin_ajax_response();
+               do_iconbar();
+               end_ajax_response();
+       } else if (!strcasecmp(action, "iconbar_ajax_rooms")) {
+               begin_ajax_response();
+               do_iconbar_roomlist();
+               end_ajax_response();
+       } else if (!strcasecmp(action, "knrooms")) {
+               knrooms();
+       } else if (!strcasecmp(action, "gotonext")) {
+               slrp_highest();
+               gotonext();
+       } else if (!strcasecmp(action, "skip")) {
+               gotonext();
+       } else if (!strcasecmp(action, "ungoto")) {
+               ungoto();
+       } else if (!strcasecmp(action, "dotgoto")) {
+               if (WC->wc_view != VIEW_MAILBOX) {      /* dotgoto acts like dotskip when we're in a mailbox view */
+                       slrp_highest();
+               }
+               smart_goto(bstr("room"));
+       } else if (!strcasecmp(action, "dotskip")) {
+               smart_goto(bstr("room"));
+       } else if (!strcasecmp(action, "termquit")) {
+               do_logout();
+       } else if (!strcasecmp(action, "readnew")) {
+               readloop("readnew");
+       } else if (!strcasecmp(action, "readold")) {
+               readloop("readold");
+       } else if (!strcasecmp(action, "readfwd")) {
+               readloop("readfwd");
+       } else if (!strcasecmp(action, "headers")) {
+               readloop("headers");
+       } else if (!strcasecmp(action, "msg")) {
+               embed_message(arg1);
+       } else if (!strcasecmp(action, "printmsg")) {
+               print_message(arg1);
+       } else if (!strcasecmp(action, "msgheaders")) {
+               display_headers(arg1);
+       } else if (!strcasecmp(action, "wiki")) {
+               display_wiki_page();
+       } else if (!strcasecmp(action, "display_enter")) {
+               display_enter();
+       } else if (!strcasecmp(action, "post")) {
+               post_message();
+       } else if (!strcasecmp(action, "move_msg")) {
+               move_msg();
+       } else if (!strcasecmp(action, "delete_msg")) {
+               delete_msg();
+       } else if (!strcasecmp(action, "userlist")) {
+               userlist();
+       } else if (!strcasecmp(action, "showuser")) {
+               showuser();
+       } else if (!strcasecmp(action, "display_page")) {
+               display_page();
+       } else if (!strcasecmp(action, "page_user")) {
+               page_user();
+       } else if (!strcasecmp(action, "chat")) {
+               do_chat();
+       } else if (!strcasecmp(action, "display_private")) {
+               display_private("", 0);
+       } else if (!strcasecmp(action, "goto_private")) {
+               goto_private();
+       } else if (!strcasecmp(action, "zapped_list")) {
+               zapped_list();
+       } else if (!strcasecmp(action, "display_zap")) {
+               display_zap();
+       } else if (!strcasecmp(action, "zap")) {
+               zap();
+       } else if (!strcasecmp(action, "display_entroom")) {
+               display_entroom();
+       } else if (!strcasecmp(action, "entroom")) {
+               entroom();
+       } else if (!strcasecmp(action, "display_whok")) {
+               display_whok();
+       } else if (!strcasecmp(action, "do_invt_kick")) {
+               do_invt_kick();
+       } else if (!strcasecmp(action, "display_editroom")) {
+               display_editroom();
+       } else if (!strcasecmp(action, "netedit")) {
+               netedit();
+       } else if (!strcasecmp(action, "editroom")) {
+               editroom();
+       } else if (!strcasecmp(action, "display_editinfo")) {
+               display_edit(_("Room info"), "EINF 0", "RINF", "/editinfo", 1);
+       } else if (!strcasecmp(action, "editinfo")) {
+               save_edit(_("Room info"), "EINF 1", 1);
+       } else if (!strcasecmp(action, "display_editbio")) {
+               sprintf(buf, "RBIO %s", WC->wc_fullname);
+               display_edit(_("Your bio"), "NOOP", buf, "editbio", 3);
+       } else if (!strcasecmp(action, "editbio")) {
+               save_edit(_("Your bio"), "EBIO", 0);
+       } else if (!strcasecmp(action, "confirm_move_msg")) {
+               confirm_move_msg();
+       } else if (!strcasecmp(action, "delete_room")) {
+               delete_room();
+       } else if (!strcasecmp(action, "validate")) {
+               validate();
+       } else if (!strcasecmp(action, "display_editpic")) {
+               display_graphics_upload(_("your photo"),
+                                       "UIMG 0|_userpic_",
+                                       "editpic");
+       } else if (!strcasecmp(action, "editpic")) {
+               do_graphics_upload("UIMG 1|_userpic_");
+       } else if (!strcasecmp(action, "display_editroompic")) {
+               display_graphics_upload(_("the icon for this room"),
+                                       "UIMG 0|_roompic_",
+                                       "editroompic");
+       } else if (!strcasecmp(action, "editroompic")) {
+               do_graphics_upload("UIMG 1|_roompic_");
+       } else if (!strcasecmp(action, "delete_floor")) {
+               delete_floor();
+       } else if (!strcasecmp(action, "rename_floor")) {
+               rename_floor();
+       } else if (!strcasecmp(action, "create_floor")) {
+               create_floor();
+       } else if (!strcasecmp(action, "display_editfloorpic")) {
+               sprintf(buf, "UIMG 0|_floorpic_|%s",
+                       bstr("which_floor"));
+               display_graphics_upload(_("the icon for this floor"),
+                                       buf,
+                                       "editfloorpic");
+       } else if (!strcasecmp(action, "editfloorpic")) {
+               sprintf(buf, "UIMG 1|_floorpic_|%s",
+                       bstr("which_floor"));
+               do_graphics_upload(buf);
+       } else if (!strcasecmp(action, "display_reg")) {
+               display_reg(0);
+       } else if (!strcasecmp(action, "display_changepw")) {
+               display_changepw();
+       } else if (!strcasecmp(action, "changepw")) {
+               changepw();
+       } else if (!strcasecmp(action, "display_edit_node")) {
+               display_edit_node();
+       } else if (!strcasecmp(action, "edit_node")) {
+               edit_node();
+       } else if (!strcasecmp(action, "display_netconf")) {
+               display_netconf();
+       } else if (!strcasecmp(action, "display_confirm_delete_node")) {
+               display_confirm_delete_node();
+       } else if (!strcasecmp(action, "delete_node")) {
+               delete_node();
+       } else if (!strcasecmp(action, "display_add_node")) {
+               display_add_node();
+       } else if (!strcasecmp(action, "add_node")) {
+               add_node();
+       } else if (!strcasecmp(action, "terminate_session")) {
+               slrp_highest();
+               terminate_session();
+       } else if (!strcasecmp(action, "edit_me")) {
+               edit_me();
+       } else if (!strcasecmp(action, "display_siteconfig")) {
+               display_siteconfig();
+       } else if (!strcasecmp(action, "chat_recv")) {
+               chat_recv();
+       } else if (!strcasecmp(action, "chat_send")) {
+               chat_send();
+       } else if (!strcasecmp(action, "siteconfig")) {
+               siteconfig();
+       } else if (!strcasecmp(action, "display_generic")) {
+               display_generic();
+       } else if (!strcasecmp(action, "do_generic")) {
+               do_generic();
+       } else if (!strcasecmp(action, "ajax_servcmd")) {
+               ajax_servcmd();
+       } else if (!strcasecmp(action, "display_menubar")) {
+               display_menubar(1);
+       } else if (!strcasecmp(action, "mimepart")) {
+               mimepart(arg1, arg2, 0);
+       } else if (!strcasecmp(action, "mimepart_download")) {
+               mimepart(arg1, arg2, 1);
+       } else if (!strcasecmp(action, "edit_vcard")) {
+               edit_vcard();
+       } else if (!strcasecmp(action, "submit_vcard")) {
+               submit_vcard();
+       } else if (!strcasecmp(action, "select_user_to_edit")) {
+               select_user_to_edit(NULL, NULL);
+       } else if (!strcasecmp(action, "display_edituser")) {
+               display_edituser(NULL, 0);
+       } else if (!strcasecmp(action, "edituser")) {
+               edituser();
+       } else if (!strcasecmp(action, "create_user")) {
+               create_user();
+       } else if (!strcasecmp(action, "changeview")) {
+               change_view();
+       } else if (!strcasecmp(action, "change_start_page")) {
+               change_start_page();
+       } else if (!strcasecmp(action, "display_floorconfig")) {
+               display_floorconfig(NULL);
+       } else if (!strcasecmp(action, "toggle_self_service")) {
+               toggle_self_service();
+#ifdef WEBCIT_WITH_CALENDAR_SERVICE
+       } else if (!strcasecmp(action, "display_edit_task")) {
+               display_edit_task();
+       } else if (!strcasecmp(action, "save_task")) {
+               save_task();
+       } else if (!strcasecmp(action, "display_edit_event")) {
+               display_edit_event();
+       } else if (!strcasecmp(action, "save_event")) {
+               save_event();
+       } else if (!strcasecmp(action, "respond_to_request")) {
+               respond_to_request();
+       } else if (!strcasecmp(action, "handle_rsvp")) {
+               handle_rsvp();
+#endif
+       } else if (!strcasecmp(action, "summary")) {
+               summary();
+       } else if (!strcasecmp(action, "summary_inner_div")) {
+               begin_ajax_response();
+               summary_inner_div();
+               end_ajax_response();
+       } else if (!strcasecmp(action, "display_customize_iconbar")) {
+               display_customize_iconbar();
+       } else if (!strcasecmp(action, "commit_iconbar")) {
+               commit_iconbar();
+       } else if (!strcasecmp(action, "set_room_policy")) {
+               set_room_policy();
+       } else if (!strcasecmp(action, "display_inetconf")) {
+               display_inetconf();
+       } else if (!strcasecmp(action, "save_inetconf")) {
+               save_inetconf();
+       } else if (!strcasecmp(action, "setup_wizard")) {
+               do_setup_wizard();
+       } else if (!strcasecmp(action, "display_preferences")) {
+               display_preferences();
+       } else if (!strcasecmp(action, "set_preferences")) {
+               set_preferences();
+       } else if (!strcasecmp(action, "recp_autocomplete")) {
+               recp_autocomplete(bstr("recp"));
+       } else if (!strcasecmp(action, "cc_autocomplete")) {
+               recp_autocomplete(bstr("cc"));
+       } else if (!strcasecmp(action, "bcc_autocomplete")) {
+               recp_autocomplete(bstr("bcc"));
+       } else if (!strcasecmp(action, "set_floordiv_expanded")) {
+               set_floordiv_expanded(arg1);
+       } else if (!strcasecmp(action, "diagnostics")) {
+               output_headers(1, 1, 1, 0, 0, 0);
+               wprintf("Session: %d<hr />\n", WC->wc_session);
+               wprintf("Command: <br /><PRE>\n");
+               escputs(cmd);
+               wprintf("</PRE><hr />\n");
+               wprintf("Variables: <br /><PRE>\n");
+               dump_vars();
+               wprintf("</PRE><hr />\n");
+               wDumpContent(1);
+       } else if (!strcasecmp(action, "updatenote")) {
+               updatenote();
+       }
+
+       /** When all else fais, display the main menu. */
+       else {
+               display_main_menu();
+       }
+
+SKIP_ALL_THIS_CRAP:
+       fflush(stdout);
+       if (content != NULL) {
+               free(content);
+               content = NULL;
+       }
+       free_urls();
+       if (WC->upload_length > 0) {
+               free(WC->upload);
+               WC->upload_length = 0;
+       }
+}
+
+
+/*@}*/
diff --git a/webcit/webcit.h b/webcit/webcit.h
new file mode 100644 (file)
index 0000000..31c9b92
--- /dev/null
@@ -0,0 +1,745 @@
+/* $Id$ */
+
+#include "config.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>
+#ifdef HAVE_SYS_TIME_H
+#include <sys/time.h>
+#endif
+#include <sys/stat.h>
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <sys/un.h>
+#include <netdb.h>
+#include <sys/poll.h>
+#include <string.h>
+#include <pwd.h>
+#include <errno.h>
+#include <stdarg.h>
+#include <pthread.h>
+#include <signal.h>
+#include <sys/utsname.h>
+
+#ifndef INADDR_NONE
+#define INADDR_NONE 0xffffffff
+#endif
+
+#ifdef HAVE_ICONV
+#include <iconv.h>
+#endif
+
+#ifdef ENABLE_NLS
+#include <libintl.h>
+#include <locale.h>
+extern locale_t wc_locales[];
+#define _(string)      gettext(string)
+#else
+#define _(string)      (string)
+#endif
+
+/*
+ * Uncomment to dump an HTTP trace to stderr
+#define HTTP_TRACING 1
+ */
+
+#ifdef HTTP_TRACING
+#undef HAVE_ZLIB_H
+#undef HAVE_ZLIB
+#endif
+
+#ifdef HAVE_ZLIB_H
+#include <zlib.h>
+#endif
+
+#ifdef HAVE_ICAL_H
+#ifdef HAVE_LIBICAL
+#define WEBCIT_WITH_CALENDAR_SERVICE 1
+#endif
+#endif
+
+
+
+#ifdef WEBCIT_WITH_CALENDAR_SERVICE
+/* Work around PACKAGE/VERSION defs that are (not supposed to be?) in ical.h */
+#ifdef PACKAGE
+# define CTDL_PACKAGE PACKAGE
+# undef PACKAGE
+#endif
+#ifdef VERSION
+# define CTDL_VERSION VERSION
+# undef VERSION
+#endif
+#include <ical.h>
+#ifdef CTDL_PACKAGE
+# ifdef PACKAGE
+#  undef PACKAGE
+# endif
+# define PACKAGE CTDL_PACKAGE
+# undef CTDL_PACKAGE
+#endif
+#ifdef CTDL_VERSION
+# ifdef VERSION
+#  undef VERSION
+# endif
+# define VERSION CTDL_VERSION
+# undef CTDL_VERSION
+#endif
+#endif
+
+
+
+#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>
+#endif
+
+#define CALENDAR_ROOM_NAME     "Calendar"
+#define PRODID "-//Citadel//NONSGML Citadel Calendar//EN"
+
+#define SIZ                    4096            /* generic buffer size */
+
+#define TRACE fprintf(stderr, "Checkpoint: %s, %d\n", __FILE__, __LINE__)
+
+#define SLEEPING               180             /* TCP connection timeout */
+#define WEBCIT_TIMEOUT         900             /* WebCit session timeout */
+#define PORT_NUM               2000            /* port number to listen on */
+#define SERVER                 "WebCit v6.82"  /* who's in da house */
+#define DEVELOPER_ID           0
+#define CLIENT_ID              4
+#define CLIENT_VERSION         682             /* This version of WebCit */
+#define MINIMUM_CIT_VERSION    673             /* min required Citadel ver. */
+#define DEFAULT_HOST           "localhost"     /* Default Citadel server */
+#define DEFAULT_PORT           "504"
+#define LB                     (1)             /* Internal escape chars */
+#define RB                     (2)
+#define QU                     (3)
+#define TARGET                 "webcit01"      /* Target for inline URL's */
+#define HOUSEKEEPING           15              /* Housekeeping frequency */
+#define MIN_WORKER_THREADS     5
+#define MAX_WORKER_THREADS     250
+#define LISTEN_QUEUE_LENGTH    100             /* listen() backlog queue */
+
+#define USERCONFIGROOM         "My Citadel Config"
+#define DEFAULT_MAXMSGS                20
+
+
+/*
+ * Room flags (from Citadel)
+ *
+ * bucket one...
+ */
+#define QR_PERMANENT   1               /**< Room does not purge                */
+#define QR_INUSE       2               /**< Set if in use, clear if avail      */
+#define QR_PRIVATE     4               /**< Set for any type of private room   */
+#define QR_PASSWORDED  8               /**< Set if there's a password too      */
+#define QR_GUESSNAME   16              /**< Set if it's a guessname room       */
+#define QR_DIRECTORY   32              /**< Directory room                     */
+#define QR_UPLOAD      64              /**< Allowed to upload                  */
+#define QR_DOWNLOAD    128             /**< Allowed to download                */
+#define QR_VISDIR      256             /**< Visible directory                  */
+#define QR_ANONONLY    512             /**< Anonymous-Only room                */
+#define QR_ANONOPT     1024            /**< Anonymous-Option room              */
+#define QR_NETWORK     2048            /**< Shared network room                */
+#define QR_PREFONLY    4096            /**< Preferred status needed to enter   */
+#define QR_READONLY    8192            /**< Aide status required to post       */
+#define QR_MAILBOX     16384           /**< Set if this is a private mailbox   */
+
+/**
+ * bucket two...
+ */
+#define QR2_SYSTEM     1               /**< System room; hide by default       */
+#define QR2_SELFLIST   2               /**< Self-service mailing list mgmt     */
+
+/**
+ * user/room access
+ */
+#define UA_KNOWN       2
+#define UA_GOTOALLOWED 4
+#define UA_HASNEWMSGS  8
+#define UA_ZAPPED      16
+
+
+/**
+ * User flags (from Citadel)
+ */
+#define US_NEEDVALID   1               /**< User needs to be validated         */
+#define US_PERM                4               /**< Permanent user                     */
+#define US_LASTOLD     16              /**< Print last old message with new    */
+#define US_EXPERT      32              /**< Experienced user                   */
+#define US_UNLISTED    64              /**< Unlisted userlog entry             */
+#define US_NOPROMPT    128             /**< Don't prompt after each message    */
+#define US_PROMPTCTL   256             /**< <N>ext & <S>top work at prompt     */
+#define US_DISAPPEAR   512             /**< Use "disappearing msg prompts"     */
+#define US_REGIS       1024            /**< Registered user                    */
+#define US_PAGINATOR   2048            /**< Pause after each screen of text    */
+#define US_INTERNET    4096            /**< Internet mail privileges           */
+#define US_FLOORS      8192            /**< User wants to see floors           */
+#define US_COLOR       16384           /**< User wants ANSI color support      */
+#define US_USER_SET    (US_LASTOLD | US_EXPERT | US_UNLISTED | \
+                       US_NOPROMPT | US_DISAPPEAR | US_PAGINATOR | \
+                       US_FLOORS | US_COLOR | US_PROMPTCTL )
+
+
+
+/** \brief     Linked list of lines appearing in an HTTP client request */
+struct httprequest {
+       struct httprequest *next;  /**< the next request in the list */
+       char line[SIZ];            /**< the request line */
+};
+
+/**
+ * \brief      Linked list of session variables encoded in an x-www-urlencoded content type
+ */
+struct urlcontent {
+       struct urlcontent *next;   /**< the next variable in the list */ 
+       char url_key[32];          /**< the variable name */
+       char *url_data;            /**< its value */
+};
+
+/**
+ * \brief information about us ???
+ */ 
+struct serv_info {
+       int serv_pid;                   /**< Process ID of the Citadel server */
+       char serv_nodename[32];         /**< Node name of the Citadel server */
+       char serv_humannode[64];        /**< human readable node name of the Citadel server */
+       char serv_fqdn[64];             /**< fully quallified Domain Name (such as uncensored.citadel.org) */
+       char serv_software[64];         /**< What version does our connected citadel server use */
+       int serv_rev_level;             /**< Whats the citadel server revision */
+       char serv_bbs_city[64];         /**< Geographic location of the Citadel server */
+       char serv_sysadm[64];           /**< Name of system administrator */
+       char serv_moreprompt[SIZ];      /**< Whats the commandline textprompt */
+       int serv_ok_floors;             /**< nonzero == server supports floors */
+       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? */
+};
+
+
+
+/**
+ * \brief This struct holds a list of rooms for \\\<G\\\>oto 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 */
+};
+
+/* *
+ * \brief      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 */
+};
+
+
+
+/**
+ * \brief Dynamic content for variable substitution in templates
+ */
+struct wcsubst {
+       struct wcsubst *next;       /**< next item in the list */  
+       int wcs_type;                       /**< which type of ??? */
+       char wcs_key[32];                   /**< ??? what?*/
+       void *wcs_value;                    /**< ???? what?*/
+       void (*wcs_function)(void); /**< funcion hook ???*/
+};
+
+/**
+ * \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 */
+};
+
+/**
+ * \brief mail attachment ???
+ */
+struct wc_attachment {
+       struct wc_attachment *next;/**< pointer to next in list */
+       size_t length;                     /**< length of the contenttype */
+       char content_type[SIZ];    /**< the content itself ???*/
+       char filename[SIZ];                /**< the filename hooked to this content ??? */
+       char *data;                /**< the data pool; aka this content */
+};
+
+/**
+ * \brief message summary structure. ???
+ */
+struct message_summary {
+       time_t date;        /**< its creation date */
+       long msgnum;            /**< the message number on the citadel server */
+       char from[128];         /**< the author */
+       char to[128];           /**< the recipient */
+       char subj[128];         /**< the title / subject */
+       int hasattachments;     /**< does it have atachments? */
+       int is_new;         /**< is it yet read? */
+};
+
+/**
+ * \brief  Data structure for roomlist-to-folderlist conversion 
+ */
+struct folder {
+       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.... */
+};
+
+/**
+ * \brief One of these is kept for each active Citadel session.
+ * HTTP transactions are bound to on e at a time.
+ */
+struct wcsession {
+       struct wcsession *next;                 /**< Linked list */
+       int wc_session;                         /**< WebCit session ID */
+       char wc_username[128];                  /**< login name of current user */
+       char wc_fullname[128];                  /**< Screen name of current user */
+       char wc_password[128];                  /**< Password of current user */
+       char wc_roomname[256];                  /**< Room we are currently in */
+       int connected;                          /**< nonzero == we are connected to Citadel */
+       int logged_in;                          /**< nonzero == we are logged in  */
+       int axlevel;                            /**< this user's access level */
+       int is_aide;                            /**< nonzero == this user is an Aide */
+       int is_room_aide;                       /**< nonzero == this user is a Room Aide in this room */
+       int http_sock;                          /**< HTTP server socket */
+       int serv_sock;                          /**< Client socket to Citadel server */
+       int chat_sock;                          /**< Client socket to Citadel server - for chat */
+       unsigned room_flags;                    /**< flags associated with the current room */
+       int wc_view;                            /**< view for the current room */
+       int wc_default_view;                    /**< default view for the current room */
+       int wc_is_trash;                        /**< nonzero == current room is a Trash folder */
+       int wc_floor;                           /**< floor number of current room */
+       char ugname[128];                       /**< where does 'ungoto' take us */
+       long uglsn;                             /**< last seen message number for ungoto */
+       int upload_length;                      /**< content length of http-uploaded data */
+       char *upload;                           /**< pointer to http-uploaded data */
+       char upload_filename[PATH_MAX];         /**< filename of http-uploaded data */
+       char upload_content_type[256];          /**< content type of http-uploaded data */
+       int new_mail;                           /**< user has new mail waiting */
+       int remember_new_mail;                  /**< last count of new mail messages */
+       int need_regi;                          /**< This user needs to register. */
+       int need_vali;                          /**< New users require validation. */
+       char cs_inet_email[256];                /**< User's preferred Internet addr. */
+       pthread_mutex_t SessionMutex;           /**< mutex for exclusive access */
+       time_t lastreq;                         /**< Timestamp of most recent HTTP */
+       int killthis;                           /**< Nonzero == purge this session */
+       struct march *march;                    /**< march mode room list */
+       char reply_to[512];                     /**< reply-to address */
+       long msgarr[10000];                     /**< for read operations */
+       int num_summ;                           /**< number of messages in mailbox summary view */
+       struct message_summary *summ;           /**< array of messages for mailbox summary view */
+       int is_wap;                             /**< Client is a WAP gateway */
+       struct urlcontent *urlstrings;          /**< variables passed to webcit in a URL */
+       struct wcsubst *vars;                   /**< HTTP variable substitutions for this page */
+       char this_page[512];                    /**< URL of current page */
+       char http_host[512];                    /**< HTTP Host: header */
+       char *preferences;                      /**< WebCit preferences for this user */
+#ifdef WEBCIT_WITH_CALENDAR_SERVICE            
+       /** \brief ical???? */                          
+       struct disp_cal {                                       
+               icalcomponent *cal;             /**< cal items for display */
+               long cal_msgnum;                /**< cal msgids for display */
+       } *disp_cal;                                            
+       int num_cal;                            /**< number of calendar items for display */
+#endif                                                                                 
+       struct wc_attachment *first_attachment; /**< linked list of attachments for 'enter message' */
+       char last_chat_user[256];               /**< ??? todo */
+       char ImportantMessage[SIZ];             /**< ??? todo */
+       int ctdl_pid;                           /**< Session ID on the Citadel server */
+       char httpauth_user[256];                /**< only for GroupDAV sessions */
+       char httpauth_pass[256];                /**< only for GroupDAV sessions */
+       size_t burst_len;                       /** <??? todo */
+       size_t burst_alloc;                     /** <??? todo */
+       char *burst;                            /** <??? todo */
+       int gzip_ok;                            /**< Nonzero if Accept-encoding: gzip */
+       int is_mailbox;                         /**< the current room is a private mailbox */
+       struct folder *cache_fold;              /**< cache the iconbar room list */
+       int cache_max_folders;                  /**< ??? todo */
+       int cache_num_floors;                   /**< ??? todo */
+       time_t cache_timestamp;                 /**< ??? todo */
+       int current_iconbar;                    /**< What is currently in the iconbar? */
+       char floordiv_expanded[32];             /**< which floordiv currently expanded */
+       int selected_language;                  /**< Language selected by user */
+       time_t last_pager_check;                /**< last time we polled for instant msgs */
+};
+
+/** values for WC->current_iconbar */
+enum {
+       current_iconbar_menu,     /**< view the icon menue */
+       current_iconbar_roomlist  /**< view the roomtree */
+};
+
+
+#define num_parms(source)              num_tokens(source, '|') 
+
+/* 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;
+#endif
+
+struct serv_info serv_info;
+extern char floorlist[128][SIZ];
+extern char *axdefs[];
+extern char *ctdlhost, *ctdlport;
+extern int http_port;
+extern char *server_cookie;
+extern int is_https;
+extern int setup_wizard;
+extern char wizard_filename[];
+extern time_t if_modified_since;
+extern int follow_xff;
+void do_setup_wizard(void);
+
+void stuff_to_cookie(char *cookie, int session,
+                       char *user, char *pass, char *room);
+void cookie_to_stuff(char *cookie, int *session,
+                char *user, size_t user_len,
+                char *pass, size_t pass_len,
+                char *room, size_t room_len);
+void locate_host(char *, int);
+void become_logged_in(char *, char *, char *);
+void do_login(void);
+void display_login(char *mesg);
+void do_welcome(void);
+void do_logout(void);
+void display_main_menu(void);
+void display_aide_menu(void);
+void display_advanced_menu(void);
+void slrp_highest(void);
+void gotonext(void);
+void ungoto(void);
+void get_serv_info(char *, char *);
+int uds_connectsock(char *);
+int tcp_connectsock(char *, char *);
+void serv_getln(char *strbuf, int bufsize);
+void serv_puts(char *string);
+void who(void);
+void who_inner_div(void);
+void fmout(char *align);
+void pullquote_fmout(void);
+void wDumpContent(int);
+void serv_printf(const char *format,...);
+char *bstr(char *key);
+void urlesc(char *, char *);
+void urlescputs(char *);
+void jsesc(char *, char *);
+void jsescputs(char *);
+void output_headers(    int do_httpheaders,
+                       int do_htmlhead,
+                       int do_room_banner,
+                       int unset_cookies,
+                       int suppress_check,
+                       int cache);
+void wprintf(const char *format,...);
+void output_static(char *what);
+void stresc(char *target, char *strbuf, int nbsp, int nolinebreaks);
+void escputs(char *strbuf);
+void url(char *buf);
+void escputs1(char *strbuf, int nbsp, int nolinebreaks);
+void msgesc(char *target, char *strbuf);
+void msgescputs(char *strbuf);
+int extract_int(const char *source, int parmnum);
+long extract_long(const char *source, int parmnum);
+void stripout(char *str, char leftboundary, char rightboundary);
+void dump_vars(void);
+void embed_main_menu(void);
+void serv_read(char *buf, int bytes);
+int haschar(char *, char);
+void readloop(char *oper);
+void read_message(long msgnum, int printable_view, char *section);
+void embed_message(char *msgnum_as_string);
+void print_message(char *msgnum_as_string);
+void display_headers(char *msgnum_as_string);
+void text_to_server(char *ptr);
+void text_to_server_qp(char *ptr);
+void display_enter(void);
+void post_message(void);
+void confirm_delete_msg(void);
+void delete_msg(void);
+void confirm_move_msg(void);
+void move_msg(void);
+void userlist(void);
+void showuser(void);
+void display_page(void);
+void page_user(void);
+void do_chat(void);
+void display_private(char *rname, int req_pass);
+void goto_private(void);
+void zapped_list(void);
+void display_zap(void);
+void zap(void);
+void display_success(char *);
+void authorization_required(const char *message);
+void display_entroom(void);
+void entroom(void);
+void display_editroom(void);
+void netedit(void);
+void editroom(void);
+void display_whok(void);
+void do_invt_kick(void);
+void server_to_text(void);
+void save_edit(char *description, char *enter_cmd, int regoto);
+void display_edit(char *description, char *check_cmd,
+                 char *read_cmd, char *save_cmd, int with_room_banner);
+int gotoroom(char *gname);
+void confirm_delete_room(void);
+void delete_room(void);
+void validate(void);
+void display_graphics_upload(char *, char *, char *);
+void do_graphics_upload(char *upl_cmd);
+void serv_read(char *buf, int bytes);
+void serv_gets(char *strbuf);
+void serv_write(char *buf, int nbytes);
+void serv_puts(char *string);
+void serv_printf(const char *format,...);
+void load_floorlist(void);
+void display_reg(int);
+void display_changepw(void);
+void changepw(void);
+void display_edit_node(void);
+void edit_node(void);
+void display_netconf(void);
+void display_confirm_delete_node(void);
+void delete_node(void);
+void display_add_node(void);
+void add_node(void);
+void terminate_session(void);
+void edit_me(void);
+void display_siteconfig(void);
+void siteconfig(void);
+void display_generic(void);
+void do_generic(void);
+void ajax_servcmd(void);
+void display_menubar(int);
+void smart_goto(char *);
+void worker_entry(void);
+void session_loop(struct httprequest *);
+size_t wc_strftime(char *s, size_t max, const char *format, const struct tm *tm);
+void fmt_date(char *buf, time_t thetime, int brief);
+void fmt_time(char *buf, time_t thetime);
+void httpdate(char *buf, time_t thetime);
+time_t httpdate_to_timestamp(char *buf);
+void end_webcit_session(void);
+void page_popup(void);
+void chat_recv(void);
+void chat_send(void);
+void http_redirect(char *);
+void clear_local_substs(void);
+void svprintf(char *keyname, int keytype, const char *format,...);
+void svcallback(char *keyname, void (*fcn_ptr)() );
+void do_template(void *templatename);
+int lingering_close(int fd);
+char *memreadline(char *start, char *buf, int maxlen);
+int num_tokens (char *source, char tok);
+void extract_token(char *dest, const char *source, int parmnum, char separator, int maxlen);
+void remove_token(char *source, int parmnum, char separator);
+char *load_mimepart(long msgnum, char *partnum);
+int pattern2(char *search, char *patn);
+void do_edit_vcard(long, char *, char *);
+void edit_vcard(void);
+void submit_vcard(void);
+void striplt(char *);
+void select_user_to_edit(char *message, char *preselect);
+void delete_user(char *);
+void display_edituser(char *who, int is_new);
+void create_user(void);
+void edituser(void);
+void do_change_view(int);
+void change_view(void);
+void folders(void);
+void load_preferences(void);
+void save_preferences(void);
+void get_preference(char *key, char *value, size_t value_len);
+void set_preference(char *key, char *value, int save_to_server);
+void knrooms(void);
+int is_msg_in_mset(char *mset, long msgnum);
+char *safestrncpy(char *dest, const char *src, size_t n);
+void display_addressbook(long msgnum, char alpha);
+void offer_start_page(void);
+void convenience_page(char *titlebarcolor, char *titlebarmsg, char *messagetext);
+void change_start_page(void);
+void output_html(char *, int);
+void display_floorconfig(char *);
+void delete_floor(void);
+void create_floor(void);
+void rename_floor(void);
+void do_listsub(void);
+void toggle_self_service(void);
+void summary(void);
+void summary_inner_div(void);
+ssize_t write(int fd, const void *buf, size_t count);
+void cal_process_attachment(char *part_source, long msgnum, char *cal_partnum);
+void display_calendar(long msgnum);
+void display_task(long msgnum);
+void display_note(long msgnum);
+void updatenote(void);
+void do_calendar_view(void);
+void do_tasks_view(void);
+void free_calendar_buffer(void);
+void calendar_summary_view(void);
+int load_msg_ptrs(char *servcmd, int with_headers);
+void CtdlEncodeBase64(char *dest, const char *source, size_t sourcelen);
+int CtdlDecodeBase64(char *dest, const char *source, size_t length);
+void free_attachments(struct wcsession *sess);
+void free_march_list(struct wcsession *wcf);
+void set_room_policy(void);
+void display_inetconf(void);
+void save_inetconf(void);
+void generate_uuid(char *);
+void CtdlMakeTempFileName(char *, int);
+void display_preferences(void);
+void set_preferences(void);
+void recp_autocomplete(char *);
+void begin_ajax_response(void);
+void end_ajax_response(void);
+void initialize_viewdefs(void);
+void initialize_axdefs(void);
+void list_all_rooms_by_floor(char *viewpref);
+
+#ifdef WEBCIT_WITH_CALENDAR_SERVICE
+void display_edit_task(void);
+void save_task(void);
+void display_edit_event(void);
+void save_event(void);
+void display_icaltimetype_as_webform(struct icaltimetype *, char *);
+void icaltime_from_webform(struct icaltimetype *result, char *prefix);
+void icaltime_from_webform_dateonly(struct icaltimetype *result, char *prefix);
+void display_edit_individual_event(icalcomponent *supplied_vtodo, long msgnum);
+void save_individual_event(icalcomponent *supplied_vtodo, long msgnum);
+void respond_to_request(void);
+void handle_rsvp(void);
+void ical_dezonify(icalcomponent *cal);
+void partstat_as_string(char *buf, icalproperty *attendee);
+icalcomponent *ical_encapsulate_subcomponent(icalcomponent *subcomp);
+void check_attendee_availability(icalcomponent *supplied_vevent);
+void do_freebusy(char *req);
+#endif
+
+#ifdef ENABLE_NLS
+void initialize_locales(void);
+#endif
+
+extern char *months[];
+extern char *days[];
+void read_server_binary(char *buffer, size_t total_len);
+char *read_server_text(void);
+int goto_config_room(void);
+long locate_user_vcard(char *username, long usernum);
+void sleeeeeeeeeep(int);
+void http_transmit_thing(char *thing, size_t length, char *content_type,
+                        int is_static);
+void unescape_input(char *buf);
+void do_iconbar(void);
+void do_iconbar_roomlist(void);
+void do_selected_iconbar(void);
+void display_customize_iconbar(void);
+void commit_iconbar(void);
+int CtdlDecodeQuotedPrintable(char *decoded, char *encoded, int sourcelen);
+void spawn_another_worker_thread(void);
+void display_rss(char *roomname, char *request_method);
+void set_floordiv_expanded(char *which_floordiv);
+void offer_languages(void);
+void set_selected_language(char *);
+void go_selected_language(void);
+void stop_selected_language(void);
+void httplang_to_locale(char *LocaleString);
+void tabbed_dialog(int num_tabs, char *tabnames[]);
+void begin_tab(int tabnum, int num_tabs);
+void end_tab(int tabnum, int num_tabs);
+void str_wiki_index(char *s);
+void display_wiki_page(void);
+char *bmstrcasestr(char *text, char *pattern);
+
+#ifdef HAVE_ICONV
+iconv_t ctdl_iconv_open(const char *tocode, const char *fromcode);
+#endif
+
+void embed_room_banner(char *, int);
+
+/* navbar types that can be passed to embed_room_banner */
+enum {
+       navbar_none,
+       navbar_default
+};
+
+
+#ifdef HAVE_OPENSSL
+void init_ssl(void);
+void endtls(void);
+void ssl_lock(int mode, int n, const char *file, int line);
+int starttls(int sock);
+extern SSL_CTX *ssl_ctx;  
+int client_read_ssl(char *buf, int bytes, int timeout);
+void client_write_ssl(char *buf, int nbytes);
+#endif
+
+#ifdef HAVE_ZLIB
+#include <zlib.h>
+int ZEXPORT compress_gzip(Bytef * dest, uLongf * destLen,
+                          const Bytef * source, uLong sourceLen, int level);
+#endif
+
+#ifdef HAVE_ICONV
+void utf8ify_rfc822_string(char *buf);
+#endif
+
+void begin_burst(void);
+void end_burst(void);
+
+extern char *hourname[];       /**< Names of hours (12am, 1am, etc.) */
+
+void http_datestring(char *buf, size_t n, time_t xtime);
+
+
+/** Views (from citadel.h) */
+#define        VIEW_BBS                0       /**< Traditional Citadel BBS view */
+#define VIEW_MAILBOX           1       /**< Mailbox summary */
+#define VIEW_ADDRESSBOOK       2       /**< Address book view */
+#define VIEW_CALENDAR          3       /**< Calendar view */
+#define VIEW_TASKS             4       /**< Tasks view */
+#define VIEW_NOTES             5       /**<  Notes view */
+#define VIEW_WIKI              6       /**<  Wiki view */
+#define VIEW_CALBRIEF          7       /**< Brief Calendar view */
+
+
+/* These should be empty, but we have them for testing */
+#define DEFAULT_HTTPAUTH_USER  ""
+#define DEFAULT_HTTPAUTH_PASS  ""
+
diff --git a/webcit/webserver.c b/webcit/webserver.c
new file mode 100644 (file)
index 0000000..7a43269
--- /dev/null
@@ -0,0 +1,811 @@
+/*
+ * $Id$
+ */
+/**
+ * \defgroup Webserver This contains a simple multithreaded TCP server manager.  It sits around
+ * waiting on the specified port for incoming HTTP connections.  When a
+ * connection is established, it calls context_loop() from context_loop.c.
+ * \ingroup WebcitHttpServer
+ */
+
+/*@{*/
+#include "webcit.h"
+#include "webserver.h"
+
+#if HAVE_BACKTRACE
+#include <execinfo.h>
+#endif
+
+#ifndef HAVE_SNPRINTF
+int vsnprintf(char *buf, size_t max, const char *fmt, va_list argp);
+#endif
+
+int verbosity = 9;             /**< Logging level */
+int msock;                         /**< master listening socket */
+int is_https = 0;              /**< Nonzero if I am an HTTPS service */
+int follow_xff = 0;            /**< Follow X-Forwarded-For: header */
+int home_specified = 0; /**< did the user specify a homedir? */
+extern void *context_loop(int);
+extern void *housekeeping_loop(void);
+extern pthread_mutex_t SessionListMutex;
+extern pthread_key_t MyConKey;
+
+char socket_dir[PATH_MAX];      /**< where to talk to our citadel server */
+static const char editor_absolut_dir[PATH_MAX]=EDITORDIR; /**< nailed to what configure gives us. */
+static char static_dir[PATH_MAX]; /**< calculated on startup */
+char  *static_dirs[]={ /**< needs same sort order as the web mapping */
+       (char*)static_dir,                  /** our templates on disk */
+       (char*)editor_absolut_dir           /** the editor on disk */
+};
+int ndirs=2; //sizeof(static_content_dirs);//sizeof(char *);
+
+/**
+ * Subdirectories from which the client may request static content
+ */
+char *static_content_dirs[] = {
+       "static",                     /** static templates */
+       "tiny_mce"                    /** the JS editor */
+};
+
+
+
+char *server_cookie = NULL; /**< our Cookie connection to the client */
+
+int http_port = PORT_NUM;      /**< Port to listen on */
+
+char *ctdlhost = DEFAULT_HOST; /**< our name */
+char *ctdlport = DEFAULT_PORT; /**< our Port */
+int setup_wizard = 0;          /**< should we run the setup wizard? \todo */
+char wizard_filename[PATH_MAX];/**< where's the setup wizard? */
+
+/** 
+ * \brief 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.
+ * \param ip_addr ip to bind to
+ * \param port_number the port to bind to 
+ * \param queue_len the size of the input queue ????
+ */
+int ig_tcp_server(char *ip_addr, int port_number, int queue_len)
+{
+       struct sockaddr_in sin;
+       int s, i;
+
+       memset(&sin, 0, sizeof(sin));
+       sin.sin_family = AF_INET;
+       if (ip_addr == NULL) {
+               sin.sin_addr.s_addr = INADDR_ANY;
+       } else {
+               sin.sin_addr.s_addr = inet_addr(ip_addr);
+       }
+
+       if (sin.sin_addr.s_addr == INADDR_NONE) {
+               sin.sin_addr.s_addr = INADDR_ANY;
+       }
+
+       if (port_number == 0) {
+               lprintf(1, "Cannot start: no port number specified.\n");
+               exit(1);
+       }
+       sin.sin_port = htons((u_short) port_number);
+
+       s = socket(PF_INET, SOCK_STREAM, (getprotobyname("tcp")->p_proto));
+       if (s < 0) {
+               lprintf(1, "Can't create a socket: %s\n", strerror(errno));
+               exit(errno);
+       }
+       /** Set some socket options that make sense. */
+       i = 1;
+       setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));
+
+       if (bind(s, (struct sockaddr *) &sin, sizeof(sin)) < 0) {
+               lprintf(1, "Can't bind: %s\n", strerror(errno));
+               exit(errno);
+       }
+       if (listen(s, queue_len) < 0) {
+               lprintf(1, "Can't listen: %s\n", strerror(errno));
+               exit(errno);
+       }
+       return (s);
+}
+
+
+
+/**
+ * \brief Create a Unix domain socket and listen on it
+ * \param sockpath file name of the unix domain socket
+ * \param queue_len queue size of the kernel fifo????
+ */
+int ig_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) if (errno != ENOENT) {
+               lprintf(1, "citserver: can't unlink %s: %s\n",
+                       sockpath, strerror(errno));
+               exit(errno);
+       }
+
+       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) {
+               lprintf(1, "citserver: Can't create a socket: %s\n",
+                       strerror(errno));
+               exit(errno);
+       }
+
+       if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
+               lprintf(1, "citserver: Can't bind: %s\n",
+                       strerror(errno));
+               exit(errno);
+       }
+
+       if (listen(s, actual_queue_len) < 0) {
+               lprintf(1, "citserver: Can't listen: %s\n",
+                       strerror(errno));
+               exit(errno);
+       }
+
+       chmod(sockpath, 0777);
+       return(s);
+}
+
+
+
+
+/**
+ * \brief Read data from the client socket.
+ * \param sock socket fd to read from ???
+ * \param buf buffer to read into 
+ * \param bytes how large is the read buffer?
+ * \param timeout how long should we wait for input?
+ * \return values are\
+ *      1       Requested number of bytes has been read.\
+ *      0       Request timed out.\
+ *        -1           Connection is broken, or other error.
+ */
+int client_read_to(int sock, char *buf, int bytes, int timeout)
+{
+       int len, rlen;
+       fd_set rfds;
+       struct timeval tv;
+       int retval;
+
+
+#ifdef HAVE_OPENSSL
+       if (is_https) {
+               return (client_read_ssl(buf, bytes, timeout));
+       }
+#endif
+
+       len = 0;
+       while (len < bytes) {
+               FD_ZERO(&rfds);
+               FD_SET(sock, &rfds);
+               tv.tv_sec = timeout;
+               tv.tv_usec = 0;
+
+               retval = select((sock) + 1, &rfds, NULL, NULL, &tv);
+               if (FD_ISSET(sock, &rfds) == 0) {
+                       return (0);
+               }
+
+               rlen = read(sock, &buf[len], bytes - len);
+
+               if (rlen < 1) {
+                       lprintf(2, "client_read() failed: %s\n",
+                               strerror(errno));
+                       return (-1);
+               }
+               len = len + rlen;
+       }
+
+#ifdef HTTP_TRACING
+       write(2, "\033[32m", 5);
+       write(2, buf, bytes);
+       write(2, "\033[30m", 5);
+#endif
+       return (1);
+}
+
+/**
+ * \brief write data to the client
+ * \param buf data to write to the client
+ * \param count size of buffer
+ */
+ssize_t client_write(const void *buf, size_t count)
+{
+       char *newptr;
+       size_t newalloc;
+
+       if (WC->burst != NULL) {
+               if ((WC->burst_len + count) >= WC->burst_alloc) {
+                       newalloc = (WC->burst_alloc * 2);
+                       if ((WC->burst_len + count) >= newalloc) {
+                               newalloc += count;
+                       }
+                       newptr = realloc(WC->burst, newalloc);
+                       if (newptr != NULL) {
+                               WC->burst = newptr;
+                               WC->burst_alloc = newalloc;
+                       }
+               }
+               if ((WC->burst_len + count) < WC->burst_alloc) {
+                       memcpy(&WC->burst[WC->burst_len], buf, count);
+                       WC->burst_len += count;
+                       return (count);
+               }
+               else {
+                       return(-1);
+               }
+       }
+#ifdef HAVE_OPENSSL
+       if (is_https) {
+               client_write_ssl((char *) buf, count);
+               return (count);
+       }
+#endif
+#ifdef HTTP_TRACING
+       write(2, "\033[34m", 5);
+       write(2, buf, count);
+       write(2, "\033[30m", 5);
+#endif
+       return (write(WC->http_sock, buf, count));
+}
+
+/**
+ * \brief what burst???
+ */
+void begin_burst(void)
+{
+       if (WC->burst != NULL) {
+               free(WC->burst);
+               WC->burst = NULL;
+       }
+       WC->burst_len = 0;
+       WC->burst_alloc = 32768;
+       WC->burst = malloc(WC->burst_alloc);
+}
+
+
+/**
+ * \brief uses the same calling syntax as compress2(), but it
+ * creates a stream compatible with HTTP "Content-encoding: gzip"
+ */
+#ifdef HAVE_ZLIB
+#define DEF_MEM_LEVEL 8 /**< memlevel??? */
+#define OS_CODE 0x03   /**< unix */
+int ZEXPORT compress_gzip(Bytef * dest,         /**< compressed buffer*/
+                                                 uLongf * destLen,     /**< length of the compresed data */
+                                                 const Bytef * source, /**< source to encode */
+                                                 uLong sourceLen,      /**< length of the source to encode */
+                                                 int level)            /**< what level??? */
+{
+       const int gz_magic[2] = { 0x1f, 0x8b }; /** gzip magic header */
+
+       /** write gzip header */
+       sprintf((char *) dest, "%c%c%c%c%c%c%c%c%c%c",
+               gz_magic[0], gz_magic[1], Z_DEFLATED,
+               0 /*flags */ , 0, 0, 0, 0 /*time */ , 0 /** xflags */ ,
+               OS_CODE);
+
+       /* normal deflate */
+       z_stream stream;
+       int err;
+       stream.next_in = (Bytef *) source;
+       stream.avail_in = (uInt) sourceLen;
+       stream.next_out = dest + 10L;   // after header
+       stream.avail_out = (uInt) * destLen;
+       if ((uLong) stream.avail_out != *destLen)
+               return Z_BUF_ERROR;
+
+       stream.zalloc = (alloc_func) 0;
+       stream.zfree = (free_func) 0;
+       stream.opaque = (voidpf) 0;
+
+       err = deflateInit2(&stream, level, Z_DEFLATED, -MAX_WBITS,
+                          DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);
+       if (err != Z_OK)
+               return err;
+
+       err = deflate(&stream, Z_FINISH);
+       if (err != Z_STREAM_END) {
+               deflateEnd(&stream);
+               return err == Z_OK ? Z_BUF_ERROR : err;
+       }
+       *destLen = stream.total_out + 10L;
+
+       /* write CRC and Length */
+       uLong crc = crc32(0L, source, sourceLen);
+       int n;
+       for (n = 0; n < 4; ++n, ++*destLen) {
+               dest[*destLen] = (int) (crc & 0xff);
+               crc >>= 8;
+       }
+       uLong len = stream.total_in;
+       for (n = 0; n < 4; ++n, ++*destLen) {
+               dest[*destLen] = (int) (len & 0xff);
+               len >>= 8;
+       }
+       err = deflateEnd(&stream);
+       return err;
+}
+#endif
+
+/**
+ * \brief what burst???
+ */
+void end_burst(void)
+{
+       size_t the_len;
+       char *the_data;
+
+       if (WC->burst == NULL)
+               return;
+
+       the_len = WC->burst_len;
+       the_data = WC->burst;
+
+       WC->burst_len = 0;
+       WC->burst_alloc = 0;
+       WC->burst = NULL;
+
+#ifdef HAVE_ZLIB
+       /* Handle gzip compression */
+       if (WC->gzip_ok) {
+               char *compressed_data = NULL;
+               uLongf compressed_len;
+
+               compressed_len = (uLongf) ((the_len * 101) / 100) + 100;
+               compressed_data = malloc(compressed_len);
+
+               if (compress_gzip((Bytef *) compressed_data,
+                                 &compressed_len,
+                                 (Bytef *) the_data,
+                                 (uLongf) the_len, Z_BEST_SPEED) == Z_OK) {
+                       wprintf("Content-encoding: gzip\r\n");
+                       free(the_data);
+                       the_data = compressed_data;
+                       the_len = compressed_len;
+               } else {
+                       free(compressed_data);
+               }
+       }
+#endif                         /* HAVE_ZLIB */
+
+       wprintf("Content-length: %d\r\n\r\n", the_len);
+       client_write(the_data, the_len);
+       free(the_data);
+       return;
+}
+
+
+
+/**
+ * \brief Read data from the client socket with default timeout.
+ * (This is implemented in terms of client_read_to() and could be
+ * justifiably moved out of sysdep.c)
+ * \param sock the socket fd to read from???
+ * \param buf the buffer to write to
+ * \param bytes how large is the buffer
+ */
+int client_read(int sock, char *buf, int bytes)
+{
+       return (client_read_to(sock, buf, bytes, SLEEPING));
+}
+
+
+/**
+ * \brief Get a LF-terminated line of text from the client.
+ * (This is implemented in terms of client_read() and could be
+ * justifiably moved out of sysdep.c)
+ * \param sock socket fd to get client line from???
+ * \param buf buffer to write read data to
+ * \param bufsiz how many bytes to read
+ * \return  numer of bytes read???
+ */
+int client_getln(int sock, char *buf, int bufsiz)
+{
+       int i, retval;
+
+       /** Read one character at a time.*/
+       for (i = 0;; i++) {
+               retval = client_read(sock, &buf[i], 1);
+               if (retval != 1 || buf[i] == '\n' || i == (bufsiz-1))
+                       break;
+               if ( (!isspace(buf[i])) && (!isprint(buf[i])) ) {
+                       /** Non printable character recieved from client */
+                       return(-1);
+               }
+       }
+
+       /** If we got a long line, discard characters until the newline. */
+       if (i == (bufsiz-1))
+               while (buf[i] != '\n' && retval == 1)
+                       retval = client_read(sock, &buf[i], 1);
+
+       /**
+        * Strip any trailing non-printable characters.
+        */
+       buf[i] = 0;
+       while ((strlen(buf) > 0) && (!isprint(buf[strlen(buf) - 1]))) {
+               buf[strlen(buf) - 1] = 0;
+       }
+       return (retval);
+}
+
+
+/**
+ * \brief      Start running as a daemon.  
+ *
+ * param       do_close_stdio          Only close stdio if set.
+ */
+void start_daemon(int do_close_stdio)
+{
+       if (do_close_stdio) {
+               /* close(0); */
+               close(1);
+               close(2);
+       }
+       signal(SIGHUP, SIG_IGN);
+       signal(SIGINT, SIG_IGN);
+       signal(SIGQUIT, SIG_IGN);
+       if (fork() != 0) {
+               exit(0);
+       }
+}
+
+/**
+ * \brief      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;
+
+       lprintf(3, "Creating a new thread\n");
+
+       /** 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, and the IMAP service crashes on
+        * 64-bit Linux.
+        */
+       if ((ret = pthread_attr_setstacksize(&attr, 1024 * 1024))) {
+               lprintf(1, "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) {
+               lprintf(1, "Can't create thread: %s\n", strerror(errno));
+       }
+
+       /** free up the attributes */
+       pthread_attr_destroy(&attr);
+}
+
+/**
+ * \brief Here's where it all begins.
+ * \param argc number of commandline args
+ * \param argv the commandline arguments
+ */
+int main(int argc, char **argv)
+{
+       pthread_t SessThread;   /**< Thread descriptor */
+       pthread_attr_t attr;    /**< Thread attributes */
+       int a, i;                       /**< General-purpose variables */
+       char tracefile[PATH_MAX];
+       char ip_addr[256];
+       char dirbuffer[PATH_MAX]="";
+       int relh=0;
+       int home=0;
+       int home_specified=0;
+       char relhome[PATH_MAX]="";
+       char webcitdir[PATH_MAX] = DATADIR;
+       char *hdir;
+       const char *basedir;
+#ifdef ENABLE_NLS
+       char *locale = NULL;
+       char *mo = NULL;
+#endif /* ENABLE_NLS */
+       char uds_listen_path[PATH_MAX]; /**< listen on a unix domain socket? */
+
+       strcpy(uds_listen_path, "");
+
+       /** Parse command line */
+#ifdef HAVE_OPENSSL
+       while ((a = getopt(argc, argv, "h:i:p:t:x:cfs")) != EOF)
+#else
+       while ((a = getopt(argc, argv, "h:i:p:t:x:cf")) != EOF)
+#endif
+               switch (a) {
+               case 'h':
+                       hdir = strdup(optarg);
+                       relh=hdir[0]!='/';
+                       if (!relh) safestrncpy(webcitdir, hdir,
+                                                                  sizeof webcitdir);
+                       else
+                               safestrncpy(relhome, relhome,
+                                                       sizeof relhome);
+                       /* free(hdir); TODO: SHOULD WE DO THIS? */
+                       home_specified = 1;
+                       home=1;
+                       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':
+                       safestrncpy(tracefile, optarg, sizeof tracefile);
+                       freopen(tracefile, "w", stdout);
+                       freopen(tracefile, "w", stderr);
+                       freopen(tracefile, "r", stdin);
+                       break;
+               case 'x':
+                       verbosity = 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) {
+                                       lprintf(2, "gethostname: %s\n",
+                                               strerror(errno));
+                                       free(server_cookie);
+                               }
+                       }
+                       break;
+               case 's':
+                       is_https = 1;
+                       break;
+               default:
+                       fprintf(stderr, "usage: webserver "
+                               "[-i ip_addr] [-p http_port] "
+                               "[-t tracefile] [-c] [-f] "
+#ifdef HAVE_OPENSSL
+                               "[-s] "
+#endif
+                               "[remotehost [remoteport]]\n");
+                       return 1;
+               }
+
+       if (optind < argc) {
+               ctdlhost = argv[optind];
+               if (++optind < argc)
+                       ctdlport = argv[optind];
+       }
+       /** Tell 'em who's in da house */
+       lprintf(1, SERVER "\n");
+       lprintf(1, "Copyright (C) 1996-2006 by the Citadel development team.\n"
+               "This software is distributed under the terms of the "
+               "GNU General Public License.\n\n"
+       );
+
+
+       /** initialize the International Bright Young Thing */
+#ifdef ENABLE_NLS
+       initialize_locales();
+       locale = setlocale(LC_ALL, "");
+       mo = malloc(strlen(webcitdir) + 20);
+       lprintf(9, "Message catalog directory: %s\n", bindtextdomain("webcit", LOCALEDIR));
+       free(mo);
+       lprintf(9, "Text domain: %s\n", textdomain("webcit"));
+       lprintf(9, "Text domain Charset: %s\n", bind_textdomain_codeset("webcit","UTF8"));
+#endif
+
+
+       /* 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=DATADIR;
+       COMPUTE_DIRECTORY(static_dir);
+       /** we should go somewhere we can leave our coredump, if enabled... */
+       lprintf(9, "Changing directory to %s\n", socket_dir);
+       if (chdir(webcitdir) != 0) {
+               perror("chdir");
+       }
+       initialize_viewdefs();
+       initialize_axdefs();
+
+       /**
+        * 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) {
+               lprintf(1, "Can't create TSD key: %s\n", strerror(errno));
+       }
+
+       /**
+        * 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) {
+               lprintf(1, "Can't create TSD key: %s\n", strerror(errno));
+       }
+#endif
+
+       /**
+        * Bind the server to our favorite port.
+        * There is no need to check for errors, because ig_tcp_server()
+        * exits if it doesn't succeed.
+        */
+
+       if (strlen(uds_listen_path) > 0) {
+               lprintf(2, "Attempting to create listener socket at %s...\n", uds_listen_path);
+               msock = ig_uds_server(uds_listen_path, LISTEN_QUEUE_LENGTH);
+       }
+       else {
+               lprintf(2, "Attempting to bind to port %d...\n", http_port);
+               msock = ig_tcp_server(ip_addr, http_port, LISTEN_QUEUE_LENGTH);
+       }
+
+       lprintf(2, "Listening on socket %d\n", 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
+
+       /** Start a few initial worker threads */
+       for (i = 0; i < (MIN_WORKER_THREADS); ++i) {
+               spawn_another_worker_thread();
+       }
+
+       /* now the original thread becomes another worker */
+       worker_entry();
+       return 0;
+}
+
+
+/**
+ * Entry point for worker threads
+ */
+void worker_entry(void)
+{
+       int ssock;
+       int i = 0;
+       int time_to_die = 0;
+       int fail_this_transaction = 0;
+
+       do {
+               /** Only one thread can accept at a time */
+               fail_this_transaction = 0;
+               ssock = accept(msock, NULL, 0);
+               if (ssock < 0) {
+                       lprintf(2, "accept() failed: %s\n",
+                               strerror(errno));
+               } else {
+                       /** 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);
+                               }
+                       }
+#endif
+
+                       if (fail_this_transaction == 0) {
+                               /** Perform an HTTP transaction... */
+                               context_loop(ssock);
+                               /** ...and close the socket. */
+                               lingering_close(ssock);
+                       }
+
+               }
+
+       } while (!time_to_die);
+
+       pthread_exit(NULL);
+}
+
+/**
+ * \brief logprintf. log messages 
+ * logs to stderr if loglevel is lower than the verbosity set at startup
+ * \param loglevel level of the message
+ * \param format the printf like format string
+ * \param ... the strings to put into format
+ */
+int lprintf(int loglevel, const char *format, ...)
+{
+       va_list ap;
+
+       if (loglevel <= verbosity) {
+               va_start(ap, format);
+               vfprintf(stderr, format, ap);
+               va_end(ap);
+               fflush(stderr);
+       }
+       return 1;
+}
+
+
+/**
+ * \brief print the actual stack frame.
+ */
+void wc_backtrace(void)
+{
+#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)
+                       lprintf(1, "%s\n", strings[i]);
+               else
+                       lprintf(1, "%p\n", stack_frames[i]);
+       }
+       free(strings);
+#endif
+}
+
+/*@}*/
diff --git a/webcit/webserver.h b/webcit/webserver.h
new file mode 100644 (file)
index 0000000..5033914
--- /dev/null
@@ -0,0 +1,12 @@
+/* $Id$ */
+
+extern char *static_dirs[PATH_MAX];          /**< Web representation */
+extern char *static_content_dirs[PATH_MAX];  /**< Disk representation */
+extern int ndirs;
+extern char socket_dir[PATH_MAX];
+
+int client_getln(int sock, char *buf, int bufsiz);
+int client_read(int sock, char *buf, int bytes);
+int client_read_to(int sock, char *buf, int bytes, int timeout);
+ssize_t client_write(const void *buf, size_t count);
+int lprintf(int loglevel, const char *format, ...);
diff --git a/webcit/who.c b/webcit/who.c
new file mode 100644 (file)
index 0000000..e81b911
--- /dev/null
@@ -0,0 +1,281 @@
+/*
+ * $Id$
+ */
+/**
+ * \defgroup DislpayWho Display a list of all users currently logged on to the Citadel server.
+ * \ingroup WebcitDisplayItems
+ */
+/*@{*/
+#include "webcit.h"
+
+
+
+/**
+ * \brief Display inner div of Wholist
+ */
+void who_inner_div(void) {
+       char buf[SIZ], user[SIZ], room[SIZ], host[SIZ],
+               realroom[SIZ], realhost[SIZ];
+       int sess;
+       time_t last_activity;
+       time_t now;
+       int bg = 0;
+
+       wprintf("<table border=\"0\" cellspacing=\"0\" width=\"100%%\" bgcolor=\"#FFFFFF\">"
+               "<tr>\n");
+       wprintf("<th colspan=\"3\"> </th>\n");
+       wprintf("<th>%s</th>\n", _("User name"));
+       wprintf("<th>%s</th>", _("Room"));
+       wprintf("<th>%s</th>\n</tr>\n", _("From host"));
+
+       serv_puts("TIME");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '2') {
+               now = extract_long(&buf[4], 0);
+       }
+       else {
+               now = time(NULL);
+       }
+
+       serv_puts("RWHO");
+       serv_getln(buf, sizeof buf);
+       if (buf[0] == '1') {
+               while (serv_getln(buf, sizeof buf), strcmp(buf, "000")) {
+                       sess = extract_int(buf, 0);
+                       extract_token(user, buf, 1, '|', sizeof user);
+                       extract_token(room, buf, 2, '|', sizeof room);
+                       extract_token(host, buf, 3, '|', sizeof host);
+                       extract_token(realroom, buf, 9, '|', sizeof realroom);
+                       extract_token(realhost, buf, 10, '|', sizeof realhost);
+                       last_activity = extract_long(buf, 5);
+
+                       bg = 1 - bg;
+                       wprintf("<tr bgcolor=\"#%s\">",
+                               (bg ? "DDDDDD" : "FFFFFF")
+                       );
+
+
+                       wprintf("<td>");
+                       if ((WC->is_aide) &&
+                           (sess != WC->ctdl_pid)) {
+                               wprintf(" <a href=\"terminate_session?which_session=%d", sess);
+                               wprintf("\" onClick=\"return ConfirmKill();\">%s</a>", _("(kill)"));
+                       }
+                       if (sess == WC->ctdl_pid) {
+                               wprintf(" <a href=\"edit_me\">%s</a>", _("(edit)"));
+                       }
+                       wprintf("</td>");
+
+                       /** (link to page this user) */
+                       wprintf("<td><a href=\"display_page?recp=");
+                       urlescputs(user);
+                       wprintf("\">"
+                               "<img align=\"middle\" "
+                               "src=\"static/citadelchat_24x.gif\" "
+                               "alt=\"(p)\""
+                               " border=\"0\" /></a> ");
+                       wprintf("</td>");
+
+                       /** (idle flag) */
+                       wprintf("<td>");
+                       if ((now - last_activity) > 900L) {
+                               wprintf(" "
+                                       "<img align=\"middle\" "
+                                       "src=\"static/inactiveuser_24x.gif\" "
+                                       "alt=\"(idle)\" border=\"0\" />");
+                       }
+                       else {
+                               wprintf(" "
+                                       "<img align=\"middle\" "
+                                       "src=\"static/activeuser_24x.gif\" "
+                                       "alt=\"(active)\" border=\"0\" />");
+                       }
+                       wprintf("</td>\n<td>");
+
+
+
+                       /** username (link to user bio/photo page) */
+                       wprintf("<a href=\"showuser?who=");
+                       urlescputs(user);
+                       wprintf("\">");
+                       escputs(user);
+                       wprintf("</a>");
+
+                       /** room */
+                       wprintf("</td>\n\t<td>");
+                       escputs(room);
+                       if (strlen(realroom) > 0) {
+                               wprintf("<br /><i>");
+                               escputs(realroom);
+                               wprintf("</i>");
+                       }
+                       wprintf("</td>\n\t<td>");
+
+                       /** hostname */
+                       escputs(host);
+                       if (strlen(realhost) > 0) {
+                               wprintf("<br /><i>");
+                               escputs(realhost);
+                               wprintf("</i>");
+                       }
+                       wprintf("</td>\n</tr>");
+               }
+       }
+       wprintf("</table>");
+}
+
+
+/**
+ * \brief who is on?
+ */
+void who(void)
+{
+       char title[256];
+
+       output_headers(1, 1, 2, 0, 0, 0);
+
+       wprintf("<script type=\"text/javascript\">\n"
+               "function ConfirmKill() { \n"
+               "return confirm('%s');\n"
+               "}\n"
+               "</script>\n", _("Do you really want to kill this session?")
+       );
+
+       wprintf("<div id=\"banner\">\n");
+       wprintf("<table width=100%% border=0 bgcolor=\"#444455\"><tr><td>");
+       wprintf("<img src=\"static/usermanag_48x.gif\" alt=\" \" "
+               "align=middle "
+               ">");
+       wprintf("<span class=\"titlebar\"> ");
+
+       snprintf(title, sizeof title, _("Users currently on %s"), serv_info.serv_humannode);
+       escputs(title);
+
+       wprintf("</span></td><td align=right>");
+       offer_start_page();
+       wprintf("</td></tr></table>\n");
+       wprintf("</div>\n");
+
+       wprintf("<div id=\"content\">\n");
+
+       wprintf("<div style=\"display:inline\" id=\"fix_scrollbar_bug\">");
+       who_inner_div();
+       wprintf("</div>\n");
+
+       wprintf("<div id=\"instructions\" align=center>");
+       wprintf(_("Click on a name to read user info.  Click on %s "
+               "to send an instant message to that user."),
+               "<img align=\"middle\" src=\"static/citadelchat_16x.gif\" alt=\"(p)\" border=\"0\">"
+       );
+       wprintf("</div>\n");
+
+       /**
+        * JavaScript to make the ajax refresh happen:
+        * See http://www.sergiopereira.com/articles/prototype.js.html for info on Ajax.PeriodicalUpdater
+        * It wants: 1. The div being updated
+        *           2. The URL of the update source
+        *           3. Other flags (such as the HTTP method and the refresh frequency)
+        */
+       wprintf(
+               "<script type=\"text/javascript\">                                      "
+               " new Ajax.PeriodicalUpdater('fix_scrollbar_bug', 'who_inner_html',     "
+               "                            { method: 'get', frequency: 30 }  );       "
+               "</script>                                                              \n"
+       );
+       wDumpContent(1);
+}
+
+/**
+ * \brief end session \todo what??? does this belong here? 
+ */
+void terminate_session(void)
+{
+       char buf[SIZ];
+
+       serv_printf("TERM %s", bstr("which_session"));
+       serv_getln(buf, sizeof buf);
+       who();
+}
+
+
+/**
+ * \brief Change your session info (fake roomname and hostname)
+ */
+void edit_me(void)
+{
+       char buf[SIZ];
+
+       if (strlen(bstr("change_room_name_button")) > 0) {
+               serv_printf("RCHG %s", bstr("fake_roomname"));
+               serv_getln(buf, sizeof buf);
+               http_redirect("who");
+       } else if (strlen(bstr("change_host_name_button")) > 0) {
+               serv_printf("HCHG %s", bstr("fake_hostname"));
+               serv_getln(buf, sizeof buf);
+               http_redirect("who");
+       } else if (strlen(bstr("change_user_name_button")) > 0) {
+               serv_printf("UCHG %s", bstr("fake_username"));
+               serv_getln(buf, sizeof buf);
+               http_redirect("who");
+       } else if (strlen(bstr("cancel_button")) > 0) {
+               http_redirect("who");
+       } else {
+               output_headers(1, 1, 0, 0, 0, 0);
+
+               wprintf("<div id=\"banner\">\n");
+               wprintf("<table width=100%% border=0 bgcolor=\"#444455\"><tr><td>");
+               wprintf("<span class=\"titlebar\">");
+               wprintf(_("Edit your session display"));
+               wprintf("</span></td></tr></table>\n");
+               wprintf("</div>\n<div id=\"content\">\n");
+
+               wprintf(_("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. "));
+               wprintf("<br />\n");
+
+               wprintf("<form method=\"POST\" action=\"edit_me\">\n");
+
+               wprintf("<table border=0 width=100%%>\n");
+
+               wprintf("<tr><td><b>");
+               wprintf(_("Room name:"));
+               wprintf("</b></td>\n<td>");
+               wprintf("<input type=\"text\" name=\"fake_roomname\" maxlength=\"64\">\n");
+               wprintf("</td>\n<td align=center>");
+               wprintf("<input type=\"submit\" name=\"change_room_name_button\" value=\"%s\">",
+                       _("Change room name"));
+               wprintf("</td>\n</tr>\n");
+
+               wprintf("<tr><td><b>");
+               wprintf(_("Host name:"));
+               wprintf("</b></td><td>");
+               wprintf("<input type=\"text\" name=\"fake_hostname\" maxlength=\"64\">\n");
+               wprintf("</td>\n<td align=center>");
+               wprintf("<input type=\"submit\" name=\"change_host_name_button\" value=\"%s\">",
+                       _("Change host name"));
+               wprintf("</td>\n</tr>\n");
+
+               if (WC->is_aide) {
+                       wprintf("<tr><td><b>");
+                       wprintf(_("User name:"));
+                       wprintf("</b></td><td>");
+                       wprintf("<input type=\"text\" name=\"fake_username\" maxlength=\"64\">\n");
+                       wprintf("</td>\n<td align=center>");
+                       wprintf("<input type=\"submit\" name \"change_user_name_button\" value=\"%s\">",
+                               _("Change user name"));
+                       wprintf("</td>\n</tr>\n");
+               }
+               wprintf("<tr><td> </td><td> </td><td align=center>");
+               wprintf("<input type=\"submit\" name=\"cancel_button\" value=\"%s\">",
+                       _("Cancel"));
+               wprintf("</td></tr></table>\n");
+               wprintf("</form></center>\n");
+               wDumpContent(1);
+       }
+}
+
+
+/*@}*/
diff --git a/webcit/wiki.c b/webcit/wiki.c
new file mode 100644 (file)
index 0000000..0f35b61
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+ * $Id:  $
+ */
+/**
+ *
+ * \defgroup Wiki Wiki; Functions pertaining to rooms with a wiki view
+ * \ingroup WebcitDisplayItems
+ */
+
+/*@{*/
+#include "webcit.h"
+#include "groupdav.h"
+
+
+
+/** 
+ * \brief Convert a string to something suitable as a wiki index
+ *
+ * \param s The string to be converted.
+ */
+void str_wiki_index(char *s)
+{
+       int i;
+
+       if (s == NULL) return;
+
+       /* First remove all non-alphanumeric characters */
+       for (i=0; i<strlen(s); ++i) {
+               if (!isalnum(s[i])) {
+                       strcpy(&s[i], &s[i+1]);
+               }
+       }
+
+       /* Then make everything lower case */
+       for (i=0; i<strlen(s); ++i) {
+               s[i] = tolower(s[i]);
+       }
+}
+
+/**
+ * \brief Display a specific page from a wiki room
+ */
+void display_wiki_page(void)
+{
+       char roomname[128];
+       char pagename[128];
+       char errmsg[256];
+       long msgnum = (-1L);
+
+       safestrncpy(roomname, bstr("room"), sizeof roomname);
+       safestrncpy(pagename, bstr("page"), sizeof pagename);
+       str_wiki_index(pagename);
+
+       if (strlen(roomname) > 0) {
+
+               /* If we're not in the correct room, try going there. */
+               if (strcasecmp(roomname, WC->wc_roomname)) {
+                       gotoroom(roomname);
+               }
+       
+               /* If we're still not in the correct room, it doesn't exist. */
+               if (strcasecmp(roomname, WC->wc_roomname)) {
+                       snprintf(errmsg, sizeof errmsg,
+                               _("There is no room called '%s'."),
+                               roomname);
+                       convenience_page("FF0000", _("Error"), errmsg);
+                       return;
+               }
+
+       }
+
+       if (WC->wc_view != VIEW_WIKI) {
+               snprintf(errmsg, sizeof errmsg,
+                       _("'%s' is not a Wiki room."),
+                       roomname);
+               convenience_page("FF0000", _("Error"), errmsg);
+               return;
+       }
+
+       if (strlen(pagename) == 0) {
+               strcpy(pagename, "home");
+       }
+
+       /* Found it!  Now read it. */
+       msgnum = locate_message_by_uid(pagename);
+       if (msgnum >= 0L) {
+               output_headers(1, 1, 1, 0, 0, 0);
+               read_message(msgnum, 0, "");
+               wDumpContent(1);
+               return;
+       }
+
+       output_headers(1, 1, 1, 0, 0, 0);
+       wprintf("<br /><br />"
+               "<div align=\"center\">"
+               "<table border=\"0\" bgcolor=\"#ffffff\" cellpadding=\"10\">"
+               "<tr><td align=\"center\">"
+       );
+       wprintf("<br><b>");
+       wprintf(_("There is no page called '%s' here."), pagename);
+       wprintf("</b><br><br>");
+       wprintf(_("Select the 'Edit this page' link in the room banner "
+               "if you would like to create this page."));
+       wprintf("<br><br>");
+       wprintf("</td></tr></table></div>\n");
+       wDumpContent(1);
+}
+
+
+/** @} */