From 6b6032e1391084770bce5143c076dbba95b24b37 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 9 Jun 2010 18:36:13 +0000 Subject: [PATCH 001/496] Creating branches/Stylite-EPL-10.1 --- egw-pear/HTTP/WebDAV/Server.php | 2519 ++++++++++++ egw-pear/HTTP/WebDAV/Server/Filesystem.php | 804 ++++ .../HTTP/WebDAV/Tools/_parse_lockinfo.php | 237 ++ .../HTTP/WebDAV/Tools/_parse_propfind.php | 251 ++ .../HTTP/WebDAV/Tools/_parse_proppatch.php | 223 ++ egw-pear/Log.php | 824 ++++ egw-pear/Log/composite.php | 231 ++ egw-pear/Log/console.php | 204 + egw-pear/Log/daemon.php | 230 ++ egw-pear/Log/display.php | 141 + egw-pear/Log/error_log.php | 127 + egw-pear/Log/file.php | 312 ++ egw-pear/Log/mail.php | 246 ++ egw-pear/Log/mcal.php | 170 + egw-pear/Log/mdb2.php | 358 ++ egw-pear/Log/null.php | 91 + egw-pear/Log/observer.php | 129 + egw-pear/Log/sql.php | 294 ++ egw-pear/Log/sqlite.php | 225 ++ egw-pear/Log/syslog.php | 160 + egw-pear/Log/win.php | 269 ++ egw-pear/Net/IMAP.php | 2785 ++++++++++++++ egw-pear/Net/IMAPProtocol.php | 3405 +++++++++++++++++ egw-pear/Net/Sieve.php | 1145 ++++++ egw-pear/Net/Socket.php | 556 +++ egw-pear/setup/setup.inc.php | 49 + emailadmin/Changelog | 49 + emailadmin/doc/dbmail.schema | 71 + emailadmin/doc/main.cf | 754 ++++ emailadmin/doc/qmailuser.schema | 103 + emailadmin/inc/class.ajaxemailadmin.inc.php | 46 + emailadmin/inc/class.cyrusimap.inc.php | 180 + emailadmin/inc/class.dbmaildbmailuser.inc.php | 180 + emailadmin/inc/class.dbmailqmailuser.inc.php | 158 + emailadmin/inc/class.defaultimap.inc.php | 559 +++ emailadmin/inc/class.defaultpop.inc.php | 94 + emailadmin/inc/class.defaultsmtp.inc.php | 85 + emailadmin/inc/class.ea_identity.inc.php | 27 + emailadmin/inc/class.ea_preferences.inc.php | 153 + emailadmin/inc/class.emailadmin_bo.inc.php | 855 +++++ emailadmin/inc/class.emailadmin_hooks.inc.php | 121 + .../inc/class.emailadmin_smtp_ldap.inc.php | 417 ++ emailadmin/inc/class.emailadmin_so.inc.php | 461 +++ emailadmin/inc/class.emailadmin_ui.inc.php | 962 +++++ emailadmin/inc/class.imap_client.inc.php | 789 ++++ emailadmin/inc/class.pleskimap.inc.php | 458 +++ .../inc/class.postfixdbmailuser.inc.php | 87 + .../inc/class.postfixinetorgperson.inc.php | 16 + emailadmin/inc/class.postfixldap.inc.php | 85 + emailadmin/inc/class.smtpplesk.inc.php | 93 + emailadmin/inc/class.uiuserdata.inc.php | 207 + emailadmin/index.php | 13 + emailadmin/js/jscode/editProfile.js | 42 + emailadmin/js/jscode/editUserdata.js | 59 + emailadmin/js/jscode/listProfile.js | 56 + emailadmin/lang/egw_ca.lang | 68 + emailadmin/lang/egw_cs.lang | 143 + emailadmin/lang/egw_da.lang | 69 + emailadmin/lang/egw_de.lang | 149 + emailadmin/lang/egw_en.lang | 149 + emailadmin/lang/egw_es-es.lang | 143 + emailadmin/lang/egw_et.lang | 45 + emailadmin/lang/egw_fa.lang | 66 + emailadmin/lang/egw_fi.lang | 149 + emailadmin/lang/egw_fr.lang | 122 + emailadmin/lang/egw_hr.lang | 68 + emailadmin/lang/egw_hu.lang | 143 + emailadmin/lang/egw_it.lang | 97 + emailadmin/lang/egw_iw.lang | 68 + emailadmin/lang/egw_lt.lang | 1 + emailadmin/lang/egw_lv.lang | 61 + emailadmin/lang/egw_nl.lang | 138 + emailadmin/lang/egw_no.lang | 68 + emailadmin/lang/egw_pl.lang | 108 + emailadmin/lang/egw_pt-br.lang | 138 + emailadmin/lang/egw_pt.lang | 85 + emailadmin/lang/egw_ru.lang | 134 + emailadmin/lang/egw_sk.lang | 139 + emailadmin/lang/egw_sl.lang | 138 + emailadmin/lang/egw_sv.lang | 68 + emailadmin/lang/egw_zh-tw.lang | 121 + emailadmin/lang/egw_zh.lang | 123 + emailadmin/setup/etemplates.inc.php | 32 + emailadmin/setup/setup.inc.php | 69 + emailadmin/setup/tables_current.inc.php | 63 + emailadmin/setup/tables_update.inc.php | 303 ++ emailadmin/templates/default/config.tpl | 42 + emailadmin/templates/default/defaultpage.tpl | 64 + emailadmin/templates/default/domainnames.tpl | 136 + emailadmin/templates/default/edituserdata.tpl | 111 + .../templates/default/images/navbar.png | Bin 0 -> 2051 bytes emailadmin/templates/default/ldapsettings.tpl | 87 + emailadmin/templates/default/listservers.tpl | 25 + emailadmin/templates/default/nextMatch.tpl | 25 + emailadmin/templates/default/options.tpl | 138 + emailadmin/templates/default/smtprouting.tpl | 112 + .../templates/jerryr/images/navbar-over.png | Bin 0 -> 2051 bytes emailadmin/templates/jerryr/images/navbar.png | Bin 0 -> 1110 bytes felamimail/COPYING | 280 ++ felamimail/Changelog | 229 ++ felamimail/README | 20 + felamimail/TODO | 1 + felamimail/inc/class.Script.inc.php | 510 +++ felamimail/inc/class.ajax_contacts.inc.php | 101 + felamimail/inc/class.ajaxfelamimail.inc.php | 1207 ++++++ felamimail/inc/class.bocompose.inc.php | 1146 ++++++ felamimail/inc/class.bofelamimail.inc.php | 3005 +++++++++++++++ felamimail/inc/class.bofilter.inc.php | 171 + felamimail/inc/class.bopreferences.inc.php | 385 ++ felamimail/inc/class.bosieve.inc.php | 197 + .../inc/class.felamimail_bosignatures.inc.php | 148 + .../inc/class.felamimail_bostationery.inc.php | 125 + felamimail/inc/class.felamimail_hooks.inc.php | 749 ++++ .../inc/class.felamimail_signatures.inc.php | 169 + felamimail/inc/class.sofelamimail.inc.php | 38 + felamimail/inc/class.sofilter.inc.php | 58 + felamimail/inc/class.sopreferences.inc.php | 142 + felamimail/inc/class.uicompose.inc.php | 743 ++++ felamimail/inc/class.uidisplay.inc.php | 1641 ++++++++ felamimail/inc/class.uifelamimail.inc.php | 990 +++++ felamimail/inc/class.uifilter.inc.php | 229 ++ felamimail/inc/class.uipreferences.inc.php | 785 ++++ felamimail/inc/class.uisieve.inc.php | 1133 ++++++ felamimail/inc/class.uiwidgets.inc.php | 1039 +++++ felamimail/inc/hook_home.inc.php | 131 + felamimail/inc/hook_notifywindow.inc.php | 13 + felamimail/inc/hook_sidebox_menu.inc.php | 12 + felamimail/index.php | 16 + felamimail/js/jscode/composeMessage.js | 806 ++++ felamimail/js/jscode/compose_message.js | 10 + felamimail/js/jscode/editAccountData.js | 130 + felamimail/js/jscode/editProfile.js | 13 + felamimail/js/jscode/editSieveRule.js | 8 + felamimail/js/jscode/listFolder.js | 44 + felamimail/js/jscode/listSieveRules.js | 31 + felamimail/js/jscode/listSignatures.js | 74 + felamimail/js/jscode/viewMainScreen.js | 754 ++++ felamimail/js/jscode/view_message.js | 109 + felamimail/lang/egw_bg.lang | 462 +++ felamimail/lang/egw_ca.lang | 345 ++ felamimail/lang/egw_cs.lang | 494 +++ felamimail/lang/egw_da.lang | 367 ++ felamimail/lang/egw_de.lang | 512 +++ felamimail/lang/egw_el.lang | 411 ++ felamimail/lang/egw_en.lang | 514 +++ felamimail/lang/egw_es-es.lang | 498 +++ felamimail/lang/egw_et.lang | 187 + felamimail/lang/egw_eu.lang | 352 ++ felamimail/lang/egw_fa.lang | 351 ++ felamimail/lang/egw_fi.lang | 512 +++ felamimail/lang/egw_fr.lang | 425 ++ felamimail/lang/egw_hr.lang | 811 ++++ felamimail/lang/egw_hu.lang | 494 +++ felamimail/lang/egw_it.lang | 343 ++ felamimail/lang/egw_iw.lang | 369 ++ felamimail/lang/egw_ja.lang | 71 + felamimail/lang/egw_lt.lang | 1 + felamimail/lang/egw_lv.lang | 302 ++ felamimail/lang/egw_nl.lang | 471 +++ felamimail/lang/egw_no.lang | 344 ++ felamimail/lang/egw_pl.lang | 410 ++ felamimail/lang/egw_pt-br.lang | 471 +++ felamimail/lang/egw_pt.lang | 352 ++ felamimail/lang/egw_ru.lang | 466 +++ felamimail/lang/egw_sk.lang | 494 +++ felamimail/lang/egw_sl.lang | 471 +++ felamimail/lang/egw_sv.lang | 417 ++ felamimail/lang/egw_zh-tw.lang | 421 ++ felamimail/lang/egw_zh.lang | 434 +++ felamimail/setup/etemplates.inc.php | 65 + felamimail/setup/phpmailer.lang-br.php | 21 + felamimail/setup/phpmailer.lang-de.php | 23 + felamimail/setup/phpmailer.lang-en.php | 23 + felamimail/setup/phpmailer.lang-it.php | 28 + felamimail/setup/setup.inc.php | 75 + felamimail/setup/tables_current.inc.php | 73 + felamimail/setup/tables_update.inc.php | 544 +++ felamimail/smartsieve-NOTICE | 19 + felamimail/templates/default/app.css | 507 +++ felamimail/templates/default/composeForm.tpl | 266 ++ felamimail/templates/default/config.tpl | 136 + .../templates/default/edit_account_data.tpl | 270 ++ .../default/edit_forwarding_address.tpl | 38 + felamimail/templates/default/filterForm.tpl | 116 + felamimail/templates/default/images/Read.png | Bin 0 -> 961 bytes .../templates/default/images/Replied.png | Bin 0 -> 1427 bytes .../templates/default/images/Unread.png | Bin 0 -> 1277 bytes .../templates/default/images/attach.png | Bin 0 -> 528 bytes .../templates/default/images/clear_left.png | Bin 0 -> 388 bytes .../templates/default/images/dialog_close.gif | Bin 0 -> 64 bytes .../templates/default/images/down_pointer.png | Bin 0 -> 316 bytes .../templates/default/images/error_bg.jpg | Bin 0 -> 2908 bytes .../templates/default/images/error_header.gif | Bin 0 -> 151 bytes .../templates/default/images/fileexport.png | Bin 0 -> 626 bytes .../templates/default/images/fileprint.png | Bin 0 -> 684 bytes .../templates/default/images/kmmsgdel.png | Bin 0 -> 545 bytes .../default/images/kmmsgforwarded.png | Bin 0 -> 241 bytes .../templates/default/images/kmmsgnew.png | Bin 0 -> 481 bytes .../templates/default/images/kmmsgread.png | Bin 0 -> 517 bytes .../templates/default/images/kmmsgreplied.png | Bin 0 -> 291 bytes .../templates/default/images/kmmsgunseen.png | Bin 0 -> 396 bytes .../templates/default/images/mail_find.png | Bin 0 -> 932 bytes .../templates/default/images/mail_forward.png | Bin 0 -> 890 bytes .../templates/default/images/mail_reply.png | Bin 0 -> 889 bytes .../default/images/mail_replyall.png | Bin 0 -> 928 bytes .../templates/default/images/mail_send.png | Bin 0 -> 893 bytes .../default/images/manage_filter.png | Bin 0 -> 899 bytes .../templates/default/images/msg_icon_sm.gif | Bin 0 -> 550 bytes .../templates/default/images/navbar.png | Bin 0 -> 2460 bytes .../templates/default/images/prio_high.png | Bin 0 -> 168 bytes .../templates/default/images/prio_low.png | Bin 0 -> 166 bytes .../templates/default/images/prompt_bg.jpg | Bin 0 -> 2864 bytes .../default/images/prompt_header.gif | Bin 0 -> 150 bytes .../default/images/read_answered_small.png | Bin 0 -> 1052 bytes .../default/images/read_flagged_small.png | Bin 0 -> 575 bytes .../templates/default/images/read_small.png | Bin 0 -> 621 bytes .../templates/default/images/recent_small.gif | Bin 0 -> 181 bytes .../templates/default/images/save_all.png | Bin 0 -> 917 bytes .../templates/default/images/sm_delete.gif | Bin 0 -> 1043 bytes .../templates/default/images/sm_delete.png | Bin 0 -> 1042 bytes .../templates/default/images/sm_envelope.gif | Bin 0 -> 1013 bytes .../templates/default/images/sm_envelope.png | Bin 0 -> 916 bytes .../templates/default/images/sm_forward.gif | Bin 0 -> 1042 bytes .../templates/default/images/sm_forward.png | Bin 0 -> 1052 bytes .../templates/default/images/sm_reply.gif | Bin 0 -> 1042 bytes .../templates/default/images/sm_reply.png | Bin 0 -> 1061 bytes .../templates/default/images/sm_reply_all.gif | Bin 0 -> 1062 bytes .../templates/default/images/sm_reply_all.png | Bin 0 -> 1102 bytes .../default/images/sm_unimportant.png | Bin 0 -> 201 bytes .../templates/default/images/sm_unread.png | Bin 0 -> 198 bytes .../templates/default/images/sort_none.png | Bin 0 -> 210 bytes .../templates/default/images/success_bg.jpg | Bin 0 -> 2772 bytes .../default/images/success_header.gif | Bin 0 -> 150 bytes .../templates/default/images/to_infolog.png | Bin 0 -> 2735 bytes felamimail/templates/default/images/trash.gif | Bin 0 -> 938 bytes felamimail/templates/default/images/trash.png | Bin 0 -> 1042 bytes .../default/images/unread_deleted_small.gif | Bin 0 -> 890 bytes .../default/images/unread_deleted_small.png | Bin 0 -> 364 bytes .../default/images/unread_flagged_small.png | Bin 0 -> 585 bytes .../templates/default/images/unread_small.png | Bin 0 -> 455 bytes .../templates/default/images/up_pointer.png | Bin 0 -> 315 bytes .../templates/default/images/warning_bg.jpg | Bin 0 -> 2685 bytes .../default/images/warning_header.gif | Bin 0 -> 151 bytes .../templates/default/images/write_mail.png | Bin 0 -> 710 bytes .../templates/default/importMessage.tpl | 65 + felamimail/templates/default/listRules.tpl | 64 + felamimail/templates/default/mainscreen.tpl | 401 ++ .../default/preferences_edit_signature.tpl | 24 + .../default/preferences_list_accounts.tpl | 13 + .../default/preferences_list_signatures.tpl | 14 + .../default/preferences_manage_folder.tpl | 459 +++ .../templates/default/selectprofile.tpl | 47 + .../templates/default/sieveEditForm.tpl | 136 + felamimail/templates/default/sieveForm.tpl | 363 ++ .../templates/default/sieveScriptList.tpl | 56 + felamimail/templates/default/uiwidgets.tpl | 176 + felamimail/templates/default/vacationForm.tpl | 107 + .../templates/default/view_attachments.tpl | 34 + felamimail/templates/default/view_message.tpl | 183 + .../default/view_message_printable.tpl | 154 + felamimail/templates/jerryr/app.css | 550 +++ .../templates/jerryr/images/mail_find.png | Bin 0 -> 932 bytes .../templates/jerryr/images/navbar-over.png | Bin 0 -> 2460 bytes felamimail/templates/jerryr/images/navbar.png | Bin 0 -> 1144 bytes .../templates/jerryr/images/write_mail.png | Bin 0 -> 710 bytes felamimail/templates/jerryr/mainscreen.tpl | 339 ++ felamimail/testimapserver.php | 168 + 267 files changed, 62694 insertions(+) create mode 100644 egw-pear/HTTP/WebDAV/Server.php create mode 100644 egw-pear/HTTP/WebDAV/Server/Filesystem.php create mode 100644 egw-pear/HTTP/WebDAV/Tools/_parse_lockinfo.php create mode 100644 egw-pear/HTTP/WebDAV/Tools/_parse_propfind.php create mode 100644 egw-pear/HTTP/WebDAV/Tools/_parse_proppatch.php create mode 100644 egw-pear/Log.php create mode 100644 egw-pear/Log/composite.php create mode 100644 egw-pear/Log/console.php create mode 100644 egw-pear/Log/daemon.php create mode 100644 egw-pear/Log/display.php create mode 100644 egw-pear/Log/error_log.php create mode 100644 egw-pear/Log/file.php create mode 100644 egw-pear/Log/mail.php create mode 100644 egw-pear/Log/mcal.php create mode 100644 egw-pear/Log/mdb2.php create mode 100644 egw-pear/Log/null.php create mode 100644 egw-pear/Log/observer.php create mode 100644 egw-pear/Log/sql.php create mode 100644 egw-pear/Log/sqlite.php create mode 100644 egw-pear/Log/syslog.php create mode 100644 egw-pear/Log/win.php create mode 100644 egw-pear/Net/IMAP.php create mode 100644 egw-pear/Net/IMAPProtocol.php create mode 100644 egw-pear/Net/Sieve.php create mode 100644 egw-pear/Net/Socket.php create mode 100644 egw-pear/setup/setup.inc.php create mode 100644 emailadmin/Changelog create mode 100644 emailadmin/doc/dbmail.schema create mode 100644 emailadmin/doc/main.cf create mode 100644 emailadmin/doc/qmailuser.schema create mode 100644 emailadmin/inc/class.ajaxemailadmin.inc.php create mode 100644 emailadmin/inc/class.cyrusimap.inc.php create mode 100755 emailadmin/inc/class.dbmaildbmailuser.inc.php create mode 100644 emailadmin/inc/class.dbmailqmailuser.inc.php create mode 100644 emailadmin/inc/class.defaultimap.inc.php create mode 100644 emailadmin/inc/class.defaultpop.inc.php create mode 100644 emailadmin/inc/class.defaultsmtp.inc.php create mode 100644 emailadmin/inc/class.ea_identity.inc.php create mode 100644 emailadmin/inc/class.ea_preferences.inc.php create mode 100644 emailadmin/inc/class.emailadmin_bo.inc.php create mode 100644 emailadmin/inc/class.emailadmin_hooks.inc.php create mode 100644 emailadmin/inc/class.emailadmin_smtp_ldap.inc.php create mode 100644 emailadmin/inc/class.emailadmin_so.inc.php create mode 100644 emailadmin/inc/class.emailadmin_ui.inc.php create mode 100644 emailadmin/inc/class.imap_client.inc.php create mode 100644 emailadmin/inc/class.pleskimap.inc.php create mode 100755 emailadmin/inc/class.postfixdbmailuser.inc.php create mode 100644 emailadmin/inc/class.postfixinetorgperson.inc.php create mode 100644 emailadmin/inc/class.postfixldap.inc.php create mode 100644 emailadmin/inc/class.smtpplesk.inc.php create mode 100644 emailadmin/inc/class.uiuserdata.inc.php create mode 100644 emailadmin/index.php create mode 100644 emailadmin/js/jscode/editProfile.js create mode 100644 emailadmin/js/jscode/editUserdata.js create mode 100644 emailadmin/js/jscode/listProfile.js create mode 100644 emailadmin/lang/egw_ca.lang create mode 100644 emailadmin/lang/egw_cs.lang create mode 100644 emailadmin/lang/egw_da.lang create mode 100644 emailadmin/lang/egw_de.lang create mode 100755 emailadmin/lang/egw_en.lang create mode 100644 emailadmin/lang/egw_es-es.lang create mode 100755 emailadmin/lang/egw_et.lang create mode 100644 emailadmin/lang/egw_fa.lang create mode 100644 emailadmin/lang/egw_fi.lang create mode 100644 emailadmin/lang/egw_fr.lang create mode 100755 emailadmin/lang/egw_hr.lang create mode 100644 emailadmin/lang/egw_hu.lang create mode 100644 emailadmin/lang/egw_it.lang create mode 100755 emailadmin/lang/egw_iw.lang create mode 100644 emailadmin/lang/egw_lt.lang create mode 100644 emailadmin/lang/egw_lv.lang create mode 100644 emailadmin/lang/egw_nl.lang create mode 100644 emailadmin/lang/egw_no.lang create mode 100644 emailadmin/lang/egw_pl.lang create mode 100644 emailadmin/lang/egw_pt-br.lang create mode 100644 emailadmin/lang/egw_pt.lang create mode 100644 emailadmin/lang/egw_ru.lang create mode 100644 emailadmin/lang/egw_sk.lang create mode 100644 emailadmin/lang/egw_sl.lang create mode 100644 emailadmin/lang/egw_sv.lang create mode 100644 emailadmin/lang/egw_zh-tw.lang create mode 100644 emailadmin/lang/egw_zh.lang create mode 100644 emailadmin/setup/etemplates.inc.php create mode 100644 emailadmin/setup/setup.inc.php create mode 100644 emailadmin/setup/tables_current.inc.php create mode 100644 emailadmin/setup/tables_update.inc.php create mode 100644 emailadmin/templates/default/config.tpl create mode 100644 emailadmin/templates/default/defaultpage.tpl create mode 100644 emailadmin/templates/default/domainnames.tpl create mode 100644 emailadmin/templates/default/edituserdata.tpl create mode 100644 emailadmin/templates/default/images/navbar.png create mode 100644 emailadmin/templates/default/ldapsettings.tpl create mode 100755 emailadmin/templates/default/listservers.tpl create mode 100644 emailadmin/templates/default/nextMatch.tpl create mode 100644 emailadmin/templates/default/options.tpl create mode 100644 emailadmin/templates/default/smtprouting.tpl create mode 100644 emailadmin/templates/jerryr/images/navbar-over.png create mode 100644 emailadmin/templates/jerryr/images/navbar.png create mode 100644 felamimail/COPYING create mode 100644 felamimail/Changelog create mode 100644 felamimail/README create mode 100644 felamimail/TODO create mode 100644 felamimail/inc/class.Script.inc.php create mode 100644 felamimail/inc/class.ajax_contacts.inc.php create mode 100644 felamimail/inc/class.ajaxfelamimail.inc.php create mode 100644 felamimail/inc/class.bocompose.inc.php create mode 100644 felamimail/inc/class.bofelamimail.inc.php create mode 100644 felamimail/inc/class.bofilter.inc.php create mode 100644 felamimail/inc/class.bopreferences.inc.php create mode 100644 felamimail/inc/class.bosieve.inc.php create mode 100644 felamimail/inc/class.felamimail_bosignatures.inc.php create mode 100644 felamimail/inc/class.felamimail_bostationery.inc.php create mode 100644 felamimail/inc/class.felamimail_hooks.inc.php create mode 100644 felamimail/inc/class.felamimail_signatures.inc.php create mode 100644 felamimail/inc/class.sofelamimail.inc.php create mode 100644 felamimail/inc/class.sofilter.inc.php create mode 100644 felamimail/inc/class.sopreferences.inc.php create mode 100644 felamimail/inc/class.uicompose.inc.php create mode 100644 felamimail/inc/class.uidisplay.inc.php create mode 100644 felamimail/inc/class.uifelamimail.inc.php create mode 100644 felamimail/inc/class.uifilter.inc.php create mode 100644 felamimail/inc/class.uipreferences.inc.php create mode 100644 felamimail/inc/class.uisieve.inc.php create mode 100644 felamimail/inc/class.uiwidgets.inc.php create mode 100644 felamimail/inc/hook_home.inc.php create mode 100644 felamimail/inc/hook_notifywindow.inc.php create mode 100644 felamimail/inc/hook_sidebox_menu.inc.php create mode 100644 felamimail/index.php create mode 100644 felamimail/js/jscode/composeMessage.js create mode 100644 felamimail/js/jscode/compose_message.js create mode 100644 felamimail/js/jscode/editAccountData.js create mode 100644 felamimail/js/jscode/editProfile.js create mode 100644 felamimail/js/jscode/editSieveRule.js create mode 100644 felamimail/js/jscode/listFolder.js create mode 100644 felamimail/js/jscode/listSieveRules.js create mode 100644 felamimail/js/jscode/listSignatures.js create mode 100644 felamimail/js/jscode/viewMainScreen.js create mode 100644 felamimail/js/jscode/view_message.js create mode 100644 felamimail/lang/egw_bg.lang create mode 100644 felamimail/lang/egw_ca.lang create mode 100644 felamimail/lang/egw_cs.lang create mode 100644 felamimail/lang/egw_da.lang create mode 100644 felamimail/lang/egw_de.lang create mode 100644 felamimail/lang/egw_el.lang create mode 100644 felamimail/lang/egw_en.lang create mode 100644 felamimail/lang/egw_es-es.lang create mode 100755 felamimail/lang/egw_et.lang create mode 100644 felamimail/lang/egw_eu.lang create mode 100644 felamimail/lang/egw_fa.lang create mode 100644 felamimail/lang/egw_fi.lang create mode 100644 felamimail/lang/egw_fr.lang create mode 100644 felamimail/lang/egw_hr.lang create mode 100644 felamimail/lang/egw_hu.lang create mode 100644 felamimail/lang/egw_it.lang create mode 100755 felamimail/lang/egw_iw.lang create mode 100644 felamimail/lang/egw_ja.lang create mode 100644 felamimail/lang/egw_lt.lang create mode 100644 felamimail/lang/egw_lv.lang create mode 100644 felamimail/lang/egw_nl.lang create mode 100644 felamimail/lang/egw_no.lang create mode 100755 felamimail/lang/egw_pl.lang create mode 100644 felamimail/lang/egw_pt-br.lang create mode 100644 felamimail/lang/egw_pt.lang create mode 100644 felamimail/lang/egw_ru.lang create mode 100644 felamimail/lang/egw_sk.lang create mode 100644 felamimail/lang/egw_sl.lang create mode 100644 felamimail/lang/egw_sv.lang create mode 100644 felamimail/lang/egw_zh-tw.lang create mode 100644 felamimail/lang/egw_zh.lang create mode 100644 felamimail/setup/etemplates.inc.php create mode 100644 felamimail/setup/phpmailer.lang-br.php create mode 100644 felamimail/setup/phpmailer.lang-de.php create mode 100644 felamimail/setup/phpmailer.lang-en.php create mode 100644 felamimail/setup/phpmailer.lang-it.php create mode 100644 felamimail/setup/setup.inc.php create mode 100644 felamimail/setup/tables_current.inc.php create mode 100644 felamimail/setup/tables_update.inc.php create mode 100644 felamimail/smartsieve-NOTICE create mode 100644 felamimail/templates/default/app.css create mode 100644 felamimail/templates/default/composeForm.tpl create mode 100644 felamimail/templates/default/config.tpl create mode 100644 felamimail/templates/default/edit_account_data.tpl create mode 100644 felamimail/templates/default/edit_forwarding_address.tpl create mode 100644 felamimail/templates/default/filterForm.tpl create mode 100644 felamimail/templates/default/images/Read.png create mode 100644 felamimail/templates/default/images/Replied.png create mode 100644 felamimail/templates/default/images/Unread.png create mode 100755 felamimail/templates/default/images/attach.png create mode 100644 felamimail/templates/default/images/clear_left.png create mode 100644 felamimail/templates/default/images/dialog_close.gif create mode 100644 felamimail/templates/default/images/down_pointer.png create mode 100644 felamimail/templates/default/images/error_bg.jpg create mode 100644 felamimail/templates/default/images/error_header.gif create mode 100644 felamimail/templates/default/images/fileexport.png create mode 100644 felamimail/templates/default/images/fileprint.png create mode 100644 felamimail/templates/default/images/kmmsgdel.png create mode 100644 felamimail/templates/default/images/kmmsgforwarded.png create mode 100644 felamimail/templates/default/images/kmmsgnew.png create mode 100644 felamimail/templates/default/images/kmmsgread.png create mode 100644 felamimail/templates/default/images/kmmsgreplied.png create mode 100644 felamimail/templates/default/images/kmmsgunseen.png create mode 100644 felamimail/templates/default/images/mail_find.png create mode 100644 felamimail/templates/default/images/mail_forward.png create mode 100644 felamimail/templates/default/images/mail_reply.png create mode 100644 felamimail/templates/default/images/mail_replyall.png create mode 100644 felamimail/templates/default/images/mail_send.png create mode 100644 felamimail/templates/default/images/manage_filter.png create mode 100644 felamimail/templates/default/images/msg_icon_sm.gif create mode 100644 felamimail/templates/default/images/navbar.png create mode 100644 felamimail/templates/default/images/prio_high.png create mode 100644 felamimail/templates/default/images/prio_low.png create mode 100644 felamimail/templates/default/images/prompt_bg.jpg create mode 100644 felamimail/templates/default/images/prompt_header.gif create mode 100644 felamimail/templates/default/images/read_answered_small.png create mode 100644 felamimail/templates/default/images/read_flagged_small.png create mode 100644 felamimail/templates/default/images/read_small.png create mode 100644 felamimail/templates/default/images/recent_small.gif create mode 100644 felamimail/templates/default/images/save_all.png create mode 100644 felamimail/templates/default/images/sm_delete.gif create mode 100644 felamimail/templates/default/images/sm_delete.png create mode 100644 felamimail/templates/default/images/sm_envelope.gif create mode 100644 felamimail/templates/default/images/sm_envelope.png create mode 100644 felamimail/templates/default/images/sm_forward.gif create mode 100644 felamimail/templates/default/images/sm_forward.png create mode 100644 felamimail/templates/default/images/sm_reply.gif create mode 100644 felamimail/templates/default/images/sm_reply.png create mode 100644 felamimail/templates/default/images/sm_reply_all.gif create mode 100644 felamimail/templates/default/images/sm_reply_all.png create mode 100644 felamimail/templates/default/images/sm_unimportant.png create mode 100644 felamimail/templates/default/images/sm_unread.png create mode 100644 felamimail/templates/default/images/sort_none.png create mode 100644 felamimail/templates/default/images/success_bg.jpg create mode 100644 felamimail/templates/default/images/success_header.gif create mode 100644 felamimail/templates/default/images/to_infolog.png create mode 100644 felamimail/templates/default/images/trash.gif create mode 100644 felamimail/templates/default/images/trash.png create mode 100644 felamimail/templates/default/images/unread_deleted_small.gif create mode 100644 felamimail/templates/default/images/unread_deleted_small.png create mode 100644 felamimail/templates/default/images/unread_flagged_small.png create mode 100644 felamimail/templates/default/images/unread_small.png create mode 100644 felamimail/templates/default/images/up_pointer.png create mode 100644 felamimail/templates/default/images/warning_bg.jpg create mode 100644 felamimail/templates/default/images/warning_header.gif create mode 100644 felamimail/templates/default/images/write_mail.png create mode 100644 felamimail/templates/default/importMessage.tpl create mode 100644 felamimail/templates/default/listRules.tpl create mode 100644 felamimail/templates/default/mainscreen.tpl create mode 100644 felamimail/templates/default/preferences_edit_signature.tpl create mode 100755 felamimail/templates/default/preferences_list_accounts.tpl create mode 100644 felamimail/templates/default/preferences_list_signatures.tpl create mode 100644 felamimail/templates/default/preferences_manage_folder.tpl create mode 100755 felamimail/templates/default/selectprofile.tpl create mode 100644 felamimail/templates/default/sieveEditForm.tpl create mode 100644 felamimail/templates/default/sieveForm.tpl create mode 100644 felamimail/templates/default/sieveScriptList.tpl create mode 100644 felamimail/templates/default/uiwidgets.tpl create mode 100644 felamimail/templates/default/vacationForm.tpl create mode 100644 felamimail/templates/default/view_attachments.tpl create mode 100644 felamimail/templates/default/view_message.tpl create mode 100644 felamimail/templates/default/view_message_printable.tpl create mode 100644 felamimail/templates/jerryr/app.css create mode 100644 felamimail/templates/jerryr/images/mail_find.png create mode 100644 felamimail/templates/jerryr/images/navbar-over.png create mode 100644 felamimail/templates/jerryr/images/navbar.png create mode 100644 felamimail/templates/jerryr/images/write_mail.png create mode 100644 felamimail/templates/jerryr/mainscreen.tpl create mode 100644 felamimail/testimapserver.php diff --git a/egw-pear/HTTP/WebDAV/Server.php b/egw-pear/HTTP/WebDAV/Server.php new file mode 100644 index 0000000000..113db167fb --- /dev/null +++ b/egw-pear/HTTP/WebDAV/Server.php @@ -0,0 +1,2519 @@ + | +// | Christian Stocker | +// +----------------------------------------------------------------------+ +// +// $Id: Server.php,v 1.56 2006/10/10 11:53:16 hholzgra Exp $ +// +require_once "HTTP/WebDAV/Tools/_parse_propfind.php"; +require_once "HTTP/WebDAV/Tools/_parse_proppatch.php"; +require_once "HTTP/WebDAV/Tools/_parse_lockinfo.php"; + +/** + * Virtual base class for implementing WebDAV servers + * + * WebDAV server base class, needs to be extended to do useful work + * + * @package HTTP_WebDAV_Server + * @author Hartmut Holzgraefe + * @version @package_version@ + */ +class HTTP_WebDAV_Server +{ + // {{{ Member Variables + + /** + * complete URI for this request + * + * @var string + */ + var $uri; + + /** + * base URI for this request + * + * @var string + */ + var $base_uri; + + /** + * Set if client requires to be a url (true) or a path (false). + * RFC 4918 allows both: http://www.webdav.org/specs/rfc4918.html#ELEMENT_href + * But some clients can NOT deal with one or the other! + * + * @var boolean + */ + var $client_require_href_as_url; + + /** + * Set if client requires does not allow namespace redundacy. + * The XML Namespace specification does allow both + * But some clients can NOT deal with one or the other! + * + * @var boolean (client_refuses_redundand_namespace_declarations) + * @var boolean (client_needs_redundand_namespace_declarations) + */ + var $crrnd = false; + var $cnrnd = false; + + /** + + + /** + * URI path for this request + * + * @var string + */ + var $path; + + /** + * Realm string to be used in authentification popups + * + * @var string + */ + var $http_auth_realm = "PHP WebDAV"; + + /** + * String to be used in "X-Dav-Powered-By" header + * + * @var string + */ + var $dav_powered_by = ""; + + /** + * Remember parsed If: (RFC2518/9.4) header conditions + * + * @var array + */ + var $_if_header_uris = array(); + + /** + * HTTP response status/message + * + * @var string + */ + var $_http_status = "200 OK"; + + /** + * encoding of property values passed in + * + * @var string + */ + var $_prop_encoding = "utf-8"; + + /** + * Copy of $_SERVER superglobal array + * + * Derived classes may extend the constructor to + * modify its contents + * + * @var array + */ + var $_SERVER; + + // }}} + + // {{{ Constructor + + /** + * Constructor + * + * @param void + */ + function HTTP_WebDAV_Server() + { + // PHP messages destroy XML output -> switch them off + ini_set("display_errors", 0); + + // copy $_SERVER variables to local _SERVER array + // so that derived classes can simply modify these + $this->_SERVER = $_SERVER; + } + + // }}} + + // {{{ ServeRequest() + /** + * Serve WebDAV HTTP request + * + * dispatch WebDAV HTTP request to the apropriate method handler + * + * @param void + * @return void + */ + function ServeRequest() + { + // prevent warning in litmus check 'delete_fragment' + if (strstr($this->_SERVER["REQUEST_URI"], '#')) { + $this->http_status("400 Bad Request"); + return; + } + + // default is currently to use just the path, extending class can set $this->client_require_href_as_url depending on user-agent + if ($this->client_require_href_as_url) + { + // default uri is the complete request uri + $uri = (@$this->_SERVER["HTTPS"] === "on" ? "https:" : "http:") . '//'.$this->_SERVER['HTTP_HOST']; + } + // we cant use SCRIPT_NAME, because it fails, if there's any url rewriting + //error_log("pathinfo:\n". $this->_urldecode($this->_SERVER['REQUEST_URI']).":\n".$this->_SERVER['PATH_INFO']); + $uri .= substr($this->_urldecode($this->_SERVER['REQUEST_URI']),0,-strlen($this->_SERVER["PATH_INFO"])); + + $path_info = empty($this->_SERVER["PATH_INFO"]) ? "/" : $this->_SERVER["PATH_INFO"]; + + $this->base_uri = $uri; + $this->uri = $uri . $path_info; + // set path + // $_SERVER['PATH_INFO'] is already urldecoded + //$this->path = $this->_urldecode($path_info); + // quote '#' (e.g. OpenOffice uses this for lock-files) + $this->path = strtr($path_info,array( + '%' => '%25', + '#' => '%23', + '?' => '%3F', + )); + if (!strlen($this->path)) { + if ($this->_SERVER["REQUEST_METHOD"] == "GET") { + // redirect clients that try to GET a collection + // WebDAV clients should never try this while + // regular HTTP clients might ... + header("Location: ".$this->base_uri."/"); + return; + } else { + // if a WebDAV client didn't give a path we just assume '/' + $this->path = "/"; + } + } + + if (ini_get("magic_quotes_gpc")) { + $this->path = stripslashes($this->path); + } + + + // identify ourselves + if (empty($this->dav_powered_by)) { + header("X-Dav-Powered-By: PHP class: ".get_class($this)); + } else { + header("X-Dav-Powered-By: ".$this->dav_powered_by); + } + + // check authentication + // for the motivation for not checking OPTIONS requests on / see + // http://pear.php.net/bugs/bug.php?id=5363 + if ( ( !(($this->_SERVER['REQUEST_METHOD'] == 'OPTIONS') && ($this->path == "/"))) + && (!$this->_check_auth())) { + // RFC2518 says we must use Digest instead of Basic + // but Microsoft Clients do not support Digest + // and we don't support NTLM and Kerberos + // so we are stuck with Basic here + header('WWW-Authenticate: Basic realm="'.($this->http_auth_realm).'"'); + + // Windows seems to require this being the last header sent + // (changed according to PECL bug #3138) + $this->http_status('401 Unauthorized'); + + return; + } + + // check + if (! $this->_check_if_header_conditions()) { + return; + } + + // detect requested method names + $method = strtolower($this->_SERVER["REQUEST_METHOD"]); + $wrapper = "http_".$method; + + // activate HEAD emulation by GET if no HEAD method found + if ($method == "head" && !method_exists($this, "head")) { + $method = "get"; + } + + if (method_exists($this, $wrapper) && ($method == "options" || method_exists($this, $method))) { + $this->$wrapper(); // call method by name + } else { // method not found/implemented + if ($this->_SERVER["REQUEST_METHOD"] == "LOCK") { + $error = '412 Precondition failed'; + ; + } else { + $error = '405 Method not allowed'; + header("Allow: ".join(", ", $this->_allow())); // tell client what's allowed + } + $this->http_status($error); + echo "Error $error\n"; + echo "

$error

\n"; + echo "The requested could not by handled by this server.\n"; + echo '(URI ' . $this->_SERVER['REQUEST_URI'] . ")
\n
\n"; + echo "\n"; + } + } + + // }}} + + // {{{ abstract WebDAV methods + + // {{{ GET() + /** + * GET implementation + * + * overload this method to retrieve resources from your server + *
+ * + * + * @abstract + * @param array &$params Array of input and output parameters + *
input
    + *
  • path - + *
+ *
output
    + *
  • size - + *
+ * @returns int HTTP-Statuscode + */ + + /* abstract + function GET(&$params) + { + // dummy entry for PHPDoc + } + */ + + // }}} + + // {{{ PUT() + /** + * PUT implementation + * + * PUT implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function PUT() + { + // dummy entry for PHPDoc + } + */ + + // }}} + + // {{{ COPY() + + /** + * COPY implementation + * + * COPY implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function COPY() + { + // dummy entry for PHPDoc + } + */ + + // }}} + + // {{{ MOVE() + + /** + * MOVE implementation + * + * MOVE implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function MOVE() + { + // dummy entry for PHPDoc + } + */ + + // }}} + + // {{{ DELETE() + + /** + * DELETE implementation + * + * DELETE implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function DELETE() + { + // dummy entry for PHPDoc + } + */ + // }}} + + // {{{ PROPFIND() + + /** + * PROPFIND implementation + * + * PROPFIND implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function PROPFIND() + { + // dummy entry for PHPDoc + } + */ + + // }}} + + // {{{ PROPPATCH() + + /** + * PROPPATCH implementation + * + * PROPPATCH implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function PROPPATCH() + { + // dummy entry for PHPDoc + } + */ + // }}} + + // {{{ LOCK() + + /** + * LOCK implementation + * + * LOCK implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function LOCK() + { + // dummy entry for PHPDoc + } + */ + // }}} + + // {{{ UNLOCK() + + /** + * UNLOCK implementation + * + * UNLOCK implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function UNLOCK() + { + // dummy entry for PHPDoc + } + */ + // }}} + + // {{{ ACL() + + /** + * ACL implementation + * + * ACL implementation + * + * @abstract + * @param array &$params + * @returns int HTTP-Statuscode + */ + + /* abstract + function ACL() + { + // dummy entry for PHPDoc + } + */ + // }}} + + // }}} + + // {{{ other abstract methods + + // {{{ check_auth() + + /** + * check authentication + * + * overload this method to retrieve and confirm authentication information + * + * @abstract + * @param string type Authentication type, e.g. "basic" or "digest" + * @param string username Transmitted username + * @param string passwort Transmitted password + * @returns bool Authentication status + */ + + /* abstract + function checkAuth($type, $username, $password) + { + // dummy entry for PHPDoc + } + */ + + // }}} + + // {{{ checklock() + + /** + * check lock status for a resource + * + * overload this method to return shared and exclusive locks + * active for this resource + * + * @abstract + * @param string resource Resource path to check + * @returns array An array of lock entries each consisting + * of 'type' ('shared'/'exclusive'), 'token' and 'timeout' + */ + + /* abstract + function checklock($resource) + { + // dummy entry for PHPDoc + } + */ + + // }}} + + // }}} + + // {{{ WebDAV HTTP method wrappers + + // {{{ http_OPTIONS() + + /** + * OPTIONS method handler + * + * The OPTIONS method handler creates a valid OPTIONS reply + * including Dav: and Allowed: heaers + * based on the implemented methods found in the actual instance + * + * @param void + * @return void + */ + function http_OPTIONS() + { + // Microsoft clients default to the Frontpage protocol + // unless we tell them to use WebDAV + header("MS-Author-Via: DAV"); + + // get allowed methods + $allow = $this->_allow(); + + // dav header + $dav = array(1); // assume we are always dav class 1 compliant + if (isset($allow['LOCK'])) { + $dav[] = 2; // dav class 2 requires that locking is supported + } + + // allow extending class to modify DAV and Allow headers + if (method_exists($this,'OPTIONS')) { + $this->OPTIONS($this->path,$dav,$allow); + } + + // tell clients what we found + $this->http_status("200 OK"); + header("DAV: " .join(", ", $dav)); + header("Allow: ".join(", ", $allow)); + + header("Content-length: 0"); + } + + // }}} + + + // {{{ http_PROPFIND() + + /** + * PROPFIND method handler + * + * @param string $handler='PROPFIND' allows to use method eg. for CalDAV REPORT + * @return void + */ + function http_PROPFIND($handler='PROPFIND') + { + $options = Array(); + $files = Array(); + + $options["path"] = $this->path; + + // search depth from header (default is "infinity) + if (isset($this->_SERVER['HTTP_DEPTH'])) { + $options["depth"] = $this->_SERVER["HTTP_DEPTH"]; + } else { + $options["depth"] = "infinity"; + } + + // analyze request payload + $propinfo = new _parse_propfind("php://input"); + if (!$propinfo->success) { + $this->http_status("400 Error"); + return; + } + $options['root'] = $propinfo->root; + $options['props'] = $propinfo->props; + if ($propinfo->filters) + $options['filters'] = $propinfo->filters; + if ($propinfo->other) + $options['other'] = $propinfo->other; + + // call user handler + if (!($retval =$this->$handler($options, $files))) { + $files = array("files" => array()); + if (method_exists($this, "checkLock")) { + // is locked? + $lock = $this->checkLock($this->path); + + if (is_array($lock) && count($lock)) { + $created = isset($lock['created']) ? $lock['created'] : time(); + $modified = isset($lock['modified']) ? $lock['modified'] : time(); + $files['files'][] = array("path" => $this->_slashify($this->path), + "props" => array($this->mkprop("displayname", $this->path), + $this->mkprop("creationdate", $created), + $this->mkprop("getlastmodified", $modified), + $this->mkprop("resourcetype", ""), + $this->mkprop("getcontenttype", ""), + $this->mkprop("getcontentlength", 0)) + ); + } + } + + if (empty($files['files'])) { + $this->http_status("404 Not Found"); + return; + } + } + + // now we generate the reply header ... + if ($retval === true) + { + $this->http_status('207 Multi-Status'); + } + elseif (is_string($retval)) + { + $this->http_status($retval); + header('Content-Type: text/html'); + echo "Error $retval\n"; + echo "

$retval

\n"; + switch (substr($retval, 0 ,3)) + { + case '501': // Not Implemented + echo "The requested feature is not (yet) supported by this server.\n"; + break; + default: + echo "The request could not be handled by this server.\n"; + } + echo '(URI ' . $this->_SERVER['REQUEST_URI'] . ")
\n
\n"; + echo "\n"; + return; + } + // dav header + $dav = array(1); // assume we are always dav class 1 compliant + $allow = false; + + // allow extending class to modify DAV + if (method_exists($this,'OPTIONS')) { + $this->OPTIONS($this->path,$dav,$allow); + } + header("DAV: " .join(", ", $dav)); + header('Content-Type: text/xml; charset="utf-8"'); + + // ... and payload + echo "\n"; + echo ($this->crrnd?'<':'\n"; + + // using an ArrayIterator to prevent foreach from copying the array, + // as we cant loop by reference, when an iterator is given in $files['files'] + if (is_array($files['files'])) + { + $files['files'] = new ArrayIterator($files['files']); + } + // now we loop over all returned file entries + foreach ($files['files'] as $file) { + + // collect namespaces here + $ns_hash = array('DAV:' => 'D'); + + // Microsoft Clients need this special namespace for date and time values + $ns_defs = 'xmlns:ns0="urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/"'; + + // nothing to do if no properties were returend for a file + if (isset($file["props"]) && is_array($file["props"])) { + + // now loop over all returned properties + foreach ($file["props"] as &$prop) { + // as a convenience feature we do not require that user handlers + // restrict returned properties to the requested ones + // here we strip all unrequested entries out of the response + + // this can happen if we have allprop and prop in one propfind: + // , eg. blah is not automatic returned by allprop + switch(is_array($options['props']) ? $options['props'][0] : $options['props']) { + case "all": + // nothing to remove + break; + + case "names": + // only the names of all existing properties were requested + // so we remove all values + unset($prop["val"]); + break; + + default: + $found = false; + + // search property name in requested properties + foreach ((array)$options["props"] as $reqprop) { + if ( $reqprop["name"] == $prop["name"] + && @$reqprop["xmlns"] == $prop["ns"]) { + $found = true; + break; + } + } + + // unset property and continue with next one if not found/requested + if (!$found) { + $prop=""; + continue(2); + } + break; + } + + // namespace handling + if (empty($prop["ns"])) continue; // no namespace + $ns = $prop["ns"]; + //if ($ns == "DAV:") continue; // default namespace + if (isset($ns_hash[$ns])) continue; // already known + + // register namespace + $ns_name = "ns".(count($ns_hash) + 1); + $ns_hash[$ns] = $ns_name; + $ns_defs .= " xmlns:$ns_name=\"$ns\""; + } + + // we also need to add empty entries for properties that were requested + // but for which no values where returned by the user handler + if (is_array($options['props'])) { + foreach ($options["props"] as $reqprop) { + if (!is_array($reqprop) || $reqprop['name']=="") continue; // skip empty entries, or 'all' if used together with + + $found = false; + + // check if property exists in result + foreach ($file["props"] as &$prop) { + if ( $reqprop["name"] == $prop["name"] + && @$reqprop["xmlns"] == $prop["ns"]) { + $found = true; + break; + } + } + + if (!$found) { + if ($reqprop["xmlns"]==="DAV:" && $reqprop["name"]==="lockdiscovery") { + // lockdiscovery is handled by the base class + $file["props"][] + = $this->mkprop("DAV:", + "lockdiscovery", + $this->lockdiscovery($file['path'])); + // only collect $file['noprops'] if we have NO Brief: t HTTP Header + } elseif (!isset($this->_SERVER['HTTP_BRIEF']) || $this->_SERVER['HTTP_BRIEF'] != 't') { + // add empty value for this property + $file["noprops"][] = + $this->mkprop($reqprop["xmlns"], $reqprop["name"], ""); + + // register property namespace if not known yet + if ($reqprop["xmlns"] != "DAV:" && !isset($ns_hash[$reqprop["xmlns"]])) { + $ns_name = "ns".(count($ns_hash) + 1); + $ns_hash[$reqprop["xmlns"]] = $ns_name; + $ns_defs .= " xmlns:$ns_name=\"$reqprop[xmlns]\""; + } + } + } + } + } + } + // ignore empty or incomplete entries + if (!is_array($file) || empty($file) || !isset($file["path"])) continue; + $path = $file['path']; + if (!is_string($path) || $path==="") continue; + + if ($this->crrnd) + { + echo " \n"; + } + else + { + echo " \n"; + } + + /* TODO right now the user implementation has to make sure + collections end in a slash, this should be done in here + by checking the resource attribute */ + // path needs to be urlencoded (only basic version of this class!) + $href = $this->_urlencode($this->_mergePathes($this->base_uri, $path)); + + if ($this->crrnd) + { + echo " $href\n"; + } + else + { + echo " $href\n"; + } + + // report all found properties and their values (if any) + if (isset($file["props"]) && is_array($file["props"])) { + echo ' <'.($this->crrnd?'':'D:')."propstat>\n"; + echo ' <'.($this->crrnd?'':'D:')."prop>\n"; + + foreach ($file["props"] as &$prop) { + + if (!is_array($prop)) continue; + if (!isset($prop["name"])) continue; + + if (!isset($prop["val"]) || $prop["val"] === "" || $prop["val"] === false) { + // empty properties (cannot use empty() for check as "0" is a legal value here) + if ($prop["ns"]=="DAV:") { + echo ' <'.($this->crrnd?'':'D:')."$prop[name]/>\n"; + } else if (!empty($prop["ns"])) { + echo " <".$ns_hash[$prop["ns"]].":$prop[name]/>\n"; + } else { + echo " <$prop[name] xmlns=\"\"/>"; + } + } else if ($prop["ns"] == "DAV:") { + // some WebDAV properties need special treatment + switch ($prop["name"]) { + case "creationdate": + echo ' <'.($this->crrnd?'':'D:')."creationdate ns0:dt=\"dateTime.tz\">" + . gmdate("Y-m-d\\TH:i:s\\Z", $prop['val']) + . 'crrnd?'':'D:')."creationdate>\n"; + break; + case "getlastmodified": + echo ' <'.($this->crrnd?'':'D:')."getlastmodified ns0:dt=\"dateTime.rfc1123\">" + . gmdate("D, d M Y H:i:s ", $prop['val']) + . "GMTcrrnd?'':'D:')."getlastmodified>\n"; + break; + case "supportedlock": + echo ' <'.($this->crrnd?'':'D:')."supportedlock>$prop[val]crrnd?'':'D:')."supportedlock>\n"; + break; + case "lockdiscovery": + echo ' <'.($this->crrnd?'':'D:')."lockdiscovery>\n"; + echo $prop["val"]; + echo ' crrnd?'':'D:')."lockdiscovery>\n"; + break; + default: + $ns_defs = ''; + if (is_array($prop['val'])) + { + $hns_hash = $ns_hash; + $val = $this->_hierarchical_prop_encode($prop['val'], 'DAV:', $ns_defs, $hns_hash); + } elseif (isset($prop['raw'])) { + $val = $this->_prop_encode(''); + } else { + $val = $this->_prop_encode(htmlspecialchars($prop['val'])); + } + echo ' <'.($this->crrnd?'':'D:')."$prop[name]$ns_defs>$val". + 'crrnd?'':'D:')."$prop[name]>\n"; + break; + } + } else { + // allow multiple values and attributes, required eg. for caldav:supported-calendar-component-set + if ($prop['ns'] && is_array($prop['val'])) { + if (!isset($ns_hash[$prop['ns']])) { + $ns_name = "ns".(count($ns_hash) + 1); + $ns_hash[$prop['ns']] = $ns_name; + } + $vals = $extra_ns = ''; + foreach($prop['val'] as $subprop) + { + if ($subprop['ns'] && $subprop['ns'] != 'DAV:') { + // register property namespace if not known yet + if (!isset($ns_hash[$subprop['ns']])) { + $ns_name = "ns".(count($ns_hash) + 1); + $ns_hash[$subprop['ns']] = $ns_name; + } else { + $ns_name = $ns_hash[$subprop['ns']]; + } + if (strchr($extra_ns,$extra=' xmlns:'.$ns_name.'="'.$subprop['ns'].'"') === false) { + $extra_ns .= $extra; + } + $ns_name .= ':'; + } elseif ($subprop['ns'] == 'DAV:') { + $ns_name = 'D:'; + } else { + $ns_name = ''; + } + $vals .= "<$ns_name$subprop[name]"; + if (is_array($subprop['val'])) // val contains only attributes, no value + { + foreach($subprop['val'] as $attr => $val) + { + $vals .= ' '.$attr.'="'.htmlspecialchars($val).'"'; + } + $vals .= '/>'; + } + else + { + $vals .= '>'; + if (isset($subprop['raw'])) { + $vals .= ''; + } else { + $vals .= htmlspecialchars($subprop['val']); + } + $vals .= ""; + } + } + echo ' <'.$ns_hash[$prop['ns']].":$prop[name]$extra_ns>$vals\n"; + } else { + if ($prop['raw']) + { + $val = ''; + } else { + $val = htmlspecialchars($prop['val']); + } + $val = $this->_prop_encode($val); + // properties from namespaces != "DAV:" or without any namespace + if ($prop['ns']) { + if ($this->crrnd) { + echo " <$prop[name] xmlns=".'"'.$prop["ns"].'">' + . $val . "\n"; + } else { + echo " <" . $ns_hash[$prop["ns"]] . ":$prop[name]>" + . $val . '\n"; + } + } else { + echo " <$prop[name] xmlns=\"\">$val\n"; + } + } + } + } + + if ($this->crrnd) + { + echo " \n"; + echo " HTTP/1.1 200 OK\n"; + echo " \n"; + } + else + { + echo " \n"; + echo " HTTP/1.1 200 OK\n"; + echo " \n"; + } + } + + // now report all properties requested but not found + if (isset($file["noprops"])) { + echo ' <'.($this->crrnd?'':'D:')."propstat>\n"; + echo ' <'.($this->crrnd?'':'D:')."prop>\n"; + + foreach ($file["noprops"] as &$prop) { + if ($prop["ns"] == "DAV:") { + echo ' <'.($this->crrnd?'':'D:')."$prop[name]/>\n"; + } else if ($prop["ns"] == "") { + echo " <$prop[name] xmlns=\"\"/>\n"; + } else { + echo " <" . $ns_hash[$prop["ns"]] . ":$prop[name]/>\n"; + } + } + + if ($this->crrnd) + { + echo " \n"; + echo " HTTP/1.1 404 Not Found\n"; + echo " \n"; + } + else + { + echo " \n"; + echo " HTTP/1.1 404 Not Found\n"; + echo " \n"; + } + } + + echo ' crrnd?'':'D:')."response>\n"; + } + + echo 'crrnd?'':'D:')."multistatus>\n"; + } + + + // }}} + + // {{{ http_PROPPATCH() + + /** + * PROPPATCH method handler + * + * @param void + * @return void + */ + function http_PROPPATCH() + { + if ($this->_check_lock_status($this->path)) { + $options = Array(); + + $options["path"] = $this->path; + + $propinfo = new _parse_proppatch("php://input"); + + if (!$propinfo->success) { + $this->http_status("400 Error"); + return; + } + + $options['props'] = $propinfo->props; + + $responsedescr = $this->PROPPATCH($options); + + $this->http_status("207 Multi-Status"); + header('Content-Type: text/xml; charset="utf-8"'); + + echo "\n"; + + echo "\n"; + echo ' <'.($this->crrnd?'':'D:')."response>\n"; + echo ' <'.($this->crrnd?'':'D:')."href>".$this->_urlencode($this->_mergePathes($this->_SERVER["SCRIPT_NAME"], $this->path)).'crrnd?'':'D:')."href>\n"; + + foreach ($options["props"] as $prop) { + echo ' <'.($this->crrnd?'':'D:')."propstat>\n"; + echo ' <'.($this->crrnd?'':'D:')."prop><$prop[name] xmlns=\"$prop[ns]\"/>crrnd?'':'D:')."prop>\n"; + echo ' <'.($this->crrnd?'':'D:')."status>HTTP/1.1 $prop[status]crrnd?'':'D:')."status>\n"; + echo ' crrnd?'':'D:')."propstat>\n"; + } + + if ($responsedescr) { + echo ' <'.($this->crrnd?'':'D:')."responsedescription>". + $this->_prop_encode(htmlspecialchars($responsedescr)). + 'crrnd?'':'D:')."responsedescription>\n"; + } + + echo ' crrnd?'':'D:')."response>\n"; + echo 'crrnd?'':'D:')."multistatus>\n"; + } else { + $this->http_status("423 Locked"); + } + } + + // }}} + + + // {{{ http_MKCOL() + + /** + * MKCOL method handler + * + * @param void + * @return void + */ + function http_MKCOL() + { + $options = Array(); + + $options["path"] = $this->path; + + $stat = $this->MKCOL($options); + + $this->http_status($stat); + } + + // }}} + + + // {{{ http_GET() + + /** + * GET method handler + * + * @param void + * @return void + */ + function http_GET() + { + // TODO check for invalid stream + $options = Array(); + $options["path"] = $this->path; + + $this->_get_ranges($options); + + if (true === ($status = $this->GET($options))) { + if (!headers_sent()) { + $status = "200 OK"; + + if (!isset($options['mimetype'])) { + $options['mimetype'] = "application/octet-stream"; + } + // switching off zlib.output_compression for zip archives, as the double compression makes problems eg. with lighttpd + if ($options['mimetype'] == 'application/zip') + { + ini_set('zlib.output_compression',0); + } + header("Content-type: $options[mimetype]"); + + if (isset($options['mtime'])) { + header("Last-modified:".gmdate("D, d M Y H:i:s ", $options['mtime'])."GMT"); + } + // fix for IE and https, thanks to rob_burcham@yahoo.com + // see http://us3.php.net/manual/en/function.header.php#83219 + // and http://support.microsoft.com/kb/812935 + header("Cache-Control: maxage=1"); //In seconds + header("Pragma: public"); + + if (isset($options['stream'])) { + // GET handler returned a stream + if (!empty($options['ranges']) && (0===fseek($options['stream'], 0, SEEK_SET))) { + // partial request and stream is seekable + + if (count($options['ranges']) === 1) { + $range = $options['ranges'][0]; + + if (isset($range['start'])) { + fseek($options['stream'], $range['start'], SEEK_SET); + if (feof($options['stream'])) { + $this->http_status("416 Requested range not satisfiable"); + return; + } + + if (isset($range['end'])) { + $size = $range['end']-$range['start']+1; + $this->http_status("206 partial"); + header("Content-length: $size"); + header("Content-range: $range[start]-$range[end]/" + . (isset($options['size']) ? $options['size'] : "*")); + while ($size && !feof($options['stream'])) { + $buffer = fread($options['stream'], 4096); + $size -= $this->bytes($buffer); + echo $buffer; + } + } else { + $this->http_status("206 partial"); + if (isset($options['size'])) { + header("Content-length: ".($options['size'] - $range['start'])); + header("Content-range: ".$range['start']."-".$range['end']."/" + . (isset($options['size']) ? $options['size'] : "*")); + } + fpassthru($options['stream']); + } + } else { + header("Content-length: ".$range['last']); + fseek($options['stream'], -$range['last'], SEEK_END); + fpassthru($options['stream']); + } + } else { + $this->_multipart_byterange_header(); // init multipart + foreach ($options['ranges'] as $range) { + // TODO what if size unknown? 500? + if (isset($range['start'])) { + $from = $range['start']; + $to = !empty($range['end']) ? $range['end'] : $options['size']-1; + } else { + $from = $options['size'] - $range['last']-1; + $to = $options['size'] -1; + } + $total = isset($options['size']) ? $options['size'] : "*"; + $size = $to - $from + 1; + $this->_multipart_byterange_header($options['mimetype'], $from, $to, $total); + + + fseek($options['stream'], $from, SEEK_SET); + while ($size && !feof($options['stream'])) { + $buffer = fread($options['stream'], 4096); + $size -= $this->bytes($buffer); + echo $buffer; + } + } + $this->_multipart_byterange_header(); // end multipart + } + } else { + // normal request or stream isn't seekable, return full content + if (isset($options['size'])) { + header("Content-length: ".$options['size']); + } + fpassthru($options['stream']); + return; // no more headers + } + } elseif (isset($options['data'])) { + if (is_array($options['data'])) { + // reply to partial request + } else { + header("Content-length: ".$this->bytes($options['data'])); + echo $options['data']; + } + } + } + } + + if (!headers_sent()) { + if (false === $status) { + $this->http_status("404 not found"); + } else { + // TODO: check setting of headers in various code pathes above + $this->http_status("$status"); + } + } + } + + + /** + * parse HTTP Range: header + * + * @param array options array to store result in + * @return void + */ + function _get_ranges(&$options) + { + // process Range: header if present + if (isset($this->_SERVER['HTTP_RANGE'])) { + + // we only support standard "bytes" range specifications for now + if (preg_match('/bytes\s*=\s*(.+)/', $this->_SERVER['HTTP_RANGE'], $matches)) { + $options["ranges"] = array(); + + // ranges are comma separated + foreach (explode(",", $matches[1]) as $range) { + // ranges are either from-to pairs or just end positions + list($start, $end) = explode("-", $range); + $options["ranges"][] = ($start==="") + ? array("last"=>$end) + : array("start"=>$start, "end"=>$end); + } + } + } + } + + /** + * generate separator headers for multipart response + * + * first and last call happen without parameters to generate + * the initial header and closing sequence, all calls inbetween + * require content mimetype, start and end byte position and + * optionaly the total byte length of the requested resource + * + * @param string mimetype + * @param int start byte position + * @param int end byte position + * @param int total resource byte size + */ + function _multipart_byterange_header($mimetype = false, $from = false, $to=false, $total=false) + { + if ($mimetype === false) { + if (!isset($this->multipart_separator)) { + // initial + + // a little naive, this sequence *might* be part of the content + // but it's really not likely and rather expensive to check + $this->multipart_separator = "SEPARATOR_".md5(microtime()); + + // generate HTTP header + header("Content-type: multipart/byteranges; boundary=".$this->multipart_separator); + } else { + // final + + // generate closing multipart sequence + echo "\n--{$this->multipart_separator}--"; + } + } else { + // generate separator and header for next part + echo "\n--{$this->multipart_separator}\n"; + echo "Content-type: $mimetype\n"; + echo "Content-range: $from-$to/". ($total === false ? "*" : $total); + echo "\n\n"; + } + } + + + + // }}} + + // {{{ http_HEAD() + + /** + * HEAD method handler + * + * @param void + * @return void + */ + function http_HEAD() + { + $status = false; + $options = Array(); + $options["path"] = $this->path; + + if (method_exists($this, "HEAD")) { + $status = $this->head($options); + } else if (method_exists($this, "GET")) { + ob_start(); + $status = $this->GET($options); + if (!isset($options['size'])) { + $options['size'] = ob_get_length(); + } + ob_end_clean(); + } + + if (!isset($options['mimetype'])) { + $options['mimetype'] = "application/octet-stream"; + } + header("Content-type: $options[mimetype]"); + + if (isset($options['mtime'])) { + header("Last-modified:".gmdate("D, d M Y H:i:s ", $options['mtime'])."GMT"); + } + + if (isset($options['size'])) { + header("Content-length: ".$options['size']); + } + + if ($status === true) $status = "200 OK"; + if ($status === false) $status = "404 Not found"; + + $this->http_status($status); + } + + // }}} + + // {{{ http_POST() + + /** + * POST method handler + * + * @param void + * @return void + */ + function http_POST() + { + $status = '405 Method not allowed'; + $options = Array(); + $options['path'] = $this->path; + + if (!isset($options['mimetype'])) { + $options['mimetype'] = "application/octet-stream"; + } + header("Content-type: $options[mimetype]"); + + if (isset($options['mtime'])) { + header("Last-modified:".gmdate("D, d M Y H:i:s ", $options['mtime'])."GMT"); + } + + if (isset($options['size'])) { + header("Content-length: ".$options['size']); + } + + if (method_exists($this, 'POST')) { + $status = $this->POST($options); + } + + if ($status === true) $status = '200 OK'; + if ($status === false) $status = '400 Something went wrong'; + + $this->http_status($status); + } + + // }}} + + // {{{ http_PUT() + + /** + * PUT method handler + * + * @param void + * @return void + */ + function http_PUT() + { + if ($this->_check_lock_status($this->path)) { + $options = Array(); + $options["path"] = $this->path; + + if (isset($this->_SERVER['CONTENT_LENGTH'])) + { + $options['content_length'] = $this->_SERVER['CONTENT_LENGTH']; + } + elseif (isset($this->_SERVER['X-Expected-Entity-Length'])) + { + // MacOS gives us that hint + $options['content_length'] = $this->_SERVER['X-Expected-Entity-Length']; + } + + // get the Content-type + if (isset($this->_SERVER["CONTENT_TYPE"])) { + // for now we do not support any sort of multipart requests + if (!strncmp($this->_SERVER["CONTENT_TYPE"], "multipart/", 10)) { + $this->http_status("501 not implemented"); + echo "The service does not support mulipart PUT requests"; + return; + } + $options["content_type"] = $this->_SERVER["CONTENT_TYPE"]; + } else { + // default content type if none given + $options["content_type"] = "application/octet-stream"; + } + + /* RFC 2616 2.6 says: "The recipient of the entity MUST NOT + ignore any Content-* (e.g. Content-Range) headers that it + does not understand or implement and MUST return a 501 + (Not Implemented) response in such cases." + */ + foreach ($this->_SERVER as $key => $val) { + if (strncmp($key, "HTTP_CONTENT", 11)) continue; + switch ($key) { + case 'HTTP_CONTENT_ENCODING': // RFC 2616 14.11 + // TODO support this if ext/zlib filters are available + $this->http_status("501 not implemented"); + echo "The service does not support '$val' content encoding"; + return; + + case 'HTTP_CONTENT_LANGUAGE': // RFC 2616 14.12 + // we assume it is not critical if this one is ignored + // in the actual PUT implementation ... + $options["content_language"] = $val; + break; + + case 'HTTP_CONTENT_LENGTH': + // defined on IIS and has the same value as CONTENT_LENGTH + break; + + case 'HTTP_CONTENT_LOCATION': // RFC 2616 14.14 + /* The meaning of the Content-Location header in PUT + or POST requests is undefined; servers are free + to ignore it in those cases. */ + break; + + case 'HTTP_CONTENT_RANGE': // RFC 2616 14.16 + // single byte range requests are supported + // the header format is also specified in RFC 2616 14.16 + // TODO we have to ensure that implementations support this or send 501 instead + if (!preg_match('@bytes\s+(\d+)-(\d+)/((\d+)|\*)@', $val, $matches)) { + $this->http_status("400 bad request"); + echo "The service does only support single byte ranges"; + return; + } + + $range = array("start"=>$matches[1], "end"=>$matches[2]); + if (is_numeric($matches[3])) { + $range["total_length"] = $matches[3]; + } + $option["ranges"][] = $range; + + // TODO make sure the implementation supports partial PUT + // this has to be done in advance to avoid data being overwritten + // on implementations that do not support this ... + break; + + case 'HTTP_CONTENT_TYPE': + // defined on IIS and has the same value as CONTENT_TYPE + break; + + case 'HTTP_CONTENT_MD5': // RFC 2616 14.15 + // TODO: maybe we can just pretend here? + $this->http_status("501 not implemented"); + echo "The service does not support content MD5 checksum verification"; + return; + + default: + // any other unknown Content-* headers + $this->http_status("501 not implemented"); + echo "The service does not support '$key'"; + return; + } + } + + $options["stream"] = fopen("php://input", "r"); + + $stat = $this->PUT($options); + + if ($stat === false) { + $stat = "403 Forbidden"; + } else if (is_resource($stat) && get_resource_type($stat) == "stream") { + $stream = $stat; + + $stat = $options["new"] ? "201 Created" : "204 No Content"; + + if (!empty($options["ranges"])) { + // TODO multipart support is missing (see also above) + if (0 == fseek($stream, $range[0]["start"], SEEK_SET)) { + $length = $range[0]["end"]-$range[0]["start"]+1; + if (!fwrite($stream, fread($options["stream"], $length))) { + $stat = "403 Forbidden"; + } + } else { + $stat = "403 Forbidden"; + } + } else { + while (!feof($options["stream"])) { + if (false === fwrite($stream, fread($options["stream"], 4096))) { + $stat = "403 Forbidden"; + break; + } + } + } + + fclose($stream); + } + + $this->http_status($stat); + } else { + $this->http_status("423 Locked"); + } + } + + // }}} + + + // {{{ http_DELETE() + + /** + * DELETE method handler + * + * @param void + * @return void + */ + function http_DELETE() + { + // check RFC 2518 Section 9.2, last paragraph + if (isset($this->_SERVER["HTTP_DEPTH"])) { + if ($this->_SERVER["HTTP_DEPTH"] != "infinity") { + if (stripos($_SERVER['HTTP_USER_AGENT'],'webdrive') !== false) + { + // pretend we didnt see it, as webdrive does not handle the depth parameter correctly while deleting collections + } + else + { + $this->http_status("400 Bad Request"); + return; + } + } + } + + // check lock status + if ($this->_check_lock_status($this->path)) { + // ok, proceed + $options = Array(); + $options["path"] = $this->path; + + $stat = $this->DELETE($options); + + $this->http_status($stat); + } else { + // sorry, its locked + $this->http_status("423 Locked"); + } + } + + // }}} + + // {{{ http_COPY() + + /** + * COPY method handler + * + * @param void + * @return void + */ + function http_COPY() + { + // no need to check source lock status here + // destination lock status is always checked by the helper method + $this->_copymove("copy"); + } + + // }}} + + // {{{ http_MOVE() + + /** + * MOVE method handler + * + * @param void + * @return void + */ + function http_MOVE() + { + if ($this->_check_lock_status($this->path)) { + // destination lock status is always checked by the helper method + $this->_copymove("move"); + } else { + $this->http_status("423 Locked"); + } + } + + // }}} + + + // {{{ http_LOCK() + + /** + * LOCK method handler + * + * @param void + * @return void + */ + function http_LOCK() + { + $options = Array(); + $options["path"] = $this->path; + + if (isset($this->_SERVER['HTTP_DEPTH'])) { + $options["depth"] = $this->_SERVER["HTTP_DEPTH"]; + } else { + $options["depth"] = "infinity"; + } + + if (isset($this->_SERVER["HTTP_TIMEOUT"])) { + $options["timeout"] = explode(",", $this->_SERVER["HTTP_TIMEOUT"]); + } + + if (empty($this->_SERVER['CONTENT_LENGTH']) && !empty($this->_SERVER['HTTP_IF'])) { + // check if locking is possible + if (!$this->_check_lock_status($this->path)) { + $this->http_status("423 Locked"); + return; + } + + // refresh lock + $options["locktoken"] = substr($this->_SERVER['HTTP_IF'], 2, -2); + $options["update"] = $options["locktoken"]; + + // setting defaults for required fields, LOCK() SHOULD overwrite these + $options['owner'] = "unknown"; + $options['scope'] = "exclusive"; + $options['type'] = "write"; + + + $stat = $this->LOCK($options); + } else { + // extract lock request information from request XML payload + $lockinfo = new _parse_lockinfo("php://input"); + if (!$lockinfo->success) { + $this->http_status("400 bad request"); + } + + // check if locking is possible + if (!$this->_check_lock_status($this->path, $lockinfo->lockscope === "shared")) { + $this->http_status("423 Locked"); + return; + } + + // new lock + $options["scope"] = $lockinfo->lockscope; + $options["type"] = $lockinfo->locktype; + // Todo: lockinfo::owner still contains D:href opening and closing tags, maybe they should be removed here with strip_tags + $options["owner"] = $lockinfo->owner; + $options["locktoken"] = $this->_new_locktoken(); + + $stat = $this->LOCK($options); + } + + if (is_bool($stat)) { + $http_stat = $stat ? "200 OK" : "423 Locked"; + } else { + $http_stat = $stat; + } + $this->http_status($http_stat); + + if ($http_stat{0} == 2) { // 2xx states are ok + if ($options["timeout"]) { + if (is_numeric($options["timeout"])) + { + // more than a million is considered an absolute timestamp + // less is more likely a relative value + if ($options["timeout"]>1000000) { + $timeout = "Second-".($options['timeout']-time()); + } else { + $timeout = "Second-$options[timeout]"; + } + } + else + { + $timeout = $options[timeout]; + } + } else { + $timeout = "Infinite"; + } + + header('Content-Type: text/xml; charset="utf-8"'); + header("Lock-Token: <$options[locktoken]>"); + echo "\n"; + echo "\n"; + echo ' <'.($this->crrnd?'':'D:')."lockdiscovery>\n"; + echo ' <'.($this->crrnd?'':'D:')."activelock>\n"; + echo ' <'.($this->crrnd?'':'D:')."lockscope>crrnd?'':'D:')."lockscope>\n"; + echo ' <'.($this->crrnd?'':'D:')."locktype>crrnd?'':'D:')."locktype>\n"; + echo ' <'.($this->crrnd?'':'D:')."depth>$options[depth]crrnd?'':'D:')."depth>\n"; + echo ' <'.($this->crrnd?'':'D:')."owner>$options[owner]crrnd?'':'D:')."owner>\n"; + echo ' <'.($this->crrnd?'':'D:')."timeout>$timeoutcrrnd?'':'D:')."timeout>\n"; + echo ' <'.($this->crrnd?'':'D:')."locktoken>$options[locktoken]crrnd?'':'D:')."locktoken>\n"; + echo ' crrnd?'':'D:')."activelock>\n"; + echo ' crrnd?'':'D:')."lockdiscovery>\n"; + echo 'crrnd?'':'D:')."prop>\n\n"; + } + } + + + // }}} + + // {{{ http_UNLOCK() + + /** + * UNLOCK method handler + * + * @param void + * @return void + */ + function http_UNLOCK() + { + $options = Array(); + $options["path"] = $this->path; + + if (isset($this->_SERVER['HTTP_DEPTH'])) { + $options["depth"] = $this->_SERVER["HTTP_DEPTH"]; + } else { + $options["depth"] = "infinity"; + } + + // strip surrounding <> + $options["token"] = substr(trim($this->_SERVER["HTTP_LOCK_TOKEN"]), 1, -1); + + // call user method + $stat = $this->UNLOCK($options); + + $this->http_status($stat); + } + + // }}} + + // {{{ http_ACL() + + /** + * ACL method handler + * + * @param void + * @return void + */ + function http_ACL() + { + $options = Array(); + $options['path'] = $this->path; + $options['errors'] = array(); + + if (isset($this->_SERVER['HTTP_DEPTH'])) { + $options['depth'] = $this->_SERVER['HTTP_DEPTH']; + } else { + $options['depth'] = 'infinity'; + } + + // call user method + $status = $this->ACL($options); + + // now we generate the reply header ... + $this->http_status($status); + $content = ''; + + if (is_array($options['errors']) && count($options['errors'])) { + header('Content-Type: text/xml; charset="utf-8"'); + // ... and payload + $content .= "\n"; + $content .= " \n"; + foreach ($options['errors'] as $violation) { + $content .= '<'.($this->crrnd?'':'D:')."$violation/>\n"; + } + $content .= 'crrnd?'':'D:')."error>\n"; + } + header("Content-length: ".$this->bytes($content)); + if ($content) echo $options['content']; + } + + // }}} + + // }}} + + // {{{ _copymove() + + function _copymove($what) + { + $options = Array(); + $options["path"] = $this->path; + + if (isset($this->_SERVER["HTTP_DEPTH"])) { + $options["depth"] = $this->_SERVER["HTTP_DEPTH"]; + } else { + $options["depth"] = "infinity"; + } + + extract(parse_url($this->_SERVER["HTTP_DESTINATION"])); + $path = urldecode($path); + $http_host = $host; + if (isset($port) && $port != 80) + $http_host.= ":$port"; + + $http_header_host = preg_replace("/:80$/", "", $this->_SERVER["HTTP_HOST"]); + + if ($http_host == $http_header_host && + !strncmp($this->_SERVER["SCRIPT_NAME"], $path, + strlen($this->_SERVER["SCRIPT_NAME"]))) { + $options["dest"] = substr($path, strlen($this->_SERVER["SCRIPT_NAME"])); + if (!$this->_check_lock_status($options["dest"])) { + $this->http_status("423 Locked"); + return; + } + + } else { + $options["dest_url"] = $this->_SERVER["HTTP_DESTINATION"]; + } + + // see RFC 2518 Sections 9.6, 8.8.4 and 8.9.3 + if (isset($this->_SERVER["HTTP_OVERWRITE"])) { + $options["overwrite"] = $this->_SERVER["HTTP_OVERWRITE"] == "T"; + } else { + $options["overwrite"] = true; + } + + $stat = $this->$what($options); + $this->http_status($stat); + } + + // }}} + + // {{{ _allow() + + /** + * check for implemented HTTP methods + * + * @param void + * @return array something + */ + function _allow() + { + // OPTIONS is always there + $allow = array("OPTIONS" =>"OPTIONS"); + + // all other METHODS need both a http_method() wrapper + // and a method() implementation + // the base class supplies wrappers only + foreach (get_class_methods($this) as $method) { + if (!strncmp("http_", $method, 5)) { + $method = strtoupper(substr($method, 5)); + if (method_exists($this, $method)) { + $allow[$method] = $method; + } + } + } + + // we can emulate a missing HEAD implemetation using GET + if (isset($allow["GET"])) + $allow["HEAD"] = "HEAD"; + + // no LOCK without checklok() + if (!method_exists($this, "checklock")) { + unset($allow["LOCK"]); + unset($allow["UNLOCK"]); + } + + return $allow; + } + + // }}} + + /** + * helper for property element creation + * + * @param string XML namespace (optional) + * @param string property name + * @param string property value + * @praram boolen property raw-flag + * @return array property array + */ + function mkprop() + { + $args = func_get_args(); + switch (count($args)) { + case 4: + return array('ns' => $args[0], + 'name' => $args[1], + 'val' => $args[2], + 'raw' => true); + case 3: + return array('ns' => $args[0], + 'name' => $args[1], + 'val' => $args[2]); + default: + return array('ns' => 'DAV:', + 'name' => $args[0], + 'val' => $args[1]); + } + } + + // {{{ _check_auth + + /** + * check authentication if check is implemented + * + * @param void + * @return bool true if authentication succeded or not necessary + */ + function _check_auth() + { + if (method_exists($this, "checkAuth")) { + // PEAR style method name + return $this->checkAuth(@$this->_SERVER["AUTH_TYPE"], + @$this->_SERVER["PHP_AUTH_USER"], + @$this->_SERVER["PHP_AUTH_PW"]); + } else if (method_exists($this, "check_auth")) { + // old (pre 1.0) method name + return $this->check_auth(@$this->_SERVER["AUTH_TYPE"], + @$this->_SERVER["PHP_AUTH_USER"], + @$this->_SERVER["PHP_AUTH_PW"]); + } else { + // no method found -> no authentication required + return true; + } + } + + // }}} + + // {{{ UUID stuff + + /** + * generate Unique Universal IDentifier for lock token + * + * @param void + * @return string a new UUID + */ + function _new_uuid() + { + // use uuid extension from PECL if available + if (function_exists("uuid_create")) { + return uuid_create(); + } + + // fallback + $uuid = md5(microtime().getmypid()); // this should be random enough for now + + // set variant and version fields for 'true' random uuid + $uuid{12} = "4"; + $n = 8 + (ord($uuid{16}) & 3); + $hex = "0123456789abcdef"; + $uuid{16} = $hex{$n}; + + // return formated uuid + return substr($uuid, 0, 8)."-" + . substr($uuid, 8, 4)."-" + . substr($uuid, 12, 4)."-" + . substr($uuid, 16, 4)."-" + . substr($uuid, 20); + } + + /** + * create a new opaque lock token as defined in RFC2518 + * + * @param void + * @return string new RFC2518 opaque lock token + */ + function _new_locktoken() + { + return "opaquelocktoken:".HTTP_WebDAV_Server::_new_uuid(); + } + + // }}} + + // {{{ WebDAV If: header parsing + + /** + * + * + * @param string header string to parse + * @param int current parsing position + * @return array next token (type and value) + */ + function _if_header_lexer($string, &$pos) + { + // skip whitespace + while (ctype_space($string{$pos})) { + ++$pos; + } + + // already at end of string? + if (strlen($string) <= $pos) { + return false; + } + + // get next character + $c = $string{$pos++}; + + // now it depends on what we found + switch ($c) { + case "<": + // URIs are enclosed in <...> + $pos2 = strpos($string, ">", $pos); + $uri = substr($string, $pos, $pos2 - $pos); + $pos = $pos2 + 1; + return array("URI", $uri); + + case "[": + //Etags are enclosed in [...] + if ($string{$pos} == "W") { + $type = "ETAG_WEAK"; + $pos += 2; + } else { + $type = "ETAG_STRONG"; + } + $pos2 = strpos($string, "]", $pos); + $etag = substr($string, $pos + 1, $pos2 - $pos - 2); + $pos = $pos2 + 1; + return array($type, $etag); + + case "N": + // "N" indicates negation + $pos += 2; + return array("NOT", "Not"); + + default: + // anything else is passed verbatim char by char + return array("CHAR", $c); + } + } + + /** + * parse If: header + * + * @param string header string + * @return array URIs and their conditions + */ + function _if_header_parser($str) + { + $pos = 0; + $len = strlen($str); + $uris = array(); + + // parser loop + while ($pos < $len) { + // get next token + $token = $this->_if_header_lexer($str, $pos); + + // check for URI + if ($token[0] == "URI") { + $uri = $token[1]; // remember URI + $token = $this->_if_header_lexer($str, $pos); // get next token + } else { + $uri = ""; + } + + // sanity check + if ($token[0] != "CHAR" || $token[1] != "(") { + return false; + } + + $list = array(); + $level = 1; + $not = ""; + while ($level) { + $token = $this->_if_header_lexer($str, $pos); + if ($token[0] == "NOT") { + $not = "!"; + continue; + } + switch ($token[0]) { + case "CHAR": + switch ($token[1]) { + case "(": + $level++; + break; + case ")": + $level--; + break; + default: + return false; + } + break; + + case "URI": + $list[] = $not."<$token[1]>"; + break; + + case "ETAG_WEAK": + $list[] = $not."[W/'$token[1]']>"; + break; + + case "ETAG_STRONG": + $list[] = $not."['$token[1]']>"; + break; + + default: + return false; + } + $not = ""; + } + + if (@is_array($uris[$uri])) { + $uris[$uri] = array_merge($uris[$uri], $list); + } else { + $uris[$uri] = $list; + } + } + + return $uris; + } + + /** + * check if conditions from "If:" headers are meat + * + * the "If:" header is an extension to HTTP/1.1 + * defined in RFC 2518 section 9.4 + * + * @param void + * @return void + */ + function _check_if_header_conditions() + { + if (isset($this->_SERVER["HTTP_IF"])) { + $this->_if_header_uris = + $this->_if_header_parser($this->_SERVER["HTTP_IF"]); + + foreach ($this->_if_header_uris as $uri => $conditions) { + if ($uri == "") { + $uri = $this->uri; + } + // all must match + $state = true; + foreach ($conditions as $condition) { + // lock tokens may be free form (RFC2518 6.3) + // but if opaquelocktokens are used (RFC2518 6.4) + // we have to check the format (litmus tests this) + if (!strncmp($condition, "$/', $condition)) { + $this->http_status("423 Locked"); + return false; + } + } + if (!$this->_check_uri_condition($uri, $condition)) { + $this->http_status("412 Precondition failed"); + $state = false; + break; + } + } + + // any match is ok + if ($state == true) { + return true; + } + } + return false; + } + return true; + } + + /** + * Check a single URI condition parsed from an if-header + * + * Check a single URI condition parsed from an if-header + * + * @abstract + * @param string $uri URI to check + * @param string $condition Condition to check for this URI + * @returns bool Condition check result + */ + function _check_uri_condition($uri, $condition) + { + // not really implemented here, + // implementations must override + + // a lock token can never be from the DAV: scheme + // litmus uses DAV:no-lock in some tests + if (!strncmp(" ignored for now + if (method_exists($this, "checkLock")) { + // is locked? + $lock = $this->checkLock($path); + + // ... and lock is not owned? + if (is_array($lock) && count($lock)) { + // FIXME doesn't check uri restrictions yet + if (!isset($this->_SERVER["HTTP_IF"]) || !strstr($this->_SERVER["HTTP_IF"], $lock["token"])) { + if (!$exclusive_only || ($lock["scope"] !== "shared")) + return false; + } + } + } + return true; + } + + + // }}} + + + /** + * Generate lockdiscovery reply from checklock() result + * + * @param string resource path to check + * @return string lockdiscovery response + */ + function lockdiscovery($path) + { + // no lock support without checklock() method + if (!method_exists($this, "checklock")) { + return ""; + } + + // collect response here + $activelocks = ""; + + // get checklock() reply + $lock = $this->checklock($path); + + // generate block for returned data + if (is_array($lock) && count($lock)) { + // check for 'timeout' or 'expires' + if (!empty($lock["expires"])) { + $timeout = "Second-".($lock["expires"] - time()); + } else if (!empty($lock["timeout"])) { + $timeout = "Second-$lock[timeout]"; + } else { + $timeout = "Infinite"; + } + + // genreate response block + if ($this->crrnd) + { + $activelocks.= " + + <$lock[scope]/> + <$lock[type]/> + $lock[depth] + $lock[owner] + $timeout + $lock[token] + + "; + } + else + { + $activelocks.= " + + + + $lock[depth] + $lock[owner] + $timeout + $lock[token] + + "; + } + } + + // return generated response + //error_log(__METHOD__."\n".print_r($activelocks,true)); + return $activelocks; + } + + /** + * set HTTP return status and mirror it in a private header + * + * @param string status code and message + * @return void + */ + function http_status($status) + { + // simplified success case + if ($status === true) { + $status = "200 OK"; + } + + // remember status + $this->_http_status = $status; + + // generate HTTP status response + header("HTTP/1.1 $status"); + header("X-WebDAV-Status: $status", true); + } + + /** + * private minimalistic version of PHP urlencode() + * + * only blanks and XML special chars must be encoded here + * full urlencode() encoding confuses some clients ... + * + * @param string URL to encode + * @return string encoded URL + */ + function _urlencode($url) + { + // cadaver (and probably all neon using agents) need a more complete url encoding + // otherwise special chars like "$,()'" in filenames do NOT work + if (strpos($_SERVER['HTTP_USER_AGENT'],'neon') !== false) + { + return strtr(rawurlencode($url),array( + '%2F' => '/', + '%3A' => ':', + )); + } + //error_log( __METHOD__."\n" .print_r($url,true)); + return strtr($url, array(' ' => '%20', + '&' => '%26', + '<' => '%3C', + '>' => '%3E', + '+' => '%2B', + )); + } + + /** + * private version of PHP urldecode + * + * not really needed but added for completenes + * + * @param string URL to decode + * @return string decoded URL + */ + function _urldecode($path) + { + return urldecode($path); + } + + /** + * Encode a hierarchical properties like: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * @param array $props + * @param string $ns + * @param strin $ns_defs + * @param array $ns_hash + * @return string + */ + function _hierarchical_prop_encode(array $props, $ns, &$ns_defs, array &$ns_hash) + { + $ret = ''; + + //error_log(__METHOD__.'('.array2string($props).')'); + if (isset($props['name'])) $props = array($props); + + foreach($props as $prop) + { + if (!isset($ns_hash[$prop['ns']])) // unknown namespace + { + // register namespace + $ns_name = 'ns'.(count($ns_hash) + 1); + $ns_hash[$prop['ns']] = $ns_name; + $ns_defs .= ' xmlns:'.$ns_name.'="'.$prop['ns'].'"'; + } + if (is_array($prop['val'])) + { + $subprop = $prop['val']; + if (isset($subprop['ns']) || isset($subprop[0]['ns'])) + { + $ret .= '<'.($prop['ns'] == $ns ? ($this->cnrnd ? $ns_hash[$ns].':' : '') : $ns_hash[$prop['ns']].':').$prop['name']. + (empty($prop['val']) ? '/>' : '>'.$this->_hierarchical_prop_encode($prop['val'], $prop['ns'], $ns_defs, $ns_hash). + 'cnrnd ? $ns_hash[$ns].':' : '') : ($this->crrnd ? '' : $ns_hash[$prop['ns']].':')).$prop['name'].'>'); + } + else // val contains only attributes, no value + { + $vals = ''; + + foreach($subprop as $attr => $val) + { + $vals .= ' '.$attr.'="'.htmlspecialchars($val).'"'; + } + + $ret .= '<'.($prop['ns'] == $ns ? ($this->cnrnd ? $ns_hash[$ns].':' : '') : $ns_hash[$prop['ns']].':').$prop['name']. + $vals .'/>'; + } + } + else + { + if (empty($prop['val'])) + { + $val = ''; + } + else + { + if(isset($prop['raw'])) + { + $val = $this->_prop_encode(''); + } else { + $val = $this->_prop_encode(htmlspecialchars($prop['val'])); + } } + + $ret .= '<'.($prop['ns'] == $ns ? ($this->cnrnd ? $ns_hash[$ns].':' : '') : $ns_hash[$prop['ns']].':').$prop['name']. + (empty($prop['val']) ? ' />' : '>'.$val.'cnrnd ? $ns_hash[$ns].':' : '') : ($this->crrnd ? '' : $ns_hash[$prop['ns']].':')).$prop['name'].'>'); + } + } + + //error_log(__METHOD__.'('.array2string($props).') = '.array2string($ret)); + return $ret; + } + + /** + * UTF-8 encode property values if not already done so + * + * @param string text to encode + * @return string utf-8 encoded text + */ + function _prop_encode($text) + { + //error_log( __METHOD__."\n" .print_r($text,true)); + //error_log("prop-encode:" . print_r($this->_prop_encoding,true)); + + switch (strtolower($this->_prop_encoding)) { + case "utf-8": + //error_log( __METHOD__."allready encoded\n" .print_r($text,true)); + return $text; + case "iso-8859-1": + case "iso-8859-15": + case "latin-1": + default: + error_log( __METHOD__."utf8 encode\n" .print_r(utf8_encode($text),true)); + return utf8_encode($text); + } + } + + /** + * Slashify - make sure path ends in a slash + * + * @param string directory path + * @returns string directory path wiht trailing slash + */ + function _slashify($path) + { + //error_log(__METHOD__." called with $path"); + if ($path[$this->bytes($path)-1] != '/') { + //error_log(__METHOD__." added slash at the end of path"); + $path = $path."/"; + } + return $path; + } + + /** + * Unslashify - make sure path doesn't in a slash + * + * @param string directory path + * @returns string directory path wihtout trailing slash + */ + function _unslashify($path) + { + //error_log(__METHOD__." called with $path"); + if ($path[$this->bytes($path)-1] == '/') { + $path = substr($path, 0, -1); + //error_log(__METHOD__." removed slash at the end of path"); + } + return $path; + } + + /** + * Merge two pathes, make sure there is exactly one slash between them + * + * @param string parent path + * @param string child path + * @return string merged path + */ + function _mergePathes($parent, $child) + { + //error_log("merge called :\n$parent \n$child\n" . function_backtrace()); + //error_log("merge :\n".print_r($this->_mergePathes($this->_SERVER["SCRIPT_NAME"], $this->path)true)); + if ($child{0} == '/') { + return $this->_unslashify($parent).$child; + } else { + return $this->_slashify($parent).$child; + } + } + + /** + * mbstring.func_overload save strlen version: counting the bytes not the chars + * + * @param string $str + * @return int + */ + function bytes($str) + { + static $func_overload; + + if (is_null($func_overload)) + { + $func_overload = @extension_loaded('mbstring') ? ini_get('mbstring.func_overload') : 0; + } + return $func_overload & 2 ? mb_strlen($str,'ascii') : strlen($str); + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ +?> diff --git a/egw-pear/HTTP/WebDAV/Server/Filesystem.php b/egw-pear/HTTP/WebDAV/Server/Filesystem.php new file mode 100644 index 0000000000..b6b98fd691 --- /dev/null +++ b/egw-pear/HTTP/WebDAV/Server/Filesystem.php @@ -0,0 +1,804 @@ + + * @version @package-version@ + */ +class HTTP_WebDAV_Server_Filesystem extends HTTP_WebDAV_Server +{ + /** + * Root directory for WebDAV access + * + * Defaults to webserver document root (set by ServeRequest) + * + * @access private + * @var string + */ + var $base = ""; + + /** + * MySQL Host where property and locking information is stored + * + * @access private + * @var string + */ + var $db_host = "localhost"; + + /** + * MySQL database for property/locking information storage + * + * @access private + * @var string + */ + var $db_name = "webdav"; + + /** + * MySQL table name prefix + * + * @access private + * @var string + */ + var $db_prefix = ""; + + /** + * MySQL user for property/locking db access + * + * @access private + * @var string + */ + var $db_user = "root"; + + /** + * MySQL password for property/locking db access + * + * @access private + * @var string + */ + var $db_passwd = ""; + + /** + * Serve a webdav request + * + * @access public + * @param string + */ + function ServeRequest($base = false) + { + // special treatment for litmus compliance test + // reply on its identifier header + // not needed for the test itself but eases debugging + foreach (apache_request_headers() as $key => $value) { + if (stristr($key, "litmus")) { + error_log("Litmus test $value"); + header("X-Litmus-reply: ".$value); + } + } + + // set root directory, defaults to webserver document root if not set + if ($base) { + $this->base = realpath($base); // TODO throw if not a directory + } else if (!$this->base) { + $this->base = $this->_SERVER['DOCUMENT_ROOT']; + } + + // establish connection to property/locking db + mysql_connect($this->db_host, $this->db_user, $this->db_passwd) or die(mysql_error()); + mysql_select_db($this->db_name) or die(mysql_error()); + // TODO throw on connection problems + + // let the base class do all the work + parent::ServeRequest(); + } + + /** + * No authentication is needed here + * + * @access private + * @param string HTTP Authentication type (Basic, Digest, ...) + * @param string Username + * @param string Password + * @return bool true on successful authentication + */ + function check_auth($type, $user, $pass) + { + return true; + } + + + /** + * PROPFIND method handler + * + * @param array general parameter passing array + * @param array return array for file properties + * @return bool true on success + */ + function PROPFIND(&$options, &$files) + { + // get absolute fs path to requested resource + $fspath = $this->base . $options["path"]; + + // sanity check + if (!file_exists($fspath)) { + return false; + } + + // prepare property array + $files["files"] = array(); + + // store information for the requested path itself + $files["files"][] = $this->fileinfo($options["path"]); + + // information for contained resources requested? + if (!empty($options["depth"])) { // TODO check for is_dir() first? + + // make sure path ends with '/' + $options["path"] = $this->_slashify($options["path"]); + + // try to open directory + $handle = @opendir($fspath); + + if ($handle) { + // ok, now get all its contents + while ($filename = readdir($handle)) { + if ($filename != "." && $filename != "..") { + $files["files"][] = $this->fileinfo($options["path"].$filename); + } + } + // TODO recursion needed if "Depth: infinite" + closedir($handle); + } + } + + // ok, all done + return true; + } + + /** + * Get properties for a single file/resource + * + * @param string resource path + * @return array resource properties + */ + function fileinfo($path) + { + // map URI path to filesystem path + $fspath = $this->base . $path; + + // create result array + $info = array(); + // TODO remove slash append code when base clase is able to do it itself + $info["path"] = is_dir($fspath) ? $this->_slashify($path) : $path; + $info["props"] = array(); + + // no special beautified displayname here ... + $info["props"][] = $this->mkprop("displayname", strtoupper($path)); + + // creation and modification time + $info["props"][] = $this->mkprop("creationdate", filectime($fspath)); + $info["props"][] = $this->mkprop("getlastmodified", filemtime($fspath)); + + // type and size (caller already made sure that path exists) + if (is_dir($fspath)) { + // directory (WebDAV collection) + $info["props"][] = $this->mkprop("resourcetype", array($this->mkprop('collection', ''))); + $info["props"][] = $this->mkprop("getcontenttype", "httpd/unix-directory"); + } else { + // plain file (WebDAV resource) + $info["props"][] = $this->mkprop("resourcetype", ""); + if (is_readable($fspath)) { + $info["props"][] = $this->mkprop("getcontenttype", $this->_mimetype($fspath)); + } else { + $info["props"][] = $this->mkprop("getcontenttype", "application/x-non-readable"); + } + $info["props"][] = $this->mkprop("getcontentlength", filesize($fspath)); + } + + // get additional properties from database + $query = "SELECT ns, name, value + FROM {$this->db_prefix}properties + WHERE path = '$path'"; + $res = mysql_query($query); + while ($row = mysql_fetch_assoc($res)) { + $info["props"][] = $this->mkprop($row["ns"], $row["name"], $row["value"]); + } + mysql_free_result($res); + + return $info; + } + + /** + * detect if a given program is found in the search PATH + * + * helper function used by _mimetype() to detect if the + * external 'file' utility is available + * + * @param string program name + * @param string optional search path, defaults to $PATH + * @return bool true if executable program found in path + */ + function _can_execute($name, $path = false) + { + // path defaults to PATH from environment if not set + if ($path === false) { + $path = getenv("PATH"); + } + + // check method depends on operating system + if (!strncmp(PHP_OS, "WIN", 3)) { + // on Windows an appropriate COM or EXE file needs to exist + $exts = array(".exe", ".com"); + $check_fn = "file_exists"; + } else { + // anywhere else we look for an executable file of that name + $exts = array(""); + $check_fn = "is_executable"; + } + + // now check the directories in the path for the program + foreach (explode(PATH_SEPARATOR, $path) as $dir) { + // skip invalid path entries + if (!file_exists($dir)) continue; + if (!is_dir($dir)) continue; + + // and now look for the file + foreach ($exts as $ext) { + if ($check_fn("$dir/$name".$ext)) return true; + } + } + + return false; + } + + + /** + * try to detect the mime type of a file + * + * @param string file path + * @return string guessed mime type + */ + function _mimetype($fspath) + { + if (@is_dir($fspath)) { + // directories are easy + return "httpd/unix-directory"; + } else if (function_exists("mime_content_type")) { + // use mime magic extension if available + $mime_type = mime_content_type($fspath); + } else if ($this->_can_execute("file")) { + // it looks like we have a 'file' command, + // lets see it it does have mime support + $fp = popen("file -i '$fspath' 2>/dev/null", "r"); + $reply = fgets($fp); + pclose($fp); + + // popen will not return an error if the binary was not found + // and find may not have mime support using "-i" + // so we test the format of the returned string + + // the reply begins with the requested filename + if (!strncmp($reply, "$fspath: ", strlen($fspath)+2)) { + $reply = substr($reply, strlen($fspath)+2); + // followed by the mime type (maybe including options) + if (preg_match('|^[[:alnum:]_-]+/[[:alnum:]_-]+;?.*|', $reply, $matches)) { + $mime_type = $matches[0]; + } + } + } + + if (empty($mime_type)) { + // Fallback solution: try to guess the type by the file extension + // TODO: add more ... + // TODO: it has been suggested to delegate mimetype detection + // to apache but this has at least three issues: + // - works only with apache + // - needs file to be within the document tree + // - requires apache mod_magic + // TODO: can we use the registry for this on Windows? + // OTOH if the server is Windos the clients are likely to + // be Windows, too, and tend do ignore the Content-Type + // anyway (overriding it with information taken from + // the registry) + // TODO: have a seperate PEAR class for mimetype detection? + switch (strtolower(strrchr(basename($fspath), "."))) { + case ".html": + $mime_type = "text/html"; + break; + case ".gif": + $mime_type = "image/gif"; + break; + case ".jpg": + $mime_type = "image/jpeg"; + break; + default: + $mime_type = "application/octet-stream"; + break; + } + } + + return $mime_type; + } + + /** + * GET method handler + * + * @param array parameter passing array + * @return bool true on success + */ + function GET(&$options) + { + // get absolute fs path to requested resource + $fspath = $this->base . $options["path"]; + + // sanity check + if (!file_exists($fspath)) return false; + + // is this a collection? + if (is_dir($fspath)) { + return $this->GetDir($fspath, $options); + } + + // detect resource type + $options['mimetype'] = $this->_mimetype($fspath); + + // detect modification time + // see rfc2518, section 13.7 + // some clients seem to treat this as a reverse rule + // requiering a Last-Modified header if the getlastmodified header was set + $options['mtime'] = filemtime($fspath); + + // detect resource size + $options['size'] = filesize($fspath); + + // no need to check result here, it is handled by the base class + if (!($options['stream'] = fopen($fspath, "r"))) + { + return '403 Forbidden'; + } + return true; + } + + /** + * GET method handler for directories + * + * This is a very simple mod_index lookalike. + * See RFC 2518, Section 8.4 on GET/HEAD for collections + * + * @param string directory path + * @return void function has to handle HTTP response itself + */ + function GetDir($fspath, &$options) + { + $path = $this->_slashify($options["path"]); + if ($path != $options["path"]) { + header("Location: ".$this->base_uri.$path); + exit; + } + + // fixed width directory column format + $format = "%15s %-19s %-s\n"; + + $handle = @opendir($fspath); + if (!$handle) { + return false; + } + + echo "Index of ".htmlspecialchars($options['path'])."\n"; + + echo "

Index of ".htmlspecialchars($options['path'])."

\n"; + + echo "
";
+        printf($format, "Size", "Last modified", "Filename");
+        echo "
"; + + while ($filename = readdir($handle)) { + if ($filename != "." && $filename != "..") { + $fullpath = $fspath.$filename; + $name = htmlspecialchars($filename); + printf($format, + number_format(filesize($fullpath)), + strftime("%Y-%m-%d %H:%M:%S", filemtime($fullpath)), + "$name"); + } + } + + echo "
"; + + closedir($handle); + + echo "\n"; + + exit; + } + + /** + * PUT method handler + * + * @param array parameter passing array + * @return bool true on success + */ + function PUT(&$options) + { + $fspath = $this->base . $options["path"]; + + if (!@is_dir(dirname($fspath))) { + return "409 Conflict"; + } + + $options["new"] = ! file_exists($fspath); + + $fp = fopen($fspath, "w"); + + return $fp; + } + + + /** + * MKCOL method handler + * + * @param array general parameter passing array + * @return bool true on success + */ + function MKCOL($options) + { + $path = $this->base .$options["path"]; + $parent = dirname($path); + $name = basename($path); + + if (!file_exists($parent)) { + return "409 Conflict"; + } + + if (!is_dir($parent)) { + return "403 Forbidden"; + } + + if ( file_exists($parent."/".$name) ) { + return "405 Method not allowed"; + } + + if (!empty($this->_SERVER["CONTENT_LENGTH"])) { // no body parsing yet + return "415 Unsupported media type"; + } + + $stat = mkdir($parent."/".$name, 0777); + if (!$stat) { + return "403 Forbidden"; + } + + return ("201 Created"); + } + + + /** + * DELETE method handler + * + * @param array general parameter passing array + * @return bool true on success + */ + function DELETE($options) + { + $path = $this->base . "/" .$options["path"]; + + if (!file_exists($path)) { + return "404 Not found"; + } + + if (is_dir($path)) { + $query = "DELETE FROM {$this->db_prefix}properties + WHERE path LIKE '".$this->_slashify($options["path"])."%'"; + mysql_query($query); + System::rm("-rf $path"); + } else { + unlink($path); + } + $query = "DELETE FROM {$this->db_prefix}properties + WHERE path = '$options[path]'"; + mysql_query($query); + + return "204 No Content"; + } + + + /** + * MOVE method handler + * + * @param array general parameter passing array + * @return bool true on success + */ + function MOVE($options) + { + return $this->COPY($options, true); + } + + /** + * COPY method handler + * + * @param array general parameter passing array + * @return bool true on success + */ + function COPY($options, $del=false) + { + // TODO Property updates still broken (Litmus should detect this?) + + if (!empty($this->_SERVER["CONTENT_LENGTH"])) { // no body parsing yet + return "415 Unsupported media type"; + } + + // no copying to different WebDAV Servers yet + if (isset($options["dest_url"])) { + return "502 bad gateway"; + } + + $source = $this->base .$options["path"]; + if (!file_exists($source)) return "404 Not found"; + + $dest = $this->base . $options["dest"]; + $new = !file_exists($dest); + $existing_col = false; + + if (!$new) { + if ($del && is_dir($dest)) { + if (!$options["overwrite"]) { + return "412 precondition failed"; + } + $dest .= basename($source); + if (file_exists($dest)) { + $options["dest"] .= basename($source); + } else { + $new = true; + $existing_col = true; + } + } + } + + if (!$new) { + if ($options["overwrite"]) { + $stat = $this->DELETE(array("path" => $options["dest"])); + if (($stat{0} != "2") && (substr($stat, 0, 3) != "404")) { + return $stat; + } + } else { + return "412 precondition failed"; + } + } + + if (is_dir($source) && ($options["depth"] != "infinity")) { + // RFC 2518 Section 9.2, last paragraph + return "400 Bad request"; + } + + if ($del) { + if (!rename($source, $dest)) { + return "500 Internal server error"; + } + $destpath = $this->_unslashify($options["dest"]); + if (is_dir($source)) { + $query = "UPDATE {$this->db_prefix}properties + SET path = REPLACE(path, '".$options["path"]."', '".$destpath."') + WHERE path LIKE '".$this->_slashify($options["path"])."%'"; + mysql_query($query); + } + + $query = "UPDATE {$this->db_prefix}properties + SET path = '".$destpath."' + WHERE path = '".$options["path"]."'"; + mysql_query($query); + } else { + if (is_dir($source)) { + $files = System::find($source); + $files = array_reverse($files); + } else { + $files = array($source); + } + + if (!is_array($files) || empty($files)) { + return "500 Internal server error"; + } + + + foreach ($files as $file) { + if (is_dir($file)) { + $file = $this->_slashify($file); + } + + $destfile = str_replace($source, $dest, $file); + + if (is_dir($file)) { + if (!is_dir($destfile)) { + // TODO "mkdir -p" here? (only natively supported by PHP 5) + if (!@mkdir($destfile)) { + return "409 Conflict"; + } + } + } else { + if (!@copy($file, $destfile)) { + return "409 Conflict"; + } + } + } + + $query = "INSERT INTO {$this->db_prefix}properties + SELECT * + FROM {$this->db_prefix}properties + WHERE path = '".$options['path']."'"; + } + + return ($new && !$existing_col) ? "201 Created" : "204 No Content"; + } + + /** + * PROPPATCH method handler + * + * @param array general parameter passing array + * @return bool true on success + */ + function PROPPATCH(&$options) + { + global $prefs, $tab; + + $msg = ""; + $path = $options["path"]; + $dir = dirname($path)."/"; + $base = basename($path); + + foreach ($options["props"] as $key => $prop) { + if ($prop["ns"] == "DAV:") { + $options["props"][$key]['status'] = "403 Forbidden"; + } else { + if (isset($prop["val"])) { + $query = "REPLACE INTO {$this->db_prefix}properties + SET path = '$options[path]' + , name = '$prop[name]' + , ns= '$prop[ns]' + , value = '$prop[val]'"; + } else { + $query = "DELETE FROM {$this->db_prefix}properties + WHERE path = '$options[path]' + AND name = '$prop[name]' + AND ns = '$prop[ns]'"; + } + mysql_query($query); + } + } + + return ""; + } + + + /** + * LOCK method handler + * + * @param array general parameter passing array + * @return bool true on success + */ + function LOCK(&$options) + { + // get absolute fs path to requested resource + $fspath = $this->base . $options["path"]; + + // TODO recursive locks on directories not supported yet + if (is_dir($fspath) && !empty($options["depth"])) { + return "409 Conflict"; + } + + $options["timeout"] = time()+300; // 5min. hardcoded + + if (isset($options["update"])) { // Lock Update + $where = "WHERE path = '$options[path]' AND token = '$options[update]'"; + + $query = "SELECT owner, exclusivelock FROM {$this->db_prefix}locks $where"; + $res = mysql_query($query); + $row = mysql_fetch_assoc($res); + mysql_free_result($res); + + if (is_array($row)) { + $query = "UPDATE {$this->db_prefix}locks + SET expires = '$options[timeout]' + , modified = ".time()." + $where"; + mysql_query($query); + + $options['owner'] = $row['owner']; + $options['scope'] = $row["exclusivelock"] ? "exclusive" : "shared"; + $options['type'] = $row["exclusivelock"] ? "write" : "read"; + + return true; + } else { + return false; + } + } + + $query = "INSERT INTO {$this->db_prefix}locks + SET token = '$options[locktoken]' + , path = '$options[path]' + , created = ".time()." + , modified = ".time()." + , owner = '$options[owner]' + , expires = '$options[timeout]' + , exclusivelock = " .($options['scope'] === "exclusive" ? "1" : "0") + ; + mysql_query($query); + + return mysql_affected_rows() ? "200 OK" : "409 Conflict"; + } + + /** + * UNLOCK method handler + * + * @param array general parameter passing array + * @return bool true on success + */ + function UNLOCK(&$options) + { + $query = "DELETE FROM {$this->db_prefix}locks + WHERE path = '$options[path]' + AND token = '$options[token]'"; + mysql_query($query); + + return mysql_affected_rows() ? "204 No Content" : "409 Conflict"; + } + + /** + * checkLock() helper + * + * @param string resource path to check for locks + * @return bool true on success + */ + function checkLock($path) + { + $result = false; + + $query = "SELECT owner, token, created, modified, expires, exclusivelock + FROM {$this->db_prefix}locks + WHERE path = '$path' + "; + $res = mysql_query($query); + + if ($res) { + $row = mysql_fetch_array($res); + mysql_free_result($res); + + if ($row) { + $result = array( "type" => "write", + "scope" => $row["exclusivelock"] ? "exclusive" : "shared", + "depth" => 0, + "owner" => $row['owner'], + "token" => $row['token'], + "created" => $row['created'], + "modified" => $row['modified'], + "expires" => $row['expires'] + ); + } + } + + return $result; + } + + + /** + * create database tables for property and lock storage + * + * @param void + * @return bool true on success + */ + function create_database() + { + // TODO + return false; + } +} + + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * indent-tabs-mode:nil + * End: + */ diff --git a/egw-pear/HTTP/WebDAV/Tools/_parse_lockinfo.php b/egw-pear/HTTP/WebDAV/Tools/_parse_lockinfo.php new file mode 100644 index 0000000000..8d33ead7c8 --- /dev/null +++ b/egw-pear/HTTP/WebDAV/Tools/_parse_lockinfo.php @@ -0,0 +1,237 @@ + | +// | Christian Stocker | +// +----------------------------------------------------------------------+ +// +// $Id: _parse_lockinfo.php,v 1.4 2006/10/10 11:53:17 hholzgra Exp $ +// + +/** + * helper class for parsing LOCK request bodies + * + * @package HTTP_WebDAV_Server + * @author Hartmut Holzgraefe + * @version @package-version@ + */ +class _parse_lockinfo +{ + /** + * success state flag + * + * @var bool + * @access public + */ + var $success = false; + + /** + * lock type, currently only "write" + * + * @var string + * @access public + */ + var $locktype = ""; + + /** + * lock scope, "shared" or "exclusive" + * + * @var string + * @access public + */ + var $lockscope = ""; + + /** + * lock owner information + * + * @var string + * @access public + */ + var $owner = ""; + + /** + * flag that is set during lock owner read + * + * @var bool + * @access private + */ + var $collect_owner = false; + + /** + * constructor + * + * @param string path of stream to read + * @access public + */ + function _parse_lockinfo($path) + { + // we assume success unless problems occur + $this->success = true; + + // remember if any input was parsed + $had_input = false; + + // open stream + $f_in = fopen($path, "r"); + if (!$f_in) { + $this->success = false; + return; + } + + // create namespace aware parser + $xml_parser = xml_parser_create_ns("UTF-8", " "); + + // set tag and data handlers + xml_set_element_handler($xml_parser, + array(&$this, "_startElement"), + array(&$this, "_endElement")); + xml_set_character_data_handler($xml_parser, + array(&$this, "_data")); + + // we want a case sensitive parser + xml_parser_set_option($xml_parser, + XML_OPTION_CASE_FOLDING, false); + + // parse input + while ($this->success && !feof($f_in)) { + $line = fgets($f_in); + if (is_string($line)) { + $had_input = true; + $this->success &= xml_parse($xml_parser, $line, false); + } + } + + // finish parsing + if ($had_input) { + $this->success &= xml_parse($xml_parser, "", true); + } + + // check if required tags where found + $this->success &= !empty($this->locktype); + $this->success &= !empty($this->lockscope); + + // free parser resource + xml_parser_free($xml_parser); + + // close input stream + fclose($f_in); + } + + + /** + * tag start handler + * + * @param resource parser + * @param string tag name + * @param array tag attributes + * @return void + * @access private + */ + function _startElement($parser, $name, $attrs) + { + // namespace handling + if (strstr($name, " ")) { + list($ns, $tag) = explode(" ", $name); + } else { + $ns = ""; + $tag = $name; + } + + + if ($this->collect_owner) { + // everything within the tag needs to be collected + $ns_short = ""; + $ns_attr = ""; + if ($ns) { + if ($ns == "DAV:") { + $ns_short = "D:"; + } else { + $ns_attr = " xmlns='$ns'"; + } + } + $this->owner .= "<$ns_short$tag$ns_attr>"; + } else if ($ns == "DAV:") { + // parse only the essential tags + switch ($tag) { + case "write": + $this->locktype = $tag; + break; + case "exclusive": + case "shared": + $this->lockscope = $tag; + break; + case "owner": + $this->collect_owner = true; + break; + } + } + } + + /** + * data handler + * + * @param resource parser + * @param string data + * @return void + * @access private + */ + function _data($parser, $data) + { + // only the tag has data content + if ($this->collect_owner) { + $this->owner .= $data; + } + } + + /** + * tag end handler + * + * @param resource parser + * @param string tag name + * @return void + * @access private + */ + function _endElement($parser, $name) + { + // namespace handling + if (strstr($name, " ")) { + list($ns, $tag) = explode(" ", $name); + } else { + $ns = ""; + $tag = $name; + } + + // finished? + if (($ns == "DAV:") && ($tag == "owner")) { + $this->collect_owner = false; + } + + // within we have to collect everything + if ($this->collect_owner) { + $ns_short = ""; + $ns_attr = ""; + if ($ns) { + if ($ns == "DAV:") { + $ns_short = "D:"; + } else { + $ns_attr = " xmlns='$ns'"; + } + } + $this->owner .= ""; + } + } +} + +?> diff --git a/egw-pear/HTTP/WebDAV/Tools/_parse_propfind.php b/egw-pear/HTTP/WebDAV/Tools/_parse_propfind.php new file mode 100644 index 0000000000..07664dbf22 --- /dev/null +++ b/egw-pear/HTTP/WebDAV/Tools/_parse_propfind.php @@ -0,0 +1,251 @@ + | +// | Christian Stocker | +// +----------------------------------------------------------------------+ +// +// $Id: _parse_propfind.php,v 1.4 2006/10/10 11:53:17 hholzgra Exp $ +// + +/** + * helper class for parsing PROPFIND request bodies + * + * @package HTTP_WebDAV_Server + * @author Hartmut Holzgraefe + * @version @package-version@ + */ +class _parse_propfind +{ + /** + * success state flag + * + * @var bool + * @access public + */ + var $success = false; + + /** + * found properties are collected here + * + * @var array + * @access public + */ + var $props = false; + + /** + * found (CalDAV) filters are collected here + * + * @var array + * @access public + */ + var $filters = false; + + /** + * found other tags, eg. CalDAV calendar-multiget href's + * + * @var array + * @access public + */ + var $other = false; + + /** + * what we are currently parsing: props or filters + * + * @var array + * @access private + */ + var $use = 'props'; + + /** + * Root tag, usually 'propfind' for PROPFIND, but can be eg. 'calendar-query' or 'calendar-multiget' for CalDAV REPORT + * + * @var array with keys 'name' and 'ns' + */ + var $root; + + /** + * internal tag nesting depth counter + * + * @var int + * @access private + */ + var $depth = 0; + + + /** + * constructor + * + * @access public + */ + function _parse_propfind($path) + { + // success state flag + $this->success = true; + + // property storage array + $this->props = array(); + + // internal tag depth counter + $this->depth = 0; + + // remember if any input was parsed + $had_input = false; + + // open input stream + $f_in = fopen($path, "r"); + if (!$f_in) { + $this->success = false; + return; + } + + // create XML parser + $xml_parser = xml_parser_create_ns("UTF-8", " "); + + // set tag and data handlers + xml_set_element_handler($xml_parser, + array(&$this, "_startElement"), + array(&$this, "_endElement")); + + xml_set_character_data_handler($xml_parser, + array(&$this,'_charData') + ); + + // we want a case sensitive parser + xml_parser_set_option($xml_parser, + XML_OPTION_CASE_FOLDING, false); + + + // parse input + while ($this->success && !feof($f_in)) { + $line = fgets($f_in); + if (is_string($line)) { + $had_input = true; + $this->success &= xml_parse($xml_parser, $line, false); + } + } + + // finish parsing + if ($had_input) { + $this->success &= xml_parse($xml_parser, "", true); + } + + // free parser + xml_parser_free($xml_parser); + + // close input stream + fclose($f_in); + + // if no input was parsed it was a request + if(!count($this->props)) $this->props = "all"; // default + } + + + /** + * start tag handler + * + * @access private + * @param resource parser + * @param string tag name + * @param array tag attributes + */ + function _startElement($parser, $name, $attrs) + { + // name space handling + if (strstr($name, " ")) { + list($ns, $tag) = explode(" ", $name); + if ($ns == "") + $this->success = false; + } else { + $ns = ""; + $tag = $name; + } + + // record root tag + if ($this->depth == 0) { + $this->root = array('name' => $tag, 'xmlns' => $ns); + } + + // special tags at level 1: and + if ($this->depth == 1) { + $this->use = 'props'; + switch ($tag) + { + case "allprop": + $this->props = "all"; + break; + case "propname": + $this->props = "names"; + break; + case 'prop': + break; + case 'filter': + $this->use = 'filters'; + break; + default: + $this->use = 'other'; + break; + } + } + + // requested properties are found at level 2 + // CalDAV filters can be at deeper levels too and we need the attrs, same for other tags (eg. multiget href's) + if ($this->depth == 2 || $this->use == 'filters' && $this->depth >= 2 || $this->use == 'other') { + $prop = array("name" => $tag); + if ($ns) + $prop["xmlns"] = $ns; + if ($this->use != 'props') { + $prop['attrs'] = $attrs; + $prop['depth'] = $this->depth; + } + // this can happen if we have allprop and prop in one propfind: + // , eg. blah is not automatic returned by allprop + if (!is_array($this->{$this->use}) && $this->{$this->use}) $this->{$this->use} = array($this->{$this->use}); + $this->{$this->use}[] = $prop; + } + + // increment depth count + $this->depth++; + } + + + /** + * end tag handler + * + * @access private + * @param resource parser + * @param string tag name + */ + function _endElement($parser, $name) + { + // here we only need to decrement the depth count + $this->depth--; + } + + + /** + * char data handler for non prop tags, eg. href's in CalDAV multiget, or filter contents + * + * @access private + * @param resource parser + * @param string character data + */ + function _charData($parser, $data) + { + if ($this->use != 'props' && ($n = count($this->{$this->use})) && ($data = trim($data))) { + $this->{$this->use}[$n-1]['data'] = $data; + } + } +} diff --git a/egw-pear/HTTP/WebDAV/Tools/_parse_proppatch.php b/egw-pear/HTTP/WebDAV/Tools/_parse_proppatch.php new file mode 100644 index 0000000000..396c3e34a4 --- /dev/null +++ b/egw-pear/HTTP/WebDAV/Tools/_parse_proppatch.php @@ -0,0 +1,223 @@ + | +// | Christian Stocker | +// +----------------------------------------------------------------------+ +// +// $Id: _parse_proppatch.php,v 1.6 2006/10/10 11:53:17 hholzgra Exp $ +// + +/** + * helper class for parsing PROPPATCH request bodies + * + * @package HTTP_WebDAV_Server + * @author Hartmut Holzgraefe + * @version @package-version@ + */ +class _parse_proppatch +{ + /** + * + * + * @var + * @access + */ + var $success; + + /** + * + * + * @var + * @access + */ + var $props; + + /** + * + * + * @var + * @access + */ + var $depth; + + /** + * + * + * @var + * @access + */ + var $mode; + + /** + * + * + * @var + * @access + */ + var $current; + + /** + * constructor + * + * @param string path of input stream + * @access public + */ + function _parse_proppatch($path) + { + $this->success = true; + + $this->depth = 0; + $this->props = array(); + $had_input = false; + + $f_in = fopen($path, "r"); + if (!$f_in) { + $this->success = false; + return; + } + + $xml_parser = xml_parser_create_ns("UTF-8", " "); + + xml_set_element_handler($xml_parser, + array(&$this, "_startElement"), + array(&$this, "_endElement")); + + xml_set_character_data_handler($xml_parser, + array(&$this, "_data")); + + xml_parser_set_option($xml_parser, + XML_OPTION_CASE_FOLDING, false); + + while($this->success && !feof($f_in)) { + $line = fgets($f_in); + if (is_string($line)) { + $had_input = true; + $this->success &= xml_parse($xml_parser, $line, false); + } + } + + if($had_input) { + $this->success &= xml_parse($xml_parser, "", true); + } + + xml_parser_free($xml_parser); + + fclose($f_in); + } + + /** + * tag start handler + * + * @param resource parser + * @param string tag name + * @param array tag attributes + * @return void + * @access private + */ + function _startElement($parser, $name, $attrs) + { + if (strstr($name, " ")) { + list($ns, $tag) = explode(" ", $name); + if ($ns == "") + $this->success = false; + } else { + $ns = ""; + $tag = $name; + } + + if ($this->depth == 1) { + $this->mode = $tag; + } + + if ($this->depth == 3) { + $prop = array("name" => $tag); + $this->current = array("name" => $tag, "ns" => $ns, "status"=> 200); + if ($this->mode == "set") { + $this->current["val"] = ""; // default set val + } + } + + if ($this->depth >= 4) { + $this->current["val"] .= "<$tag"; + if (isset($attr)) { + foreach ($attr as $key => $val) { + $this->current["val"] .= ' '.$key.'="'.str_replace('"','"', $val).'"'; + } + } + $this->current["val"] .= ">"; + } + + + + $this->depth++; + } + + /** + * tag end handler + * + * @param resource parser + * @param string tag name + * @return void + * @access private + */ + function _endElement($parser, $name) + { + if (strstr($name, " ")) { + list($ns, $tag) = explode(" ", $name); + if ($ns == "") + $this->success = false; + } else { + $ns = ""; + $tag = $name; + } + + $this->depth--; + + if ($this->depth >= 4) { + $this->current["val"] .= ""; + } + + if ($this->depth == 3) { + if (isset($this->current)) { + $this->props[] = $this->current; + unset($this->current); + } + } + } + + /** + * input data handler + * + * @param resource parser + * @param string data + * @return void + * @access private + */ + function _data($parser, $data) + { + if (isset($this->current)) { + $this->current["val"] .= $data; + } + } +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * indent-tabs-mode:nil + * End: + */ diff --git a/egw-pear/Log.php b/egw-pear/Log.php new file mode 100644 index 0000000000..7f2494df03 --- /dev/null +++ b/egw-pear/Log.php @@ -0,0 +1,824 @@ + + * @author Jon Parise + * @since Horde 1.3 + * @package Log + */ +class Log +{ + /** + * Indicates whether or not the log can been opened / connected. + * + * @var boolean + * @access private + */ + var $_opened = false; + + /** + * Instance-specific unique identification number. + * + * @var integer + * @access private + */ + var $_id = 0; + + /** + * The label that uniquely identifies this set of log messages. + * + * @var string + * @access private + */ + var $_ident = ''; + + /** + * The default priority to use when logging an event. + * + * @var integer + * @access private + */ + var $_priority = PEAR_LOG_INFO; + + /** + * The bitmask of allowed log levels. + * + * @var integer + * @access private + */ + var $_mask = PEAR_LOG_ALL; + + /** + * Holds all Log_observer objects that wish to be notified of new messages. + * + * @var array + * @access private + */ + var $_listeners = array(); + + /** + * Maps canonical format keys to position arguments for use in building + * "line format" strings. + * + * @var array + * @access private + */ + var $_formatMap = array('%{timestamp}' => '%1$s', + '%{ident}' => '%2$s', + '%{priority}' => '%3$s', + '%{message}' => '%4$s', + '%{file}' => '%5$s', + '%{line}' => '%6$s', + '%{function}' => '%7$s', + '%\{' => '%%{'); + + + /** + * Attempts to return a concrete Log instance of type $handler. + * + * @param string $handler The type of concrete Log subclass to return. + * Attempt to dynamically include the code for + * this subclass. Currently, valid values are + * 'console', 'syslog', 'sql', 'file', and 'mcal'. + * + * @param string $name The name of the actually log file, table, or + * other specific store to use. Defaults to an + * empty string, with which the subclass will + * attempt to do something intelligent. + * + * @param string $ident The identity reported to the log system. + * + * @param array $conf A hash containing any additional configuration + * information that a subclass might need. + * + * @param int $level Log messages up to and including this level. + * + * @return object Log The newly created concrete Log instance, or + * null on an error. + * @access public + * @since Log 1.0 + */ + function &factory($handler, $name = '', $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + $handler = strtolower($handler); + $class = 'Log_' . $handler; + $classfile = 'Log/' . $handler . '.php'; + + /* + * Attempt to include our version of the named class, but don't treat + * a failure as fatal. The caller may have already included their own + * version of the named class. + */ + if (!class_exists($class)) { + include_once $classfile; + } + + /* If the class exists, return a new instance of it. */ + if (class_exists($class)) { + $obj = new $class($name, $ident, $conf, $level); + return $obj; + } + + $null = null; + return $null; + } + + /** + * Attempts to return a reference to a concrete Log instance of type + * $handler, only creating a new instance if no log instance with the same + * parameters currently exists. + * + * You should use this if there are multiple places you might create a + * logger, you don't want to create multiple loggers, and you don't want to + * check for the existance of one each time. The singleton pattern does all + * the checking work for you. + * + * You MUST call this method with the $var = &Log::singleton() syntax. + * Without the ampersand (&) in front of the method name, you will not get + * a reference, you will get a copy. + * + * @param string $handler The type of concrete Log subclass to return. + * Attempt to dynamically include the code for + * this subclass. Currently, valid values are + * 'console', 'syslog', 'sql', 'file', and 'mcal'. + * + * @param string $name The name of the actually log file, table, or + * other specific store to use. Defaults to an + * empty string, with which the subclass will + * attempt to do something intelligent. + * + * @param string $ident The identity reported to the log system. + * + * @param array $conf A hash containing any additional configuration + * information that a subclass might need. + * + * @param int $level Log messages up to and including this level. + * + * @return object Log The newly created concrete Log instance, or + * null on an error. + * @access public + * @since Log 1.0 + */ + function &singleton($handler, $name = '', $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + static $instances; + if (!isset($instances)) $instances = array(); + + $signature = serialize(array($handler, $name, $ident, $conf, $level)); + if (!isset($instances[$signature])) { + $instances[$signature] = &Log::factory($handler, $name, $ident, + $conf, $level); + } + + return $instances[$signature]; + } + + /** + * Abstract implementation of the open() method. + * @since Log 1.0 + */ + function open() + { + return false; + } + + /** + * Abstract implementation of the close() method. + * @since Log 1.0 + */ + function close() + { + return false; + } + + /** + * Abstract implementation of the flush() method. + * @since Log 1.8.2 + */ + function flush() + { + return false; + } + + /** + * Abstract implementation of the log() method. + * @since Log 1.0 + */ + function log($message, $priority = null) + { + return false; + } + + /** + * A convenience function for logging a emergency event. It will log a + * message at the PEAR_LOG_EMERG log level. + * + * @param mixed $message String or object containing the message + * to log. + * + * @return boolean True if the message was successfully logged. + * + * @access public + * @since Log 1.7.0 + */ + function emerg($message) + { + return $this->log($message, PEAR_LOG_EMERG); + } + + /** + * A convenience function for logging an alert event. It will log a + * message at the PEAR_LOG_ALERT log level. + * + * @param mixed $message String or object containing the message + * to log. + * + * @return boolean True if the message was successfully logged. + * + * @access public + * @since Log 1.7.0 + */ + function alert($message) + { + return $this->log($message, PEAR_LOG_ALERT); + } + + /** + * A convenience function for logging a critical event. It will log a + * message at the PEAR_LOG_CRIT log level. + * + * @param mixed $message String or object containing the message + * to log. + * + * @return boolean True if the message was successfully logged. + * + * @access public + * @since Log 1.7.0 + */ + function crit($message) + { + return $this->log($message, PEAR_LOG_CRIT); + } + + /** + * A convenience function for logging a error event. It will log a + * message at the PEAR_LOG_ERR log level. + * + * @param mixed $message String or object containing the message + * to log. + * + * @return boolean True if the message was successfully logged. + * + * @access public + * @since Log 1.7.0 + */ + function err($message) + { + return $this->log($message, PEAR_LOG_ERR); + } + + /** + * A convenience function for logging a warning event. It will log a + * message at the PEAR_LOG_WARNING log level. + * + * @param mixed $message String or object containing the message + * to log. + * + * @return boolean True if the message was successfully logged. + * + * @access public + * @since Log 1.7.0 + */ + function warning($message) + { + return $this->log($message, PEAR_LOG_WARNING); + } + + /** + * A convenience function for logging a notice event. It will log a + * message at the PEAR_LOG_NOTICE log level. + * + * @param mixed $message String or object containing the message + * to log. + * + * @return boolean True if the message was successfully logged. + * + * @access public + * @since Log 1.7.0 + */ + function notice($message) + { + return $this->log($message, PEAR_LOG_NOTICE); + } + + /** + * A convenience function for logging a information event. It will log a + * message at the PEAR_LOG_INFO log level. + * + * @param mixed $message String or object containing the message + * to log. + * + * @return boolean True if the message was successfully logged. + * + * @access public + * @since Log 1.7.0 + */ + function info($message) + { + return $this->log($message, PEAR_LOG_INFO); + } + + /** + * A convenience function for logging a debug event. It will log a + * message at the PEAR_LOG_DEBUG log level. + * + * @param mixed $message String or object containing the message + * to log. + * + * @return boolean True if the message was successfully logged. + * + * @access public + * @since Log 1.7.0 + */ + function debug($message) + { + return $this->log($message, PEAR_LOG_DEBUG); + } + + /** + * Returns the string representation of the message data. + * + * If $message is an object, _extractMessage() will attempt to extract + * the message text using a known method (such as a PEAR_Error object's + * getMessage() method). If a known method, cannot be found, the + * serialized representation of the object will be returned. + * + * If the message data is already a string, it will be returned unchanged. + * + * @param mixed $message The original message data. This may be a + * string or any object. + * + * @return string The string representation of the message. + * + * @access private + */ + function _extractMessage($message) + { + /* + * If we've been given an object, attempt to extract the message using + * a known method. If we can't find such a method, default to the + * "human-readable" version of the object. + * + * We also use the human-readable format for arrays. + */ + if (is_object($message)) { + if (method_exists($message, 'getmessage')) { + $message = $message->getMessage(); + } else if (method_exists($message, 'tostring')) { + $message = $message->toString(); + } else if (method_exists($message, '__tostring')) { + if (version_compare(PHP_VERSION, '5.0.0', 'ge')) { + $message = (string)$message; + } else { + $message = $message->__toString(); + } + } else { + $message = print_r($message, true); + } + } else if (is_array($message)) { + if (isset($message['message'])) { + $message = $message['message']; + } else { + $message = print_r($message, true); + } + } + + /* Otherwise, we assume the message is a string. */ + return $message; + } + + /** + * Using debug_backtrace(), returns the file, line, and enclosing function + * name of the source code context from which log() was invoked. + * + * @param int $depth The initial number of frames we should step + * back into the trace. + * + * @return array Array containing three strings: the filename, the line, + * and the function name from which log() was called. + * + * @access private + * @since Log 1.9.4 + */ + function _getBacktraceVars($depth) + { + /* Start by generating a backtrace from the current call (here). */ + $backtrace = debug_backtrace(); + + /* + * If we were ultimately invoked by the composite handler, we need to + * increase our depth one additional level to compensate. + */ + if (strcasecmp(@$backtrace[$depth+1]['class'], 'Log_composite') == 0) { + $depth++; + } + + /* + * We're interested in the frame which invoked the log() function, so + * we need to walk back some number of frames into the backtrace. The + * $depth parameter tells us where to start looking. We go one step + * further back to find the name of the encapsulating function from + * which log() was called. + */ + $file = @$backtrace[$depth]['file']; + $line = @$backtrace[$depth]['line']; + $func = @$backtrace[$depth + 1]['function']; + + /* + * However, if log() was called from one of our "shortcut" functions, + * we're going to need to go back an additional step. + */ + if (in_array($func, array('emerg', 'alert', 'crit', 'err', 'warning', + 'notice', 'info', 'debug'))) { + $file = @$backtrace[$depth + 1]['file']; + $line = @$backtrace[$depth + 1]['line']; + $func = @$backtrace[$depth + 2]['function']; + } + + /* + * If we couldn't extract a function name (perhaps because we were + * executed from the "main" context), provide a default value. + */ + if (is_null($func)) { + $func = '(none)'; + } + + /* Return a 3-tuple containing (file, line, function). */ + return array($file, $line, $func); + } + + /** + * Produces a formatted log line based on a format string and a set of + * variables representing the current log record and state. + * + * @return string Formatted log string. + * + * @access private + * @since Log 1.9.4 + */ + function _format($format, $timestamp, $priority, $message) + { + /* + * If the format string references any of the backtrace-driven + * variables (%5, %6, %7), generate the backtrace and fetch them. + */ + if (strpos($format, '%5') || strpos($format, '%6') || strpos($format, '%7')) { + list($file, $line, $func) = $this->_getBacktraceVars(2); + } + + /* + * Build the formatted string. We use the sprintf() function's + * "argument swapping" capability to dynamically select and position + * the variables which will ultimately appear in the log string. + */ + return sprintf($format, + $timestamp, + $this->_ident, + $this->priorityToString($priority), + $message, + isset($file) ? $file : '', + isset($line) ? $line : '', + isset($func) ? $func : ''); + } + + /** + * Returns the string representation of a PEAR_LOG_* integer constant. + * + * @param int $priority A PEAR_LOG_* integer constant. + * + * @return string The string representation of $level. + * + * @since Log 1.0 + */ + function priorityToString($priority) + { + $levels = array( + PEAR_LOG_EMERG => 'emergency', + PEAR_LOG_ALERT => 'alert', + PEAR_LOG_CRIT => 'critical', + PEAR_LOG_ERR => 'error', + PEAR_LOG_WARNING => 'warning', + PEAR_LOG_NOTICE => 'notice', + PEAR_LOG_INFO => 'info', + PEAR_LOG_DEBUG => 'debug' + ); + + return $levels[$priority]; + } + + /** + * Returns the the PEAR_LOG_* integer constant for the given string + * representation of a priority name. This function performs a + * case-insensitive search. + * + * @param string $name String containing a priority name. + * + * @return string The PEAR_LOG_* integer contstant corresponding + * the the specified priority name. + * + * @since Log 1.9.0 + */ + function stringToPriority($name) + { + $levels = array( + 'emergency' => PEAR_LOG_EMERG, + 'alert' => PEAR_LOG_ALERT, + 'critical' => PEAR_LOG_CRIT, + 'error' => PEAR_LOG_ERR, + 'warning' => PEAR_LOG_WARNING, + 'notice' => PEAR_LOG_NOTICE, + 'info' => PEAR_LOG_INFO, + 'debug' => PEAR_LOG_DEBUG + ); + + return $levels[strtolower($name)]; + } + + /** + * Calculate the log mask for the given priority. + * + * This method may be called statically. + * + * @param integer $priority The priority whose mask will be calculated. + * + * @return integer The calculated log mask. + * + * @access public + * @since Log 1.7.0 + */ + function MASK($priority) + { + return (1 << $priority); + } + + /** + * Calculate the log mask for all priorities up to the given priority. + * + * This method may be called statically. + * + * @param integer $priority The maximum priority covered by this mask. + * + * @return integer The resulting log mask. + * + * @access public + * @since Log 1.7.0 + * + * @deprecated deprecated since Log 1.9.4; use Log::MAX() instead + */ + function UPTO($priority) + { + return Log::MAX($priority); + } + + /** + * Calculate the log mask for all priorities greater than or equal to the + * given priority. In other words, $priority will be the lowest priority + * matched by the resulting mask. + * + * This method may be called statically. + * + * @param integer $priority The minimum priority covered by this mask. + * + * @return integer The resulting log mask. + * + * @access public + * @since Log 1.9.4 + */ + function MIN($priority) + { + return PEAR_LOG_ALL ^ ((1 << $priority) - 1); + } + + /** + * Calculate the log mask for all priorities less than or equal to the + * given priority. In other words, $priority will be the highests priority + * matched by the resulting mask. + * + * This method may be called statically. + * + * @param integer $priority The maximum priority covered by this mask. + * + * @return integer The resulting log mask. + * + * @access public + * @since Log 1.9.4 + */ + function MAX($priority) + { + return ((1 << ($priority + 1)) - 1); + } + + /** + * Set and return the level mask for the current Log instance. + * + * @param integer $mask A bitwise mask of log levels. + * + * @return integer The current level mask. + * + * @access public + * @since Log 1.7.0 + */ + function setMask($mask) + { + $this->_mask = $mask; + + return $this->_mask; + } + + /** + * Returns the current level mask. + * + * @return interger The current level mask. + * + * @access public + * @since Log 1.7.0 + */ + function getMask() + { + return $this->_mask; + } + + /** + * Check if the given priority is included in the current level mask. + * + * @param integer $priority The priority to check. + * + * @return boolean True if the given priority is included in the current + * log mask. + * + * @access private + * @since Log 1.7.0 + */ + function _isMasked($priority) + { + return (Log::MASK($priority) & $this->_mask); + } + + /** + * Returns the current default priority. + * + * @return integer The current default priority. + * + * @access public + * @since Log 1.8.4 + */ + function getPriority() + { + return $this->_priority; + } + + /** + * Sets the default priority to the specified value. + * + * @param integer $priority The new default priority. + * + * @access public + * @since Log 1.8.4 + */ + function setPriority($priority) + { + $this->_priority = $priority; + } + + /** + * Adds a Log_observer instance to the list of observers that are listening + * for messages emitted by this Log instance. + * + * @param object $observer The Log_observer instance to attach as a + * listener. + * + * @param boolean True if the observer is successfully attached. + * + * @access public + * @since Log 1.0 + */ + function attach(&$observer) + { + if (!is_a($observer, 'Log_observer')) { + return false; + } + + $this->_listeners[$observer->_id] = &$observer; + + return true; + } + + /** + * Removes a Log_observer instance from the list of observers. + * + * @param object $observer The Log_observer instance to detach from + * the list of listeners. + * + * @param boolean True if the observer is successfully detached. + * + * @access public + * @since Log 1.0 + */ + function detach($observer) + { + if (!is_a($observer, 'Log_observer') || + !isset($this->_listeners[$observer->_id])) { + return false; + } + + unset($this->_listeners[$observer->_id]); + + return true; + } + + /** + * Informs each registered observer instance that a new message has been + * logged. + * + * @param array $event A hash describing the log event. + * + * @access private + */ + function _announce($event) + { + foreach ($this->_listeners as $id => $listener) { + if ($event['priority'] <= $this->_listeners[$id]->_priority) { + $this->_listeners[$id]->notify($event); + } + } + } + + /** + * Indicates whether this is a composite class. + * + * @return boolean True if this is a composite class. + * + * @access public + * @since Log 1.0 + */ + function isComposite() + { + return false; + } + + /** + * Sets this Log instance's identification string. + * + * @param string $ident The new identification string. + * + * @access public + * @since Log 1.6.3 + */ + function setIdent($ident) + { + $this->_ident = $ident; + } + + /** + * Returns the current identification string. + * + * @return string The current Log instance's identification string. + * + * @access public + * @since Log 1.6.3 + */ + function getIdent() + { + return $this->_ident; + } +} diff --git a/egw-pear/Log/composite.php b/egw-pear/Log/composite.php new file mode 100644 index 0000000000..98a1d814ca --- /dev/null +++ b/egw-pear/Log/composite.php @@ -0,0 +1,231 @@ + + * @author Jon Parise + * + * @since Horde 1.3 + * @since Log 1.0 + * @package Log + * + * @example composite.php Using the composite handler. + */ +class Log_composite extends Log +{ + /** + * Array holding all of the Log instances to which log events should be + * sent. + * + * @var array + * @access private + */ + var $_children = array(); + + + /** + * Constructs a new composite Log object. + * + * @param boolean $name This parameter is ignored. + * @param boolean $ident This parameter is ignored. + * @param boolean $conf This parameter is ignored. + * @param boolean $level This parameter is ignored. + * + * @access public + */ + function Log_composite($name, $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + $this->_ident = $ident; + } + + /** + * Opens all of the child instances. + * + * @return True if all of the child instances were successfully opened. + * + * @access public + */ + function open() + { + /* Attempt to open each of our children. */ + $this->_opened = true; + foreach ($this->_children as $id => $child) { + $this->_opened &= $this->_children[$id]->open(); + } + + /* If all children were opened, return success. */ + return $this->_opened; + } + + /** + * Closes all of the child instances. + * + * @return True if all of the child instances were successfully closed. + * + * @access public + */ + function close() + { + /* Attempt to close each of our children. */ + $closed = true; + foreach ($this->_children as $id => $child) { + $closed &= $this->_children[$id]->close(); + } + + /* Track the _opened state for consistency. */ + $this->_opened = false; + + /* If all children were closed, return success. */ + return $closed; + } + + /** + * Flushes all child instances. It is assumed that all of the children + * have been successfully opened. + * + * @return True if all of the child instances were successfully flushed. + * + * @access public + * @since Log 1.8.2 + */ + function flush() + { + /* Attempt to flush each of our children. */ + $flushed = true; + foreach ($this->_children as $id => $child) { + $flushed &= $this->_children[$id]->flush(); + } + + /* If all children were flushed, return success. */ + return $flushed; + } + + /** + * Sends $message and $priority to each child of this composite. If the + * children aren't already open, they will be opened here. + * + * @param mixed $message String or object containing the message + * to log. + * @param string $priority (optional) The priority of the message. + * Valid values are: PEAR_LOG_EMERG, + * PEAR_LOG_ALERT, PEAR_LOG_CRIT, + * PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and + * PEAR_LOG_DEBUG. + * + * @return boolean True if the entry is successfully logged. + * + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* + * If the handlers haven't been opened, attempt to open them now. + * However, we don't treat failure to open all of the handlers as a + * fatal error. We defer that consideration to the success of calling + * each handler's log() method below. + */ + if (!$this->_opened) { + $this->open(); + } + + /* Attempt to log the event using each of the children. */ + $success = true; + foreach ($this->_children as $id => $child) { + $success &= $this->_children[$id]->log($message, $priority); + } + + $this->_announce(array('priority' => $priority, 'message' => $message)); + + /* Return success if all of the children logged the event. */ + return $success; + } + + /** + * Returns true if this is a composite. + * + * @return boolean True if this is a composite class. + * + * @access public + */ + function isComposite() + { + return true; + } + + /** + * Sets this identification string for all of this composite's children. + * + * @param string $ident The new identification string. + * + * @access public + * @since Log 1.6.7 + */ + function setIdent($ident) + { + /* Call our base class's setIdent() method. */ + parent::setIdent($ident); + + /* ... and then call setIdent() on all of our children. */ + foreach ($this->_children as $id => $child) { + $this->_children[$id]->setIdent($ident); + } + } + + /** + * Adds a Log instance to the list of children. + * + * @param object $child The Log instance to add. + * + * @return boolean True if the Log instance was successfully added. + * + * @access public + */ + function addChild(&$child) + { + /* Make sure this is a Log instance. */ + if (!is_a($child, 'Log')) { + return false; + } + + $this->_children[$child->_id] = &$child; + + return true; + } + + /** + * Removes a Log instance from the list of children. + * + * @param object $child The Log instance to remove. + * + * @return boolean True if the Log instance was successfully removed. + * + * @access public + */ + function removeChild($child) + { + if (!is_a($child, 'Log') || !isset($this->_children[$child->_id])) { + return false; + } + + unset($this->_children[$child->_id]); + + return true; + } + +} diff --git a/egw-pear/Log/console.php b/egw-pear/Log/console.php new file mode 100644 index 0000000000..0b2863dd2c --- /dev/null +++ b/egw-pear/Log/console.php @@ -0,0 +1,204 @@ + + * @since Log 1.1 + * @package Log + * + * @example console.php Using the console handler. + */ +class Log_console extends Log +{ + /** + * Handle to the current output stream. + * @var resource + * @access private + */ + var $_stream = STDOUT; + + /** + * Should the output be buffered or displayed immediately? + * @var string + * @access private + */ + var $_buffering = false; + + /** + * String holding the buffered output. + * @var string + * @access private + */ + var $_buffer = ''; + + /** + * String containing the format of a log line. + * @var string + * @access private + */ + var $_lineFormat = '%1$s %2$s [%3$s] %4$s'; + + /** + * String containing the timestamp format. It will be passed directly to + * strftime(). Note that the timestamp string will generated using the + * current locale. + * @var string + * @access private + */ + var $_timeFormat = '%b %d %H:%M:%S'; + + /** + * Constructs a new Log_console object. + * + * @param string $name Ignored. + * @param string $ident The identity string. + * @param array $conf The configuration array. + * @param int $level Log messages up to and including this level. + * @access public + */ + function Log_console($name, $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + $this->_id = md5(microtime()); + $this->_ident = $ident; + $this->_mask = Log::UPTO($level); + + if (!empty($conf['stream'])) { + $this->_stream = $conf['stream']; + } + + if (isset($conf['buffering'])) { + $this->_buffering = $conf['buffering']; + } + + if (!empty($conf['lineFormat'])) { + $this->_lineFormat = str_replace(array_keys($this->_formatMap), + array_values($this->_formatMap), + $conf['lineFormat']); + } + + if (!empty($conf['timeFormat'])) { + $this->_timeFormat = $conf['timeFormat']; + } + + /* + * If output buffering has been requested, we need to register a + * shutdown function that will dump the buffer upon termination. + */ + if ($this->_buffering) { + register_shutdown_function(array(&$this, '_Log_console')); + } + } + + /** + * Destructor + */ + function _Log_console() + { + $this->close(); + } + + /** + * Open the output stream. + * + * @access public + * @since Log 1.9.7 + */ + function open() + { + $this->_opened = true; + return true; + } + + /** + * Closes the output stream. + * + * This results in a call to flush(). + * + * @access public + * @since Log 1.9.0 + */ + function close() + { + $this->flush(); + $this->_opened = false; + return true; + } + + /** + * Flushes all pending ("buffered") data to the output stream. + * + * @access public + * @since Log 1.8.2 + */ + function flush() + { + /* + * If output buffering is enabled, dump the contents of the buffer to + * the output stream. + */ + if ($this->_buffering && (strlen($this->_buffer) > 0)) { + fwrite($this->_stream, $this->_buffer); + $this->_buffer = ''; + } + + return fflush($this->_stream); + } + + /** + * Writes $message to the text console. Also, passes the message + * along to any Log_observer instances that are observing this Log. + * + * @param mixed $message String or object containing the message to log. + * @param string $priority The priority of the message. Valid + * values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT, + * PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG. + * @return boolean True on success or false on failure. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + /* Extract the string representation of the message. */ + $message = $this->_extractMessage($message); + + /* Build the string containing the complete log line. */ + $line = $this->_format($this->_lineFormat, + strftime($this->_timeFormat), + $priority, $message) . "\n"; + + /* + * If buffering is enabled, append this line to the output buffer. + * Otherwise, print the line to the output stream immediately. + */ + if ($this->_buffering) { + $this->_buffer .= $line; + } else { + fwrite($this->_stream, $line); + } + + /* Notify observers about this log message. */ + $this->_announce(array('priority' => $priority, 'message' => $message)); + + return true; + } + +} diff --git a/egw-pear/Log/daemon.php b/egw-pear/Log/daemon.php new file mode 100644 index 0000000000..9873f2a400 --- /dev/null +++ b/egw-pear/Log/daemon.php @@ -0,0 +1,230 @@ + + * @version $Revision: 1.2 $ + * @package Log + */ +class Log_daemon extends Log +{ + /** + * Integer holding the log facility to use. + * @var string + */ + var $_name = LOG_DAEMON; + + /** + * Var holding the resource pointer to the socket + * @var resource + */ + var $_socket; + + /** + * The ip address or servername + * @see http://www.php.net/manual/en/transports.php + * @var string + */ + var $_ip = '127.0.0.1'; + + /** + * Protocol to use (tcp, udp, etc.) + * @see http://www.php.net/manual/en/transports.php + * @var string + */ + var $_proto = 'udp'; + + /** + * Port to connect to + * @var int + */ + var $_port = 514; + + /** + * Maximum message length in bytes + * @var int + */ + var $_maxsize = 4096; + + /** + * Socket timeout in seconds + * @var int + */ + var $_timeout = 1; + + + /** + * Constructs a new syslog object. + * + * @param string $name The syslog facility. + * @param string $ident The identity string. + * @param array $conf The configuration array. + * @param int $maxLevel Maximum level at which to log. + * @access public + */ + function Log_daemon($name, $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + /* Ensure we have a valid integer value for $name. */ + if (empty($name) || !is_int($name)) { + $name = LOG_SYSLOG; + } + + $this->_id = md5(microtime()); + $this->_name = $name; + $this->_ident = $ident; + $this->_mask = Log::UPTO($level); + + if (isset($conf['ip'])) { + $this->_ip = $conf['ip']; + } + if (isset($conf['proto'])) { + $this->_proto = $conf['proto']; + } + if (isset($conf['port'])) { + $this->_port = $conf['port']; + } + if (isset($conf['maxsize'])) { + $this->_maxsize = $conf['maxsize']; + } + if (isset($conf['timeout'])) { + $this->_timeout = $conf['timeout']; + } + $this->_proto = $this->_proto . '://'; + + register_shutdown_function(array(&$this, '_Log_daemon')); + } + + /** + * Destructor. + * + * @access private + */ + function _Log_daemon() + { + $this->close(); + } + + /** + * Opens a connection to the system logger, if it has not already + * been opened. This is implicitly called by log(), if necessary. + * @access public + */ + function open() + { + if (!$this->_opened) { + $this->_opened = (bool)($this->_socket = @fsockopen( + $this->_proto . $this->_ip, + $this->_port, + $errno, + $errstr, + $this->_timeout)); + } + return $this->_opened; + } + + /** + * Closes the connection to the system logger, if it is open. + * @access public + */ + function close() + { + if ($this->_opened) { + $this->_opened = false; + return fclose($this->_socket); + } + return true; + } + + /** + * Sends $message to the currently open syslog connection. Calls + * open() if necessary. Also passes the message along to any Log_observer + * instances that are observing this Log. + * + * @param string $message The textual message to be logged. + * @param int $priority (optional) The priority of the message. Valid + * values are: LOG_EMERG, LOG_ALERT, LOG_CRIT, + * LOG_ERR, LOG_WARNING, LOG_NOTICE, LOG_INFO, + * and LOG_DEBUG. The default is LOG_INFO. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + /* If the connection isn't open and can't be opened, return failure. */ + if (!$this->_opened && !$this->open()) { + return false; + } + + /* Extract the string representation of the message. */ + $message = $this->_extractMessage($message); + + /* Set the facility level. */ + $facility_level = intval($this->_name) + + intval($this->_toSyslog($priority)); + + /* Prepend ident info. */ + if (!empty($this->_ident)) { + $message = $this->_ident . ' ' . $message; + } + + /* Check for message length. */ + if (strlen($message) > $this->_maxsize) { + $message = substr($message, 0, ($this->_maxsize) - 10) . ' [...]'; + } + + /* Write to socket. */ + fwrite($this->_socket, '<' . $facility_level . '>' . $message . "\n"); + + $this->_announce(array('priority' => $priority, 'message' => $message)); + } + + /** + * Converts a PEAR_LOG_* constant into a syslog LOG_* constant. + * + * This function exists because, under Windows, not all of the LOG_* + * constants have unique values. Instead, the PEAR_LOG_* were introduced + * for global use, with the conversion to the LOG_* constants kept local to + * to the syslog driver. + * + * @param int $priority PEAR_LOG_* value to convert to LOG_* value. + * + * @return The LOG_* representation of $priority. + * + * @access private + */ + function _toSyslog($priority) + { + static $priorities = array( + PEAR_LOG_EMERG => LOG_EMERG, + PEAR_LOG_ALERT => LOG_ALERT, + PEAR_LOG_CRIT => LOG_CRIT, + PEAR_LOG_ERR => LOG_ERR, + PEAR_LOG_WARNING => LOG_WARNING, + PEAR_LOG_NOTICE => LOG_NOTICE, + PEAR_LOG_INFO => LOG_INFO, + PEAR_LOG_DEBUG => LOG_DEBUG + ); + + /* If we're passed an unknown priority, default to LOG_INFO. */ + if (!is_int($priority) || !in_array($priority, $priorities)) { + return LOG_INFO; + } + + return $priorities[$priority]; + } + +} diff --git a/egw-pear/Log/display.php b/egw-pear/Log/display.php new file mode 100644 index 0000000000..31ad1e7daa --- /dev/null +++ b/egw-pear/Log/display.php @@ -0,0 +1,141 @@ + + * @since Log 1.8.0 + * @package Log + * + * @example display.php Using the display handler. + */ +class Log_display extends Log +{ + /** + * String to output before an error message + * @var string + * @access private + */ + var $_error_prepend = ''; + + /** + * String to output after an error message + * @var string + * @access private + */ + var $_error_append = ''; + + /** + * String used to represent a line break. + * @var string + * @access private + */ + var $_linebreak = "
\n"; + + /** + * Constructs a new Log_display object. + * + * @param string $name Ignored. + * @param string $ident The identity string. + * @param array $conf The configuration array. + * @param int $level Log messages up to and including this level. + * @access public + */ + function Log_display($name = '', $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + $this->_id = md5(microtime()); + $this->_ident = $ident; + $this->_mask = Log::UPTO($level); + + if (isset($conf['error_prepend'])) { + $this->_error_prepend = $conf['error_prepend']; + } else { + $this->_error_prepend = ini_get('error_prepend_string'); + } + + if (isset($conf['error_append'])) { + $this->_error_append = $conf['error_append']; + } else { + $this->_error_append = ini_get('error_append_string'); + } + + if (isset($conf['linebreak'])) { + $this->_linebreak = $conf['linebreak']; + } + } + + /** + * Opens the display handler. + * + * @access public + * @since Log 1.9.6 + */ + function open() + { + $this->_opened = true; + return true; + } + + /** + * Closes the display handler. + * + * @access public + * @since Log 1.9.6 + */ + function close() + { + $this->_opened = false; + return true; + } + + /** + * Writes $message to the text browser. Also, passes the message + * along to any Log_observer instances that are observing this Log. + * + * @param mixed $message String or object containing the message to log. + * @param string $priority The priority of the message. Valid + * values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT, + * PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG. + * @return boolean True on success or false on failure. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + /* Extract the string representation of the message. */ + $message = $this->_extractMessage($message); + + /* Build and output the complete log line. */ + echo $this->_error_prepend . + '' . ucfirst($this->priorityToString($priority)) . ': '. + nl2br(htmlspecialchars($message)) . + $this->_error_append . $this->_linebreak; + + /* Notify observers about this log message. */ + $this->_announce(array('priority' => $priority, 'message' => $message)); + + return true; + } + +} diff --git a/egw-pear/Log/error_log.php b/egw-pear/Log/error_log.php new file mode 100644 index 0000000000..117e96c488 --- /dev/null +++ b/egw-pear/Log/error_log.php @@ -0,0 +1,127 @@ + + * @since Log 1.7.0 + * @package Log + * + * @example error_log.php Using the error_log handler. + */ +class Log_error_log extends Log +{ + /** + * The error_log() log type. + * @var integer + * @access private + */ + var $_type = PEAR_LOG_TYPE_SYSTEM; + + /** + * The type-specific destination value. + * @var string + * @access private + */ + var $_destination = ''; + + /** + * Additional headers to pass to the mail() function when the + * PEAR_LOG_TYPE_MAIL type is used. + * @var string + * @access private + */ + var $_extra_headers = ''; + + /** + * Constructs a new Log_error_log object. + * + * @param string $name Ignored. + * @param string $ident The identity string. + * @param array $conf The configuration array. + * @param int $level Log messages up to and including this level. + * @access public + */ + function Log_error_log($name, $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + $this->_id = md5(microtime()); + $this->_type = $name; + $this->_ident = $ident; + $this->_mask = Log::UPTO($level); + + if (!empty($conf['destination'])) { + $this->_destination = $conf['destination']; + } + if (!empty($conf['extra_headers'])) { + $this->_extra_headers = $conf['extra_headers']; + } + } + + /** + * Opens the handler. + * + * @access public + * @since Log 1.9.6 + */ + function open() + { + $this->_opened = true; + return true; + } + + /** + * Closes the handler. + * + * @access public + * @since Log 1.9.6 + */ + function close() + { + $this->_opened = false; + return true; + } + + /** + * Logs $message using PHP's error_log() function. The message is also + * passed along to any Log_observer instances that are observing this Log. + * + * @param mixed $message String or object containing the message to log. + * @param string $priority The priority of the message. Valid + * values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT, + * PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG. + * @return boolean True on success or false on failure. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + /* Extract the string representation of the message. */ + $message = $this->_extractMessage($message); + + $success = error_log($this->_ident . ': ' . $message, $this->_type, + $this->_destination, $this->_extra_headers); + + $this->_announce(array('priority' => $priority, 'message' => $message)); + + return $success; + } + +} diff --git a/egw-pear/Log/file.php b/egw-pear/Log/file.php new file mode 100644 index 0000000000..cd0083e7a6 --- /dev/null +++ b/egw-pear/Log/file.php @@ -0,0 +1,312 @@ + + * @author Roman Neuhauser + * @since Log 1.0 + * @package Log + * + * @example file.php Using the file handler. + */ +class Log_file extends Log +{ + /** + * String containing the name of the log file. + * @var string + * @access private + */ + var $_filename = 'php.log'; + + /** + * Handle to the log file. + * @var resource + * @access private + */ + var $_fp = false; + + /** + * Should new log entries be append to an existing log file, or should the + * a new log file overwrite an existing one? + * @var boolean + * @access private + */ + var $_append = true; + + /** + * Should advisory file locking (i.e., flock()) be used? + * @var boolean + * @access private + */ + var $_locking = false; + + /** + * Integer (in octal) containing the log file's permissions mode. + * @var integer + * @access private + */ + var $_mode = 0644; + + /** + * Integer (in octal) specifying the file permission mode that will be + * used when creating directories that do not already exist. + * @var integer + * @access private + */ + var $_dirmode = 0755; + + /** + * String containing the format of a log line. + * @var string + * @access private + */ + var $_lineFormat = '%1$s %2$s [%3$s] %4$s'; + + /** + * String containing the timestamp format. It will be passed directly to + * strftime(). Note that the timestamp string will generated using the + * current locale. + * @var string + * @access private + */ + var $_timeFormat = '%b %d %H:%M:%S'; + + /** + * String containing the end-on-line character sequence. + * @var string + * @access private + */ + var $_eol = "\n"; + + /** + * Constructs a new Log_file object. + * + * @param string $name Ignored. + * @param string $ident The identity string. + * @param array $conf The configuration array. + * @param int $level Log messages up to and including this level. + * @access public + */ + function Log_file($name, $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + $this->_id = md5(microtime()); + $this->_filename = $name; + $this->_ident = $ident; + $this->_mask = Log::UPTO($level); + + if (isset($conf['append'])) { + $this->_append = $conf['append']; + } + + if (isset($conf['locking'])) { + $this->_locking = $conf['locking']; + } + + if (!empty($conf['mode'])) { + if (is_string($conf['mode'])) { + $this->_mode = octdec($conf['mode']); + } else { + $this->_mode = $conf['mode']; + } + } + + if (!empty($conf['dirmode'])) { + if (is_string($conf['dirmode'])) { + $this->_dirmode = octdec($conf['dirmode']); + } else { + $this->_dirmode = $conf['dirmode']; + } + } + + if (!empty($conf['lineFormat'])) { + $this->_lineFormat = str_replace(array_keys($this->_formatMap), + array_values($this->_formatMap), + $conf['lineFormat']); + } + + if (!empty($conf['timeFormat'])) { + $this->_timeFormat = $conf['timeFormat']; + } + + if (!empty($conf['eol'])) { + $this->_eol = $conf['eol']; + } else { + $this->_eol = (strstr(PHP_OS, 'WIN')) ? "\r\n" : "\n"; + } + + register_shutdown_function(array(&$this, '_Log_file')); + } + + /** + * Destructor + */ + function _Log_file() + { + if ($this->_opened) { + $this->close(); + } + } + + /** + * Creates the given directory path. If the parent directories don't + * already exist, they will be created, too. + * + * This implementation is inspired by Python's os.makedirs function. + * + * @param string $path The full directory path to create. + * @param integer $mode The permissions mode with which the + * directories will be created. + * + * @return True if the full path is successfully created or already + * exists. + * + * @access private + */ + function _mkpath($path, $mode = 0700) + { + /* Separate the last pathname component from the rest of the path. */ + $head = dirname($path); + $tail = basename($path); + + /* Make sure we've split the path into two complete components. */ + if (empty($tail)) { + $head = dirname($path); + $tail = basename($path); + } + + /* Recurse up the path if our current segment does not exist. */ + if (!empty($head) && !empty($tail) && !is_dir($head)) { + $this->_mkpath($head, $mode); + } + + /* Create this segment of the path. */ + return @mkdir($head, $mode); + } + + /** + * Opens the log file for output. If the specified log file does not + * already exist, it will be created. By default, new log entries are + * appended to the end of the log file. + * + * This is implicitly called by log(), if necessary. + * + * @access public + */ + function open() + { + if (!$this->_opened) { + /* If the log file's directory doesn't exist, create it. */ + if (!is_dir(dirname($this->_filename))) { + $this->_mkpath($this->_filename, $this->_dirmode); + } + + /* Determine whether the log file needs to be created. */ + $creating = !file_exists($this->_filename); + + /* Obtain a handle to the log file. */ + $this->_fp = fopen($this->_filename, ($this->_append) ? 'a' : 'w'); + + /* We consider the file "opened" if we have a valid file pointer. */ + $this->_opened = ($this->_fp !== false); + + /* Attempt to set the file's permissions if we just created it. */ + if ($creating && $this->_opened) { + chmod($this->_filename, $this->_mode); + } + } + + return $this->_opened; + } + + /** + * Closes the log file if it is open. + * + * @access public + */ + function close() + { + /* If the log file is open, close it. */ + if ($this->_opened && fclose($this->_fp)) { + $this->_opened = false; + } + + return ($this->_opened === false); + } + + /** + * Flushes all pending data to the file handle. + * + * @access public + * @since Log 1.8.2 + */ + function flush() + { + return fflush($this->_fp); + } + + /** + * Logs $message to the output window. The message is also passed along + * to any Log_observer instances that are observing this Log. + * + * @param mixed $message String or object containing the message to log. + * @param string $priority The priority of the message. Valid + * values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT, + * PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG. + * @return boolean True on success or false on failure. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + /* If the log file isn't already open, open it now. */ + if (!$this->_opened && !$this->open()) { + return false; + } + + /* Extract the string representation of the message. */ + $message = $this->_extractMessage($message); + + /* Build the string containing the complete log line. */ + $line = $this->_format($this->_lineFormat, + strftime($this->_timeFormat), + $priority, $message) . $this->_eol; + + /* If locking is enabled, acquire an exclusive lock on the file. */ + if ($this->_locking) { + flock($this->_fp, LOCK_EX); + } + + /* Write the log line to the log file. */ + $success = (fwrite($this->_fp, $line) !== false); + + /* Unlock the file now that we're finished writing to it. */ + if ($this->_locking) { + flock($this->_fp, LOCK_UN); + } + + /* Notify observers about this log message. */ + $this->_announce(array('priority' => $priority, 'message' => $message)); + + return $success; + } + +} diff --git a/egw-pear/Log/mail.php b/egw-pear/Log/mail.php new file mode 100644 index 0000000000..2c42db25bb --- /dev/null +++ b/egw-pear/Log/mail.php @@ -0,0 +1,246 @@ + + * @author Jon Parise + * @since Log 1.3 + * @package Log + * + * @example mail.php Using the mail handler. + */ +class Log_mail extends Log +{ + /** + * String holding the recipient's email address. + * @var string + * @access private + */ + var $_recipient = ''; + + /** + * String holding the sender's email address. + * @var string + * @access private + */ + var $_from = ''; + + /** + * String holding the email's subject. + * @var string + * @access private + */ + var $_subject = '[Log_mail] Log message'; + + /** + * String holding an optional preamble for the log messages. + * @var string + * @access private + */ + var $_preamble = ''; + + /** + * String containing the format of a log line. + * @var string + * @access private + */ + var $_lineFormat = '%1$s %2$s [%3$s] %4$s'; + + /** + * String containing the timestamp format. It will be passed directly to + * strftime(). Note that the timestamp string will generated using the + * current locale. + * @var string + * @access private + */ + var $_timeFormat = '%b %d %H:%M:%S'; + + /** + * String holding the mail message body. + * @var string + * @access private + */ + var $_message = ''; + + + /** + * Constructs a new Log_mail object. + * + * Here is how you can customize the mail driver with the conf[] hash : + * $conf['from'] : the mail's "From" header line, + * $conf['subject'] : the mail's "Subject" line. + * + * @param string $name The filename of the logfile. + * @param string $ident The identity string. + * @param array $conf The configuration array. + * @param int $level Log messages up to and including this level. + * @access public + */ + function Log_mail($name, $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + $this->_id = md5(microtime()); + $this->_recipient = $name; + $this->_ident = $ident; + $this->_mask = Log::UPTO($level); + + if (!empty($conf['from'])) { + $this->_from = $conf['from']; + } else { + $this->_from = ini_get('sendmail_from'); + } + + if (!empty($conf['subject'])) { + $this->_subject = $conf['subject']; + } + + if (!empty($conf['preamble'])) { + $this->_preamble = $conf['preamble']; + } + + if (!empty($conf['lineFormat'])) { + $this->_lineFormat = str_replace(array_keys($this->_formatMap), + array_values($this->_formatMap), + $conf['lineFormat']); + } + + if (!empty($conf['timeFormat'])) { + $this->_timeFormat = $conf['timeFormat']; + } + + /* register the destructor */ + register_shutdown_function(array(&$this, '_Log_mail')); + } + + /** + * Destructor. Calls close(). + * + * @access private + */ + function _Log_mail() + { + $this->close(); + } + + /** + * Starts a new mail message. + * This is implicitly called by log(), if necessary. + * + * @access public + */ + function open() + { + if (!$this->_opened) { + if (!empty($this->_preamble)) { + $this->_message = $this->_preamble . "\r\n\r\n"; + } + $this->_opened = true; + } + + return $this->_opened; + } + + /** + * Closes the message, if it is open, and sends the mail. + * This is implicitly called by the destructor, if necessary. + * + * @access public + */ + function close() + { + if ($this->_opened) { + if (!empty($this->_message)) { + $headers = "From: $this->_from\r\n"; + $headers .= "User-Agent: Log_mail"; + + if (mail($this->_recipient, $this->_subject, $this->_message, + $headers) == false) { + error_log("Log_mail: Failure executing mail()", 0); + return false; + } + + /* Clear the message string now that the email has been sent. */ + $this->_message = ''; + } + $this->_opened = false; + } + + return ($this->_opened === false); + } + + /** + * Flushes the log output by forcing the email message to be sent now. + * Events that are logged after flush() is called will be appended to a + * new email message. + * + * @access public + * @since Log 1.8.2 + */ + function flush() + { + /* + * It's sufficient to simply call close() to flush the output. + * The next call to log() will cause the handler to be reopened. + */ + return $this->close(); + } + + /** + * Writes $message to the currently open mail message. + * Calls open(), if necessary. + * + * @param mixed $message String or object containing the message to log. + * @param string $priority The priority of the message. Valid + * values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT, + * PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG. + * @return boolean True on success or false on failure. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + /* If the message isn't open and can't be opened, return failure. */ + if (!$this->_opened && !$this->open()) { + return false; + } + + /* Extract the string representation of the message. */ + $message = $this->_extractMessage($message); + + /* Build the string containing the complete log line. */ + $this->_message .= $this->_format($this->_lineFormat, + strftime($this->_timeFormat), + $priority, $message) . "\r\n"; + + /* Notify observers about this log message. */ + $this->_announce(array('priority' => $priority, 'message' => $message)); + + return true; + } +} diff --git a/egw-pear/Log/mcal.php b/egw-pear/Log/mcal.php new file mode 100644 index 0000000000..ab88d457e5 --- /dev/null +++ b/egw-pear/Log/mcal.php @@ -0,0 +1,170 @@ + + * @since Horde 1.3 + * @since Log 1.0 + * @package Log + */ +class Log_mcal extends Log +{ + /** + * holding the calendar specification to connect to. + * @var string + * @access private + */ + var $_calendar = '{localhost/mstore}'; + + /** + * holding the username to use. + * @var string + * @access private + */ + var $_username = ''; + + /** + * holding the password to use. + * @var string + * @access private + */ + var $_password = ''; + + /** + * holding the options to pass to the calendar stream. + * @var integer + * @access private + */ + var $_options = 0; + + /** + * ResourceID of the MCAL stream. + * @var string + * @access private + */ + var $_stream = ''; + + /** + * Integer holding the log facility to use. + * @var string + * @access private + */ + var $_name = LOG_SYSLOG; + + + /** + * Constructs a new Log_mcal object. + * + * @param string $name The category to use for our events. + * @param string $ident The identity string. + * @param array $conf The configuration array. + * @param int $level Log messages up to and including this level. + * @access public + */ + function Log_mcal($name, $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + $this->_id = md5(microtime()); + $this->_name = $name; + $this->_ident = $ident; + $this->_mask = Log::UPTO($level); + $this->_calendar = $conf['calendar']; + $this->_username = $conf['username']; + $this->_password = $conf['password']; + $this->_options = $conf['options']; + } + + /** + * Opens a calendar stream, if it has not already been + * opened. This is implicitly called by log(), if necessary. + * @access public + */ + function open() + { + if (!$this->_opened) { + $this->_stream = mcal_open($this->_calendar, $this->_username, + $this->_password, $this->_options); + $this->_opened = true; + } + + return $this->_opened; + } + + /** + * Closes the calendar stream, if it is open. + * @access public + */ + function close() + { + if ($this->_opened) { + mcal_close($this->_stream); + $this->_opened = false; + } + + return ($this->_opened === false); + } + + /** + * Logs $message and associated information to the currently open + * calendar stream. Calls open() if necessary. Also passes the + * message along to any Log_observer instances that are observing + * this Log. + * + * @param mixed $message String or object containing the message to log. + * @param string $priority The priority of the message. Valid + * values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT, + * PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG. + * @return boolean True on success or false on failure. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + /* If the connection isn't open and can't be opened, return failure. */ + if (!$this->_opened && !$this->open()) { + return false; + } + + /* Extract the string representation of the message. */ + $message = $this->_extractMessage($message); + + $date_str = date('Y:n:j:G:i:s'); + $dates = explode(':', $date_str); + + mcal_event_init($this->_stream); + mcal_event_set_title($this->_stream, $this->_ident); + mcal_event_set_category($this->_stream, $this->_name); + mcal_event_set_description($this->_stream, $message); + mcal_event_add_attribute($this->_stream, 'priority', $priority); + mcal_event_set_start($this->_stream, $dates[0], $dates[1], $dates[2], + $dates[3], $dates[4], $dates[5]); + mcal_event_set_end($this->_stream, $dates[0], $dates[1], $dates[2], + $dates[3], $dates[4], $dates[5]); + mcal_append_event($this->_stream); + + $this->_announce(array('priority' => $priority, 'message' => $message)); + + return true; + } + +} diff --git a/egw-pear/Log/mdb2.php b/egw-pear/Log/mdb2.php new file mode 100644 index 0000000000..cc06787a31 --- /dev/null +++ b/egw-pear/Log/mdb2.php @@ -0,0 +1,358 @@ + + * @author Jon Parise + * @since Log 1.9.0 + * @package Log + */ +class Log_mdb2 extends Log +{ + /** + * Variable containing the DSN information. + * @var mixed + * @access private + */ + var $_dsn = ''; + + /** + * Array containing our set of DB configuration options. + * @var array + * @access private + */ + var $_options = array('persistent' => true); + + /** + * Object holding the database handle. + * @var object + * @access private + */ + var $_db = null; + + /** + * Resource holding the prepared statement handle. + * @var resource + * @access private + */ + var $_statement = null; + + /** + * Flag indicating that we're using an existing database connection. + * @var boolean + * @access private + */ + var $_existingConnection = false; + + /** + * String holding the database table to use. + * @var string + * @access private + */ + var $_table = 'log_table'; + + /** + * String holding the name of the ID sequence. + * @var string + * @access private + */ + var $_sequence = 'log_id'; + + /** + * Maximum length of the $ident string. This corresponds to the size of + * the 'ident' column in the SQL table. + * @var integer + * @access private + */ + var $_identLimit = 16; + + /** + * Set of field types used in the database table. + * @var array + * @access private + */ + var $_types = array( + 'id' => 'integer', + 'logtime' => 'timestamp', + 'ident' => 'text', + 'priority' => 'text', + 'message' => 'clob' + ); + + /** + * Constructs a new sql logging object. + * + * @param string $name The target SQL table. + * @param string $ident The identification field. + * @param array $conf The connection configuration array. + * @param int $level Log messages up to and including this level. + * @access public + */ + function Log_mdb2($name, $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + $this->_id = md5(microtime()); + $this->_table = $name; + $this->_mask = Log::UPTO($level); + + /* If an options array was provided, use it. */ + if (isset($conf['options']) && is_array($conf['options'])) { + $this->_options = $conf['options']; + } + + /* If a specific sequence name was provided, use it. */ + if (!empty($conf['sequence'])) { + $this->_sequence = $conf['sequence']; + } + + /* If a specific sequence name was provided, use it. */ + if (isset($conf['identLimit'])) { + $this->_identLimit = $conf['identLimit']; + } + + /* Now that the ident limit is confirmed, set the ident string. */ + $this->setIdent($ident); + + /* If an existing database connection was provided, use it. */ + if (isset($conf['db'])) { + $this->_db = &$conf['db']; + $this->_existingConnection = true; + $this->_opened = true; + } elseif (isset($conf['singleton'])) { + $this->_db = &MDB2::singleton($conf['singleton'], $this->_options); + $this->_existingConnection = true; + $this->_opened = true; + } else { + $this->_dsn = $conf['dsn']; + } + } + + /** + * Opens a connection to the database, if it has not already + * been opened. This is implicitly called by log(), if necessary. + * + * @return boolean True on success, false on failure. + * @access public + */ + function open() + { + if (!$this->_opened) { + /* Use the DSN and options to create a database connection. */ + $this->_db = &MDB2::connect($this->_dsn, $this->_options); + if (PEAR::isError($this->_db)) { + return false; + } + + /* Create a prepared statement for repeated use in log(). */ + if (!$this->_prepareStatement()) { + return false; + } + + /* We now consider out connection open. */ + $this->_opened = true; + } + + return $this->_opened; + } + + /** + * Closes the connection to the database if it is still open and we were + * the ones that opened it. It is the caller's responsible to close an + * existing connection that was passed to us via $conf['db']. + * + * @return boolean True on success, false on failure. + * @access public + */ + function close() + { + /* If we have a statement object, free it. */ + if (is_object($this->_statement)) { + $this->_statement->free(); + $this->_statement = null; + } + + /* If we opened the database connection, disconnect it. */ + if ($this->_opened && !$this->_existingConnection) { + $this->_opened = false; + return $this->_db->disconnect(); + } + + return ($this->_opened === false); + } + + /** + * Sets this Log instance's identification string. Note that this + * SQL-specific implementation will limit the length of the $ident string + * to sixteen (16) characters. + * + * @param string $ident The new identification string. + * + * @access public + * @since Log 1.8.5 + */ + function setIdent($ident) + { + $this->_ident = substr($ident, 0, $this->_identLimit); + } + + /** + * Inserts $message to the currently open database. Calls open(), + * if necessary. Also passes the message along to any Log_observer + * instances that are observing this Log. + * + * @param mixed $message String or object containing the message to log. + * @param string $priority The priority of the message. Valid + * values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT, + * PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG. + * @return boolean True on success or false on failure. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + /* If the connection isn't open and can't be opened, return failure. */ + if (!$this->_opened && !$this->open()) { + return false; + } + + /* If we don't already have a statement object, create one. */ + if (!is_object($this->_statement) && !$this->_prepareStatement()) { + return false; + } + + /* Extract the string representation of the message. */ + $message = $this->_extractMessage($message); + + /* Build our set of values for this log entry. */ + $values = array( + 'id' => $this->_db->nextId($this->_sequence), + 'logtime' => MDB2_Date::mdbNow(), + 'ident' => $this->_ident, + 'priority' => $priority, + 'message' => $message + ); + + /* Execute the SQL query for this log entry insertion. */ + $this->_db->expectError(MDB2_ERROR_NOSUCHTABLE); + $result = &$this->_statement->execute($values); + $this->_db->popExpect(); + + /* Attempt to handle any errors. */ + if (PEAR::isError($result)) { + /* We can only handle MDB2_ERROR_NOSUCHTABLE errors. */ + if ($result->getCode() != MDB2_ERROR_NOSUCHTABLE) { + return false; + } + + /* Attempt to create the target table. */ + if (!$this->_createTable()) { + return false; + } + + /* Recreate our prepared statement resource. */ + $this->_statement->free(); + if (!$this->_prepareStatement()) { + return false; + } + + /* Attempt to re-execute the insertion query. */ + $result = $this->_statement->execute($values); + if (PEAR::isError($result)) { + return false; + } + } + + $this->_announce(array('priority' => $priority, 'message' => $message)); + + return true; + } + + /** + * Create the log table in the database. + * + * @return boolean True on success or false on failure. + * @access private + */ + function _createTable() + { + $this->_db->loadModule('Manager', null, true); + $result = $this->_db->manager->createTable( + $this->_table, + array( + 'id' => array('type' => $this->_types['id']), + 'logtime' => array('type' => $this->_types['logtime']), + 'ident' => array('type' => $this->_types['ident']), + 'priority' => array('type' => $this->_types['priority']), + 'message' => array('type' => $this->_types['message']) + ) + ); + if (PEAR::isError($result)) { + return false; + } + + $result = $this->_db->manager->createIndex( + $this->_table, + 'unique_id', + array('fields' => array('id' => true), 'unique' => true) + ); + if (PEAR::isError($result)) { + return false; + } + + return true; + } + + /** + * Prepare the SQL insertion statement. + * + * @return boolean True if the statement was successfully created. + * + * @access private + * @since Log 1.9.0 + */ + function _prepareStatement() + { + $this->_statement = &$this->_db->prepare( + 'INSERT INTO ' . $this->_table . + ' (id, logtime, ident, priority, message)' . + ' VALUES(:id, :logtime, :ident, :priority, :message)', + $this->_types, MDB2_PREPARE_MANIP); + + /* Return success if we didn't generate an error. */ + return (PEAR::isError($this->_statement) === false); + } +} diff --git a/egw-pear/Log/null.php b/egw-pear/Log/null.php new file mode 100644 index 0000000000..58cb9b43f8 --- /dev/null +++ b/egw-pear/Log/null.php @@ -0,0 +1,91 @@ + + * @since Log 1.8.2 + * @package Log + * + * @example null.php Using the null handler. + */ +class Log_null extends Log +{ + /** + * Constructs a new Log_null object. + * + * @param string $name Ignored. + * @param string $ident The identity string. + * @param array $conf The configuration array. + * @param int $level Log messages up to and including this level. + * @access public + */ + function Log_null($name, $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + $this->_id = md5(microtime()); + $this->_ident = $ident; + $this->_mask = Log::UPTO($level); + } + + /** + * Opens the handler. + * + * @access public + * @since Log 1.9.6 + */ + function open() + { + $this->_opened = true; + return true; + } + + /** + * Closes the handler. + * + * @access public + * @since Log 1.9.6 + */ + function close() + { + $this->_opened = false; + return true; + } + + /** + * Simply consumes the log event. The message will still be passed + * along to any Log_observer instances that are observing this Log. + * + * @param mixed $message String or object containing the message to log. + * @param string $priority The priority of the message. Valid + * values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT, + * PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG. + * @return boolean True on success or false on failure. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + $this->_announce(array('priority' => $priority, 'message' => $message)); + + return true; + } + +} diff --git a/egw-pear/Log/observer.php b/egw-pear/Log/observer.php new file mode 100644 index 0000000000..ccb5c2528f --- /dev/null +++ b/egw-pear/Log/observer.php @@ -0,0 +1,129 @@ + + * @since Horde 1.3 + * @since Log 1.0 + * @package Log + * + * @example observer_mail.php An example Log_observer implementation. + */ +class Log_observer +{ + /** + * Instance-specific unique identification number. + * + * @var integer + * @access private + */ + var $_id = 0; + + /** + * The minimum priority level of message that we want to hear about. + * PEAR_LOG_EMERG is the highest priority, so we will only hear messages + * with an integer priority value less than or equal to ours. It defaults + * to PEAR_LOG_INFO, which listens to everything except PEAR_LOG_DEBUG. + * + * @var string + * @access private + */ + var $_priority = PEAR_LOG_INFO; + + /** + * Creates a new basic Log_observer instance. + * + * @param integer $priority The highest priority at which to receive + * log event notifications. + * + * @access public + */ + function Log_observer($priority = PEAR_LOG_INFO) + { + $this->_id = md5(microtime()); + $this->_priority = $priority; + } + + /** + * Attempts to return a new concrete Log_observer instance of the requested + * type. + * + * @param string $type The type of concreate Log_observer subclass + * to return. + * @param integer $priority The highest priority at which to receive + * log event notifications. + * @param array $conf Optional associative array of additional + * configuration values. + * + * @return object The newly created concrete Log_observer + * instance, or null on an error. + */ + function &factory($type, $priority = PEAR_LOG_INFO, $conf = array()) + { + $type = strtolower($type); + $class = 'Log_observer_' . $type; + + /* + * If the desired class already exists (because the caller has supplied + * it from some custom location), simply instantiate and return a new + * instance. + */ + if (class_exists($class)) { + $object = new $class($priority, $conf); + return $object; + } + + /* Support both the new-style and old-style file naming conventions. */ + $newstyle = true; + $classfile = dirname(__FILE__) . '/observer_' . $type . '.php'; + + if (!file_exists($classfile)) { + $classfile = 'Log/' . $type . '.php'; + $newstyle = false; + } + + /* + * Attempt to include our version of the named class, but don't treat + * a failure as fatal. The caller may have already included their own + * version of the named class. + */ + @include_once $classfile; + + /* If the class exists, return a new instance of it. */ + if (class_exists($class)) { + /* Support both new-style and old-style construction. */ + if ($newstyle) { + $object = new $class($priority, $conf); + } else { + $object = new $class($priority); + } + return $object; + } + + $null = null; + return $null; + } + + /** + * This is a stub method to make sure that Log_Observer classes do + * something when they are notified of a message. The default behavior + * is to just print the message, which is obviously not desireable in + * practically any situation - which is why you need to override this + * method. :) + * + * @param array $event A hash describing the log event. + */ + function notify($event) + { + print_r($event); + } +} diff --git a/egw-pear/Log/sql.php b/egw-pear/Log/sql.php new file mode 100644 index 0000000000..99f7a6dba0 --- /dev/null +++ b/egw-pear/Log/sql.php @@ -0,0 +1,294 @@ + + * @since Horde 1.3 + * @since Log 1.0 + * @package Log + * + * @example sql.php Using the SQL handler. + */ +class Log_sql extends Log +{ + /** + * Variable containing the DSN information. + * @var mixed + * @access private + */ + var $_dsn = ''; + + /** + * String containing the SQL insertion statement. + * + * @var string + * @access private + */ + var $_sql = ''; + + /** + * Array containing our set of DB configuration options. + * @var array + * @access private + */ + var $_options = array('persistent' => true); + + /** + * Object holding the database handle. + * @var object + * @access private + */ + var $_db = null; + + /** + * Resource holding the prepared statement handle. + * @var resource + * @access private + */ + var $_statement = null; + + /** + * Flag indicating that we're using an existing database connection. + * @var boolean + * @access private + */ + var $_existingConnection = false; + + /** + * String holding the database table to use. + * @var string + * @access private + */ + var $_table = 'log_table'; + + /** + * String holding the name of the ID sequence. + * @var string + * @access private + */ + var $_sequence = 'log_id'; + + /** + * Maximum length of the $ident string. This corresponds to the size of + * the 'ident' column in the SQL table. + * @var integer + * @access private + */ + var $_identLimit = 16; + + + /** + * Constructs a new sql logging object. + * + * @param string $name The target SQL table. + * @param string $ident The identification field. + * @param array $conf The connection configuration array. + * @param int $level Log messages up to and including this level. + * @access public + */ + function Log_sql($name, $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + $this->_id = md5(microtime()); + $this->_table = $name; + $this->_mask = Log::UPTO($level); + + /* Now that we have a table name, assign our SQL statement. */ + if (!empty($this->_sql)) { + $this->_sql = $conf['sql']; + } else { + $this->_sql = 'INSERT INTO ' . $this->_table . + ' (id, logtime, ident, priority, message)' . + ' VALUES(?, CURRENT_TIMESTAMP, ?, ?, ?)'; + } + + /* If an options array was provided, use it. */ + if (isset($conf['options']) && is_array($conf['options'])) { + $this->_options = $conf['options']; + } + + /* If a specific sequence name was provided, use it. */ + if (!empty($conf['sequence'])) { + $this->_sequence = $conf['sequence']; + } + + /* If a specific sequence name was provided, use it. */ + if (isset($conf['identLimit'])) { + $this->_identLimit = $conf['identLimit']; + } + + /* Now that the ident limit is confirmed, set the ident string. */ + $this->setIdent($ident); + + /* If an existing database connection was provided, use it. */ + if (isset($conf['db'])) { + $this->_db = &$conf['db']; + $this->_existingConnection = true; + $this->_opened = true; + } else { + $this->_dsn = $conf['dsn']; + } + } + + /** + * Opens a connection to the database, if it has not already + * been opened. This is implicitly called by log(), if necessary. + * + * @return boolean True on success, false on failure. + * @access public + */ + function open() + { + if (!$this->_opened) { + /* Use the DSN and options to create a database connection. */ + $this->_db = &DB::connect($this->_dsn, $this->_options); + if (DB::isError($this->_db)) { + return false; + } + + /* Create a prepared statement for repeated use in log(). */ + if (!$this->_prepareStatement()) { + return false; + } + + /* We now consider out connection open. */ + $this->_opened = true; + } + + return $this->_opened; + } + + /** + * Closes the connection to the database if it is still open and we were + * the ones that opened it. It is the caller's responsible to close an + * existing connection that was passed to us via $conf['db']. + * + * @return boolean True on success, false on failure. + * @access public + */ + function close() + { + if ($this->_opened && !$this->_existingConnection) { + $this->_opened = false; + $this->_db->freePrepared($this->_statement); + return $this->_db->disconnect(); + } + + return ($this->_opened === false); + } + + /** + * Sets this Log instance's identification string. Note that this + * SQL-specific implementation will limit the length of the $ident string + * to sixteen (16) characters. + * + * @param string $ident The new identification string. + * + * @access public + * @since Log 1.8.5 + */ + function setIdent($ident) + { + $this->_ident = substr($ident, 0, $this->_identLimit); + } + + /** + * Inserts $message to the currently open database. Calls open(), + * if necessary. Also passes the message along to any Log_observer + * instances that are observing this Log. + * + * @param mixed $message String or object containing the message to log. + * @param string $priority The priority of the message. Valid + * values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT, + * PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG. + * @return boolean True on success or false on failure. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + /* If the connection isn't open and can't be opened, return failure. */ + if (!$this->_opened && !$this->open()) { + return false; + } + + /* If we don't already have our statement object yet, create it. */ + if (!is_object($this->_statement) && !$this->_prepareStatement()) { + return false; + } + + /* Extract the string representation of the message. */ + $message = $this->_extractMessage($message); + + /* Build our set of values for this log entry. */ + $id = $this->_db->nextId($this->_sequence); + $values = array($id, $this->_ident, $priority, $message); + + /* Execute the SQL query for this log entry insertion. */ + $result =& $this->_db->execute($this->_statement, $values); + if (DB::isError($result)) { + return false; + } + + $this->_announce(array('priority' => $priority, 'message' => $message)); + + return true; + } + + /** + * Prepare the SQL insertion statement. + * + * @return boolean True if the statement was successfully created. + * + * @access private + * @since Log 1.9.1 + */ + function _prepareStatement() + { + $this->_statement = $this->_db->prepare($this->_sql); + + /* Return success if we didn't generate an error. */ + return (DB::isError($this->_statement) === false); + } +} diff --git a/egw-pear/Log/sqlite.php b/egw-pear/Log/sqlite.php new file mode 100644 index 0000000000..a558fee13b --- /dev/null +++ b/egw-pear/Log/sqlite.php @@ -0,0 +1,225 @@ + + * @author Jon Parise + * @since Log 1.8.3 + * @package Log + * + * @example sqlite.php Using the Sqlite handler. + */ +class Log_sqlite extends Log +{ + /** + * Array containing the connection defaults + * @var array + * @access private + */ + var $_options = array('mode' => 0666, + 'persistent' => false); + + /** + * Object holding the database handle. + * @var object + * @access private + */ + var $_db = null; + + /** + * Flag indicating that we're using an existing database connection. + * @var boolean + * @access private + */ + var $_existingConnection = false; + + /** + * String holding the database table to use. + * @var string + * @access private + */ + var $_table = 'log_table'; + + + /** + * Constructs a new sql logging object. + * + * @param string $name The target SQL table. + * @param string $ident The identification field. + * @param mixed $conf Can be an array of configuration options used + * to open a new database connection + * or an already opened sqlite connection. + * @param int $level Log messages up to and including this level. + * @access public + */ + function Log_sqlite($name, $ident = '', &$conf, $level = PEAR_LOG_DEBUG) + { + $this->_id = md5(microtime()); + $this->_table = $name; + $this->_ident = $ident; + $this->_mask = Log::UPTO($level); + + if (is_array($conf)) { + foreach ($conf as $k => $opt) { + $this->_options[$k] = $opt; + } + } else { + // If an existing database connection was provided, use it. + $this->_db =& $conf; + $this->_existingConnection = true; + } + } + + /** + * Opens a connection to the database, if it has not already + * been opened. This is implicitly called by log(), if necessary. + * + * @return boolean True on success, false on failure. + * @access public + */ + function open() + { + if (is_resource($this->_db)) { + $this->_opened = true; + return $this->_createTable(); + } else { + /* Set the connection function based on the 'persistent' option. */ + if (empty($this->_options['persistent'])) { + $connectFunction = 'sqlite_open'; + } else { + $connectFunction = 'sqlite_popen'; + } + + /* Attempt to connect to the database. */ + if ($this->_db = $connectFunction($this->_options['filename'], + (int)$this->_options['mode'], + $error)) { + $this->_opened = true; + return $this->_createTable(); + } + } + + return $this->_opened; + } + + /** + * Closes the connection to the database if it is still open and we were + * the ones that opened it. It is the caller's responsible to close an + * existing connection that was passed to us via $conf['db']. + * + * @return boolean True on success, false on failure. + * @access public + */ + function close() + { + /* We never close existing connections. */ + if ($this->_existingConnection) { + return false; + } + + if ($this->_opened) { + $this->_opened = false; + sqlite_close($this->_db); + } + + return ($this->_opened === false); + } + + /** + * Inserts $message to the currently open database. Calls open(), + * if necessary. Also passes the message along to any Log_observer + * instances that are observing this Log. + * + * @param mixed $message String or object containing the message to log. + * @param string $priority The priority of the message. Valid + * values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT, + * PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG. + * @return boolean True on success or false on failure. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + /* If the connection isn't open and can't be opened, return failure. */ + if (!$this->_opened && !$this->open()) { + return false; + } + + // Extract the string representation of the message. + $message = $this->_extractMessage($message); + + // Build the SQL query for this log entry insertion. + $q = sprintf('INSERT INTO [%s] (logtime, ident, priority, message) ' . + "VALUES ('%s', '%s', %d, '%s')", + $this->_table, + strftime('%Y-%m-%d %H:%M:%S', time()), + sqlite_escape_string($this->_ident), + $priority, + sqlite_escape_string($message)); + if (!($res = @sqlite_unbuffered_query($this->_db, $q))) { + return false; + } + $this->_announce(array('priority' => $priority, 'message' => $message)); + + return true; + } + + /** + * Checks whether the log table exists and creates it if necessary. + * + * @return boolean True on success or false on failure. + * @access private + */ + function _createTable() + { + $q = "SELECT name FROM sqlite_master WHERE name='" . $this->_table . + "' AND type='table'"; + + $res = sqlite_query($this->_db, $q); + + if (sqlite_num_rows($res) == 0) { + $q = 'CREATE TABLE [' . $this->_table . '] (' . + 'id INTEGER PRIMARY KEY NOT NULL, ' . + 'logtime NOT NULL, ' . + 'ident CHAR(16) NOT NULL, ' . + 'priority INT NOT NULL, ' . + 'message)'; + + if (!($res = sqlite_unbuffered_query($this->_db, $q))) { + return false; + } + } + + return true; + } + +} diff --git a/egw-pear/Log/syslog.php b/egw-pear/Log/syslog.php new file mode 100644 index 0000000000..a34bc859d8 --- /dev/null +++ b/egw-pear/Log/syslog.php @@ -0,0 +1,160 @@ + + * @since Horde 1.3 + * @since Log 1.0 + * @package Log + * + * @example syslog.php Using the syslog handler. + */ +class Log_syslog extends Log +{ + /** + * Integer holding the log facility to use. + * @var string + * @access private + */ + var $_name = LOG_SYSLOG; + + /** + * Constructs a new syslog object. + * + * @param string $name The syslog facility. + * @param string $ident The identity string. + * @param array $conf The configuration array. + * @param int $level Log messages up to and including this level. + * @access public + */ + function Log_syslog($name, $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + /* Ensure we have a valid integer value for $name. */ + if (empty($name) || !is_int($name)) { + $name = LOG_SYSLOG; + } + + $this->_id = md5(microtime()); + $this->_name = $name; + $this->_ident = $ident; + $this->_mask = Log::UPTO($level); + } + + /** + * Opens a connection to the system logger, if it has not already + * been opened. This is implicitly called by log(), if necessary. + * @access public + */ + function open() + { + if (!$this->_opened) { + openlog($this->_ident, LOG_PID, $this->_name); + $this->_opened = true; + } + + return $this->_opened; + } + + /** + * Closes the connection to the system logger, if it is open. + * @access public + */ + function close() + { + if ($this->_opened) { + closelog(); + $this->_opened = false; + } + + return ($this->_opened === false); + } + + /** + * Sends $message to the currently open syslog connection. Calls + * open() if necessary. Also passes the message along to any Log_observer + * instances that are observing this Log. + * + * @param mixed $message String or object containing the message to log. + * @param int $priority (optional) The priority of the message. Valid + * values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT, + * PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG. + * @return boolean True on success or false on failure. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + /* If the connection isn't open and can't be opened, return failure. */ + if (!$this->_opened && !$this->open()) { + return false; + } + + /* Extract the string representation of the message. */ + $message = $this->_extractMessage($message); + + if (!syslog($this->_toSyslog($priority), $message)) { + return false; + } + + $this->_announce(array('priority' => $priority, 'message' => $message)); + + return true; + } + + /** + * Converts a PEAR_LOG_* constant into a syslog LOG_* constant. + * + * This function exists because, under Windows, not all of the LOG_* + * constants have unique values. Instead, the PEAR_LOG_* were introduced + * for global use, with the conversion to the LOG_* constants kept local to + * to the syslog driver. + * + * @param int $priority PEAR_LOG_* value to convert to LOG_* value. + * + * @return The LOG_* representation of $priority. + * + * @access private + */ + function _toSyslog($priority) + { + static $priorities = array( + PEAR_LOG_EMERG => LOG_EMERG, + PEAR_LOG_ALERT => LOG_ALERT, + PEAR_LOG_CRIT => LOG_CRIT, + PEAR_LOG_ERR => LOG_ERR, + PEAR_LOG_WARNING => LOG_WARNING, + PEAR_LOG_NOTICE => LOG_NOTICE, + PEAR_LOG_INFO => LOG_INFO, + PEAR_LOG_DEBUG => LOG_DEBUG + ); + + /* If we're passed an unknown priority, default to LOG_INFO. */ + if (!is_int($priority) || !in_array($priority, $priorities)) { + return LOG_INFO; + } + + return $priorities[$priority]; + } + +} diff --git a/egw-pear/Log/win.php b/egw-pear/Log/win.php new file mode 100644 index 0000000000..21795d965a --- /dev/null +++ b/egw-pear/Log/win.php @@ -0,0 +1,269 @@ + + * @since Log 1.7.0 + * @package Log + * + * @example win.php Using the window handler. + */ +class Log_win extends Log +{ + /** + * The name of the output window. + * @var string + * @access private + */ + var $_name = 'LogWindow'; + + /** + * The title of the output window. + * @var string + * @access private + */ + var $_title = 'Log Output Window'; + + /** + * Mapping of log priorities to styles. + * @var array + * @access private + */ + var $_styles = array( + PEAR_LOG_EMERG => 'color: red;', + PEAR_LOG_ALERT => 'color: orange;', + PEAR_LOG_CRIT => 'color: yellow;', + PEAR_LOG_ERR => 'color: green;', + PEAR_LOG_WARNING => 'color: blue;', + PEAR_LOG_NOTICE => 'color: indigo;', + PEAR_LOG_INFO => 'color: violet;', + PEAR_LOG_DEBUG => 'color: black;' + ); + + /** + * String buffer that holds line that are pending output. + * @var array + * @access private + */ + var $_buffer = array(); + + /** + * Constructs a new Log_win object. + * + * @param string $name Ignored. + * @param string $ident The identity string. + * @param array $conf The configuration array. + * @param int $level Log messages up to and including this level. + * @access public + */ + function Log_win($name, $ident = '', $conf = array(), + $level = PEAR_LOG_DEBUG) + { + $this->_id = md5(microtime()); + $this->_name = $name; + $this->_ident = $ident; + $this->_mask = Log::UPTO($level); + + if (isset($conf['title'])) { + $this->_title = $conf['title']; + } + if (isset($conf['styles']) && is_array($conf['styles'])) { + $this->_styles = $conf['styles']; + } + if (isset($conf['colors']) && is_array($conf['colors'])) { + foreach ($conf['colors'] as $level => $color) { + $this->_styles[$level] .= "color: $color;"; + } + } + + register_shutdown_function(array(&$this, '_Log_win')); + } + + /** + * Destructor + */ + function _Log_win() + { + if ($this->_opened || (count($this->_buffer) > 0)) { + $this->close(); + } + } + + /** + * The first time open() is called, it will open a new browser window and + * prepare it for output. + * + * This is implicitly called by log(), if necessary. + * + * @access public + */ + function open() + { + if (!$this->_opened) { + $win = $this->_name; + $styles = $this->_styles; + + if (!empty($this->_ident)) { + $identHeader = "$win.document.writeln('Ident')"; + } else { + $identHeader = ''; + } + + echo <<< EOT + +EOT; + $this->_opened = true; + } + + return $this->_opened; + } + + /** + * Closes the output stream if it is open. If there are still pending + * lines in the output buffer, the output window will be opened so that + * the buffer can be drained. + * + * @access public + */ + function close() + { + /* + * If there are still lines waiting to be written, open the output + * window so that we can drain the buffer. + */ + if (!$this->_opened && (count($this->_buffer) > 0)) { + $this->open(); + } + + if ($this->_opened) { + $this->_writeln(''); + $this->_writeln(''); + $this->_opened = false; + } + + return ($this->_opened === false); + } + + /** + * Writes a single line of text to the output window. + * + * @param string $line The line of text to write. + * + * @access private + */ + function _writeln($line) + { + /* Add this line to our output buffer. */ + $this->_buffer[] = $line; + + /* Buffer the output until this page's headers have been sent. */ + if (!headers_sent()) { + return; + } + + /* If we haven't already opened the output window, do so now. */ + if (!$this->_opened && !$this->open()) { + return false; + } + + /* Drain the buffer to the output window. */ + $win = $this->_name; + foreach ($this->_buffer as $line) { + echo "\n"; + } + + /* Now that the buffer has been drained, clear it. */ + $this->_buffer = array(); + } + + /** + * Logs $message to the output window. The message is also passed along + * to any Log_observer instances that are observing this Log. + * + * @param mixed $message String or object containing the message to log. + * @param string $priority The priority of the message. Valid + * values are: PEAR_LOG_EMERG, PEAR_LOG_ALERT, + * PEAR_LOG_CRIT, PEAR_LOG_ERR, PEAR_LOG_WARNING, + * PEAR_LOG_NOTICE, PEAR_LOG_INFO, and PEAR_LOG_DEBUG. + * @return boolean True on success or false on failure. + * @access public + */ + function log($message, $priority = null) + { + /* If a priority hasn't been specified, use the default value. */ + if ($priority === null) { + $priority = $this->_priority; + } + + /* Abort early if the priority is above the maximum logging level. */ + if (!$this->_isMasked($priority)) { + return false; + } + + /* Extract the string representation of the message. */ + $message = $this->_extractMessage($message); + $message = preg_replace('/\r\n|\n|\r/', '
', $message); + + list($usec, $sec) = explode(' ', microtime()); + + /* Build the output line that contains the log entry row. */ + $line = ''; + $line .= sprintf('%s.%s', + strftime('%H:%M:%S', $sec), substr($usec, 2, 2)); + if (!empty($this->_ident)) { + $line .= '' . $this->_ident . ''; + } + $line .= '' . ucfirst($this->priorityToString($priority)) . ''; + $line .= sprintf('%s', $priority, $message); + $line .= ''; + + $this->_writeln($line); + + $this->_announce(array('priority' => $priority, 'message' => $message)); + + return true; + } + +} diff --git a/egw-pear/Net/IMAP.php b/egw-pear/Net/IMAP.php new file mode 100644 index 0000000000..ae84542172 --- /dev/null +++ b/egw-pear/Net/IMAP.php @@ -0,0 +1,2785 @@ + | +// +----------------------------------------------------------------------+ + + +require_once 'Net/IMAPProtocol.php'; + + +/** + * Provides an implementation of the IMAP protocol using PEAR's + * Net_Socket:: class. + * + * @package Net_IMAP + * @author Damian Alejandro Fernandez Sosa + */ +class Net_IMAP extends Net_IMAPProtocol { + + /** + * Constructor + * + * Instantiates a new Net_SMTP object, overriding any defaults + * with parameters that are passed in. + * + * @param string $host The server to connect to. + * @param int $port The port to connect to. + * @param bool $enableSTARTTLS enable STARTTLS support + */ + function Net_IMAP($host = 'localhost', $port = 143, $enableSTARTTLS = true) + { + $this->Net_IMAPProtocol(); + $ret = $this->connect( $host , $port, $enableSTARTTLS); + } + + + + /** + * Attempt to connect to the IMAP server located at $host $port + * @param string $host The IMAP server + * @param string $port The IMAP port + * @param bool $enableSTARTTLS enable STARTTLS support + * + * It is only useful in a very few circunstances + * because the contructor already makes this job + * + * @return true on success or PEAR_Error + * + * @access public + * @since 1.0 + */ + function connect($host, $port, $enableSTARTTLS = true) + { + $ret = $this->cmdConnect($host, $port); + if($ret === true ){ + // Determine server capabilities + $res = $this->cmdCapability(); + + // check if we can enable TLS via STARTTLS (requires PHP 5 >= 5.1.0RC1 for stream_socket_enable_crypto) + if ($this->hasCapability('STARTTLS') === true && $enableSTARTTLS === true && function_exists('stream_socket_enable_crypto') === true) { + if (PEAR::isError($res = $this->cmdStartTLS())) { + return $res; + } + } + return $ret; + } + if(empty($ret)){ + return new PEAR_Error("Unexpected response on connection"); + } + if(PEAR::isError($ret) ){ + return $ret; + } + if(isset( $ret["RESPONSE"]["CODE"] ) ){ + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + } + + return $ret; + } + + + + /** + * Attempt to authenticate to the IMAP server. + * @param string $user The userid to authenticate as. + * @param string $pass The password to authenticate with. + * @param string $useauthenticate true: authenticate using + * the IMAP AUTHENTICATE command. false: authenticate using + * the IMAP AUTHENTICATE command. 'string': authenticate using + * the IMAP AUTHENTICATE command but using the authMethod in 'string' + * @param boolean $selectMailbox automaticaly select inbox on login (false does not) + * + * @return true on success or PEAR_Error + * + * @access public + * @since 1.0 + */ + function login($user, $pass, $useauthenticate = true, $selectMailbox=true) + { + if ( $useauthenticate ){ + //$useauthenticate is a string if the user hardcodes an AUTHMethod + // (the user calls $imap->login("user","password","CRAM-MD5"); for example! + + $method = is_string( $useauthenticate ) ? $useauthenticate : null; + + //Try the selected Auth method + if ( PEAR::isError( $ret = $this->cmdAuthenticate( $user , $pass , $method ) ) ) { + // Verify the methods that we have in common with the server + if(is_array($this->_serverAuthMethods)){ + $commonMethods=array_intersect ($this->supportedAuthMethods, $this->_serverAuthMethods ); + }else{ + $this->_serverAuthMethods=null; + } + if($this->_serverAuthMethods == null || count($commonMethods) == 0 || $this->supportedAuthMethods == null ){ + // The server does not have any auth method, so I try LOGIN + if ( PEAR::isError( $ret = $this->cmdLogin( $user, $pass ) ) ) { + return $ret; + } + }else{ + return $ret; + } + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + }else{ + //The user request "PLAIN" auth, we use the login command + if ( PEAR::isError( $ret = $this->cmdLogin( $user, $pass ) ) ) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + } + + if($selectMailbox){ + //Select INBOX + if ( PEAR::isError( $ret=$this->cmdSelect( $this->getCurrentMailbox() ) ) ) { + return $ret; + } + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + return true; + } + + + + /** + * Disconnect function. Sends the QUIT command + * and closes the socket. + * + * @param boolean $expungeOnExit (default = false) + * + * @return mixed true on success / Pear_Error on failure + * + * @access public + */ + function disconnect($expungeOnExit = false) + { + if($expungeOnExit){ + if (PEAR::isError($ret=$this->cmdExpunge())) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + $ret=$this->cmdLogout(); + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + } + + if (PEAR::isError($ret=$this->cmdLogout())) { + error_log(__METHOD__.$ret->message); + return $ret; + } else { + //error_log(__METHOD__.print_r($ret,true)); + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + error_log(__METHOD__.$ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + + return true; + } + + + + /** + * Changes the default/current mailbox to $mailbox + * + * @param string $mailbox Mailbox to select + * + * @return mixed true on success / Pear_Error on failure + * + * @access public + */ + function selectMailbox($mailbox) + { + if (PEAR::isError($ret=$this->cmdSelect($mailbox))) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + return true; + } + + + + /** + * Checks the mailbox $mailbox + * + * @param string $mailbox Mailbox to examine + * + * @return mixed true on success / Pear_Error on failure + * + * @access public + */ + function examineMailbox($mailbox) + { + if (PEAR::isError($ret=$this->cmdExamine($mailbox))) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + + //$ret_aux["EXISTS"]=$ret["PARSED"]["EXISTS"]; + //$ret_aux["RECENT"]=$ret["PARSED"]["RECENT"]; + $ret = $ret["PARSED"]; + return $ret; + } + + + + /** + * Returns the raw headers of the specified message. + * + * @param int $msg_id Message number + * @param $part_id Part ID + * @param boolean $uidFetch msg_id contains UID's instead of Message Sequence Number if set to true + * + * @return mixed Either raw headers or false on error + * + * @access public + */ + function getRawHeaders($msg_id, $part_id = '', $uidFetch = false) + { + if($part_id != '') { + $command = "BODY[$part_id.HEADER]"; + } else { + $command = "BODY[HEADER]"; + } + if($uidFetch == true) { + $ret=$this->cmdUidFetch($msg_id, $command); + } else { + $ret=$this->cmdFetch($msg_id, $command); + } + if (PEAR::isError($ret)) { + return $ret; + } + if(strtoupper( $ret["RESPONSE"]["CODE"]) != "OK" ){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + $ret=$ret["PARSED"][0]["EXT"][$command]["CONTENT"]; + return $ret; + } + + + + /** + * Returns the headers of the specified message in an + * associative array. Array keys are the header names, array + * values are the header values. In the case of multiple headers + * having the same names, eg Received:, the array value will be + * an indexed array of all the header values. + * + * @param int $msg_id Message number + * @param boolean $keysToUpper false (default) original header names + * true change keys (header names) toupper + * @param $part_id Part ID + * @param boolean $uidFetch msg_id contains UID's instead of Message Sequence Number if set to true + * + * @return mixed Either array of headers or false on error + * + * @access public + */ + function getParsedHeaders($msg_id, $keysToUpper = false, $part_id = '', $uidFetch = false) + { + if (PEAR::isError($ret=$this->getRawHeaders($msg_id, $part_id, $uidFetch))) { + return $ret; + } + + $raw_headers = rtrim($ret); + $raw_headers = preg_replace("/\r\n[ \t]+/", ' ', $raw_headers); // Unfold headers + $raw_headers = explode("\r\n", $raw_headers); + foreach ($raw_headers as $value) { + $name = substr($value, 0, $pos = strpos($value, ':')); + if ($keysToUpper) { + $name = strtoupper($name); + } + $value = ltrim(substr($value, $pos + 1)); + if (isset($headers[$name]) && is_array($headers[$name])) { + $headers[$name][] = $value; + } elseif (isset($headers[$name])) { + $headers[$name] = array($headers[$name], $value); + } else { + $headers[$name] = $value; + } + } + return $headers; + } + + + + /** + * Returns an array containing the message ID, the size and the UID + * of each message selected. + * message selection can be a valid IMAP command, a number or an array of + * messages + * + * @param $msg_id Message number + * + * @return mixed Either array of message data or PearError on error + * + * @access public + */ + function getMessagesList($msg_id = null) + { + if( $msg_id != null){ + if(is_array($msg_id)){ + $message_set=$this->_getSearchListFromArray($msg_id); + }else{ + $message_set=$msg_id; + } + }else{ + $message_set="1:*"; + } + if (PEAR::isError($ret=$this->cmdFetch($message_set,"(RFC822.SIZE UID)"))) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + foreach($ret["PARSED"] as $msg){ + $ret_aux[]=array("msg_id"=>$msg["NRO"],"size" => $msg["EXT"]["RFC822.SIZE"],"uidl"=> $msg["EXT"]["UID"]); + } + return $ret_aux; + } + + + + /** + * Message summary + * + * @param mixed $msg_id Message number + * @param boolean $uidFetch msg_id contains UID's instead of Message Sequence Number if set to true + * + * @return mixed Either array of headers or PEAR::Error on error + * + * @access public + */ + function getSummary($msg_id = null, $uidFetch = false) + { + if( $msg_id != null){ + if(is_array($msg_id)){ + $message_set=$this->_getSearchListFromArray($msg_id); + }else{ + $message_set=$msg_id; + } + }else{ + $message_set="1:*"; + } + if($uidFetch) { + #error_log("egw-pear::NET::IMAP:getSummary->fetch by UID ".$message_set); + $ret=$this->cmdUidFetch($message_set,"(RFC822.SIZE UID FLAGS ENVELOPE INTERNALDATE BODY.PEEK[HEADER.FIELDS (CONTENT-TYPE X-PRIORITY)])"); + } else { + #error_log("egw-pear::NET::IMAP:getSummary->fetch message ".$message_set); + $ret=$this->cmdFetch($message_set,"(RFC822.SIZE UID FLAGS ENVELOPE INTERNALDATE BODY.PEEK[HEADER.FIELDS (CONTENT-TYPE X-PRIORITY)])"); + } + #error_log(print_r($ret['PARSED'][0],true)); + #$ret=$this->cmdFetch($message_set,"(RFC822.SIZE UID FLAGS ENVELOPE INTERNALDATE BODY[1.MIME])"); + if (PEAR::isError($ret) || strtoupper($ret["RESPONSE"]["CODE"]) != "OK") { + error_log("egw-pear::NET::IMAP:getSummary->error after Fetch for message(s):".$message_set." Trying to retrieve single messages."); + unset($ret); + # if there is an error, while retrieving the information for the whole list, try to retrieve the info one by one, to be more error tolerant + foreach (explode(',',$message_set) as $msgid) { + $retloop=$this->cmdUidFetch($msgid,"(RFC822.SIZE UID FLAGS ENVELOPE INTERNALDATE BODY.PEEK[HEADER.FIELDS (CONTENT-TYPE X-PRIORITY)])"); + if (PEAR::isError($retloop)|| strtoupper($retloop["RESPONSE"]["CODE"]) != "OK") { + # log the error, and create a dummy-message as placeholder, this may hold the possibility to read the message anyway + error_log("egw-pear::NET::IMAP:getSummary->error after Fetch for message with id:".$msgid); + error_log($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + $ret['PARSED'][]=array('COMMAND'=>"FETCH",'EXT'=>array('UID'=>$msgid,'ENVELOPE'=>array('SUBJECT'=>"[FELAMIMAIL:ERROR]can not parse this message(header).",))); + } else { + #error_log(print_r($retloop['PARSED'][0],true)); + # renew the response for every message retrieved, since the returnvalue is structured that way + $ret['RESPONSE']=$retloop['RESPONSE']; + $ret['PARSED'][]=$retloop['PARSED'][0]; + } + unset($retloop); + } + #return $ret; + } + # this seems to be obsolet, since errors while retrieving header informations are 'covered' above + #if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + # error_log("egw-pear::NET::IMAP:getSummary->ResponseCode not OK"); + # return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + #} + + #print "
"; + #error_log("egw-pear::NET::IMAP:getSummary->".print_r($ret["PARSED"],TRUE)); + #print "
"; + if(isset( $ret["PARSED"] ) ){ + for($i=0; $i X-Priority: 5\r\nContent-Type: multipart/alternative;\r\n\tboundary="b1_61838a67749ca51b425e42489adced98"\r\n\r\n\n + if(preg_match('/x-priority: ([0-9])/iU', $ret["PARSED"][$i]['EXT']['BODY[HEADER.FIELDS (CONTENT-TYPE X-PRIORITY)]']['CONTENT'], $matches)) { + $a['PRIORITY']=strtolower($matches[1]); + } + } elseif (isset($ret["PARSED"][$i]['EXT']['BODY[HEADER.FIELDS ("CONTENT-TYPE" "X-PRIORITY")]']['CONTENT'])) { + // some versions of cyrus send "CONTENT-TYPE" and CONTENT-TYPE only + if (preg_match('/content-type: (.*);/iU', $ret["PARSED"][$i]['EXT']['BODY[HEADER.FIELDS ("CONTENT-TYPE" "X-PRIORITY")]']['CONTENT'], $matches)) { + $a['MIMETYPE']=strtolower($matches[1]); + } + // fetch the priority [CONTENT] => X-Priority: 5\r\nContent-Type: multipart/alternative;\r\n\tboundary="b1_61838a67749ca51b425e42489adced98"\r\n\r\n\n + if (preg_match('/x-priority: ([0-9])/iU', $ret["PARSED"][$i]['EXT']['BODY[HEADER.FIELDS ("CONTENT-TYPE" "X-PRIORITY")]']['CONTENT'], $matches)) { + $a['PRIORITY']=strtolower($matches[1]); + } + } + $env[]=$a; + $a=null; + } + return $env; + } + + //return $ret; + } + + + + /** + * Returns the body of the message with given message number. + * + * @param $msg_id Message number + * @param boolean $uidFetch msg_id contains UID's instead of Message Sequence Number if set to true + * + * @return mixed Either message body or false on error + * + * @access public + */ + function getBody($msg_id, $uidFetch = false) + { + if($uidFetch) { + $ret=$this->cmdUidFetch($msg_id,"BODY[TEXT]"); + } else { + $ret=$this->cmdFetch($msg_id,"BODY[TEXT]"); + } + if (PEAR::isError($ret)) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + $ret=$ret["PARSED"][0]["EXT"]["BODY[TEXT]"]["CONTENT"]; + //$ret=$resp["PARSED"][0]["EXT"]["RFC822"]["CONTENT"]; + return $ret; + } + + + /** + * Returns the body of the message with given message number. + * + * @param $msg_id Message number + * @param string $partId Message number + * @param boolean $uidFetch msg_id contains UID's instead of Message Sequence Number if set to true + * + * @return mixed Either message body or false on error + * + * @access public + */ + function getBodyPart($msg_id, $partId, $uidFetch = false) + { + if($uidFetch) { + $ret=$this->cmdUidFetch($msg_id,"BODY[$partId]"); + } else { + $ret=$this->cmdFetch($msg_id,"BODY[$partId]"); + } + if (PEAR::isError($ret)) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + $ret=$ret["PARSED"][0]["EXT"]["BODY[$partId]"]["CONTENT"]; + //$ret=$resp["PARSED"][0]["EXT"]["RFC822"]["CONTENT"]; + return $ret; + } + + + + /** + * Returns the body of the message with given message number. + * + * @param $msg_id Message number + * @param boolean $uidFetch msg_id contains UID's instead of Message Sequence Number if set to true + * + * @return mixed Either message body or false on error + * + * @access public + */ + function getStructure($msg_id, $uidFetch = false) + { + #print "IMAP.php::getStructure
";
+        #$this->setDebug(true);
+        #print "
";
+        if($uidFetch) {
+          $ret=$this->cmdUidFetch($msg_id,"BODYSTRUCTURE");
+        } else {
+          $ret=$this->cmdFetch($msg_id,"BODYSTRUCTURE");
+        }
+		#_debug_array($ret);
+        if (PEAR::isError($ret)) {
+            return $ret;
+        }
+        if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){
+            return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]);
+        }
+        $ret2=$ret["PARSED"][0]["EXT"]["BODYSTRUCTURE"][0];
+		// sometimes we get an [COMMAND] => OK with $ret["PARSED"][0] and no $ret["PARSED"][0]["EXT"]["BODYSTRUCTURE"]
+		if (is_array($ret) && empty($ret2)) {
+			foreach($ret["PARSED"] as $substruct) {
+				if ($substruct["COMMAND"] == "FETCH") {
+					$ret2=$substruct["EXT"]["BODYSTRUCTURE"][0];
+					break;
+				}
+			}
+		}
+        $structure = array();
+
+        $mimeParts = array();
+        $this->_parseStructureArray($ret2, $mimeParts);
+        #_debug_array($ret);
+        return array_shift($mimeParts);
+    }
+
+
+    /**
+     * Parse structure array
+     *
+     * @param   $_structure
+     * @param   &$_mimeParts
+     * @param   $_partID
+     *
+     * @return  nothing
+     *
+     * @access  private
+     */
+    function _parseStructureArray($_structure, &$_mimeParts, $_partID = '') 
+    {
+        // something went wrong
+        if(!is_array($_structure)) {
+          return false;
+        }
+
+        // print "
Net_IMAP::_parseStructureArray _partID: $_partID
"; + $mimeParts = array(); + $subPartID = 1; + $partID = ($_partID == '') ? '' : $_partID.'.'; + if(is_array($_structure[0])) { + $this->_parseStructureMultipartArray($_structure, $_mimeParts, $_partID); + } else { + switch(strtoupper($_structure[0])) { + case 'TEXT': + $this->_parseStructureTextArray($_structure, $_mimeParts, $partID.$subPartID); + break; + + case 'MESSAGE': + $this->_parseStructureMessageArray($_structure, $_mimeParts, $partID.$subPartID); + break; + + default: + $this->_parseStructureApplicationArray($_structure, $_mimeParts, $partID.$subPartID); + break; + } + } + + } + + + + /** + * Parse multibpart structure array + * + * @param $_structure + * @param &$_mimeParts + * @param $_partID + * @param boolean $_parentIsMessage + * + * @return noting + * + * @access private + */ + function _parseStructureMultipartArray($_structure, &$_mimeParts, $_partID, $_parentIsMessage = false) + { + #print "Net_IMAP::_parseStructureMultipartArray _partID: $_partID
"; + // a multipart/mixed, multipart/report or multipart/alternative or multipart/related get's no own partid, if the parent is message/rfc822 + if($_parentIsMessage == true && is_array($_structure[0])) { + foreach($_structure as $structurePart) { + if(!is_array($structurePart)) { + $subType = strtolower($structurePart); + break; + } + } + if($subType == 'mixed' || $subType == 'report' || $subType == 'alternative' || $subType == 'related') { + $_partID = substr($_partID, 0, strrpos($_partID, '.')); + } + } + + $subPartID = 1; + $partID = ($_partID == '') ? '' : $_partID.'.'; + $subMimeParts = array(); + foreach($_structure as $structurePart) { + if(is_array($structurePart)) { + if(is_array($structurePart[0])) { + // another multipart inside the multipart + $this->_parseStructureMultipartArray($structurePart, $subMimeParts, $partID.$subPartID); + } else { + switch(strtoupper($structurePart[0])) { + case 'IMAGE': + $this->_parseStructureImageArray($structurePart, $subMimeParts, $partID.$subPartID); + + break; + + case 'MESSAGE': + $this->_parseStructureMessageArray($structurePart, $subMimeParts, $partID.$subPartID); + + break; + + case 'TEXT': + $this->_parseStructureTextArray($structurePart, $subMimeParts, $partID.$subPartID); + + break; + + default: + $this->_parseStructureApplicationArray($structurePart, $subMimeParts, $partID.$subPartID); + + break; + + } + } + $subPartID++; + } else { + $part = new stdClass; + $part->type = 'MULTIPART'; + $part->subType = strtoupper($structurePart); + + $part->subParts = $subMimeParts; + + if($_partID == '') { + $part->partID = 0; + $_mimeParts = array(0 => $part); + } else { + $part->partID = $_partID; + $_mimeParts[$_partID] = $part; + } + + return; + } + } + } + + /** + * Parse structure image array + * + * @param $_structure + * @param &$_mimeParts + * @param $_partID + * + * @return noting + * + * @access private + */ + function _parseStructureImageArray($_structure, &$_mimeParts, $_partID) + { + #print "Net_IMAP::_parseStructureImageArray _partID: $_partID
"; + $part = $this->_parseStructureCommonFields($_structure); + $part->cid = $_structure[3]; + $part->partID = $_partID; + + $_mimeParts[$_partID] = $part; + } + + + + /** + * Parse structure application array + * + * @params $_structure + * @params &$_mimeParts + * @params $_partID + * + * @return noting + * + * @access private + */ + function _parseStructureApplicationArray($_structure, &$_mimeParts, $_partID) + { + #print "Net_IMAP::_parseStructureApplicationArray _partID: $_partID
"; + $part = $this->_parseStructureCommonFields($_structure); + if(is_array($_structure[8])) { + if(isset($_structure[8][0]) && $_structure[8][0] != 'NIL') { + $part->disposition = strtoupper($_structure[8][0]); + } + if(is_array($_structure[8][1])) { + foreach($_structure[8][1] as $key => $value) { + if($key%2 == 0) { + $part->dparameters[strtoupper($_structure[8][1][$key])] = $_structure[8][1][$key+1]; + } + } + } + } + $part->partID = $_partID; + + $_mimeParts[$_partID] = $part; + } + + + + /** + * Parse structure message array + * + * @params $_structure + * @params &$_mimeParts + * @params $_partID + * + * @return nothing + * + * @access private + */ + function _parseStructureMessageArray($_structure, &$_mimeParts, $_partID) + { + #print "Net_IMAP::_parseStructureMessageArray _partID: $_partID
"; + $part = $this->_parseStructureCommonFields($_structure); + + if(is_array($_structure[8][0])) { + $this->_parseStructureMultipartArray($_structure[8], $subMimeParts, $_partID.'.1', true); + } else { + $this->_parseStructureArray($_structure[8], $subMimeParts, $_partID); + } + + if(is_array($subMimeParts)) { + $part->subParts = $subMimeParts; + } + $part->partID = $_partID; + + $_mimeParts[$_partID] = $part; + } + + + + /** + * Parse structure text array + * + * @params $_structure + * @params &$_mimeParts + * @params $_partID + * + * @return nothing + * + * @access private + */ + function _parseStructureTextArray($_structure, &$_mimeParts, $_partID) + { + #print "Net_IMAP::_parseStructureTextArray _partID: $_partID
"; + $part = $this->_parseStructureCommonFields($_structure); + $part->lines = $_structure[7]; + + // what is the difference between $_structure[8] and $_structure[9]???? + + if(is_array($_structure[8])) { + if(isset($_structure[8][0]) && $_structure[8][0] != 'NIL') { + $part->disposition = strtoupper($_structure[8][0]); + } + if(is_array($_structure[8][1])) { + foreach($_structure[8][1] as $key => $value) { + if($key%2 == 0) { + $part->dparameters[strtoupper($_structure[8][1][$key])] = $_structure[8][1][$key+1]; + } + } + } + } + + if(is_array($_structure[9])) { + if(isset($_structure[9][0]) && $_structure[9][0] != 'NIL') { + $part->disposition = strtoupper($_structure[9][0]); + } + if(is_array($_structure[9][1])) { + foreach($_structure[9][1] as $key => $value) { + if($key%2 == 0) { + $part->dparameters[strtoupper($_structure[9][1][$key])] = $_structure[9][1][$key+1]; + } + } + } + } + + $part->partID = $_partID; + + $_mimeParts[$_partID] = $part; + } + + + + /** + * Parse structure common fields + * + * @param &$_structure + * + * @return object part object (stdClass) + * + * @access private + */ + function _parseStructureCommonFields(&$_structure) + { + #error_log(__METHOD__.print_r($_structure,true)." ".function_backtrace()); + #print "Net_IMAP::_parseStructureTextArray _partID: $_partID
"; + $part = new stdClass; + $part->type = strtoupper($_structure[0]); + //dovecot has no subtype for type attachment, and does not pass it as structure[2] + if (!is_array($_structure[1])) $part->subType = strtoupper($_structure[1]); + if(is_array($_structure[1])) { + foreach($_structure[1] as $key => $value) { + if($key%2 == 0) { + $part->parameters[strtoupper($_structure[1][$key])] = $_structure[1][$key+1]; + } + } + } + if(is_array($_structure[2])) { + foreach($_structure[2] as $key => $value) { + if($key%2 == 0) { + $part->parameters[strtoupper($_structure[2][$key])] = $_structure[2][$key+1]; + } + } + } + $part->filename = $_structure[4]; + $part->encoding = strtoupper($_structure[5]); + $part->bytes = $_structure[6]; + + return $part; + } + + + + /** + * Returns the entire message with given message number. + * + * @param $msg_id Message number (default = null) + * @param boolean $indexIsMessageNumber (default = true) + * + * @return mixed Either entire message or false on error + * + * @access public + */ + function getMessages($msg_id = null, $indexIsMessageNumber=true) + { + //$resp=$this->cmdFetch($msg_id,"(BODY[TEXT] BODY[HEADER])"); + if( $msg_id != null){ + if(is_array($msg_id)){ + $message_set=$this->_getSearchListFromArray($msg_id); + }else{ + $message_set=$msg_id; + } + }else{ + $message_set="1:*"; + } + + $ret=$this->cmdFetch($message_set,"RFC822"); + if (PEAR::isError($ret)) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + if(isset($ret["PARSED"])){ + foreach($ret["PARSED"] as $msg){ + if(isset($msg["EXT"]["RFC822"]["CONTENT"])){ + if($indexIsMessageNumber){ + $ret_aux[$msg["NRO"]]=$msg["EXT"]["RFC822"]["CONTENT"]; + }else{ + $ret_aux[]=$msg["EXT"]["RFC822"]["CONTENT"]; + } + } + } + return $ret_aux; + } + return array(); + } + + + + /** + * Returns number of messages in this mailbox + * + * @param string $mailbox the mailbox (default is current mailbox) + * + * @return mixed Either number of messages or Pear_Error on failure + * + * @access public + */ + function getNumberOfMessages($mailbox = '') + { + if ( $mailbox == '' || $mailbox == null ){ + $mailbox=$this->getCurrentMailbox(); + } + if (PEAR::isError($ret = $this->cmdStatus($mailbox, 'MESSAGES'))) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + if( isset($ret["PARSED"]["STATUS"]["ATTRIBUTES"]["MESSAGES"] ) ){ + if( !is_numeric( $ret["PARSED"]["STATUS"]["ATTRIBUTES"]["MESSAGES"] ) ){ + // if this array does not exists means that there is no messages in the mailbox + return 0; + }else{ + return $ret["PARSED"]["STATUS"]["ATTRIBUTES"]["MESSAGES"]; + } + + } + return 0; + } + + + + /** + * Returns number of UnSeen messages in this mailbox + * + * @param string $mailbox the mailbox (default is current mailbox) + * + * @return mixed Either number of messages or Pear_Error on failure + * + * @access public + */ + function getNumberOfUnSeenMessages($mailbox = '') + { + if ( $mailbox == '' ){ + $mailbox = $this->getCurrentMailbox(); + } + if (PEAR::isError($ret = $this->cmdStatus($mailbox, 'UNSEEN'))) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + if( isset($ret["PARSED"]["STATUS"]["ATTRIBUTES"]["UNSEEN"] ) ){ + if( !is_numeric( $ret["PARSED"]["STATUS"]["ATTRIBUTES"]["UNSEEN"] ) ){ + // if this array does not exists means that there is no messages in the mailbox + return 0; + }else{ + return $ret["PARSED"]["STATUS"]["ATTRIBUTES"]["UNSEEN"]; + } + + } + return 0; + } + + + + /** + * Returns number of UnSeen messages in this mailbox + * + * @param string $mailbox the mailbox (default is current mailbox) + * + * @return mixed Either number of messages or Pear_Error on failure + * + * @access public + */ + function getNumberOfRecentMessages($mailbox = '') + { + if ( $mailbox == '' ){ + $mailbox = $this->getCurrentMailbox(); + } + if (PEAR::isError($ret = $this->cmdStatus($mailbox, 'RECENT'))) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + if( isset($ret["PARSED"]["STATUS"]["ATTRIBUTES"]["RECENT"] ) ){ + if( !is_numeric( $ret["PARSED"]["STATUS"]["ATTRIBUTES"]["RECENT"] ) ){ + // if this array does not exists means that there is no messages in the mailbox + return 0; + }else{ + return $ret["PARSED"]["STATUS"]["ATTRIBUTES"]["RECENT"]; + } + + } + return 0; + } + + + + /** + * Returns number of UnSeen messages in this mailbox + * + * @param string $mailbox the mailbox (default is current mailbox) + * + * @return mixed Either number of messages or Pear_Error on error + * + * @access public + */ + function getStatus($mailbox = '') + { + if ( $mailbox == '' ){ + $mailbox = $this->getCurrentMailbox(); + } + if (PEAR::isError($ret = $this->cmdStatus($mailbox, array('MESSAGES', 'RECENT', 'UIDNEXT', 'UIDVALIDITY', 'UNSEEN')))) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + if( isset($ret["PARSED"]["STATUS"]["ATTRIBUTES"]["RECENT"] ) ){ + return $ret["PARSED"]["STATUS"]["ATTRIBUTES"]; + } + return 0; + } + + + + /** + * Returns an array containing the message envelope + * + * @param $mailbox get's not used anywhere (will be removed with next major release) + * @param mixed $msg_id Message number (default = null) + * @param boolean $uidFetch msg_id contains UID's instead of Message Sequence Number if set to true + * + * @return mixed Either the envelopes or Pear_Error on error + * + * @access public + */ + function getEnvelope($mailbox = '', $msg_id = null, $uidFetch = false) + { + if ( $mailbox == '' ){ + $mailbox = $this->getCurrentMailbox(); + } + + if( $msg_id != null){ + if(is_array($msg_id)){ + $message_set=$this->_getSearchListFromArray($msg_id); + }else{ + $message_set=$msg_id; + } + }else{ + $message_set="1:*"; + } + + + if($uidFetch) { + $ret=$this->cmdUidFetch($message_set,"ENVELOPE"); + } else { + $ret=$this->cmdFetch($message_set,"ENVELOPE"); + } + if (PEAR::isError($ret)) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + + if(isset( $ret["PARSED"] ) ){ + for($i=0; $igetCurrentMailbox() ){ + // store the actual selected mailbox name + $mailbox_aux = $this->getCurrentMailbox(); + if ( PEAR::isError( $ret = $this->selectMailbox( $mailbox ) ) ) { + return $ret; + } + } + + $ret=$this->cmdFetch("1:*","RFC822.SIZE"); + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + // Restore the default mailbox if it was changed + if ( $mailbox != '' && $mailbox != $this->getCurrentMailbox() ){ + if ( PEAR::isError( $ret = $this->selectMailbox( $mailbox_aux ) ) ) { + return $ret; + } + } + // return 0 because the server says that there is no message in the mailbox + return 0; + } + + $sum=0; + + if(!isset($ret["PARSED"]) ){ + // if the server does not return a "PARSED" part + // we think that it does not suppoprt select or has no messages in it. + return 0; + } + foreach($ret["PARSED"] as $msgSize){ + if( isset($msgSize["EXT"]["RFC822.SIZE"]) ){ + $sum+= $msgSize["EXT"]["RFC822.SIZE"]; + } + } + + if ( $mailbox != '' && $mailbox != $this->getCurrentMailbox() ){ + // re-select the mailbox + if ( PEAR::isError( $ret = $this->selectMailbox( $mailbox_aux ) ) ) { + return $ret; + } + } + + return $sum; + } + + + + /** + * Marks a message for deletion. Only will be deleted if the + * disconnect() method is called with auto-expunge on true or expunge() + * method is called. + * + * @param $msg_id Message to delete (default = null) + * @param boolean $uidStore msg_id contains UID's instead of Message Sequence Number if set to true (default = false) + * + * @return mixed true on success / Pear_Error on failure + * + * @access public + */ + function deleteMessages($msg_id = null, $uidStore = false) + { + /* As said in RFC2060... + C: A003 STORE 2:4 +FLAGS (\Deleted) + S: * 2 FETCH FLAGS (\Deleted \Seen) + S: * 3 FETCH FLAGS (\Deleted) + S: * 4 FETCH FLAGS (\Deleted \Flagged \Seen) + S: A003 OK STORE completed + */ + //Called without parammeters deletes all the messages in the mailbox + // You can also provide an array of numbers to delete those emails + if( $msg_id != null){ + if(is_array($msg_id)){ + $message_set=$this->_getSearchListFromArray($msg_id); + }else{ + $message_set=$msg_id; + } + }else{ + $message_set="1:*"; + } + + + $dataitem="+FLAGS.SILENT"; + $value="\Deleted"; + if($uidStore == true) { + $ret=$this->cmdUidStore($message_set,$dataitem,$value); + } else { + $ret=$this->cmdStore($message_set,$dataitem,$value); + } + if (PEAR::isError($ret)) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + return true; + } + + + + /** + * Copies mail from one folder to another + * + * @param string $dest_mailbox mailbox name to copy sessages to + * @param mixed $msg_id the messages that I want to copy (all by default) it also + * can be an array + * @param string $source_mailbox mailbox name from where the messages are copied (default is current mailbox) + * @param bool $uidCopy msg_id contains UID's instead of Message Sequence Number if set to true + * + * @return mixed true on Success/PearError on Failure + * + * @access public + * @since 1.0 + */ + function copyMessages($dest_mailbox, $msg_id = null , $source_mailbox = null, $uidCopy = false ) + { + if($source_mailbox == null){ + $source_mailbox = $this->getCurrentMailbox(); + }else{ + if ( PEAR::isError( $ret = $this->selectMailbox( $source_mailbox ) ) ) { + return $ret; + } + } + //Called without parammeters copies all messages in the mailbox + // You can also provide an array of numbers to copy those emails + if( $msg_id != null){ + if(is_array($msg_id)){ + $message_set=$this->_getSearchListFromArray($msg_id); + }else{ + $message_set=$msg_id; + } + }else{ + $message_set="1:*"; + } + + if($uidCopy == true) { + $ret = $this->cmdUidCopy($message_set, $dest_mailbox ); + } else { + $ret = $this->cmdCopy($message_set, $dest_mailbox ); + } + if ( PEAR::isError( $ret ) ) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + return true; + } + + + + /** + * Appends a mail to a mailbox + * + * @param string $rfc_message the message to append in RFC822 format + * @param string $mailbox mailbox name to append to (default is current mailbox) + * @param string $flags_list set flags appended message + * + * @return mixed true (or the uid of the created message) on success / Pear_Error on failure + * + * @access public + * @since 1.0 + */ + function appendMessage($rfc_message, $mailbox = null , $flags_list = '') + { + if($mailbox == null){ + $mailbox = $this->getCurrentMailbox(); + } + $ret=$this->cmdAppend($mailbox,$rfc_message,$flags_list); + if (PEAR::isError($ret)) { + return $ret; + } + + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + // the expected response is something like that: [APPENDUID 1160024220 12] Completed + // the uid of the created message is the number just before the closing bracket + $retcode = explode(' ',$ret["RESPONSE"]["STR_CODE"]); + $retcode = explode(']',$retcode[2]); + if (intval($retcode[0]) > 0) return $retcode[0]; + // this should never happen, exept the parsed response is not as expected + return true; + } + + + + /** + * Get the namespace + * + * @return mixed namespace or PearError on failure + * + * @access public + * @since 1.1 + */ + function getNamespace() + { + if (PEAR::isError($ret = $this->cmdNamespace())) { + return $ret; + } + if(strtoupper( $ret["RESPONSE"]["CODE"]) != "OK" ){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + + foreach($ret["PARSED"]["NAMESPACES"] as $type => $singleNameSpace) { + if(!is_array($singleNameSpace)) { + continue; + } + + foreach ($singleNameSpace as $nameSpaceData) { + $nameSpaces[$type][] = array( + 'name' => $this->utf_7_decode($nameSpaceData[0]), + 'delimter' => $this->utf_7_decode($nameSpaceData[1]) + ); + } + } + + return $nameSpaces; + } + + + + /****************************************************************** + ** ** + ** MAILBOX RELATED METHODS ** + ** ** + ******************************************************************/ + + /** + * Gets the HierachyDelimiter character used to create subfolders cyrus users "." + * and wu-imapd uses "/" + * + * $param string the mailbox to get the hierarchy from + * + * @return string the hierarchy delimiter + * + * @access public + * @since 1.0 + */ + function getHierarchyDelimiter( $mailbox = '' ) + { + + /* RFC2060 says: "the command LIST "" "" means get the hierachy delimiter: + An empty ("" string) mailbox name argument is a special request to + return the hierarchy delimiter and the root name of the name given + in the reference. The value returned as the root MAY be null if + the reference is non-rooted or is null. In all cases, the + hierarchy delimiter is returned. This permits a client to get the + hierarchy delimiter even when no mailboxes by that name currently + exist." + */ + if( PEAR::isError( $ret = $this->cmdList( $mailbox , '' ) ) ){ + return $ret; + } + if(isset($ret["PARSED"][0]["EXT"]["LIST"]["HIERACHY_DELIMITER"]) ){ + return $ret["PARSED"][0]["EXT"]["LIST"]["HIERACHY_DELIMITER"]; + } + return new PEAR_Error( 'the IMAP Server does not support HIERACHY_DELIMITER!' ); + } + + + + /** + * Returns an array containing the names of the selected mailboxes + * + * @param string $reference base mailbox to start the search (default is current mailbox) + * @param string $restriction_search false or 0 means return all mailboxes + * true or 1 return only the mailbox that contains that exact name + * 2 return all mailboxes in that hierarchy level + * @param string $returnAttributes true means return an assoc array containing mailbox names and mailbox attributes + * false - the default - means return an array of mailboxes + * + * @return mixed true on success/PearError on failure + * + * @access public + * @since 1.0 + */ + function getMailboxes($reference = '', $restriction_search = 0, $returnAttributes=false) + { + #echo (__METHOD__.$reference."#".$restriction_search.'#'.function_backtrace()."
"); + if ( is_bool($restriction_search) ){ + $restriction_search = (int) $restriction_search; + } + + if ( is_int( $restriction_search ) ){ + switch ( $restriction_search ) { + case 0: + $mailbox = "*"; + break; + case 1: + $mailbox = $reference; + $reference = ''; + break; + case 2: + $mailbox = "%"; + break; + } + }else{ + if ( is_string( $restriction_search ) ){ + $mailbox = $restriction_search; + }else { + return new PEAR_Error('Wrong data for 2nd parameter'); + } + } + + if( PEAR::isError( $ret = $this->cmdList($reference, $mailbox) ) ){ + return $ret; + } + + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + $ret_aux=array(); + if( isset($ret["PARSED"]) ){ + foreach( $ret["PARSED"] as $mbox ){ + + //If the folder has the \NoSelect atribute we don't put in the list + // it solves a bug in wu-imap that crash the IMAP server if we select that mailbox + if( isset($mbox["EXT"]["LIST"]["NAME_ATTRIBUTES"]) ){ + #if( !(in_array('\NoSelect',$mbox["EXT"]["LIST"]["NAME_ATTRIBUTES"]) || in_array('\Noselect',$mbox["EXT"]["LIST"]["NAME_ATTRIBUTES"])) ){ + if( $returnAttributes){ + $ret_aux[]=array( 'MAILBOX' => $mbox["EXT"]["LIST"]["MAILBOX_NAME"], + 'ATTRIBUTES' => $mbox["EXT"]["LIST"]["NAME_ATTRIBUTES"] , + 'HIERACHY_DELIMITER' => $mbox["EXT"]["LIST"]["HIERACHY_DELIMITER"] ) ; + }else{ + $ret_aux[]=$mbox["EXT"]["LIST"]["MAILBOX_NAME"]; + } + #} + } + } + } + return $ret_aux; + } + + + + /** + * check if the mailbox name exists + * + * @param string $mailbox mailbox name to check existance + * + * @return mixed boolean true/false or PEAR_Error on failure + * + * @access public + * @since 1.0 + */ + function mailboxExist($mailbox) + { + // true means do an exact match + if( PEAR::isError( $ret = $this->getMailboxes( $mailbox, 1, false ) ) ){ + return $ret; + } + if( count( $ret ) > 0 ){ + foreach ($ret as $mailbox_name) { + if ($mailbox_name == $mailbox) { + return true; + } + } + } + return false; + } + + + + /** + * Creates the mailbox $mailbox + * + * @param string $mailbox mailbox name to create + * @param array $options options to pass to create (default is no options) + * + * @return mixed true on success/PearError on failure + * + * @access public + * @since 1.0 + */ + function createMailbox($mailbox, $options = null) + { + if (PEAR::isError($ret = $this->cmdCreate($mailbox, $options))) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + return true; + } + + + + /** + * Deletes the mailbox $mailbox + * + * @param string $mailbox mailbox name to delete + * + * @return mixed true on success/PearError on failure + * + * @access public + * @since 1.0 + */ + function deleteMailbox($mailbox) + { + // TODO verificar que el mailbox se encuentra vacio y, sino borrar los mensajes antes~!!!!!! + // ToDo find someone who can translate the above todo + if (PEAR::isError($ret = $this->cmdDelete($mailbox))) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + return true; + } + + + + /** + * Renames the mailbox $mailbox + * + * @param string $oldmailbox mailbox name to rename + * @param string $newmailbox new name for the mailbox + * @param array $options options to pass to rename + * + * @return mixed true on success/PearError on failure + * + * @access public + * @since 1.0 + */ + function renameMailbox($oldmailbox, $newmailbox, $options = null) + { + if (PEAR::isError($ret = $this->cmdRename($oldmailbox, $newmailbox, $options))) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + return true; + } + + + + + /****************************************************************** + ** ** + ** SUBSCRIPTION METHODS ** + ** ** + ******************************************************************/ + + /** + * Subscribes to the selected mailbox + * + * @param string $mailbox mailbox name to subscribe (default is current mailbox) + * + * @return mixed true on success/PearError on failure + * + * @access public + * @since 1.0 + */ + function subscribeMailbox($mailbox = null ) + { + if($mailbox == null){ + $mailbox = $this->getCurrentMailbox(); + } + if (PEAR::isError($ret = $this->cmdSubscribe($mailbox))) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + return true; + } + + + + /** + * Removes the subscription to a mailbox + * + * @param string $mailbox mailbox name to unsubscribe (default is current mailbox) + * + * @return mixed true on success/PearError on failure + * + * @access public + * @since 1.0 + */ + function unsubscribeMailbox($mailbox = null) + { + if($mailbox == null){ + $mailbox = $this->getCurrentMailbox(); + } + if (PEAR::isError($ret = $this->cmdUnsubscribe($mailbox))) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + return true; + } + + + + /** + * Lists the subscription to mailboxes + * + * @param string $mailbox_base mailbox name start the search (see to getMailboxes() ) + * @param string $mailbox_name mailbox name filter the search (see to getMailboxes() ) + * + * @return mixed true on success/PearError on failure + * + * @access public + * @since 1.0 + */ + function listsubscribedMailboxes($reference = '' , $restriction_search = 0, $returnAttributes = false) + { + #echo __METHOD__." called for ".$reference."#$restriction_search#
"; + if ( is_bool($restriction_search) ){ + $restriction_search = (int) $restriction_search; + } + + if ( is_int( $restriction_search ) ){ + switch ( $restriction_search ) { + case 0: + $mailbox = "*"; + break; + case 1: + $mailbox = $reference; + $reference = '%'; + break; + case 2: + $mailbox = "%"; + break; + } + }else{ + if ( is_string( $restriction_search ) ){ + $mailbox = $restriction_search; + }else { + return new PEAR_Error("UPS... you "); + } + } + + if( PEAR::isError( $ret=$this->cmdLsub($reference, $mailbox) ) ){ + return $ret; + } + //$ret=$this->cmdLsub($mailbox_base, $mailbox_name); + + + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + + $ret_aux=array(); + if( isset($ret["PARSED"]) ){ + foreach( $ret["PARSED"] as $mbox ){ + if( isset($mbox["EXT"]["LSUB"]["MAILBOX_NAME"]) ){ + if( $returnAttributes){ + $ret_aux[]=array( + 'MAILBOX' => $mbox["EXT"]["LSUB"]["MAILBOX_NAME"], + 'ATTRIBUTES' => $mbox["EXT"]["LSUB"]["NAME_ATTRIBUTES"], + 'HIERACHY_DELIMITER' => $mbox["EXT"]["LSUB"]["HIERACHY_DELIMITER"] + ) ; + } else { + $ret_aux[]=$mbox["EXT"]["LSUB"]["MAILBOX_NAME"]; + } + } + } + } + return $ret_aux; + } + + + + + /****************************************************************** + ** ** + ** FLAGS METHODS ** + ** ** + ******************************************************************/ + + /** + * Lists the flags of the selected messages + * + * @param mixed $msg_id the message list + * + * @return mixed array on success/PearError on failure + * + * @access public + * @since 1.0 + */ + function getFlags( $msg_id = null , $uidStore = false) + { + // You can also provide an array of numbers to those emails + if( $msg_id != null){ + if(is_array($msg_id)){ + $message_set=$this->_getSearchListFromArray($msg_id); + }else{ + $message_set=$msg_id; + } + }else{ + $message_set="1:*"; + } + if ($uidStore == true ) { + $ret = $this->cmdUidFetch($message_set, 'FLAGS'); + } else { + $ret = $this->cmdFetch($message_set, 'FLAGS'); + } + + if (PEAR::isError($ret)) { + return $ret; + } + if(strtoupper($ret["RESPONSE"]["CODE"]) != "OK"){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + $flags=array(); + if(isset($ret["PARSED"])){ + foreach($ret["PARSED"] as $msg_flags){ + if(isset($msg_flags["EXT"]["FLAGS"])){ + $flags[]=$msg_flags["EXT"]["FLAGS"]; + } + } + } + return $flags; + } + + + + /** + * Sets the flags of the selected messages + * + * @param mixed $msg_id the message list or string "all" for all + * @param mixed $flags flags to set (space separated String or array) + * @param string $mod "set" to set flags (default) + * "add" to add flags + * "remove" to remove flags + * @param boolean $uidStore msg_id contains UID's instead of Message Sequence Number if set to true + * + * @return mixed true on success/PearError on failure + * + * @since 1.1 + * @access public + */ + function setFlags($msg_id, $flags, $mod = 'set', $uidStore = false) + { + #error_log("egw-pear::Net::setFlags"); + // you can also provide an array of numbers to those emails + if ($msg_id == 'all') { + $message_set = '1:*'; + } else { + if (is_array($msg_id)) { + $message_set = $this->_getSearchListFromArray($msg_id); + } else { + $message_set = $msg_id; + } + } + + $flaglist = ''; + if (is_array($flags)) { + $flaglist = implode(' ', $flags); + } else { + $flaglist = $flags; + } + + switch ($mod) { + case 'set': + $dataitem = 'FLAGS'; + break; + case 'add': + $dataitem = '+FLAGS'; + break; + case 'remove': + $dataitem = '-FLAGS'; + break; + default: + // Wrong Input + return new PEAR_Error('wrong input $mod'); + break; + } + #error_log("egw-pear::Net::setFlags for Message: ".print_r($message_set,true)."->".$flaglist); + if($uidStore == true) { + $ret=$this->cmdUidStore($message_set, $dataitem, $flaglist); + } else { + $ret=$this->cmdStore($message_set, $dataitem, $flaglist); + } + if (PEAR::isError($ret)) { + return $ret; + } + if (strtoupper($ret['RESPONSE']['CODE']) != 'OK') { + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + + return true; + } + + + + /** + * adds flags to the selected messages + * + * @param mixed $flags flags to set (space separated String or array) + * @param mixed $msg_id the message list or string "all" for all + * + * @return mixed true on success/PearError on failure + * + * @since 1.1 + * @access public + */ + function addFlags($msg_id, $flags) + { + return $this->setFlags($msg_id, $flags, $mod = 'add'); + } + + + + /** + * adds the Seen flag (\Seen) to the selected messages + * + * @param mixed $msg_id the message list or string "all" for all + * + * @return mixed true on success/PearError on failure + * + * @since 1.1 + * @access public + */ + function addSeen($msg_id) + { + return $this->setFlags($msg_id, '\Seen', $mod = 'add'); + } + + + + /** + * adds the Answered flag (\Answered) to the selected messages + * + * @param mixed $msg_id the message list or string "all" for all + * + * @return mixed true on success/PearError on failure + * + * @since 1.1 + * @access public + */ + function addAnswered($msg_id) + { + return $this->setFlags($msg_id, '\Answered', $mod = 'add'); + } + + + + /** + * adds the Deleted flag (\Deleted) to the selected messages + * + * @param mixed $msg_id the message list or string "all" for all + * + * @return mixed true on success/PearError on failure + * + * @since 1.1 + * @access public + */ + function addDeleted($msg_id) + { + return $this->setFlags($msg_id, '\Deleted', $mod = 'add'); + } + + + + /** + * adds the Flagged flag (\Flagged) to the selected messages + * + * @param mixed $msg_id the message list or string "all" for all + * + * @return mixed true on success/PearError on failure + * + * @since 1.1 + * @access public + */ + function addFlagged($msg_id) + { + return $this->setFlags($msg_id, '\Flagged', $mod = 'add'); + } + + + + /** + * adds the Draft flag (\Draft) to the selected messages + * + * @param mixed $msg_id the message list or string "all" for all + * + * @return mixed true on success/PearError on failure + * + * @since 1.1 + * @access public + */ + function addDraft($msg_id) + { + return $this->setFlags($msg_id, '\Draft', $mod = 'add'); + } + + + + /** + * remove flags from the selected messages + * + * @param mixed $flags flags to remove (space separated string or array) + * @param mixed $msg_id the message list or string "all" for all + * + * @return mixed true on success/PearError on failure + * + * @since 1.1 + * @access public + */ + function removeFlags($msg_id, $flags) + { + return $this->setFlags($msg_id, $flags, $mod = 'remove'); + } + + + + /** + * remove the Seen flag (\Seen) from the selected messages + * + * @param mixed $msg_id the message list or string "all" for all + * + * @return mixed true on success/PearError on failure + * + * @since 1.1 + * @access public + */ + function removeSeen($msg_id) + { + return $this->setFlags($msg_id, '\Seen', $mod = 'remove'); + } + + + + /** + * remove the Answered flag (\Answered) from the selected messages + * + * @param mixed $msg_id the message list or string "all" for all + * + * @return mixed true on success/PearError on failure + * + * @since 1.1 + * @access public + */ + function removeAnswered($msg_id) + { + return $this->setFlags($msg_id, '\Answered', $mod = 'remove'); + } + + + + /** + * remove the Deleted flag (\Deleted) from the selected messages + * + * @param mixed $msg_id the message list or string "all" for all + * + * @return mixed true on success/PearError on failure + * + * @since 1.1 + * @access public + */ + function removeDeleted($msg_id) + { + return $this->setFlags($msg_id, '\Deleted', $mod = 'remove'); + } + + + + /** + * remove the Flagged flag (\Flagged) from the selected messages + * + * @param mixed $msg_id the message list or string "all" for all + * + * @return mixed true on success/PearError on failure + * + * @since 1.1 + * @access public + */ + function removeFlagged($msg_id) + { + return $this->setFlags($msg_id, '\Flagged', $mod = 'remove'); + } + + + + /** + * remove the Draft flag (\Draft) from the selected messages + * + * @param mixed $msg_id the message list or string "all" for all + * + * @return mixed true on success/PearError on failure + * + * @since 1.1 + * @access public + */ + function removeDraft($msg_id) + { + return $this->setFlags($msg_id, '\Draft', $mod = 'remove'); + } + + + + /** + * check the Seen flag + * + * @param mixed $message_nro the message to check + * + * @return mixed true or false if the flag is set PearError on Failure + * + * @access public + * @since 1.0 + */ + function isSeen($message_nro) + { + return $this->hasFlag( $message_nro, "\\Seen" ); + } + + + + /** + * check the Answered flag + * + * @param mixed $message_nro the message to check + * + * @return mixed true or false if the flag is set PearError on failure + * + * @access public + * @since 1.0 + */ + function isAnswered($message_nro) + { + return $this->hasFlag( $message_nro, "\\Answered" ); + } + + + + /** + * check the flagged flag + * + * @param mixed $message_nro the message to check + * + * @return mixed true or false if the flag is set PearError on failure + * + * @access public + * @since 1.0 + */ + function isFlagged($message_nro) + { + return $this->hasFlag( $message_nro, "\\Flagged" ); + } + + + + /** + * check the Draft flag + * + * @param mixed $message_nro the message to check + * + * @return mixed true or false if the flag is set PearError on failure + * + * @access public + * @since 1.0 + */ + function isDraft($message_nro) + { + return $this->hasFlag( $message_nro, "\\Draft" ); + } + + + + /** + * check the Deleted flag + * + * @param mixed $message_nro the message to check + * + * @return mixed true or false if the flag is set PearError on failure + * + * @access public + * @since 1.0 + */ + function isDeleted($message_nro) + { + return $this->hasFlag( $message_nro, "\\Deleted" ); + } + + + + /** + * checks if a flag is set + * + * @param mixed $message_nro the message to check + * @param string $flag the flag that should be checked + * + * @return mixed true or false if the flag is set PearError on Failure + * + * @since 1.0 + * @access public + */ + function hasFlag($message_nro,$flag) + { + if ( PEAR::isError( $resp = $this->getFlags( $message_nro ) ) ) { + return $resp; + } + if(isset($resp[0]) ){ + if( is_array( $resp[0] ) ){ + if( in_array( $flag , $resp[0] ) ) + return true; + } + } + return false; + } + + + + + /****************************************************************** + ** ** + ** MISC METHODS ** + ** ** + ******************************************************************/ + + + /** + * expunge function. Sends the EXPUNGE command + * + * @return mixed true on success / PEAR Error on failure + * + * @access public + * @since 1.0 + */ + function expunge() + { + if (PEAR::isError($ret = $this->cmdExpunge())) { + return $ret; + } + if( strtoupper( $ret["RESPONSE"]["CODE"]) != "OK" ){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + return true; + } + + + + /** + * search function. Sends the SEARCH command + * + * @param string $search_list search criterias + * @param boolean $uidSearch if set to true UID SEARCH is send instead of SEARCH + * + * @return mixed message array or PEAR Error on failure + * + * @access public + * @since 1.0 + */ + function search($search_list, $uidSearch = false) + { + if($uidSearch){ + $ret = $this->cmdUidSearch($search_list); + }else{ + $ret = $this->cmdSearch($search_list); + } + if (PEAR::isError($ret)) { + return $ret; + } + if( strtoupper( $ret["RESPONSE"]["CODE"]) != "OK" ){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + return $ret["PARSED"]["SEARCH"]["SEARCH_LIST"]; + } + + + + /** + * sort function. Sends the SORT command + * + * @param string $sort_list sort program + * @param string $charset charset specification (default = 'US-ASCII') + * @param string $search_list searching criteria + * @param boolean $uidSort if set to true UID SORT is send instead of SORT + * + * @return mixed message array or PEAR Error on failure + * + * @access public + * @since 1.1 + */ + function sort($sort_list, $charset='US-ASCII', $search_list = '', $uidSort = false) + { + $sort_command = sprintf("(%s) %s %s", $sort_list, strtoupper($charset), $search_list); + + if ($uidSort) { + $ret = $this->cmdUidSort($sort_command); + } else { + $ret = $this->cmdSort($sort_command); + } + if (PEAR::isError($ret)) { + return $ret; + } + if (strtoupper($ret['RESPONSE']['CODE']) != 'OK') { + return new PEAR_Error($ret['RESPONSE']['CODE'] . ", " . $ret['RESPONSE']['STR_CODE']); + } + return $ret['PARSED']['SORT']['SORT_LIST']; + } + + + + + /****************************************************************** + ** ** + ** QUOTA METHODS ** + ** ** + ******************************************************************/ + + + /** + * Returns STORAGE quota details + * + * @param string $mailbox_name Mailbox to get quota info. (default is current mailbox) + * + * @return assoc array contaning the quota info on success or PEAR_Error on failure + * + * @access public + * @since 1.0 + */ + function getStorageQuotaRoot($mailbox_name = null ) + { + if($mailbox_name == null){ + $mailbox_name = $this->getCurrentMailbox(); + } + + + if ( PEAR::isError( $ret = $this->cmdGetQuotaRoot($mailbox_name) ) ) { + return new PEAR_Error($ret->getMessage()); + } + + if( strtoupper( $ret["RESPONSE"]["CODE"]) != "OK" ){ + // if the error is that the user does not have quota set return an array + // and not pear error + if( substr(strtoupper($ret["RESPONSE"]["STR_CODE"]),0,9) == "QUOTAROOT" ){ + return array('USED'=>'NOT SET', 'QMAX'=>'NOT SET'); + } + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + + if( isset( $ret['PARSED']['EXT']['QUOTA']['STORAGE'] ) ){ + return $ret['PARSED']['EXT']['QUOTA']['STORAGE']; + } + return array('USED'=>'NOT SET', 'QMAX'=>'NOT SET'); + } + + + + /** + * Returns STORAGE quota details + * + * @param string $mailbox_name Mailbox to get quota info. (default is current mailbox) + * + * @return assoc array contaning the quota info on success or PEAR_Error on failure + * + * @access public + * @since 1.0 + */ + function getStorageQuota($mailbox_name = null ) + { + if($mailbox_name == null){ + $mailbox_name = $this->getCurrentMailbox(); + } + + + if ( PEAR::isError( $ret = $this->cmdGetQuota($mailbox_name) ) ) { + return new PEAR_Error($ret->getMessage()); + } + + if( strtoupper( $ret["RESPONSE"]["CODE"]) != "OK" ){ + // if the error is that the user does not have quota set return an array + // and not pear error + if( substr(strtoupper($ret["RESPONSE"]["STR_CODE"]),0,5) == "QUOTA" ){ + return array('USED'=>'NOT SET', 'QMAX'=>'NOT SET'); + } + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + + if( isset( $ret['PARSED']['EXT']['QUOTA']['STORAGE'] ) ){ + return $ret['PARSED']['EXT']['QUOTA']['STORAGE']; + } + return array('USED'=>'NOT SET', 'QMAX'=>'NOT SET'); + } + + + + /** + * Returns MESSAGES quota details + * + * @param string $mailbox_name Mailbox to get quota info. (default is current mailbox) + * + * @return assoc array contaning the quota info on success or PEAR_Error on failure + * + * @access public + * @since 1.0 + */ + function getMessagesQuota($mailbox_name = null ) + { + if($mailbox_name == null){ + $mailbox_name = $this->getCurrentMailbox(); + } + + if ( PEAR::isError( $ret = $this->cmdGetQuota($mailbox_name) ) ) { + return new PEAR_Error($ret->getMessage()); + } + + if( strtoupper( $ret["RESPONSE"]["CODE"]) != "OK" ){ + // if the error is that the user does not have quota set return an array + // and not pear error + if( substr(strtoupper($ret["RESPONSE"]["STR_CODE"]),0,5) == "QUOTA" ){ + return array('USED'=>'NOT SET', 'QMAX'=>'NOT SET'); + } + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + + if( isset( $ret['PARSED']['EXT']['QUOTA']['MESSAGES'] ) ){ + return $ret['PARSED']['EXT']['QUOTA']['MESSAGES']; + } + return array('USED'=>'NOT SET', 'QMAX'=>'NOT SET'); + } + + + + /** + * sets STORAGE quota + * + * @param string $mailbox_name Mailbox to set quota + * @param int $quota Quotasize + * + * @return true on success or PEAR_Error on failure + * + * @access public + * @since 1.0 + */ + function setStorageQuota($mailbox_name, $quota) + { + if ( PEAR::isError( $ret = $this->cmdSetQuota($mailbox_name,$quota) ) ) { + return new PEAR_Error($ret->getMessage()); + } + if( strtoupper( $ret["RESPONSE"]["CODE"]) != "OK" ){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + return true; + } + + + + /** + * sets MESSAGES quota + * + * @param string $mailbox_name Mailbox to set quota + * @param int $quota Quotasize + * + * @return true on success or PEAR_Error on failure + * + * @access public + * @since 1.0 + */ + function setMessagesQuota($mailbox_name, $quota) + { + if ( PEAR::isError( $ret = $this->cmdSetQuota($mailbox_name,'',$quota) ) ) { + return new PEAR_Error($ret->getMessage()); + } + if( strtoupper( $ret["RESPONSE"]["CODE"]) != "OK" ){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + return true; + } + + + + + /****************************************************************** + ** ** + ** ACL METHODS ** + ** ** + ******************************************************************/ + + + /** + * get the Access Control List details + * + * @param string $mailbox_name Mailbox to get ACL info. (default is current mailbox) + * + * @return mixed string on success or false or PEAR_Error on failure + * + * @access public + * @since 1.0 + */ + function getACL($mailbox_name = null ) + { + if($mailbox_name == null){ + $mailbox_name = $this->getCurrentMailbox(); + } + if ( PEAR::isError( $ret = $this->cmdGetACL($mailbox_name) ) ) { + return new PEAR_Error($ret->getMessage()); + } + + if( strtoupper( $ret["RESPONSE"]["CODE"]) != "OK" ){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + + if( isset($ret['PARSED']['USERS']) ){ + return $ret['PARSED']['USERS']; + }else{ + return false; + } + } + + + + /** + * Set ACL on a mailbox + * + * @param string $mailbox_name the mailbox + * @param string $user user to set the ACL + * @param string $acl ACL list + * + * @return mixed true on success or PEAR_Error on failure + * + * @access public + * @since 1.0 + */ + function setACL($mailbox_name, $user, $acl) + { + if ( PEAR::isError( $ret = $this->cmdSetACL($mailbox_name, $user, $acl) ) ) { + return new PEAR_Error($ret->getMessage()); + } + if( strtoupper( $ret["RESPONSE"]["CODE"]) != "OK" ){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + return true; + } + + + + /** + * deletes the ACL on a mailbox + * + * @param string $mailbox_name the mailbox + * @param string $user user to delete the ACL + * + * @return mixed true on success, or PEAR_Error on failure + * + * @access public + * @since 1.0 + */ + function deleteACL($mailbox_name, $user) + { + if ( PEAR::isError( $ret = $this->cmdDeleteACL($mailbox_name, $user) ) ) { + return new PEAR_Error($ret->getMessage()); + } + if( strtoupper( $ret["RESPONSE"]["CODE"]) != "OK" ){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + return true; + } + + + + /** + * returns the rights that the user logged on has on the mailbox + * this method can be used by any user, not only the administrator + * + * @param string $mailbox_name the mailbox to query rights (default is current mailbox) + * + * @return mixed string containing the list of rights on success, or PEAR_Error on failure + * + * @access public + * @since 1.0 + */ + function getMyRights($mailbox_name = null) + { + + if($mailbox_name == null){ + $mailbox_name = $this->getCurrentMailbox(); + } + + + if ( PEAR::isError( $ret = $this->cmdMyRights($mailbox_name) ) ) { + return new PEAR_Error($ret->getMessage()); + } + if( strtoupper( $ret["RESPONSE"]["CODE"]) != "OK" ){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + + if(isset($ret['PARSED']['GRANTED'])){ + return $ret['PARSED']['GRANTED']; + } + + return new PEAR_Error('Bogus response from server!' ); + } + + + + /** + * returns an array containing the rights for given user on the mailbox + * this method can be used by any user, not only the administrator + * + * @param string $user the user to query rights + * @param string $mailbox_name the mailbox to query rights (default is current mailbox) + * + * @return mixed string containing the list of rights on success, or PEAR_Error on failure + * + * @access public + * @since 1.0 + */ + function getACLRights($user,$mailbox_name = null) + { + + if($mailbox_name == null){ + $mailbox_name = $this->getCurrentMailbox(); + } + + + if ( PEAR::isError( $ret = $this->cmdListRights($mailbox_name, $user) ) ) { + return new PEAR_Error($ret->getMessage()); + } + if( strtoupper( $ret["RESPONSE"]["CODE"]) != "OK" ){ + return new PEAR_Error($ret["RESPONSE"]["CODE"] . ", " . $ret["RESPONSE"]["STR_CODE"]); + } + + + if(isset($ret['PARSED']['GRANTED'])){ + return $ret['PARSED']['GRANTED']; + } + + return new PEAR_Error('Bogus response from server!' ); + + } + + + + + /****************************************************************** + ** ** + ** ANNOTATEMORE METHODS ** + ** ** + ******************************************************************/ + + + /** + * set annotation + * + * @param string $entry + * @param array $values + * @param string $mailbox_name (default is current mailbox) + * + * @return mixed true on success or PEAR Error on failure + * + * @access public + * @since 1.0.2 + */ + function setAnnotation($entry, $values, $mailbox_name = null ) + { + if($mailbox_name == null){ + $mailbox_name = $this->getCurrentMailbox(); + } + + if (PEAR::isError($ret = $this->cmdSetAnnotation($mailbox_name, $entry, $values))) { + return new PEAR_Error($ret->getMessage()); + } + if (strtoupper($ret['RESPONSE']['CODE']) != 'OK') { + return new PEAR_Error($ret['RESPONSE']['CODE'] . ', ' . $ret['RESPONSE']['STR_CODE']); + } + return true; + } + + + /** + * delete annotation + * + * @param string $entry + * @param array $values + * @param string $mailbox_name (default is current mailbox) + * + * @return mixed true on success or PEAR Error on failure + * + * @access public + * @since 1.0.2 + */ + function deleteAnnotation($entry, $values, $mailbox_name = null ) + { + if($mailbox_name == null){ + $mailbox_name = $this->getCurrentMailbox(); + } + + if (PEAR::isError($ret = $this->cmdDeleteAnnotation($mailbox_name, $entry, $values))) { + return new PEAR_Error($ret->getMessage()); + } + if (strtoupper($ret['RESPONSE']['CODE']) != 'OK') { + return new PEAR_Error($ret['RESPONSE']['CODE'] . ', ' . $ret['RESPONSE']['STR_CODE']); + } + return true; + } + + + /** + * get annotation + * + * @param string $entry + * @param array $values + * @param string $mailbox_name (default is current mailbox) + * + * @return mixed array containing annotations on success or PEAR Error on failure + * + * @access public + * @since 1.0.2 + */ + function getAnnotation($entries, $values, $mailbox_name = null) + { + if($mailbox_name == null){ + $mailbox_name = $this->getCurrentMailbox(); + } + if (!is_array($entries)) { + $entries = array($entries); + } + if (!is_array($values)) { + $values = array($values); + } + + if (PEAR::isError($ret = $this->cmdGetAnnotation($mailbox_name, $entries, $values))) { + return new PEAR_Error($ret->getMessage()); + } + if (strtoupper($ret['RESPONSE']['CODE']) != 'OK') { + return new PEAR_Error($ret['RESPONSE']['CODE'] . ', ' . $ret['RESPONSE']['STR_CODE']); + } + $ret_aux = array(); + if (isset($ret['PARSED'])) { + foreach ($ret['PARSED'] as $mbox) { + $rawvalues = $mbox['EXT']['ATTRIBUTES']; + $values = array(); + for ($i = 0; $i < count($rawvalues); $i += 2) { + $values[$rawvalues[$i]] = $rawvalues[$i + 1]; + } + $mbox['EXT']['ATTRIBUTES'] = $values; + $ret_aux[] = $mbox['EXT']; + } + } + if (count($ret_aux) == 1 && $ret_aux[0]['MAILBOX'] == $mailbox_name) { + if (count($entries) == 1 && $ret_aux[0]['ENTRY'] == $entries[0]) { + if (count($ret_aux[0]['ATTRIBUTES']) == 1 && count($values) == 1) { + $attrs = array_keys($ret_aux[0]['ATTRIBUTES']); + $vals = array_keys($values); + if ($attrs[0] == $vals[0]) { + return $ret_aux[0]['ATTRIBUTES'][$attrs[0]]; + } + } + } + } + return $ret_aux; + } + + + + /** + * Transform an array to a list to be used in the cmdFetch method + * + * @param array $arr array to transform + * + * @return string transformed array + * + * @access private + */ + function _getSearchListFromArray($arr){ + + $txt=implode(',' , $arr); + return $txt; + } + + + + + /***************************************************** + Net_POP3 Compatibility functions: + + Warning!!! + Those functions could dissapear in the future + + *********************************************************/ + + + /** + * same as getMailboxSize() + * Net_POP3 Compatibility function + * + * @return same as getMailboxSize(); + * + * @access public + */ + function getSize(){ + return $this->getMailboxSize(); + } + + /** + * same as getNumberOfMessages($mailbox) + * Net_POP3 Compatibility function + * + * @param string $mailbox Mailbox (default is current mailbox) + * + * @return same as getNumberOfMessages($mailbox) + * + * @access public + */ + function numMsg($mailbox = null){ + return $this->getNumberOfMessages($mailbox); + } + + + /** + * Returns the entire message with given message number. + * Net_POP3 Compatibility function + * + * @param $msg_id Message number + * + * @return mixed either entire message or PEAR Error on failure + * + * @access public + */ + function getMsg($msg_id) + { + if (PEAR::isError($ret = $this->getMessages($msg_id, false))) { + return $ret; + } + // false means that getMessages() must not use the msg number as array key + if(isset($ret[0])){ + return $ret[0]; + }else{ + return $ret; + } + + } + + + + /** + * same as getMessagesList($msg_id) + * Net_POP3 Compatibility function + * + * @param $msg_id Message number + * + * @return same as getMessagesList() + * + * @access public + */ + function getListing($msg_id = null) + { + return $this->getMessagesList($msg_id); + } + + + + /** + * same as deleteMessages($msg_id) + * Net_POP3 Compatibility function + * + * @param $msg_id Message number + * + * @return same as deleteMessages() + * + * @access public + */ + function deleteMsg($msg_id){ + return $this->deleteMessages($msg_id); + } + + +} +?> diff --git a/egw-pear/Net/IMAPProtocol.php b/egw-pear/Net/IMAPProtocol.php new file mode 100644 index 0000000000..3f30e9ad95 --- /dev/null +++ b/egw-pear/Net/IMAPProtocol.php @@ -0,0 +1,3405 @@ + | +// +----------------------------------------------------------------------+ +require_once 'Net/Socket.php'; + + + +/** + * Provides an implementation of the IMAP protocol using PEAR's + * Net_Socket:: class. + * + * @package Net_IMAP/Protocol + * @author Damian Alejandro Fernandez Sosa + */ +class Net_IMAPProtocol { + + + /** + * The auth methods this class support + * @var array + */ + var $supportedAuthMethods=array('DIGEST-MD5', 'CRAM-MD5', 'LOGIN'); + + + /** + * The auth methods this class support + * @var array + */ + var $supportedSASLAuthMethods=array('DIGEST-MD5', 'CRAM-MD5'); + + + /** + * _serverAuthMethods + * @var boolean + */ + var $_serverAuthMethods = null; + + + /** + * The the current mailbox + * @var string + */ + var $currentMailbox = "INBOX" ; + + + /** + * The socket resource being used to connect to the IMAP server. + * @var resource + */ + var $_socket = null; + + + /** + * The timeout for the connection to the IMAP server. + * @var int + */ + var $_timeout = null; + + + /** + * The options for SSL/TLS connection + * (see documentation for stream_context_create) + * @var array + */ + var $_streamContextOptions = null; + + + /** + * To allow class debuging + * @var boolean + */ + var $_debug = false; + var $dbgDialog = ''; + + + /** + * Print error messages + * @var boolean + */ + var $_printErrors = false; + + + /** + * Command Number + * @var int + */ + var $_cmd_counter = 1; + + + /** + * Command Number for IMAP commands + * @var int + */ + var $_lastCmdID = 1; + + + /** + * Command Number + * @var boolean + */ + var $_unParsedReturn = false; + + + /** + * _connected: checks if there is a connection made to a imap server or not + * @var boolean + */ + var $_connected = false; + + + /** + * Capabilities + * @var boolean + */ + var $_serverSupportedCapabilities = null; + + + /** + * Use UTF-7 funcionallity + * @var boolean + */ + var $_useUTF_7 = true; + + + + /** + * Constructor + * + * Instantiates a new Net_IMAP object. + * + * @since 1.0 + */ + function Net_IMAPProtocol() + { + $this->_socket = new Net_Socket(); + + /* + * Include the Auth_SASL package. If the package is not available, + * we disable the authentication methods that depend upon it. + */ + + + if ((@include_once 'Auth/SASL.php') == false) { + foreach($this->supportedSASLAuthMethods as $SASLMethod){ + $pos = array_search( $SASLMethod , $this->supportedAuthMethods); + unset($this->supportedAuthMethods[$pos]); + } + } + + } + + + /** + * Attempt to connect to the IMAP server. + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + function cmdConnect($host= "localhost" , $port = 143) + { + if( $this->_connected ){ + return new PEAR_Error( 'already connected, logout first!' ); + } + if (PEAR::isError($error = $this->_socket->connect($host, $port, null, $this->_timeout, $this->_streamContextOptions))) { + return $error; + } + if ( PEAR::isError( $this->_getRawResponse() ) ) { + return new PEAR_Error( 'unable to open socket' ); + } + $this->_connected = true; + return true; + } + + + /** + * get the cmd ID + * + * @return string Returns the CmdID and increment the counter + * + * @access private + * @since 1.0 + */ + function _getCmdId() + { + $this->_lastCmdID = "A000" . $this->_cmd_counter ; + $this->_cmd_counter++; + return $this->_lastCmdID; + } + + + /** + * get the last cmd ID + * + * @return string Returns the last cmdId + * + * @access public + * @since 1.0 + */ + function getLastCmdId() + { + return $this->_lastCmdID; + } + + + + + /** + * get current mailbox name + * + * @return string Returns the current mailbox + * + * @access public + * @since 1.0 + */ + function getCurrentMailbox() + { + return $this->currentMailbox; + } + + + + + /** + * Sets the debuging information on or off + * + * @param boolean True or false + * + * @return nothing + * @access public + * @since 1.0 + */ + function setDebug($debug = true) + { + $this->_debug = $debug; + } + + + function getDebugDialog() + { + return $this->dbgDialog; + } + + /** + * Sets printed output of errors on or of + * + * @param boolean true or false + * + * @return nothing + * @access public + * @since 1.1 + */ + function setPrintErrors($printErrors = true) + { + $this->_printErrors = $printErrors; + } + + + /** + * Send the given string of data to the server. + * + * @param string $data The string of data to send. + * + * @return mixed True on success or a PEAR_Error object on failure. + * + * @access private + * @since 1.0 + */ + function _send($data) + { + if($this->_socket->eof() ){ + return new PEAR_Error( 'Failed to write to socket: (connection lost!) ' ); + } + if ( PEAR::isError( $error = $this->_socket->write( $data ) ) ) { + + return new PEAR_Error( 'Failed to write to socket: ' . + $error->getMessage() ); + } + + if( $this->_debug ){ + // C: means this data was sent by the client (this class) + echo "C: $data"; + $this->dbgDialog.="C: $data"; + } + return true; + } + + /** + * Receive the given string of data from the server. + * + * @return mixed a line of response on success or a PEAR_Error object on failure. + * + * @access private + * @since 1.0 + */ + function _recvLn() + { + + if (PEAR::isError( $this->lastline = $this->_socket->gets( 8192 ) ) ) { + return new PEAR_Error('Failed to write to socket: ' . + $this->lastline->getMessage() ); + } + if($this->_debug){ + // S: means this data was sent by the IMAP Server + echo "S: " . $this->lastline . "" ; + $this->dbgDialog.="S: " . $this->lastline . "" ; + } + if( $this->lastline == '' ){ + return new PEAR_Error('Failed to receive from the socket: ' ); + } + return $this->lastline; + } + + + + + + /** + * Send a command to the server with an optional string of arguments. + * A carriage return / linefeed (CRLF) sequence will be appended to each + * command string before it is sent to the IMAP server. + * + * @param string $commandId The IMAP cmdID to send to the server. + * @param string $command The IMAP command to send to the server. + * @param string $args A string of optional arguments to append + * to the command. + * + * @return mixed The result of the _send() call. + * + * @access private + * @since 1.0 + */ + function _putCMD($commandId , $command, $args = '') + { + if ( !empty( $args ) ) { + return $this->_send( $commandId . " " . $command . " " . $args . "\r\n" ); + } + return $this->_send( $commandId . " " . $command . "\r\n" ); + } + + + + + + + /** + * Get a response from the server with an optional string of commandID. + * A carriage return / linefeed (CRLF) sequence will be appended to each + * command string before it is sent to the IMAP server. + * + * @param string $commandid The IMAP commandid retrive from the server. + * + * @return string The result response. + * + * @access private + */ + function _getRawResponse($commandId = '*') + { + $arguments = ''; + while ( !PEAR::isError( $this->_recvLn() ) ) { + $reply_code = strtok( $this->lastline , ' ' ); + $arguments.= $this->lastline; + if ( !(strcmp( $commandId , $reply_code ) ) ) { + return $arguments; + } + } + return $arguments; + } + + + + + + /** + * get the "returning of the unparsed response" feature status + * + * @return boolean return if the unparsed response is returned or not + * + * @access public + * @since 1.0 + * + */ + function getUnparsedResponse() + { + return $this->_unParsedReturn; + } + + /** + * set the options for a SSL/TLS connection + * (see documentation for stream_context_create) + * + * @param array $options the options for the SSL/TLS connection + * @return nothing + * + * @access public + * @since 1.1 + */ + function setStreamContextOptions($options) + { + $this->_streamContextOptions = $options; + } + + /** + * set the the timeout for the connection to the IMAP server. + * + * @param int $timeout the timeout + * @return nothing + * + * @access public + * @since 1.1 + */ + function setTimeout($timeout) + { + $this->_timeout = $timeout; + } + + + /** + * set the "returning of the unparsed response" feature on or off + * + * @param boolean $status: true: feature is on + * @return nothing + * + * @access public + * @since 1.0 + */ + function setUnparsedResponse($status) + { + $this->_unParsedReturn = $status; + } + + + + + + + /** + * Attempt to login to the iMAP server. + * + * @param string The userid to authenticate as. + * @param string The password to authenticate with. + * + * @return array Returns an array containing the response + * + * @access public + * @since 1.0 + */ + function cmdLogin($uid , $pwd) + { + $param="\"$uid\" \"$pwd\""; + return $this->_genericCommand('LOGIN', $param); + } + + + + + + + /** + * Attempt to authenticate to the iMAP server. + * @param string The userid to authenticate as. + * @param string The password to authenticate with. + * @param string The cmdID. + * + * @return array Returns an array containing the response + * + * @access public + * @since 1.0 + */ + function cmdAuthenticate($uid , $pwd , $userMethod = null) + { + + if( !$this->_connected ){ + return new PEAR_Error('not connected!'); + } + + $cmdid = $this->_getCmdId(); + + + if ( PEAR::isError( $method = $this->_getBestAuthMethod($userMethod) ) ) { + return $method; + } + + + switch ($method) { + case 'DIGEST-MD5': + $result = $this->_authDigest_MD5( $uid , $pwd , $cmdid ); + break; + case 'CRAM-MD5': + $result = $this->_authCRAM_MD5( $uid , $pwd ,$cmdid ); + break; + case 'LOGIN': + $result = $this->_authLOGIN( $uid , $pwd , $cmdid ); + break; + + default : + $result = new PEAR_Error( "$method is not a supported authentication method" ); + break; + } + + $args = $this->_getRawResponse( $cmdid ); + return $this->_genericImapResponseParser( $args , $cmdid ); + + } + + + + + + + + + /* Authenticates the user using the DIGEST-MD5 method. + * + * @param string The userid to authenticate as. + * @param string The password to authenticate with. + * @param string The cmdID. + * + * @return array Returns an array containing the response + * + * @access private + * @since 1.0 + */ + function _authDigest_MD5($uid , $pwd , $cmdid) + { + class_exists('Auth_SASL') || require_once 'Auth/SASL.php'; + if ( PEAR::isError($error = $this->_putCMD( $cmdid ,"AUTHENTICATE" , "DIGEST-MD5") ) ) { + return $error; + } + + if (PEAR::isError( $args = $this->_recvLn() ) ) { + return $args; + } + + $this->_getNextToken( $args , $plus ); + + $this->_getNextToken( $args , $space ); + + $this->_getNextToken( $args , $challenge ); + + $challenge = base64_decode( $challenge ); + + $digest = &Auth_SASL::factory('digestmd5'); + + $auth_str = base64_encode($digest->getResponse($uid, $pwd, $challenge,"localhost", "imap")); + + if ( PEAR::isError( $error = $this->_send("$auth_str\r\n"))) { + return $error; + } + + if ( PEAR::isError( $args = $this->_recvLn() )) { + return $args; + } + /* + * We don't use the protocol's third step because IMAP doesn't allow + * subsequent authentication, so we just silently ignore it. + */ + if ( PEAR::isError( $error = $this->_send( "\r\n" ) ) ) { + return $error; + } + } + + + + + + + + + /* Authenticates the user using the CRAM-MD5 method. + * + * @param string The userid to authenticate as. + * @param string The password to authenticate with. + * @param string The cmdID. + * + * @return array Returns an array containing the response + * + * @access private + * @since 1.0 + */ + function _authCRAM_MD5($uid, $pwd, $cmdid) + { + + class_exists('Auth_SASL') || require_once 'Auth/SASL.php'; + + if ( PEAR::isError($error = $this->_putCMD( $cmdid ,"AUTHENTICATE" , "CRAM-MD5") ) ) { + return $error; + } + + if ( PEAR::isError( $args = $this->_recvLn() ) ) { + return $args; + } + + $this->_getNextToken( $args , $plus ); + + $this->_getNextToken( $args , $space ); + + $this->_getNextToken( $args , $challenge ); + + $challenge = base64_decode( $challenge ); + + $cram = &Auth_SASL::factory('crammd5'); + + $auth_str = base64_encode( $cram->getResponse( $uid , $pwd , $challenge ) ); + + if ( PEAR::isError( $error = $this->_send( $auth_str."\r\n" ) ) ) { + return $error; + } + + } + + + + + + + + + + /* Authenticates the user using the LOGIN method. + * + * @param string The userid to authenticate as. + * @param string The password to authenticate with. + * @param string The cmdID. + * + * @return array Returns an array containing the response + * + * @access private + * @since 1.0 + */ + function _authLOGIN($uid, $pwd, $cmdid) + { + + if (PEAR::isError($error = $this->_putCMD($cmdid,"AUTHENTICATE", "LOGIN"))) { + return $error; + } + + if (PEAR::isError($args = $this->_recvLn() )) { + return $args; + } + + $this->_getNextToken( $args , $plus ); + + $this->_getNextToken( $args , $space ); + + $this->_getNextToken( $args , $challenge ); + + $challenge = base64_decode( $challenge ); + + $auth_str = base64_encode( "$uid" ); + + if ( PEAR::isError( $error = $this->_send( $auth_str."\r\n" ) ) ) { + return $error; + } + + if (PEAR::isError( $args = $this->_recvLn() ) ) { + return $args; + } + + $auth_str = base64_encode( "$pwd" ); + + if ( PEAR::isError($error = $this->_send( $auth_str."\r\n" ) ) ) { + return $error; + } + + } + + + + + + + + + /** + * Returns the name of the best authentication method that the server + * has advertised. + * + * @param string if !=null,authenticate with this method ($userMethod). + * + * @return mixed Returns a string containing the name of the best + * supported authentication method or a PEAR_Error object + * if a failure condition is encountered. + * @access private + * @since 1.0 + */ + function _getBestAuthMethod($userMethod = null) + { + $this->cmdCapability(); + + if($userMethod != null ){ + + $methods = array(); + + $methods[] = $userMethod; + + }else{ + $methods = $this->supportedAuthMethods; + } + + if( ($methods != null) && ($this->_serverAuthMethods != null)){ + foreach ( $methods as $method ) { + if ( in_array( $method , $this->_serverAuthMethods ) ) { + return $method; + } + } + $serverMethods=implode(',' ,$this->_serverAuthMethods); + $myMethods=implode(',' ,$this->supportedAuthMethods); + return new PEAR_Error("$method NOT supported authentication method!. This IMAP server " . + "supports these methods: $serverMethods, but I support $myMethods"); + }else{ + return new PEAR_Error("This IMAP server don't support any Auth methods"); + } + } + + + + + + + + + + /** + * Attempt to disconnect from the iMAP server. + * + * @return array Returns an array containing the response + * + * @access public + * @since 1.0 + */ + function cmdLogout() + { + if( !$this->_connected ){ + return new PEAR_Error( 'not connected!' ); + } + + if ( PEAR::isError( $args = $this->_genericCommand( 'LOGOUT' ) ) ) { + error_log(__METHOD__.$args->message); + return $args; + } + if (PEAR::isError( $reval = $this->_socket->disconnect() ) ) { + error_log(__METHOD__.$reval->message); + return new PEAR_Error('socket disconnect failed'); + } + + return $args; + // not for now + //return $this->_genericImapResponseParser($args,$cmdid); + + } + + + + + + /** + * Send the NOOP command. + * + * @return array Returns an array containing the response + * + * @access public + * @since 1.0 + */ + function cmdNoop() + { + return $this->_genericCommand('NOOP'); + } + + + + + + + + + + /** + * Send the CHECK command. + * + * @return array Returns an array containing the response + * + * @access public + * @since 1.0 + */ + function cmdCheck() + { + return $this->_genericCommand('CHECK'); + } + + + + + + + + + + + /** + * Send the Select Mailbox Command + * + * @param string The mailbox to select. + * + * @return array Returns an array containing the response + * + * @access public + * @since 1.0 + */ + function cmdSelect($mailbox) + { + $mailbox_name=$this->_createQuotedString($mailbox); + if( !PEAR::isError( $ret= $this->_genericCommand('SELECT', $mailbox_name) ) ){ + $this->currentMailbox = $mailbox; + } + return $ret; + } + + + + + + + + + + + /** + * Send the EXAMINE Mailbox Command + * + * @param string The mailbox to examine. + * @return array Returns an array containing the response + * + * @access public + * @since 1.0 + */ + function cmdExamine($mailbox) + { + + $mailbox_name=$this->_createQuotedString($mailbox); + $ret=$this->_genericCommand('EXAMINE', $mailbox_name); + $parsed=''; + if(isset( $ret["PARSED"] ) ){ + for($i=0;$i$parsed,"RESPONSE"=>$ret["RESPONSE"]); + } + + + + + + + + /** + * Send the CREATE Mailbox Command + * + * @param string $mailbox The mailbox to create. + * @param array $options options to pass to create + * @return array Returns an array containing the response + * + * @access public + * @since 1.0 + */ + function cmdCreate($mailbox, $options = null) + { + $args = ""; + $mailbox_name=$this->_createQuotedString($mailbox); + $args = $this->_getCreateParams($options); + return $this->_genericCommand('CREATE', $mailbox_name.$args); + } + + /** + * Send the RENAME Mailbox Command + * + * @param string $mailbox The old mailbox name. + * @param string $new_mailbox The new (renamed) mailbox name. + * @param array $options options to pass to create + * + * @return array Returns an array containing the response + * + * @access public + * @since 1.0 + */ + function cmdRename($mailbox, $new_mailbox, $options = null) + { + $mailbox_name=$this->_createQuotedString($mailbox); + $new_mailbox_name=$this->_createQuotedString($new_mailbox); + $args = $this->_getCreateParams($options); + return $this->_genericCommand('RENAME', "$mailbox_name $new_mailbox_name".$args ); + } + + /** + * Send the DELETE Mailbox Command + * + * @param string The mailbox name to delete. + * + * @return array Returns an array containing the response + * + * @access public + * @since 1.0 + */ + function cmdDelete($mailbox) + { + $mailbox_name=$this->_createQuotedString($mailbox); + return $this->_genericCommand('DELETE', $mailbox_name); + } + + + + + + + + /** + * Send the SUSCRIBE Mailbox Command + * + * @param string The mailbox name to suscribe. + * + * @return array Returns an array containing the response + * + * @access public + * @since 1.0 + */ + function cmdSubscribe($mailbox) + { + $mailbox_name=$this->_createQuotedString($mailbox); + return $this->_genericCommand('SUBSCRIBE', $mailbox_name ); + } + + + + + + + + + /** + * Send the UNSUSCRIBE Mailbox Command + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + function cmdUnsubscribe($mailbox) + { + $mailbox_name=$this->_createQuotedString($mailbox); + return $this->_genericCommand('UNSUBSCRIBE', $mailbox_name ); + } + + + + + + + + + /** + * Send the FETCH Command + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + function cmdFetch($msgset, $fetchparam) + { + return $this->_genericCommand('FETCH' , "$msgset $fetchparam" ); + } + + + + + + + + /** + * Send the CAPABILITY Command + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + function cmdCapability() + { + $ret = $this->_genericCommand( 'CAPABILITY' ); + + if(isset( $ret["PARSED"] ) ){ + foreach($ret["PARSED"] as $substruct) { + if ($substruct["COMMAND"] == "CAPABILITY") { + $subrv=$substruct["EXT"]["CAPABILITY"]; + break; + } + } + $ret["PARSED"]=$subrv; + //fill the $this->_serverAuthMethods and $this->_serverSupportedCapabilities arrays + foreach( (array)$ret["PARSED"]["CAPABILITIES"] as $auth_method ){ + if( strtoupper( substr( $auth_method , 0 ,5 ) ) == "AUTH=" ) + $this->_serverAuthMethods[] = substr( $auth_method , 5 ); + } + // Keep the capabilities response to use ir later + $this->_serverSupportedCapabilities = $ret["PARSED"]["CAPABILITIES"]; + } + + return $ret; + } + + /** + * Send the CAPABILITY Command + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + function cmdNamespace() + { + $ret = $this->_genericCommand( 'NAMESPACE' ); + + if(isset( $ret["PARSED"] ) ){ + $ret["PARSED"]=$ret["PARSED"][0]["EXT"]["NAMESPACE"]; + // Keep the namespace response for later use + $this->_namespace = $ret["PARSED"]["NAMESPACES"]; + } + + return $ret; + } + + + /** + * Send the STATUS Mailbox Command + * + * @param string $mailbox the mailbox name + * @param mixed $request the request status + * it could be an array or space separated string of + * MESSAGES | RECENT | UIDNEXT + * UIDVALIDITY | UNSEEN + * @return array Returns a Parsed Response + * + * @access public + * @since 1.0 + */ + function cmdStatus($mailbox, $request) + { + $mailbox_name=$this->_createQuotedString($mailbox); + + // make array from $request if it is none + if (!is_array($request)) { + $request = explode(' ', $request); + } + + // see RFC 3501 + $valid_status_data = array('MESSAGES', 'RECENT', 'UIDNEXT', 'UIDVALIDITY', 'UNSEEN'); + + foreach ($request as $status_data) { + if (!in_array($status_data, $valid_status_data)) { + $this->_prot_error("request '$status_data' is invalid! see RFC 3501!!!!" , __LINE__ , __FILE__); + } + } + + // back to space separated string + $request = implode(' ', $request); + + $ret = $this->_genericCommand('STATUS', $mailbox_name.' ('.$request.')'); + + if (isset($ret['PARSED'])) { + foreach ($ret['PARSED'] as &$parsed) + { + if (!empty($parsed['EXT'])) + { + if(empty($ret['RESPONSE']['CODE'])) $ret['RESPONSE']['CODE'] ='OK'; + $ret['PARSED'] = $parsed['EXT']; + break; + } + } + } + return $ret; + } + + + + + + + /** + * Send the LIST Command + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + function cmdList($mailbox_base, $mailbox) + { + $mailbox_name=$this->_createQuotedString($mailbox); + $mailbox_base=$this->_createQuotedString($mailbox_base); + return $this->_genericCommand('LIST', "$mailbox_base $mailbox_name" ); + } + + + + + + + /** + * Send the LSUB Command + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + function cmdLsub($mailbox_base, $mailbox) + { + $mailbox_name=$this->_createQuotedString($mailbox); + $mailbox_base=$this->_createQuotedString($mailbox_base); + return $this->_genericCommand('LSUB', "$mailbox_base $mailbox_name" ); + } + + + + + + + /** + * Send the APPEND Command + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + function cmdAppend($mailbox, $msg , $flags_list = '' ,$time = '') + { + if(!$this->_connected){ + return new PEAR_Error('not connected!'); + } + + + $cmdid=$this->_getCmdId(); + $msg_size=$this->_getLineLength($msg); + + $mailbox_name=$this->_createQuotedString($mailbox); + if($flags_list != '') { + $flags_list = " ($flags_list)"; + } + // TODO: + // Falta el codigo para que flags list y time hagan algo!! + if( $this->hasCapability( "LITERAL+" ) == true ){ + $param=sprintf("%s%s%s {%s+}\r\n%s",$mailbox_name,$flags_list,$time,$msg_size,$msg); + if (PEAR::isError($error = $this->_putCMD($cmdid , 'APPEND' , $param ) ) ) { + return $error; + } + }else{ + $param=sprintf("%s%s%s {%s}",$mailbox_name,$flags_list,$time,$msg_size); + if (PEAR::isError($error = $this->_putCMD($cmdid , 'APPEND' , $param ) ) ) { + return $error; + } + if (PEAR::isError($error = $this->_recvLn() ) ) { + return $error; + } + + if (PEAR::isError($error = $this->_send( $msg."\r\n" ) ) ) { + return $error; + } + } + + + $args=$this->_getRawResponse($cmdid); + $ret = $this->_genericImapResponseParser($args,$cmdid); + return $ret; + } + + + + /** + * Send the CLOSE command. + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + function cmdClose() + { + return $this->_genericCommand('CLOSE'); + } + + + + + + + /** + * Send the EXPUNGE command. + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + function cmdExpunge() + { + $ret=$this->_genericCommand('EXPUNGE'); + if (PEAR::isError($ret)) return new PEAR_Error('could not Expunge!'); + if(isset( $ret["PARSED"] ) ){ + $parsed=$ret["PARSED"]; + unset($ret["PARSED"]); + foreach($parsed as $command){ + if( strtoupper($command["COMMAND"]) == 'EXPUNGE' ){ + $ret["PARSED"][$command["COMMAND"]][]=$command["NRO"]; + }else{ + $ret["PARSED"][$command["COMMAND"]]=$command["NRO"]; + } + } + } + return $ret; + } + + + + + + + + /** + * Send the SEARCH command. + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + + function cmdSearch($search_cmd) + { + /* if($_charset != '' ) + $_charset = "[$_charset] "; + $param=sprintf("%s%s",$charset,$search_cmd); + */ + $ret = $this->_genericCommand('SEARCH', $search_cmd ); + if(isset( $ret["PARSED"] ) ){ + $ret["PARSED"]=$ret["PARSED"][0]["EXT"]; + } + return $ret; + } + + + /** + * Send the SORT command. + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.1 + */ + function cmdSort($sort_cmd) + { + /* + if ($_charset != '' ) + $_charset = "[$_charset] "; + $param = sprintf("%s%s",$charset,$search_cmd); + */ + $ret = $this->_genericCommand('SORT', $sort_cmd); + if (isset($ret['PARSED'])) { + $ret['PARSED'] = $ret['PARSED'][0]['EXT']; + } + return $ret; + } + + + /** + * Send the STORE command. + * + * @param string $message_set the sessage_set + * @param string $dataitem: the way we store the flags + * FLAGS: replace the flags whith $value + * FLAGS.SILENT: replace the flags whith $value but don't return untagged responses + * + * +FLAGS: Add the flags whith $value + * +FLAGS.SILENT: Add the flags whith $value but don't return untagged responses + * + * -FLAGS: Remove the flags whith $value + * -FLAGS.SILENT: Remove the flags whith $value but don't return untagged responses + * + * @param string $value + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + + function cmdStore($message_set, $dataitem, $value) + { + /* As said in RFC2060... + C: A003 STORE 2:4 +FLAGS (\Deleted) + S: * 2 FETCH FLAGS (\Deleted \Seen) + S: * 3 FETCH FLAGS (\Deleted) + S: * 4 FETCH FLAGS (\Deleted \Flagged \Seen) + S: A003 OK STORE completed + */ + if( $dataitem!="FLAGS" && $dataitem!="FLAGS.SILENT" && $dataitem!="+FLAGS" && + $dataitem!="+FLAGS.SILENT" && $dataitem!="-FLAGS" && $dataitem!="-FLAGS.SILENT" ){ + $this->_prot_error("dataitem '$dataitem' is invalid! see RFC2060!!!!" , __LINE__ , __FILE__ ); + } + $param=sprintf("%s %s (%s)",$message_set,$dataitem,$value); + return $this->_genericCommand('STORE', $param ); + } + + + + + + + + /** + * Send the COPY command. + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + + function cmdCopy($message_set, $mailbox) + { + $mailbox_name=$this->_createQuotedString($mailbox); + return $this->_genericCommand('COPY', sprintf("%s %s",$message_set,$mailbox_name) ); + } + + + + + + + + + + + + + + function cmdUidFetch($msgset, $fetchparam) + { + return $this->_genericCommand('UID FETCH', sprintf("%s %s",$msgset,$fetchparam) ); + } + + + + + + + + + function cmdUidCopy($message_set, $mailbox) + { + $mailbox_name=$this->_createQuotedString($mailbox); + return $this->_genericCommand('UID COPY', sprintf("%s %s",$message_set,$mailbox_name) ); + } + + + + + + + + + /** + * Send the UID STORE command. + * + * @param string $message_set the sessage_set + * @param string $dataitem: the way we store the flags + * FLAGS: replace the flags whith $value + * FLAGS.SILENT: replace the flags whith $value but don't return untagged responses + * + * +FLAGS: Add the flags whith $value + * +FLAGS.SILENT: Add the flags whith $value but don't return untagged responses + * + * -FLAGS: Remove the flags whith $value + * -FLAGS.SILENT: Remove the flags whith $value but don't return untagged responses + * + * @param string $value + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + + function cmdUidStore($message_set, $dataitem, $value) + { + /* As said in RFC2060... + C: A003 STORE 2:4 +FLAGS (\Deleted) + S: * 2 FETCH FLAGS (\Deleted \Seen) + S: * 3 FETCH FLAGS (\Deleted) + S: * 4 FETCH FLAGS (\Deleted \Flagged \Seen) + S: A003 OK STORE completed + */ + if( $dataitem!="FLAGS" && $dataitem!="FLAGS.SILENT" && $dataitem!="+FLAGS" && + $dataitem!="+FLAGS.SILENT" && $dataitem!="-FLAGS" && $dataitem!="-FLAGS.SILENT" ){ + $this->_prot_error("dataitem '$dataitem' is invalid! see RFC2060!!!!" , __LINE__ , __FILE__ ); + } + return $this->_genericCommand('UID STORE', sprintf("%s %s (%s)",$message_set,$dataitem,$value) ); + } + + + + + + + + + + + /** + * Send the SEARCH command. + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + + function cmdUidSearch($search_cmd) + { + $ret=$this->_genericCommand('UID SEARCH', sprintf("%s",$search_cmd) ); + if(isset( $ret["PARSED"] ) ){ + $ret["PARSED"]=$ret["PARSED"][0]["EXT"]; + } + return $ret; + } + + + /** + * Send the UID SORT command. + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.1 + */ + function cmdUidSort($sort_cmd) + { + $ret=$this->_genericCommand('UID SORT', sprintf("%s",$sort_cmd)); + if (isset($ret['PARSED'])) { + $ret["PARSED"]=$ret["PARSED"][0]["EXT"]; + } + return $ret; + } + + + /** + * Send the X command. + * + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or true on success. + * @access public + * @since 1.0 + */ + + function cmdX($atom, $parameters) + { + return $this->_genericCommand("X$atom", $parameters ); + } + + + + + + + + +/******************************************************************** +*** +*** HERE ENDS the RFC2060 IMAPS FUNCTIONS +*** AND BEGIN THE EXTENSIONS FUNCTIONS +*** +********************************************************************/ + + + + + + + +/******************************************************************** +*** RFC2087 IMAP4 QUOTA extension BEGINS HERE +********************************************************************/ + + + /** + * Send the GETQUOTA command. + * + * @param string $mailbox_name the mailbox name to query for quota data + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or quota data on success + * @access public + * @since 1.0 + */ + + function cmdGetQuota($mailbox_name) + { + + + //Check if the IMAP server has QUOTA support + if( ! $this->hasQuotaSupport() ){ + return new PEAR_Error("This IMAP server does not support QUOTA's! "); + } + $mailbox_name=sprintf("%s",$this->utf_7_encode($mailbox_name) ); + $ret = $this->_genericCommand('GETQUOTA', $mailbox_name ); + if(isset( $ret["PARSED"] ) ){ + // remove the array index because the quota response returns only 1 line of output + $ret['PARSED']=$ret["PARSED"][0]; + } + return $ret; + } + + + /** + * Send the GETQUOTAROOT command. + * + * @param string $mailbox_name the mailbox name to query for quota data + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or quota data on success + * @access public + * @since 1.0 + */ + + function cmdGetQuotaRoot($mailbox_name) + { + //Check if the IMAP server has QUOTA support + if( ! $this->hasQuotaSupport() ){ + return new PEAR_Error("This IMAP server does not support QUOTA's! "); + } + $mailbox_name=sprintf("%s",$this->utf_7_encode($mailbox_name) ); + $ret = $this->_genericCommand('GETQUOTAROOT', $mailbox_name ); + + if(isset( $ret["PARSED"] ) ){ + // remove the array index because the quota response returns only 1 line of output + $ret['PARSED']=$ret["PARSED"][1]; + } + return $ret; + } + + + + + /** + * Send the SETQUOTA command. + * + * @param string $mailbox_name the mailbox name to query for quota data + * @param string $storageQuota sets the max number of bytes this mailbox can handle + * @param string $messagesQuota sets the max number of messages this mailbox can handle + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or quota data on success + * @access public + * @since 1.0 + */ +// TODO: implement the quota by number of emails!! + function cmdSetQuota($mailbox_name, $storageQuota = null ,$messagesQuota = null ) + { + //Check if the IMAP server has QUOTA support + if( ! $this->hasQuotaSupport() ){ + return new PEAR_Error("This IMAP server does not support QUOTA's! "); + } + + if( ($messagesQuota == null) && ( $storageQuota == null) ){ + return new PEAR_Error('$storageQuota and $messagesQuota parameters can\'t be both null if you want to use quota'); + } + $mailbox_name=$this->_createQuotedString($mailbox_name); + //Make the command request + $param=sprintf("%s (",$mailbox_name); + if($storageQuota != null ){ + if ($storageQuota == -1) { + // set -1 to remove a quota + $param = sprintf("%s", $param); + } elseif ($storageQuota == strtolower('remove')) { + // this is a cyrus rmquota specific feature + // see http://email.uoa.gr/projects/cyrus/quota-patches/rmquota/ + $param = sprintf("%sREMOVE 1", $param); + } else { + $param = sprintf("%sSTORAGE %s", $param, $storageQuota); + } + if( $messagesQuota != null ){ + //if we have both types of quota on the same call we must append an space between + // those parameters + $param=sprintf("%s ",$param); + } + } + if($messagesQuota != null ){ + $param=sprintf("%sMESSAGES %s",$param,$messagesQuota); + + } + $param=sprintf("%s)",$param); + + return $this->_genericCommand('SETQUOTA', $param ); + } + + + + /** + * Send the SETQUOTAROOT command. + * + * @param string $mailbox_name the mailbox name to query for quota data + * @param string $storageQuota sets the max number of bytes this mailbox can handle + * @param string $messagesQuota sets the max number of messages this mailbox can handle + * @return mixed Returns a PEAR_Error with an error message on any + * kind of failure, or quota data on success + * @access public + * @since 1.0 + */ + function cmdSetQuotaRoot($mailbox_name, $storageQuota = null ,$messagesQuota = null) + { + //Check if the IMAP server has QUOTA support + if( ! $this->hasQuotaSupport() ){ + return new PEAR_Error("This IMAP server does not support QUOTA's! "); + } + + if( ($messagesQuota == null) && ( $storageQuota == null) ){ + return new PEAR_Error('$storageQuota and $messagesQuota parameters can\'t be both null if you want to use quota'); + } + $mailbox_name=$this->_createQuotedString($mailbox_name); + //Make the command request + $param=sprintf("%s (",$mailbox_name); + if($storageQuota != null ){ + $param=sprintf("%sSTORAGE %s",$param,$storageQuota); + if( $messagesQuota != null ){ + //if we have both types of quota on the same call we must append an space between + // those parameters + $param=sprintf("%s ",$param); + } + } + if($messagesQuota != null ){ + $param=sprintf("%sMESSAGES %s",$param,$messagesQuota); + + } + $param=sprintf("%s)",$param); + + return $this->_genericCommand('SETQUOTAROOT', $param ); + } + + + +/******************************************************************** +*** RFC2087 IMAP4 QUOTA extension ENDS HERE +********************************************************************/ + + + + + + +/******************************************************************** +*** RFC2086 IMAP4 ACL extension BEGINS HERE +********************************************************************/ + + + + + function cmdSetACL($mailbox_name, $user, $acl) + { + + //Check if the IMAP server has ACL support + if( ! $this->hasAclSupport() ){ + return new PEAR_Error("This IMAP server does not support ACL's! "); + } + $mailbox_name=$this->_createQuotedString($mailbox_name); + $user_name=$this->_createQuotedString($user); + if(is_array($acl)){ + $acl=implode('',$acl); + } + return $this->_genericCommand('SETACL', sprintf("%s %s \"%s\"",$mailbox_name,$user_name,$acl) ); + } + + + + + + + function cmdDeleteACL($mailbox_name, $user) + { + //Check if the IMAP server has ACL support + if( ! $this->hasAclSupport() ){ + return new PEAR_Error("This IMAP server does not support ACL's! "); + } + $mailbox_name=$this->_createQuotedString($mailbox_name); + + return $this->_genericCommand('DELETEACL', sprintf("%s \"%s\"",$mailbox_name,$user) ); + } + + + + + + + + + + function cmdGetACL($mailbox_name) + { + //Check if the IMAP server has ACL support + if( ! $this->hasAclSupport() ){ + return new PEAR_Error("This IMAP server does not support ACL's! "); + } + $mailbox_name=$this->_createQuotedString($mailbox_name); + $ret = $this->_genericCommand('GETACL', sprintf("%s",$mailbox_name) ); + if(isset( $ret["PARSED"] ) ){ + $ret['PARSED']=$ret["PARSED"][0]["EXT"]; + + } + return $ret; + } + + + + + + + + function cmdListRights($mailbox_name, $user) + { + //Check if the IMAP server has ACL support + if( ! $this->hasAclSupport() ){ + return new PEAR_Error("This IMAP server does not support ACL's! "); + } + $mailbox_name=$this->_createQuotedString($mailbox_name); + $ret = $this->_genericCommand('LISTRIGHTS', sprintf("%s \"%s\"",$mailbox_name,$user) ); + if(isset( $ret["PARSED"] ) ){ + $ret["PARSED"]=$ret["PARSED"][0]["EXT"]; + } + return $ret; + } + + + + + + + + + + function cmdMyRights($mailbox_name) + { + //Check if the IMAP server has ACL support + if( ! $this->hasAclSupport() ){ + return new PEAR_Error("This IMAP server does not support ACL's! "); + } + $mailbox_name=$this->_createQuotedString($mailbox_name); + $ret = $this->_genericCommand('MYRIGHTS', sprintf("%s",$mailbox_name) ); + if(isset( $ret["PARSED"] ) ){ + $ret["PARSED"]=$ret["PARSED"][0]["EXT"]; + } + return $ret; + } + + +/******************************************************************** +*** RFC2086 IMAP4 ACL extension ENDs HERE +********************************************************************/ + + + + + + + + + + + + +/******************************************************************************* +*** draft-daboo-imap-annotatemore-05 IMAP4 ANNOTATEMORE extension BEGINS HERE +********************************************************************************/ + + + + function cmdSetAnnotation($mailbox_name, $entry, $values) + { + // Check if the IMAP server has ANNOTATEMORE support + if(!$this->hasAnnotateMoreSupport()) { + return new PEAR_Error('This IMAP server does not support the ANNOTATEMORE extension!'); + } + if (!is_array($values)) { + return new PEAR_Error('Invalid $values argument passed to cmdSetAnnotation'); + } + + $vallist = ''; + foreach ($values as $name => $value) { + $vallist .= "\"$name\" \"$value\" "; + } + $vallist = rtrim($vallist); + + return $this->_genericCommand('SETANNOTATION', sprintf('"%s" "%s" (%s)', $mailbox_name, $entry, $vallist)); + } + + + + + + + + + + + + + + function cmdDeleteAnnotation($mailbox_name, $entry, $values) + { + // Check if the IMAP server has ANNOTATEMORE support + if(!$this->hasAnnotateMoreSupport()) { + return new PEAR_Error('This IMAP server does not support the ANNOTATEMORE extension!'); + } + if (!is_array($values)) { + return new PEAR_Error('Invalid $values argument passed to cmdDeleteAnnotation'); + } + + $vallist = ''; + foreach ($values as $name) { + $vallist .= "\"$name\" NIL "; + } + $vallist = rtrim($vallist); + + return $this->_genericCommand('SETANNOTATION', sprintf('"%s" "%s" (%s)', $mailbox_name, $entry, $vallist)); + } + + + + + + + + + + + + + function cmdGetAnnotation($mailbox_name, $entries, $values) + { + // Check if the IMAP server has ANNOTATEMORE support + if(!$this->hasAnnotateMoreSupport()) { + return new PEAR_Error('This IMAP server does not support the ANNOTATEMORE extension!'); + } + + $entlist = ''; + + if (!is_array($entries)) { + $entries = array($entries); + } + + foreach ($entries as $name) { + $entlist .= "\"$name\" "; + } + $entlist = rtrim($entlist); + if (count($entries) > 1) { + $entlist = "($entlist)"; + } + + + + $vallist = ''; + if (!is_array($values)) { + $values = array($values); + } + + foreach ($values as $name) { + $vallist .= "\"$name\" "; + } + $vallist = rtrim($vallist); + if (count($values) > 1) { + $vallist = "($vallist)"; + } + + return $this->_genericCommand('GETANNOTATION', sprintf('"%s" %s %s', $mailbox_name, $entlist, $vallist)); + } + + +/***************************************************************************** +*** draft-daboo-imap-annotatemore-05 IMAP4 ANNOTATEMORE extension ENDs HERE +******************************************************************************/ + + + + + + + +/******************************************************************** +*** +*** HERE ENDS THE EXTENSIONS FUNCTIONS +*** AND BEGIN THE AUXILIARY FUNCTIONS +*** +********************************************************************/ + + + + + + /** + * tell if the server has capability $capability + * + * @return true or false + * + * @access public + * @since 1.0 + */ + function getServerAuthMethods() + { + if( $this->_serverAuthMethods == null ){ + $this->cmdCapability(); + return $this->_serverAuthMethods; + } + return false; + } + + + + + + + + /** + * tell if the server has capability $capability + * + * @return true or false + * + * @access public + * @since 1.0 + */ + function hasCapability($capability) + { + if( $this->_serverSupportedCapabilities == null ){ + $this->cmdCapability(); + } + if($this->_serverSupportedCapabilities != null ){ + if( in_array( $capability , $this->_serverSupportedCapabilities ) ){ + return true; + } + } + return false; + } + + + + /** + * tell if the server has Quota support + * + * @return true or false + * + * @access public + * @since 1.0 + */ + function hasQuotaSupport() + { + return $this->hasCapability('QUOTA'); + } + + + + + + /** + * tell if the server has Quota support + * + * @return true or false + * + * @access public + * @since 1.0 + */ + function hasAclSupport() + { + return $this->hasCapability('ACL'); + } + + + + + + /** + * tell if the server has support for the ANNOTATEMORE extension + * + * @return true or false + * + * @access public + * @since 1.0 + */ + function hasAnnotateMoreSupport() + { + return $this->hasCapability('ANNOTATEMORE'); + } + + + + function _createQuotedString($mailbox) + { + $search = array('\\', '"'); + $replace = array('\\\\', '\\"'); + + $mailbox_name = str_replace($search, $replace, $mailbox); + $mailbox_name=sprintf("\"%s\"",$this->utf_7_encode($mailbox_name) ); + + return $mailbox_name; + } + + + + + + + /** + * Parses the responses like RFC822.SIZE and INTERNALDATE + * + * @param string the IMAP's server response + * + * @return string containing the parsed response + * @access private + * @since 1.0 + */ + + function _parseOneStringResponse(&$str, $line,$file) + { + $this->_parseSpace($str , $line , $file ); + $size = $this->_getNextToken($str,$uid); + return $uid; + } + + + /** + * Parses the FLAG response + * + * @param string the IMAP's server response + * + * @return Array containing the parsed response + * @access private + * @since 1.0 + */ + function _parseFLAGSresponse(&$str) + { + $this->_parseSpace($str , __LINE__ , __FILE__ ); + $params_arr[] = $this->_arrayfy_content($str); + $flags_arr=array(); + for( $i = 0 ; $i < count($params_arr[0]) ; $i++ ){ + $flags_arr[] = $params_arr[0][$i]; + } + return $flags_arr; + } + + + + + + /** + * Parses the BODY response + * + * @param string the IMAP's server response + * + * @return Array containing the parsed response + * @access private + * @since 1.0 + */ + + function _parseBodyResponse(&$str, $command) + { + $this->_parseSpace($str , __LINE__ , __FILE__ ); + while($str[0] != ')' && $str!=''){ + $params_arr[] = $this->_arrayfy_content($str); + } + + return $params_arr; + } + + + + + + + /** + * Makes the content an Array + * + * @param string the IMAP's server response + * + * @return Array containing the parsed response + * @access private + * @since 1.0 + */ + function _arrayfy_content(&$str) + { + $params_arr=array(); + $this->_getNextToken($str,$params); + if($params != '(' ){ + return $params; + } + $this->_getNextToken($str,$params,false,false); + while ( $str != '' && $params != ')'){ + if($params != '' ){ + if($params[0] == '(' ){ + $params=$this->_arrayfy_content( $params ); + } + if($params != ' ' ){ + //I don't remove the colons (") to handle the case of retriving " " + // If I remove the colons the parser will interpret this field as an imap separator (space) + // instead of a valid field so I remove the colons here + if($params=='""'){ + $params=''; + }else{ + if($params[0]=='"'){ + $params=$this->_getSubstr($params,1,$this->_getLineLength($params)-2); + } + } + $params_arr[]=$params; + } + }else{ + //if params if empty (for example i'm parsing 2 quotes ("") + // I'll append an array entry to mantain compatibility + $params_arr[]=$params; + } + $this->_getNextToken($str,$params,false,false); + } + $this->arrayfy_content_level--; + return $params_arr; + } + + + + + /** + * Parses the BODY[],BODY[TEXT],.... responses + * + * @param string the IMAP's server response + * + * @return Array containing the parsed response + * @access private + * @since 1.0 + */ + function _parseContentresponse(&$str, $command) + { + $content = ''; + $this->_parseSpace($str , __LINE__ , __FILE__ ); + $size =$this->_getNextToken($str,$content); + return array( "CONTENT"=> $content , "CONTENT_SIZE" =>$size ); + } + + + + + + + + + /** + * Parses the ENVELOPE response + * + * @param string the IMAP's server response + * + * @return Array containing the parsed response + * @access private + * @since 1.0 + */ + function _parseENVELOPEresponse(&$str) + { + $content = ''; + $this->_parseSpace($str , __LINE__ , __FILE__ ); + + $this->_getNextToken($str,$parenthesis); + if( $parenthesis != '(' ){ + $this->_prot_error("must be a '(' but is a '$parenthesis' !!!!" , __LINE__ , __FILE__ ); + } + // Get the email's Date + $this->_getNextToken($str,$date); + + $this->_parseSpace($str , __LINE__ , __FILE__ ); + + // Get the email's Subject: + $this->_getNextToken($str,$subject); + //$subject=$this->decode($subject); + + $this->_parseSpace($str , __LINE__ , __FILE__ ); + + //FROM LIST; + $from_arr = $this->_getAddressList($str); + + $this->_parseSpace($str , __LINE__ , __FILE__ ); + + //"SENDER LIST\n"; + $sender_arr = $this->_getAddressList($str); + + $this->_parseSpace($str , __LINE__ , __FILE__ ); + + //"REPLY-TO LIST\n"; + $reply_to_arr=$this->_getAddressList($str); + + $this->_parseSpace($str , __LINE__ , __FILE__ ); + + //"TO LIST\n"; + $to_arr = $this->_getAddressList($str); + + $this->_parseSpace($str , __LINE__ , __FILE__ ); + + //"CC LIST\n"; + $cc_arr = $this->_getAddressList($str); + + $this->_parseSpace($str , __LINE__ , __FILE__ ); + + //"BCC LIST|$str|\n"; + $bcc_arr = $this->_getAddressList($str); + + $this->_parseSpace($str , __LINE__ , __FILE__ ); + + $this->_getNextToken($str,$in_reply_to); + + $this->_parseSpace($str , __LINE__ , __FILE__ ); + + $this->_getNextToken($str,$message_id); + + $this->_getNextToken($str,$parenthesis); + + if( $parenthesis != ')' ){ + $this->_prot_error("must be a ')' but is a '$parenthesis' !!!!" , __LINE__ , __FILE__ ); + } + + return array( "DATE"=> $date , "SUBJECT" => $subject,"FROM" => $from_arr, + "SENDER" => $sender_arr , "REPLY_TO" => $reply_to_arr, "TO" => $to_arr, + "CC" =>$cc_arr, "BCC"=> $bcc_arr, "IN_REPLY_TO" =>$in_reply_to, "MESSAGE_ID"=>$message_id ); + } + + + + + + /** + * Parses the ARRDLIST as defined in RFC + * + * @param string the IMAP's server response + * + * @return Array containing the parsed response + * @access private + * @since 1.0 + */ + function _getAddressList(&$str) + { + $params_arr = $this->_arrayfy_content($str); + if( !isset( $params_arr ) ){ + return $params_arr; + } + + if( is_array($params_arr) ){ + foreach ($params_arr as $index => $address_arr) { + $personal_name = $address_arr[0]; + $at_domain_list = $address_arr[1]; + $mailbox_name = $address_arr[2]; + $host_name = $address_arr[3]; + if( $mailbox_name!='' && $host_name!='' ){ + $email=$mailbox_name . "@" . $host_name; + }else{ + $email=false; + } + if($email==false){ + $rfc822_email=false; + }else{ + if(!isset($personal_name)){ + $rfc822_email= "<". $email . ">"; + }else{ + $rfc822_email= "\"". $personal_name ."\" <". $email . ">"; + } + } + $email_arr[] = array ( "PERSONAL_NAME"=> $personal_name , "AT_DOMAIN_LIST"=>$at_domain_list , + "MAILBOX_NAME"=> $this->utf_7_decode($mailbox_name), "HOST_NAME"=> $host_name, + "EMAIL"=>$email , "RFC822_EMAIL" => $rfc822_email ); + } + return $email_arr; + } + + return array(); + } + + + + + + + + /** + * Utility funcion to find the closing parenthesis ")" Position it takes care of quoted ones + * + * @param string the IMAP's server response + * + * @return int containing the pos of the closing parenthesis ")" + * @access private + * @since 1.0 + */ + function _getClosingBracesPos($str_line, $startDelim ='(', $stopDelim = ')' ) + { + $len = $this->_getLineLength( $str_line ); + $pos = 0; + // ignore all extra characters + // If inside of a string, skip string -- Boundary IDs and other + // things can have ) in them. + if ( $str_line[$pos] != $startDelim ) { + $this->_prot_error("_getClosingParenthesisPos: must start with a '".$startDelim."' but is a '". $str_line[$pos] ."'!!!!\n" . + "STR_LINE:$str_line|size:$len|POS: $pos\n" , __LINE__ , __FILE__ ); + return( $len ); + } + for( $pos = 1 ; $pos < $len ; $pos++ ){ + if ($str_line[$pos] == $stopDelim ) { + break; + } + if ($str_line[$pos] == '"') { + $this->_advanceOverStr($str_line,$pos,$len,$startDelim,$stopDelim); + } + if ( $str_line[$pos] == $startDelim ) { + #$str_line_aux = substr( $str_line , $pos ); + $str_line_aux = $this->_getSubstr( $str_line , $pos ); + $pos_aux = $this->_getClosingBracesPos( $str_line_aux ); + $pos+=$pos_aux; + if ($pos == $len-1) break; + } + } + if( $str_line[$pos] != $stopDelim ){ + $this->_prot_error("_getClosingBracesPos: must be a $stopDelim but is a '". $str_line[$pos] ."'|POS:$pos|STR_LINE:$str_line!!!!" , __LINE__ , __FILE__ ); + } + + if( $pos >= $len ) + return false; + return $pos; + } + + + /** + * Advances the position $pos in $str over an correcty escaped string + * + * Examples: $str='"\\\"First Last\\\""', $pos=0 + * --> returns true and $pos=strlen($str)-1 + * + * @param string $str + * @param int &$pos current position in $str pointing to a double quote ("), on return pointing on the closing double quote + * @param int $len length of $str in bytes(!) + * @return boolean true if we advanced over a correct string, false otherwise + */ + function _advanceOverStr($str,&$pos,$len,$startDelim ='(', $stopDelim = ')' ) + { + #error_log(__METHOD__. $len . "#".$str."\n"); + $startingpos = $pos; + if ($str[$pos] !== '"') return false; // start condition failed + $pos++; + $delimCount=0; + while($str[$pos] !== '"' && $pos < $len) { + // this is a fix to stop before the delimiter, in broken string messages containing an odd number of double quotes + // the idea is to check for a stopDelimited followed by eiter a new startDelimiter or an other stopDelimiter + // that allows to have something like '"Name (Nick)" ' containing one delimiter + // if you have something like "Name ((something))" we must count the delimiters (and hope that they are not unbalanced too) + // and check if we have a negative amount of delimiters or no delimiters to meet the stop condition, before we run into a closing double quote + if ($str[$pos] === $startDelim) $delimCount++; + if ($str[$pos] === $stopDelim) $delimCount--; + if ($str[$pos] === $stopDelim && ($str[$pos+1] === $startDelim || ($str[$pos+1] === $stopDelim && $delimCount<=0))) { + $encoding =mb_internal_encoding(); + //if (mb_check_encoding($str)) { + // error_log(__METHOD__.' Encoding used:'.mb_internal_encoding().' Detected:'.mb_detect_encoding($str)); + // $encoding = mb_detect_encoding($str); + //} + // beware as mb_substr_count does not support the offset parameter. + $numOfQuotes = substr_count(substr($str,$startingpos),'"'); + $numOfMaskedQuotes = substr_count(substr($str,$startingpos),'\"'); + if ((($numOfQuotes - $numOfMaskedQuotes) % 2 ) == 0) { + // quotes are balanced, so its unlikely that we meet a stop condition here as strings may contain )( + //error_log(__METHOD__. "->Length: $len; NumOfQuotes: $numOfQuotes - NumofMaskedQuotes:$numOfMaskedQuotes #".$str."\n"); + error_log(__METHOD__." problem at $pos with:".$str[$pos]."(last character) Numberof delimiters ('".$startDelim."','".$stopDelim."') found:".$delimCount.' String:'.substr($str,$startingpos,$pos).' called from:'.function_backtrace()); + //return false; + } else { + $pos--; // stopDelimited need to be parsed outside! + return false; + } + } + if ($str[$pos] === '\\') $pos++; // all escaped chars are overread (eg. \\, \", \x) + $pos++; + } + return $pos < $len && $str[$pos] === '"'; + } + + + + + /** + * Utility funcion to get from here to the end of the line + * + * @param string the IMAP's server response + * + * @return string containing the string to the end of the line + * @access private + * @since 1.0 + */ + + function _getToEOL(&$str , $including = true) + { + $len = $this->_getLineLength( $str ); + if( $including ){ + for($i=0;$i<$len;$i++){ + if( $str[$i] =="\n" ) + break; + } + $content=$this->_getSubstr($str,0,$i + 1); + $str=$this->_getSubstr($str,$i + 1); + return $content; + + }else{ + for( $i = 0 ; $i < $len ; $i++ ){ + if( $str[$i] =="\n" || $str[$i] == "\r") + break; + } + $content = $this->_getSubstr( $str ,0 , $i ); + $str = $this->_getSubstr( $str , $i ); + return $content; + } + } + + + + + /** + * Fetches the next IMAP token or parenthesis + * + * @param string the IMAP's server response + * @param string the next token + * @param boolean true: the parenthesis IS a token, false: I consider + * all the response in parenthesis as a token + * + * @return int containing the content size + * @access private + * @since 1.0 + */ + + + function _getNextToken(&$str, &$content, $parenthesisIsToken=true,$colonIsToken=true){ + $len = $this->_getLineLength($str); + $pos = 0; + $content_size = false; + $content = false; + if($str == '' || $len < 2 ){ + $content=$str; + return $len; + } + switch( $str[0] ){ + case '{': + if( ($posClosingBraces = $this->_getClosingBracesPos($str, '{' , '}' )) == false ){ + $this->_prot_error("_getClosingBracesPos() error!!!" , __LINE__ , __FILE__ ); + } + if(! is_numeric( ( $strBytes = $this->_getSubstr( $str , 1 , $posClosingBraces - 1) ) ) ){ + $this->_prot_error("must be a number but is a '" . $strBytes ."'!!!!" , __LINE__ , __FILE__ ); + } + if( $str[$posClosingBraces] != '}' ){ + $this->_prot_error("must be a '}' but is a '" . $str[$posClosingBraces] ."'!!!!" , __LINE__ , __FILE__ ); + } + if( $str[$posClosingBraces + 1] != "\r" ){ + $this->_prot_error("must be a '\\r' but is a '" . $str[$posClosingBraces + 1] ."'!!!!" , __LINE__ , __FILE__ ); + } + if( $str[$posClosingBraces + 2] != "\n" ){ + $this->_prot_error("must be a '\\n' but is a '" . $str[$posClosingBraces + 2] ."'!!!!" , __LINE__ , __FILE__ ); + } + $content = $this->_getSubstr( $str , $posClosingBraces + 3 , $strBytes ); + if( $this->_getLineLength( $content ) != $strBytes ){ + $this->_prot_error("content size is ". $this->_getLineLength($content) . " but the string reports a size of $strBytes!!!\n" , __LINE__ , __FILE__ ); + } + $content_size = $strBytes; + //Advance the string + $str = $this->_getSubstr( $str , $posClosingBraces + $strBytes + 3 ); + break; + case '"': + if($colonIsToken){ + for($pos=1;$pos<$len;$pos++){ + if ( $str[$pos] == "\"" ) { + break; + } + if ($str[$pos] == "\\" && $str[$pos + 1 ] == "\"" ) + $pos++; + if ($str[$pos] == "\\" && $str[$pos + 1 ] == "\\" ) + $pos++; + } + if($str[$pos] != '"' ){ + $this->_prot_error("must be a '\"' but is a '" . $str[$pos] ."'!!!!" , __LINE__ , __FILE__ ); + } + $content_size = $pos; + $content = $this->_getSubstr( $str , 1 , $pos - 1 ); + //Advance the string + $str = $this->_getSubstr( $str , $pos + 1 ); + }else{ + for($pos=1;$pos<$len;$pos++){ + if ( $str[$pos] == "\"" ) { + break; + } + if ($str[$pos] == "\\" && $str[$pos + 1 ] == "\"" ) + $pos++; + if ($str[$pos] == "\\" && $str[$pos + 1 ] == "\\" ) + $pos++; + } + if($str[$pos] != '"' ){ + $this->_prot_error("must be a '\"' but is a '" . $str[$pos] ."'!!!!" , __LINE__ , __FILE__ ); + } + $content_size = $pos; + $content = $this->_getSubstr( $str , 0 , $pos + 1 ); + //Advance the string + $str = $this->_getSubstr( $str , $pos + 1 ); + + } + # we need to strip slashes for a quoted string + $content = stripslashes($content); + break; + + case "\r": + $pos = 1; + if( $str[1] == "\n") + $pos++; + $content_size = $pos; + $content = $this->_getSubstr( $str , 0 , $pos ); + $str = $this->_getSubstr( $str , $pos ); + break; + case "\n": + $pos = 1; + $content_size = $pos; + $content = $this->_getSubstr( $str , 0 , $pos ); + $str = $this->_getSubstr( $str , $pos ); + break; + case '(': + if( $parenthesisIsToken == false ){ + $pos = $this->_getClosingBracesPos( $str ); + $content_size = $pos + 1; + $content = $this->_getSubstr( $str , 0 , $pos + 1 ); + $str = $this->_getSubstr( $str , $pos + 1 ); + }else{ + $pos = 1; + $content_size = $pos; + $content = $this->_getSubstr( $str , 0 , $pos ); + $str = $this->_getSubstr( $str , $pos ); + } + break; + case ')': + $pos = 1; + $content_size = $pos; + $content = $this->_getSubstr( $str , 0 , $pos ); + $str = $this->_getSubstr( $str , $pos ); + break; + case ' ': + $pos = 1; + $content_size = $pos; + $content = $this->_getSubstr( $str , 0 , $pos ); + $str = $this->_getSubstr( $str , $pos ); + break; + default: + for( $pos = 0 ; $pos < $len ; $pos++ ){ + if($this->_getSubstr( $str , 0 , 5 ) == 'BODY[' || $this->_getSubstr( $str , 0 , 5 ) == 'BODY.') { + if($str[$pos] == ']') { + $pos++; + break; + } + } elseif ( $str[$pos] == ' ' || $str[$pos] == "\r" || $str[$pos] == ')' || $str[$pos] == '(' || $str[$pos] == "\n" ) { + break; + } + if ( $str[$pos] == "\\" && $str[$pos + 1 ] == ' ' ) + $pos++; + if ( $str[$pos] == "\\" && $str[$pos + 1 ] == "\\" ) + $pos++; + } + //Advance the string + if( $pos == 0 ){ + $content_size = 1; + $content = $this->_getSubstr( $str , 0 , 1 ); + $str = $this->_getSubstr( $str , 1 ); + }else{ + $content_size = $pos; + $content = $this->_getSubstr( $str , 0 , $pos ); + if($pos < $len){ + $str = $this->_getSubstr( $str , $pos ); + }else{ + //if this is the end of the string... exit the switch + break; + } + + + } + break; + } + #error_log("egw-pear::NET::IMAPProtocoll:_getNextToken:".$str); + return $content_size; + } + + + + + + // ToDo: all real errors should be returned as PEAR error, others hidden by default + // NO extra output from this class! + /** + * Utility funcion to display to console the protocol errors + * printErrors() additionally has to be set to true + * + * @param string $str the error message + * @param int $line the line producing the error + * @param string $file file where the error was produced + * + * @return nothing + * @access private + * @since 1.0 + */ + function _prot_error($str , $line , $file, $printError = true) + { + if ($this->_printErrors && $printError) { + echo "$line,$file,PROTOCOL ERROR!:$str\n"; + } + } + + + + + function _getEXTarray(&$str , $startDelim = '(' , $stopDelim = ')'){ + /* I let choose the $startDelim and $stopDelim to allow parsing + the OK response so I also can parse a response like this + * OK [UIDNEXT 150] Predicted next UID + */ + $this->_getNextToken( $str , $parenthesis ); + if( $parenthesis != $startDelim ){ + $this->_prot_error("must be a '$startDelim' but is a '$parenthesis' !!!!" , __LINE__ , __FILE__ ); + } + $parenthesis = ''; + $struct_arr = array(); + while( $parenthesis != $stopDelim && $str != '' ){ + // The command + $this->_getNextToken( $str , $token ); + $token = strtoupper( $token ); + + if( ( $ret = $this->_retrParsedResponse( $str , $token ) ) != false ){ + //$struct_arr[$token] = $ret; + $struct_arr=array_merge($struct_arr, $ret); + } + + $parenthesis=$token; + + }//While + + if( $parenthesis != $stopDelim ){ + $this->_prot_error("1_must be a '$stopDelim' but is a '$parenthesis' !!!!" , __LINE__ , __FILE__ ); + } + return $struct_arr; + } + + + + + + function _retrParsedResponse( &$str , $token, $previousToken = null) + { + + //echo "\n\nTOKEN:$token\r\n"; + $token = strtoupper($token); + switch( $token ){ + case "RFC822.SIZE" : + return array($token=>$this->_parseOneStringResponse( $str,__LINE__ , __FILE__ )); + break; +// case "RFC822.TEXT" : + +// case "RFC822.HEADER" : + + + case "RFC822" : + return array($token=>$this->_parseContentresponse( $str , $token )); + break; + case "FLAGS" : + + case "PERMANENTFLAGS" : + return array($token=>$this->_parseFLAGSresponse( $str )); + break; + + case "ENVELOPE" : + return array($token=>$this->_parseENVELOPEresponse( $str )); + break; + case "EXPUNGE" : + return false; + break; + + case 'NOMODSEQ': + // ToDo: implement RFC 4551 + return array($token=>''); + break; + + case "UID" : + + case "UIDNEXT" : + + case "UIDVALIDITY" : + + case "UNSEEN" : + + case "MESSAGES" : + + case "UIDNEXT" : + + case "UIDVALIDITY" : + + case "UNSEEN" : + + case "INTERNALDATE" : + return array($token=>$this->_parseOneStringResponse( $str,__LINE__ , __FILE__ )); + break; + case "BODY" : + + case "BODYSTRUCTURE" : + return array($token=>$this->_parseBodyResponse( $str , $token )); + break; + case "RECENT" : + if( $previousToken != null ){ + $aux["RECENT"]=$previousToken; + return $aux; + }else{ + return array($token=>$this->_parseOneStringResponse( $str,__LINE__ , __FILE__ )); + } + break; + + case "EXISTS" : + return array($token=>$previousToken); + break; + case "READ-WRITE" : + + case "READ-ONLY" : + return array($token=>$token); + break; + case "QUOTA" : + /* + A tipical GETQUOTA DIALOG IS AS FOLLOWS + + C: A0004 GETQUOTA user.damian + S: * QUOTA user.damian (STORAGE 1781460 4000000) + S: A0004 OK Completed + + another example of QUOTA response from GETQUOTAROOT: + C: A0008 GETQUOTAROOT INBOX + S: * QUOTAROOT INBOX "" + S: * QUOTA "" (STORAGE 0 1024000 MESSAGE 0 40000) + S: A0008 OK GETQUOTAROOT finished. + + RFC 2087 section 5.1 says the list could be empty: + + C: A0004 GETQUOTA user.damian + S: * QUOTA user.damian () + S: A0004 OK Completed + + quota_list ::= "(" #quota_resource ")" + quota_resource ::= atom SP number SP number + quota_response ::= "QUOTA" SP astring SP quota_list + */ + $mailbox = $this->_parseOneStringResponse( $str,__LINE__ , __FILE__ ); + $ret_aux = array('MAILBOX'=>$this->utf_7_decode($mailbox)); + + // courier fix + if ($str[0].$str[1] == "\r\n") { + return array($token => $ret_aux); + } + // end courier fix + + $this->_parseSpace( $str , __LINE__ , __FILE__ ); + $this->_parseString( $str , '(' , __LINE__ , __FILE__ ); + + // fetching quota resources ( BNF ::= #quota_resource but spce separated instead of comma) + $this->_getNextToken($str, $quota_resp ); + while ($quota_resp != ')') { + if (($ext = $this->_retrParsedResponse($str, $quota_resp)) == false) { + $this->_prot_error("bogus response!!!!" , __LINE__ , __FILE__ ); + } + $ret_aux=array_merge($ret_aux,$ext); + + $this->_getNextToken($str, $quota_resp); + if ($quota_resp == ' ') { + $this->_getNextToken($str, $quota_resp); + } + } + + // if empty list, apparently no STORAGE or MESSAGE quota set + return array($token=>$ret_aux); + break; + + case "QUOTAROOT" : + /* + A tipical GETQUOTA DIALOG IS AS FOLLOWS + + C: A0004 GETQUOTA user.damian + S: * QUOTA user.damian (STORAGE 1781460 4000000) + S: A0004 OK Completed + */ + $mailbox = $this->utf_7_decode($this->_parseOneStringResponse( $str,__LINE__ , __FILE__ )); + + $str_line = rtrim( substr( $this->_getToEOL( $str , false ) , 0 ) ); + if(empty($str_line)) { + $ret = @array( "MAILBOX"=>$this->utf_7_decode($mailbox)); + } else { + $quotaroot = $this->_parseOneStringResponse( $str_line,__LINE__ , __FILE__ ); + $ret = @array( "MAILBOX"=>$this->utf_7_decode($mailbox) , $token=>$quotaroot ); + } + return array($token=>$ret); + break; + case "STORAGE" : + $used = $this->_parseOneStringResponse( $str,__LINE__ , __FILE__ ); + $qmax = $this->_parseOneStringResponse( $str,__LINE__ , __FILE__ ); + return array($token=>array("USED"=> $used, "QMAX" => $qmax)); + break; + case "MESSAGE" : + $mused = $this->_parseOneStringResponse( $str,__LINE__ , __FILE__ ); + $mmax = $this->_parseOneStringResponse( $str,__LINE__ , __FILE__ ); + return array($token=>array("MUSED"=> $mused, "MMAX" => $mmax)); + break; + case "LEVEL" : + $lused = $this->_parseOneStringResponse( $str,__LINE__ , __FILE__ ); + $lmax = $this->_parseOneStringResponse( $str,__LINE__ , __FILE__ ); + return array($token=>array("LUSED"=> $lused, "LMAX" => $lmax)); + break; + case "MAILBOX" : + $mbused = $this->_parseOneStringResponse( $str,__LINE__ , __FILE__ ); + $mbmax = $this->_parseOneStringResponse( $str,__LINE__ , __FILE__ ); + return array(); //throw away this information as this info seems quite useless with a QUOTA Response, AND we use the KEYWORD otherwise + break; + case "EXPIRATION" : + $expused = $this->_parseOneStringResponse( $str,__LINE__ , __FILE__ ); + $expmax = $this->_parseOneStringResponse( $str,__LINE__ , __FILE__ ); + return array(); //throw away this information as this info seems quite useless + break; + case "FETCH" : + $this->_parseSpace( $str ,__LINE__ ,__FILE__ ); + // Get the parsed pathenthesis + $struct_arr = $this->_getEXTarray( $str ); + return $struct_arr; + break; + case "NAMESPACE" : + $this->_parseSpace( $str , __LINE__ , __FILE__ ); + $this->_getNextToken($str , $personal, false); + $struct_arr['NAMESPACES']['personal'] = $this->_arrayfy_content($personal); + + $this->_parseSpace( $str , __LINE__ , __FILE__ ); + $this->_getNextToken($str , $others, false); + $struct_arr['NAMESPACES']['others'] = $this->_arrayfy_content($others); + + $this->_parseSpace( $str , __LINE__ , __FILE__ ); + $this->_getNextToken($str , $shared, false); + $struct_arr['NAMESPACES']['shared'] = $this->_arrayfy_content($shared); + + return array($token=>$struct_arr); + break; + case "CAPABILITY" : + $this->_parseSpace( $str , __LINE__ , __FILE__ ); + $str_line = rtrim( substr( $this->_getToEOL( $str , false ) , 0 ) ); + $struct_arr["CAPABILITIES"] = explode( ' ' , $str_line ); + return array($token=>$struct_arr); + break; + case "STATUS" : + $mailbox = $this->_parseOneStringResponse( $str,__LINE__ , __FILE__ ); + $this->_parseSpace( $str , __LINE__ , __FILE__ ); + $ext = $this->_getEXTarray( $str ); + $struct_arr["MAILBOX"] = $this->utf_7_decode($mailbox); + $struct_arr["ATTRIBUTES"] = $ext; + return array($token=>$struct_arr); + break; + case "LIST" : + $this->_parseSpace( $str , __LINE__ , __FILE__ ); + $params_arr = $this->_arrayfy_content( $str ); + + $this->_parseSpace( $str , __LINE__ , __FILE__ ); + $this->_getNextToken( $str , $hierarchydelim ); + + $this->_parseSpace( $str,__LINE__ , __FILE__); + $this->_getNextToken( $str , $mailbox_name ); + + $result_array = array( "NAME_ATTRIBUTES"=>$params_arr , "HIERACHY_DELIMITER"=>$hierarchydelim , "MAILBOX_NAME"=> $this->utf_7_decode($mailbox_name) ); + return array($token=>$result_array); + break; + case "LSUB" : + $this->_parseSpace( $str , __LINE__ , __FILE__ ); + $params_arr = $this->_arrayfy_content( $str ); + + $this->_parseSpace( $str , __LINE__ , __FILE__ ); + $this->_getNextToken( $str , $hierarchydelim ); + + $this->_parseSpace( $str,__LINE__ , __FILE__); + $this->_getNextToken( $str , $mailbox_name ); + + $result_array = array( "NAME_ATTRIBUTES"=>$params_arr , "HIERACHY_DELIMITER"=>$hierarchydelim , "MAILBOX_NAME"=> $this->utf_7_decode($mailbox_name) ); + return array($token=>$result_array); + break; + + case "SEARCH" : + case 'SORT': + $str_line = rtrim( substr( $this->_getToEOL( $str , false ) , 1) ); + $struct_arr[$token.'_LIST'] = explode(' ', $str_line); + if (count($struct_arr[$token.'_LIST']) == 1 && $struct_arr[$token.'_LIST'][0]=='') { + $struct_arr[$token.'_LIST'] = null; + } + return array($token=>$struct_arr); + break; + + case "OK" : + /* TODO: + parse the [ .... ] part of the response, use the method + _getEXTarray(&$str,'[',$stopDelim=']') + + */ + $str_line = rtrim( substr( $this->_getToEOL( $str , false ) , 1 ) ); + if($str_line[0] == '[' ){ + $braceLen=$this->_getClosingBracesPos($str_line, '[', ']' ); + $str_aux='('. substr($str_line,1,$braceLen -1). ')'; + $ext_arr=$this->_getEXTarray($str_aux); + //$ext_arr=array($token=>$this->_getEXTarray($str_aux)); + }else{ + //$ext_arr=$str_line; + $ext_arr=array($token=>$str_line); + } + $result_array = $ext_arr; + return $result_array; + break; + case "NO" : + /* TODO: + parse the [ .... ] part of the response, use the method + _getEXTarray(&$str,'[',$stopDelim=']') + + */ + + $str_line = rtrim( substr( $this->_getToEOL( $str , false ) , 1 ) ); + $result_array[] = @array( "COMMAND"=>$token , "EXT"=>$str_line ); + return $result_array; + break; + case "BAD" : + /* TODO: + parse the [ .... ] part of the response, use the method + _getEXTarray(&$str,'[',$stopDelim=']') + + */ + + $str_line = rtrim( substr( $this->_getToEOL( $str , false ) , 1 ) ); + $result_array[] = array( "COMMAND"=>$token , "EXT"=>$str_line ); + return $result_array; + break; + case "BYE" : + /* TODO: + parse the [ .... ] part of the response, use the method + _getEXTarray(&$str,'[',$stopDelim=']') + + */ + + $str_line = rtrim( substr( $this->_getToEOL( $str , false ) , 1 ) ); + $result_array[] = array( "COMMAND"=>$token , "EXT"=> $str_line ); + return $result_array; + break; + + case "LISTRIGHTS" : + $this->_parseSpace( $str ,__LINE__ , __FILE__ ); + $this->_getNextToken( $str , $mailbox ); + $this->_parseSpace( $str , __LINE__ , __FILE__ ); + $this->_getNextToken( $str , $user ); + $this->_parseSpace( $str , __LINE__ , __FILE__ ); + $this->_getNextToken( $str , $granted ); + + $ungranted = explode( ' ' , rtrim( substr( $this->_getToEOL( $str , false ) , 1 ) ) ); + + $result_array = @array( "MAILBOX"=>$this->utf_7_decode($mailbox) , "USER"=>$user , "GRANTED"=>$granted , "UNGRANTED"=>$ungranted ); + return $result_array; + break; + + case "MYRIGHTS" : + $this->_parseSpace( $str , __LINE__ , __FILE__ ); + $this->_getNextToken( $str ,$mailbox ); + // Patch to handle the alternate MYRIGHTS response from Courier-IMAP + if ($str==')'){ + $granted = $mailbox; + $mailbox = $this->currentMailbox; + }else{ + $this->_parseSpace( $str , __LINE__ , __FILE__ ); + $this->_getNextToken( $str , $granted ); + } + // End Patch + + $result_array = array( "MAILBOX"=>$this->utf_7_decode($mailbox) , "GRANTED"=>$granted ); + return $result_array; + break; + + case 'ACL': + /* + RFC 4314: + acl-data = "ACL" SP mailbox *(SP identifier SP rights) + identifier = astring + rights = astring ;; only lowercase ASCII letters and digits are allowed. + */ + //$str = " INBOX\r\nA0006 OK Completed\r\n"; + $this->_parseSpace($str, __LINE__, __FILE__); + $this->_getNextToken($str, $mailbox); + + $arr = array(); + while (substr($str, 0, 2) != "\r\n") { + $this->_parseSpace($str, __LINE__, __FILE__); + $this->_getNextToken($str, $acl_user); + $this->_parseSpace($str, __LINE__, __FILE__); + $this->_getNextToken($str, $acl_rights); + $arr[] = array('USER'=>$acl_user, 'RIGHTS'=>$acl_rights); + } + + $result_array = array('MAILBOX'=>$this->utf_7_decode($mailbox), 'USERS'=>$arr); + return $result_array; + break; + + case "ANNOTATION" : + $this->_parseSpace($str, __LINE__, __FILE__); + $this->_getNextToken($str, $mailbox); + + $this->_parseSpace($str, __LINE__, __FILE__); + $this->_getNextToken($str, $entry); + + $this->_parseSpace($str, __LINE__, __FILE__); + $attrs = $this->_arrayfy_content($str); + + $result_array = array('MAILBOX' => $mailbox, 'ENTRY' => $entry , 'ATTRIBUTES' => $attrs); + return $result_array; + break; + + case "": + $this->_prot_error( "PROTOCOL ERROR!:str empty!!" , __LINE__ , __FILE__ ); + break; + case "(": + $this->_prot_error("OPENING PARENTHESIS ERROR!!!!!!!!!!!!!!!!!" , __LINE__ , __FILE__ ); + break; + case ")": + //"CLOSING PARENTHESIS BREAK!!!!!!!" + break; + case "\r\n": + $this->_prot_error("BREAK!!!!!!!!!!!!!!!!!" , __LINE__ , __FILE__ ); + break; + case ' ': + // this can happen and we just ignore it + // This happens when - for example - fetch returns more than 1 parammeter + // for example you ask to get RFC822.SIZE and UID + //$this->_prot_error("SPACE BREAK!!!!!!!!!!!!!!!!!" , __LINE__ , __FILE__ ); + break; + default: + $body_token=strtoupper(substr($token,0,5)); + $rfc822_token=strtoupper(substr($token,0,7)); + + if( $body_token == 'BODY[' || $body_token == 'BODY.' || $rfc822_token == 'RFC822.' ) { + //echo "TOKEN:$token\n"; + //$this->_getNextToken( $str , $mailbox ); + return array($token=>$this->_parseContentresponse( $str , $token )); + }else{ + $this->_prot_error( "UNIMPLEMMENTED! I don't know the parameter '$token' !!!" , __LINE__ , __FILE__ ); + } + break; + } + return false; +} + + + + + + + /* + * Verifies that the next character IS a space + */ + function _parseSpace(&$str, $line, $file, $printError = true) + { + /* + This code repeats a lot in this class + so i make it a function to make all the code shorter + */ + $this->_getNextToken( $str , $space ); + if( $space != ' ' ){ + $this->_prot_error("must be a ' ' but is a '$space' !!!!" , $line , $file,$printError ); + } + return $space; + } + + + + + + + function _parseString( &$str , $char , $line , $file ) + { + /* + This code repeats a lot in this class + so i make it a function to make all the code shorter + */ + $this->_getNextToken( $str , $char_aux ); + if( strtoupper($char_aux) != strtoupper( $char ) ){ + $this->_prot_error("must be a $char but is a '$char_aux' !!!!", $line , $file ); + } + return $char_aux; + } + + + + + + function _genericImapResponseParser( &$str , $cmdid = null ) + { + + $result_array=array(); + if( $this->_unParsedReturn ){ + $unparsed_str = $str; + } + + $this->_getNextToken($str, $token); + #error_log(" egw-pear::NET::IMAPProtocoll:_genericIMAPResponseParser: After retrieving the first token:".$token); + while ($token != $cmdid && $str != '') { + if ($token == '+' ) { + //if the token is + ignore the line + // TODO: verify that this is correct!!! + $this->_getToEOL($str); + $this->_getNextToken($str, $token); + } + + $this->_parseString($str, ' ', __LINE__, __FILE__); + + $this->_getNextToken($str, $token); + if ($token == '+') { + $this->_getToEOL($str); + $this->_getNextToken($str, $token); + } else { + if (is_numeric($token)) { + // The token is a NUMBER so I store it + $msg_nro = $token; + $this->_parseSpace($str, __LINE__, __FILE__); + + // I get the command + $this->_getNextToken($str, $command); + + if (($ext_arr = $this->_retrParsedResponse($str, $command, $msg_nro)) == false) { + // if this bogus response cis a FLAGS () or EXPUNGE response + // the ignore it + if ($command != 'FLAGS' && $command != 'EXPUNGE') { + $this->_prot_error("bogus response!!!!" , __LINE__ , __FILE__, false); + } + } + $result_array[] = array('COMMAND'=>$command, 'NRO'=>$msg_nro, 'EXT'=>$ext_arr); + } else { + // OK the token is not a NUMBER so it MUST be a COMMAND + $command = $token; + + /* Call the parser return the array + take care of bogus responses! + */ + + if (($ext_arr = $this->_retrParsedResponse($str, $command)) == false) { + $this->_prot_error("bogus response!!!! (COMMAND:$command)", __LINE__, __FILE__); + } + $result_array[] = array('COMMAND'=>$command, 'EXT'=>$ext_arr); + } + } + + + $this->_getNextToken($str, $token); + + $token = strtoupper($token); + if( $token != "\r\n" && $token != '' ){ + $this->_prot_error("PARSE ERROR!!! must be a '\\r\\n' here but is a '$token'!!!! (getting the next line)|STR:|$str|" , __LINE__ , __FILE__ ); + } + $this->_getNextToken( $str , $token ); + + if($token == "+" ){ + //if the token is + ignore the line + // TODO: verify that this is correct!!! + $this->_getToEOL( $str ); + $this->_getNextToken( $str , $token ); + } + }//While + // OK we finish the UNTAGGED Response now we must parse the FINAL TAGGED RESPONSE + //TODO: make this a litle more elegant! + $this->_parseSpace( $str , __LINE__ , __FILE__, false ); + + $this->_getNextToken( $str , $cmd_status ); + + $str_line = rtrim (substr( $this->_getToEOL( $str ) , 1 ) ); + + + $response["RESPONSE"]=array( "CODE"=>$cmd_status , "STR_CODE"=>$str_line , "CMDID"=>$cmdid ); + + $ret=$response; + if( !empty($result_array)){ + $ret=array_merge($ret,array("PARSED"=>$result_array) ); + } + + if( $this->_unParsedReturn ){ + $unparsed["UNPARSED"]=$unparsed_str; + $ret=array_merge($ret,$unparsed); + } + + + if( isset($status_arr) ){ + $status["STATUS"]=$status_arr; + $ret=array_merge($ret,$status); + } + return $ret; + +} + + + + + function _genericCommand($command, $params = '') + { + if( !$this->_connected ){ + return new PEAR_Error( "not connected! (CMD:$command)" ); + } + $cmdid = $this->_getCmdId(); + $this->_putCMD( $cmdid , $command , $params ); + $args=$this->_getRawResponse( $cmdid ); + #error_log("egw-pear::NET::IMAPProtocoll:_genericCommand:".$command." result:".print_r($args,TRUE)); + return $this->_genericImapResponseParser( $args , $cmdid ); + } + + + + function utf_7_encode($str) + { + if($this->_useUTF_7 == false ){ + return $str; + } + + if(function_exists('mb_convert_encoding')) { + return mb_convert_encoding($str, "UTF7-IMAP", "ISO-8859-1"); + } + + $encoded_utf7 = ''; + $base64_part = ''; + if(is_array($str)){ + return new PEAR_Error('error'); + } + + for ($i = 0; $i < $this->_getLineLength($str); $i++) { + //those chars should be base64 encoded + if ( ((ord($str[$i]) >= 39 ) and (ord($str[$i]) <= 126 )) or ((ord($str[$i]) >= 32 ) and (ord($str[$i]) <= 37 )) ) { + if ($base64_part) { + $encoded_utf7 = sprintf("%s&%s-", $encoded_utf7, str_replace('=', '',base64_encode($base64_part)) ); + $base64_part = ''; + } + $encoded_utf7 = sprintf("%s%s",$encoded_utf7 , $str[$i]); + } else { + //handle & + if (ord($str[$i]) == 38 ) { + if ($base64_part) { + $encoded_utf7 = sprintf("%s&%s-", $encoded_utf7, str_replace('=', '',base64_encode($base64_part)) ); + $base64_part = ''; + } + $encoded_utf7 = sprintf("%s&-", $encoded_utf7 ); + } else { + $base64_part = sprintf("%s%s",$base64_part , $str[$i]); + //$base64_part = sprintf("%s%s%s",$base64_part , chr(0) , $str[$i]); + } + } + } + if ($base64_part) { + $encoded_utf7 = sprintf("%s&%s-", $encoded_utf7, str_replace('=', '',base64_encode($base64_part)) ); + $base64_part = ''; + } + + return $encoded_utf7; + } + + + function utf_7_decode($str) + { + + if($this->_useUTF_7 == false ){ + return $str; + } + + //return imap_utf7_decode($str); + + if(function_exists('mb_convert_encoding')) { + return mb_convert_encoding($str, "ISO-8859-1", "UTF7-IMAP"); + } + + $base64_part = ''; + $decoded_utf7 = ''; + + for ($i = 0; $i < $this->_getLineLength($str); $i++) { + if ( $this->_getLineLength($base64_part) > 0 ) { + if ($str[$i] == '-') { + if ($base64_part == '&') { + $decoded_utf7 = sprintf("%s&" , $decoded_utf7 ); + } else { + $next_part_decoded= base64_decode( substr( $base64_part, 1 ) ) ; + $decoded_utf7 = sprintf("%s%s", $decoded_utf7 , $next_part_decoded ); + } + $base64_part = ''; + + } else { + $base64_part = sprintf("%s%s", $base64_part , $str[$i] ); + } + } else { + if ($str[$i] == '&') { + $base64_part = '&'; + } else { + $decoded_utf7 = sprintf("%s%s", $decoded_utf7 , $str[$i] ); + } + } + } + return $decoded_utf7; + } + + /** + * Make CREATE/RENAME compatible option params + * + * @param array $options options to format + * @return string Returns a string for formatted parameters + * + * @access private + * @since 1.1 + */ + function _getCreateParams($options) + { + $args = ""; + if(is_null($options) === false && is_array($options) === true) { + foreach($options as $opt => $data) { + switch(strtoupper($opt)) { + case "PARTITION": + $args .= sprintf(" %s",$this->utf_7_encode($data)); + break; + default: + // ignore any unknown options + break; + } + } + } + return $args; + } + + /** + * Return true if the TLS negotiation was successful + * + * @access public + * @return mixed true on success, PEAR_Error on failure + */ + function cmdStartTLS() + { + if (PEAR::isError($res = $this->_genericCommand("STARTTLS"))) { + return $res; + } + + if(stream_socket_enable_crypto($this->_socket->fp, true, STREAM_CRYPTO_METHOD_TLS_CLIENT) == false) { + $msg = 'Failed to establish TLS connection'; + return new PEAR_Error($msg); + } + + if($this->_debug === true) { + echo "STARTTLS Negotiation Successful\n"; + } + + // RFC says we need to query the server capabilities again + if(PEAR::isError($res = $this->cmdCapability() )) { + $msg = 'Failed to connect, server said: ' . $res->getMessage(); + return new PEAR_Error($msg); + } + return true; + } + + function _getLineLength($string) + { + if (extension_loaded('mbstring')) { + return mb_strlen($string,'latin1'); + } else { + return strlen($string); + } + } + + function _getSubstr($string, $start, $length = false) + { + if (extension_loaded('mbstring')) { + if($length !== false) { + return mb_substr($string, $start, $length, 'latin1'); + } else { + $strlen = mb_strlen($string,'latin1'); + return mb_substr($string, $start, $strlen, 'latin1'); + } + } else { + if($length !== false) { + return substr($string, $start, $length); + } else { + return substr($string, $start); + } + } + } + +}//Class +?> diff --git a/egw-pear/Net/Sieve.php b/egw-pear/Net/Sieve.php new file mode 100644 index 0000000000..c00857cde0 --- /dev/null +++ b/egw-pear/Net/Sieve.php @@ -0,0 +1,1145 @@ + | +// | Co-Author: Damian Fernandez Sosa | +// | Co-Author: Anish Mistry | +// +-----------------------------------------------------------------------+ + +require_once('Net/Socket.php'); + +/** +* TODO +* +* o supportsAuthMech() +*/ + +/** +* Disconnected state +* @const NET_SIEVE_STATE_DISCONNECTED +*/ +define('NET_SIEVE_STATE_DISCONNECTED', 1, true); + +/** +* Authorisation state +* @const NET_SIEVE_STATE_AUTHORISATION +*/ +define('NET_SIEVE_STATE_AUTHORISATION', 2, true); + +/** +* Transaction state +* @const NET_SIEVE_STATE_TRANSACTION +*/ +define('NET_SIEVE_STATE_TRANSACTION', 3, true); + +/** +* A class for talking to the timsieved server which +* comes with Cyrus IMAP. +* +* SIEVE: RFC3028 http://www.ietf.org/rfc/rfc3028.txt +* MANAGE-SIEVE: http://www.ietf.org/internet-drafts/draft-martin-managesieve-06.txt +* +* @author Richard Heyes +* @author Damian Fernandez Sosa +* @author Anish Mistry +* @access public +* @version 1.2.0 +* @package Net_Sieve +*/ + +class Net_Sieve +{ + /** + * The socket object + * @var object + */ + var $_sock; + + /** + * Info about the connect + * @var array + */ + var $_data; + + /** + * Current state of the connection + * @var integer + */ + var $_state; + + /** + * Constructor error is any + * @var object + */ + var $_error; + + /** + * To allow class debuging + * @var boolean + */ + var $_debug = false; + + /** + * Allows picking up of an already established connection + * @var boolean + */ + var $_bypassAuth = false; + + /** + * Whether to use TLS if available + * @var boolean + */ + var $_useTLS = true; + + /** + * The auth methods this class support + * @var array + */ + var $supportedAuthMethods=array('DIGEST-MD5', 'CRAM-MD5', 'PLAIN' , 'LOGIN'); + //if you have problems using DIGEST-MD5 authentication please comment the line above and uncomment the following line + //var $supportedAuthMethods=array( 'CRAM-MD5', 'PLAIN' , 'LOGIN'); + + //var $supportedAuthMethods=array( 'PLAIN' , 'LOGIN'); + + /** + * The auth methods this class support + * @var array + */ + var $supportedSASLAuthMethods=array('DIGEST-MD5', 'CRAM-MD5'); + + /** + * Handles posible referral loops + * @var array + */ + var $_maxReferralCount = 15; + + /** + * Constructor + * Sets up the object, connects to the server and logs in. stores + * any generated error in $this->_error, which can be retrieved + * using the getError() method. + * + * @param string $user Login username + * @param string $pass Login password + * @param string $host Hostname of server + * @param string $port Port of server + * @param string $logintype Type of login to perform + * @param string $euser Effective User (if $user=admin, login as $euser) + * @param string $bypassAuth Skip the authentication phase. Useful if the socket + is already open. + * @param boolean $useTLS Use TLS if available + */ + function Net_Sieve($user = null , $pass = null , $host = 'localhost', $port = 2000, $logintype = '', $euser = '', $debug = false, $bypassAuth = false, $useTLS = true) + { + $this->_state = NET_SIEVE_STATE_DISCONNECTED; + $this->_data['user'] = $user; + $this->_data['pass'] = $pass; + $this->_data['host'] = $host; + $this->_data['port'] = $port; + $this->_data['logintype'] = $logintype; + $this->_data['euser'] = $euser; + $this->_sock = new Net_Socket(); + $this->_debug = $debug; + $this->_bypassAuth = $bypassAuth; + $this->_useTLS = $useTLS; + /* + * Include the Auth_SASL package. If the package is not available, + * we disable the authentication methods that depend upon it. + */ + if ((@include_once 'Auth/SASL.php') === false) { + if($this->_debug){ + echo "AUTH_SASL NOT PRESENT!\n"; + } + foreach($this->supportedSASLAuthMethods as $SASLMethod){ + $pos = array_search( $SASLMethod, $this->supportedAuthMethods ); + if($this->_debug){ + echo "DISABLING METHOD $SASLMethod\n"; + } + unset($this->supportedAuthMethods[$pos]); + } + } + if( ($user != null) && ($pass != null) ){ + $this->_error = $this->_handleConnectAndLogin(); + } + } + + /** + * Handles the errors the class can find + * on the server + * + * @access private + * @param mixed $msg Text error message or PEAR error object + * @param integer $code Numeric error code + * @return PEAR_Error + */ + function _raiseError($msg, $code) + { + include_once 'PEAR.php'; + return PEAR::raiseError($msg, $code); + } + + /** + * Handles connect and login. + * on the server + * + * @access private + * @return mixed Indexed array of scriptnames or PEAR_Error on failure + */ + function _handleConnectAndLogin() + { + if (PEAR::isError($res = $this->connect($this->_data['host'] , $this->_data['port'], $this->_useTLS ))) { + return $res; + } + if($this->_bypassAuth === false) { + if (PEAR::isError($res = $this->login($this->_data['user'], $this->_data['pass'], $this->_data['logintype'] , $this->_data['euser'] , $this->_bypassAuth) ) ) { + return $res; + } + } + return true; + } + + /** + * Returns an indexed array of scripts currently + * on the server + * + * @return mixed Indexed array of scriptnames or PEAR_Error on failure + */ + function listScripts() + { + if (is_array($scripts = $this->_cmdListScripts())) { + $this->_active = $scripts[1]; + return $scripts[0]; + } else { + return $scripts; + } + } + + /** + * Returns the active script + * + * @return mixed The active scriptname or PEAR_Error on failure + */ + function getActive() + { + if (!empty($this->_active)) { + return $this->_active; + + } elseif (is_array($scripts = $this->_cmdListScripts())) { + $this->_active = $scripts[1]; + return $scripts[1]; + } + } + + /** + * Sets the active script + * + * @param string $scriptname The name of the script to be set as active + * @return mixed true on success, PEAR_Error on failure + */ + function setActive($scriptname) + { + return $this->_cmdSetActive($scriptname); + } + + /** + * Retrieves a script + * + * @param string $scriptname The name of the script to be retrieved + * @return mixed The script on success, PEAR_Error on failure + */ + function getScript($scriptname) + { + return $this->_cmdGetScript($scriptname); + } + + /** + * Adds a script to the server + * + * @param string $scriptname Name of the script + * @param string $script The script + * @param boolean $makeactive Whether to make this the active script + * @return mixed true on success, PEAR_Error on failure + */ + function installScript($scriptname, $script, $makeactive = false) + { + if (PEAR::isError($res = $this->_cmdPutScript($scriptname, $script))) { + return $res; + + } elseif ($makeactive) { + return $this->_cmdSetActive($scriptname); + + } else { + return true; + } + } + + /** + * Removes a script from the server + * + * @param string $scriptname Name of the script + * @return mixed True on success, PEAR_Error on failure + */ + function removeScript($scriptname) + { + return $this->_cmdDeleteScript($scriptname); + } + + /** + * Returns any error that may have been generated in the + * constructor + * + * @return mixed False if no error, PEAR_Error otherwise + */ + function getError() + { + return PEAR::isError($this->_error) ? $this->_error : false; + } + + /** + * Handles connecting to the server and checking the + * response is valid. + * + * @access private + * @param string $host Hostname of server + * @param string $port Port of server + * @param array $options List of options to pass to connect + * @param boolean $useTLS Use TLS if available + * @return mixed True on success, PEAR_Error otherwise + */ + function connect($host, $port, $options = null, $useTLS = true) + { + if (NET_SIEVE_STATE_DISCONNECTED != $this->_state) { + $msg='Not currently in DISCONNECTED state'; + $code=1; + return $this->_raiseError($msg,$code); + } + + if (PEAR::isError($res = $this->_sock->connect($host, $port, false, 5, $options))) { + return $res; + } + + if($this->_bypassAuth === false) { + $this->_state = NET_SIEVE_STATE_AUTHORISATION; + if (PEAR::isError($res = $this->_doCmd())) { + return $res; + } + } else { + $this->_state = NET_SIEVE_STATE_TRANSACTION; + } + + // Explicitly ask for the capabilities in case the connection + // is picked up from an existing connection. + if(PEAR::isError($res = $this->_cmdCapability() )) { + $msg='Failed to connect, server said: ' . $res->getMessage(); + $code=2; + return $this->_raiseError($msg,$code); + } + + // Get logon greeting/capability and parse + $this->_parseCapability($res); + + if($useTLS === true) { + // check if we can enable TLS via STARTTLS + if(isset($this->_capability['starttls']) && function_exists('stream_socket_enable_crypto') === true) { + if (PEAR::isError($res = $this->_startTLS())) { + return $res; + } + } + } + + return true; + } + + /** + * Logs into server. + * + * @param string $user Login username + * @param string $pass Login password + * @param string $logintype Type of login method to use + * @param string $euser Effective UID (perform on behalf of $euser) + * @param boolean $bypassAuth Do not perform authentication + * @return mixed True on success, PEAR_Error otherwise + */ + function login($user, $pass, $logintype = null , $euser = '', $bypassAuth = false) + { + if (NET_SIEVE_STATE_AUTHORISATION != $this->_state) { + $msg='Not currently in AUTHORISATION state'; + $code=1; + return $this->_raiseError($msg,$code); + } + + if( $bypassAuth === false ){ + if(PEAR::isError($res=$this->_cmdAuthenticate($user , $pass , $logintype, $euser ) ) ){ + return $res; + } + } + $this->_state = NET_SIEVE_STATE_TRANSACTION; + return true; + } + + /** + * Handles the authentication using any known method + * + * @param string $uid The userid to authenticate as. + * @param string $pwd The password to authenticate with. + * @param string $userMethod The method to use ( if $userMethod == '' then the class chooses the best method (the stronger is the best ) ) + * @param string $euser The effective uid to authenticate as. + * + * @return mixed string or PEAR_Error + * + * @access private + * @since 1.0 + */ + function _cmdAuthenticate($uid , $pwd , $userMethod = null , $euser = '' ) + { + if ( PEAR::isError( $method = $this->_getBestAuthMethod($userMethod) ) ) { + return $method; + } + switch ($method) { + case 'DIGEST-MD5': + $result = $this->_authDigest_MD5( $uid , $pwd , $euser ); + return $result; + break; + case 'CRAM-MD5': + $result = $this->_authCRAM_MD5( $uid , $pwd, $euser); + break; + case 'LOGIN': + $result = $this->_authLOGIN( $uid , $pwd , $euser ); + break; + case 'PLAIN': + $result = $this->_authPLAIN( $uid , $pwd , $euser ); + break; + default : + $result = new PEAR_Error( "$method is not a supported authentication method" ); + break; + } + + if (PEAR::isError($res = $this->_doCmd() )) { + return $res; + } + return $result; + } + + /** + * Authenticates the user using the PLAIN method. + * + * @param string $user The userid to authenticate as. + * @param string $pass The password to authenticate with. + * @param string $euser The effective uid to authenticate as. + * + * @return array Returns an array containing the response + * + * @access private + * @since 1.0 + */ + function _authPLAIN($user, $pass , $euser ) + { + if ($euser != '') { + $cmd=sprintf('AUTHENTICATE "PLAIN" "%s"', base64_encode($euser . chr(0) . $user . chr(0) . $pass ) ) ; + } else { + $cmd=sprintf('AUTHENTICATE "PLAIN" "%s"', base64_encode( chr(0) . $user . chr(0) . $pass ) ); + } + return $this->_sendCmd( $cmd ) ; + } + + /** + * Authenticates the user using the PLAIN method. + * + * @param string $user The userid to authenticate as. + * @param string $pass The password to authenticate with. + * @param string $euser The effective uid to authenticate as. + * + * @return array Returns an array containing the response + * + * @access private + * @since 1.0 + */ + function _authLOGIN($user, $pass , $euser ) + { + $this->_sendCmd('AUTHENTICATE "LOGIN"'); + $this->_doCmd(sprintf('"%s"', base64_encode($user))); + $this->_doCmd(sprintf('"%s"', base64_encode($pass))); + } + + /** + * Authenticates the user using the CRAM-MD5 method. + * + * @param string $uid The userid to authenticate as. + * @param string $pwd The password to authenticate with. + * @param string $euser The effective uid to authenticate as. + * + * @return array Returns an array containing the response + * + * @access private + * @since 1.0 + */ + function _authCRAM_MD5($uid, $pwd, $euser) + { + if ( PEAR::isError( $challenge = $this->_doCmd( 'AUTHENTICATE "CRAM-MD5"' ) ) ) { + $this->_error=challenge ; + return challenge ; + } + $challenge=trim($challenge); + $challenge = base64_decode( trim($challenge) ); + $cram = &Auth_SASL::factory('crammd5'); + if ( PEAR::isError($resp=$cram->getResponse( $uid , $pwd , $challenge ) ) ) { + $this->_error=$resp; + return $resp; + } + $auth_str = base64_encode( $resp ); + if ( PEAR::isError($error = $this->_sendStringResponse( $auth_str ) ) ) { + $this->_error=$error; + return $error; + } + + } + + /** + * Authenticates the user using the DIGEST-MD5 method. + * + * @param string $uid The userid to authenticate as. + * @param string $pwd The password to authenticate with. + * @param string $euser The effective uid to authenticate as. + * + * @return array Returns an array containing the response + * + * @access private + * @since 1.0 + */ + function _authDigest_MD5($uid, $pwd, $euser) + { + if ( PEAR::isError( $challenge = $this->_doCmd('AUTHENTICATE "DIGEST-MD5"') ) ) { + $this->_error=challenge ; + return challenge ; + } + $challenge = base64_decode( $challenge ); + $digest = &Auth_SASL::factory('digestmd5'); + + if(PEAR::isError($param=$digest->getResponse($uid, $pwd, $challenge, "localhost", "sieve" , $euser) )) { + return $param; + } + $auth_str = base64_encode($param); + + if ( PEAR::isError($error = $this->_sendStringResponse( $auth_str ) ) ) { + $this->_error=$error; + return $error; + } + + if ( PEAR::isError( $challenge = $this->_doCmd() ) ) { + $this->_error=$challenge ; + return $challenge ; + } + + if( strtoupper(substr($challenge,0,2))== 'OK' ){ + return true; + } + + /** + * We don't use the protocol's third step because SIEVE doesn't allow + * subsequent authentication, so we just silently ignore it. + */ + if ( PEAR::isError($error = $this->_sendStringResponse( '' ) ) ) { + $this->_error=$error; + return $error; + } + + if (PEAR::isError($res = $this->_doCmd() )) { + return $res; + } + } + + /** + * Removes a script from the server + * + * @access private + * @param string $scriptname Name of the script to delete + * @return mixed True on success, PEAR_Error otherwise + */ + function _cmdDeleteScript($scriptname) + { + if (NET_SIEVE_STATE_TRANSACTION != $this->_state) { + $msg='Not currently in AUTHORISATION state'; + $code=1; + return $this->_raiseError($msg,$code); + } + if (PEAR::isError($res = $this->_doCmd(sprintf('DELETESCRIPT "%s"', $scriptname) ) )) { + return $res; + } + return true; + } + + /** + * Retrieves the contents of the named script + * + * @access private + * @param string $scriptname Name of the script to retrieve + * @return mixed The script if successful, PEAR_Error otherwise + */ + function _cmdGetScript($scriptname) + { + if (NET_SIEVE_STATE_TRANSACTION != $this->_state) { + $msg='Not currently in AUTHORISATION state'; + $code=1; + return $this->_raiseError($msg,$code); + } + + if (PEAR::isError($res = $this->_doCmd(sprintf('GETSCRIPT "%s"', $scriptname) ) ) ) { + return $res; + } + + return preg_replace('/{[0-9]+}\r\n/', '', $res); + } + + /** + * Sets the ACTIVE script, ie the one that gets run on new mail + * by the server + * + * @access private + * @param string $scriptname The name of the script to mark as active + * @return mixed True on success, PEAR_Error otherwise + */ + function _cmdSetActive($scriptname) + { + if (NET_SIEVE_STATE_TRANSACTION != $this->_state) { + $msg='Not currently in AUTHORISATION state'; + $code=1; + return $this->_raiseError($msg,$code); + } + + if (PEAR::isError($res = $this->_doCmd(sprintf('SETACTIVE "%s"', $scriptname) ) ) ) { + return $res; + } + + $this->_activeScript = $scriptname; + return true; + } + + /** + * Sends the LISTSCRIPTS command + * + * @access private + * @return mixed Two item array of scripts, and active script on success, + * PEAR_Error otherwise. + */ + function _cmdListScripts() + { + if (NET_SIEVE_STATE_TRANSACTION != $this->_state) { + $msg='Not currently in AUTHORISATION state'; + $code=1; + return $this->_raiseError($msg,$code); + } + + $scripts = array(); + $activescript = null; + + if (PEAR::isError($res = $this->_doCmd('LISTSCRIPTS'))) { + return $res; + } + + $res = explode("\r\n", $res); + + foreach ($res as $value) { + if (preg_match('/^"(.*)"( ACTIVE)?$/i', $value, $matches)) { + $scripts[] = $matches[1]; + if (!empty($matches[2])) { + $activescript = $matches[1]; + } + } + } + + return array($scripts, $activescript); + } + + /** + * Sends the PUTSCRIPT command to add a script to + * the server. + * + * @access private + * @param string $scriptname Name of the new script + * @param string $scriptdata The new script + * @return mixed True on success, PEAR_Error otherwise + */ + function _cmdPutScript($scriptname, $scriptdata) + { + if (NET_SIEVE_STATE_TRANSACTION != $this->_state) { + $msg='Not currently in TRANSACTION state'; + $code=1; + return $this->_raiseError($msg,$code); + } + + $stringLength = $this->_getLineLength($scriptdata); + + if (PEAR::isError($res = $this->_doCmd(sprintf("PUTSCRIPT \"%s\" {%d+}\r\n%s", $scriptname, $stringLength, $scriptdata) ))) { + return $res; + } + + return true; + } + + /** + * Sends the LOGOUT command and terminates the connection + * + * @access private + * @param boolean $sendLogoutCMD True to send LOGOUT command before disconnecting + * @return mixed True on success, PEAR_Error otherwise + */ + function _cmdLogout($sendLogoutCMD=true) + { + if (NET_SIEVE_STATE_DISCONNECTED === $this->_state) { + $msg='Not currently connected'; + $code=1; + return $this->_raiseError($msg,$code); + //return PEAR::raiseError('Not currently connected'); + } + + if($sendLogoutCMD){ + if (PEAR::isError($res = $this->_doCmd('LOGOUT'))) { + return $res; + } + } + + $this->_sock->disconnect(); + $this->_state = NET_SIEVE_STATE_DISCONNECTED; + return true; + } + + /** + * Sends the CAPABILITY command + * + * @access private + * @return mixed True on success, PEAR_Error otherwise + */ + function _cmdCapability() + { + if (NET_SIEVE_STATE_DISCONNECTED === $this->_state) { + $msg='Not currently connected'; + $code=1; + return $this->_raiseError($msg,$code); + } + + if (PEAR::isError($res = $this->_doCmd('CAPABILITY'))) { + return $res; + } + $this->_parseCapability($res); + return true; + } + + /** + * Checks if the server has space to store the script + * by the server + * + * @param string $scriptname The name of the script to mark as active + * @param integer $size The size of the script + * @return mixed True on success, PEAR_Error otherwise + */ + function haveSpace($scriptname,$size) + { + if (NET_SIEVE_STATE_TRANSACTION != $this->_state) { + $msg='Not currently in TRANSACTION state'; + $code=1; + return $this->_raiseError($msg,$code); + } + + if (PEAR::isError($res = $this->_doCmd(sprintf('HAVESPACE "%s" %d', $scriptname, $size) ) ) ) { + return $res; + } + + return true; + } + + /** + * Parses the response from the capability command. Stores + * the result in $this->_capability + * + * @access private + * @param string $data The response from the capability command + */ + function _parseCapability($data) + { + $data = preg_split('/\r?\n/', $data, -1, PREG_SPLIT_NO_EMPTY); + + for ($i = 0; $i < count($data); $i++) { + if (preg_match('/^"([a-z]+)"( "(.*)")?$/i', $data[$i], $matches)) { + switch (strtolower($matches[1])) { + case 'implementation': + $this->_capability['implementation'] = $matches[3]; + break; + + case 'sasl': + $this->_capability['sasl'] = preg_split('/\s+/', $matches[3]); + break; + + case 'sieve': + $this->_capability['extensions'] = preg_split('/\s+/', $matches[3]); + break; + + case 'starttls': + $this->_capability['starttls'] = true; + break; + } + } + } + } + + /** + * Sends a command to the server + * + * @access private + * @param string $cmd The command to send + */ + function _sendCmd($cmd) + { + $status = $this->_sock->getStatus(); + if (PEAR::isError($status) || $status['eof']) { + return new PEAR_Error( 'Failed to write to socket: (connection lost!) ' ); + } + if ( PEAR::isError( $error = $this->_sock->write( $cmd . "\r\n" ) ) ) { + return new PEAR_Error( 'Failed to write to socket: ' . $error->getMessage() ); + } + + if( $this->_debug ){ + // C: means this data was sent by the client (this class) + echo "C:$cmd\n"; + } + return true; + } + + /** + * Sends a string response to the server + * + * @access private + * @param string $cmd The command to send + */ + function _sendStringResponse($str) + { + $response='{' . $this->_getLineLength($str) . "+}\r\n" . $str ; + return $this->_sendCmd($response); + } + + function _recvLn() + { + $lastline=''; + if (PEAR::isError( $lastline = $this->_sock->gets( 8192 ) ) ) { + return new PEAR_Error( 'Failed to write to socket: ' . $lastline->getMessage() ); + } + $lastline=rtrim($lastline); + if($this->_debug){ + // S: means this data was sent by the IMAP Server + echo "S:$lastline\n" ; + } + + if( $lastline === '' ) { + return new PEAR_Error( 'Failed to receive from the socket' ); + } + + return $lastline; + } + + /** + * Send a command and retrieves a response from the server. + * + * + * @access private + * @param string $cmd The command to send + * @return mixed Reponse string if an OK response, PEAR_Error if a NO response + */ + function _doCmd($cmd = '' ) + { + $referralCount=0; + while($referralCount < $this->_maxReferralCount ){ + + if($cmd != '' ){ + if(PEAR::isError($error = $this->_sendCmd($cmd) )) { + return $error; + } + } + $response = ''; + + while (true) { + if(PEAR::isError( $line=$this->_recvLn() )){ + return $line; + } + if ('ok' === strtolower(substr($line, 0, 2))) { + $response .= $line; + return rtrim($response); + + } elseif ('no' === strtolower(substr($line, 0, 2))) { + // Check for string literal error message + if (preg_match('/^no {([0-9]+)\+?}/i', $line, $matches)) { + $line .= str_replace("\r\n", ' ', $this->_sock->read($matches[1] + 2 )); + if($this->_debug){ + echo "S:$line\n"; + } + } + $msg=trim($response . substr($line, 2)); + $code=3; + return $this->_raiseError($msg,$code); + } elseif ('bye' === strtolower(substr($line, 0, 3))) { + + if(PEAR::isError($error = $this->disconnect(false) ) ){ + $msg="Can't handle bye, The error was= " . $error->getMessage() ; + $code=4; + return $this->_raiseError($msg,$code); + } + //if (preg_match('/^bye \(referral "([^"]+)/i', $line, $matches)) { + if (preg_match('/^bye \(referral "(sieve:\/\/)?([^"]+)/i', $line, $matches)) { + // Check for referral, then follow it. Otherwise, carp an error. + // Replace the old host with the referral host preserving any protocol prefix + $this->_data['host'] = preg_replace('/\w+(?!(\w|\:\/\/)).*/',$matches[2],$this->_data['host']); + if (PEAR::isError($error = $this->_handleConnectAndLogin() ) ){ + $msg="Can't follow referral to " . $this->_data['host'] . ", The error was= " . $error->getMessage() ; + $code=5; + return $this->_raiseError($msg,$code); + } + break; + // Retry the command + if(PEAR::isError($error = $this->_sendCmd($cmd) )) { + return $error; + } + continue; + } + $msg=trim($response . $line); + $code=6; + return $this->_raiseError($msg,$code); + } elseif (preg_match('/^{([0-9]+)\+?}/i', $line, $matches)) { + // Matches String Responses. + //$line = str_replace("\r\n", ' ', $this->_sock->read($matches[1] + 2 )); + $str_size = $matches[1] + 2; + $line = ''; + $line_length = 0; + while ($line_length < $str_size) { + $line .= $this->_sock->read($str_size - $line_length); + $line_length = $this->_getLineLength($line); + } + if($this->_debug){ + echo "S:$line\n"; + } + // receive the pending OK + $this->_recvLn(); + return $line; + } + $response .= $line . "\r\n"; + $referralCount++; + } + } + $msg="Max referral count reached ($referralCount times) Cyrus murder loop error?"; + $code=7; + return $this->_raiseError($msg,$code); + } + + /** + * Sets the debug state + * + * @param boolean $debug + * @return void + */ + function setDebug($debug = true) + { + $this->_debug = $debug; + } + + /** + * Disconnect from the Sieve server + * + * @param string $scriptname The name of the script to be set as active + * @return mixed true on success, PEAR_Error on failure + */ + function disconnect($sendLogoutCMD=true) + { + return $this->_cmdLogout($sendLogoutCMD); + } + + /** + * Returns the name of the best authentication method that the server + * has advertised. + * + * @param string if !=null,authenticate with this method ($userMethod). + * + * @return mixed Returns a string containing the name of the best + * supported authentication method or a PEAR_Error object + * if a failure condition is encountered. + * @access private + * @since 1.0 + */ + function _getBestAuthMethod($userMethod = null) + { + if( isset($this->_capability['sasl']) ){ + $serverMethods=$this->_capability['sasl']; + }else{ + // if the server don't send an sasl capability fallback to login auth + //return 'LOGIN'; + return new PEAR_Error("This server don't support any Auth methods SASL problem?"); + } + + if($userMethod != null ){ + $methods = array(); + $methods[] = $userMethod; + }else{ + + $methods = $this->supportedAuthMethods; + } + if( ($methods != null) && ($serverMethods != null)){ + foreach ( $methods as $method ) { + if ( in_array( $method , $serverMethods ) ) { + return $method; + } + } + $serverMethods=implode(',' , $serverMethods ); + $myMethods=implode(',' ,$this->supportedAuthMethods); + return new PEAR_Error("$method NOT supported authentication method!. This server " . + "supports these methods= $serverMethods, but I support $myMethods"); + }else{ + return new PEAR_Error("This server don't support any Auth methods"); + } + } + + /** + * Return the list of extensions the server supports + * + * @return mixed array on success, PEAR_Error on failure + */ + function getExtensions() + { + if (NET_SIEVE_STATE_DISCONNECTED === $this->_state) { + $msg='Not currently connected'; + $code=7; + return $this->_raiseError($msg,$code); + } + + return $this->_capability['extensions']; + } + + /** + * Return true if tyhe server has that extension + * + * @param string the extension to compare + * @return mixed array on success, PEAR_Error on failure + */ + function hasExtension($extension) + { + if (NET_SIEVE_STATE_DISCONNECTED === $this->_state) { + $msg='Not currently connected'; + $code=7; + return $this->_raiseError($msg,$code); + } + + if(is_array($this->_capability['extensions'] ) ){ + foreach( $this->_capability['extensions'] as $ext){ + if( trim( strtolower( $ext ) ) === trim( strtolower( $extension ) ) ) + return true; + } + } + return false; + } + + /** + * Return the list of auth methods the server supports + * + * @return mixed array on success, PEAR_Error on failure + */ + function getAuthMechs() + { + if (NET_SIEVE_STATE_DISCONNECTED === $this->_state) { + $msg='Not currently connected'; + $code=7; + return $this->_raiseError($msg,$code); + } + if(!isset($this->_capability['sasl']) ){ + $this->_capability['sasl']=array(); + } + return $this->_capability['sasl']; + } + + /** + * Return true if the server has that extension + * + * @param string the extension to compare + * @return mixed array on success, PEAR_Error on failure + */ + function hasAuthMech($method) + { + if (NET_SIEVE_STATE_DISCONNECTED === $this->_state) { + $msg='Not currently connected'; + $code=7; + return $this->_raiseError($msg,$code); + //return PEAR::raiseError('Not currently connected'); + } + + if(is_array($this->_capability['sasl'] ) ){ + foreach( $this->_capability['sasl'] as $ext){ + if( trim( strtolower( $ext ) ) === trim( strtolower( $method ) ) ) + return true; + } + } + return false; + } + + /** + * Return true if the TLS negotiation was successful + * + * @access private + * @return mixed true on success, PEAR_Error on failure + */ + function _startTLS() + { + if (PEAR::isError($res = $this->_doCmd("STARTTLS"))) { + return $res; + } + + if(stream_socket_enable_crypto($this->_sock->fp, true, STREAM_CRYPTO_METHOD_TLS_CLIENT) == false) { + $msg='Failed to establish TLS connection'; + $code=2; + return $this->_raiseError($msg,$code); + } + + if($this->_debug === true) { + echo "STARTTLS Negotiation Successful\n"; + } + + // RFC says we need to query the server capabilities again + if(PEAR::isError($res = $this->_cmdCapability() )) { + $msg='Failed to connect, server said: ' . $res->getMessage(); + $code=2; + return $this->_raiseError($msg,$code); + } + return true; + } + + function _getLineLength($string) { + if (extension_loaded('mbstring') || @dl(PHP_SHLIB_PREFIX.'mbstring.'.PHP_SHLIB_SUFFIX)) { + return mb_strlen($string,'latin1'); + } else { + return strlen($string); + } + } +} +?> diff --git a/egw-pear/Net/Socket.php b/egw-pear/Net/Socket.php new file mode 100644 index 0000000000..b11e9ed764 --- /dev/null +++ b/egw-pear/Net/Socket.php @@ -0,0 +1,556 @@ + | +// | Chuck Hagenbuch | +// +----------------------------------------------------------------------+ +// +// $Id: Socket.php,v 1.28 2006/12/13 21:32:03 cweiske Exp $ + +require_once 'PEAR.php'; + +define('NET_SOCKET_READ', 1); +define('NET_SOCKET_WRITE', 2); +define('NET_SOCKET_ERROR', 4); + +/** + * Generalized Socket class. + * + * @version 1.1 + * @author Stig Bakken + * @author Chuck Hagenbuch + */ +class Net_Socket extends PEAR { + + /** + * Socket file pointer. + * @var resource $fp + */ + var $fp = null; + + /** + * Whether the socket is blocking. Defaults to true. + * @var boolean $blocking + */ + var $blocking = true; + + /** + * Whether the socket is persistent. Defaults to false. + * @var boolean $persistent + */ + var $persistent = false; + + /** + * The IP address to connect to. + * @var string $addr + */ + var $addr = ''; + + /** + * The port number to connect to. + * @var integer $port + */ + var $port = 0; + + /** + * Number of seconds to wait on socket connections before assuming + * there's no more data. Defaults to no timeout. + * @var integer $timeout + */ + var $timeout = false; + + /** + * Number of bytes to read at a time in readLine() and + * readAll(). Defaults to 2048. + * @var integer $lineLength + */ + var $lineLength = 2048; + + /** + * Connect to the specified port. If called when the socket is + * already connected, it disconnects and connects again. + * + * @param string $addr IP address or host name. + * @param integer $port TCP port number. + * @param boolean $persistent (optional) Whether the connection is + * persistent (kept open between requests + * by the web server). + * @param integer $timeout (optional) How long to wait for data. + * @param array $options See options for stream_context_create. + * + * @access public + * + * @return boolean | PEAR_Error True on success or a PEAR_Error on failure. + */ + function connect($addr, $port = 0, $persistent = null, $timeout = null, $options = null) + { + if (is_resource($this->fp)) { + @fclose($this->fp); + $this->fp = null; + } + + if (!$addr) { + return $this->raiseError('$addr cannot be empty'); + } elseif (strspn($addr, '.0123456789') == strlen($addr) || + strstr($addr, '/') !== false) { + $this->addr = $addr; + } else { + $this->addr = @gethostbyname($addr); + } + + $this->port = $port % 65536; + + if ($persistent !== null) { + $this->persistent = $persistent; + } + + if ($timeout !== null) { + $this->timeout = $timeout; + } + + $errno = 0; + $errstr = ''; + if ($options && function_exists('stream_socket_client')) { + if ($this->timeout) { + $timeout = $this->timeout; + } else { + $timeout = 0; + } + + $context = stream_context_create($options); + $flags = ($this->persistent === true ? STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT : STREAM_CLIENT_CONNECT); + $fp = @stream_socket_client($this->addr.':'.$this->port, $errno, $errstr, $timeout, $flags, $context); + } else { + $openfunc = $this->persistent ? 'pfsockopen' : 'fsockopen'; + if ($this->timeout) { + $fp = @$openfunc($this->addr, $this->port, $errno, $errstr, $this->timeout); + } else { + $fp = @$openfunc($this->addr, $this->port, $errno, $errstr); + } + } + + if (!$fp) { + return $this->raiseError($errstr, $errno); + } + + $this->fp = $fp; + + return $this->setBlocking($this->blocking); + } + + /** + * Disconnects from the peer, closes the socket. + * + * @access public + * @return mixed true on success or an error object otherwise + */ + function disconnect() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + @fclose($this->fp); + $this->fp = null; + return true; + } + + /** + * Find out if the socket is in blocking mode. + * + * @access public + * @return boolean The current blocking mode. + */ + function isBlocking() + { + return $this->blocking; + } + + /** + * Sets whether the socket connection should be blocking or + * not. A read call to a non-blocking socket will return immediately + * if there is no data available, whereas it will block until there + * is data for blocking sockets. + * + * @param boolean $mode True for blocking sockets, false for nonblocking. + * @access public + * @return mixed true on success or an error object otherwise + */ + function setBlocking($mode) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $this->blocking = $mode; + socket_set_blocking($this->fp, $this->blocking); + return true; + } + + /** + * Sets the timeout value on socket descriptor, + * expressed in the sum of seconds and microseconds + * + * @param integer $seconds Seconds. + * @param integer $microseconds Microseconds. + * @access public + * @return mixed true on success or an error object otherwise + */ + function setTimeout($seconds, $microseconds) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + return socket_set_timeout($this->fp, $seconds, $microseconds); + } + + /** + * Sets the file buffering size on the stream. + * See php's stream_set_write_buffer for more information. + * + * @param integer $size Write buffer size. + * @access public + * @return mixed on success or an PEAR_Error object otherwise + */ + function setWriteBuffer($size) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $returned = stream_set_write_buffer($this->fp, $code); + if ($returned == 0) { + return true; + } + return $this->raiseError('Cannot set write buffer.'); + } + + /** + * Returns information about an existing socket resource. + * Currently returns four entries in the result array: + * + *

+ * timed_out (bool) - The socket timed out waiting for data
+ * blocked (bool) - The socket was blocked
+ * eof (bool) - Indicates EOF event
+ * unread_bytes (int) - Number of bytes left in the socket buffer
+ *

+ * + * @access public + * @return mixed Array containing information about existing socket resource or an error object otherwise + */ + function getStatus() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + return socket_get_status($this->fp); + } + + /** + * Get a specified line of data + * + * @access public + * @return $size bytes of data from the socket, or a PEAR_Error if + * not connected. + */ + function gets($size) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + return @fgets($this->fp, $size); + } + + /** + * Read a specified amount of data. This is guaranteed to return, + * and has the added benefit of getting everything in one fread() + * chunk; if you know the size of the data you're getting + * beforehand, this is definitely the way to go. + * + * @param integer $size The number of bytes to read from the socket. + * @access public + * @return $size bytes of data from the socket, or a PEAR_Error if + * not connected. + */ + function read($size) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + return @fread($this->fp, $size); + } + + /** + * Write a specified amount of data. + * + * @param string $data Data to write. + * @param integer $blocksize Amount of data to write at once. + * NULL means all at once. + * + * @access public + * @return mixed true on success or an error object otherwise + */ + function write($data, $blocksize = null) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + if (is_null($blocksize) && !OS_WINDOWS) { + return fwrite($this->fp, $data); + } else { + if (is_null($blocksize)) { + $blocksize = 1024; + } + + $pos = 0; + $size = strlen($data); + while ($pos < $size) { + $written = @fwrite($this->fp, substr($data, $pos, $blocksize)); + if ($written === false) { + return false; + } + $pos += $written; + } + + return $pos; + } + } + + /** + * Write a line of data to the socket, followed by a trailing "\r\n". + * + * @access public + * @return mixed fputs result, or an error + */ + function writeLine($data) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + return fwrite($this->fp, $data . "\r\n"); + } + + /** + * Tests for end-of-file on a socket descriptor. + * + * Also returns true if the socket is disconnected. + * + * @access public + * @return bool + */ + function eof() + { + return (!is_resource($this->fp) || feof($this->fp)); + } + + /** + * Reads a byte of data + * + * @access public + * @return 1 byte of data from the socket, or a PEAR_Error if + * not connected. + */ + function readByte() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + return ord(@fread($this->fp, 1)); + } + + /** + * Reads a word of data + * + * @access public + * @return 1 word of data from the socket, or a PEAR_Error if + * not connected. + */ + function readWord() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $buf = @fread($this->fp, 2); + return (ord($buf[0]) + (ord($buf[1]) << 8)); + } + + /** + * Reads an int of data + * + * @access public + * @return integer 1 int of data from the socket, or a PEAR_Error if + * not connected. + */ + function readInt() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $buf = @fread($this->fp, 4); + return (ord($buf[0]) + (ord($buf[1]) << 8) + + (ord($buf[2]) << 16) + (ord($buf[3]) << 24)); + } + + /** + * Reads a zero-terminated string of data + * + * @access public + * @return string, or a PEAR_Error if + * not connected. + */ + function readString() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $string = ''; + while (($char = @fread($this->fp, 1)) != "\x00") { + $string .= $char; + } + return $string; + } + + /** + * Reads an IP Address and returns it in a dot formated string + * + * @access public + * @return Dot formated string, or a PEAR_Error if + * not connected. + */ + function readIPAddress() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $buf = @fread($this->fp, 4); + return sprintf("%s.%s.%s.%s", ord($buf[0]), ord($buf[1]), + ord($buf[2]), ord($buf[3])); + } + + /** + * Read until either the end of the socket or a newline, whichever + * comes first. Strips the trailing newline from the returned data. + * + * @access public + * @return All available data up to a newline, without that + * newline, or until the end of the socket, or a PEAR_Error if + * not connected. + */ + function readLine() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + ob_start(); + $line = ''; + $timeout = time() + $this->timeout; + while (!feof($this->fp) && (!$this->timeout || time() < $timeout)) { + $line .= fgets($this->fp, $this->lineLength); + if (substr($line, -1) == "\n") { + ob_end_clean(); + return rtrim($line, "\r\n"); + } + } + ob_end_clean(); + return $line; + } + + /** + * Read until the socket closes, or until there is no more data in + * the inner PHP buffer. If the inner buffer is empty, in blocking + * mode we wait for at least 1 byte of data. Therefore, in + * blocking mode, if there is no data at all to be read, this + * function will never exit (unless the socket is closed on the + * remote end). + * + * @access public + * + * @return string All data until the socket closes, or a PEAR_Error if + * not connected. + */ + function readAll() + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $data = ''; + while (!feof($this->fp)) { + $data .= @fread($this->fp, $this->lineLength); + } + return $data; + } + + /** + * Runs the equivalent of the select() system call on the socket + * with a timeout specified by tv_sec and tv_usec. + * + * @param integer $state Which of read/write/error to check for. + * @param integer $tv_sec Number of seconds for timeout. + * @param integer $tv_usec Number of microseconds for timeout. + * + * @access public + * @return False if select fails, integer describing which of read/write/error + * are ready, or PEAR_Error if not connected. + */ + function select($state, $tv_sec, $tv_usec = 0) + { + if (!is_resource($this->fp)) { + return $this->raiseError('not connected'); + } + + $read = null; + $write = null; + $except = null; + if ($state & NET_SOCKET_READ) { + $read[] = $this->fp; + } + if ($state & NET_SOCKET_WRITE) { + $write[] = $this->fp; + } + if ($state & NET_SOCKET_ERROR) { + $except[] = $this->fp; + } + if (false === ($sr = stream_select($read, $write, $except, $tv_sec, $tv_usec))) { + return false; + } + + $result = 0; + if (count($read)) { + $result |= NET_SOCKET_READ; + } + if (count($write)) { + $result |= NET_SOCKET_WRITE; + } + if (count($except)) { + $result |= NET_SOCKET_ERROR; + } + return $result; + } + +} diff --git a/egw-pear/setup/setup.inc.php b/egw-pear/setup/setup.inc.php new file mode 100644 index 0000000000..e89fb219bc --- /dev/null +++ b/egw-pear/setup/setup.inc.php @@ -0,0 +1,49 @@ + 'PEAR - PHP Extension and Application Repository', + 'url' => 'http://pear.php.net', +); +$setup_info['egw-pear']['license'] = 'PHP'; +$setup_info['egw-pear']['description'] = + 'A place for PEAR modules modified for eGroupWare.'; + +$setup_info['egw-pear']['note'] = + 'This application is a place for PEAR modules used by eGroupWare, which are NOT YET available from pear, + because we patched them somehow and the PEAR modules are not released upstream. + This application is under the LGPL license because the GPL is not compatible with the PHP license. + If the modules are available from PEAR they do NOT belong here anymore.'; + +$setup_info['egw-pear']['maintainer'] = array( + 'name' => 'eGroupWare coreteam', + 'email' => 'egroupware-developers@lists.sourceforge.net', +); + +// installation checks for egw-pear +$setup_info['egw-pear']['check_install'] = array( + // we need pear itself to be installed + '' => array( + 'func' => 'pear_check', + 'from' => 'FeLaMiMail', + ), + // Net_Socket is required from Net_IMAP & Net_Sieve + 'Net_Socket' => array( + 'func' => 'pear_check', + 'from' => 'FeLaMiMail', + ), +); diff --git a/emailadmin/Changelog b/emailadmin/Changelog new file mode 100644 index 0000000000..448204b38b --- /dev/null +++ b/emailadmin/Changelog @@ -0,0 +1,49 @@ +2007-06-19 Lars Kneschke + * added support for defining signature handling in emailadmin + +2007-01-05 Lars Kneschke + * improved parsing of content-type response + +2007-01-03 Lars Kneschke + * enabled renaming of dbmail accounts + * made SSL/TLS settings working again + +2006-12-31 Lars Kneschke + * major rewrite of the imap backend. the imap backend is not handled + by the php extension php-imap anymore, but the PEAR class Net_IMAP. + * improved handling of namespaces + * improved performance of most imap operations + * improved folderhandling + * make emailadmin dependent on egw-pear + +20061010 lkneschke@metaways.de + +- added support for dbmailuser schema + +20060416 RalfBecker-AT-outdoor-training.de: + +- added plesk plugin to create mail accounts and manage passwords, aliases + forwards and quota on a plesk system (tested with plesk7.5 Linux) + +20051128 + +- added function to retrieve users profile based on applicationname and + groupmembership. No need to select profile as admin anymore. + +20051120 + +- fixed opening "edit profile" dialog in new window +- fixed handling of groups in "edit profile" dialog + +20051123 + +- polished gui a little bit. the gui looks much better now. at least i hope so :-) +- added option to define global used smtp auth options +- made multiple profiles useable. you can now assign profiles depending on + application name and group membership. + + +20051013 + +- Postfix LDAP users can now update there email forwardingaddress + themself(if enabled) diff --git a/emailadmin/doc/dbmail.schema b/emailadmin/doc/dbmail.schema new file mode 100644 index 0000000000..a1e3469371 --- /dev/null +++ b/emailadmin/doc/dbmail.schema @@ -0,0 +1,71 @@ +# +# dbmail-ldap v3 directory schema +# +# Based on the Qmail schema +# Modified for dbmail by Paul Stevens +# Modified for dbmail by Lars Kneschke too +# +# This schema depends on: +# - core.schema +# - cosine.schema +# - nis.schema +# +# This schema conflicts with +# - qmailuser.schema + +# Attribute Type Definitions + +attributetype ( 1.3.6.1.4.1.12340.6.2.1.1 NAME 'mailQuota' + DESC 'The amount of space the user can use until all further messages get bounced.' + SYNTAX 1.3.6.1.4.1.1466.115.121.1.44 + SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.12340.6.2.1.2 NAME 'mailForwardingAddress' + DESC 'Address(es) to forward all incoming messages to.' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +attributetype ( 1.3.6.1.4.1.12340.6.2.1.3 NAME 'mailHost' + DESC 'Name or address of the MTA host to use for recipient' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 ) + +attributetype ( 1.3.6.1.4.1.12340.6.2.1.4 NAME 'dbmailUID' + DESC 'UID of the user on the mailsystem' + EQUALITY caseIgnoreIA5Match + SUBSTR caseIgnoreIA5SubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.12340.6.2.1.5 NAME 'dbmailGID' + DESC 'GID of the user on the mailsystem' + EQUALITY caseIgnoreIA5Match + SUBSTR caseIgnoreIA5SubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 + SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.12340.6.2.1.6 NAME 'mailAlternateAddress' + DESC 'Secondary (alias) mailaddresses for the same user' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} ) + +attributetype ( 1.3.6.1.4.1.12340.6.2.1.7 NAME 'deliveryMode' + DESC 'multi field entries of: normal, forwardonly' + EQUALITY caseIgnoreMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.44 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.12340.6.2.1.8 NAME 'accountStatus' + DESC 'The status of a user account: active, disabled' + EQUALITY caseIgnoreMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.44 SINGLE-VALUE ) + +# Object Class Definitions + +objectclass ( 1.3.6.1.4.1.12340.6.2.2.1 NAME 'dbmailUser' + DESC 'DBMail-LDAP User' SUP top AUXILIARY + MUST ( uid $ mail ) + MAY ( userPassword $ uidNumber $ gidNumber $ mailQuota $ mailForwardingAddress $ mailHost $ mailAlternateAddress $ dbmailUID $ dbmailGID $ deliveryMode $ accountStatus ) ) + +objectclass ( 1.3.6.1.4.1.12340.6.2.2.2 NAME 'dbmailForwardingAddress' + DESC 'DBMail-LDAP Forwarding Address' SUP top AUXILIARY + MUST ( mail $ mailForwardingAddress ) ) diff --git a/emailadmin/doc/main.cf b/emailadmin/doc/main.cf new file mode 100644 index 0000000000..e7c741dd90 --- /dev/null +++ b/emailadmin/doc/main.cf @@ -0,0 +1,754 @@ +# Global Postfix configuration file. This file lists only a subset +# of all 300+ parameters. See the sample-xxx.cf files for a full list. +# +# The general format is lines with parameter = value pairs. Lines +# that begin with whitespace continue the previous line. A value can +# contain references to other $names or ${name}s. +# +# NOTE - CHANGE NO MORE THAN 2-3 PARAMETERS AT A TIME, AND TEST IF +# POSTFIX STILL WORKS AFTER EVERY CHANGE. + +# SOFT BOUNCE +# +# The soft_bounce parameter provides a limited safety net for +# testing. When soft_bounce is enabled, mail will remain queued that +# would otherwise bounce. This parameter disables locally-generated +# bounces, and prevents the SMTP server from rejecting mail permanently +# (by changing 5xx replies into 4xx replies). However, soft_bounce +# is no cure for address rewriting mistakes or mail routing mistakes. +# +#soft_bounce = no + +# LOCAL PATHNAME INFORMATION +# +# The queue_directory specifies the location of the Postfix queue. +# This is also the root directory of Postfix daemons that run chrooted. +# See the files in examples/chroot-setup for setting up Postfix chroot +# environments on different UNIX systems. +# +queue_directory = /var/spool/postfix + +# The command_directory parameter specifies the location of all +# postXXX commands. +# +command_directory = /usr/sbin + +# The daemon_directory parameter specifies the location of all Postfix +# daemon programs (i.e. programs listed in the master.cf file). This +# directory must be owned by root. +# +daemon_directory = /usr/lib/postfix + +# QUEUE AND PROCESS OWNERSHIP +# +# The mail_owner parameter specifies the owner of the Postfix queue +# and of most Postfix daemon processes. Specify the name of a user +# account THAT DOES NOT SHARE ITS USER OR GROUP ID WITH OTHER ACCOUNTS +# AND THAT OWNS NO OTHER FILES OR PROCESSES ON THE SYSTEM. In +# particular, don't specify nobody or daemon. PLEASE USE A DEDICATED +# USER. +# +mail_owner = postfix + +# The default_privs parameter specifies the default rights used by +# the local delivery agent for delivery to external file or command. +# These rights are used in the absence of a recipient user context. +# DO NOT SPECIFY A PRIVILEGED USER OR THE POSTFIX OWNER. +# +#default_privs = nobody + +# INTERNET HOST AND DOMAIN NAMES +# +# The myhostname parameter specifies the internet hostname of this +# mail system. The default is to use the fully-qualified domain name +# from gethostname(). $myhostname is used as a default value for many +# other configuration parameters. +# +#myhostname = host.domain.tld +#myhostname = virtual.domain.tld + +# The mydomain parameter specifies the local internet domain name. +# The default is to use $myhostname minus the first component. +# $mydomain is used as a default value for many other configuration +# parameters. +# +#mydomain = domain.tld + +# SENDING MAIL +# +# The myorigin parameter specifies the domain that locally-posted +# mail appears to come from. The default is to append $myhostname, +# which is fine for small sites. If you run a domain with multiple +# machines, you should (1) change this to $mydomain and (2) set up +# a domain-wide alias database that aliases each user to +# user@that.users.mailhost. +# +# For the sake of consistency between sender and recipient addresses, +# myorigin also specifies the default domain name that is appended +# to recipient addresses that have no @domain part. +# +#myorigin = $myhostname +#myorigin = $mydomain + +# RECEIVING MAIL + +# The inet_interfaces parameter specifies the network interface +# addresses that this mail system receives mail on. By default, +# the software claims all active interfaces on the machine. The +# parameter also controls delivery of mail to user@[ip.address]. +# +# See also the proxy_interfaces parameter, for network addresses that +# are forwarded to us via a proxy or network address translator. +# +# Note: you need to stop/start Postfix when this parameter changes. +# +#inet_interfaces = all +#inet_interfaces = $myhostname +#inet_interfaces = $myhostname, localhost + +# The proxy_interfaces parameter specifies the network interface +# addresses that this mail system receives mail on by way of a +# proxy or network address translation unit. This setting extends +# the address list specified with the inet_interfaces parameter. +# +# You must specify your proxy/NAT addresses when your system is a +# backup MX host for other domains, otherwise mail delivery loops +# will happen when the primary MX host is down. +# +#proxy_interfaces = +#proxy_interfaces = 1.2.3.4 + +# The mydestination parameter specifies the list of domains that this +# machine considers itself the final destination for. +# +# These domains are routed to the delivery agent specified with the +# local_transport parameter setting. By default, that is the UNIX +# compatible delivery agent that lookups all recipients in /etc/passwd +# and /etc/aliases or their equivalent. +# +# The default is $myhostname + localhost.$mydomain. On a mail domain +# gateway, you should also include $mydomain. +# +# Do not specify the names of virtual domains - those domains are +# specified elsewhere (see sample-virtual.cf). +# +# Do not specify the names of domains that this machine is backup MX +# host for. Specify those names via the relay_domains settings for +# the SMTP server, or use permit_mx_backup if you are lazy (see +# sample-smtpd.cf). +# +# The local machine is always the final destination for mail addressed +# to user@[the.net.work.address] of an interface that the mail system +# receives mail on (see the inet_interfaces parameter). +# +# Specify a list of host or domain names, /file/name or type:table +# patterns, separated by commas and/or whitespace. A /file/name +# pattern is replaced by its contents; a type:table is matched when +# a name matches a lookup key (the right-hand side is ignored). +# Continue long lines by starting the next line with whitespace. +# +# DO NOT LIST RELAY DESTINATIONS IN MYDESTINATION. +# SPECIFY RELAY DESTINATIONS IN RELAY_DOMAINS. +# +# See also below, section "REJECTING MAIL FOR UNKNOWN LOCAL USERS". +# +#mydestination = $myhostname, localhost.$mydomain +#mydestination = $myhostname, localhost.$mydomain $mydomain +#mydestination = $myhostname, localhost.$mydomain, $mydomain, +# mail.$mydomain, www.$mydomain, ftp.$mydomain +mydestination = $myhostname, localhost.$mydomain $mydomain, + kneschke.de, phpgw.de, egroupware.org, linux-at-work.de, lists.kneschke.de + +# REJECTING MAIL FOR UNKNOWN LOCAL USERS +# +# The local_recipient_maps parameter specifies optional lookup tables +# with all names or addresses of users that are local with respect +# to $mydestination and $inet_interfaces. +# +# If this parameter is defined, then the SMTP server will reject +# mail for unknown local users. This parameter is defined by default. +# +# To turn off local recipient checking in the SMTP server, specify +# local_recipient_maps = (i.e. empty). +# +# The default setting assumes that you use the default Postfix local +# delivery agent for local delivery. You need to update the +# local_recipient_maps setting if: +# +# - You define $mydestination domain recipients in files other than +# /etc/passwd, /etc/aliases, or the $virtual_alias_maps files. +# For example, you define $mydestination domain recipients in +# the $virtual_mailbox_maps files. +# +# - You redefine the local delivery agent in master.cf. +# +# - You redefine the "local_transport" setting in main.cf. +# +# - You use the "luser_relay", "mailbox_transport", or "fallback_transport" +# feature of the Postfix local delivery agent (see sample-local.cf). +# +# Details are described in the LOCAL_RECIPIENT_README file. +# +# Beware: if the Postfix SMTP server runs chrooted, you probably have +# to access the passwd file via the proxymap service, in order to +# overcome chroot restrictions. The alternative, having a copy of +# the system passwd file in the chroot jail is just not practical. +# +# The right-hand side of the lookup tables is conveniently ignored. +# In the left-hand side, specify a bare username, an @domain.tld +# wild-card, or specify a user@domain.tld address. +# +#local_recipient_maps = unix:passwd.byname $alias_maps +#local_recipient_maps = proxy:unix:passwd.byname $alias_maps +#local_recipient_maps = + +# The unknown_local_recipient_reject_code specifies the SMTP server +# response code when a recipient domain matches $mydestination or +# $inet_interfaces, while $local_recipient_maps is non-empty and the +# recipient address or address local-part is not found. +# +# The default setting is 550 (reject mail) but it is safer to start +# with 450 (try again later) until you are certain that your +# local_recipient_maps settings are OK. +# +unknown_local_recipient_reject_code = 550 +#unknown_local_recipient_reject_code = 450 + +# TRUST AND RELAY CONTROL + +# The mynetworks parameter specifies the list of "trusted" SMTP +# clients that have more privileges than "strangers". +# +# In particular, "trusted" SMTP clients are allowed to relay mail +# through Postfix. See the smtpd_recipient_restrictions parameter +# in file sample-smtpd.cf. +# +# You can specify the list of "trusted" network addresses by hand +# or you can let Postfix do it for you (which is the default). +# +# By default (mynetworks_style = subnet), Postfix "trusts" SMTP +# clients in the same IP subnetworks as the local machine. +# On Linux, this does works correctly only with interfaces specified +# with the "ifconfig" command. +# +# Specify "mynetworks_style = class" when Postfix should "trust" SMTP +# clients in the same IP class A/B/C networks as the local machine. +# Don't do this with a dialup site - it would cause Postfix to "trust" +# your entire provider's network. Instead, specify an explicit +# mynetworks list by hand, as described below. +# +# Specify "mynetworks_style = host" when Postfix should "trust" +# only the local machine. +# +#mynetworks_style = class +#mynetworks_style = subnet +#mynetworks_style = host + +# Alternatively, you can specify the mynetworks list by hand, in +# which case Postfix ignores the mynetworks_style setting. +# +# Specify an explicit list of network/netmask patterns, where the +# mask specifies the number of bits in the network part of a host +# address. +# +# You can also specify the absolute pathname of a pattern file instead +# of listing the patterns here. Specify type:table for table-based lookups +# (the value on the table right-hand side is not used). +# +#mynetworks = 168.100.189.0/28, 127.0.0.0/8 +#mynetworks = $config_directory/mynetworks +#mynetworks = hash:/etc/postfix/network_table + +# The relay_domains parameter restricts what destinations this system will +# relay mail to. See the smtpd_recipient_restrictions restriction in the +# file sample-smtpd.cf for detailed information. +# +# By default, Postfix relays mail +# - from "trusted" clients (IP address matches $mynetworks) to any destination, +# - from "untrusted" clients to destinations that match $relay_domains or +# subdomains thereof, except addresses with sender-specified routing. +# The default relay_domains value is $mydestination. +# +# In addition to the above, the Postfix SMTP server by default accepts mail +# that Postfix is final destination for: +# - destinations that match $inet_interfaces, +# - destinations that match $mydestination +# - destinations that match $virtual_alias_domains, +# - destinations that match $virtual_mailbox_domains. +# These destinations do not need to be listed in $relay_domains. +# +# Specify a list of hosts or domains, /file/name patterns or type:name +# lookup tables, separated by commas and/or whitespace. Continue +# long lines by starting the next line with whitespace. A file name +# is replaced by its contents; a type:name table is matched when a +# (parent) domain appears as lookup key. +# +# NOTE: Postfix will not automatically forward mail for domains that +# list this system as their primary or backup MX host. See the +# permit_mx_backup restriction in the file sample-smtpd.cf. +# +#relay_domains = $mydestination + +# INTERNET OR INTRANET + +# The relayhost parameter specifies the default host to send mail to +# when no entry is matched in the optional transport(5) table. When +# no relayhost is given, mail is routed directly to the destination. +# +# On an intranet, specify the organizational domain name. If your +# internal DNS uses no MX records, specify the name of the intranet +# gateway host instead. +# +# In the case of SMTP, specify a domain, host, host:port, [host]:port, +# [address] or [address]:port; the form [host] turns off MX lookups. +# +# If you're connected via UUCP, see also the default_transport parameter. +# +#relayhost = $mydomain +#relayhost = gateway.my.domain +#relayhost = uucphost +#relayhost = [an.ip.add.ress] + +# REJECTING UNKNOWN RELAY USERS +# +# The relay_recipient_maps parameter specifies optional lookup tables +# with all addresses in the domains that match $relay_domains. +# +# If this parameter is defined, then the SMTP server will reject +# mail for unknown relay users. This feature is off by default. +# +# The right-hand side of the lookup tables is conveniently ignored. +# In the left-hand side, specify an @domain.tld wild-card, or specify +# a user@domain.tld address. +# +#relay_recipient_maps = hash:/etc/postfix/relay_recipients + +# INPUT RATE CONTROL +# +# The in_flow_delay configuration parameter implements mail input +# flow control. This feature is turned on by default, although it +# still needs further development (it's disabled on SCO UNIX due +# to an SCO bug). +# +# A Postfix process will pause for $in_flow_delay seconds before +# accepting a new message, when the message arrival rate exceeds the +# message delivery rate. With the default 100 SMTP server process +# limit, this limits the mail inflow to 100 messages a second more +# than the number of messages delivered per second. +# +# Specify 0 to disable the feature. Valid delays are 0..10. +# +#in_flow_delay = 1s + +# ADDRESS REWRITING +# +# Insert text from sample-rewrite.cf if you need to do address +# masquerading. +# +# Insert text from sample-canonical.cf if you need to do address +# rewriting, or if you need username->Firstname.Lastname mapping. + +# ADDRESS REDIRECTION (VIRTUAL DOMAIN) +# +# Insert text from sample-virtual.cf if you need virtual domain support. + +# "USER HAS MOVED" BOUNCE MESSAGES +# +# Insert text from sample-relocated.cf if you need "user has moved" +# style bounce messages. Alternatively, you can bounce recipients +# with an SMTP server access table. See sample-smtpd.cf. + +# TRANSPORT MAP +# +# Insert text from sample-transport.cf if you need explicit routing. + +# ALIAS DATABASE +# +# The alias_maps parameter specifies the list of alias databases used +# by the local delivery agent. The default list is system dependent. +# +# On systems with NIS, the default is to search the local alias +# database, then the NIS alias database. See aliases(5) for syntax +# details. +# +# If you change the alias database, run "postalias /etc/aliases" (or +# wherever your system stores the mail alias file), or simply run +# "newaliases" to build the necessary DBM or DB file. +# +# It will take a minute or so before changes become visible. Use +# "postfix reload" to eliminate the delay. +# +#alias_maps = dbm:/etc/aliases +#alias_maps = hash:/etc/aliases +#alias_maps = hash:/etc/aliases, nis:mail.aliases +#alias_maps = netinfo:/aliases + +# The alias_database parameter specifies the alias database(s) that +# are built with "newaliases" or "sendmail -bi". This is a separate +# configuration parameter, because alias_maps (see above) may specify +# tables that are not necessarily all under control by Postfix. +# +#alias_database = dbm:/etc/aliases +#alias_database = dbm:/etc/mail/aliases +#alias_database = hash:/etc/aliases +#alias_database = hash:/etc/aliases, hash:/opt/majordomo/aliases + +# ADDRESS EXTENSIONS (e.g., user+foo) +# +# The recipient_delimiter parameter specifies the separator between +# user names and address extensions (user+foo). See canonical(5), +# local(8), relocated(5) and virtual(5) for the effects this has on +# aliases, canonical, virtual, relocated and .forward file lookups. +# Basically, the software tries user+foo and .forward+foo before +# trying user and .forward. +# +#recipient_delimiter = + + +# DELIVERY TO MAILBOX +# +# The home_mailbox parameter specifies the optional pathname of a +# mailbox file relative to a user's home directory. The default +# mailbox file is /var/spool/mail/user or /var/mail/user. Specify +# "Maildir/" for qmail-style delivery (the / is required). +# +#home_mailbox = Mailbox +#home_mailbox = Maildir/ + +# The mail_spool_directory parameter specifies the directory where +# UNIX-style mailboxes are kept. The default setting depends on the +# system type. +# +#mail_spool_directory = /var/mail +#mail_spool_directory = /var/spool/mail + +# The mailbox_command parameter specifies the optional external +# command to use instead of mailbox delivery. The command is run as +# the recipient with proper HOME, SHELL and LOGNAME environment settings. +# Exception: delivery for root is done as $default_user. +# +# Other environment variables of interest: USER (recipient username), +# EXTENSION (address extension), DOMAIN (domain part of address), +# and LOCAL (the address localpart). +# +# Unlike other Postfix configuration parameters, the mailbox_command +# parameter is not subjected to $parameter substitutions. This is to +# make it easier to specify shell syntax (see example below). +# +# Avoid shell meta characters because they will force Postfix to run +# an expensive shell process. Procmail alone is expensive enough. +# +# IF YOU USE THIS TO DELIVER MAIL SYSTEM-WIDE, YOU MUST SET UP AN +# ALIAS THAT FORWARDS MAIL FOR ROOT TO A REAL USER. +# +#mailbox_command = /some/where/procmail +#mailbox_command = /some/where/procmail -a "$EXTENSION" + +# The mailbox_transport specifies the optional transport in master.cf +# to use after processing aliases and .forward files. This parameter +# has precedence over the mailbox_command, fallback_transport and +# luser_relay parameters. +# +# Specify a string of the form transport:nexthop, where transport is +# the name of a mail delivery transport defined in master.cf. The +# :nexthop part is optional. For more details see the sample transport +# configuration file. +# +# NOTE: if you use this feature for accounts not in the UNIX password +# file, then you must update the "local_recipient_maps" setting in +# the main.cf file, otherwise the SMTP server will reject mail for +# non-UNIX accounts with "User unknown in local recipient table". +# +#mailbox_transport = lmtp:unix:/file/name +mailbox_transport = lmtp:unix:/var/imap/socket/lmtp +#mailbox_transport = cyrus + +# The fallback_transport specifies the optional transport in master.cf +# to use for recipients that are not found in the UNIX passwd database. +# This parameter has precedence over the luser_relay parameter. +# +# Specify a string of the form transport:nexthop, where transport is +# the name of a mail delivery transport defined in master.cf. The +# :nexthop part is optional. For more details see the sample transport +# configuration file. +# +# NOTE: if you use this feature for accounts not in the UNIX password +# file, then you must update the "local_recipient_maps" setting in +# the main.cf file, otherwise the SMTP server will reject mail for +# non-UNIX accounts with "User unknown in local recipient table". +# +#fallback_transport = lmtp:unix:/file/name +#fallback_transport = cyrus +#fallback_transport = + +# The luser_relay parameter specifies an optional destination address +# for unknown recipients. By default, mail for unknown@$mydestination +# and unknown@[$inet_interfaces] is returned as undeliverable. +# +# The following expansions are done on luser_relay: $user (recipient +# username), $shell (recipient shell), $home (recipient home directory), +# $recipient (full recipient address), $extension (recipient address +# extension), $domain (recipient domain), $local (entire recipient +# localpart), $recipient_delimiter. Specify ${name?value} or +# ${name:value} to expand value only when $name does (does not) exist. +# +# luser_relay works only for the default Postfix local delivery agent. +# +# NOTE: if you use this feature for accounts not in the UNIX password +# file, then you must specify "local_recipient_maps =" (i.e. empty) in +# the main.cf file, otherwise the SMTP server will reject mail for +# non-UNIX accounts with "User unknown in local recipient table". +# +#luser_relay = $user@other.host +#luser_relay = $local@other.host +#luser_relay = admin+$local + +# JUNK MAIL CONTROLS +# +# The controls listed here are only a very small subset. See the file +# sample-smtpd.cf for an elaborate list of anti-UCE controls. + +# The header_checks parameter specifies an optional table with patterns +# that each logical message header is matched against, including +# headers that span multiple physical lines. +# +# By default, these patterns also apply to MIME headers and to the +# headers of attached messages. With older Postfix versions, MIME and +# attached message headers were treated as body text. +# +# For details, see the sample-filter.cf file. +# +#header_checks = regexp:/etc/postfix/header_checks + +# FAST ETRN SERVICE +# +# Postfix maintains per-destination logfiles with information about +# deferred mail, so that mail can be flushed quickly with the SMTP +# "ETRN domain.tld" command, or by executing "sendmail -qRdomain.tld". +# +# By default, Postfix maintains deferred mail logfile information +# only for destinations that Postfix is willing to relay to (as +# specified in the relay_domains parameter). For other destinations, +# Postfix attempts to deliver ALL queued mail after receiving the +# SMTP "ETRN domain.tld" command, or after execution of "sendmail +# -qRdomain.tld". This can be slow when a lot of mail is queued. +# +# The fast_flush_domains parameter controls what destinations are +# eligible for this "fast ETRN/sendmail -qR" service. +# +#fast_flush_domains = $relay_domains +#fast_flush_domains = + +# The disable_vrfy_command parameter allows you to disable the SMTP +# VRFY command. This stops some techniques used by spammers to harvest +# email addresses. +# +disable_vrfy_command = yes + +# SHOW SOFTWARE VERSION OR NOT +# +# The smtpd_banner parameter specifies the text that follows the 220 +# code in the SMTP server's greeting banner. Some people like to see +# the mail version advertised. By default, Postfix shows no version. +# +# You MUST specify $myhostname at the start of the text. That is an +# RFC requirement. Postfix itself does not care. +# +#smtpd_banner = $myhostname ESMTP $mail_name +#smtpd_banner = $myhostname ESMTP $mail_name ($mail_version) + +# PARALLEL DELIVERY TO THE SAME DESTINATION +# +# How many parallel deliveries to the same user or domain? With local +# delivery, it does not make sense to do massively parallel delivery +# to the same user, because mailbox updates must happen sequentially, +# and expensive pipelines in .forward files can cause disasters when +# too many are run at the same time. With SMTP deliveries, 10 +# simultaneous connections to the same domain could be sufficient to +# raise eyebrows. +# +# Each message delivery transport has its XXX_destination_concurrency_limit +# parameter. The default is $default_destination_concurrency_limit for +# most delivery transports. For the local delivery agent the default is 2. + +#local_destination_concurrency_limit = 2 +#default_destination_concurrency_limit = 20 + +# DEBUGGING CONTROL +# +# The debug_peer_level parameter specifies the increment in verbose +# logging level when an SMTP client or server host name or address +# matches a pattern in the debug_peer_list parameter. +# +debug_peer_level = 2 + +# The debug_peer_list parameter specifies an optional list of domain +# or network patterns, /file/name patterns or type:name tables. When +# an SMTP client or server host name or address matches a pattern, +# increase the verbose logging level by the amount specified in the +# debug_peer_level parameter. +# +#debug_peer_list = 127.0.0.1 +#debug_peer_list = some.domain + +# The debugger_command specifies the external command that is executed +# when a Postfix daemon program is run with the -D option. +# +# Use "command .. & sleep 5" so that the debugger can attach before +# the process marches on. If you use an X-based debugger, be sure to +# set up your XAUTHORITY environment variable before starting Postfix. +# +debugger_command = + PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin + xxgdb $daemon_directory/$process_name $process_id & sleep 5 + +# If you don't have X installed on the Postfix machine, try: +# debugger_command = +# PATH=/bin:/usr/bin:/usr/local/bin; export PATH; (echo cont; +# echo where) | gdb $daemon_directory/$process_name $process_id 2>&1 +# >$config_directory/$process_name.$process_id.log & sleep 5 + +# INSTALL-TIME CONFIGURATION INFORMATION +# +# The following parameters are used when installing a new Postfix version. +# +# sendmail_path: The full pathname of the Postfix sendmail command. +# This is the Sendmail-compatible mail posting interface. +# +sendmail_path = /usr/sbin/sendmail + +# newaliases_path: The full pathname of the Postfix newaliases command. +# This is the Sendmail-compatible command to build alias databases. +# +newaliases_path = /usr/bin/newaliases + +# mailq_path: The full pathname of the Postfix mailq command. This +# is the Sendmail-compatible mail queue listing command. +# +mailq_path = /usr/bin/mailq + +# setgid_group: The group for mail submission and queue management +# commands. This must be a group name with a numerical group ID that +# is not shared with other accounts, not even with the Postfix account. +# +setgid_group = postdrop + +# manpage_directory: The location of the Postfix on-line manual pages. +# +manpage_directory = /usr/share/man + +# sample_directory: The location of the Postfix sample configuration files. +# +sample_directory = /usr/share/doc/postfix-2.0.19/sample + +# readme_directory: The location of the Postfix README files. +# +readme_directory = /usr/share/doc/postfix-2.0.19/readme +default_destination_concurrency_limit = 2 +#alias_database = hash:/etc/mail/aliases +local_destination_concurrency_limit = 2 +alias_maps = hash:/etc/mail/aliases + +content_filter = smtp-amavis:[127.0.0.1]:10024 +queue_minfree = 100000000 +message_size_limit = 50000000 +mailbox_size_limit = 500000000 +smtpd_helo_required=yes +smtpd_helo_restrictions=permit_mynetworks, reject_invalid_hostname, reject_invalid_hostname +smtpd_sender_restrictions=permit_mynetworks, reject_unknown_sender_domain, reject_non_fqdn_sender + +virtual_maps = ldap:aliases, ldap:mailboxes + +aliases_server_host = 127.0.0.1 +aliases_search_base = dc=domain,dc=loc +aliases_query_filter = (&(|(mail=%s)(mailalternateaddress=%s))(objectclass=posixaccount)(deliveryMode=forwardonly)(accountstatus=active)) +aliases_bind_dn = cn=thepostfixadmin,dc=domain,dc=loc +aliases_bind_pw = thepassword +aliases_result_attribute = mailforwardingaddress +aliases_version = 3 + +mailboxes_server_host = 127.0.0.1 +mailboxes_search_base = dc=domain,dc=loc +mailboxes_query_filter = (&(|(mail=%s)(mailalternateaddress=%s))(objectclass=posixaccount)(accountstatus=active)) +mailboxes_bind_dn = cn=thepostfixadmin,dc=domain,dc=loc +mailboxes_bind_pw = thepassword +mailboxes_result_attribute = uid, mailforwardingaddress +mailboxes_version = 3 + + +#SMTPD mit SASL-Authentification verwenden +smtpd_sasl_auth_enable = yes + +#Zusatz-Optionen: Keine anonyme-Anmeldung verwenden +smtpd_sasl_security_options = noanonymous + +#Wieder ein Workaround fr ltere Clients und Outlook +broken_sasl_auth_clients = yes + +# ODER meine Netze und SASL erlauben +smtpd_recipient_restrictions = + permit_mynetworks, + permit_sasl_authenticated, + reject_rbl_client relays.ordb.org, + reject_rbl_client sbl-xbl.spamhaus.org, + reject_rbl_client opm.blitzed.org, + reject_rbl_client dnsbl.njabl.org, + reject_rbl_client blackholes.wirehub.net, + reject_rbl_client list.dsbl.org, + reject_rbl_client dnsbl.sorbs.net, + reject_unauth_destination, + reject_non_fqdn_sender, + reject_non_fqdn_recipient, + reject_unauth_pipelining, + reject_unknown_sender_domain, + reject_unknown_recipient_domain + +# reject_unknown_client +# reject_rbl_client proxies.relays.monkeys.com, + +# incoming SSL +smtpd_use_tls = yes +#smtpd_tls_auth_only = yes +smtpd_tls_key_file = /etc/ssl/private/smtp.linux-at-work.de/smtp.linux-at-work.de.key +smtpd_tls_cert_file = /etc/ssl/private/smtp.linux-at-work.de/smtp.linux-at-work.de.crt +smtpd_tls_CAfile = /etc/ssl/certs/ca-cert.pem +smtpd_tls_loglevel = 1 +smtpd_tls_received_header = yes +smtpd_tls_session_cache_timeout = 3600s +tls_random_source = dev:/dev/urandom + +#outgoing SSL +smtp_tls_key_file = /etc/ssl/private/smtp.linux-at-work.de/smtp.linux-at-work.de.key +smtp_tls_cert_file = /etc/ssl/private/smtp.linux-at-work.de/smtp.linux-at-work.de.crt +smtp_tls_CAfile = /etc/ssl/certs/ca-cert.pem +smtp_tls_CApath = /etc/ssl/certs +smtp_tls_loglevel = 2 +# The server and client negotiate a session, which takes some computer time +# and network bandwidth. The session is cached only in the smtpd process +# actually using this session and is lost when the process dies. +# To share the session information between the smtp processes, a disc based +# session cache can be used based on the SDBM databases (routines included +# in Postfix/TLS). Since concurrent writing must be supported, only SDBM +# can be used. +# +smtp_tls_session_cache_database = sdbm:/etc/postfix/smtp_scache + +# By default TLS is disabled, so no difference to plain postfix is visible. +# If you enable TLS it will be used when offered by the server. +# WARNING: I didn't have access to other software (except those explicitely +# listed) to test the interaction. On corresponding mailing list +# there was a discussion going on about MS exchange servers offering +# STARTTLS even if it is not configured, so it might be wise to not +# use this option on your central mail hub, as you don't know in advance +# whether you are going to hit such host. Use the recipient/site specific +# options instead. +# HINT: I have it switched on on my mailservers and did experience one +# single failure since client side TLS is implemented. (There was one +# misconfired MS Exchange server; I contacted ths admin.) Hence, I am happy +# with it running all the time, but I am interested in testing anyway. +# You have been warned, however :-) +# +# In case of failure, a "4xx" code is issued and the mail stays in the queue. +# +# Explicitely switch it on here, if you want it. +# +#smtp_use_tls = yes diff --git a/emailadmin/doc/qmailuser.schema b/emailadmin/doc/qmailuser.schema new file mode 100644 index 0000000000..336761e6af --- /dev/null +++ b/emailadmin/doc/qmailuser.schema @@ -0,0 +1,103 @@ +# +# qmail-ldap v3 directory schema +# +# The offical qmail-ldap OID assigned by IANA is 7914 +# +# Created by: David E. Storey +# +# Modified and included into qmail-ldap by Andre Oppermann +# +# Schema fixes by Mike Jackson +# +# +# This schema depends on: +# - core.schema +# - cosine.schema +# - nis.schema +# + +# +# Example from new format +# +# attributetype ( 1.3.6.1.1.1.1.0 NAME 'uidNumber' +# DESC 'An integer uniquely identifying a user in an administrative domain' +# EQUALITY integerMatch +# SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +# Attribute Type Definitions + +attributetype ( 1.3.6.1.4.1.7914.1.2.1.1 NAME 'qmailUID' + DESC 'UID of the user on the mailsystem' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7914.1.2.1.2 NAME 'qmailGID' + DESC 'GID of the user on the mailsystem' + EQUALITY integerMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7914.1.2.1.3 NAME 'mailMessageStore' + DESC 'Path to the maildir/mbox on the mail system' + EQUALITY caseExactIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7914.1.2.1.4 NAME 'mailAlternateAddress' + DESC 'Secondary (alias) mailaddresses for the same user' + EQUALITY caseIgnoreIA5Match + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} ) + +attributetype ( 1.3.6.1.4.1.7914.1.2.1.5 NAME 'mailQuota' + DESC 'The amount of space the user can use until all further messages get bounced.' + SYNTAX 1.3.6.1.4.1.1466.115.121.1.44 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7914.1.2.1.6 NAME 'mailHost' + DESC 'On which qmail server the messagestore of this user is located.' + EQUALITY caseIgnoreIA5Match + SUBSTR caseIgnoreIA5SubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} SINGLE-VALUE) + +attributetype ( 1.3.6.1.4.1.7914.1.2.1.7 NAME 'mailForwardingAddress' + DESC 'Address(es) to forward all incoming messages to.' + EQUALITY caseIgnoreIA5Match + SUBSTR caseIgnoreIA5SubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.26{256} ) + +attributetype ( 1.3.6.1.4.1.7914.1.2.1.8 NAME 'deliveryProgramPath' + DESC 'Program to execute for all incoming mails.' + SYNTAX 1.3.6.1.4.1.1466.115.121.1.44 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7914.1.2.1.9 NAME 'qmailDotMode' + DESC 'Interpretation of .qmail files: both, dotonly, ldaponly, ldapwithprog, none' + EQUALITY caseIgnoreMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.44 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7914.1.2.1.10 NAME 'deliveryMode' + DESC 'multi field entries of: normal, forwardonly, nombox, localdelivery, reply, echo' + EQUALITY caseIgnoreMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.44 ) + +attributetype ( 1.3.6.1.4.1.7914.1.2.1.11 NAME 'mailReplyText' + DESC 'A reply text for every incoming message' + SUBSTR caseIgnoreSubstringsMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{4096} SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7914.1.2.1.12 NAME 'accountStatus' + DESC 'The status of a user account: active, nopop, disabled, deleted' + EQUALITY caseIgnoreMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.44 SINGLE-VALUE ) + +attributetype ( 1.3.6.1.4.1.7914.1.2.1.14 NAME 'qmailAccountPurge' + DESC 'The earliest date when a mailMessageStore will be purged' + EQUALITY numericStringMatch + SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 SINGLE-VALUE ) + +# Object Class Definitions + +objectclass ( 1.3.6.1.4.1.7914.1.2.2.1 NAME 'qmailUser' + DESC 'QMail-LDAP User' SUP top AUXILIARY + MUST ( mail $ uid ) + MAY ( mailMessageStore $ homeDirectory $ userPassword $ + mailAlternateAddress $ qmailUID $ qmailGID $ mailQuota $ + mailHost $ mailForwardingAddress $ deliveryProgramPath $ + qmailDotMode $ deliveryMode $ mailReplyText $ + accountStatus $ qmailAccountPurge ) ) diff --git a/emailadmin/inc/class.ajaxemailadmin.inc.php b/emailadmin/inc/class.ajaxemailadmin.inc.php new file mode 100644 index 0000000000..5b479c03e5 --- /dev/null +++ b/emailadmin/inc/class.ajaxemailadmin.inc.php @@ -0,0 +1,46 @@ +bo = new emailadmin_bo(); + } + + function addACL($_accountName, $_aclData) + { + if(!empty($_accountName)) + { + $acl = implode('',(array)$_aclData['acl']); + $data = $this->bofelamimail->addACL($this->sessionDataAjax['folderName'], $_accountName, $acl); + #$response = new xajaxResponse(); + #$response->addScript("window.close();"); + #$response->addAssign("accountName", "value", $this->sessionDataAjax['folderName'].'-'.$_accountName.'-'.$acl); + #return $response->getXML(); + + } + } + + function updateACLView() + { + $folderACL = $this->bofelamimail->getIMAPACL($this->sessionDataAjax['folderName']); + + $response = new xajaxResponse(); + $response->addAssign("aclTable", "innerHTML", $this->createACLTable($folderACL)); + return $response->getXML(); + } + + } +?> diff --git a/emailadmin/inc/class.cyrusimap.inc.php b/emailadmin/inc/class.cyrusimap.inc.php new file mode 100644 index 0000000000..d59d85e47e --- /dev/null +++ b/emailadmin/inc/class.cyrusimap.inc.php @@ -0,0 +1,180 @@ +updateAccount($_hookValues); + } + + function deleteAccount($_hookValues) + { + if(!$this->enableCyrusAdmin) { + return false; + } + + if($this->_connected === true) { + $this->disconnect(); + } + + // we need a admin connection + if(!$this->openConnection(true)) { + return false; + } + + $username = $_hookValues['account_lid']; + + $mailboxName = $this->getUserMailboxString($username); + + // give the admin account the rights to delete this mailbox + if(PEAR::isError($this->setACL($mailboxName, $this->adminUsername, 'lrswipcda'))) { + $this->disconnect(); + return false; + } + + if(PEAR::isError($this->deleteMailbox($mailboxName))) { + $this->disconnect(); + return false; + } + + $this->disconnect(); + + return true; + } + + /** + * Create mailbox string from given mailbox-name and user-name + * @param string $_username + * @param string $_folderName='' + * @return string utf-7 encoded (done in getMailboxName) + */ + function getUserMailboxString($_username, $_folderName='') + { + $nameSpaces = $this->getNameSpaces(); + + if(!isset($nameSpaces['others'])) { + return false; + } + $_username = $this->getMailBoxUserName($_username); + $mailboxString = $nameSpaces['others'][0]['name'] . strtolower($_username) . (!empty($_folderName) ? $nameSpaces['others'][0]['delimiter'] . $_folderName : ''); + + if($this->loginType == 'vmailmgr' || $this->loginType == 'email') { + $mailboxString .= '@'.$this->domainName; + } + + return $mailboxString; + } + + function setUserData($_username, $_quota) + { + if(!$this->enableCyrusAdmin) { + return false; + } + + if($this->_connected === true) { + $this->disconnect(); + } + + // create a admin connection + if(!$this->openConnection(true)) { + return false; + } + + $mailboxName = $this->getUserMailboxString($_username); + + if((int)$_quota > 0) { + // enable quota + $quota_value = $this->setStorageQuota($mailboxName, (int)$_quota*1024); + } else { + // disable quota + $quota_value = $this->setStorageQuota($mailboxName, -1); + } + + $this->disconnect(); + + return true; + + } + + function updateAccount($_hookValues) + { + if(!$this->enableCyrusAdmin) { + return false; + } + #_debug_array($_hookValues); + $username = $_hookValues['account_lid']; + if(isset($_hookValues['new_passwd'])) { + $userPassword = $_hookValues['new_passwd']; + } + + if($this->_connected === true) { + $this->disconnect(); + } + + // we need a admin connection + if(!$this->openConnection(true)) { + return false; + } + + // create the mailbox, with the account_lid, as it is passed from the hook values (gets transformed there if needed) + $mailboxName = $this->getUserMailboxString($username, $mailboxName); + // make sure we use the correct username here. + $username = $this->getMailBoxUserName($username); + $folderInfo = $this->getMailboxes('', $mailboxName, true); + if(empty($folderInfo)) { + if(!PEAR::isError($this->createMailbox($mailboxName))) { + if(PEAR::isError($this->setACL($mailboxName, $username, "lrswipcda"))) { + # log error message + } + } + } + $this->disconnect(); + + # this part got moved to FeLaMiMail + #// we can only subscribe to the folders, if we have the users password + #if(isset($_hookValues['new_passwd'])) { + # // subscribe to the folders + # if($mbox = @imap_open($this->getMailboxString(), $username, $userPassword)) { + # foreach($this->createMailboxes as $mailboxName) { + # $mailboxName = 'INBOX' . ($mailboxName ? $this->getDelimiter() .$mailboxName : ''); + # imap_subscribe($mbox,$this->getMailboxString($mailboxName)); + # } + # imap_close($mbox); + # } else { + # # log error message + # } + #} + } + } +?> diff --git a/emailadmin/inc/class.dbmaildbmailuser.inc.php b/emailadmin/inc/class.dbmaildbmailuser.inc.php new file mode 100755 index 0000000000..68333d8c77 --- /dev/null +++ b/emailadmin/inc/class.dbmaildbmailuser.inc.php @@ -0,0 +1,180 @@ +updateAccount($_hookValues); + } + + #function deleteAccount($_hookValues) { + #} + function getUserData($_username) { + $userData = array(); + + $ds = $GLOBALS['egw']->ldap->ldapConnect( + $GLOBALS['egw_info']['server']['ldap_host'], + $GLOBALS['egw_info']['server']['ldap_root_dn'], + $GLOBALS['egw_info']['server']['ldap_root_pw'] + ); + + if(!is_resource($ds)) { + return false; + } + + $filter = '(&(objectclass=posixaccount)(uid='. $_username .')(dbmailGID='. sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])) .'))'; + $justthese = array('dn', 'objectclass', 'mailQuota'); + if($sri = ldap_search($ds, $GLOBALS['egw_info']['server']['ldap_context'], $filter, $justthese)) { + + if($info = ldap_get_entries($ds, $sri)) { + if(isset($info[0]['mailquota'][0])) { + $userData['quotaLimit'] = $info[0]['mailquota'][0] / 1048576; + } + } + } + return $userData; + } + + function updateAccount($_hookValues) { + if(!$uidnumber = (int)$_hookValues['account_id']) { + return false; + } + + $ds = $GLOBALS['egw']->ldap->ldapConnect( + $GLOBALS['egw_info']['server']['ldap_host'], + $GLOBALS['egw_info']['server']['ldap_root_dn'], + $GLOBALS['egw_info']['server']['ldap_root_pw'] + ); + + if(!is_resource($ds)) { + return false; + } + + $filter = '(&(objectclass=posixaccount)(uidnumber='. $uidnumber .'))'; + $justthese = array('dn', 'objectclass', 'dbmailUID', 'dbmailGID', 'mail'); + $sri = ldap_search($ds, $GLOBALS['egw_info']['server']['ldap_context'], $filter, $justthese); + + if($info = ldap_get_entries($ds, $sri)) { + if((!in_array('dbmailuser',$info[0]['objectclass']) && !in_array('dbmailUser',$info[0]['objectclass'])) && $info[0]['mail']) { + $newData['objectclass'] = $info[0]['objectclass']; + unset($newData['objectclass']['count']); + $newData['objectclass'][] = 'dbmailuser'; + sort($newData['objectclass']); + $newData['dbmailGID'] = sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])); + $newData['dbmailUID'] = (!empty($this->domainName)) ? $_hookValues['account_lid'] .'@'. $this->domainName : $_hookValues['account_lid']; + + if(!ldap_modify($ds, $info[0]['dn'], $newData)) { + #print ldap_error($ds); + } + + return true; + } else { + $newData = array(); + $newData['dbmailUID'] = (!empty($this->domainName)) ? $_hookValues['account_lid'] .'@'. $this->domainName : $_hookValues['account_lid']; + $newData['dbmailGID'] = sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])); + + if(!ldap_modify($ds, $info[0]['dn'], $newData)) { + print ldap_error($ds); + _debug_array($newData); + exit; + #return false; + } + } + } + + return false; + } + + function setUserData($_username, $_quota) { + $ds = $GLOBALS['egw']->ldap->ldapConnect( + $GLOBALS['egw_info']['server']['ldap_host'], + $GLOBALS['egw_info']['server']['ldap_root_dn'], + $GLOBALS['egw_info']['server']['ldap_root_pw'] + ); + + if(!is_resource($ds)) { + return false; + } + + $filter = '(&(objectclass=posixaccount)(uid='. $_username .'))'; + $justthese = array('dn', 'objectclass', 'dbmailGID', 'dbmailUID', 'mail'); + $sri = ldap_search($ds, $GLOBALS['egw_info']['server']['ldap_context'], $filter, $justthese); + + if($info = ldap_get_entries($ds, $sri)) { + $validLDAPConfig = false; + if(in_array('dbmailuser',$info[0]['objectclass']) || in_array('dbmailUser',$info[0]['objectclass'])) { + $validLDAPConfig = true; + } + + if(!in_array('dbmailuser',$info[0]['objectclass']) && !in_array('dbmailUser',$info[0]['objectclass']) && $info[0]['mail']) { + $newData['objectclass'] = $info[0]['objectclass']; + unset($newData['objectclass']['count']); + $newData['objectclass'][] = 'dbmailUser'; + sort($newData['objectclass']); + $newData['dbmailGID'] = sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])); + $newData['dbmailUID'] = (!empty($this->domainName)) ? $_username .'@'. $this->domainName : $_username; + + if(ldap_modify($ds, $info[0]['dn'], $newData)) { + $validLDAPConfig = true; + } + } else { + if ((in_array('dbmailuser',$info[0]['objectclass']) || in_array('dbmailUser',$info[0]['objectclass'])) && !$info[0]['dbmailuid']) { + $newData = array(); + $newData['dbmailUID'] = (!empty($this->domainName)) ? $_username .'@'. $this->domainName : $_username; + + if(!ldap_modify($ds, $info[0]['dn'], $newData)) { + #print ldap_error($ds); + #return false; + } + } + + if ((in_array('dbmailuser',$info[0]['objectclass']) || in_array('dbmailUser',$info[0]['objectclass'])) && !$info[0]['dbmailgid']) { + $newData = array(); + $newData['dbmailGID'] = sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])); + + if(!ldap_modify($ds, $info[0]['dn'], $newData)) { + #print ldap_error($ds); + #return false; + } + } + } + + if($validLDAPConfig) { + $newData = array(); + + if((int)$_quota >= 0) { + $newData['mailQuota'] = (int)$_quota * 1048576; + } else { + $newData['mailQuota'] = array(); + } + + if(!ldap_modify($ds, $info[0]['dn'], $newData)) { + #print ldap_error($ds); + return false; + } + } + return true; + } + + return false; + } + + } +?> diff --git a/emailadmin/inc/class.dbmailqmailuser.inc.php b/emailadmin/inc/class.dbmailqmailuser.inc.php new file mode 100644 index 0000000000..e2150ad13d --- /dev/null +++ b/emailadmin/inc/class.dbmailqmailuser.inc.php @@ -0,0 +1,158 @@ +updateAccount($_hookValues); + } + + #function deleteAccount($_hookValues) { + #} + function getUserData($_username) { + $userData = array(); + + $ds = $GLOBALS['egw']->ldap->ldapConnect( + $GLOBALS['egw_info']['server']['ldap_host'], + $GLOBALS['egw_info']['server']['ldap_root_dn'], + $GLOBALS['egw_info']['server']['ldap_root_pw'] + ); + + if(!is_resource($ds)) { + return false; + } + + $filter = '(&(objectclass=posixaccount)(uid='. $_username .')(qmailGID='. sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])) .'))'; + $justthese = array('dn', 'objectclass', 'mailQuota'); + if($sri = ldap_search($ds, $GLOBALS['egw_info']['server']['ldap_context'], $filter, $justthese)) { + + if($info = ldap_get_entries($ds, $sri)) { + if(isset($info[0]['mailquota'][0])) { + $userData['quotaLimit'] = $info[0]['mailquota'][0] / 1048576; + } + } + } + return $userData; + } + + function updateAccount($_hookValues) { + if(!$uidnumber = (int)$_hookValues['account_id']) { + return false; + } + + $ds = $GLOBALS['egw']->ldap->ldapConnect( + $GLOBALS['egw_info']['server']['ldap_host'], + $GLOBALS['egw_info']['server']['ldap_root_dn'], + $GLOBALS['egw_info']['server']['ldap_root_pw'] + ); + + if(!is_resource($ds)) { + return false; + } + + $filter = '(&(objectclass=posixaccount)(uidnumber='. $uidnumber .'))'; + $justthese = array('dn', 'objectclass', 'qmailUID', 'qmailGID', 'mail'); + $sri = ldap_search($ds, $GLOBALS['egw_info']['server']['ldap_context'], $filter, $justthese); + + if($info = ldap_get_entries($ds, $sri)) { + if(!in_array('qmailuser',$info[0]['objectclass']) && $info[0]['email']) { + $newData['objectclass'] = $info[0]['objectclass']; + unset($newData['objectclass']['count']); + $newData['objectclass'][] = 'qmailuser'; + sort($newData['objectclass']); + $newData['qmailGID'] = sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])); + #$newData['qmailUID'] = (!empty($this->domainName)) ? $_username .'@'. $this->domainName : $_username; + + ldap_modify($ds, $info[0]['dn'], $newData); + + return true; + } else { + $newData = array(); + $newData['qmailGID'] = sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])); + #$newData['qmailUID'] = (!empty($this->domainName)) ? $_username .'@'. $this->domainName : $_username; + + if(!ldap_modify($ds, $info[0]['dn'], $newData)) { + #print ldap_error($ds); + #return false; + } + } + } + + return false; + } + + function setUserData($_username, $_quota) { + $ds = $GLOBALS['egw']->ldap->ldapConnect( + $GLOBALS['egw_info']['server']['ldap_host'], + $GLOBALS['egw_info']['server']['ldap_root_dn'], + $GLOBALS['egw_info']['server']['ldap_root_pw'] + ); + + if(!is_resource($ds)) { + return false; + } + + $filter = '(&(objectclass=posixaccount)(uid='. $_username .'))'; + $justthese = array('dn', 'objectclass', 'qmailGID', 'mail'); + $sri = ldap_search($ds, $GLOBALS['egw_info']['server']['ldap_context'], $filter, $justthese); + + if($info = ldap_get_entries($ds, $sri)) { + #_debug_array($info); + if(!in_array('qmailuser',$info[0]['objectclass']) && $info[0]['email']) { + $newData['objectclass'] = $info[0]['objectclass']; + unset($newData['objectclass']['count']); + $newData['objectclass'][] = 'qmailuser'; + sort($newData['objectclass']); + $newData['qmailGID'] = sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])); + + ldap_modify($ds, $info[0]['dn'], $newData); + } else { + if (in_array('qmailuser',$info[0]['objectclass']) && !$info[0]['qmailgid']) { + $newData = array(); + $newData['qmailGID'] = sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])); + + if(!ldap_modify($ds, $info[0]['dn'], $newData)) { + #print ldap_error($ds); + #return false; + } + } + } + + $newData = array(); + + if((int)$_quota >= 0) { + $newData['mailQuota'] = (int)$_quota * 1048576; + } else { + $newData['mailQuota'] = array(); + } + + if(!ldap_modify($ds, $info[0]['dn'], $newData)) { + #print ldap_error($ds); + return false; + } + + return true; + } + + return false; + } + + } +?> diff --git a/emailadmin/inc/class.defaultimap.inc.php b/emailadmin/inc/class.defaultimap.inc.php new file mode 100644 index 0000000000..89e59f917e --- /dev/null +++ b/emailadmin/inc/class.defaultimap.inc.php @@ -0,0 +1,559 @@ +mbAvailable = TRUE; + } + + $this->restoreSessionData(); + + // construtor for Net_IMAP stuff + $this->Net_IMAPProtocol(); + } + + /** + * Magic method to re-connect with the imapserver, if the object get's restored from the session + */ + function __wakeup() + { + #$this->openConnection($this->isAdminConnection); // we need to re-connect + } + + /** + * adds a account on the imap server + * + * @param array $_hookValues + * @return bool true on success, false on failure + */ + function addAccount($_hookValues) + { + return true; + } + + /** + * updates a account on the imap server + * + * @param array $_hookValues + * @return bool true on success, false on failure + */ + function updateAccount($_hookValues) + { + return true; + } + + /** + * deletes a account on the imap server + * + * @param array $_hookValues + * @return bool true on success, false on failure + */ + function deleteAccount($_hookValues) + { + return true; + } + + function disconnect() + { + //error_log(__METHOD__.function_backtrace()); + $retval = parent::disconnect(); + if( PEAR::isError($retval)) error_log(__METHOD__.$retval->message); + $this->_connected = false; + } + + /** + * converts a foldername from current system charset to UTF7 + * + * @param string $_folderName + * @return string the encoded foldername + */ + function encodeFolderName($_folderName) + { + if($this->mbAvailable) { + return mb_convert_encoding($_folderName, "UTF7-IMAP", $GLOBALS['egw']->translation->charset()); + } + + // if not + // we can encode only from ISO 8859-1 + return imap_utf7_encode($_folderName); + } + + /** + * returns the supported capabilities of the imap server + * return false if the imap server does not support capabilities + * + * @return array the supported capabilites + */ + function getCapabilities() + { + if(!is_array($this->sessionData['capabilities'][$this->host])) { + return false; + } + + return $this->sessionData['capabilities'][$this->host]; + } + + /** + * return the delimiter used by the current imap server + * + * @return string the delimimiter + */ + function getDelimiter() + { + return isset($this->sessionData['delimiter'][$this->host]) ? $this->sessionData['delimiter'][$this->host] : $this->mailboxDelimiter; + } + + /** + * Create transport string + * + * @return string the transportstring + */ + function _getTransportString() + { + if($this->encryption == 2) { + $connectionString = "tls://". $this->host; + } elseif($this->encryption == 3) { + $connectionString = "ssl://". $this->host; + } else { + // no tls + $connectionString = $this->host; + } + + return $connectionString; + } + + /** + * Create the options array for SSL/TLS connections + * + * @return string the transportstring + */ + function _getTransportOptions() + { + if($this->validatecert === false) { + if($this->encryption == 2) { + return array( + 'tls' => array( + 'verify_peer' => false, + 'allow_self_signed' => true, + ) + ); + } elseif($this->encryption == 3) { + return array( + 'ssl' => array( + 'verify_peer' => false, + 'allow_self_signed' => true, + ) + ); + } + } else { + if($this->encryption == 2) { + return array( + 'tls' => array( + 'verify_peer' => true, + 'allow_self_signed' => false, + ) + ); + } elseif($this->encryption == 3) { + return array( + 'ssl' => array( + 'verify_peer' => true, + 'allow_self_signed' => false, + ) + ); + } + } + + return null; + } + + /** + * get the effective Username for the Mailbox, as it is depending on the loginType + * @param string $_username + * @return string the effective username to be used to access the Mailbox + */ + function getMailBoxUserName($_username) + { + if ($this->loginType == 'email') + { + $_username = $_username; + $accountID = $GLOBALS['egw']->accounts->name2id($_username); + $accountemail = $GLOBALS['egw']->accounts->id2name($accountID,'account_email'); + //$accountemail = $GLOBALS['egw']->accounts->read($GLOBALS['egw']->accounts->name2id($_username,'account_email')); + if (!empty($accountemail)) + { + list($lusername,$domain) = explode('@',$accountemail,2); + if (strtolower($domain) == strtolower($this->domainName) && !empty($lusername)) + { + $_username = $lusername; + } + } + } + return $_username; + } + + /** + * Create mailbox string from given mailbox-name and user-name + * + * @param string $_folderName='' + * @return string utf-7 encoded (done in getMailboxName) + */ + function getUserMailboxString($_username, $_folderName='') + { + $nameSpaces = $this->getNameSpaces(); + + if(!isset($nameSpaces['others'])) { + return false; + } + + $_username = $this->getMailBoxUserName($_username); + if($this->loginType == 'vmailmgr' || $this->loginType == 'email') { + $_username .= '@'. $this->domainName; + } + + $mailboxString = $nameSpaces['others'][0]['name'] . $_username . (!empty($_folderName) ? $nameSpaces['others'][0]['delimiter'] . $_folderName : ''); + + return $mailboxString; + } + /** + * get list of namespaces + * + * @return array array containing information about namespace + */ + function getNameSpaces() + { + if(!$this->_connected) { + return false; + } + $retrieveDefault = false; + if($this->hasCapability('NAMESPACE')) { + $nameSpace = $this->getNamespace(); + if( PEAR::isError($nameSpace)) { + if ($this->debug) error_log("emailadmin::defaultimap->getNameSpaces:".print_r($nameSpace,true)); + $retrieveDefault = true; + } else { + $result = array(); + + $result['personal'] = $nameSpace['personal']; + + if(is_array($nameSpace['others'])) { + $result['others'] = $nameSpace['others']; + } + + if(is_array($nameSpace['shared'])) { + $result['shared'] = $nameSpace['shared']; + } + } + } + if (!$this->hasCapability('NAMESPACE') || $retrieveDefault) { + $delimiter = $this->getHierarchyDelimiter(); + if( PEAR::isError($delimiter)) $delimiter = '/'; + + $result['personal'] = array( + 0 => array( + 'name' => '', + 'delimiter' => $delimiter + ) + ); + } + + return $result; + } + + /** + * returns the quota for given foldername + * gets quota for the current user only + * + * @param string $_folderName + * @return string the current quota for this folder + */ + # function getQuota($_folderName) + # { + # if(!is_resource($this->mbox)) { + # $this->openConnection(); + # } + # + # if(function_exists('imap_get_quotaroot') && $this->supportsCapability('QUOTA')) { + # $quota = @imap_get_quotaroot($this->mbox, $this->encodeFolderName($_folderName)); + # if(is_array($quota) && isset($quota['STORAGE'])) { + # return $quota['STORAGE']; + # } + # } + # + # return false; + # } + + /** + * return the quota for another user + * used by admin connections only + * + * @param string $_username + * @return string the quota for specified user + */ + function getQuotaByUser($_username) + { + $mailboxName = $this->getUserMailboxString($_username); + //error_log(__METHOD__.$mailboxName); + $storageQuota = $this->getStorageQuota($mailboxName); + //error_log(__METHOD__.$_username); + //error_log(__METHOD__.$mailboxName); + if ( PEAR::isError($storageQuota)) error_log(__METHOD__.$storageQuota->message); + if(is_array($storageQuota) && isset($storageQuota['QMAX'])) { + return (int)$storageQuota['QMAX']; + } + + return false; + } + + /** + * returns information about a user + * currently only supported information is the current quota + * + * @param string $_username + * @return array userdata + */ + function getUserData($_username) + { + if($this->_connected === true) { + //error_log(__METHOD__."try to disconnect"); + $this->disconnect(); + } + + $this->openConnection(true); + $userData = array(); + + if($quota = $this->getQuotaByUser($_username)) { + $userData['quotaLimit'] = $quota / 1024; + } + + $this->disconnect(); + + return $userData; + } + + /** + * opens a connection to a imap server + * + * @param bool $_adminConnection create admin connection if true + * + * @return resource the imap connection + */ + function openConnection($_adminConnection=false) + { + //error_log(__METHOD__.function_backtrace()); + unset($this->_connectionErrorObject); + + if($_adminConnection) { + $username = $this->adminUsername; + $password = $this->adminPassword; + $options = ''; + $this->isAdminConnection = true; + } else { + $username = $this->loginName; + $password = $this->password; + $options = $_options; + $this->isAdminConnection = false; + } + + $this->setStreamContextOptions($this->_getTransportOptions()); + $this->setTimeout(20); + if( PEAR::isError($status = parent::connect($this->_getTransportString(), $this->port, $this->encryption == 1)) ) { + error_log(__METHOD__."Could not connect with ".$this->_getTransportString()." on Port ".$this->port." Encryption==1?".$this->encryption); + error_log(__METHOD__."Status connect:".$status->message); + $this->_connectionErrorObject = $status; + return false; + } + if(empty($username)) + { + error_log(__METHOD__."No username supplied.".function_backtrace()); + return false; + } + if( PEAR::isError($status = parent::login($username, $password, TRUE, !$this->isAdminConnection)) ) { + error_log(__METHOD__."Could not log in with ->".$username.":".$password."<-"); + error_log(__METHOD__."Status login:".array2string($status->message)); + //error_log(__METHOD__.'Called from:'.function_backtrace()); + $this->disconnect(); + $this->_connectionErrorObject = $status; + return false; + } + + return true; + } + + /** + * restore session variable + * + */ + function restoreSessionData() + { + $this->sessionData = $GLOBALS['egw']->session->appsession('imap_session_data'); + } + + /** + * save session variable + * + */ + function saveSessionData() + { + $GLOBALS['egw']->session->appsession('imap_session_data','',$this->sessionData); + } + + /** + * set userdata + * + * @param string $_username username of the user + * @param int $_quota quota in bytes + * @return bool true on success, false on failure + */ + function setUserData($_username, $_quota) + { + return true; + } + + /** + * check if imap server supports given capability + * + * @param string $_capability the capability to check for + * @return bool true if capability is supported, false if not + */ + function supportsCapability($_capability) + { + return $this->hasCapability($_capability); + } + } +?> diff --git a/emailadmin/inc/class.defaultpop.inc.php b/emailadmin/inc/class.defaultpop.inc.php new file mode 100644 index 0000000000..ea623b3db4 --- /dev/null +++ b/emailadmin/inc/class.defaultpop.inc.php @@ -0,0 +1,94 @@ +profileData = $_profileData; + } + + function addAccount($_hookValues) + { + return true; + } + + function deleteAccount($_hookValues) + { + return true; + } + + function encodeFolderName($_folderName) + { + if($this->mbAvailable) + { + return mb_convert_encoding( $_folderName, "UTF7-IMAP", "ISO_8859-1" ); + } + + // if not + return imap_utf7_encode($_folderName); + } + + function getMailboxString($_folderName='') + { + if($this->profileData['imapTLSEncryption'] == 'yes' && + $this->profileData['imapTLSAuthentication'] == 'yes') + { + if(empty($this->profileData['imapPort'])) + $port = '995'; + else + $port = $this->profileData['imapPort']; + + $mailboxString = sprintf("{%s:%s/pop3/ssl}%s", + $this->profileData['imapServer'], + $port, + $_folderName); + } + // don't check cert + elseif($this->profileData['imapTLSEncryption'] == 'yes') + { + if(empty($this->profileData['imapPort'])) + $port = '995'; + else + $port = $this->profileData['imapPort']; + + $mailboxString = sprintf("{%s:%s/pop3/ssl/novalidate-cert}%s", + $this->profileData['imapServer'], + $port, + $_folderName); + } + // no tls + else + { + if(empty($this->profileData['imapPort'])) + $port = '110'; + else + $port = $this->profileData['imapPort']; + + $mailboxString = sprintf("{%s:%s/pop3}%s", + $this->profileData['imapServer'], + $port, + $_folderName); + } + + return $this->encodeFolderName($mailboxString); + } + + function updateAccount($_hookValues) + { + return true; + } + } +?> diff --git a/emailadmin/inc/class.defaultsmtp.inc.php b/emailadmin/inc/class.defaultsmtp.inc.php new file mode 100644 index 0000000000..11973d0270 --- /dev/null +++ b/emailadmin/inc/class.defaultsmtp.inc.php @@ -0,0 +1,85 @@ +defaultDomain = $defaultDomain ? $defaultDomain : $GLOBALS['egw_info']['server']['mail_suffix']; + } + + // add a account + function addAccount($_hookValues) + { + return true; + } + + // delete a account + function deleteAccount($_hookValues) + { + return true; + } + + function getAccountEmailAddress($_accountName) + { + $accountID = $GLOBALS['egw']->accounts->name2id($_accountName); + $emailAddress = $GLOBALS['egw']->accounts->id2name($accountID,'account_email'); + if(empty($emailAddress)) + $emailAddress = $_accountName.'@'.$this->defaultDomain; + + $realName = trim($GLOBALS['egw_info']['user']['firstname'] . (!empty($GLOBALS['egw_info']['user']['firstname']) ? ' ' : '') . $GLOBALS['egw_info']['user']['lastname']); + + return array( + array( + 'name' => $realName, + 'address' => $emailAddress, + 'type' => 'default' + ) + ); + } + + function getUserData($_uidnumber) { + $userData = array(); + + return $userData; + } + + function saveSMTPForwarding($_accountID, $_forwardingAddress, $_keepLocalCopy) { + return true; + } + + function setUserData($_uidnumber, $_mailAlternateAddress, $_mailForwardingAddress, $_deliveryMode) { + return true; + } + + // update a account + function updateAccount($_hookValues) { + return true; + } + } +?> diff --git a/emailadmin/inc/class.ea_identity.inc.php b/emailadmin/inc/class.ea_identity.inc.php new file mode 100644 index 0000000000..aa8d19b7ec --- /dev/null +++ b/emailadmin/inc/class.ea_identity.inc.php @@ -0,0 +1,27 @@ + \ No newline at end of file diff --git a/emailadmin/inc/class.ea_preferences.inc.php b/emailadmin/inc/class.ea_preferences.inc.php new file mode 100644 index 0000000000..84786ab514 --- /dev/null +++ b/emailadmin/inc/class.ea_preferences.inc.php @@ -0,0 +1,153 @@ +identities[$_id]; + } + else + { + return $this->identities; + } + } + + function getIncomingServer($_id = -1) + { + if($_id != -1) + { + return $this->ic_server[$_id]; + } + else + { + return $this->ic_server; + } + } + + function getOutgoingServer($_id = -1) + { + if($_id != -1) + { + return $this->og_server[$_id]; + } + else + { + return $this->og_server; + } + } + + function getPreferences() { + return $this->preferences; + } + + function getUserEMailAddresses() { + $identities = $this->getIdentity(); + + if(count($identities) == 0) { + return false; + } + + $userEMailAdresses = array(); + + foreach($identities as $identity) { + $userEMailAdresses[$identity->emailAddress] = $identity->realName; + } + + return $userEMailAdresses; + } + + function setIdentity($_identityObject, $_id = -1) + { + if(is_a($_identityObject, 'ea_identity')) + { + if($_id != -1) + { + $this->identities[$_id] = $_identityObject; + } + else + { + $this->identities[] = $_identityObject; + } + + return true; + } + + return false; + } + + function setIncomingServer($_serverObject, $_id = -1) + { + if(is_a($_serverObject, 'defaultimap')) + { + if($_id != -1) + { + $this->ic_server[$_id] = $_serverObject; + } + else + { + $this->ic_server[] = $_serverObject; + } + + return true; + } + + return false; + } + + function setOutgoingServer($_serverObject, $_id = -1) + { + if(is_a($_serverObject, 'defaultsmtp')) + { + if($_id != -1) + { + $this->og_server[$_id] = $_serverObject; + } + else + { + $this->og_server[] = $_serverObject; + } + + return true; + } + + return false; + } + + function setPreferences($_preferences) + { + $this->preferences = $_preferences; + + return true; + } + } +?> \ No newline at end of file diff --git a/emailadmin/inc/class.emailadmin_bo.inc.php b/emailadmin/inc/class.emailadmin_bo.inc.php new file mode 100644 index 0000000000..426189329b --- /dev/null +++ b/emailadmin/inc/class.emailadmin_bo.inc.php @@ -0,0 +1,855 @@ + array( + 'fieldNames' => array( + 'smtpServer', + 'smtpPort', + 'smtpAuth', + 'ea_smtp_auth_username', + 'ea_smtp_auth_password', + 'smtpType' + ), + 'description' => 'standard SMTP-Server', + 'smtpcapabilities' => 'default', + 'classname' => 'defaultsmtp' + ), + 'postfixldap' => array( + 'fieldNames' => array( + 'smtpServer', + 'smtpPort', + 'smtpAuth', + 'ea_smtp_auth_username', + 'ea_smtp_auth_password', + 'smtpType', + 'editforwardingaddress', + 'smtpLDAPServer', + 'smtpLDAPAdminDN', + 'smtpLDAPAdminPW', + 'smtpLDAPBaseDN', + 'smtpLDAPUseDefault' + ), + 'description' => 'Postfix (qmail Schema)', + 'smtpcapabilities' => 'default|forward', + 'classname' => 'postfixldap' + ), + 'postfixinetorgperson' => array( + 'fieldNames' => array( + 'smtpServer', + 'smtpPort', + 'smtpAuth', + 'ea_smtp_auth_username', + 'ea_smtp_auth_password', + 'smtpType', + ), + 'description' => 'Postfix (inetOrgPerson Schema)', + 'smtpcapabilities' => 'default', + 'classname' => 'postfixinetorgperson' + ), + 'smtpplesk' => array( + 'fieldNames' => array( + 'smtpServer', + 'smtpPort', + 'smtpAuth', + 'ea_smtp_auth_username', + 'ea_smtp_auth_password', + 'smtpType', + 'editforwardingaddress', + ), + 'description' => 'Plesk SMTP-Server (Qmail)', + 'smtpcapabilities' => 'default|forward', + 'classname' => 'smtpplesk' + ), + 'postfixdbmailuser' => array( + 'fieldNames' => array( + 'smtpServer', + 'smtpPort', + 'smtpAuth', + 'ea_smtp_auth_username', + 'ea_smtp_auth_password', + 'smtpType', + 'editforwardingaddress', + 'smtpLDAPServer', + 'smtpLDAPAdminDN', + 'smtpLDAPAdminPW', + 'smtpLDAPBaseDN', + 'smtpLDAPUseDefault' + ), + 'description' => 'Postfix (dbmail Schema)', + 'smtpcapabilities' => 'default|forward', + 'classname' => 'postfixdbmailuser' + ), + ); + //var $IMAPServerType = array(); // holds a list of config options + static $IMAPServerType = array( + 'defaultimap' => array( + 'fieldNames' => array( + 'imapServer', + 'imapPort', + 'imapType', + 'imapLoginType', + 'imapTLSEncryption', + 'imapTLSAuthentication', + 'imapAuthUsername', + 'imapAuthPassword' + ), + 'description' => 'standard IMAP server', + 'protocol' => 'imap', + 'imapcapabilities' => 'default', + 'classname' => 'defaultimap' + ), + 'cyrusimap' => array( + 'fieldNames' => array( + 'imapServer', + 'imapPort', + 'imapType', + 'imapLoginType', + 'imapTLSEncryption', + 'imapTLSAuthentication', + 'imapEnableCyrusAdmin', + 'imapAdminUsername', + 'imapAdminPW', + 'imapEnableSieve', + 'imapSieveServer', + 'imapSievePort', + 'imapAuthUsername', + 'imapAuthPassword' + ), + 'description' => 'Cyrus IMAP Server', + 'protocol' => 'imap', + 'imapcapabilities' => 'default|sieve|admin|logintypeemail', + 'classname' => 'cyrusimap' + ), + 'dbmailqmailuser' => array( + 'fieldNames' => array( + 'imapServer', + 'imapPort', + 'imapType', + 'imapLoginType', + 'imapTLSEncryption', + 'imapTLSAuthentication', + 'imapEnableSieve', + 'imapSieveServer', + 'imapSievePort', + 'imapAuthUsername', + 'imapAuthPassword', + ), + 'description' => 'DBMail (qmailUser schema)', + 'protocol' => 'imap', + 'imapcapabilities' => 'default|sieve', + 'classname' => 'dbmailqmailuser' + ), + 'pleskimap' => array( + 'fieldNames' => array( + 'imapServer', + 'imapPort', + 'imapType', + 'imapLoginType', + 'imapTLSEncryption', + 'imapTLSAuthentication', + 'imapAuthUsername', + 'imapAuthPassword' + ), + 'description' => 'Plesk IMAP Server (Courier)', + 'protocol' => 'imap', + 'imapcapabilities' => 'default', + 'classname' => 'pleskimap' + ), + 'dbmaildbmailuser' => array( + 'fieldNames' => array( + 'imapServer', + 'imapPort', + 'imapType', + 'imapLoginType', + 'imapTLSEncryption', + 'imapTLSAuthentication', + 'imapEnableSieve', + 'imapSieveServer', + 'imapSievePort', + 'imapAuthUsername', + 'imapAuthPassword' + ), + 'description' => 'DBMail (dbmailUser schema)', + 'protocol' => 'imap', + 'imapcapabilities' => 'default|sieve', + 'classname' => 'dbmaildbmailuser' + ), + ); + + var $imapClass; // holds the imap/pop3 class + var $smtpClass; // holds the smtp class + + + function __construct($_profileID=-1,$_restoreSesssion=true) + { + + parent::__construct(self::APP,self::TABLE,null,'',true); + + if (!is_object($GLOBALS['emailadmin_bo'])) + { + $GLOBALS['emailadmin_bo'] = $this; + } + $this->soemailadmin = new emailadmin_so(); + //translate the standard entry description + self::$SMTPServerType['defaultsmtp']['description'] = lang('standard SMTP-Server'); + self::$IMAPServerType['defaultimap']['description'] = lang('standard IMAP Server'); + if ($_restoreSesssion) // && !(is_array(self::$sessionData) && (count(self::$sessionData)>0)) ) + { + $this->restoreSessionData(); + } + if ($_restoreSesssion===false) // && (is_array(self::$sessionData) && (count(self::$sessionData)>0)) ) + { + // make sure session data will be created new + self::$sessionData = array(); + self::saveSessionData(); + } + #_debug_array(self::$sessionData); + if($_profileID >= 0) + { + $this->profileID = $_profileID; + + $this->profileData = $this->getProfile($_profileID); + + // try autoloading class, if that fails include it from emailadmin + if (!class_exists($class = self::$IMAPServerType[$this->profileData['imapType']]['classname'])) + { + include_once(EGW_INCLUDE_ROOT.'/emailadmin/inc/class.'.$class.'.inc.php'); + } + $this->imapClass = new $class; + + if (!class_exists($class = self::$SMTPServerType[$this->profileData['smtpType']]['classname'])) + { + include_once(EGW_INCLUDE_ROOT.'/emailadmin/inc/class.'.$class.'.inc.php'); + } + $this->smtpClass = new $class; + } + } + + function addAccount($_hookValues) + { + if (is_object($this->imapClass)) + { + #ExecMethod("emailadmin.".$this->imapClass.".addAccount",$_hookValues,3,$this->profileData); + $this->imapClass->addAccount($_hookValues); + } + + if (is_object($this->smtpClass)) + { + #ExecMethod("emailadmin.".$this->smtpClass.".addAccount",$_hookValues,3,$this->profileData); + $this->smtpClass->addAccount($_hookValues); + } + self::$sessionData =array(); + $this->saveSessionData(); + } + + function deleteAccount($_hookValues) + { + if (is_object($this->imapClass)) + { + #ExecMethod("emailadmin.".$this->imapClass.".deleteAccount",$_hookValues,3,$this->profileData); + $this->imapClass->deleteAccount($_hookValues); + } + + if (is_object($this->smtpClass)) + { + #ExecMethod("emailadmin.".$this->smtpClass.".deleteAccount",$_hookValues,3,$this->profileData); + $this->smtpClass->deleteAccount($_hookValues); + } + self::$sessionData = array(); + $this->saveSessionData(); + } + + function getAccountEmailAddress($_accountName, $_profileID) + { + $profileData = $this->getProfile($_profileID); + + #$smtpClass = self::$SMTPServerType[$profileData['smtpType']]['classname']; + $smtpClass = CreateObject('emailadmin.'.self::$SMTPServerType[$profileData['smtpType']]['classname']); + + #return empty($smtpClass) ? False : ExecMethod("emailadmin.$smtpClass.getAccountEmailAddress",$_accountName,3,$profileData); + return is_object($smtpClass) ? $smtpClass->getAccountEmailAddress($_accountName) : False; + } + + function getFieldNames($_serverTypeID, $_class) + { + switch($_class) + { + case 'imap': + return self::$IMAPServerType[$_serverTypeID]['fieldNames']; + break; + case 'smtp': + return self::$SMTPServerType[$_serverTypeID]['fieldNames']; + break; + } + } + + function getIMAPServerTypes($extended=true) + { + foreach(self::$IMAPServerType as $key => $value) { + if ($extended) + { + $retData[$key]['description'] = $value['description']; + $retData[$key]['protocol'] = $value['protocol']; + } + else + { + $retData[$key] = $value['description']; + } + } + + return $retData; + } + + function getLDAPStorageData($_serverid) + { + $storageData = $this->soemailadmin->getLDAPStorageData($_serverid); + return $storageData; + } + + function getMailboxString($_folderName) + { + if (is_object($this->imapClass)) + { + return ExecMethod("emailadmin.".$this->imapClass.".getMailboxString",$_folderName,3,$this->profileData); + return $this->imapClass->getMailboxString($_folderName); + } + else + { + return false; + } + } + + function getProfile($_profileID) + { + if (!(is_array(self::$sessionData) && (count(self::$sessionData)>0))) $this->restoreSessionData(); + if (is_array(self::$sessionData) && (count(self::$sessionData)>0) && self::$sessionData['profile'][$_profileID]) { + #error_log("sessionData Restored for Profile $_profileID
"); + return self::$sessionData['profile'][$_profileID]; + } + $profileData = $this->soemailadmin->getProfileList($_profileID); + $found = false; + if (is_array($profileData) && count($profileData)) + { + foreach($profileData as $n => $data) + { + if ($data['ProfileID'] == $_profileID) + { + $found = $n; + break; + } + } + } + if ($found === false) // no existing profile selected + { + if (is_array($profileData) && count($profileData)) { // if we have a profile use that + reset($profileData); + list($found,$data) = each($profileData); + $this->profileID = $_profileID = $data['profileID']; + } elseif ($GLOBALS['egw_info']['server']['smtp_server']) { // create a default profile, from the data in the api config + $this->profileID = $_profileID = $this->soemailadmin->addProfile(array( + 'description' => $GLOBALS['egw_info']['server']['smtp_server'], + 'defaultDomain' => $GLOBALS['egw_info']['server']['mail_suffix'], + 'organisationName' => '', + 'userDefinedAccounts' => '', + 'userDefinedIdentities' => '', + ),array( + 'smtpServer' => $GLOBALS['egw_info']['server']['smtp_server'], + 'smtpPort' => $GLOBALS['egw_info']['server']['smtp_port'], + 'smtpAuth' => '', + 'smtpType' => 'defaultsmtp', + ),array( + 'imapServer' => $GLOBALS['egw_info']['server']['mail_server'] ? + $GLOBALS['egw_info']['server']['mail_server'] : $GLOBALS['egw_info']['server']['smtp_server'], + 'imapPort' => '143', + 'imapType' => 'defaultimap', // imap + 'imapLoginType' => $GLOBALS['egw_info']['server']['mail_login_type'] ? + $GLOBALS['egw_info']['server']['mail_login_type'] : 'standard', + 'imapTLSEncryption' => '0', + 'imapTLSAuthentication' => '', + )); + $profileData[$found = 0] = array( + 'smtpType' => 'defaultsmtp', + 'imapType' => 'defaultimap', + ); + } + } + $fieldNames = array(); + if (isset($profileData[$found])) + { + $fieldNames = array_merge(self::$SMTPServerType[$profileData[$found]['smtpType']]['fieldNames'], + self::$IMAPServerType[$profileData[$found]['imapType']]['fieldNames']); + } + $fieldNames[] = 'description'; + $fieldNames[] = 'defaultDomain'; + $fieldNames[] = 'profileID'; + $fieldNames[] = 'organisationName'; + $fieldNames[] = 'userDefinedAccounts'; + $fieldNames[] = 'userDefinedIdentities'; + $fieldNames[] = 'ea_appname'; + $fieldNames[] = 'ea_group'; + $fieldNames[] = 'ea_user'; + $fieldNames[] = 'ea_active'; + $fieldNames[] = 'ea_user_defined_signatures'; + $fieldNames[] = 'ea_default_signature'; + $fieldNames[] = 'ea_stationery_active_templates'; + + $profileData = $this->soemailadmin->getProfile($_profileID, $fieldNames); + $profileData['imapTLSEncryption'] = ($profileData['imapTLSEncryption'] == 'yes' ? 1 : (int)$profileData['imapTLSEncryption']); + if(strlen($profileData['ea_stationery_active_templates']) > 0) + { + $profileData['ea_stationery_active_templates'] = unserialize($profileData['ea_stationery_active_templates']); + } + self::$sessionData['profile'][$_profileID] = $profileData; + $this->saveSessionData(); + return $profileData; + } + + function getProfileList($_profileID='',$_appName=false,$_groupID=false,$_accountID=false) + { + if ($_appName!==false ||$_groupID!==false ||$_accountID!==false) { + return $this->soemailadmin->getProfileList($_profileID,false,$_appName,$_groupID,$_accountID); + } else { + return $this->soemailadmin->getProfileList($_profileID); + } + } + + function getSMTPServerTypes() + { + foreach(self::$SMTPServerType as $key => $value) + { + $retData[$key] = $value['description']; + } + return $retData; + } + + function getUserProfile($_appName='', $_groups='') + { + if (!(is_array(self::$sessionData) && (count(self::$sessionData)>0))) $this->restoreSessionData(); + if (is_array(self::$sessionData) && count(self::$sessionData)>0 && self::$sessionData['ea_preferences']) + { + //error_log("sessionData Restored for UserProfile
"); + return self::$sessionData['ea_preferences']; + } + $appName = ($_appName != '' ? $_appName : $GLOBALS['egw_info']['flags']['currentapp']); + if(!is_array($_groups)) { + // initialize with 0 => means no group id + $groups = array(0); + // set the second entry to the users primary group + $groups[] = $GLOBALS['egw_info']['user']['account_primary_group']; + $userGroups = $GLOBALS['egw']->accounts->membership($GLOBALS['egw_info']['user']['account_id']); + foreach((array)$userGroups as $groupInfo) { + $groups[] = $groupInfo['account_id']; + } + } else { + $groups = $_groups; + } + + if($data = $this->soemailadmin->getUserProfile($appName, $groups,$GLOBALS['egw_info']['user']['account_id'])) { + + $eaPreferences = CreateObject('emailadmin.ea_preferences'); + + // fetch the IMAP / incomming server data + $icClass = isset(self::$IMAPServerType[$data['imapType']]) ? self::$IMAPServerType[$data['imapType']]['classname'] : 'defaultimap'; + + $icServer = CreateObject('emailadmin.'.$icClass); + $icServer->encryption = ($data['imapTLSEncryption'] == 'yes' ? 1 : (int)$data['imapTLSEncryption']); + $icServer->host = $data['imapServer']; + $icServer->port = $data['imapPort']; + $icServer->validatecert = $data['imapTLSAuthentication'] == 'yes'; + $icServer->username = $GLOBALS['egw_info']['user']['account_lid']; + $icServer->password = $GLOBALS['egw_info']['user']['passwd']; + // restore the default loginType and check if there are forced/predefined user access Data ($imapAuthType may be set to admin) + list($data['imapLoginType'],$imapAuthType) = explode('#',$data['imapLoginType'],2); + $icServer->loginType = $data['imapLoginType']; + $icServer->domainName = $data['defaultDomain']; + $icServer->loginName = $data['imapLoginType'] == 'standard' ? $GLOBALS['egw_info']['user']['account_lid'] : $GLOBALS['egw_info']['user']['account_lid'].'@'.$data['defaultDomain']; + $icServer->enableCyrusAdmin = ($data['imapEnableCyrusAdmin'] == 'yes'); + $icServer->adminUsername = $data['imapAdminUsername']; + $icServer->adminPassword = $data['imapAdminPW']; + $icServer->enableSieve = ($data['imapEnableSieve'] == 'yes'); + $icServer->sievePort = $data['imapSievePort']; + if ($imapAuthType == 'admin') { + if (!empty($data['imapAuthUsername'])) $icServer->username = $icServer->loginName = $data['imapAuthUsername']; + if (!empty($data['imapAuthPassword'])) $icServer->password = $data['imapAuthPassword']; + } + if ($imapAuthType == 'email' || $icServer->loginType == 'email') { + $icServer->username = $icServer->loginName = $GLOBALS['egw_info']['user']['account_email']; + } + $eaPreferences->setIncomingServer($icServer); + + // fetch the SMTP / outgoing server data + $ogClass = isset(self::$SMTPServerType[$data['smtpType']]) ? self::$SMTPServerType[$data['smtpType']]['classname'] : 'defaultsmtp'; + if (!class_exists($ogClass)) + { + include_once(EGW_INCLUDE_ROOT.'/emailadmin/inc/class.'.$ogClass.'.inc.php'); + } + $ogServer = new $ogClass($icServer->domainName); + $ogServer->host = $data['smtpServer']; + $ogServer->port = $data['smtpPort']; + $ogServer->editForwardingAddress = ($data['editforwardingaddress'] == 'yes'); + $ogServer->smtpAuth = $data['smtpAuth'] == 'yes'; + if($ogServer->smtpAuth) { + if(!empty($data['ea_smtp_auth_username'])) { + $ogServer->username = $data['ea_smtp_auth_username']; + } else { + // if we use special logintypes for IMAP, we assume this to be used for SMTP too + if ($imapAuthType == 'email' || $icServer->loginType == 'email') { + $ogServer->username = $GLOBALS['egw_info']['user']['account_email']; + } elseif ($icServer->loginType == 'vmailmgr') { + $ogServer->username = $GLOBALS['egw_info']['user']['account_lid'].'@'.$icServer->domainName; + } else { + $ogServer->username = $GLOBALS['egw_info']['user']['account_lid']; + } + } + if(!empty($data['ea_smtp_auth_password'])) { + $ogServer->password = $data['ea_smtp_auth_password']; + } else { + $ogServer->password = $GLOBALS['egw_info']['user']['passwd']; + } + } + + $eaPreferences->setOutgoingServer($ogServer); + + foreach($ogServer->getAccountEmailAddress($GLOBALS['egw_info']['user']['account_lid']) as $emailAddresses) + { + $identity = CreateObject('emailadmin.ea_identity'); + $identity->emailAddress = $emailAddresses['address']; + $identity->realName = $emailAddresses['name']; + $identity->default = ($emailAddresses['type'] == 'default'); + $identity->organization = $data['organisationName']; + + $eaPreferences->setIdentity($identity); + } + + $eaPreferences->userDefinedAccounts = ($data['userDefinedAccounts'] == 'yes'); + $eaPreferences->userDefinedIdentities = ($data['userDefinedIdentities'] == 'yes'); + $eaPreferences->ea_user_defined_signatures = ($data['ea_user_defined_signatures'] == 'yes'); + $eaPreferences->ea_default_signature = $data['ea_default_signature']; + if(strlen($data['ea_stationery_active_templates']) > 0) + { + $eaPreferences->ea_stationery_active_templates = unserialize($data['ea_stationery_active_templates']); + } + self::$sessionData['ea_preferences'] = $eaPreferences; + $this->saveSessionData(); + return $eaPreferences; + } + + return false; + } + + function getUserData($_accountID) + { + + if($userProfile = $this->getUserProfile('felamimail')) { + $icServer = $userProfile->getIncomingServer(0); + if(is_a($icServer, 'defaultimap') && $username = $GLOBALS['egw']->accounts->id2name($_accountID)) { + $icUserData = $icServer->getUserData($username); + } + + $ogServer = $userProfile->getOutgoingServer(0); + if(is_a($ogServer, 'defaultsmtp')) { + $ogUserData = $ogServer->getUserData($_accountID); + } + + return $icUserData + $ogUserData; + + } + + return false; + } + + function restoreSessionData() + { + $GLOBALS['egw_info']['flags']['autoload'] = array(__CLASS__,'autoload'); + + //echo function_backtrace()."
"; + //unserializing the sessiondata, since they are serialized for objects sake + self::$sessionData = (array) unserialize($GLOBALS['egw']->session->appsession('session_data','emailadmin')); + } + + /** + * Autoload classes from emailadmin, 'til they get autoloading conform names + * + * @param string $class + */ + static function autoload($class) + { + if (file_exists($file=EGW_INCLUDE_ROOT.'/emailadmin/inc/class.'.$class.'.inc.php')) + { + include_once($file); + } + } + + function saveSMTPForwarding($_accountID, $_forwardingAddress, $_keepLocalCopy) + { + if (is_object($this->smtpClass)) + { + #$smtpClass = CreateObject('emailadmin.'.$this->smtpClass,$this->profileID); + #$smtpClass->saveSMTPForwarding($_accountID, $_forwardingAddress, $_keepLocalCopy); + $this->smtpClass->saveSMTPForwarding($_accountID, $_forwardingAddress, $_keepLocalCopy); + } + + } + + /** + * called by the validation hook in setup + * + * @param array $settings following keys: mail_server, mail_server_type {IMAP|IMAPS|POP-3|POP-3S}, + * mail_login_type {standard|vmailmgr}, mail_suffix (domain), smtp_server, smpt_port, smtp_auth_user, smtp_auth_passwd + */ + function setDefaultProfile($settings) + { + if (($profiles = $this->soemailadmin->getProfileList(0,true))) + { + $profile = array_shift($profiles); + } + else + { + $profile = array( + 'smtpType' => 'defaultsmtp', + 'description' => 'default profile (created by setup)', + 'ea_appname' => '', + 'ea_group' => 0, + 'ea_user' => 0, + 'ea_active' => 1, + ); + + if (empty($settings['mail_server'])) $profile['userDefinedAccounts'] = 'yes'; + if (empty($settings['mail_server'])) $profile['userDefinedIdentities'] == 'yes'; + if (empty($settings['mail_server'])) $profile['ea_user_defined_signatures'] == 'yes'; + + } + foreach($to_parse = array( + 'mail_server' => 'imapServer', + 'mail_server_type' => array( + 'imap' => array( + 'imapType' => 'defaultimap', + 'imapPort' => 143, + 'imapTLSEncryption' => 0, + ), + 'imaps' => array( + 'imapType' => 'defaultimap', + 'imapPort' => 993, + 'imapTLSEncryption' => '3', + ), + ), + 'mail_login_type' => 'imapLoginType', + 'mail_suffix' => 'defaultDomain', + 'smtp_server' => 'smtpServer', + 'smpt_port' => 'smtpPort', + 'smtp_auth_user' => 'ea_smtp_auth_username', + 'smtp_auth_passwd' => 'ea_smtp_auth_password', + ) as $setup_name => $ea_name_data) + { + if (!is_array($ea_name_data)) + { + $profile[$ea_name_data] = $settings[$setup_name]; + if ($setup_name == 'smtp_auth_user') $profile['stmpAuth'] = !empty($settings['smtp_auth_user']); + } + else + { + foreach($ea_name_data as $setup_val => $ea_data) + { + if ($setup_val == $settings[$setup_name]) + { + foreach($ea_data as $var => $val) + { + if ($var != 'imapType' || $val != 'defaultimap') // old code: || $profile[$var] < 3) // dont kill special imap server types + { + $profile[$var] = $val; + } + } + break; + } + } + } + } + // merge the other not processed values unchanged + $profile = array_merge($profile,array_diff_assoc($settings,$to_parse)); + + $this->soemailadmin->updateProfile($profile); + self::$sessionData['profile'] = array(); + $this->saveSessionData(); + //echo "

EMailAdmin profile update: ".print_r($profile,true)."

\n"; exit; + } + + function saveProfile($_globalSettings, $_smtpSettings, $_imapSettings) + { + if(!isset($_imapSettings['imapTLSAuthentication'])) { + $_imapSettings['imapTLSAuthentication'] = true; + } + + if(is_array($_globalSettings['ea_stationery_active_templates']) && count($_globalSettings['ea_stationery_active_templates']) > 0) + { + $_globalSettings['ea_stationery_active_templates'] = serialize($_globalSettings['ea_stationery_active_templates']); + } + else + { + $_globalSettings['ea_stationery_active_templates'] = null; + } + + if(!isset($_globalSettings['profileID'])) { + $_globalSettings['ea_order'] = count($this->getProfileList()) + 1; + $this->soemailadmin->addProfile($_globalSettings, $_smtpSettings, $_imapSettings); + } else { + $this->soemailadmin->updateProfile($_globalSettings, $_smtpSettings, $_imapSettings); + } + $all = $_globalSettings+$_smtpSettings+$_imapSettings; + if (!$all['ea_user'] && !$all['ea_group'] && !$all['ea_application']) // standard profile update eGW config + { + $new_config = array(); + foreach(array( + 'imapServer' => 'mail_server', + 'imapType' => 'mail_server_type', + 'imapLoginType' => 'mail_login_type', + 'defaultDomain' => 'mail_suffix', + 'smtpServer' => 'smtp_server', + 'smtpPort' => 'smpt_port', + )+($all['smtpAuth'] ? array( + 'ea_smtp_auth_username' => 'smtp_auth_user', + 'ea_smtp_auth_password' => 'smtp_auth_passwd', + ) : array()) as $ea_name => $config_name) + { + if (isset($all[$ea_name])) + { + if ($ea_name != 'imapType') + { + $new_config[$config_name] = $all[$ea_name]; + } + else // imap type, no pop3 code anymore + { + $new_config[$config_name] = 'imap'.($all['imapTLSEncryption'] ? 's' : ''); + } + } + } + if (count($new_config)) + { + $config = CreateObject('phpgwapi.config','phpgwapi'); + + foreach($new_config as $name => $value) + { + $config->save_value($name,$value,'phpgwapi'); + } + //echo "

eGW configuration update: ".print_r($new_config,true)."

\n"; + } + } + self::$sessionData = array(); + $this->saveSessionData(); + } + + function saveSessionData() + { + // serializing the session data, for the sake of objects + $GLOBALS['egw']->session->appsession('session_data','emailadmin',serialize(self::$sessionData)); + #$GLOBALS['egw']->session->appsession('user_session_data','',$this->userSessionData); + } + + function saveUserData($_accountID, $_formData) { + + if($userProfile = $this->getUserProfile('felamimail')) { + $ogServer = $userProfile->getOutgoingServer(0); + if(is_a($ogServer, 'defaultsmtp')) { + $ogServer->setUserData($_accountID, + (array)$_formData['mailAlternateAddress'], + (array)$_formData['mailForwardingAddress'], + $_formData['deliveryMode'], + $_formData['accountStatus'], + $_formData['mailLocalAddress'] + ); + } + + $icServer = $userProfile->getIncomingServer(0); + if(is_a($icServer, 'defaultimap') && $username = $GLOBALS['egw']->accounts->id2name($_accountID)) { + $icServer->setUserData($username, $_formData['quotaLimit']); + } + + // calling a hook to allow other apps to monitor the changes + $_formData['account_id'] = $_accountID; + $_formData['location'] = 'editaccountemail'; + $GLOBALS['egw']->hooks->process($_formData); + + return true; + self::$sessionData = array(); + $this->saveSessionData(); + } + + return false; + } + + function setOrder($_order) { + if(is_array($_order)) { + $this->soemailadmin->setOrder($_order); + } + self::$sessionData = array(); + $this->saveSessionData(); + } + + function updateAccount($_hookValues) { + if (is_object($this->imapClass)) { + #ExecMethod("emailadmin.".$this->imapClass.".updateAccount",$_hookValues,3,$this->profileData); + $this->imapClass->updateAccount($_hookValues); + } + + if (is_object($this->smtpClass)) { + #ExecMethod("emailadmin.".$this->smtpClass.".updateAccount",$_hookValues,3,$this->profileData); + $this->smtpClass->updateAccount($_hookValues); + } + self::$sessionData = array(); + $this->saveSessionData(); + } + } diff --git a/emailadmin/inc/class.emailadmin_hooks.inc.php b/emailadmin/inc/class.emailadmin_hooks.inc.php new file mode 100644 index 0000000000..93ae97c1f2 --- /dev/null +++ b/emailadmin/inc/class.emailadmin_hooks.inc.php @@ -0,0 +1,121 @@ + + * @copyright (c) 2008-8 by leithoff-At-stylite.de + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ + +/** + * diverse static emailadmin hooks + */ +class emailadmin_hooks +{ + // hook to plug in into admin (managable) applications list + static function admin() + { + // Only Modify the $file and $title variables..... + $title = $appname = 'emailadmin'; + $file = Array( + 'Site Configuration' => $GLOBALS['egw']->link('/index.php','menuaction=emailadmin.emailadmin_ui.index') + ); + + //Do not modify below this line + display_section($appname,$title,$file); + } + + /** + * Hook called if account emailadim settings has to be modified + * + * @param array $data + * @param int $data['account_id'] numerical id + */ + static function edit_user($data) + { + //echo "called hook and function
".function_backtrace()."
"; + //_debug_array($data); + + if ($data['account_id'] && // can't set it on add + $GLOBALS['egw_info']['user']['apps']['emailadmin']) + { + $GLOBALS['menuData'][] = array( + 'description' => 'eMailAdmin: User assigned Profile', + 'url' => '/index.php', + 'extradata' => 'menuaction=emailadmin.emailadmin_ui.index' + ); + } + } + + /** + * Hook called after group emailadim settings has to be modified + * + * @param array $data + * @param int $data['account_id'] numerical id + */ + static function edit_group($data) + { + #echo "called hook and function
"; + #_debug_array($data); + # somehow the $data var seems to be quite sparsely populated, so we dont check any further + if (#!empty($data['account_id']) && $data['account_id'] < 0 && // can't set it on add + $GLOBALS['egw_info']['user']['apps']['emailadmin']) + { + $GLOBALS['menuData'][] = array( + 'description' => 'eMailAdmin: Group assigned Profile', + 'url' => '/index.php', + 'extradata' => 'menuaction=emailadmin.emailadmin_ui.index' + ); + } + } + + /** + * Hook called before an account get deleted + * + * @param array $data + * @param int $data['account_id'] numerical id + * @param string $data['account_lid'] account-name + * @param int $data['new_owner'] account-id of new owner, or false if data should get deleted + */ + static function deleteaccount(array $data) + { + if((int)$data['account_id'] > 0 && + $GLOBALS['egw_info']['user']['apps']['emailadmin']) + { + $boemailadmin = new emailadmin_bo(); + $profileList = $boemailadmin->getProfileList($profileID,$appName,$groupID,(int) $data['account_id']); + if (is_array($profileList)) { + foreach ($profileList as $key => $value) { + $boemailadmin->deleteProfile($value['profileID']); + } + } + } + + } + + /** + * Hook called before a group get deleted + * + * @param array $data + * @param int $data['account_id'] numerical id + * @param string $data['account_name'] account-name + */ + static function deletegroup(array $data) + { + if ((int)$data['account_id'] < 0 && + $GLOBALS['egw_info']['user']['apps']['emailadmin']) + { + $boemailadmin = new emailadmin_bo(); + $profileList = $boemailadmin->getProfileList($profileID,$appName,(int) $data['account_id'],$accountID); + if (is_array($profileList)) { + foreach ($profileList as $key => $value) { + $boemailadmin->deleteProfile($value['profileID']); + } + } + } + } + +} diff --git a/emailadmin/inc/class.emailadmin_smtp_ldap.inc.php b/emailadmin/inc/class.emailadmin_smtp_ldap.inc.php new file mode 100644 index 0000000000..6301eb481e --- /dev/null +++ b/emailadmin/inc/class.emailadmin_smtp_ldap.inc.php @@ -0,0 +1,417 @@ + + * @copyright (c) 2010 by Ralf Becker + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ + +include_once(EGW_INCLUDE_ROOT.'/emailadmin/inc/class.defaultsmtp.inc.php'); + +/** + * Generic base class for SMTP configuration via LDAP + * + * This class uses just inetOrgPerson schema to store primary mail address and aliases + * + * Aliases are stored as aditional mail Attributes. The primary mail address is the first one. + * This schema does NOT support forwarding or disabling of an account for mail. + * + * Please do NOT copy this class! Extend it and set the constants different + * (incl. protected config var as long as we can not require PHP5.3 for LSB). + */ +class emailadmin_smtp_ldap extends defaultsmtp +{ + /** + * Name of schema, has to be in the right case! + */ + const SCHEMA = 'inetOrgPerson'; + + /** + * Attribute to enable mail for an account, OR false if existence of ALIAS_ATTR is enough for mail delivery + */ + const MAIL_ENABLE_ATTR = false; + /** + * Attribute value to enable mail for an account, OR false if existense of attribute is enough to enable account + */ + const MAIL_ENABLED = false; + + /** + * Attribute for aliases OR false to use mail + */ + const ALIAS_ATTR = false; + + /** + * Primary mail address required as an alias too: true or false + */ + const REQUIRE_MAIL_AS_ALIAS=false; + + /** + * Attribute for forwards OR false if not possible + */ + const FORWARD_ATTR = false; + + /** + * Attribute to only forward mail, OR false if not available + */ + const FORWARD_ONLY_ATTR = false; + /** + * Attribute value to only forward mail + */ + const FORWARD_ONLY = false; + + /** + * Attribute for mailbox, to which mail gets delivered OR false if not supported + */ + const MAILBOX_ATTR = false; + + /** + * Log all LDAP writes / actions to error_log + */ + var $debug = false; + + /** + * LDAP schema configuration + * + * Parent can NOT use constants direct as we have no late static binding in currenlty required PHP 5.2 + * + * @var array + */ + protected $config = array( + 'schema' => self::SCHEMA, + 'mail_enable_attr' => self::MAIL_ENABLE_ATTR, + 'mail_enabled' => self::MAIL_ENABLED, + 'alias_attr' => self::ALIAS_ATTR, + 'require_mail_as_alias' => self::REQUIRE_MAIL_AS_ALIAS, + 'forward_attr' => self::FORWARD_ATTR, + 'forward_only_attr' => self::FORWARD_ONLY_ATTR, + 'forward_only' => self::FORWARD_ONLY, + 'mailbox_attr' => self::MAILBOX_ATTR, + ); + + /** + * from here on implementation, please do NOT copy but extend it! + */ + + /** + * Hook called on account creation + * + * @param array $_hookValues values for keys 'account_email', 'account_firstname', 'account_lastname', 'account_lid' + * @return boolean true on success, false on error writing to ldap + */ + function addAccount($_hookValues) + { + $mailLocalAddress = $_hookValues['account_email'] ? $_hookValues['account_email'] : + common::email_address($_hookValues['account_firstname'], + $_hookValues['account_lastname'],$_hookValues['account_lid'],$this->defaultDomain); + + $ds = $GLOBALS['egw']->ldap->ldapConnect(); + + $filter = "uid=".$_hookValues['account_lid']; + + if (!($sri = @ldap_search($ds,$GLOBALS['egw_info']['server']['ldap_context'],$filter))) + { + return false; + } + $allValues = ldap_get_entries($ds, $sri); + $accountDN = $allValues[0]['dn']; + $objectClasses = $allValues[0]['objectclass']; + unset($objectClasses['count']); + + // add our mail schema, if not already set + if(!in_array($this->config['schema'],$objectClasses) && !in_array(strtolower($this->config['schema']),$objectClasses)) + { + $objectClasses[] = $this->config['schema']; + } + // the new code for postfix+cyrus+ldap + $newData = array( + 'mail' => $mailLocalAddress, + 'objectclass' => $objectClasses + ); + // does schema have explicit alias attribute AND require mail added as alias too + if ($this->config['alias_attr'] && $this->config['require_mail_as_alias'] && $this->config['alias_attr']) + { + $newData[$this->config['alias_attr']] = $mailLocalAddress; + } + // does schema support enabling/disabling mail via attribute + if ($this->config['mail_enable_attr']) + { + $newData[$this->config['mail_enable_attr']] = $this->config['mail_enabled']; + } + // does schema support an explicit mailbox name --> set it with $uid@$domain + if ($this->config['mailbox_attr']) + { + $newData[$this->config['mailbox_attr']] = $_hookValues['account_lid'].'@'.$this->defaultDomain; + } + if ($this->debug) error_log(__METHOD__.'('.array2string(func_get_args()).") --> ldap_mod_replace(,'$accountDN',".array2string($newData).')'); + + return ldap_mod_replace($ds, $accountDN, $newData); + } + + /** + * Get all email addresses of an account + * + * @param string $_accountName + * @return array + */ + function getAccountEmailAddress($_accountName) + { + $emailAddresses = array(); + $ds = $GLOBALS['egw']->ldap->ldapConnect(); + $filter = sprintf("(&(uid=%s)(objectclass=posixAccount))",$_accountName); + $attributes = array('dn','mail',$this->config['alias_attr']); + $sri = @ldap_search($ds, $GLOBALS['egw_info']['server']['ldap_context'], $filter, $attributes); + + if ($sri) + { + $realName = trim($GLOBALS['egw_info']['user']['firstname'] . (!empty($GLOBALS['egw_info']['user']['firstname']) ? ' ' : '') . $GLOBALS['egw_info']['user']['lastname']); + $allValues = ldap_get_entries($ds, $sri); + + if(isset($allValues[0]['mail'])) + { + foreach($allValues[0]['mail'] as $key => $value) + { + if ($key === 'count') continue; + + $emailAddresses[] = array ( + 'name' => $realName, + 'address' => $value, + 'type' => !$key ? 'default' : 'alternate', + ); + } + } + if ($this->config['alias_attr'] && isset($allValues[0][$this->config['alias_attr']])) + { + foreach($allValues[0][$this->config['alias_attr']] as $key => $value) + { + if ($key === 'count') continue; + + $emailAddresses[] = array( + 'name' => $realName, + 'address' => $value, + 'type' => 'alternate' + ); + } + } + } + if ($this->debug) error_log(__METHOD__."('$_acountName') returning ".array2string($emailAddresses)); + + return $emailAddresses; + } + + /** + * Get the data of a given user + * + * @param int $_uidnumber numerical user-id + * @return array + */ + function getUserData($_uidnumber) + { + $userData = array(); + + $ldap = $GLOBALS['egw']->ldap->ldapConnect(); + + if (($sri = @ldap_search($ldap,$GLOBALS['egw_info']['server']['ldap_context'],'(uidnumber='.(int)$_uidnumber.')',array($this->config['schema'])))) + { + $allValues = ldap_get_entries($ldap, $sri); + if ($this->debug) error_log(__METHOD__."($_uidnumber) --> ldap_search(,{$GLOBALS['egw_info']['server']['ldap_context']},'(uidnumber=$_uidnumber)') --> ldap_get_entries=".array2string($allValues[0])); + + if ($allValues['count'] > 0) + { + $userData['mailLocalAddress'] = $allValues[0]['mail'][0]; + if ($this->config['alias_attr']) + { + $userData['mailAlternateAddress'] = (array)$allValues[0][$this->config['alias_attr']]; + unset($userData['mailAlternateAddress']['count']); + } + else + { + $userData['mailAlternateAddress'] = (array)$allValues[0]['mail']; + unset($userData['mailAlternateAddress']['count']); + unset($userData['mailAlternateAddress'][0]); + $userData['mailAlternateAddress'] = array_values($userData['mailAlternateAddress']); + } + if ($this->config['mail_enable_attr']) + { + $userData['accountStatus'] = isset($allValues[0][$this->config['mail_enable_attr']]) && + ($this->config['mail_enabled'] && $allValues[0][$this->config['mail_enable_attr']][0] == $this->config['mail_enabled'] || + !$this->config['mail_enabled'] && $allValues[0][$this->config['alias_attr']]['count'] > 0) ? 'active' : ''; + } + else + { + $userData['accountStatus'] = $allValues[0][$this->config['alias_attr']]['count'] > 0 ? 'active' : ''; + } + $userData['mailForwardingAddress'] = $this->config['forward_attr'] ? $allValues[0][$this->config['forward_attr']] : array(); + unset($userData['mailForwardingAddress']['count']); + + //$userData['deliveryProgramPath'] = $allValues[0][$this->config['mailbox_attr']][0]; + if ($this->config['mailbox_attr']) $userData[$this->config['mailbox_attr']] = $allValues[0][$this->config['mailbox_attr']][0]; + + if ($this->config['forward_only_attr']) + { + $userData['deliveryMode'] = isset($allValues[0][$this->config['forward_only_attr']]) && + ($this->config['forward_only'] && $allValues[0][$this->config['forward_only_attr']][0] == $this->config['forward_only'] || + !$this->config['forward_only'] && $allValues[0][$this->config['forward_only_attr']]['count'] > 0) ? 'forwardOnly' : ''; + } + else + { + $userData['deliveryMode'] = ''; + } + // eg. suse stores all email addresses as aliases + if ($this->config['require_mail_as_alias'] && + ($k = array_search($userData['mailLocalAddress'],$userData['mailAlternateAddress'])) !== false) + { + unset($userData['mailAlternateAddress'][$k]); + } + } + } + if ($this->debug) error_log(__METHOD__."('$_uidnumber') returning ".array2string($userData)); + + return $userData; + } + + /** + * Set the data of a given user + * + * @param int $_uidnumber numerical user-id + * @param array $_mailAlternateAddress + * @param array $_mailForwardingAddress + * @param string $_deliveryMode + * @param string $_accountStatus + * @param string $_mailLocalAddress + * @return boolean true on success, false on error writing to ldap + */ + function setUserData($_uidnumber, $_mailAlternateAddress, $_mailForwardingAddress, $_deliveryMode, $_accountStatus, $_mailLocalAddress) + { + $filter = 'uidnumber='.(int)$_uidnumber; + + $ldap = $GLOBALS['egw']->ldap->ldapConnect(); + + if (!($sri = @ldap_search($ldap,$GLOBALS['egw_info']['server']['ldap_context'],$filter))) + { + return false; + } + $allValues = ldap_get_entries($ldap, $sri); + + $accountDN = $allValues[0]['dn']; + $uid = $allValues[0]['uid'][0]; + $objectClasses = $allValues[0]['objectclass']; + + unset($objectClasses['count']); + + if(!in_array($this->config['schema'],$objectClasses) && !in_array(strtolower($this->config['schema']),$objectClasses)) + { + $objectClasses[] = $this->config['schema']; + $newData['objectclass'] = $objectClasses; + } + + sort($_mailAlternateAddress); + sort($_mailForwardingAddress); + + $newData['mail'] = $_mailLocalAddress; + // does schema have explicit alias attribute + if ($this->config['alias_attr']) + { + $newData[$this->config['alias_attr']] = (array)$_mailAlternateAddress; + + // all email must be stored as alias for suse + if ($this->config['require_mail_as_alias'] && !in_array($_mailLocalAddress,(array)$_mailAlternateAddress)) + { + $newData[$this->config['alias_attr']][] = $_mailLocalAddress; + } + } + // or de we add them - if existing - to mail attr + elseif ($_mailAlternateAddress) + { + $newData['mail'] = array_merge((array)$newData['mail'],(array)$_mailAlternateAddress); + } + // does schema support to store forwards + if ($this->config['forward_attr']) + { + $newData[$this->config['forward_attr']] = (array)$_mailForwardingAddress; + } + // does schema support only forwarding incomming mail + if ($this->config['forward_only_attr']) + { + $newData[$this->config['forward_only_attr']] = $_deliveryMode ? $this->config['forward_only'] : array(); + } + // does schema support enabling/disabling mail via attribute + if ($this->config['mail_enable_attr']) + { + $newData[$this->config['mail_enable_attr']] = $_accountStatus ? $this->config['mail_enabled'] : array(); + } + // does schema support an explicit mailbox name --> set it with $uid@$domain + if ($this->config['mailbox_attr']) + { + $newData[$this->config['mailbox_attr']] = $uid.'@'.$this->defaultDomain; + } + if ($this->debug) error_log(__METHOD__.'('.array2string(func_get_args()).") --> ldap_mod_replace(,'$accountDN',".array2string($newData).')'); + + return ldap_mod_replace($ldap, $accountDN, $newData); + } + + /** + * Saves the forwarding information + * + * @param int $_accountID + * @param string $_forwardingAddress + * @param string $_keepLocalCopy 'yes' + * @return boolean true on success, false on error writing to ldap + */ + function saveSMTPForwarding($_accountID, $_forwardingAddress, $_keepLocalCopy) + { + $ds = $GLOBALS['egw']->ldap->ldapConnect(); + $filter = sprintf('(&(uidnumber=%d)(objectclass=posixAccount))',$_accountID); + $attributes = array('dn',$this->config['forward_attr'],'objectclass'); + if ($this->config['forward_only_attr']) + { + $attributes[] = $this->config['forward_only_attr']; + } + $sri = ldap_search($ds, $GLOBALS['egw_info']['server']['ldap_context'], $filter, $attributes); + + if ($sri) + { + $newData = array(); + $allValues = ldap_get_entries($ds, $sri); + $objectClasses = $allValues[0]['objectclass']; + $newData['objectclass'] = $allValues[0]['objectclass']; + + unset($newData['objectclass']['count']); + + if(!in_array($this->config['schema'],$objectClasses)) + { + $newData['objectclass'][] = $this->config['schema']; + } + if ($this->config['forward_attr']) + { + if(!empty($_forwardingAddress)) + { + if(is_array($allValues[0][$this->config['forward_attr']])) + { + $newData[$this->config['forward_attr']] = $allValues[0][$this->config['forward_attr']]; + unset($newData[$this->config['forward_attr']]['count']); + $newData[$this->config['forward_attr']][0] = $_forwardingAddress; + } + else + { + $newData[$this->config['forward_attr']] = (array)$_forwardingAddress; + } + if ($this->config['forward_only_attr']) + { + $newData['deliverymode'] = $_keepLocalCopy == 'yes' ? array() : $this->config['forward_only']; + } + } + else + { + $newData[$this->config['forward_attr']] = array(); + } + } + if ($this->debug) error_log(__METHOD__.'('.array2string(func_get_args()).") --> ldap_mod_replace(,'$accountDN',".array2string($newData).')'); + + return ldap_modify ($ds, $allValues[0]['dn'], $newData); + } + } +} diff --git a/emailadmin/inc/class.emailadmin_so.inc.php b/emailadmin/inc/class.emailadmin_so.inc.php new file mode 100644 index 0000000000..53f389580a --- /dev/null +++ b/emailadmin/inc/class.emailadmin_so.inc.php @@ -0,0 +1,461 @@ + 'profileID', + 'ea_smtp_server' => 'smtpServer', + 'ea_smtp_type' => 'smtpType', + 'ea_smtp_port' => 'smtpPort', + 'ea_smtp_auth' => 'smtpAuth', + 'ea_editforwardingaddress' => 'editforwardingaddress', + 'ea_smtp_ldap_server' => 'smtpLDAPServer', + 'ea_smtp_ldap_basedn' => 'smtpLDAPBaseDN', + 'ea_smtp_ldap_admindn' => 'smtpLDAPAdminDN', + 'ea_smtp_ldap_adminpw' => 'smtpLDAPAdminPW', + 'ea_smtp_ldap_use_default' => 'smtpLDAPUseDefault', + 'ea_imap_server' => 'imapServer', + 'ea_imap_type' => 'imapType', + 'ea_imap_port' => 'imapPort', + 'ea_imap_login_type' => 'imapLoginType', + 'ea_imap_auth_username' => 'imapAuthUsername', + 'ea_imap_auth_password' => 'imapAuthPassword', + 'ea_imap_tsl_auth' => 'imapTLSAuthentication', + 'ea_imap_tsl_encryption' => 'imapTLSEncryption', + 'ea_imap_enable_cyrus' => 'imapEnableCyrusAdmin', + 'ea_imap_admin_user' => 'imapAdminUsername', + 'ea_imap_admin_pw' => 'imapAdminPW', + 'ea_imap_enable_sieve' => 'imapEnableSieve', + 'ea_imap_sieve_server' => 'imapSieveServer', + 'ea_imap_sieve_port' => 'imapSievePort', + 'ea_description' => 'description', + 'ea_default_domain' => 'defaultDomain', + 'ea_organisation_name' => 'organisationName', + 'ea_user_defined_identities' => 'userDefinedIdentities', + 'ea_user_defined_accounts' => 'userDefinedAccounts', + 'ea_order' => 'ea_order', + 'ea_active' => 'ea_active', + 'ea_group' => 'ea_group', + 'ea_user' => 'ea_user', + 'ea_appname' => 'ea_appname', + 'ea_smtp_auth_username' => 'ea_smtp_auth_username', + 'ea_smtp_auth_password' => 'ea_smtp_auth_password', + 'ea_user_defined_signatures' => 'ea_user_defined_signatures', + 'ea_default_signature' => 'ea_default_signature', + 'ea_stationery_active_templates' => 'ea_stationery_active_templates', + ); + + function __construct() + { + if (is_object($GLOBALS['egw_setup']->db)) + { + $this->db = clone($GLOBALS['egw_setup']->db); + } + else + { + $this->db = clone($GLOBALS['egw']->db); + } + $this->db->set_app('emailadmin'); + } + + /** + * Convert array with internal values/names to db-column-names + * + * @param array $vals + * @return array + */ + function vals2db($vals) + { + $cols = array(); + foreach($vals as $key => $val) + { + if (($k = array_search($key,$this->db_cols)) === false) $k = $key; + + $cols[$k] = $val; + } + return $cols; + } + + /** + * Convert array with db-columns/-values to internal names + * + * @param array $vals + * @return array + */ + function db2vals($cols) + { + $vals = array(); + foreach($cols as $key => $val) + { + if (isset($this->db_cols[$key])) $key = $this->db_cols[$key]; + + $vals[$key] = $val; + } + return $vals; + } + + function updateProfile($_globalSettings, $_smtpSettings=array(), $_imapSettings=array()) + { + $profileID = (int) $_globalSettings['profileID']; + unset($_globalSettings['profileID']); + + $where = $profileID ? array('ea_profile_id' => $profileID) : false; + + $this->db->insert($this->table,$this->vals2db($_smtpSettings+$_globalSettings+$_imapSettings),$where,__LINE__,__FILE__); + + return $profileID ? $profileID : $this->db->get_last_insert_id($this->table,'ea_profile_id'); + } + + function addProfile($_globalSettings, $_smtpSettings, $_imapSettings) + { + unset($_globalSettings['profileID']); // just in case + + return $this->updateProfile($_globalSettings, $_smtpSettings, $_imapSettings); + } + + function deleteProfile($_profileID) + { + $this->db->delete($this->table,array('ea_profile_id' => $_profileID),__LINE__ , __FILE__); + } + + function getProfile($_profileID, $_fieldNames) + { + $_fieldNames = array_keys($this->vals2db(array_flip($_fieldNames))); + $this->db->select($this->table,$_fieldNames,array('ea_profile_id' => $_profileID), __LINE__, __FILE__); + + if (($data = $this->db->row(true))) { + return $this->db2vals($data); + } + return $data; + } + + function getUserProfile($_appName, $_groups, $_user = NULL) + { + if(empty($_appName) || !is_array($_groups)) + return false; + if (!empty($_user)) { + $where = $this->db->expression( + $this->table,'(', + array('ea_appname'=>$_appName), + ' OR ea_appname IS NULL or ea_appname = \'\') and ', + '(', + array('ea_group'=>$_groups), + ' OR ea_group IS NULL or ea_group = \'\') and ', + '(', + array('ea_user'=>$_user), + ' OR ea_user IS NULL or ea_user = \'0\' or ea_user = \'\')' + ); + } else { + $where = $this->db->expression( + $this->table,'(', + array('ea_appname'=>$_appName), + ' OR ea_appname IS NULL or ea_appname = \'\') and ', + '(', + array('ea_group'=>$_groups), + ' OR ea_group IS NULL or ea_group = \'\')' + ); + } + $anyValues = 0; + // retrieve the Global/Overall Settings + $this->db->select($this->table,'ea_profile_id',$where, __LINE__, __FILE__, false, 'ORDER BY ea_order', false, 1); + if (($data = $this->db->row(true))) { + $globalDefaults = $this->getProfile($data['ea_profile_id'], $this->db_cols); + $anyValues++; + } else { + error_log("emailadmin::emailadmin_so->getUserProfile, no Default configured"); + $globalDefaults = array(); + } + // retrieve application settings if set + if (strlen($_appName)>0) { + $this->db->select($this->table,'ea_profile_id',$this->db->expression($this->table,'(',array('ea_appname'=>$_appName),' and ea_active=1)'), __LINE__, __FILE__, false, 'ORDER BY ea_order', false, 1); + if (($data = $this->db->row(true))) { + $appDefaults = $this->getProfile($data['ea_profile_id'], $this->db_cols); + $globalDefaults = self::mergeProfileData($globalDefaults, $appDefaults); + $anyValues++; + } + } + // retrieve primary-group settings if set + if (is_array($_groups) && $_groups[1] == $GLOBALS['egw_info']['user']['account_primary_group']) { + $this->db->select($this->table,'ea_profile_id',$this->db->expression($this->table,'(',array('ea_group'=>$_groups[1]),' and ea_active=1)'), __LINE__, __FILE__, false, 'ORDER BY ea_order', false, 1); + if (($data = $this->db->row(true))) { + $groupDefaults = $this->getProfile($data['ea_profile_id'], $this->db_cols); + $globalDefaults = self::mergeProfileData($globalDefaults, $groupDefaults); + $anyValues++; + } + } + // retrieve usersettings if set + if (!empty($_user) && $_user != 0) { + $this->db->select($this->table,'ea_profile_id',$this->db->expression($this->table,'(',array('ea_user'=>$_user),' and ea_active=1)'), __LINE__, __FILE__, false, 'ORDER BY ea_order', false, 1); + if (($data = $this->db->row(true))) { + $userDefaults = $this->getProfile($data['ea_profile_id'], $this->db_cols); + $globalDefaults = self::mergeProfileData($globalDefaults, $userDefaults); + $anyValues++; + } + } + if ($anyValues) { + return $globalDefaults; + } else { + return false; + } + } + + /* + * merge profile data. + * for each key of the mergeInTo Array check if there is a value set in the toMerge Array and replace it. + */ + static function mergeProfileData($mergeInTo, $toMerge) + { + if (is_array($toMerge) && count($toMerge)>0) + { + $allkeys = array_unique(array_keys($mergeInTo)+array_keys($toMerge)); + foreach ($allkeys as $i => $key) { + if (!array_key_exists($key, $mergeInTo) && array_key_exists($key, $toMerge) && !empty($toMerge[$key])) + { + $mergeInTo[$key]=$toMerge[$key]; + } else { + if (array_key_exists($key, $toMerge) && !empty($toMerge[$key])) + { + #error_log($key.'->'.$toMerge[$key]); + switch ($key) { + case 'imapLoginType': + // if the logintype is admin, it will be added to the default value + if ($toMerge[$key] =='admin' || $toMerge[$key] =='email') { + // take the first value found by explode, which is assumed the default value + list($mergeInTo[$key],$rest) = explode('#',$mergeInTo[$key],2); + $mergeInTo[$key] = $mergeInTo[$key].'#'.$toMerge[$key]; + #error_log($mergeInTo[$key]); + break; + } + case 'imapServer': + case 'imapType': + case 'imapPort': + case 'imapTLSEncryption': + case 'imapTLSAuthentication': + case 'imapEnableCyrusAdmin': + case 'imapAdminUsername': + case 'imapAdminPW': + if (strlen($toMerge['imapServer'])>0) $mergeInTo[$key]=$toMerge[$key]; + break; + case 'smtpPort': + case 'smtpType': + case 'smtpServer': + if (strlen($toMerge['smtpServer'])>0) $mergeInTo[$key]=$toMerge[$key]; + break; + case 'smtpLDAPServer': + case 'smtpLDAPBaseDN': + case 'smtpLDAPAdminDN': + case 'smtpLDAPAdminPW': + case 'smtpLDAPUseDefault': + if (strlen($toMerge['smtpLDAPServer'])>0) $mergeInTo[$key]=$toMerge[$key]; + break; + case 'ea_default_signature': + $testVal = $toMerge['ea_default_signature']; + //bofelamimail::getCleanHTML($testVal); + $testVal = html::purify($testVal); + if (strlen($testVal)>10 || $testVal != '
' || $testVal != '
') $mergeInTo[$key]=$toMerge[$key]; + break; + default: + $mergeInTo[$key]=$toMerge[$key]; + } + } + } + } + } + return $mergeInTo; + } + + function getProfileList($_profileID=0,$_defaultProfile=false,$_appName=false,$_groupID=false,$_accountID=false) + { + $where = false; + if ((int) $_profileID) + { + $where = array('ea_profile_id' => $_profileID); + } + elseif ($_defaultProfile) + { + $where['ea_appname'] = ''; + $where['ea_group'] = 0; + $where['ea_user'] = 0; + } + elseif ($_appName) + { + $where['ea_appname'] = $_appName; + } + elseif ((int) $_groupID) + { + $where['ea_group'] = (int) $_groupID; + } + elseif ((int) $_accountID) + { + $where['ea_user'] = (int) $_accountID; + } + $this->db->select($this->table,'*',$where, __LINE__,__FILE__,false,(int) $_profileID ? '' : 'ORDER BY ea_order'); + + $serverList = false; + while (($row = $this->db->row(true))) + { + $serverList[] = $this->db2vals($row); + } + return $serverList; + } + + function getUserData($_accountID) + { + $ldap = $GLOBALS['egw']->common->ldapConnect(); + + if (($sri = @ldap_search($ldap,$GLOBALS['egw_info']['server']['ldap_context'],"(uidnumber=$_accountID)"))) + { + $allValues = ldap_get_entries($ldap, $sri); + if ($allValues['count'] > 0) + { + #print "found something
"; + $userData["mailLocalAddress"] = $allValues[0]["mail"][0]; + $userData["mailAlternateAddress"] = $allValues[0]["mailalternateaddress"]; + $userData["accountStatus"] = $allValues[0]["accountstatus"][0]; + $userData["mailRoutingAddress"] = $allValues[0]["mailforwardingaddress"]; + $userData["qmailDotMode"] = $allValues[0]["qmaildotmode"][0]; + $userData["deliveryProgramPath"] = $allValues[0]["deliveryprogrampath"][0]; + $userData["deliveryMode"] = $allValues[0]["deliverymode"][0]; + + unset($userData["mailAlternateAddress"]["count"]); + unset($userData["mailRoutingAddress"]["count"]); + + return $userData; + } + } + + // if we did not return before, return false + return false; + } + + function saveUserData($_accountID, $_accountData) + { + $ldap = $GLOBALS['egw']->common->ldapConnect(); + // need to be fixed + if(is_numeric($_accountID)) + { + $filter = "uidnumber=$_accountID"; + } + else + { + $filter = "uid=$_accountID"; + } + + $sri = @ldap_search($ldap,$GLOBALS['egw_info']['server']['ldap_context'],$filter); + if ($sri) + { + $allValues = ldap_get_entries($ldap, $sri); + $accountDN = $allValues[0]['dn']; + $uid = $allValues[0]['uid'][0]; + $homedirectory = $allValues[0]['homedirectory'][0]; + $objectClasses = $allValues[0]['objectclass']; + + unset($objectClasses['count']); + } + else + { + return false; + } + + if(empty($homedirectory)) + { + $homedirectory = "/home/".$uid; + } + + // the old code for qmail ldap + $newData = array + ( + 'mail' => $_accountData["mailLocalAddress"], + 'mailAlternateAddress' => $_accountData["mailAlternateAddress"], + 'mailRoutingAddress' => $_accountData["mailRoutingAddress"], + 'homedirectory' => $homedirectory, + 'mailMessageStore' => $homedirectory."/Maildir/", + 'gidnumber' => '1000', + 'qmailDotMode' => $_accountData["qmailDotMode"], + 'deliveryProgramPath' => $_accountData["deliveryProgramPath"] + ); + + if(!in_array('qmailUser',$objectClasses) && + !in_array('qmailuser',$objectClasses)) + { + $objectClasses[] = 'qmailuser'; + } + + // the new code for postfix+cyrus+ldap + $newData = array + ( + 'mail' => $_accountData["mailLocalAddress"], + 'accountStatus' => $_accountData["accountStatus"], + 'objectclass' => $objectClasses + ); + + if(is_array($_accountData["mailAlternateAddress"])) + { + $newData['mailAlternateAddress'] = $_accountData["mailAlternateAddress"]; + } + else + { + $newData['mailAlternateAddress'] = array(); + } + + if($_accountData["accountStatus"] == 'active') + { + $newData['accountStatus'] = 'active'; + } + else + { + $newData['accountStatus'] = 'disabled'; + } + + if(!empty($_accountData["deliveryMode"])) + { + $newData['deliveryMode'] = $_accountData["deliveryMode"]; + } + else + { + $newData['deliveryMode'] = array(); + } + + + if(is_array($_accountData["mailRoutingAddress"])) + { + $newData['mailForwardingAddress'] = $_accountData["mailRoutingAddress"]; + } + else + { + $newData['mailForwardingAddress'] = array(); + } + + #print "DN: $accountDN
"; + ldap_mod_replace ($ldap, $accountDN, $newData); + #print ldap_error($ldap); + + // also update the account_email field in egw_accounts + // when using sql account storage + if($GLOBALS['egw_info']['server']['account_repository'] == 'sql') + { + $this->db->update('egw_accounts',array( + 'account_email' => $_accountData["mailLocalAddress"] + ), + array( + 'account_id' => $_accountID + ),__LINE__,__FILE__ + ); + } + return true; + } + } +?> diff --git a/emailadmin/inc/class.emailadmin_ui.inc.php b/emailadmin/inc/class.emailadmin_ui.inc.php new file mode 100644 index 0000000000..017b969290 --- /dev/null +++ b/emailadmin/inc/class.emailadmin_ui.inc.php @@ -0,0 +1,962 @@ + + * @copyright (c) 2009-10 by Klaus Leithoff + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + \***************************************************************************/ + /* $Id$ */ + + class emailadmin_ui extends emailadmin_bo + { + var $public_functions = array + ( + 'index' => True, + 'add' => True, + 'delete' => True, + 'edit' => True, + 'save' => True, + 'listProfiles' => True, + ); + + function __construct() + { + parent::__construct(); + } + + /** + * Main emailadmin page + * + * @param array $content=null + * @param string $msg=null + */ + function index(array $content=null,$msg=null) + { + $accountID = false; + $groupID = false; + $filter = ''; + $rowsfound = 0; + if(is_int(intval($_GET['account_id'])) && !empty($_GET['account_id'])) + { + if ( intval($_GET['account_id']) < 0 ) { + $groupID = intval($_GET['account_id']); + $filter['ea_group'] = intval($_GET['account_id']); + } else { + $accountID = intval($_GET['account_id']); + $filter['ea_user'] = intval($_GET['account_id']); + } + $r = parent::search($filter); + $rowsfound = count($r); + } + if ($rowsfound) + { + if (($accountID || !empty($groupID)) && $rowsfound == 1) + { + $linkData = array + ( + 'menuaction' => 'emailadmin.emailadmin_ui.edit', + 'profileid' => $r[0]['ea_profile_id'] + ); + $addJavaScript = "'; + } + } else { + if ($accountID || !empty($groupID)) { + $linkData = array + ( + 'menuaction' => 'emailadmin.emailadmin_ui.edit', + 'account_id' => ($accountID ? $accountID : $groupID) + ); + $addJavaScript = "'; + } + } + if ($accountID || !empty($groupID)) { + $linkData = array + ( + 'menuaction' => 'emailadmin.emailadmin_ui.index', + ); + $listLink = ''. + lang('reset filter').''; + + if ($GLOBALS['egw_info']['user']['apps']['admin']) { + $linkData = array + ( + 'menuaction' => 'admin.uiaccounts.list_'.($accountID ? 'users' : 'groups'), + ); + $listLink2 = ''.($accountID ? lang('Back to Admin/Userlist'): lang('Back to Admin/Grouplist')).''; + } + unset($r); + $subtitle = ($accountID || !empty($groupID) ? ' '.($accountID ? lang('filtered by Account') : lang('filtered by Group')).' ['.$listLink.']'.' ['.$listLink2.']': ''); + } + //_debug_array($content); + $tpl = new etemplate('emailadmin.index'); + if (!is_array($content)) + { + $content = array( + 'nm' => $GLOBALS['egw']->session->appsession('index',parent::APP), + ); + if (!is_array($content['nm'])) + { + $content['nm'] = array( + 'get_rows' => 'emailadmin.emailadmin_ui.get_rows', // I method/callback to request the data for the rows + 'no_filter' => True, // nofilter + 'no_filter2' => True, // I disable the 2. filter (params are the same as for filter) + 'no_cat' => True, // I disable the cat-selectbox + 'lettersearch' => True, // I show a lettersearch + 'searchletter' => false, // I0 active letter of the lettersearch or false for [all] + 'start' => 0, // IO position in list + 'order' => 'ea_order, ea_profile_id', // IO name of the column to sort after (optional for the sortheaders) + 'sort' => 'ASC', // IO direction of the sort: 'ASC' or 'DESC' + //'default_cols' => '!comment,ctime', // I columns to use if there's no user or default pref (! as first char uses all but the columns listed) + 'csv_fields' => false, // I false=disable csv export, true or unset=enable it with auto-detected fieldnames, + //or array with name=>label or name=>array('label'=>label,'type'=>type) pairs (type is a eT widget-type) + ); + } + } + elseif(isset($content['nm']['rows']['delete'])) + { + list($profileids) = each($content['nm']['rows']['delete']); + unset($content['nm']['rows']['delete']); + if ($profileids && self::delete($profileids)) + { + $content['msg'] = lang('%1 entries deleted.',1); + } + else + { + $content['msg'] = lang('Error deleting entry!'); + } + } + elseif(isset($content['delete'])) + { + unset($content['delete']); + if (($deleted = self::delete($content['nm']['rows']['selected']))) + { + $content['msg'] = lang('%1 entries deleted.',$deleted); + } + else + { + $content['msg'] = lang('Error deleting entry!'); + } + } + + if (isset($_GET['msg'])) $msg = $_GET['msg']; + $content['msg'] .= $msg; + /* + if ($content['action'] || $content['nm']['rows']) + { + if ($content['action']) + { + // SOME ACTION AS EDIT, DELETE, ... + $content['msg'] = self::action($content['action'],$content['nm']['rows']['checked']); + unset($content['action']); + } + elseif($content['nm']['rows']['delete']) + { + $content['msg'] = self::action('delete',array_keys($content['nm']['rows']['delete'])); + } + unset($content['nm']['rows']); + } + */ + if ($content['AddProfile']) + { + unset($content['AddProfile']); + } + if ($content['button']) + { + if ($content['button']) + { + list($button) = each($content['button']); + unset($content['button']); + } + switch($button) + { + default: + break; + } + } + $sel_options['ea_smtp_type']=parent::getSMTPServerTypes(); + $sel_options['ea_imap_type']=parent::getIMAPServerTypes(false); + $sel_options['ea_appname'] =self::getAllowedApps(); + // setting for the top of the app, etc. + $content['addJavaScript'] = $addJavaScript; + $content['subtitle'] = $subtitle; + if (!empty($filter)) foreach ($filter as $fk => $fv) $content['nm']['col_filter'][$fk] = $fv; + // seTting the Title of the app + $GLOBALS['egw_info']['flags']['app_header'] = lang('emailadmin'); + $tpl->exec('emailadmin.emailadmin_ui.index',$content,$sel_options,$readonlys,array('nm' => $content['nm'])); + } + + /** + * query the table + * + * reimplemented from so_sql to disable action-buttons based on the acl and make some modification on the data + * + * @param array &$query + * @param array &$rows returned rows/cups + * @param array &$readonlys eg. to disable buttons based on acl + * @param boolean $id_only=false if true only return (via $rows) an array of ids, dont save state to session + * @return int total number of rows matching the selection + */ + function get_rows(&$query_in,&$rows,&$readonlys,$id_only=false) + { + $query = $query_in; + $filteredby = ''; + if ($query['searchletter']) // only show rows if the order-criteria starts with the given letter + { + $query['col_filter'][] = (in_array($query['order'],parent::$numericfields) ? 'ea_description' : $query['order']).' '. + $GLOBALS['egw']->db->capabilities['case_insensitive_like'].' '.$GLOBALS['egw']->db->quote($query['searchletter'].'%'); + if (in_array($query['order'],parent::$numericfields)) $query_in['order'] = $query['order'] = 'ea_description'; + $filteredby = $query['order'].' '.lang('starts with').' '.$query['searchletter']; + } + $GLOBALS['egw_info']['flags']['app_header'] = lang('emailadmin').($filteredby? ' - '.$filteredby:''); + $total = parent::get_rows($query,$rows,$readonlys); + return $total; + } + + static function getAllowedApps() + { + $applications = array( + 'calendar' => $GLOBALS['egw_info']['apps']['calendar']['title'], + 'felamimail' => $GLOBALS['egw_info']['apps']['felamimail']['title'], + ); + asort($applications); + return $applications = array_merge(array('' => lang('any application')),$applications); + } + + static function getIMAPLoginTypes($serverclass='defaultimap') + { + //error_log(__METHOD__.' called with:'.$serverclass." with capabilities:".parent::$IMAPServerType[$serverclass]['imapcapabilities']); + $returnval = array( + 'standard' =>lang('username (standard)'), + 'vmailmgr' =>lang('username@domainname (Virtual MAIL ManaGeR)'), + 'admin' =>lang('Username/Password defined by admin'), + ); + if (!(stripos(parent::$IMAPServerType[$serverclass]['imapcapabilities'],'logintypeemail') === false)) $returnval['email'] = lang('use Users eMail-Address (as seen in Useraccount)'); + return $returnval; + } + + function edit($content=null) + { + //$this->editProfile($profileid); + $etpl = new etemplate(parent::APP.'.edit'); + if(!is_array($content)) + { + $rowfound = false; + $filter = array(); + if(is_int(intval($_GET['account_id'])) && !empty($_GET['account_id'])) + { + if ( intval($_GET['account_id']) < 0 ) { + $groupID = intval($_GET['account_id']); + $content['ea_group'] = $filter['ea_group'] = $groupID; + + } else { + $accountID = intval($_GET['account_id']); + $content['ea_user'] = $filter['ea_user'] = $accountID; + } + } + if (!empty($_GET['profileid'])) + { + $profileID = intval($_GET['profileid']); + $filter['ea_profile_id'] = $profileID; + $rowfound = parent::read($filter); + } + else + { + $content['ea_user_defined_accounts'] = "yes"; + } + } + else + { + $rowfound = true; + // handle action/submit buttons + if (isset($content['delete'])) + { + unset($content['delete']); + $button = 'delete'; + } + if (isset($content['cancel'])) + { + unset($content['cancel']); + $button = 'cancel'; + } + if (isset($content['apply'])) + { + unset($content['apply']); + $button = 'apply'; + } + if (isset($content['save'])) + { + unset($content['save']); + $button = 'save'; + } + unset($content['manage_stationery_templates']); + //unset($content['tabs']); + if (!empty($content['smtp_senders_email'])) + { + $content['ea_smtp_auth_username'] = $content['ea_smtp_auth_username'].';'.$content['smtp_senders_email']; + unset($content['smtp_senders_email']); + } + $this->data = $content; + switch ($button) + { + case 'delete': + if (($deleted = self::delete($content['ea_profile_id']))) + { + $msg = lang('%1 entries deleted.',$deleted); + } + else + { + $msg = lang('Error deleting entry!'); + } + $js = "opener.location.href='".$GLOBALS['egw']->link('/index.php',array( + 'menuaction' => parent::APP.'.emailadmin_ui.index', + 'msg' => $msg, + ))."';"; + $js .= 'window.close();'; + echo "\n\n\n\n\n"; + $GLOBALS['egw']->common->egw_exit(); + break; + case 'cancel': + $js .= 'window.close();'; + echo "\n\n\n\n\n"; + $GLOBALS['egw']->common->egw_exit(); + break; + case 'apply': + case 'save': + if ($etpl->validation_errors()) break; // the user need to fix the error, before we can save the entry + //_debug_array($this->data); + if (parent::save() != 0) + { + $msg = lang('Error saving the entry!!!'); + $button = ''; + } + else + { + $msg = lang('Entry saved'); + } + $js = "opener.location.href='".$GLOBALS['egw']->link('/index.php',array( + 'menuaction' => parent::APP.'.emailadmin_ui.index', + 'msg' => $msg, + ))."';"; + if ($button == 'save') + { + $js .= 'window.close();'; + echo "\n\n\n\n\n"; + $GLOBALS['egw']->common->egw_exit(); + break; + } + $row; + } + } + if ($rowfound) $content = array_merge($this->data,array()); + $content['smtpcapabilities'] = parent::$SMTPServerType[(!empty($content['ea_smtp_type'])?$content['ea_smtp_type']:'defaultsmtp')]['smtpcapabilities']; + $content['imapcapabilities'] = parent::$IMAPServerType[(!empty($content['ea_imap_type'])?$content['ea_imap_type']:'defaultimap')]['imapcapabilities']; + if (!empty($msg)) $content['msg'] = $msg; + list($content['ea_smtp_auth_username'],$content['smtp_senders_email']) = explode(';',$content['ea_smtp_auth_username']); + $preserv['ea_profile_id'] = $content['ea_profile_id']; + $preserv['smtpcapabilities'] = $content['smtpcapabilities']; + $preserv['imapcapabilities'] = $content['imappcapabilities']; + //$preserv['ea_stationery_active_templates'] = $content['ea_stationery_active_templates']; + $sel_options['ea_smtp_type']=parent::getSMTPServerTypes(); + $sel_options['ea_imap_type']=parent::getIMAPServerTypes(false); + $sel_options['ea_appname'] =self::getAllowedApps(); + $sel_options['ea_imap_login_type'] = self::getIMAPLoginTypes($content['ea_imap_type']); + // Stationery settings + $bostationery = new felamimail_bostationery(); + $sel_options['ea_stationery_active_templates'] = $bostationery->get_stored_templates(); + /* + $content['stored_templates'] = html::checkbox_multiselect( + 'ea_stationery_active_templates',$content['ea_stationery_active_templates'] + ,$bostationery->get_stored_templates(),true,'',3,true,'width: 100%;'); + + $content['manage_stationery_templates'] = + html::a_href( + lang('manage stationery templates'), + '/index.php?menuaction=etemplate.editor.edit', + array('name' => 'felamimail.stationery'), + 'target="_blank"' + ); + */ + //_debug_array($this->data); + return $etpl->exec(parent::APP.'.emailadmin_ui.edit',$content,$sel_options,$readonlys,$preserv,2); + } + + function add() + { + $this->edit(); + } + + function delete($profileid=null) + { + $_profileID = ($profileid ? $profileid : (int)$_GET['profileid']); + if (empty($_profileID)) return 0; + $deleted = parent::delete(array('ea_profile_id' => $_profileID)); + if (!is_array($_profileID)) $_profileID = (array)$_profileID; + foreach ($_profileID as $tk => $pid) + { + parent::$sessionData['profile'][$pid] = array(); + } + parent::saveSessionData(); + return $deleted; + } + + function listProfiles() + { + $GLOBALS['egw']->hooks->register_all_hooks(); + self::index(); + } + +/* + function deleteProfile() + { + $deleted = self::delete((int)$_GET['profileid']); + $this->listProfiles(); + } + + function display_app_header() + { + $GLOBALS['egw']->js->validate_file('tabs','tabs'); + $GLOBALS['egw_info']['flags']['include_xajax'] = True; + + switch($_GET['menuaction']) + { + case 'emailadmin.emailadmin_ui.add': + case 'emailadmin.emailadmin_ui.edit': + case 'emailadmin.emailadmin_ui.AddOrEdit': + case 'emailadmin.emailadmin_ui.addProfile': + case 'emailadmin.emailadmin_ui.editProfile': + $GLOBALS['egw_info']['nofooter'] = true; + $GLOBALS['egw']->js->validate_file('jscode','editProfile','emailadmin'); + $GLOBALS['egw']->js->set_onload('javascript:initAll();'); + #$GLOBALS['egw']->js->set_onload('smtp.init();'); + + break; + + case 'emailadmin.emailadmin_ui.listProfiles': + $GLOBALS['egw']->js->validate_file('jscode','listProfile','emailadmin'); + + break; + } + $GLOBALS['egw']->common->egw_header(); + + if($_GET['menuaction'] == 'emailadmin.emailadmin_ui.listProfiles' || $_GET['menuaction'] == 'emailadmin.emailadmin_ui.deleteProfile') + echo parse_navbar(); + } + + function editProfile($_profileID='') { + $allGroups = self:: getAllGroups(); + $allUsers = self::getAllUsers(); + $applications = self::getAllApps(); + + if($_profileID != '') + { + $profileID = $_profileID; + } + elseif(is_int(intval($_GET['profileid'])) && !empty($_GET['profileid'])) + { + $profileID = intval($_GET['profileid']); + } + else + { + return false; + } + + $profileList = parent::getProfileList($profileID); + $profileData = parent::getProfile($profileID); + $this->display_app_header(); + + $this->t->set_file(array("body" => "editprofile.tpl")); + $this->t->set_block('body','main'); + + $this->translate(); + + foreach((array)$profileData as $key => $value) { + #print "$key $value
"; + switch($key) { + case 'ea_default_signature': + // nothing to do here + break; + case 'ea_stationery_active_templates': + $activeTemplates = $value; + case 'imapTLSEncryption': + $this->t->set_var('checked_'. $key .'_'. $value,'checked="1"'); + break; + case 'imapTLSAuthentication': + if(!$value) { + $this->t->set_var('selected_'.$key,'checked="1"'); + } + break; + case 'imapEnableCyrusAdmin': + case 'imapEnableSieve': + case 'smtpAuth': + case 'smtpLDAPUseDefault': + case 'userDefinedAccounts': + case 'userDefinedIdentities': + case 'ea_user_defined_signatures': + case 'ea_active': + case 'editforwardingaddress': + if($value == 'yes' || $value == 1) { + $this->t->set_var('selected_'.$key,'checked="1"'); + } + break; + case 'imapType': + case 'smtpType': + case 'imapLoginType': + $this->t->set_var('selected_'.$key.'_'.$value,'selected="1"'); + break; + case 'ea_appname': + $this->t->set_var('application_select_box', html::select('globalsettings[ea_appname]',$value,$applications, true, "style='width: 250px;'")); + break; + case 'ea_group': + $this->t->set_var('group_select_box', html::select('globalsettings[ea_group]',$value,$allGroups, true, "style='width: 250px;'")); + break; + case 'ea_user': + $this->t->set_var('user_select_box', html::select('globalsettings[ea_user]',$value,$allUsers, true, "style='width: 250px;'")); + break; + case 'ea_smtp_auth_username': + #echo "
value_$key,$value"; + list($username,$senderadress) = explode(';',$value,2); + if (!empty($senderadress)) $this->t->set_var('value_smtp_senderadress',$senderadress); + $this->t->set_var('value_'.$key,$username); + break; + default: + $this->t->set_var('value_'.$key,$value); + break; + } + } + + $linkData = array + ( + 'menuaction' => 'emailadmin.emailadmin_ui.saveProfile', + 'profileID' => $profileID + ); + $this->t->set_var('action_url',$GLOBALS['egw']->link('/index.php',$linkData)); + + $linkData = array + ( + 'menuaction' => 'emailadmin.emailadmin_ui.listProfiles' + ); + $this->t->set_var('back_url',$GLOBALS['egw']->link('/index.php',$linkData)); + + $this->t->set_var('smtptype',html::select( + 'smtpsettings[smtpType]', + $profileData['smtpType'], + parent::getSMTPServerTypes(), + true, + 'style="width: 250px;" id="smtpselector" onchange="smtp.display(this.value);"' + )); + $selectFrom = html::select( + 'imapsettings[imapType]', + $profileData['imapType'], + parent::getIMAPServerTypes(false), + true, + // stupid tabs javascript assumes value=position in selectbox, here's a littel workaround ;-) + "style='width: 250px;' id='imapselector' onchange='var v = this.value; imap.display(this.value); this.value=v;'" + ); + $this->t->set_var('imaptype', $selectFrom); + + $style="width:100%; border:0px; height:150px;"; + $this->t->set_var('signature', html::fckEditorQuick( + 'globalsettings[ea_default_signature]', 'simple', + $profileData['ea_default_signature'], '150px') + ); + + // Stationery settings + $bostationery = new felamimail_bostationery(); + $activeTemplates = is_array($activeTemplates) ? $activeTemplates : array(); + $this->t->set_var('stored_templates', html::checkbox_multiselect( + 'globalsettings[ea_stationery_active_templates]',$activeTemplates + ,$bostationery->get_stored_templates(),true,'',3,true,'width: 100%;')); + $this->t->set_var( + 'link_manage_templates', + html::a_href( + lang('manage stationery templates'), + '/index.php?menuaction=etemplate.editor.edit', + array('name' => 'felamimail.stationery'), + 'target="_blank"' + ) + ); + + $this->t->parse("out","main"); + print $this->t->get('out','main'); + } + + function listProfiles() + { + $accountID = false; + $groupID = false; + $appName = ''; + $profileID = ''; + if(is_int(intval($_GET['account_id'])) && !empty($_GET['account_id'])) + { + if ( intval($_GET['account_id']) < 0 ) { + $groupID = intval($_GET['account_id']); + } else { + $accountID = intval($_GET['account_id']); + } + } + + $this->display_app_header(); + + $this->t->set_file(array("body" => "listprofiles.tpl")); + $this->t->set_block('body','main'); + + $this->translate(); + + $profileList = parent::getProfileList($profileID,$appName,$groupID,$accountID); + + // create the data array + if ($profileList) + { + for ($i=0; $i < count($profileList); $i++) + { + $linkData = array + ( + 'menuaction' => 'emailadmin.emailadmin_ui.editProfile', + 'nocache' => '1', + 'tabpage' => '3', + 'profileid' => $profileList[$i]['profileID'] + ); + $imapServerLink = ''.$profileList[$i]['imapServer'].''; + + $linkData = array + ( + 'menuaction' => 'emailadmin.emailadmin_ui.editProfile', + 'nocache' => '1', + 'tabpage' => '1', + 'profileid' => $profileList[$i]['profileID'] + ); + $descriptionLink = ''.$profileList[$i]['description'].''; + + $linkData = array + ( + 'menuaction' => 'emailadmin.emailadmin_ui.editProfile', + 'nocache' => '1', + 'tabpage' => '2', + 'profileid' => $profileList[$i]['profileID'] + ); + $smtpServerLink = ''.$profileList[$i]['smtpServer'].''; + + $linkData = array + ( + 'menuaction' => 'emailadmin.emailadmin_ui.deleteProfile', + 'profileid' => $profileList[$i]['profileID'] + ); + $deleteLink = ''. + lang('delete').''; + + $application = (empty($profileList[$i]['ea_appname']) ? lang('any application') : $GLOBALS['egw_info']['apps'][$profileList[$i]['ea_appname']]['title']); + $linkData = array + ( + 'menuaction' => 'emailadmin.emailadmin_ui.editProfile', + 'nocache' => '1', + 'tabpage' => '1', + 'profileid' => $profileList[$i]['profileID'] + ); + $applicationLink = ''.$application.''; + + $group = (empty($profileList[$i]['ea_group']) ? lang('any group') : $GLOBALS['egw']->accounts->id2name($profileList[$i]['ea_group'])); + $user = (empty($profileList[$i]['ea_user']) ? lang('any user') : $GLOBALS['egw']->accounts->id2name($profileList[$i]['ea_user'])); + $isactive = (empty($profileList[$i]['ea_active']) ? lang('inactive') : ($profileList[$i]['ea_active']>0 ? lang('active') : lang('inactive'))); + $linkData = array + ( + 'menuaction' => 'emailadmin.emailadmin_ui.editProfile', + 'nocache' => '1', + 'tabpage' => '1', + 'profileid' => $profileList[$i]['profileID'] + ); + $groupLink = ''.$group.''; + $userLink = ''.$user.''; + $activeLink = ''.$isactive.''; + $moveButtons = ' '. + ''; + + $data['profile_'.$profileList[$i]['profileID']] = array( + $descriptionLink, + $smtpServerLink, + $imapServerLink, + $applicationLink, + $groupLink, + $userLink, + $activeLink, + $deleteLink, + $moveButtons, + + ); + } + if (($accountID || !empty($groupID)) && count($profileList)==1) + { + $linkData = array + ( + 'menuaction' => 'emailadmin.emailadmin_ui.editProfile', + 'nocache' => '1', + 'tabpage' => '1', + 'profileid' => $profileList[0]['profileID'] + ); + print "'; + } + } else { + if ($accountID || !empty($groupID)) { + $linkData = array + ( + 'menuaction' => 'emailadmin.emailadmin_ui.addProfile', + 'nocache' => '1', + 'tabpage' => '1', + 'account_id' => ($accountID ? $accountID : $groupID) + ); + print "'; + + } + } + + // create the array containing the table header + $rows = array( + lang('description'), + lang('smtp server name'), + lang('imap server name'), + lang('application'), + lang('group'), + lang('user'), + lang('active'), + lang('delete'), + lang('order'), + ); + if ($accountID || !empty($groupID)) { + $linkData = array + ( + 'menuaction' => 'emailadmin.emailadmin_ui.listProfiles', + ); + $listLink = ''. + lang('reset filter').''; + + if ($GLOBALS['egw_info']['user']['apps']['admin']) { + $linkData = array + ( + 'menuaction' => 'admin.uiaccounts.list_'.($accountID ? 'users' : 'groups'), + ); + $listLink2 = ''.($accountID ? lang('Back to Admin/Userlist'): lang('Back to Admin/Grouplist')).''; + } + } + + // create the table html code + $this->t->set_var('server_next_match',$this->nextMatchTable( + $rows, + $data, + lang('profile list').($accountID || !empty($groupID) ? ' '.($accountID ? lang('filtered by Account') : lang('filtered by Group')).' ['.$listLink.']'.' ['.$listLink2.']': ''), + $_start, + $_total, + $_menuAction) + ); + + $linkData = array + ( + 'menuaction' => 'emailadmin.emailadmin_ui.addProfile' + ); + $this->t->set_var('add_link',$GLOBALS['egw']->link('/index.php',$linkData)); + + $this->t->parse("out","main"); + + print $this->t->get('out','main'); + + } + + function nextMatchTable($_rows, $_data, $_description, $_start, $_total, $_menuAction) + { + $template =& CreateObject('phpgwapi.Template',EGW_APP_TPL); + $template->set_file(array("body" => "nextMatch.tpl")); + $template->set_block('body','row_list','rowList'); + $template->set_block('body','header_row','headerRow'); + + $var = Array( + 'th_bg' => $GLOBALS['egw_info']['theme']['th_bg'], + 'left_next_matchs' => $this->nextmatchs->left('/index.php',$start,$total,'menuaction=emailadmin.emailadmin_ui.listServers'), + 'right_next_matchs' => $this->nextmatchs->right('/admin/groups.php',$start,$total,'menuaction=emailadmin.emailadmin_ui.listServers'), + 'lang_groups' => lang('user groups'), + 'sort_name' => $this->nextmatchs->show_sort_order($sort,'account_lid',$order,'/index.php',lang('name'),'menuaction=emailadmin.emailadmin_ui.listServers'), + 'description' => $_description, + 'header_edit' => lang('Edit'), + 'header_delete' => lang('Delete') + ); + $template->set_var($var); + + $data = ''; + if(is_array($_rows)) + { + foreach($_rows as $value) + { + $data .= "$value"; + } + $template->set_var('header_row_data', $data); + $template->fp('headerRow','header_row',True); + #$template->fp('header_row','header_row',True); + } + + if(is_array($_data)) + { + foreach($_data as $rowID => $value) + { + $data = ''; + foreach($value as $rowData) + { + $data .= "$rowData"; + } + $template->set_var('row_data', $data); + $template->set_var('row_id', $rowID); + $template->fp('rowList','row_list',True); + } + } + + return $template->fp('out','body'); + + } + + function saveProfile() + { + $globalSettings = array(); + $smtpSettings = array(); + $imapSettings = array(); + + // try to get the profileID + if(is_int(intval($_GET['profileID'])) && !empty($_GET['profileID'])) { + $globalSettings['profileID'] = intval($_GET['profileID']); + } + + $globalSettings['description'] = $_POST['globalsettings']['description']; + $globalSettings['defaultDomain'] = $_POST['globalsettings']['defaultDomain']; + $globalSettings['organisationName'] = $_POST['globalsettings']['organisationName']; + $globalSettings['userDefinedAccounts'] = ($_POST['globalsettings']['userDefinedAccounts'] == 'yes' ? 'yes' : 'no' ); + $globalSettings['userDefinedIdentities'] = ($_POST['globalsettings']['userDefinedIdentities'] == 'yes' ? 'yes' : 'no' ); + $globalSettings['ea_active'] = ($_POST['globalsettings']['ea_active'] == 'yes' ? 1 : 0 ); + $globalSettings['ea_user_defined_signatures'] = ($_POST['globalsettings']['ea_user_defined_signatures'] == 'yes' ? 'yes' : 'no' ); + $globalSettings['ea_default_signature'] = $_POST['globalsettings']['ea_default_signature']; + $globalSettings['ea_appname'] = ($_POST['globalsettings']['ea_appname'] == 'any' ? '' : $_POST['globalsettings']['ea_appname']); + $globalSettings['ea_group'] = ($_POST['globalsettings']['ea_group'] == 'any' ? '' : (int)$_POST['globalsettings']['ea_group']); + $globalSettings['ea_user'] = ($_POST['globalsettings']['ea_user'] == 'any' ? '' : (int)$_POST['globalsettings']['ea_user']); + $globalSettings['ea_stationery_active_templates'] = $_POST['globalsettings']['ea_stationery_active_templates']; + + // get the settings for the smtp server + $smtpType = $_POST['smtpsettings']['smtpType']; + foreach(parent::getFieldNames($smtpType,'smtp') as $key) { + $smtpSettings[$key] = $_POST['smtpsettings'][$smtpType][$key]; + } + // append the email to be used as sender adress(, if set) + if (!empty($smtpSettings['ea_smtp_auth_username']) && isset($_POST['smtpsettings'][$smtpType]['smtp_senderadress']) && !empty($_POST['smtpsettings'][$smtpType]['smtp_senderadress'])) { + $smtpSettings['ea_smtp_auth_username'] .= ";".$_POST['smtpsettings'][$smtpType]['smtp_senderadress']; + } + $smtpSettings['smtpType'] = $smtpType; + + #_debug_array($smtpSettings); exit; + + // get the settings for the imap/pop3 server + $imapType = $_POST['imapsettings']['imapType']; + foreach(parent::getFieldNames($imapType,'imap') as $key) { + switch($key) { + case 'imapTLSAuthentication': + $imapSettings[$key] = !isset($_POST['imapsettings'][$imapType][$key]); + break; + default: + $imapSettings[$key] = $_POST['imapsettings'][$imapType][$key]; + break; + } + } + $imapSettings['imapType'] = $imapType; + + #_debug_array($imapSettings); + + parent::saveProfile($globalSettings, $smtpSettings, $imapSettings); + + print ""; + $GLOBALS['egw']->common->egw_exit(); + exit; + } + + function translate() + { + # skeleton + # $this->t->set_var('',lang('')); + $this->t->set_var('lang_server_name',lang('server name')); + $this->t->set_var('lang_server_description',lang('description')); + $this->t->set_var('lang_edit',lang('edit')); + $this->t->set_var('lang_save',lang('save')); + $this->t->set_var('lang_delete',lang('delete')); + $this->t->set_var('lang_back',lang('back')); + $this->t->set_var('lang_remove',lang('remove')); + $this->t->set_var('lang_ldap_server',lang('LDAP server')); + $this->t->set_var('lang_ldap_basedn',lang('LDAP basedn')); + $this->t->set_var('lang_ldap_server_admin',lang('admin dn')); + $this->t->set_var('lang_ldap_server_password',lang('admin password')); + $this->t->set_var('lang_add_profile',lang('add profile')); + $this->t->set_var('lang_domain_name',lang('domainname')); + $this->t->set_var('lang_SMTP_server_hostname_or_IP_address',lang('SMTP-Server hostname or IP address')); + $this->t->set_var('lang_SMTP_server_port',lang('SMTP-Server port')); + $this->t->set_var('lang_Use_SMTP_auth',lang('Use SMTP auth')); + $this->t->set_var('lang_Select_type_of_SMTP_Server',lang('Select type of SMTP Server')); + $this->t->set_var('lang_profile_name',lang('Profile Name')); + $this->t->set_var('lang_default_domain',lang('enter your default mail domain (from: user@domain)')); + $this->t->set_var('lang_organisation_name',lang('name of organisation')); + $this->t->set_var('lang_user_defined_accounts',lang('users can define their own emailaccounts')); + $this->t->set_var('lang_user_defined_identities',lang('users can define their own identities')); + $this->t->set_var('lang_user_defined_signatures',lang('users can define their own signatures')); + $this->t->set_var('lang_LDAP_server_hostname_or_IP_address',lang('LDAP server hostname or ip address')); + $this->t->set_var('lang_LDAP_server_admin_dn',lang('LDAP server admin DN')); + $this->t->set_var('lang_LDAP_server_admin_pw',lang('LDAP server admin password')); + $this->t->set_var('lang_LDAP_server_base_dn',lang('LDAP server accounts DN')); + $this->t->set_var('lang_use_LDAP_defaults',lang('use LDAP defaults')); + $this->t->set_var('lang_LDAP_settings',lang('LDAP settings')); + $this->t->set_var('lang_select_type_of_imap/pop3_server',lang('select type of IMAP server')); + $this->t->set_var('lang_pop3_server_hostname_or_IP_address',lang('POP3 server hostname or ip address')); + $this->t->set_var('lang_pop3_server_port',lang('POP3 server port')); + $this->t->set_var('lang_imap_server_hostname_or_IP_address',lang('IMAP server hostname or ip address')); + $this->t->set_var('lang_imap_server_port',lang('IMAP server port')); + $this->t->set_var('lang_use_tls_encryption',lang('use tls encryption')); + $this->t->set_var('lang_use_tls_authentication',lang('use tls authentication')); + $this->t->set_var('lang_sieve_settings',lang('Sieve settings')); + $this->t->set_var('lang_enable_sieve',lang('enable Sieve')); + $this->t->set_var('lang_sieve_server_hostname_or_ip_address',lang('Sieve server hostname or ip address')); + $this->t->set_var('lang_sieve_server_port',lang('Sieve server port')); + $this->t->set_var('lang_enable_cyrus_imap_administration',lang('enable Cyrus IMAP server administration')); + $this->t->set_var('lang_cyrus_imap_administration',lang('Cyrus IMAP server administration')); + $this->t->set_var('lang_admin_username',lang('admin username')); + $this->t->set_var('lang_admin_password',lang('admin password')); + $this->t->set_var('lang_imap_server_logintyp',lang('imap server logintyp')); + $this->t->set_var('lang_standard',lang('username (standard)')); + $this->t->set_var('lang_vmailmgr',lang('username@domainname (Virtual MAIL ManaGeR)')); + $this->t->set_var('lang_pre_2001_c_client',lang('IMAP C-Client Version < 2001')); + $this->t->set_var('lang_user_can_edit_forwarding_address',lang('user can edit forwarding address')); + $this->t->set_var('lang_can_be_used_by_application',lang('can be used by application')); + $this->t->set_var('lang_can_be_used_by_group',lang('can be used by group')); + $this->t->set_var('lang_smtp_auth',lang('smtp authentication')); + $this->t->set_var('lang_sender',lang('send using this eMail-Address')); + $this->t->set_var('lang_username',lang('username')); + $this->t->set_var('lang_password',lang('password')); + $this->t->set_var('lang_smtp_settings',lang('smtp settings')); + $this->t->set_var('lang_smtp_options',lang('smtp options')); + $this->t->set_var('lang_profile_access_rights',lang('profile access rights')); + $this->t->set_var('lang_global_settings',lang('')); + $this->t->set_var('lang_organisation',lang('organisation')); + $this->t->set_var('lang_global_options',lang('global options')); + $this->t->set_var('lang_server_settings',lang('server settings')); + $this->t->set_var('lang_encryption_settings',lang('encryption settings')); + $this->t->set_var('lang_no_encryption',lang('no encryption')); + $this->t->set_var('lang_encrypted_connection',lang('encrypted connection')); + $this->t->set_var('lang_do_not_validate_certificate',lang('do not validate certificate')); + $this->t->set_var('lang_vacation_requires_admin',lang('Vaction messages with start- and end-date require an admin account to be set!')); + $this->t->set_var('lang_can_be_used_by_user',lang('can be used by user')); + $this->t->set_var('lang_profile_isactive',lang('profile is active')); + $this->t->set_var('lang_defined_by_admin',lang('Username/Password defined by admin')); + $this->t->set_var('lang_Use_IMAP_auth', lang('Use predefined username and password defined below')); + $this->t->set_var('lang_stationery', lang('stationery')); + $this->t->set_var('lang_active_templates', lang('active templates')); + $this->t->set_var('lang_active_templates_description', lang('users can utilize these stationery templates')); + $this->t->set_var('lang_email',lang('use Users eMail-Address (as seen in Useraccount)')); + $this->t->set_var('',lang('')); + # $this->t->set_var('',lang('')); + + } + */ + } +?> diff --git a/emailadmin/inc/class.imap_client.inc.php b/emailadmin/inc/class.imap_client.inc.php new file mode 100644 index 0000000000..356456d864 --- /dev/null +++ b/emailadmin/inc/class.imap_client.inc.php @@ -0,0 +1,789 @@ + + * + * Based on code from: + * + auth.php (1.49) + * + imap_general.php (1.212) + * + strings.php (1.184.2.35) + * from the Squirrelmail project. + * Copyright (c) 1999-2005 The SquirrelMail Project Team + * + * See the enclosed file COPYING for license information (GPL). If you + * did not receive this file, see http://www.fsf.org/copyleft/gpl.html. + * + * @author Michael Slusarz + * @since IMP 4.1 + * @package IMP + */ +class imap_client { + + /** + * The list of capabilities of the IMAP server. + * + * @var array + */ + var $_capability = null; + + /** + * The hostname of the IMAP server to connect to. + * + * @var string + */ + var $_host; + + /** + * The last message returned from the server. + * + * @var string + */ + var $_message; + + /** + * The namespace information. + * + * @var array + */ + var $_namespace = null; + + /** + * The port number of the IMAP server to connect to. + * + * @var string + */ + var $_port; + + /** + * The last response returned from the server. + * + * @var string + */ + var $_response; + + /** + * The unique session identifier ID to use when making an IMAP query. + * + * @var integer + */ + var $_sessionid = 1; + + /** + * The socket connection to the IMAP server. + * + * @var resource + */ + var $_stream; + + /** + * Are we using SSL to connect to the IMAP server? + * + * @var string + */ + var $_usessl = false; + + /** + * Are we using TLS to connect to the IMAP server? + * + * @var string + */ + var $_usetls = false; + + /** + * Constructor. + * + * @param string $host The address/hostname of the IMAP server. + * @param string $port The port to connect to on the IMAP server. + * @param string $protocol The protocol string (See, e.g., servers.php). + */ + function imap_client($host, $port, $protocol) + { + $this->_host = $host; + $this->_port = $port; + + /* Split apart protocol string to discover if we need to use either + * SSL or TLS. */ + $tmp = explode('/', strtolower($protocol)); + if (in_array('tls', $tmp)) { + $this->_usetls = true; + } elseif (in_array('ssl', $tmp)) { + $this->_usessl = true; + } + } + + /** + * Are we using TLS to connect and is it supported? + * + * @return mixed Returns true if TLS is being used to connect, false if + * is not, and PEAR_Error if we are attempting to use TLS + * and this version of PHP doesn't support it. + */ + function useTLS() + { + if ($this->_usetls) { + /* There is no way in PHP 4 to open a TLS connection to a + * non-secured port. See http://bugs.php.net/bug.php?id=26040 */ + if (!function_exists('stream_socket_enable_crypto')) { + return PEAR::raiseError(lang("To use a TLS connection, you must be running a version of PHP 5.1.0 or higher."), 'horde.error'); + } + } + + return $this->_usetls; + } + + /** + * Generates a new IMAP session ID by incrementing the last one used. + * + * @access private + * + * @return string IMAP session id of the form 'A000'. + */ + function _generateSid() + { + return sprintf("A%03d", $this->_sessionid++); + } + + /** + * Perform a command on the IMAP server. + * This command sets the $_response and $_message variable. + * + * @access private + * + * @param string $query IMAP command. + * + * @return mixed Returns PEAR_Error on error. On success, returns an + * array of the IMAP return text. + */ + function _runCommand($query) + { + $message = $response = array(); + + $sid = $this->_generateSid(); + fwrite($this->_stream, $sid . ' ' . $query . "\r\n"); + $tag_uid_a = explode(' ', trim($sid)); + $tag = $tag_uid_a[0]; + + $res = $this->_retrieveIMAPResponse($tag, $response, $message); + if (is_a($res, 'PEAR_Error')) { + $this->_message = $this->_response = ''; + return $res; + } + + /* retrieve the response and the message */ + $this->_response = $response[$tag]; + $this->_message = $message[$tag]; + + return (!empty($res[$tag])) ? $res[$tag][0] : $res[$tag]; + } + + /** + * Custom fgets function - get a line from the IMAP server no matter how + * large the line may be. + * + * @access private + * + * @return string The next line in the IMAP stream. + */ + function _fgets() + { + $buffer = 4096; + $offset = 0; + $results = ''; + + while (strpos($results, "\r\n", $offset) === false) { + if (!($read = fgets($this->_stream, $buffer))) { + $results = ''; + break; + } + if ($results != '') { + $offset = strlen($results) - 1; + } + $results .= $read; + } + + return $results; + } + + /** + * Reads the output from the IMAP stream. + * + * @access private + * + * @param string $tag The IMAP SID tag. + * @param array $response The response information. + * @param array $message The message information. + * + * @return mixed PEAR_Error on error, response string on success. + */ + function _retrieveIMAPResponse($tag, &$response, &$message) + { + $aResponse = $read = ''; + $data = $resultlist = array(); + $i = 0; + + $read = $this->_fgets(); + while ($read) { + $char = $read{0}; + switch ($char) { + case '+': + default: + $read = $this->_fgets(); + break; + + case $tag{0}: + /* Get the command. */ + $arg = ''; + $i = strlen($tag) + 1; + $s = substr($read, $i); + if (($j = strpos($s, ' ')) || ($j = strpos($s, "\n"))) { + $arg = substr($s, 0, $j); + } + $found_tag = substr($read, 0, $i - 1); + if ($found_tag) { + $response[$found_tag] = $arg; + $message[$found_tag] = trim(substr($read, $i + strlen($arg))); + if (!empty($data)) { + $resultlist[] = $data; + } + $aResponse[$found_tag] = $resultlist; + $data = $resultlist = array(); + if ($found_tag == $tag) { + break 2; + } + break; + } + + $read = $this->_fgets(); + if ($read === false) { + break 2; /* switch while */ + } + break; + + case '*': + if (preg_match('/^\*\s\d+\sFETCH/', $read)) { + /* check for literal */ + $s = substr($read, -3); + $fetch_data = array(); + do { + /* Outer loop: continue until next untagged fetch + or tagged reponse. */ + do { + /* Innerloop for fetching literals. with this + loop we prohibit that literal responses appear + in the outer loop so we can trust the untagged + and tagged info provided by $read. */ + if ($s === "}\r\n") { + $j = strrpos($read, '{'); + $iLit = substr($read, $j + 1, -3); + $fetch_data[] = $read; + $sLiteral = fread($this->_stream, $iLit); + if ($sLiteral === false) { /* error */ + break 4; /* while while switch while */ + } + /* backwards compattibility */ + $aLiteral = explode("\n", $sLiteral); + + unset($sLiteral); + + foreach ($aLiteral as $line) { + $fetch_data[] = $line ."\n"; + } + + unset($aLiteral); + + /* Next fgets belongs to this fetch because + we just got the exact literalsize and data + must follow to complete the response. */ + $read = $this->_fgets(); + if ($read === false) { /* error */ + break 4; /* while while switch while */ + } + } + $fetch_data[] = $read; + + /* Retrieve next line and check in the while + statements if it belongs to this fetch + response. */ + $read = $this->_fgets(); + if ($read === false) { /* error */ + break 4; /* while while switch while */ + } + /* Check for next untagged reponse and break. */ + if ($read{0} == '*') { + break 2; + } + $s = substr($read, -3); + } while ($s === "}\r\n"); + + $s = substr($read,-3); + } while (($read{0} !== '*') && + (substr($read, 0, strlen($tag)) !== $tag)); + + $resultlist[] = $fetch_data; + unset($fetch_data); + } else { + $s = substr($read, -3); + do { + if ($s === "}\r\n") { + $j = strrpos($read, '{'); + $iLit = substr($read, $j + 1, -3); + $data[] = $read; + $sLiteral = fread($this->_stream, $iLit); + if ($sLiteral === false) { /* error */ + $read = false; + break 3; /* while switch while */ + } + $data[] = $sLiteral; + $data[] = $this->_fgets(); + } else { + $data[] = $read; + } + $read = $this->_fgets(); + if ($read === false) { + break 3; /* while switch while */ + } elseif ($read{0} == '*') { + break; + } + $s = substr($read,-3); + } while ($s === "}\r\n"); + break; + } + break; + } + } + + /* Error processing in case $read is false. */ + if ($read === false) { + /* Try to retrieve an untagged bye respons from the results. */ + $sResponse = array_pop($data); + if (($sResponse !== NULL) && + (strpos($sResponse,'* BYE') !== false)) { + return PEAR::raiseError(lang("IMAP server closed the connection."), 'horde.error'); + } else { + return PEAR::raiseError(lang("Connection dropped by IMAP server."), 'horde.error'); + } + } + + switch ($response[$tag]) { + case 'OK': + return $aResponse; + break; + + case 'NO': + /* Ignore this error from M$ exchange, it is not fatal (aka bug). */ + if (strpos($message[$tag], 'command resulted in') === false) { + return PEAR::raiseError(sprintf(lang("Could not complete request. Reason Given: %s"), $message[$tag]), 'horde.error', null, null, $response[$tag]); + } + break; + + case 'BAD': + return PEAR::raiseError(sprintf(lang("Bad or malformed request. Server Responded: %s"), $message[$tag]), 'horde.error', null, null, $response[$tag]); + break; + + case 'BYE': + return PEAR::raiseError(sprintf(lang("IMAP Server closed the connection. Server Responded: %s"), $message[$tag]), 'horde.error', null, null, $response[$tag]); + break; + + default: + return PEAR::raiseError(sprintf(lang("Unknown IMAP response from the server. Server Responded: %s"), $message[$tag]), 'horde.error', null, null, $response[$tag]); + break; + } + } + + /** + * Connects to the IMAP server. + * + * @access private + * + * @return mixed Returns true on success, PEAR_Error on error. + */ + function _createStream() + { + if (($this->_usessl || $this->_usetls) && + !function_exists('openssl_pkcs7_sign')) { + return PEAR::raiseError(lang("If using SSL or TLS, you must have the PHP openssl extension loaded."), 'horde.error'); + } + + if ($res = $this->useTLS()) { + if (is_a($res, 'PEAR_Error')) { + return $res; + } else { + $this->_host = $this->_host . ':' . $this->_port; + } + } + + if ($this->_usessl) { + $this->_host = 'ssl://' . $this->_host; + } + $error_number = $error_string = ''; + $timeout = 10; + + if ($this->_usetls) { + $this->_stream = stream_socket_client($this->_host, $error_number, $error_string, $timeout); + if (!$this->_stream) { + return PEAR::raiseError(sprintf(lang("Error connecting to IMAP server. %s : %s."), $error_number, $error_string), 'horde.error'); + } + + /* Disregard any server information returned. */ + fgets($this->_stream, 1024); + + /* Send the STARTTLS command. */ + fwrite($this->_stream, $this->_generateSid() . " STARTTLS\r\n"); + + /* Disregard any server information returned. */ + fgets($this->_stream, 1024); + + /* Switch over to a TLS connection. */ + $res = stream_socket_enable_crypto($this->_stream, true, STREAM_CRYPTO_METHOD_TLS_CLIENT); + if (!$res) { + return PEAR::raiseError(lang("Could not open secure connection to the IMAP server. %s : %s."), 'horde.error'); + } + } else { + $this->_stream = fsockopen($this->_host, $this->_port, $error_number, $error_string, $timeout); + } + + /* Do some error correction */ + if (!$this->_stream) { + return PEAR::raiseError(sprintf(lang("Error connecting to IMAP server. %s : %s."), $error_number, $error_string), 'horde.error'); + } + + /* Disregard any server information. */ + fgets($this->_stream, 1024); + } + + /** + * Log the user into the IMAP server. + * + * @param string $username Username. + * @param string $password Encrypted password. + * + * @return mixed True on success, PEAR_Error on error. + */ + function login($username, $password) + { + $res = $this->_createStream(); + if (is_a($res, 'PEAR_Error')) { +#LK Horde::logMessage($res, __FILE__, __LINE__, PEAR_LOG_ERR); + return $res; + } + + $imap_auth_mech = array(); + + /* Use md5 authentication, if available. But no need to use special + * authentication if we are already using an encrypted connection. */ + $auth_methods = $this->queryCapability('AUTH'); + if ((!$this->_usessl || !$this->_usetls) && !empty($auth_methods)) { + if (in_array('CRAM-MD5', $auth_methods)) { + $imap_auth_mech[] = 'cram-md5'; + } + if (in_array('DIGEST-MD5', $auth_methods)) { + $imap_auth_mech[] = 'digest-md5'; + } + } + + /* Next, try 'PLAIN' authentication. */ + if (!empty($auth_methods) && in_array('PLAIN', $auth_methods)) { + $imap_auth_mech[] = 'plain'; + } + + /* Fall back to 'LOGIN' if available. */ + if (!$this->queryCapability('LOGINDISABLED')) { + $imap_auth_mech[] = 'login'; + } + + if (empty($imap_auth_mech)) { + return PEAR::raiseError(lang("No supported IMAP authentication method could be found."), 'horde.error'); + } + + foreach ($imap_auth_mech as $method) { + $res = $this->_login($username, $password, $method); + if (!is_a($res, 'PEAR_Error')) { + return true; + } + } + + return $res; + } + + /** + * Log the user into the IMAP server. + * + * @access private + * + * @param string $username Username. + * @param string $password Encrypted password. + * @param string $method IMAP login method. + * + * @return mixed True on success, PEAR_Error on error. + */ + function _login($username, $password, $method) + { + switch ($method) { + case 'cram-md5': + case 'digest-md5': + /* If we don't have Auth_SASL package install, return error. */ + if (!@include_once 'Auth/SASL.php') { + return PEAR::raiseError(lang("CRAM-MD5 or DIGEST-MD5 requires the Auth_SASL package to be installed."), 'horde.error'); + } + + $tag = $this->_generateSid(); + fwrite($this->_stream, $tag . ' AUTHENTICATE ' . strtoupper($method) . "\r\n"); + $challenge = explode(' ', $this->_fgets(), 3); + + if ($method == 'cram-md5') { + $auth_sasl = Auth_SASL::factory('crammd5'); + $response = $auth_sasl->getResponse($username, $password, base64_decode($challenge[1])); + fwrite($this->_stream, base64_encode($response) . "\r\n"); + $read = $this->_fgets(); + } elseif ($method == 'digest-md5') { + $auth_sasl = Auth_SASL::factory('digestmd5'); + $response = $auth_sasl->getResponse($username, $password, base64_decode($challenge[1]), $this->_host, 'imap'); + fwrite($this->_stream, base64_encode($response) . "\r\n"); + $response = explode(' ', $this->_fgets()); + $response = base64_decode($response[1]); + if (strpos($response, 'rspauth=') === false) { + return PEAR::raiseError(lang("Unexpected response from server to Digest-MD5 response."), 'horde.error'); + } + fwrite($this->_stream, "\r\n"); + $read = $this->_fgets(); + } else { + return PEAR::raiseError(lang("The IMAP server does not appear to support the authentication method selected. Please contact your system administrator."), 'horde.error'); + } + break; + + case 'login': + $tag = $this->_generateSid(); + $query = $tag . " LOGIN $username {" . strlen($password) . "}\r\n"; + fwrite($this->_stream, $query); + $read = $this->_fgets(); + if (substr($read, 0, 1) == '+') { + fwrite($this->_stream, "$password\r\n"); + $read = $this->_fgets(); + } else { + return PEAR::raiseError(lang("Unexpected response from server to LOGIN command."), 'horde.error'); + } + break; + + case 'plain': + $tag = $this->_generateSid(); + $sasl = $this->queryCapability('SASL-IR'); + $auth = base64_encode("$username\0$username\0$password"); + if ($sasl) { + // IMAP Extension for SASL Initial Client Response + // + $query = $tag . " AUTHENTICATE PLAIN $auth\r\n"; + fwrite($this->_stream, $query); + $read = $this->_fgets(); + } else { + $query = $tag . " AUTHENTICATE PLAIN\r\n"; + fwrite($this->_stream, $query); + $read = $this->_fgets(); + if (substr($read, 0, 1) == '+') { + fwrite($this->_stream, "$auth\r\n"); + $read = $this->_fgets(); + } else { + return PEAR::raiseError(lang("Unexpected response from server to AUTHENTICATE command."), 'horde.error'); + } + } + break; + } + + /* Check for failed login. */ + $results = explode(' ', $read, 3); + $response = $results[1]; + + if ($response != 'OK') { + $message = !empty($results[2]) ? htmlspecialchars($results[2]) : lang("No message returned."); + + switch ($response) { + case 'NO': + return PEAR::raiseError(sprintf(lang("Bad login name or password."), $message), 'horde.error'); + + case 'BAD': + default: + return PEAR::raiseError(sprintf(lang("Bad request: %s"), $message), 'horde.error'); + } + } + + return true; + } + + /** + * Log out of the IMAP session. + */ + function logout() + { + /* Logout is not valid until the server returns 'BYE' + * If we don't have an imap_ stream we're already logged out */ + if (isset($this->_stream) && $this->_stream) { + $this->_runCommand('LOGOUT'); + } + } + + /** + * Get the CAPABILITY string from the IMAP server. + * + * @access private + */ + function _capability() + { + if (!is_null($this->_capability)) { + return; + } + + $this->_capability = array(); + $read = $this->_runCommand('CAPABILITY'); + if (is_a($read, 'PEAR_Error')) { +#LK Horde::logMessage($read, __FILE__, __LINE__, PEAR_LOG_ERR); + return; + } + + $c = explode(' ', trim($read[0])); + for ($i = 2; $i < count($c); $i++) { + $cap_list = explode('=', $c[$i]); + if (isset($cap_list[1])) { + if (!isset($this->_capability[$cap_list[0]])) { + $this->_capability[$cap_list[0]] = array(); + } + $this->_capability[$cap_list[0]][] = $cap_list[1]; + } else { + $this->_capability[$cap_list[0]] = true; + } + } + } + + /** + * Returns whether the IMAP server supports the given capability. + * + * @param string $capability The capability string to query. + * + * @param mixed True if the server supports the queried capability, + * false if it doesn't, or an array if the capability can + * contain multiple values. + */ + function queryCapability($capability) + { + $this->_capability(); + return isset($this->_capability[$capability]) ? $this->_capability[$capability] : false; + } + + /** + * Get the NAMESPACE information from the IMAP server. + * + * @param array $additional If the server supports namespaces, any + * additional namespaces to add to the + * namespace list that are not broadcast by + * the server. + * + * @return array An array with the following format: + *
+     * Array
+     * (
+     *   [foo] => Array
+     *   (
+     *     [name] => (string)
+     *     [delimiter] => (string)
+     *     [type] => 'personal' | 'others' | 'shared'
+     *     [hidden] => (boolean)
+     *   )
+     *
+     *   [foo2] => Array
+     *   (
+     *     ...
+     *   )
+     * )
+     * 
+ */ + function namespace($additional = array()) + { + if (!is_null($this->_namespace)) { + return $this->_namespace; + } + + $namespace_array = array( + 1 => 'personal', + 2 => 'others', + 3 => 'shared' + ); + + if ($this->queryCapability('NAMESPACE')) { + /* + * According to rfc2342 response from NAMESPACE command is: + * * NAMESPACE (PERSONAL NAMESPACES) (OTHER_USERS NAMESPACE) (SHARED NAMESPACES) + */ + $read = $this->_runCommand('NAMESPACE'); + if (is_a($read, 'PEAR_Error')) { +#LK Horde::logMessage($read, __FILE__, __LINE__, PEAR_LOG_ERR); + return $read; + } + + if (preg_match('/\\* NAMESPACE +(\\( *\\(.+\\) *\\)|NIL) +(\\( *\\(.+\\) *\\)|NIL) +(\\( *\\(.+\\) *\\)|NIL)/i', $read[0], $data)) { + for ($i = 1; $i <= 3; $i++) { + if ($data[$i] == 'NIL') { + continue; + } + $pna = explode(')(', $data[$i]); + while (list($k, $v) = each($pna)) { + $lst = explode('"', $v); + $delimiter = (isset($lst[3])) ? $lst[3] : ''; + $this->_namespace[$lst[1]] = array('name' => $lst[1], 'delimiter' => $delimiter, 'type' => $namespace_array[$i], 'hidden' => false); + } + } + } + + foreach ($additional as $val) { + /* Skip namespaces if we have already auto-detected them. + * Also, hidden namespaces cannot be empty. */ + $val = trim($val); + if (empty($val) || isset($this->_namespace[$val])) { + continue; + } + $read = $this->_runCommand('LIST "" "' . $val . '"'); + if (is_a($read, 'PEAR_Error')) { +#LK Horde::logMessage($read, __FILE__, __LINE__, PEAR_LOG_ERR); + return $res; + } + if (!empty($read) && + preg_match("/^\* LIST \(.*\) \"(.*)\" \"?(.*?)\"?\s*$/", $read[0], $data) && + ($data[2] == $val)) { + $this->_namespace[$val] = array('name' => $val, 'delimiter' => $data[1], 'type' => $namespace_array[3], 'hidden' => true); + } + } + } else { + $res = $this->_runCommand('LIST "" ""'); + if (is_a($res, 'PEAR_Error')) { +#LK Horde::logMessage($res, __FILE__, __LINE__, PEAR_LOG_ERR); + return $res; + } + $quote_position = strpos($res[0], '"'); + $this->_namespace[''] = array('name' => '', 'delimiter' => substr($res[0], $quote_position + 1 , 1), 'type' => $namespace_array[1], 'hidden' => false); + } + + return $this->_namespace; + } + + /** + * Determines whether the IMAP search command supports the optional + * charset provided. + * + * @param string $charset The character set to test. + * + * @return boolean True if the IMAP search command supports the charset. + */ + function searchCharset($charset) + { + $this->_runCommand('SELECT INBOX'); + $read = $this->_runCommand('SEARCH CHARSET ' . $charset . ' TEXT "charsettest" 1'); + return !is_a($read, 'PEAR_Error'); + } + +} diff --git a/emailadmin/inc/class.pleskimap.inc.php b/emailadmin/inc/class.pleskimap.inc.php new file mode 100644 index 0000000000..4c7461aad8 --- /dev/null +++ b/emailadmin/inc/class.pleskimap.inc.php @@ -0,0 +1,458 @@ + as with the "LDAP, Postfix & Cyrus" plugin the plesk one creates mail * +* users and manages passwords, aliases, forwards and quota from within * +* eGroupWare - no need to additionally visit the plesk interface anymore * +* ------------------------------------------------------------------------- * +* 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; version 2 of the License. * +\***************************************************************************/ +/* $Id$ */ + +include_once(EGW_SERVER_ROOT."/emailadmin/inc/class.defaultimap.inc.php"); + +class pleskimap extends defaultimap +{ + /** + * @var string $psa_mail_script full path to Plesk's mail.sh (Linux including sudo!) or mail.exe (Windows) interface + */ + var $psa_mail_script = '/usr/bin/sudo /usr/local/psa/bin/mail.sh'; // 'C:/psa/bin/mail.exe' + /** + * @var boolean $allways_create_mailbox true = allways create a mailbox on user creation, + * false = only if a local email (no forward) is given. To use felamimail you need a mailbox! + */ + var $allways_create_mailbox = true; + /** + * @var array $create_folders=array('Send','Trash') folders to automatic create and subscribe on account creation + */ + var $create_folders = array('Sent','Trash'); + /** + * @var string/boolean $error string with last error-message or false + */ + var $error = false; + + /** + * Create a full mailbox or just forward, depending on the given email address + * If email matches the default domain, we create a full mailbox, otherwise we create a forward + * + * @param array $hookValues + * @param string $action='create' + * @return boolean true on success, false otherwise + */ + function addAccount($hookValues,$action='create') + { + //echo "

pleskimap::addAccount(".print_r($hookValues,true).")

\n"; + + $defaultDomain = $this->profileData['defaultDomain'] ? $this->profileData['defaultDomain'] : + $GLOBALS['egw_info']['server']['mail_suffix']; + + $localEmail = $hookValues['account_lid'].'@'.$defaultDomain; + $aliases = $forwards = array(); + + // is the given email a local address from our default domain? + if (substr($hookValues['account_email'],-1-strlen($defaultDomain)) != '@'.$defaultDomain) + { + $forwards[] = $hookValues['account_email']; + } + elseif ($hookValues['account_email'] != $localEmail) + { + $aliases[] = $hookValues['account_email']; + } + // add a default alias with Firstname.Lastname + if (!in_array($alias=$hookValues['account_firstname'].'.'.$hookValues['account_lastname'],$aliases) && + $this->is_email($alias)) + { + $aliases[] = $alias; + } + $info = $this->plesk_mail($action,$hookValues['account_lid'],$hookValues['account_passwd'], + $action != 'create' && !$aliases ? null : $aliases,$forwards,$this->allways_create_mailbox); + + if (!$info['SUCCESS']) return false; + + if ($forwards && !$this->allways_create_mailbox) return true; // no mailbox created, only a forward + + // create Sent & Trash mailboxes and subscribe them + if(($mbox = @imap_open ($this->getMailboxString(),$localEmail,$hookValues['account_passwd']))) + { + $list = imap_getmailboxes($mbox, $this->getMailboxString(),'INBOX'); + $delimiter = isset($list[0]->delimiter) ? $list[0]->delimiter : '.'; + imap_subscribe($mbox,$this->getMailboxString('INBOX')); + + foreach($this->create_folders as $folder) + { + $mailBoxName = 'INBOX'.$delimiter.$folder; + if(imap_createmailbox($mbox,imap_utf7_encode('{'.$this->profileData['imapServer'].'}'.$mailBoxName))) + { + imap_subscribe($mbox,$this->getMailboxString($mailBoxName)); + } + } + imap_close($mbox); + } + return true; + } + + function deleteAccount($hookValues) + { + //echo "

pleskimap::deleteAccount(".print_r($hookValues,true).")

\n"; + + return $this->plesk_mail('remove',$hookValues['account_lid']); + } + + function updateAccount($hookValues) + { + //echo "

pleskimap::updateAccount(".print_r($hookValues,true).")

\n"; + + if($hookValues['account_lid'] != $hookValues['old_loginid']) + { + $this->error = lang("Plesk can't rename users --> request ignored"); + return false; + } + return $this->addAccount($hookValues,'update'); + } + + /** + * Read data from the mail account + * + * @param string/int $accountID + * @return array/boolean with keys mailLocalAddress, mailAlternateAddress, accountStatus, mailRoutingAddress, ... or false if not found + */ + function getUserData($accountID) + { + //echo "

pleskimap::getUserData('$accountID')

\n"; + + if (!($info = $this->plesk_mail('info',$accountID))) return false; + //_debug_array($info); + + $data = array( + 'mailLocalAddress' => $info['Mailname'].'@'.$info['Domain'], + 'mailAlternateAddress' => $info['Alias(es)'] ? explode(' ',$info['Alias(es)']) : array(), + 'accountStatus' => $info['Mailbox'] == 'true' || $info['Redirect'] == 'true' ? 'active' : 'disabled', + 'mailRoutingAddress' => $info['Redirect address'] ? explode(' ',$info['Redirect address']) : false, + 'deliveryMode' => $info['Redirect'] == 'true' && $info['Mailbox'] == 'false' ? 'forwardOnly' : '', +// 'qmailDotMode' => false, +// 'deliveryProgramPath' => false, + 'quotaLimit' => $info['Mbox quota'] == 'Unlimited' ? '' : $info['Mbox quota']/1024.0, + ); + //_debug_array($data); + return $data; + } + + /** + * Save mail account data + * + * @param string/int $accountID + * @param array $accountData with keys mailLocalAddress, mailAlternateAddress, accountStatus, mailRoutingAddress, ... + * @return boolean true on success, false otherwise + */ + function saveUserData($accountID, $accountData) + { + //echo "

pleskimap::saveUserData('$accountID',".print_r($accountData,true).")

\n"; + + // not used: $accountData['accountStatus']=='active', $accountData['qmailDotMode'], $accountData['deliveryProgramPath'] + $info = $this->plesk_mail('update',$accountID,null, + $accountData['mailAlternateAddress'] ? $accountData['mailAlternateAddress'] : array(), + $accountData['mailRoutingAddress'] ? $accountData['mailRoutingAddress'] : array(), + empty($accountData['deliveryMode']), + 1024*(float)$accountData['quotaLimit'],$accountData['accountStatus']=='active'); + + if (!$info['SUCCSESS']) + { + if ($info) $this->error = implode(', ',$info); + return false; + } + return true; + } + + /** + * call plesk's mail command line interface + * + * Usage: mail.sh command [options] + * + * Available commands: + * --create or -c @ creates mail account + * --update or -u @ updates mail account parameters + * --remove or -r @ removes mail account + * --info or -i @ retrieves mail account information + * --on enables mail service for domain + * --off disables mail service for domain + * --help or -h displays this help page + * + * Available options: + * -cp_access enables control panel access (default: + * true) + * -mailbox creates/removes mailbox + * -passwd sets mailbox password [see the note + * below for details] + * -boxpass obsolete alias for option "passwd" + * (this option may be removed from + * future releases) + * -passwd_type specifies the type of mailbox + * password, ignored if no password + * specified [see the note below for + * details] + * -mbox_quota limits the mailbox quota to the + * desired amount + * -boxquota obsolete alias for option "mbox_quota" + * (this option may be removed from + * future releases) + * -aliases : adds or deletes mail + * alias(es) to/from mailname + * -mgroups : adds or removes mail name + * to/from mail group + * -redirect switches mail redirect on/off + * -rediraddr sets redirect to address (required if + * redirect is enabled) + * -group switches mail group on/off + * -groupmem : adds/removes address(-es) + * to/from mail group + * -repo : adds/removes file to/from + * attachments repository + * [deprecated, use + * autoresponder.sh] + * -autorsp switches all autoresponders on/off + * [deprecated, use autoresponder.sh] + * -autoname autoresponder name (required for all + * autoresponder options) [deprecated, + * use autoresponder.sh] + * -autostatus switches on/off autoresponder with + * specified name (true) [deprecated, + * use autoresponder.sh] + * -autoreq : or defines the condition + * for the autoresponder + * to be activated + * whether the + * specified pattern is + * encountered in the + * subject or body, or + * to respond always + * [deprecated, use + * autoresponder.sh] + * -autosubj the subject line to be set up into + * autoresponder ("Re: ") or a custom string + * [deprecated, use autoresponder.sh] + * -auto_replyto return address that will be set up + * into the autoresponder's messages + * [deprecated, use autoresponder.sh] + * -autotext autoresponder message text + * [deprecated, use autoresponder.sh] + * -autoatch : adds/removes autoresponder + * attachment files + * [deprecated, use + * autoresponder.sh] + * -autofrq defines the maximum number of + * responses to a unique e-mail address + * per day [deprecated, use + * autoresponder.sh] + * -autostor defines the number of unique addresses + * to be stored for autoresponder + * [deprecated, use autoresponder.sh] + * -autored defines the e-mail address to forward + * all incoming mail to [deprecated, use + * autoresponder.sh] + * -multiple-sessions allow multiple sessions + * + * Note: + * For security reasons, you can transfer not encrypted passwords via environment + * variable PSA_PASSWORD, by specifying the empty value in the command line for + * the passwd arguments (like " -passwd ''") and setting the password value in + * the PSA_PASSWORD variable. + * Similarly, you can transfer the crypted password via the environment variable + * PSA_CRYPTED_PASSWORD, by specifying the empty value in the command line for + * the passwd arguments (like " -passwd ''") and by setting the password value in + * the PSA_CRYPTED_PASSWORD variable. + * + * Version: psa v7.5.0_build75041208.07 os_SuSE 9.1 + * + * mail.sh --info account@domain.com + * Mailname: account + * Domain: domain.com + * Alias(es): Firstname.Lastname + * CP Access: true + * Mailbox: true + * Password: geheim + * Password type: plain + * Mbox quota: Unlimited + * Redirect: false + * Mailgroup: false + * File repository: Empty + * Autoresponder: false + * Antivirus mail + * checking: Disabled + * + * SUCCESS: Gathering information for 'account@domain.com' complete + * + * mail.sh --info bogus@domain.com + * An error occured during getting mailname information: Mailname 'bogus@domain.com' doesn't exists + * + * @param string $action 'info', 'create', 'update' or 'remove' + * @param string/int $account account_lid or numerical account_id + * @param string $password=null string with password or null to not change + * @param array $aliases=null array with aliases or null to not change the aliases + * @param array $forwards=null array of email address to forward or null to not change + * @param boolean $keepLocalCopy=null if forwarding keep a local copy or not, null = dont change + * @param int $quota_kb=null mailbox quota in kb + * @return boolean/array array with returned values or false otherwise, error-message in $this->error + */ + function plesk_mail($action,$account,$password=null,$aliases=null,$forwards=null,$keepLocalCopy=null,$quota_kb=null) + { + //echo "

smtpplesk::plesk_mail('$action','$account','$password',".print_r($aliases,true).",".print_r($forwards,true).",".(is_null($keepLocalCopy)?'':(int)$keepLocalCopy).",$quota_kb)

\n"; + + $this->error = false; + + if (is_numeric($account)) + { + $account_lid = $GLOBALS['egw']->accounts->id2name($account); + } + elseif ($GLOBALS['egw']->accounts->name2id($account)) + { + $account_lid = $account; + } + if (!$account_lid) + { + $this->error = lang("Account '%1' not found !!!",$account); + return false; + } + if (!in_array($action,array('info','create','update','remove'))) + { + $this->error = lang("Unsupported action '%1' !!!",$action); + return false; + } + $defaultDomain = $this->profileData['defaultDomain'] ? $this->profileData['defaultDomain'] : + $GLOBALS['egw_info']['server']['mail_suffix']; + + if ($action == 'update' && !($info = $this->plesk_mail('info',$account))) + { + $action = 'create'; // mail-account does not yet exist --> create it + } + $localEmail = $account_lid.'@'.$defaultDomain; + $script = $this->psa_mail_script . ' --'.$action . ' ' . $localEmail; + + if ($action != 'info') + { + // invalidate our cache + $GLOBALS['egw']->session->appsession('plesk-email-'.$account_lid,'emailadmin',false); + + // we dont set passwords shorten then 5 chars, as it only give an error in plesk + if (!is_null($password) && $password) + { + if (strlen($password) < 5 || strpos($password,$account_lid) !== false) + { + $this->error = lang('Plesk requires passwords to have at least 5 characters and not contain the account-name --> password NOT set!!!'); + } + else + { + $script .= ' -passwd \''.str_replace('\'','\\\'',$password).'\' -passwd_type plain'; + } + } + if ($action == 'create' || !is_null($forwards) || !is_null($keepLocalCopy)) + { + $script .= ' -mailbox '.(!$forwards || $keepLocalCopy ? 'true' : 'false'); + } + // plesk allows only one forwarding address, we ignore everything but the first + if (!is_null($forwards) && (!$forwards || $this->is_email($forwards[0]))) + { + $script .= ' -redirect '.(!$forwards ? 'false' : 'true -rediraddr '.$forwards[0]); + } + if ($action == 'update') + { + if (!is_null($aliases)) + { + $existing_aliases = explode(' ',$info['Alias(es)']); // without domain! + $delete_aliases = array(); + foreach($existing_aliases as $alias) + { + if ($alias && !in_array($alias,$aliases) && !in_array($alias.'@'.$defaultDomain,$aliases)) + { + $delete_aliases[] = $alias; + } + } + if ($delete_aliases) + { + $script .= ' -aliases del:'.implode(',',$delete_aliases); + } + foreach($aliases as $n => $alias) + { + if (in_array($alias,$existing_aliases) || in_array(str_replace('@'.$defaultDomain,'',$alias),$existing_aliases)) + { + unset($aliases[$n]); // no change + } + } + } + } + if (!is_null($aliases) && count($aliases)) + { + foreach($aliases as $alias) + { + if (!$this->is_email($alias)) return false; // security precausion + } + $script .= ' -aliases add:'.str_replace('@'.$defaultDomain,'',implode(',',$aliases)); + } + if (!is_null($quota_kb) && (int)$quota_kb) + { + $script .= ' -mbox_quota '.(int)$quota_kb; + } + } + //echo "

$script

\n"; + if (!($fp = popen($script.' 2>&1','r'))) + { + $this->error = lang("Plesk mail script '%1' not found !!!",$this->psa_mail_script); + return false; + } + $values = array(); + while(!feof($fp)) + { + $line = trim(fgets($fp)); + list($name,$value) = preg_split('/: */',$line,2); + if (!is_null($value) && strpos($name,'An error occured') === false && $name) + { + $values[$name] = $value; + } + elseif ($line) + { + $values[] = $line; + } + } + pclose($fp); + + if (!$values['SUCCESS']) + { + $this->error = implode(', ',$values); + return false; + } + return $values; + } + + /** + * checks for valid email addresse (local mail address dont need a domain!) + * + * Important as we run shell scripts with the address and one could try to run arbitrary commands this way!!! + * We only allow letters a-z, numbers and the following other chars: _ . - @ + * + * @return boolean + */ + function is_email($email) + { + return preg_match('/^[@a-z0-9_.-]+$/i',$email); + } +} diff --git a/emailadmin/inc/class.postfixdbmailuser.inc.php b/emailadmin/inc/class.postfixdbmailuser.inc.php new file mode 100755 index 0000000000..df75f21471 --- /dev/null +++ b/emailadmin/inc/class.postfixdbmailuser.inc.php @@ -0,0 +1,87 @@ + + * @copyright (c) 2010 by Ralf Becker + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ + +/** + * Postfix with dbmailUser schema + */ +class postfixdbmailuser extends emailadmin_smtp_ldap +//class emailadmin_smtp_dbmailuser extends emailadmin_smtp_ldap +{ + /** + * Name of schema, has to be the correct case! + */ + const SCHEMA = 'dbmailUser'; + + /** + * Attribute to enable mail for an account, OR false if existence of ALIAS_ATTR is enough for mail delivery + */ + const MAIL_ENABLE_ATTR = 'accountstatus'; + /** + * Attribute value to enable mail for an account, OR false if existense of attribute is enough to enable account + */ + const MAIL_ENABLED = 'active'; + + /** + * Attribute for aliases OR false to use mail + */ + const ALIAS_ATTR = 'mailalternateaddress'; + + /** + * Primary mail address required as an alias too: true or false + */ + const REQUIRE_MAIL_AS_ALIAS=false; + + /** + * Attribute for forwards OR false if not possible + */ + const FORWARD_ATTR = 'mailforwardingaddress'; + + /** + * Attribute to only forward mail, OR false if not available + */ + const FORWARD_ONLY_ATTR = 'deliverymode'; + /** + * Attribute value to only forward mail + */ + const FORWARD_ONLY = 'forwardOnly'; + + /** + * Attribute for mailbox, to which mail gets delivered OR false if not supported + */ + //const MAILBOX_ATTR = 'deliveryprogrampath'; + //const MAILBOX_ATTR = 'dbmailuid'; + const MAILBOX_ATTR = false; + + /** + * Log all LDAP writes / actions to error_log + */ + var $debug = false; + + /** + * LDAP schema configuration + * + * Parent can NOT use constants direct as we have no late static binding in currenlty required PHP 5.2 + * + * @var array + */ + protected $config = array( + 'schema' => self::SCHEMA, + 'mail_enable_attr' => self::MAIL_ENABLE_ATTR, + 'mail_enabled' => self::MAIL_ENABLED, + 'alias_attr' => self::ALIAS_ATTR, + 'require_mail_as_alias' => self::REQUIRE_MAIL_AS_ALIAS, + 'forward_attr' => self::FORWARD_ATTR, + 'forward_only_attr' => self::FORWARD_ONLY_ATTR, + 'forward_only' => self::FORWARD_ONLY, + 'mailbox_attr' => self::MAILBOX_ATTR, + ); +} diff --git a/emailadmin/inc/class.postfixinetorgperson.inc.php b/emailadmin/inc/class.postfixinetorgperson.inc.php new file mode 100644 index 0000000000..39f66f2dd0 --- /dev/null +++ b/emailadmin/inc/class.postfixinetorgperson.inc.php @@ -0,0 +1,16 @@ + + * @copyright (c) 2010 by Ralf Becker + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ + +/** + * Postfix with old qmailUser schema + */ +class postfixldap extends emailadmin_smtp_ldap +//class emailadmin_smtp_qmailuser extends emailadmin_smtp_ldap +{ + /** + * Name of schema, has to be in the right case! + */ + const SCHEMA = 'qmailUser'; + + /** + * Attribute to enable mail for an account, OR false if existence of ALIAS_ATTR is enough for mail delivery + */ + const MAIL_ENABLE_ATTR = 'accountstatus'; + /** + * Attribute value to enable mail for an account, OR false if existense of attribute is enough to enable account + */ + const MAIL_ENABLED = 'active'; + + /** + * Attribute for aliases OR false to use mail + */ + const ALIAS_ATTR = 'mailalternateaddress'; + + /** + * Primary mail address required as an alias too: true or false + */ + const REQUIRE_MAIL_AS_ALIAS=false; + + /** + * Attribute for forwards OR false if not possible + */ + const FORWARD_ATTR = 'mailforwardingaddress'; + + /** + * Attribute to only forward mail, OR false if not available + */ + const FORWARD_ONLY_ATTR = 'deliverymode'; + /** + * Attribute value to only forward mail + */ + const FORWARD_ONLY = 'forwardOnly'; + + /** + * Attribute for mailbox, to which mail gets delivered OR false if not supported + */ + const MAILBOX_ATTR = 'mailmessagestore'; + + /** + * Log all LDAP writes / actions to error_log + */ + var $debug = false; + + /** + * LDAP schema configuration + * + * Parent can NOT use constants direct as we have no late static binding in currenlty required PHP 5.2 + * + * @var array + */ + protected $config = array( + 'schema' => self::SCHEMA, + 'mail_enable_attr' => self::MAIL_ENABLE_ATTR, + 'mail_enabled' => self::MAIL_ENABLED, + 'alias_attr' => self::ALIAS_ATTR, + 'require_mail_as_alias' => self::REQUIRE_MAIL_AS_ALIAS, + 'forward_attr' => self::FORWARD_ATTR, + 'forward_only_attr' => self::FORWARD_ONLY_ATTR, + 'forward_only' => self::FORWARD_ONLY, + 'mailbox_attr' => self::MAILBOX_ATTR, + ); +} diff --git a/emailadmin/inc/class.smtpplesk.inc.php b/emailadmin/inc/class.smtpplesk.inc.php new file mode 100644 index 0000000000..50c07525a5 --- /dev/null +++ b/emailadmin/inc/class.smtpplesk.inc.php @@ -0,0 +1,93 @@ + as with the "LDAP, Postfix & Cyrus" plugin the plesk one creates mail * +* users and manages passwords, aliases, forwards and quota from within * +* eGroupWare - no need to additionally visit the plesk interface anymore * +* ------------------------------------------------------------------------- * +* 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. * +\***************************************************************************/ +/* $Id$ */ + +include_once(EGW_SERVER_ROOT."/emailadmin/inc/class.defaultsmtp.inc.php"); +include_once(EGW_SERVER_ROOT."/emailadmin/inc/class.pleskimap.inc.php"); + +class smtpplesk extends defaultsmtp +{ + /** + * @var string/boolean $error string with last error-message or false + */ + var $error = false; + + /** + * call plesk's mail command line interface + * + * The actual code is in the pleskimap class, to not double it. + * + * @param string $action 'info', 'create', 'update' or 'remove' + * @param string/int $account account_lid or numerical account_id + * @param string $password=null string with password or null to not change + * @param array $aliases=null array with aliases or null to not change the aliases + * @param string/boolean $forward=null email address to forward, false to not forward or null to not change + * @param boolean $keepLocalCopy=null if forwarding keep a local copy or not, null = dont change + * @param int $quota_kb=null mailbox quota in kb + * @return boolean/array array with returned values or false otherwise, error-message in $this->error + */ + function plesk_mail($action,$account,$password=null,$aliases=null,$forward=null,$keepLocalCopy=null,$quota_kb=null) + { + static $plesk; + if (!is_object($plesk)) + { + $plesk = new pleskimap(null); + $this->error =& $plesk->error; + } + return $plesk->plesk_mail($action,$account,$password,$aliases,$forward,$keepLocalCopy,$quota_kb); + } + + function addAccount($hookValues) + { + // account is added via pleskimap::addAccount(); + } + + /** + * Returns the email address of the current user + * + * @param string/int $accountName account-id or -lis (name) + * @return array of arrays with keys name, address and type={default|alternate} + */ + function getAccountEmailAddress() + { + //echo "

smtpplesk::getAccountEmailAddress()

\n"; + + return array(array( + 'name' => $GLOBALS['egw_info']['user']['fullname'], + 'address' => $GLOBALS['egw_info']['user']['email'], + 'type' => 'default' + )); + } + + /** + * Save SMTP forwarding address + * + * @param int $accountID user-id + * @param string $forwardingAddress email to forward to + * @param string $keepLocalCopy 'yes' or something else + */ + function saveSMTPForwarding($accountID, $forwardingAddress, $keepLocalCopy) + { + //echo "

smtpplesk::saveSMTPForwarding('$accountID','$forwardingAddress','$keepLocalCopy')

\n"; + + return $this->plesk_mail('update',$accountID,null,null,array($forwardingAddress),$keepLocalCopy == 'yes'); + } +} diff --git a/emailadmin/inc/class.uiuserdata.inc.php b/emailadmin/inc/class.uiuserdata.inc.php new file mode 100644 index 0000000000..4370657457 --- /dev/null +++ b/emailadmin/inc/class.uiuserdata.inc.php @@ -0,0 +1,207 @@ + True, + 'saveUserData' => True + ); + + function uiuserdata() + { + $this->t =& CreateObject('phpgwapi.Template',EGW_APP_TPL); + $this->boemailadmin = new emailadmin_bo(); + } + + function display_app_header() + { + $GLOBALS['egw']->js->validate_file('jscode','editUserdata','emailadmin'); + $GLOBALS['egw_info']['flags']['include_xajax'] = True; + + $GLOBALS['egw']->common->egw_header(); + echo parse_navbar(); + } + + function editUserData($_useCache='0') + { + $accountID = $_GET['account_id']; + $GLOBALS['account_id'] = $accountID; + + $this->display_app_header(); + + $this->translate(); + + $this->t->set_file(array("editUserData" => "edituserdata.tpl")); + $this->t->set_block('editUserData','form','form'); + $this->t->set_block('editUserData','link_row','link_row'); + $this->t->set_var("th_bg",$GLOBALS['egw_info']["theme"]["th_bg"]); + $this->t->set_var("tr_color1",$GLOBALS['egw_info']["theme"]["row_on"]); + $this->t->set_var("tr_color2",$GLOBALS['egw_info']["theme"]["row_off"]); + + $this->t->set_var("lang_email_config",lang("edit email settings")); + $this->t->set_var("lang_emailAddress",lang("email address")); + $this->t->set_var("lang_emailaccount_active",lang("email account active")); + $this->t->set_var("lang_mailAlternateAddress",lang("alternate email address")); + $this->t->set_var("lang_mailRoutingAddress",lang("forward email's to")); + $this->t->set_var("lang_forward_also_to",lang("forward also to")); + $this->t->set_var("lang_button",lang("save")); + $this->t->set_var("lang_deliver_extern",lang("deliver extern")); + $this->t->set_var("lang_deliver_extern",lang("deliver extern")); + $this->t->set_var("lang_edit_email_settings",lang("edit email settings")); + $this->t->set_var("lang_ready",lang("Done")); + $this->t->set_var("link_back",$GLOBALS['egw']->link('/admin/accounts.php')); + + $linkData = array + ( + 'menuaction' => 'emailadmin.uiuserdata.saveUserData', + 'account_id' => $accountID + ); + $this->t->set_var("form_action", $GLOBALS['egw']->link('/index.php',$linkData)); + + $this->t->set_var('url_image_add',$GLOBALS['egw']->common->image('phpgwapi','new')); + $this->t->set_var('url_image_edit',$GLOBALS['egw']->common->image('phpgwapi','edit')); + $this->t->set_var('url_image_delete',$GLOBALS['egw']->common->image('phpgwapi','delete')); + + // only when we show a existing user + if($userData = $this->boemailadmin->getUserData($accountID)) { + $addresses = array(); + foreach((array)$userData['mailAlternateAddress'] as $data) { + $addresses[$data] = $data; + } + $this->t->set_var('selectbox_mailAlternateAddress', html::select( + 'mailAlternateAddress', + '', + $addresses, + true, + "style='width: 100%;' id='mailAlternateAddress'", + 5) + ); + + $addresses = array(); + foreach((array)$userData['mailForwardingAddress'] as $data) { + $addresses[$data] = $data; + } + $this->t->set_var('selectbox_mailRoutingAddress', html::select( + 'mailForwardingAddress', + '', + $addresses, + true, + "style='width: 100%;' id='mailRoutingAddress'", + 5) + ); + + $this->t->set_var("quotaLimit",$userData["quotaLimit"]); + + $this->t->set_var("mailLocalAddress",$userData["mailLocalAddress"]); + $this->t->set_var("mailAlternateAddress",''); + $this->t->set_var("mailRoutingAddress",''); + $this->t->set_var("selected_".$userData["qmailDotMode"],'selected'); + $this->t->set_var("deliveryProgramPath",$userData["deliveryProgramPath"]); + + $this->t->set_var("uid",rawurlencode($_accountData["dn"])); + if ($userData["accountStatus"] == "active") + $this->t->set_var("account_checked","checked"); + if ($userData["deliveryMode"] == "forwardOnly") + $this->t->set_var("forwardOnly_checked","checked"); + if ($_accountData["deliverExtern"] == "active") + $this->t->set_var("deliver_checked","checked"); + } else { + $this->t->set_var("mailLocalAddress",''); + $this->t->set_var("mailAlternateAddress",''); + $this->t->set_var("mailRoutingAddress",''); + $this->t->set_var("options_mailAlternateAddress",lang('no alternate email address')); + $this->t->set_var("options_mailRoutingAddress",lang('no forwarding email address')); + $this->t->set_var("account_checked",''); + $this->t->set_var("forwardOnly_checked",''); + + $this->t->set_var('selectbox_mailAlternateAddress', html::select( + 'mailAlternateAddress', + '', + array(), + true, + "style='width: 100%;' id='mailAlternateAddress'", + 5) + ); + + $this->t->set_var('selectbox_mailRoutingAddress', html::select( + 'mailForwardingAddress', + '', + array(), + true, + "style='width: 100%;' id='mailRoutingAddress'", + 5) + ); + + $this->t->set_var('quotaLimit',''); + } + + // create the menu on the left, if needed + $menuClass =& CreateObject('admin.uimenuclass'); + $this->t->set_var('rows',$menuClass->createHTMLCode('edit_user')); + + $this->t->pparse("out","form"); + + } + + function saveUserData() + { + if($_POST["accountStatus"] == "on") { + $accountStatus = "active"; + } + + if($_POST["forwardOnly"] == "on") { + $deliveryMode = "forwardOnly"; + } + + $formData = array ( + 'mailLocalAddress' => $_POST["mailLocalAddress"], + 'mailAlternateAddress' => $_POST["mailAlternateAddress"], + 'mailForwardingAddress' => $_POST["mailForwardingAddress"], + 'quotaLimit' => $_POST["quotaLimit"], + 'qmailDotMode' => $_POST["qmailDotMode"], + 'deliveryProgramPath' => $_POST["deliveryProgramPath"], + 'accountStatus' => $accountStatus, + 'deliveryMode' => $deliveryMode + ); + + $this->boemailadmin->saveUserData($_GET['account_id'], $formData); + + // read date fresh from ldap storage + $this->editUserData(); + } + + function translate() + { + $this->t->set_var('th_bg',$GLOBALS['egw_info']['theme']['th_bg']); + + $this->t->set_var('lang_add',lang('add')); + $this->t->set_var('lang_done',lang('Done')); + $this->t->set_var('lang_remove',lang('remove')); + $this->t->set_var('lang_remove',lang('remove')); + $this->t->set_var('lang_advanced_options',lang('advanced options')); + $this->t->set_var('lang_qmaildotmode',lang('qmaildotmode')); + $this->t->set_var('lang_default',lang('default')); + $this->t->set_var('lang_quota_settings',lang('quota settings')); + $this->t->set_var('lang_qoutainmbyte',lang('qouta size in MByte')); + $this->t->set_var('lang_inmbyte',lang('in MByte')); + $this->t->set_var('lang_0forunlimited',lang('leave empty for no quota')); + $this->t->set_var('lang_forward_only',lang('forward only')); + $this->t->set_var('lang_enter_new_address',lang('Add new email address:')); + $this->t->set_var('lang_update_current_address',lang('Update current email address:')); + } + } +?> diff --git a/emailadmin/index.php b/emailadmin/index.php new file mode 100644 index 0000000000..ca0c5b8181 --- /dev/null +++ b/emailadmin/index.php @@ -0,0 +1,13 @@ + + * @copyright (c) 2009-10 by Klaus Leithoff + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + \***************************************************************************/ + +header('Location: ../index.php?menuaction=emailadmin.emailadmin_ui.index'. + (isset($_GET['sessionid']) ? '&sessionid='.$_GET['sessionid'].'&kp3='.$_GET['kp3'] : '')); diff --git a/emailadmin/js/jscode/editProfile.js b/emailadmin/js/jscode/editProfile.js new file mode 100644 index 0000000000..8adf90b38c --- /dev/null +++ b/emailadmin/js/jscode/editProfile.js @@ -0,0 +1,42 @@ +var tab = new Tabs(5,'activetab','inactivetab','tab','tabcontent','','','tabpage'); +var smtp = new Tabs(5,'activetab','inactivetab','smtp','smtpcontent','smtpselector','',''); +var imap = new Tabs(6,'activetab','inactivetab','imap','imapcontent','imapselector','',''); + +function initAll() { + tab.init(); + smtp.init(); + imap.init(); + var imapType = document.getElementsByName("imapsettings[imapType]")[0]; + var v=imapType.value; imap.display(imapType.value); imapType.value=v; + onchange_imapsettings(v, 'imapLoginType'); +} + +function ea_setIMAPDefaults(_imapType) { + var currentInput = document.getElementsByName("imapsettings[" + _imapType + "][imapPort]")[0]; + onchange_imapsettings(_imapType, 'imapLoginType'); + if(_imapType > 1) { + // imap + if(currentInput.value == '110') { + currentInput.value = '143'; + } + } else { + // pop3 + if(currentInput.value == '143') { + currentInput.value = '110'; + } + } +} + +function onchange_imapsettings(_imapType,_varname) { + var currentAuthType = document.getElementsByName("imapsettings[" + _imapType + "][" + _varname + "]")[0]; + var imapuser = document.getElementsByName("imapsettings[" + _imapType + "][imapAuthUsername]")[0]; + var imappw = document.getElementsByName("imapsettings[" + _imapType + "][imapAuthPassword]")[0]; + + if (currentAuthType.value == "admin") { + imapuser.disabled = false; + imappw.disabled = false; + } else { + imapuser.disabled=true; + imappw.disabled=true; + } +} diff --git a/emailadmin/js/jscode/editUserdata.js b/emailadmin/js/jscode/editUserdata.js new file mode 100644 index 0000000000..452540d869 --- /dev/null +++ b/emailadmin/js/jscode/editUserdata.js @@ -0,0 +1,59 @@ +function addRow(_selectBoxName, _prompt) { + result = prompt(_prompt, ''); + + if((result == '') || (result == null)) { + return false; + } + + var newOption = new Option(result, result); + + selectBox = document.getElementById(_selectBoxName); + var length = selectBox.length; + + selectBox.options[length] = newOption; + selectBox.selectedIndex = length; +} + +function editRow(_selectBoxName, _prompt) { + selectBox = document.getElementById(_selectBoxName); + + selectedItem = selectBox.selectedIndex; + + if(selectedItem != null && selectedItem != -1) { + value = selectBox.options[selectedItem].text; + result = prompt(_prompt, value); + + if((result == '') || (result == null)) { + return false; + } + + var newOption = new Option(result, result); + + selectBox.options[selectedItem] = newOption; + selectBox.selectedIndex = selectedItem; + } +} + +function removeRow(_selectBoxName) { + selectBox = document.getElementById(_selectBoxName); + + selectedItem = selectBox.selectedIndex; + if(selectedItem != null) { + selectBox.options[selectedItem] = null; + } + selectedItem--; + if(selectedItem >= 0) { + selectBox.selectedIndex = selectedItem; + } else if (selectBox.length > 0) { + selectBox.selectedIndex = 0; + } +} + +function selectAllOptions(_selectBoxName) { + selectBox = document.getElementById(_selectBoxName); + + for(var i=0;i0) + order = order + ','; + order = order + inputElements[i].id; + } + + return order; +} + +function moveUp(node) { + // get the row node + thisRow = node.parentNode.parentNode; + if(thisRow.previousSibling) + { + currentNode = thisRow.previousSibling; + while(currentNode.nodeType != 1) + { + if(!currentNode.previousSibling) + return; + currentNode = currentNode.previousSibling; + } + thisRow.parentNode.insertBefore(thisRow,currentNode); + + //getOrder('tabel1'); + } +} + +function moveDown(node) { + // get the row node + thisRow = node.parentNode.parentNode; + if(thisRow.nextSibling) + { + currentNode = thisRow.nextSibling; + while(currentNode.nodeType != 1) + { + if(!currentNode.nextSibling) + return; + currentNode = currentNode.nextSibling; + } + thisRow.parentNode.insertBefore(currentNode,thisRow); + + //getOrder('tabel1'); + } +} + +function saveOrder() +{ + xajax_doXMLHTTP("emailadmin.ajaxemailadmin.setOrder", getOrder('nextMatchBody')); +} diff --git a/emailadmin/lang/egw_ca.lang b/emailadmin/lang/egw_ca.lang new file mode 100644 index 0000000000..bbe976983b --- /dev/null +++ b/emailadmin/lang/egw_ca.lang @@ -0,0 +1,68 @@ +add profile emailadmin ca Afegir perfil +admin dn emailadmin ca dn del administrador +admin password emailadmin ca Contrasenya del administrador +admin username emailadmin ca Mom d'usuari del administrador +advanced options emailadmin ca Opcions avançades +alternate email address emailadmin ca Adreça de correu alternativa +cyrus imap server emailadmin ca Servidor IMAP Cyrus +cyrus imap server administration emailadmin ca Administració del servidor IMAP Cyrus +default emailadmin ca predeterminada +deliver extern emailadmin ca entrega externa +do you really want to delete this profile emailadmin ca Realmente voleu esborrar aquest perfil? +domainname emailadmin ca Nom del domini +edit email settings emailadmin ca Editar configuració del compte +email account active emailadmin ca Compte de correu electrònic actiu +email address emailadmin ca Adreça de correu electrònic +enable cyrus imap server administration emailadmin ca activar administració del servidor Cyrus IMAP +enable sieve emailadmin ca Activar Sieve +enter your default mail domain (from: user@domain) emailadmin ca Entreu el domini predeterminat (de usuari@domini) +forward also to emailadmin ca Reenviar també a +forward email's to emailadmin ca Reenviar correus a +forward only emailadmin ca Només reenviar +imap admin password admin ca Contrasenya de l'administrador IMAP +imap admin user admin ca Usuari administrador IMAP +imap c-client version < 2001 emailadmin ca Versió C-Client IMAP < 2001 +imap server hostname or ip address emailadmin ca Servidor IMAP o adreça IP +imap server logintyp emailadmin ca Tipus de sessió del servidor IMAP +imap server port emailadmin ca Port del servidor IMAP +imap/pop3 server name emailadmin ca Nom del servidor POP/IMAP +in mbyte emailadmin ca en MBytes +ldap basedn emailadmin ca basedn per a LDAP +ldap server emailadmin ca Aervidor LDAP +ldap server accounts dn emailadmin ca Comptes DN del servidor LDAP +ldap server admin dn emailadmin ca Administrador DN del servidor LDAP +ldap server admin password emailadmin ca Contrasenya del administrador del servidor LDAP +ldap server hostname or ip address emailadmin ca Nom del servidor LDAP o adreça IP +ldap settings emailadmin ca Configuració LDAP +leave empty for no quota emailadmin ca Deixar en blanc per a no posar quota +mail settings admin ca Configuració del correu +name of organisation emailadmin ca Nom de l'organització +no alternate email address emailadmin ca sense adreça de correu alternativa +no forwarding email address emailadmin ca sense adreça de correu per a reenviar +pop3 server hostname or ip address emailadmin ca Nom del servidor POP3 o adreça IP +pop3 server port emailadmin ca Port del servidor POP3 +postfix with ldap emailadmin ca Postfix amb LDAP +profile list emailadmin ca Llista de perfils +profile name emailadmin ca Nom del perfil +qmaildotmode emailadmin ca Modus de punt de qmail +qouta size in mbyte emailadmin ca Mida de la quota en MBytes +quota settings emailadmin ca Configuració de les quotas +remove emailadmin ca Esborrar +select type of imap/pop3 server emailadmin ca Seleccioneu el tipus de servidor IMAP/POP3 +select type of smtp server emailadmin ca Seleccioneu el tipus de servidor SMTP +sieve server hostname or ip address emailadmin ca Nom del servidor Sieve o adreça IP +sieve server port emailadmin ca Port del servidor Sieve +sieve settings emailadmin ca Configuració de Sieve +smtp server name emailadmin ca Nom del servidor SMTP +smtp-server hostname or ip address emailadmin ca Nom del servidor SMTP o adreça IP +smtp-server port emailadmin ca Port del servidor SMTP +standard emailadmin ca Estàndar +standard imap server emailadmin ca Servidor IMAP estàndar +standard pop3 server emailadmin ca Servidor POP3 estàndar +standard smtp-server emailadmin ca Servidor SMTP estàndar +use ldap defaults emailadmin ca Usar les opcions predeterminades per LDAP +use smtp auth emailadmin ca Usar identificació SMTP +use tls authentication emailadmin ca Usar identificació TLS +use tls encryption emailadmin ca Usar xifrat TLS +users can define their own emailaccounts emailadmin ca Els usuaris poden definir els seus propis comptes de correu +virtual mail manager emailadmin ca Gestor de correu virtual diff --git a/emailadmin/lang/egw_cs.lang b/emailadmin/lang/egw_cs.lang new file mode 100644 index 0000000000..5749d01c37 --- /dev/null +++ b/emailadmin/lang/egw_cs.lang @@ -0,0 +1,143 @@ +account '%1' not found !!! emailadmin cs Účet '%1' nebyl nalezen !!! +active templates emailadmin cs Aktivní šablony +add new email address: emailadmin cs Přidat novou e-mailovou adresu: +add profile emailadmin cs Přidat profil +admin dn emailadmin cs Dn (distiguished name) administrátora +admin password emailadmin cs Heslo administrátora +admin username emailadmin cs Uživatelské jméno administrátora +advanced options emailadmin cs Rozšířené volby +alternate email address emailadmin cs Alternativní e-mailová adresa +any application emailadmin cs Kterákoli aplikace +any group emailadmin cs Kterákoli skupina +any user emailadmin cs Kterýkoli uživatel +back to admin/grouplist emailadmin cs Zpět na Administrátor/Skupiny uživatelů +back to admin/userlist emailadmin cs Zpět na Administrátor/Uživatelské účty +bad login name or password. emailadmin cs Chybné přihlašovací jméno nebo heslo. +bad or malformed request. server responded: %s emailadmin cs Chybný nebo špatně fomulovaný požadavek. Server odpověděl: %s +bad request: %s emailadmin cs Chybný požadavek: %s +can be used by application emailadmin cs Může být použit aplikací +can be used by group emailadmin cs Může být použit skupinou +can be used by user emailadmin cs Může být použit uživatelem +connection dropped by imap server. emailadmin cs Připojení ukončeno IMAP serverem. +could not complete request. reason given: %s emailadmin cs Nemohu dokončit požadavek. Důvod: %s +could not open secure connection to the imap server. %s : %s. emailadmin cs Nemohu otevřít zabezpečené připojení na IMAP server. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. emailadmin cs CRAM-MD5 nebo DIGEST-MD5 vyžadují nainstalovaný balíček Auth_SASL. +cyrus imap server emailadmin cs Cyrus IMAP Server +cyrus imap server administration emailadmin cs Administrace Cyrus IMAP serveru +default emailadmin cs výchozí +deliver extern emailadmin cs doručit externě +do not validate certificate emailadmin cs Neověřovat certifikát +do you really want to delete this profile emailadmin cs Opravdu chcete smazat tento profil +do you really want to reset the filter for the profile listing emailadmin cs Opravdu chcete vyresetovat filtr pro seznam profilů +domainname emailadmin cs Doménové jméno +edit email settings emailadmin cs Editovat nastavení e-mailu +email account active emailadmin cs E-mailový účet aktivní +email address emailadmin cs E-mailová adresa +email settings common cs Nastavení e-mailu +emailadmin emailadmin cs Administrátor pošty +emailadmin: group assigned profile common cs Administrátor pošty: profil přidělený skupině +emailadmin: user assigned profile common cs Administrátor pošty: profil přidělený uživateli +enable cyrus imap server administration emailadmin cs Povolit administraci Cyrus IMAP serveru +enable sieve emailadmin cs Povolit Sieve +encrypted connection emailadmin cs Šifrované připojení +encryption settings emailadmin cs Nastavení šifrování +enter your default mail domain (from: user@domain) emailadmin cs Zadejte Vaši výchozí poštovní doménu (z: uživatel@doména) +error connecting to imap server. %s : %s. emailadmin cs Chyba spojení na IMAP server. %s : %s. +error connecting to imap server: [%s] %s. emailadmin cs Chyba spojení na IMAP server: [%s] %s. +filtered by account emailadmin cs filtrováno podle účtu +filtered by group emailadmin cs filtrováno podle skupiny +forward also to emailadmin cs Přeposlat také na +forward email's to emailadmin cs Přeposílat e-maily na +forward only emailadmin cs Jen přeposlat +global options emailadmin cs Globální volby +if using ssl or tls, you must have the php openssl extension loaded. emailadmin cs Pokud chcete používat SSL nebo TLS, musíte mít nahráno openssl rozšíření PHP. +imap admin password admin cs Heslo IMAP administrátora +imap admin user admin cs Uživatelský účet IMAP administrátora +imap c-client version < 2001 emailadmin cs IMAP C-klient verze < 2001 +imap server closed the connection. emailadmin cs IMAP server ukončil spojení. +imap server closed the connection. server responded: %s emailadmin cs IMAP server ukončil spojení. Server odpověděl: %s +imap server hostname or ip address emailadmin cs DNS jméno nebo IP adresa IMAP serveru +imap server logintyp emailadmin cs Typ přihlášení na IMAP server +imap server name emailadmin cs Název IMAP serveru +imap server port emailadmin cs Port IMAP serveru +imap/pop3 server name emailadmin cs Název IMAP/POP3 serveru +in mbyte emailadmin cs v MBytech +inactive emailadmin cs neaktivní +ldap basedn emailadmin cs LDAP basedn +ldap server emailadmin cs LDAP server +ldap server accounts dn emailadmin cs DN (distinguished name) účtů na LDAP serveru +ldap server admin dn emailadmin cs DN (distinguished name) administrátora LDAP serveru +ldap server admin password emailadmin cs Heslo administrátora LDAP serveru +ldap server hostname or ip address emailadmin cs DNS jméno nebo IP adresa LDAP serveru +ldap settings emailadmin cs LDAP nastavení +leave empty for no quota emailadmin cs ponechte prázdné, nechcete-li kvótu +mail settings admin cs Nastavení pošty +manage stationery templates emailadmin cs Spravovat šabony dopisů +name of organisation emailadmin cs Název organizace +no alternate email address emailadmin cs bez alternativní e-mailové adresy +no encryption emailadmin cs bez šifrování +no forwarding email address emailadmin cs bez e-mailové adresy pro přeposílání +no message returned. emailadmin cs Žádná zpráva se nevrátila. +no supported imap authentication method could be found. emailadmin cs Nebyla nalezena žádná podporovaná metoda IMAP autentikace. +order emailadmin cs Pořadí +organisation emailadmin cs Organizace +plesk can't rename users --> request ignored emailadmin cs Plesk nemůže přejmenovávat uživatele --> požadavek ignorován +plesk imap server (courier) emailadmin cs Plesk IMAP server (Courier) +plesk mail script '%1' not found !!! emailadmin cs Plesk poštovní skript '%1' nebyl nalezen !!! +plesk requires passwords to have at least 5 characters and not contain the account-name --> password not set!!! emailadmin cs Plesk vyžaduje, aby měla hesla nejméně 5 znaků a neobsahovala název účtu --> heslo nebylo nastaveno!!! +plesk smtp-server (qmail) emailadmin cs Plesk SMTP server (Qmail) +pop3 server hostname or ip address emailadmin cs DNS jméno nebo IP adresa POP3 serveru +pop3 server port emailadmin cs Port POP3 serveru +postfix with ldap emailadmin cs Postfix s LDAP +profile access rights emailadmin cs přístupová práva profilu +profile is active emailadmin cs Profil je aktivní +profile list emailadmin cs Seznam profilů +profile name emailadmin cs Název profilu +qmaildotmode emailadmin cs Tečkový režim Qmail +qouta size in mbyte emailadmin cs Velikost kvóty v MBytech +quota settings emailadmin cs Nastavení kvóty +remove emailadmin cs Odstranit +reset filter emailadmin cs vyresetovat filtr +select type of imap server emailadmin cs Vyberte typ IMAP serveru +select type of imap/pop3 server emailadmin cs Vyberte typ IMAP/POP3 serveru +select type of smtp server emailadmin cs Vyberte typ SMTP serveru +send using this email-address emailadmin cs Odeslat s touto e-mailovou adresou +server settings emailadmin cs Nastavení serveru +sieve server hostname or ip address emailadmin cs DNS jméno nebo IP adresa Sieve serveru +sieve server port emailadmin cs Port Sieve serveru +sieve settings emailadmin cs Nastavení sieve +smtp authentication emailadmin cs SMTP autentikace +smtp options emailadmin cs Volby SMTP +smtp server name emailadmin cs Jméno SMTP serveru +smtp settings emailadmin cs Nastavení SMTP +smtp-server hostname or ip address emailadmin cs DNS jméno nebo IP adresa SMTP serveru +smtp-server port emailadmin cs Port SMTP serveru +standard emailadmin cs Standardní +standard imap server emailadmin cs Standardní IMAP server +standard pop3 server emailadmin cs Standardní POP3 server +standard smtp-server emailadmin cs Standardní SMTP server +stationery emailadmin cs Dopisní papíry +the imap server does not appear to support the authentication method selected. please contact your system administrator. emailadmin cs Vypadá to, že IMAP server nepodporuje vybranou autentikační metodu. Zkontaktujte prosím Vašeho systémového administrátora. +this php has no imap support compiled in!! emailadmin cs Toto PHP nemá zkompilovanou podporu IMAPu. +to use a tls connection, you must be running a version of php 5.1.0 or higher. emailadmin cs Pro použití TLS připojení musíte provozovat verzi PHP 5.1.0 nebo vyšší. +unexpected response from server to authenticate command. emailadmin cs Neočekávaná odpověď serveru na příkaz AUTHENTICATE. +unexpected response from server to digest-md5 response. emailadmin cs Neočekávaná odpověď serveru na Digest-MD5 odpověď. +unexpected response from server to login command. emailadmin cs Neočekávaná odpověď serveru na příkaz LOGIN. +unknown imap response from the server. server responded: %s emailadmin cs Neznámá IMAP odpověď server. Odpověděl: %s +unsupported action '%1' !!! emailadmin cs Nepodporovaná akce '%1' !!! +update current email address: emailadmin cs Aktualizovat současnou e-mailovou adresu: +use ldap defaults emailadmin cs Použít výchozí hodnoty LDAP +use predefined username and password defined below emailadmin cs Použít předdefinované uživatelské jméno a heslo uvedené níže +use smtp auth emailadmin cs Použít SMTP autentikaci +use tls authentication emailadmin cs Použít TLS autentikaci +use tls encryption emailadmin cs Použít TLS šifrování +user can edit forwarding address emailadmin cs Uživatel smí editovat adresu pro přeposílání +username (standard) emailadmin cs uživatelské jméno (standardní) +username/password defined by admin emailadmin cs Uživatelské jméno/Heslo definované administrátorem +username@domainname (virtual mail manager) emailadmin cs uživatelskéjméno@doména (Virtuální správce pošty) +users can define their own emailaccounts emailadmin cs Uživatelé smí definovat vlastní poštovní účty +users can define their own identities emailadmin cs Uživatelé smí definovat své vlastní identity +users can define their own signatures emailadmin cs Uživatelé smí definovat své vlastní podpisy +users can utilize these stationery templates emailadmin cs Uživatelé mohou využívat tyto šablony dopisů +vaction messages with start- and end-date require an admin account to be set! emailadmin cs Automatické odpovědi v nepřítomnosti, které mají určeno počáteční a koncové datum, vyžadují nastavení administrátorského účtu. +virtual mail manager emailadmin cs Virtuální správce pošty diff --git a/emailadmin/lang/egw_da.lang b/emailadmin/lang/egw_da.lang new file mode 100644 index 0000000000..eca0f7475f --- /dev/null +++ b/emailadmin/lang/egw_da.lang @@ -0,0 +1,69 @@ +add profile emailadmin da Tilføj Profil +admin dn emailadmin da admin dn +admin password emailadmin da admin adgangskode +admin passwort emailadmin da admin adgangskode +admin username emailadmin da admin brugernavn +advanced options emailadmin da avanceret indstillinger +alternate email address emailadmin da alternativ e-mail adresse +cyrus imap server emailadmin da Cyrus IMAP Server +cyrus imap server administration emailadmin da Cyrus IMAP server administration +default emailadmin da standart +deliver extern emailadmin da lever ekstern +do you really want to delete this profile emailadmin da Vil du virkelig slette denne profil +domainname emailadmin da domæne navn +edit email settings emailadmin da redigere e-mail indstillingerne +email account active emailadmin da e-mail konto aktiv +email address emailadmin da e-mail adresse +enable cyrus imap server administration emailadmin da aktivere Cyrus IMAP server administration +enable sieve emailadmin da aktiver Sieve +enter your default mail domain (from: user@domain) emailadmin da Indtast dit standart post domæne (fra: bruger@domæne) +forward also to emailadmin da videresend også til +forward email's to emailadmin da videresend e-mails til +forward only emailadmin da videresend kun +imap admin password admin da IMAP admin adgangskode +imap admin user admin da IMAP admin bruger +imap c-client version < 2001 emailadmin da IMAP C-Klient Version < 2001 +imap server hostname or ip address emailadmin da IMAP server domænenavn eller IP adresse +imap server logintyp emailadmin da IMAP server login type +imap server port emailadmin da IMAP server port +imap/pop3 server name emailadmin da IMAP/POP3 server navn +in mbyte emailadmin da i Megabytes +ldap basedn emailadmin da LDAP basedn +ldap server emailadmin da LDAP server +ldap server accounts dn emailadmin da LDAP server konto DN +ldap server admin dn emailadmin da LDAP server admin DN +ldap server admin password emailadmin da LDAP server admin adgangskode +ldap server hostname or ip address emailadmin da LDAP server domænenavn eller IP adresse +ldap settings emailadmin da LDAP indstillinger +leave empty for no quota emailadmin da efterlad tom hvis ingen citat +mail settings admin da Post indstillinger +name of organisation emailadmin da Navn på organisation +no alternate email address emailadmin da ingen alternativ e-mail adresse +no forwarding email address emailadmin da ingen viderestillet e-mail adresse +pop3 server hostname or ip address emailadmin da POP3 server domænenavn eller IP adresse +pop3 server port emailadmin da POP server port +postfix with ldap emailadmin da Postfix med LDAP +profile list emailadmin da Profil liste +profile name emailadmin da Profil navn +qmaildotmode emailadmin da qmaildotmode +qouta size in mbyte emailadmin da quota størrelse i Megabytes +quota settings emailadmin da quota indstillinger +remove emailadmin da fjern +select type of imap/pop3 server emailadmin da Vælg type IMAP/POP3 server +select type of smtp server emailadmin da Vælg time POP3 server +sieve server hostname or ip address emailadmin da Sieve server domænenavn eller IP adresse +sieve server port emailadmin da Sieve server port +sieve settings emailadmin da Sieve indstillinger +smtp server name emailadmin da SMTP server navn +smtp-server hostname or ip address emailadmin da SMTP server domænenavn eller IP adresse +smtp-server port emailadmin da SMTP server port +standard emailadmin da Standart +standard imap server emailadmin da Standart IMAP server +standard pop3 server emailadmin da Standart POP3 server +standard smtp-server emailadmin da Standart SMTP server +use ldap defaults emailadmin da brug LDAP standarter +use smtp auth emailadmin da Brug SMTP autorisation +use tls authentication emailadmin da Brug TLS autorisation +use tls encryption emailadmin da Brug TLS kryptering +users can define their own emailaccounts emailadmin da Brugere kan selv definere deres egne e-mail kontoer +virtual mail manager emailadmin da Virtuel post håndtering diff --git a/emailadmin/lang/egw_de.lang b/emailadmin/lang/egw_de.lang new file mode 100644 index 0000000000..1fa724ba3c --- /dev/null +++ b/emailadmin/lang/egw_de.lang @@ -0,0 +1,149 @@ +%1 entries deleted. emailadmin de %1 Einträge gelöscht +account '%1' not found !!! emailadmin de Benutzerkonto '%1' nicht gefunden !!! +active templates emailadmin de Aktive Vorlagen +add new email address: emailadmin de Neue EMailadresse hinzufügen +add profile emailadmin de Profil hinzufügen +admin dn emailadmin de Admin DN +admin password emailadmin de Admin Passwort +admin username emailadmin de Administrator Benutzername +advanced options emailadmin de erweiterte Einstellungen +alternate email address emailadmin de zusätzliche E-Mail-Adressen +any application emailadmin de jede Anwendung +any group emailadmin de jede Gruppe +any user emailadmin de jeder Benutzer +back to admin/grouplist emailadmin de Zurück zu: Admin/Gruppenverwaltung +back to admin/userlist emailadmin de Zurück zu: Admin/Benutzerverwaltung +bad login name or password. emailadmin de Falscher Benutzername oder Passwort. +bad or malformed request. server responded: %s emailadmin de Falsche oder ungültige Anfrage. Server antwortet: %s +bad request: %s emailadmin de Falsche Anfrage: %s +can be used by application emailadmin de Kann von folgender Anwendung verwendet werden +can be used by group emailadmin de Kann von folgender Gruppe verwendet werden +can be used by user emailadmin de Kann von folgendem Benutzer verwendet werden +connection dropped by imap server. emailadmin de Verbindung von IMAP-Server beendet. +could not complete request. reason given: %s emailadmin de Konnte Anfrage nicht beenden. Grund: %s +could not open secure connection to the imap server. %s : %s. emailadmin de Konnte keine sichere Verbindung zum IMAP Server aufbauen. %s: %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. emailadmin de CRAM-MD5 oder DIGEST-MD5 erforder das das Auth_SASL Packet instaliert ist. +cyrus imap server emailadmin de Cyrus IMAP-Server +cyrus imap server administration emailadmin de Cyrus IMAP-Server Administration +default emailadmin de Vorgabe +deliver extern emailadmin de extern ausliefern +do not validate certificate emailadmin de Zertifikat nicht überprüfen +do you really want to delete this profile emailadmin de Wollen Sie dieses Profil wirklich löschen +do you really want to reset the filter for the profile listing emailadmin de Möchten Sie den Filter für die Profilliste wirklich zurücksetzen? +domainname emailadmin de Domänenname +edit email settings emailadmin de E-Mail-Einstellungen +email account active emailadmin de E-Mail-Konto aktiv +email address emailadmin de E-Mail-Adresse +email settings common de E-Mail-Konto +emailadmin emailadmin de EMailAdmin +emailadmin: group assigned profile common de eMailAdmin: Vordefiniertes Gruppenprofil +emailadmin: user assigned profile common de eMailAdmin: Vordefiniertes Benutzerprofil +enable cyrus imap server administration emailadmin de Cyrus IMAP-Server Administration aktivieren +enable sieve emailadmin de Sieve aktivieren +encrypted connection emailadmin de verschlüsselte Verbindung +encryption settings emailadmin de Verschlüsselungseinstellungen +enter your default mail domain (from: user@domain) emailadmin de Standard E-Mail-Domain (Von: benutzer@domain) +entry saved emailadmin de Eintrag gespeichert +error connecting to imap server. %s : %s. emailadmin de Fehler beim Verbinden mit dem IMAP Server. %s : %s. +error connecting to imap server: [%s] %s. emailadmin de Fehler beim Verbinden mit dem IMAP Server. [%s] %s. +error deleting entry! emailadmin de Fehler beim löschen des Eintrags +error saving the entry!!! emailadmin de Fehler beim speichern!!! +filtered by account emailadmin de Suche nach Benutzerprofilen +filtered by group emailadmin de Suche nach Gruppenprofilen +forward also to emailadmin de zusätzlich weiterleiten +forward email's to emailadmin de E-Mails weiterleiten an +forward only emailadmin de nur weiterleiten +global options emailadmin de Globale Optionen +if using ssl or tls, you must have the php openssl extension loaded. emailadmin de Wenn Sie SSL oder TLS benutzern, müssen Sie die openssl PHP Erweiterung geladen haben. +imap admin password admin de IMAP Administrator Passwort +imap admin user admin de IMAP Administrator Benutzer +imap c-client version < 2001 emailadmin de IMAP C-Client Version < 2001 +imap server closed the connection. emailadmin de IMAP Server hat die Verbindung beendet. +imap server closed the connection. server responded: %s emailadmin de IMAP Server hat die Verbindung beendet. Server Antwort: %s +imap server hostname or ip address emailadmin de IMAP-Server Hostname oder IP-Adresse +imap server logintyp emailadmin de IMAP-Server Loginverfahren +imap server name emailadmin de IMAP-Server Name +imap server port emailadmin de IMAP-Server Port +imap/pop3 server name emailadmin de IMAP/POP3-Server Name +in mbyte emailadmin de in MByte +inactive emailadmin de inaktiv +ldap basedn emailadmin de LDAP BaseDN +ldap server emailadmin de LDAP Server +ldap server accounts dn emailadmin de LDAP-Server Benutzerkonten DN +ldap server admin dn emailadmin de LDAP-Server Administrator DN +ldap server admin password emailadmin de LDAP-Server Administrator-Passwort +ldap server hostname or ip address emailadmin de LDAP-Server Hostname oder IP-Adresse +ldap settings emailadmin de LDAP-Einstellungen +leave empty for no quota emailadmin de leer lassen um Quota zu deaktivieren +mail settings admin de E-Mail-Einstellungen +manage stationery templates emailadmin de Briefpapiervorlagen verwalten +name of organisation emailadmin de Name der Organisation +no alternate email address emailadmin de keine zusätzlichen E-Mail-Adressen +no encryption emailadmin de keine Verschlüsselung +no forwarding email address emailadmin de keine Weiterleitungsadresse definiert +no message returned. emailadmin de Keine Nachricht zurückgeliefert. +no supported imap authentication method could be found. emailadmin de Keine unterstützte IMAP-Authentifizierungsmethode gefunden. +order emailadmin de Reihenfolge +organisation emailadmin de Organisation +plesk can't rename users --> request ignored emailadmin de Plesk kann keine Benutzer umbenennen --> Anforderung ignoriert +plesk imap server (courier) emailadmin de Plesk IMAP Server (Courier) +plesk mail script '%1' not found !!! emailadmin de Plesk Mail Skript '%1' nicht gefunden !!! +plesk requires passwords to have at least 5 characters and not contain the account-name --> password not set!!! emailadmin de Plesk verlangt, dass Passworte mindestens 5 Zeichen lang sind und nicht den Benutzernamen enthalten --> Passwort nicht gesetzt!!! +plesk smtp-server (qmail) emailadmin de Plesk SMTP-Server (Qmail) +pop3 server hostname or ip address emailadmin de POP3-Server Hostname oder IP-Adresse +pop3 server port emailadmin de POP3-Server Port +postfix with ldap emailadmin de Postfix mit LDAP +profile access rights emailadmin de Profilzugriffsrechte +profile is active emailadmin de Profil ist aktiv +profile list emailadmin de Profilliste +profile name emailadmin de Profilname +qmaildotmode emailadmin de qmaildotmode +qouta size in mbyte emailadmin de Quota Größe in MByte +quota settings emailadmin de Quota Einstellungen +remove emailadmin de Entfernen +reset filter emailadmin de Filter zurücksetzen +select type of imap server emailadmin de IMAP-Server Typ auswählen +select type of imap/pop3 server emailadmin de IMAP/POP3-Server Typ auswählen +select type of smtp server emailadmin de SMTP-Server Typ auswählen +send using this email-address emailadmin de zum Versenden wird diese E-Mail Adresse benutzt +server settings emailadmin de Server-Einstellungen +sieve server hostname or ip address emailadmin de Sieve-Server Hostname oder IP-Adresse +sieve server port emailadmin de Sieve-Server Port +sieve settings emailadmin de Sieve Einstellungen +smtp authentication emailadmin de SMTP Anmeldung +smtp options emailadmin de SMTP Optionen +smtp server name emailadmin de SMTP-Server Name +smtp settings emailadmin de SMTP Einstellungen +smtp-server hostname or ip address emailadmin de SMTP-Server Hostname oder IP-Adresse +smtp-server port emailadmin de SMTP-Server Port +standard emailadmin de Vorgabe +standard imap server emailadmin de Standard IMAP-Server +standard pop3 server emailadmin de Standard POP3-Server +standard smtp-server emailadmin de Standard SMTP-Server +starts with emailadmin de startet mit +stationery emailadmin de Briefpapier +the imap server does not appear to support the authentication method selected. please contact your system administrator. emailadmin de Der IMAP Server scheint die eingestellte Authentifizierungsmethode nicht zu unterstützen. Bitte fragen Sie ihren Systemadministrator. +this php has no imap support compiled in!! emailadmin de Dieses PHP hat keine IMAP Unterstützung!!! +to use a tls connection, you must be running a version of php 5.1.0 or higher. emailadmin de Um eine TLS Verbindung zu verwenden, benötigen Sie PHP 5.1.0 oder neuer. +unexpected response from server to authenticate command. emailadmin de Unerwartete Antwort des Servers auf das AUTHENTICATE Komando. +unexpected response from server to digest-md5 response. emailadmin de Unerwartete Antwort des Servers auf die Digest-MD5 Antwort. +unexpected response from server to login command. emailadmin de Unerwartete Antwort des Servers auf das LOGIN Komando. +unknown imap response from the server. server responded: %s emailadmin de Unbekannte IMAP Antwort vom Server. Server antwortet: %s +unsupported action '%1' !!! emailadmin de Nicht unterstützte Aktion '%1' !!! +update current email address: emailadmin de Aktualisiere aktuelle EMailadresse +use ldap defaults emailadmin de LDAP Standardeinstellungen benutzen +use predefined username and password defined below emailadmin de Verwende den unten vordefinierten Benutzernamen und Passwort +use smtp auth emailadmin de SMTP Auth benutzen +use tls authentication emailadmin de TLS Authentifizierung benutzen +use tls encryption emailadmin de TLS Verschlüsselung benutzen +use users email-address (as seen in useraccount) emailadmin de Benutzt E-Mail Adresse des Benutzters (Die unter seinem Benutzerkonto angezeigt wird) +user can edit forwarding address emailadmin de Anwender können ihre Weiterleitungsadresse bearbeiten +username (standard) emailadmin de Benutzername (Standard) +username/password defined by admin emailadmin de Benutzername/Passwort vordefiniert +username@domainname (virtual mail manager) emailadmin de Benutzername@Domänenname (Virtual MAIL ManaGeR) +users can define their own emailaccounts emailadmin de Anwender können ihre eigenen Konten definieren +users can define their own identities emailadmin de Anwender können ihre eigenen Identitäten definieren +users can define their own signatures emailadmin de Anwender können ihre eigenen Signaturen definieren +users can utilize these stationery templates emailadmin de Benutzer können diese Briefpapiervorlagen verwenden +vaction messages with start- and end-date require an admin account to be set! emailadmin de Urlaubsbenachrichtigungen mit Start- und Endedatum benötigen einen gesetzten Administrator Benutzer! +virtual mail manager emailadmin de Virtual MAIL ManaGeR diff --git a/emailadmin/lang/egw_en.lang b/emailadmin/lang/egw_en.lang new file mode 100755 index 0000000000..42eec28f0f --- /dev/null +++ b/emailadmin/lang/egw_en.lang @@ -0,0 +1,149 @@ +%1 entries deleted. emailadmin en %1 entries deleted. +account '%1' not found !!! emailadmin en Account '%1' not found !!! +active templates emailadmin en Active templates +add new email address: emailadmin en Add new email address: +add profile emailadmin en Add Profile +admin dn emailadmin en Admin dn +admin password emailadmin en Admin password +admin username emailadmin en Admin username +advanced options emailadmin en Advanced options +alternate email address emailadmin en Alternate email address +any application emailadmin en Any application +any group emailadmin en Any group +any user emailadmin en any user +back to admin/grouplist emailadmin en Back to Admin/Grouplist +back to admin/userlist emailadmin en Back to Admin/Userlist +bad login name or password. emailadmin en Bad login name or password. +bad or malformed request. server responded: %s emailadmin en Bad or malformed request. Server Responded: %s +bad request: %s emailadmin en Bad request: %s +can be used by application emailadmin en Can be used by application +can be used by group emailadmin en Can be used by group +can be used by user emailadmin en can be used by user +connection dropped by imap server. emailadmin en Connection dropped by IMAP server. +could not complete request. reason given: %s emailadmin en Could not complete request. Reason Given: %s +could not open secure connection to the imap server. %s : %s. emailadmin en Could not open secure connection to the IMAP server. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. emailadmin en CRAM-MD5 or DIGEST-MD5 requires the Auth_SASL package to be installed. +cyrus imap server emailadmin en Cyrus IMAP Server +cyrus imap server administration emailadmin en Cyrus IMAP server administration +default emailadmin en default +deliver extern emailadmin en deliver extern +do not validate certificate emailadmin en do not validate certificate +do you really want to delete this profile emailadmin en Do you really want to delete this Profile +do you really want to reset the filter for the profile listing emailadmin en Do you really want to reset the filter for the Profile listing +domainname emailadmin en Domainname +edit email settings emailadmin en Edit email settings +email account active emailadmin en Email account active +email address emailadmin en Email address +email settings common en Email settings +emailadmin emailadmin en EMailAdmin +emailadmin: group assigned profile common en eMailAdmin: Group assigned Profile +emailadmin: user assigned profile common en eMailAdmin: User assigned Profile +enable cyrus imap server administration emailadmin en enable Cyrus IMAP server administration +enable sieve emailadmin en Enable Sieve +encrypted connection emailadmin en encrypted connection +encryption settings emailadmin en Encryption settings +enter your default mail domain (from: user@domain) emailadmin en Enter your default mail domain (from: user@domain) +entry saved emailadmin en Entry saved +error connecting to imap server. %s : %s. emailadmin en Error connecting to IMAP server. %s : %s. +error connecting to imap server: [%s] %s. emailadmin en Error connecting to IMAP server: [%s] %s. +error deleting entry! emailadmin en Error deleting entry! +error saving the entry!!! emailadmin en Error saving the entry!!! +filtered by account emailadmin en filtered by Account +filtered by group emailadmin en filtered by Group +forward also to emailadmin en Forward also to +forward email's to emailadmin en Forward email's to +forward only emailadmin en Forward only +global options emailadmin en Global options +if using ssl or tls, you must have the php openssl extension loaded. emailadmin en If using SSL or TLS, you must have the PHP openssl extension loaded. +imap admin password admin en IMAP admin password +imap admin user admin en IMAP admin user +imap c-client version < 2001 emailadmin en IMAP C-Client Version < 2001 +imap server closed the connection. emailadmin en IMAP server closed the connection. +imap server closed the connection. server responded: %s emailadmin en IMAP Server closed the connection. Server Responded: %s +imap server hostname or ip address emailadmin en IMAP server hostname or ip address +imap server logintyp emailadmin en IMAP server login type +imap server name emailadmin en imap server name +imap server port emailadmin en IMAP server port +imap/pop3 server name emailadmin en IMAP/POP3 server name +in mbyte emailadmin en in MByte +inactive emailadmin en inactive +ldap basedn emailadmin en LDAP basedn +ldap server emailadmin en LDAP server +ldap server accounts dn emailadmin en LDAP server accounts DN +ldap server admin dn emailadmin en LDAP server admin DN +ldap server admin password emailadmin en LDAP server admin password +ldap server hostname or ip address emailadmin en LDAP server hostname or ip address +ldap settings emailadmin en LDAP settings +leave empty for no quota emailadmin en leave empty for no quota +mail settings admin en Mail settings +manage stationery templates emailadmin en Manage stationery templates +name of organisation emailadmin en Name of organization +no alternate email address emailadmin en no alternate email address +no encryption emailadmin en no encryption +no forwarding email address emailadmin en no forwarding email address +no message returned. emailadmin en No message returned. +no supported imap authentication method could be found. emailadmin en No supported IMAP authentication method could be found. +order emailadmin en Order +organisation emailadmin en Organisation +plesk can't rename users --> request ignored emailadmin en Plesk can't rename users --> request ignored +plesk imap server (courier) emailadmin en Plesk IMAP Server (Courier) +plesk mail script '%1' not found !!! emailadmin en Plesk mail script '%1' not found !!! +plesk requires passwords to have at least 5 characters and not contain the account-name --> password not set!!! emailadmin en Plesk requires passwords to have at least 5 characters and not contain the account-name --> password NOT set!!! +plesk smtp-server (qmail) emailadmin en Plesk SMTP-Server (Qmail) +pop3 server hostname or ip address emailadmin en POP3 server hostname or ip address +pop3 server port emailadmin en POP3 server port +postfix with ldap emailadmin en Postfix with LDAP +profile access rights emailadmin en profile access rights +profile is active emailadmin en profile is active +profile list emailadmin en Profile List +profile name emailadmin en Profile Name +qmaildotmode emailadmin en qmaildotmode +qouta size in mbyte emailadmin en Qouta size in MByte +quota settings emailadmin en Quota settings +remove emailadmin en Remove +reset filter emailadmin en reset filter +select type of imap server emailadmin en select type of IMAP server +select type of imap/pop3 server emailadmin en Select type of IMAP/POP3 server +select type of smtp server emailadmin en Select type of SMTP Server +send using this email-address emailadmin en send using this eMail-Address +server settings emailadmin en Server settings +sieve server hostname or ip address emailadmin en Sieve server hostname or ip address +sieve server port emailadmin en Sieve server port +sieve settings emailadmin en Sieve settings +smtp authentication emailadmin en SMTP authentication +smtp options emailadmin en SMTP options +smtp server name emailadmin en SMTP server name +smtp settings emailadmin en SMTP settings +smtp-server hostname or ip address emailadmin en SMTP server hostname or IP address +smtp-server port emailadmin en SMTP server port +standard emailadmin en Standard +standard imap server emailadmin en Standard IMAP server +standard pop3 server emailadmin en Standard POP3 server +standard smtp-server emailadmin en Standard SMTP server +starts with emailadmin en starts with +stationery emailadmin en Stationery +the imap server does not appear to support the authentication method selected. please contact your system administrator. emailadmin en The IMAP server does not appear to support the authentication method selected. Please contact your system administrator. +this php has no imap support compiled in!! emailadmin en This PHP has no IMAP support compiled in!! +to use a tls connection, you must be running a version of php 5.1.0 or higher. emailadmin en To use a TLS connection, you must be running a version of PHP 5.1.0 or higher. +unexpected response from server to authenticate command. emailadmin en Unexpected response from server to AUTHENTICATE command. +unexpected response from server to digest-md5 response. emailadmin en Unexpected response from server to Digest-MD5 response. +unexpected response from server to login command. emailadmin en Unexpected response from server to LOGIN command. +unknown imap response from the server. server responded: %s emailadmin en Unknown IMAP response from the server. Server Responded: %s +unsupported action '%1' !!! emailadmin en Unsupported action '%1' !!! +update current email address: emailadmin en Update current email address: +use ldap defaults emailadmin en Use LDAP defaults +use predefined username and password defined below emailadmin en Use predefined username and password defined below +use smtp auth emailadmin en Use SMTP auth +use tls authentication emailadmin en Use TLS authentication +use tls encryption emailadmin en Use TLS encryption +use users email-address (as seen in useraccount) emailadmin en use Users eMail-Address (as seen in Useraccount) +user can edit forwarding address emailadmin en User can edit forwarding address +username (standard) emailadmin en username (standard) +username/password defined by admin emailadmin en Username/Password defined by admin +username@domainname (virtual mail manager) emailadmin en username@domainname (Virtual MAIL ManaGeR) +users can define their own emailaccounts emailadmin en Users can define their own email accounts +users can define their own identities emailadmin en users can define their own identities +users can define their own signatures emailadmin en users can define their own signatures +users can utilize these stationery templates emailadmin en Users can utilize these stationery templates +vaction messages with start- and end-date require an admin account to be set! emailadmin en Vacation messages with start- and end-date require an admin account to be set! +virtual mail manager emailadmin en Virtual MAIL ManaGeR diff --git a/emailadmin/lang/egw_es-es.lang b/emailadmin/lang/egw_es-es.lang new file mode 100644 index 0000000000..df347fc022 --- /dev/null +++ b/emailadmin/lang/egw_es-es.lang @@ -0,0 +1,143 @@ +account '%1' not found !!! emailadmin es-es ¡No se encontró la cuenta '%1'! +active templates emailadmin es-es Plantillas activas +add new email address: emailadmin es-es Añadir nueva dirección de correo +add profile emailadmin es-es Añadir perfil +admin dn emailadmin es-es dn del administrador +admin password emailadmin es-es contraseña del administrador +admin username emailadmin es-es usuario del administrador +advanced options emailadmin es-es opciones avanzadas +alternate email address emailadmin es-es dirección de correo alternativa +any application emailadmin es-es cualquier aplicación +any group emailadmin es-es cualquier grupo +any user emailadmin es-es cualquier usuario +back to admin/grouplist emailadmin es-es Volver a Administración/Lista de grupos +back to admin/userlist emailadmin es-es Volver a Administración/Lista de usuarios +bad login name or password. emailadmin es-es Nombre de usuario o contraseña incorrectos +bad or malformed request. server responded: %s emailadmin es-es Petición errónea o mal formado. El servidor respondió: %s +bad request: %s emailadmin es-es Petición errónea: %s +can be used by application emailadmin es-es puede usarse por la aplicación +can be used by group emailadmin es-es puede usarse por el grupo +can be used by user emailadmin es-es puede usarse por el usuario +connection dropped by imap server. emailadmin es-es El servidor IMAP ha interrumpido la conexión +could not complete request. reason given: %s emailadmin es-es No se pudo completar la solicitud. Motivo: %s +could not open secure connection to the imap server. %s : %s. emailadmin es-es No se pudo abrir una conexión segura con el servidor IMAP. %s: %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. emailadmin es-es CRAM-MD5 o DIGEST-MD5 necesitan el paquete Auth_SASL para estar instalado. +cyrus imap server emailadmin es-es Servidor IMAP Cyrus +cyrus imap server administration emailadmin es-es Administración del servidor IMAP Cyrus +default emailadmin es-es predeterminada +deliver extern emailadmin es-es entrega externa +do not validate certificate emailadmin es-es No validar el certificado +do you really want to delete this profile emailadmin es-es ¿Realmente desea borrar este perfil? +do you really want to reset the filter for the profile listing emailadmin es-es Realmente desea restablecer el filtro para la lista de perfiles +domainname emailadmin es-es nombre del dominio +edit email settings emailadmin es-es editar configuración de la cuenta +email account active emailadmin es-es cuenta de correo electrónico activa +email address emailadmin es-es dirección de correo electrónico +email settings common es-es Configuración del correo electrónico +emailadmin emailadmin es-es Administración del correo electrónico +emailadmin: group assigned profile common es-es eMailAdmin: perfil asignado al grupo +emailadmin: user assigned profile common es-es eMailAdmin: perfil asignado al usuario +enable cyrus imap server administration emailadmin es-es activar administración del servidor Cyrus IMAP +enable sieve emailadmin es-es activar Sieve +encrypted connection emailadmin es-es conexión cifrada +encryption settings emailadmin es-es configuración del cifrado +enter your default mail domain (from: user@domain) emailadmin es-es introduzca el dominio predeterminado (de usuario@dominio) +error connecting to imap server. %s : %s. emailadmin es-es Error al conectar con el servidor IMAP. %s: %s. +error connecting to imap server: [%s] %s. emailadmin es-es Error al conectar con el servidor IMAP: [%s] %s. +filtered by account emailadmin es-es filtrado por cuenta +filtered by group emailadmin es-es filtrado por grupo +forward also to emailadmin es-es reenviar también a +forward email's to emailadmin es-es reenviar correos a +forward only emailadmin es-es sólo reenviar +global options emailadmin es-es opciones globales +if using ssl or tls, you must have the php openssl extension loaded. emailadmin es-es Si usa SSL o TLS, debe tener cargada la extensión openssl de PHP. +imap admin password admin es-es contraseña del administrador IMAP +imap admin user admin es-es usuario administrador IMAP +imap c-client version < 2001 emailadmin es-es Versión C-Cliente IMAP < 2001 +imap server closed the connection. emailadmin es-es El servidor IMAP cerró la conexión. +imap server closed the connection. server responded: %s emailadmin es-es El servidor IMAP cerró la conexión. El servidor respondió: %s +imap server hostname or ip address emailadmin es-es Servidor IMAP o dirección IP +imap server logintyp emailadmin es-es Tipo de sesión del servidor IMAP +imap server name emailadmin es-es Nombre del servidor IMAP +imap server port emailadmin es-es Puerto del servidor IMAP +imap/pop3 server name emailadmin es-es Nombre del servidor POP/IMAP +in mbyte emailadmin es-es en MBytes +inactive emailadmin es-es inactivo +ldap basedn emailadmin es-es basedn para LDAP +ldap server emailadmin es-es servidor LDAP +ldap server accounts dn emailadmin es-es DN para cuentas del servidor LDAP +ldap server admin dn emailadmin es-es DN del administrador del servidor LDAP +ldap server admin password emailadmin es-es contraseña del administrador del servidor LDAP +ldap server hostname or ip address emailadmin es-es Nombre del servidor LDAP o dirección IP +ldap settings emailadmin es-es Configuración LDAP +leave empty for no quota emailadmin es-es Dejar en blanco para no poner cuota +mail settings admin es-es Configuración del correo. +manage stationery templates emailadmin es-es Gestionar plantillas preimpresas +name of organisation emailadmin es-es Nombre de la organización +no alternate email address emailadmin es-es Sin dirección de correo alternativa +no encryption emailadmin es-es Sin cifrar +no forwarding email address emailadmin es-es Sin dirección de correo para reenviar +no message returned. emailadmin es-es No se devolvió ningún mensaje. +no supported imap authentication method could be found. emailadmin es-es No se pudo encontrar ningún método soportado de identificación IMAP. +order emailadmin es-es orden +organisation emailadmin es-es organización +plesk can't rename users --> request ignored emailadmin es-es Plesk no puede renombrar usuarios --> Se ignora la solicitud +plesk imap server (courier) emailadmin es-es Servidor IMAP Plesk (Courier) +plesk mail script '%1' not found !!! emailadmin es-es ¡No se encontró el script de correo de Plesk '%1'! +plesk requires passwords to have at least 5 characters and not contain the account-name --> password not set!!! emailadmin es-es Plesk requiere que las contraseñas tengan al menos 5 caracteres y no contengan el nombre de la cuenta --> NO se establece la contraseña +plesk smtp-server (qmail) emailadmin es-es Servidor SMTP de Plesk (Qmail) +pop3 server hostname or ip address emailadmin es-es Nombre del servidor POP3 o dirección IP +pop3 server port emailadmin es-es Puerto del servidor POP3 +postfix with ldap emailadmin es-es Postfix con LDAP +profile access rights emailadmin es-es Derechos de acceso del perfil +profile is active emailadmin es-es el perfil está activo +profile list emailadmin es-es Lista de perfiles +profile name emailadmin es-es Nombre del perfil +qmaildotmode emailadmin es-es Modo de punto de qmail +qouta size in mbyte emailadmin es-es Tamaño de la cuota en MBytes +quota settings emailadmin es-es Configuración de las cuotas +remove emailadmin es-es borrar +reset filter emailadmin es-es restablecer filtro +select type of imap server emailadmin es-es Seleccione el tipo de servidor IMAP +select type of imap/pop3 server emailadmin es-es Seleccione el tipo de servidor IMAP/POP3 +select type of smtp server emailadmin es-es Seleccione el tipo de servidor SMTP +send using this email-address emailadmin es-es enviar usando esta dirección de correo electrónico +server settings emailadmin es-es configuración del servidor +sieve server hostname or ip address emailadmin es-es Nombre del servidor Sieve o dirección IP +sieve server port emailadmin es-es Puerto del servidor Sieve +sieve settings emailadmin es-es Configuración de Sieve +smtp authentication emailadmin es-es identificación SMTP +smtp options emailadmin es-es opciones SMTP +smtp server name emailadmin es-es Nombre del servidor SMTP +smtp settings emailadmin es-es configuración SMTP +smtp-server hostname or ip address emailadmin es-es Nombre del servidor SMTP o dirección IP +smtp-server port emailadmin es-es Puerto del servidor SMTP +standard emailadmin es-es Estándar +standard imap server emailadmin es-es Servidor IMAP estándar +standard pop3 server emailadmin es-es Servidor POP3 estándar +standard smtp-server emailadmin es-es Servidor SMTP estándar +stationery emailadmin es-es material preimpreso +the imap server does not appear to support the authentication method selected. please contact your system administrator. emailadmin es-es El servidor IMAP no parece soportar el método de identificación seleccionado. Por favor, póngase en contacto el administrador de su sistema. +this php has no imap support compiled in!! emailadmin es-es ¡¡Esta instalación de PHP no tiene soporte IMAP!! +to use a tls connection, you must be running a version of php 5.1.0 or higher. emailadmin es-es Para usar una conexión TLS, debe ejecutar una versión de PHP 5.1.0 o superior. +unexpected response from server to authenticate command. emailadmin es-es Respuesta inesperada del servidor al comando AUTHENTICATE. +unexpected response from server to digest-md5 response. emailadmin es-es Respuesta inesperada del servidor a la respuesta Digest-MD5. +unexpected response from server to login command. emailadmin es-es Respuesta inesperada del servidor al comando LOGIN. +unknown imap response from the server. server responded: %s emailadmin es-es Respuesta IMAP desconocida del servidor. El servidor respondió: %s +unsupported action '%1' !!! emailadmin es-es ¡La acción '%1' no está soportada! +update current email address: emailadmin es-es Actualizar la dirección de correo actual: +use ldap defaults emailadmin es-es usar las opciones predeterminadas para LDAP +use predefined username and password defined below emailadmin es-es Usar el usuario predefinido y las contraseñas definidas debajo +use smtp auth emailadmin es-es Usar identificación SMTP +use tls authentication emailadmin es-es Usar identificación TLS +use tls encryption emailadmin es-es Usar cifrado TLS +user can edit forwarding address emailadmin es-es El usuario puede editar la dirección de reenvío +username (standard) emailadmin es-es usuario (estándar) +username/password defined by admin emailadmin es-es Usuario/contraseña definida por el administrador +username@domainname (virtual mail manager) emailadmin es-es usuario@dominio (Gestor de correo virtual) +users can define their own emailaccounts emailadmin es-es Los usuarios pueden definir sus propias cuentas de correo +users can define their own identities emailadmin es-es Los usuarios pueden definir sus propias identidades +users can define their own signatures emailadmin es-es Los usuarios pueden definir sus propias firmas +users can utilize these stationery templates emailadmin es-es Los usuarios pueden utilizar estas plantillas preimpresas +vaction messages with start- and end-date require an admin account to be set! emailadmin es-es Los mensajes con fecha de inicio y fin requieren establecer una cuenta de administrador +virtual mail manager emailadmin es-es Gestor de correo virtual diff --git a/emailadmin/lang/egw_et.lang b/emailadmin/lang/egw_et.lang new file mode 100755 index 0000000000..b47f1d1ac9 --- /dev/null +++ b/emailadmin/lang/egw_et.lang @@ -0,0 +1,45 @@ +account '%1' not found !!! emailadmin et Kontot '%1' ei leitud !!! +add new email address: emailadmin et Lisa uus email aadress +add profile emailadmin et Lisa Profiil +admin password emailadmin et admin parool +admin username emailadmin et admin kasutajanimi +alternate email address emailadmin et Alternatiivne email aadress +bad login name or password. emailadmin et Vale kasutajanimi või parool +cyrus imap server emailadmin et Cyrus IMAP Server +cyrus imap server administration emailadmin et Cyrus IMAP server administreerimine +default emailadmin et vaikimisi +do not validate certificate emailadmin et ära valideeri sertifikaati +do you really want to delete this profile emailadmin et Tahad tõesti kustutada seda Profiili +domainname emailadmin et Doomeninimi +edit email settings emailadmin et muuda emaili setinguid +email account active emailadmin et email konto aktiivne +email address emailadmin et email aadress +email settings common et Email setingud +encrypted connection emailadmin et krüpteeritud ühendus +encryption settings emailadmin et Krüpteerimise setingud +enter your default mail domain (from: user@domain) emailadmin et Sisesta oma vaikimisi mail doomen (kasutaja@doomen) +global options emailadmin et Globaalsed omadused +imap admin password admin et IMAP admin parool +imap admin user admin et IMAP admin kasutaja +imap c-client version < 2001 emailadmin et IMAP C-Client Versioon < 2001 +imap server closed the connection. emailadmin et IMAP server sulges ühenduse. +imap server closed the connection. server responded: %s emailadmin et IMAP Server sulges ühenduse. Server Vastas: %s +imap server name emailadmin et imap serveri nimi +imap server port emailadmin et IMAP serveri port +imap/pop3 server name emailadmin et IMAP/POP3 server nimi +ldap settings emailadmin et LDAP setingud +mail settings admin et Mail setingud +no alternate email address emailadmin et pole alternatiivset email aadressi +no encryption emailadmin et ilna krüpteeringutta +organisation emailadmin et Organisatsioon +pop3 server port emailadmin et POP3 serveri port +remove emailadmin et eemalda +select type of imap server emailadmin et vali IMAP serveri tüüp +select type of imap/pop3 server emailadmin et vali IMAP/POP3 serveri tüüp +select type of smtp server emailadmin et Vali SMTP serveri tüüp +server settings emailadmin et Serveri setingud +sieve server port emailadmin et Sieve serveri port +sieve settings emailadmin et Sieve setingud +smtp server name emailadmin et SMTP serveri nimi +smtp settings emailadmin et SMTP setingud +smtp-server port emailadmin et SMTP serveri port diff --git a/emailadmin/lang/egw_fa.lang b/emailadmin/lang/egw_fa.lang new file mode 100644 index 0000000000..906d7486ea --- /dev/null +++ b/emailadmin/lang/egw_fa.lang @@ -0,0 +1,66 @@ +add profile emailadmin fa افزودن مجموعه تنظیمات +admin dn emailadmin fa dn مدیر +admin password emailadmin fa گذرواژه مدیر +admin passwort emailadmin fa گذرواژه مدیر +admin username emailadmin fa نام کاربری مدیر +advanced options emailadmin fa تنظیمات پیشرفته +alternate email address emailadmin fa نشانی پست الکترونیکی دیگر +any application emailadmin fa همه کاربردها +any group emailadmin fa همه گروهها +can be used by application emailadmin fa استفاده شود توسط کاربرد +can be used by group emailadmin fa استفاده شود توسط گروه +default emailadmin fa پیش فرض +deliver extern emailadmin fa حمل بیرونی +do you really want to delete this profile emailadmin fa آیا واقعا می خواهید این مجموعه تنظیمات را حذف کنید؟ +domainname emailadmin fa نام حوزه +edit email settings emailadmin fa ویرایش تنظیمات نامه الکترونیکی +email account active emailadmin fa حساب نامه الکترونیکی فعال +email address emailadmin fa نشانی الکترونیکی +emailadmin emailadmin fa مدیر رایانامه +enable sieve emailadmin fa فعالسازی Sieve +encryption settings emailadmin fa تنظیمات رمز نگاری +enter your default mail domain (from: user@domain) emailadmin fa حوزه پیش فرض خود را وارد کنید:(مثلا: fgpars.net) +forward also to emailadmin fa همچنین ارسال به +forward email's to emailadmin fa ارسال نامه ها به +forward only emailadmin fa فقط ارسال به +global options emailadmin fa گزینه های عمومی +imap admin password admin fa گذرواژه مدیر IMAP +imap admin user admin fa کاربر مدیر IMAP +imap server hostname or ip address emailadmin fa نام میزبان یا نشانی IP کارگزار IMAP +imap server logintyp emailadmin fa نوع ورود کارگزار IMAP +imap server port emailadmin fa درگاه کارگزار IMAP +imap/pop3 server name emailadmin fa نام کارگزار IMAP/POP3 +in mbyte emailadmin fa به مگابایت +leave empty for no quota emailadmin fa برای بدون سهمیه بودن، خالی بگذارید +mail settings admin fa تنظیمات نامه +name of organisation emailadmin fa نام سازمان +no alternate email address emailadmin fa بدون نشانی نامه الکترونیکی دیگر +no forwarding email address emailadmin fa بدون نشانی نامه الکترونیکی ارسال به دیگری +order emailadmin fa ترتیب +organisation emailadmin fa سازمان +pop3 server hostname or ip address emailadmin fa نام میزبان یا نشانی IP کارگزار POP3 +pop3 server port emailadmin fa درگاه کارگزار POP3 +profile access rights emailadmin fa حقوق دسترسی مجموعه تنظیمات +profile list emailadmin fa لیست مجموعه تنظیمات +profile name emailadmin fa نام مجموعه تنظیمات +qouta size in mbyte emailadmin fa اندازه سهمیه به مگابایت +quota settings emailadmin fa تنظیمات سهمیه +remove emailadmin fa حذف +select type of imap/pop3 server emailadmin fa نوع کارگزار IMAP/POP3 را انتخاب کنید +select type of smtp server emailadmin fa نوع کارگزار SMTP را انتخاب کنید +server settings emailadmin fa تنظیمات کارگزار +sieve server hostname or ip address emailadmin fa نام میزبان یا نشانی IP کارگزار Sieve +sieve server port emailadmin fa درگاه کارگزار Sieve +sieve settings emailadmin fa تنظیمات Sieve +smtp authentication emailadmin fa تصدیق smtp +smtp server name emailadmin fa نام کارگزار SMTP +smtp settings emailadmin fa تنظیمات smtp +smtp-server hostname or ip address emailadmin fa نشانی IP یا نام میزبان SMTP +smtp-server port emailadmin fa درگاه کارگزار SMTP +standard emailadmin fa استاندارد +standard imap server emailadmin fa کارگزار استاندارد IMAP +standard pop3 server emailadmin fa کارگزار استاندارد POP3 +standard smtp-server emailadmin fa کارگزار استاندارد SMTP +use ldap defaults emailadmin fa از پیش فرضهای LDAP استفاده شود +use smtp auth emailadmin fa استفاده از تصدیق در SMTP +users can define their own emailaccounts emailadmin fa کاربران می توانند حسابهای کاربری را خودشان تعریف کنند diff --git a/emailadmin/lang/egw_fi.lang b/emailadmin/lang/egw_fi.lang new file mode 100644 index 0000000000..9bd880b397 --- /dev/null +++ b/emailadmin/lang/egw_fi.lang @@ -0,0 +1,149 @@ +%1 entries deleted. emailadmin fi %1 tapahtumaa poistettu +account '%1' not found !!! emailadmin fi Tiliä '%1' ei löytynyt !!! +active templates emailadmin fi Aktiiviset mallipohjat +add new email address: emailadmin fi Lisää uusi sähköpostiosoite +add profile emailadmin fi Lisää profiili +admin dn emailadmin fi Admin dn +admin password emailadmin fi Admin salasana +admin username emailadmin fi Admin käyttäjätunnus +advanced options emailadmin fi Lisäasetukset +alternate email address emailadmin fi Vaihtoehtoinen sähköpostiosoite +any application emailadmin fi Mikä tahansa sovellus +any group emailadmin fi Mikä tahansa ryhmä +any user emailadmin fi Kuka tahansa käyttäjä +back to admin/grouplist emailadmin fi Takaisin Admin/Ryhmäluetteloon +back to admin/userlist emailadmin fi Takaisin Admin/Käyttäjäluetteloon +bad login name or password. emailadmin fi Väärä käyttäjätunnus tai salasana +bad or malformed request. server responded: %s emailadmin fi Väärä tai viallinen pyyntö. Serveri palauttaa: %s +bad request: %s emailadmin fi Väärä pyyntö: %s +can be used by application emailadmin fi Sovellukselle +can be used by group emailadmin fi Ryhmälle +can be used by user emailadmin fi Käyttäjälle +connection dropped by imap server. emailadmin fi Yhteys IMAP palvelimeen katkesi. +could not complete request. reason given: %s emailadmin fi Pyyntöä ei voitu toteuttaa. Syynä oli: %s +could not open secure connection to the imap server. %s : %s. emailadmin fi Turvattua yhteyttä IMAP palvelimeen ei voitu avata. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. emailadmin fi CRAM-MD5 tai DIGEST-MD5 käyttö edellyttää Auth_SASL paketin asentamista. +cyrus imap server emailadmin fi Cyrus IMAP -palvelin +cyrus imap server administration emailadmin fi Cyrus IMAP -palvelimen hallinta +default emailadmin fi Oletus +deliver extern emailadmin fi Deliver extern +do not validate certificate emailadmin fi Älä tarkista sertifikaattia +do you really want to delete this profile emailadmin fi Haluatko varmasti poistaa tämän profiilin? +do you really want to reset the filter for the profile listing emailadmin fi Haluatko varmasti nähdä profiililuettelon? +domainname emailadmin fi Verkkotunnus +edit email settings emailadmin fi Muokkaa sähköpostin asetuksia +email account active emailadmin fi Sähköpostitili käytössä +email address emailadmin fi Sähköpostiosoite +email settings common fi Sähköpostin asetukset +emailadmin emailadmin fi Sähköpostin ylläpito (EmailAdmin) +emailadmin: group assigned profile common fi EmailAdmin: Ryhmälle suunnattu profiili +emailadmin: user assigned profile common fi EmailAdmin: Käyttäjälle suunnattu profiili +enable cyrus imap server administration emailadmin fi Ota Cyrus IMAP -palvelimen hallinta käyttöön +enable sieve emailadmin fi Ota Sieve käyttöön +encrypted connection emailadmin fi Yhteyden suojaus +encryption settings emailadmin fi Yhteyden suojausasetukset +enter your default mail domain (from: user@domain) emailadmin fi Anna oletusverkkotunnus (käyttäjä@verkkotunnus) +entry saved emailadmin fi Tallennettu +error connecting to imap server. %s : %s. emailadmin fi Virhe yhdistettäessä IMAP palvelimeen. %s : %s. +error connecting to imap server: [%s] %s. emailadmin fi Virhe yhdistettäessä IMAP palvelimeen. [%s] %s. +error deleting entry! emailadmin fi Virhe poistettaessa! +error saving the entry!!! emailadmin fi Virhe tallennettaessa! +filtered by account emailadmin fi Käyttäjätilien mukaan +filtered by group emailadmin fi Ryhmän mukaan +forward also to emailadmin fi Välitä osoitteeseen +forward email's to emailadmin fi Välitä osoitteeseen +forward only emailadmin fi Välitä +global options emailadmin fi Yleiset asetukset +if using ssl or tls, you must have the php openssl extension loaded. emailadmin fi Jos SSL tai TLS on käytössä, PHP openssl lisäosa pitää olla ladattuna. +imap admin password admin fi IMAP admin salasana +imap admin user admin fi IMAP admin käyttäjätunnus +imap c-client version < 2001 emailadmin fi IMAP C-Client versio < 2001 +imap server closed the connection. emailadmin fi IMAP palvelin katkaisi yhteyden. +imap server closed the connection. server responded: %s emailadmin fi IMAP palvelin katkaisi yhteyden. Palvelin vastaa: %s +imap server hostname or ip address emailadmin fi IMAP -palvelimen nimi tai IP-osoite +imap server logintyp emailadmin fi IMAP -palvelimen käyttäjätunnistus +imap server name emailadmin fi IMAP -palvelimen nimi +imap server port emailadmin fi IMAP -palvelimen portti +imap/pop3 server name emailadmin fi IMAP / POP3 -palvelimen nimi +in mbyte emailadmin fi megatavua +inactive emailadmin fi Ei käytössä +ldap basedn emailadmin fi LDAP basedn +ldap server emailadmin fi LDAP -palvelin +ldap server accounts dn emailadmin fi LDAP -tunnusten DN +ldap server admin dn emailadmin fi LDAP -ylläpidon DN +ldap server admin password emailadmin fi LDAP -hallinnan salasana +ldap server hostname or ip address emailadmin fi LDAP -palvelimen nimi tai IP-osoite +ldap settings emailadmin fi LDAP -asetukset +leave empty for no quota emailadmin fi Jätä tyhjäksi, jos ei rajoiteta +mail settings admin fi Sähköpostin asetukset +manage stationery templates emailadmin fi Hallitse sähköpostin taustakuva -mallipohjia +name of organisation emailadmin fi Organisaation nimi +no alternate email address emailadmin fi Ei vaihtoehtoista osoitetta +no encryption emailadmin fi Ei suojausta +no forwarding email address emailadmin fi Välityksen sähköpostiosoitetta ei löytynyt +no message returned. emailadmin fi Viestiä ei palautettu +no supported imap authentication method could be found. emailadmin fi Tuettua IMAP tunnistustapaa ei löydetty. +order emailadmin fi Järjestys +organisation emailadmin fi Organisaatio +plesk can't rename users --> request ignored emailadmin fi Plesk ei voi nimetä käyttäjiä --> pyyntö hylätty +plesk imap server (courier) emailadmin fi Plesk IMAP palvelin (Courier) +plesk mail script '%1' not found !!! emailadmin fi Plesk sähköpostiskriptiä '%1' ei löydy !!! +plesk requires passwords to have at least 5 characters and not contain the account-name --> password not set!!! emailadmin fi Plesk:n salasanassa pitää olla vähintään 5 merkkiä, eikä se saa olla käyttäjätilin nimi --> salasanaa EI ole asetettu !!! +plesk smtp-server (qmail) emailadmin fi Plesk SMTP-palvelin (Qmail) +pop3 server hostname or ip address emailadmin fi POP3 -palvelimen nimi tai IP-osoite +pop3 server port emailadmin fi POP3 -palvelimen portti +postfix with ldap emailadmin fi Postfix ja LDAP +profile access rights emailadmin fi Profiilin ACL-oikeudet +profile is active emailadmin fi Profiili on aktiivinen +profile list emailadmin fi Profiileiluettelo +profile name emailadmin fi Profiilin nimi +qmaildotmode emailadmin fi qmaildotmode +qouta size in mbyte emailadmin fi Tallennuskiintiö Mt +quota settings emailadmin fi Tallennuskiintiön asetukset +remove emailadmin fi Poista +reset filter emailadmin fi Poista suodatin +select type of imap server emailadmin fi Valitse IMAP -palvelimen tyyppi +select type of imap/pop3 server emailadmin fi Valitse IMAP / POP3 -palvelimen tyyppi +select type of smtp server emailadmin fi Valitse SMTP -palvelimen tyyppi +send using this email-address emailadmin fi Lähetä käyttäen tätä sähköpostiosoitetta +server settings emailadmin fi Palvelimen asetukset +sieve server hostname or ip address emailadmin fi Sieve -palvelimen nimi tai IP-osoite +sieve server port emailadmin fi Sieve -palvelimen portti +sieve settings emailadmin fi Sieven asetukset +smtp authentication emailadmin fi SMTP -tunnistus +smtp options emailadmin fi SMTP -asetukset +smtp server name emailadmin fi SMTP -palvelimen nimi +smtp settings emailadmin fi SMTP -asetukset +smtp-server hostname or ip address emailadmin fi SMTP -palvelimen nimi tai IP-osoite +smtp-server port emailadmin fi SMTP -palvelimen portti +standard emailadmin fi Vakio +standard imap server emailadmin fi Vakio IMAP -palvelin +standard pop3 server emailadmin fi Vakio POP3 -palvelin +standard smtp-server emailadmin fi Vakio SMTP -palvelin +starts with emailadmin fi Alkaa: +stationery emailadmin fi Sähköpostin taustakuva-mallipohjat +the imap server does not appear to support the authentication method selected. please contact your system administrator. emailadmin fi IMAP palvelimelta ei löydy tukea valitulle tunnistusmuodolle, ota yhteyttä järjestelmän pääkäyttäjään. +this php has no imap support compiled in!! emailadmin fi Tämä PHP ei sisällä IMAP tukea!! +to use a tls connection, you must be running a version of php 5.1.0 or higher. emailadmin fi Käyttääksesi TLS yhteyttä, sinulla pitää olla käytössä PHP 5.1.0 tai uudempi versio. +unexpected response from server to authenticate command. emailadmin fi Odottamaton vastaus palvelimen AUTHENTICATE komennolta. +unexpected response from server to digest-md5 response. emailadmin fi Odottamaton vastaus palvelimen Digest-MD5 vastauksesta. +unexpected response from server to login command. emailadmin fi Odottamaton vastaus palvelimen LOGIN komennolta. +unknown imap response from the server. server responded: %s emailadmin fi Tuntematon IMAP vastaus palvelimelta. Palvelin vastasi: %s +unsupported action '%1' !!! emailadmin fi Toiminto, jota ei tueta '%1' !!! +update current email address: emailadmin fi Päivitä nykyinen sähköpostiosoite: +use ldap defaults emailadmin fi Käytä LDAP -oletuksia +use predefined username and password defined below emailadmin fi Käytä esimääriteltyä käyttäjänimeä ja salasanaa +use smtp auth emailadmin fi Käytä SMTP -käyttäjätunnistusta +use tls authentication emailadmin fi Käytä TLS -käyttäjätunnistusta +use tls encryption emailadmin fi Käytä TLS -salausta +use users email-address (as seen in useraccount) emailadmin fi Käytä käyttäjän sähköpostiosoitetta +user can edit forwarding address emailadmin fi Käyttäjä voi muokata välitys osoitetta +username (standard) emailadmin fi Käyttäjätunnus (standardi) +username/password defined by admin emailadmin fi Adminin määrittelemä Käyttäjätunnus/salasana +username@domainname (virtual mail manager) emailadmin fi käyttäjätunnus@verkkotunnus (Virtual MAIL ManaGeR) +users can define their own emailaccounts emailadmin fi Käyttäjät voivat määritellä omia (uusia) sähköpostitilejä +users can define their own identities emailadmin fi Käyttäjät voivat määritellä omia (uusia) identiteettejä +users can define their own signatures emailadmin fi Käyttäjät voivat määritellä omia (uusia) allekirjoituksia +users can utilize these stationery templates emailadmin fi Käyttäjät voivat määritellä omia sähköpostin taustakuva-mallipohjia +vaction messages with start- and end-date require an admin account to be set! emailadmin fi Lomavastaajaviestit alkamis- ja loppumispäiväyksellä vaativat Admin-tilin asetuksen. +virtual mail manager emailadmin fi Virtual MAIL ManaGeR diff --git a/emailadmin/lang/egw_fr.lang b/emailadmin/lang/egw_fr.lang new file mode 100644 index 0000000000..51b247c648 --- /dev/null +++ b/emailadmin/lang/egw_fr.lang @@ -0,0 +1,122 @@ +account '%1' not found !!! emailadmin fr Le compte %1 n'a pas été trouvé!!! +add new email address: emailadmin fr Ajouter une nouvelle adresse email: +add profile emailadmin fr Ajouter un profil +admin dn emailadmin fr DN administrateur +admin password emailadmin fr Mot de passe administrateur +admin username emailadmin fr Nom d'utilisateur de l'administrateur +advanced options emailadmin fr Options avancées +alternate email address emailadmin fr Adresse email alternative +any application emailadmin fr Toutes les applications +any group emailadmin fr Tous les groupes +bad login name or password. emailadmin fr ID login ou mot de passe erroné +bad or malformed request. server responded: %s emailadmin fr Requête invalide ou erronnée. Réponse serveur: %s +bad request: %s emailadmin fr Requête invalide: %s +can be used by application emailadmin fr Peut être utilisée par application +can be used by group emailadmin fr Peut être utilisée par groupe +connection dropped by imap server. emailadmin fr Connexion interrompue par le Serveur IMAP. +could not complete request. reason given: %s emailadmin fr Impossible d'effectuer la requête. Raison invoquée: %s +could not open secure connection to the imap server. %s : %s. emailadmin fr Impossible d'ouvrir la connexion sécurisée avec le serveur IMAP. %s: %s +cram-md5 or digest-md5 requires the auth_sasl package to be installed. emailadmin fr CRAM-MD5 ou DIGEST-MD5 requiert l'installation du progiciel Auth_SASL +cyrus imap server emailadmin fr Serveur Cyrus IMAP +cyrus imap server administration emailadmin fr Administration du serveur Cyrus IMAP +default emailadmin fr défaut +deliver extern emailadmin fr Relai de messagerie +do not validate certificate emailadmin fr ne pas valider le certificat +do you really want to delete this profile emailadmin fr Voulez-vous vraiment supprimer ce profil? +domainname emailadmin fr Nom de domaine +edit email settings emailadmin fr Modifier les paramètres de messagerie +email account active emailadmin fr Compte de messagerie actif +email address emailadmin fr Adresse de messagerie +email settings common fr Paramètres de messagerie +emailadmin emailadmin fr Administration de la messagerie +enable cyrus imap server administration emailadmin fr Activer la gestion du serveur Cyrus IMAP +enable sieve emailadmin fr Activer Sieve +encrypted connection emailadmin fr connexion chiffrée +encryption settings emailadmin fr Paramètres de chiffrement +enter your default mail domain (from: user@domain) emailadmin fr Introduisez votre domaine par défaut (utilisateur@domaine.com) +error connecting to imap server. %s : %s. emailadmin fr Erreur de connexion avec le serveur IMAP. %s: %s. +error connecting to imap server: [%s] %s. emailadmin fr Erreur de connexion avec le serveur IMAP. [%s] %s. +forward also to emailadmin fr Transférer aussi à +forward email's to emailadmin fr Transférer les emails à +forward only emailadmin fr Seulement transférer +global options emailadmin fr Options globales +if using ssl or tls, you must have the php openssl extension loaded. emailadmin fr Si vous utilisez SSl ou TLS, vous devez avoir chargé l'extension PHP openssl +imap admin password admin fr Mot de passe de l'administrateur IMAP +imap admin user admin fr ID administrateur IMAP +imap c-client version < 2001 emailadmin fr IMAP C-Client Version < 2001 +imap server closed the connection. emailadmin fr Le serveur IMAP a interrompu la connexion. +imap server closed the connection. server responded: %s emailadmin fr Le serveur IMAP a interrompu la connexion. Réponse du serveur: %s. +imap server hostname or ip address emailadmin fr Nom du serveur IMAP ou adresse IP +imap server logintyp emailadmin fr Type d'authentification IMAP +imap server name emailadmin fr Nom du serveur IMAP +imap server port emailadmin fr Port IMAP +imap/pop3 server name emailadmin fr Nom du serveur IMAP/POP3 +in mbyte emailadmin fr en Mo +ldap basedn emailadmin fr LDAP DN de base +ldap server emailadmin fr LDAP Serveur +ldap server accounts dn emailadmin fr LDAP DN contenant les comptes utilisateurs +ldap server admin dn emailadmin fr LDAP DN administrateur +ldap server admin password emailadmin fr LDAP Mot de passe administateur +ldap server hostname or ip address emailadmin fr LDAP Nom du serveur ou adresse IP +ldap settings emailadmin fr LDAP Paramètres +leave empty for no quota emailadmin fr Laisser vide pour ne pas avoir de quota +mail settings admin fr Paramètres de messagerie +name of organisation emailadmin fr Nom de l'entreprise +no alternate email address emailadmin fr Pas d'adresse email alternative +no encryption emailadmin fr pas de chiffrement +no forwarding email address emailadmin fr Pas d'adresse email de transfert +no message returned. emailadmin fr Aucun message n'est retourné. +no supported imap authentication method could be found. emailadmin fr Il n'a été trouvé aucune méthode d'authentification IMAP supportée +order emailadmin fr Ordre +organisation emailadmin fr Organisation +plesk can't rename users --> request ignored emailadmin fr Plesk ne peut pas renommer les utilisateurs --> requête ignorée +plesk imap server (courier) emailadmin fr Serveur IMAP Plesk (Courier) +plesk mail script '%1' not found !!! emailadmin fr Le script email Plesk '%1' introuvable!!! +plesk requires passwords to have at least 5 characters and not contain the account-name --> password not set!!! emailadmin fr Plesk requiert des mots de passe d'au moins 5 caractères qui ne comprennent pas le nom du compte --> le mot de passe n'est PAS fixé!!! +plesk smtp-server (qmail) emailadmin fr Serveur SMTP Plesk (Qmail) +pop3 server hostname or ip address emailadmin fr Nom ou adresse IP du POP3 +pop3 server port emailadmin fr Port POP3 +postfix with ldap emailadmin fr Postfix avec support LDAP +profile access rights emailadmin fr droits d'accès du profil +profile list emailadmin fr Liste des profils +profile name emailadmin fr Nom de profil +qmaildotmode emailadmin fr qmaildotmode +qouta size in mbyte emailadmin fr Taille du quota en Mo +quota settings emailadmin fr Paramètres de quota +remove emailadmin fr Supprimer +select type of imap server emailadmin fr Sélectionner le type de serveur IMAP +select type of imap/pop3 server emailadmin fr Sélectionner le type de serveur IMAP/POP3 +select type of smtp server emailadmin fr Sélectionner le type de serveur SMTP +server settings emailadmin fr Configuration du serveur +sieve server hostname or ip address emailadmin fr Nom ou adresse IP du serveur Sieve +sieve server port emailadmin fr Port Sieve +sieve settings emailadmin fr Paramètres Sieve +smtp authentication emailadmin fr Authentication SMTP +smtp options emailadmin fr Options SMTP +smtp server name emailadmin fr Nom du serveur SMTP +smtp settings emailadmin fr Paramètres SMTP +smtp-server hostname or ip address emailadmin fr Nom ou adresse IP du serveur SMTP +smtp-server port emailadmin fr Port SMTP +standard emailadmin fr Standard +standard imap server emailadmin fr Serveur IMAP standard +standard pop3 server emailadmin fr Serveur POP3 standard +standard smtp-server emailadmin fr Serveur SMTP standard +the imap server does not appear to support the authentication method selected. please contact your system administrator. emailadmin fr Le serveur IMAP ne supporterait pas la méthode d'authentication sélectionnée. Veuillez contacter votre administrateur système. +this php has no imap support compiled in!! emailadmin fr Ce PHP ne comprend pas de support IMAP!! +to use a tls connection, you must be running a version of php 5.1.0 or higher. emailadmin fr Pour utiliser une connexion TLS, vous devez utiliser une version PHP 5.1.0 ou plus élevée. +unexpected response from server to authenticate command. emailadmin fr Réponse inattendue du serveur à la commande AUTHENTICATE. +unexpected response from server to digest-md5 response. emailadmin fr Réponse inattendue du serveur à la réponse Digest-MD5. +unexpected response from server to login command. emailadmin fr Réponse inattendue du serveur à la commande LOGIN. +unknown imap response from the server. server responded: %s emailadmin fr Réponse IMAP inconnue du serveur. Le serveur a répondu: %s +unsupported action '%1' !!! emailadmin fr Action '%1' non supportée!!! +update current email address: emailadmin fr Mettre à jour l'adresse email actuelle: +use ldap defaults emailadmin fr Utiliser les paramètres LDAP par défaut +use smtp auth emailadmin fr Utiliser l'authentification SMTP +use tls authentication emailadmin fr Utiliser l'authentification TLS +use tls encryption emailadmin fr Utiliser le cryptage TLS +user can edit forwarding address emailadmin fr L'utilisateur peut modifier l'adresse de transfert. +username (standard) emailadmin fr nom de l'utilisateur (standard) +username@domainname (virtual mail manager) emailadmin fr utilisateur@domaine (Virtual MAIL ManaGeR) +users can define their own emailaccounts emailadmin fr Les utilisateurs peuvent définir leurs propres comptes de messagerie +users can define their own signatures emailadmin fr les utilisateurs peuvent définir leurs propres signatures +virtual mail manager emailadmin fr Virtual MAIL ManaGeR diff --git a/emailadmin/lang/egw_hr.lang b/emailadmin/lang/egw_hr.lang new file mode 100755 index 0000000000..05089347a6 --- /dev/null +++ b/emailadmin/lang/egw_hr.lang @@ -0,0 +1,68 @@ +add profile emailadmin hr Add Profile +admin dn emailadmin hr admin dn +admin password emailadmin hr admin password +admin username emailadmin hr admin username +advanced options emailadmin hr advanced options +alternate email address emailadmin hr alternate email address +cyrus imap server emailadmin hr Cyrus IMAP Server +cyrus imap server administration emailadmin hr Cyrus IMAP server administration +default emailadmin hr default +deliver extern emailadmin hr deliver extern +do you really want to delete this profile emailadmin hr Do you really want to delete this Profile +domainname emailadmin hr domainname +edit email settings emailadmin hr edit email settings +email account active emailadmin hr email account active +email address emailadmin hr email address +enable cyrus imap server administration emailadmin hr enable Cyrus IMAP server administration +enable sieve emailadmin hr enable Sieve +enter your default mail domain (from: user@domain) emailadmin hr Enter your default mail domain (from: user@domain) +forward also to emailadmin hr forward also to +forward email's to emailadmin hr forward email's to +forward only emailadmin hr forward only +imap admin password admin hr IMAP admin password +imap admin user admin hr IMAP admin user +imap server hostname or ip address emailadmin hr IMAP server hostname or ip address +imap server logintyp emailadmin hr IMAP server login type +imap server port emailadmin hr IMAP server port +imap/pop3 server name emailadmin hr IMAP/POP3 server name +in mbyte emailadmin hr in MByte +ldap basedn emailadmin hr LDAP basedn +ldap server emailadmin hr LDAP server +ldap server accounts dn emailadmin hr LDAP server accounts DN +ldap server admin dn emailadmin hr LDAP server admin DN +ldap server admin password emailadmin hr LDAP server admin password +ldap server hostname or ip address emailadmin hr LDAP server hostname or ip address +ldap settings emailadmin hr LDAP settings +leave empty for no quota emailadmin hr leave empty for no quota +mail settings admin hr Mail settings +name of organisation emailadmin hr Name of organization +no alternate email address emailadmin hr no alternate email address +no forwarding email address emailadmin hr no forwarding email address +pop3 server hostname or ip address emailadmin hr POP3 server hostname or ip address +pop3 server port emailadmin hr POP3 server port +postfix with ldap emailadmin hr Postfix with LDAP +profile list emailadmin hr Profile List +profile name emailadmin hr Profile Name +qmaildotmode emailadmin hr qmaildotmode +qouta size in mbyte emailadmin hr qouta size in MByte +quota settings emailadmin hr quota settings +remove emailadmin hr remove +select type of imap/pop3 server emailadmin hr Select type of IMAP/POP3 server +select type of smtp server emailadmin hr Select type of SMTP Server +sieve server hostname or ip address emailadmin hr Sieve server hostname or ip address +sieve server port emailadmin hr Sieve server port +sieve settings emailadmin hr Sieve settings +smtp server name emailadmin hr SMTP server name +smtp-server hostname or ip address emailadmin hr SMTP server hostname or IP address +smtp-server port emailadmin hr SMTP server port +standard emailadmin hr Standard +standard imap server emailadmin hr Standard IMAP server +standard pop3 server emailadmin hr Standard POP3 server +standard smtp-server emailadmin hr Standard SMTP server +use ldap defaults emailadmin hr use LDAP defaults +use smtp auth emailadmin hr Use SMTP auth +use tls authentication emailadmin hr Use TLS authentication +use tls encryption emailadmin hr Use TLS encryption +users can define their own emailaccounts emailadmin hr Users can define their own email accounts +virtual mail manager emailadmin hr Virtual MAIL ManaGeR +IMAP C-Client Version < 2001 emailadmin hr IMAP C-Client Version < 2001 diff --git a/emailadmin/lang/egw_hu.lang b/emailadmin/lang/egw_hu.lang new file mode 100644 index 0000000000..09fa47037b --- /dev/null +++ b/emailadmin/lang/egw_hu.lang @@ -0,0 +1,143 @@ +account '%1' not found !!! emailadmin hu '%1' felhasználói azonosító nem található! +active templates emailadmin hu Aktív vázlatok +add new email address: emailadmin hu Új email cím hozzáadása: +add profile emailadmin hu Profil hozzáadása +admin dn emailadmin hu Admin dn +admin password emailadmin hu adminisztrátor jelszava +admin username emailadmin hu adminisztrátor neve +advanced options emailadmin hu haladó beállítások +alternate email address emailadmin hu alternatív emailcím +any application emailadmin hu Bármelyik modul +any group emailadmin hu Bármelyik csoport +any user emailadmin hu bármely felhasználó +back to admin/grouplist emailadmin hu Vissza az csoportok adminisztráláshoz +back to admin/userlist emailadmin hu Vissza a felhasználók adminisztráláshoz +bad login name or password. emailadmin hu Hibás belépési név vagy jelszó. +bad or malformed request. server responded: %s emailadmin hu Hibás kérés. Szerver válasza: %s +bad request: %s emailadmin hu Hibás kérés: %s +can be used by application emailadmin hu Ez a modul használhatja +can be used by group emailadmin hu Ez a csoport használhatja +can be used by user emailadmin hu a felhasználó alkalmazhatja +connection dropped by imap server. emailadmin hu A kapcsolatot az IMAP szerver eldobta. +could not complete request. reason given: %s emailadmin hu Kérést nem lehet teljesíteni. Az ok: %s +could not open secure connection to the imap server. %s : %s. emailadmin hu Nem létesíthető titkos csatorna az IMAP szerverhez. %s : %s +cram-md5 or digest-md5 requires the auth_sasl package to be installed. emailadmin hu CRAM-MD5 vagy DIGEST-MD5 használatához az Auth_SASL csomagot telepíteni kell. +cyrus imap server emailadmin hu Cyrus IMAP-kiszolgáló +cyrus imap server administration emailadmin hu Cyrus IMAP-kiszolgáló adminisztrációja +default emailadmin hu Alapértelmezett +deliver extern emailadmin hu külső kézbesítés +do not validate certificate emailadmin hu ne ellenőrizze a tanúsítványt +do you really want to delete this profile emailadmin hu Valóban törölni kívánja ezt a profilt +do you really want to reset the filter for the profile listing emailadmin hu Valóban törölni szeretnéd a profillista szűrőt? +domainname emailadmin hu tartománynév +edit email settings emailadmin hu email beállítások szerkesztése +email account active emailadmin hu email azonosító aktív +email address emailadmin hu email cím +email settings common hu Email beállítások +emailadmin emailadmin hu EmailAdmin +emailadmin: group assigned profile common hu eMailAdmin: csoport a profilhoz hozzárendelve +emailadmin: user assigned profile common hu eMailAdmin: felhasználó a profilhoz hozzárendelve +enable cyrus imap server administration emailadmin hu Cyrus IMAP-kiszolgáló adminisztrációjának engedélyezése +enable sieve emailadmin hu Sieve engedélyezése +encrypted connection emailadmin hu titkosított kapcsolat +encryption settings emailadmin hu Titkosítás beállításai +enter your default mail domain (from: user@domain) emailadmin hu Adja meg az alapértelmezett levelezési tartományt (a felhasználó@tartomány-ból) +error connecting to imap server. %s : %s. emailadmin hu Hiba történt az IMAP szerverhez csatlakozás közben. %s : %s +error connecting to imap server: [%s] %s. emailadmin hu Hiba történt az IMAP szerverhez csatlakozás közben. [%s ]: %s +filtered by account emailadmin hu Fiók szerint szűrve +filtered by group emailadmin hu Csoport szerint szűrve +forward also to emailadmin hu továbbítsd ide is +forward email's to emailadmin hu email továbbítása ide +forward only emailadmin hu továbbítás csak ide +global options emailadmin hu Globális opciók +if using ssl or tls, you must have the php openssl extension loaded. emailadmin hu SSL vagy TLS használatához a PHP openssl kiterjesztését telepíteni kell. +imap admin password admin hu IMAP adminisztrátor jelszava +imap admin user admin hu IMAP adminisztrátor felhasználóneve +imap c-client version < 2001 emailadmin hu IMAP C-Client verzió < 2001 +imap server closed the connection. emailadmin hu Az IMAP szerver lezárta a kapcsolatot. +imap server closed the connection. server responded: %s emailadmin hu Az IMAP szerver lezárta a kapcsolatot: %s +imap server hostname or ip address emailadmin hu IMAP szerver hosztneve vagy IP címe +imap server logintyp emailadmin hu IMAP szerver bejelentkezési típusa +imap server name emailadmin hu IMAP szerver neve +imap server port emailadmin hu IMAP szerver portja +imap/pop3 server name emailadmin hu IMAP/POP3 szerver neve +in mbyte emailadmin hu MBájtban +inactive emailadmin hu inaktív +ldap basedn emailadmin hu LDAP basedn +ldap server emailadmin hu LDAP szerver +ldap server accounts dn emailadmin hu LDAP szerver accounts DN +ldap server admin dn emailadmin hu LDAP szerver admin DN +ldap server admin password emailadmin hu LDAP szerver adminisztrátorának jelszava +ldap server hostname or ip address emailadmin hu LDAP szerver hosztneve vagy IP címe +ldap settings emailadmin hu LDAP beállítások +leave empty for no quota emailadmin hu hagyja üresen a kvóta figyelmen kívül hagyásához +mail settings admin hu Levelezési beállítások +manage stationery templates emailadmin hu Irodaszer minták kezelése +name of organisation emailadmin hu Szervezet neve +no alternate email address emailadmin hu nincs alternatív email cím +no encryption emailadmin hu titkosítás nélkül +no forwarding email address emailadmin hu nincs továbbküldési email cím +no message returned. emailadmin hu Nincs visszaadott üzenet. +no supported imap authentication method could be found. emailadmin hu Nem található támogatott IMAP hitelesítés. +order emailadmin hu Rendezés +organisation emailadmin hu Szervezet +plesk can't rename users --> request ignored emailadmin hu A Plesk nem tudja átnevezni a felhasználókat -> kérés figyelmen kívül hagyva +plesk imap server (courier) emailadmin hu Plesk IMAP Szerver (Courier) +plesk mail script '%1' not found !!! emailadmin hu Plesk levél szkript '%1' nem található!!! +plesk requires passwords to have at least 5 characters and not contain the account-name --> password not set!!! emailadmin hu Plesk megköveteli, hogy a jelszó legalább 5 karakter legyen és ne tartalmazza a felhasználói nevet --> jelszó beállítása NEM történt meg!!! +plesk smtp-server (qmail) emailadmin hu Plesk SMTP-Szerver (Qmail) +pop3 server hostname or ip address emailadmin hu POP3 szerver hosztneve vagy IP címe +pop3 server port emailadmin hu POP3 szerver portja +postfix with ldap emailadmin hu Postfix LDAP-vel +profile access rights emailadmin hu profil elérési jogosultságok +profile is active emailadmin hu a profil inaktív +profile list emailadmin hu Profil lista +profile name emailadmin hu Profilnév +qmaildotmode emailadmin hu qmaildotmode +qouta size in mbyte emailadmin hu kvóta mérete Megabájtban +quota settings emailadmin hu kvóta beállításai +remove emailadmin hu eltávolítás +reset filter emailadmin hu szűrö törlése +select type of imap server emailadmin hu IMAP szerver típusának kiválasztása +select type of imap/pop3 server emailadmin hu Válassza ki az IMAP/POP3 szerver típusát +select type of smtp server emailadmin hu Válassza ki az SMTP szerver típusát +send using this email-address emailadmin hu Küldés erről az e-mail címről +server settings emailadmin hu Szerver beállítások +sieve server hostname or ip address emailadmin hu Sieve szerver hosztneve vagy IP címe +sieve server port emailadmin hu Sieve szerver port +sieve settings emailadmin hu SIEVE beállítások +smtp authentication emailadmin hu SMTP azonosítás +smtp options emailadmin hu SMTP opciók +smtp server name emailadmin hu SMTP szerver neve +smtp settings emailadmin hu SMTP beállítások +smtp-server hostname or ip address emailadmin hu SMTP szerver hosztneve vagy IP címe +smtp-server port emailadmin hu SMTP szerver portja +standard emailadmin hu Szabványos +standard imap server emailadmin hu Szabványos IMAP-kiszolgáló +standard pop3 server emailadmin hu Szabványos POP3-kiszolgáló +standard smtp-server emailadmin hu Szabványos SMTP-kiszolgáló +stationery emailadmin hu Irodaszer +the imap server does not appear to support the authentication method selected. please contact your system administrator. emailadmin hu Az IMAP szerver úgy tűnik nem támogatja a kiválasztott hitelesítést. Lépjen kapcsolatba az adminisztrátorral. +this php has no imap support compiled in!! emailadmin hu A használt PHP verzió nem tartalmaz IMAP támogatást! (telepíteni kell) +to use a tls connection, you must be running a version of php 5.1.0 or higher. emailadmin hu TLS kapcsolat használatához legalább PHP 5.1.0-val kell rendelkeznie. +unexpected response from server to authenticate command. emailadmin hu Váratlan válasz a szervertől az AUTHENTICATE parancsra. +unexpected response from server to digest-md5 response. emailadmin hu Váratlan válasz a szervertől a Digest-MD5 parancsra. +unexpected response from server to login command. emailadmin hu Váratlan válasz a szervertől a LOGIN parancsra. +unknown imap response from the server. server responded: %s emailadmin hu Váratlan válasz a szervertől: %s +unsupported action '%1' !!! emailadmin hu Nem támogatott művelet '%1' !!! +update current email address: emailadmin hu Jelenlegi email cím frissítése: +use ldap defaults emailadmin hu használja az LDAP alapbeállításokat +use predefined username and password defined below emailadmin hu Használd a lent megadott felhasználónevet és jelszót +use smtp auth emailadmin hu SMTP hitelesítés használata +use tls authentication emailadmin hu TLS hitelesítés használata +use tls encryption emailadmin hu TLS kódolás használata +user can edit forwarding address emailadmin hu Felhasználó szerkesztheti a továbbításkor a címeket +username (standard) emailadmin hu felhasználó név (standard) +username/password defined by admin emailadmin hu Az adminisztrátok által meghatározott felhasználó és jelszó +username@domainname (virtual mail manager) emailadmin hu felhasználónév@tartománynév (Virtual MAIL ManaGeR) +users can define their own emailaccounts emailadmin hu A felhasználók saját maguk állíthatják be az email postafiókjaikat +users can define their own identities emailadmin hu A felhasználók beállíthatják a saját azonosítójukat +users can define their own signatures emailadmin hu A felhasználók beállíthatják a saját aláírásukat +users can utilize these stationery templates emailadmin hu A felhasználók alkalmazhatják az irodaszer mintákat +vaction messages with start- and end-date require an admin account to be set! emailadmin hu A házon kívül üzenet érvényességi dátumának megadása adminisztrátor szintű hozzáférést igényel! +virtual mail manager emailadmin hu Virtuális MAIL ManaGeR diff --git a/emailadmin/lang/egw_it.lang b/emailadmin/lang/egw_it.lang new file mode 100644 index 0000000000..4d24e3efe4 --- /dev/null +++ b/emailadmin/lang/egw_it.lang @@ -0,0 +1,97 @@ +account '%1' not found !!! emailadmin it Account '%1' non trovato !!! +add profile emailadmin it Aggiungi Profilo +admin dn emailadmin it dn amministratore +admin password emailadmin it password amministratore +admin username emailadmin it username amministratore +advanced options emailadmin it opzioni avanzate +alternate email address emailadmin it indirizzo email alternativo +any application emailadmin it ogni applicazione +any group emailadmin it ogni gruppo +bad login name or password. emailadmin it Nome utente o password errati. +bad or malformed request. server responded: %s emailadmin it Richiesta errata o mal composta. Il Server ha risposto: %s +bad request: %s emailadmin it Richiesta errata: %s +can be used by application emailadmin it può essere usato da applicazione +can be used by group emailadmin it può essere usato da gruppo +connection dropped by imap server. emailadmin it Connessione interrotta dal sever IMAP. +could not complete request. reason given: %s emailadmin it Impossibile completare la richiesta. Motivazione data: %s +could not open secure connection to the imap server. %s : %s. emailadmin it Non è possibile aprire una connessione sicura al server IMAP. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. emailadmin it CRAM-MD5 o DIGEST-MD5 richiede che il pacchetto Auth_SASL sia installato. +cyrus imap server emailadmin it Server IMAP Cyrus +cyrus imap server administration emailadmin it Amministrazione Server IMAP Cyrus +default emailadmin it predefinito +do you really want to delete this profile emailadmin it Vuoi davvero cancellare questo Profilo +domainname emailadmin it nome dominio +edit email settings emailadmin it modifica impostazioni email +email account active emailadmin it account email attivo +email address emailadmin it indirizzo email +email settings common it Impostazioni email +emailadmin emailadmin it Gestione Email +enable cyrus imap server administration emailadmin it abilita amministrazione Server IMAP Cyrus +enable sieve emailadmin it abilita Sieve +encryption settings emailadmin it impostazioni cifratura +enter your default mail domain (from: user@domain) emailadmin it Inserisci il tuo dominio di posta predefinito (da: utente@dominio) +error connecting to imap server. %s : %s. emailadmin it Errore in connessione al server IMAP. %s : %s. +error connecting to imap server: [%s] %s. emailadmin it Errore in connessione al server IMAP: [%s] %s. +forward also to emailadmin it Inoltra anche a +forward email's to emailadmin it Inoltra email a +forward only emailadmin it Inoltra solo +global options emailadmin it Opzioni globali +imap admin password admin it Password amministratore IMAP +imap admin user admin it User amministratore IMAP +imap c-client version < 2001 emailadmin it Versione C-Cliente < 2001 +imap server hostname or ip address emailadmin it Nome Host o IP del server IMAP +imap server logintyp emailadmin it Tipo login server IMAP +imap server port emailadmin it Porta server IMAP +imap/pop3 server name emailadmin it Nome server IMAP/POP3 +in mbyte emailadmin it in MByte +ldap basedn emailadmin it LDAP basedn +ldap server emailadmin it server LDAP +ldap server accounts dn emailadmin it DN account server LDAP +ldap server admin dn emailadmin it DN amministratore server LDAP +ldap server admin password emailadmin it password amministratore server LDAP +ldap server hostname or ip address emailadmin it Nome host o IP server LDAP +ldap settings emailadmin it impostazioni LDAP +leave empty for no quota emailadmin it lascia vuoto per nessuna quota +mail settings admin it Impostazioni Posta +name of organisation emailadmin it Nome dell'organizzazione +no alternate email address emailadmin it nessun indirizzo email alternativo +no forwarding email address emailadmin it nessun indirizzo email di inoltro +no message returned. emailadmin it nessun messaggio ricevuto +order emailadmin it ordine +organisation emailadmin it organizzazione +pop3 server hostname or ip address emailadmin it Nome host o IP server POP3 +pop3 server port emailadmin it porta server POP3 +postfix with ldap emailadmin it Postfix con LDAP +profile access rights emailadmin it diritti di accesso profilo +profile list emailadmin it Elenco Profili +profile name emailadmin it Nome Profilo +qmaildotmode emailadmin it qmaildotmode +qouta size in mbyte emailadmin it dimensione quota in MByte +quota settings emailadmin it impostazioni quota +remove emailadmin it rimuovi +select type of imap/pop3 server emailadmin it Seleziona il tipo si server IMAP/POP3 +select type of smtp server emailadmin it Seleziona il tipo di server SMTP +server settings emailadmin it impostazioni server +sieve server hostname or ip address emailadmin it Nome host o IP server Sieve +sieve server port emailadmin it porta server Sieve +sieve settings emailadmin it impostazioni SIeve +smtp authentication emailadmin it autenticazione smtp +smtp options emailadmin it opzioni smtp +smtp server name emailadmin it nome server SMTP +smtp settings emailadmin it impostazioni smtp +smtp-server hostname or ip address emailadmin it Nome host o IP server SMTP +smtp-server port emailadmin it porta server SMTP +standard emailadmin it Standard +standard imap server emailadmin it Server IMAP standard +standard pop3 server emailadmin it Server POP3 standard +standard smtp-server emailadmin it Server SMTP standard +unsupported action '%1' !!! emailadmin it Azione non supportata '%1' !!! +use ldap defaults emailadmin it usa predefiniti LDAP +use smtp auth emailadmin it usa autenticazione SMTP +use tls authentication emailadmin it usa autenticazione TLS +use tls encryption emailadmin it usa crittografia TLS +user can edit forwarding address emailadmin it l'utente può modificare indirizzo di inoltro +username (standard) emailadmin it nome utente (standard) +username@domainname (virtual mail manager) emailadmin it nomeutente@nome dominio (ManaGeR MAIL Virtuale) +users can define their own emailaccounts emailadmin it Gli utenti possono definire i propri account email +virtual mail manager emailadmin it ManaGeR MAIL Virtuale diff --git a/emailadmin/lang/egw_iw.lang b/emailadmin/lang/egw_iw.lang new file mode 100755 index 0000000000..57347f8f30 --- /dev/null +++ b/emailadmin/lang/egw_iw.lang @@ -0,0 +1,68 @@ +add profile emailadmin iw הוסף פרופיל +admin dn emailadmin iw של המנהל dn +admin password emailadmin iw סיסמת מנהל +admin username emailadmin iw שם משתמש של המנהל +advanced options emailadmin iw אופציות מתקדמות +alternate email address emailadmin iw כתובת דואר אלקטרוני חילופי +cyrus imap server emailadmin iw Cyrus IMAP שרת +cyrus imap server administration emailadmin iw Cyrus IMAP ניהול שרת +default emailadmin iw ברירת מחדל +deliver extern emailadmin iw מסירה חיצונית +do you really want to delete this profile emailadmin iw בטוח שברצונך למחוק פרופיל זה +domainname emailadmin iw שם הדומיין +edit email settings emailadmin iw ערוך הגדרות דואר אלקטרוני +email account active emailadmin iw חשבון דואר אלקטרוני פעיל +email address emailadmin iw כתובת דואר אלקטרוני +enable cyrus imap server administration emailadmin iw Cyrus IMAP איפשור ניהול שרת +enable sieve emailadmin iw Sieve אישפור +enter your default mail domain (from: user@domain) emailadmin iw (user@domain :ציין את דומיין דואר המחדלי שלך (לדוגמא +forward also to emailadmin iw להעביר גם אל +forward email's to emailadmin iw להעביר דואר אלקטרוני אל +forward only emailadmin iw העבר בלבד +imap admin password admin iw IMAP סיסמת ניהול +imap admin user admin iw IMAP שם מנהל +imap c-client version < 2001 emailadmin iw IMAP C-Client Version < 2001 +imap server hostname or ip address emailadmin iw שלו IP- או כתובת הIMAP שם שרת +imap server logintyp emailadmin iw IMAP סוג כניסה לשרת +imap server port emailadmin iw IMAP פורט שרת +imap/pop3 server name emailadmin iw IMAP/POP3 שם שרת +in mbyte emailadmin iw MB-ב +ldap basedn emailadmin iw dn הביסי של LDAP +ldap server emailadmin iw LDAP שרת +ldap server accounts dn emailadmin iw LDAP של שרת חשבונות DN +ldap server admin dn emailadmin iw LDAP מנהל שרת של DN +ldap server admin password emailadmin iw LDAP סיסמה של מנהל שרת +ldap server hostname or ip address emailadmin iw IP או כתובת LDAP שם שרת +ldap settings emailadmin iw LDAP הגדרות +leave empty for no quota emailadmin iw השאר ריק ללא הקצאה +mail settings admin iw הגדרות דואר +name of organisation emailadmin iw שם האירגון +no alternate email address emailadmin iw אין כתובת דואר אלקטרוני חלופי +no forwarding email address emailadmin iw אין כתובת להעברת דואר אלקטרוני +pop3 server hostname or ip address emailadmin iw IP או כתובת pop3 שם שרת +pop3 server port emailadmin iw POP3 פורט שרת +postfix with ldap emailadmin iw LDAP עם Postfix +profile list emailadmin iw רשימת פרופילים +profile name emailadmin iw שם פרופיל +qmaildotmode emailadmin iw qmaildotmode +qouta size in mbyte emailadmin iw MB-גודל הקצאה ב +quota settings emailadmin iw הגדרות הקצאה +remove emailadmin iw הסר +select type of imap/pop3 server emailadmin iw IMAP/POP3 בחר סוג שרת +select type of smtp server emailadmin iw SMTP בחר סוג שרת +sieve server hostname or ip address emailadmin iw IP או כתובת Sieve שם שרת +sieve server port emailadmin iw Sieve פורט שרת +sieve settings emailadmin iw Sieve הגדרות +smtp server name emailadmin iw SMTP שם שרת +smtp-server hostname or ip address emailadmin iw IP או כתובת SMTP שם שרת +smtp-server port emailadmin iw SMTP פורת שרת +standard emailadmin iw תקני +standard imap server emailadmin iw תקני IMAP שרת +standard pop3 server emailadmin iw תקני POP3 שרת +standard smtp-server emailadmin iw תקני SMTP שרת +use ldap defaults emailadmin iw LDAP השתמש בברירות מחדל של +use smtp auth emailadmin iw LDAP השתמש באימות משתמשים של +use tls authentication emailadmin iw TLS השתמש באימות +use tls encryption emailadmin iw TLS השתמש בהצפנת +users can define their own emailaccounts emailadmin iw משתמשים יכולים להגדיר בעצמם את חשבונות דואר האלקטרוני שלהם +virtual mail manager emailadmin iw מלהל דואר וירטואלי diff --git a/emailadmin/lang/egw_lt.lang b/emailadmin/lang/egw_lt.lang new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/emailadmin/lang/egw_lt.lang @@ -0,0 +1 @@ + diff --git a/emailadmin/lang/egw_lv.lang b/emailadmin/lang/egw_lv.lang new file mode 100644 index 0000000000..1cbd7303b9 --- /dev/null +++ b/emailadmin/lang/egw_lv.lang @@ -0,0 +1,61 @@ +add profile emailadmin lv Pievienot profilu +admin dn emailadmin lv administratora dn +admin password emailadmin lv administratora parole +admin username emailadmin lv administratora lietotājvārds +advanced options emailadmin lv uzlabotās iespējas +alternate email address emailadmin lv alternatīvas e-pasta adreses +cyrus imap server emailadmin lv Cyrus IMAP serveris +cyrus imap server administration emailadmin lv Cyrus IMAP servera administrēšana +default emailadmin lv noklusējums +do you really want to delete this profile emailadmin lv Vai tu tiešām vēlies dzēst šo profilu? +domainname emailadmin lv domēna vārds +edit email settings emailadmin lv rediģēt e-pasta uzstādījumus +email account active emailadmin lv e-pasta konts aktīvs +email address emailadmin lv e-pasta adrese +enable cyrus imap server administration emailadmin lv atļaut Cyrus IMAP servera administrēšanu +enable sieve emailadmin lv atļaut Sieve +enter your default mail domain (from: user@domain) emailadmin lv Ievadi noklusēto pasta domēnu (no: lietotājs@domēns) +forward also to emailadmin lv pārsūtīt arī +forward email's to emailadmin lv pārsūtīt e-pasta vēstules +forward only emailadmin lv tikai pārsūtīt +imap admin password admin lv IMAP administratora parole +imap admin user admin lv IMAP administrators +imap c-client version < 2001 emailadmin lv IMAP C-Client Version <2001 +imap server hostname or ip address emailadmin lv IMAP servera hosta vārds vai IP adrese +imap server logintyp emailadmin lv IMAP servera autorizācijas veids +imap server port emailadmin lv IMAP servera ports +imap/pop3 server name emailadmin lv IMAP/POP3 servera nosaukums +ldap basedn emailadmin lv LDAP bāzes dn +ldap server emailadmin lv LDAP serveris +ldap server accounts dn emailadmin lv LDAP servera konti DN +ldap server admin dn emailadmin lv LDAP servera administratora DN +ldap server admin password emailadmin lv LDAP servera administratora parole +ldap server hostname or ip address emailadmin lv LDAP servera hosta vārds vai IP adrese +ldap settings emailadmin lv LDAP uzstādījumi +mail settings admin lv Pasta uzstādījumi +name of organisation emailadmin lv Organizācijas nosaukums +no alternate email address emailadmin lv nav alternatīvas e-pasta adreses +no forwarding email address emailadmin lv nav pārsūtāmās e-pasta adreses +pop3 server hostname or ip address emailadmin lv POP3 servera hosta vārds vai IP adrese +pop3 server port emailadmin lv POP3 servera ports +profile list emailadmin lv Profila saraksts +profile name emailadmin lv Profila vārds +remove emailadmin lv pārvietot +select type of imap/pop3 server emailadmin lv Atzīmēt IMAP/POP3 servera tipu +select type of smtp server emailadmin lv Atzīmēt SMTP servera tipu +sieve server hostname or ip address emailadmin lv ?Sieve? servera hosta vārds vai IP adrese +sieve server port emailadmin lv Sieve servera ports +sieve settings emailadmin lv Sieve uzstadījumi +smtp server name emailadmin lv SMTP servera nosaukums +smtp-server hostname or ip address emailadmin lv SMTP servera hosta vārds vai IP adrese +smtp-server port emailadmin lv SMTP servera ports +standard emailadmin lv Standarta +standard imap server emailadmin lv Standarta IMAP serveris +standard pop3 server emailadmin lv Standarta POP3 serveris +standard smtp-server emailadmin lv Standarta SMTP serveris +use ldap defaults emailadmin lv lieto LDAP noklusējumus +use smtp auth emailadmin lv Lieto SMTP autentifikāciju +use tls authentication emailadmin lv Lieto TLS autentifikāciju +use tls encryption emailadmin lv Lieto TLS šifrēšanu +users can define their own emailaccounts emailadmin lv LIetotāji paši var definēt savus e-pasta kontus +virtual mail manager emailadmin lv VIrtuālais MAIL ManaGeR diff --git a/emailadmin/lang/egw_nl.lang b/emailadmin/lang/egw_nl.lang new file mode 100644 index 0000000000..805ed67ccf --- /dev/null +++ b/emailadmin/lang/egw_nl.lang @@ -0,0 +1,138 @@ +account '%1' not found !!! emailadmin nl Account '%1' niet gevonden !!! +add new email address: emailadmin nl Voeg nieuw emailadres toe: +add profile emailadmin nl Profiel toevoegen +admin dn emailadmin nl admin dn +admin password emailadmin nl Admin wachtwoord +admin username emailadmin nl Admin gebruikersnaam +advanced options emailadmin nl Geavanceerde opties +alternate email address emailadmin nl Alternatief emailadres +any application emailadmin nl Iedere toepassing +any group emailadmin nl Iedere groep +any user emailadmin nl iedere gebruiker +back to admin/grouplist emailadmin nl Terug naar Beheer/Groepslijst +back to admin/userlist emailadmin nl Terug naar Beheer/Gebruikerslijst +bad login name or password. emailadmin nl Ongeldige login of paswoord +bad or malformed request. server responded: %s emailadmin nl Ongeldig of slecht geformuleerde aanvraag. Server reageerde: %s +bad request: %s emailadmin nl Slechte vraag: %s +can be used by application emailadmin nl Kan gebruikt worden door toepassing +can be used by group emailadmin nl Kan gebruikt worden door groep +can be used by user emailadmin nl kan door gebruiker gebruikt worden +connection dropped by imap server. emailadmin nl Verbinding viel uit door IMAP server +could not complete request. reason given: %s emailadmin nl Kan verzoek niet afmaken. Opgegeven reden: %s +could not open secure connection to the imap server. %s : %s. emailadmin nl Kon geen veilige verbinding openen met de IMAP server. %s : %s +cram-md5 or digest-md5 requires the auth_sasl package to be installed. emailadmin nl CRAM-MDS of DIGEST-MDS vereist de installatie van het Auth_SASL pakket. +cyrus imap server emailadmin nl Cyrus IMAP-server +cyrus imap server administration emailadmin nl Cyrus IMAP-serverbeheer +default emailadmin nl standaard +deliver extern emailadmin nl bezorg extern +do not validate certificate emailadmin nl het certificaat niet valideren +do you really want to delete this profile emailadmin nl Weet u zeker dat u dit profiel wilt verwijderen +do you really want to reset the filter for the profile listing emailadmin nl Wilt u werkelijk het filter voor de profielenlijst opnieuw instellen +domainname emailadmin nl Domeinnaam +edit email settings emailadmin nl Wijzig emailinstellingen +email account active emailadmin nl Emailaccount actief +email address emailadmin nl Emailadres +email settings common nl Emailinstellingen +emailadmin emailadmin nl EmailAdmin +emailadmin: group assigned profile common nl eMailAdmin: Groep heeft profiel toegewezen gekregen +emailadmin: user assigned profile common nl eMailAdmin: Gebruiker heeft profiel toegewezen gekregen +enable cyrus imap server administration emailadmin nl activier Cyrus IMAP serverbeheer +enable sieve emailadmin nl activeer Sieve +encrypted connection emailadmin nl versleutelde verbinding +encryption settings emailadmin nl encryptie instellingen +enter your default mail domain (from: user@domain) emailadmin nl Voer uw standaard emaildomein in (uit: gebruiker@domein) +error connecting to imap server. %s : %s. emailadmin nl Fout verbinden met de IMAP server. %s : %s +error connecting to imap server: [%s] %s. emailadmin nl Fout verbinden met de IMAP server: [%s] %s +filtered by account emailadmin nl gefilterd op Account +filtered by group emailadmin nl gefilterd op Groep +forward also to emailadmin nl Ook doorsturen naar +forward email's to emailadmin nl Emails doorsturen naar +forward only emailadmin nl Alleen doorsturen +global options emailadmin nl Algemene opties +if using ssl or tls, you must have the php openssl extension loaded. emailadmin nl Indien SSL of TSL wordt gebruikt, moet u de PHP openssl extensie opgeladen hebben +imap admin password admin nl IMAP beheerders wachtwoord +imap admin user admin nl IMAP beheerdersgebruiker +imap c-client version < 2001 emailadmin nl IMAP C-Client Versie < 2001 +imap server closed the connection. emailadmin nl IMAP server sloot de verbinding +imap server closed the connection. server responded: %s emailadmin nl IMAP Server sloot de verbinding. Server reageerde: %s +imap server hostname or ip address emailadmin nl IMAP-server hostnaam of IP-adres +imap server logintyp emailadmin nl IMAP-server logintype +imap server name emailadmin nl imap server naam +imap server port emailadmin nl IMAP-serverpoort +imap/pop3 server name emailadmin nl IMAP/POP3-servernaam +in mbyte emailadmin nl in MBytes +inactive emailadmin nl inactief +ldap basedn emailadmin nl LDAP basedn +ldap server emailadmin nl LDAP-server +ldap server accounts dn emailadmin nl LDAP server accounts DN +ldap server admin dn emailadmin nl LDAP server admin DN +ldap server admin password emailadmin nl LDAP-server admin wachtwoord +ldap server hostname or ip address emailadmin nl LDAP-serverhostnaam of IP-adres +ldap settings emailadmin nl LDAP-instellingen +leave empty for no quota emailadmin nl Laat leeg voor geen quota +mail settings admin nl Mailinstellingen +name of organisation emailadmin nl Naam van de Organisatie +no alternate email address emailadmin nl geen alternatief emailadres +no encryption emailadmin nl geen versleuteling +no forwarding email address emailadmin nl geen emailadres om naar door te sturen +no message returned. emailadmin nl Geen bericht teruggekomen. +no supported imap authentication method could be found. emailadmin nl Geen ondersteunde IMAP authenticatiemethode kon gevonden worden. +order emailadmin nl Volgorde +organisation emailadmin nl Organisatie +plesk can't rename users --> request ignored emailadmin nl Plesk kan gebruikers niet hernoemen --> verzoek genegeerd +plesk imap server (courier) emailadmin nl Plesk IMAP Server (Courier) +plesk mail script '%1' not found !!! emailadmin nl Plesk mail script '%1' niet gevonden !!! +plesk requires passwords to have at least 5 characters and not contain the account-name --> password not set!!! emailadmin nl Plesk vereist dat wachtwoorden minstens 5 karakters bevatten en niet de accountnaam mogen bevatten --> wachtwoord niet gewijzigd !!! +plesk smtp-server (qmail) emailadmin nl Plesk SMTP-Server (Qmail) +pop3 server hostname or ip address emailadmin nl POP3-server hostnaam of IP-adres +pop3 server port emailadmin nl POP3-serverpoort +postfix with ldap emailadmin nl Postfix met LDAP +profile access rights emailadmin nl profiel toegangsrechten +profile is active emailadmin nl profiel is actief +profile list emailadmin nl Profiellijst +profile name emailadmin nl Profielnaam +qmaildotmode emailadmin nl qmaildotmode +qouta size in mbyte emailadmin nl quota grootte in MBytes +quota settings emailadmin nl Quota-installingen +remove emailadmin nl Verwijderen +reset filter emailadmin nl filter opnieuw instellen +select type of imap server emailadmin nl selecteer IMAP servertype +select type of imap/pop3 server emailadmin nl Selecteer IMAP/POP3-servertype +select type of smtp server emailadmin nl Selecteer SMTP-servertype +server settings emailadmin nl server instellingen +sieve server hostname or ip address emailadmin nl Sieve-serverhostnaam of IP-adres +sieve server port emailadmin nl Sieve-serverpoort +sieve settings emailadmin nl Sieve instellingen +smtp authentication emailadmin nl SMTP authenticatie +smtp options emailadmin nl SMTP opties +smtp server name emailadmin nl SMTP-servernaam +smtp settings emailadmin nl SMTP instellingen +smtp-server hostname or ip address emailadmin nl SMTP-serverhostnaam of IP-adres +smtp-server port emailadmin nl SMTP-serverpoort +standard emailadmin nl Standaard +standard imap server emailadmin nl Standaard IMAP-server +standard pop3 server emailadmin nl Standaard POP3-server +standard smtp-server emailadmin nl Standaard SMTP-server +the imap server does not appear to support the authentication method selected. please contact your system administrator. emailadmin nl The IMAP server blijkt geen authenticatiemethode te ondersteunen. Gelieve uw systeembeheerder te contacteren. +this php has no imap support compiled in!! emailadmin nl Deze PHP heeft geen IMAP ondersteuning verzamelt in!! +to use a tls connection, you must be running a version of php 5.1.0 or higher. emailadmin nl Om een TLS verbinding te gebruiken, moet u een versie van PHP 5.1.0 of hoger gebruiken. +unexpected response from server to authenticate command. emailadmin nl Onverwachte reactie van de server om de opdracht te AUTHENTICEREN. +unexpected response from server to digest-md5 response. emailadmin nl Onverwachte reactie van de server op Digest-MD5 reactie. +unexpected response from server to login command. emailadmin nl Onverwachte reactie van de server op LOGIN opdracht. +unknown imap response from the server. server responded: %s emailadmin nl Onverwachte IMAP reactie van de server. Server reageerde: %s +unsupported action '%1' !!! emailadmin nl Niet-ondersteunde actie '%1' +update current email address: emailadmin nl Huidige emailadres bijwerken: +use ldap defaults emailadmin nl gebruik LDAP standaard instellingen +use predefined username and password defined below emailadmin nl Gebruik voorgekozen gebruikersnaam en wachtwoord zoals hieronder is ingesteld +use smtp auth emailadmin nl Gebruik SMTP authenticatie +use tls authentication emailadmin nl Gebruik TLS authenticatie +use tls encryption emailadmin nl Gebruik TLS-encryptie +user can edit forwarding address emailadmin nl Gebruiker kan het doorstuuradres aanpassen +username (standard) emailadmin nl gebruikersnaam (standaard) +username/password defined by admin emailadmin nl Gebruikersnaam/Wachtwoord ingesteld door beheerder +username@domainname (virtual mail manager) emailadmin nl gebruikersnaam@domeinnaam (Virtual MAIL ManaGeR) +users can define their own emailaccounts emailadmin nl Gebruikers kunnen hun eigen emailaccounts definiëren +users can define their own identities emailadmin nl gebruikers kunnen hun eigen identiteit instellen +users can define their own signatures emailadmin nl gebruikers kunnen hun eigen ondertekening instellen +vaction messages with start- and end-date require an admin account to be set! emailadmin nl Afwezigheidsmeldingen met een start- en einddatum vereisen dat een beheerders account is ingesteld! +virtual mail manager emailadmin nl Virtual MAIL ManaGeR diff --git a/emailadmin/lang/egw_no.lang b/emailadmin/lang/egw_no.lang new file mode 100644 index 0000000000..a180b7ac22 --- /dev/null +++ b/emailadmin/lang/egw_no.lang @@ -0,0 +1,68 @@ +add profile emailadmin no Legg til profil +admin dn emailadmin no Admin dn +admin password emailadmin no Admin passord +admin username emailadmin no Admin brukernavn +advanced options emailadmin no Avanserte valg +alternate email address emailadmin no Alternativ e-mailadresse +cyrus imap server emailadmin no Cyrus IMAP tjener +cyrus imap server administration emailadmin no Cyrys IMAP tjeneradministrasjon +default emailadmin no standard +deliver extern emailadmin no lever eksternt +do you really want to delete this profile emailadmin no Ønsker du virkelig å slette denne profilen +domainname emailadmin no Domenenavn +edit email settings emailadmin no Rediger e-mail oppsett +email account active emailadmin no E-mailkonto aktiv +email address emailadmin no E-mailadresse +enable cyrus imap server administration emailadmin no Tillat Cyrus IMAP-tjener administrasjon +enable sieve emailadmin no Tillat Sieve +enter your default mail domain (from: user@domain) emailadmin no Registrer ditt standard Emaildomene (fra: bruker@domene) +forward also to emailadmin no videresend også til +forward email's to emailadmin no videresend e-mailer til +forward only emailadmin no bare videresending +imap admin password admin no IMAP Administrasjonspassord +imap admin user admin no IMAP Administrasjonsbruker +imap c-client version < 2001 emailadmin no IMAP C-klient versjon < 2001 +imap server hostname or ip address emailadmin no Tjenernavn eller IP-adresse for IMAP tjener +imap server logintyp emailadmin no IMAP Tjener påloggingstype +imap server port emailadmin no IMAP Tjenerport +imap/pop3 server name emailadmin no IMAP/POP3 tjenernavn +in mbyte emailadmin no i MByte +ldap basedn emailadmin no LDAP basedn +ldap server emailadmin no LDAP Tjener +ldap server accounts dn emailadmin no LDAP Tjenerkonti DN +ldap server admin dn emailadmin no LDAP Tjeneradmin. DN +ldap server admin password emailadmin no LDAP Tjeneradmin. passord +ldap server hostname or ip address emailadmin no Tjenernavn eller IP-adresse for LDAP tjener +ldap settings emailadmin no LDAP Instillinger +leave empty for no quota emailadmin no La stå tomt for ingen begrensning. +mail settings admin no E-post innstillinger +name of organisation emailadmin no Navn på organisasjon +no alternate email address emailadmin no ingen alternativ e-mailadresse +no forwarding email address emailadmin no ingen e-mailadresse for videresending +pop3 server hostname or ip address emailadmin no Tjenernavn eller IP-adresse for POP3 tjener +pop3 server port emailadmin no POP3 Tjenerport +postfix with ldap emailadmin no Postfix med LDAP +profile list emailadmin no Profilliste +profile name emailadmin no Profilnavn +qmaildotmode emailadmin no qmaildotmodus +qouta size in mbyte emailadmin no Grense Str. i Mbyte +quota settings emailadmin no Grenseinstillinger +remove emailadmin no fjern +select type of imap/pop3 server emailadmin no Velg type for IMAP/POP3 Tjener +select type of smtp server emailadmin no Velg type SMTP Tjener +sieve server hostname or ip address emailadmin no Tjenernavn eller IP-adresse for Sieve-tjener +sieve server port emailadmin no Sieve tjenerport +sieve settings emailadmin no Sieve innstillinger +smtp server name emailadmin no SMTP Tjenernavn +smtp-server hostname or ip address emailadmin no Tjenernavn eller IP-Adresse for SMTP-Tjener +smtp-server port emailadmin no SMTP Tjenerport +standard emailadmin no standard +standard imap server emailadmin no Standard IMAP tjener +standard pop3 server emailadmin no Standard POP3 tjener +standard smtp-server emailadmin no Standard SMTP tjener +use ldap defaults emailadmin no Bruk LDAP standaroppsett +use smtp auth emailadmin no Bruk SMTP autentisering +use tls authentication emailadmin no Bruk TLS autentisering +use tls encryption emailadmin no Bruk TLS kryptering +users can define their own emailaccounts emailadmin no Brukere kan definere egne e-post kontoer +virtual mail manager emailadmin no Virtuell Mail Manager diff --git a/emailadmin/lang/egw_pl.lang b/emailadmin/lang/egw_pl.lang new file mode 100644 index 0000000000..a1a2bcbd17 --- /dev/null +++ b/emailadmin/lang/egw_pl.lang @@ -0,0 +1,108 @@ +account '%1' not found !!! emailadmin pl Konto '%1' nie zostało znalezione! +add new email address: emailadmin pl Dodaj nowy adres poczty elektronicznej: +add profile emailadmin pl Dodaj profil +admin dn emailadmin pl DN (nazwa wyróżniająca) administratora +admin password emailadmin pl Hasło administratora +admin username emailadmin pl Nazwa użytkownika konta administratora +advanced options emailadmin pl Ustawienia zaawansowane +alternate email address emailadmin pl Alternatywny adres email +any application emailadmin pl Dowolna aplikacja +any group emailadmin pl Dowolna grupa +bad login name or password. emailadmin pl Zła nazwa użytkownika lub hasło +bad or malformed request. server responded: %s emailadmin pl Nieprawidłowe lub źle skonstruowane żądane. Serwer odpowiedział: %s +bad request: %s emailadmin pl Nieprawidłowe żądanie: %s +can be used by application emailadmin pl Może być używane przez aplikację +can be used by group emailadmin pl Może byc używane przez grupę +connection dropped by imap server. emailadmin pl Połączenie zerwane przez serwer IMAP +could not complete request. reason given: %s emailadmin pl Nie udało się zrealizować żądania. Powód: %s +could not open secure connection to the imap server. %s : %s. emailadmin pl Nie udało się stworzyć bezpiecznego połączenia do serwera IMAP. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. emailadmin pl CRAM-MD5 lub DIGEST-MD5 wymagają, aby pakiet Auth_SASL (Perl) był zainstalowany +cyrus imap server emailadmin pl Serwer IMAP Cyrus +cyrus imap server administration emailadmin pl Administracja serwerem IMAP Cyrus +default emailadmin pl domyślny +deliver extern emailadmin pl dostarczanie na zewnątrz +do you really want to delete this profile emailadmin pl Czy na pewno chcesz usunąć ten profil? +domainname emailadmin pl Nazwa domeny +edit email settings emailadmin pl Edytuj ustawienia poczty elektronicznej +email account active emailadmin pl Konto poczty aktywne +email address emailadmin pl Adres poczty elektronicznej +email settings common pl Ustawienia poczty elektronicznej +emailadmin emailadmin pl Poczta Elektroniczna - Administracja +enable cyrus imap server administration emailadmin pl aktywuj administrację serwerem IMAP Cyrus +enable sieve emailadmin pl aktywuj sito (Sieve) +encryption settings emailadmin pl ustawienia szyfrowania +enter your default mail domain (from: user@domain) emailadmin pl Wprowadź domyślną domenę pocztową (z użytkownik@domena) +error connecting to imap server. %s : %s. emailadmin pl Błąd połączenia do serwera IMAP. %s : %s +error connecting to imap server: [%s] %s. emailadmin pl Błąd połączenia do serwera IMAP. [%s] %s +forward also to emailadmin pl Prześlij również do +forward email's to emailadmin pl Prześlij wiadomości do +forward only emailadmin pl Prześlij tylko +global options emailadmin pl Ustawienia globalne +if using ssl or tls, you must have the php openssl extension loaded. emailadmin pl Jeżeli korzystasz z SSL lub TLS, musisz zapewnić obsługę OpenSSL w PHP. +imap admin password admin pl Hasło administratora IMAP +imap admin user admin pl Login administratora IMAP +imap c-client version < 2001 emailadmin pl Wersja C-Client IMAP < 2001 +imap server closed the connection. emailadmin pl Serwer IMAP zakończył połączenie. +imap server closed the connection. server responded: %s emailadmin pl Serwer IMAP zakończył połączenie. Jego odpowiedź: %s +imap server hostname or ip address emailadmin pl Nazwa hosta lub IP serwera IMAP +imap server logintyp emailadmin pl Sposób logowania do serwera IMAP +imap server port emailadmin pl Port serwera IMAP +imap/pop3 server name emailadmin pl Nazwa serwera IMAP/POP3 +in mbyte emailadmin pl w megabajtach +ldap basedn emailadmin pl Bazowy DN w LDAP +ldap server emailadmin pl Serwer LDAP +ldap server accounts dn emailadmin pl DN dla kont w LDAP +ldap server admin dn emailadmin pl DN administratora w LDAP +ldap server admin password emailadmin pl Hasło administratora serwera LDAP +ldap server hostname or ip address emailadmin pl Nazwa hosta lub IP serwera LDAP +ldap settings emailadmin pl Ustawienia LDAP +leave empty for no quota emailadmin pl zostaw puste aby wyłączyć quota +mail settings admin pl Ustawienia poczty elektronicznej +name of organisation emailadmin pl Nazwa lub organizacja +no alternate email address emailadmin pl brak zapasowego adresu e-mail +no encryption emailadmin pl brak szyfrowania +no forwarding email address emailadmin pl brak adresu poczty przesyłanej +no message returned. emailadmin pl Nie otrzymano wiadomości. +no supported imap authentication method could be found. emailadmin pl Nie znaleziono obsługiwanej metody autentykacji dla IMAP +order emailadmin pl Porządek +organisation emailadmin pl Organizacja +pop3 server hostname or ip address emailadmin pl Nazwa hosta lub IP serwera POP3 +pop3 server port emailadmin pl Port serwera POP3 +postfix with ldap emailadmin pl Postfix z LDAP +profile access rights emailadmin pl prawa dostępu do profilu +profile list emailadmin pl Lista profili +profile name emailadmin pl Nazwa Profilu +qouta size in mbyte emailadmin pl rozmiar quoty w megabajtach +quota settings emailadmin pl ustawnienia quoty +remove emailadmin pl Usuń +select type of imap/pop3 server emailadmin pl Wybierz rodzaj serwera IMAP/POP3 +select type of smtp server emailadmin pl Wybierz rodzaj serwera SMTP +server settings emailadmin pl Ustawienia serwera +smtp authentication emailadmin pl Autentykacja SMTP +smtp options emailadmin pl Opcje SMTP +smtp server name emailadmin pl Nazwa serwera SMTP +smtp settings emailadmin pl Ustawienia SMTP +smtp-server hostname or ip address emailadmin pl Nazwa hosta lub IP serwera SMTP +smtp-server port emailadmin pl Port serwera SMTP +standard emailadmin pl Standard +standard imap server emailadmin pl Standardowy serwer IMAP +standard pop3 server emailadmin pl Standardowy serwer POP3 +standard smtp-server emailadmin pl Standardowy serwer SMTP +the imap server does not appear to support the authentication method selected. please contact your system administrator. emailadmin pl Serwer IMAP nie obsługuje wskazanej metody autentykacji. Proszę skontaktować się z administratorem. +this php has no imap support compiled in!! emailadmin pl Interpreter PHP nie posiada obsługi IMAP! +to use a tls connection, you must be running a version of php 5.1.0 or higher. emailadmin pl Aby skorzystać z połączenia TLS, musisz posiadać wersję PHP 5.1.0 lub wyższą. +unexpected response from server to authenticate command. emailadmin pl Niespodziewana odpowiedź serwera na polecenie AUTHENTICATE. +unexpected response from server to digest-md5 response. emailadmin pl Niespodziewana odpowiedź serwera na zapytanie Digest-MD5 +unexpected response from server to login command. emailadmin pl Niespodziewana odpowiedź serwera na polecenie LOGIN. +unknown imap response from the server. server responded: %s emailadmin pl Nieznana odpowiedź z serwera IMAP. Serwer przesłał: %s +unsupported action '%1' !!! emailadmin pl Operacja nieobsługiwana '%1'! +update current email address: emailadmin pl Uaktualnij bieżący adres pocztowy +use ldap defaults emailadmin pl Skorzystaj z domyślnych wartości LDAP +use smtp auth emailadmin pl Skorzystaj z autentykacji SMTP +use tls authentication emailadmin pl Skorzystaj z autentykacji TLS +use tls encryption emailadmin pl Skorzystaj z szyfrowania TLS +user can edit forwarding address emailadmin pl Użytkownik może zmieniać adres przekazywania +username (standard) emailadmin pl login (standardowo) +username@domainname (virtual mail manager) emailadmin pl login@domena (wirtualny zarządca kont) +users can define their own emailaccounts emailadmin pl Użytkownicy mogą definiować swoje własne konta poczty elektronicznej +virtual mail manager emailadmin pl Wirtualny Serwer Pocztowy - zarządca diff --git a/emailadmin/lang/egw_pt-br.lang b/emailadmin/lang/egw_pt-br.lang new file mode 100644 index 0000000000..d67f16560d --- /dev/null +++ b/emailadmin/lang/egw_pt-br.lang @@ -0,0 +1,138 @@ +account '%1' not found !!! emailadmin pt-br Conta '%1' não encontrada !!! +add new email address: emailadmin pt-br Adicionar novo e-mail: +add profile emailadmin pt-br Adicionar Perfil +admin dn emailadmin pt-br dn do administrador +admin password emailadmin pt-br senha do administrador +admin username emailadmin pt-br nome de usuário do administrador +advanced options emailadmin pt-br opções avançadas +alternate email address emailadmin pt-br endereço de e-mail alternativo +any application emailadmin pt-br qualquer aplicação +any group emailadmin pt-br qualquer grupo +any user emailadmin pt-br qualquer usuário +back to admin/grouplist emailadmin pt-br Voltar para Administração/Lista de Grupos +back to admin/userlist emailadmin pt-br Voltar para Administração/Lista de Usuários +bad login name or password. emailadmin pt-br Nome de usuário ou senha inválido(s). +bad or malformed request. server responded: %s emailadmin pt-br Solicitação inválida. Resposta do servidor: %s +bad request: %s emailadmin pt-br Solicitação inválida: %s +can be used by application emailadmin pt-br pode ser usado pela aplicação +can be used by group emailadmin pt-br pode ser usado pelo grupo +can be used by user emailadmin pt-br pode ser usado pelo usuário +connection dropped by imap server. emailadmin pt-br Conexão interrompida pelo servidor IMAP. +could not complete request. reason given: %s emailadmin pt-br Não foi possível completar a solicitação. Resposta do servidor: %s +could not open secure connection to the imap server. %s : %s. emailadmin pt-br Não foi possível abrir conexão segura com o servidor IMAP. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. emailadmin pt-br CRAM-MD5 ou DIGEST-MD5 necessitam que o pacote Auth_SASL esteja instalado. +cyrus imap server emailadmin pt-br Servidor Cyrus IMAP +cyrus imap server administration emailadmin pt-br Administração do Servidor Cyrus IMAP +default emailadmin pt-br padrão +deliver extern emailadmin pt-br entrega externa +do not validate certificate emailadmin pt-br não validar certificado +do you really want to delete this profile emailadmin pt-br Tem certeza que deseja remover esse perfil? +do you really want to reset the filter for the profile listing emailadmin pt-br Tem certeza que deseja reiniciar o filtro para a listagem do perfil +domainname emailadmin pt-br nome do domínio +edit email settings emailadmin pt-br editar configurações de e-mail +email account active emailadmin pt-br conta de e-mail ativa +email address emailadmin pt-br endrereço de e-mail +email settings common pt-br Configurações do E-mail +emailadmin emailadmin pt-br Administração do E-Mail +emailadmin: group assigned profile common pt-br Administração de eMail: Perfil de Grupo +emailadmin: user assigned profile common pt-br Administração de eMail: Perfil de Usuário +enable cyrus imap server administration emailadmin pt-br habilitar administração do Servidor Cyrus IMAP +enable sieve emailadmin pt-br habilitar Sieve +encrypted connection emailadmin pt-br conexão criptografada +encryption settings emailadmin pt-br configurações de criptografia +enter your default mail domain (from: user@domain) emailadmin pt-br Entre com o domínio de e-mail padrão (de: usuario@dominio) +error connecting to imap server. %s : %s. emailadmin pt-br Erro conectando ao servidor IMAP. %s : %s. +error connecting to imap server: [%s] %s. emailadmin pt-br Erro conectando ao servidor IMAP: [%s] %s. +filtered by account emailadmin pt-br filtrado por Conta +filtered by group emailadmin pt-br filtrado por Grupo +forward also to emailadmin pt-br encaminhar também para +forward email's to emailadmin pt-br encaminhar mensagens para +forward only emailadmin pt-br encaminhar somente +global options emailadmin pt-br opções globais +if using ssl or tls, you must have the php openssl extension loaded. emailadmin pt-br Se estiver usando SSL ou TLS, você deverá ter a extensão PHP 'openssl' carretada. +imap admin password admin pt-br Senha do administrador IMAP +imap admin user admin pt-br Usuário administrador do IMAP +imap c-client version < 2001 emailadmin pt-br IMAP C-Cliente Versão < 2001 +imap server closed the connection. emailadmin pt-br O servidor IMAP fechou a conexão. +imap server closed the connection. server responded: %s emailadmin pt-br O servidor IMAP fechou a conexão. Resposta do servidor: %s +imap server hostname or ip address emailadmin pt-br Nome ou IP do servidor IMAP +imap server logintyp emailadmin pt-br Tipo de login do servidor IMAP +imap server name emailadmin pt-br nome do servidor imap +imap server port emailadmin pt-br Porta do servidor IMAP +imap/pop3 server name emailadmin pt-br Nome do servidor IMAP/POP3 +in mbyte emailadmin pt-br em Mbytes +inactive emailadmin pt-br inativo +ldap basedn emailadmin pt-br DN Base do LDAP +ldap server emailadmin pt-br Servidor LDAP +ldap server accounts dn emailadmin pt-br Contas DN de servidores LDAP +ldap server admin dn emailadmin pt-br Administrador DN de servidor LDAP +ldap server admin password emailadmin pt-br Senha do administrador DN de servidor LDAP +ldap server hostname or ip address emailadmin pt-br Nome ou endereço IP do servidor LDAP +ldap settings emailadmin pt-br Configurações do LDAP +leave empty for no quota emailadmin pt-br deixe em branco para nenhuma quota +mail settings admin pt-br Configurações de E-Mail +name of organisation emailadmin pt-br Nome da organização +no alternate email address emailadmin pt-br sem conta de e-mail alternativa +no encryption emailadmin pt-br sem criptografia +no forwarding email address emailadmin pt-br sem conta de e-mail para encaminhar +no message returned. emailadmin pt-br Nenhuma mensagem retornada. +no supported imap authentication method could be found. emailadmin pt-br Nenhum método de autenticação IMAP suportado pôde ser encontrado. +order emailadmin pt-br ordem +organisation emailadmin pt-br organização +plesk can't rename users --> request ignored emailadmin pt-br Plesk não pode renomear usuários --> solicitação ignorada +plesk imap server (courier) emailadmin pt-br Servidor IMAP Plesk (Courier) +plesk mail script '%1' not found !!! emailadmin pt-br Script de e-mail Plesk '%1' não encontrado !!! +plesk requires passwords to have at least 5 characters and not contain the account-name --> password not set!!! emailadmin pt-br Plesk exige que senhas tenha no mínimo 5 caracteres e não contenham o nome da conta --> senha NÃO configurada!!! +plesk smtp-server (qmail) emailadmin pt-br Servidor SMTP Plesk (Qmail) +pop3 server hostname or ip address emailadmin pt-br Nome ou endereço IP do servidor POP3 +pop3 server port emailadmin pt-br Porta do servidor POP3 +postfix with ldap emailadmin pt-br Postfix com LDAP +profile access rights emailadmin pt-br direito de acesso aos perfis +profile is active emailadmin pt-br perfil está ativo +profile list emailadmin pt-br Lista de perfis +profile name emailadmin pt-br Nome do perfil +qmaildotmode emailadmin pt-br modo dos arquivos qmail (.qmail) +qouta size in mbyte emailadmin pt-br tamanho da quota em MBytes +quota settings emailadmin pt-br configurações de quota +remove emailadmin pt-br remover +reset filter emailadmin pt-br reiniciar filtro +select type of imap server emailadmin pt-br selecione o tipo de servidor IMAP +select type of imap/pop3 server emailadmin pt-br Selecione o tipo de servidor IMAP/POP3 +select type of smtp server emailadmin pt-br Selecione o tipo de servidor SMTP +server settings emailadmin pt-br configurações do servidor +sieve server hostname or ip address emailadmin pt-br Nome ou endereço IP do servidor Sieve +sieve server port emailadmin pt-br Porta do Servidor Sieve +sieve settings emailadmin pt-br Configurações Sieve +smtp authentication emailadmin pt-br autenticação smtp +smtp options emailadmin pt-br opções smtp +smtp server name emailadmin pt-br Nome do Servidor SMTP +smtp settings emailadmin pt-br configurações SMTP +smtp-server hostname or ip address emailadmin pt-br Nome ou endereço IP do servidor SMTP +smtp-server port emailadmin pt-br Porta do servidor SMTP +standard emailadmin pt-br Padrão +standard imap server emailadmin pt-br Servidor IMAP padrão +standard pop3 server emailadmin pt-br Servidor POP3 padrão +standard smtp-server emailadmin pt-br Servidor SMTP padrão +the imap server does not appear to support the authentication method selected. please contact your system administrator. emailadmin pt-br O servidor IMAP não parece suportar o método de autenticação selecionado. Por favor contacte o administrador do seu sistema. +this php has no imap support compiled in!! emailadmin pt-br Este PHP não tem suporte a IMAP compilado nele! +to use a tls connection, you must be running a version of php 5.1.0 or higher. emailadmin pt-br Para usar uma conexão TLS, você deve estar rodando PHP versão 5.1.0 ou maior. +unexpected response from server to authenticate command. emailadmin pt-br Resposta inesperada do servidor para o comando AUTHENTICATE. +unexpected response from server to digest-md5 response. emailadmin pt-br Resposta inesperada do servidor para a resposta Digest-MD5. +unexpected response from server to login command. emailadmin pt-br Resposta inesperada do servidor para o comando LOGIN. +unknown imap response from the server. server responded: %s emailadmin pt-br Resposta desconhecida do servidor IMAP. Resposta do servidor: %s +unsupported action '%1' !!! emailadmin pt-br Ação não suportada: '%1' !!! +update current email address: emailadmin pt-br Atualizar e-mail atual: +use ldap defaults emailadmin pt-br usar padrões LDAP +use predefined username and password defined below emailadmin pt-br Usar usuário e senha pré-definidos abaixo +use smtp auth emailadmin pt-br usar SMTP Autenticado +use tls authentication emailadmin pt-br Usar autenticação TLS +use tls encryption emailadmin pt-br Usar encriptação TLS +user can edit forwarding address emailadmin pt-br usuário pode editar endereço de encaminhamento +username (standard) emailadmin pt-br nome do usuário (padrão) +username/password defined by admin emailadmin pt-br Nome de usuário/Senha definidos pelo administrador +username@domainname (virtual mail manager) emailadmin pt-br nomedousuario@nomedodominio (Gerenciador Virtual Mail) +users can define their own emailaccounts emailadmin pt-br Os usuários podem definir sua próprias contas de correio +users can define their own identities emailadmin pt-br usuários podem definir suas próprias identidades +users can define their own signatures emailadmin pt-br usuários podem definir suas próprias assinaturas +vaction messages with start- and end-date require an admin account to be set! emailadmin pt-br Mensagens de ausência com datas de início e término necessitam de uma conta de administrador para serem definidas! +virtual mail manager emailadmin pt-br Gerenciador Virtual Mail diff --git a/emailadmin/lang/egw_pt.lang b/emailadmin/lang/egw_pt.lang new file mode 100644 index 0000000000..c1be26b66d --- /dev/null +++ b/emailadmin/lang/egw_pt.lang @@ -0,0 +1,85 @@ +add profile emailadmin pt Adicionar perfil +admin dn emailadmin pt DN do administrador +admin password emailadmin pt Senha do administrador +admin passwort emailadmin pt Senha do administrador +admin username emailadmin pt Nome do utilizador do administrador +advanced options emailadmin pt Opções avançadas +alternate email address emailadmin pt Endereço de correio electrónico alternativo +any application emailadmin pt Qualquer aplicação +any group emailadmin pt Qualquer grupo +can be used by application emailadmin pt Pode ser utilizado pela aplicação +can be used by group emailadmin pt Pode ser utilizado pelo grupo +cyrus imap server emailadmin pt Servidor IMAP Cyrus +cyrus imap server administration emailadmin pt Administração do servidor IMAP Cyrus +default emailadmin pt Por omissão +deliver extern emailadmin pt Entrega externa +do you really want to delete this profile emailadmin pt Deseja relamente eliminar este perfil +domainname emailadmin pt Nome de domínio +edit email settings emailadmin pt Editar configurações do correio electrónico +email account active emailadmin pt Conta de correio electrónico activa +email address emailadmin pt Endereço de correio electrónico +enable cyrus imap server administration emailadmin pt Activar administração do servidor IMAP Cyrus +enable sieve emailadmin pt Activar Sieve +encryption settings emailadmin pt Definições de cifragem +enter your default mail domain (from: user@domain) emailadmin pt Insira o seu domínio de correio electrónico por omissão (de: utilizador@domínio) +forward also to emailadmin pt Reencaminhar também para +forward email's to emailadmin pt Reencaminhar mensagens para +forward only emailadmin pt Reencaminhar apenas +global options emailadmin pt Opções gerais +imap admin password admin pt Senha do administrador IMAP +imap admin user admin pt Utilizador do administrador IMAP +imap c-client version < 2001 emailadmin pt Versão C-Client IMAP < 2001 +imap server hostname or ip address emailadmin pt Nome do servidor ou endereço IP do servidor IMAP +imap server logintyp emailadmin pt Tipo de acesso do servidor IMAP +imap server port emailadmin pt Porto do servidor IMAP +imap/pop3 server name emailadmin pt Nome do servidor IMAP/POP3 +in mbyte emailadmin pt em MBytes +ldap basedn emailadmin pt Base DN LDAP +ldap server emailadmin pt Servidor LDAP +ldap server accounts dn emailadmin pt DN das contas de servidor LDAP +ldap server admin dn emailadmin pt DN do administrador de servidor LDAP +ldap server admin password emailadmin pt Senha do administrador de servidor LDAP +ldap server hostname or ip address emailadmin pt Nome do servidor ou endereço IP do servidor LDAP +ldap settings emailadmin pt Configurações do LDAP +leave empty for no quota emailadmin pt Deixar vazio para quota sem limites +mail settings admin pt Configurações do correio electrónico +name of organisation emailadmin pt Nome da empresa +no alternate email address emailadmin pt Sem endereço de correio electrónico alternativo +no forwarding email address emailadmin pt Sem endereço de correio electrónico para reencaminhamento +order emailadmin pt Ordem +organisation emailadmin pt Empresa +pop3 server hostname or ip address emailadmin pt Nome do servidor ou endereço IP do servidor POP3 +pop3 server port emailadmin pt Porto de servidor POP3 +postfix with ldap emailadmin pt Postfix com LDAP +profile access rights emailadmin pt Perfil de direitos de acesso +profile list emailadmin pt Lista de perfis +profile name emailadmin pt Nome do perfil +qmaildotmode emailadmin pt Quota do correio electrónico no modo Idot +qouta size in mbyte emailadmin pt Quota em MBytes +quota settings emailadmin pt Configurações da quota +remove emailadmin pt Remover +select type of imap/pop3 server emailadmin pt Seleccionar tipo de servidor IMAP/POP3 +select type of smtp server emailadmin pt Seleccionar tipo de servidor SMTP +server settings emailadmin pt Definições do servidor +sieve server hostname or ip address emailadmin pt Nome do servidor ou endereço IP do servidor Sieve +sieve server port emailadmin pt Porto do servidor Sieve +sieve settings emailadmin pt Configurações do SIeve +smtp authentication emailadmin pt Autenticação SMTP +smtp options emailadmin pt Opções do SMTP +smtp server name emailadmin pt Nome do servidor SMTP +smtp settings emailadmin pt Definições do SMTP +smtp-server hostname or ip address emailadmin pt Nome do servidor ou endereço IP do servidor SMTP +smtp-server port emailadmin pt Porto do servidor SMTP +standard emailadmin pt Por omissão +standard imap server emailadmin pt Servidor IMAP por omissão +standard pop3 server emailadmin pt Servidor POP3 por omissão +standard smtp-server emailadmin pt Servidor SMTP por omissão +use ldap defaults emailadmin pt Utilizar definições por omissão do LDAP +use smtp auth emailadmin pt Utilizar autenticação SMTP +use tls authentication emailadmin pt Utilizar autenticação TLS +use tls encryption emailadmin pt Utilizar cifra TLS +user can edit forwarding address emailadmin pt O utilizador pode editar endereços reencaminhados +username (standard) emailadmin pt Nome de utilizador (por omissão) +username@domainname (virtual mail manager) emailadmin pt utilizador@dominio (Gestor virtual de correio electrónico) +users can define their own emailaccounts emailadmin pt Os utilizadores podem definir as suas contas de correio electrónico +virtual mail manager emailadmin pt Gestor virtual de correio electrónico diff --git a/emailadmin/lang/egw_ru.lang b/emailadmin/lang/egw_ru.lang new file mode 100644 index 0000000000..1d1453cc2c --- /dev/null +++ b/emailadmin/lang/egw_ru.lang @@ -0,0 +1,134 @@ +account '%1' not found !!! emailadmin ru Учетная запись '%1' не найдена !!! +add new email address: emailadmin ru Добавить новый адрес эл. почты: +add profile emailadmin ru Добавить Профиль +admin dn emailadmin ru DN администратора +admin password emailadmin ru Пароль администратора +admin username emailadmin ru Имя входа администратора +advanced options emailadmin ru Расширенные настройки +alternate email address emailadmin ru Добавочный адрес эл. почты +any application emailadmin ru Любое приложение +any group emailadmin ru Любая группа +any user emailadmin ru любой пользователь +back to admin/userlist emailadmin ru Назад к Администрированию/Списку пользователей +bad login name or password. emailadmin ru Неверное имя пользователя или пароль. +bad or malformed request. server responded: %s emailadmin ru Неверный или нераспознанный запрос. Ответ Сервера: %s +bad request: %s emailadmin ru Неверный запрос: %s +can be used by application emailadmin ru Может быть использовано приложением +can be used by group emailadmin ru Может быть использовано группой +can be used by user emailadmin ru может быть использовано пользователем +connection dropped by imap server. emailadmin ru Соединение разорвано сервером IMAP +could not complete request. reason given: %s emailadmin ru Не могу завершить запрос. Возможная Причина: %s +could not open secure connection to the imap server. %s : %s. emailadmin ru Не могу установть защищенное соединение с сервером IMAP. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. emailadmin ru CRAM-MD5 и DIGEST-MD5 требуют установленного пакета Auth_SASL. +cyrus imap server emailadmin ru IMAP сервер Cyrus +cyrus imap server administration emailadmin ru администрирование IMAP сервера Cyrus +default emailadmin ru по-умолчанию +deliver extern emailadmin ru доставить внешний (снаружи?) +do not validate certificate emailadmin ru не проверять сертификат +do you really want to delete this profile emailadmin ru Вы уверенны, что хотите удалить этот Профиль +do you really want to reset the filter for the profile listing emailadmin ru Вы уверены что хотите очистить фильтр для создания списка Профилей +domainname emailadmin ru ИмяДомена +edit email settings emailadmin ru Редактировать настройки почты +email account active emailadmin ru Учетная запись включена +email address emailadmin ru Адрес эл. почты +email settings common ru Настройки почты +emailadmin emailadmin ru АдминПочты +enable cyrus imap server administration emailadmin ru включить администрирование IMAP сервера Cyrus +enable sieve emailadmin ru Включить Sieve +encrypted connection emailadmin ru зашифрованное соединение +encryption settings emailadmin ru Настройки шифрования +enter your default mail domain (from: user@domain) emailadmin ru Укажите ваш почтовый домен по умолчанию (от: user@domain) +error connecting to imap server. %s : %s. emailadmin ru Ошибка соединения с сервером IMAP. %s : %s. +error connecting to imap server: [%s] %s. emailadmin ru Ошибка соединения с сервером IMAP: [%s] %s. +filtered by account emailadmin ru отфильтровано по Учетной записи +forward also to emailadmin ru Направить также в +forward email's to emailadmin ru Направлять письма в +forward only emailadmin ru Только перенаправлять +global options emailadmin ru Общие настройки +if using ssl or tls, you must have the php openssl extension loaded. emailadmin ru При использовании SSL или TLS, у вас должен быть PHP с загруженным расширением openssl +imap admin password admin ru пароль администратора IMAP +imap admin user admin ru Пользователь IMAP с правами администратора(?) +imap c-client version < 2001 emailadmin ru Версия C-клиента IMAP < 2001 +imap server closed the connection. emailadmin ru Сервер IMAP разорвал соединение. +imap server closed the connection. server responded: %s emailadmin ru Сервер IMAP разорвал соединение. Сервер сообщил: %s +imap server hostname or ip address emailadmin ru Имя сервера IMAP или его ip-адрес +imap server logintyp emailadmin ru Тип входа сервера IMAP +imap server name emailadmin ru Название сервера imap +imap server port emailadmin ru порт сервера IMAP +imap/pop3 server name emailadmin ru название сервера IMAP/POP3 +in mbyte emailadmin ru в МБайтах +inactive emailadmin ru неактивно +ldap basedn emailadmin ru начальный DN LDAP +ldap server emailadmin ru сервер LDAP +ldap server accounts dn emailadmin ru DN учетных записей сервера LDAP +ldap server admin dn emailadmin ru DN администратора сервера LDAP +ldap server admin password emailadmin ru Пароль администратора сервера LDAP +ldap server hostname or ip address emailadmin ru Имя сервера LDAP или его ip-адрес +ldap settings emailadmin ru Настройки LDAP +leave empty for no quota emailadmin ru оставте пустым для отключения квотирования +mail settings admin ru Настройки почты +name of organisation emailadmin ru Название организации +no alternate email address emailadmin ru дополнительный эл. адрес не используется +no encryption emailadmin ru без шифрования +no forwarding email address emailadmin ru без адреса перенаправления +no message returned. emailadmin ru И никакого сообщения в ответ +no supported imap authentication method could be found. emailadmin ru Не ожет быть найден поддерживаемый метод авторизации IMAP. +order emailadmin ru Упорядочить +organisation emailadmin ru Организация +plesk can't rename users --> request ignored emailadmin ru Plesk не может переименовать пользователей --> запрос проигнорирован +plesk imap server (courier) emailadmin ru Сервер IMAP Plesk (Courier) +plesk mail script '%1' not found !!! emailadmin ru Не найден скрипт '%1' почты Plesk!!! +plesk requires passwords to have at least 5 characters and not contain the account-name --> password not set!!! emailadmin ru Plesk требует длины пароля не менее 5 символов не содержащий имени аккаунта --> пароль НЕ установлен!!! +plesk smtp-server (qmail) emailadmin ru Plesk SMTP сервер (Qmail) +pop3 server hostname or ip address emailadmin ru Имя компьютера или ip-адрес сервера POP3 +pop3 server port emailadmin ru Порт сервера POP3 +postfix with ldap emailadmin ru Postfix с LDAP +profile access rights emailadmin ru права доступа к профилю +profile is active emailadmin ru профиль активен +profile list emailadmin ru Список профиля +profile name emailadmin ru Название профиля +qmaildotmode emailadmin ru режим qmaildot +qouta size in mbyte emailadmin ru Размер квоты МБайт +quota settings emailadmin ru Настройки квотирования +remove emailadmin ru Удалить +reset filter emailadmin ru очистить фильтр +select type of imap server emailadmin ru выбор типа сервера IMAP +select type of imap/pop3 server emailadmin ru Выбор типасервера IMAP/POP3 +select type of smtp server emailadmin ru Выбор типа сервера SMTP +server settings emailadmin ru Настройки сервера +sieve server hostname or ip address emailadmin ru Имя компьютера или IP-адрес сервера Sieve +sieve server port emailadmin ru Порт сервера Sieve +sieve settings emailadmin ru Настройки Sieve +smtp authentication emailadmin ru Авторизация SMTP +smtp options emailadmin ru Параметры SMTP +smtp server name emailadmin ru Имя сервера SMTP +smtp settings emailadmin ru Установки SMTP +smtp-server hostname or ip address emailadmin ru Имя компьютера или IP-адрес сервера SMTP +smtp-server port emailadmin ru Порт сервера SMTP +standard emailadmin ru Стандартный +standard imap server emailadmin ru Стандартный IMAP сервер +standard pop3 server emailadmin ru Стандартный POP3 сервер +standard smtp-server emailadmin ru Стандартный SMTP сервер +the imap server does not appear to support the authentication method selected. please contact your system administrator. emailadmin ru Сервер IMAP не сообщил о поддержке выбранного метода авторизации. Пожалуйста свяжитесь со своим системным администратором. +this php has no imap support compiled in!! emailadmin ru Эта версия PHP собрана без поддержки IMAP!! +to use a tls connection, you must be running a version of php 5.1.0 or higher. emailadmin ru Для использования соединения TLS, у вас должен быть запущен PHP 5.1.0 или выше. +unexpected response from server to authenticate command. emailadmin ru Непредусмотренный ответ сервера на команду AUTHENTICATE. +unexpected response from server to digest-md5 response. emailadmin ru Непредусмотренный ответ сервера на сигнал Digest-MD5. +unexpected response from server to login command. emailadmin ru Непредусмотренный ответ сервера на команду LOGIN. +unknown imap response from the server. server responded: %s emailadmin ru Неизвестный IMAP-ответ от сервера. Сервер сообщил: %s +unsupported action '%1' !!! emailadmin ru Неподдерживаемое действие '%1' !!! +update current email address: emailadmin ru Обновить текущий адрес эл.почты: +use ldap defaults emailadmin ru Использовать настройки LDAP по-умолчанию +use predefined username and password defined below emailadmin ru Использовать предопределенное имя пользователя и пароль указанный ниже +use smtp auth emailadmin ru Использовать авторизацию SMTP +use tls authentication emailadmin ru Использовать авторизацию TLS +use tls encryption emailadmin ru Исползовать шифрование TLS +user can edit forwarding address emailadmin ru Ползователь может редактировать адрес перенаправления +username (standard) emailadmin ru имя пользователя (стандартное) +username/password defined by admin emailadmin ru Имя пользователя/Пароль установлены администратором +username@domainname (virtual mail manager) emailadmin ru username@domainname (Менеджер Виртуальной ПОЧТЫ) +users can define their own emailaccounts emailadmin ru Пользователь может назначать свои собственные учетные записи эл. почты. +users can define their own identities emailadmin ru пользователи могут устанавливать свои собственные данные идентификации +users can define their own signatures emailadmin ru пользователи могут устанавливать свои собственные подписи +vaction messages with start- and end-date require an admin account to be set! emailadmin ru Vaction-сообщения (сообщения об отпуске? вакансиях? высвобождении? незанятых периодах? вовсе сообщения от объекта Java VAction? сообщения виртуальных действий?) с датами начала и окончания требуют установленной учетной записи администратора! +virtual mail manager emailadmin ru Менеджер Виртуальной ПОЧТЫ diff --git a/emailadmin/lang/egw_sk.lang b/emailadmin/lang/egw_sk.lang new file mode 100644 index 0000000000..94267d495f --- /dev/null +++ b/emailadmin/lang/egw_sk.lang @@ -0,0 +1,139 @@ +account '%1' not found !!! emailadmin sk Účet '%1' sa nenašiel !!! +add new email address: emailadmin sk Pridať novú E-mailovú adresu: +add profile emailadmin sk Pridať profil +admin dn emailadmin sk Správcov dn +admin password emailadmin sk Heslo správcu +admin username emailadmin sk Používateľské meno správcu +advanced options emailadmin sk Pokročilé možnosti +alternate email address emailadmin sk Alternatívna E-mailová adresa +any application emailadmin sk Ktorákoľvek aplikácia +any group emailadmin sk Ktorákoľvek skupina +any user emailadmin sk Ktorýkoľvek používateľ +back to admin/grouplist emailadmin sk Späť na Správu/Skupiny +back to admin/userlist emailadmin sk Späť na Správu/Používateľov +bad login name or password. emailadmin sk Chybné prihlasovacie meno alebo heslo. +bad or malformed request. server responded: %s emailadmin sk Chybná požiadavka. Odpoveď servera: %s +bad request: %s emailadmin sk Chybná požiadavka: %s +can be used by application emailadmin sk môže byť použité aplikáciou +can be used by group emailadmin sk môže byť použité skupinou +can be used by user emailadmin sk môže byť použité používateľom +connection dropped by imap server. emailadmin sk Spojenie prerušené IMAP serverom. +could not complete request. reason given: %s emailadmin sk Nemožno dokončiť požiadavku. Dôvod: %s +could not open secure connection to the imap server. %s : %s. emailadmin sk Nepodarilo sa nadviazať zabezpečené pripojenie k IMAP serveru. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. emailadmin sk CRAM-MD5 alebo DIGEST-MD5 vyžaduje, aby bol nainštalovaný balík Auth_SASL. +cyrus imap server emailadmin sk Cyrus IMAP Server +cyrus imap server administration emailadmin sk Správa servera Cyrus IMAP +default emailadmin sk predvolené +deliver extern emailadmin sk doručiť extern +do not validate certificate emailadmin sk neoveriť certifikát +do you really want to delete this profile emailadmin sk Naozaj chcete odstrániť tento Profil +do you really want to reset the filter for the profile listing emailadmin sk Naozaj chcete vynulovať filter pre výpis profilu? +domainname emailadmin sk názov domény +edit email settings emailadmin sk upraviť nastavenia E-mailu +email account active emailadmin sk E-mailový účet je aktívny +email address emailadmin sk E-mailová adresa +email settings common sk Nastavenia E-mailu +emailadmin emailadmin sk EMailAdmin +emailadmin: group assigned profile common sk eMailAdmin: skupinovo priradený Profil +emailadmin: user assigned profile common sk eMailAdmin: používateľsky priradený Profil +enable cyrus imap server administration emailadmin sk zapnúť správu servera Cyrus IMAP +enable sieve emailadmin sk zapnúť Sieve +encrypted connection emailadmin sk šifrované spojenie +encryption settings emailadmin sk nastavenia šifrovania +enter your default mail domain (from: user@domain) emailadmin sk Zadajte vašu predvolenú doménu (z tvaru: user@domain) +error connecting to imap server. %s : %s. emailadmin sk Chyba počas pripájania k IMAP serveru. %s : %s. +error connecting to imap server: [%s] %s. emailadmin sk Chyba počas pripájania k IMAP serveru: [%s] %s. +filtered by account emailadmin sk filtrované podľa Účtu +filtered by group emailadmin sk filtrované podľa Skupiny +forward also to emailadmin sk preposlať taktiež (komu) +forward email's to emailadmin sk preposlať emaily (kam) +forward only emailadmin sk preposlať iba +global options emailadmin sk Globálne možnosti +if using ssl or tls, you must have the php openssl extension loaded. emailadmin sk Ak používate SSL alebo TLS, musíte mať nahraté rozšírenie PHP openssl. +imap admin password admin sk heslo správcu IMAP +imap admin user admin sk používateľ pre správu IMAP +imap c-client version < 2001 emailadmin sk IMAP C-klient verzia < 2001 +imap server closed the connection. emailadmin sk IMAP server ukončil spojenie. +imap server closed the connection. server responded: %s emailadmin sk IMAP server ukončil spojenie. Odpoveď servera: %s +imap server hostname or ip address emailadmin sk názov (hostname) alebo IP adresa IMAP servera +imap server logintyp emailadmin sk typ prihlásenia IMAP servera +imap server name emailadmin sk názov IMAP servera +imap server port emailadmin sk port IMAP servera +imap/pop3 server name emailadmin sk názov IMAP/POP3 servera +in mbyte emailadmin sk v Megabajtoch +inactive emailadmin sk neaktívne +ldap basedn emailadmin sk LDAP basedn +ldap server emailadmin sk LDAP server +ldap server accounts dn emailadmin sk DN účtov LDAP servera +ldap server admin dn emailadmin sk DN správcu LDAP servera +ldap server admin password emailadmin sk heslo správcu LDAP servera +ldap server hostname or ip address emailadmin sk názov (hostname) alebo IP adresa LDAP servera +ldap settings emailadmin sk nastavenia LDAP +leave empty for no quota emailadmin sk ak nechcete kvóty, ponechajte prázdne +mail settings admin sk nastavenia Pošty +name of organisation emailadmin sk Názov organizácie +no alternate email address emailadmin sk žiadna alternatívna E-mailová adresa +no encryption emailadmin sk bez šifrovania +no forwarding email address emailadmin sk žiadna emailová adresa pre preposielanie +no message returned. emailadmin sk Žiadne správy sa nevrátili. +no supported imap authentication method could be found. emailadmin sk Nenašiel som žiadnu podporovanú overovaciu metódu IMAP. +order emailadmin sk Poradie +organisation emailadmin sk Organizácia +plesk can't rename users --> request ignored emailadmin sk Plesk používatelia sa nedajú premenovať --> požiadavka ignorovaná +plesk imap server (courier) emailadmin sk Plesk IMAP Server (Courier) +plesk mail script '%1' not found !!! emailadmin sk Plesk mail script '%1' sa nenašlo !!! +plesk requires passwords to have at least 5 characters and not contain the account-name --> password not set!!! emailadmin sk Plesk vyžaduje, aby heslá mali aspoň 5 znakov a neobsahovali názov účtu --> heslo NEBOLO nastavené!!! +plesk smtp-server (qmail) emailadmin sk Plesk SMTP-Server (qmail) +pop3 server hostname or ip address emailadmin sk názov (hostname) alebo IP adresa POP3 servera +pop3 server port emailadmin sk port POP3 servera +postfix with ldap emailadmin sk Postfix + LDAP +profile access rights emailadmin sk prístupové práva profilu +profile is active emailadmin sk profil je aktívny +profile list emailadmin sk Zoznam profilov +profile name emailadmin sk Názov profilu +qmaildotmode emailadmin sk qmail bodkový režim +qouta size in mbyte emailadmin sk Neľkosť kvóty v Megabajtoch +quota settings emailadmin sk Nastavenia kvóty +remove emailadmin sk Odstrániť +reset filter emailadmin sk vynulovať filter +select type of imap server emailadmin sk Vyberte typ IMAP servera +select type of imap/pop3 server emailadmin sk Vyberte typ IMAP/POP3 servera +select type of smtp server emailadmin sk Vyberte typ SMTP servera +send using this email-address emailadmin sk odoslať pomocou tejto e-mailovej adresy +server settings emailadmin sk Nastavenia servera +sieve server hostname or ip address emailadmin sk Názov (hostname) alebo IP Sieve servera +sieve server port emailadmin sk Nort Sieve servera +sieve settings emailadmin sk Nastavenia Sieve +smtp authentication emailadmin sk SMTP overovanie +smtp options emailadmin sk SMTP možnosti +smtp server name emailadmin sk Názov SMTP servera +smtp settings emailadmin sk SMTP nastavenia +smtp-server hostname or ip address emailadmin sk názov (hostname) alebo IP adresa SMTP servera +smtp-server port emailadmin sk port SMTP servera +standard emailadmin sk Štandard +standard imap server emailadmin sk Štandardný IMAP server +standard pop3 server emailadmin sk Štandardný POP3 server +standard smtp-server emailadmin sk Štandardný SMTP server +the imap server does not appear to support the authentication method selected. please contact your system administrator. emailadmin sk Tento IMAP server, zdá sa, nepodporuje zvolenú overovaciu metódu. Prosím kontaktujte správcu systému. +this php has no imap support compiled in!! emailadmin sk Toto PHP nemá zakompilovanú podporu pre IMAP !! +to use a tls connection, you must be running a version of php 5.1.0 or higher. emailadmin sk Ak chcete používať pripojenie TLS, musíte fungovať na verzii PHP 5.1.0 alebo vyššej. +unexpected response from server to authenticate command. emailadmin sk Neočakávaná odpoveď od servera na príkaz AUTENTICATE. +unexpected response from server to digest-md5 response. emailadmin sk Neočakávaná odpoveď od servera na Digest-MD5 odpoveď. +unexpected response from server to login command. emailadmin sk Neočakávaná odpoveď od servera na príkaz LOGIN. +unknown imap response from the server. server responded: %s emailadmin sk Neznáma IMAP odpoveď od servera. Server odpovedal: %s +unsupported action '%1' !!! emailadmin sk Nepodporovaná akcia '%1' !!! +update current email address: emailadmin sk Aktualizovať súčasnú E-mailovú adresu: +use ldap defaults emailadmin sk Použiť predvolené hodnoty LDAP +use predefined username and password defined below emailadmin sk Použiť preddefinované používateľské meno a heslo, definované nižšie +use smtp auth emailadmin sk Použiť SMTP overovanie +use tls authentication emailadmin sk Použiť TLS overovanie +use tls encryption emailadmin sk Použiť TLS šifrovanie +user can edit forwarding address emailadmin sk Používateľ môže upraviť adresu preposielania +username (standard) emailadmin sk používateľské meno (štandardné) +username/password defined by admin emailadmin sk Používateľské meno/heslo definované správcom +username@domainname (virtual mail manager) emailadmin sk používateľ@doména (Virtuálny Mail ManaGeR) +users can define their own emailaccounts emailadmin sk Používatelia môžu definovať ich vlastné E-mailové účty +users can define their own identities emailadmin sk Používatelia môžu definovať svoje vlastné identity +users can define their own signatures emailadmin sk Používatelia môžu definovať svoje vlastné podpisy +vaction messages with start- and end-date require an admin account to be set! emailadmin sk Správy v neprítomnosti s počiatočným a koncovým dátumom vyžadujú, aby bol nastavený účet správcu! +virtual mail manager emailadmin sk Virtuálny MAIL ManaGeR diff --git a/emailadmin/lang/egw_sl.lang b/emailadmin/lang/egw_sl.lang new file mode 100644 index 0000000000..7ec8a4d4e7 --- /dev/null +++ b/emailadmin/lang/egw_sl.lang @@ -0,0 +1,138 @@ +account '%1' not found !!! emailadmin sl Račun '%1' ni bil najden! +add new email address: emailadmin sl Dodaj nov e-naslov: +add profile emailadmin sl Dodaj profil +admin dn emailadmin sl Oskrbnikov dn +admin password emailadmin sl Oskrbnikovo geslo +admin username emailadmin sl Oskrbnikovo uporabniško ime +advanced options emailadmin sl Napredne izbire +alternate email address emailadmin sl Alternativen E-naslov +any application emailadmin sl Katerakoli aplikacija +any group emailadmin sl Katerakoli skupina +any user emailadmin sl Katerikoli uporabnik +back to admin/grouplist emailadmin sl Nazaj na Admin/Seznam skupin +back to admin/userlist emailadmin sl Nazaj na Admin/Seznam uporabnikov +bad login name or password. emailadmin sl Napačno uporabniško ime ali geslo. +bad or malformed request. server responded: %s emailadmin sl Napačna ali napačno oblikovana zahteva. Odgovor strežnika: %s +bad request: %s emailadmin sl Napačna zahteva: %s +can be used by application emailadmin sl Je lahko uporabljen iz aplikacije +can be used by group emailadmin sl Je lahko uporabljen iz skupine +can be used by user emailadmin sl Lahko uporablja uporabnik +connection dropped by imap server. emailadmin sl Strežnik IMAP je prekinil povezavo. +could not complete request. reason given: %s emailadmin sl Ne morem dokončati zahteve. Podan vzrok: %s +could not open secure connection to the imap server. %s : %s. emailadmin sl Ne morem odpreti varne povezave s strežnikom IMAP. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. emailadmin sl CRAM-MD5 ali DIGEST-MD5 zahteva, da je nameščen paket Auth_SASL. +cyrus imap server emailadmin sl Cyrus IMAP strežnik +cyrus imap server administration emailadmin sl Upravljanje Cyrus IMAP strežnika +default emailadmin sl Privzeto +deliver extern emailadmin sl Zunanja dostava +do not validate certificate emailadmin sl Ne preverjaj certifikata +do you really want to delete this profile emailadmin sl Ali res želite izbrisati ta profil? +do you really want to reset the filter for the profile listing emailadmin sl Res želite ponastaviti filter za listanje profilov? +domainname emailadmin sl Ime domene +edit email settings emailadmin sl Uredi nastavitve E-pošte +email account active emailadmin sl Nabiralnik E-pošte je aktiven +email address emailadmin sl E-naslov +email settings common sl Nastavitve E-pošte +emailadmin emailadmin sl EMailAdmin +emailadmin: group assigned profile common sl eMailAdmin: profil, dodeljen skupini +emailadmin: user assigned profile common sl eMailAdmin: profil, dodeljen uprabniku +enable cyrus imap server administration emailadmin sl Omogoči upravljanje Cyrus IMAP strežnika +enable sieve emailadmin sl Omogoči Sieve +encrypted connection emailadmin sl Kodirana povezava +encryption settings emailadmin sl Nastavitve šifriranja +enter your default mail domain (from: user@domain) emailadmin sl Vnesite privzeto domeno (oblika: uporabnik@domena) +error connecting to imap server. %s : %s. emailadmin sl Napaka pri povezavi s strežnikom IMAP. %s: %s. +error connecting to imap server: [%s] %s. emailadmin sl Napaka pri povezavi s strežnikom IMAP: [%s] %s. +filtered by account emailadmin sl Filtrirano s strani računa +filtered by group emailadmin sl Filtrirano s strani skupine +forward also to emailadmin sl Posreduj tudi +forward email's to emailadmin sl Posreduj sporočila k +forward only emailadmin sl Samo posreduj +global options emailadmin sl Globalne možnosti +if using ssl or tls, you must have the php openssl extension loaded. emailadmin sl Če uporabljate SSL ali TLS, morate imeti naloženo razširitev PHP openssl +imap admin password admin sl Geslo oskrbnika IMAPa +imap admin user admin sl Uporabniško ime oskrbnika IMAP-a +imap c-client version < 2001 emailadmin sl IMAP C-klient različica pred 2001 +imap server closed the connection. emailadmin sl Strežnik IMAP je prekinil povezavo. +imap server closed the connection. server responded: %s emailadmin sl Strežnik IMAP je prekinil povezavo. Odgovor strežnika: %s +imap server hostname or ip address emailadmin sl Ime ali IP strežnika IMAP +imap server logintyp emailadmin sl Način prijave strežnik IMAP +imap server name emailadmin sl Ime strežnika IMAP +imap server port emailadmin sl Vrata strežnika IMAP +imap/pop3 server name emailadmin sl Ime strežnika IMAP/POP3 +in mbyte emailadmin sl v MB +inactive emailadmin sl Neaktivno +ldap basedn emailadmin sl Osnovni DN LDAP +ldap server emailadmin sl Strežnik LDAP +ldap server accounts dn emailadmin sl DN računov LDAP strežnika +ldap server admin dn emailadmin sl Oskrbnikov DN LDAP strežnika +ldap server admin password emailadmin sl Geslo oskrbnika LDAP strežnika +ldap server hostname or ip address emailadmin sl Ime ali IP strežnika LDAP +ldap settings emailadmin sl Nastavitve LDAP +leave empty for no quota emailadmin sl Pustite prazno za neomejeno +mail settings admin sl Nastavitve E-pošte +name of organisation emailadmin sl Ime organizacije +no alternate email address emailadmin sl Ni alternativnega E-naslova +no encryption emailadmin sl Brez šifriranja +no forwarding email address emailadmin sl Ni E-naslova za posredovanje +no message returned. emailadmin sl Ni vrnjenega sporočila. +no supported imap authentication method could be found. emailadmin sl Ni najdena metoda avtentikacije IMAP. +order emailadmin sl Vrstni red +organisation emailadmin sl Organizacija +plesk can't rename users --> request ignored emailadmin sl Plesk ne more preimenovati uporabnikov --> zahteva preslišana +plesk imap server (courier) emailadmin sl Strežnik Plesk IMAP (Courier) +plesk mail script '%1' not found !!! emailadmin sl Poštni skript Plesk '%1' ni bil najden! +plesk requires passwords to have at least 5 characters and not contain the account-name --> password not set!!! emailadmin sl Plesk zahteva geslo, dolga najmanj 5 znakov in ne sme vsebovati imena računa --> geslo ni bilo nastavljeno! +plesk smtp-server (qmail) emailadmin sl Strežnik Plesk IMAP (Qmail) +pop3 server hostname or ip address emailadmin sl Ime ali IP POP3 strežnika +pop3 server port emailadmin sl Vrata POP3 strežnika +postfix with ldap emailadmin sl Končnica pri LDAP +profile access rights emailadmin sl Pravice dostopa do profila +profile is active emailadmin sl Profil je aktiven +profile list emailadmin sl Seznam profilov +profile name emailadmin sl Ime profila +qmaildotmode emailadmin sl Način za qmaildot +qouta size in mbyte emailadmin sl Kvota v MB +quota settings emailadmin sl Nastavitvev kvote +remove emailadmin sl Odstrani +reset filter emailadmin sl Ponastavi filter +select type of imap server emailadmin sl Izberite vrsto strežnika IMAP +select type of imap/pop3 server emailadmin sl Izberite tip IMAP/POP3 strežnika +select type of smtp server emailadmin sl Izberite tip SMTP strežnika +server settings emailadmin sl Nastavitve strežnika +sieve server hostname or ip address emailadmin sl IP ali naslov strežnika za sito (Sieve) +sieve server port emailadmin sl Vrata strežnika za sito (Sieve) +sieve settings emailadmin sl Nastavitve sita (Sieve) +smtp authentication emailadmin sl SMTP avtentikacija +smtp options emailadmin sl SMTP možnosti +smtp server name emailadmin sl ime SMTP strežnika +smtp settings emailadmin sl SMTP nastavitve +smtp-server hostname or ip address emailadmin sl Ime ali IP SMTP strežnika +smtp-server port emailadmin sl Vrata SMTP strežnika +standard emailadmin sl Standarden +standard imap server emailadmin sl Standardni IMAP strežnik +standard pop3 server emailadmin sl Standardni POP3 strežnik +standard smtp-server emailadmin sl Standardni SMTP strežnik +the imap server does not appear to support the authentication method selected. please contact your system administrator. emailadmin sl Strežnik IMAP ne podpira izbrane metode avtentikacije. Kontaktirajte sistemskega upravitelja. +this php has no imap support compiled in!! emailadmin sl Ta PHP ne vsebuje podpore za IMAP! +to use a tls connection, you must be running a version of php 5.1.0 or higher. emailadmin sl Če želite uporabljati povezavo TLS, morate imeti nameščeno različico PHP 5.1.0 ali višjo. +unexpected response from server to authenticate command. emailadmin sl Nepričakovan odgovor strežnika na ukaz AUTHENTICATE. +unexpected response from server to digest-md5 response. emailadmin sl Nepričakovan odgovor strežnika na odgovor Digest-MD5. +unexpected response from server to login command. emailadmin sl Nepričakovan odgovor strežnika na ukaz LOGIN. +unknown imap response from the server. server responded: %s emailadmin sl Neznan odgovor IMAP s strani strežnika. Odgovor strežnika: %s +unsupported action '%1' !!! emailadmin sl Nepodprto dejanje '%1'! +update current email address: emailadmin sl Posodobi trenutni e-naslov: +use ldap defaults emailadmin sl Uporabi privzeto za LDAP +use predefined username and password defined below emailadmin sl Uporabi spodnje, vnaprej določeno uporabniško ime in geslo +use smtp auth emailadmin sl Uporabi SMTP avtentikacijo +use tls authentication emailadmin sl Uporabi TLS avtentikacijo +use tls encryption emailadmin sl Uporabi TLS enkripcijo +user can edit forwarding address emailadmin sl Uporabnik lahko določa posredovalni naslov +username (standard) emailadmin sl Uporabnik (standardno) +username/password defined by admin emailadmin sl Uporabniško ime/geslo dodeljeno s strani administratorja +username@domainname (virtual mail manager) emailadmin sl uporabnik@domena (Virtual MAIL ManaGeR) +users can define their own emailaccounts emailadmin sl Uporabniki lahko določajo lastne E-poštne predale +users can define their own identities emailadmin sl Uporabniki lahko določijo lastne identitete +users can define their own signatures emailadmin sl Uporabniki lahko določijo lastne podpise +vaction messages with start- and end-date require an admin account to be set! emailadmin sl Nastavitev sporočila o odsotnosti z začetnim in končnim datumom zahteva nastavljen administratorski račun! +virtual mail manager emailadmin sl Virtualni upravljalec E-pošte diff --git a/emailadmin/lang/egw_sv.lang b/emailadmin/lang/egw_sv.lang new file mode 100644 index 0000000000..8dbc762450 --- /dev/null +++ b/emailadmin/lang/egw_sv.lang @@ -0,0 +1,68 @@ +add profile emailadmin sv Skapa profil +admin dn emailadmin sv Admin dn +admin password emailadmin sv Admin lösenord +admin username emailadmin sv Admin användare +advanced options emailadmin sv Avanserade alternativ +alternate email address emailadmin sv Alternerande e-post adress +cyrus imap server emailadmin sv Cyrus IMAP Server +cyrus imap server administration emailadmin sv Cyrus IMAP server administration +default emailadmin sv Standard +deliver extern emailadmin sv Leverera extern +do you really want to delete this profile emailadmin sv Vill du verkligen radera profilen? +domainname emailadmin sv Domän namn +edit email settings emailadmin sv Redigera e-post alternativ +email account active emailadmin sv Aktivt e-post konto +email address emailadmin sv E-post adress +enable cyrus imap server administration emailadmin sv Aktivera Cyrus IMAP server administration +enable sieve emailadmin sv Aktivera Sieve +enter your default mail domain (from: user@domain) emailadmin sv Standard e-post domän (från: user@domain) +forward also to emailadmin sv Vidarebefodra även till +forward email's to emailadmin sv Vidarebefodra e-post till +forward only emailadmin sv Vidarebefodra endast +imap admin password admin sv IMAP admin lösenord +imap admin user admin sv IMAP admin användare +imap c-client version < 2001 emailadmin sv IMAP C-Client version < 2001 +imap server hostname or ip address emailadmin sv IMAP server hostnamn eller IP adress +imap server logintyp emailadmin sv IMAP server inloggnings typ +imap server port emailadmin sv IMAP server port +imap/pop3 server name emailadmin sv IMAP/POP3 server namn +in mbyte emailadmin sv i MByte +ldap basedn emailadmin sv LDAP basedn +ldap server emailadmin sv LDAP server +ldap server accounts dn emailadmin sv LDAP server konton DN +ldap server admin dn emailadmin sv LDAP server admin DN +ldap server admin password emailadmin sv LDAP server admin lösenord +ldap server hostname or ip address emailadmin sv LDAP server hostnamn eller IP adress +ldap settings emailadmin sv LDAP alternativ +leave empty for no quota emailadmin sv Lämna tomt för ingen kvot +mail settings admin sv E-post alternativ +name of organisation emailadmin sv Organisations namn +no alternate email address emailadmin sv Ingen alternerande e-post adress +no forwarding email address emailadmin sv Ingen e-post vidarebefodrings adress +pop3 server hostname or ip address emailadmin sv POP3 server hostnamn eller IP adress +pop3 server port emailadmin sv POP3 server port +postfix with ldap emailadmin sv Postfix med LDAP +profile list emailadmin sv Profil lista +profile name emailadmin sv Profil namn +qmaildotmode emailadmin sv qmaildotmode +qouta size in mbyte emailadmin sv Kvot storlek i Mb +quota settings emailadmin sv Kvot alternativ +remove emailadmin sv Radera +select type of imap/pop3 server emailadmin sv Välj typ av IMAP/POP3 server +select type of smtp server emailadmin sv Välj typ av SMTP Server +sieve server hostname or ip address emailadmin sv Sieve server hostnamn eller IP adress +sieve server port emailadmin sv Sieve server port +sieve settings emailadmin sv Sieve alternativ +smtp server name emailadmin sv SMTP server namn +smtp-server hostname or ip address emailadmin sv SMTP server hostnamn eller IP adress +smtp-server port emailadmin sv SMTP server port +standard emailadmin sv Standard +standard imap server emailadmin sv Standard IMAP server +standard pop3 server emailadmin sv Standard POP3 server +standard smtp-server emailadmin sv Standard SMTP server +use ldap defaults emailadmin sv använd LDAP standarder +use smtp auth emailadmin sv Använd SMTP autentisering +use tls authentication emailadmin sv Använd TLS autentisering +use tls encryption emailadmin sv Använd TLS kryptering +users can define their own emailaccounts emailadmin sv Användare kan definiera egna epost konton? +virtual mail manager emailadmin sv Virtuell E-post administration diff --git a/emailadmin/lang/egw_zh-tw.lang b/emailadmin/lang/egw_zh-tw.lang new file mode 100644 index 0000000000..032e81c7ec --- /dev/null +++ b/emailadmin/lang/egw_zh-tw.lang @@ -0,0 +1,121 @@ +account '%1' not found !!! emailadmin zh-tw 找不到帳號 '%1'! +add new email address: emailadmin zh-tw 新增信箱: +add profile emailadmin zh-tw 新增資料 +admin dn emailadmin zh-tw 管理 dn +admin password emailadmin zh-tw 管理密碼 +admin username emailadmin zh-tw 管理帳號 +advanced options emailadmin zh-tw 進階選項 +alternate email address emailadmin zh-tw 替代郵件位址 +any application emailadmin zh-tw 任何模組 +any group emailadmin zh-tw 任何群組 +bad login name or password. emailadmin zh-tw 帳號或密碼有誤。 +bad or malformed request. server responded: %s emailadmin zh-tw 錯誤的請求,伺服器回應: %s +bad request: %s emailadmin zh-tw 錯誤的請求: %s +can be used by application emailadmin zh-tw 可以取用資料的模組 +can be used by group emailadmin zh-tw 可以取用資料的群組 +connection dropped by imap server. emailadmin zh-tw 連線被 IMAP 伺服器中斷了 +could not complete request. reason given: %s emailadmin zh-tw 無法完成請求,理由: %s +could not open secure connection to the imap server. %s : %s. emailadmin zh-tw 無法開啟安全連線到 IMAP 伺服器。%s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. emailadmin zh-tw CRAM-MD5 或 DIGEST-MD5 需要先安裝 Auth_SASL 才能使用。 +cyrus imap server emailadmin zh-tw Cyrus IMAP伺服器 +cyrus imap server administration emailadmin zh-tw Cyrus IMAP伺服器管理 +default emailadmin zh-tw 預設 +deliver extern emailadmin zh-tw 傳送到外部 +do not validate certificate emailadmin zh-tw 沒有可用的執照 +do you really want to delete this profile emailadmin zh-tw 您確定要刪除這個資料 +domainname emailadmin zh-tw 網域名稱 +edit email settings emailadmin zh-tw 編輯郵件設定 +email account active emailadmin zh-tw 郵件帳號啟用 +email address emailadmin zh-tw 郵件位址 +email settings common zh-tw 郵件設定 +emailadmin emailadmin zh-tw 郵件管理 +enable cyrus imap server administration emailadmin zh-tw 啟用Cyrus IMAP伺服器管理 +enable sieve emailadmin zh-tw 啟用Sieve +encrypted connection emailadmin zh-tw 加密連線 +encryption settings emailadmin zh-tw 加密設定 +enter your default mail domain (from: user@domain) emailadmin zh-tw 輸入您的預設郵件網域(小老鼠後面所有字:帳號@網域) +error connecting to imap server. %s : %s. emailadmin zh-tw 連線到 IMAP 伺服器時發生錯誤。 %s : %s +error connecting to imap server: [%s] %s. emailadmin zh-tw 連線到 IMAP 伺服器時發生錯誤。 [%s] %s +forward also to emailadmin zh-tw 同時轉寄到 +forward email's to emailadmin zh-tw 轉寄信件到 +forward only emailadmin zh-tw 轉寄 +global options emailadmin zh-tw 全域選項 +if using ssl or tls, you must have the php openssl extension loaded. emailadmin zh-tw 如果使用 SSL 或 TLS,您必須先載入 PHP openssl 外掛。 +imap admin password admin zh-tw IMAP管理者密碼 +imap admin user admin zh-tw IMAP管理者帳號 +imap c-client version < 2001 emailadmin zh-tw IMAP C-終端的版本小於2001 +imap server closed the connection. emailadmin zh-tw IMAP伺服器關閉連線 +imap server closed the connection. server responded: %s emailadmin zh-tw IMAP伺服器關閉連線,伺服器回應: %s +imap server hostname or ip address emailadmin zh-tw IMAP伺服器的主機名稱或是IP位址 +imap server logintyp emailadmin zh-tw IMAP伺服器登入類型 +imap server name emailadmin zh-tw IMAP伺服器名稱 +imap server port emailadmin zh-tw IMAP伺服器連接埠 +imap/pop3 server name emailadmin zh-tw IMAP/POP3伺服器名稱 +in mbyte emailadmin zh-tw 以MB顯示 +ldap basedn emailadmin zh-tw LDAP basedn +ldap server emailadmin zh-tw LDAP 伺服器 +ldap server accounts dn emailadmin zh-tw LDAP 伺服器帳號 DN +ldap server admin dn emailadmin zh-tw LDAP 伺服器管理者 DN +ldap server admin password emailadmin zh-tw LDAP 伺服器管理者密碼 +ldap server hostname or ip address emailadmin zh-tw LDAP 伺服器主機名稱或是IP位址 +ldap settings emailadmin zh-tw LDAP 設定 +leave empty for no quota emailadmin zh-tw 不填入任何資料表示無限制 +mail settings admin zh-tw 郵件設定 +name of organisation emailadmin zh-tw 組織名稱 +no alternate email address emailadmin zh-tw 沒有可替換的郵件位址 +no encryption emailadmin zh-tw 沒有加密 +no forwarding email address emailadmin zh-tw 沒有轉寄郵件位址 +no message returned. emailadmin zh-tw 沒有訊息回應。 +no supported imap authentication method could be found. emailadmin zh-tw 找不到可以支援的 IMAP 認證方式。 +order emailadmin zh-tw 順序 +organisation emailadmin zh-tw 組織 +plesk can't rename users --> request ignored emailadmin zh-tw Plesk 無法修改使用者名稱 --> 忽略 +plesk imap server (courier) emailadmin zh-tw Plesk IMAP 伺服器(Courier) +plesk mail script '%1' not found !!! emailadmin zh-tw 找不到 Plesk 郵件指令 '%1' ! +plesk requires passwords to have at least 5 characters and not contain the account-name --> password not set!!! emailadmin zh-tw Plesk 要求密碼至少必須有 5 個字元而且不能包含帳號名稱 --> 密碼沒有設定! +plesk smtp-server (qmail) emailadmin zh-tw Plesk SMTP伺服器 (Qmail) +pop3 server hostname or ip address emailadmin zh-tw POP3伺服器主機名稱或是IP位址 +pop3 server port emailadmin zh-tw POP3伺服器連接埠 +postfix with ldap emailadmin zh-tw 使用LDAP與 Postfix +profile access rights emailadmin zh-tw 存取資料權限 +profile list emailadmin zh-tw 資料清單 +profile name emailadmin zh-tw 資料名稱 +qmaildotmode emailadmin zh-tw qmaildotmode +qouta size in mbyte emailadmin zh-tw 配額(MB) +quota settings emailadmin zh-tw 配額設定 +remove emailadmin zh-tw 移除 +select type of imap server emailadmin zh-tw 選擇IMAP伺服器類型 +select type of imap/pop3 server emailadmin zh-tw 選擇IMAP/POP3伺服器的格式 +select type of smtp server emailadmin zh-tw 選擇SMTP伺服器的格式 +server settings emailadmin zh-tw 伺服器設定 +sieve server hostname or ip address emailadmin zh-tw Sieve伺服器主機名稱或是IP位址 +sieve server port emailadmin zh-tw Sieve伺服器連接埠 +sieve settings emailadmin zh-tw Sieve設定 +smtp authentication emailadmin zh-tw SMTP 認證 +smtp options emailadmin zh-tw SMTP 選項 +smtp server name emailadmin zh-tw SMTP伺服器名稱 +smtp settings emailadmin zh-tw SMTP 設定 +smtp-server hostname or ip address emailadmin zh-tw SMTP伺服器主機名稱或是IP位址 +smtp-server port emailadmin zh-tw SMTP伺服器連接埠 +standard emailadmin zh-tw 標準 +standard imap server emailadmin zh-tw 標準IMAP伺服器 +standard pop3 server emailadmin zh-tw 標準POP3伺服器 +standard smtp-server emailadmin zh-tw 標準SMTP伺服器 +the imap server does not appear to support the authentication method selected. please contact your system administrator. emailadmin zh-tw IMAP 伺服器不支援指定的認證方式,請聯絡您的系統管理員。 +this php has no imap support compiled in!! emailadmin zh-tw 您的PHP並未編譯為支援IMAP的狀態 +to use a tls connection, you must be running a version of php 5.1.0 or higher. emailadmin zh-tw 要使用 TLS 連線,您必須執行在 PHP 5.1.0 或是更新版本。 +unexpected response from server to authenticate command. emailadmin zh-tw AUTHENTICATE 指令讓伺服器傳回不如預期的回應。 +unexpected response from server to digest-md5 response. emailadmin zh-tw 伺服器傳回不如預期的 Digest-MD5 回應。 +unexpected response from server to login command. emailadmin zh-tw 伺服器傳回不如預期的 LOGIN 指令。 +unknown imap response from the server. server responded: %s emailadmin zh-tw 不知名的 IMAP 伺服器回應,回應內容: %s +unsupported action '%1' !!! emailadmin zh-tw 不支援 '%1' 這個操作! +update current email address: emailadmin zh-tw 更新目前信箱: +use ldap defaults emailadmin zh-tw 使用LDAP預設值 +use smtp auth emailadmin zh-tw 使用SMTP認證 +use tls authentication emailadmin zh-tw 使用TLS認證 +use tls encryption emailadmin zh-tw 使用TLS加密 +user can edit forwarding address emailadmin zh-tw 使用者可以編輯自動轉寄信箱 +username (standard) emailadmin zh-tw 帳號(標準) +username@domainname (virtual mail manager) emailadmin zh-tw 帳號@網域(虛擬郵件管理) +users can define their own emailaccounts emailadmin zh-tw 使用者可以自行定義郵件帳號 +virtual mail manager emailadmin zh-tw 虛擬郵件管理者 diff --git a/emailadmin/lang/egw_zh.lang b/emailadmin/lang/egw_zh.lang new file mode 100644 index 0000000000..bf5190394c --- /dev/null +++ b/emailadmin/lang/egw_zh.lang @@ -0,0 +1,123 @@ +account '%1' not found !!! emailadmin zh 帐户 '%1' 未发现! +add new email address: emailadmin zh 添加新邮箱地址: +add profile emailadmin zh 添加 profile +admin dn emailadmin zh 管理 DN +admin password emailadmin zh 管理密码 +admin username emailadmin zh 管理帐户 +advanced options emailadmin zh 高级选项 +alternate email address emailadmin zh 候选邮箱地址 +any application emailadmin zh 任何用用程序 +any group emailadmin zh 任何组 +bad login name or password. emailadmin zh 错误登录名和密码。 +bad or malformed request. server responded: %s emailadmin zh 不正确的请求。服务器或应:%s +bad request: %s emailadmin zh 错误请求:%s +can be used by application emailadmin zh 可用于应用程序 +can be used by group emailadmin zh 可用于群组 +connection dropped by imap server. emailadmin zh 连接被 IMAP 服务器中断。 +could not complete request. reason given: %s emailadmin zh 无法完成请求。原因是:%s +could not open secure connection to the imap server. %s : %s. emailadmin zh 无法打开到 IMAP 服务器的安全连接。%s:%s。 +cram-md5 or digest-md5 requires the auth_sasl package to be installed. emailadmin zh CRAM-MD5 或 DIGEST-MD5 需要安装 auth_sasl 包。 +cyrus imap server emailadmin zh Cyrus IMAP 服务器 +cyrus imap server administration emailadmin zh Cyrus IMAP 服务器管理 +default emailadmin zh 默认 +deliver extern emailadmin zh 传送外部 +do not validate certificate emailadmin zh 不确认证书 +do you really want to delete this profile emailadmin zh 您确定要删除这个 profile 文件 +domainname emailadmin zh 域名 +edit email settings emailadmin zh 编辑邮箱设置 +email account active emailadmin zh 邮箱帐户激活 +email address emailadmin zh 邮箱地址 +email settings common zh 邮箱设置 +emailadmin emailadmin zh 邮箱管理 +enable cyrus imap server administration emailadmin zh 启用 Cyrus IMAP 服务器管理 +enable sieve emailadmin zh 启用过滤 +encrypted connection emailadmin zh 加密连接 +encryption settings emailadmin zh 加密设置 +enter your default mail domain (from: user@domain) emailadmin zh 输入您的默认邮箱域 (比如:user@domain,取@之后的所有词或字母) +error connecting to imap server. %s : %s. emailadmin zh 连接到 IMAP 服务器错误。%s : %s。 +error connecting to imap server: [%s] %s. emailadmin zh 连接到 IMAP 服务器错误:[%s] %s。 +forward also to emailadmin zh 同时转发到 +forward email's to emailadmin zh 转发邮件到 +forward only emailadmin zh 转发 +global options emailadmin zh 全局选项 +if using ssl or tls, you must have the php openssl extension loaded. emailadmin zh 如果使用 SSL 或 TLS,您必须加载 PHP openssl 扩展。 +imap admin password admin zh IMAP 管理者密码 +imap admin user admin zh IMAP 管理者帐户 +imap c-client version < 2001 emailadmin zh IMAP C-Clien 版本小 < 2001 +imap server closed the connection. emailadmin zh IMAP 服务器关闭连接。 +imap server closed the connection. server responded: %s emailadmin zh IMAP 服务器关闭连接。服务器回应:%s +imap server hostname or ip address emailadmin zh IMAP 服务器的主机名或 IP 地址 +imap server logintyp emailadmin zh IMAP 服务器登录类型 +imap server name emailadmin zh IMAP 服务器名 +imap server port emailadmin zh IMAP 服务器端口号 +imap/pop3 server name emailadmin zh IMAP / POP3 服务器名 +in mbyte emailadmin zh 以 MB 表示 +ldap basedn emailadmin zh LDAP basedn +ldap server emailadmin zh LDAP 服务器 +ldap server accounts dn emailadmin zh LDAP 服务器帐户 DN +ldap server admin dn emailadmin zh LDAP 服务器管理员 DN +ldap server admin password emailadmin zh LDAP 服务器管管理员密码 +ldap server hostname or ip address emailadmin zh LDAP 服务器主机名或 IP 地址 +ldap settings emailadmin zh LDAP 设置 +leave empty for no quota emailadmin zh 留空表示无限额 +mail settings admin zh 邮箱设置 +name of organisation emailadmin zh 组织名称 +no alternate email address emailadmin zh 无备用邮箱地址 +no encryption emailadmin zh 未加密 +no forwarding email address emailadmin zh 没有转发邮件地址 +no message returned. emailadmin zh 无返回消息。 +no supported imap authentication method could be found. emailadmin zh 无支持 IMAP 认证的方法可以找到。 +order emailadmin zh 排序 +organisation emailadmin zh 组织 +plesk can't rename users --> request ignored emailadmin zh Plesk 不能重命名用户 --> 请求忽略 +plesk imap server (courier) emailadmin zh Plesk IMAP 服务器 (Courier) +plesk mail script '%1' not found !!! emailadmin zh Plesk 邮件脚本 '%1' 未找到! +plesk requires passwords to have at least 5 characters and not contain the account-name --> password not set!!! emailadmin zh Plesk 需要至少5个字符密码并且不包含帐户名 --> 密码未设置! +plesk smtp-server (qmail) emailadmin zh Plesk SMTP-Server (Qmail) +pop3 server hostname or ip address emailadmin zh POP3 服务器主机名或 IP 地址 +pop3 server port emailadmin zh POP3 服务器端口号 +postfix with ldap emailadmin zh LDAP 用于 Postfix +profile access rights emailadmin zh profile 访问权限 +profile list emailadmin zh profile 列表 +profile name emailadmin zh profile 名 +qmaildotmode emailadmin zh qmaildotmode +qouta size in mbyte emailadmin zh 配额大小在 (MByte) +quota settings emailadmin zh 配额设置 +remove emailadmin zh 移除 +select type of imap server emailadmin zh 选择 IMAP 服务器类型 +select type of imap/pop3 server emailadmin zh 选择 IMAP / POP3 服务器类型 +select type of smtp server emailadmin zh 选择 SMAP 服务器类型 +server settings emailadmin zh 服务器设置 +sieve server hostname or ip address emailadmin zh Sieve 服务器主机名或 IP 地址 +sieve server port emailadmin zh Sieve 服务器端口号 +sieve settings emailadmin zh Sieve 设置 +smtp authentication emailadmin zh SMTP 认证 +smtp options emailadmin zh SMTP 选项 +smtp server name emailadmin zh SMTP 服务器名 +smtp settings emailadmin zh SMTP 设置 +smtp-server hostname or ip address emailadmin zh SMTP 服务器主机名或 IP 地址 +smtp-server port emailadmin zh SMTP 服务器端口号 +standard emailadmin zh 标准 +standard imap server emailadmin zh 标准 IMAP 服务器 +standard pop3 server emailadmin zh 标准 POP3 服务器 +standard smtp-server emailadmin zh 标准 SMTP 服务器 +the imap server does not appear to support the authentication method selected. please contact your system administrator. emailadmin zh IMAP 服务器似乎不支持所选择的认证方法。请联系系统管理员。 +this php has no imap support compiled in!! emailadmin zh PHP 没有 IMAP 支持的编译! +to use a tls connection, you must be running a version of php 5.1.0 or higher. emailadmin zh 未使用一个 TLS 连接,您必须运行 PHP 5.1.0 或更高版本。 +unexpected response from server to authenticate command. emailadmin zh 服务器为 AUTHENTICATE 指令返回不当以外回应。 +unexpected response from server to digest-md5 response. emailadmin zh 服务器为 Digest-MD5 返回意外的不当的回应。 +unexpected response from server to login command. emailadmin zh 服务器为 LOGIN 指令返回意外的不当回应。 +unknown imap response from the server. server responded: %s emailadmin zh INAP 服务器返回未知回应。服务器回应:%s +unsupported action '%1' !!! emailadmin zh 不支持 '%1' 的操作! +update current email address: emailadmin zh 更新当前邮件地址: +use ldap defaults emailadmin zh 使用 LDAP 默认值 +use smtp auth emailadmin zh 使用 SMTP 认证 +use tls authentication emailadmin zh 使用TLS 认证 +use tls encryption emailadmin zh 使用TLS 加密 +user can edit forwarding address emailadmin zh 用户可以编辑转发地址 +username (standard) emailadmin zh 用户名(标准) +username@domainname (virtual mail manager) emailadmin zh 用户名@域 (虚拟邮箱管理) +users can define their own emailaccounts emailadmin zh 用户可以自定义邮箱账户 +users can define their own signatures emailadmin zh 用户可以定义他们自己的签名 +vaction messages with start- and end-date require an admin account to be set! emailadmin zh 需要一个 admin 帐户来设置 Vaction 消息与开始和结束日期! +virtual mail manager emailadmin zh 虚拟邮箱管理 diff --git a/emailadmin/setup/etemplates.inc.php b/emailadmin/setup/etemplates.inc.php new file mode 100644 index 0000000000..4e51364142 --- /dev/null +++ b/emailadmin/setup/etemplates.inc.php @@ -0,0 +1,32 @@ + 'emailadmin.edit','template' => '','lang' => '','group' => '0','version' => '1.7.003','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:5:{i:0;a:2:{s:2:"h1";s:6:",!@msg";s:1:"A";s:4:"100%";}i:1;a:1:{s:1:"A";a:4:{s:4:"type";s:5:"label";s:5:"align";s:6:"center";s:4:"name";s:3:"msg";s:4:"span";s:10:",redItalic";}}i:2;a:1:{s:1:"A";a:6:{s:4:"type";s:4:"grid";s:4:"data";a:2:{i:0;a:3:{s:1:"C";s:3:"50%";s:1:"B";s:3:"40%";s:1:"D";s:2:"5%";}i:1;a:4:{s:1:"A";a:4:{s:4:"type";s:4:"text";s:5:"label";s:2:"ID";s:4:"name";s:13:"ea_profile_id";s:8:"readonly";s:1:"1";}s:1:"B";a:2:{s:4:"type";s:5:"label";s:5:"label";s:12:"Profile Name";}s:1:"C";a:3:{s:4:"type";s:4:"text";s:4:"name";s:14:"ea_description";s:5:"align";s:5:"right";}s:1:"D";a:2:{s:4:"type";s:5:"label";s:5:"align";s:5:"right";}}}s:4:"rows";i:1;s:4:"cols";i:4;s:4:"size";s:3:"98%";s:7:"options";a:1:{i:0;s:3:"98%";}}}i:3;a:1:{s:1:"A";a:3:{s:4:"type";s:3:"tab";s:5:"label";s:45:"Global|SMTP|IMAP|Signature|Stationery|History";s:4:"name";s:50:"tabs=global|SMTP|IMAP|signature|stationery|history";}}i:4;a:1:{s:1:"A";a:4:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"2";i:1;a:5:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"3";i:1;a:3:{s:4:"type";s:6:"button";s:4:"name";s:4:"save";s:5:"label";s:4:"Save";}i:2;a:3:{s:4:"type";s:6:"button";s:5:"label";s:5:"Apply";s:4:"name";s:5:"apply";}i:3;a:3:{s:4:"type";s:6:"button";s:5:"label";s:6:"Cancel";s:4:"name";s:6:"cancel";}}i:2;a:5:{s:4:"type";s:6:"button";s:4:"name";s:6:"delete";s:5:"label";s:6:"Delete";s:5:"align";s:5:"right";s:7:"onclick";s:60:"return confirm(\'Do you really want to delete this Profile\');";}}}}s:4:"rows";i:4;s:4:"cols";i:1;s:4:"size";s:4:"100%";s:7:"options";a:1:{i:0;s:4:"100%";}}}','size' => '100%','style' => '.redItalic { color: red; font-style: italics; }','modified' => '1255612671',); + +$templ_data[] = array('name' => 'emailadmin.edit.global','template' => '','lang' => '','group' => '0','version' => '1.7.003','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:4:{i:0;a:0:{}i:1;a:1:{s:1:"A";a:4:{s:4:"type";s:8:"groupbox";s:5:"label";s:12:"Organisation";s:4:"size";s:1:"1";i:1;a:5:{s:4:"type";s:4:"grid";s:4:"data";a:3:{i:0;a:0:{}i:1;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:50:"enter your default mail domain (from: user@domain)";}s:1:"B";a:2:{s:4:"type";s:4:"text";s:4:"name";s:17:"ea_default_domain";}}i:2;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:20:"name of organisation";}s:1:"B";a:2:{s:4:"type";s:4:"text";s:4:"name";s:20:"ea_organisation_name";}}}s:4:"rows";i:2;s:4:"cols";i:2;s:7:"options";a:0:{}}}}i:2;a:1:{s:1:"A";a:4:{s:4:"type";s:8:"groupbox";s:4:"size";s:1:"1";s:5:"label";s:21:"profile access rights";i:1;a:5:{s:4:"type";s:4:"grid";s:7:"options";a:0:{}s:4:"data";a:4:{i:0;a:0:{}i:1;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:26:"can be used by application";}s:1:"B";a:3:{s:4:"type";s:6:"select";s:4:"name";s:10:"ea_appname";s:4:"size";s:15:"any application";}}i:2;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:20:"can be used by group";}s:1:"B";a:3:{s:4:"type";s:14:"select-account";s:4:"size";s:16:"any group,groups";s:4:"name";s:8:"ea_group";}}i:3;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:19:"can be used by user";}s:1:"B";a:3:{s:4:"type";s:14:"select-account";s:4:"size";s:17:"any user,accounts";s:4:"name";s:7:"ea_user";}}}s:4:"rows";i:3;s:4:"cols";i:2;}}}i:3;a:1:{s:1:"A";a:4:{s:4:"type";s:8:"groupbox";s:4:"size";s:1:"1";s:5:"label";s:14:"global options";i:1;a:5:{s:4:"type";s:4:"grid";s:7:"options";a:0:{}s:4:"data";a:5:{i:0;a:0:{}i:1;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:17:"profile is active";}s:1:"B";a:2:{s:4:"type";s:8:"checkbox";s:4:"name";s:9:"ea_active";}}i:2;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:37:"users can define their own identities";}s:1:"B";a:3:{s:4:"type";s:8:"checkbox";s:4:"name";s:26:"ea_user_defined_identities";s:4:"size";s:6:"yes,no";}}i:3;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:40:"users can define their own emailaccounts";}s:1:"B";a:3:{s:4:"type";s:8:"checkbox";s:4:"name";s:24:"ea_user_defined_accounts";s:4:"size";s:6:"yes,no";}}i:4;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:5:"order";}s:1:"B";a:2:{s:4:"type";s:3:"int";s:4:"name";s:8:"ea_order";}}}s:4:"rows";i:4;s:4:"cols";i:2;}}}}s:4:"rows";i:3;s:4:"cols";i:1;s:4:"size";s:4:"100%";s:7:"options";a:1:{i:0;s:4:"100%";}}}','size' => '100%','style' => '','modified' => '1255426691',); + +$templ_data[] = array('name' => 'emailadmin.edit.history','template' => '','lang' => '','group' => '0','version' => '','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:2:{i:0;a:0:{}i:1;a:1:{s:1:"A";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:1;s:4:"cols";i:1;s:4:"size";s:17:"100%,400,,,,,auto";s:7:"options";a:3:{i:0;s:4:"100%";i:1;s:3:"400";i:6;s:4:"auto";}}}','size' => '100%,400,,,,,auto','style' => '','modified' => '1255591575',); + +$templ_data[] = array('name' => 'emailadmin.edit.IMAP','template' => '','lang' => '','group' => '0','version' => '1.7.004','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:7:{i:0;a:3:{s:2:"h3";s:27:",!@ea_imap_login_type=admin";s:2:"h5";s:27:",!@imapcapabilities=/sieve/";s:2:"h6";s:27:",!@imapcapabilities=/admin/";}i:1;a:1:{s:1:"A";a:4:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"2";i:1;a:2:{s:4:"type";s:5:"label";s:5:"label";s:26:"select type of IMAP server";}i:2;a:4:{s:4:"type";s:6:"select";s:4:"name";s:12:"ea_imap_type";s:5:"align";s:5:"right";s:8:"onchange";i:1;}}}i:2;a:1:{s:1:"A";a:4:{s:4:"type";s:8:"groupbox";s:4:"size";s:1:"1";s:5:"label";s:15:"server settings";i:1;a:5:{s:4:"type";s:4:"grid";s:7:"options";a:0:{}s:4:"data";a:4:{i:0;a:0:{}i:1;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:34:"IMAP server hostname or ip address";}s:1:"B";a:2:{s:4:"type";s:4:"text";s:4:"name";s:14:"ea_imap_server";}}i:2;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:16:"IMAP server port";}s:1:"B";a:2:{s:4:"type";s:3:"int";s:4:"name";s:12:"ea_imap_port";}}i:3;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:20:"imap server logintyp";}s:1:"B";a:3:{s:4:"type";s:6:"select";s:4:"name";s:18:"ea_imap_login_type";s:8:"onchange";i:1;}}}s:4:"rows";i:3;s:4:"cols";i:2;}}}i:3;a:1:{s:1:"A";a:3:{s:4:"type";s:8:"groupbox";s:4:"size";s:1:"1";i:1;a:5:{s:4:"type";s:4:"grid";s:7:"options";a:0:{}s:4:"data";a:4:{i:0;a:0:{}i:1;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"span";s:1:"2";s:5:"label";s:42:"Use predefined username and password below";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:2;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:8:"username";}s:1:"B";a:2:{s:4:"type";s:4:"text";s:4:"name";s:21:"ea_imap_auth_username";}}i:3;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:8:"password";}s:1:"B";a:2:{s:4:"type";s:6:"passwd";s:4:"name";s:21:"ea_imap_auth_password";}}}s:4:"rows";i:3;s:4:"cols";i:2;}}}i:4;a:1:{s:1:"A";a:4:{s:4:"type";s:8:"groupbox";s:4:"size";s:1:"1";s:5:"label";s:19:"encryption settings";i:1;a:5:{s:4:"type";s:4:"grid";s:7:"options";a:0:{}s:4:"data";a:3:{i:0;a:0:{}i:1;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:20:"encrypted connection";}s:1:"B";a:6:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"4";i:1;a:4:{s:4:"type";s:5:"radio";s:4:"size";s:1:"1";s:5:"label";s:8:"STARTTLS";s:4:"name";s:22:"ea_imap_tsl_encryption";}i:2;a:4:{s:4:"type";s:5:"radio";s:4:"name";s:22:"ea_imap_tsl_encryption";s:4:"size";s:1:"2";s:5:"label";s:3:"TLS";}i:3;a:4:{s:4:"type";s:5:"radio";s:4:"name";s:22:"ea_imap_tsl_encryption";s:4:"size";s:1:"3";s:5:"label";s:3:"SSL";}i:4;a:4:{s:4:"type";s:5:"radio";s:4:"name";s:22:"ea_imap_tsl_encryption";s:4:"size";s:1:"0";s:5:"label";s:13:"no encryption";}}}i:2;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:27:"do not validate certificate";}s:1:"B";a:3:{s:4:"type";s:8:"checkbox";s:4:"name";s:16:"ea_imap_tsl_auth";s:4:"size";s:6:"yes,no";}}}s:4:"rows";i:2;s:4:"cols";i:2;}}}i:5;a:1:{s:1:"A";a:4:{s:4:"type";s:8:"groupbox";s:4:"size";s:1:"1";s:5:"label";s:14:"sieve settings";i:1;a:5:{s:4:"type";s:4:"grid";s:7:"options";a:0:{}s:4:"data";a:5:{i:0;a:1:{s:2:"h1";s:2:",1";}i:1;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:26:"Sieve server or ip address";}s:1:"B";a:2:{s:4:"type";s:4:"text";s:4:"name";s:20:"ea_imap_sieve_server";}}i:2;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:12:"enable Sieve";}s:1:"B";a:3:{s:4:"type";s:8:"checkbox";s:4:"name";s:20:"ea_imap_enable_sieve";s:4:"size";s:6:"yes,no";}}i:3;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:17:"Sieve server port";}s:1:"B";a:2:{s:4:"type";s:3:"int";s:4:"name";s:18:"ea_imap_sieve_port";}}i:4;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"span";s:1:"2";s:5:"label";s:78:"Vacation messages with start- and end-date require an admin account to be set";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:4;s:4:"cols";i:2;}}}i:6;a:1:{s:1:"A";a:4:{s:4:"type";s:8:"groupbox";s:4:"size";s:1:"1";s:5:"label";s:32:"Cyrus IMAP server administration";i:1;a:5:{s:4:"type";s:4:"grid";s:7:"options";a:0:{}s:4:"data";a:4:{i:0;a:0:{}i:1;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:39:"enable Cyrus IMAP server administration";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:2;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:14:"admin username";}s:1:"B";a:2:{s:4:"type";s:4:"text";s:4:"name";s:18:"ea_imap_admin_user";}}i:3;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:14:"admin password";}s:1:"B";a:2:{s:4:"type";s:6:"passwd";s:4:"name";s:16:"ea_imap_admin_pw";}}}s:4:"rows";i:3;s:4:"cols";i:2;}}}}s:4:"rows";i:6;s:4:"cols";i:1;s:4:"size";s:17:"100%,400,,,,,auto";s:7:"options";a:3:{i:0;s:4:"100%";i:1;s:3:"400";i:6;s:4:"auto";}}}','size' => '100%,400,,,,,auto','style' => '','modified' => '1274773039',); + +$templ_data[] = array('name' => 'emailadmin.edit.signature','template' => '','lang' => '','group' => '0','version' => '1.7.004','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:2:{i:0;a:0:{}i:1;a:1:{s:1:"A";a:3:{s:4:"type";s:8:"groupbox";s:4:"size";s:1:"1";i:1;a:5:{s:4:"type";s:4:"grid";s:7:"options";a:0:{}s:4:"data";a:3:{i:0;a:0:{}i:1;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:37:"users can define their own signatures";}s:1:"B";a:3:{s:4:"type";s:8:"checkbox";s:4:"name";s:26:"ea_user_defined_signatures";s:4:"size";s:6:"yes,no";}}i:2;a:2:{s:1:"A";a:4:{s:4:"type";s:8:"htmlarea";s:4:"span";s:1:"2";s:4:"name";s:20:"ea_default_signature";s:4:"size";s:17:"advanced,,700,180";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:2;s:4:"cols";i:2;}}}}s:4:"rows";i:1;s:4:"cols";i:1;s:4:"size";s:17:"100%,400,,,,,auto";s:7:"options";a:3:{i:0;s:4:"100%";i:1;s:3:"400";i:6;s:4:"auto";}}}','size' => '100%,400,,,,,auto','style' => '','modified' => '1270799878',); + +$templ_data[] = array('name' => 'emailadmin.edit.SMTP','template' => '','lang' => '','group' => '0','version' => '1.7.004','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:5:{i:0;a:1:{s:2:"h4";s:29:",!@smtpcapabilities=/forward/";}i:1;a:1:{s:1:"A";a:4:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"2";i:1;a:2:{s:4:"type";s:5:"label";s:5:"label";s:26:"Select type of SMTP Server";}i:2;a:4:{s:4:"type";s:6:"select";s:4:"name";s:12:"ea_smtp_type";s:5:"align";s:5:"right";s:8:"onchange";i:1;}}}i:2;a:1:{s:1:"A";a:4:{s:4:"type";s:8:"groupbox";s:4:"size";s:1:"1";s:5:"label";s:13:"SMTP settings";i:1;a:5:{s:4:"type";s:4:"grid";s:7:"options";a:0:{}s:4:"data";a:3:{i:0;a:0:{}i:1;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:34:"SMTP-Server hostname or IP address";}s:1:"B";a:2:{s:4:"type";s:4:"text";s:4:"name";s:14:"ea_smtp_server";}}i:2;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:16:"SMTP-Server Port";}s:1:"B";a:2:{s:4:"type";s:3:"int";s:4:"name";s:12:"ea_smtp_port";}}}s:4:"rows";i:2;s:4:"cols";i:2;}}}i:3;a:1:{s:1:"A";a:4:{s:4:"type";s:8:"groupbox";s:4:"size";s:1:"1";s:5:"label";s:19:"smtp authentication";i:1;a:5:{s:4:"type";s:4:"grid";s:4:"data";a:5:{i:0;a:0:{}i:1;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:13:"Use SMTP auth";}s:1:"B";a:3:{s:4:"type";s:8:"checkbox";s:4:"name";s:12:"ea_smtp_auth";s:4:"size";s:6:"yes,no";}}i:2;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:29:"send using this eMail-Address";}s:1:"B";a:2:{s:4:"type";s:4:"text";s:4:"name";s:18:"smtp_senders_email";}}i:3;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:8:"username";}s:1:"B";a:2:{s:4:"type";s:4:"text";s:4:"name";s:21:"ea_smtp_auth_username";}}i:4;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:8:"password";}s:1:"B";a:2:{s:4:"type";s:6:"passwd";s:4:"name";s:21:"ea_smtp_auth_password";}}}s:4:"rows";i:4;s:4:"cols";i:2;s:7:"options";a:0:{}}}}i:4;a:1:{s:1:"A";a:4:{s:4:"type";s:8:"groupbox";s:4:"size";s:1:"1";s:5:"label";s:12:"smtp options";i:1;a:5:{s:4:"type";s:4:"grid";s:7:"options";a:0:{}s:4:"data";a:2:{i:0;a:0:{}i:1;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:32:"user can edit forwarding address";}s:1:"B";a:3:{s:4:"type";s:8:"checkbox";s:4:"name";s:24:"ea_editforwardingaddress";s:4:"size";s:6:"yes,no";}}}s:4:"rows";i:1;s:4:"cols";i:2;}}}}s:4:"rows";i:4;s:4:"cols";i:1;s:4:"size";s:17:"100%,400,,,,,auto";s:7:"options";a:3:{i:0;s:4:"100%";i:1;s:3:"400";i:6;s:4:"auto";}}}','size' => '100%,400,,,,,auto','style' => '','modified' => '1274772869',); + +$templ_data[] = array('name' => 'emailadmin.edit.stationery','template' => '','lang' => '','group' => '0','version' => '1.7.003','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:2:{i:0;a:0:{}i:1;a:1:{s:1:"A";a:4:{s:4:"type";s:8:"groupbox";s:4:"size";s:1:"1";s:5:"label";s:16:"active templates";i:1;a:5:{s:4:"type";s:4:"grid";s:7:"options";a:0:{}s:4:"data";a:3:{i:0;a:0:{}i:1;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:44:"users can utilize these stationery templates";}s:1:"B";a:4:{s:4:"type";s:6:"select";s:4:"name";s:30:"ea_stationery_active_templates";i:1;a:3:{s:4:"type";s:3:"box";s:4:"name";s:30:"ea_stationery_active_templates";s:4:"size";s:3:",10";}s:4:"size";s:1:"5";}}i:2;a:2:{s:1:"A";a:6:{s:4:"type";s:4:"html";s:4:"span";s:1:"2";s:8:"readonly";s:1:"1";s:4:"help";s:27:"manage stationery templates";s:4:"name";s:27:"manage_stationery_templates";s:5:"align";s:5:"right";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:2;s:4:"cols";i:2;}}}}s:4:"rows";i:1;s:4:"cols";i:1;s:4:"size";s:17:"100%,400,,,,,auto";s:7:"options";a:3:{i:0;s:4:"100%";i:1;s:3:"400";i:6;s:4:"auto";}}}','size' => '100%,400,,,,,auto','style' => '','modified' => '1255600503',); + +$templ_data[] = array('name' => 'emailadmin.index','template' => '','lang' => '','group' => '0','version' => '1.7.003','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"size";s:4:"100%";s:7:"options";a:1:{i:0;s:4:"100%";}s:4:"data";a:6:{i:0;a:2:{s:2:"h2";s:6:",!@msg";s:2:"h1";s:11:",!@subtitle";}i:1;a:1:{s:1:"A";a:6:{s:4:"type";s:4:"hbox";s:8:"readonly";s:1:"1";s:5:"align";s:6:"center";s:4:"size";s:1:"2";i:1;a:4:{s:4:"type";s:4:"html";s:4:"name";s:8:"subtitle";s:8:"readonly";s:1:"1";s:5:"align";s:6:"center";}i:2;a:3:{s:4:"type";s:4:"html";s:4:"name";s:13:"addJavaScript";s:8:"readonly";s:1:"1";}}}i:2;a:1:{s:1:"A";a:4:{s:4:"type";s:5:"label";s:4:"span";s:10:",redItalic";s:4:"name";s:3:"msg";s:5:"align";s:6:"center";}}i:3;a:1:{s:1:"A";a:5:{s:4:"type";s:6:"button";s:4:"name";s:10:"AddProfile";s:5:"label";s:3:"Add";s:5:"align";s:5:"right";s:7:"onclick";s:165:"window.open(egw::link(\'/index.php\',\'menuaction=emailadmin.emailadmin_ui.add\'),\'_blank\',\'dependent=yes,width=850,height=540,scrollbars=yes,status=yes\'); return false;";}}i:4;a:1:{s:1:"A";a:4:{s:4:"type";s:9:"nextmatch";s:4:"size";s:21:"emailadmin.index.rows";s:4:"span";s:3:"all";s:4:"name";s:2:"nm";}}i:5;a:1:{s:1:"A";a:6:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"3";s:5:"align";s:5:"right";i:1;a:5:{s:4:"type";s:6:"button";s:4:"name";s:6:"delete";s:4:"size";s:6:"delete";s:5:"label";s:6:"Delete";s:7:"onclick";s:34:"return confirm(\'Delete Profiles\');";}i:2;a:4:{s:4:"type";s:10:"buttononly";s:4:"span";s:15:",selectAllArrow";s:7:"onclick";s:71:"toggle_all(this.form,form::name(\'nm[rows][selected][]\')); return false;";s:4:"size";s:9:"arrow_ltr";}i:3;a:1:{s:4:"type";s:5:"label";}}}}s:4:"rows";i:5;s:4:"cols";i:1;}}','size' => '100%','style' => '.redItalic { color: red; font-style: italics; }','modified' => '1255529643',); + +$templ_data[] = array('name' => 'emailadmin.index.rows','template' => '','lang' => '','group' => '0','version' => '1.7.003','data' => 'a:1:{i:0;a:7:{s:4:"type";s:4:"grid";s:4:"data";a:3:{i:0;a:3:{s:2:"c1";s:2:"th";s:2:"c2";s:3:"row";s:1:"P";s:2:"1%";}i:1;a:16:{s:1:"A";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:2:"ID";s:4:"name";s:13:"ea_profile_id";}s:1:"B";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:11:"Description";s:4:"name";s:14:"ea_description";}s:1:"C";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:10:"domainname";s:4:"name";s:17:"ea_default_domain";}s:1:"D";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:16:"SMTP Server Name";s:4:"name";s:14:"ea_smtp_server";}s:1:"E";a:3:{s:4:"type";s:16:"nextmatch-header";s:5:"label";s:16:"SMTP Server Type";s:4:"name";s:12:"ea_smtp_type";}s:1:"F";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:16:"SMTP Server Port";s:4:"name";s:12:"ea_smtp_port";}s:1:"G";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:16:"IMAP Server Name";s:4:"name";s:14:"ea_imap_server";}s:1:"H";a:3:{s:4:"type";s:16:"nextmatch-header";s:5:"label";s:16:"IMAP Server Type";s:4:"name";s:12:"ea_imap_type";}s:1:"I";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:16:"IMAP Server Port";s:4:"name";s:12:"ea_imap_port";}s:1:"J";a:3:{s:4:"type";s:16:"nextmatch-header";s:5:"label";s:22:"IMAP Server Login Type";s:4:"name";s:18:"ea_imap_login_type";}s:1:"K";a:3:{s:4:"type";s:16:"nextmatch-header";s:4:"name";s:10:"ea_appname";s:5:"label";s:11:"Application";}s:1:"L";a:3:{s:4:"type";s:16:"nextmatch-header";s:4:"name";s:8:"ea_group";s:5:"label";s:5:"Group";}s:1:"M";a:3:{s:4:"type";s:16:"nextmatch-header";s:4:"name";s:7:"ea_user";s:5:"label";s:4:"User";}s:1:"N";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:5:"order";s:4:"name";s:8:"ea_order";}s:1:"O";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:6:"Active";s:4:"name";s:9:"ea_active";}s:1:"P";a:4:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"2";i:1;a:2:{s:4:"type";s:5:"label";s:5:"label";s:6:"Action";}i:2;a:4:{s:4:"type";s:10:"buttononly";s:4:"size";s:5:"check";s:5:"label";s:10:"Select All";s:7:"onclick";s:61:"toggle_all(this.form,form::name(\'selected[]\')); return false;";}}}i:2;a:16:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:4:"name";s:21:"${row}[ea_profile_id]";}s:1:"B";a:2:{s:4:"type";s:5:"label";s:4:"name";s:22:"${row}[ea_description]";}s:1:"C";a:2:{s:4:"type";s:5:"label";s:4:"name";s:25:"${row}[ea_default_domain]";}s:1:"D";a:2:{s:4:"type";s:5:"label";s:4:"name";s:22:"${row}[ea_smtp_server]";}s:1:"E";a:3:{s:4:"type";s:6:"select";s:4:"name";s:20:"${row}[ea_smtp_type]";s:8:"readonly";s:1:"1";}s:1:"F";a:2:{s:4:"type";s:5:"label";s:4:"name";s:20:"${row}[ea_smtp_port]";}s:1:"G";a:2:{s:4:"type";s:5:"label";s:4:"name";s:22:"${row}[ea_imap_server]";}s:1:"H";a:3:{s:4:"type";s:6:"select";s:4:"name";s:20:"${row}[ea_imap_type]";s:8:"readonly";s:1:"1";}s:1:"I";a:2:{s:4:"type";s:5:"label";s:4:"name";s:20:"${row}[ea_imap_port]";}s:1:"J";a:2:{s:4:"type";s:5:"label";s:4:"name";s:26:"${row}[ea_imap_login_type]";}s:1:"K";a:3:{s:4:"type";s:6:"select";s:4:"name";s:18:"${row}[ea_appname]";s:8:"readonly";s:1:"1";}s:1:"L";a:4:{s:4:"type";s:14:"select-account";s:4:"name";s:16:"${row}[ea_group]";s:8:"readonly";s:1:"1";s:4:"size";s:7:",groups";}s:1:"M";a:4:{s:4:"type";s:14:"select-account";s:4:"name";s:15:"${row}[ea_user]";s:8:"readonly";s:1:"1";s:4:"size";s:9:",accounts";}s:1:"N";a:3:{s:4:"type";s:5:"label";s:4:"name";s:16:"${row}[ea_order]";s:7:"no_lang";s:1:"1";}s:1:"O";a:2:{s:4:"type";s:5:"label";s:4:"name";s:17:"${row}[ea_active]";}s:1:"P";a:6:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"4";i:1;a:6:{s:4:"type";s:6:"button";s:4:"size";s:4:"edit";s:5:"label";s:4:"Edit";s:4:"help";s:17:"Edit this Profile";s:4:"name";s:30:"edit[$row_cont[ea_profile_id]]";s:7:"onclick";s:205:"window.open(egw::link(\'/index.php\',\'menuaction=emailadmin.emailadmin_ui.edit&profileid=$row_cont[ea_profile_id]\'),\'ea_profile\',\'dependent=yes,width=850,height=540,scrollbars=yes,status=yes\'); return false;";}i:2;a:6:{s:4:"type";s:6:"button";s:4:"size";s:6:"delete";s:5:"label";s:6:"Delete";s:4:"name";s:32:"delete[$row_cont[ea_profile_id]]";s:7:"onclick";s:60:"return confirm(\'Do you really want to delete this Profile\');";s:4:"help";s:19:"Delete this Profile";}i:3;a:3:{s:4:"type";s:8:"checkbox";s:4:"size";s:24:"$row_cont[ea_profile_id]";s:4:"name";s:10:"selected[]";}i:4;a:1:{s:4:"type";s:5:"label";}}}}s:4:"rows";i:2;s:4:"cols";i:16;s:4:"size";s:4:"100%";s:5:"align";s:6:"center";s:7:"options";a:1:{i:0;s:4:"100%";}}}','size' => '100%','style' => '','modified' => '1255607501',); + diff --git a/emailadmin/setup/setup.inc.php b/emailadmin/setup/setup.inc.php new file mode 100644 index 0000000000..901feb525a --- /dev/null +++ b/emailadmin/setup/setup.inc.php @@ -0,0 +1,69 @@ + + * @package emailadmin + * @subpackage setup + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ + +$setup_info['emailadmin']['name'] = 'emailadmin'; +$setup_info['emailadmin']['title'] = 'EMailAdmin'; +$setup_info['emailadmin']['version'] = '1.7.004'; +$setup_info['emailadmin']['app_order'] = 10; +$setup_info['emailadmin']['enable'] = 2; +$setup_info['emailadmin']['index'] = 'emailadmin.emailadmin_ui.listProfiles'; + +$setup_info['emailadmin']['author'] = 'Klaus Leithoff'; +$setup_info['emailadmin']['license'] = 'GPL'; +$setup_info['emailadmin']['description'] = + 'A central Mailserver management application for EGroupWare. Completely rewritten by K.Leithoff in 10-2009'; +$setup_info['emailadmin']['note'] = + ''; +$setup_info['emailadmin']['maintainer'] = array( + 'name' => 'Leithoff, Klaus', + 'email' => 'kl@stylite.de' +); + +$setup_info['emailadmin']['tables'][] = 'egw_emailadmin'; + +/* The hooks this app includes, needed for hooks registration */ +#$setup_info['emailadmin']['hooks'][] = 'preferences'; +$setup_info['emailadmin']['hooks']['admin'] = 'emailadmin_hooks::admin'; +$setup_info['emailadmin']['hooks']['edit_user'] = 'emailadmin_hooks::edit_user'; +$setup_info['emailadmin']['hooks']['view_user'] = 'emailadmin_hooks::edit_user'; +$setup_info['emailadmin']['hooks']['edit_group'] = 'emailadmin_hooks::edit_group'; +$setup_info['emailadmin']['hooks']['group_manager'] = 'emailadmin_hooks::edit_group'; +$setup_info['emailadmin']['hooks']['deleteaccount'] = 'emailadmin_hooks::deleteaccount'; +$setup_info['emailadmin']['hooks']['deletegroup'] = 'emailadmin_hooks::deletegroup'; +/* Dependencies for this app to work */ +$setup_info['emailadmin']['depends'][] = array( + 'appname' => 'phpgwapi', + 'versions' => Array('1.6','1.7') +); +$setup_info['emailadmin']['depends'][] = array( + 'appname' => 'egw-pear', + 'versions' => Array('1.4.000','1.5','1.6','1.7') +); +// installation checks for felamimail +$setup_info['emailadmin']['check_install'] = array( + '' => array( + 'func' => 'pear_check', + 'from' => 'EMailAdmin', + ), + 'Auth_SASL' => array( + 'func' => 'pear_check', + 'from' => 'EMailAdmin', + ), + 'Net_IMAP' => array( + 'func' => 'pear_check', + 'from' => 'EMailAdmin', + ), + 'imap' => array( + 'func' => 'extension_check', + 'from' => 'EMailAdmin', + ), +); diff --git a/emailadmin/setup/tables_current.inc.php b/emailadmin/setup/tables_current.inc.php new file mode 100644 index 0000000000..f774b507b7 --- /dev/null +++ b/emailadmin/setup/tables_current.inc.php @@ -0,0 +1,63 @@ + + * @package emailadmin + * @subpackage setup + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ + +$phpgw_baseline = array( + 'egw_emailadmin' => array( + 'fd' => array( + 'ea_profile_id' => array('type' => 'auto','nullable' => False), + 'ea_smtp_server' => array('type' => 'varchar','precision' => '80'), + 'ea_smtp_type' => array('type' => 'varchar','precision' => '56'), + 'ea_smtp_port' => array('type' => 'int','precision' => '4'), + 'ea_smtp_auth' => array('type' => 'varchar','precision' => '3'), + 'ea_editforwardingaddress' => array('type' => 'varchar','precision' => '3'), + 'ea_smtp_ldap_server' => array('type' => 'varchar','precision' => '80'), + 'ea_smtp_ldap_basedn' => array('type' => 'varchar','precision' => '200'), + 'ea_smtp_ldap_admindn' => array('type' => 'varchar','precision' => '200'), + 'ea_smtp_ldap_adminpw' => array('type' => 'varchar','precision' => '30'), + 'ea_smtp_ldap_use_default' => array('type' => 'varchar','precision' => '3'), + 'ea_imap_server' => array('type' => 'varchar','precision' => '80'), + 'ea_imap_type' => array('type' => 'varchar','precision' => '56'), + 'ea_imap_port' => array('type' => 'int','precision' => '4'), + 'ea_imap_login_type' => array('type' => 'varchar','precision' => '20'), + 'ea_imap_tsl_auth' => array('type' => 'varchar','precision' => '3'), + 'ea_imap_tsl_encryption' => array('type' => 'varchar','precision' => '3'), + 'ea_imap_enable_cyrus' => array('type' => 'varchar','precision' => '3'), + 'ea_imap_admin_user' => array('type' => 'varchar','precision' => '40'), + 'ea_imap_admin_pw' => array('type' => 'varchar','precision' => '40'), + 'ea_imap_enable_sieve' => array('type' => 'varchar','precision' => '3'), + 'ea_imap_sieve_server' => array('type' => 'varchar','precision' => '80'), + 'ea_imap_sieve_port' => array('type' => 'int','precision' => '4'), + 'ea_description' => array('type' => 'varchar','precision' => '200'), + 'ea_default_domain' => array('type' => 'varchar','precision' => '100'), + 'ea_organisation_name' => array('type' => 'varchar','precision' => '100'), + 'ea_user_defined_identities' => array('type' => 'varchar','precision' => '3'), + 'ea_user_defined_accounts' => array('type' => 'varchar','precision' => '3'), + 'ea_order' => array('type' => 'int','precision' => '4'), + 'ea_appname' => array('type' => 'varchar','precision' => '80'), + 'ea_group' => array('type' => 'varchar','precision' => '80'), + 'ea_user' => array('type' => 'varchar','precision' => '80'), + 'ea_active' => array('type' => 'int','precision' => '4'), + 'ea_smtp_auth_username' => array('type' => 'varchar','precision' => '80'), + 'ea_smtp_auth_password' => array('type' => 'varchar','precision' => '80'), + 'ea_user_defined_signatures' => array('type' => 'varchar','precision' => '3'), + 'ea_default_signature' => array('type' => 'text'), + 'ea_imap_auth_username' => array('type' => 'varchar','precision' => '80'), + 'ea_imap_auth_password' => array('type' => 'varchar','precision' => '80'), + 'ea_stationery_active_templates' => array('type' => 'text') + ), + 'pk' => array('ea_profile_id'), + 'fk' => array(), + 'ix' => array('ea_appname','ea_group'), + 'uc' => array() + ) +); diff --git a/emailadmin/setup/tables_update.inc.php b/emailadmin/setup/tables_update.inc.php new file mode 100644 index 0000000000..2fe54bc20f --- /dev/null +++ b/emailadmin/setup/tables_update.inc.php @@ -0,0 +1,303 @@ + + * @package emailadmin + * @subpackage setup + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ + +function emailadmin_upgrade0_0_3() +{ + $GLOBALS['egw_setup']->oProc->AddColumn('phpgw_emailadmin','smtpType', array('type' => 'int', 'precision' => 4)); + + return $setup_info['emailadmin']['currentver'] = '0.0.4'; +} + + +function emailadmin_upgrade0_0_4() +{ + $GLOBALS['egw_setup']->oProc->AddColumn('phpgw_emailadmin','defaultDomain', array('type' => 'varchar', 'precision' => 100)); + + return $setup_info['emailadmin']['currentver'] = '0.0.5'; +} + + +function emailadmin_upgrade0_0_5() +{ + $GLOBALS['egw_setup']->oProc->AddColumn('phpgw_emailadmin','organisationName', array('type' => 'varchar', 'precision' => 100)); + $GLOBALS['egw_setup']->oProc->AddColumn('phpgw_emailadmin','userDefinedAccounts', array('type' => 'varchar', 'precision' => 3)); + + return $setup_info['emailadmin']['currentver'] = '0.0.6'; +} + + +function emailadmin_upgrade0_0_6() +{ + $GLOBALS['egw_setup']->oProc->AddColumn('phpgw_emailadmin','oldimapcclient',array( + 'type' => 'varchar', + 'precision' => '3' + )); + + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '0.0.007'; +} + + +function emailadmin_upgrade0_0_007() +{ + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_emailadmin','oldimapcclient','imapoldcclient'); + + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '0.0.008'; +} + + +function emailadmin_upgrade0_0_008() +{ + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.0.0'; +} + + +function emailadmin_upgrade1_0_0() +{ + $GLOBALS['egw_setup']->oProc->AddColumn('phpgw_emailadmin','editforwardingaddress',array( + 'type' => 'varchar', + 'precision' => '3' + )); + + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.0.1'; +} + + +function emailadmin_upgrade1_0_1() +{ + $GLOBALS['egw_setup']->oProc->AddColumn('phpgw_emailadmin','ea_order', array('type' => 'int', 'precision' => 4)); + + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.0.2'; +} + + +function emailadmin_upgrade1_0_2() +{ + $GLOBALS['egw_setup']->oProc->AddColumn('phpgw_emailadmin','ea_appname', array('type' => 'varchar','precision' => '80')); + $GLOBALS['egw_setup']->oProc->AddColumn('phpgw_emailadmin','ea_group', array('type' => 'varchar','precision' => '80')); + + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.0.3'; +} + + +function emailadmin_upgrade1_0_3() +{ + $GLOBALS['egw_setup']->oProc->RenameTable('phpgw_emailadmin','egw_emailadmin'); + + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.2'; +} + + +function emailadmin_upgrade1_2() +{ + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','profileID','ea_profile_id'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','smtpServer','ea_smtp_server'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','smtpType','ea_smtp_type'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','smtpPort','ea_smtp_port'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','smtpAuth','ea_smtp_auth'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','editforwardingaddress','ea_editforwardingaddress'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','smtpLDAPServer','ea_smtp_ldap_server'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','smtpLDAPBaseDN','ea_smtp_ldap_basedn'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','smtpLDAPAdminDN','ea_smtp_ldap_admindn'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','smtpLDAPAdminPW','ea_smtp_ldap_adminpw'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','smtpLDAPUseDefault','ea_smtp_ldap_use_default'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','imapServer','ea_imap_server'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','imapType','ea_imap_type'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','imapPort','ea_imap_port'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','imapLoginType','ea_imap_login_type'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','imapTLSAuthentication','ea_imap_tsl_auth'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','imapTLSEncryption','ea_imap_tsl_encryption'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','imapEnableCyrusAdmin','ea_imap_enable_cyrus'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','imapAdminUsername','ea_imap_admin_user'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','imapAdminPW','ea_imap_admin_pw'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','imapEnableSieve','ea_imap_enable_sieve'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','imapSieveServer','ea_imap_sieve_server'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','imapSievePort','ea_imap_sieve_port'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','description','ea_description'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','defaultDomain','ea_default_domain'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','organisationName','ea_organisation_name'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','userDefinedAccounts','ea_user_defined_accounts'); + $GLOBALS['egw_setup']->oProc->RenameColumn('egw_emailadmin','imapoldcclient','ea_imapoldcclient'); + + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.2.001'; +} + + +function emailadmin_upgrade1_2_001() +{ + /* done by RefreshTable() anyway + $GLOBALS['egw_setup']->oProc->AddColumn('egw_emailadmin','ea_smtp_auth_username',array( + 'type' => 'varchar', + 'precision' => '80' + ));*/ + /* done by RefreshTable() anyway + $GLOBALS['egw_setup']->oProc->AddColumn('egw_emailadmin','ea_smtp_auth_password',array( + 'type' => 'varchar', + 'precision' => '80' + ));*/ + $GLOBALS['egw_setup']->oProc->RefreshTable('egw_emailadmin',array( + 'fd' => array( + 'ea_profile_id' => array('type' => 'auto','nullable' => False), + 'ea_smtp_server' => array('type' => 'varchar','precision' => '80'), + 'ea_smtp_type' => array('type' => 'int','precision' => '4'), + 'ea_smtp_port' => array('type' => 'int','precision' => '4'), + 'ea_smtp_auth' => array('type' => 'varchar','precision' => '3'), + 'ea_editforwardingaddress' => array('type' => 'varchar','precision' => '3'), + 'ea_smtp_ldap_server' => array('type' => 'varchar','precision' => '80'), + 'ea_smtp_ldap_basedn' => array('type' => 'varchar','precision' => '200'), + 'ea_smtp_ldap_admindn' => array('type' => 'varchar','precision' => '200'), + 'ea_smtp_ldap_adminpw' => array('type' => 'varchar','precision' => '30'), + 'ea_smtp_ldap_use_default' => array('type' => 'varchar','precision' => '3'), + 'ea_imap_server' => array('type' => 'varchar','precision' => '80'), + 'ea_imap_type' => array('type' => 'int','precision' => '4'), + 'ea_imap_port' => array('type' => 'int','precision' => '4'), + 'ea_imap_login_type' => array('type' => 'varchar','precision' => '20'), + 'ea_imap_tsl_auth' => array('type' => 'varchar','precision' => '3'), + 'ea_imap_tsl_encryption' => array('type' => 'varchar','precision' => '3'), + 'ea_imap_enable_cyrus' => array('type' => 'varchar','precision' => '3'), + 'ea_imap_admin_user' => array('type' => 'varchar','precision' => '40'), + 'ea_imap_admin_pw' => array('type' => 'varchar','precision' => '40'), + 'ea_imap_enable_sieve' => array('type' => 'varchar','precision' => '3'), + 'ea_imap_sieve_server' => array('type' => 'varchar','precision' => '80'), + 'ea_imap_sieve_port' => array('type' => 'int','precision' => '4'), + 'ea_description' => array('type' => 'varchar','precision' => '200'), + 'ea_default_domain' => array('type' => 'varchar','precision' => '100'), + 'ea_organisation_name' => array('type' => 'varchar','precision' => '100'), + 'ea_user_defined_accounts' => array('type' => 'varchar','precision' => '3'), + 'ea_imapoldcclient' => array('type' => 'varchar','precision' => '3'), + 'ea_order' => array('type' => 'int','precision' => '4'), + 'ea_appname' => array('type' => 'varchar','precision' => '80'), + 'ea_group' => array('type' => 'varchar','precision' => '80'), + 'ea_smtp_auth_username' => array('type' => 'varchar','precision' => '80'), + 'ea_smtp_auth_password' => array('type' => 'varchar','precision' => '80') + ), + 'pk' => array('ea_profile_id'), + 'fk' => array(), + 'ix' => array('ea_appname','ea_group'), + 'uc' => array() + )); + + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.2.002'; +} + + +function emailadmin_upgrade1_2_002() +{ + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.4'; +} + + +function emailadmin_upgrade1_4() +{ + $GLOBALS['egw_setup']->oProc->AddColumn('egw_emailadmin','ea_user_defined_signatures',array( + 'type' => 'varchar', + 'precision' => '3' + )); + $GLOBALS['egw_setup']->oProc->AddColumn('egw_emailadmin','ea_default_signature',array( + 'type' => 'varchar', + 'precision' => '255' + )); + + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.4.001'; +} + + +function emailadmin_upgrade1_4_001() +{ + $GLOBALS['egw_setup']->oProc->AddColumn('egw_emailadmin','ea_user_defined_identities',array( + 'type' => 'varchar', + 'precision' => '3' + )); + + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.5.001'; +} + + +function emailadmin_upgrade1_5_001() +{ + $GLOBALS['egw_setup']->oProc->AddColumn('egw_emailadmin','ea_user',array( + 'type' => 'varchar', + 'precision' => '80' + )); + $GLOBALS['egw_setup']->oProc->AddColumn('egw_emailadmin','ea_active',array( + 'type' => 'int', + 'precision' => '4' + )); + $GLOBALS['phpgw_setup']->oProc->query("UPDATE egw_emailadmin set ea_user='0', ea_active=1",__LINE__,__FILE__); + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.5.002'; +} + + +function emailadmin_upgrade1_5_002() +{ + $GLOBALS['egw_setup']->oProc->AddColumn('egw_emailadmin','ea_imap_auth_username',array( + 'type' => 'varchar', + 'precision' => '80' + )); + $GLOBALS['egw_setup']->oProc->AddColumn('egw_emailadmin','ea_imap_auth_password',array( + 'type' => 'varchar', + 'precision' => '80' + )); + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.5.003'; +} + + +function emailadmin_upgrade1_5_003() +{ + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.5.004'; +} + + +function emailadmin_upgrade1_5_004() +{ + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.6'; +} + + +function emailadmin_upgrade1_6() +{ + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_emailadmin','ea_default_signature',array( + 'type' => 'text' + )); + + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.6.001'; +} + +function emailadmin_upgrade1_6_001() +{ + $GLOBALS['egw_setup']->oProc->AddColumn('egw_emailadmin','ea_stationery_active_templates',array( + 'type' => 'text' + )); + + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.7.003'; +} + +function emailadmin_upgrade1_7_003() +{ + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_emailadmin','ea_imap_type',array( + 'type' => 'varchar', + 'precision' => 56, + )); + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_emailadmin','ea_smtp_type',array( + 'type' => 'varchar', + 'precision' => 56, + )); + foreach (array('1'=>'defaultsmtp', '2'=>'postfixldap', '3'=>'postfixinetorgperson', '4'=>'smtpplesk', '5' =>'postfixdbmailuser') as $id => $newtype) + { + $GLOBALS['egw_setup']->oProc->query('update egw_emailadmin set ea_smtp_type=\''.$newtype.'\' where ea_smtp_type=\''.$id.'\'',__LINE__,__FILE__); + } + foreach (array('2'=>'defaultimap', '3'=>'cyrusimap', '4'=>'dbmailqmailuser', '5'=>'pleskimap', '6' =>'dbmaildbmailuser') as $id => $newtype) + { + $GLOBALS['egw_setup']->oProc->query('update egw_emailadmin set ea_imap_type=\''.$newtype.'\' where ea_imap_type=\''.$id.'\'',__LINE__,__FILE__); + } + return $GLOBALS['setup_info']['emailadmin']['currentver'] = '1.7.004'; +} diff --git a/emailadmin/templates/default/config.tpl b/emailadmin/templates/default/config.tpl new file mode 100644 index 0000000000..10b25fdd98 --- /dev/null +++ b/emailadmin/templates/default/config.tpl @@ -0,0 +1,42 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 {title}
 
 {lang_Mail_settings}
{lang_IMAP_admin_user}:
{lang_IMAP_admin_password}:
+  +
+ + +
+
+ diff --git a/emailadmin/templates/default/defaultpage.tpl b/emailadmin/templates/default/defaultpage.tpl new file mode 100644 index 0000000000..6d284a2d07 --- /dev/null +++ b/emailadmin/templates/default/defaultpage.tpl @@ -0,0 +1,64 @@ + +
+ + + + + +
+ + {menu_rows} + + + + {activation_rows} + + + +
+   +
+ {lang_done} +
+
+
+ + + + +
+ Data +
+
+
+
+ + + + + + {menu_description} + + + + + + + + {menu_description} + + + + + + + + {lang_activate} + + + + +   + + + diff --git a/emailadmin/templates/default/domainnames.tpl b/emailadmin/templates/default/domainnames.tpl new file mode 100644 index 0000000000..527440e63d --- /dev/null +++ b/emailadmin/templates/default/domainnames.tpl @@ -0,0 +1,136 @@ + +
+ + + + + +
+ + {menu_rows} + + + + {activation_rows} + + + +
+   +
+ {lang_done} +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Domains we receive email for +
+ {rcpt_selectbox} + + + +
+   +
+ +
+ {lang_add_to_local} +
+ + +
+   +
+ Domains which email we handle local +
+ {locals_selectbox} + + + +
+   +
+ +
+ + +
+
+ +
+ + + + + +
{menu_description} + + + + + + + + {menu_description} + + + + + + + + {lang_activate} + + + + +   + + + diff --git a/emailadmin/templates/default/edituserdata.tpl b/emailadmin/templates/default/edituserdata.tpl new file mode 100644 index 0000000000..15e409690f --- /dev/null +++ b/emailadmin/templates/default/edituserdata.tpl @@ -0,0 +1,111 @@ + + +
+
+ + + + + +
+ {rows} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {lang_email_config} + + {lang_emailaccount_active} + +
{lang_emailAddress} + +
{lang_mailAlternateAddress} + {selectbox_mailAlternateAddress} + +
+
+ +
{lang_mailRoutingAddress} + {selectbox_mailRoutingAddress} + +
+
+ +
+ {lang_forward_only} + + +
+   +
+ {lang_quota_settings} +
{lang_qoutainmbyte} + ({lang_0forunlimited}) +
+   +
+ + + + +
+ +
+
+
+
+ + + + +   {row_text} + + diff --git a/emailadmin/templates/default/images/navbar.png b/emailadmin/templates/default/images/navbar.png new file mode 100644 index 0000000000000000000000000000000000000000..2c2183563581f64d81a86acdab90d5d55f2812c9 GIT binary patch literal 2051 zcmV+e2>kbnP)t-6Qx$8qNr(_s!E%LR&kZ8 z5=|6HAEHRTsCj53^`Sge0-+K@s}M*{2;$OEO1UKz<4eJqt!?mLyzBMu?C$K&?wmfX zcYPs18YNO6I?_n{ojr5@zwbZa`DO42gmeOYP1``JD)kg z!GotssboAP2;$3vz}lLc{9eD`EmBIrIiRW<0s)UWG7{c?CxB0N3l1MX6Ci~B2*8sb zkHg;B=y#jVGB^h~=ir<}*LA3>4nhddo*hb#k0;uKub%lBNj{l7{H7FwF9S4eYlu0wvBUi*VH&2wY4=i zNfPH}%Q=T(%*L6F23_aXH8|%ua^%BXiA1Jh$Br%ho(^2Na9K7Ce2WnJ6IqsO>*~Bd zyWL7E*)7bLb5!F}$$+L6z?e9jB_U{NsPQBc>Sh4%-x1)_r7J5b6anjra&^OLJ&j{LgsrF<657J#F16u3g0Stp5 zV2pJVLZItK7>0q_BAc~vA<+DBAQFxubbdc1Erit%cEjolfKZA;Hi@zRGdQ<*2Ra^m zi3kFFW-b8L_2SN0EIvsog(wP;BoVn>9;uXysi_oHH3wZUeyniWevW)z$H2KG&?in| z@tQBAq-T(fT*cJH5VF$|)C8BHrOAx*fBGf-KE=Cj+aDjOI30P|!gsgCq%%Bx%N_GE8_Pf_UG4+_$726aP9rullp8Da1m< zphW{lPQl_uE@gB~eFeZ*tGghdFZ?_lp6qIFu6I`oth@k+$s|Kjr0Vv{WO7I*&Rv`sA>*o6N5=0NJoZet`tGJ z1+C4?v8r6gn-d<77fr!B*exc&FaQ()nV~31;2h}aXe7su_5W}l zKt8YkZfq>_tjFW5n=4u=K0*itfzBBx)k3VTtHXvTwgba^(b&=o#!E9jeij^zBC1WI z(dCDtNLaMU?|bgKKdhq_fK8h^Bl&z`SkpAjZ@B=a1d_zS7y+ep<|Lq$fH4ZjDE!UK zkz!3KK?Jb}0c!xT)C1NAa9a@L<6)@IRq*&~!5G1c6#=u&ru=kX=XvU>XTzMM+vTz= zbL|&J0hAIDGJBR|RAWIDVfHOU@4>&J&S!$;Y5+C6p&JyVBctd&U%*3KzJtNRDBr*T zT;k%z(BBh@?9b*s4UZl@M@3NxZP>7~5g;%O4oV3`k=^rgT`1@{`N37#Jx!>y#gUJX zVBnuOu%!JySOaaiaxKq~{^e+tG3mFes{elH&hI4vfX-cH^X7F%v1sg%Mw3Rxe#So8 zJ4+}OLr!$Rd}YC_4k5ku3LY_Xa4HO1LtRfG-e0N(H9Vz^z*vh6ZjT5-lK^2GSW|#TVMvws&+rIrrMz0J^(3 zjH#+Nn#&ackWU0KFc5-l@jwtL3OZ0M0XN4JNKI!D4kuA80lE&@9ah@ewf@@3^N-}YZFm&b(*!}_jWC!>cBUD(yv7usmD$VWXcMX)G=lm4A?Ay+W}Zj z1}W+}FQAaSz7=P)`PcjVN1vFSOqs7;n@DJyen3^V*L!*%y*_u|;9zg*aIfzdl<2~S zja}>O>YPqlmZdGyjd!+geYkk{ijZx=V8_z6YuBxAXsBImv6x+oBG61mGm^>a`1R}mzW&iiXD-F# hBUb^W|7Sj6{{t9+t8k5SKfV9}002ovPDHLkV1je!*De46 literal 0 HcmV?d00001 diff --git a/emailadmin/templates/default/ldapsettings.tpl b/emailadmin/templates/default/ldapsettings.tpl new file mode 100644 index 0000000000..3e432cbd87 --- /dev/null +++ b/emailadmin/templates/default/ldapsettings.tpl @@ -0,0 +1,87 @@ + +
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {lang_server_name} + + +
+ {lang_server_description} + + +
+ {lang_ldap_server} + + +
+ {lang_ldap_basedn} + + +
+ {lang_ldap_server_admin} + + +
+ {lang_ldap_server_password} + + +
+ {lang_back} + + + +
+
+
+
+ + + + + +
{menu_description} + + + + + + + + {menu_description} + + + diff --git a/emailadmin/templates/default/listservers.tpl b/emailadmin/templates/default/listservers.tpl new file mode 100755 index 0000000000..d09b3e8c2b --- /dev/null +++ b/emailadmin/templates/default/listservers.tpl @@ -0,0 +1,25 @@ + +
+ + + + + + + + + + +
+   + +{lang_server_list} + + {lang_add_server} +
+ {server_next_match} +
+
+
+ + diff --git a/emailadmin/templates/default/nextMatch.tpl b/emailadmin/templates/default/nextMatch.tpl new file mode 100644 index 0000000000..0bd2bfaee3 --- /dev/null +++ b/emailadmin/templates/default/nextMatch.tpl @@ -0,0 +1,25 @@ + + + + {left_next_matchs} + + {right_next_matchs} + +
{description}
+ + + + + + {header_row_data} + + + + + + + {row_data} + + + +
\ No newline at end of file diff --git a/emailadmin/templates/default/options.tpl b/emailadmin/templates/default/options.tpl new file mode 100644 index 0000000000..c979d5d1a9 --- /dev/null +++ b/emailadmin/templates/default/options.tpl @@ -0,0 +1,138 @@ + +
+ + + + + +
+ + {menu_rows} + + + + {activation_rows} + + + +
+   +
+ {lang_done} +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ ldaplocaldelivery +
+ {desc_ldaplocaldelivery} +
+ +
+   +
+ ldapdefaultdotmode +
+ {desc_ldapdefaultdotmode} +
+ +
+   +
+ ldapbasedn +
+ {desc_ldapbasedn} +
+ +
+   +
+ dirmaker +
+ ldapcluster +
+
+
+
+ + + + + +
{menu_description} + + + + + + + + {menu_description} + + + + + + + + {lang_activate} + + + + +   + + + diff --git a/emailadmin/templates/default/smtprouting.tpl b/emailadmin/templates/default/smtprouting.tpl new file mode 100644 index 0000000000..a2c56ac857 --- /dev/null +++ b/emailadmin/templates/default/smtprouting.tpl @@ -0,0 +1,112 @@ + +
+ + + + + +
+ + {menu_rows} + + + + {activation_rows} + + + +
+   +
+ {lang_done} +
+
+ + + + +
+
+ + + + + + + + {smtproute_rows} + + + + + + +
+ {lang_domain_name} + + {lang_remote_server} + + {lang_remote_port} + + {lang_delete} +
+ + + + + + + + +
+
+
+
+
+ + + + + +
{menu_description} + + + + + + + + {menu_description} + + + + + + + + {lang_activate} + + + + +   + + + + + + + + {domain_name} + + + {remote_server} + + + {remote_port} + + + {lang_delete} + + + diff --git a/emailadmin/templates/jerryr/images/navbar-over.png b/emailadmin/templates/jerryr/images/navbar-over.png new file mode 100644 index 0000000000000000000000000000000000000000..2c2183563581f64d81a86acdab90d5d55f2812c9 GIT binary patch literal 2051 zcmV+e2>kbnP)t-6Qx$8qNr(_s!E%LR&kZ8 z5=|6HAEHRTsCj53^`Sge0-+K@s}M*{2;$OEO1UKz<4eJqt!?mLyzBMu?C$K&?wmfX zcYPs18YNO6I?_n{ojr5@zwbZa`DO42gmeOYP1``JD)kg z!GotssboAP2;$3vz}lLc{9eD`EmBIrIiRW<0s)UWG7{c?CxB0N3l1MX6Ci~B2*8sb zkHg;B=y#jVGB^h~=ir<}*LA3>4nhddo*hb#k0;uKub%lBNj{l7{H7FwF9S4eYlu0wvBUi*VH&2wY4=i zNfPH}%Q=T(%*L6F23_aXH8|%ua^%BXiA1Jh$Br%ho(^2Na9K7Ce2WnJ6IqsO>*~Bd zyWL7E*)7bLb5!F}$$+L6z?e9jB_U{NsPQBc>Sh4%-x1)_r7J5b6anjra&^OLJ&j{LgsrF<657J#F16u3g0Stp5 zV2pJVLZItK7>0q_BAc~vA<+DBAQFxubbdc1Erit%cEjolfKZA;Hi@zRGdQ<*2Ra^m zi3kFFW-b8L_2SN0EIvsog(wP;BoVn>9;uXysi_oHH3wZUeyniWevW)z$H2KG&?in| z@tQBAq-T(fT*cJH5VF$|)C8BHrOAx*fBGf-KE=Cj+aDjOI30P|!gsgCq%%Bx%N_GE8_Pf_UG4+_$726aP9rullp8Da1m< zphW{lPQl_uE@gB~eFeZ*tGghdFZ?_lp6qIFu6I`oth@k+$s|Kjr0Vv{WO7I*&Rv`sA>*o6N5=0NJoZet`tGJ z1+C4?v8r6gn-d<77fr!B*exc&FaQ()nV~31;2h}aXe7su_5W}l zKt8YkZfq>_tjFW5n=4u=K0*itfzBBx)k3VTtHXvTwgba^(b&=o#!E9jeij^zBC1WI z(dCDtNLaMU?|bgKKdhq_fK8h^Bl&z`SkpAjZ@B=a1d_zS7y+ep<|Lq$fH4ZjDE!UK zkz!3KK?Jb}0c!xT)C1NAa9a@L<6)@IRq*&~!5G1c6#=u&ru=kX=XvU>XTzMM+vTz= zbL|&J0hAIDGJBR|RAWIDVfHOU@4>&J&S!$;Y5+C6p&JyVBctd&U%*3KzJtNRDBr*T zT;k%z(BBh@?9b*s4UZl@M@3NxZP>7~5g;%O4oV3`k=^rgT`1@{`N37#Jx!>y#gUJX zVBnuOu%!JySOaaiaxKq~{^e+tG3mFes{elH&hI4vfX-cH^X7F%v1sg%Mw3Rxe#So8 zJ4+}OLr!$Rd}YC_4k5ku3LY_Xa4HO1LtRfG-e0N(H9Vz^z*vh6ZjT5-lK^2GSW|#TVMvws&+rIrrMz0J^(3 zjH#+Nn#&ackWU0KFc5-l@jwtL3OZ0M0XN4JNKI!D4kuA80lE&@9ah@ewf@@3^N-}YZFm&b(*!}_jWC!>cBUD(yv7usmD$VWXcMX)G=lm4A?Ay+W}Zj z1}W+}FQAaSz7=P)`PcjVN1vFSOqs7;n@DJyen3^V*L!*%y*_u|;9zg*aIfzdl<2~S zja}>O>YPqlmZdGyjd!+geYkk{ijZx=V8_z6YuBxAXsBImv6x+oBG61mGm^>a`1R}mzW&iiXD-F# hBUb^W|7Sj6{{t9+t8k5SKfV9}002ovPDHLkV1je!*De46 literal 0 HcmV?d00001 diff --git a/emailadmin/templates/jerryr/images/navbar.png b/emailadmin/templates/jerryr/images/navbar.png new file mode 100644 index 0000000000000000000000000000000000000000..ed3f908018708567cdf0f883f38f1b5e49aaead1 GIT binary patch literal 1110 zcmV-c1gZOpP)kdg00002VoOIv0RM-N z%)bBt010qNS#tmY3ljhU3ljkVnw%H_000McNliru)(i;=1rjk-Nt*xw1LsLZK~zY` z)s5=ovV1Xq%gZEr;G>ENPf zKCAZWq2`8K6+lwDrx8G?X7+XZ{?)HBH_EUHE&xxlgWhaMf z=Ab-e_xb&>&98o5iA%}|qowRyp z4{;PgGl$fjf;=X+vedPpC|AkRg%?4FaR%8dw4M?`$$uK3RnW1KVUc;3$d~oqWSO6d zv7J0IqAU_1$S`&O{wDym_W98p*(L*l13M-e7RaGs!-fqB++vKa{BHe$6gM%s&HYB? z2+x29%kRfJ?yD`S3LF>|Std;qiH=H?3=tH-WF8m0XyFDvoE?Wf14#usE+!VtvYrd< zcxj;#2RRIM;>3tCONc#eB8x(n?Ot0iC;;Y(xnkwi(NJ+vOOPPd)U%mR_R)m_=m;d+ zg#Id}$@S7$=0Jn{jt7B;K(Q_tjX2pw6E1XY*fE&mAw1l&1uiH6U9siKEGr%qY^W$! zRZ$5d02fZ2RN-WrD*Pz4Io)qrGw486c6*J|yN-fDSo#8ij-PMwQ-gs?n4fr#3Hfzm z>Zh7apj1M>SjM7FUlk&`r`f>V`V+m^z;c2t*W!#ilgHloc zq(B`8K9ba<@t|l8|9J9P0#*T#{U|(h_bsZ(IGaebM3iyjERm+Y^O60fud9H)H<$j( z-WBjGRcPcX5@C@TMGDj?9WQ$7%K)(aVK`NpKFv3&Gf{s*$BvCzOctTK>e$>Eoka&huW)z(65}MjRajgL+rTPDB}CU!ibnR)QqL*~P)@S6)s8 zdk=mwR&= + * added support for signatures managed by admin aka forced signatures + +2007-03-05 Lars Kneschke + * fixed not working disabling of STARTTLS + * fixed borken FeLaMiMail preferences translations + * fixed full stop on Sieve connection error + * made INBOX counter on homepage working again (based on patch from Pavel Šorejs) + * display 0 instead of   on empty folders (based on patch from Pavel Šorejs) + * removed some not longer needed files + +2007-02-28 Lars Kneschke + * rewrote logic to encode header, to handle wrongly encoded header + +2007-02-26 Lars Kneschke + * added support for messages containing only attachments (application/..., audio/...) + +2007-02-16 Lars Kneschke + * fix for loosing formating of centering, right-justification, text coloring and italics when composing from draft + * fixed my emailaddress in changelog file + +2007-02-15 Lars Kneschke + * enabled sieve support for custom email account settings + +2007-02-14 Lars Kneschke + * improved foldermanagement for server not supporting acl + * extended imap test script + +2007-02-13 Lars Kneschke + * updated imap server test script + +2007-02-12 Lars Kneschke + * added a script to test imap servers + +2007-01-24 Lars Kneschke + * removed some old code, which got not used anymore, but created problems (the blind gut of FeLaMiMail :-)) + +2007-01-13 Lars Kneschke + * finally added support the in-reply-to header + +2007-01-11 Lars Kneschke + * added support for serverside sort + * you make one signature the default one + * added support for searching content of message body + +2007-01-05 Lars Kneschke + * fetch quota from imap server only, if imap server supports quota + * improved autocreation of folders + +2006-12-31 Lars Kneschke + * major rewrite of the imap backend. php-imap is mostly gone. all imap code + is now based on the PEAR class Net_IMAP + * drafts keep their formating + * saving a message is working now + * improved folder handling + * signatures can now be managed from IE too + * make FeLaMiMail dependent on egw-pear + +2006-11-20 Lars Kneschke + * passwords are now hidden, when editing account settings + +2006-11-08 Lars Kneschke + * edit signature is now using fckeditor too + * improved generating multipart messages again + +2006-11-07 Lars Kneschke + * switched to fckeditor for writing html emails + * fixed login problem, when using userdefined accounts(loginname was not sent) + * improved generating multipart messages + +20061027 +- fixed printing when email conatains a cc +- signature description was always "undefined" when using internet explorer +- reorganized compose dialog a little bit. The folder select button as now + directly beside the select box for from, to, cc, reply to and folder +- fixed a JS error, when selecting the folder from the folder tree + +20061026 +- added some more logic, to also import the organisation, when importing addresses by + clicking at the icon behind the emailaddresses + +20061025 +- made printing working again +- fixed some IE only Javascript problems + +20061004 +- completly finnished rewrite of signature handling +- fixed display of messages. You get not the same font also used everwhere in eGW + +20060928 +- finished signature handling rewrite mostly. You can now define multiple signatures + and select them while writing a email. + +20060914 +- removed (temporarly) the dbcache. FeLaMiMail now works completly against the imapserver. + This requires a server with search and sort functionality. Big folders + should be displayed now very fast. +- you can sort by message status now +- updating trash folder counter and quota display when deleting messages + +20060821 +- added support for composing html emails +- fixed some minor internet explorer only display problems +- messages gets now displayed in a separate iframe. This allows to display html emails, whitout breaking css styles of the main display window. Also only the iframe gets a scrollbar now. That stops the "jumping buttons". In the past they were jumping to the left, when the email was to long and a scrollbar got displayed on the right. + +20060802 +- fixed bug [ 1487161 ] felamimail <> UTF-8 <> Postgres trouble +- fixed bug [ 1451287 ] Database error when accessing some folders + +20060801 +- added support for saving drafts +- removed debug code from the javascript code +- current inputfield is blinking now, when livesearch starts +- removed unneeded admin section + +20051128 +- fixed compose link in sidebox menu +- added action to cancel button on edit forwarding page +- removed admin section, any configuration is now done in emailadmin + +20051121 +- fixed the display of messages. messages now always open in new windows +- fixed navbar and replaced text with icons + +20051120 +- removed dependency on email + +20051018 +- fixed Bug where nodisplayable characters got displayed and broke caching + in the database + +20051013 +- added feature to let Postfix LDAP users edit there own email forwarding settings + feature can be enabled/disabled by settings in emailadmin + +20051012 +- fixed a bug, which triggered when compressing the folder + +20051011 +- fixed handling of "empty trash" and "compress folder" + the links got moved to the sidebox and are using ajax too +- fixed the header of the address row in the main view + the sent folder displays "to" all other folders are diplaying "from" + +Version 1.0 +- updated FeLaMiMail to use AJAX +- reworked the way the UI works. Most UI actions now don't need any reload +anymore. + +Version 0.9.6 + +- displaying of subfolders with hyphen was broken Bug #1195101 +- patch from Regis Regis Leroy to display counters on folders and improve + folder handling +- improved folder management. You can create now subfolders in the top + level. This should also improve support for UW IMAP +- fixed charset bug in folder management pages +- added support for javascript based folder tree + +Version 0.9.5 + +- ported Smartsieve to FeLaMiMail +- added highlighting for quotes (copied from horde) +- fixed sorting + - added all needed options to preferences + - can now be sorted by size too +- forwarding messages now as message/rfc822 +- improved mainview + - javascript selectbutton to select all messages + - fixed layout + - support colors from selected layout +- added support for emailadmin +- updated PHPMailer to version 0.7.1 +- added support for localized smtp error messages +- improved mime type handling +- also forward attachments +- support for �... in folder names +- support html emails(most evil tags get removed) +- code cleanup +- added Sidebox for Idots +- added user defined EMail accounts again, can be deactivated by admin + +Version 0.9.3/0.9.4 + +- added usefull error messsages, if login to imap server fails +- imaps support(encryption only and encryption with authentication) +- added smtp auth support +- print function; displays the page without the phpgw navbar, so will + print only the email +- removed old Squirrelmail code again +- the code to display emails is rewriten too, it's all based + on phpGW now +- rewrote folder management +- removed images, they where not always helpfull + +- filter dialog improved again + - you can store multiple filters now + - added quicksearch + +- integration of sieve-php + - you can manage sieve scripts on a sieve enables imap server + +- internal code cleanup +- modified linux-at-work.de template +- updated preferences dialog to do it the phpgroupware way +- you can define a refresh time for the mailbox message list +- fixed a nasty bug, when replying to emails which contain " or , in the + to,cc or bcc fields +- fixed quoted printable en/decoding in the + headers/subject(it was time to read the rfc's :) ) +- highlithing of web and email urls +- enabled vmailmgr login again +- don't halt smtp error messages anymore, but display the error + and go back to the compose window +- display the organization when showing the mail +- fixed download/save of attachment under IE and SSL + +Version 0.9.2 + +- improved filter dialog + - added a easy way to enable/disable the filter + - you can search for from, to, subject + +- updated the linux-at-work temmplate + +- fixed some bugs, where the mainview where broken, because of missing templates + +- the user preferences where not working correctly + diff --git a/felamimail/README b/felamimail/README new file mode 100644 index 0000000000..4f7dd82ee4 --- /dev/null +++ b/felamimail/README @@ -0,0 +1,20 @@ +FeLaMiMail +http://www.egroupware.org + +Author: +------- +Lars Kneschke l.kneschke@metaways.de + +Thanks to everyone who contributed to FeLaMiMail in the past. + +For example(ordered alphabetical): +- Christian Binder +- Randy Houlahan +- Sebastian Ebling + +If you think you belong here too, please feel free to contact me. + +Licensing: +---------- +This product is distributed under the GPL. Please read through the file +COPYING for more information about our license. \ No newline at end of file diff --git a/felamimail/TODO b/felamimail/TODO new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/felamimail/TODO @@ -0,0 +1 @@ + diff --git a/felamimail/inc/class.Script.inc.php b/felamimail/inc/class.Script.inc.php new file mode 100644 index 0000000000..aa217f7ee1 --- /dev/null +++ b/felamimail/inc/class.Script.inc.php @@ -0,0 +1,510 @@ + + * + * See the inclosed smartsieve-NOTICE file for conditions of use and distribution. + */ + +class Script { + + var $name; /* filename of script. */ + var $script; /* full ascii text of script from server. */ + var $size; /* size of script in bytes. */ + var $so; /* boolean: is it safe to overwrite script? + * only safe if we recognise encoding. */ + var $mode; /* basic or advanced. Smartsieve can only read/write basic. */ + var $rules; /* array of sieve rules. */ + var $vacation; /* vacation settings. */ + var $emailNotification; /* email notification settings. */ + var $pcount; /* highest priority value in ruleset. */ + var $errstr; /* error text. */ + /** + * Switch on some error_log debug messages + * + * @var boolean + */ + var $debug=false; + + // class constructor + function Script ($scriptname) { + $this->name = $scriptname; + $this->script = ''; + $this->size = 0; + $this->so = true; + $this->mode = ''; + $this->rules = array(); + $this->vacation = array(); + $this->emailNotification = array(); // Added email notifications + $this->pcount = 0; + $this->errstr = ''; + } + + // get sieve script rules for this user + /** + * Retrieve the rules + * + * @param bosieve $connection + * @return boolean true, if script written successfull + */ + function retrieveRules ($connection) { + #global $_SESSION; + $continuebit = 1; + $sizebit = 2; + $anyofbit = 4; + $keepbit = 8; + $regexbit = 128; + + if (!isset($this->name)){ + $this->errstr = 'retrieveRules: no script name specified'; + if ($this->debug) error_log(__CLASS__.'::'.__METHOD__.": no script name specified"); + return false; + } + + if (!is_object($connection)) { + $this->errstr = "retrieveRules: no sieve session open"; + if ($this->debug) error_log(__CLASS__.'::'.__METHOD__.": no sieve session open"); + return false; + } + + // if script doesn't yet exist, nothing to retrieve. + // safe to write to this script file. + #LK if (!AppSession::scriptExists($this->name)) { + #LK $this->so = true; + #LK return true; + #LK } + + #print "



get Script ". $this->name ."
"; + + if(PEAR::isError($script = $connection->getScript($this->name))) { + if ($this->debug) error_log(__CLASS__.'::'.__METHOD__.": error retrieving script: ".$script->getMessage()); + return $script; + } + + #print "
AAA: Script is ". htmlentities($script) ."
"; + $lines = array(); + $lines = preg_split("/\n/",$script); //,PREG_SPLIT_NO_EMPTY); + + $rules = array(); + $vacation = array(); + $emailNotification = array(); // Added email notifications + $regexps = array('^ *##PSEUDO','^ *#rule','^ *#vacation','^ *#mode'); + $regexps[] = '^ *#notify'; // Added email notifications + + /* first line should be the script size. eg: {123}. */ + #$line = array_shift($lines); + #if (!preg_match("/^\{(\d+)\}$/", $line, $bits)){ + # print 'retrieveRules: unexpected value: ' . $line .'
'; + # $this->errstr = 'retrieveRules: unexpected value: ' . $line; + # return false; + #} + #LK $this->size = $bits[1]; + + /* next line should be the recognised encoded head. if not, the script + * is of an unrecognised format, and we should not overwrite it. */ + $line = array_shift($lines); + if (!preg_match("/^# ?Mail(.*)rules for/", $line)){ + $this->errstr = 'retrieveRules: encoding not recognised'; + $this->so = false; + if ($this->debug) error_log(__CLASS__.'::'.__METHOD__.": encoding not recognised"); + return false; + } + $this->so = true; + + $line = array_shift($lines); + + while (isset($line)){ + foreach ($regexps as $regexp){ + if (preg_match("/$regexp/i",$line)){ + $line = rtrim($line); + if (preg_match("/^ *#rule&&(.*)&&(.*)&&(.*)&&(.*)&&(.*)&&(.*)&&(.*)&&(.*)&&(.*)&&(.*)&&(.*)$/i",$line,$bits)){ + $rule = array(); + $rule['priority'] = $bits[1]; + $rule['status'] = $bits[2]; + $rule['from'] = stripslashes($bits[3]); + $rule['to'] = stripslashes($bits[4]); + $rule['subject'] = stripslashes($bits[5]); + $rule['action'] = $bits[6]; + $rule['action_arg'] = $bits[7]; + // s will be encoded as \\n. undo this. + $rule['action_arg'] = preg_replace("/\\\\n/","\r\n",$rule['action_arg']); + $rule['action_arg'] = stripslashes($rule['action_arg']); + $rule['flg'] = $bits[8]; // bitwise flag + $rule['field'] = stripslashes($bits[9]); + $rule['field_val'] = stripslashes($bits[10]); + $rule['size'] = $bits[11]; + $rule['continue'] = ($bits[8] & $continuebit); + $rule['gthan'] = ($bits[8] & $sizebit); // use 'greater than' + $rule['anyof'] = ($bits[8] & $anyofbit); + $rule['keep'] = ($bits[8] & $keepbit); + $rule['regexp'] = ($bits[8] & $regexbit); + $rule['unconditional'] = 0; + if (!$rule['from'] && !$rule['to'] && !$rule['subject'] && + !$rule['field'] && !$rule['size'] && $rule['action']) { + $rule['unconditional'] = 1; + } + + array_push($rules,$rule); + + if ($rule['priority'] > $this->pcount) { + $this->pcount = $rule['priority']; + } + } + + if (preg_match("/^ *#vacation&&(.*)&&(.*)&&(.*)&&(.*)&&(.*)/i",$line,$bits) || + preg_match("/^ *#vacation&&(.*)&&(.*)&&(.*)&&(.*)/i",$line,$bits)) { + $vacation['days'] = $bits[1]; + $vaddresslist = $bits[2]; + $vaddresslist = preg_replace("/\"|\s/","",$vaddresslist); + $vaddresses = array(); + $vaddresses = preg_split("/,/",$vaddresslist); + $vacation['text'] = $bits[3]; + + // s will be encoded as \\n. undo this. + $vacation['text'] = preg_replace("/\\\\n/","\r\n",$vacation['text']); + + if (strpos($bits[4],'-')!== false) + { + $vacation['status'] = 'by_date'; + list($vacation['start_date'],$vacation['end_date']) = explode('-',$bits[4]); + } + else + { + $vacation['status'] = $bits[4]; + } + $vacation['addresses'] = &$vaddresses; + + $vacation['forwards'] = $bits[5]; + } + + if (preg_match("/^ *#notify&&(.*)&&(.*)&&(.*)/i",$line,$bits)) { + $emailNotification['status'] = $bits[1]; + $emailNotification['externalEmail'] = $bits[2]; + $emailNotification['displaySubject'] = $bits[3]; + } + + if (preg_match("/^ *#mode&&(.*)/i",$line,$bits)){ + if ($bits[1] == 'basic') + $this->mode = 'basic'; + elseif ($bits[1] == 'advanced') + $this->mode = 'advanced'; + else + $this->mode = 'unknown'; + } + } + } + $line = array_shift($lines); + } + + $this->script = $script; + $this->rules = $rules; + $this->vacation = $vacation; + $this->emailNotification = $emailNotification; // Added email notifications + if ($this->debug) error_log(__CLASS__.'::'.__METHOD__.": Script succesful retrieved: ".print_r($vacation,true)); + + return true; + } + + + // update and save sieve script + function updateScript ($connection) + { + #global $_SESSION,$default,$sieve; + global $default,$sieve; + + $activerules = 0; + $regexused = 0; + $rejectused = 0; + + $username = $GLOBALS['egw_info']['user']['account_lid']; + $version = $GLOBALS['egw_info']['apps']['felamimail']['version']; + + //include "$default->lib_dir/version.php"; + + if (!is_object($connection)) + { + $this->errstr = "updateScript: no sieve session open"; + return false; + } + + // don't overwrite a file if not created by SmartSieve, + // unless configured to do so. +#LK if (!$this->so && !$default->allow_write_unrecognised_scripts) { +#LK $this->errstr = 'updateScript: encoding not recognised: not safe to overwrite ' . $this->name; +#LK return false; +#LK } + + // lets generate the main body of the script from our rules + + $newscriptbody = ""; + $continue = 1; + + foreach ($this->rules as $rule) { + $newruletext = ""; + + // don't print this rule if disabled. + if ($rule['status'] != 'ENABLED') { + } else { + + $activerules = 1; + + // conditions + + $anyall = "allof"; + if ($rule['anyof']) $anyall = "anyof"; + if ($rule['regexp']) { + $regexused = 1; + } + $started = 0; + + if (!$rule['unconditional']) { + if (!$continue) $newruletext .= "els"; + $newruletext .= "if " . $anyall . " ("; + if ($rule['from']) { + if (preg_match("/^\s*!/", $rule['from'])){ + $newruletext .= 'not '; + $rule['from'] = preg_replace("/^\s*!/","",$rule['from']); + } + $match = ':contains'; + if (preg_match("/\*|\?/", $rule['from'])) $match = ':matches'; + if ($rule['regexp']) $match = ':regex'; + $newruletext .= "address " . $match . " [\"From\"]"; + $newruletext .= " \"" . addslashes($rule['from']) . "\""; + $started = 1; + } + if ($rule['to']) { + if ($started) $newruletext .= ", "; + if (preg_match("/^\s*!/", $rule['to'])){ + $newruletext .= 'not '; + $rule['to'] = preg_replace("/^\s*!/","",$rule['to']); + } + $match = ':contains'; + if (preg_match("/\*|\?/", $rule['to'])) $match = ':matches'; + if ($rule['regexp']) $match = ':regex'; + $newruletext .= "address " . $match . " [\"To\",\"TO\",\"Cc\",\"CC\"]"; + $newruletext .= " \"" . addslashes($rule['to']) . "\""; + $started = 1; + } + if ($rule['subject']) { + if ($started) $newruletext .= ", "; + if (preg_match("/^\s*!/", $rule['subject'])){ + $newruletext .= 'not '; + $rule['subject'] = preg_replace("/^\s*!/","",$rule['subject']); + } + $match = ':contains'; + if (preg_match("/\*|\?/", $rule['subject'])) $match = ':matches'; + if ($rule['regexp']) $match = ':regex'; + $newruletext .= "header " . $match . " \"subject\""; + $newruletext .= " \"" . addslashes($rule['subject']) . "\""; + $started = 1; + } + if ($rule['field'] && $rule['field_val']) { + if ($started) $newruletext .= ", "; + if (preg_match("/^\s*!/", $rule['field_val'])){ + $newruletext .= 'not '; + $rule['field_val'] = preg_replace("/^\s*!/","",$rule['field_val']); + } + $match = ':contains'; + if (preg_match("/\*|\?/", $rule['field_val'])) $match = ':matches'; + if ($rule['regexp']) $match = ':regex'; + $newruletext .= "header " . $match . " \"" . addslashes($rule['field']) . "\""; + $newruletext .= " \"" . addslashes($rule['field_val']) . "\""; + $started = 1; + } + if ($rule['size']) { + $xthan = " :under "; + if ($rule['gthan']) $xthan = " :over "; + if ($started) $newruletext .= ", "; + $newruletext .= "size " . $xthan . $rule['size'] . "K"; + $started = 1; + } + + } + + // actions + + if (!$rule['unconditional']) $newruletext .= ") {\n\t"; + + if (preg_match("/folder/i",$rule['action'])) { + $newruletext .= "fileinto \"" . $rule['action_arg'] . "\";"; + } + if (preg_match("/reject/i",$rule['action'])) { + $newruletext .= "reject text: \n" . $rule['action_arg'] . "\n.\n;"; + $rejectused = 1; + } + if (preg_match("/address/i",$rule['action'])) { + $newruletext .= "redirect \"" . $rule['action_arg'] . "\";"; + } + if (preg_match("/discard/i",$rule['action'])) { + $newruletext .= "discard;"; + } + if ($rule['keep']) $newruletext .= "\n\tkeep;"; + if (!$rule['unconditional']) $newruletext .= "\n}"; + + $continue = 0; + if ($rule['continue']) $continue = 1; + if ($rule['unconditional']) $continue = 1; + + $newscriptbody .= $newruletext . "\n\n"; + + } // end 'if ! ENABLED' + } + + // vacation rule + + if ($this->vacation) { + $vacation = $this->vacation; + if (!$vacation['days']) $vacation['days'] = $default->vacation_days; + if (!$vacation['text']) $vacation['text'] = $default->vacation_text; + if (!$vacation['status']) $vacation['status'] = 'on'; + + // filter out invalid addresses. + $ok_vaddrs = array(); + foreach($vacation['addresses'] as $addr){ + if ($addr != '' && preg_match("/\@/",$addr)) + array_push($ok_vaddrs,$addr); + } + $vacation['addresses'] = $ok_vaddrs; + + if (!$vacation['addresses'][0]){ + $defaultaddr = $sieve->user . '@' . $sieve->maildomain; + array_push($vacation['addresses'],$defaultaddr); + } + if ($vacation['status'] == 'on' || $vacation['status'] == 'by_date' && + $vacation['start_date'] <= time() && time() < $vacation['end_date']+24*3600) // +24*3600 to include the end_date day + { + if (trim($vacation['forwards'])) { + $if = array(); + foreach($vacation['addresses'] as $addr) { + $if[] = 'address :contains ["To","TO","Cc","CC"] "'.$addr.'"'; + } + $newscriptbody .= 'if anyof ('.implode(', ',$if).") {\n"; + foreach(preg_split('/, ?/',$vacation['forwards']) as $addr) { + $newscriptbody .= "\tredirect \"".$addr."\";\n"; + } + $newscriptbody .= "\tkeep;\n}\n"; + } + $vacation_active = true; + $newscriptbody .= "vacation :days " . $vacation['days'] . " :addresses ["; + $first = 1; + foreach ($vacation['addresses'] as $vaddress) { + if (!$first) $newscriptbody .= ", "; + $newscriptbody .= "\"" . $vaddress . "\""; + $first = 0; + } + $message = $vacation['text']; + if ($vacation['start_date'] || $vacation['end_date']) + { + $message = str_replace(array('$$start$$','$$end$$'),array( + date($GLOBALS['egw_info']['user']['preferences']['common']['dateformat'],$vacation['start_date']), + date($GLOBALS['egw_info']['user']['preferences']['common']['dateformat'],$vacation['end_date']), + ),$message); + } + $newscriptbody .= "] text:\n" . $message . "\n.\n;\n\n"; + } + + // update with any changes. + $this->vacation = $vacation; + } + + if ($this->emailNotification && $this->emailNotification['status'] == 'on') { + // format notification email header components + $notification_email = $this->emailNotification['externalEmail']; + + // format notification body + $egw_site_title = $GLOBALS['egw_info']['server']['site_title']; + $notification_body = lang("You have received a new message on the")." {$egw_site_title}"."\n"; + $notification_body .= "\n"; + $notification_body .= 'From: $from$'."\n"; + if ($this->emailNotification['displaySubject']) { + $notification_body .= 'Subject: $subject$'."\n"; + } + //$notification_body .= 'Size: $size$'."\n"; + + $newscriptbody .= 'notify :message "'.$notification_body.'" :method "mailto" :options "'.$notification_email.'";'."\n"; + //$newscriptbody .= 'notify :message "'.$notification_body.'" :method "mailto" :options "'.$notification_email.'?subject='.$notification_subject.'";'."\n"; + $newscriptbody .= 'keep;'."\n\n"; + } + + // generate the script head + + $newscripthead = ""; + $newscripthead .= "#Mail filter rules for " . $username . "\n"; + $newscripthead .= '#Generated by ' . $username . ' using FeLaMiMail ' . $version . ' ' . date($default->script_date_format); + $newscripthead .= "\n"; + + if ($activerules) { + $newscripthead .= "require [\"fileinto\""; + if ($regexused) $newscripthead .= ",\"regex\""; + if ($rejectused) $newscripthead .= ",\"reject\""; + if ($this->vacation && $vacation_active) { + $newscripthead .= ",\"vacation\""; + } + if ($this->emailNotification && $this->emailNotification['status'] == 'on') $newscripthead .= ',"notify"'; // Added email notifications + $newscripthead .= "];\n\n"; + } else { + // no active rules, but might still have an active vacation rule + if ($this->vacation && $vacation_active) + $newscripthead .= "require [\"vacation\"];\n\n"; + if ($this->emailNotification && $this->emailNotification['status'] == 'on') $newscripthead .= "require [\"notify\"];\n\n"; // Added email notifications + } + + + // generate the encoded script foot + + $newscriptfoot = ""; + $pcount = 1; + $newscriptfoot .= "##PSEUDO script start\n"; + foreach ($this->rules as $rule) { + // only add rule to foot if status != deleted. this is how we delete a rule. + if ($rule['status'] != 'DELETED') { + $rule['action_arg'] = addslashes($rule['action_arg']); + // we need to handle \r\n here. + $rule['action_arg'] = preg_replace("/\r\n/","\\n",$rule['action_arg']); + /* reset priority value. note: we only do this + * for compatibility with Websieve. */ + $rule['priority'] = $pcount; + $newscriptfoot .= "#rule&&" . $rule['priority'] . "&&" . $rule['status'] . "&&" . + addslashes($rule['from']) . "&&" . addslashes($rule['to']) . "&&" . addslashes($rule['subject']) . "&&" . $rule['action'] . "&&" . + addslashes($rule['action_arg']) . "&&" . $rule['flg'] . "&&" . addslashes($rule['field']) . "&&" . addslashes($rule['field_val']) . "&&" . $rule['size'] . "\n"; + $pcount = $pcount+2; + } + } + + if ($this->vacation) { + $vacation = $this->vacation; + $newscriptfoot .= "#vacation&&" . $vacation['days'] . "&&"; + $first = 1; + foreach ($vacation['addresses'] as $address) { + if (!$first) $newscriptfoot .= ", "; + $newscriptfoot .= "\"" . $address . "\""; + $first = 0; + } + + $vacation['text'] = preg_replace("/\r\n/","\\n",$vacation['text']); + $newscriptfoot .= "&&" . $vacation['text'] . "&&" . + ($vacation['status']=='by_date' ? $vacation['start_date'].'-'.$vacation['end_date'] : $vacation['status']); + if ($vacation['forwards']) $newscriptfoot .= '&&' . $vacation['forwards']; + $newscriptfoot .= "\n"; + } + if ($this->emailNotification) { + $emailNotification = $this->emailNotification; + $newscriptfoot .= "#notify&&" . $emailNotification['status'] . "&&" . $emailNotification['externalEmail'] . "&&" . $emailNotification['displaySubject'] . "\n"; + } + + $newscriptfoot .= "#mode&&basic\n"; + + $newscript = $newscripthead . $newscriptbody . $newscriptfoot; + $this->script = $newscript; + #print "
$newscript
"; exit; + $scriptfile = $this->name; + #print "
".htmlentities($newscript)."

"; + if (!$connection->installScript($this->name, $newscript, true)) { + $this->errstr = 'updateScript: putscript failed: ' . $connection->errstr; + return false; + } + + return true; + } +} diff --git a/felamimail/inc/class.ajax_contacts.inc.php b/felamimail/inc/class.ajax_contacts.inc.php new file mode 100644 index 0000000000..f8b74b390a --- /dev/null +++ b/felamimail/inc/class.ajax_contacts.inc.php @@ -0,0 +1,101 @@ +session->commit_session(); + $this->charset = $GLOBALS['egw']->translation->charset(); + } + + function searchAddress($_searchString) { + if ($GLOBALS['egw_info']['user']['apps']['addressbook']) { + if (method_exists($GLOBALS['egw']->contacts,'search')) { + // 1.3+ + $contacts = $GLOBALS['egw']->contacts->search(array( + 'n_fn' => $_searchString, + 'email' => $_searchString, + 'email_home' => $_searchString, + ),array('n_fn','email','email_home'),'n_fn','','%',false,'OR',array(0,20)); + + // additionally search the accounts, if the contact storage is not the account storage + if ($GLOBALS['egw_info']['server']['account_repository'] == 'ldap' && + $GLOBALS['egw_info']['server']['contact_repository'] == 'sql') + { + $accounts = $GLOBALS['egw']->contacts->search(array( + 'n_fn' => $_searchString, + 'email' => $_searchString, + 'email_home' => $_searchString, + ),array('n_fn','email','email_home'),'n_fn','','%',false,'OR',array(0,20),array('owner' => 0)); + + if ($contacts && $accounts) + { + $contacts = array_merge($contacts,$accounts); + usort($contacts,create_function('$a,$b','return strcasecmp($a["n_fn"],$b["n_fn"]);')); + } + elseif($accounts) + { + $contacts =& $accounts; + } + unset($accounts); + } + } else { + // < 1.3 + $contacts = $GLOBALS['egw']->contacts->read(0,20,array( + 'fn' => 1, + 'email' => 1, + 'email_home' => 1, + ), $_searchString, 'tid=n', '', 'fn'); + } + } + $response = new xajaxResponse(); + + if(is_array($contacts)) { + $innerHTML = ''; + $jsArray = array(); + $i = 0; + + foreach($contacts as $contact) { + foreach(array($contact['email'],$contact['email_home']) as $email) { + // avoid wrong addresses, if an rfc822 encoded address is in addressbook + $email = preg_replace("/(^.*<)([a-zA-Z0-9_\-]+@[a-zA-Z0-9_\-\.]+)(.*)/",'$2',$email); + $contact['n_fn'] = str_replace(',',' ',$contact['n_fn']); + $completeMailString = addslashes(trim($contact['n_fn'] ? $contact['n_fn'] : $contact['fn']) .' <'. trim($email) .'>'); + if(!empty($email) && in_array($completeMailString ,$jsArray) === false) { + $i++; + $str = $GLOBALS['egw']->translation->convert(trim($contact['n_fn'] ? $contact['n_fn'] : $contact['fn']) .' <'. trim($email) .'>', $this->charset, 'utf-8'); + #$innerHTML .= '
'. + $innerHTML .= '
'. + htmlentities($str, ENT_QUOTES, 'utf-8') .'
'; + $jsArray[$i] = $completeMailString; + } + if ($i > 10) break; // we check for # of results here, as we might have empty email addresses + } + } + + if($jsArray) { + $response->addAssign('resultBox', 'innerHTML', $innerHTML); + $response->addScript('results = new Array("'.implode('","',$jsArray).'");'); + $response->addScript('displayResultBox();'); + } + //$response->addScript("getResults();"); + //$response->addScript("selectSuggestion(-1);"); + } else { + $response->addAssign('resultBox', 'className', 'resultBoxHidden'); + } + + return $response->getXML(); + } + } diff --git a/felamimail/inc/class.ajaxfelamimail.inc.php b/felamimail/inc/class.ajaxfelamimail.inc.php new file mode 100644 index 0000000000..38dcecd63a --- /dev/null +++ b/felamimail/inc/class.ajaxfelamimail.inc.php @@ -0,0 +1,1207 @@ +_debug) error_log("ajaxfelamimail::ajaxfelamimail"); + $this->charset = $GLOBALS['egw']->translation->charset(); + $this->bofelamimail = CreateObject('felamimail.bofelamimail',$this->charset); + $this->uiwidgets = CreateObject('felamimail.uiwidgets'); + $this->_connectionStatus = $this->bofelamimail->openConnection(); + + $this->sessionDataAjax = $GLOBALS['egw']->session->appsession('ajax_session_data','felamimail'); + $this->sessionData = $GLOBALS['egw']->session->appsession('session_data','felamimail'); + + if(!isset($this->sessionDataAjax['folderName'])) { + $this->sessionDataAjax['folderName'] = 'INBOX'; + } + + $this->icServer = $this->bofelamimail->mailPreferences->getIncomingServer($this->imapServerID); + } + + function addACL($_accountName, $_aclData) + { + if($this->_debug) error_log("ajaxfelamimail::addACL"); + $response = new xajaxResponse(); + + if(!empty($_accountName)) { + $acl = implode('',(array)$_aclData['acl']); + $data = $this->bofelamimail->setACL($this->sessionDataAjax['folderName'], $_accountName, $acl); + } + + return $response->getXML(); + } + + /** + * create a new folder + * + * @param string _parentFolder the name of the parent folder + * @param string _newSubFolder the name of the new subfolder + * @return xajax response + */ + function addFolder($_parentFolder, $_newSubFolder) + { + $parentFolder = $this->_decodeEntityFolderName($_parentFolder); + $parentFolder = ($parentFolder == '--topfolder--' ? '' : $parentFolder); + + $newSubFolder = $GLOBALS['egw']->translation->convert($_newSubFolder, $this->charset, 'UTF7-IMAP'); + + if($this->_debug) error_log("ajaxfelamimail::addFolder($parentFolder, $newSubFolder)"); + + $response = new xajaxResponse(); + + if($folderName = $this->bofelamimail->createFolder($parentFolder, $newSubFolder, true)) { + $parentFolder = $this->_encodeFolderName($parentFolder); + $folderName = $this->_encodeFolderName($folderName); + $newSubFolder = $this->_encodeDisplayFolderName($newSubFolder); + $response->addScript("tree.insertNewItem('$parentFolder','$folderName','$newSubFolder',onNodeSelect,'folderClosed.gif',0,0,'CHILD,CHECKED');"); + } + + $response->addAssign("newSubFolder", "value", ''); + + return $response->getXML(); + } + + function changeSorting($_sortBy) + { + if($this->_debug) error_log("ajaxfelamimail::changeSorting"); + $this->sessionData['startMessage'] = 1; + + $oldSort = $this->sessionData['sort']; + + switch($_sortBy) { + case 'date': + $this->sessionData['sort'] = SORTDATE; + break; + case 'from': + $this->sessionData['sort'] = SORTFROM; + break; + case 'size': + $this->sessionData['sort'] = SORTSIZE; + break; + case 'subject': + $this->sessionData['sort'] = SORTSUBJECT; + break; + } + + if($this->sessionData['sort'] == $oldSort) { + $this->sessionData['sortReverse'] = !$this->sessionData['sortReverse']; + } else { + $this->sessionData['sortReverse'] = false; + } + + $this->saveSessionData(); + + return $this->generateMessageList($this->sessionData['mailbox']); + } + + /** + * removes any messages marked as delete from current folder + * + * @return xajax response + */ + function compressFolder() + { + if($this->_debug) error_log("ajaxfelamimail::compressFolder"); + $this->bofelamimail->restoreSessionData(); + $this->bofelamimail->compressFolder($this->sessionData['mailbox']); + + $bofilter = CreateObject('felamimail.bofilter'); + + $sortResult = $this->bofelamimail->getSortedList( + $this->sessionData['mailbox'], + $this->sessionData['sort'], + $this->sessionData['sortReverse'], + $bofilter->getFilter($this->sessionData['activeFilter']) + ); + + if(!is_array($sortResult) || empty($sortResult)) { + $messageCounter = 0; + } else { + $messageCounter = count($sortResult); + } + + // $lastPage is the first message ID of the last page + if($messageCounter > $GLOBALS['egw_info']["user"]["preferences"]["common"]["maxmatchs"]) { + $lastPage = $messageCounter - ($messageCounter % $GLOBALS['egw_info']["user"]["preferences"]["common"]["maxmatchs"]) + 1; + if($lastPage > $messageCounter) + $lastPage -= $GLOBALS['egw_info']["user"]["preferences"]["common"]["maxmatchs"]; + if($this->sessionData['startMessage'] > $lastPage) + $this->sessionData['startMessage'] = $lastPage; + } else { + $this->sessionData['startMessage'] = 1; + } + + $this->saveSessionData(); + $GLOBALS['egw']->session->commit_session(); + + return $this->generateMessageList($this->sessionData['mailbox']); + } + + /** + * createACLTable + * creates the ACL table + * + * @param array $_acl array containing acl data + * + * @return string html output for ACL table + */ + function createACLTable($_acl) + { + $aclList = array('l','r','s','w','i','p','c','d','a'); + $aclShortCuts = array( 'custom' => 'custom', + 'lrs' => 'readable', + 'lrsp' => 'post', + 'lrsip' => 'append', + 'lrswipcd' => 'write', + 'lrswipcda' => 'all' + ); + + ksort($_acl); + + foreach($_acl as $accountAcl) { + $accountName = $accountAcl['USER']; + $row .= ''; + + $row .= ""; + + $row .= "$accountName"; + + foreach($aclList as $acl) { + $row .= ""; + } + + $selectFrom = html::select('identity', $accountAcl['RIGHTS'], $aclShortCuts, false, "id=\"predefinedFor_$accountName\" style='width: 100px;' onChange=\"xajax_doXMLHTTP('felamimail.ajaxfelamimail.updateACL','$accountName',this.value)\""); + + $row .= "$selectFrom"; + + $row .= ""; + } + + return "$row
 NameLRSWIPCDA 
"; + } + + function deleteACL($_aclData) + { + if($this->_debug) error_log("ajaxfelamimail::deleteACL"); + $response = new xajaxResponse(); + if(is_array($_aclData)) { + foreach($_aclData['accountName'] as $accountName) { + $data = $this->bofelamimail->deleteACL($this->sessionDataAjax['folderName'], $accountName); + } + + if ($folderACL = $this->bofelamimail->getIMAPACL($this->sessionDataAjax['folderName'])) { + $response->addAssign("aclTable", "innerHTML", $this->createACLTable($folderACL)); + } + } + return $response->getXML(); + } + + function deleteAttachment($_composeID, $_attachmentID) + { + if($this->_debug) error_log("ajaxfelamimail::deleteAttachment"); + $bocompose = CreateObject('felamimail.bocompose', $_composeID); + $bocompose->removeAttachment($_attachmentID); + + $response = new xajaxResponse(); + return $response->getXML(); + } + + function toggleEditor($_composeID, $_content ,$_mode) + { + $_content = utf8_decode($_content); + + if($this->_debug) error_log("ajaxfelamimail::toggleEditor->".$_mode.'->'.$_content); + $bocompose = CreateObject('felamimail.bocompose', $_composeID); + if($_mode == 'simple') { + if($this->_debug) error_log(__METHOD__.$_content); + #if (isset($GLOBALS['egw_info']['server']['enabled_spellcheck'])) $_mode = 'egw_simple_spellcheck'; + $this->sessionData['mimeType'] = 'html'; + // convert emailadresses presentet in angle brackets to emailadress only + $_content = str_replace(array("\r\n","\n","\r","
"),array("
","
","
","\r\n"),$_content); + $bocompose->replaceEmailAdresses($_content); + } else { + $this->sessionData['mimeType'] = 'text'; + $_content = str_replace(array("\r\n","\n","\r"),array("
","
","
"),$_content); + $_content = $bocompose->_getCleanHTML($_content); + $_content = $bocompose->convertHTMLToText($_content); + } + + $this->saveSessionData(); + + $response = new xajaxResponse(); + + $escaped = utf8_encode(str_replace(array("'", "\r", "\n"), array("\\'", "\\r", "\\n"), $_content)); + if ($_mode == 'simple') + $response->addScript("showHTMLEditor('$escaped');"); + else + $response->addScript("showPlainEditor('$escaped');"); + + return $response->getXML(); + } + + + /* + * delete a existing folder + * + * @param string _folderName the name of the folder to be deleted + * + * @return xajax response + */ + function deleteFolder($_folderName) + { + $folderName = $this->_decodeEntityFolderName($_folderName); + if($this->_debug) error_log("ajaxfelamimail::deleteFolder($_folderName)"); + $response = new xajaxResponse(); + + // don't delete this folders + if($folderName == 'INBOX' || $folderName == '--topfolder--') { + return $response->getXML(); + } + + if($this->bofelamimail->deleteFolder($folderName)) { + $folderName = $this->_encodeFolderName($folderName); + $response->addScript("tree.deleteItem('$folderName',1);"); + } + + return $response->getXML(); + } + + /* + * delete messages + * + * @param array _messageList list of UID's + * + * @return xajax response + */ + function deleteMessages($_messageList) + { + if($this->_debug) error_log(__METHOD__." called with Messages ".print_r($_messageList,true)); + $messageCount = 0; + if(is_array($_messageList) && count($_messageList['msg']) > 0) $messageCount = count($_messageList['msg']); + $this->bofelamimail->deleteMessages(($_messageList == 'all'? 'all':$_messageList['msg'])); + + return $this->generateMessageList($this->sessionData['mailbox'],($_messageList=='all'?0:(-1*$messageCount))); + } + + function deleteSignatures($_signatures) + { + if($this->_debug) error_log("ajaxfelamimail::deleteSignatures"); + $signatures = explode(",",$_signatures); + require_once(EGW_INCLUDE_ROOT.'/felamimail/inc/class.felamimail_bosignatures.inc.php'); + $boSignatures = new felamimail_bosignatures(); + + $boSignatures->deleteSignatures($signatures); + unset($signatures); + $signatures = $boSignatures->getListOfSignatures(); + + $response = new xajaxResponse(); + $response->addAssign('signatureTable', 'innerHTML', $this->uiwidgets->createSignatureTable($signatures)); + return $response->getXML(); + } + + function changeActiveAccount($accountData) + { + if($this->_debug) error_log("ajaxfelamimail::changeActiveAccount"); + require_once(EGW_INCLUDE_ROOT.'/felamimail/inc/class.bopreferences.inc.php'); + $boPreferences = CreateObject('felamimail.bopreferences'); + $boPreferences->setProfileActive(false); + if ($accountData) $boPreferences->setProfileActive(true,$accountData); + + $response = new xajaxResponse(); + $response->addScript('refreshView();'); + return $response->getXML(); + } + + function deleteAccountData($accountIDs) + { + if($this->_debug) error_log("ajaxfelamimail::deleteAccountData"); + $accountData = explode(",",$accountIDs); + require_once(EGW_INCLUDE_ROOT.'/felamimail/inc/class.bopreferences.inc.php'); + $boPreferences = CreateObject('felamimail.bopreferences'); + $boPreferences->deleteAccountData($accountData); + $preferences =& $boPreferences->getPreferences(); + $allAccountData = $boPreferences->getAllAccountData($preferences); + foreach ((array)$allAccountData as $tmpkey => $accountData) + { + $identity =& $accountData['identity']; + foreach($identity as $key => $value) { + if(is_object($value) || is_array($value)) { + continue; + } + switch($key) { + default: + $tempvar[$key] = $value; + } + } + $accountArray[]=$tempvar; + } + $response = new xajaxResponse(); + $response->addAssign('userDefinedAccountTable', 'innerHTML', $this->uiwidgets->createAccountDataTable($accountArray)); + return $response->getXML(); + } + + /* + * empty trash folder + * + * @return xajax response + */ + function emptyTrash() + { + if($this->_debug) error_log("ajaxfelamimail::emptyTrash Folder:".$this->bofelamimail->mailPreferences->preferences['trashFolder']); + if(!empty($this->bofelamimail->mailPreferences->preferences['trashFolder'])) { + $this->bofelamimail->compressFolder($this->bofelamimail->mailPreferences->preferences['trashFolder']); + } + + return $this->generateMessageList($this->sessionData['mailbox']); + } + + function extendedSearch($_filterID) + { + // start displaying at message 1 + $this->sessionData['startMessage'] = 1; + $this->sessionData['activeFilter'] = (int)$_filterID; + $this->saveSessionData(); + $GLOBALS['egw']->session->commit_session(); + + // generate the new messageview + return $this->generateMessageList($this->sessionData['mailbox']); + } + + /* + * flag messages as read, unread, flagged, ... + * + * @param string _flag name of the flag + * @param array _messageList list of UID's + * + * @return xajax response + */ + function flagMessages($_flag, $_messageList) + { + if($this->_debug) error_log(__METHOD__."->".$_flag.':'.print_r($_messageList,true)); + if ($_messageList=='all' || !empty($_messageList['msg'])) + { + $this->bofelamimail->flagMessages($_flag, ($_messageList=='all' ? 'all':$_messageList['msg'])); + } + else + { + if($this->_debug) error_log(__METHOD__."-> No messages selected."); + } + + return $this->generateMessageList($this->sessionData['mailbox']); + } + + function sendNotify ($_uid, $_ret) + { + if($this->_debug) error_log(__METHOD__." with $_uid,$_ret"); + $response = new xajaxResponse(); + if ($_ret==='true' || $_ret===1 || $_ret == "1,") { + if ( $this->bofelamimail->sendMDN($_uid) ) + $this->bofelamimail->flagMessages("mdnsent",array($_uid)); + } else { + $this->bofelamimail->flagMessages("mdnnotsent",array($_uid)); + } + return $response; + + } + + + function generateMessageList($_folderName,$modifyoffset=0) + { + if($this->_debug) error_log("ajaxfelamimail::generateMessageList with $_folderName,$modifyoffset"); + $response = new xajaxResponse(); + $response->addScript("activeFolder = \"".$_folderName."\";"); + $response->addScript("activeFolderB64 = \"".base64_encode($_folderName)."\";"); + if($this->_connectionStatus === false) { + return $response->getXML(); + } + + $listMode = 0; + + $this->bofelamimail->restoreSessionData(); + if($this->bofelamimail->isSentFolder($_folderName) || + false !== in_array($_folderName,explode(',',$GLOBALS['egw_info']['user']['preferences']['felamimail']['messages_showassent_0']))) + { + $listMode = 1; + } elseif($this->bofelamimail->isDraftFolder($_folderName)) { + $listMode = 2; + } elseif($this->bofelamimail->isTemplateFolder($_folderName)) { + $listMode = 3; + } + + $maxMessages = $GLOBALS['egw_info']["user"]["preferences"]["common"]["maxmatchs"]; + + $offset = $this->sessionData['startMessage']; + if($this->_debug) error_log("ajaxfelamimail::generateMessageList with $offset,$modifyoffset"); + if ($modifyoffset != 0 && ($offset+$modifyoffset)>0) $offset = $offset+$modifyoffset; + if($this->_debug) error_log("ajaxfelamimail::generateMessageList with $offset"); + $headers = $this->bofelamimail->getHeaders( + $_folderName, + $offset, + $maxMessages, + $this->sessionData['sort'], + $this->sessionData['sortReverse'], + (array)$this->sessionData['messageFilter'] + ); + + $headerTable = $this->uiwidgets->messageTable( + $headers, + $listMode, + $_folderName, + $GLOBALS['egw_info']['user']['preferences']['felamimail']['message_newwindow'], + $GLOBALS['egw_info']['user']['preferences']['felamimail']['rowOrderStyle'], + $this->sessionData['previewMessage'] + ); + + $firstMessage = (int)$headers['info']['first']; + $lastMessage = (int)$headers['info']['last']; + $totalMessage = (int)$headers['info']['total']; + $shortName = ''; + if($folderStatus = $this->bofelamimail->getFolderStatus($_folderName)) { + $shortName =$folderStatus['shortDisplayName']; + } + if($totalMessage == 0) { + $response->addAssign("messageCounter", "innerHTML", ''.$shortName.': '.lang('no messages found...')); + } else { + $response->addAssign("messageCounter", "innerHTML", ''.$shortName.': '.lang('Viewing messages')." $firstMessage - $lastMessage ($totalMessage ".lang("total").')'); + } + + if($listMode) { + $response->addAssign("from_or_to", "innerHTML", lang('to')); + } else { + $response->addAssign("from_or_to", "innerHTML", lang('from')); + } + + $response->addAssign("divMessageList", "innerHTML", $headerTable); + + if($quota = $this->bofelamimail->getQuotaRoot()) { + $quotaDisplay = $this->uiwidgets->quotaDisplay($quota['usage'], $quota['limit']); + $response->addAssign('quotaDisplay', 'innerHTML', $quotaDisplay); + } + + if($folderStatus = $this->bofelamimail->getFolderStatus($_folderName)) { + if($folderStatus['unseen'] > 0) { + $response->addScript("egw_topWindow().tree.setItemText('$_folderName', '". $folderStatus['shortDisplayName'] ." (". $folderStatus['unseen'] .")');"); + } else { + $response->addScript("egw_topWindow().tree.setItemText('$_folderName', '". $folderStatus['shortDisplayName'] ."');"); + } + } + + if(!empty($GLOBALS['egw_info']['user']['preferences']['felamimail']['trashFolder']) && + $GLOBALS['egw_info']['user']['preferences']['felamimail']['trashFolder'] != 'none' ) { + $folderStatus = $this->bofelamimail->getFolderStatus($GLOBALS['egw_info']['user']['preferences']['felamimail']['trashFolder']); + if($folderStatus['unseen'] > 0) { + $response->addScript("egw_topWindow().tree.setItemText('". $GLOBALS['egw_info']['user']['preferences']['felamimail']['trashFolder'] ."', '". $folderStatus['shortDisplayName'] ." (". $folderStatus['unseen'] .")');"); + } else { + $response->addScript("egw_topWindow().tree.setItemText('". $GLOBALS['egw_info']['user']['preferences']['felamimail']['trashFolder'] ."', '". $folderStatus['shortDisplayName'] ."');"); + } + } + + $response->addScript("egw_topWindow().tree.selectItem('".$_folderName. "',false);"); + + if($this->_debug) error_log('generateMessageList done'); + + $response->addScript('if (typeof handleResize != "undefined") handleResize();'); + + return $response->getXML(); + } + + function getFolderInfo($_folderName) + { + if($this->_debug) error_log("ajaxfelamimail::getFolderInfo($_folderName)"); + $folderName = html_entity_decode($_folderName, ENT_QUOTES, $this->charset); + + if($folderName != '--topfolder--' && $folderStatus = $this->bofelamimail->getFolderStatus($folderName)) { + $response = new xajaxResponse(); + + if($this->sessionDataAjax['oldFolderName'] == '--topfolder--') { + $this->sessionDataAjax['oldFolderName'] = ''; + } + // only folders with LATT_NOSELECT not set, can have subfolders + // seem to work only for uwimap + #if($folderStatus['attributes'] & LATT_NOSELECT) { + $response->addScript("document.getElementById('newSubFolder').disabled = false;"); + #} else { + # $response->addScript("document.getElementById('newSubFolder').disabled = true;"); + #} + + $this->sessionDataAjax['folderName'] = $folderName; + $this->saveSessionData(); + $hasChildren=false; + if ($folderStatus['attributes'][0]=="\\HasChildren") $hasChildren=true; + if(strtoupper($folderName) != 'INBOX') { + $response->addAssign("newMailboxName", "value", htmlspecialchars($folderStatus['shortDisplayName'], ENT_QUOTES, $this->charset)); + $response->addAssign("newMailboxMoveName", "value", htmlspecialchars($folderStatus['displayName'], ENT_QUOTES, $this->charset)); + $response->addScript("document.getElementById('mailboxRenameButton').disabled = false;"); + $response->addScript("document.getElementById('newMailboxName').disabled = false;"); + $response->addScript("document.getElementById('divDeleteButton').style.visibility = 'visible';"); + $response->addScript("document.getElementById('divRenameButton').style.visibility = 'visible';"); + // if the folder has children, we dont want to move it, since we dont handle the subscribing to subfolders after moving the folder + $response->addScript("document.getElementById('divMoveButton').style.visibility = ".($hasChildren ? "'hidden'" : "'visible'").";"); + $response->addScript("document.getElementById('newMailboxMoveName').disabled = ".($hasChildren ? "true" : "false").";"); + $response->addScript("document.getElementById('aMoveSelectFolder').style.visibility = ".($hasChildren ? "'hidden'" : "'visible'").";"); + } else { + $response->addAssign("newMailboxName", "value", ''); + $response->addAssign("newMailboxMoveName", "value", ''); + $response->addScript("document.getElementById('mailboxRenameButton').disabled = true;"); + $response->addScript("document.getElementById('newMailboxName').disabled = true;"); + $response->addScript("document.getElementById('divDeleteButton').style.visibility = 'hidden';"); + $response->addScript("document.getElementById('divRenameButton').style.visibility = 'hidden';"); + $response->addScript("document.getElementById('divMoveButton').style.visibility = 'hidden';"); + $response->addScript("document.getElementById('newMailboxMoveName').disabled = true;"); + $response->addScript("document.getElementById('aMoveSelectFolder').style.visibility = 'hidden';"); + } + $response->addAssign("folderName", "innerHTML", htmlspecialchars($folderStatus['displayName'], ENT_QUOTES, $this->charset)); + if($folderACL = $this->bofelamimail->getIMAPACL($folderName)) { + $response->addAssign("aclTable", "innerHTML", $this->createACLTable($folderACL)); + } + + return $response->getXML(); + } else { + $this->sessionDataAjax['oldFolderName'] = $folderName; + $this->saveSessionData(); + + $response = new xajaxResponse(); + $response->addAssign("newMailboxName", "value", ''); + $response->addAssign("folderName", "innerHTML", ''); + $response->addScript("document.getElementById('newMailboxName').disabled = true;"); + $response->addScript("document.getElementById('mailboxRenameButton').disabled = true;"); + $response->addScript("document.getElementById('divDeleteButton').style.visibility = 'hidden';"); + $response->addScript("document.getElementById('divRenameButton').style.visibility = 'hidden';"); + $response->addAssign("aclTable", "innerHTML", ''); + return $response->getXML(); + } + } + + function gotoStart() + { + if($this->_debug) error_log("ajaxfelamimail::gotoStart"); + $this->sessionData['startMessage'] = 1; + $this->saveSessionData(); + + return $this->generateMessageList($this->sessionData['mailbox']); + } + + function jumpEnd() + { + if($this->_debug) error_log("ajaxfelamimail::jumpEnd"); + $sortedList = $this->bofelamimail->getSortedList( + $this->sessionData['mailbox'], + $this->sessionData['sort'], + $this->sessionData['sortReverse'], + (array)$this->sessionData['messageFilter'] + ); + $messageCounter = count($sortedList); + + $lastPage = $messageCounter - ($messageCounter % $GLOBALS['egw_info']["user"]["preferences"]["common"]["maxmatchs"]) + 1; + if($lastPage > $messageCounter) + $lastPage -= $GLOBALS['egw_info']["user"]["preferences"]["common"]["maxmatchs"]; + + $this->sessionData['startMessage'] = $lastPage; + + $this->saveSessionData(); + + return $this->generateMessageList($this->sessionData['mailbox']); + } + + function jumpStart() + { + if($this->_debug) error_log("ajaxfelamimail::jumpStart"); + $this->sessionData['startMessage'] = 1; + $this->saveSessionData(); + + return $this->generateMessageList($this->sessionData['mailbox']); + } + + /* + * move messages to another folder + * + * @param string _folder name of the target folder + * @param array _selectedMessages UID's of the messages to move + * + * @return xajax response + */ + function moveMessages($_folderName, $_selectedMessages) + { + if($this->_debug) error_log(__METHOD__." move to $_folderName called with Messages ".print_r($_selectedMessages,true)); + $messageCount = 0; + if(is_array($_selectedMessages) && count($_selectedMessages['msg']) > 0) $messageCount = count($_selectedMessages['msg']); + $folderName = $this->_decodeEntityFolderName($_folderName); + if ($_selectedMessages == 'all' || !empty( $_selectedMessages['msg']) && !empty($folderName)) { + if ($this->sessionData['mailbox'] != $folderName) { + $this->bofelamimail->moveMessages($folderName, ($_selectedMessages == 'all'? null:$_selectedMessages['msg'])); + } else { + if($this->_debug) error_log("ajaxfelamimail::moveMessages-> same folder than current selected"); + } + if($this->_debug) error_log(__METHOD__." Rebuild MessageList for Folder:".$this->sessionData['mailbox']); + return $this->generateMessageList($this->sessionData['mailbox'],($_selectedMessages == 'all'?0:(-1*$messageCount))); + } else { + $response = new xajaxResponse(); + $response->addScript('resetMessageSelect();'); + $response->addScript('tellUser("'.lang('No messages selected, or lost selection. Changing to folder ').'","'.$_folderName.'");'); + $response->addScript('onNodeSelect("'.$_folderName.'");'); + return $response->getXML(); + + } + } + + /* + * copy messages to another folder + * + * @param string _folder name of the target folder + * @param array _selectedMessages UID's of the messages to copy + * + * @return xajax response + */ + function copyMessages($_folderName, $_selectedMessages) + { + if($this->_debug) error_log(__METHOD__." called with Messages ".print_r($_selectedMessages,true)); + $messageCount = 0; + if(is_array($_selectedMessages) && count($_selectedMessages['msg']) > 0) $messageCount = count($_selectedMessages['msg']); + $folderName = $this->_decodeEntityFolderName($_folderName); + if ($_selectedMessages == 'all' || !empty( $_selectedMessages['msg']) && !empty($folderName)) { + if ($this->sessionData['mailbox'] != $folderName) + { + $deleteAfterMove = false; + $this->bofelamimail->moveMessages($folderName, ($_selectedMessages == 'all'? null:$_selectedMessages['msg']),$deleteAfterMove); + } + else + { + if($this->_debug) error_log("ajaxfelamimail::copyMessages-> same folder than current selected"); + } + + return $this->generateMessageList($this->sessionData['mailbox'],($_selectedMessages == 'all'?0:(-1*$messageCount))); + } else { + $response = new xajaxResponse(); + $response->addScript('resetMessageSelect();'); + $response->addScript('tellUser("'.lang('No messages selected, or lost selection. Changing to folder ').'","'.$_folderName.'");'); + $response->addScript('onNodeSelect("'.$_folderName.'");'); + return $response->getXML(); + + } + } + + function quickSearch($_searchType, $_searchString, $_status) + { + // save the filter + $bofilter = CreateObject('felamimail.bofilter'); + + $filter['filterName'] = lang('Quicksearch'); + $filter['type'] = $_searchType; + $filter['string'] = str_replace('"','\"', str_replace('\\','\\\\',$_searchString)); + $filter['status'] = $_status; + + $this->sessionData['messageFilter'] = $filter; + + $this->sessionData['startMessage'] = 1; + + $this->saveSessionData(); + + // generate the new messageview + return $this->generateMessageList($this->sessionData['mailbox']); + } + + function refreshMessagePreview($_messageID,$_folderType) + { + + $this->bofelamimail->restoreSessionData(); + $headerData = $this->bofelamimail->getHeaders( + $this->sessionData['mailbox'], + 0, + 0, + '', + '', + '', + $_messageID + ); + $headerData = $headerData['header'][0]; + $this->sessionData['previewMessage'] = $headerData['uid']; + $this->saveSessionData(); + //error_log(print_r($headerData,true)); + $response = new xajaxResponse(); + $response->addScript("document.getElementById('messageCounter').innerHTML =MessageBuffer;"); + //$response->addScript("document.getElementById('messageCounter').innerHTML ='';"); + $response->addScript("fm_previewMessageID=".$headerData['uid'].";"); + $response->addAssign('spanMessagePreview', 'innerHTML', $this->uiwidgets->updateMessagePreview($headerData,$_folderType, $this->sessionData['mailbox'])); + return $response->getXML(); + } + + function refreshMessageList() + { + return $this->generateMessageList($this->sessionData['mailbox']); + } + + function refreshFolder() + { + if ($this->_debug) error_log("ajaxfelamimail::refreshFolder"); + $GLOBALS['egw']->session->commit_session(); + + $response = new xajaxResponse(); + + if ($this->_connectionStatus === true) { + $folderName = $this->sessionData['mailbox']; + + if ($folderStatus = $this->bofelamimail->getFolderStatus($folderName)) { + if ($folderStatus['unseen'] > 0) { + $response->addScript("egw_topWindow().tree.setItemText('$folderName', '". $folderStatus['shortDisplayName'] ." (". $folderStatus['unseen'] .")');"); + } else { + $response->addScript("egw_topWindow().tree.setItemText('$folderName', '". $folderStatus['shortDisplayName'] ."');"); + } + } + } + + return $response->getXML(); + } + + function refreshFolderList($activeFolderList ='') + { + if ($this->_debug) error_log("ajaxfelamimail::refreshFolderList with folders:".$activeFolderList); + if ($activeFolderList != '') $activeFolders = explode('#,#',$activeFolderList); + $GLOBALS['egw']->session->commit_session(); + + $response = new xajaxResponse(); + if(!($this->_connectionStatus === true)) $this->_connectionStatus = $this->bofelamimail->openConnection(); + if($this->_connectionStatus === true) { + #error_log("connected"); + if (is_array($activeFolders)) { + foreach ($activeFolders as $key => $name) { + #error_log($key."=>".$name); + switch($name) { + case "0": break; + case "--topfolder--": break; + default: + $folders[$name] = $name; + #error_log("check folder $name"); + } + } + if (!(is_array($folders) && count($folders)>0)) $folders = $this->bofelamimail->getFolderObjects(true); + } else { + #error_log("check/get all folders"); + $folders = $this->bofelamimail->getFolderObjects(true); + } + foreach($folders as $folderName => $folderData) { + #error_log("checking $folderName"); + if($folderStatus = $this->bofelamimail->getFolderStatus($folderName)) { + if($folderStatus['unseen'] > 0) { + $response->addScript("egw_topWindow().tree.setItemText('$folderName', '". $folderStatus['shortDisplayName'] ." (". $folderStatus['unseen'] .")');"); + } else { + $response->addScript("egw_topWindow().tree.setItemText('$folderName', '". $folderStatus['shortDisplayName'] ."');"); + } + } + } + } + + return $response->getXML(); + + } + + function refreshSignatureTable() + { + require_once(EGW_INCLUDE_ROOT.'/felamimail/inc/class.felamimail_bosignatures.inc.php'); + $boSignatures = new felamimail_bosignatures(); + $signatures = $boSignatures->getListOfSignatures(); + + $response = new xajaxResponse(); + $response->addAssign('signatureTable', 'innerHTML', $this->uiwidgets->createSignatureTable($signatures)); + return $response->getXML(); + } + + function refreshAccountDataTable() + { + require_once(EGW_INCLUDE_ROOT.'/felamimail/inc/class.bopreferences.inc.php'); + $boPreferences = CreateObject('felamimail.bopreferences'); + $preferences =& $boPreferences->getPreferences(); + $allAccountData = $boPreferences->getAllAccountData($preferences); + foreach ($allAccountData as $tmpkey => $accountData) + { + $identity =& $accountData['identity']; + foreach($identity as $key => $value) { + if(is_object($value) || is_array($value)) { + continue; + } + switch($key) { + default: + $tempvar[$key] = $value; + } + } + $accountArray[]=$tempvar; + } + $response = new xajaxResponse(); + $response->addAssign('userDefinedAccountTable', 'innerHTML', $this->uiwidgets->createAccountDataTable($accountArray)); + return $response->getXML(); + } + + function reloadAttachments($_composeID) + { + $bocompose = CreateObject('felamimail.bocompose', $_composeID); + $tableRows = array(); + $table = ''; + $imgClearLeft = $GLOBALS['egw']->common->image('felamimail','clear_left'); + + foreach((array)$bocompose->sessionData['attachments'] as $id => $attachment) { + switch(strtoupper($attachment['type'])) { + case 'MESSAGE/RFC822': + $linkData = array ( + 'menuaction' => 'felamimail.uidisplay.display', + 'uid' => $attachment['uid'], + 'part' => $attachment['partID'] + ); + $windowName = 'displayMessage_'; + $att_link = "egw_openWindowCentered('".$GLOBALS['egw']->link('/index.php',$linkData)."','$windowName',700,egw_getWindowOuterHeight()); return false;"; + + break; + + case 'IMAGE/JPEG': + case 'IMAGE/PNG': + case 'IMAGE/GIF': + default: + $linkData = array ( + 'menuaction' => 'felamimail.uicompose.getAttachment', + 'attID' => $id, + '_composeID' => $_composeID, + ); + $windowName = 'displayAttachment_'; + $att_link = "egw_openWindowCentered('".$GLOBALS['egw']->link('/index.php',$linkData)."','$windowName',800,600);"; + + break; + } + $tempArray = array ( + '1' => ''. $attachment['name'] .'', '.1' => 'width="40%"', + '2' => mime_magic::mime2label($attachment['type']), + '3' => egw_vfs::hsize($attachment['size']), '.3' => "style='text-align:right;'", + '4' => ' ', '.4' => 'width="10%"', + '5' => "" + ); + $tableRows[] = $tempArray; + } + + if(count($tableRows) > 0) { + $table = html::table($tableRows, "style='width:100%'"); + } + + $response = new xajaxResponse(); + $response->addAssign('divAttachments', 'innerHTML', $table); + return $response->getXML(); + } + + /* + * rename a folder + * + * @param string _folder name of the target folder + * @param array _selectedMessages UID's of the messages to move + * + * @return xajax response + */ + function renameFolder($_oldFolderName, $_parentFolder, $_folderName) + { + if($this->_debug) error_log("ajaxfelamimail::renameFolder called as ($_oldFolderName, $_parentFolder, $_folderName)"); + $oldFolderName = $this->_decodeEntityFolderName($_oldFolderName); + $folderName = $GLOBALS['egw']->translation->convert($this->_decodeEntityFolderName($_folderName), $this->charset, 'UTF7-IMAP'); + $parentFolder = $this->_decodeEntityFolderName($_parentFolder); + $parentFolder = ($_parentFolder == '--topfolder--' ? '' : $parentFolder); + if($this->_debug) error_log("ajaxfelamimail::renameFolder work with ($oldFolderName, $parentFolder, $folderName)"); + + $response = new xajaxResponse(); + if(strtoupper($_oldFolderName) != 'INBOX' ) { + if($newFolderName = $this->bofelamimail->renameFolder($oldFolderName, $parentFolder, $folderName)) { + //enforce the subscription to the newly named server, as it seems to fail for names with umlauts + $rv = $this->bofelamimail->subscribe($newFolderName, true); + $newFolderName = $this->_encodeFolderName($newFolderName); + $folderName = $this->_encodeDisplayFolderName($folderName); + if ($parentFolder == '') { + #$folderStatus = $this->bofelamimail->getFolderStatus($newFolderName); + $HierarchyDelimiter = $this->bofelamimail->getHierarchyDelimiter(); + #if($this->_debug) error_log("ajaxfelamimail::renameFolder Status of new Folder:".print_r($folderStatus,true)); + if($this->_debug) error_log("ajaxfelamimail::rename/move Folder($newFolderName, $folderName)"); + $buffarray = explode($HierarchyDelimiter, $newFolderName); + $folderName = $this->_encodeDisplayFolderName( $this->_decodeEntityFolderName(array_pop($buffarray))); + $_parentFolder = $parentFolder = implode($HierarchyDelimiter,$buffarray); + if($this->_debug) error_log("ajaxfelamimail::renameFolder insert new ITEM $folderName at $_parentFolder"); + #$hasChildren = false; + #if ($folderStatus['attributes'][0]=="\\HasChildren") $hasChildren=true; + } + $response->addScript("egw_topWindow().tree.deleteItem('$_oldFolderName',0);"); + $response->addScript("egw_topWindow().tree.insertNewItem('$_parentFolder','$newFolderName','$folderName',onNodeSelect,'folderClosed.gif',0,0,'CHILD,CHECKED,SELECT,CALL');"); + } + } + return $response->getXML(); + } + + function saveSessionData() + { + $GLOBALS['egw']->session->appsession('ajax_session_data','felamimail',$this->sessionDataAjax); + $GLOBALS['egw']->session->appsession('session_data','felamimail',$this->sessionData); + } + + function saveSignature($_mode, $_id, $_description, $_signature, $_isDefaultSignature) + { + require_once(EGW_INCLUDE_ROOT.'/felamimail/inc/class.felamimail_bosignatures.inc.php'); + + $boSignatures = new felamimail_bosignatures(); + + $isDefaultSignature = ($_isDefaultSignature == 'true' ? true : false); + + $signatureID = $boSignatures->saveSignature($_id, $_description, $_signature, $isDefaultSignature); + + $response = new xajaxResponse(); + + if($_mode == 'save') { + #$response->addAssign('signatureID', 'value', $signatureID); + $response->addScript("opener.fm_refreshSignatureTable()"); + $response->addScript("document.getElementById('signatureDesc').focus();window.close();"); + } else { + $response->addScript("opener.fm_refreshSignatureTable()"); + $response->addAssign('signatureID', 'value', $signatureID); + } + + return $response->getXML(); + } + + function setComposeSignature($identity) + { + $boPreferences = CreateObject('felamimail.bopreferences'); + $preferences =& $boPreferences->getPreferences(); + $Identities = $preferences->getIdentity($identity); + //error_log(print_r($Identities->signature,true)); + + $response = new xajaxResponse(); + $response->addScript('setSignature('.$Identities->signature.');'); + return $response->getXML(); + } + + function searchAddress($_searchString) + { + $contacts = $GLOBALS['egw']->contacts->search(array( + 'n_fn' => $_searchString, + 'email' => $_searchString, + 'email_home' => $_searchString, + ),array('n_fn','email','email_home'),'n_fn','','%',false,'OR',array(0,20)); + + $response = new xajaxResponse(); + + if(is_array($contacts)) { + $innerHTML = ''; + $jsArray = array(); + $i = 0; + + foreach($contacts as $contact) { + foreach(array($contact['email'],$contact['email_home']) as $email) { + if(!empty($email) && !isset($jsArray[$email])) { + $i++; + $str = $GLOBALS['egw']->translation->convert(trim($contact['n_fn'] ? $contact['n_fn'] : $contact['fn']).' <'.trim($email).'>',$this->charset,'utf-8'); + $innerHTML .= '
'. + htmlentities($str, ENT_QUOTES, 'utf-8').'
'; + $jsArray[$email] = addslashes($str); + } + if ($i > 10) break; // we check for # of results here, as we might have empty email addresses + } + } + + if($jsArray) { + $response->addAssign('resultBox', 'innerHTML', $innerHTML); + $response->addScript('results = new Array("'.implode('","',$jsArray).'");'); + $response->addScript('displayResultBox();'); + } + //$response->addScript("getResults();"); + //$response->addScript("selectSuggestion(-1);"); + } else { + $response->addAssign('resultBox', 'className', 'resultBoxHidden'); + } + return $response->getXML(); + } + + function skipForward() + { + $sortedList = $this->bofelamimail->getSortedList( + $this->sessionData['mailbox'], + $this->sessionData['sort'], + $this->sessionData['sortReverse'], + (array)$this->sessionData['messageFilter'] + ); + $messageCounter = count($sortedList); + // $lastPage is the first message ID of the last page + if($messageCounter > $GLOBALS['egw_info']["user"]["preferences"]["common"]["maxmatchs"]) { + $lastPage = $messageCounter - ($messageCounter % $GLOBALS['egw_info']["user"]["preferences"]["common"]["maxmatchs"]) + 1; + if($lastPage > $messageCounter) { + $lastPage -= $GLOBALS['egw_info']["user"]["preferences"]["common"]["maxmatchs"]; + } + $this->sessionData['startMessage'] += $GLOBALS['egw_info']["user"]["preferences"]["common"]["maxmatchs"]; + if($this->sessionData['startMessage'] > $lastPage) { + $this->sessionData['startMessage'] = $lastPage; + } + } else { + $this->sessionData['startMessage'] = 1; + } + + $this->saveSessionData(); + + $response = $this->generateMessageList($this->sessionData['mailbox']); + + return $response; + } + + function skipPrevious() + { + $this->sessionData['startMessage'] -= $GLOBALS['egw_info']["user"]["preferences"]["common"]["maxmatchs"]; + if($this->sessionData['startMessage'] < 1) { + $this->sessionData['startMessage'] = 1; + } + $this->saveSessionData(); + + return $this->generateMessageList($this->sessionData['mailbox']); + } + + + /** + * updateACL + * updates all ACLs for a single user and returns the updated the acl table + * it will do nothing on $_acl == 'custom' + * + * @param string $_user user to modify acl entries + * @param string $_acl new acl list + * + * @return string ajax xml response + */ + function updateACL($_user, $_acl) + { + if ($_acl == 'custom') { + $response = new xajaxResponse(); + return $response->getXML(); + } + + $_folderName = $this->sessionDataAjax['folderName']; + $result = $this->bofelamimail->setACL($_folderName, $_user, $_acl); + if ($result && $folderACL = $this->bofelamimail->getIMAPACL($_folderName)) { + return $this->updateACLView(); + } + + $response = new xajaxResponse(); + // add error message + // $response->add??? + return $response->getXML(); + } + + + /** + * updateACLView + * updates the ACL view table + * + * @return string ajax xml response containing new ACL table + */ + function updateACLView() + { + + $response = new xajaxResponse(); + if($folderACL = $this->bofelamimail->getIMAPACL($this->sessionDataAjax['folderName'])) { + $response->addAssign("aclTable", "innerHTML", $this->createACLTable($folderACL)); + } + return $response->getXML(); + } + + /** + * subscribe/unsubribe from/to a folder + */ + function updateFolderStatus($_folderName, $_status) + { + $folderName = $this->_decodeEntityFolderName($_folderName); + $status = (bool)$_status; + + $this->bofelamimail->subscribe($folderName, $status); + + $response = new xajaxResponse(); + return $response->getXML(); + } + + // remove html entities + function _decodeEntityFolderName($_folderName) + { + return html_entity_decode($_folderName, ENT_QUOTES, $this->charset); + } + + function updateMessageView($_folderName) + { + $folderName = $this->_decodeEntityFolderName($_folderName); + if($this->_debug) error_log("ajaxfelamimail::updateMessageView $folderName $this->charset"); + + $this->sessionData['mailbox'] = $folderName; + $this->sessionData['startMessage'] = 1; + $this->saveSessionData(); + + $messageList = $this->generateMessageList($folderName); + + $this->bofelamimail->closeConnection(); + + return $messageList; + } + + function updateSingleACL($_accountName, $_aclType, $_aclStatus) + { + $response = new xajaxResponse(); + $data = $this->bofelamimail->updateSingleACL($this->sessionDataAjax['folderName'], $_accountName, $_aclType, $_aclStatus); + return $response->getXML(); + } + + function xajaxFolderInfo($_formValues) + { + $response = new xajaxResponse(); + + $response->addAssign("field1", "value", $_formValues['num1']); + $response->addAssign("field2", "value", $_formValues['num2']); + $response->addAssign("field3", "value", $_formValues['num1'] * $_formValues['num2']); + + return $response->getXML(); + } + + function _encodeFolderName($_folderName) + { + $folderName = htmlspecialchars($_folderName, ENT_QUOTES, $this->charset); + + $search = array('\\'); + $replace = array('\\\\'); + + return str_replace($search, $replace, $folderName); + } + + function _encodeDisplayFolderName($_folderName) + { + $folderName = $GLOBALS['egw']->translation->convert($_folderName, 'UTF7-IMAP', $this->charset); + $folderName = htmlspecialchars($folderName, ENT_QUOTES, $this->charset); + + $search = array('\\'); + $replace = array('\\\\'); + + return str_replace($search, $replace, $folderName); + } + + } +?> diff --git a/felamimail/inc/class.bocompose.inc.php b/felamimail/inc/class.bocompose.inc.php new file mode 100644 index 0000000000..a0749f288d --- /dev/null +++ b/felamimail/inc/class.bocompose.inc.php @@ -0,0 +1,1146 @@ + True, + 'action' => True + ); + + var $attachments; // Array of attachments + var $preferences; // the prefenrences(emailserver, username, ...) + var $preferencesArray; + var $bofelamimail; + var $bopreferences; + var $bosignatures; + var $displayCharset; + + function bocompose($_composeID = '', $_charSet = 'iso-8859-1') + { + $this->displayCharset = strtolower($_charSet); + $this->bosignatures = CreateObject('felamimail.felamimail_bosignatures'); + $this->bofelamimail = CreateObject('felamimail.bofelamimail',$this->displayCharset); + $this->bopreferences =& $this->bofelamimail->bopreferences; + $this->preferences = $this->bopreferences->getPreferences(); + $this->preferencesArray =& $GLOBALS['egw_info']['user']['preferences']['felamimail']; + //force the default for the forwarding -> asmail + if (is_array($this->preferencesArray)) { + if (!array_key_exists('message_forwarding',$this->preferencesArray) + || !isset($this->preferencesArray['message_forwarding']) + || empty($this->preferencesArray['message_forwarding'])) $this->preferencesArray['message_forwarding'] = 'asmail'; + } else { + $this->preferencesArray['message_forwarding'] = 'asmail'; + } + // check if there is a composeid set, and restore the session, if so + if (!empty($_composeID)) + { + $this->composeID = $_composeID; + $this->restoreSessionData(); + } + else // new email + { + $this->setDefaults(); + } + } + + /** + * adds uploaded files or files in eGW's temp directory as attachments + * + * It also stores the given data in the session + * + * @param array $_formData fields of the compose form (to,cc,bcc,reply_to,subject,body,priority,signature), plus data of the file (name,file,size,type) + */ + function addAttachment($_formData) + { +#echo "addattachment
"; +#_debug_array($_formData); + // to gard against exploits the file must be either uploaded or be in the temp_dir + if ($_formData['size'] != 0 && (is_uploaded_file($_formData['file']) || + realpath(dirname($_formData['file'])) == realpath($GLOBALS['egw_info']['server']['temp_dir'])) || + parse_url($_formData['file'],PHP_URL_SCHEME) == 'vfs') + { + // ensure existance of eGW temp dir + // note: this is different from apache temp dir, + // and different from any other temp file location set in php.ini + if (!file_exists($GLOBALS['egw_info']['server']['temp_dir'])) + { + @mkdir($GLOBALS['egw_info']['server']['temp_dir'],0700); + } + + // if we were NOT able to create this temp directory, then make an ERROR report + if (!file_exists($GLOBALS['egw_info']['server']['temp_dir'])) + { + $alert_msg .= 'Error:'.'
' + .'Server is unable to access phpgw tmp directory'.'
' + .$GLOBALS['egw_info']['server']['temp_dir'].'
' + .'Please check your configuration'.'
' + .'
'; + } + + // sometimes PHP is very clue-less about MIME types, and gives NO file_type + // rfc default for unknown MIME type is: + $mime_type_default = 'application/octet-stream'; + // so if PHP did not pass any file_type info, then substitute the rfc default value + if (trim($_formData['type']) == '') + { + $_formData['type'] = $mime_type_default; + } + + $tmpFileName = $GLOBALS['egw_info']['server']['temp_dir']. + SEP. + md5(time().$GLOBALS['egw_info']['user']['account_id'].$this->composeID.basename($_formData['file'])); + + if (parse_url($_formData['file'],PHP_URL_SCHEME) == 'vfs') + { + $tmpFileName = $_formData['file']; // no need to store it somewhere + } + elseif (is_uploaded_file($_formData['file'])) + { + //error_log(__METHOD__." Uploaded File:".$_formData['file']." with filesize:".filesize($_formData['file'])); + move_uploaded_file($_formData['file'],$tmpFileName); // requirement for safe_mode! + //error_log(__METHOD__." copy to :".$tmpFileName." with filesize:".filesize($tmpFileName)); + } + else + { + rename($_formData['file'],$tmpFileName); + } + //$attachmentID = $this->getRandomString(); + //error_log(__METHOD__." add Attachment with ID (random String):".$attachmentID); + $buffer = array( + 'name' => $_formData['name'], + 'type' => $_formData['type'], + 'file' => $tmpFileName, + 'size' => $_formData['size'] + ); + // trying diiferent ID-ing Method, as getRandomString seems to produce non Random String on certain systems. + $attachmentID = md5(time().serialize($buffer)); + //error_log(__METHOD__." add Attachment with ID:".$attachmentID." (md5 of serialized array)"); + $this->sessionData['attachments'][$attachmentID] = $buffer; + unset($buffer); + } + + $this->saveSessionData(); + #print"
";
+			#error_log(print_r($this->sessionData,true));
+			#print"
";exit; + } + + function addMessageAttachment($_uid, $_partID, $_folder, $_name, $_type, $_size) + { + $this->sessionData['attachments'][]=array ( + 'uid' => $_uid, + 'partID' => $_partID, + 'name' => $_name, + 'type' => $_type, + 'size' => $_size, + 'folder' => $_folder + ); + $this->saveSessionData(); + } + + /** + * replace emailaddresses eclosed in <> (eg.: ) with the emailaddress only (e.g: me@you.de) + * always returns 1 + */ + static function replaceEmailAdresses(&$text) + { + // replace emailaddresses eclosed in <> (eg.: ) with the emailaddress only (e.g: me@you.de) + bofelamimail::replaceEmailAdresses($text); + return 1; + } + + function convertHTMLToText(&$_html,$sourceishtml = true) + { + $stripalltags = true; + // third param is stripalltags, we may not need that, if the source is already in ascii + if (!$sourceishtml) $stripalltags=false; + return bofelamimail::convertHTMLToText($_html,false,$stripalltags); + } + + function convertHTMLToTextTiny($_html) + { + print "
"; print htmlspecialchars($_html); print "
"; + // remove these tags and any spaces behind the tags + $search = array('/ */', '/<.?strong>/', '/<.?em>/', '/<.?u>/', '/<.?ul> */', '/<.?ol> */', '/<.?font.*?> */', '/<.?blockquote> */'); + $replace = ''; + $text = preg_replace($search, $replace, $_html); + + // convert these tags and any spaces behind the tags to line breaks + $search = array('/<\/li> */', '/
*/'); + $replace = "\r\n"; + $text = preg_replace($search, $replace, $text); + + // convert these tags and any spaces behind the tags to double line breaks + $search = array('/ <\/p> */', '/<\/p> */'); + $replace = "\r\n\r\n"; + $text = preg_replace($search, $replace, $text); + + // special replacements + $search = array('/
  • /'); + $replace = array(' * '); + + $text = preg_replace($search, $replace, $text); + + $text = html_entity_decode($text, ENT_COMPAT, $this->displayCharset); + + print "
    "; print htmlspecialchars($text); print "
    "; exit; + + return $text; + } + + function generateRFC822Address($_addressObject) + { + if(!empty($_addressObject->personal) && !empty($_addressObject->mailbox) && !empty($_addressObject->host)) { + return sprintf('"%s" <%s@%s>', $this->bofelamimail->decode_header($_addressObject->personal), $_addressObject->mailbox, $_addressObject->host); + } elseif(!empty($_addressObject->mailbox) && !empty($_addressObject->host)) { + return sprintf("%s@%s", $_addressObject->mailbox, $_addressObject->host); + } else { + return $_addressObject->mailbox; + } + } + + // create a hopefully unique id, to keep track of different compose windows + // if you do this, you are creating a new email + function getComposeID() + { + $this->composeID = $this->getRandomString(); + + $this->setDefaults(); + + return $this->composeID; + } + + // $_mode can be: + // single: for a reply to one address + // all: for a reply to all + function getDraftData($_icServer, $_folder, $_uid, $_partID=NULL) + { + $this->sessionData['to'] = array(); + + $bofelamimail =& $this->bofelamimail; //CreateObject('felamimail.bofelamimail',$this->displayCharset); + $bofelamimail->openConnection(); + $bofelamimail->reopen($_folder); + + $userEMailAddresses = $this->preferences->getUserEMailAddresses(); + + // get message headers for specified message + #$headers = $bofelamimail->getMessageHeader($_folder, $_uid); + $headers = $bofelamimail->getMessageEnvelope($_uid, $_partID); + $addHeadInfo = $bofelamimail->getMessageHeader($_uid, $_partID); + if (!empty($addHeadInfo['X-MAILFOLDER'])) { + foreach ( explode('|',$addHeadInfo['X-MAILFOLDER']) as $val ) { + $this->sessionData['folder'][] = $val; + } + } + if (!empty($addHeadInfo['X-SIGNATURE'])) { + $this->sessionData['signatureID'] = $addHeadInfo['X-SIGNATURE']; + } + if (!empty($addHeadInfo['X-STATIONERY'])) { + $this->sessionData['stationeryID'] = $addHeadInfo['X-STATIONERY']; + } + if (!empty($addHeadInfo['X-IDENTITY'])) { + $this->sessionData['identity'] = $addHeadInfo['X-IDENTITY']; + } + $this->sessionData['uid'] = $_uid; + $this->sessionData['messageFolder'] = $_folder; + $this->sessionData['isDraft'] = true; + foreach((array)$headers['CC'] as $val) { + if($val['MAILBOX_NAME'] == 'undisclosed-recipients' || (empty($val['MAILBOX_NAME']) && empty($val['HOST_NAME'])) ) { + continue; + } + + if($userEMailAddresses[$val['EMAIL']]) { + continue; + } + + if(!$foundAddresses[$val['EMAIL']]) { + $address = $val['PERSONAL_NAME'] != 'NIL' ? $val['RFC822_EMAIL'] : $val['EMAIL']; + $address = $this->bofelamimail->decode_header($address); + $this->sessionData['cc'][] = $address; + $foundAddresses[$val['EMAIL']] = true; + } + } + + foreach((array)$headers['TO'] as $val) { + if($val['MAILBOX_NAME'] == 'undisclosed-recipients' || (empty($val['MAILBOX_NAME']) && empty($val['HOST_NAME'])) ) { + continue; + } + + if($userEMailAddresses[$val['EMAIL']]) { + continue; + } + + if(!$foundAddresses[$val['EMAIL']]) { + $address = $val['PERSONAL_NAME'] != 'NIL' ? $val['RFC822_EMAIL'] : $val['EMAIL']; + $address = $this->bofelamimail->decode_header($address); + $this->sessionData['to'][] = $address; + $foundAddresses[$val['EMAIL']] = true; + } + } + + foreach((array)$headers['REPLY_TO'] as $val) { + if($val['MAILBOX_NAME'] == 'undisclosed-recipients' || (empty($val['MAILBOX_NAME']) && empty($val['HOST_NAME'])) ) { + continue; + } + + if($userEMailAddresses[$val['EMAIL']]) { + continue; + } + + if(!$foundAddresses[$val['EMAIL']]) { + $address = $val['PERSONAL_NAME'] != 'NIL' ? $val['RFC822_EMAIL'] : $val['EMAIL']; + $address = $this->bofelamimail->decode_header($address); + $this->sessionData['replyto'][] = $address; + $foundAddresses[$val['EMAIL']] = true; + } + } + + foreach((array)$headers['BCC'] as $val) { + if($val['MAILBOX_NAME'] == 'undisclosed-recipients' || (empty($val['MAILBOX_NAME']) && empty($val['HOST_NAME'])) ) { + continue; + } + + if($userEMailAddresses[$val['EMAIL']]) { + continue; + } + + if(!$foundAddresses[$val['EMAIL']]) { + $address = $val['PERSONAL_NAME'] != 'NIL' ? $val['RFC822_EMAIL'] : $val['EMAIL']; + $address = $this->bofelamimail->decode_header($address); + $this->sessionData['bcc'][] = $address; + $foundAddresses[$val['EMAIL']] = true; + } + } + + $this->sessionData['subject'] = $bofelamimail->decode_header($headers['SUBJECT']); + // remove a printview tag if composing + $searchfor = '/^\['.lang('printview').':\]/'; + $this->sessionData['subject'] = preg_replace($searchfor,'',$this->sessionData['subject']); + $bodyParts = $bofelamimail->getMessageBody($_uid, $this->preferencesArray['always_display'], $_partID); + #_debug_array($bodyParts); + + #$fromAddress = ($headers['FROM'][0]['PERSONAL_NAME'] != 'NIL') ? $headers['FROM'][0]['RFC822_EMAIL'] : $headers['FROM'][0]['EMAIL']; + if($bodyParts['0']['mimeType'] == 'text/html') { + $this->sessionData['mimeType'] = 'html'; + + for($i=0; $i0) { + $this->sessionData['body'] .= '
    '; + } + if($bodyParts[$i]['mimeType'] == 'text/plain') { + #$bodyParts[$i]['body'] = nl2br($bodyParts[$i]['body']); + $bodyParts[$i]['body'] = "
    ".$bodyParts[$i]['body']."
    "; + } + $bodyParts[$i]['body'] = $GLOBALS['egw']->translation->convert($bodyParts[$i]['body'], $bodyParts[$i]['charSet']); + #error_log( "GetDraftData (HTML) CharSet:".mb_detect_encoding($bodyParts[$i]['body'] . 'a' , strtoupper($bodyParts[$i]['charSet']).','.strtoupper($this->displayCharset).',UTF-8, ISO-8859-1')); + $this->sessionData['body'] .= "
    ". $bodyParts[$i]['body'] ; + } + + } else { + $this->sessionData['mimeType'] = 'plain'; + + for($i=0; $i0) { + $this->sessionData['body'] .= "
    "; + } + $bodyParts[$i]['body'] = $GLOBALS['egw']->translation->convert($bodyParts[$i]['body'], $bodyParts[$i]['charSet']); + #error_log( "GetDraftData (Plain) CharSet".mb_detect_encoding($bodyParts[$i]['body'] . 'a' , strtoupper($bodyParts[$i]['charSet']).','.strtoupper($this->displayCharset).',UTF-8, ISO-8859-1')); + $this->sessionData['body'] .= "\r\n". $bodyParts[$i]['body'] ; + } + } + + if($attachments = $bofelamimail->getMessageAttachments($_uid,$_partID)) { + foreach($attachments as $attachment) { + $this->addMessageAttachment($_uid, $attachment['partID'], + $_folder, + $attachment['name'], + $attachment['mimeType'], + $attachment['size']); + } + } + $bofelamimail->closeConnection(); + + $this->saveSessionData(); + } + + function getErrorInfo() + { + if(isset($this->errorInfo)) { + $errorInfo = $this->errorInfo; + unset($this->errorInfo); + return $errorInfo; + } + return false; + } + + function getForwardData($_icServer, $_folder, $_uid, $_partID) + { + if ($this->preferencesArray['message_forwarding'] == 'inline') { + $this->getReplyData('forward', $_icServer, $_folder, $_uid, $_partID); + } + $bofelamimail =& $this->bofelamimail; //CreateObject('felamimail.bofelamimail',$this->displayCharset); + $bofelamimail->openConnection(); + $bofelamimail->reopen($_folder); + + // get message headers for specified message + $headers = $bofelamimail->getMessageEnvelope($_uid, $_partID); + + #_debug_array($headers); exit; + // check for Re: in subject header + $this->sessionData['subject'] = "[FWD] " . $bofelamimail->decode_header($headers['SUBJECT']); + $this->sessionData['sourceFolder']=$_folder; + $this->sessionData['forwardFlag']='forwarded'; + $this->sessionData['forwardedUID']=$_uid; + if ($this->preferencesArray['message_forwarding'] == 'asmail') { + $this->sessionData['mimeType'] = 'html'; + if($headers['SIZE']) + $size = $headers['SIZE']; + else + $size = lang('unknown'); + + $this->addMessageAttachment($_uid, $_partID, $_folder, + $bofelamimail->decode_header($headers['SUBJECT']), + 'MESSAGE/RFC822', $size); + } + else + { + unset($this->sessionData['in-reply-to']); + unset($this->sessionData['to']); + unset($this->sessionData['cc']); + if($attachments = $bofelamimail->getMessageAttachments($_uid,$_partID)) { + foreach($attachments as $attachment) { + $this->addMessageAttachment($_uid, $attachment['partID'], + $_folder, + $attachment['name'], + $attachment['mimeType'], + $attachment['size']); + } + } + } + $bofelamimail->closeConnection(); + + $this->saveSessionData(); + } + + function getRandomString() { + mt_srand((float) microtime() * 1000000); + return md5(mt_rand (100000, 999999)); + } + + // $_mode can be: + // single: for a reply to one address + // all: for a reply to all + // forward: inlineforwarding of a message with its attachments + function getReplyData($_mode, $_icServer, $_folder, $_uid, $_partID) + { + $foundAddresses = array(); + + $bofelamimail =& $this->bofelamimail; //CreateObject('felamimail.bofelamimail',$this->displayCharset); + $bofelamimail->openConnection(); + $bofelamimail->reopen($_folder); + + $userEMailAddresses = $this->preferences->getUserEMailAddresses(); + + // get message headers for specified message + #print "AAAA: $_folder, $_uid, $_partID
    "; + $headers = $bofelamimail->getMessageEnvelope($_uid, $_partID); + #$headers = $bofelamimail->getMessageHeader($_uid, $_partID); + $this->sessionData['uid'] = $_uid; + $this->sessionData['messageFolder'] = $_folder; + $this->sessionData['in-reply-to'] = $headers['MESSAGE_ID']; + + // check for Reply-To: header and use if available + if(!empty($headers['REPLY_TO']) && ($headers['REPLY_TO'] != $headers['FROM'])) { + foreach($headers['REPLY_TO'] as $val) { + if($val['EMAIL'] == 'NIL') { + continue; + } + + if(!$foundAddresses[$val['EMAIL']]) { + $address = $val['PERSONAL_NAME'] != 'NIL' ? $val['RFC822_EMAIL'] : $val['EMAIL']; + $address = $this->bofelamimail->decode_header($address); + $oldTo[] = $address; + $foundAddresses[$val['EMAIL']] = true; + } + } + $oldToAddress = $headers['REPLY_TO'][0]['EMAIL']; + } else { + foreach($headers['FROM'] as $val) { + if($val['EMAIL'] == 'NIL') { + continue; + } + if(!$foundAddresses[$val['EMAIL']]) { + $address = $val['PERSONAL_NAME'] != 'NIL' ? $val['RFC822_EMAIL'] : $val['EMAIL']; + $address = $this->bofelamimail->decode_header($address); + $oldTo[] = $address; + $foundAddresses[$val['EMAIL']] = true; + } + } + $oldToAddress = $headers['REPLY_TO'][0]['EMAIL']; + } + + if($_mode != 'all' || ($_mode == 'all' && !$userEMailAddresses[$oldToAddress]) ) { + $this->sessionData['to'] = $oldTo; + } + + if($_mode == 'all') { + // reply to any address which is cc, but not to my self + #if($headers->cc) { + foreach($headers['CC'] as $val) { + if($val['MAILBOX_NAME'] == 'undisclosed-recipients' || (empty($val['MAILBOX_NAME']) && empty($val['HOST_NAME'])) ) { + continue; + } + + if($userEMailAddresses[$val['EMAIL']]) { + continue; + } + + if(!$foundAddresses[$val['EMAIL']]) { + $address = $val['PERSONAL_NAME'] != 'NIL' ? $val['RFC822_EMAIL'] : $val['EMAIL']; + $address = $this->bofelamimail->decode_header($address); + $this->sessionData['cc'][] = $address; + $foundAddresses[$val['EMAIL']] = true; + } + } + #} + + // reply to any address which is to, but not to my self + #if($headers->to) { + foreach($headers['TO'] as $val) { + if($val['MAILBOX_NAME'] == 'undisclosed-recipients' || (empty($val['MAILBOX_NAME']) && empty($val['HOST_NAME'])) ) { + continue; + } + + if($userEMailAddresses[$val['EMAIL']]) { + continue; + } + + if(!$foundAddresses[$val['EMAIL']]) { + $address = $val['PERSONAL_NAME'] != 'NIL' ? $val['RFC822_EMAIL'] : $val['EMAIL']; + $address = $this->bofelamimail->decode_header($address); + $this->sessionData['to'][] = $address; + $foundAddresses[$val['EMAIL']] = true; + } + } + #} + + #if($headers->from) { + foreach($headers['FROM'] as $val) { + if($val['MAILBOX_NAME'] == 'undisclosed-recipients' || (empty($val['MAILBOX_NAME']) && empty($val['HOST_NAME'])) ) { + continue; + } + + if($userEMailAddresses[$val['EMAIL']]) { + continue; + } + + if(!$foundAddresses[$val['EMAIL']]) { + $address = $val['PERSONAL_NAME'] != 'NIL' ? $val['RFC822_EMAIL'] : $val['EMAIL']; + $address = $this->bofelamimail->decode_header($address); + $this->sessionData['to'][] = $address; + $foundAddresses[$val['EMAIL']] = true; + } + } + #} + } + + // check for Re: in subject header + if(strtolower(substr(trim($bofelamimail->decode_header($headers['SUBJECT'])), 0, 3)) == "re:") { + $this->sessionData['subject'] = $bofelamimail->decode_header($headers['SUBJECT']); + } else { + $this->sessionData['subject'] = "Re: " . $bofelamimail->decode_header($headers['SUBJECT']); + } + + //_debug_array($headers); + $bodyParts = $bofelamimail->getMessageBody($_uid, $this->preferencesArray['always_display'], $_partID); + //_debug_array($bodyParts); + + $fromAddress = ($headers['FROM'][0]['PERSONAL_NAME'] != 'NIL') ? $headers['FROM'][0]['RFC822_EMAIL'] : $headers['FROM'][0]['EMAIL']; + $toAddressA = array(); + $toAddress = ''; + foreach ($headers['TO'] as $mailheader) { + $toAddressA[] = ($mailheader['PERSONAL_NAME'] != 'NIL') ? $mailheader['RFC822_EMAIL'] : $mailheader['EMAIL']; + } + if (count($toAddressA)>0) $toAddress = @htmlspecialchars(lang("to").": ".$bofelamimail->decode_header(implode(', ', $toAddressA)),ENT_QUOTES).($bodyParts['0']['mimeType'] == 'text/html'?"\r\n
    ":"\r\n"); + $ccAddressA = array(); + $ccAddress = ''; + foreach ($headers['CC'] as $mailheader) { + $ccAddressA[] = ($mailheader['PERSONAL_NAME'] != 'NIL') ? $mailheader['RFC822_EMAIL'] : $mailheader['EMAIL']; + } + if (count($ccAddressA)>0) $ccAddress = @htmlspecialchars(lang("cc").": ".$bofelamimail->decode_header(implode(', ', $ccAddressA)),ENT_QUOTES).($bodyParts['0']['mimeType'] == 'text/html'?"\r\n
    ":"\r\n"); + if($bodyParts['0']['mimeType'] == 'text/html') { + $this->sessionData['body'] = "
     \r\n

    ".'----------------'.lang("original message").'-----------------'."\r\n".'
    '. + @htmlspecialchars(lang("from").": ".$bofelamimail->decode_header($fromAddress),ENT_QUOTES)."\r\n
    ". + $toAddress.$ccAddress. + @htmlspecialchars(lang("date").": ".$headers['DATE'],ENT_QUOTES)."\r\n
    ". + '----------------------------------------------------------'."\r\n

    "; + $this->sessionData['mimeType'] = 'html'; + $this->sessionData['body'] .= '
    '; + + for($i=0; $i0) { + $this->sessionData['body'] .= '
    '; + } + if($bodyParts[$i]['mimeType'] == 'text/plain') { + #$bodyParts[$i]['body'] = nl2br($bodyParts[$i]['body'])."
    "; + $bodyParts[$i]['body'] = "
    ".$bodyParts[$i]['body']."
    "; + } + $this->sessionData['body'] .= "
    ".self::_getCleanHTML($GLOBALS['egw']->translation->convert($bodyParts[$i]['body'], $bodyParts[$i]['charSet'])); + #error_log( "GetReplyData (HTML) CharSet:".mb_detect_encoding($bodyParts[$i]['body'] . 'a' , strtoupper($bodyParts[$i]['charSet']).','.strtoupper($this->displayCharset).',UTF-8, ISO-8859-1')); + + } + + $this->sessionData['body'] .= '

    '; + } else { + #$this->sessionData['body'] = @htmlspecialchars(lang("on")." ".$headers['DATE']." ".$bofelamimail->decode_header($fromAddress), ENT_QUOTES) . " ".lang("wrote").":\r\n"; + $this->sessionData['body'] = " \r\n \r\n".'----------------'.lang("original message").'-----------------'."\r\n". + @htmlspecialchars(lang("from").": ".$bofelamimail->decode_header($fromAddress),ENT_QUOTES)."\r\n". + $toAddress.$ccAddress. + @htmlspecialchars(lang("date").": ".$headers['DATE'], ENT_QUOTES)."\r\n". + '-------------------------------------------------'."\r\n \r\n "; + + $this->sessionData['mimeType'] = 'plain'; + + for($i=0; $i0) { + $this->sessionData['body'] .= "
    "; + } + + // add line breaks to $bodyParts + $newBody = $GLOBALS['egw']->translation->convert($bodyParts[$i]['body'], $bodyParts[$i]['charSet']); + #error_log( "GetReplyData (Plain) CharSet:".mb_detect_encoding($bodyParts[$i]['body'] . 'a' , strtoupper($bodyParts[$i]['charSet']).','.strtoupper($this->displayCharset).',UTF-8, ISO-8859-1')); + + $newBody = explode("\n",$newBody); + $this->sessionData['body'] .= "\r\n"; + // create body new, with good line breaks and indention + foreach($newBody as $value) { + // the explode is removing the character + if (trim($value) != '') { + #if ($value != "\r") $value .= "\n"; + } + $numberOfChars = strspn(trim($value), ">"); + $appendString = str_repeat('>', $numberOfChars + 1); + + $bodyAppend = $this->bofelamimail->wordwrap($value, 76-strlen("\r\n$appendString "), "\r\n$appendString "); + + if($bodyAppend[0] == '>') { + $bodyAppend = '>'. $bodyAppend; + } else { + $bodyAppend = '> '. $bodyAppend; + } + + $this->sessionData['body'] .= $bodyAppend; + } + } + } + + $bofelamimail->closeConnection(); + + $this->saveSessionData(); + } + + static function _getCleanHTML($_body) + { + static $nonDisplayAbleCharacters = array('[\016]','[\017]', + '[\020]','[\021]','[\022]','[\023]','[\024]','[\025]','[\026]','[\027]', + '[\030]','[\031]','[\032]','[\033]','[\034]','[\035]','[\036]','[\037]'); + bofelamimail::getCleanHTML($_body); + $_body = preg_replace($nonDisplayAbleCharacters, '', $_body); + + return $_body; + } + + function getSessionData() + { + return $this->sessionData; + } + + // get the user name, will will use for the FROM field + function getUserName() + { + $retData = sprintf("%s <%s>",$this->preferences['realname'],$this->preferences['emailAddress']); + return $retData; + } + + function removeAttachment($_attachmentID) { + if (parse_url($this->sessionData['attachments'][$_attachmentID]['file'],PHP_URL_SCHEME) != 'vfs') { + unlink($this->sessionData['attachments'][$_attachmentID]['file']); + } + unset($this->sessionData['attachments'][$_attachmentID]); + $this->saveSessionData(); + } + + function restoreSessionData() + { + $this->sessionData = $GLOBALS['egw']->session->appsession('compose_session_data_'.$this->composeID, 'felamimail'); + } + + function saveSessionData() + { + $GLOBALS['egw']->session->appsession('compose_session_data_'.$this->composeID,'felamimail',$this->sessionData); + } + + function createMessage(&$_mailObject, $_formData, $_identity, $_signature = false) + { + $bofelamimail =& $this->bofelamimail; //CreateObject('felamimail.bofelamimail',$this->displayCharset); + $userLang = $GLOBALS['egw_info']['user']['preferences']['common']['lang']; + $langFile = EGW_SERVER_ROOT."/phpgwapi/setup/phpmailer.lang-$userLang.php"; + if(file_exists($langFile)) { + $_mailObject->SetLanguage($userLang, EGW_SERVER_ROOT."/phpgwapi/setup/"); + } else { + $_mailObject->SetLanguage("en", EGW_SERVER_ROOT."/phpgwapi/setup/"); + } + $_mailObject->PluginDir = EGW_SERVER_ROOT."/phpgwapi/inc/"; + $activeMailProfile = $this->preferences->getIdentity(0); + $_mailObject->IsSMTP(); + $_mailObject->CharSet = $this->displayCharset; + // you need to set the sender, if you work with different identities, since most smtp servers, dont allow + // sending in the name of someone else + $_mailObject->Sender = $activeMailProfile->emailAddress; + $_mailObject->From = $_identity->emailAddress; + $_mailObject->FromName = $_mailObject->EncodeHeader($_identity->realName); + $_mailObject->Priority = $_formData['priority']; + $_mailObject->Encoding = 'quoted-printable'; + $_mailObject->AddCustomHeader('X-Mailer: FeLaMiMail'); + if(isset($this->sessionData['in-reply-to'])) { + $_mailObject->AddCustomHeader('In-Reply-To: '. $this->sessionData['in-reply-to']); + } + if($_formData['disposition']) { + $_mailObject->AddCustomHeader('Disposition-Notification-To: '. $_identity->emailAddress); + } + if(!empty($_identity->organization)) { + #$_mailObject->AddCustomHeader('Organization: '. $bofelamimail->encodeHeader($_identity->organization, 'q')); + $_mailObject->AddCustomHeader('Organization: '. $_identity->organization); + } + + foreach((array)$_formData['to'] as $address) { + $address_array = imap_rfc822_parse_adrlist((get_magic_quotes_gpc()?stripslashes($address):$address), ''); + foreach((array)$address_array as $addressObject) { + $emailAddress = $addressObject->mailbox. (!empty($addressObject->host) ? '@'.$addressObject->host : ''); + #$emailName = $bofelamimail->encodeHeader($addressObject->personal, 'q'); + #$_mailObject->AddAddress($emailAddress, $emailName); + $_mailObject->AddAddress($emailAddress, $addressObject->personal); + } + } + + foreach((array)$_formData['cc'] as $address) { + $address_array = imap_rfc822_parse_adrlist((get_magic_quotes_gpc()?stripslashes($address):$address),''); + foreach((array)$address_array as $addressObject) { + $emailAddress = $addressObject->mailbox. (!empty($addressObject->host) ? '@'.$addressObject->host : ''); + #$emailName = $bofelamimail->encodeHeader($addressObject->personal, 'q'); + #$_mailObject->AddCC($emailAddress, $emailName); + $_mailObject->AddCC($emailAddress, $addressObject->personal); + } + } + + foreach((array)$_formData['bcc'] as $address) { + $address_array = imap_rfc822_parse_adrlist((get_magic_quotes_gpc()?stripslashes($address):$address),''); + foreach((array)$address_array as $addressObject) { + $emailAddress = $addressObject->mailbox. (!empty($addressObject->host) ? '@'.$addressObject->host : ''); + #$emailName = $bofelamimail->encodeHeader($addressObject->personal, 'q'); + #$_mailObject->AddBCC($emailAddress, $emailName); + $_mailObject->AddBCC($emailAddress, $addressObject->personal); + } + } + + foreach((array)$_formData['replyto'] as $address) { + $address_array = imap_rfc822_parse_adrlist((get_magic_quotes_gpc()?stripslashes($address):$address),''); + foreach((array)$address_array as $addressObject) { + $emailAddress = $addressObject->mailbox. (!empty($addressObject->host) ? '@'.$addressObject->host : ''); + #$emailName = $bofelamimail->encodeHeader($addressObject->personal, 'q'); + #$_mailObject->AddBCC($emailAddress, $emailName); + $_mailObject->AddReplyto($emailAddress, $addressObject->personal); + } + } + + $_mailObject->WordWrap = 76; + #$_mailObject->Subject = $bofelamimail->encodeHeader($_formData['subject'], 'q'); + $_mailObject->Subject = $_formData['subject']; + #$realCharset = mb_detect_encoding($_formData['body'] . 'a' , strtoupper($this->displayCharset).',UTF-8, ISO-8859-1'); + #error_log("bocompose::createMessage:".$realCharset); + // this should never happen since we come from the edit dialog + if (bofelamimail::detect_qp($_formData['body'])) { + error_log("Error: bocompose::createMessage found QUOTED-PRINTABLE while Composing Message. Charset:$realCharset Message:".print_r($_formData['body'],true)); + $_formData['body'] = preg_replace('/=\r\n/', '', $_formData['body']); + $_formData['body'] = quoted_printable_decode($_formData['body']); + } + #if ($realCharset != $this->displayCharset) error_log("Error: bocompose::createMessage found Charset ($realCharset) differs from DisplayCharset (".$this->displayCharset.")"); + $signature = $_signature->fm_signature; + $signature = bofelamimail::merge($signature,array($GLOBALS['egw']->accounts->id2name($GLOBALS['egw_info']['user']['account_id'],'person_id'))); + if($_formData['mimeType'] =='html') { + $_mailObject->IsHTML(true); + if(!empty($signature)) { + #$_mailObject->Body = array($_formData['body'], $_signature['signature']); + if($this->sessionData['stationeryID']) { + $bostationery = new felamimail_bostationery(); + $_mailObject->Body = $bostationery->render($this->sessionData['stationeryID'],$_formData['body'],$signature); + } else { + $_mailObject->Body = $_formData['body'] .'
    '. $signature; + } + $_mailObject->AltBody = $this->convertHTMLToText($_formData['body']). + "\r\n-- \r\n". + $this->convertHTMLToText($signature); + #print "
    $_mailObject->AltBody
    "; + #print htmlentities($_signature['signature']); + } else { + if($this->sessionData['stationeryID']) { + $bostationery = new felamimail_bostationery(); + $_mailObject->Body = $bostationery->render($this->sessionData['stationeryID'],$_formData['body']); + } else { + $_mailObject->Body = $_formData['body']; + } + $_mailObject->AltBody = $this->convertHTMLToText($_formData['body']); + } + } else { + $_mailObject->IsHTML(false); + $_mailObject->Body = $this->convertHTMLToText($_formData['body'],false); + #$_mailObject->Body = $_formData['body']; + if(!empty($signature)) { + $_mailObject->Body .= "\r\n-- \r\n". $this->convertHTMLToText($signature); + } + } + + // add the attachments + $bofelamimail->openConnection(); + foreach((array)$this->sessionData['attachments'] as $attachment) { + if(!empty($attachment['uid']) && !empty($attachment['folder'])) { + switch($attachment['type']) { + case 'MESSAGE/RFC822': + $rawHeader=''; + $bofelamimail->reopen($attachment['folder']); + if (isset($attachment['partID'])) { + $rawHeader = $bofelamimail->getMessageRawHeader($attachment['uid'], $attachment['partID']); + } + $rawBody = $bofelamimail->getMessageRawBody($attachment['uid'], $attachment['partID']); + $_mailObject->AddStringAttachment($rawHeader.$rawBody, $_mailObject->EncodeHeader($attachment['name']), '7bit', 'message/rfc822'); + break; + default: + $bofelamimail->reopen($attachment['folder']); + $attachmentData = $bofelamimail->getAttachment($attachment['uid'], $attachment['partID']); + + $_mailObject->AddStringAttachment($attachmentData['attachment'], $_mailObject->EncodeHeader($attachment['name']), 'base64', $attachment['type']); + break; + + } + } else { + if (parse_url($attachment['file'],PHP_URL_SCHEME) == 'vfs') + { + egw_vfs::load_wrapper('vfs'); + } + $_mailObject->AddAttachment ( + $attachment['file'], + $_mailObject->EncodeHeader($attachment['name']), + 'base64', + $attachment['type'] + ); + } + } + $bofelamimail->closeConnection(); + } + + function saveAsDraft($_formData) + { + $bofelamimail =& $this->bofelamimail; //CreateObject('felamimail.bofelamimail',$this->displayCharset); + $mail = CreateObject('phpgwapi.phpmailer'); + $identity = $this->preferences->getIdentity((int)$this->sessionData['identity']); + $flags = '\\Seen \\Draft'; + $BCCmail = ''; + + $this->createMessage($mail, $_formData, $identity); + // preserve the bcc and if possible the save to folder information + $this->sessionData['folder'] = $_formData['folder']; + $this->sessionData['bcc'] = $_formData['bcc']; + $this->sessionData['signatureID'] = $_formData['signatureID']; + $this->sessionData['stationeryID'] = $_formData['stationeryID']; + $this->sessionData['identity'] = $_formData['identity']; + foreach((array)$this->sessionData['bcc'] as $address) { + $address_array = imap_rfc822_parse_adrlist((get_magic_quotes_gpc()?stripslashes($address):$address),''); + foreach((array)$address_array as $addressObject) { + $emailAddress = $addressObject->mailbox. (!empty($addressObject->host) ? '@'.$addressObject->host : ''); + $mailAddr[] = array($emailAddress, $addressObject->personal); + } + } + // folder list as Customheader + if (!empty($this->sessionData['folder'])) + { + $folders = implode('|',array_unique($this->sessionData['folder'])); + $mail->AddCustomHeader("X-Mailfolder: $folders"); + } + $mail->AddCustomHeader('X-Signature: '.$this->sessionData['signatureID']); + $mail->AddCustomHeader('X-Stationery: '.$this->sessionData['stationeryID']); + $mail->AddCustomHeader('X-Identity: '.(int)$this->sessionData['identity']); + // decide where to save the message (default to draft folder, if we find nothing else) + // if the current folder is in draft or template folder save it there + // if it is called from printview then save it with the draft folder + $savingDestination = ($this->preferences->ic_server[0]->draftfolder ? $this->preferences->ic_server[0]->draftfolder : $this->preferencesArray['draftFolder']); + if (empty($this->sessionData['messageFolder']) && !empty($this->sessionData['mailbox'])) $this->sessionData['messageFolder'] = $this->sessionData['mailbox']; + if ($bofelamimail->isDraftFolder($this->sessionData['messageFolder']) + || $bofelamimail->isTemplateFolder($this->sessionData['messageFolder'])) + { + $savingDestination = $this->sessionData['messageFolder']; + } + if ( !empty($_formData['printit']) && $_formData['printit'] == 0 ) $savingDestination = ($this->preferences->ic_server[0]->draftfolder ? $this->preferences->ic_server[0]->draftfolder : $this->preferencesArray['draftFolder']); + + if (count($mailAddr)>0) $BCCmail = $mail->AddrAppend("Bcc",$mailAddr); + $bofelamimail->openConnection(); + if ($bofelamimail->folderExists($savingDestination,true)) { + $messageUid = $bofelamimail->appendMessage($savingDestination, + $BCCmail.$mail->getMessageHeader(), + $mail->getMessageBody(), + $flags); + } else { + error_log("bofelamimail::saveAsDraft->".lang("folder")." ". $savingDestination." ".lang("does not exist on IMAP Server.")); + return false; + } + $bofelamimail->closeConnection(); + return $messageUid; + } + + function send($_formData) + { + $bofelamimail =& $this->bofelamimail; //CreateObject('felamimail.bofelamimail',$this->displayCharset); + $mail =& CreateObject('phpgwapi.phpmailer'); + $messageIsDraft = false; + + $this->sessionData['identity'] = $_formData['identity']; + $this->sessionData['to'] = $_formData['to']; + $this->sessionData['cc'] = $_formData['cc']; + $this->sessionData['bcc'] = $_formData['bcc']; + $this->sessionData['folder'] = $_formData['folder']; + $this->sessionData['replyto'] = $_formData['replyto']; + $this->sessionData['subject'] = trim($_formData['subject']); + $this->sessionData['body'] = $_formData['body']; + $this->sessionData['priority'] = $_formData['priority']; + $this->sessionData['signatureID'] = $_formData['signatureID']; + $this->sessionData['stationeryID'] = $_formData['stationeryID']; + $this->sessionData['disposition'] = $_formData['disposition']; + $this->sessionData['mimeType'] = $_formData['mimeType']; + $this->sessionData['to_infolog'] = $_formData['to_infolog']; + // if the body is empty, maybe someone pasted something with scripts, into the message body + // this should not happen anymore, unless you call send directly, since the check was introduced with the action command + if(empty($this->sessionData['body'])) + { + // this is to be found with the egw_unset_vars array for the _POST['body'] array + $name='_POST'; + $key='body'; + #error_log($GLOBALS['egw_unset_vars'][$name.'['.$key.']']); + if (isset($GLOBALS['egw_unset_vars'][$name.'['.$key.']'])) + { + $this->sessionData['body'] = self::_getCleanHTML( $GLOBALS['egw_unset_vars'][$name.'['.$key.']']); + $_formData['body']=$this->sessionData['body']; + } + #error_log($this->sessionData['body']); + } + if(empty($this->sessionData['to']) && empty($this->sessionData['cc']) && + empty($this->sessionData['bcc']) && empty($this->sessionData['folder'])) { + $messageIsDraft = true; + } + #error_log(print_r($this->preferences,true)); + $identity = $this->preferences->getIdentity((int)$this->sessionData['identity']); + $signature = $this->bosignatures->getSignature((int)$this->sessionData['signatureID']); + #error_log($this->sessionData['identity']); + #error_log(print_r($identity,true)); + // create the messages + $this->createMessage($mail, $_formData, $identity, $signature); + #print "
    ". $mail->getMessageHeader() ."


    "; + #print "
    ". $mail->getMessageBody() ."


    "; + #exit; + + $ogServer = $this->preferences->getOutgoingServer(0); + #_debug_array($ogServer); + $mail->Host = $ogServer->host; + $mail->Port = $ogServer->port; + // SMTP Auth?? + if($ogServer->smtpAuth) { + $mail->SMTPAuth = true; + // check if username contains a ; -> then a sender is specified (and probably needed) + list($username,$senderadress) = explode(';', $ogServer->username,2); + if (isset($senderadress) && !empty($senderadress)) $mail->Sender = $senderadress; + $mail->Username = $username; + $mail->Password = $ogServer->password; + } + + // set a higher timeout for big messages + @set_time_limit(120); + #$mail->SMTPDebug = 10; + #error_log("Folder:".count(array($this->sessionData['folder']))."To:".count((array)$this->sessionData['to'])."CC:". count((array)$this->sessionData['cc']) ."bcc:".count((array)$this->sessionData['bcc'])); + if(count((array)$this->sessionData['to']) > 0 || count((array)$this->sessionData['cc']) > 0 || count((array)$this->sessionData['bcc']) > 0) { + if(!$mail->Send()) { + $this->errorInfo = $mail->ErrorInfo; + #error_log($this->errorInfo); + return false; + } + } else { + if (count(array($this->sessionData['folder']))>0 && !empty($this->sessionData['folder'])) { + #error_log("Folders:".print_r($this->sessionData['folder'],true)); + } else { + $this->errorInfo = lang("Error: ").lang("No Address TO/CC/BCC supplied, and no folder to save message to provided."); + #error_log($this->errorInfo); + return false; + } + } + #error_log("Mail Sent.!"); + $folder = (array)$this->sessionData['folder']; + if(isset($this->preferences->preferences['sentFolder']) && + $this->preferences->preferences['sentFolder'] != 'none' && + $messageIsDraft == false) { + $folder[] = $this->preferences->preferences['sentFolder']; + } + if($messageIsDraft == true) { + if(!empty($this->preferences->preferences['draftFolder'])) { + $folder[] = $this->sessionData['folder'] = array($this->preferences->preferences['draftFolder']); + } + } + $folder = array_unique($folder); + #error_log("Number of Folders to move copy the message to:".count($folder)); + if ((count($folder) > 0) || (isset($this->sessionData['uid']) && isset($this->sessionData['messageFolder'])) + || (isset($this->sessionData['forwardFlag']) && isset($this->sessionData['sourceFolder']))) { + $bofelamimail =& $this->bofelamimail; //CreateObject('felamimail.bofelamimail'); + $bofelamimail->openConnection(); + //$bofelamimail->reopen($this->sessionData['messageFolder']); + #error_log("(re)opened Connection"); + } + if (count($folder) > 0) { + + foreach((array)$this->sessionData['bcc'] as $address) { + $address_array = imap_rfc822_parse_adrlist((get_magic_quotes_gpc()?stripslashes($address):$address),''); + foreach((array)$address_array as $addressObject) { + $emailAddress = $addressObject->mailbox. (!empty($addressObject->host) ? '@'.$addressObject->host : ''); + $mailAddr[] = array($emailAddress, $addressObject->personal); + } + } + $BCCmail=''; + if (count($mailAddr)>0) $BCCmail = $mail->AddrAppend("Bcc",$mailAddr); + //$bofelamimail =& CreateObject('felamimail.bofelamimail'); + //$bofelamimail->openConnection(); + foreach($folder as $folderName) { + if($bofelamimail->isSentFolder($folderName)) { + $flags = '\\Seen'; + } elseif($bofelamimail->isDraftFolder($folderName)) { + $flags = '\\Draft'; + } else { + $flags = ''; + } + #$mailHeader=explode('From:',$mail->getMessageHeader()); + #$mailHeader[0].$mail->AddrAppend("Bcc",$mailAddr).'From:'.$mailHeader[1], + if ($bofelamimail->folderExists($folderName,true)) { + $bofelamimail->appendMessage($folderName, + $BCCmail.$mail->getMessageHeader(), + $mail->getMessageBody(), + $flags); + } + } + //$bofelamimail->closeConnection(); + } + #error_log("handling draft messages, flagging and such"); + if((isset($this->sessionData['uid']) && isset($this->sessionData['messageFolder'])) + || (isset($this->sessionData['forwardFlag']) && isset($this->sessionData['sourceFolder']))) { + // mark message as answered + //$bofelamimail =& CreateObject('felamimail.bofelamimail'); + $bofelamimail->openConnection(); + $bofelamimail->reopen($this->sessionData['messageFolder']); + // if the draft folder is a starting part of the messages folder, the draft message will be deleted after the send + // unless your templatefolder is a subfolder of your draftfolder, and the message is in there + if ($bofelamimail->isDraftFolder($this->sessionData['messageFolder']) && !$bofelamimail->isTemplateFolder($this->sessionData['messageFolder'])) + { + $bofelamimail->deleteMessages(array($this->sessionData['uid'])); + } else { + $bofelamimail->flagMessages("answered", array($this->sessionData['uid'])); + if (array_key_exists('forwardFlag',$this->sessionData) && $this->sessionData['forwardFlag']=='forwarded') + { + $bofelamimail->flagMessages("forwarded", array($this->sessionData['forwardedUID'])); + } + } + //$bofelamimail->closeConnection(); + } + if ($bofelamimail) $bofelamimail->closeConnection(); + //error_log("performing Infolog Stuff"); + //error_log(print_r($this->sessionData['to'],true)); + //error_log(print_r($this->sessionData['cc'],true)); + //error_log(print_r($this->sessionData['bcc'],true)); + if (is_array($this->sessionData['to'])) + { + $mailaddresses = $this->sessionData['to']; + } + else + { + $mailaddresses = array(); + } + if (is_array($this->sessionData['cc'])) $mailaddresses = array_merge($mailaddresses,$this->sessionData['cc']); + if (is_array($this->sessionData['bcc'])) $mailaddresses = array_merge($mailaddresses,$this->sessionData['bcc']); + // attention: we dont return from infolog. cleanups will be done there. + if ($_formData['to_infolog'] == 'on') { + $uiinfolog =& CreateObject('infolog.infolog_ui'); + $uiinfolog->import_mail( + $mailaddresses, + $this->sessionData['subject'], + $this->convertHTMLToText($this->sessionData['body']), + $this->sessionData['attachments'] + ); + } + + if(is_array($this->sessionData['attachments'])) { + reset($this->sessionData['attachments']); + while(list($key,$value) = @each($this->sessionData['attachments'])) { + #print "$key: ".$value['file']."
    "; + if (!empty($value['file']) && parse_url($value['file'],PHP_URL_SCHEME) != 'vfs') { // happens when forwarding mails + unlink($value['file']); + } + } + } + + $this->sessionData = ''; + $this->saveSessionData(); + + return true; + } + + function setDefaults() + { + require_once(EGW_INCLUDE_ROOT.'/felamimail/inc/class.felamimail_bosignatures.inc.php'); + $boSignatures = new felamimail_bosignatures(); + + if($signatureData = $boSignatures->getDefaultSignature()) { + if (is_array($signatureData)) { + $this->sessionData['signatureID'] = $signatureData['signatureid']; + } else { + $this->sessionData['signatureID'] = $signatureData; + } + } else { + $this->sessionData['signatureID'] = -1; + } + // retrieve the signature accociated with the identity + $accountData = $this->bopreferences->getAccountData($this->preferences,'active'); + if ($accountData['identity']->signature) $this->sessionData['signatureID'] = $accountData['identity']->signature; + // apply the current mailbox to the compose session data of the/a new email + $appsessionData = $GLOBALS['egw']->session->appsession('session_data'); + $this->sessionData['mailbox'] = $appsessionData['mailbox']; + + $this->sessionData['mimeType'] = 'html'; + if (!empty($this->preferencesArray['composeOptions']) && $this->preferencesArray['composeOptions']=="text") $this->sessionData['mimeType'] = 'text/plain'; + + $this->saveSessionData(); + } + + function stripSlashes($_string) + { + if (get_magic_quotes_gpc()) { + return stripslashes($_string); + } else { + return $_string; + } + } +} diff --git a/felamimail/inc/class.bofelamimail.inc.php b/felamimail/inc/class.bofelamimail.inc.php new file mode 100644 index 0000000000..84708971f8 --- /dev/null +++ b/felamimail/inc/class.bofelamimail.inc.php @@ -0,0 +1,3005 @@ + True, + ); + + var $mbox; // the mailbox identifier any function should use + static $debug = false; //true; // sometimes debuging is quite handy, to see things. check with the error log to see results + // define some constants + // message types + var $type = array("text", "multipart", "message", "application", "audio", "image", "video", "other"); + + // message encodings + var $encoding = array("7bit", "8bit", "binary", "base64", "quoted-printable", "other"); + static $displayCharset; + var $bopreferences; + var $mailPreferences; + // set to true, if php is compiled with multi byte string support + var $mbAvailable = FALSE; + + // what type of mimeTypes do we want from the body(text/html, text/plain) + var $htmlOptions; + + var $sessionData; + + // the current selected user profile + var $profileID = 0; + + /** + * Folders that get automatic created AND get translated to the users language + * their creation is also controlled by users mailpreferences. if set to none / dont use folder + * the folder will not be automatically created. This is controlled in bofelamimail->getFolderObjects + * so changing names here, must include a change of keywords there as well. Since these + * foldernames are subject to translation, keep that in mind too, if you change names here. + * @var array + */ + static $autoFolders = array('Drafts', 'Templates', 'Sent', 'Trash', 'Junk'); + + /** + * Autoload classes from emailadmin, 'til they get autoloading conform names + * + * @param string $class + */ + static function autoload($class) + { + if (file_exists($file=EGW_INCLUDE_ROOT.'/emailadmin/inc/class.'.$class.'.inc.php')) + { + include_once($file); + //error_log(__METHOD__."($class) included $file"); + } + elseif (file_exists($file=EGW_INCLUDE_ROOT.'/felamimail/inc/class.'.$class.'.inc.php')) + { + include_once($file); + } + else + { + #error_log(__METHOD__."($class) failed!"); + } + } + + function bofelamimail($_displayCharset='iso-8859-1',$_restoreSession=true) + { + if ($_restoreSession) + { + //error_log(__METHOD__." Session restore ".function_backtrace()); + $this->restoreSessionData(); + $lv_mailbox = $this->sessionData['mailbox']; + $firstMessage = $this->sessionData['previewMessage']; + } + else + { + $this->restoreSessionData(); + $lv_mailbox = $this->sessionData['mailbox']; + $firstMessage = $this->sessionData['previewMessage']; + $this->sessionData = array(); + $this->forcePrefReload(); + } + //error_log(array2string(array($firstMessage,$lv_mailbox))); + // FIXME: this->foldername seems to be unused + //$this->foldername = $this->sessionData['mailbox']; + $this->accountid = $GLOBALS['egw_info']['user']['account_id']; + + $this->bopreferences = CreateObject('felamimail.bopreferences',$_restoreSession); + //$this->sofelamimail = new sofelamimail; + + $this->mailPreferences = $this->bopreferences->getPreferences(); + if ($this->mailPreferences) { + $this->icServer = $this->mailPreferences->getIncomingServer(0); + $this->ogServer = $this->mailPreferences->getOutgoingServer(0); + $this->htmlOptions = $this->mailPreferences->preferences['htmlOptions']; + } + #_debug_array($this->mailPreferences->preferences); + $this->imapBaseDir = ''; + + self::$displayCharset = $_displayCharset; + if(function_exists(mb_decode_mimeheader)) { + mb_internal_encoding(self::$displayCharset); + } + + // set some defaults + if(empty($this->sessionData)) + { + // this should be under user preferences + // sessionData empty + // no filter active + $this->sessionData['activeFilter'] = "-1"; + // default mailbox INBOX + $this->sessionData['mailbox'] = (($lv_mailbox && self::folderExists($lv_mailbox,true)) ? $lv_mailbox : "INBOX"); + $this->sessionData['previewMessage'] = ($firstMessage >0 ? $firstMessage : 0); + // default start message + $this->sessionData['startMessage'] = 1; + // default mailbox for preferences pages + $this->sessionData['preferences']['mailbox'] = "INBOX"; + + $this->sessionData['messageFilter'] = array( + 'string' => '', + 'type' => 'quick', + 'status' => 'any', + ); + + // default sorting + switch($GLOBALS['egw_info']['user']['preferences']['felamimail']['sortOrder']) { + case 1: + $this->sessionData['sort'] = SORTDATE; + $this->sessionData['sortReverse'] = false; + break; + case 2: + $this->sessionData['sort'] = SORTFROM; + $this->sessionData['sortReverse'] = true; + break; + case 3: + $this->sessionData['sort'] = SORTFROM; + $this->sessionData['sortReverse'] = false; + break; + case 4: + $this->sessionData['sort'] = SORTSUBJECT; + $this->sessionData['sortReverse'] = true; + break; + case 5: + $this->sessionData['sort'] = SORTSUBJECT; + $this->sessionData['sortReverse'] = false; + break; + case 6: + $this->sessionData['sort'] = SORTSIZE; + $this->sessionData['sortReverse'] = true; + break; + case 7: + $this->sessionData['sort'] = SORTSIZE; + $this->sessionData['sortReverse'] = false; + break; + default: + $this->sessionData['sort'] = SORTDATE; + $this->sessionData['sortReverse'] = true; + break; + } + $this->saveSessionData(); + } + + if (function_exists('mb_convert_encoding')) { + $this->mbAvailable = TRUE; + } + + } + + function forcePrefReload() + { + // unset the fm_preferences session object, to force the reload/rebuild + $GLOBALS['egw']->session->appsession('fm_preferences','felamimail',serialize(array())); + $GLOBALS['egw']->session->appsession('session_data','emailadmin',serialize(array())); + } + + function setACL($_folderName, $_accountName, $_acl) + { + if ( PEAR::isError($this->icServer->setACL($_folderName, $_accountName, $_acl)) ) { + return false; + } + + return TRUE; + } + + function deleteACL($_folderName, $_accountName) + { + if ( PEAR::isError($this->icServer->deleteACL($_folderName, $_accountName)) ) { + return false; + } + + return TRUE; + } + + /** + * hook to add account + * + * this function is a wrapper function for emailadmin + * + * @param _hookValues contains the hook values as array + * @returns nothing + */ + function addAccount($_hookValues) + { + $icServer = $this->mailPreferences->getIncomingServer(0); + if(is_a($icServer,'defaultimap')) { + $icServer->addAccount($_hookValues); + } + + $ogServer = $this->mailPreferences->getOutgoingServer(0); + if(is_a($ogServer,'defaultsmtp')) { + $ogServer->addAccount($_hookValues); + } + } + + function adminMenu() + { + if ($GLOBALS['egw_info']['server']['account_repository'] == "ldap") + { + $data = Array + ( + 'description' => 'email settings', + 'url' => '/index.php', + 'extradata' => 'menuaction=emailadmin.uiuserdata.editUserData' + ); + + //Do not modify below this line + global $menuData; + + $menuData[] = $data; + } + } + + /** + * save a message in folder + * + * @todo set flags again + * + * @param string _folderName the foldername + * @param string _header the header of the message + * @param string _body the body of the message + * @param string _flags the imap flags to set for the saved message + * + * @returns the id of the message appended or false + */ + function appendMessage($_folderName, $_header, $_body, $_flags) + { + $header = ltrim(str_replace("\n","\r\n",$_header)); + $body = str_replace("\n","\r\n",$_body); + $messageid = $this->icServer->appendMessage("$header"."$body", $_folderName, $_flags); + if ( PEAR::isError($messageid)) { + if (self::$debug) error_log("Could not append Message:".print_r($messageid->message,true)); + return false; + } + return $messageid; + } + + function closeConnection() { + $this->icServer->disconnect(); + } + + /** + * remove any messages which are marked as deleted or + * remove any messages from the trashfolder + * + * @param string _folderName the foldername + * @returns nothing + */ + function compressFolder($_folderName = false) + { + $folderName = ($_folderName ? $_folderName : $this->sessionData['mailbox']); + $deleteOptions = $GLOBALS['egw_info']['user']['preferences']['felamimail']['deleteOptions']; + $trashFolder = $this->mailPreferences->preferences['trashFolder']; //$GLOBALS['egw_info']['user']['preferences']['felamimail']['trashFolder']; + + $this->icServer->selectMailbox($folderName); + + if($folderName == $trashFolder && $deleteOptions == "move_to_trash") { + $this->icServer->deleteMessages('1:*'); + $this->icServer->expunge(); + } else { + $this->icServer->expunge(); + } + } + + /** + * create a new folder under given parent folder + * + * @param string _parent the parent foldername + * @param string _folderName the new foldername + * @param bool _subscribe subscribe to the new folder + * + * @returns mixed name of the newly created folder or false on error + */ + function createFolder($_parent, $_folderName, $_subscribe=false) + { + $parent = $this->_encodeFolderName($_parent); + $folderName = $this->_encodeFolderName($_folderName); + + if(empty($parent)) { + $newFolderName = $folderName; + } else { + $HierarchyDelimiter = $this->getHierarchyDelimiter(); + $newFolderName = $parent . $HierarchyDelimiter . $folderName; + } + + if ( PEAR::isError($this->icServer->createMailbox($newFolderName) ) ) { + return false; + } + + if ( PEAR::isError($this->icServer->subscribeMailbox($newFolderName) ) ) { + return false; + } + + return $newFolderName; + + } + + function createIMAPFilter($_folder, $_criterias) + { + if(!is_array($_criterias)) { + return 'ALL'; + } + # error_log(print_r($_criterias, true)); + $imapFilter = ''; + + #foreach($_criterias as $criteria => $parameter) { + if(!empty($_criterias['string'])) { + $criteria = strtoupper($_criterias['type']); + switch ($criteria) { + case 'QUICK': + if($this->isSentFolder($_folder)) { + $imapFilter .= 'OR SUBJECT "'. $_criterias['string'] .'" TO "'. $_criterias['string'] .'" '; + } else { + $imapFilter .= 'OR SUBJECT "'. $_criterias['string'] .'" FROM "'. $_criterias['string'] .'" '; + } + break; + case 'BCC': + case 'BODY': + case 'CC': + case 'FROM': + case 'KEYWORD': + case 'SUBJECT': + case 'TEXT': + case 'TO': + $imapFilter .= $criteria .' "'. $_criterias['string'] .'" '; + break; + } + } + + #foreach($_criterias as $criteria => $parameter) { + $criteria = strtoupper($_criterias['status']); + switch ($criteria) { + case 'ANSWERED': + case 'DELETED': + case 'FLAGGED': + case 'NEW': + case 'OLD': + case 'RECENT': + case 'SEEN': + case 'UNANSWERED': + case 'UNDELETED': + case 'UNFLAGGED': + case 'UNSEEN': + $imapFilter .= $criteria .' '; + break; + + case 'BEFORE': + case 'ON': + case 'SINCE': + $imapFilter .= $criteria .' "'. date() .'" '; + break; + } + #} + # error_log("Filter: $imapFilter"); + if($imapFilter == '') { + return 'ALL'; + } else { + return trim($imapFilter); + #return 'CHARSET '. strtoupper(self::$displayCharset) .' '. trim($imapFilter); + } + } + + /** + * convert a mailboxname from displaycharset to urf7-imap + * + * @param string _folderName the foldername + * + * @returns string the converted foldername + */ + function decodeFolderName($_folderName) + { + return $GLOBALS['egw']->translation->convert($_folderName, self::$displayCharset, 'UTF7-IMAP'); + } + + function decodeMimePart($_mimeMessage, $_encoding, $_charset = '') + { + // decode the part + if (self::$debug) error_log("bofelamimail::decodeMimePart with $_encoding and $_charset:".print_r($_mimeMessage,true)); + switch ($_encoding) + { + case 'BASE64': + // use imap_base64 to decode, not any longer, as it is strict, and fails if it encounters invalid chars + return base64_decode($_mimeMessage); //imap_base64($_mimeMessage); + break; + case 'QUOTED-PRINTABLE': + // use imap_qprint to decode + return quoted_printable_decode($_mimeMessage); + break; + default: + // it is either not encoded or we don't know about it + return $_mimeMessage; + break; + } + } + + static function decode_header($_string) + { + return $GLOBALS['egw']->translation->decodeMailHeader($_string,self::$displayCharset); + } + + function decode_subject($_string) + { + #$string = $_string; + $_string = self::decode_header($_string); + if($_string=='NIL') + { + $_string = 'No Subject'; + } + return $_string; + + } + + /** + * decodes winmail.dat attachments + * + * @param int $_uid + * @param string $_partID + * @param int $_filenumber + * @return array + */ + function decode_winmail( $_uid, $_partID, $_filenumber=0 ) + { + $attachment = $this->getAttachment( $_uid, $_partID ); + + $dir = $GLOBALS['egw_info']['server']['temp_dir']."/fmail_winmail/$_uid"; + $mime = CreateObject('phpgwapi.mime_magic'); + if ( $attachment['type'] == 'APPLICATION/MS-TNEF' && $attachment['filename'] == 'winmail.dat' ) + { + // decode winmail.dat + if ( !file_exists( "$dir/winmail.dat" ) ) + { + @mkdir( $dir, 0700, true ); + file_put_contents( "$dir/winmail.dat", $attachment['attachment'] ); + } + if (exec("which tnef")) // use tnef if exsting, as it gives better results.. + { + exec( "cd $dir && tnef --save-body --overwrite -C $dir -f ./winmail.dat" ); + } + elseif (exec("which ytnef")) + { + exec( "cd $dir && ytnef -f . winmail.dat" ); + } + // list contents + $files = scandir( $dir ); + foreach ( $files as $num => $file ) + { + if ( filetype( "$dir/$file" ) != 'file' || $file == 'winmail.dat' ) continue; + if ( $_filenumber > 0 && $_filenumber != $num ) continue; + $type = $mime->filename2mime($file); + $attachments[] = array( + 'is_winmail' => $num, + 'name' => self::decode_header($file), + 'size' => filesize( "$dir/$file"), + 'partID' => $_partID, + 'mimeType' => $type, + 'type' => $type, + 'attachment' => $_filenumber > 0 ? file_get_contents("$dir/$file") : '', + ); + unlink($dir."/".$file); + } + if (file_exists($dir."/winmail.dat")) unlink($dir."/winmail.dat"); + if (file_exists($dir)) @rmdir($dir); + return $_filenumber > 0 ? $attachments[0] : $attachments; + } + return false; + } + + function deleteAccount($_hookValues) + { + $icServer = $this->mailPreferences->getIncomingServer(0); + if(is_a($icServer,'defaultimap')) { + $icServer->deleteAccount($_hookValues); + } + + $ogServer = $this->mailPreferences->getOutgoingServer(0); + if(is_a($ogServer,'defaultsmtp')) { + $ogServer->deleteAccount($_hookValues); + } + } + + /** + * delete a existing folder + * + * @param string _folderName the name of the folder to be deleted + * + * @returns bool true on success, false on failure + */ + function deleteFolder($_folderName) + { + $folderName = $this->_encodeFolderName($_folderName); + + $this->icServer->unsubscribeMailbox($folderName); + if ( PEAR::isError($this->icServer->deleteMailbox($folderName)) ) { + return false; + } + + return true; + } + + function deleteMessages($_messageUID, $_folder=NULL) + { + $msglist = ''; + $oldMailbox = ''; + if (is_null($_folder) || empty($_folder)) $_folder = $this->sessionData['mailbox']; + if(!is_array($_messageUID) || count($_messageUID) === 0) + { + if ($_messageUID=='all') + { + $_messageUID= null; + } + else + { + if (self::$debug) error_log(__METHOD__." no messages Message(s): ".implode(',',$_messageUID)); + return false; + } + } + + $deleteOptions = $this->mailPreferences->preferences['deleteOptions']; + $trashFolder = $this->mailPreferences->preferences['trashFolder']; + $draftFolder = $this->mailPreferences->preferences['draftFolder']; //$GLOBALS['egw_info']['user']['preferences']['felamimail']['draftFolder']; + $templateFolder = $this->mailPreferences->preferences['templateFolder']; //$GLOBALS['egw_info']['user']['preferences']['felamimail']['templateFolder']; + + if(($this->sessionData['mailbox'] == $trashFolder && $deleteOptions == "move_to_trash") || + ($this->sessionData['mailbox'] == $draftFolder)) { + $deleteOptions = "remove_immediately"; + } + if($this->icServer->getCurrentMailbox() != $_folder) { + $oldMailbox = $this->icServer->getCurrentMailbox(); + $this->icServer->selectMailbox($_folder); + } + + switch($deleteOptions) { + case "move_to_trash": + if(!empty($trashFolder)) { + if (self::$debug) error_log(implode(' : ', $_messageUID)); + if (self::$debug) error_log("$trashFolder <= ". $this->sessionData['mailbox']); + // copy messages + if ( PEAR::isError($this->icServer->copyMessages($trashFolder, $_messageUID, $_folder, true)) ) { + if (self::$debug) error_log(__METHOD__." failed to copy Message(s) to $trashFolder: ".implode(',',$_messageUID)); + return false; + } + // mark messages as deleted + if ( PEAR::isError($this->icServer->deleteMessages($_messageUID, true))) { + if (self::$debug) error_log(__METHOD__." failed to delete Message(s): ".implode(',',$_messageUID)); + return false; + } + // delete the messages finaly + $this->icServer->expunge(); + } + break; + + case "mark_as_deleted": + // mark messages as deleted + if ( PEAR::isError($this->icServer->deleteMessages($_messageUID, true))) { + if (self::$debug) error_log(__METHOD__." failed to mark as deleted for Message(s): ".implode(',',$_messageUID)); + return false; + } + break; + + case "remove_immediately": + // mark messages as deleted + if ( PEAR::isError($this->icServer->deleteMessages($_messageUID, true))) { + if (self::$debug) error_log(__METHOD__." failed to remove immediately Message(s): ".implode(',',$_messageUID)); + return false; + } + // delete the messages finaly + $this->icServer->expunge(); + break; + } + + if($oldMailbox != '') { + $this->icServer->selectMailbox($oldMailbox); + } + + return true; + } + + /** + * convert a mailboxname from utf7-imap to displaycharset + * + * @param string _folderName the foldername + * + * @returns string the converted string + */ + function encodeFolderName($_folderName) + { + return $GLOBALS['egw']->translation->convert($_folderName, 'UTF7-IMAP', self::$displayCharset); + } + +# function encodeHeader($_string, $_encoding='q') +# { +# switch($_encoding) { +# case "q": +# if(!preg_match("/[\x80-\xFF]/",$_string)) { +# // nothing to quote, only 7 bit ascii +# return $_string; +# } +# +# $string = imap_8bit($_string); +# $stringParts = explode("=\r\n",$string); +# while(list($key,$value) = each($stringParts)) { +# if(!empty($retString)) $retString .= " "; +# $value = str_replace(" ","_",$value); +# // imap_8bit does not convert "?" +# // it does not need, but it should +# $value = str_replace("?","=3F",$value); +# $retString .= "=?".strtoupper(self::$displayCharset). "?Q?". $value. "?="; +# } +# #exit; +# return $retString; +# break; +# default: +# return $_string; +# } +# } + function getFlags ($_messageUID) { + $flags = $this->icServer->getFlags($_messageUID, true); + if (PEAR::isError($flags)) { + return null; + } + return $flags; + } + + function getNotifyFlags ($_messageUID) { + $flags = $this->icServer->getFlags($_messageUID, true); + if (self::$debug) error_log(__METHOD__.$_messageUID.array2string($flags)); + if (PEAR::isError($flags)) { + return null; + } + if ( in_array('MDNSent',$flags[0]) ) + return true; + + if ( in_array('MDNnotSent',$flags[0]) ) + return false; + + return null; + } + + function flagMessages($_flag, $_messageUID) + { + #error_log("felamimail::bocompose::flagMessages"); + if(!is_array($_messageUID)) { + #return false; + if ($_messageUID=='all') + { + //all is an allowed value to be passed + } + else + { + $_messageUID=array($_messageUID); + } + } + + $this->icServer->selectMailbox($this->sessionData['mailbox']); + + switch($_flag) { + case "flagged": + $this->icServer->setFlags($_messageUID, '\\Flagged', 'add', true); + break; + case "read": + $this->icServer->setFlags($_messageUID, '\\Seen', 'add', true); + break; + case "forwarded": + $this->icServer->setFlags($_messageUID, '$Forwarded', 'add', true); + case "answered": + $this->icServer->setFlags($_messageUID, '\\Answered', 'add', true); + break; + case "unflagged": + $this->icServer->setFlags($_messageUID, '\\Flagged', 'remove', true); + break; + case "unread": + $this->icServer->setFlags($_messageUID, '\\Seen', 'remove', true); + $this->icServer->setFlags($_messageUID, '\\Answered', 'remove', true); + $this->icServer->setFlags($_messageUID, '$Forwarded', 'remove', true); + break; + case "mdnsent": + $this->icServer->setFlags($_messageUID, 'MDNSent', 'add', true); + break; + case "mdnnotsent": + $this->icServer->setFlags($_messageUID, 'MDNnotSent', 'add', true); + break; + } + + $this->sessionData['folderStatus'][$this->profileID][$this->sessionData['mailbox']]['uidValidity'] = 0; + $this->saveSessionData(); + } + + function _getSubStructure($_structure, $_partID) + { + $tempID = ''; + $structure = $_structure; + if (empty($_partID)) $_partID=1; + $imapPartIDs = explode('.',$_partID); + #error_log(print_r($structure,true)); + #error_log(print_r($_partID,true)); + + if($_partID != 1) { + foreach($imapPartIDs as $imapPartID) { + if(!empty($tempID)) { + $tempID .= '.'; + } + $tempID .= $imapPartID; + #error_log(print_r( "TEMPID: $tempID
    ",true)); + //_debug_array($structure); + if($structure->subParts[$tempID]->type == 'MESSAGE' && $structure->subParts[$tempID]->subType == 'RFC822' && + count($structure->subParts[$tempID]->subParts) == 1 && + $structure->subParts[$tempID]->subParts[$tempID]->type == 'MULTIPART' && + ($structure->subParts[$tempID]->subParts[$tempID]->subType == 'MIXED' || + $structure->subParts[$tempID]->subParts[$tempID]->subType == 'ALTERNATIVE' || + $structure->subParts[$tempID]->subParts[$tempID]->subType == 'RELATED' || + $structure->subParts[$tempID]->subParts[$tempID]->subType == 'REPORT')) + { + $structure = $structure->subParts[$tempID]->subParts[$tempID]; + } else { + $structure = $structure->subParts[$tempID]; + } + } + } + + if($structure->partID != $_partID) { + foreach($imapPartIDs as $imapPartID) { + if(!empty($tempID)) { + $tempID .= '.'; + } + $tempID .= $imapPartID; + //print "TEMPID: $tempID
    "; + //_debug_array($structure); + if($structure->subParts[$tempID]->type == 'MESSAGE' && $structure->subParts[$tempID]->subType == 'RFC822' && + count($structure->subParts[$tempID]->subParts) == 1 && + $structure->subParts[$tempID]->subParts[$tempID]->type == 'MULTIPART' && + ($structure->subParts[$tempID]->subParts[$tempID]->subType == 'MIXED' || + $structure->subParts[$tempID]->subParts[$tempID]->subType == 'ALTERNATIVE' || + $structure->subParts[$tempID]->subParts[$tempID]->subType == 'RELATED' || + $structure->subParts[$tempID]->subParts[$tempID]->subType == 'REPORT')) { + $structure = $structure->subParts[$tempID]->subParts[$tempID]; + } else { + $structure = $structure->subParts[$tempID]; + } + } + if($structure->partID != $_partID) { + error_log("bofelamimail::_getSubStructure(". __LINE__ .") partID's don't match"); + return false; + } + } + + return $structure; + } + + /* + * strip tags out of the message completely with their content + * param $_body is the text to be processed + * param $tag is the tagname which is to be removed. Note, that only the name of the tag is to be passed to the function + * without the enclosing brackets + * param $endtag can be different from tag but should be used only, if begin and endtag are known to be different e.g.: + */ + static function replaceTagsCompletley(&$_body,$tag,$endtag='',$addbracesforendtag=true) + { + translation::replaceTagsCompletley($_body,$tag,$endtag,$addbracesforendtag); + } + + static function getCleanHTML(&$_html, $usepurify = false) + { + // remove CRLF and TAB as it is of no use in HTML. + // but they matter in
    , so we rather don't
    +			//$_html = str_replace("\r\n",' ',$_html);
    +			//$_html = str_replace("\t",' ',$_html);
    +			//error_log($_html);
    +			self::replaceTagsCompletley($_html,'style'); // clean out empty or pagewide style definitions / left over tags
    +			self::replaceTagsCompletley($_html,'head'); // Strip out stuff in head	
    +			self::replaceTagsCompletley($_html,'!\[if','',false); // Strip out stuff in ifs	
    +			self::replaceTagsCompletley($_html,'!--\[if','',false); // Strip out stuff in ifs	
    +			//error_log($_html);
    +			// force the use of kses, as it is still have the edge over purifier with some stuff
    +			$usepurify = false;
    +			if ($usepurify)
    +			{
    +				// we may need a customized config, as we may allow external images, $GLOBALS['egw_info']['user']['preferences']['felamimail']['allowExternalIMGs']
    +
    +				$config = html::purifyCreateDefaultConfig();
    +				
    +				$config->set('Core.Encoding', (self::$displayCharset?self::$displayCharset:'UTF-8'));
    +				// maybe the two following lines are useful for caching???
    +				$config->set('HTML.DefinitionID', 'felamimail');
    +				$config->set('HTML.DefinitionRev', 1);
    +				// doctype and tidylevel
    +	 			$config->set('HTML.Doctype', 'XHTML 1.0 Transitional');
    +				$config->set('HTML.TidyLevel', 'light');
    +				// EnableID is needed for anchor tags
    +				$config->set('Attr.EnableID',true);
    +				// actual allowed tags and attributes
    +				$config->set('URI.AllowedSchemes', array('http'=>true, 'https'=>true, 'ftp'=>true, 'file'=>true, 'mailto' => true, 'cid'=>true));
    +				$config->set('AutoFormat.RemoveEmpty', true);
    +				$config->set('HTML.Allowed', 'br,p[align],b,i,u,s,em,pre,tt,strong,strike,center,div[align],hr[class|style],'.
    +							'font[size|color],'.
    +							'ul[type],ol[type|start],li,'.
    +							'h1,h2,h3,'.
    +							'span[class|style],'.
    +							'table[class|border|cellpadding|cellspacing|width|style|align|bgcolor|align],'.
    +							'tbody,thead,tfoot,colgroup,'.
    +							'col[width|span],'.
    +							'blockquote[class|cite|dir],'.
    +							'tr[class|style|align|bgcolor|align|valign],'.
    +							'td[class|colspan|rowspan|width|style|align|bgcolor|align|valign|nowrap],'.
    +							'th[class|colspan|rowspan|width|style|align|bgcolor|align|valign|nowrap],'.
    +							'a[href|target|name|title],'.
    +							'img[src|alt|title]');
    +				$DisableExternalResources = true;
    +				if ($GLOBALS['egw_info']['user']['preferences']['felamimail']['allowExternalIMGs']) $DisableExternalResources = false;
    +				$config->set('URI.DisableExternalResources',$DisableExternalResources);
    +				$config->set('Core.RemoveInvalidImg', false);
    +				//$config->set('Attr.DefaultInvalidImage', 'Image removed by htmlpurify');
    +				$config->set('Core.HiddenElements', array('script','style','head')); // strips script, style, head copletely
    +
    +				$config->set('Cache.SerializerPath', ($GLOBALS['egw_info']['server']['temp_dir']?$GLOBALS['egw_info']['server']['temp_dir']:sys_get_temp_dir()));
    +				//$config->set('HTML.MaxImgLength',null);
    +				$config->set('Cache.DefinitionImpl', null); // remove this later!
    +				//$purifier = new HTMLPurifier($config);
    +				//$_html = $purifier->purify( $_html );
    +				if (get_magic_quotes_gpc() === 1) $_html = stripslashes($_html);
    +				$_html = html::purify($_html,$config);
    +	            // no scripts allowed
    +	            // clean out comments , should not be needed as purify should do the job.
    +				$search = array(
    +					'@url\(http:\/\/[^\)].*?\)@si',  // url calls e.g. in style definitions
    +					'@@',         // Strip multi-line comments including CDATA 
    +	            );
    +	            //$_html = preg_replace($search,"",$_html);
    +	            // remove non printable chars
    +	            $_html = preg_replace('/([\000-\012])/','',$_html);
    +				//error_log($_html);
    +			}
    +			else
    +			{
    +				//echo $_html;exit;
    +				$kses = new kses();
    +				$kses->AddProtocol('cid');
    +				// since check protocoll is called for every value associated to an attribute we have to add color and background-color to the valid protocolls
    +				$kses->AddProtocol('color');
    +				$kses->AddProtocol('font-size');
    +				$kses->AddProtocol('background-color');
    +				#$kses->AddHTML('html', array(
    +				#		'xmlns' => array(),
    +				#		'lang' => array(),
    +				#	)
    +				#);
    +				#$kses->AddHTML('head');
    +				#$kses->AddHTML('body', array(
    +				#		'class' => array(),
    +				#		'id' => array(),
    +				#	)
    +				#);
    +				#$kses->AddHTML('meta', array(
    +				#		'http-equiv' => array(),
    +				#		'content' => array(),
    +				#	)
    +				#);
    +				#$kses->AddHTML('link',array(
    +				#		'rel' => array(), // ="stylesheet"
    +				#		'type' => array(), //="text/css"
    +				#		'href' => array(),
    +				#		'media' => array(),
    +				#	)
    +				#);
    +				$kses->AddHTML(
    +					'p', array(
    +						'align'	=> array('minlen' =>   1, 'maxlen' =>  10)
    +					)
    +				);
    +				$kses->AddHTML("tbody");
    +				$kses->AddHTML("thead");
    +				$kses->AddHTML("tt");
    +				$kses->AddHTML("br");
    +				$kses->AddHTML("b");
    +				$kses->AddHTML("u");
    +				$kses->AddHTML("s");
    +				$kses->AddHTML("i");
    +				$kses->AddHTML('em');
    +				$kses->AddHTML("strong");
    +				$kses->AddHTML("strike");
    +				$kses->AddHTML("center");
    +				$kses->AddHTML(
    +					"font",array(
    +						"color"	=> array('maxlen' => 20),
    +						"size"=>array('maxlen'=>2)
    +					)
    +				);
    +				$kses->AddHTML(
    +					"hr",array(
    +						"class"		=> array('maxlen' => 20),
    +						"style"		=> array('minlen' => 1),
    +					)
    +				);
    +				$kses->AddHTML(
    +					"div",array(
    +				#		'class' => array(),
    +						'align' => array('maxlen' => 10)
    +					)
    +				);
    +				$kses->AddHTML("ul");
    +				$kses->AddHTML(
    +					"ol",array(
    +						"type"	=> array('maxlen' => 20)
    +					)
    +				);
    +				$kses->AddHTML("li");
    +				$kses->AddHTML("h1");
    +				$kses->AddHTML("h2");
    +				$kses->AddHTML("h3");
    +				$kses->AddHTML(
    +					"style",array(
    +						"type"	=> array('maxlen' => 20),
    +						"color"	=> array('maxlen' => 20),
    +						"background-color" => array('maxlen' => 20),
    +						"background" => array('maxlen' => 5),
    +					)
    +				);
    +
    +				$kses->AddHTML("select");
    +				$kses->AddHTML(
    +					"option",array(
    +						"value" => array('maxlen' => 45),
    +						"selected" => array()
    +					)
    +				);
    +
    +				$kses->AddHTML(
    +					"a", array(
    +						"href" 		=> array('maxlen' => 348, 'minlen' => 10),
    +						"name" 		=> array('minlen' => 2),
    +						'target'	=> array('maxlen' => 10)
    +					)
    +				);
    +
    +				$kses->AddHTML(
    +					"pre", array(
    +						"wrap" => array('maxlen' => 10)
    +					)
    +				);
    +
    +				//      Allows 'td' tag with colspan|rowspan|class|style|width|nowrap attributes,
    +				//              colspan has minval of   2       and maxval of 5
    +				//              rowspan has minval of   3       and maxval of 6
    +				//              class   has minlen of   1 char  and maxlen of   10 chars
    +				//              style   has minlen of  10 chars and maxlen of 100 chars
    +				//              width   has maxval of 100
    +				//              nowrap  is valueless
    +				$kses->AddHTML(
    +					"table",array(
    +						"class"   => array("minlen" =>   1, 'maxlen' =>  20),
    +						"border"   => array("minlen" =>   1, 'maxlen' =>  10),
    +						"cellpadding"   => array("minlen" =>   0, 'maxlen' =>  10),
    +						"cellspacing"   => array("minlen" =>   0, 'maxlen' =>  10),
    +						"width"   => array("maxlen" => 5),
    +						"style"   => array('minlen' =>  10, 'maxlen' => 100),
    +						"bgcolor"   => array('maxlen' =>  10),
    +						"align"   => array('maxlen' =>  10),
    +						"valign"   => array('maxlen' =>  10),
    +						"bordercolor"   => array('maxlen' =>  10)
    +					)
    +				);
    +				$kses->AddHTML(
    +					"tr",array(
    +						"colspan"	=> array('minval' =>   2, 'maxval' =>   5),
    +						"rowspan"	=> array('minval' =>   3, 'maxval' =>   6),
    +						"class"		=> array("minlen" =>   1, 'maxlen' =>  20),
    +						"width"		=> array("maxlen" => 5),
    +						"style"		=> array('minlen' =>  10, 'maxlen' => 100),
    +						"align"		=> array('maxlen' =>  10),
    +						'bgcolor'	=> array('maxlen' => 10),
    +						"valign"	=> array('maxlen' =>  10),
    +						"nowrap"	=> array('valueless' => 'y')
    +					)
    +				);
    +				$kses->AddHTML(
    +					"td",array(
    +						"colspan" => array('minval' =>   2, 'maxval' =>   5),
    +						"rowspan" => array('minval' =>   3, 'maxval' =>   6),
    +						"class"   => array("minlen" =>   1, 'maxlen' =>  20),
    +						"width"   => array("maxlen" => 5),
    +						"style"   => array('minlen' =>  10, 'maxlen' => 100),
    +						"align"   => array('maxlen' =>  10),
    +						'bgcolor' => array('maxlen' => 10),
    +						"valign"   => array('maxlen' =>  10),
    +						"nowrap"  => array('valueless' => 'y')
    +					)
    +				);
    +				$kses->AddHTML(
    +					"th",array(
    +						"colspan" => array('minval' =>   2, 'maxval' =>   5),
    +						"rowspan" => array('minval' =>   3, 'maxval' =>   6),
    +						"class"   => array("minlen" =>   1, 'maxlen' =>  20),
    +						"width"   => array("maxlen" => 5),
    +						"style"   => array('minlen' =>  10, 'maxlen' => 100),
    +						"align"   => array('maxlen' =>  10),
    +						"valign"   => array('maxlen' =>  10),
    +						"nowrap"  => array('valueless' => 'y')
    +					)
    +				);
    +				$kses->AddHTML(
    +					"span",array(
    +						"class"   => array("minlen" =>   1, 'maxlen' =>  20),
    +						"style"	  => array('minlen' =>  5, 'maxlen' => 100)
    +					)
    +				);
    +				$kses->AddHTML(
    +					"blockquote",array(
    +						"class"	=> array("minlen" =>   1, 'maxlen' =>  20),
    +						"style"	=> array("minlen" =>   1),
    +						"cite"	=> array('maxlen' => 30),
    +						"type"	=> array('maxlen' => 10),
    +						"dir"	=> array("minlen" =>   1, 'maxlen' =>  10)
    +					)
    +				);
    +				$kses->AddHTML(
    +					'img',array(
    +						"src"		=> array("minlen" =>   4, 'maxlen' =>  384, $GLOBALS['egw_info']['user']['preferences']['felamimail']['allowExternalIMGs'] ? '' : 'match' => '/^cid:.*/'),
    +						"align"		=> array("minlen" =>   1),
    +						"border"	=> array('maxlen' => 30),
    +						"width"		=> array("minlen" =>   1, 'maxlen' =>  3),
    +						"height"	=> array("minlen" =>   1, 'maxlen' =>  3),
    +					)
    +				);
    +
    +				// no scripts allowed
    +				// clean out comments
    +				$search = array(
    +					'@@',         // Strip multi-line comments including CDATA 
    +					'@url\(http:\/\/[^\)].*?\)@si',  // url calls e.g. in style definitions
    +				);
    +				//error_log(__METHOD__.$_html);
    +				$_html = preg_replace($search,"",$_html);
    +				// do the kses clean out first, to avoid general problems with content later on
    +				$_html = $kses->Parse($_html);
    +				// remove non printable chars
    +				$_html = preg_replace('/([\000-\012])/','',$_html);
    +				//error_log($_html);
    +			}
    +		}
    +
    +		/**
    +		* replace emailaddresses enclosed in <> (eg.: ) with the emailaddress only (e.g: me@you.de)
    +		* always returns 1
    +		*/
    +		static function replaceEmailAdresses(&$text)
    +		{
    +			return translation::replaceEmailAdresses($text);
    +		}
    +
    +		static function convertHTMLToText($_html,$stripcrl=false,$stripalltags=true)
    +		{
    +			return translation::convertHTMLToText($_html,self::$displayCharset,$stripcrl,$stripalltags);
    +		}
    +
    +		/**
    +		* retrieve a attachment
    +		*
    +		* @param int _uid the uid of the message
    +		* @param string _partID the id of the part, which holds the attachment
    +		* @param int _winmail_nr winmail.dat attachment nr.
    +		*
    +		* @returns array
    +		*/
    +		function getAttachment($_uid, $_partID, $_winmail_nr=0)
    +		{
    +			// parse message structure
    +			$structure = $this->icServer->getStructure($_uid, true);
    +			if($_partID != '') {
    +				$structure = $this->_getSubStructure($structure, $_partID);
    +			}
    +			$filename = self::getFileNameFromStructure($structure);
    +			$attachment = $this->icServer->getBodyPart($_uid, $_partID, true);
    +
    +			switch ($structure->encoding) {
    +				case 'BASE64':
    +					// use imap_base64 to decode
    +					$attachment = imap_base64($attachment);
    +					break;
    +				case 'QUOTED-PRINTABLE':
    +					// use imap_qprint to decode
    +					#$attachment = imap_qprint($attachment);
    +					$attachment = quoted_printable_decode($attachment);
    +					break;
    +				default:
    +					// it is either not encoded or we don't know about it
    +			}
    +
    +			$attachmentData = array(
    +				'type'		=> $structure->type .'/'. $structure->subType,
    +				'filename'	=> $filename,
    +				'attachment'	=> $attachment
    +				);
    +			// try guessing the mimetype, if we get the application/octet-stream
    +			if (strtolower($attachmentData['type']) == 'application/octet-stream') $attachmentData['type'] = mime_magic::filename2mime($attachmentData['filename']);
    +			# if the attachment holds a winmail number and is a winmail.dat then we have to handle that.
    +			if ( $filename == 'winmail.dat' && $_winmail_nr > 0 &&
    +				( $wmattach = $this->decode_winmail( $_uid, $_partID, $_winmail_nr ) ) )
    +			{
    +				$attachmentData = array(
    +					'type'       => $wmattach['type'],
    +					'filename'   => $wmattach['name'],
    +					'attachment' => $wmattach['attachment'],
    + 				);
    +			}
    +			return $attachmentData;
    +		}
    +
    +		// this function is based on a on "Building A PHP-Based Mail Client"
    +		// http://www.devshed.com
    +		// fetch a specific attachment from a message
    +		function getAttachmentByCID($_uid, $_cid, $_part)
    +		{
    +			$partID = false;
    +			#error_log("getAttachmentByCID:$_uid, $_cid, $_part");
    +			$attachments = $this->getMessageAttachments($_uid, $_part);
    +			foreach($attachments as $attachment) {
    +				#error_log(print_r($attachment,true));
    +				if(strpos($attachment['cid'], $_cid) !== false || strpos($cid, $attachment['cid']) !== false) {
    +					$partID = $attachment['partID'];
    +					break;
    +				}
    +			}
    +
    +			#error_log( "PARTID:$_cid $partID
    "); #exit; + + if($partID == false) { + return false; + } + + // parse message structure + $structure = $this->icServer->getStructure($_uid, true); + $structure = $this->_getSubStructure($structure, $partID); + $filename = self::getFileNameFromStructure($structure); + $attachment = $this->icServer->getBodyPart($_uid, $partID, true); + + switch ($structure->encoding) { + case 'BASE64': + // use imap_base64 to decode + $attachment = imap_base64($attachment); + break; + case 'QUOTED-PRINTABLE': + // use imap_qprint to decode + #$attachment = imap_qprint($attachment); + $attachment = quoted_printable_decode($attachment); + break; + default: + // it is either not encoded or we don't know about it + } + + $attachmentData = array( + 'type' => $structure->type .'/'. $structure->subType, + 'filename' => $filename, + 'attachment' => $attachment + ); + // try guessing the mimetype, if we get the application/octet-stream + if (strtolower($attachmentData['type']) == 'application/octet-stream') $attachmentData['type'] = mime_magic::filename2mime($attachmentData['filename']); + + return $attachmentData; + } + + function getEMailProfile() + { + $config = CreateObject('phpgwapi.config','felamimail'); + $config->read_repository(); + $felamimailConfig = $config->config_data; + + #_debug_array($felamimailConfig); + + if(!isset($felamimailConfig['profileID'])){ + return -1; + } else { + return intval($felamimailConfig['profileID']); + } + } + + function getErrorMessage() + { + return $this->icServer->_connectionErrorObject->message; + } + + /** + * get IMAP folder status + * + * returns an array information about the imap folder + * + * @param _folderName string the foldername + * + * @returns array + */ + function getFolderStatus($_folderName) + { + if (self::$debug) error_log(__METHOD__." called with:".$_folderName); + $retValue = array(); + $retValue['subscribed'] = false; + if(!$icServer = $this->mailPreferences->getIncomingServer(0)) { + return false; + } + + // does the folder exist??? + $folderInfo = $this->icServer->getMailboxes('', $_folderName, true); + if(is_a($folderInfo, 'PEAR_Error') || !is_array($folderInfo[0])) { + if (self::$debug) error_log(__METHOD__." returned Info for folder $_folderName:".print_r($folderInfo->message,true)); + return false; + } + #if(!is_array($folderInfo[0])) { + # return false; + #} + + $subscribedFolders = $this->icServer->listsubscribedMailboxes('', $_folderName); + if(is_array($subscribedFolders) && count($subscribedFolders) == 1) { + $retValue['subscribed'] = true; + } + + $retValue['delimiter'] = $folderInfo[0]['HIERACHY_DELIMITER']; + $retValue['attributes'] = $folderInfo[0]['ATTRIBUTES']; + $shortNameParts = explode($retValue['delimiter'], $_folderName); + $retValue['shortName'] = array_pop($shortNameParts); + $retValue['displayName'] = $this->encodeFolderName($_folderName); + $retValue['shortDisplayName'] = $this->encodeFolderName($retValue['shortName']); + if(strtoupper($retValue['shortName']) == 'INBOX') { + $retValue['displayName'] = lang('INBOX'); + $retValue['shortDisplayName'] = lang('INBOX'); + } + // translate the automatic Folders (Sent, Drafts, ...) like the INBOX + elseif (in_array($retValue['shortName'],self::$autoFolders)) + { + $retValue['displayName'] = $retValue['shortDisplayName'] = lang($retValue['shortName']); + } + + if ( PEAR::isError($folderStatus = $this->icServer->getStatus($_folderName)) ) { + /*if ($folderStatus = $this->bofelamimail->getMailBoxCounters($_folderName)) { + $retValue['messages'] = $folderStatus->messages; + $retValue['recent'] = $folderStatus->recent; + $retValue['uidnext'] = $folderStatus->uidnext; + $retValue['unseen'] = $folderStatus->unseen; + $retValue['uidvalidity']= $folderStatus->uidvalidity; + */ + //_debug_array($folderStatus); + if (self::$debug) error_log(__METHOD__." returned folderStatus for Folder $_folderName:".print_r($folderStatus->message,true)); + } else { + $retValue['messages'] = $folderStatus['MESSAGES']; + $retValue['recent'] = $folderStatus['RECENT']; + $retValue['uidnext'] = $folderStatus['UIDNEXT']; + $retValue['uidvalidity'] = $folderStatus['UIDVALIDITY']; + $retValue['unseen'] = $folderStatus['UNSEEN']; + } + + return $retValue; + } + + /** + * get IMAP folder objects + * + * returns an array of IMAP folder objects. Put INBOX folder in first + * position. Preserves the folder seperator for later use. The returned + * array is indexed using the foldername. + * + * @param _subscribedOnly boolean get subscribed or all folders + * @param _getCounters boolean get get messages counters + * + * @returns array with folder objects. eg.: INBOX => {inbox object} + */ + function getFolderObjects($_subscribedOnly=false, $_getCounters=false) + { + $isUWIMAP = false; + + $delimiter = $this->getHierarchyDelimiter(); + + $inboxData = new stdClass; + $inboxData->name = 'INBOX'; + $inboxData->folderName = 'INBOX'; + $inboxData->displayName = lang('INBOX'); + $inboxData->delimiter = $delimiter; + $inboxData->shortFolderName = 'INBOX'; + $inboxData->shortDisplayName = lang('INBOX'); + $inboxData->subscribed = true; + if($_getCounters == true) { + /* + $folderStatus = $this->icServer->getStatus('INBOX'); + + $status = new stdClass; + $status->messages = $folderStatus['MESSAGES']; + $status->unseen = $folderStatus['UNSEEN']; + $status->recent = $folderStatus['RECENT']; + + $inboxData->counter = $status; + */ + $inboxData->counter = self::getMailBoxCounters('INBOX'); + } + // force unsubscribed by preference showAllFoldersInFolderPane + if ($_subscribedOnly == true && + isset($this->mailPreferences->preferences['showAllFoldersInFolderPane']) && + $this->mailPreferences->preferences['showAllFoldersInFolderPane']==1) + { + $_subscribedOnly = false; + } + #$inboxData->attributes = 64; + $inboxFolderObject = array('INBOX' => $inboxData); + #_debug_array($folders); + + $nameSpace = $this->icServer->getNameSpaces(); + #_debug_array($nameSpace); + #_debug_array($delimiter); + if(isset($nameSpace['#mh/'])) { + // removed the uwimap code + // but we need to reintroduce him later + // uw imap does not return the attribute of a folder, when requesting subscribed folders only + // dovecot has the same problem too + } else { + if (is_array($nameSpace)) { + foreach($nameSpace as $type => $singleNameSpace) { + if($type == 'personal' && ($singleNameSpace[2]['name'] == '#mh/' || count($nameSpace) == 1) && $this->icServer->mailboxExist('Mail')) { + // uw-imap server with mailbox prefix or dovecot maybe + $foldersNameSpace[$type]['prefix'] = 'Mail'; + } elseif($type == 'personal' && ($singleNameSpace[2]['name'] == '#mh/' || count($nameSpace) == 1) && $this->icServer->mailboxExist('mail')) { + // uw-imap server with mailbox prefix or dovecot maybe + $foldersNameSpace[$type]['prefix'] = 'mail'; + } else { + $foldersNameSpace[$type]['prefix'] = $singleNameSpace[0]['name']; + } + #echo "############## ".print_r($singleNameSpace,true)." ###################
    "; + $foldersNameSpace[$type]['delimiter'] = $delimiter; + + if(is_array($singleNameSpace[0])) { + // fetch and sort the subscribed folders + $subscribedMailboxes = $this->icServer->listsubscribedMailboxes($foldersNameSpace[$type]['prefix']); + if (empty($subscribedMailboxes) && $type == 'shared') $subscribedMailboxes = $this->icServer->listsubscribedMailboxes('',0); + + #echo "subscribedMailboxes";_debug_array($subscribedMailboxes); + if( PEAR::isError($subscribedMailboxes) ) { + continue; + } + $foldersNameSpace[$type]['subscribed'] = $subscribedMailboxes; + if (is_array($foldersNameSpace[$type]['subscribed'])) sort($foldersNameSpace[$type]['subscribed']); + #_debug_array($foldersNameSpace); + if ($_subscribedOnly == true) { + $foldersNameSpace[$type]['all'] = (is_array($foldersNameSpace[$type]['subscribed']) ? $foldersNameSpace[$type]['subscribed'] :array()); + continue; + } + // only check for Folder in FolderMaintenance for Performance Reasons + if(!$_subscribedOnly) { + foreach ((array)$foldersNameSpace[$type]['subscribed'] as $folderName) + { + //echo __METHOD__."Checking $folderName for existence
    "; + if (!self::folderExists($folderName)) { + echo("eMail Folder $folderName failed to exist; should be unsubscribed; Trying ..."); + error_log(__METHOD__."-> $folderName failed to be here; should be unsubscribed"); + if (self::subscribe($folderName, false)) + { + echo " success."."
    " ; + } else { + echo " failed."."
    "; + } + } + } + } + + // fetch and sort all folders + #echo $type.'->'.$foldersNameSpace[$type]['prefix'].'->'.($type=='shared'?0:2)."
    "; + $allMailboxesExt = $this->icServer->getMailboxes($foldersNameSpace[$type]['prefix'],2,true); + if (empty($allMailboxesExt) && $type == 'shared') $allMailboxesExt = $this->icServer->getMailboxes('',0,true); + if( PEAR::isError($allMailboxesExt) ) { + #echo __METHOD__;_debug_array($allMailboxesExt); + continue; + } + foreach ($allMailboxesExt as $mbx) { + #echo __METHOD__;_debug_array($mbx); + $allMailBoxesExtSorted[$mbx['MAILBOX']] = $mbx; + } + if (is_array($allMailBoxesExtSorted)) ksort($allMailBoxesExtSorted); + #_debug_array($allMailBoxesExtSorted); + $allMailboxes = array(); + foreach ((array)$allMailBoxesExtSorted as $mbx) { + #echo $mbx['MAILBOX']."
    "; + if (in_array('\HasChildren',$mbx["ATTRIBUTES"]) || in_array('\Haschildren',$mbx["ATTRIBUTES"])) { + unset($buff); + //$buff = $this->icServer->getMailboxes($mbx['MAILBOX'].$delimiter,0,false); + if (!in_array($mbx['MAILBOX'],$allMailboxes)) $buff = self::getMailBoxesRecursive($mbx['MAILBOX'],$delimiter,$foldersNameSpace[$type]['prefix'],1); + if( PEAR::isError($buff) ) { + continue; + } + #_debug_array($buff); + if (is_array($buff)) $allMailboxes = array_merge($allMailboxes,$buff); + } + if (!in_array($mbx['MAILBOX'],$allMailboxes)) $allMailboxes[] = $mbx['MAILBOX']; + #echo "Result:";_debug_array($allMailboxes); + } + $foldersNameSpace[$type]['all'] = $allMailboxes; + if (is_array($foldersNameSpace[$type]['all'])) sort($foldersNameSpace[$type]['all']); + } + } + } + // check for autocreated folders + if(isset($foldersNameSpace['personal']['prefix'])) { + $personalPrefix = $foldersNameSpace['personal']['prefix']; + $personalDelimiter = $foldersNameSpace['personal']['delimiter']; + if(!empty($personalPrefix)) { + if(substr($personalPrefix, -1) != $personalDelimiter) { + $folderPrefix = $personalPrefix . $personalDelimiter; + } else { + $folderPrefix = $personalPrefix; + } + } + if ($this->mailPreferences->preferences['notavailableautofolders'] && !empty($this->mailPreferences->preferences['notavailableautofolders'])) + { + $foldersToCheck = array_diff(self::$autoFolders,explode(',',$this->mailPreferences->preferences['notavailableautofolders'])); + } else { + $foldersToCheck = self::$autoFolders; + } + #echo "foldersToCheck:";_debug_array($foldersToCheck); + foreach($foldersToCheck as $personalFolderName) { + $folderName = (!empty($personalPrefix)) ? $folderPrefix.$personalFolderName : $personalFolderName; + if(!is_array($foldersNameSpace['personal']['all']) || !in_array($folderName, $foldersNameSpace['personal']['all'])) { + $createfolder = true; + switch($folderName) + { + case 'Drafts': // => Entwürfe + if ($this->mailPreferences->preferences['draftFolder'] && $this->mailPreferences->preferences['draftFolder']=='none') + $createfolder=false; + break; + case 'Junk': //] => Spammails + if ($this->mailPreferences->preferences['junkFolder'] && $this->mailPreferences->preferences['junkFolder']=='none') + $createfolder=false; + break; + case 'Sent': //] => Gesendet + if ($this->mailPreferences->preferences['sentFolder'] && $this->mailPreferences->preferences['sentFolder']=='none') + $createfolder=false; + break; + case 'Trash': //] => Papierkorb + if ($this->mailPreferences->preferences['trashFolder'] && $this->mailPreferences->preferences['trashFolder']=='none') + $createfolder=false; + break; + case 'Templates': //] => Vorlagen + if ($this->mailPreferences->preferences['templateFolder'] && $this->mailPreferences->preferences['templateFolder']=='none') + $createfolder=false; + break; + } + if($createfolder === true && $this->createFolder('', $folderName, true)) { + $foldersNameSpace['personal']['all'][] = $folderName; + $foldersNameSpace['personal']['subscribed'][] = $folderName; + } else { + #print "FOLDERNAME failed: $folderName
    "; + } + } + } + } + } + #echo "
    FolderNameSpace To Process:";_debug_array($foldersNameSpace); + foreach( array('personal', 'others', 'shared') as $type) { + if(isset($foldersNameSpace[$type])) { + if($_subscribedOnly) { + if( !PEAR::isError($foldersNameSpace[$type]['subscribed']) ) $listOfFolders = $foldersNameSpace[$type]['subscribed']; + } else { + if( !PEAR::isError($foldersNameSpace[$type]['all'])) $listOfFolders = $foldersNameSpace[$type]['all']; + } + foreach((array)$listOfFolders as $folderName) { + //echo "
    FolderToCheck:$folderName
    "; + if($_subscribedOnly && !in_array($folderName, $foldersNameSpace[$type]['all'])) { + #echo "$folderName failed to be here
    "; + continue; + } + $folderParts = explode($delimiter, $folderName); + $shortName = array_pop($folderParts); + + $folderObject = new stdClass; + $folderObject->delimiter = $delimiter; + $folderObject->folderName = $folderName; + $folderObject->shortFolderName = $shortName; + if(!$_subscribedOnly) { + #echo $folderName."->".$type."
    "; + #_debug_array($foldersNameSpace[$type]['subscribed']); + $folderObject->subscribed = in_array($folderName, $foldersNameSpace[$type]['subscribed']); + } + + if($_getCounters == true) { + /* + $folderStatus = $this->icServer->getStatus($folderName); + #echo "
    FolderStatus:";_debug_array($folderStatus); + if(is_array($folderStatus)) { + $status = new stdClass; + $status->messages = $folderStatus['MESSAGES']; + $status->unseen = $folderStatus['UNSEEN']; + $status->recent = $folderStatus['RECENT']; + + $folderObject->counter = $status; + } + */ + $folderObject->counter = $this->bofelamimail->getMailBoxCounters($folderName); + } + + if(strtoupper($folderName) == 'INBOX') { + $folderName = 'INBOX'; + $folderObject->folderName = 'INBOX'; + $folderObject->shortFolderName = 'INBOX'; + $folderObject->displayName = lang('INBOX'); + $folderObject->shortDisplayName = lang('INBOX'); + $folderObject->subscribed = true; + // translate the automatic Folders (Sent, Drafts, ...) like the INBOX + } elseif (in_array($shortName,self::$autoFolders)) { + $tmpfolderparts = explode($delimiter,$folderObject->folderName); + array_pop($tmpfolderparts); + $folderObject->displayName = $this->encodeFolderName(implode($delimiter,$tmpfolderparts).$delimiter.lang($shortName)); + $folderObject->shortDisplayName = lang($shortName); + unset($tmpfolderparts); + } else { + $folderObject->displayName = $this->encodeFolderName($folderObject->folderName); + $folderObject->shortDisplayName = $this->encodeFolderName($shortName); + } + $folderName = $folderName; + if (in_array($shortName,self::$autoFolders)) { + $autoFolderObjects[$folderName] = $folderObject; + } else { + $folders[$folderName] = $folderObject; + } + } + } + } + if (is_array($autoFolderObjects)) { + uasort($autoFolderObjects,array($this,"sortByAutoFolderPos")); + } + if (is_array($folders)) uasort($folders,array($this,"sortByDisplayName")); + //$folders2return = array_merge($autoFolderObjects,$folders); + //_debug_array($folders2return); #exit; + return array_merge($inboxFolderObject,(array)$autoFolderObjects,(array)$folders); + } + + function sortByDisplayName($a,$b) + { + // 0, 1 und -1 + return strcasecmp($a->displayName,$b->displayName); + } + + function sortByAutoFolderPos($a,$b) + { + // 0, 1 und -1 + $pos1 = array_search($a->shortFolderName,self::$autoFolders); + $pos2 = array_search($b->shortFolderName,self::$autoFolders); + if ($pos1 == $pos2) return 0; + return ($pos1 < $pos2) ? -1 : 1; + } + + function getMailBoxCounters($folderName) + { + $folderStatus = $this->icServer->getStatus($folderName); + #echo "
    FolderStatus:";_debug_array($folderStatus); + if ( PEAR::isError($folderStatus)) { + if (self::$debug) error_log(__METHOD__." returned FolderStatus for Folder $folderName:".print_r($folderStatus->message,true)); + return false; + } + if(is_array($folderStatus)) { + $status = new stdClass; + $status->messages = $folderStatus['MESSAGES']; + $status->unseen = $folderStatus['UNSEEN']; + $status->recent = $folderStatus['RECENT']; + $status->uidnext = $folderStatus['UIDNEXT']; + $status->uidvalidity = $folderStatus['UIDVALIDITY']; + + return $status; + } + return false; + } + + function getMailBoxesRecursive($_mailbox, $delimiter, $prefix, $reclevel=0) + { + #echo __METHOD__." retrieve SubFolders for $_mailbox$delimiter
    "; + $maxreclevel=25; + if ($reclevel > $maxreclevel) { + error_log( __METHOD__." Recursion Level Exeeded ($reclevel) while looking up $_mailbox$delimiter "); + return array(); + } + $reclevel++; + // clean up douple delimiters + $_mailbox = preg_replace('~'.($delimiter == '.' ? "\\".$delimiter:$delimiter).'+~s',$delimiter,$_mailbox); + //get that mailbox in question + $mbx = $this->icServer->getMailboxes($_mailbox,1,true); + #_debug_array($mbx); + if (is_array($mbx[0]["ATTRIBUTES"]) && (in_array('\HasChildren',$mbx[0]["ATTRIBUTES"]) || in_array('\Haschildren',$mbx[0]["ATTRIBUTES"]))) { + // if there are children fetch them + #echo $mbx[0]['MAILBOX']."
    "; + unset($buff); + $buff = $this->icServer->getMailboxes($mbx[0]['MAILBOX'].($mbx[0]['MAILBOX'] == $prefix ? '':$delimiter),2,false); + //$buff = $this->icServer->getMailboxes($mbx[0]['MAILBOX'],2,false); + #_debug_array($buff); + if( PEAR::isError($buff) ) { + if (self::$debug) error_log(__METHOD__." Error while retrieving Mailboxes for:".$mbx[0]['MAILBOX'].$delimiter."."); + return array(); + } else { + $allMailboxes = array(); + foreach ($buff as $mbxname) { + $mbxname = preg_replace('~'.($delimiter == '.' ? "\\".$delimiter:$delimiter).'+~s',$delimiter,$mbxname); + #echo "About to recur in level $reclevel:".$mbxname."
    "; + if ( $mbxname != $mbx[0]['MAILBOX'] && $mbxname != $prefix) $allMailboxes = array_merge($allMailboxes, self::getMailBoxesRecursive($mbxname, $delimiter, $prefix, $reclevel)); + } + if (!(in_array('\NoSelect',$mbx[0]["ATTRIBUTES"]) || in_array('\Noselect',$mbx[0]["ATTRIBUTES"]))) $allMailboxes[] = $mbx[0]['MAILBOX']; + return $allMailboxes; + } + } else { + return array($_mailbox); + } + } + + function getMimePartCharset($_mimePartObject) + { + $charSet = 'iso-8859-1'; + + if(is_array($_mimePartObject->parameters)) { + if(isset($_mimePartObject->parameters['CHARSET'])) { + $charSet = $_mimePartObject->parameters['CHARSET']; + } + } + + return $charSet; + } + + function getMultipartAlternative($_uid, $_structure, $_htmlMode) + { + // a multipart/alternative has exactly 2 parts (text and html OR text and something else) + // sometimes there are 3 parts, when there is an ics/ical attached/included-> we want to show that + // as attachment AND as abstracted ical information (we use our notification style here). + $partText = false; + $partHTML = false; + if (self::$debug) _debug_array($_structure); + foreach($_structure as $mimePart) { + if($mimePart->type == 'TEXT' && ($mimePart->subType == 'PLAIN' || $mimePart->subType == 'CALENDAR') && $mimePart->bytes > 0) { + if ($mimePart->subType == 'CALENDAR' && $partText === false) $partText = $mimePart; // only if there is no partText set already + if ($mimePart->subType == 'PLAIN') $partText = $mimePart; + } elseif($mimePart->type == 'TEXT' && $mimePart->subType == 'HTML' && $mimePart->bytes > 0) { + $partHTML = $mimePart; + } elseif ($mimePart->type == 'MULTIPART' && $mimePart->subType == 'RELATED' && is_array($mimePart->subParts)) { + // in a multipart alternative we treat the multipart/related as html part + #$partHTML = array($mimePart); + error_log(__METHOD__." process MULTIPART/RELATED with array as subparts"); + $partHTML = $mimePart; + } + } + + switch($_htmlMode) { + case 'always_display': + if(is_object($partHTML)) { + if($partHTML->subType == 'RELATED') { + return $this->getMultipartRelated($_uid, $partHTML, 'always_display'); + } else { + return $this->getTextPart($_uid, $partHTML, 'always_display'); + } + } elseif(is_object($partText)) { + return $this->getTextPart($_uid, $partText); + } + + break; + case 'only_if_no_text': + if(is_object($partText)) { + return $this->getTextPart($_uid, $partText); + } elseif(is_object($partHTML)) { + if($partHTML->type) { + return $this->getMultipartRelated($_uid, $partHTML, $_htmlMode); + } else { + return $this->getTextPart($_uid, $partHTML, 'always_display'); + } + } + + break; + + default: + if(is_object($partText)) { + return $this->getTextPart($_uid, $partText); + } else { + $bodyPart = array( + 'body' => lang("no plain text part found"), + 'mimeType' => 'text/plain', + 'charSet' => self::$displayCharset, + ); + } + + break; + } + + return $bodyPart; + } + + function getMultipartMixed($_uid, $_structure, $_htmlMode) + { + if (self::$debug) echo __METHOD__."$_uid, $_htmlMode
    "; + $bodyPart = array(); + if (self::$debug) _debug_array($_structure); + if (!is_array($_structure)) $_structure = array($_structure); + foreach($_structure as $part) { + if (self::$debug) echo $part->type."/".$part->subType."
    "; + switch($part->type) { + case 'MULTIPART': + switch($part->subType) { + case 'ALTERNATIVE': + $bodyPart[] = $this->getMultipartAlternative($_uid, $part->subParts, $_htmlMode); + break; + + case 'MIXED': + case 'SIGNED': + $bodyPart = array_merge($bodyPart, $this->getMultipartMixed($_uid, $part->subParts, $_htmlMode)); + break; + + case 'RELATED': + $bodyPart = array_merge($bodyPart, $this->getMultipartRelated($_uid, $part->subParts, $_htmlMode)); + break; + } + break; + + case 'TEXT': + switch($part->subType) { + case 'PLAIN': + case 'HTML': + case 'CALENDAR': // inline ics/ical files + if($part->disposition != 'ATTACHMENT') { + $bodyPart[] = $this->getTextPart($_uid, $part, $_htmlMode); + } + break; + } + break; + + case 'MESSAGE': + if($part->subType == 'delivery-status') { + $bodyPart[] = $this->getTextPart($_uid, $part); + } + break; + + default: + // do nothing + // the part is a attachment + #$bodyPart[] = $this->getMessageBody($_uid, $_htmlMode, $part->partID, $part); + #if (!($part->type == 'TEXT' && ($part->subType == 'PLAIN' || $part->subType == 'HTML'))) { + # $bodyPart[] = $this->getMessageAttachments($_uid, $part->partID, $part); + #} + } + } + + return $bodyPart; + } + + function getMultipartRelated($_uid, $_structure, $_htmlMode) + { + return $this->getMultipartMixed($_uid, $_structure, $_htmlMode); + } + + function getTextPart($_uid, $_structure, $_htmlMode = '') + { + $bodyPart = array(); + //_debug_array($_structure); + $partID = $_structure->partID; + $mimePartBody = $this->icServer->getBodyPart($_uid, $partID, true); + //_debug_array($mimePartBody); + //_debug_array(preg_replace('/PropertyFile___$/','',$this->decodeMimePart($mimePartBody, $_structure->encoding))); + if($_structure->subType == 'HTML' && $_htmlMode != 'always_display' && $_htmlMode != 'only_if_no_text') { + $bodyPart = array( + 'body' => lang("displaying html messages is disabled"), + 'mimeType' => 'text/html', + 'charSet' => self::$displayCharset, + ); + } else { + // some Servers append PropertyFile___ ; strip that here for display + $bodyPart = array( + 'body' => preg_replace('/PropertyFile___$/','',$this->decodeMimePart($mimePartBody, $_structure->encoding, $this->getMimePartCharset($_structure))), + 'mimeType' => ($_structure->type == 'TEXT' && $_structure->subType == 'HTML') ? 'text/html' : 'text/plain', + 'charSet' => $this->getMimePartCharset($_structure), + ); + if ($_structure->subType == 'CALENDAR') + { + // we get an inline CALENDAR ical/ics, we display it using the calendar notification style + $calobj = new calendar_ical; + $calboupdate = new calendar_boupdate; + // timezone stuff + $tz_diff = $GLOBALS['egw_info']['user']['preferences']['common']['tz_offset'] - $this->common_prefs['tz_offset']; + // form an event out of ical + $event = $calobj->icaltoegw($bodyPart['body']); + $event= $event[0]; + // preset the olddate + $olddate = $calboupdate->format_date($event['start']+$tz_diff); + // search egw, if we can find it + $eventid = $calobj->find_event(array('uid'=>$event['uid'])); + if ((int)$eventid[0]>0) + { + // we found an event, we use the first one + $oldevent = $calobj->read($eventid); + // we set the olddate, to comply with the possible merge params for the notification message + if($oldevent != False && $oldevent[$eventid[0]]['start']!=$event[$eventid[0]]['start']) { + $olddate = $calboupdate->format_date($oldevent[$eventid[0]]['start']+$tz_diff); + } + // we merge the changes and the original event + $event = array_merge($oldevent[$eventid[0]],$event); + // for some strange reason, the title of the old event is not replaced with the new title + // if you klick on the ics and import it into egw, so we dont show the title here. + // so if it is a mere reply, we dont use the new title (more detailed info/work needed here) + if ($_structure->parameters['METHOD']=='REPLY') $event['title'] = $oldevent[$eventid[0]]['title']; + } + // we prepare the message + $details = $calboupdate->_get_event_details($event,$action,$event_arr); + $details['olddate']=$olddate; + //_debug_array($_structure); + list($subject,$info) = $calboupdate->get_update_message($event,($_structure->parameters['METHOD']=='REPLY'?false:true)); + $info = $GLOBALS['egw']->preferences->parse_notify($info,$details); + // we set the bodyPart, we only show the event, we dont actually do anything, as we expect the user to + // click on the attached ics to update his own eventstore + $bodyPart['body'] = $subject; + $bodyPart['body'] .= "\n".$info; + $bodyPart['body'] .= "\n\n".lang('Event Details follow').":\n"; + foreach($event_arr as $key => $val) + { + if(strlen($details[$key])) { + switch($key){ + case 'access': + case 'priority': + case 'link': + break; + default: + $bodyPart['body'] .= sprintf("%-20s %s\n",$val['field'].':',$details[$key]); + break; + } + } + } + } + } + //_debug_array($bodyPart); + return $bodyPart; + } + + function getNameSpace($_icServer) + { + $this->icServer->getNameSpaces(); + } + + function getHierarchyDelimiter() + { + $HierarchyDelimiter = '/'; + if(is_a($this->icServer,'defaultimap')) + { + $HierarchyDelimiter = $this->icServer->getHierarchyDelimiter(); + if (PEAR::isError($HierarchyDelimiter)) $HierarchyDelimiter = '/'; + } + return $HierarchyDelimiter; + } + + /** + * fetches a sorted list of messages from the imap server + * private function + * + * @todo implement sort based on Net_IMAP + * @param string $_folderName the name of the folder in which the messages get searched + * @param integer $_sort the primary sort key + * @param bool $_reverse sort the messages ascending or descending + * @param array $_filter the search filter + * @return bool + */ + function getSortedList($_folderName, $_sort, $_reverse, $_filter) + { + if(PEAR::isError($folderStatus = $this->icServer->examineMailbox($_folderName))) { + return false; + } + if(is_array($this->sessionData['folderStatus'][0][$_folderName]) && + $this->sessionData['folderStatus'][0][$_folderName]['uidValidity'] === $folderStatus['UIDVALIDITY'] && + $this->sessionData['folderStatus'][0][$_folderName]['messages'] === $folderStatus['EXISTS'] && + $this->sessionData['folderStatus'][0][$_folderName]['uidnext'] === $folderStatus['UIDNEXT'] && + $this->sessionData['folderStatus'][0][$_folderName]['filter'] === $_filter && + $this->sessionData['folderStatus'][0][$_folderName]['sort'] === $_sort && + !empty($this->sessionData['folderStatus'][0][$_folderName]['sortResult']) + ) { + if (self::$debug) error_log(__METHOD__." USE CACHE"); + $sortResult = $this->sessionData['folderStatus'][0][$_folderName]['sortResult']; + + } else { + if (self::$debug) error_log(__METHOD__." USE NO CACHE"); + $filter = $this->createIMAPFilter($_folderName, $_filter); + if($this->icServer->hasCapability('SORT')) { + if (self::$debug) error_log(__METHOD__." Mailserver has SORT Capability"); + $sortOrder = $this->_getSortString($_sort); + if (!empty(self::$displayCharset)) { + $sortResult = $this->icServer->sort($sortOrder, strtoupper( self::$displayCharset ), $filter, true); + } + if (PEAR::isError($sortResult) || empty(self::$displayCharset)) { + $sortResult = $this->icServer->sort($sortOrder, 'US-ASCII', $filter, true); + // if there is an PEAR Error, we assume that the server is not capable of sorting + if (PEAR::isError($sortResult)) { + $advFilter = 'CHARSET '. strtoupper(self::$displayCharset) .' '.$filter; + if (PEAR::isError($sortResult)) + { + $sortResult = $this->icServer->search($filter, false); + if (PEAR::isError($sortResult)) + { + $sortResult = $this->sessionData['folderStatus'][0][$_folderName]['sortResult']; + } + } + } + } + if (self::$debug) error_log(__METHOD__.print_r($sortResult,true)); + } else { + if (self::$debug) error_log(__METHOD__." Mailserver has NO SORT Capability"); + $advFilter = 'CHARSET '. strtoupper(self::$displayCharset) .' '.$filter; + $sortResult = $this->icServer->search($advFilter, true); + if (PEAR::isError($sortResult)) $sortResult = $this->icServer->search($filter, true); + if(is_array($sortResult)) { + sort($sortResult, SORT_NUMERIC); + } + if (self::$debug) error_log(__METHOD__." using Filter:".print_r($filter,true)." ->".print_r($sortResult,true)); + } + + $this->sessionData['folderStatus'][0][$_folderName]['uidValidity'] = $folderStatus['UIDVALIDITY']; + $this->sessionData['folderStatus'][0][$_folderName]['messages'] = $folderStatus['EXISTS']; + $this->sessionData['folderStatus'][0][$_folderName]['uidnext'] = $folderStatus['UIDNEXT']; + $this->sessionData['folderStatus'][0][$_folderName]['filter'] = $_filter; + $this->sessionData['folderStatus'][0][$_folderName]['sortResult'] = $sortResult; + $this->sessionData['folderStatus'][0][$_folderName]['sort'] = $_sort; + } + $this->sessionData['folderStatus'][0][$_folderName]['reverse'] = $_reverse; + $this->saveSessionData(); + + return $sortResult; + } + + function getMessageEnvelope($_uid, $_partID = '') + { + if($_partID == '') { + if( PEAR::isError($envelope = $this->icServer->getEnvelope('', $_uid, true)) ) { + return false; + } + + return $envelope[0]; + } else { + if( PEAR::isError($headers = $this->icServer->getParsedHeaders($_uid, true, $_partID, true)) ) { + return false; + } + + #_debug_array($headers); + $newData = array( + 'DATE' => $headers['DATE'], + 'SUBJECT' => $headers['SUBJECT'], + 'MESSAGE_ID' => $headers['MESSAGE-ID'] + ); + + $recepientList = array('FROM', 'TO', 'CC', 'BCC', 'SENDER', 'REPLY_TO'); + foreach($recepientList as $recepientType) { + if(isset($headers[$recepientType])) { + $addresses = imap_rfc822_parse_adrlist($headers[$recepientType], ''); + foreach($addresses as $singleAddress) { + $addressData = array( + 'PERSONAL_NAME' => $singleAddress->personal ? $singleAddress->personal : 'NIL', + 'AT_DOMAIN_LIST' => $singleAddress->adl ? $singleAddress->adl : 'NIL', + 'MAILBOX_NAME' => $singleAddress->mailbox ? $singleAddress->mailbox : 'NIL', + 'HOST_NAME' => $singleAddress->host ? $singleAddress->host : 'NIL', + 'EMAIL' => $singleAddress->host ? $singleAddress->mailbox.'@'.$singleAddress->host : $singleAddress->mailbox, + ); + if($addressData['PERSONAL_NAME'] != 'NIL') { + $addressData['RFC822_EMAIL'] = imap_rfc822_write_address($singleAddress->mailbox, $singleAddress->host, $singleAddress->personal); + } else { + $addressData['RFC822_EMAIL'] = 'NIL'; + } + $newData[$recepientType][] = $addressData; + } + } else { + if($recepientType == 'SENDER' || $recepientType == 'REPLY_TO') { + $newData[$recepientType] = $newData['FROM']; + } else { + $newData[$recepientType] = array(); + } + } + } + #_debug_array($newData); + + return $newData; + } + } + + function getHeaders($_folderName, $_startMessage, $_numberOfMessages, $_sort, $_reverse, $_filter, $_thisUIDOnly=null) + { + $reverse = (bool)$_reverse; + // get the list of messages to fetch + $this->reopen($_folderName); + //$this->icServer->selectMailbox($_folderName); + + #print "
    ";
    +			#$this->icServer->setDebug(true);
    +			if ($_thisUIDOnly === null)
    +			{
    +				$sortResult = $this->getSortedList($_folderName, $_sort, $_reverse, $_filter);
    +				#$this->icServer->setDebug(false);
    +				#print "
    "; + // nothing found + if(!is_array($sortResult) || empty($sortResult)) { + $retValue = array(); + $retValue['info']['total'] = 0; + $retValue['info']['first'] = 0; + $retValue['info']['last'] = 0; + return $retValue; + } + + $total = count($sortResult); + #_debug_array($sortResult); + #_debug_array(array_slice($sortResult, -5, -2)); + #error_log("REVERSE: $reverse"); + if($reverse === true) { + $startMessage = $_startMessage-1; + if($startMessage > 0) { + $sortResult = array_slice($sortResult, -($_numberOfMessages+$startMessage), -$startMessage); + } else { + $sortResult = array_slice($sortResult, -($_numberOfMessages+($_startMessage-1))); + } + $sortResult = array_reverse($sortResult); + } else { + $sortResult = array_slice($sortResult, $_startMessage-1, $_numberOfMessages); + } + } + else + { + $sortResult = (is_array($_thisUIDOnly) ? $_thisUIDOnly:(array)$_thisUIDOnly); + } + + $queryString = implode(',', $sortResult); + // fetch the data for the selected messages + $headersNew = $this->icServer->getSummary($queryString, true); + + $count = 0; + + foreach((array)$sortResult as $uid) { + $sortOrder[$uid] = $count++; + } + + $count = 0; + if (is_array($headersNew)) { + foreach((array)$headersNew as $headerObject) { + #if($count == 0) _debug_array($headerObject); + if (empty($headerObject['UID'])) continue; + $uid = $headerObject['UID']; + // make dates like "Mon, 23 Apr 2007 10:11:06 UT" working with strtotime + if(substr($headerObject['DATE'],-2) === 'UT') { + $headerObject['DATE'] .= 'C'; + } + + $retValue['header'][$sortOrder[$uid]]['subject'] = $this->decode_subject($headerObject['SUBJECT']); + $retValue['header'][$sortOrder[$uid]]['size'] = $headerObject['SIZE']; + $retValue['header'][$sortOrder[$uid]]['date'] = strtotime($headerObject['DATE']); + $retValue['header'][$sortOrder[$uid]]['mimetype'] = $headerObject['MIMETYPE']; + $retValue['header'][$sortOrder[$uid]]['id'] = $headerObject['MSG_NUM']; + $retValue['header'][$sortOrder[$uid]]['uid'] = $headerObject['UID']; + $retValue['header'][$sortOrder[$uid]]['priority'] = ($headerObject['PRIORITY']?$headerObject['PRIORITY']:3); + if (is_array($headerObject['FLAGS'])) { + $retValue['header'][$sortOrder[$uid]]['recent'] = in_array('\\Recent', $headerObject['FLAGS']); + $retValue['header'][$sortOrder[$uid]]['flagged'] = in_array('\\Flagged', $headerObject['FLAGS']); + $retValue['header'][$sortOrder[$uid]]['answered'] = in_array('\\Answered', $headerObject['FLAGS']); + $retValue['header'][$sortOrder[$uid]]['forwarded'] = in_array('$Forwarded', $headerObject['FLAGS']); + $retValue['header'][$sortOrder[$uid]]['deleted'] = in_array('\\Deleted', $headerObject['FLAGS']); + $retValue['header'][$sortOrder[$uid]]['seen'] = in_array('\\Seen', $headerObject['FLAGS']); + $retValue['header'][$sortOrder[$uid]]['draft'] = in_array('\\Draft', $headerObject['FLAGS']); + $retValue['header'][$sortOrder[$uid]]['mdnsent'] = in_array('MDNSent', $headerObject['FLAGS']); + $retValue['header'][$sortOrder[$uid]]['mdnnotsent'] = in_array('MDNnotSent', $headerObject['FLAGS']); + } + if(is_array($headerObject['FROM']) && is_array($headerObject['FROM'][0])) { + if($headerObject['FROM'][0]['HOST_NAME'] != 'NIL') { + $retValue['header'][$sortOrder[$uid]]['sender_address'] = $headerObject['FROM'][0]['EMAIL']; + } else { + $retValue['header'][$sortOrder[$uid]]['sender_address'] = $headerObject['FROM'][0]['MAILBOX_NAME']; + } + if($headerObject['FROM'][0]['PERSONAL_NAME'] != 'NIL') { + $retValue['header'][$sortOrder[$uid]]['sender_name'] = self::decode_header($headerObject['FROM'][0]['PERSONAL_NAME']); + } + + } + + if(is_array($headerObject['TO']) && is_array($headerObject['TO'][0])) { + if($headerObject['TO'][0]['HOST_NAME'] != 'NIL') { + $retValue['header'][$sortOrder[$uid]]['to_address'] = $headerObject['TO'][0]['EMAIL']; + } else { + $retValue['header'][$sortOrder[$uid]]['to_address'] = $headerObject['TO'][0]['MAILBOX_NAME']; + } + if($headerObject['TO'][0]['PERSONAL_NAME'] != 'NIL') { + $retValue['header'][$sortOrder[$uid]]['to_name'] = self::decode_header($headerObject['TO'][0]['PERSONAL_NAME']); + } + + } + + $count++; + } + + // sort the messages to the requested displayorder + if(is_array($retValue['header'])) { + ksort($retValue['header']); + $retValue['info']['total'] = $total; + $retValue['info']['first'] = $_startMessage; + $retValue['info']['last'] = $_startMessage + $count - 1 ; + return $retValue; + } else { + $retValue = array(); + $retValue['info']['total'] = 0; + $retValue['info']['first'] = 0; + $retValue['info']['last'] = 0; + return $retValue; + } + } else { + error_log("bofelamimail::getHeaders -> retrieval of Message Details failed: ".print_r($headersNew,TRUE)); + $retValue = array(); + $retValue['info']['total'] = 0; + $retValue['info']['first'] = 0; + $retValue['info']['last'] = 0; + return $retValue; + } + } + + function getNextMessage($_foldername, $_id) + { + #_debug_array($this->sessionData['folderStatus'][$this->profileID][$_foldername]['sortResult']); + #_debug_array($this->sessionData['folderStatus'][$this->profileID]); + #print "ID: $_id
    "; + $position=false; + if (is_array($this->sessionData['folderStatus'][$this->profileID][$_foldername]['sortResult'])) { + $position = array_search($_id, $this->sessionData['folderStatus'][$this->profileID][$_foldername]['sortResult']); + } + #print "POS: $position
    "; + + if($position !== false) { + $retValue = array(); + + if($this->sessionData['folderStatus'][$this->profileID][$_foldername]['reverse'] == true) { + #print "is reverse
    "; + if(isset($this->sessionData['folderStatus'][$this->profileID][$_foldername]['sortResult'][$position-1])) { + $retValue['next'] = $this->sessionData['folderStatus'][$this->profileID][$_foldername]['sortResult'][$position-1]; + } + if(isset($this->sessionData['folderStatus'][$this->profileID][$_foldername]['sortResult'][$position+1])) { + $retValue['previous'] = $this->sessionData['folderStatus'][$this->profileID][$_foldername]['sortResult'][$position+1]; + } + } else { + #print "is not reverse"; + if(isset($this->sessionData['folderStatus'][$this->profileID][$_foldername]['sortResult'][$position-1])) { + $retValue['previous'] = $this->sessionData['folderStatus'][$this->profileID][$_foldername]['sortResult'][$position-1]; + } + if(isset($this->sessionData['folderStatus'][$this->profileID][$_foldername]['sortResult'][$position+1])) { + $retValue['next'] = $this->sessionData['folderStatus'][$this->profileID][$_foldername]['sortResult'][$position+1]; + } + } + + return $retValue; + } + + return false; + } + + function getIMAPACL($_folderName, $user='') + { + if(($this->hasCapability('ACL'))) { + if ( PEAR::isError($acl = $this->icServer->getACL($_folderName)) ) { + return false; + } + + if ($user=='') { + return $acl; + } + + foreach ($acl as $i => $userACL) { + if ($userACL['USER'] == $user) { + return $userACL['RIGHTS']; + } + } + + return ''; + } + + return false; + } + + /** + * checks if the imap server supports a given capability + * + * @param string $_capability the name of the capability to check for + * @return bool + */ + function hasCapability($_capability) + { + return $this->icServer->hasCapability(strtoupper($_capability)); + } + + function getMailPreferences() + { + return $this->mailPreferences; + } + + function getMessageAttachments($_uid, $_partID='', $_structure='') + { + if (self::$debug) echo __METHOD__."$_uid, $_partID
    "; + + if(is_object($_structure)) { + $structure = $_structure; + } else { + $structure = $this->icServer->getStructure($_uid, true); + + if($_partID != '' && $_partID !=0) { + $structure = $this->_getSubStructure($structure, $_partID); + } + } + + if (self::$debug) _debug_array($structure); + $attachments = array(); + // this kind of messages contain only the attachment and no body + if($structure->type == 'APPLICATION' || $structure->type == 'AUDIO' || $structure->type == 'IMAGE') + { + $newAttachment = array(); + $newAttachment['name'] = self::getFileNameFromStructure($structure); + $newAttachment['size'] = $structure->bytes; + $newAttachment['mimeType'] = $structure->type .'/'. $structure->subType; + $newAttachment['partID'] = $structure->partID; + $newAttachment['encoding'] = $structure->encoding; + // try guessing the mimetype, if we get the application/octet-stream + if (strtolower($newAttachment['mimeType']) == 'application/octet-stream') $newAttachment['mimeType'] = mime_magic::filename2mime($newAttachment['name']); + + if(isset($structure->cid)) { + $newAttachment['cid'] = $structure->cid; + } + # if the new attachment is a winmail.dat, we have to decode that first + if ( $newAttachment['name'] == 'winmail.dat' && + ( $wmattachments = $this->decode_winmail( $_uid, $newAttachment['partID'] ) ) ) + { + $attachments = array_merge( $attachments, $wmattachments ); + } else { + $attachments[] = $newAttachment; + } + //$attachments[] = $newAttachment; + + #return $attachments; + } + + // this kind of message can have no attachments + if(($structure->type == 'TEXT' && !($structure->disposition == 'INLINE' && $structure->dparameters['FILENAME'])) || + ($structure->type == 'MULTIPART' && $structure->subType == 'ALTERNATIVE' && !is_array($structure->subParts)) || + !is_array($structure->subParts)) + { + if (count($attachments) == 0) return array(); + } + + #$attachments = array(); + + foreach($structure->subParts as $subPart) { + // skip all non attachment parts + if(($subPart->type == 'TEXT' && ($subPart->subType == 'PLAIN' || $subPart->subType == 'HTML') && ($subPart->disposition != 'ATTACHMENT' && + !($subPart->disposition == 'INLINE' && $subPart->dparameters['FILENAME']))) || + ($subPart->type == 'MULTIPART' && $subPart->subType == 'ALTERNATIVE') || + ($subPart->type == 'MULTIPART' && $subPart->subType == 'APPLEFILE') || + ($subPart->type == 'MESSAGE' && $subPart->subType == 'delivery-status')) + { + if ($subPart->type == 'MULTIPART' && $subPart->subType == 'ALTERNATIVE') + { + $attachments = array_merge($this->getMessageAttachments($_uid, '', $subPart), $attachments); + } + if (!($subPart->type=='TEXT' && $subPart->disposition =='INLINE' && $subPart->filename)) continue; + } + + // fetch the subparts for this part + if($subPart->type == 'MULTIPART' && + ($subPart->subType == 'RELATED' || + $subPart->subType == 'MIXED' || + $subPart->subType == 'SIGNED' || + $subPart->subType == 'APPLEDOUBLE')) + { + $attachments = array_merge($this->getMessageAttachments($_uid, '', $subPart), $attachments); + } else { + $newAttachment = array(); + $newAttachment['name'] = self::getFileNameFromStructure($subPart); + $newAttachment['size'] = $subPart->bytes; + $newAttachment['mimeType'] = $subPart->type .'/'. $subPart->subType; + $newAttachment['partID'] = $subPart->partID; + $newAttachment['encoding'] = $subPart->encoding; + // try guessing the mimetype, if we get the application/octet-stream + if (strtolower($newAttachment['mimeType']) == 'application/octet-stream') $newAttachment['mimeType'] = mime_magic::filename2mime($newAttachment['name']); + + if(isset($subPart->cid)) { + $newAttachment['cid'] = $subPart->cid; + } + # if the new attachment is a winmail.dat, we have to decode that first + if ( $newAttachment['name'] == 'winmail.dat' && + ( $wmattachments = $this->decode_winmail( $_uid, $newAttachment['partID'] ) ) ) + { + $attachments = array_merge( $attachments, $wmattachments ); + } else { + $attachments[] = $newAttachment; + } + //$attachments[] = $newAttachment; + } + } + + //_debug_array($attachments); exit; + return $attachments; + + } + + static function getFileNameFromStructure(&$structure) + { + if(isset($structure->parameters['NAME'])) { + return self::decode_header($structure->parameters['NAME']); + } elseif(isset($structure->dparameters['FILENAME'])) { + return self::decode_header($structure->dparameters['FILENAME']); + } elseif(isset($structure->dparameters['FILENAME*'])) { + return self::decode_header($structure->dparameters['FILENAME*']); + } elseif ( isset($structure->filename) && !empty($structure->filename) && $structure->filename != 'NIL') { + return self::decode_header($structure->filename); + } else { + return lang("unknown").($structure->subType ? ".".$structure->subType : ""); + } + } + + function getMessageBody($_uid, $_htmlOptions='', $_partID='', $_structure = '') + { + if (self::$debug) echo __METHOD__."$_uid, $_htmlOptions, $_partID
    "; + if($_htmlOptions != '') { + $this->htmlOptions = $_htmlOptions; + } + if(is_object($_structure)) { + $structure = $_structure; + } else { + $structure = $this->icServer->getStructure($_uid, true); + if($_partID != '') { + $structure = $this->_getSubStructure($structure, $_partID); + } + } + if (self::$debug) _debug_array($structure); + switch($structure->type) { + case 'APPLICATION': + return array( + array( + 'body' => '', + 'mimeType' => 'text/plain', + 'charSet' => 'iso-8859-1', + ) + ); + break; + case 'MULTIPART': + switch($structure->subType) { + case 'ALTERNATIVE': + return array($this->getMultipartAlternative($_uid, $structure->subParts, $this->htmlOptions)); + + break; + + case 'MIXED': + case 'REPORT': + case 'SIGNED': + return $this->getMultipartMixed($_uid, $structure->subParts, $this->htmlOptions); + break; + + case 'RELATED': + return $this->getMultipartRelated($_uid, $structure->subParts, $this->htmlOptions); + break; + } + + break; + case 'AUDIO': // some servers send audiofiles and imagesfiles directly, without any stuff surround it + case 'IMAGE': // they are displayed as Attachment NOT INLINE + return array( + array( + 'body' => '', + 'mimeType' => $structure->subType, + ), + ); + break; + case 'TEXT': + $bodyPart = array(); + if ( $structure->disposition != 'ATTACHMENT') { + switch($structure->subType) { + case 'CALENDAR': + // this is handeled in getTextPart + case 'HTML': + case 'PLAIN': + default: + $bodyPart = array($this->getTextPart($_uid, $structure, $this->htmlOptions)); + } + } else { + // what if the structure->disposition is attachment ,... + } + return $bodyPart; + break; + case 'ATTACHMENT': + case 'MESSAGE': + switch($structure->subType) { + case 'RFC822': + $newStructure = array_shift($structure->subParts); + if (self::$debug) {echo __METHOD__." Message -> RFC -> NewStructure:"; _debug_array($newStructure);} + return $this->getMessageBody($_uid, $_htmlOptions, $newStructure->partID, $newStructure); + break; + } + break; + default: + if (self::$debug) _debug_array($structure); + return array( + array( + 'body' => lang('The mimeparser can not parse this message.'), + 'mimeType' => 'text/plain', + 'charSet' => 'iso-8859-1', + ) + ); + break; + } + } + + function getMessageHeader($_uid, $_partID = '') + { + $retValue = $this->icServer->getParsedHeaders($_uid, true, $_partID, true); + + return $retValue; + } + + function getMessageRawBody($_uid, $_partID = '') + { + if($_partID != '') { + $body = $this->icServer->getBody($_uid, true); + } else { + $body = $this->icServer->getBodyPart($_uid, $_partID, true); + } + + return $body; + } + + function getMessageRawHeader($_uid, $_partID = '') + { + $retValue = $this->icServer->getRawHeaders($_uid, $_partID, true); + + return $retValue; + } + + // return the qouta of the users INBOX + function getQuotaRoot() + { + if(!$this->icServer->hasCapability('QUOTA')) { + return false; + } + + $quota = $this->icServer->getStorageQuotaRoot('INBOX'); + if(is_array($quota)) { + return array( + 'usage' => $quota['USED'], + 'limit' => $quota['QMAX'], + ); + } else { + return false; + } + } + + # function imapGetQuota($_username) + # { + # $quota_value = @imap_get_quota($this->mbox, "user.".$_username); + # + # if(is_array($quota_value) && count($quota_value) > 0) + # { + # return array('limit' => $quota_value['limit']/1024); + # } + # else + # { + # return false; + # } + # } + + # function imap_get_quotaroot($_folderName) + # { + # return @imap_get_quotaroot($this->mbox, $_folderName); + # } + + # function imapSetQuota($_username, $_quotaLimit) + # { + # if(is_numeric($_quotaLimit) && $_quotaLimit >= 0) + # { + # // enable quota + # $quota_value = @imap_set_quota($this->mbox, "user.".$_username, $_quotaLimit*1024); + # } + # else + # { + # // disable quota + # $quota_value = @imap_set_quota($this->mbox, "user.".$_username, -1); + # } + # } + + function isSentFolder($_folderName) + { + if(empty($this->mailPreferences->preferences['sentFolder'])) { + return false; + } + // does the folder exist??? + if (!self::folderExists($_folderName)) { + return false; + } + + if(false !== stripos($_folderName, $this->mailPreferences->preferences['sentFolder'])) { + return true; + } else { + return false; + } + } + + function isDraftFolder($_folderName) + { + if(empty($this->mailPreferences->preferences['draftFolder'])) { + return false; + } + // does the folder exist??? + if (!self::folderExists($_folderName)) { + return false; + } + + if(false !== stripos($_folderName, $this->mailPreferences->preferences['draftFolder'])) { + return true; + } else { + return false; + } + } + + function isTemplateFolder($_folderName) + { + if(empty($this->mailPreferences->preferences['templateFolder'])) { + return false; + } + // does the folder exist??? + if (!self::folderExists($_folderName)) { + return false; + } + + if(false !== stripos($_folderName, $this->mailPreferences->preferences['templateFolder'])) { + return true; + } else { + return false; + } + } + + function folderExists($_folder, $forceCheck=false) + { + #echo __METHOD__." called; check for $_folder
    "; + // does the folder exist??? + //error_log("bofelamimail::folderExists->Connected?".$this->icServer->_connected.", ".$_folder.", ".$forceCheck); + if ((!($this->icServer->_connected == 1)) && $forceCheck) { + #error_log("bofelamimail::folderExists->NotConnected and forceCheck"); + //return false; + //try to connect + if (!$this->icServer->_connected) $this->openConnection(); + } + if(is_a($this->icServer,'defaultimap')) $folderInfo = $this->icServer->getMailboxes('', $_folder, true); + #error_log(print_r($folderInfo,true)); + if(is_a($folderInfo, 'PEAR_Error') || !is_array($folderInfo[0])) { + return false; + } else { + return true; + } + } + + function moveMessages($_foldername, $_messageUID, $deleteAfterMove=true) + { + $msglist = ''; + + $deleteOptions = $GLOBALS['egw_info']["user"]["preferences"]["felamimail"]["deleteOptions"]; + + if ( PEAR::isError($this->icServer->copyMessages($_foldername, $_messageUID, $this->sessionData['mailbox'], true)) ) { + return false; + } + if ($deleteAfterMove === true) + { + if ( PEAR::isError($this->icServer->deleteMessages($_messageUID, true))) + { + return false; + } + + if($deleteOptions != "mark_as_deleted") + { + // delete the messages finaly + $this->icServer->expunge(); + } + } + return true; + } + + function openConnection($_icServerID=0, $_adminConnection=false) + { + if (!is_object($this->mailPreferences)) + { + error_log(__METHOD__." No Object for MailPreferences found.". function_backtrace()); + $this->errorMessage .= lang('No valid data to create MailProfile!!'); + return false; + } + if(!$this->icServer = $this->mailPreferences->getIncomingServer((int)$_icServerID)) { + $this->errorMessage .= lang('No active IMAP server found!!'); + return false; + } + if ($this->icServer && empty($this->icServer->host)) { + $errormessage = lang('No IMAP server host configured!!'); + if ($GLOBALS['egw_info']['user']['apps']['emailadmin']) { + $errormessage .= "
    ".lang("Configure a valid IMAP Server in emailadmin for the profile you are using."); + } else { + $errormessage .= "
    ".lang('Please ask the administrator to correct the emailadmin IMAP Server Settings for you.'); + } + $this->icServer->_connectionErrorObject->message .= $this->errorMessage .= $errormessage; + return false; + } + #error_log( "---------------------------open connection
    "); + #error_log(print_r($this->icServer,true)); + if ($this->icServer->_connected == 1) { + $tretval = $this->icServer->selectMailbox($this->icServer->currentMailbox); + #error_log(__METHOD__." using existing Connection ".print_r($this->icServer->_connected,true)); + } else { + $tretval = $this->icServer->openConnection($_adminConnection); + #error_log(__METHOD__." open new Connection ".print_r($this->icServer->_connected,true)); + } + #error_log(print_r($this->icServer->_connected,true)); + return $tretval; + } + + /** + * rename a folder + * + * @param string _oldFolderName the old foldername + * @param string _parent the parent foldername + * @param string _folderName the new foldername + * + * @returns mixed name of the newly created folder or false on error + */ + function renameFolder($_oldFolderName, $_parent, $_folderName) + { + $oldFolderName = $this->_encodeFolderName($_oldFolderName); + $parent = $this->_encodeFolderName($_parent); + $folderName = $this->_encodeFolderName($_folderName); + + if(empty($parent)) { + $newFolderName = $folderName; + } else { + $HierarchyDelimiter = $this->getHierarchyDelimiter(); + $newFolderName = $parent . $HierarchyDelimiter . $folderName; + } + if (self::$debug) error_log("create folder: $newFolderName"); + $rv = $this->icServer->renameMailbox($oldFolderName, $newFolderName); + if ( PEAR::isError($rv) ) { + if (self::$debug) error_log(__METHOD__." failed for $oldFolderName, $newFolderName with error: ".print_r($rv->message,true)); + return false; + } + + return $newFolderName; + + } + + function reopen($_foldername) + { + #error_log( "------------------------reopen-
    "); + #error_log(print_r($this->icServer->_connected,true)); + if ($this->icServer->_connected == 1) { + $tretval = $this->icServer->selectMailbox($_foldername); + } else { + $tretval = $this->icServer->openConnection(false); + $tretval = $this->icServer->selectMailbox($_foldername); + } + } + + function restoreSessionData() + { + $GLOBALS['egw_info']['flags']['autoload'] = array(__CLASS__,'autoload'); + + $this->sessionData = $GLOBALS['egw']->session->appsession('session_data','felamimail'); + } + + function saveFilter($_formData) + { + if(!empty($_formData['from'])) + $data['from'] = $_formData['from']; + if(!empty($_formData['to'])) + $data['to'] = $_formData['to']; + if(!empty($_formData['subject'])) + $data['subject']= $_formData['subject']; + if($_formData['filterActive'] == "true") + { + $data['filterActive']= "true"; + } + + $this->sessionData['filter'] = $data; + $this->saveSessionData(); + } + + function saveSessionData() + { + $GLOBALS['egw']->session->appsession('session_data','felamimail',$this->sessionData); + } + + function setEMailProfile($_profileID) + { + $config = CreateObject('phpgwapi.config','felamimail'); + $config->read_repository(); + $config->value('profileID',$_profileID); + $config->save_repository(); + } + + function subscribe($_folderName, $_status) + { + if (self::$debug) error_log("bofelamimail::".($_status?"":"un")."subscribe:".$_folderName); + if($_status === true) { + if ( PEAR::isError($this->icServer->subscribeMailbox($_folderName))) { + error_log("bofelamimail::".($_status?"":"un")."subscribe:".$_folderName." failed"); + return false; + } + } else { + if ( PEAR::isError($this->icServer->unsubscribeMailbox($_folderName))) { + error_log("bofelamimail::".($_status?"":"un")."subscribe:".$_folderName." failed"); + return false; + } + } + + return true; + } + + function toggleFilter() + { + if($this->sessionData['filter']['filterActive'] == 'true') { + $this->sessionData['filter']['filterActive'] = 'false'; + } else { + $this->sessionData['filter']['filterActive'] = 'true'; + } + $this->saveSessionData(); + } + + function updateAccount($_hookValues) + { + if (is_object($this->mailPreferences)) $icServer = $this->mailPreferences->getIncomingServer(0); + if(is_a($icServer,'defaultimap')) { + $icServer->updateAccount($_hookValues); + } + + if (is_object($this->mailPreferences)) $ogServer = $this->mailPreferences->getOutgoingServer(0); + if(is_a($ogServer,'defaultsmtp')) { + $ogServer->updateAccount($_hookValues); + } + } + + function updateSingleACL($_folderName, $_accountName, $_aclType, $_aclStatus) + { + $userACL = $this->getIMAPACL($_folderName, $_accountName); + + if($_aclStatus == 'true') { + if(strpos($userACL, $_aclType) === false) { + $userACL .= $_aclType; + $this->setACL($_folderName, $_accountName, $userACL); + } + } elseif($_aclStatus == 'false') { + if(strpos($userACL, $_aclType) !== false) { + $userACL = str_replace($_aclType,'',$userACL); + $this->setACL($_folderName, $_accountName, $userACL); + } + } + + return $userACL; + } + + static function wordwrap($str, $cols, $cut) + { + $lines = explode("\n", $str); + $newStr = ''; + foreach($lines as $line) + { + // replace tabs by 8 space chars, or any tab only counts one char + //$line = str_replace("\t"," ",$line); + //$newStr .= wordwrap($line, $cols, $cut); + $allowedLength = $cols-strlen($cut); + if (strlen($line) > $allowedLength) { + $s=explode(" ", $line); + $line = ""; + $linecnt = 0; + foreach ($s as $k=>$v) { + $cnt = strlen($v); + // only break long words within the wordboundaries, + // but it may destroy links, so we check for href and dont it if we find one + if($cnt > $allowedLength && stripos($v,'href=')===false) { + $v=wordwrap($v, $allowedLength, $cut, true); + } + // the rest should be broken at the start of the new word that exceeds the limit + if ($linecnt+$cnt > $allowedLength) { + $v=$cut.$v; + #$linecnt = 0; + $linecnt =strlen($v)-strlen($cut); + } else { + $linecnt += $cnt; + } + if (strlen($v)) $line .= (strlen($line) ? " " : "").$v; + } + } + $newStr .= $line . "\n"; + } + return $newStr; + } + + /** + * convert the foldername from display charset to UTF-7 + * + * @param string _parent the parent foldername + * @returns ISO-8859-1 / UTF7-IMAP encoded string + */ + function _encodeFolderName($_folderName) { + return $GLOBALS['egw']->translation->convert($_folderName, self::$displayCharset, 'ISO-8859-1'); + #return $GLOBALS['egw']->translation->convert($_folderName, self::$displayCharset, 'UTF7-IMAP'); + } + + /** + * convert the foldername from UTF-7 to display charset + * + * @param string _parent the parent foldername + * @returns ISO-8859-1 / self::$displayCharset encoded string + */ + function _decodeFolderName($_folderName) { + return $GLOBALS['egw']->translation->convert($_folderName, self::$displayCharset, 'ISO-8859-1'); + #return $GLOBALS['egw']->translation->convert($_folderName, 'UTF7-IMAP', self::$displayCharset); + } + + /** + * convert the sort value from the gui(integer) into a string + * + * @param int _sort the integer sort order + * @returns the ascii sort string + */ + function _getSortString($_sort) + { + switch($_sort) { + case 2: + $retValue = 'FROM'; + break; + case 3: + $retValue = 'SUBJECT'; + break; + case 6: + $retValue = 'SIZE'; + break; + case 0: + default: + $retValue = 'DATE'; + break; + } + + return $retValue; + } + + function sendMDN($uid) { + $identities = $this->mailPreferences->getIdentity(); + $headers = $this->getMessageHeader($uid); + $send = CreateObject('phpgwapi.send'); + $send->ClearAddresses(); + $send->ClearAttachments(); + $send->IsHTML(False); + $send->IsSMTP(); + + $array_to = explode(",",$headers['TO']); + foreach($identities as $identity) { + if ( preg_match('/\b'.$identity->emailAddress.'\b/',$headers['TO']) ) { + $send->From = $identity->emailAddress; + $send->FromName = $identity->realName; + error_log('Not Default '.$send->From); + break; + } + if($identity->default) { + $send->From = $identity->emailAddress; + $send->FromName = $identity->realName; + } + } + + if (isset($headers['DISPOSITION-NOTIFICATION-TO'])) { + $send->AddAddress( $headers['DISPOSITION-NOTIFICATION-TO'] ); + } else if ( isset($headers['RETURN-RECEIPT-TO']) ) { + $send->AddAddress( $headers['RETURN-RECEIPT-TO']); + } else if ( isset($headers['X-CONFIRM-READING-TO']) ) { + $send->AddAddress( $headers['X-CONFIRM-READING-TO']); + } else return false; + + $send->AddCustomHeader('References: '.$headers['MESSAGE-ID']); + $send->Subject = $send->encode_subject( lang('Read')." : ".$headers['SUBJECT'] ); + + $sep = "-----------mdn".$uniq_id = md5(uniqid(time())); + + $body = "--".$sep."\r\n". + "Content-Type: text/plain; charset=ISO-8859-1\r\n". + "Content-Transfer-Encoding: 7bit\r\n\r\n". + $send->EncodeString(lang("Your message to %1 was displayed." ,$send->From),"7bit"). + "\r\n"; + + $body .= "--".$sep."\r\n". + "Content-Type: message/disposition-notification; name=\"MDNPart2.txt\"\r\n" . + "Content-Disposition: inline\r\n". + "Content-Transfer-Encoding: 7bit\r\n\r\n"; + $body.= $send->EncodeString("Reporting-UA: eGroupWare\r\n" . + "Final-Recipient: rfc822;".$send->From."\r\n" . + "Original-Message-ID: ".$headers['MESSAGE-ID']."\r\n". + "Disposition: manual-action/MDN-sent-manually; displayed",'7bit')."\r\n"; + + $body .= "--".$sep."\r\n". + "Content-Type: text/rfc822-headers; name=\"MDNPart3.txt\"\r\n" . + "Content-Transfer-Encoding: 7bit\r\n" . + "Content-Disposition: inline\r\n\r\n"; + $body .= $send->EncodeString($this->getMessageRawHeader($uid),'7bit')."\r\n"; + $body .= "--".$sep."--"; + + + $header = rtrim($send->CreateHeader())."\r\n"."Content-Type: multipart/report; report-type=disposition-notification;\r\n". + "\tboundary=\"".$sep."\"\r\n\r\n"; + return $send->SmtpSend($header,$body); + } + + /** + * Merges a given content with contact data + * + * @param string $content + * @param array $ids array with contact id(s) + * @param string &$err error-message on error + * @return string/boolean merged content or false on error + */ + function merge($content,$ids) + { + $contacts = new addressbook_bo(); + $mergeobj = new addressbook_merge(); + + foreach ($ids as $id) + { + // generate replacements + if (!($replacements = $mergeobj->contact_replacements($id))) + { + $err = lang('Contact not found!'); + #return false; + continue; + } + if (strpos($content,'$$user/') !== null && ($user = $GLOBALS['egw']->accounts->id2name($GLOBALS['egw_info']['user']['account_id'],'person_id'))) + { + $replacements += $mergeobj->contact_replacements($user,'user'); + } + $replacements['$$date$$'] = date($GLOBALS['egw_info']['user']['preferences']['common']['dateformat'],time()+$this->contacts->tz_offset_s); + + $content = str_replace(array_keys($replacements),array_values($replacements),$content); + + + $this->replacements = $replacements; + if (strpos($content,'$$IF')) + { //Example use to use: $$IF n_prefix~Herr~Sehr geehrter~Sehr geehrte$$ + $content = preg_replace_callback('/\$\$IF ([0-9a-z_-]+)~(.*)~(.*)~(.*)\$\$/imU',Array($this,'replace_callback'),$content); + } + + } + return $content; + } + + /** + * Tests if string contains 8bit symbols. + * + * If charset is not set, function defaults to default_charset. + * $default_charset global must be set correctly if $charset is + * not used. + * @param string $string tested string + * @param string $charset charset used in a string + * @return bool true if 8bit symbols are detected + */ + static function is8bit(&$string,$charset='') { + + if ($charset=='') $charset= self::$displayCharset; + + /** + * Don't use \240 in ranges. Sometimes RH 7.2 doesn't like it. + * Don't use \200-\237 for iso-8859-x charsets. This ranges + * stores control symbols in those charsets. + * Use preg_match instead of ereg in order to avoid problems + * with mbstring overloading + */ + if (preg_match("/^iso-8859/i",$charset)) { + $needle='/\240|[\241-\377]/'; + } else { + $needle='/[\200-\237]|\240|[\241-\377]/'; + } + return preg_match("$needle",$string); + } + static function detect_qp(&$sting) { + $needle = '/(=[0-9][A-F])|(=[A-F][0-9])|(=[A-F][A-F])|(=[0-9][0-9])/'; + return preg_match("$needle",$string); + } + } diff --git a/felamimail/inc/class.bofilter.inc.php b/felamimail/inc/class.bofilter.inc.php new file mode 100644 index 0000000000..8c3bfcb36b --- /dev/null +++ b/felamimail/inc/class.bofilter.inc.php @@ -0,0 +1,171 @@ + True, + 'flagMessages' => True + ); + + function bofilter($_restoreSession=true) + { + $this->accountid = $GLOBALS['egw_info']['user']['account_id']; + + $this->bopreferences =& CreateObject('felamimail.bopreferences',$_restoreSession); + //$this->sofelamimail =& CreateObject('felamimail.sofelamimail'); + $this->sofilter =& CreateObject('felamimail.sofilter'); + + $this->mailPreferences = $this->bopreferences->getPreferences(); + $this->sessionData['activeFilter'] = "-1"; + + if ($_restoreSession) $this->restoreSessionData(); + + if(!is_array($this->sessionData['filter'])) { + $this->sessionData['filter'][0]['filterName'] = lang('Quicksearch'); + $this->saveSessionData(); + } + if(!isset($this->sessionData['activeFilter'])) { + $this->sessionData['activeFilter'] = "-1"; + } + } + + function deleteFilter($_filterID) + { + unset($this->sessionData['filter'][$_filterID]); + $this->saveSessionData(); + $this->sofilter->saveFilter($this->sessionData['filter']); + } + + function getActiveFilter() + { + return $this->sessionData['activeFilter']; + } + + function getFilter($_filterID) + { + return $this->sessionData['filter'][$_filterID]; + } + + function getFilterList() + { + return $this->sessionData['filter']; + } + + function restoreSessionData() + { + $arrayFunctions =& CreateObject('phpgwapi.arrayfunctions'); + + $this->sessionData = $GLOBALS['egw']->session->appsession('filter_session_data'); + + // sort the filter list + $unsortedFilter = $this->sofilter->restoreFilter(); + + // save the quicksearchfilter + // must always have id=0 + if(is_array($unsortedFilter[0])) + { + $quickSearchFilter[0] = $unsortedFilter[0]; + unset($unsortedFilter[0]); + } + // or create the array + else + { + $quickSearchFilter[0] = array('filterName' => lang('quicksearch')); + } + + // _debug_array($this->sessionData['filter']); + // the first one is always the quicksearch filter + if(count($unsortedFilter) > 0) + { + $sortedFilter = $arrayFunctions->arfsort($unsortedFilter, array('filterName')); + $sortedFilter = array_merge($quickSearchFilter, $sortedFilter); + } + else + { + $sortedFilter = $quickSearchFilter; + } + #_debug_array($sortedFilter); + + $this->sessionData['filter'] = $sortedFilter; + } + + function saveFilter($_formData, $_filterID='') + { + if(!empty($_formData['filterName'])) + $data['filterName'] = $_formData['filterName']; + if(!empty($_formData['from'])) + $data['from'] = $_formData['from']; + if(!empty($_formData['to'])) + $data['to'] = $_formData['to']; + if(!empty($_formData['subject'])) + $data['subject']= $_formData['subject']; + + if($_filterID === '') + { + $this->sessionData['filter'][] = $data; + } + else + { + $this->sessionData['filter'][$_filterID] = $data; + } + + $this->saveSessionData(); + + $this->sofilter->saveFilter($this->sessionData['filter']); + } + + function saveSessionData() + { + $GLOBALS['egw']->session->appsession('filter_session_data','',$this->sessionData); + } + + function setActiveFilter($_filter) + { + $this->sessionData['activeFilter'] = "$_filter"; + $this->saveSessionData(); + } + + function updateFilter($_data) + { + $filter = $this->getFilterList(); + $activeFilter = $this->getActiveFilter(); + + // check for new quickfilter + if($activeFilter == $_data['filter'] && isset($_data['quickSearch'])) + { + #print " new Quickfilter $_quickSearch
    "; + if($_data['quickSearch'] == '') + { + $this->setActiveFilter("-1"); + } + else + { + $this->setActiveFilter("0"); + $data['filterName'] = lang('Quicksearch'); + $data['subject'] = $_data['quickSearch']; + $data['from'] = $_data['quickSearch']; + $this->saveFilter($data, '0'); + } + } + else + { + $this->setActiveFilter($_data['filter']); + } + } + } + +?> diff --git a/felamimail/inc/class.bopreferences.inc.php b/felamimail/inc/class.bopreferences.inc.php new file mode 100644 index 0000000000..9cc285e28b --- /dev/null +++ b/felamimail/inc/class.bopreferences.inc.php @@ -0,0 +1,385 @@ + True, + ); + + // stores the users profile + var $profileData; + var $sessionData; + var $boemailadmin; + + function bopreferences($_restoreSession = true) + { + //error_log(__METHOD__." called ".print_r($_restoreSession,true).function_backtrace()); + parent::sopreferences(); + $this->boemailadmin = new emailadmin_bo(-1,$_restoreSession); + if ($_restoreSession && !(is_array($this->sessionData) && (count($this->sessionData)>0)) ) $this->restoreSessionData(); + if ($_restoreSession===false && (is_array($this->sessionData) && (count($this->sessionData)>0)) ) + { + //error_log(__METHOD__." Unset Session ".function_backtrace()); + //make sure session data will be reset + $this->sessionData = array(); + $this->profileData = array(); + self::saveSessionData(); + } + //error_log(__METHOD__.print_r($this->sessionData,true)); + if (isset($this->sessionData['profileData']) && is_a($this->sessionData['profileData'],'ea_preferences')) { + $this->profileData = $this->sessionData['profileData']; + } + } + + function restoreSessionData() + { + //error_log(__METHOD__." Session restore ".function_backtrace()); + // set an own autoload function, search emailadmin for missing classes + $GLOBALS['egw_info']['flags']['autoload'] = array(__CLASS__,'autoload'); + + $this->sessionData = (array) unserialize($GLOBALS['egw']->session->appsession('fm_preferences','felamimail')); + } + + /** + * Autoload classes from emailadmin, 'til they get autoloading conform names + * + * @param string $class + */ + static function autoload($class) + { + if (file_exists($file=EGW_INCLUDE_ROOT.'/emailadmin/inc/class.'.$class.'.inc.php')) + { + include_once($file); + //error_log(__METHOD__."($class) included $file"); + } + elseif (file_exists($file=EGW_INCLUDE_ROOT.'/felamimail/inc/class.'.$class.'.inc.php')) + { + include_once($file); + } + else + { + #error_log(__METHOD__."($class) failed!"); + } + } + + function saveSessionData() + { + $GLOBALS['egw']->session->appsession('fm_preferences','felamimail',serialize($this->sessionData)); + } + // get the first active user defined account + function getAccountData(&$_profileData, $_accountID=NULL) + { + #echo "

    backtrace: ".function_backtrace()."

    \n"; + if(!is_a($_profileData, 'ea_preferences')) + die(__FILE__.': '.__LINE__); + $accountData = parent::getAccountData($GLOBALS['egw_info']['user']['account_id'],$_accountID); + + // currently we use only the first profile available + $accountData = array_shift($accountData); + #_debug_array($accountData); + + $icServer = CreateObject('emailadmin.defaultimap'); + $icServer->encryption = isset($accountData['ic_encryption']) ? $accountData['ic_encryption'] : 1; + $icServer->host = $accountData['ic_hostname']; + $icServer->port = isset($accountData['ic_port']) ? $accountData['ic_port'] : 143; + $icServer->validatecert = isset($accountData['ic_validatecertificate']) ? (bool)$accountData['ic_validatecertificate'] : 1; + $icServer->username = $accountData['ic_username']; + $icServer->loginName = $accountData['ic_username']; + $icServer->password = $accountData['ic_password']; + $icServer->enableSieve = isset($accountData['ic_enable_sieve']) ? (bool)$accountData['ic_enable_sieve'] : 1; + $icServer->sieveHost = $accountData['ic_sieve_server']; + $icServer->sievePort = isset($accountData['ic_sieve_port']) ? $accountData['ic_sieve_port'] : 2000; + if ($accountData['ic_folderstoshowinhome']) $icServer->folderstoshowinhome = $accountData['ic_folderstoshowinhome']; + if ($accountData['ic_trashfolder']) $icServer->trashfolder = $accountData['ic_trashfolder']; + if ($accountData['ic_sentfolder']) $icServer->sentfolder = $accountData['ic_sentfolder']; + if ($accountData['ic_draftfolder']) $icServer->draftfolder = $accountData['ic_draftfolder']; + if ($accountData['ic_templatefolder']) $icServer->templatefolder = $accountData['ic_templatefolder']; + + $ogServer = CreateObject('emailadmin.defaultsmtp'); + $ogServer->host = $accountData['og_hostname']; + $ogServer->port = isset($accountData['og_port']) ? $accountData['og_port'] : 25; + $ogServer->smtpAuth = (bool)$accountData['og_smtpauth']; + if($ogServer->smtpAuth) { + $ogServer->username = $accountData['og_username']; + $ogServer->password = $accountData['og_password']; + } + + $identity = CreateObject('emailadmin.ea_identity'); + $identity->emailAddress = $accountData['emailaddress']; + $identity->realName = $accountData['realname']; + //$identity->default = true; + $identity->default = (bool)$accountData['active']; + $identity->organization = $accountData['organization']; + $identity->signature = $accountData['signatureid']; + $identity->id = $accountData['id']; + + $isActive = (bool)$accountData['active']; + + return array('icServer' => $icServer, 'ogServer' => $ogServer, 'identity' => $identity, 'active' => $isActive); + } + + function getAllAccountData(&$_profileData) + { + if(!is_a($_profileData, 'ea_preferences')) + die(__FILE__.': '.__LINE__); + $AllAccountData = parent::getAccountData($GLOBALS['egw_info']['user']['account_id'],'all'); + #_debug_array($accountData); + foreach ($AllAccountData as $key => $accountData) + { + $icServer = CreateObject('emailadmin.defaultimap'); + $icServer->encryption = isset($accountData['ic_encryption']) ? $accountData['ic_encryption'] : 1; + $icServer->host = $accountData['ic_hostname']; + $icServer->port = isset($accountData['ic_port']) ? $accountData['ic_port'] : 143; + $icServer->validatecert = isset($accountData['ic_validatecertificate']) ? (bool)$accountData['ic_validatecertificate'] : 1; + $icServer->username = $accountData['ic_username']; + $icServer->loginName = $accountData['ic_username']; + $icServer->password = $accountData['ic_password']; + $icServer->enableSieve = isset($accountData['ic_enable_sieve']) ? (bool)$accountData['ic_enable_sieve'] : 1; + $icServer->sieveHost = $accountData['ic_sieve_server']; + $icServer->sievePort = isset($accountData['ic_sieve_port']) ? $accountData['ic_sieve_port'] : 2000; + if ($accountData['ic_folderstoshowinhome']) $icServer->folderstoshowinhome = $accountData['ic_folderstoshowinhome']; + if ($accountData['ic_trashfolder']) $icServer->trashfolder = $accountData['ic_trashfolder']; + if ($accountData['ic_sentfolder']) $icServer->sentfolder = $accountData['ic_sentfolder']; + if ($accountData['ic_draftfolder']) $icServer->draftfolder = $accountData['ic_draftfolder']; + if ($accountData['ic_templatefolder']) $icServer->templatefolder = $accountData['ic_templatefolder']; + + $ogServer = CreateObject('emailadmin.defaultsmtp'); + $ogServer->host = $accountData['og_hostname']; + $ogServer->port = isset($accountData['og_port']) ? $accountData['og_port'] : 25; + $ogServer->smtpAuth = (bool)$accountData['og_smtpauth']; + if($ogServer->smtpAuth) { + $ogServer->username = $accountData['og_username']; + $ogServer->password = $accountData['og_password']; + } + + $identity = CreateObject('emailadmin.ea_identity'); + $identity->emailAddress = $accountData['emailaddress']; + $identity->realName = $accountData['realname']; + //$identity->default = true; + $identity->default = (bool)$accountData['active']; + $identity->organization = $accountData['organization']; + $identity->signature = $accountData['signatureid']; + $identity->id = $accountData['id']; + $isActive = (bool)$accountData['active']; + $out[] = array('icServer' => $icServer, 'ogServer' => $ogServer, 'identity' => $identity, 'active' => $isActive); + } + return $out; + } + + function getUserDefinedIdentities() + { + $profileData = $this->boemailadmin->getUserProfile('felamimail'); + if(!is_a($profileData, 'ea_preferences') || !is_a($profileData->ic_server[0], 'defaultimap')) { + return false; + } + if($profileData->userDefinedAccounts || $profileData->userDefinedIdentities) { + // get user defined accounts + $allAccountData = $this->getAllAccountData($profileData); + if ($allAccountData) { + foreach ($allAccountData as $tmpkey => $accountData) + { + $accountArray[] = $accountData['identity']; + } + return $accountArray; + } + } + return array(); + } + + function getPreferences() + { + if (isset($this->sessionData['profileData']) && is_a($this->sessionData['profileData'],'ea_preferences')) { + $this->profileData = $this->sessionData['profileData']; + } + if(!is_a($this->profileData,'ea_preferences')) { + $imapServerTypes = $this->boemailadmin->getIMAPServerTypes(); + $profileData = $this->boemailadmin->getUserProfile('felamimail'); + + if(!is_a($profileData, 'ea_preferences') || !is_a($profileData->ic_server[0], 'defaultimap')) { + return false; + } + if($profileData->userDefinedAccounts && $GLOBALS['egw_info']['user']['apps']['felamimail']) { + // get user defined accounts + $accountData = $this->getAccountData($profileData); + + if($accountData['active']) { + + // replace the global defined IMAP Server + if(is_a($accountData['icServer'],'defaultimap')) + $profileData->setIncomingServer($accountData['icServer'],0); + + // replace the global defined SMTP Server + if(is_a($accountData['ogServer'],'defaultsmtp')) + $profileData->setOutgoingServer($accountData['ogServer'],0); + + // replace the global defined identity + if(is_a($accountData['identity'],'ea_identity')) { + //_debug_array($profileData); + $rememberIdentities = $profileData->identities; + $profileData->setIdentity($accountData['identity'],0); + $rememberID = $accountData['identity']->id; + } + } + } + if($profileData->userDefinedIdentities && $GLOBALS['egw_info']['user']['apps']['felamimail']) + { + $allUserIdentities = $this->getUserDefinedIdentities(); + if (is_array($allUserIdentities)) + { + $i=count($allUserIdentities); + $y=-1; + foreach ($allUserIdentities as $tmpkey => $id) + { + if ($id->id != $rememberID) + { + $profileData->setIdentity($id,$i); + $i++; + } + else + { + foreach ($rememberIdentities as $adkey => $ident) + { + $profileData->setIdentity($ident,$i); + $profileData->identities[$i]->default = false; + $profileData->identities[$i]->id = $y; + $i++; + $y--; + } + } + } + } + } + + $GLOBALS['egw']->preferences->read_repository(); + $userPrefs = $GLOBALS['egw_info']['user']['preferences']['felamimail']; + # echo "

    backtrace: ".function_backtrace()."

    \n"; + if (is_array($profileData->ic_server[0]->folderstoshowinhome) && !empty($profileData->ic_server[0]->folderstoshowinhome[0])) { + $userPrefs['mainscreen_showfolders'] = implode(',',$profileData->ic_server[0]->folderstoshowinhome); + } + if (!empty($profileData->ic_server[0]->sentfolder)) $userPrefs['sentFolder'] = $profileData->ic_server[0]->sentfolder; + if (!empty($profileData->ic_server[0]->trashfolder)) $userPrefs['trashFolder'] = $profileData->ic_server[0]->trashfolder; + if (!empty($profileData->ic_server[0]->draftfolder)) $userPrefs['draftFolder'] = $profileData->ic_server[0]->draftfolder; + if (!empty($profileData->ic_server[0]->templatefolder)) $userPrefs['templateFolder'] = $profileData->ic_server[0]->templatefolder; + if(empty($userPrefs['deleteOptions'])) + $userPrefs['deleteOptions'] = 'mark_as_deleted'; + + if (!empty($userPrefs['trash_folder'])) + $userPrefs['move_to_trash'] = True; + if (!empty($userPrefs['sent_folder'])) + $userPrefs['move_to_sent'] = True; + + $userPrefs['signature'] = $userPrefs['email_sig']; + + unset($userPrefs['email_sig']); + + $profileData->setPreferences($userPrefs); + + #_debug_array($profileData);#exit; + + $this->sessionData['profileData'] = $this->profileData = $profileData; + $this->saveSessionData(); + #_debug_array($this->profileData); + } + return $this->profileData; + } + + function ggetSignature($_signatureID, $_unparsed = false) + { + if($_signatureID == -1) { + $profileData = $this->boemailadmin->getUserProfile('felamimail'); + + $systemSignatureIsDefaultSignature = !parent::getDefaultSignature($GLOBALS['egw_info']['user']['account_id']); + + $systemSignature = array( + 'signatureid' => -1, + 'description' => 'eGroupWare '. lang('default signature'), + 'signature' => ($_unparsed === true ? $profileData->ea_default_signature : $GLOBALS['egw']->preferences->parse_notify($profileData->ea_default_signature)), + 'defaultsignature' => $systemSignatureIsDefaultSignature, + ); + + return $systemSignature; + + } else { + require_once('class.felamimail_signatures.inc.php'); + $signature = new felamimail_signatures($_signatureID); + if($_unparsed === false) { + $signature->fm_signature = $GLOBALS['egw']->preferences->parse_notify($signature->fm_signature); + } + return $signature; + } + } + + function ggetDefaultSignature() + { + return parent::getDefaultSignature($GLOBALS['egw_info']['user']['account_id']); + } + + function ddeleteSignatures($_signatureID) + { + if(!is_array($_signatureID)) { + return false; + } + return parent::deleteSignatures($GLOBALS['egw_info']['user']['account_id'], $_signatureID); + } + + function saveAccountData($_icServer, $_ogServer, $_identity) + { + if(is_object($_icServer) && !isset($_icServer->validatecert)) { + $_icServer->validatecert = true; + } + if(isset($_icServer->host)) { + $_icServer->sieveHost = $_icServer->host; + } + $this->sessionData = array(); + $this->saveSessionData(); + return parent::saveAccountData($GLOBALS['egw_info']['user']['account_id'], $_icServer, $_ogServer, $_identity); + } + + function deleteAccountData($_identity) + { + if (is_array($_identity)) { + foreach ($_identity as $tmpkey => $id) + { + if ($id->id) { + $identity[] = $id->id; + } else { + $identity[] = $id; + } + } + } else { + $identity = $_identity; + } + $this->sessionData = array(); + $this->saveSessionData(); + parent::deleteAccountData($GLOBALS['egw_info']['user']['account_id'], $identity); + } + + function ssaveSignature($_signatureID, $_description, $_signature, $_isDefaultSignature) + { + return parent::saveSignature($GLOBALS['egw_info']['user']['account_id'], $_signatureID, $_description, $_signature, (bool)$_isDefaultSignature); + } + + function setProfileActive($_status, $_identity=NULL) + { + $this->sessionData = array(); + $this->saveSessionData(); + parent::setProfileActive($GLOBALS['egw_info']['user']['account_id'], $_status, $_identity); + } + } +?> diff --git a/felamimail/inc/class.bosieve.inc.php b/felamimail/inc/class.bosieve.inc.php new file mode 100644 index 0000000000..c13900df1e --- /dev/null +++ b/felamimail/inc/class.bosieve.inc.php @@ -0,0 +1,197 @@ +scriptName = (!empty($GLOBALS['egw_info']['user']['preferences']['felamimail']['sieveScriptName']) ? $GLOBALS['egw_info']['user']['preferences']['felamimail']['sieveScriptName'] : 'felamimail'); + + $this->displayCharset = $GLOBALS['egw']->translation->charset(); + + if (!is_null($_icServer) && $this->_connect($_icServer) === 'die') { + die('Sieve not activated'); + } + } + + /** + * Open connection to the sieve server + * + * @param defaultimap $_icServer + * @param string $euser='' effictive user, if given the Cyrus admin account is used to login on behalf of $euser + * @return mixed 'die' = sieve not enabled, false=connect or login failure, true=success + */ + function _connect($_icServer,$euser='') + { + if(is_a($_icServer,'defaultimap') && $_icServer->enableSieve) { + $sieveHost = $_icServer->host; + $sievePort = $_icServer->sievePort; + $useTLS = $_icServer->encryption > 0; + if ($euser) { + $username = $_icServer->adminUsername; + $password = $_icServer->adminPassword; + } else { + $username = $_icServer->loginName; + $password = $_icServer->password; + } + $this->icServer = $_icServer; + } else { + return 'die'; + } + + if(PEAR::isError($this->error = $this->connect($sieveHost , $sievePort, null, $useTLS) ) ){ + if ($this->debug) error_log(__CLASS__.'::'.__METHOD__.": error in connect($sieveHost,$sievePort): ".$this->error->getMessage()); + return false; + } + if(PEAR::isError($this->error = $this->login($username, $password, null, $euser) ) ){ + if ($this->debug) error_log(__CLASS__.'::'.__METHOD__.": error in login($username,$password,null,$euser): ".$this->error->getMessage()); + return false; + } + return true; + } + + function getRules($_scriptName) { + return $this->rules; + } + + function getVacation($_scriptName) { + return $this->vacation; + } + + function getEmailNotification($_scriptName) { + return $this->emailNotification; + } + + function setRules($_scriptName, $_rules) + { + $script =& CreateObject('felamimail.Script',$_scriptName); + $script->debug = $this->debug; + + if($script->retrieveRules($this)) { + $script->rules = $_rules; + $script->updateScript($this); + + return true; + } + + return false; + } + + function setVacation($_scriptName, $_vacation) + { + if ($this->debug) error_log(__CLASS__.'::'.__METHOD__."($_scriptName,".print_r($_vacation,true).')'); + $script =& CreateObject('felamimail.Script',$_scriptName); + $script->debug = $this->debug; + + if($script->retrieveRules($this)) { + $script->vacation = $_vacation; + $script->updateScript($this); + + // setting up an async job to enable/disable the vacation message + include_once(EGW_API_INC.'/class.asyncservice.inc.php'); + $async = new asyncservice(); + $user = $GLOBALS['egw_info']['user']['account_id']; + $async->delete($async_id ="felamimail-vacation-$user"); + $end_date = $_vacation['end_date'] + 24*3600; // end-date is inclusive, so we have to add 24h + if ($_vacation['status'] == 'by_date' && time() < $end_date) + { + $time = time() < $_vacation['start_date'] ? $_vacation['start_date'] : $end_date; + $async->set_timer($time,$async_id,'felamimail.bosieve.async_vacation',$_vacation+array('scriptName'=>$_scriptName),$user); + } + return true; + } + if ($this->debug) error_log(__CLASS__.'::'.__METHOD__."($_scriptName,".print_r($_vacation,true).') could not retrieve rules!'); + + return false; + } + + /** + * Callback for the async job to enable/disable the vacation message + * + * @param array $_vacation + */ + function async_vacation($_vacation) + { + if ($this->debug) error_log(__CLASS__.'::'.__METHOD__.'('.print_r($_vacation,true).')'); + // unset the fm_preferences session object, to force the reload/rebuild + $GLOBALS['egw']->session->appsession('fm_preferences','felamimail',serialize(array())); + $GLOBALS['egw']->session->appsession('session_data','emailadmin',serialize(array())); + + $_restoreSession = false; // as in async, each call may be for a different user + $bopreferences = CreateObject('felamimail.bopreferences',$_restoreSession); + $mailPreferences = $bopreferences->getPreferences(); + $icServer = $mailPreferences->getIncomingServer(0); + //error_log(__METHOD__.$icServer->loginName); + if ($this->_connect($icServer,$icServer->loginName) === true) { + $this->setVacation($_vacation['scriptName'],$_vacation); + // we need to logout, so further vacation's get processed + $error = $this->_cmdLogout(); + if ($this->debug) error_log(__CLASS__.'::'.__METHOD__.' logout '.(PEAR::isError($error) ? 'failed: '.$ret->getMessage() : 'successful')); + } + } + + function setEmailNotification($_scriptName, $_emailNotification) { + if ($_emailNotification['externalEmail'] == '' || !preg_match("/\@/",$_emailNotification['externalEmail'])) { + $_emailNotification['status'] = 'off'; + $_emailNotification['externalEmail'] = ''; + } + + $script =& CreateObject('felamimail.Script',$_scriptName); + if ($script->retrieveRules($this)) { + $script->emailNotification = $_emailNotification; + return $script->updateScript($this); + } + return false; + } + + function retrieveRules($_scriptName) { + $script =& CreateObject('felamimail.Script',$_scriptName); + + if($script->retrieveRules($this)) { + $this->rules = $script->rules; + $this->vacation = $script->vacation; + $this->emailNotification = $script->emailNotification; // Added email notifications + return true; + } + + return false; + } + } +?> diff --git a/felamimail/inc/class.felamimail_bosignatures.inc.php b/felamimail/inc/class.felamimail_bosignatures.inc.php new file mode 100644 index 0000000000..e4ff06d613 --- /dev/null +++ b/felamimail/inc/class.felamimail_bosignatures.inc.php @@ -0,0 +1,148 @@ +profileData = $boemailadmin->getUserProfile('felamimail'); + } + + function getListOfSignatures() { + $boemailadmin = new emailadmin_bo(); + $fmSignatures = new felamimail_signatures(); + + #$profileData = $boemailadmin->getUserProfile('felamimail'); + + $systemSignatures = array(); + if(!empty($this->profileData->ea_default_signature)) { + $systemSignatures[-1] = array( + 'fm_signatureid' => -1, + 'fm_description' => lang('system signature'), + 'fm_defaultsignature' => FALSE, + ); + + if($this->profileData->ea_user_defined_signatures != true) { + $systemSignatures[-1]['fm_defaultsignature'] = TRUE; + } + } + // return only systemsignature, if no user defined signatures are enabled + if($this->profileData->ea_user_defined_signatures != true) { + return $systemSignatures; + } + + $signatures = $fmSignatures->search(); + + if(count($signatures) == 0 && + !isset($GLOBALS['egw_info']['user']['preferences']['felamimail']['email_sig_copied']) && + !empty($GLOBALS['egw_info']['user']['preferences']['felamimail']['email_sig'])) { + + $GLOBALS['egw']->preferences->read_repository(); + $newSignature = new felamimail_signatures(); + $newSignature->fm_description = lang('default signature'); + $newSignature->fm_signature = nl2br($GLOBALS['egw_info']['user']['preferences']['felamimail']['email_sig']); + $newSignature->fm_defaultsignature = true; + $newSignature->save(); + $GLOBALS['egw']->preferences->add('felamimail', 'email_sig_copied', true); + $GLOBALS['egw']->preferences->save_repository(); + + $signatures = $fmSignatures->search(); + } + + // make systemsignature the default, if no other signature is defined as default signature + if($fmSignatures->getDefaultSignature() === false) { + $systemSignatures[-1]['fm_defaultsignature'] = TRUE; + } + + $signatures = array_merge($systemSignatures, $signatures); + #_debug_array($signatures); + return $signatures; + } + + function getSignature($_signatureID, $_unparsed = false) + { + if($_signatureID == -1) { + + $systemSignatureIsDefaultSignature = $this->getDefaultSignature(); + + $signature = new felamimail_signatures(); + $signature->fm_signatureid = -1; + $signature->fm_description = 'eGroupWare '. lang('default signature'); + $signature->fm_signature = ($_unparsed === true ? $this->profileData->ea_default_signature : $GLOBALS['egw']->preferences->parse_notify($this->profileData->ea_default_signature)); + $signature->fm_defaultsignature = $systemSignatureIsDefaultSignature; + + return $signature; + + } else { + require_once('class.felamimail_signatures.inc.php'); + $signature = new felamimail_signatures($_signatureID); + if($_unparsed === false) { + $signature->fm_signature = ($_unparsed === true ? $this->profileData->ea_default_signature : $GLOBALS['egw']->preferences->parse_notify($signature->fm_signature)); + } + return $signature; + } + } + + function getDefaultSignature($accountID = NULL) + { + $signature = new felamimail_signatures(); + return $signature->getDefaultSignature(); + #return parent::getDefaultSignature($GLOBALS['egw_info']['user']['account_id']); + } + + function deleteSignatures($_signatureID) + { + if(!is_array($_signatureID)) { + return false; + } + $signature = new felamimail_signatures(); + foreach($_signatureID as $signatureID) { + #error_log("$signatureID"); + $signature->delete($signatureID); + } + #return parent::deleteSignatures($GLOBALS['egw_info']['user']['account_id'], $_signatureID); + } + + function saveSignature($_signatureID, $_description, $_signature, $_isDefaultSignature) + { + if($_signatureID == -1) { + // the systemwide profile + // can only be made the default profile + + return -1; + } else { + if($this->profileData->ea_user_defined_signatures == false) { + return false; + } + + $signature = new felamimail_signatures(); + + $signature->fm_description = $_description; + $signature->fm_signature = $_signature; + $signature->fm_defaultsignature = (bool)$_isDefaultSignature; + if((int)$_signatureID > 0) { + $signature->fm_signatureid = (int)$_signatureID; + } + + $signature->save(); + + return $signature->fm_signatureid; + } + } + + } +?> diff --git a/felamimail/inc/class.felamimail_bostationery.inc.php b/felamimail/inc/class.felamimail_bostationery.inc.php new file mode 100644 index 0000000000..2a998b718c --- /dev/null +++ b/felamimail/inc/class.felamimail_bostationery.inc.php @@ -0,0 +1,125 @@ + + * @copyright (c) 2009 by christian@jaytraxx.de + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id: class.felamimail_bostationery.inc.php 27660 2009-08-17 14:45:42Z jaytraxx $ + */ + +class felamimail_bostationery +{ + /** + * application stationery is working for + * + */ + const _appname = 'felamimail'; + + /** + * prefix for the etemplate stationery templates + * + */ + const _stationery_prefix = 'felamimail.stationery'; + + /** + * etemplate object + * @var object + */ + private $etemplate; + + /** + * constructor of bostationery + * + */ + public function __construct() + { + $this->etemplate = new etemplate(); + } + + /* + * returns all active templates set in emailadmin profile + * + * @return array $index => $id pairs or empty array if no active templates found + */ + private function get_active_templates() + { + $boemailadmin = new emailadmin_bo(); + $profile_data = $boemailadmin->getUserProfile(self::_appname); + $active_templates = $profile_data->ea_stationery_active_templates; + + return $active_templates; + } + + /* + * returns all stored etemplate templates + * + * @return array $id => $description pairs or empty array if no stored templates found + */ + public function get_stored_templates() + { + // ensure that templates are actually loaded into the database + $this->etemplate->test_import(self::_appname); + + $templates = $this->etemplate->search(self::_stationery_prefix); + $stored_templates = array(); + + if(is_array($templates) && count($templates) > 0) + { + foreach($templates as $template) + { + list(,,$template_description) = explode('.',$template['name']); + $stored_templates[$template['name']] = $template_description; + } + } + + return $stored_templates; + } + + /* + * returns all valid templates + * a valid template is a template that is set active in emailadmin + * AND exists (is stored) in etemplate + * + * @return array $id => $description pairs or empty array if no valid templates found + */ + public function get_valid_templates() + { + $active_templates = $this->get_active_templates(); + $stored_templates = $this->get_stored_templates(); + + $valid_templates = array(); + foreach((array)$active_templates as $index => $id) + { + if(isset($stored_templates[$id])) + { + $valid_templates[$id] = $stored_templates[$id]; + } + } + + return $valid_templates; + } + + /* + * renders the mail body with a given stationery template + * + * @param string $_id the stationery id to render + * @param string $_message the mail message + * @param string $_signature='' the mail signature + * + * @return string complete html rendered mail body + */ + function render($_id,$_message,$_signature='') + { + $content = array(); + $content['message'] = $_message; + $content['signature'] = $_signature; + + $this->etemplate->read($_id); + $mail_body = $this->etemplate->exec(false, $content, false, false, false, 3); + + return $mail_body; + } +} diff --git a/felamimail/inc/class.felamimail_hooks.inc.php b/felamimail/inc/class.felamimail_hooks.inc.php new file mode 100644 index 0000000000..644a903bad --- /dev/null +++ b/felamimail/inc/class.felamimail_hooks.inc.php @@ -0,0 +1,749 @@ + array( + 'menuaction' => 'felamimail.uidisplay.display', + ), + 'view_popup' => '850xegw_getWindowOuterHeight()', + 'add' => array( + 'menuaction' => 'felamimail.uicompose.compose', + ), + 'add_popup' => '850xegw_getWindowOuterHeight()', + ); + } + + /** + * Settings hook + * + * @param array|string $hook_data + */ + static function settings($hook_data) + { + unset($GLOBALS['egw_info']['user']['preferences']['common']['auto_hide_sidebox']); + if (!$hook_data['setup']) // does not work on setup time + { + $folderList = array(); + + $bofelamimail =& CreateObject('felamimail.bofelamimail',$GLOBALS['egw']->translation->charset()); + if($bofelamimail->openConnection()) { + $folderObjects = $bofelamimail->getFolderObjects(true, false); + foreach($folderObjects as $folderName => $folderInfo) { + #_debug_array($folderData); + $folderList[$folderName] = $folderInfo->displayName; + } + $bofelamimail->closeConnection(); + } + + $availableAutoFolders['none'] = lang('none, create all'); + foreach(bofelamimail::$autoFolders as $aname) { + $availableAutoFolders[$aname] = lang($aname); + } + + $felamimailConfig = config::read('felamimail'); + } + $refreshTime = array( + '0' => lang('disabled'), + '1' => '1', + '2' => '2', + '3' => '3', + '4' => '4', + '5' => '5', + '6' => '6', + '7' => '7', + '8' => '8', + '9' => '9', + '10' => '10', + '15' => '15', + '20' => '20', + '30' => '30' + ); + + $no_yes = array( + '0' => lang('no'), + '1' => lang('yes') + ); + $no_yes_copy = array_merge($no_yes,array('2'=>lang('yes, offer copy option'))); + + $prefAllowManageFolders = $no_yes; + + $forwardOptions = array( + 'asmail' => lang('forward as attachment'), + 'inline' => lang('forward inline'), + ); + + $sortOrder = array( + '0' => lang('date(newest first)'), + '1' => lang('date(oldest first)'), + '3' => lang('from(A->Z)'), + '2' => lang('from(Z->A)'), + '5' => lang('subject(A->Z)'), + '4' => lang('subject(Z->A)'), + '7' => lang('size(0->...)'), + '6' => lang('size(...->0)') + ); + + $selectOptions = array_merge( + $no_yes, + array('2' => lang('yes') . ' - ' . lang('small view')) + ); + $newWindowOptions = array( + '1' => lang('only one window'), + '2' => lang('allways a new window'), + ); + + $deleteOptions = array( + 'move_to_trash' => lang('move to trash'), + 'mark_as_deleted' => lang('mark as deleted'), + 'remove_immediately' => lang('remove immediately') + ); + + $composeOptions = array( + 'html' => lang('html'), + 'text' => lang('text/plain'), + ); + + $htmlOptions = array( + 'never_display' => lang('never display html emails'), + 'only_if_no_text' => lang('display only when no plain text is available'), + 'always_display' => lang('always show html emails'), + ); + + $rowOrderStyle = array( + 'felamimail' => lang('FeLaMiMail'), + 'outlook' => 'Outlook', + ); + + // otherwise we get warnings during setup + if (!is_array($folderList)) $folderList = array(); + + $trashOptions = array_merge( + array( + 'none' => lang("Don't use Trash") + ), + $folderList + ); + + $sentOptions = array_merge( + array( + 'none' => lang("Don't use Sent") + ), + $folderList + ); + + $draftOptions = array_merge( + array( + 'none' => lang("Don't use draft folder") + ), + $folderList + ); + + $templateOptions = array_merge( + array( + 'none' => lang("Don't use template folder") + ), + $folderList + ); + + // modify folderlist, add a none entry, to be able to force the regarding settings, if no folders apply + $folderList['none'] = lang('no folders'); + + /* Settings array for this app */ + return array( + 'refreshTime' => array( + 'type' => 'select', + 'label' => 'Refresh time in minutes', + 'name' => 'refreshTime', + 'values' => $refreshTime, + 'xmlrpc' => True, + 'admin' => False, + 'forced'=> 5, + ), + 'prefaskformove' => array( + 'type' => 'select', + 'label' => 'Do you want to be asked for confirmation before moving selected messages to another folder?', + 'name' => 'prefaskformove', + 'values' => $no_yes_copy, + 'xmlrpc' => True, + 'admin' => False, + 'forced' => '1', + ), + 'prefpreventmanagefolders' => array( + 'type' => 'select', + 'label' => 'Do you want to prevent the managing of folders (creation, accessrights AND subscribtion)?', + 'name' => 'prefpreventmanagefolders', + 'values' => $prefAllowManageFolders, + 'xmlrpc' => True, + 'admin' => False, + 'forced' => '0', + ), + 'prefpreventforwarding' => array( + 'type' => 'select', + 'label' => 'Do you want to prevent the editing/setup for forwarding of mails via settings (, even if SIEVE is enabled)?', + 'name' => 'prefpreventforwarding', + 'values' => $no_yes, + 'xmlrpc' => True, + 'admin' => False, + 'forced' => '0', + ), + 'prefpreventnotificationformailviaemail' => array( + 'type' => 'select', + 'label' => 'Do you want to prevent the editing/setup of notification by mail to other emailadresses if emails arrive (, even if SIEVE is enabled)?', + 'name' => 'prefpreventnotificationformailviaemail', + 'values' => $no_yes, + 'xmlrpc' => True, + 'admin' => False, + 'forced' => '1', + ), + 'prefpreventeditfilterrules' => array( + 'type' => 'select', + 'label' => 'Do you want to prevent the editing/setup of filter rules (, even if SIEVE is enabled)?', + 'name' => 'prefpreventeditfilterrules', + 'values' => $no_yes, + 'xmlrpc' => True, + 'admin' => False, + 'forced' => '0', + ), + 'prefpreventabsentnotice' => array( + 'type' => 'select', + 'label' => 'Do you want to prevent the editing/setup of the absent/vacation notice (, even if SIEVE is enabled)?', + 'name' => 'prefpreventabsentnotice', + 'values' => $no_yes, + 'xmlrpc' => True, + 'admin' => False, + 'forced' => '0', + ), + 'notavailableautofolders' => array( + 'type' => 'multiselect', + 'label' => 'which folders - in general - should NOT be automatically created, if not existing', + 'name' => 'notavailableautofolders', + 'values' => $availableAutoFolders, + 'xmlrpc' => True, + 'admin' => False, + 'forced' => 'none', + ), + 'sortOrder' => array( + 'type' => 'select', + 'label' => 'Default sorting order', + 'name' => 'sortOrder', + 'values' => $sortOrder, + 'xmlrpc' => True, + 'admin' => False, + 'default'=> '0', // newest first + ), + 'rowOrderStyle' => array( + 'type' => 'select', + 'label' => 'row order style', + 'name' => 'rowOrderStyle', + 'values' => $rowOrderStyle, + 'xmlrpc' => True, + 'admin' => False, + 'default'=> 'felamimail', + ), + 'PreViewFrameHeight' => array( + 'type' => 'input', + 'label' => '3PaneView: If you want to see a preview of a mail by single clicking onto the subject, set the height for the message-list and the preview area here (300 seems to be a good working value). The preview will be displayed at the end of the message list on demand (click).', + 'name' => 'PreViewFrameHeight', + 'xmlrpc' => True, + 'admin' => False, + 'forced' => '300', + ), + 'message_forwarding' => array( + 'type' => 'select', + 'label' => 'how to forward messages', + 'name' => 'message_forwarding', + 'values' => $forwardOptions, + 'xmlrpc' => True, + 'admin' => False, + 'default'=> 'asmail', + ), + 'mainscreen_showmail' => array( + 'type' => 'select', + 'label' => 'show new messages on main screen', + 'name' => 'mainscreen_showmail', + 'values' => $selectOptions, + 'xmlrpc' => True, + 'admin' => False, + ), + 'mainscreen_showfolders' => array( + 'type' => 'multiselect', + 'label' => 'if shown, which folders should appear on main screen', + 'name' => 'mainscreen_showfolders', + 'values' => $folderList, + 'xmlrpc' => True, + 'admin' => False, + ), + 'messages_showassent_0' => array( + 'type' => 'multiselect', + 'label' => 'which folders (additional to the Sent Folder) should be displayed using the Sent Folder View Schema', + 'name' => 'messages_showassent_0', + 'values' => $folderList, + 'xmlrpc' => True, + 'admin' => False, + 'forced' => 'none', + ), + 'notify_folders' => array( + 'type' => 'multiselect', + 'label' => 'notify when new mails arrive on these folders', + 'name' => 'notify_folders', + 'values' => $folderList, + 'xmlrpc' => True, + 'admin' => False, + ), + 'message_newwindow' => array( + 'type' => 'select', + 'label' => 'display messages in multiple windows', + 'name' => 'message_newwindow', + 'values' => $newWindowOptions, + 'xmlrpc' => True, + 'admin' => False, + 'forced' => '1', + ), + 'deleteOptions' => array( + 'type' => 'select', + 'label' => 'when deleting messages', + 'name' => 'deleteOptions', + 'values' => $deleteOptions, + 'xmlrpc' => True, + 'admin' => False, + 'default'=> 'move_to_trash', + ), + 'composeOptions' => array( + 'type' => 'select', + 'label' => 'start new messages with mime type plain/text or html?', + 'name' => 'composeOptions', + 'values' => $composeOptions, + 'xmlrpc' => True, + 'admin' => False, + 'default'=> 'html', + ), + 'htmlOptions' => array( + 'type' => 'select', + 'label' => 'display of html emails', + 'name' => 'htmlOptions', + 'values' => $htmlOptions, + 'xmlrpc' => True, + 'admin' => False, + 'forced' => 'only_if_no_text', + ), + 'allowExternalIMGs' => array( + 'type' => 'check', + 'label' => 'allow images from external sources in html emails', + 'name' => 'allowExternalIMGs', + 'xmlrpc' => True, + 'admin' => True, + 'forced' => true, + ), + 'trashFolder' => array( + 'type' => 'select', + 'label' => 'trash folder', + 'name' => 'trashFolder', + 'values' => $trashOptions, + 'xmlrpc' => True, + 'admin' => False, + ), + 'sentFolder' => array( + 'type' => 'select', + 'label' => 'sent folder', + 'name' => 'sentFolder', + 'values' => $sentOptions, + 'xmlrpc' => True, + 'admin' => False, + ), + 'draftFolder' => array( + 'type' => 'select', + 'label' => 'draft folder', + 'name' => 'draftFolder', + 'values' => $draftOptions, + 'xmlrpc' => True, + 'admin' => False, + ), + 'templateFolder' => array( + 'type' => 'select', + 'label' => 'template folder', + 'name' => 'templateFolder', + 'values' => $templateOptions, + 'xmlrpc' => True, + 'admin' => False, + ), + 'showAllFoldersInFolderPane' => array( + 'type' => 'select', + 'label' => 'show all Folders (subscribed AND unsubscribed) in Main Screen Folder Pane', + 'name' => 'showAllFoldersInFolderPane', + 'values' => $no_yes, + 'xmlrpc' => True, + 'default'=> 0, + 'admin' => False, + ), + 'sieveScriptName' => array( + 'type' => 'input', + 'label' => 'sieve script name', + 'name' => 'sieveScriptName', + 'xmlrpc' => True, + 'admin' => False, + 'forced' => 'felamimail', + ), + ); + } + + /** + * Preferences hook + * + * @param array|string $hook_data + */ + static function preferences($hook_data) + { + unset($GLOBALS['egw_info']['user']['preferences']['common']['auto_hide_sidebox']); + // Only Modify the $file and $title variables..... + $title = $appname = 'felamimail'; + $mailPreferences = ExecMethod('felamimail.bopreferences.getPreferences'); + + $file['Preferences'] = egw::link('/index.php','menuaction=preferences.uisettings.index&appname=' . $appname); + + if($mailPreferences->userDefinedAccounts) { + $linkData = array + ( + 'menuaction' => 'felamimail.uipreferences.listAccountData', + ); + $file['Manage eMail Accounts and Identities'] = egw::link('/index.php',$linkData); + } + if(empty($mailPreferences->preferences['prefpreventmanagefolders']) || $mailPreferences->preferences['prefpreventmanagefolders'] == 0) { + $file['Manage Folders'] = egw::link('/index.php','menuaction=felamimail.uipreferences.listFolder'); + } + if (is_object($mailPreferences)) + { + $icServer = $mailPreferences->getIncomingServer(0); + + if($icServer->enableSieve) { + if(empty($mailPreferences->preferences['prefpreventeditfilterrules']) || $mailPreferences->preferences['prefpreventeditfilterrules'] == 0) + $file['filter rules'] = egw::link('/index.php', 'menuaction=felamimail.uisieve.listRules'); + if(empty($mailPreferences->preferences['prefpreventabsentnotice']) || $mailPreferences->preferences['prefpreventabsentnotice'] == 0) + $file['vacation notice'] = egw::link('/index.php','menuaction=felamimail.uisieve.editVacation'); + } + } + //Do not modify below this line + display_section($appname,$title,$file); + } + + /** + * Sidebox menu hook + * + * @param array|string $hook_data + */ + static function sidebox_menu($hook_data) + { + //error_log(__METHOD__); + // always show the side bar + unset($GLOBALS['egw_info']['user']['preferences']['common']['auto_hide_sidebox']); + $appname = 'felamimail'; + $menu_title = $GLOBALS['egw_info']['apps'][$appname]['title'] . ' '. lang('Menu'); + $file = array(); + $bofelamimail =& CreateObject('felamimail.bofelamimail',$GLOBALS['egw']->translation->charset()); + $preferences = $bofelamimail->mailPreferences; + $showMainScreenStuff = false; + if($_GET['menuaction'] == 'felamimail.uifelamimail.viewMainScreen' || + $_GET['menuaction'] == 'felamimail.uifelamimail.changeFolder') { + /* seems to be, its not needed here, as viewMainScreen does it anyway + $GLOBALS['egw']->js->validate_file('dhtmlxtree','js/dhtmlXCommon'); + $GLOBALS['egw']->js->validate_file('dhtmlxtree','js/dhtmlXTree'); + $GLOBALS['egw']->js->validate_file('jscode','viewMainScreen','felamimail'); + $GLOBALS['egw_info']['flags']['include_xajax'] = True; + $GLOBALS['egw']->common->egw_header(); + */ + if (isset($_GET["mailbox"])) + { + $bofelamimail->sessionData['mailbox'] = urldecode($_GET["mailbox"]); + $bofelamimail->sessionData['startMessage']= 1; + $bofelamimail->sessionData['sort'] = $preferences->preferences['sortOrder']; + $bofelamimail->sessionData['activeFilter']= -1; + $bofelamimail->saveSessionData(); + } + $uiwidgets = CreateObject('felamimail.uiwidgets'); + $showMainScreenStuff = true; + } + if (!$showMainScreenStuff) + { + // action links that are mostly static and dont need any connection and additional classes ... + $file += array( + 'felamimail' => egw::link('/index.php','menuaction=felamimail.uifelamimail.viewMainScreen'), + ); + + // standard compose link + $linkData = array( + 'menuaction' => 'felamimail.uicompose.compose' + ); + $file += array( + 'Compose' => "javascript:egw_openWindowCentered('".egw::link('/index.php', $linkData,false)."','compose',700,750);", + ); + } + // buttons + if($showMainScreenStuff) { + + // some buttons + $linkData = array ( + 'menuaction' => 'felamimail.uicompose.compose' + ); + $urlCompose = "egw_appWindow('".$appname."').openComposeWindow('".egw::link('/index.php',$linkData,false)."');"; + + $navbarImages = array( + 'new' => array( + 'action' => $urlCompose, + 'tooltip' => lang('compose'), + ), + 'read_small' => array( + 'action' => "egw_appWindow('".$appname."').flagMessages('read')", + 'tooltip' => lang('mark selected as read'), + ), + 'unread_small' => array( + 'action' => "egw_appWindow('".$appname."').flagMessages('unread')", + 'tooltip' => lang('mark selected as unread'), + ), + 'unread_flagged_small' => array( + 'action' => "egw_appWindow('".$appname."').flagMessages('flagged')", + 'tooltip' => lang('mark selected as flagged'), + ), + 'read_flagged_small' => array( + 'action' => "egw_appWindow('".$appname."').flagMessages('unflagged')", + 'tooltip' => lang('mark selected as unflagged'), + ), + 'delete' => array( + 'action' => "egw_appWindow('".$appname."').deleteMessages(egw_appWindow('".$appname."').xajax.getFormValues('formMessageList'))", + 'tooltip' => lang('mark as deleted'), + ), + ); + + foreach($navbarImages as $buttonName => $buttonInfo) { + $navbarButtons .= $uiwidgets->navbarButton($buttonName, $buttonInfo['action'], $buttonInfo['tooltip']); + } + $file[] = array( + 'text' => " + + + +
    ".$navbarButtons."
    ", + 'no_lang' => True, + 'link' => False, + 'icon' => False, + ); + } + + // empty trash (if available -> move to trash ) + if($preferences->preferences['deleteOptions'] == 'move_to_trash') + { + $file += Array( + '_NewLine_' => '', // give a newline + 'empty trash' => "javascript:egw_appWindow('".$appname."').emptyTrash();", + ); + } + if($preferences->preferences['deleteOptions'] == 'mark_as_deleted') + { + $file += Array( + '_NewLine_' => '', // give a newline + 'compress folder' => "javascript:egw_appWindow('".$appname."').compressFolder();", + ); + } + // import Message link +/* + $linkData = array( + 'menuaction' => 'felamimail.uifelamimail.importMessage', + ); + $file['import message'] = array( + 'text' => ''.lang('import message'), + 'no_lang' => true, + ); +*/ + // select account box, treeview + if($showMainScreenStuff) { + $bofelamimail->restoreSessionData(); + $mailbox = $bofelamimail->sessionData['mailbox'];; + //_debug_array($mailbox); + + $icServerID = 0; + if (is_object($preferences)) + { + // gather profile data + $imapServer =& $preferences->getIncomingServer($icServerID); + // account select box + $selectedID = 0; + if($preferences->userDefinedAccounts) $allAccountData = $bofelamimail->bopreferences->getAllAccountData($preferences); + if ($allAccountData) { + foreach ($allAccountData as $tmpkey => $accountData) + { + $identity =& $accountData['identity']; + $icServer =& $accountData['icServer']; + //_debug_array($identity); + //_debug_array($icServer); + if (empty($icServer->host)) continue; + $identities[$identity->id]=$identity->realName.' '.$identity->organization.' <'.$identity->emailAddress.'>'; + if (!empty($identity->default)) $selectedID = $identity->id; + } + } + // if nothing valid is found return to user defined account definition +// todo klaus: can you move this redirect out of the sidebox on felamimail/index.php + if (empty($imapServer->host) && count($identities)==0 && $preferences->userDefinedAccounts) + { + // redirect to new personal account + egw::redirect_link('/index.php',array('menuaction'=>'felamimail.uipreferences.editAccountData', + 'accountID'=>"new", + 'msg' => lang("There is no IMAP Server configured.")." - ".lang("Please configure access to an existing individual IMAP account."), + )); + } + + $activeIdentity =& $preferences->getIdentity($icServerID); + if ($imapServer->_connected != 1) $connectionStatus = $bofelamimail->openConnection($icServerID); + $folderObjects = $bofelamimail->getFolderObjects(true, false); + $folderStatus = $bofelamimail->getFolderStatus($mailbox); + + // the data needed here are collected at the start of this function + if (!isset($activeIdentity->id) && $selectedID == 0) { + $identities[0] = $activeIdentity->realName.' '.$activeIdentity->organization.' <'.$activeIdentity->emailAddress.'>'; + } + // if you use user defined accounts you may want to access the profile defined with the emailadmin available to the user + if ($activeIdentity->id) { + $boemailadmin = new emailadmin_bo(); + $defaultProfile = $boemailadmin->getUserProfile() ; + #_debug_array($defaultProfile); + $identitys =& $defaultProfile->identities; + $icServers =& $defaultProfile->ic_server; + foreach ($identitys as $tmpkey => $identity) + { + if (empty($icServers[$tmpkey]->host)) continue; + $identities[0] = $identity->realName.' '.$identity->organization.' <'.$identity->emailAddress.'>'; + } + #$identities[0] = $defaultIdentity->realName.' '.$defaultIdentity->organization.' <'.$defaultIdentity->emailAddress.'>'; + } + + $selectAccount = html::select('accountSelect', $selectedID, $identities, true, 'style="width:100%;" onchange="var appWindow=egw_appWindow(\''.$appname.'\');appWindow.changeActiveAccount(this);"'); + + $file[] = array( + 'text' => "
    ".$selectAccount."
    ", + 'no_lang' => True, + 'link' => False, + //'icon' => False, + ); + // show foldertree + //_debug_array($folderObjects); + $folderTree = $uiwidgets->createHTMLFolder + ( + $folderObjects, + $mailbox, + $folderStatus['unseen'], + lang('IMAP Server'), + $imapServer->username.'@'.$imapServer->host, + 'divFolderTree', + FALSE + ); + $bofelamimail->closeConnection(); + $file[] = array( + 'text' => "
    + $folderTree +
    + ", + 'no_lang' => True, + 'link' => False, + 'icon' => False, + ); + } + } + // display them all + display_sidebox($appname,$menu_title,$file); + + if ($GLOBALS['egw_info']['user']['apps']['preferences']) + { + #$mailPreferences = ExecMethod('felamimail.bopreferences.getPreferences'); + $menu_title = lang('Preferences'); + $file = array( + 'Preferences' => egw::link('/index.php','menuaction=preferences.uisettings.index&appname=felamimail'), + ); + + if($preferences->userDefinedAccounts || $preferences->userDefinedIdentities) { + $linkData = array ( + 'menuaction' => 'felamimail.uipreferences.listAccountData', + ); + $file['Manage eMail Accounts and Identities'] = egw::link('/index.php',$linkData); + + } + + if($preferences->ea_user_defined_signatures) { + $linkData = array ( + 'menuaction' => 'felamimail.uipreferences.listSignatures', + ); + $file['Manage Signatures'] = egw::link('/index.php',$linkData); + } + + if(empty($preferences->preferences['prefpreventmanagefolders']) || $preferences->preferences['prefpreventmanagefolders'] == 0) { + $file['Manage Folders'] = egw::link('/index.php',array('menuaction'=>'felamimail.uipreferences.listFolder')); + } + + if (is_object($preferences)) $icServer = $preferences->getIncomingServer(0); + if(is_a($icServer, 'defaultimap')) { + if($icServer->enableSieve) + { + $linkData = array + ( + 'menuaction' => 'felamimail.uisieve.listRules', + ); + if(empty($preferences->preferences['prefpreventeditfilterrules']) || $preferences->preferences['prefpreventeditfilterrules'] == 0) + $file['filter rules'] = egw::link('/index.php',$linkData); + + $linkData = array + ( + 'menuaction' => 'felamimail.uisieve.editVacation', + ); + if(empty($preferences->preferences['prefpreventabsentnotice']) || $preferences->preferences['prefpreventabsentnotice'] == 0) + { + $file['vacation notice'] = egw::link('/index.php',$linkData); + } + if((empty($preferences->preferences['prefpreventnotificationformailviaemail']) || + $preferences->preferences['prefpreventnotificationformailviaemail'] == 0) && + (empty($preferences->preferences['prefpreventforwarding']) || + $preferences->preferences['prefpreventforwarding'] == 0) ) + { + $file['email notification'] = egw::link('/index.php','menuaction=felamimail.uisieve.editEmailNotification'); //Added email notifications + } + } + } + + if (is_object($preferences)) $ogServer = $preferences->getOutgoingServer(0); + if(is_a($ogServer, 'defaultsmtp')) { + if($ogServer->editForwardingAddress) + { + $linkData = array + ( + 'menuaction' => 'felamimail.uipreferences.editForwardingAddress', + ); + if(empty($preferences->preferences['prefpreventforwarding']) || $preferences->preferences['prefpreventforwarding'] == 0) + $file['Forwarding'] = egw::link('/index.php',$linkData); + } + } + display_sidebox($appname,$menu_title,$file); + } + if ($GLOBALS['egw_info']['user']['apps']['admin']) + { + $file = Array( + 'Site Configuration' => egw::link('/index.php','menuaction=emailadmin.emailadmin_ui.index'), + ); + display_sidebox($appname,lang('Admin'),$file); + } + } +} diff --git a/felamimail/inc/class.felamimail_signatures.inc.php b/felamimail/inc/class.felamimail_signatures.inc.php new file mode 100644 index 0000000000..4bbccf93db --- /dev/null +++ b/felamimail/inc/class.felamimail_signatures.inc.php @@ -0,0 +1,169 @@ +accountID = $GLOBALS['egw_info']['user']['account_id']; + + if($_signatureID !== NULL) { + $this->read($_signatureID); + } + } + + function getDefaultSignature() { + $db = clone($GLOBALS['egw']->db); + $db->set_app('felamimail'); + + $where = array( + 'fm_accountid' => $this->accountID, + 'fm_defaultsignature' => true + ); + + $db->select($this->tableName,'fm_signatureid,fm_description,fm_signature,fm_defaultsignature', + $where, __LINE__, __FILE__); + + if(($row = $db->row(true))) { + return $row['fm_signatureid']; + } + + return false; + } + + function read($_signatureID) { + $db = clone($GLOBALS['egw']->db); + $db->set_app('felamimail'); + + $where = array( + 'fm_accountid' => $this->accountID, + 'fm_signatureid' => $_signatureID + ); + + $db->select($this->tableName,'fm_signatureid,fm_description,fm_signature,fm_defaultsignature', + $where, __LINE__, __FILE__); + + if(($data = $db->row(true))) { + $this->fm_signatureid = $data['fm_signatureid']; + $this->fm_description = $data['fm_description']; + $this->fm_signature = $data['fm_signature']; + $this->fm_defaultsignature = (bool)$data['fm_defaultsignature']; + + return TRUE; + } + + return FALSE; + } + + function delete($_signatureID = FALSE) { + $db = clone($GLOBALS['egw']->db); + $db->set_app('felamimail'); + + if($_signatureID !== FALSE) { + $signatureID = (int)$_signatureID; + } else { + $signatureID = (int)$this->fm_signatureid; + } + + $where = array( + 'fm_accountid' => $this->accountID, + 'fm_signatureid' => $signatureID + ); + + $db->delete($this->tableName, $where, __LINE__, __FILE__); + + if ($db->affected_rows() === 0) { + return false; + } + + return true; + } + + function save() { + $db = clone($GLOBALS['egw']->db); + $db->set_app('felamimail'); + + // reset fm_defaultsignature in all other rows to false + if($this->fm_defaultsignature === true) { + $where = array( + 'fm_accountid' => $this->accountID, + ); + $data = array( + 'fm_defaultsignature' => false, + ); + + $db->update($this->tableName, $data, $where, __LINE__, __FILE__); + } + + $data = array( + 'fm_accountid' => $this->accountID, + 'fm_signature' => $this->fm_signature, + 'fm_description' => $this->fm_description, + 'fm_defaultsignature' => $this->fm_defaultsignature, + ); + + + if($this->fm_signatureid === NULL) { + $db->insert($this->tableName, $data, '', __LINE__, __FILE__); + + $this->fm_signatureid = $db->get_last_insert_id($this->tableName,'fm_signatureid'); + + return TRUE; + } else { + $where = array( + 'fm_accountid' => $this->accountID, + 'fm_signatureid' => $this->fm_signatureid, + ); + $db->update($this->tableName, $data, $where, __LINE__, __FILE__); + + return TRUE; + } + } + + function search() { + $signatures = array(); + + $db = clone($GLOBALS['egw']->db); + $db->set_app('felamimail'); + + $where = array( + 'fm_accountid' => $this->accountID + ); + + $db->select($this->tableName,'fm_signatureid,fm_description,fm_signature,fm_defaultsignature', + $where, __LINE__, __FILE__); + + while ($data = $db->row(true)) { + $signatureData = array( + 'fm_signatureid' => $data['fm_signatureid'], + 'fm_description' => $data['fm_description'], + 'fm_signature' => $data['fm_signature'], + 'fm_defaultsignature' => (bool)$data['fm_defaultsignature'], + ); + $signatures[$data['fm_signatureid']] = $signatureData; + } + + return $signatures; + } + } +?> diff --git a/felamimail/inc/class.sofelamimail.inc.php b/felamimail/inc/class.sofelamimail.inc.php new file mode 100644 index 0000000000..30916210a7 --- /dev/null +++ b/felamimail/inc/class.sofelamimail.inc.php @@ -0,0 +1,38 @@ +bopreferences =& CreateObject('felamimail.bopreferences'); + } + + function fetchheader($_header) + { + $headerRows = explode("\n",$_header); + for($i=0;$i diff --git a/felamimail/inc/class.sofilter.inc.php b/felamimail/inc/class.sofilter.inc.php new file mode 100644 index 0000000000..a56c778b2d --- /dev/null +++ b/felamimail/inc/class.sofilter.inc.php @@ -0,0 +1,58 @@ + True, + 'flagMessages' => True + ); + */ + var $filter_table = 'egw_felamimail_displayfilter'; // only reference to table-prefix + + function sofilter() + { + $this->accountid = $GLOBALS['egw_info']['user']['account_id']; + $this->db = clone($GLOBALS['egw']->db); + } + + function saveFilter($_filterArray) + { + $this->db->insert($this->filter_table,array( + 'fmail_filter_data' => serialize($_filterArray) + ),array( + 'fmail_filter_accountid' => $this->accountid + ),__LINE__,__FILE__,'felamimail'); + + unset($this->sessionData['filter'][$_filterID]); + } + + function restoreFilter() + { + $this->db->select($this->filter_table,'fmail_filter_data',array( + 'fmail_filter_accountid' => $this->accountid + ),__LINE__,__FILE__,False,False,'felamimail'); + + + if ($this->db->next_record()) + { + $filter = unserialize($this->db->f('fmail_filter_data')); + return $filter; + } + } + } +?> diff --git a/felamimail/inc/class.sopreferences.inc.php b/felamimail/inc/class.sopreferences.inc.php new file mode 100644 index 0000000000..97e5ceefb2 --- /dev/null +++ b/felamimail/inc/class.sopreferences.inc.php @@ -0,0 +1,142 @@ +db = clone($GLOBALS['egw']->db); + $this->db->set_app('felamimail'); + } + + // allowed keywords for _identity are either the fm_id, all or active + // an fm_id retrieves the account with the specified fm_id of the given user + // all retrieves ALL Accounts of a given user + // active retrieves all active accounts of a given user + function getAccountData($_accountID, $_identity = NULL) + { + // no valid accountID + if(($accountID = (int)$_accountID) < 1) + return array(); + + $retValue = array(); + $where = array('fm_owner' => $accountID); + if (!empty($_identity) && $_identity != 'active' && $_identity != 'all') $where['fm_id'] = $_identity; + if ($_identity == 'active' || empty($_identity)) $where['fm_active'] = true; + $this->db->select($this->accounts_table,'fm_id,fm_active,fm_realname,fm_organization,fm_emailaddress,fm_signatureid,'. + 'fm_ic_hostname,fm_ic_port,fm_ic_username,fm_ic_password,fm_ic_encryption,fm_ic_validatecertificate,'. + 'fm_ic_enable_sieve,fm_ic_sieve_server,fm_ic_sieve_port,'. + 'fm_ic_folderstoshowinhome, fm_ic_trashfolder, fm_ic_sentfolder, fm_ic_draftfolder, fm_ic_templatefolder,'. + 'fm_og_hostname,fm_og_port,fm_og_smtpauth,fm_og_username,fm_og_password', + $where,__LINE__,__FILE__); + + while(($row = $this->db->row(true,'fm_'))) { + foreach(array('active','ic_validatecertificate','ic_enable_sieve','og_smtpauth','ic_folderstoshowinhome') as $name) + { + if ($name == 'ic_folderstoshowinhome') { + $row[$name] = unserialize($row[$name]); + } else { + $row[$name] = $this->db->from_bool($row[$name]); + } + } + $retValue[$row['id']] = $row; + } + return $retValue; + } + + function saveAccountData($_accountID, $_icServer, $_ogServer, $_identity) + { + + $data = array( + 'fm_active' => false, + 'fm_owner' => $_accountID, + 'fm_realname' => $_identity->realName, + 'fm_organization' => $_identity->organization, + 'fm_emailaddress' => $_identity->emailAddress, + 'fm_signatureid' => $_identity->signature, + ); + if (is_object($_icServer)) { + $data = array_merge($data,array( + 'fm_ic_hostname' => $_icServer->host, + 'fm_ic_port' => $_icServer->port, + 'fm_ic_username' => $_icServer->username, + 'fm_ic_password' => $_icServer->password, + 'fm_ic_encryption' => $_icServer->encryption, + 'fm_ic_validatecertificate' => (bool)$_icServer->validatecert, + 'fm_ic_enable_sieve' => (bool)$_icServer->enableSieve, + 'fm_ic_sieve_server' => $_icServer->sieveHost, + 'fm_ic_sieve_port' => $_icServer->sievePort, + 'fm_ic_folderstoshowinhome' => serialize($_icServer->folderstoshowinhome), + 'fm_ic_trashfolder' => $_icServer->trashfolder, + 'fm_ic_sentfolder' => $_icServer->sentfolder, + 'fm_ic_draftfolder' => $_icServer->draftfolder, + 'fm_ic_templatefolder' => $_icServer->templatefolder, + )); + } + if (is_object($_ogServer)) { + $data = array_merge($data,array( + 'fm_og_hostname' => $_ogServer->host, + 'fm_og_port' => $_ogServer->port, + 'fm_og_smtpauth' => (bool)$_ogServer->smtpAuth, + 'fm_og_username' => $_ogServer->username, + 'fm_og_password' => $_ogServer->password, + )); + } + $where = array( + 'fm_owner' => $_accountID, + ); + #_debug_array($data); + if (!empty($_identity->id)) $where['fm_id'] = $_identity->id; + if ($_identity->id == 'new') + { + $this->db->insert($this->accounts_table, $data, NULL,__LINE__,__FILE__); + return $this->db->get_last_insert_id($this->accounts_table, 'fm_id'); + } else { + $this->db->update($this->accounts_table, $data, $where,__LINE__,__FILE__); + return $_identity->id; + } + } + + function deleteAccountData($_accountID, $_identity) + { + $where = array( + 'fm_owner' => $_accountID, + ); + if (is_array($_identity) && count($_identity)>1) $where[] = "fm_id in (".implode(',',$_identity).")"; + if (is_array($_identity) && count($_identity)==1) $where['fm_id'] = $_identity[0]; + if (!empty($_identity->id) && !is_array($_identity)) $where['fm_id'] = $_identity->id; + $this->db->delete($this->accounts_table, $where ,__LINE__,__FILE__); + } + + function setProfileActive($_accountID, $_status, $_identity) + { + $where = array( + 'fm_owner' => $_accountID, + ); + if (!empty($_identity)) $where['fm_id'] = $_identity; + $this->db->update($this->accounts_table,array( + 'fm_active' => (bool)$_status, + ), $where,__LINE__,__FILE__); + } + } +?> diff --git a/felamimail/inc/class.uicompose.inc.php b/felamimail/inc/class.uicompose.inc.php new file mode 100644 index 0000000000..cdec7e79fc --- /dev/null +++ b/felamimail/inc/class.uicompose.inc.php @@ -0,0 +1,743 @@ + True, + 'compose' => True, + 'composeFromDraft' => True, + 'getAttachment' => True, + 'fileSelector' => True, + 'forward' => True, + 'composeAsNew' => True, + 'composeAsForward'=> True, + 'reply' => True, + 'replyAll' => True, + 'selectFolder' => True, + ); + + var $destinations = array( + 'to' => 'to', + 'cc' => 'cc', + 'bcc' => 'bcc', + 'replyto' => 'replyto', + 'folder' => 'folder' + ); + var $bofelamimail; + + function uicompose() + { + $this->displayCharset = $GLOBALS['egw']->translation->charset(); + if (!isset($_POST['composeid']) && !isset($_GET['composeid'])) + { + // create new compose session + $this->bocompose = CreateObject('felamimail.bocompose','',$this->displayCharset); + $this->composeID = $this->bocompose->getComposeID(); + } + else + { + // reuse existing compose session + if (isset($_POST['composeid'])) + $this->composeID = $_POST['composeid']; + else + $this->composeID = $_GET['composeid']; + $this->bocompose = CreateObject('felamimail.bocompose',$this->composeID,$this->displayCharset); + } + $this->t = CreateObject('phpgwapi.Template',EGW_APP_TPL); + $this->bofelamimail = CreateObject('felamimail.bofelamimail',$this->displayCharset); + $this->mailPreferences = ExecMethod('felamimail.bopreferences.getPreferences'); + + $this->t->set_unknowns('remove'); + + $this->rowColor[0] = $GLOBALS['egw_info']["theme"]["bg01"]; + $this->rowColor[1] = $GLOBALS['egw_info']["theme"]["bg02"]; + + + } + + function unhtmlentities ($string) + { + $trans_tbl = get_html_translation_table (HTML_ENTITIES); + $trans_tbl = array_flip ($trans_tbl); + return strtr ($string, $trans_tbl); + } + + function action() + { + $formData['identity'] = (int)$_POST['identity']; + + foreach($_POST['destination'] as $key => $destination) { + if(!empty($_POST['address'][$key])) { + if($destination == 'folder') { + $formData[$destination][] = $GLOBALS['egw']->translation->convert($_POST['address'][$key], $this->charset, 'UTF7-IMAP'); + } else { + $formData[$destination][] = $_POST['address'][$key]; + } + } + } + + $formData['subject'] = $this->bocompose->stripSlashes($_POST['subject']); + $formData['body'] = $this->bocompose->stripSlashes($_POST['body']); + // if the body is empty, maybe someone pasted something with scripts, into the message body + if(empty($formData['body'])) + { + // this is to be found with the egw_unset_vars array for the _POST['body'] array + $name='_POST'; + $key='body'; + #error_log($GLOBALS['egw_unset_vars'][$name.'['.$key.']']); + if (isset($GLOBALS['egw_unset_vars'][$name.'['.$key.']'])) + { + $formData['body'] = bocompose::_getCleanHTML( $GLOBALS['egw_unset_vars'][$name.'['.$key.']']); + } + } + $formData['priority'] = $this->bocompose->stripSlashes($_POST['priority']); + $formData['signatureID'] = (int)$_POST['signatureID']; + $formData['stationeryID'] = $_POST['stationeryID']; + $formData['mimeType'] = $this->bocompose->stripSlashes($_POST['mimeType']); + $formData['disposition'] = (bool)$_POST['disposition']; + $formData['to_infolog'] = $_POST['to_infolog']; + //$formData['mailbox'] = $_GET['mailbox']; + if((bool)$_POST['printit'] == true) { + $formData['printit'] = 1; + $formData['isDraft'] = 1; + // pint the composed message. therefore save it as draft and reopen it as plain printwindow + $formData['subject'] = "[".lang('printview').":]".$formData['subject']; + $messageUid = $this->bocompose->saveAsDraft($formData); + if (!$messageUid) { + print ""; + return; + } + $uidisplay = CreateObject('felamimail.uidisplay'); + $uidisplay->printMessage($messageUid, $formData['printit']); + //$GLOBALS['egw']->link('/index.php',array('menuaction' => 'felamimail.uidisplay.printMessage','uid'=>$messageUid)); + return; + } + if((bool)$_POST['saveAsDraft'] == true) { + $formData['isDraft'] = 1; + // save as draft + $messageUid = $this->bocompose->saveAsDraft($formData); + if (!$messageUid) { + print ""; + } + } else { + if(!$this->bocompose->send($formData)) { + $this->compose(); + return; + } + } + + #$GLOBALS['egw']->common->egw_exit(); + print ""; + } + + function composeAsForward($_focusElement='to') + { + if (isset($_GET['forwardmails'])) + { + unset($_GET['forwardmails']); + $replyID = $_GET['reply_id']; + $replyIds = explode(',',$replyID); + $icServer = 0; //(int)$_GET['icServer']; + $folder = base64_decode($_GET['folder']); + //_debug_array(array('reply_id'=>$replyIds,'folder'=>$folder)); + if (!empty($folder) && !empty($replyID) ) { + // this fill the session data with the values from the original email + $buff = $this->bocompose->preferencesArray['message_forwarding']; + $this->bocompose->preferencesArray['message_forwarding'] = 'asmail'; + foreach($replyIds as $key => $id) + { + $this->bocompose->getForwardData($icServer, $folder, $id,NULL); + } + $this->bocompose->preferencesArray['message_forwarding'] = $buff; + } + } + $this->compose($_focusElement); + } + + function compose($_focusElement='to') + { + // read the data from session + // all values are empty for a new compose window + $sessionData = $this->bocompose->getSessionData(); + if (is_array($_REQUEST['preset'])) + { + #_debug_array($_REQUEST); + if ($_REQUEST['preset']['mailto']) { + // handle mailto strings such as + // mailto:larry,dan?cc=mike&bcc=sue&subject=test&body=type+your&body=message+here + // the above string may be htmlentyty encoded, then multiple body tags are supported + // first, strip the mailto: string out of the mailto URL + $tmp_send_to = trim(substr(html_entity_decode($_REQUEST['preset']['mailto']),7)); + // check if there is more than the to address + $mailtoArray = explode('?',$tmp_send_to,2); + if ($mailtoArray[1]) { + // check if there are more than one requests + $addRequests = explode('&',$mailtoArray[1]); + foreach ($addRequests as $key => $reqval) { + // the additional requests should have a =, to separate key from value. + $keyValuePair = explode('=',$reqval,2); + $sessionData[$keyValuePair[0]] .= (strlen($sessionData[$keyValuePair[0]])>0 ? ' ':'') . $keyValuePair[1]; + } + } + $sessionData['to']=$mailtoArray[0]; + // if the mailto string is not htmlentity decoded the arguments are passed as simple requests + foreach(array('cc','bcc','subject','body') as $name) { + if ($_REQUEST[$name]) $sessionData[$name] .= (strlen($sessionData[$name])>0 ? ( $name == 'cc' || $name == 'bcc' ? ',' : ' ') : '') . $_REQUEST[$name]; + } + } + if (isset($_REQUEST['preset']['file'])) + { + $names = (array)$_REQUEST['preset']['name']; + $types = (array)$_REQUEST['preset']['type']; + foreach((array)$_REQUEST['preset']['file'] as $k => $path) + { + if (parse_url($path,PHP_URL_SCHEME == 'vfs')) + { + $formData = array( + 'name' => urldecode(egw_vfs::basename($path)), + 'type' => egw_vfs::mime_content_type($path), + 'file' => $path, + 'size' => filesize($path), + ); + if ($formData['type'] == egw_vfs::DIR_MIME_TYPE) continue; // ignore directories + } + elseif(is_readable($path)) + { + $formData = array( + 'name' => isset($names[$k]) ? $names[$k] : basename($path), + 'type' => isset($types[$k]) ? $types[$k] : (function_exists('mime_content_type') ? mime_content_type($path) : mime_magic::filename2mime($path)), + 'file' => $path, + 'size' => filesize($path), + ); + } + else + { + continue; + } + $this->bocompose->addAttachment($formData); + } + $sessionData = $this->bocompose->getSessionData(); + } + foreach(array('to','cc','bcc','subject','body') as $name) + { + if ($_REQUEST['preset'][$name]) $sessionData[$name] = $_REQUEST['preset'][$name]; + } + } + + // is the to address set already? + if (!empty($_REQUEST['send_to'])) + { + $sessionData['to'] = base64_decode($_REQUEST['send_to']); + } + //is the MimeType set/requested + if (!empty($_REQUEST['mimeType'])) + { + $sessionData['mimeType'] = $_REQUEST['mimeType']; + } + // is a certain signature requested? + // only the following values are supported (and make sense) + // no => means -2 + // system => means -1 + // default => fetches the default, which is standard behavior + if (!empty($_REQUEST['signature']) && (strtolower($_REQUEST['signature']) == 'no' || strtolower($_REQUEST['signature']) == 'system')) + { + $presetSig = (strtolower($_REQUEST['signature']) == 'no' ? -2 : -1); + } + if ($sessionData['isDraft'] && !empty($sessionData['signatureID'])) $presetSig = (int)$sessionData['signatureID']; + if ($sessionData['isDraft'] && !empty($sessionData['stationeryID'])) $presetStationery = $sessionData['stationeryID']; + $presetId = NULL; + if ($sessionData['isDraft'] && !empty($sessionData['identity'])) $presetId = (int)$sessionData['identity']; + $this->display_app_header(); + + $this->t->set_file(array("composeForm" => "composeForm.tpl")); + $this->t->set_block('composeForm','header','header'); + $this->t->set_block('composeForm','body_input'); + $this->t->set_block('composeForm','attachment','attachment'); + $this->t->set_block('composeForm','attachment_row','attachment_row'); + $this->t->set_block('composeForm','attachment_row_bold'); + $this->t->set_block('composeForm','destination_row'); + $this->t->set_block('composeForm','simple_text'); + + $this->translate(); + + if ($GLOBALS['egw_info']['user']['apps']['addressbook']) { + $this->t->set_var("link_addressbook",$GLOBALS['egw']->link('/index.php',array( + 'menuaction' => 'addressbook.addressbook_ui.emailpopup', + ))); + } else { + $this->t->set_var("link_addressbook",''); + } + $this->t->set_var("focusElement",$_focusElement); + + $linkData = array + ( + 'menuaction' => 'felamimail.uicompose.selectFolder', + ); + $this->t->set_var('folder_select_url',$GLOBALS['egw']->link('/index.php',$linkData)); + + $linkData = array + ( + 'menuaction' => 'felamimail.uicompose.fileSelector', + 'composeid' => $this->composeID + ); + $this->t->set_var('file_selector_url',$GLOBALS['egw']->link('/index.php',$linkData)); + + $this->t->set_var('vfs_selector_url',egw::link('/index.php',array( + 'menuaction' => 'filemanager.filemanager_select.select', + 'mode' => 'open-multiple', + 'method' => 'felamimail.uicompose.vfsSelector', + 'id' => $this->composeID, + 'label' => lang('Attach'), + ))); + if ($GLOBALS['egw_info']['user']['apps']['filemanager']) + { + $this->t->set_var('vfs_attach_button',' + '); + } + else + { + $this->t->set_var('vfs_attach_button',''); + } + $linkData = array + ( + 'menuaction' => 'felamimail.uicompose.action', + 'composeid' => $this->composeID + ); + $this->t->set_var("link_action",$GLOBALS['egw']->link('/index.php',$linkData)); + $this->t->set_var('folder_name',$this->bofelamimail->sessionData['mailbox']); + $this->t->set_var('compose_id',$this->composeID); + // the editorobject is needed all the time (since we use CKEDITOR3 + $editorObject = html::initCKEditor('400px','simple'); + $this->t->set_var('ckeditorConfig',$editorObject->jsEncode($editorObject->config)); + + // check for some error messages from last posting attempt + if($errorInfo = $this->bocompose->getErrorInfo()) + { + $this->t->set_var('errorInfo',"$errorInfo"); + } + else + { + $this->t->set_var('errorInfo',' '); + } + + // header + $allIdentities = $this->mailPreferences->getIdentity(); + //_debug_array($allIdentities); + $defaultIdentity = 0; + foreach($allIdentities as $key => $singleIdentity) { + #$identities[$singleIdentity->id] = $singleIdentity->realName.' <'.$singleIdentity->emailAddress.'>'; + $identities[$key] = $singleIdentity->realName.' <'.$singleIdentity->emailAddress.'>'; + if(!empty($singleIdentity->default)) { + #$defaultIdentity = $singleIdentity->id; + $defaultIdentity = $key; + $sessionData['signatureID'] = (!empty($singleIdentity->signature) ? $singleIdentity->signature : $sessionData['signatureID']); + } + } + $selectFrom = html::select('identity', ($presetId ? $presetId : $defaultIdentity), $identities, true, "style='width:100%;' onchange='changeIdentity(this);'"); + $this->t->set_var('select_from', $selectFrom); + + // navbar(, kind of) + $this->t->set_var('img_clear_left', $GLOBALS['egw']->common->image('felamimail','clear_left')); + $this->t->set_var('img_fileopen', $GLOBALS['egw']->common->image('phpgwapi','fileopen')); + $this->t->set_var('img_mail_send', $GLOBALS['egw']->common->image('felamimail','mail_send')); + $this->t->set_var('img_attach_file', $GLOBALS['egw']->common->image('felamimail','attach')); + $this->t->set_var('ajax-loader', $GLOBALS['egw']->common->image('felamimail','ajax-loader')); + $this->t->set_var('img_fileexport', $GLOBALS['egw']->common->image('felamimail','fileexport')); + // prepare print url/button + $this->t->set_var('img_print_it', $GLOBALS['egw']->common->image('felamimail','fileprint')); + $this->t->set_var('lang_print_it', lang('print it')); + $this->t->set_var('print_it', $printURL); + // from, to, cc, replyto + $destinationRows = 0; + foreach(array('to','cc','bcc','replyto','folder') as $destination) { + foreach((array)$sessionData[$destination] as $key => $value) { + $selectDestination = html::select('destination[]', $destination, $this->destinations, false, "style='width: 100%;' onchange='fm_compose_changeInputType(this)'"); + $this->t->set_var('select_destination', $selectDestination); + $this->t->set_var('address', @htmlentities($value, ENT_QUOTES, $this->displayCharset)); + $this->t->parse('destinationRows','destination_row',True); + $destinationRows++; + } + } + while($destinationRows < 3) { + // and always add one empty row + $selectDestination = html::select('destination[]', 'to', $this->destinations, false, "style='width: 100%;' onchange='fm_compose_changeInputType(this)'"); + $this->t->set_var('select_destination', $selectDestination); + $this->t->set_var('address', ''); + $this->t->parse('destinationRows','destination_row',True); + $destinationRows++; + } + // and always add one empty row + $selectDestination = html::select('destination[]', 'to', $this->destinations, false, "style='width: 100%;' onchange='fm_compose_changeInputType(this)'"); + $this->t->set_var('select_destination', $selectDestination); + $this->t->set_var('address', ''); + $this->t->parse('destinationRows','destination_row',True); + + $this->t->set_var("subject",@htmlentities($sessionData['subject'],ENT_QUOTES,$this->displayCharset)); + if ($GLOBALS['egw_info']['user']['apps']['addressbook']) { + $this->t->set_var('addressbookButton',''); + } else { + $this->t->set_var('addressbookButton',''); + } + if ($GLOBALS['egw_info']['user']['apps']['infolog']) { + $this->t->set_var('infologImage',html::image('felamimail','to_infolog',lang('Save as infolog'),'width="17px" height="17px" valign="middle"' )); + $this->t->set_var('lang_save_as_infolog',lang('Save as infolog')); + $this->t->set_var('infolog_checkbox',''); + } else { + $this->t->set_var('infologImage',''); + $this->t->set_var('lang_save_as_infolog',''); + $this->t->set_var('infolog_checkbox',''); + } + $this->t->set_var('lang_no_recipient',lang('No recipient address given!')); + $this->t->set_var('lang_no_subject',lang('No subject given!')); + $this->t->pparse("out","header"); + + // body + if($sessionData['mimeType'] == 'html') { + $mode = 'simple'; + #if (isset($GLOBALS['egw_info']['server']['enabled_spellcheck'])) $mode = 'egw_simple_spellcheck'; + $style="border:0px; width:100%; height:400px;"; + // dont run purify, as we already did that (getCleanHTML). + $this->t->set_var('tinymce', html::fckEditorQuick('body', $mode, $sessionData['body'],'400px','100%',false)); + $this->t->set_var('mimeType', 'html'); + $ishtml=1; + } else { + $style="border:0px; width:100%; height:400px;"; + // initalize the CKEditor Object to enable switching back and force + $editor = $editorObject->init(). html::fckEditorQuick('body', 'ascii', $sessionData['body'],'400px','99%'); + $this->t->set_var('tinymce', $editor); //html::fckEditorQuick('body', 'ascii', $sessionData['body'],'400px','99%')); + $this->t->set_var('mimeType', 'text'); + $ishtml=0; + } + + require_once(EGW_INCLUDE_ROOT.'/felamimail/inc/class.felamimail_bosignatures.inc.php'); + $boSignatures = new felamimail_bosignatures(); + $signatures = $boSignatures->getListOfSignatures(); + if (empty($sessionData['signatureID'])) { + if ($signatureData = $boSignatures->getDefaultSignature()) { + if (is_array($signatureData)) { + $sessionData['signatureID'] = $signatureData['signatureid']; + } else { + $sessionData['signatureID'] =$signatureData; + } + } + } + + $selectSignatures = array( + '-2' => lang('no signature') + ); + foreach($signatures as $signature) { + $selectSignatures[$signature['fm_signatureid']] = lang('Signature').': '.$signature['fm_description']; + } + + $bostationery = new felamimail_bostationery(); + $selectStationeries = array( + '0' => lang('no stationery') + ); + $showStationaries = false; + $validStationaries = $bostationery->get_valid_templates(); + if (is_array($validStationaries) && count($validStationaries)>0) + { + $showStationaries = true; + $selectStationeries += $validStationaries; + } + $selectBoxSignature = html::select('signatureID', ($presetSig ? $presetSig : $sessionData['signatureID']), $selectSignatures, true, "style='width: 35%;' onchange='fm_compose_changeInputType(this)'"); + $selectBoxStationery = html::select('stationeryID', ($presetStationery ? $presetStationery : 0), $selectStationeries, true, "style='width: 35%;'"); + $this->t->set_var("select_signature", $selectBoxSignature); + $this->t->set_var("select_stationery", ($showStationaries ? $selectBoxStationery:'')); + $this->t->set_var("lang_editormode",lang("Editor type")); + $this->t->set_var("toggle_editormode", lang("Editor type").": "); + $this->t->pparse("out","body_input"); + + // attachments + if (is_array($sessionData['attachments']) && count($sessionData['attachments']) > 0) + { + $imgClearLeft = $GLOBALS['egw']->common->image('felamimail','clear_left'); + foreach((array)$sessionData['attachments'] as $id => $attachment) { + $tempArray = array ( + '1' => $attachment['name'], '.1' => 'width="40%"', + '2' => mime_magic::mime2label($attachment['type']), + '3' => egw_vfs::hsize($attachment['size']), '.3' => "style='text-align:right;'", + '4' => ' ', '.4' => 'width="10%"', + '5' => "composeID."','$id')\">", + ); + $tableRows[] = $tempArray; + } + + if(count($tableRows) > 0) { + $table = html::table($tableRows, "style='width:100%'"); + } + $this->t->set_var('attachment_rows',$table); + } + else + { + $this->t->set_var('attachment_rows',''); + } + + $this->t->pparse("out","attachment"); + } + + function composeFromDraft() { + $icServer = (int)$_GET['icServer']; + $folder = base64_decode($_GET['folder']); + $replyID = $_GET['uid']; + + if (!empty($folder) && !empty($replyID) ) { + // this fill the session data with the values from the original email + $this->bocompose->getDraftData($icServer, $folder, $replyID); + } + $this->compose('body'); + } + + + function display_app_header() + { + $GLOBALS['egw']->js->validate_file('jscode','composeMessage','felamimail'); + $GLOBALS['egw']->js->set_onload('javascript:initAll();'); + $GLOBALS['egw_info']['flags']['include_xajax'] = True; + + $GLOBALS['egw']->common->egw_header(); + } + + /** + * Callback for filemanagers select file dialog + * + * @param string $composeid + * @param string|array $files path of file(s) in vfs (no egw_vfs::PREFIX, just the path) + * @return string javascript output by the file select dialog, usually to close it + */ + function vfsSelector($composeid,$files) + { + $this->bocompose = CreateObject('felamimail.bocompose',$this->composeID=$composeid,$this->displayCharset); + + foreach((array) $files as $path) + { + $formData = array( + 'name' => egw_vfs::basename($path), + 'type' => egw_vfs::mime_content_type($path), + 'file' => egw_vfs::PREFIX.$path, + 'size' => filesize(egw_vfs::PREFIX.$path), + ); + $this->bocompose->addAttachment($formData); + } + return 'window.close();'; + } + + function fileSelector() + { + if(is_array($_FILES["addFileName"])) { + #phpinfo(); + //_debug_array($_FILES); + if($_FILES['addFileName']['error'] == $UPLOAD_ERR_OK) { + $formData['name'] = $_FILES['addFileName']['name']; + $formData['type'] = $_FILES['addFileName']['type']; + $formData['file'] = $_FILES['addFileName']['tmp_name']; + $formData['size'] = $_FILES['addFileName']['size']; + $this->bocompose->addAttachment($formData); + print ""; + } else { + print ""; + } + } + + if(!@is_object($GLOBALS['egw']->js)) + { + $GLOBALS['egw']->js = CreateObject('phpgwapi.javascript'); + } + $GLOBALS['egw']->js->validate_file('dhtmlxtree','js/dhtmlXCommon'); + $GLOBALS['egw']->js->validate_file('dhtmlxtree','js/dhtmlXTree'); + $GLOBALS['egw']->js->validate_file('jscode','composeMessage','felamimail'); + $GLOBALS['egw']->common->egw_header(); + + #$uiwidgets =& CreateObject('felamimail.uiwidgets'); + + $this->t->set_file(array("composeForm" => "composeForm.tpl")); + $this->t->set_block('composeForm','fileSelector','fileSelector'); + + $this->translate(); + + $linkData = array + ( + 'menuaction' => 'felamimail.uicompose.fileSelector', + 'composeid' => $this->composeID + ); + $this->t->set_var('file_selector_url', $GLOBALS['egw']->link('/index.php',$linkData)); + + $maxUploadSize = ini_get('upload_max_filesize'); + $this->t->set_var('max_uploadsize', $maxUploadSize); + + $this->t->set_var('ajax-loader', $GLOBALS['egw']->common->image('felamimail','ajax-loader')); + + $this->t->pparse("out","fileSelector"); + } + + function forward() { + $icServer = (int)$_GET['icServer']; + $folder = base64_decode($_GET['folder']); + $replyID = $_GET['reply_id']; + $partID = $_GET['part_id']; + + if (!empty($replyID)) + { + // this fill the session data with the values from the original email + $this->bocompose->getForwardData($icServer, $folder, $replyID, $partID); + } + $this->compose(); + } + + function getAttachment() + { + $bocompose = CreateObject('felamimail.bocompose', $_GET['_composeID']); + $attachment = $bocompose->sessionData['attachments'][$_GET['attID']] ; + if (!empty($attachment['folder'])) + { + $is_winmail = $_GET['is_winmail'] ? $_GET['is_winmail'] : 0; + $this->mailbox = $attachment['folder']; + $this->bofelamimail->reopen($this->mailbox); + #$attachment = $this->bofelamimail->getAttachment($this->uid,$part); + $attachmentData = $this->bofelamimail->getAttachment($attachment['uid'],$attachment['partID'],$is_winmail); + $this->bofelamimail->closeConnection(); + } + + if (parse_url($attachment['file'],PHP_URL_SCHEME) == 'vfs') + { + egw_vfs::load_wrapper('vfs'); + } + //error_log(print_r($attachmentData,true)); + header ("Content-Type: ".$attachment['type']."; name=\"". $this->bofelamimail->decode_header($attachment['name']) ."\""); + header ("Content-Disposition: inline; filename=\"". $this->bofelamimail->decode_header($attachment['name']) ."\""); + header("Expires: 0"); + header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); + header("Pragma: public"); + if (!empty($attachment['file'])) + { + $fp = fopen($attachment['file'], 'rb'); + fpassthru($fp); + fclose($fp); + } + else + { + echo $attachmentData['attachment']; + } + $GLOBALS['egw']->common->egw_exit(); + exit; + + } + + + function selectFolder() + { + $GLOBALS['egw']->js->validate_file('dhtmlxtree','js/dhtmlXCommon'); + $GLOBALS['egw']->js->validate_file('dhtmlxtree','js/dhtmlXTree'); + $GLOBALS['egw']->js->validate_file('jscode','composeMessage','felamimail'); + $GLOBALS['egw']->common->egw_header(); + + $bofelamimail =& $this->bofelamimail; //CreateObject('felamimail.bofelamimail',$this->displayCharset); + $uiwidgets = CreateObject('felamimail.uiwidgets'); + $connectionStatus = $bofelamimail->openConnection(); + + $folderObjects = $bofelamimail->getFolderObjects(true,false); + $folderTree = $uiwidgets->createHTMLFolder + ( + $folderObjects, + 'INBOX', + 0, + lang('IMAP Server'), + $mailPreferences['username'].'@'.$mailPreferences['imapServerAddress'], + 'divFolderTree', + false, + true + ); + print '
    '; + print $folderTree; + } + + function composeAsNew() { + $icServer = (int)$_GET['icServer']; + $folder = base64_decode($_GET['folder']); + $replyID = $_GET['reply_id']; + $partID = $_GET['part_id']; + if (!empty($folder) && !empty($replyID) ) { + // this fill the session data with the values from the original email + $this->bocompose->getDraftData($icServer, $folder, $replyID, $partID); + } + $this->compose('body'); + } + + function reply() { + $icServer = (int)$_GET['icServer']; + $folder = base64_decode($_GET['folder']); + $replyID = $_GET['reply_id']; + $partID = $_GET['part_id']; + if (!empty($folder) && !empty($replyID) ) { + // this fill the session data with the values from the original email + $this->bocompose->getReplyData('single', $icServer, $folder, $replyID, $partID); + } + $this->compose('body'); + } + + function replyAll() { + $icServer = (int)$_GET['icServer']; + $folder = base64_decode($_GET['folder']); + $replyID = $_GET['reply_id']; + $partID = $_GET['part_id']; + if (!empty($folder) && !empty($replyID) ) { + // this fill the session data with the values from the original email + $this->bocompose->getReplyData('all', $icServer, $folder, $replyID, $partID); + } + $this->compose('body'); + } + + function translate() { + $this->t->set_var("lang_message_list",lang('Message List')); + $this->t->set_var("lang_to",lang('to')); + $this->t->set_var("lang_cc",lang('cc')); + $this->t->set_var("lang_bcc",lang('bcc')); + $this->t->set_var("lang_identity",lang('identity')); + $this->t->set_var("lang_reply_to",lang('reply to')); + $this->t->set_var("lang_subject",lang('subject')); + $this->t->set_var("lang_addressbook",lang('addressbook')); + $this->t->set_var("lang_search",lang('search')); + $this->t->set_var("lang_send",lang('send')); + $this->t->set_var('lang_save_as_draft',lang('save as draft')); + $this->t->set_var("lang_back_to_folder",lang('back to folder')); + $this->t->set_var("lang_attachments",lang('attachments')); + $this->t->set_var("lang_add",lang('add')); + $this->t->set_var("lang_remove",lang('remove')); + $this->t->set_var("lang_priority",lang('priority')); + $this->t->set_var("lang_normal",lang('normal')); + $this->t->set_var("lang_high",lang('high')); + $this->t->set_var("lang_low",lang('low')); + $this->t->set_var("lang_signature",lang('signature')); + $this->t->set_var("lang_stationery",lang('stationery')); + $this->t->set_var("lang_select_folder",lang('select folder')); + $this->t->set_var('lang_max_uploadsize',lang('max uploadsize')); + $this->t->set_var('lang_adding_file_please_wait',lang('Adding file to message. Please wait!')); + $this->t->set_var('lang_receive_notification',lang('Receive notification')); + $this->t->set_var('lang_no_address_set',lang('can not send message. no recipient defined!')); + + $this->t->set_var("th_bg",$GLOBALS['egw_info']["theme"]["th_bg"]); + $this->t->set_var("bg01",$GLOBALS['egw_info']["theme"]["bg01"]); + $this->t->set_var("bg02",$GLOBALS['egw_info']["theme"]["bg02"]); + $this->t->set_var("bg03",$GLOBALS['egw_info']["theme"]["bg03"]); + } + +} + +?> diff --git a/felamimail/inc/class.uidisplay.inc.php b/felamimail/inc/class.uidisplay.inc.php new file mode 100644 index 0000000000..20fe22022d --- /dev/null +++ b/felamimail/inc/class.uidisplay.inc.php @@ -0,0 +1,1641 @@ + + * + * See the enclosed file COPYING for license information (LGPL). If you + * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html. + * + */ + + /* $Id$ */ + + class uidisplay + { + + var $public_functions = array + ( + 'display' => True, + 'displayBody' => True, + 'displayHeader' => True, + 'displayImage' => True, + 'displayAttachments' => True, + 'printMessage' => True, + 'saveMessage' => True, + 'showHeader' => True, + 'getAttachment' => True, + ); + + var $icServerID=0; + + // the object storing the data about the incoming imap server + var $icServer=0; + + // the non permanent id of the message + var $id; + + // the permanent id of the message + var $uid; + var $bofelamimail; + var $bopreferences; + + function uidisplay() + { + /* Having this defined in just one spot could help when changes need + * to be made to the pattern + * Make sure that the expression is evaluated case insensitively + * + * RFC2822 (and RFC822) defines the left side of an email address as (roughly): + * 1*atext *("." 1*atext) + * where atext is: a-zA-Z0-9!#$%&'*+-/=?^_`{|}~ + * + * Here's pretty sophisticated IP matching: + * $IPMatch = '(2[0-5][0-9]|1?[0-9]{1,2})'; + * $IPMatch = '\[?' . $IPMatch . '(\.' . $IPMatch . '){3}\]?'; + */ + /* Here's enough: */ + global $IP_RegExp_Match, $Host_RegExp_Match, $Email_RegExp_Match; + $IP_RegExp_Match = '\\[?[0-9]{1,3}(\\.[0-9]{1,3}){3}\\]?'; + $Host_RegExp_Match = '('.$IP_RegExp_Match.'|[0-9a-z]([-.]?[0-9a-z])*\\.[a-z][a-z]+)'; + #$atext = '([a-z0-9!#$&%*+/=?^_`{|}~-]|&)'; + $atext = '([a-zA-Z0-9_\-\.])'; + $dot_atom = $atext.'+(\.'.$atext.'+)*'; + $Email_RegExp_Match = '~'.$dot_atom.'(%'.$Host_RegExp_Match.')?@'.$Host_RegExp_Match.'~i'; + + $this->t = CreateObject('phpgwapi.Template',EGW_APP_TPL); + $this->displayCharset = $GLOBALS['egw']->translation->charset(); + $this->bofelamimail = CreateObject('felamimail.bofelamimail',$this->displayCharset); + $this->bopreferences = $this->bofelamimail->bopreferences; //CreateObject('felamimail.bopreferences'); + + $this->mailPreferences = $this->bopreferences->getPreferences(); + + $this->bofelamimail->openConnection($this->icServerID); + + $this->mailbox = $this->bofelamimail->sessionData['mailbox']; + if (!empty($_GET['mailbox'])) $this->mailbox = base64_decode($_GET['mailbox']); + + $this->sort = $this->bofelamimail->sessionData['sort']; + + if(isset($_GET['uid'])) { + $this->uid = (int)$_GET['uid']; + } + + if(isset($_GET['id'])) { + $this->id = (int)$_GET['id']; + } + + if(isset($this->id) && !isset($this->uid)) { + if($uid = $this->bofelamimail->idToUid($this->mailbox, $this->id)) { + $this->uid = $uid; + } + } + + if(isset($_GET['part'])) { + $this->partID = (int)$_GET['part']; + } + + $this->rowColor[0] = $GLOBALS['egw_info']["theme"]["bg01"]; + $this->rowColor[1] = $GLOBALS['egw_info']["theme"]["bg02"]; + } + + /** + * Parses a body and converts all found email addresses to clickable links. + * + * @param string body the body to process, by ref + * @return int the number of unique addresses found + */ + function parseEmail (&$body) { + global $Email_RegExp_Match; + $sbody = $body; + $addresses = array(); + + /* Find all the email addresses in the body */ + while(preg_match($Email_RegExp_Match, $sbody, $regs)) { + $addresses[$regs[0]] = strtr($regs[0], array('&' => '&')); + $start = strpos($sbody, $regs[0]) + strlen($regs[0]); + $sbody = substr($sbody, $start); + } + + /* Replace each email address with a compose URL */ + $lmail=''; + if (is_array($addresses)) ksort($addresses); + foreach ($addresses as $text => $email) { + if ($lmail == $email) next($addresses); + #echo $text."#
    "; + #echo $email."#
    "; + $comp_uri = $this->makeComposeLink($email, $text); + $body = preg_replace("/\s".$text."/sim", $comp_uri, $body); + $lmail=$email; + } + + /* Return number of unique addresses found */ + return count($addresses); + } + function parseHREF (&$body) { + #echo __METHOD__."called
    "; + $webserverURL = $GLOBALS['egw_info']['server']['webserver_url']; + $alnum = 'a-z0-9'; + #$domain = "(http(s?):\/\/)*"; + #$domain .= "([$alnum]([-$alnum]*[$alnum]+)?)"; + #$domain = "^(http|https|ftp)\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&%\$#\=~])*[^\.\,\)\(\s]$ "; + $domain = "(http(s?):\/\/)+([[:alpha:]][-[:alnum:]]*[[:alnum:]])(\.[[:alpha:]][-[:alnum:]]*[[:alpha:]])*(\.[[:alpha:]][-[:alnum:]]*[[:alpha:]])+"; + #$dir = "(/[[:alpha:]][-[:alnum:]]*[[:alnum:]])*"; + #$trailingslash = "(\/?)"; + #$page = "(/[[:alpha:]][-[:alnum:]]*\.[[:alpha:]]{3,5})?"; + #$getstring = "(\?([[:alnum:]][-_%[:alnum:]]*=[-_%[:alnum:]]+) + # (&([[:alnum:]][-_%[:alnum:]]*=[-_%[:alnum:]]+))*)?"; + #$pattern = "^".$domain.$dir.$trailingslash.$page.$getstring."$"; + $pattern = "~\
    $link) { + if (empty($link)) continue; + if ($llink == $link) next($addresses); + #echo $text."#
    "; + #echo $link."#
    \n"; + $comp_uri = "
    '.$text.''; + } + + function highlightQuotes($text, $level = 5) + { + // Use a global var since the class is called statically. + $GLOBALS['_tmp_maxQuoteChars'] = 0; + + // Tack a newline onto the beginning of the string so that we + // correctly highlight when the first character in the string + // is a quote character. + $text = "\n$text"; + + preg_replace_callback("/^\s*((>\s?)+)/m", array(&$this, '_countQuoteChars'), $text); + + // Go through each level of quote block and put the + // appropriate style around it. Important to work downwards so + // blocks with fewer quote chars aren't matched until their + // turn. + for ($i = $GLOBALS['_tmp_maxQuoteChars']; $i > 0; $i--) + { + $text = preg_replace( + // Finds a quote block across multiple newlines. + "/(\n)( *(>\s?)\{$i}(?! ?>).*?)(\n|$)(?! *(> ?)\{$i})/s", + '\1\2\4',$text); + } + + /* Unset the global variable. */ + unset($GLOBALS['_tmp_maxQuoteChars']); + + /* Remove the leading newline we added above. */ + return substr($text, 1); + } + + function _countQuoteChars($matches) + { + $num = count(preg_split('/>\s?/', $matches[1])) - 1; + if ($num > $GLOBALS['_tmp_maxQuoteChars']) + { + $GLOBALS['_tmp_maxQuoteChars'] = $num; + } + } + + function display() + { + $partID = $_GET['part']; + if (!empty($_GET['mailbox'])) $this->mailbox = base64_decode($_GET['mailbox']); + + //$transformdate =& CreateObject('felamimail.transformdate'); + //$htmlFilter =& CreateObject('felamimail.htmlfilter'); + $uiWidgets = CreateObject('felamimail.uiwidgets'); + // (regis) seems to be necessary to reopen... + $this->bofelamimail->reopen($this->mailbox); + // retrieve the flags of the message, before touching it. + if (!empty($this->uid)) $flags = $this->bofelamimail->getFlags($this->uid); + #print "$this->mailbox, $this->uid, $partID
    "; + $headers = $this->bofelamimail->getMessageHeader($this->uid, $partID); + if (PEAR::isError($headers)) { + print lang("ERROR: Message could not be displayed.")."
    "; + print "In Mailbox: $this->mailbox, with ID: $this->uid, and PartID: $partID
    "; + print $headers->message."
    "; + _debug_array($headers->backtrace[0]); + exit; + } + #_debug_array($headers);exit; + $rawheaders = $this->bofelamimail->getMessageRawHeader($this->uid, $partID); + #_debug_array($rawheaders);exit; + $attachments = $this->bofelamimail->getMessageAttachments($this->uid, $partID); + #_debug_array($attachments); exit; + $envelope = $this->bofelamimail->getMessageEnvelope($this->uid, $partID); + #_debug_array($envelope); exit; + // if not using iFrames, we need to retrieve the messageBody here + // by now this is a fixed value and controls the use/loading of the template and how the vars are set. + // Problem is: the iFrame Layout provides the scrollbars. + #$bodyParts = $this->bofelamimail->getMessageBody($this->uid,'',$partID); + #_debug_array($bodyParts); exit; + #_debug_array($this->uid); + #_debug_array($this->bofelamimail->getFlags($this->uid)); #exit; + // flag the message as read/seen (if not already flagged) + if (!empty($this->uid) && strpos( array2string($flags),'Seen')===false) $this->bofelamimail->flagMessages('read', $this->uid); + + $nextMessage = $this->bofelamimail->getNextMessage($this->mailbox, $this->uid); + $webserverURL = $GLOBALS['egw_info']['server']['webserver_url']; + + $nonDisplayAbleCharacters = array('[\016]','[\017]', + '[\020]','[\021]','[\022]','[\023]','[\024]','[\025]','[\026]','[\027]', + '[\030]','[\031]','[\032]','[\033]','[\034]','[\035]','[\036]','[\037]'); + + #print "
    ";print_r($rawheaders);print"
    ";exit; + + // add line breaks to $rawheaders + $newRawHeaders = explode("\n",$rawheaders); + reset($newRawHeaders); + + if(isset($headers['ORGANIZATION'])) { + $organization = $this->bofelamimail->decode_header(trim($headers['ORGANIZATION'])); + } + + if ( isset($headers['DISPOSITION-NOTIFICATION-TO']) ) { + $sent_not = $this->bofelamimail->decode_header(trim($headers['DISPOSITION-NOTIFICATION-TO'])); + } else if ( isset($headers['RETURN-RECEIPT-TO']) ) { + $sent_not = $this->bofelamimail->decode_header(trim($headers['RETURN-RECEIPT-TO'])); + } else if ( isset($headers['X-CONFIRM-READING-TO']) ) { + $sent_not = $this->bofelamimail->decode_header(trim($headers['X-CONFIRM-READING-TO'])); + } else $sent_not = ""; + + // reset $rawheaders + $rawheaders = ""; + // create it new, with good line breaks + reset($newRawHeaders); + while(list($key,$value) = @each($newRawHeaders)) { + $rawheaders .= wordwrap($value, 90, "\n "); + } + + $this->display_app_header(); + if(!isset($_GET['printable'])) { + $this->t->set_file(array("displayMsg" => "view_message.tpl")); + } else { + $this->t->set_file(array("displayMsg" => "view_message_printable.tpl")); + $this->t->set_var('charset',$GLOBALS['egw']->translation->charset()); + } + // only notify when requested, notify flag (MDNSent/MDNnotSent) not set, and message not already seen (some servers do not support the MDNSent/MDNnotSent flag) + if ( $sent_not != "" && $this->bofelamimail->getNotifyFlags($this->uid) === null && strpos( array2string($flags),'Seen')===false) { + $this->t->set_var('sentNotify','sendNotify("'.$this->uid.'");'); + $this->t->set_var('lang_sendnotify',lang('The message sender has requested a response to indicate that you have read this message. Would you like to send a receipt?')); + } else { + $this->t->set_var('sentNotify',''); + $this->t->set_var('lang_sendnotify',''); + } + $this->bofelamimail->closeConnection(); + + $this->t->set_block('displayMsg','message_main'); + $this->t->set_block('displayMsg','message_main_attachment'); + $this->t->set_block('displayMsg','message_header'); + $this->t->set_block('displayMsg','message_raw_header'); + $this->t->set_block('displayMsg','message_navbar'); + $this->t->set_block('displayMsg','message_onbehalfof'); + $this->t->set_block('displayMsg','message_cc'); + $this->t->set_block('displayMsg','message_bcc'); + $this->t->set_block('displayMsg','message_attachement_row'); + $this->t->set_block('displayMsg','previous_message_block'); + $this->t->set_block('displayMsg','next_message_block'); + //$this->t->set_block('displayMsg','message_org'); + + $this->t->egroupware_hack = False; + + $this->translate(); + + // navBar buttons + $headerData = array('uid'=>$this->uid); + if($partID != '') { + $headerData['partid'] = $partID; + } + $this->t->set_var('navbarButtonsLeft',$uiWidgets->displayMessageActions($headerData, $this->mailbox, $this->icServer)); + + $navbarButtons = ''; + $navbarImages = array(); + #_debug_array($nextMessage); exit; + + if($nextMessage['previous']) { + $linkData = array ( + 'menuaction' => 'felamimail.uidisplay.display', + 'showHeader' => 'false', + 'uid' => $nextMessage['previous'], + 'mailbox' => base64_encode($this->mailbox) + ); + $previousURL = $GLOBALS['egw']->link('/index.php',$linkData); + $previousURL = "goToMessage('$previousURL')"; + $navbarImages['up.button'] = array( + 'action' => $previousURL, + 'tooltip' => lang('previous message'), + ); + } else { + $previousURL = '#'; + $navbarImages['up.grey'] = array( + 'action' => $previousURL, + 'tooltip' => lang('previous message'), + ); + } + + if($nextMessage['next']) { + $linkData = array ( + 'menuaction' => 'felamimail.uidisplay.display', + 'showHeader' => 'false', + 'uid' => $nextMessage['next'], + 'mailbox' => base64_encode($this->mailbox) + ); + $nextURL = $GLOBALS['egw']->link('/index.php',$linkData); + $nextURL = "goToMessage('$nextURL')"; + $navbarImages['down.button'] = array( + 'action' => $nextURL, + 'tooltip' => lang('next message'), + ); + } else { + $nextURL = '#'; + $navbarImages['down.grey'] = array( + #'action' => $nextURL, + 'tooltip' => lang('next message'), + ); + } + + + foreach($navbarImages as $buttonName => $buttonData) { + $navbarButtons .= $uiWidgets->navbarButton($buttonName, $buttonData['action'], $buttonData['tooltip'], 'right'); + } + + $this->t->set_var('navbarButtonsRight',$navbarButtons); + + $this->t->parse('navbar','message_navbar',True); + + // navbar end + // header + // sent by a mailinglist?? + // parse the from header + if($envelope['FROM'][0] != $envelope['SENDER'][0]) { + $senderAddress = self::emailAddressToHTML($envelope['SENDER']); + $fromAddress = self::emailAddressToHTML($envelope['FROM'], $organization); + $this->t->set_var("from_data",$senderAddress); + $this->t->set_var("onbehalfof_data",$fromAddress); + $this->t->parse('on_behalf_of_part','message_onbehalfof',True); + } else { + $fromAddress = self::emailAddressToHTML($envelope['FROM'], $organization); + $this->t->set_var("from_data", $fromAddress); + $this->t->set_var('on_behalf_of_part',''); + } + + // parse the to header + $toAddress = self::emailAddressToHTML($envelope['TO']); + $this->t->set_var("to_data",$toAddress); + + // parse the cc header + if(count($envelope['CC'])) { + $ccAddress = self::emailAddressToHTML($envelope['CC']); + $this->t->set_var("cc_data",$ccAddress); + $this->t->parse('cc_data_part','message_cc',True); + } else { + $this->t->set_var("cc_data_part",''); + } + + // parse the bcc header + if(count($envelope['BCC'])) { + $bccAddress = self::emailAddressToHTML($envelope['BCC']); + $this->t->set_var("bcc_data",$bccAddress); + $this->t->parse('bcc_data_part','message_bcc',True); + } else { + $this->t->set_var("bcc_data_part",''); + } + + $this->t->set_var("date_received", + @htmlspecialchars($GLOBALS['egw']->common->show_date(strtotime($headers['DATE'])), + ENT_QUOTES,$this->displayCharset)); + + $this->t->set_var("subject_data", + @htmlspecialchars($this->bofelamimail->decode_subject(preg_replace($nonDisplayAbleCharacters,'',$envelope['SUBJECT'])), + ENT_QUOTES,$this->displayCharset)); + + $this->t->parse("header","message_header",True); + + $this->t->set_var("rawheader",@htmlentities(preg_replace($nonDisplayAbleCharacters,'',$rawheaders),ENT_QUOTES,$this->displayCharset)); + + $linkData = array ( + 'menuaction' => 'felamimail.uidisplay.displayBody', + 'uid' => $this->uid, + 'part' => $partID, + 'mailbox' => base64_encode($this->mailbox) + ); + $this->t->set_var('url_displayBody', $GLOBALS['egw']->link('/index.php',$linkData)); + + // attachments + if(is_array($attachments) && count($attachments) > 0) { + $this->t->set_var('attachment_count',count($attachments)); + } else { + $this->t->set_var('attachment_count','0'); + } + + if (is_array($attachments) && count($attachments) > 0) { + $this->t->set_var('row_color',$this->rowColor[0]); + $this->t->set_var('name',lang('name')); + $this->t->set_var('type',lang('type')); + $this->t->set_var('size',lang('size')); + $this->t->set_var('url_img_save',html::image('felamimail','fileexport', lang('save'))); + $url_img_vfs = html::image('filemanager','navbar', lang('Filemanager'), ' height="16"'); + $url_img_vfs_save_all = html::image('felamimail','save_all', lang('Save all')); + #$this->t->parse('attachment_rows','attachment_row_bold',True); + + $detectedCharSet=$charset2use=$this->displayCharset; + foreach ($attachments as $key => $value) + { + #$detectedCharSet = mb_detect_encoding($value['name'].'a',strtoupper($this->displayCharset).",UTF-8, ISO-8559-1"); + if (function_exists('mb_convert_variables')) mb_convert_variables("UTF-8","ISO-8559-1",$value['name']); # iso 2 UTF8 + //if (mb_convert_variables("ISO-8859-1","UTF-8",$value['name'])){echo "Juhu utf8 2 ISO\n";}; + //echo $value['name']."\n"; + $filename=htmlentities($value['name'], ENT_QUOTES, $detectedCharSet); + + $this->t->set_var('row_color',$this->rowColor[($key+1)%2]); + $this->t->set_var('filename',($value['name'] ? ( $filename ? $filename : $value['name'] ) : lang('(no subject)'))); + $this->t->set_var('mimetype',mime_magic::mime2label($value['mimeType'])); + $this->t->set_var('size',egw_vfs::hsize($value['size'])); + $this->t->set_var('attachment_number',$key); + + switch(strtoupper($value['mimeType'])) + { + case 'MESSAGE/RFC822': + $linkData = array + ( + 'menuaction' => 'felamimail.uidisplay.display', + 'uid' => $this->uid, + 'part' => $value['partID'], + 'mailbox' => base64_encode($this->mailbox), + 'is_winmail' => $value['is_winmail'] + ); + $windowName = 'displayMessage_'. $this->uid.'_'.$value['partID']; + $linkView = "egw_openWindowCentered('".$GLOBALS['egw']->link('/index.php',$linkData)."','$windowName',700,egw_getWindowOuterHeight());"; + break; + case 'IMAGE/JPEG': + case 'IMAGE/PNG': + case 'IMAGE/GIF': + case 'IMAGE/BMP': + case 'APPLICATION/PDF': + case 'TEXT/PLAIN': + case 'TEXT/HTML': + case 'TEXT/CALENDAR': + case 'TEXT/X-VCARD': + $linkData = array + ( + 'menuaction' => 'felamimail.uidisplay.getAttachment', + 'uid' => $this->uid, + 'part' => $value['partID'], + 'is_winmail' => $value['is_winmail'], + 'mailbox' => base64_encode($this->mailbox), + ); + $windowName = 'displayAttachment_'. $this->uid; + $reg = '800x600'; + // handle calendar/vcard + if (strtoupper($value['mimeType'])=='TEXT/CALENDAR') + { + $windowName = 'displayEvent_'. $this->uid; + $reg2 = egw_link::get_registry('calendar','view_popup'); + } + if (strtoupper($value['mimeType'])=='TEXT/X-VCARD') + { + $windowName = 'displayContact_'. $this->uid; + $reg2 = egw_link::get_registry('addressbook','add_popup'); + } + // apply to action + list($width,$height) = explode('x',(!empty($reg2) ? $reg2 : $reg)); + $linkView = "egw_openWindowCentered('".$GLOBALS['egw']->link('/index.php',$linkData)."','$windowName',$width,$height);"; + break; + default: + $linkData = array + ( + 'menuaction' => 'felamimail.uidisplay.getAttachment', + 'uid' => $this->uid, + 'part' => $value['partID'], + 'is_winmail' => $value['is_winmail'], + 'mailbox' => base64_encode($this->mailbox), + ); + $linkView = "window.location.href = '".$GLOBALS['egw']->link('/index.php',$linkData)."';"; + break; + } + $this->t->set_var("link_view",$linkView); + $this->t->set_var("target",$target); + + $linkData = array + ( + 'menuaction' => 'felamimail.uidisplay.getAttachment', + 'mode' => 'save', + 'uid' => $this->uid, + 'part' => $value['partID'], + 'is_winmail' => $value['is_winmail'], + 'mailbox' => base64_encode($this->mailbox), + ); + $this->t->set_var("link_save",$GLOBALS['egw']->link('/index.php',$linkData)); + + if ($GLOBALS['egw_info']['user']['apps']['filemanager']) + { + $link_vfs_save = egw::link('/index.php',array( + 'menuaction' => 'filemanager.filemanager_select.select', + 'mode' => 'saveas', + 'name' => $value['name'], + 'mime' => strtolower($value['mimeType']), + 'method' => 'felamimail.uidisplay.vfsSaveAttachment', + 'id' => $this->mailbox.'::'.$this->uid.'::'.$value['partID'].'::'.$value['is_winmail'], + 'label' => lang('Save'), + )); + $vfs_save = "$url_img_vfs"; + // add save-all icon for first attachment + if (!$key && count($attachments) > 1) + { + foreach ($attachments as $key => $value) + { + $ids["id[$key]"] = $this->mailbox.'::'.$this->uid.'::'.$value['partID'].'::'.$value['is_winmail'].'::'.$value['name']; + } + $link_vfs_save = egw::link('/index.php',array( + 'menuaction' => 'filemanager.filemanager_select.select', + 'mode' => 'select-dir', + 'method' => 'felamimail.uidisplay.vfsSaveAttachment', + 'label' => lang('Save all'), + )+$ids); + $vfs_save .= "\n$url_img_vfs_save_all"; + } + $this->t->set_var('vfs_save',$vfs_save); + } + else + { + $this->t->set_var('vfs_save',''); + } + $this->t->parse('attachment_rows','message_attachement_row',True); + } + } else { + $this->t->set_var('attachment_rows',''); + } + + #$this->t->pparse("out","message_attachment_rows"); + + // print it out + if(is_array($attachments) && count($attachments) > 0) { + $this->t->pparse('out','message_main_attachment'); + } else { + $this->t->pparse('out','message_main'); + } + + } + + function displayBody() + { + $partID = $_GET['part']; + if (empty($this->uid) && !empty($_GET['uid']) ) $this->uid = 9247;//$_GET['uid']; + if (!empty($_GET['mailbox'])) $this->mailbox = base64_decode($_GET['mailbox']); + + $this->bofelamimail->reopen($this->mailbox); + $bodyParts = $this->bofelamimail->getMessageBody($this->uid,'',$partID); + $this->bofelamimail->closeConnection(); + + $this->display_app_header(); + $this->showBody($this->getdisplayableBody($bodyParts), true); + } + + function showBody(&$body, $print=true) + { + $BeginBody = ' +
    '; + + $EndBody = '
    '; + $EndBody .= ""; + if ($print) { + print $BeginBody. $body .$EndBody; + } else { + return $BeginBody. $body .$EndBody; + } + } + + function displayHeader() + { + $partID = $_GET['part']; + if (!empty($_GET['mailbox'])) $this->mailbox = base64_decode($_GET['mailbox']); + + //$transformdate =& CreateObject('felamimail.transformdate'); + //$htmlFilter =& CreateObject('felamimail.htmlfilter'); + //$uiWidgets =& CreateObject('felamimail.uiwidgets'); + // (regis) seems to be necessary to reopen... + $this->bofelamimail->reopen($this->mailbox); + #$headers = $this->bofelamimail->getMessageHeader($this->mailbox, $this->uid, $partID); + $rawheaders = $this->bofelamimail->getMessageRawHeader($this->uid, $partID); + + $webserverURL = $GLOBALS['egw_info']['server']['webserver_url']; + + #$nonDisplayAbleCharacters = array('[\016]','[\017]', + # '[\020]','[\021]','[\022]','[\023]','[\024]','[\025]','[\026]','[\027]', + # '[\030]','[\031]','[\032]','[\033]','[\034]','[\035]','[\036]','[\037]'); + + #print "
    ";print_r($rawheaders);print"
    ";exit; + + // add line breaks to $rawheaders + $newRawHeaders = explode("\n",$rawheaders); + reset($newRawHeaders); + + // reset $rawheaders + $rawheaders = ""; + // create it new, with good line breaks + reset($newRawHeaders); + while(list($key,$value) = @each($newRawHeaders)) { + $rawheaders .= wordwrap($value, 90, "\n "); + } + + $this->bofelamimail->closeConnection(); + + header('Content-type: text/html; charset=iso-8859-1'); + print '
    '. htmlspecialchars($rawheaders, ENT_NOQUOTES, 'iso-8859-1') .'
    '; + + } + + function displayAttachments() + { + $partID = $_GET['part']; + if (!empty($_GET['mailbox'])) $this->mailbox = base64_decode($_GET['mailbox']); + $nonDisplayAbleCharacters = array('[\016]','[\017]', + '[\020]','[\021]','[\022]','[\023]','[\024]','[\025]','[\026]','[\027]', + '[\030]','[\031]','[\032]','[\033]','[\034]','[\035]','[\036]','[\037]'); + + //$transformdate =& CreateObject('felamimail.transformdate'); + //$htmlFilter =& CreateObject('felamimail.htmlfilter'); + // (regis) seems to be necessary to reopen... + $this->bofelamimail->reopen($this->mailbox); + $headers = $this->bofelamimail->getMessageHeader($this->uid, $partID); + $envelope = $this->bofelamimail->getMessageEnvelope($this->uid, $partID); + if (PEAR::isError($headers)) { + print lang("ERROR: Message could not be displayed.")."
    "; + print "In Mailbox: $this->mailbox, with ID: $this->uid, and PartID: $partID
    "; + print $headers->message."
    "; + _debug_array($headers->backtrace[0]); + exit; + } + $attachments = $this->bofelamimail->getMessageAttachments($this->uid, $partID); + #_debug_array($attachments); exit; + + $this->display_app_header(); + $this->t->set_file(array("displayMsg" => "view_attachments.tpl")); + $this->t->set_var('charset',$GLOBALS['egw']->translation->charset()); + $this->t->set_block('displayMsg','message_main_attachment'); + $this->t->set_block('displayMsg','message_attachement_row'); + $this->bofelamimail->closeConnection(); + + $this->t->egroupware_hack = False; + + $this->translate(); + $this->t->set_var("subject_data", + @htmlspecialchars($this->bofelamimail->decode_subject(preg_replace($nonDisplayAbleCharacters,'',$envelope['SUBJECT'])), + ENT_QUOTES,$this->displayCharset)); + + // attachments + if(is_array($attachments) && count($attachments) > 0) { + $this->t->set_var('attachment_count',count($attachments)); + } else { + $this->t->set_var('attachment_count','0'); + } + + if (is_array($attachments) && count($attachments) > 0) { + $this->t->set_var('row_color',$this->rowColor[0]); + $this->t->set_var('name',lang('name')); + $this->t->set_var('type',lang('type')); + $this->t->set_var('size',lang('size')); + $this->t->set_var('url_img_save',html::image('felamimail','fileexport', lang('save'))); + $url_img_vfs = html::image('filemanager','navbar', lang('Filemanager'), ' height="16"'); + $url_img_vfs_save_all = html::image('felamimail','save_all', lang('Save all')); + #$this->t->parse('attachment_rows','attachment_row_bold',True); + + $detectedCharSet=$charset2use=$this->displayCharset; + foreach ($attachments as $key => $value) + { + #$detectedCharSet = mb_detect_encoding($value['name'].'a',strtoupper($this->displayCharset).",UTF-8, ISO-8559-1"); + if (function_exists('mb_convert_variables')) mb_convert_variables("UTF-8","ISO-8559-1",$value['name']); # iso 2 UTF8 + //if (mb_convert_variables("ISO-8859-1","UTF-8",$value['name'])){echo "Juhu utf8 2 ISO\n";}; + //echo $value['name']."\n"; + $filename=htmlentities($value['name'], ENT_QUOTES, $detectedCharSet); + + $this->t->set_var('row_color',$this->rowColor[($key+1)%2]); + $this->t->set_var('filename',($value['name'] ? ( $filename ? $filename : $value['name'] ) : lang('(no subject)'))); + $this->t->set_var('mimetype',mime_magic::mime2label($value['mimeType'])); + $this->t->set_var('size',egw_vfs::hsize($value['size'])); + $this->t->set_var('attachment_number',$key); + + switch(strtoupper($value['mimeType'])) + { + case 'MESSAGE/RFC822': + $linkData = array + ( + 'menuaction' => 'felamimail.uidisplay.display', + 'uid' => $this->uid, + 'part' => $value['partID'], + 'mailbox' => base64_encode($this->mailbox), + 'is_winmail' => $value['is_winmail'] + ); + $windowName = 'displayMessage_'. $this->uid.'_'.$value['partID']; + $linkView = "egw_openWindowCentered('".$GLOBALS['egw']->link('/index.php',$linkData)."','$windowName',700,screen.availHeight-50);"; + break; + case 'IMAGE/JPEG': + case 'IMAGE/PNG': + case 'IMAGE/GIF': + case 'IMAGE/BMP': + case 'APPLICATION/PDF': + case 'TEXT/PLAIN': + case 'TEXT/HTML': + case 'TEXT/CALENDAR': + case 'TEXT/X-VCARD': + $linkData = array + ( + 'menuaction' => 'felamimail.uidisplay.getAttachment', + 'uid' => $this->uid, + 'part' => $value['partID'], + 'is_winmail' => $value['is_winmail'], + 'mailbox' => base64_encode($this->mailbox), + ); + $windowName = 'displayAttachment_'. $this->uid; + $reg = '800x600'; + // handle calendar/vcard + if (strtoupper($value['mimeType'])=='TEXT/CALENDAR') + { + $windowName = 'displayEvent_'. $this->uid; + $reg2 = egw_link::get_registry('calendar','view_popup'); + } + if (strtoupper($value['mimeType'])=='TEXT/X-VCARD') + { + $windowName = 'displayContact_'. $this->uid; + $reg2 = egw_link::get_registry('addressbook','add_popup'); + } + // apply to action + list($width,$height) = explode('x',(!empty($reg2) ? $reg2 : $reg)); + $linkView = "egw_openWindowCentered('".$GLOBALS['egw']->link('/index.php',$linkData)."','$windowName',$width,$height);"; + break; + default: + $linkData = array + ( + 'menuaction' => 'felamimail.uidisplay.getAttachment', + 'uid' => $this->uid, + 'part' => $value['partID'], + 'is_winmail' => $value['is_winmail'], + 'mailbox' => base64_encode($this->mailbox), + ); + $linkView = "window.location.href = '".$GLOBALS['egw']->link('/index.php',$linkData)."';"; + break; + } + $this->t->set_var("link_view",$linkView); + $this->t->set_var("target",$target); + + $linkData = array + ( + 'menuaction' => 'felamimail.uidisplay.getAttachment', + 'mode' => 'save', + 'uid' => $this->uid, + 'part' => $value['partID'], + 'is_winmail' => $value['is_winmail'], + 'mailbox' => base64_encode($this->mailbox), + ); + $this->t->set_var("link_save",$GLOBALS['egw']->link('/index.php',$linkData)); + + if ($GLOBALS['egw_info']['user']['apps']['filemanager']) + { + $link_vfs_save = egw::link('/index.php',array( + 'menuaction' => 'filemanager.filemanager_select.select', + 'mode' => 'saveas', + 'name' => $value['name'], + 'mime' => strtolower($value['mimeType']), + 'method' => 'felamimail.uidisplay.vfsSaveAttachment', + 'id' => $this->mailbox.'::'.$this->uid.'::'.$value['partID'].'::'.$value['is_winmail'], + 'label' => lang('Save'), + )); + $vfs_save = "$url_img_vfs"; + // add save-all icon for first attachment + if (!$key && count($attachments) > 1) + { + foreach ($attachments as $key => $value) + { + $ids["id[$key]"] = $this->mailbox.'::'.$this->uid.'::'.$value['partID'].'::'.$value['is_winmail'].'::'.$value['name']; + } + $link_vfs_save = egw::link('/index.php',array( + 'menuaction' => 'filemanager.filemanager_select.select', + 'mode' => 'select-dir', + 'method' => 'felamimail.uidisplay.vfsSaveAttachment', + 'label' => lang('Save all'), + )+$ids); + $vfs_save .= "\n$url_img_vfs_save_all"; + } + $this->t->set_var('vfs_save',$vfs_save); + } + else + { + $this->t->set_var('vfs_save',''); + } + $this->t->parse('attachment_rows','message_attachement_row',True); + } + } else { + $this->t->set_var('attachment_rows',''); + } + + $this->t->pparse('out','message_main_attachment'); + + } + + function displayImage() + { + $cid = base64_decode($_GET['cid']); + $partID = urldecode($_GET['partID']); + if (!empty($_GET['mailbox'])) $this->mailbox = base64_decode($_GET['mailbox']); + + $this->bofelamimail->reopen($this->mailbox); + + $attachment = $this->bofelamimail->getAttachmentByCID($this->uid, $cid, $partID); + + $this->bofelamimail->closeConnection(); + + $GLOBALS['egw']->session->commit_session(); + + if(is_array($attachment)) { + //error_log("Content-Type: ".$attachment['type']."; name=\"". $attachment['filename'] ."\""); + header ("Content-Type: ". strtolower($attachment['type']) ."; name=\"". $attachment['filename'] ."\""); + header ('Content-Disposition: inline; filename="'. $attachment['filename'] .'"'); + header("Expires: 0"); + // the next headers are for IE and SSL + header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); + header("Pragma: public"); + + echo trim($attachment['attachment']); + exit; + } + + $GLOBALS['egw']->common->egw_exit(); + + exit; + } + + function display_app_header($printing = NULL) + { + if ($_GET['menuaction'] != 'felamimail.uidisplay.printMessage' && + $_GET['menuaction'] != 'felamimail.uidisplay.displayBody' && + $_GET['menuaction'] != 'felamimail.uidisplay.displayAttachments' && + empty($printing)) + { + $GLOBALS['egw']->js->validate_file('tabs','tabs'); + $GLOBALS['egw']->js->validate_file('jscode','view_message','felamimail'); + $GLOBALS['egw']->js->set_onload('javascript:initAll();'); + } + + if(($_GET['menuaction'] == 'felamimail.uidisplay.printMessage') || (!empty($printing) && $printing == 1)) { + $GLOBALS['egw']->js->set_onload('javascript:updateTitle();javascript:window.print();'); + } + + if($_GET['menuaction'] == 'felamimail.uidisplay.printMessage' || (!empty($printing) && $printing == 1) || + $_GET['menuaction'] == 'felamimail.uidisplay.displayBody' || + $_GET['menuaction'] == 'felamimail.uidisplay.displayAttachments' ) { + $GLOBALS['egw_info']['flags']['nofooter'] = true; + } + $GLOBALS['egw_info']['flags']['include_xajax'] = True; + $GLOBALS['egw']->common->egw_header(); + } + + static function emailAddressToHTML($_emailAddress, $_organisation='', $allwaysShowMailAddress=false, $showAddToAdrdessbookLink=true) { + #_debug_array($_emailAddress); + // create some nice formated HTML for senderaddress + #if($_emailAddress['EMAIL'] == 'undisclosed-recipients: ;') + # return $_emailAddress['EMAIL']; + + #$addressData = imap_rfc822_parse_adrlist + # ($this->bofelamimail->decode_header($_emailAddress),''); + if(is_array($_emailAddress)) { + $senderAddress = ''; + foreach($_emailAddress as $addressData) { + #_debug_array($addressData); + if($addressData['MAILBOX_NAME'] == 'NIL') { + continue; + } + + if(!empty($senderAddress)) $senderAddress .= ', '; + + if(strtolower($addressData['MAILBOX_NAME']) == 'undisclosed-recipients') { + $senderAddress .= 'undisclosed-recipients'; + continue; + } + + if($addressData['PERSONAL_NAME'] != 'NIL') { + $newSenderAddress = $addressData['RFC822_EMAIL'] != 'NIL' ? $addressData['RFC822_EMAIL'] : $addressData['EMAIL']; + $newSenderAddress = bofelamimail::decode_header($newSenderAddress); + $decodedPersonalName = bofelamimail::decode_header($addressData['PERSONAL_NAME']); + + $realName = $decodedPersonalName; + // add mailaddress + if ($allwaysShowMailAddress) { + $realName .= ' <'.$addressData['EMAIL'].'>'; + } + // add organization + if(!empty($_organisation)) { + $realName .= ' ('. $_organisation . ')'; + } + + $linkData = array ( + 'menuaction' => 'felamimail.uicompose.compose', + 'send_to' => base64_encode($newSenderAddress) + ); + $link = $GLOBALS['egw']->link('/index.php',$linkData); + $senderAddress .= sprintf('%s', + $link, + @htmlentities($newSenderAddress,ENT_QUOTES,bofelamimail::$displayCharset), + @htmlentities($realName, ENT_QUOTES, bofelamimail::$displayCharset)); + + $linkData = array ( + 'menuaction' => 'addressbook.addressbook_ui.edit', + 'presets[email]' => $addressData['EMAIL'], + 'presets[org_name]' => $_organisation, + 'referer' => $_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'] + ); + if (!empty($decodedPersonalName)) { + if($spacePos = strrpos($decodedPersonalName, ' ')) { + $linkData['presets[n_family]'] = substr($decodedPersonalName, $spacePos+1); + $linkData['presets[n_given]'] = substr($decodedPersonalName, 0, $spacePos); + } else { + $linkData['presets[n_family]'] = $decodedPersonalName; + } + $linkData['presets[n_fn]'] = $decodedPersonalName; + } + if ($showAddToAdrdessbookLink && $GLOBALS['egw_info']['user']['apps']['addressbook']) { + $urlAddToAddressbook = $GLOBALS['egw']->link('/index.php',$linkData); + $onClick = "window.open(this,this.target,'dependent=yes,width=850,height=440,location=no,menubar=no,toolbar=no,scrollbars=yes,status=yes'); return false;"; + $image = $GLOBALS['egw']->common->image('felamimail','sm_envelope'); + $senderAddress .= sprintf(' + %s', + $urlAddToAddressbook, + $onClick, + $image, + lang('add to addressbook'), + lang('add to addressbook')); + } + } else { + $linkData = array ( + 'menuaction' => 'felamimail.uicompose.compose', + 'send_to' => base64_encode($addressData['EMAIL']) + ); + $link = $GLOBALS['egw']->link('/index.php',$linkData); + $senderAddress .= sprintf('%s', + $link,@htmlentities($addressData['EMAIL'], ENT_QUOTES, bofelamimail::$displayCharset)); + //TODO: This uses old addressbook code, which should be removed in Version 1.4 + //Please use addressbook.addressbook_ui.edit with proper paramenters + $linkData = array + ( + 'menuaction' => 'addressbook.addressbook_ui.edit', + 'presets[email]' => $addressData['EMAIL'], + 'presets[org_name]' => $_organisation, + 'referer' => $_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'] + ); + + if ($showAddToAdrdessbookLink && $GLOBALS['egw_info']['user']['apps']['addressbook']) { + $urlAddToAddressbook = $GLOBALS['egw']->link('/index.php',$linkData); + $onClick = "window.open(this,this.target,'dependent=yes,width=850,height=440,location=no,menubar=no,toolbar=no,scrollbars=yes,status=yes'); return false;"; + $image = $GLOBALS['egw']->common->image('felamimail','sm_envelope'); + $senderAddress .= sprintf(' + %s', + $urlAddToAddressbook, + $onClick, + $image, + lang('add to addressbook'), + lang('add to addressbook')); + } + } + } + + return $senderAddress; + } + + // if something goes wrong, just return the original address + return $_emailAddress; + } + + /** + * Save an attachment in the vfs + * + * @param string|array $ids '::' delemited mailbox::uid::part-id::is_winmail::name (::name for multiple id's) + * @param string $path path in vfs (no egw_vfs::PREFIX!), only directory for multiple id's ($ids is an array) + * @return string javascript eg. to close the selector window + */ + function vfsSaveAttachment($ids,$path) + { + //return "alert('".__METHOD__.'("'.array2string($id).'","'.$path."\")'); window.close();"; + + if (is_array($ids) && !egw_vfs::is_writable($path) || !is_array($ids) && !egw_vfs::is_writable(dirname($path))) + { + return 'alert("'.addslashes(lang('%1 is NOT writable by you!',$path)).'"); window.close();'; + } + foreach((array)$ids as $id) + { + list($this->mailbox,$this->uid,$part,$is_winmail,$name) = explode('::',$id,5); + if ($mb != $this->mailbox) $this->bofelamimail->reopen($mb = $this->mailbox); + $attachment = $this->bofelamimail->getAttachment($this->uid,$part,$is_winmail); + + if (!($fp = egw_vfs::fopen($file=$path.($name ? '/'.$name : ''),'wb')) || + !fwrite($fp,$attachment['attachment'])) + { + $err .= 'alert("'.addslashes(lang('Error saving %1!',$file)).'");'; + } + if ($fp) fclose($fp); + } + $this->bofelamimail->closeConnection(); + + return $err.'window.close();'; + } + + function getAttachment() + { + + $part = $_GET['part']; + $is_winmail = $_GET['is_winmail'] ? $_GET['is_winmail'] : 0; + if (!empty($_GET['mailbox'])) $this->mailbox = base64_decode($_GET['mailbox']); + + $this->bofelamimail->reopen($this->mailbox); + #$attachment = $this->bofelamimail->getAttachment($this->uid,$part); + $attachment = $this->bofelamimail->getAttachment($this->uid,$part,$is_winmail); + $this->bofelamimail->closeConnection(); + + $GLOBALS['egw']->session->commit_session(); + if ($_GET['mode'] != "save") + { + //error_log(__METHOD__.print_r($attachment,true)); + if (strtoupper($attachment['type']) == 'TEXT/CALENDAR') + { + //error_log(__METHOD__."about to call calendar_ical"); + $calendar_ical = new calendar_ical(); + $eventid = $calendar_ical->search($attachment['attachment'],-1); + if (!$eventid) $eventid = -1; + $event = $calendar_ical->importVCal($attachment['attachment'],$eventid,null,true); + //error_log(__METHOD__.$event); + if ((int)$event > 0) + { + $vars = array( + 'menuaction' => 'calendar.calendar_uiforms.edit', + 'cal_id' => $event, + ); + $GLOBALS['egw']->redirect_link('../index.php',$vars); + } + //Import failed, download content anyway + } + if (strtoupper($attachment['type']) == 'TEXT/X-VCARD') + { + $addressbook_vcal = new addressbook_vcal(); + $vcard = $addressbook_vcal->vcardtoegw($attachment['attachment']); + //error_log(print_r($vcard,true)); + if ($vcard['uid']) $contact = $addressbook_vcal->find_contact($vcard,false); + if (!$contact) $contact = null; + // if there are not enough fields in the vcard (or the parser was unable to correctly parse the vcard (as of VERSION:3.0 created by MSO)) + if ($contact || count($vcard)>2) $contact = $addressbook_vcal->addVCard($attachment['attachment'],$contact,true); + //error_log(__METHOD__.$contact); + if ((int)$contact > 0) + { + $vars = array( + 'menuaction' => 'addressbook.addressbook_ui.edit', + 'contact_id' => $contact, + ); + $GLOBALS['egw']->redirect_link('../index.php',$vars); + } + //Import failed, download content anyway + } + } + header ("Content-Type: ".$attachment['type']."; name=\"". $attachment['filename'] ."\""); + if($_GET['mode'] == "save") { + // ask for download + header ("Content-Disposition: attachment; filename=\"". $attachment['filename'] ."\""); + } else { + // display it + header ("Content-Disposition: inline; filename=\"". $attachment['filename'] ."\""); + } + header("Expires: 0"); + // the next headers are for IE and SSL + header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); + header("Pragma: public"); + + echo $attachment['attachment']; + + $GLOBALS['egw']->common->egw_exit(); + exit; + } + + function &getdisplayableBody($_bodyParts) + { + $bodyParts = $_bodyParts; + + $webserverURL = $GLOBALS['egw_info']['server']['webserver_url']; + + $nonDisplayAbleCharacters = array('[\016]','[\017]', + '[\020]','[\021]','[\022]','[\023]','[\024]','[\025]','[\026]','[\027]', + '[\030]','[\031]','[\032]','[\033]','[\034]','[\035]','[\036]','[\037]'); + + $body = ''; + + #_debug_array($bodyParts); exit; + + foreach($bodyParts as $singleBodyPart) { + if (!isset($singleBodyPart['body'])) { + $singleBodyPart['body'] = $this->getdisplayableBody($singleBodyPart); + $body .= $singleBodyPart['body']; + continue; + } + if(!empty($body)) { + $body .= '
    '; + } + #_debug_array($singleBodyPart['charSet']); + #_debug_array($singleBodyPart['mimeType']); + #error_log($singleBodyPart['body']); + // some characterreplacements, as they fail to translate + $sar = array( + '@(\x84|\x93|\x94)@', + '@(\x96|\x97)@', + '@(\x91|\x92)@', + '@(\x85)@', + '@(\x86)@', + ); + $rar = array( + '"', + '-', + '\'', + '...', + '+', + ); + if($singleBodyPart['mimeType'] == 'text/html' && strtoupper($singleBodyPart['charSet']) != 'UTF-8') $singleBodyPart['body'] = preg_replace($sar,$rar,$singleBodyPart['body']); + $singleBodyPart['body'] = $GLOBALS['egw']->translation->convert( + $singleBodyPart['body'], + strtolower($singleBodyPart['charSet']) + ); + //error_log($singleBodyPart['body']); + #$CharSetUsed = mb_detect_encoding($singleBodyPart['body'] . 'a' , strtoupper($singleBodyPart['charSet']).','.strtoupper($this->displayCharset).',UTF-8, ISO-8859-1'); + + if($singleBodyPart['mimeType'] == 'text/plain') + { + //$newBody = $singleBodyPart['body']; + + $newBody = @htmlentities($singleBodyPart['body'],ENT_QUOTES, strtoupper($this->displayCharset)); + // if empty and charset is utf8 try sanitizing the string in question + if (empty($newBody) && strtolower($singleBodyPart['charSet'])=='utf-8') $newBody = @htmlentities(iconv('utf-8', 'utf-8', $singleBodyPart['body']),ENT_QUOTES, strtoupper($this->displayCharset)); + // if the conversion to htmlentities fails somehow, try without specifying the charset, which defaults to iso- + if (empty($newBody)) $newBody = htmlentities($singleBodyPart['body'],ENT_QUOTES); + #$newBody = $this->bofelamimail->wordwrap($newBody, 90, "\n"); + + // search http[s] links and make them as links available again + // to understand what's going on here, have a look at + // http://www.php.net/manual/en/function.preg-replace.php + + // create links for websites + $newBody = html::activate_links($newBody); + // redirect links for websites if you use no cookies + #if (!($GLOBALS['egw_info']['server']['usecookies'])) + # $newBody = preg_replace("/href=(\"|\')((http(s?):\/\/)|(www\.))([\w,\-,\/,\?,\=,\.,&,!\n,\%,@,\(,\),\*,#,:,~,\+]+)(\"|\')/ie", + # "'href=\"$webserverURL/redirect.php?go='.@htmlentities(urlencode('http$4://$5$6'),ENT_QUOTES,\"$this->displayCharset\").'\"'", $newBody); + + // create links for email addresses + $this->parseEmail($newBody); + $newBody = $this->highlightQuotes($newBody); + // to display a mailpart of mimetype plain/text, may be better taged as preformatted + #$newBody = nl2br($newBody); + // since we do not display the message as HTML anymore we may want to insert good linebreaking (for visibility). + $newBody = "
    ".bofelamimail::wordwrap($newBody,85,"\n")."
    "; + #$newBody = "
    ".$newBody."
    "; + } + else + { + $newBody = $singleBodyPart['body']; + $newBody = $this->highlightQuotes($newBody); + #error_log(print_r($newBody,true)); + + // do the cleanup, set for the use of purifier + $usepurifier = true; + bofelamimail::getCleanHTML($newBody,$usepurifier); + // removes stuff between http and ?http + $Protocol = '(http:\/\/|(ftp:\/\/|https:\/\/))'; // only http:// gets removed, other protocolls are shown + $newBody = preg_replace('~'.$Protocol.'[^>]*\?'.$Protocol.'~sim','$1',$newBody); // removes stuff between http:// and ?http:// + // spamsaver emailaddress, needed to be able to apply email compose links later + $newBody = preg_replace('/(?\\1 AT \\2 DOT \\3', + $newBody); + + // redirect links for websites if you use no cookies + #if (!($GLOBALS['egw_info']['server']['usecookies'])) { //do it all the time, since it does mask the mailadresses in urls + $this->parseHREF($newBody); + #} + // create links for inline images + $linkData = array ( + 'menuaction' => 'felamimail.uidisplay.displayImage', + 'uid' => $this->uid, + 'mailbox' => base64_encode($this->mailbox) + ); + $imageURL = $GLOBALS['egw']->link('/index.php', $linkData); + if ($this->partID) { + $newBody = preg_replace("/src=(\"|\')cid:(.*)(\"|\')/iUe", + "'src=\"$imageURL&cid='.base64_encode('$2').'&partID='.urlencode($this->partID).'\"'", $newBody); + } else { + $newBody = preg_replace("/src=(\"|\')cid:(.*)(\"|\')/iUe", + "'src=\"$imageURL&cid='.base64_encode('$2').'&partID='.'\"'", $newBody); + } + + // create links for email addresses + $linkData = array + ( + 'menuaction' => 'felamimail.uicompose.compose' + ); + $link = $GLOBALS['egw']->link('/index.php',$linkData); + $newBody = preg_replace("/href=(\"|\')mailto:([\w,\-,\/,\?,\=,\.,&,!\n,\%,@,\*,#,:,~,\+]+)(\"|\')/ie", + "'href=\"$link&send_to='.base64_encode('$2').'\"'", $newBody); + #print "
    ".htmlentities($newBody)."

    "; + + // replace emails within the text with clickable links. + $this->parseEmail($newBody); + } + $body .= $newBody; + #print "
    $body

    "; + } + + // create links for windows shares + // \\\\\\\\ == '\\' in real life!! :) + $body = preg_replace("/(\\\\\\\\)([\w,\\\\,-]+)/i", + "$1$2", $body); + + $body = preg_replace($nonDisplayAbleCharacters,'',$body); + + return $body; + } + + function printMessage($messageId = NULL, $callfromcompose = NULL) + { + if (!empty($messageId) && empty($this->uid)) $this->uid = $messageId; + $partID = $_GET['part']; + if (!empty($_GET['folder'])) $this->mailbox = base64_decode($_GET['folder']); + + //$transformdate =& CreateObject('felamimail.transformdate'); + //$htmlFilter =& CreateObject('felamimail.htmlfilter'); + //$uiWidgets =& CreateObject('felamimail.uiwidgets'); + // (regis) seems to be necessary to reopen... + $folder = $this->mailbox; + // the folder for callfromcompose is hardcoded, because the message to be printed from the compose window is saved as draft, and can be + // reopened for composing (only) from there + if ($callfromcompose) + { + if (isset($this->mailPreferences->preferences['draftFolder']) && + $this->mailPreferences->preferences['draftFolder'] != 'none') + { + $folder = $this->mailPreferences->preferences['draftFolder']; + } + else + { + $folder = $GLOBALS['egw_info']['user']['preferences']['felamimail']['draftFolder']; + } + } + $this->bofelamimail->reopen($folder); +# print "$this->mailbox, $this->uid, $partID
    "; + $headers = $this->bofelamimail->getMessageHeader($this->uid, $partID); + $envelope = $this->bofelamimail->getMessageEnvelope($this->uid, $partID); +# _debug_array($headers);exit; + $rawheaders = $this->bofelamimail->getMessageRawHeader($this->uid, $partID); + $bodyParts = $this->bofelamimail->getMessageBody($this->uid,'',$partID); + $attachments = $this->bofelamimail->getMessageAttachments($this->uid,$partID); +# _debug_array($nextMessage); exit; + + $webserverURL = $GLOBALS['egw_info']['server']['webserver_url']; + + $nonDisplayAbleCharacters = array('[\016]','[\017]', + '[\020]','[\021]','[\022]','[\023]','[\024]','[\025]','[\026]','[\027]', + '[\030]','[\031]','[\032]','[\033]','[\034]','[\035]','[\036]','[\037]'); + + #print "
    ";print_r($rawheaders);print"
    ";exit; + + // add line breaks to $rawheaders + $newRawHeaders = explode("\n",$rawheaders); + reset($newRawHeaders); + + // find the Organization header + // the header can also span multiple rows + while(is_array($newRawHeaders) && list($key,$value) = each($newRawHeaders)) { + #print $value."
    "; + if(preg_match("/Organization: (.*)/",$value,$matches)) { + $organization = $this->bofelamimail->decode_header(chop($matches[1])); + continue; + } + if(!empty($organization) && preg_match("/^\s+(.*)/",$value,$matches)) { + $organization .= $this->bofelamimail->decode_header(chop($matches[1])); + break; + } elseif(!empty($organization)) { + break; + } + } + + $this->bofelamimail->closeConnection(); + + $this->display_app_header($callfromcompose); + $this->t->set_file(array("displayMsg" => "view_message_printable.tpl")); + # $this->t->set_var('charset',$GLOBALS['egw']->translation->charset()); + + $this->t->set_block('displayMsg','message_main'); + # $this->t->set_block('displayMsg','message_main_attachment'); + $this->t->set_block('displayMsg','message_header'); + # $this->t->set_block('displayMsg','message_raw_header'); + # $this->t->set_block('displayMsg','message_navbar'); + $this->t->set_block('displayMsg','message_onbehalfof'); + $this->t->set_block('displayMsg','message_cc'); + $this->t->set_block('displayMsg','message_attachement_row'); + # $this->t->set_block('displayMsg','previous_message_block'); + # $this->t->set_block('displayMsg','next_message_block'); + $this->t->set_block('displayMsg','message_org'); + + # $this->t->egroupware_hack = False; + + $this->translate(); + + if($envelope['FROM'][0] != $envelope['SENDER'][0]) { + $senderAddress = self::emailAddressToHTML($envelope['SENDER'], '', true, false); + $fromAddress = self::emailAddressToHTML($envelope['FROM'], $organization, true, false); + $this->t->set_var("from_data",$senderAddress); + $this->t->set_var("onbehalfof_data",$fromAddress); + $this->t->parse('on_behalf_of_part','message_onbehalfof',True); + } else { + $fromAddress = self::emailAddressToHTML($envelope['FROM'], $organization, true, false); + $this->t->set_var("from_data", $fromAddress); + $this->t->set_var('on_behalf_of_part',''); + } + + // parse the to header + $toAddress = self::emailAddressToHTML($envelope['TO'], '', true, false); + $this->t->set_var("to_data",$toAddress); + + // parse the cc header + if(count($envelope['CC'])) { + $ccAddress = self::emailAddressToHTML($envelope['CC'], '', true, false); + $this->t->set_var("cc_data",$ccAddress); + $this->t->parse('cc_data_part','message_cc',True); + } else { + $this->t->set_var("cc_data_part",''); + } + + $this->t->set_var("date_data", + @htmlspecialchars($GLOBALS['egw']->common->show_date(strtotime($headers['DATE'])), ENT_QUOTES,$this->displayCharset)); + + // link to go back to the message view. the link differs if the print was called from a normal viewing window, or from compose + $subject = @htmlspecialchars($this->bofelamimail->decode_subject(preg_replace($nonDisplayAbleCharacters, '', $envelope['SUBJECT'])), ENT_QUOTES, $this->displayCharset); + $this->t->set_var("subject_data", $subject); + $this->t->set_var("full_subject_data", $subject); + $linkData = array ( + 'menuaction' => 'felamimail.uidisplay.display', + 'showHeader' => 'false', + 'mailbox' => base64_encode($folder), + 'uid' => $this->uid, + 'id' => $this->id, + ); + if ($callfromcompose) { + $linkData['menuaction'] = 'felamimail.uicompose.composeFromDraft'; + $linkData['folder'] = base64_encode($folder); + } + $_readInNewWindow = $this->mailPreferences->preferences['message_newwindow']; + $this->t->set_var('url_read_message', $GLOBALS['egw']->link('/index.php',$linkData)); + + $target = 'displayMessage'; + $windowName = ($_readInNewWindow == 1 ? $target : $target.'_'.$this->uid); + #if ($callfromcompose) $target = 'composeFromDraft'; + if ($callfromcompose) $windowName = '_top'; + $this->t->set_var('read_message_windowName', $windowName); + + //if(isset($organization)) exit; + $this->t->parse("header","message_header",True); + + $this->t->set_var('body', $this->getdisplayableBody($bodyParts)); + + // attachments + if(is_array($attachments)) + $this->t->set_var('attachment_count',count($attachments)); + else + $this->t->set_var('attachment_count','0'); + + if (is_array($attachments) && count($attachments) > 0) { + $this->t->set_var('row_color',$this->rowColor[0]); + $this->t->set_var('name',lang('name')); + $this->t->set_var('type',lang('type')); + $this->t->set_var('size',lang('size')); + $this->t->set_var('url_img_save',$GLOBALS['egw']->common->image('felamimail','fileexport')); + #$this->t->parse('attachment_rows','attachment_row_bold',True); + foreach ($attachments as $key => $value) { + $this->t->set_var('row_color',$this->rowColor[($key+1)%2]); + $this->t->set_var('filename',@htmlentities($this->bofelamimail->decode_header($value['name']),ENT_QUOTES,$this->displayCharset)); + $this->t->set_var('mimetype',$value['mimeType']); + $this->t->set_var('size',$value['size']); + $this->t->set_var('attachment_number',$key); + + switch(strtolower($value['mimeType'])) + { + case 'message/rfc822': + $linkData = array + ( + 'menuaction' => 'felamimail.uidisplay.display', + 'uid' => $this->uid, + 'part' => $value['partID'], + 'mailbox' => base64_encode($folder), + ); + $windowName = 'displayMessage_'.$this->uid; + $linkView = "egw_openWindowCentered('".$GLOBALS['egw']->link('/index.php',$linkData)."','$windowName',700,egw_getWindowOuterHeight());"; + break; + case 'image/jpeg': + case 'image/png': + case 'image/gif': + case 'image/bmp': + #case 'application/pdf': + $linkData = array + ( + 'menuaction' => 'felamimail.uidisplay.getAttachment', + 'uid' => $this->uid, + 'part' => $value['partID'], + 'mailbox' => base64_encode($folder), + ); + $windowName = 'displayAttachment_'.$this->uid; + $linkView = "egw_openWindowCentered('".$GLOBALS['egw']->link('/index.php',$linkData)."','$windowName',800,600);"; + break; + default: + $linkData = array + ( + 'menuaction' => 'felamimail.uidisplay.getAttachment', + 'uid' => $this->uid, + 'part' => $value['partID'], + 'mailbox' => base64_encode($folder), + ); + $linkView = "window.location.href = '".$GLOBALS['egw']->link('/index.php',$linkData)."';"; + break; + } + $this->t->set_var("link_view",$linkView); + $this->t->set_var("target",$target); + + $linkData = array + ( + 'menuaction' => 'felamimail.uidisplay.getAttachment', + 'mode' => 'save', + 'uid' => $this->uid, + 'part' => $value['partID'], + 'mailbox' => base64_encode($folder), + ); + $this->t->set_var("link_save",$GLOBALS['egw']->link('/index.php',$linkData)); + + $this->t->parse('attachment_rows','message_attachement_row',True); + } + } + else + { + $this->t->set_var('attachment_rows',''); + } + + #$this->t->pparse("out","message_attachment_rows"); + + // print it out + # if(is_array($attachments)) { + # $this->t->pparse('out','message_main_attachment'); + # } else { + $this->t->pparse('out','message_main'); + # } + print ""; + + } + + function saveMessage() + { + $partID = $_GET['part']; + if (!empty($_GET['mailbox'])) $this->mailbox = base64_decode($_GET['mailbox']); + + // (regis) seems to be necessary to reopen... + $this->bofelamimail->reopen($this->mailbox); + + $message = $this->bofelamimail->getMessageRawBody($this->uid, $partID); + $headers = $this->bofelamimail->getMessageHeader($this->uid, $partID); + + $this->bofelamimail->closeConnection(); + + $GLOBALS['egw']->session->commit_session(); + + header ("Content-Type: message/rfc822; name=\"". $headers['SUBJECT'] .".eml\""); + header ("Content-Disposition: attachment; filename=\"". $headers['SUBJECT'] .".eml\""); + header("Expires: 0"); + // the next headers are for IE and SSL + header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); + header("Pragma: public"); + + echo $message; + + $GLOBALS['egw']->common->egw_exit(); + exit; + } + + function showHeader() + { + if($this->bofelamimail->sessionData['showHeader'] == 'True') + { + $this->bofelamimail->sessionData['showHeader'] = 'False'; + } + else + { + $this->bofelamimail->sessionData['showHeader'] = 'True'; + } + $this->bofelamimail->saveSessionData(); + + $this->display(); + } + + function translate() + { + $this->t->set_var("lang_message_list",lang('Message List')); + $this->t->set_var("lang_to",lang('to')); + $this->t->set_var("lang_cc",lang('cc')); + $this->t->set_var("lang_bcc",lang('bcc')); + $this->t->set_var("lang_from",lang('from')); + $this->t->set_var("lang_reply_to",lang('reply to')); + $this->t->set_var("lang_subject",lang('subject')); + $this->t->set_var("lang_addressbook",lang('addressbook')); + $this->t->set_var("lang_search",lang('search')); + $this->t->set_var("lang_send",lang('send')); + $this->t->set_var("lang_back_to_folder",lang('back to folder')); + $this->t->set_var("lang_attachments",lang('attachments')); + $this->t->set_var("lang_add",lang('add')); + $this->t->set_var("lang_remove",lang('remove')); + $this->t->set_var("lang_priority",lang('priority')); + $this->t->set_var("lang_normal",lang('normal')); + $this->t->set_var("lang_high",lang('high')); + $this->t->set_var("lang_low",lang('low')); + $this->t->set_var("lang_signature",lang('signature')); + $this->t->set_var("lang_compose",lang('compose')); + $this->t->set_var("lang_date",lang('date')); + $this->t->set_var("lang_view",lang('view')); + $this->t->set_var("lang_organization",lang('organization')); + $this->t->set_var("lang_save",lang('save')); + $this->t->set_var("lang_printable",lang('print it')); + $this->t->set_var("lang_reply",lang('reply')); + $this->t->set_var("lang_reply_all",lang('reply all')); + $this->t->set_var("lang_forward",lang('forward')); + $this->t->set_var("lang_delete",lang('delete')); + $this->t->set_var("lang_previous_message",lang('previous message')); + $this->t->set_var("lang_next_message",lang('next message')); + $this->t->set_var("lang_organisation",lang('organisation')); + $this->t->set_var("lang_on_behalf_of",lang('on behalf of')); + $this->t->set_var("lang_Message", lang('Message')); + $this->t->set_var("lang_Attachment", lang('attachments')); + $this->t->set_var("lang_Header_Lines", lang('Header Lines')); + + $this->t->set_var("th_bg",$GLOBALS['egw_info']["theme"]["th_bg"]); + $this->t->set_var("bg01",$GLOBALS['egw_info']["theme"]["bg01"]); + $this->t->set_var("bg02",$GLOBALS['egw_info']["theme"]["bg02"]); + $this->t->set_var("bg03",$GLOBALS['egw_info']["theme"]["bg03"]); + } +} + +?> diff --git a/felamimail/inc/class.uifelamimail.inc.php b/felamimail/inc/class.uifelamimail.inc.php new file mode 100644 index 0000000000..275fd5ae0f --- /dev/null +++ b/felamimail/inc/class.uifelamimail.inc.php @@ -0,0 +1,990 @@ + True, + 'changeFilter' => True, + 'changeFolder' => True, + 'changeSorting' => True, + 'compressFolder' => True, + 'importMessage' => True, + 'deleteMessage' => True, + 'handleButtons' => True, + 'hookAdmin' => True, + 'toggleFilter' => True, + 'viewMainScreen' => True + ); + + var $mailbox; // the current folder in use + var $startMessage; // the first message to show + var $sort; // how to sort the messages + var $moveNeeded; // do we need to move some messages? + + var $timeCounter; + + // the object storing the data about the incoming imap server + var $icServerID=0; + var $connectionStatus = false; + var $bofelamimail; + var $bofilter; + var $bopreferences; + + function uifelamimail() + { + //error_log(__METHOD__); + // no autohide of the sidebox, as we use it for folderlist now. + unset($GLOBALS['egw_info']['user']['preferences']['common']['auto_hide_sidebox']); + $this->timeCounter = microtime(true); + + $this->displayCharset = $GLOBALS['egw']->translation->charset(); + $this->bofelamimail = CreateObject('felamimail.bofelamimail',$this->displayCharset,false); + + $this->bofilter = CreateObject('felamimail.bofilter',false); + $this->bopreferences =& $this->bofelamimail->bopreferences; //CreateObject('felamimail.bopreferences'); + $this->preferences = $this->bopreferences->getPreferences(); + + $this->bofelamimail->saveSessionData(); + + $this->mailbox = $this->bofelamimail->sessionData['mailbox']; + $this->startMessage = $this->bofelamimail->sessionData['startMessage']; + $this->sort = $this->bofelamimail->sessionData['sort']; + $this->sortReverse = $this->bofelamimail->sessionData['sortReverse']; + #$this->filter = $this->bofelamimail->sessionData['activeFilter']; + + $this->t = CreateObject('phpgwapi.Template',EGW_APP_TPL); + #$this->grants[$this->account] = EGW_ACL_READ + EGW_ACL_ADD + EGW_ACL_EDIT + EGW_ACL_DELETE; + // this need to fixed + // this does not belong to here + + if($_GET['menuaction'] != 'felamimail.uifelamimail.hookAdmin' && + $_GET['menuaction'] != 'felamimail.uifelamimail.changeFolder') { + $this->connectionStatus = $this->bofelamimail->openConnection($this->icServerID); + } + + $this->rowColor[0] = $GLOBALS['egw_info']["theme"]["row_on"]; + $this->rowColor[1] = $GLOBALS['egw_info']["theme"]["row_off"]; + + $this->dataRowColor[0] = $GLOBALS['egw_info']["theme"]["bg01"]; + $this->dataRowColor[1] = $GLOBALS['egw_info']["theme"]["bg02"]; + #print __LINE__ . ': ' . (microtime(true) - $this->timeCounter) . '
    '; + } + + function addVcard() + { + error_log(__METHOD__." called from:".function_backtrace()); + $messageID = $_GET['messageID']; + $partID = $_GET['partID']; + $attachment = $this->bofelamimail->getAttachment($messageID,$partID); + + $tmpfname = tempnam ($GLOBALS['egw_info']['server']['temp_dir'], "egw_"); + $fp = fopen($tmpfname, "w"); + fwrite($fp, $attachment['attachment']); + fclose($fp); + + $vcard = CreateObject('phpgwapi.vcard'); + $entry = $vcard->in_file($tmpfname); + $entry['owner'] = $GLOBALS['egw_info']['user']['account_id']; + $entry['access'] = 'private'; + $entry['tid'] = 'n'; + + print quoted_printable_decode($entry['fn'])."
    "; + + unlink($tmpfname); + + $GLOBALS['egw']->common->egw_exit(); + } + + function changeFilter() + { + error_log(__METHOD__." called from:".function_backtrace()); + if(isset($_POST["filter"])) + { + $data['quickSearch'] = $_POST["quickSearch"]; + $data['filter'] = $_POST["filter"]; + $this->bofilter->updateFilter($data); + } + elseif(isset($_GET["filter"])) + { + $data['filter'] = $_GET["filter"]; + $this->bofilter->updateFilter($data); + } + $this->viewMainScreen(); + } + + function changeFolder() + { + // change folder + $this->bofelamimail->sessionData['mailbox'] = urldecode($_GET["mailbox"]); + $this->bofelamimail->sessionData['startMessage']= 1; + $this->bofelamimail->sessionData['sort'] = $this->preferences->preferences['sortOrder']; + $this->bofelamimail->sessionData['activeFilter']= -1; + + $this->bofelamimail->saveSessionData(); + + $this->mailbox = $this->bofelamimail->sessionData['mailbox']; + $this->startMessage = $this->bofelamimail->sessionData['startMessage']; + $this->sort = $this->bofelamimail->sessionData['sort']; + + $this->connectionStatus = $this->bofelamimail->openConnection(); + + $this->viewMainScreen(); + } + + function changeSorting() + { + error_log(__METHOD__." called from:".function_backtrace()); + // change sorting + if(isset($_GET["sort"])) + { + $this->bofelamimail->sessionData['sort'] = $_GET["sort"]; + $this->sort = $_GET["sort"]; + + $this->bofelamimail->saveSessionData(); + } + + $this->viewMainScreen(); + } + + function importMessage() + { + //error_log(__METHOD__." called from:".function_backtrace()); + if(is_array($_FILES["addFileName"])) { + #phpinfo(); + #error_log(print_r($_FILES,true)); + if($_FILES['addFileName']['error'] == $UPLOAD_ERR_OK) { + $formData['name'] = $_FILES['addFileName']['name']; + $formData['type'] = $_FILES['addFileName']['type']; + $formData['file'] = $_FILES['addFileName']['tmp_name']; + $formData['size'] = $_FILES['addFileName']['size']; + $message = $this->importMessageToFolder($formData); + print ""; + if (!$message) { + print ""; + return; + } else { + $linkData = array( + 'menuaction' => 'felamimail.uidisplay.display', + 'uid' => $message['uid'], + 'mailbox' => base64_encode($message['folder']), + ); + print ""; + return; + } + } + } + if(!@is_object($GLOBALS['egw']->js)) + { + $GLOBALS['egw']->js = CreateObject('phpgwapi.javascript'); + } + $GLOBALS['egw']->js->validate_file('dhtmlxtree','js/dhtmlXCommon'); + $GLOBALS['egw']->js->validate_file('dhtmlxtree','js/dhtmlXTree'); + $GLOBALS['egw']->js->validate_file('jscode','importMessage','felamimail'); + $GLOBALS['egw']->common->egw_header(); + + #$uiwidgets =& CreateObject('felamimail.uiwidgets'); + + $this->t->set_file(array("importMessage" => "importMessage.tpl")); + $this->t->set_block('importMessage','fileSelector','fileSelector'); + + $this->translate(); + + $linkData = array + ( + 'menuaction' => 'felamimail.uifelamimail.importMessage', + ); + $this->t->set_var('file_selector_url', $GLOBALS['egw']->link('/index.php',$linkData)); + + $maxUploadSize = ini_get('upload_max_filesize'); + $this->t->set_var('max_uploadsize', $maxUploadSize); + + $this->t->set_var('ajax-loader', $GLOBALS['egw']->common->image('felamimail','ajax-loader')); + + $this->t->pparse("out","fileSelector"); + } + + function importMessageToFolder($_formData,$_folder='') + { + if ($_formData['size'] != 0 && (is_uploaded_file($_formData['file']) || + realpath(dirname($_formData['file'])) == realpath($GLOBALS['egw_info']['server']['temp_dir']))) + { + // ensure existance of eGW temp dir + // note: this is different from apache temp dir, + // and different from any other temp file location set in php.ini + if (!file_exists($GLOBALS['egw_info']['server']['temp_dir'])) + { + @mkdir($GLOBALS['egw_info']['server']['temp_dir'],0700); + } + + // if we were NOT able to create this temp directory, then make an ERROR report + if (!file_exists($GLOBALS['egw_info']['server']['temp_dir'])) + { + $alert_msg .= 'Error:'.'
    ' + .'Server is unable to access phpgw tmp directory'.'
    ' + .$GLOBALS['egw_info']['server']['temp_dir'].'
    ' + .'Please check your configuration'.'
    ' + .'
    '; + } + + // sometimes PHP is very clue-less about MIME types, and gives NO file_type + // rfc default for unknown MIME type is: + $mime_type_default = 'message/rfc'; + // so if PHP did not pass any file_type info, then substitute the rfc default value + if (substr(strtolower(trim($_formData['type'])),0,strlen($mime_type_default)) != $mime_type_default) + { + // fail silently + error_log("Message rejected, no message/rfc. Is:".$_formData['type']); + return false; + } + + $tmpFileName = $GLOBALS['egw_info']['server']['temp_dir']. + SEP. + $GLOBALS['egw_info']['user']['account_id']. + basename($_formData['file']); + + if (is_uploaded_file($_formData['file'])) + { + move_uploaded_file($_formData['file'],$tmpFileName); // requirement for safe_mode! + } + else + { + rename($_formData['file'],$tmpFileName); + } + } else { + // fail silently + error_log("Import of message ".$_formData['file']." failes to meet basic restrictions"); + return false; + } + // ----------------------------------------------------------------------- + #error_log(print_r($this->preferences->preferences['draftFolder'],true)); + /** + * pear/Mail_mimeDecode requires package "pear/Mail_Mime" (version >= 1.4.0, excluded versions: 1.4.0) + * ./pear upgrade Mail_Mime + * ./pear install Mail_mimeDecode + */ + $message = file_get_contents($tmpFileName); + require_once 'Mail/mimeDecode.php'; + $mailDecode = new Mail_mimeDecode($message); + $strucure = $mailDecode->decode(array('include_bodies'=>true,'decode_bodies'=>true,'decode_headers'=>true)); + //_debug_array($strucure); + exit; + } + + function deleteMessage() + { + //error_log(__METHOD__." called from:".function_backtrace()); + $preferences = ExecMethod('felamimail.bopreferences.getPreferences'); + + $message[] = $_GET["message"]; + $mailfolder = NULL; + if (!empty($_GET['folder'])) $mailfolder = base64_decode($_GET['folder']); + + $this->bofelamimail->deleteMessages($message,$mailfolder); + + // set the url to open when refreshing + $linkData = array + ( + 'menuaction' => 'felamimail.uifelamimail.viewMainScreen' + ); + $refreshURL = $GLOBALS['egw']->link('/index.php',$linkData); + + print ""; + } + + function display_app_header() + { + #$GLOBALS['egw']->js->validate_file('foldertree','foldertree'); + $GLOBALS['egw']->js->validate_file('dhtmlxtree','js/dhtmlXCommon'); + $GLOBALS['egw']->js->validate_file('dhtmlxtree','js/dhtmlXTree'); + $GLOBALS['egw']->js->validate_file('jscode','viewMainScreen','felamimail'); + $GLOBALS['egw_info']['flags']['include_xajax'] = True; + + $GLOBALS['egw']->common->egw_header(); + + echo parse_navbar(); + } + + function handleButtons() + { + error_log(__METHOD__." called from:".function_backtrace()); + if($this->moveNeeded == "1") + { + $this->bofelamimail->moveMessages($_POST["mailbox"], + $_POST["msg"]); + } + + elseif(!empty($_POST["mark_deleted"]) && + is_array($_POST["msg"])) + { + $this->bofelamimail->deleteMessages($_POST["msg"]); + } + + elseif(!empty($_POST["mark_unread"]) && + is_array($_POST["msg"])) + { + $this->bofelamimail->flagMessages("unread",$_POST["msg"]); + } + + elseif(!empty($_POST["mark_read"]) && + is_array($_POST["msg"])) + { + $this->bofelamimail->flagMessages("read",$_POST["msg"]); + } + + elseif(!empty($_POST["mark_unflagged"]) && + is_array($_POST["msg"])) + { + $this->bofelamimail->flagMessages("unflagged",$_POST["msg"]); + } + + elseif(!empty($_POST["mark_flagged"]) && + is_array($_POST["msg"])) + { + $this->bofelamimail->flagMessages("flagged",$_POST["msg"]); + } + + + $this->viewMainScreen(); + } + + function hookAdmin() + { + if(!$GLOBALS['egw']->acl->check('run',1,'admin')) + { + $GLOBALS['egw']->common->egw_header(); + echo parse_navbar(); + echo lang('access not permitted'); + $GLOBALS['egw']->log->message('F-Abort, Unauthorized access to felamimail.uifelamimail.hookAdmin'); + $GLOBALS['egw']->log->commit(); + $GLOBALS['egw']->common->egw_exit(); + } + + if(!empty($_POST['profileID']) && is_int(intval($_POST['profileID']))) + { + $profileID = intval($_POST['profileID']); + $this->bofelamimail->setEMailProfile($profileID); + } + + $boemailadmin = new emailadmin_bo(); + + $profileList = $boemailadmin->getProfileList(); + $profileID = $this->bofelamimail->getEMailProfile(); + + $this->display_app_header(); + + $this->t->set_file(array("body" => "selectprofile.tpl")); + $this->t->set_block('body','main'); + $this->t->set_block('body','select_option'); + + $this->t->set_var('lang_select_email_profile',lang('select emailprofile')); + $this->t->set_var('lang_site_configuration',lang('site configuration')); + $this->t->set_var('lang_save',lang('save')); + $this->t->set_var('lang_back',lang('back')); + + $linkData = array + ( + 'menuaction' => 'felamimail.uifelamimail.hookAdmin' + ); + $this->t->set_var('action_url',$GLOBALS['egw']->link('/index.php',$linkData)); + + $linkData = array + ( + 'menuaction' => 'emailadmin.emailadmin_ui.listProfiles' + ); + $this->t->set_var('lang_go_emailadmin', lang('use EmailAdmin to create profiles', $GLOBALS['egw']->link('/index.php',$linkData))); + + $this->t->set_var('back_url',$GLOBALS['egw']->link('/admin/index.php')); + + if(isset($profileList) && is_array($profileList)) + { + foreach($profileList as $key => $value) + { + #print "$key => $value
    "; + #_debug_array($value); + $this->t->set_var('profileID',$value['profileID']); + $this->t->set_var('description',$value['description']); + if(is_int($profileID) && $profileID == $value['profileID']) + { + $this->t->set_var('selected','selected'); + } + else + { + $this->t->set_var('selected',''); + } + $this->t->parse('select_options','select_option',True); + } + } + + $this->t->parse("out","main"); + print $this->t->get('out','main'); + + } + + function viewMainScreen() + { + // get passed messages + if (!empty($_GET["msg"])) $message[] = html::purify($_GET["msg"]); + if (!empty($_GET["message"])) $message[] = html::purify($_GET["message"]); + unset($_GET["msg"]); + unset($_GET["message"]); + #printf ("this->uifelamimail->viewMainScreen() start: %s
    ",date("H:i:s",mktime())); + $bopreferences =& $this->bopreferences; + $bofilter =& $this->bofilter; + $uiwidgets = CreateObject('felamimail.uiwidgets'); + + $preferences =& $bopreferences->getPreferences(); + $urlMailbox = urlencode($this->mailbox); + + if (is_object($preferences)) $imapServer =& $preferences->getIncomingServer(0); + #_debug_array($imapServer); + if (is_object($preferences)) $activeIdentity =& $preferences->getIdentity(0); + #_debug_array($activeIdentity); + $maxMessages =& $GLOBALS['egw_info']['user']['preferences']['common']['maxmatchs']; + if (empty($maxMessages)) $maxMessages = 30; // this seems to be the number off messages that fit the height of the folder tree + $userPreferences =& $GLOBALS['egw_info']['user']['preferences']['felamimail']; + + // retrieve data for/from user defined accounts + $selectedID = 0; + if($this->preferences->userDefinedAccounts) $allAccountData = $this->bopreferences->getAllAccountData($this->preferences); + if ($allAccountData) { + foreach ($allAccountData as $tmpkey => $accountData) + { + $identity =& $accountData['identity']; + $icServer =& $accountData['icServer']; + //_debug_array($identity); + //_debug_array($icServer); + if (empty($icServer->host)) continue; + $identities[$identity->id]=$identity->realName.' '.$identity->organization.' <'.$identity->emailAddress.'>'; + if (!empty($identity->default)) $selectedID = $identity->id; + } + } + + if (empty($imapServer->host) && count($identities)==0 && $this->preferences->userDefinedAccounts) + { + // redirect to new personal account + egw::redirect_link('/index.php',array('menuaction'=>'felamimail.uipreferences.editAccountData', + 'accountID'=>"new", + 'msg' => lang("There is no IMAP Server configured.")." - ".lang("Please configure access to an existing individual IMAP account."), + )); + } + $this->display_app_header(); + + $this->t->set_file(array("body" => 'mainscreen.tpl')); + $this->t->set_block('body','main'); + $this->t->set_block('body','status_row_tpl'); + $this->t->set_block('body','table_header_felamimail'); + $this->t->set_block('body','table_header_outlook'); + $this->t->set_block('body','error_message'); + $this->t->set_block('body','quota_block'); + $this->t->set_block('body','subject_same_window'); + $this->t->set_block('body','subject_new_window'); + + $this->translate(); + if (empty($imapServer->host) && count($identities)==0) { + $errormessage = "
    ".lang("There is no IMAP Server configured."); + if ($GLOBALS['egw_info']['user']['apps']['emailadmin']) { + $errormessage .= "
    ".lang("Configure a valid IMAP Server in emailadmin for the profile you are using."); + } else { + $errormessage .= "
    ".lang('Please ask the administrator to correct the emailadmin IMAP Server Settings for you.'); + } + if($this->preferences->userDefinedAccounts) + $errormessage .= "
    ".lang('or configure an valid IMAP Server connection using the Manage Accounts/Identities preference in the Sidebox Menu.'); + + $this->t->set_var('connection_error_message', $errormessage); + $this->t->set_var('message', ' '); + $this->t->parse('header_rows','error_message',True); + + $this->t->parse("out","main"); + print $this->t->get('out','main'); + + $GLOBALS['egw']->common->egw_footer(); + exit; + } + $this->t->set_var('activeFolder',$urlMailbox); + $this->t->set_var('activeFolderB64',base64_encode($this->mailbox)); + $this->t->set_var('oldMailbox',$urlMailbox); + $this->t->set_var('image_path',EGW_IMAGES); + #printf ("this->uifelamimail->viewMainScreen() Line 272: %s
    ",date("H:i:s",mktime())); + $linkData = array + ( + 'menuaction' => 'felamimail.uifelamimail.viewMainScreen' + ); + $refreshURL = $GLOBALS['egw']->link('/index.php',$linkData); + $this->t->set_var('reloadView',$refreshURL); + // display a warning if vacation notice is active + if(is_a($imapServer,'defaultimap') && $imapServer->enableSieve) { + $this->bosieve = CreateObject('felamimail.bosieve',$imapServer); + $this->bosieve->retrieveRules($this->bosieve->scriptName); + $vacation = $this->bosieve->getVacation($this->bosieve->scriptName); + //_debug_array($vacation); + // [status] => can be: on, off, by_date + // [end_date] => 1247522400 (timestamp, use showdate for visualisation) + // [start_date] => 1247176800 (timestamp, use showdate for visualisation) + } + if(is_array($vacation) && ($vacation['status'] == 'on' || $vacation['status']=='by_date')) + { + $dtfrmt = $GLOBALS['egw_info']['user']['preferences']['common']['dateformat']; + $this->t->set_var('vacation_warning', + html::image('phpgwapi','dialog_warning',false,'style="vertical-align: middle; width: 16px;"').lang('Vacation notice is active').($vacation['status']=='by_date'? ' '.common::show_date($vacation['start_date'],$dtfrmt,true).'->'.common::show_date($vacation['end_date'],$dtfrmt,true):'')); + } + else + { + $this->t->set_var('vacation_warning',' '); + } + // ui for the quotas + if($this->connectionStatus !== false) { + $quota = $this->bofelamimail->getQuotaRoot(); + } else { + $quota['limit'] = 'NOT SET'; + } + + if($quota !== false && $quota['limit'] != 'NOT SET') { + $quotaDisplay = $uiwidgets->quotaDisplay($quota['usage'], $quota['limit']); + $this->t->set_var('quota_display', $quotaDisplay); + } else { + $this->t->set_var('quota_display',' '); + } + // navigation + $navbarImages = array( + 'last' => array( + 'action' => "jumpEnd(); return false;", + 'tooltip' => '', + ), + 'right' => array( + 'action' => "skipForward(); return false;", + 'tooltip' => '', + ), + 'left' => array( + 'action' => "skipPrevious(); return false;", + 'tooltip' => '', + ), + 'first' => array( + 'action' => "jumpStart(); return false;", + 'tooltip' => '', + ), + ); + $navbarButtons = ''; + foreach($navbarImages as $buttonName => $buttonInfo) { + $navbarButtons .= $uiwidgets->navbarButton($buttonName, $buttonInfo['action'], $buttonInfo['tooltip'],'right'); + } + $this->t->set_var('navbarButtonsRight',$navbarButtons); + + // set the images + $listOfImages = array( + 'read_small', + 'unread_small', + 'unread_flagged_small', + 'read_flagged_small', + 'trash', + 'sm_envelope', + 'write_mail', + 'manage_filter', + 'msg_icon_sm', + 'mail_find', + 'new', + 'start_kde', + 'previous_kde', + 'next_kde', + 'finnish_kde', + 'ajax-loader', + ); + + foreach ($listOfImages as $image) { + $this->t->set_var($image, $GLOBALS['egw']->common->image('felamimail', $image)); + } + $this->t->set_var('img_clear_left', html::image('felamimail', 'clear_left', lang('clear search'), 'style="margin-left:5px; cursor: pointer;" onclick="fm_clearSearch()"')); + // refresh settings + $refreshTime = $userPreferences['refreshTime']; + $this->t->set_var('refreshTime',$refreshTime*60*1000); + // other settings + $prefaskformove = intval($userPreferences['prefaskformove']) ? intval($userPreferences['prefaskformove']) : 0; + $this->t->set_var('prefaskformove',$prefaskformove); + #// set the url to open when refreshing + #$linkData = array + #( + # 'menuaction' => 'felamimail.uifelamimail.viewMainScreen' + #); + #$this->t->set_var('refresh_url',$GLOBALS['egw']->link('/index.php',$linkData)); + + // define the sort defaults + $dateSort = '0'; + $dateCSS = 'text_small'; + $fromSort = '3'; + $fromCSS = 'text_small'; + $subjectSort = '5'; + $subjectCSS = 'text_small'; + $sizeSort = '6'; + $sizeCSS = 'text_small'; + + // and no overwrite the defaults + switch($this->sort) + { + // sort by date newest first + case '0': + $dateCSS = 'text_small_bold'; + break; + + // sort by from z->a + case '2': + $fromCSS = 'text_small_bold'; + break; + // sort by from a->z + case '3': + $subjectCSS = 'text_small_bold'; + break; + // sort by size z->a + case '6': + $sizeCSS = 'text_small_bold'; + break; + } + + // sort by date + $this->t->set_var('css_class_date', $dateCSS); + + // sort by from + $this->t->set_var('css_class_from', $fromCSS); + + // sort by subject + $this->t->set_var('css_class_subject', $subjectCSS); + + // sort by size + $this->t->set_var('css_class_size', $sizeCSS); + + #_debug_array($this->bofelamimail->sessionData['messageFilter']); + if(!empty($this->bofelamimail->sessionData['messageFilter']['string'])) { + $this->t->set_var('quicksearch', $this->bofelamimail->sessionData['messageFilter']['string']); + } + + $defaultSearchType = (isset($this->bofelamimail->sessionData['messageFilter']['type']) ? $this->bofelamimail->sessionData['messageFilter']['type'] : 'quick'); + $defaultSelectStatus = (isset($this->bofelamimail->sessionData['messageFilter']['status']) ? $this->bofelamimail->sessionData['messageFilter']['status'] : 'any'); + + $searchTypes = array( + 'quick' => 'quicksearch', + 'subject' => 'subject', + 'body' => 'message', + 'from' => 'from', + 'to' => 'to', + 'cc' => 'cc', + ); + $selectSearchType = html::select('searchType', $defaultSearchType, $searchTypes, false, "style='width:100%;' id='searchType' onchange='document.getElementById(\"quickSearch\").focus(); document.getElementById(\"quickSearch\").value=\"\" ;return false;'"); + $this->t->set_var('select_search', $selectSearchType); + + $statusTypes = array( + 'any' => 'any status', + 'flagged' => 'flagged', + 'unseen' => 'unread', + 'answered' => 'replied', + 'seen' => 'read', + 'deleted' => 'deleted', + ); + $selectStatus = html::select('status', $defaultSelectStatus, $statusTypes, false, "style='width:100%;' onchange='javascript:quickSearch();' id='status'"); + $this->t->set_var('select_status', $selectStatus); + + if($this->connectionStatus === false) { + $this->t->set_var('connection_error_message', lang($this->bofelamimail->getErrorMessage())); + $this->t->set_var('message', ' '); + $this->t->parse('header_rows','error_message',True); + } else { + $headers = $this->bofelamimail->getHeaders($this->mailbox, $this->startMessage, $maxMessages, $this->sort, $this->sortReverse, $this->bofelamimail->sessionData['messageFilter']); + + $headerCount = count($headers['header']); + + // if there aren't any messages left (eg. after delete or move) + // adjust $this->startMessage + if ($headerCount==0 && $this->startMessage > $maxMessages) { + $this->startMessage = $this->startMessage - $maxMessages; + #$headers = $this->bofelamimail->getHeaders($this->startMessage, $maxMessages, $this->sort); + $headerCount = count($headers['header']); + } + + if ($this->bofelamimail->isSentFolder($this->mailbox) + || $this->bofelamimail->isDraftFolder($this->mailbox) + || $this->bofelamimail->isTemplateFolder($this->mailbox)) { + $this->t->set_var('lang_from',lang("to")); + } else { + $this->t->set_var('lang_from',lang("from")); + } + $msg_icon_sm = $GLOBALS['egw']->common->image('felamimail','msg_icon_sm'); + // determine how to display the current folder: as sent folder (to address visible) or normal (from address visible) + $sentFolderFlag =$this->bofelamimail->isSentFolder($this->mailbox); + $folderType = 0; + if($sentFolderFlag || + false !== in_array($this->mailbox,explode(',',$GLOBALS['egw_info']['user']['preferences']['felamimail']['messages_showassent_0']))) + { + $folderType = 1; + $sentFolderFlag=1; + } elseif($this->bofelamimail->isDraftFolder($this->mailbox)) { + $folderType = 2; + } elseif($this->bofelamimail->isTemplateFolder($this->mailbox)) { + $folderType = 3; + } + + $this->t->set_var('header_rows', + $uiwidgets->messageTable( + $headers, + $folderType, + $this->mailbox, + $userPreferences['message_newwindow'], + $userPreferences['rowOrderStyle'], + ($this->bofelamimail->sessionData['previewMessage']?$this->bofelamimail->sessionData['previewMessage']:0) + ) + ); + + $firstMessage = $headers['info']['first']; + $lastMessage = $headers['info']['last']; + $totalMessage = $headers['info']['total']; + $langTotal = lang("total"); + + $this->t->set_var('maxMessages',$i); + if($_GET["select_all"] == "select_all") { + $this->t->set_var('checkedCounter',$i); + } else { + $this->t->set_var('checkedCounter','0'); + } + + // set the select all/nothing link + if($_GET["select_all"] == "select_all") { + // link to unselect all messages + $linkData = array + ( + 'menuaction' => 'felamimail.uifelamimail.viewMainScreen' + ); + $selectLink = sprintf("%s", + $GLOBALS['egw']->link('/index.php',$linkData), + lang("Unselect All")); + $this->t->set_var('change_folder_checked',''); + $this->t->set_var('move_message_checked','checked'); + } else { + // link to select all messages + $linkData = array + ( + 'select_all' => 'select_all', + 'menuaction' => 'felamimail.uifelamimail.viewMainScreen' + ); + $selectLink = sprintf("%s", + $GLOBALS['egw']->link('/index.php',$linkData), + lang("Select all")); + $this->t->set_var('change_folder_checked','checked'); + $this->t->set_var('move_message_checked',''); + } + $this->t->set_var('select_all_link',$selectLink); + $shortName=''; + if ($folderStatus = $this->bofelamimail->getFolderStatus($this->mailbox)) $shortName =$folderStatus['shortDisplayName']; + $addmessage = ''; + if ($message) $addmessage = ' '.implode('; ',$message).' '; + $this->t->set_var('message',''.$shortName.': '.lang("Viewing messages")." $firstMessage - $lastMessage ($totalMessage $langTotal)".$addmessage); + if($firstMessage > 1) { + $linkData = array + ( + 'menuaction' => 'felamimail.uifelamimail.viewMainScreen', + 'startMessage' => $this->startMessage - $maxMessages + ); + $link = $GLOBALS['egw']->link('/index.php',$linkData); + $this->t->set_var('link_previous',"".lang("previous").""); + } else { + $this->t->set_var('link_previous',lang("previous")); + } + + if($totalMessage > $lastMessage) { + $linkData = array ( + 'menuaction' => 'felamimail.uifelamimail.viewMainScreen', + 'startMessage' => $this->startMessage + $maxMessages + ); + $link = $GLOBALS['egw']->link('/index.php',$linkData); + $this->t->set_var('link_next',"".lang("next").""); + } else { + $this->t->set_var('link_next',lang("next")); + } + $this->t->parse('status_row','status_row_tpl',True); + //print __LINE__ . ': ' . (microtime(true) - $this->timeCounter) . '
    '; + $this->bofelamimail->closeConnection(); + + } + $this->t->set_var('current_mailbox',$this->mailbox); + //$this->t->set_var('folder_tree',$folderTree); + + $this->t->set_var('options_folder',$options_folder); + + $linkData = array + ( + 'menuaction' => 'felamimail.uicompose.compose' + ); + $this->t->set_var('url_compose_empty',"egw_openWindowCentered('".$GLOBALS['egw']->link('/index.php',$linkData)."','test',700,egw_getWindowOuterHeight());"); + + + $linkData = array + ( + 'menuaction' => 'felamimail.uifilter.mainScreen' + ); + $this->t->set_var('url_filter',$GLOBALS['egw']->link('/index.php',$linkData)); + + $linkData = array + ( + 'menuaction' => 'felamimail.uifelamimail.handleButtons' + ); + $this->t->set_var('url_change_folder',$GLOBALS['egw']->link('/index.php',$linkData)); + + $linkData = array + ( + 'menuaction' => 'felamimail.uifelamimail.changeFilter' + ); + $this->t->set_var('url_search_settings',$GLOBALS['egw']->link('/index.php',$linkData)); + + $this->t->set_var('lang_mark_messages_as',lang('mark messages as')); + $this->t->set_var('lang_delete',lang('delete')); + + switch($GLOBALS['egw_info']['user']['preferences']['felamimail']['rowOrderStyle']) { + case 'outlook': + $this->t->parse('messageListTableHeader','table_header_outlook',True); + break; + default: + $this->t->parse('messageListTableHeader','table_header_felamimail',True); + break; + } + //print __LINE__ . ': ' . (microtime(true) - $this->timeCounter) . '
    '; + + $this->t->parse("out","main"); + print $this->t->get('out','main'); + + $GLOBALS['egw']->common->egw_footer(); + } + + function array_merge_replace( $array, $newValues ) + { + foreach ( $newValues as $key => $value ) + { + if ( is_array( $value ) ) + { + if ( !isset( $array[ $key ] ) ) + { + $array[ $key ] = array(); + } + $array[ $key ] = $this->array_merge_replace( $array[ $key ], $value ); + } + else + { + if ( isset( $array[ $key ] ) && is_array( $array[ $key ] ) ) + { + $array[ $key ][ 0 ] = $value; + } + else + { + if ( isset( $array ) && !is_array( $array ) ) + { + $temp = $array; + $array = array(); + $array[0] = $temp; + } + $array[ $key ] = $value; + } + } + } + return $array; + } + + /* Returns a string showing the size of the message/attachment */ + function show_readable_size($bytes, $_mode='short') + { + $bytes /= 1024; + $type = 'k'; + + if ($bytes / 1024 > 1) + { + $bytes /= 1024; + $type = 'M'; + } + + if ($bytes < 10) + { + $bytes *= 10; + settype($bytes, 'integer'); + $bytes /= 10; + } + else + settype($bytes, 'integer'); + + return $bytes . ' ' . $type ; + } + + function toggleFilter() + { + error_log(__METHOD__." called from:".function_backtrace()); + $this->bofelamimail->toggleFilter(); + $this->viewMainScreen(); + } + + function translate() + { + $this->t->set_var('th_bg',$GLOBALS['egw_info']["theme"]["th_bg"]); + $this->t->set_var('bg_01',$GLOBALS['egw_info']["theme"]["bg01"]); + $this->t->set_var('bg_02',$GLOBALS['egw_info']["theme"]["bg02"]); + + $this->t->set_var('lang_compose',lang('compose')); + $this->t->set_var('lang_edit_filter',lang('edit filter')); + $this->t->set_var('lang_move_selected_to',lang('move selected to')); + $this->t->set_var('lang_doit',lang('do it!')); + $this->t->set_var('lang_change_folder',lang('change folder')); + $this->t->set_var('lang_move_message',lang('move messages')); + $this->t->set_var('desc_read',lang("mark selected as read")); + $this->t->set_var('desc_unread',lang("mark selected as unread")); + $this->t->set_var('desc_important',lang("mark selected as flagged")); + $this->t->set_var('desc_unimportant',lang("mark selected as unflagged")); + $this->t->set_var('desc_deleted',lang("delete selected")); + $this->t->set_var('lang_date',lang("date")); + $this->t->set_var('lang_status',lang('status')); + $this->t->set_var('lang_size',lang("size")); + $this->t->set_var('lang_search',lang("search")); + $this->t->set_var('lang_replied',lang("replied")); + $this->t->set_var('lang_read',lang("read")); + $this->t->set_var('lang_unread',lang("unread")); + $this->t->set_var('lang_deleted',lang("deleted")); + $this->t->set_var('lang_recent',lang("recent")); + $this->t->set_var('lang_flagged',lang("flagged")); + $this->t->set_var('lang_unflagged',lang("unflagged")); + $this->t->set_var('lang_subject',lang("subject")); + $this->t->set_var('lang_add_to_addressbook',lang("add to addressbook")); + $this->t->set_var('lang_no_filter',lang("no filter")); + $this->t->set_var('lang_connection_failed',lang("The connection to the IMAP Server failed!!")); + $this->t->set_var('lang_select_target_folder',lang("Simply click the target-folder")); + $this->t->set_var('lang_updating_message_status',lang("updating message status")); + $this->t->set_var('lang_max_uploadsize',lang('max uploadsize')); + $this->t->set_var('lang_loading',lang('loading')); + $this->t->set_var('lang_deleting_messages',lang('deleting messages')); + $this->t->set_var('lang_open_all',lang("open all")); + $this->t->set_var('lang_close_all',lang("close all")); + $this->t->set_var('lang_moving_messages_to',lang('moving messages to')); + $this->t->set_var('lang_copying_messages_to',lang('copying messages to')); + $this->t->set_var('lang_MoveCopyTitle',($GLOBALS['egw_info']['user']['preferences']['felamimail']['prefaskformove']==2?lang('Copy or Move Messages?'):lang('Move Messages?'))); + $this->t->set_var('lang_askformove',($GLOBALS['egw_info']['user']['preferences']['felamimail']['prefaskformove']==2?lang('Do you really want to move or copy the selected messages to folder:'):lang('Do you really want to move the selected messages to folder:'))); + $this->t->set_var('lang_move',lang("Move")); + $this->t->set_var('lang_copy',lang("Copy")); + $this->t->set_var('lang_cancel',lang("Cancel")); + $this->t->set_var('lang_mark_all_messages',lang('all messages in folder')); + $this->t->set_var('lang_confirm_all_messages',lang('The action will be applied to all messages of the current folder.\nDo you want to proceed?')); + $this->t->set_var('lang_empty_trash',lang('empty trash')); + $this->t->set_var('lang_compress_folder',lang('compress folder')); + $this->t->set_var('lang_skipping_forward',lang('skipping forward')); + $this->t->set_var('lang_skipping_previous',lang('skipping previous')); + $this->t->set_var('lang_jumping_to_start',lang('jumping to start')); + $this->t->set_var('lang_jumping_to_end',lang('jumping to end')); + $this->t->set_var('lang_updating_view',lang('updating view')); + $this->t->set_var('lang_sendnotify',lang('The message sender has requested a response to indicate that you have read this message. Would you like to send a receipt?')); + } + } +?> diff --git a/felamimail/inc/class.uifilter.inc.php b/felamimail/inc/class.uifilter.inc.php new file mode 100644 index 0000000000..130c367430 --- /dev/null +++ b/felamimail/inc/class.uifilter.inc.php @@ -0,0 +1,229 @@ + 'True', + 'saveFilter' => 'True' + ); + + function uifilter() + { + + // get posted variables + $this->urlMailbox = urldecode($_GET['mailbox']); + $this->startMessage = $_GET['startMessage']; + $this->sort = $_GET['sort']; + + $this->bofelamimail =& CreateObject('felamimail.bofelamimail',$this->urlMailbox); + $this->bofilter =& CreateObject('felamimail.bofilter'); + $this->sessionData = $this->bofelamimail->sessionData; + + $this->t =& CreateObject('phpgwapi.Template',EGW_APP_TPL); + $this->t->set_unknowns('remove'); + + $this->rowColor[0] = $GLOBALS['egw_info']["theme"]["bg01"]; + $this->rowColor[1] = $GLOBALS['egw_info']["theme"]["bg02"]; + + } + + function display_app_header() + { + $GLOBALS['egw_info']['flags']['include_xajax'] = True; + $GLOBALS['egw']->common->egw_header(); + echo parse_navbar(); + } + + function mainScreen() + { + // display the header + $this->display_app_header(); + + // initialize the template + $this->t->set_file(array("filterForm" => "filterForm.tpl")); + $this->t->set_block('filterForm','header'); + $this->t->set_block('filterForm','filterrow'); + + // translate most of the parts + $this->translate(); + + switch($_GET['action']) + { + case "deleteFilter": + $filterID = $_GET['filterID']; + $this->bofilter->deleteFilter($filterID); + $filterList = $this->bofilter->getFilterList(); + $linkData = array + ( + 'menuaction' => 'felamimail.uifilter.mainScreen', + 'action' => 'updateFilter' + ); + $this->t->set_var('link_action',$GLOBALS['egw']->link('/index.php',$linkData)); + + $this->t->set_var("filterName",''); + $this->t->set_var("from",''); + $this->t->set_var("to",''); + $this->t->set_var("subject",''); + $this->t->set_var("filter_checked",''); + break; + + case "editFilter": + $filterID = $_GET['filterID']; + $filterList = $this->bofilter->getFilterList(); + + // set the default values for the sort links (sort by url) + $linkData = array + ( + 'menuaction' => 'felamimail.uifilter.mainScreen', + 'action' => 'updateFilter', + 'filterID' => $filterID + ); + $this->t->set_var('link_action',$GLOBALS['egw']->link('/index.php',$linkData)); + + $this->t->set_var("filterName",$filterList[$filterID]['filterName']); + $this->t->set_var("from",$filterList[$filterID]['from']); + $this->t->set_var("to",$filterList[$filterID]['to']); + $this->t->set_var("subject",$filterList[$filterID]['subject']); + if($filterList[$filterID]['filterActive'] == "true") + { + $this->t->set_var("filter_checked","checked"); + } + break; + case "updateFilter": + $filterID = $_GET['filterID']; + $formData['from'] = $_POST['from']; + $formData['to'] = $_POST['to']; + $formData['subject'] = $_POST['subject']; + $formData['filterName'] = $_POST['filterName']; + if($_POST['filter_active'] == "on") + { + $formData['filterActive'] = "true"; + } + $this->bofilter->saveFilter($formData, $filterID); + $filterList = $this->bofilter->getFilterList(); + // set the default values for the sort links (sort by url) + $linkData = array + ( + 'menuaction' => 'felamimail.uifilter.mainScreen', + 'action' => 'updateFilter', + 'filterID' => $filterID + ); + $this->t->set_var('link_action',$GLOBALS['egw']->link('/index.php',$linkData)); + + $this->t->set_var("filterName",$filterList[$filterID]['filterName']); + $this->t->set_var("from",$filterList[$filterID]['from']); + $this->t->set_var("to",$filterList[$filterID]['to']); + $this->t->set_var("subject",$filterList[$filterID]['subject']); + if($filterList[$filterID]['filterActive'] == "true") + { + $this->t->set_var("filter_checked","checked"); + } + break; + default: + $linkData = array + ( + 'menuaction' => 'felamimail.uifilter.mainScreen', + 'action' => 'updateFilter' + ); + $this->t->set_var('link_action',$GLOBALS['egw']->link('/index.php',$linkData)); + + $this->t->set_var("filterName",''); + $this->t->set_var("from",''); + $this->t->set_var("to",''); + $this->t->set_var("subject",''); + $this->t->set_var("filter_checked",''); + break; + + } + $linkData = array + ( + 'menuaction' => 'felamimail.uifilter.mainScreen' + ); + $this->t->set_var('link_newFilter',$GLOBALS['egw']->link('/index.php',$linkData)); + $this->t->set_var("filterrows",''); + $linkData = array + ( + 'menuaction' => 'felamimail.uifelamimail.viewMainScreen', + 'filter' => -1 + ); + $link = $GLOBALS['egw']->link('/index.php',$linkData); + $this->t->set_var("link_noFilter",$link); + + $filterList = $this->bofilter->getFilterList(); + + while(list($key,$value)=@each($filterList)) + { + $this->t->set_var("id",$key); + $this->t->set_var("filtername",$value['filterName']); + + $linkData = array + ( + 'menuaction' => 'felamimail.uifilter.mainScreen', + 'action' => 'editFilter', + 'filterID' => $key + ); + $link = $GLOBALS['egw']->link('/index.php',$linkData); + $this->t->set_var("link_editFilter",$link); + + $linkData = array + ( + 'menuaction' => 'felamimail.uifilter.mainScreen', + 'action' => 'deleteFilter', + 'filterID' => $key + ); + $link = $GLOBALS['egw']->link('/index.php',$linkData); + $this->t->set_var("link_deleteFilter",$link); + + $linkData = array + ( + 'menuaction' => 'felamimail.uifelamimail.changeFilter', + 'filter' => $key + ); + $link = $GLOBALS['egw']->link('/index.php',$linkData); + $this->t->set_var("link_activateFilter",$link); + + $this->t->parse("filterrows","filterrow",true); + } + $this->t->pparse("out","header"); + } + + function saveFilter() + { + + } + + function translate() + { + $this->t->set_var("lang_message_list",lang('Message List')); + $this->t->set_var("lang_from",lang('from')); + $this->t->set_var("lang_to",lang('to')); + $this->t->set_var("lang_edit",lang('edit')); + $this->t->set_var("lang_delete",lang('delete')); + $this->t->set_var("lang_subject",lang('subject')); + $this->t->set_var("lang_filter_active",lang('filter active')); + $this->t->set_var("lang_filter_name",lang('filter name')); + $this->t->set_var("lang_new_filter",lang('new filter')); + $this->t->set_var("lang_no_filter",lang('no filter')); + $this->t->set_var("lang_activate",lang('activate')); + $this->t->set_var("lang_save",lang('save')); + + $this->t->set_var("bg01",$GLOBALS['egw_info']["theme"]["bg01"]); + $this->t->set_var("bg02",$GLOBALS['egw_info']["theme"]["bg02"]); + $this->t->set_var("bg03",$GLOBALS['egw_info']["theme"]["bg03"]); + } +} diff --git a/felamimail/inc/class.uipreferences.inc.php b/felamimail/inc/class.uipreferences.inc.php new file mode 100644 index 0000000000..2c9b0f2a21 --- /dev/null +++ b/felamimail/inc/class.uipreferences.inc.php @@ -0,0 +1,785 @@ + 'True', + 'editAccountData' => 'True', + 'editForwardingAddress' => 'True', + 'editSignature' => 'True', + 'listFolder' => 'True', + 'listSignatures' => 'True', + 'listAccountData' => 'True', + 'showHeader' => 'True', + 'getAttachment' => 'True', + 'listSelectFolder' => 'True', + ); + + function uipreferences() + { + $this->t = $GLOBALS['egw']->template; + $this->charset = $GLOBALS['egw']->translation->charset(); + + $this->bofelamimail = CreateObject('felamimail.bofelamimail',$GLOBALS['egw']->translation->charset()); + $this->bopreferences = $this->bofelamimail->bopreferences; //CreateObject('felamimail.bopreferences'); + $this->uiwidgets = CreateObject('felamimail.uiwidgets'); + $this->bofelamimail->openConnection(); + + + $this->rowColor[0] = $GLOBALS['egw_info']["theme"]["bg01"]; + $this->rowColor[1] = $GLOBALS['egw_info']["theme"]["bg02"]; + } + + function addACL() + { + $this->display_app_header(FALSE); + + $this->t->set_file(array("body" => "preferences_manage_folder.tpl")); + $this->t->set_block('body','main'); + $this->t->set_block('body','add_acl'); + + $this->translate(); + + $this->t->pparse("out","add_acl"); + + } + + // $_displayNavbar false == don't display navbar + function display_app_header($_displayNavbar) + { + switch($_GET['menuaction']) + { + case 'felamimail.uipreferences.editSignature': + $GLOBALS['egw']->js->validate_file('jscode','listSignatures','felamimail'); + #$GLOBALS['egw']->js->set_onload('fm_initEditLayout();'); + break; + case 'felamimail.uipreferences.listAccountData': + case 'felamimail.uipreferences.editAccountData': + $GLOBALS['egw']->js->validate_file('tabs','tabs'); + $GLOBALS['egw']->js->validate_file('jscode','editAccountData','felamimail'); + $GLOBALS['egw']->js->set_onload('javascript:initEditAccountData();'); + $GLOBALS['egw']->js->set_onload('javascript:initTabs();'); + break; + + case 'felamimail.uipreferences.listSignatures': + $GLOBALS['egw']->js->validate_file('jscode','listSignatures','felamimail'); + #$GLOBALS['egw']->js->set_onload('javascript:initEditAccountData();'); + break; + + case 'felamimail.uipreferences.listFolder': + case 'felamimail.uipreferences.addACL': + case 'felamimail.uipreferences.listSelectFolder': + $GLOBALS['egw']->js->validate_file('tabs','tabs'); + $GLOBALS['egw']->js->validate_file('dhtmlxtree','js/dhtmlXCommon'); + $GLOBALS['egw']->js->validate_file('dhtmlxtree','js/dhtmlXTree'); + $GLOBALS['egw']->js->validate_file('jscode','listFolder','felamimail'); + $GLOBALS['egw']->js->set_onload('javascript:initAll();'); + break; + } + + $GLOBALS['egw_info']['flags']['include_xajax'] = True; + + $GLOBALS['egw']->common->egw_header(); + if($_displayNavbar == TRUE) + echo parse_navbar(); + } + + function editForwardingAddress() + { + if (!isset($this->bofelamimail)) $this->bofelamimail = CreateObject('felamimail.bofelamimail',$GLOBALS['egw']->translation->charset()); + $mailPrefs = $this->bofelamimail->getMailPreferences(); + $ogServer = $mailPrefs->getOutgoingServer(0); + + if(!is_a($ogServer, 'defaultsmtp') || !$ogServer->editForwardingAddress) { + die('You should not be here!'); + } + + if($_POST['save']) { + //_debug_array($_POST);_debug_array($_POST);_debug_array($_POST); + $ogServer->saveSMTPForwarding($GLOBALS['egw_info']['user']['account_id'],$_POST['forwardingAddress'],$_POST['keepLocalCopy']); + } elseif($_POST['cancel']) { + ExecMethod('felamimail.uifelamimail.viewMainScreen'); + return; + } + + $userData = $ogServer->getUserData($GLOBALS['egw_info']['user']['account_id']); + + $this->display_app_header(TRUE); + + $this->t->set_file(array("body" => "edit_forwarding_address.tpl")); + $this->t->set_block('body','main'); + + $this->translate(); + + $linkData = array ( + 'menuaction' => 'felamimail.uipreferences.editForwardingAddress' + ); + $this->t->set_var('form_action',$GLOBALS['egw']->link('/index.php',$linkData)); + $this->t->set_var('forwarding_address',$userData['mailForwardingAddress'][0]); + + #deliveryMode checked_keep_local_copy + if($userData['deliveryMode'] != 'forwardOnly') { + $this->t->set_var('checked_keep_local_copy','checked'); + } + + $this->t->parse("out","main"); + + print $this->t->get('out','main'); + } + + function editSignature() { + if(isset($_GET['signatureID'])) { + $signatureID = (int)$_GET['signatureID']; + + $boSignatures = new felamimail_bosignatures(); + $signatureData = $boSignatures->getSignature($signatureID,true); + } + + $this->display_app_header(false); + + $this->t->set_file(array('body' => 'preferences_edit_signature.tpl')); + $this->t->set_block('body','main'); + + $this->translate(); + + $linkData = array ( + 'menuaction' => 'felamimail.uipreferences.editSignature' + ); + $this->t->set_var('form_action', $GLOBALS['egw']->link('/index.php',$linkData)); + $height = "350px"; + if(isset($_GET['signatureID'])) { + + $this->t->set_var('description', @htmlspecialchars($signatureData->fm_description, ENT_QUOTES, $this->charset)); + + $this->t->set_var('signatureID', $signatureID); + + $this->t->set_var('tinymce',html::fckEditorQuick( + 'signature', 'advanced', + $signatureData->fm_signature, + $height) + ); + + $this->t->set_var('checkbox_isDefaultSignature',html::checkbox( + 'isDefaultSignature', + $signatureData->fm_defaultsignature, + 'true', + 'id="isDefaultSignature"' + ) + ); + } else { + $this->t->set_var('tinymce',html::fckEditorQuick('signature', 'advanced', '', $height)); + + $this->t->set_var('checkbox_isDefaultSignature',html::checkbox( + 'isDefaultSignature', false, 'true', 'id="isDefaultSignature"' + )); + + } + + $this->t->parse("out","main"); + print $this->t->get('out','main'); + } + + function editAccountData($msg='') + { + if ($_GET['msg']) $msg = html::purify($_GET['msg']); + if (!isset($this->bofelamimail)) $this->bofelamimail = CreateObject('felamimail.bofelamimail',$GLOBALS['egw']->translation->charset()); + if (!isset($this->bopreferences)) $this->bopreferences = $this->bofelamimail->bopreferences; //CreateObject('felamimail.bopreferences'); + $preferences =& $this->bopreferences->getPreferences(); + $referer = '../index.php?menuaction=felamimail.uipreferences.listAccountData'; + if(!($preferences->userDefinedAccounts || $preferences->userDefinedIdentities)) { + die('you are not allowed to be here'); + } + + if($_POST['save'] || $_POST['apply']) { + // IMAP connection settings + $icServer =& CreateObject('emailadmin.defaultimap'); + if(is_array($_POST['ic']) && (int)$_POST['active']) { + foreach($_POST['ic'] as $key => $value) { + switch($key) { + case 'validatecert': + $icServer->$key = ($value != 'dontvalidate'); + break; + + case 'enableSieve': + $icServer->$key = ($value == 'enableSieve'); + break; + + default: + $icServer->$key = $value; + break; + } + } + } else { + $icServer = NULL; + } + // SMTP connection settings + $ogServer = CreateObject('emailadmin.defaultsmtp'); + if(is_array($_POST['og']) && (int)$_POST['active']) { + foreach($_POST['og'] as $key => $value) { + $ogServer->$key = $value; + } + } else { + $ogServer = NULL; + } + + // identity settings + $identity = CreateObject('emailadmin.ea_identity'); + if(is_array($_POST['identity'])) { + foreach($_POST['identity'] as $key => $value) { + $identity->$key = $value; + } + } + + + $newID = $this->bopreferences->saveAccountData($icServer, $ogServer, $identity); + if ($identity->id == 'new') $identity->id = $newID; + if((int)$_POST['active']) { + #$boPreferences->saveAccountData($icServer, $ogServer, $identity); + $this->bopreferences->setProfileActive(false); + $this->bopreferences->setProfileActive(true,$identity->id); + } else { + $this->bopreferences->setProfileActive(false,$identity->id); + } + + if($_POST['save']) { + //ExecMethod('felamimail.uifelamimail.viewMainScreen'); + $GLOBALS['egw']->redirect_link($referer,array('msg' => lang('Entry saved'))); + return; + } + } elseif($_POST['cancel']) { + //ExecMethod('felamimail.uifelamimail.viewMainScreen'); + $GLOBALS['egw']->redirect_link($referer,array('msg' => lang('aborted'))); + return; + } + + $folderList = array(); + if (!isset($this->bofelamimail) || (int)$_POST['active']) $this->bofelamimail = CreateObject('felamimail.bofelamimail',$GLOBALS['egw']->translation->charset()); + if($this->bofelamimail->openConnection()) { + $folderObjects = $this->bofelamimail->getFolderObjects(); + foreach($folderObjects as $folderName => $folderInfo) { + #_debug_array($folderData); + $folderList[$folderName] = $folderInfo->displayName; + } + $this->bofelamimail->closeConnection(); + } + + $this->display_app_header(TRUE); + + $this->t->set_file(array("body" => "edit_account_data.tpl")); + $this->t->set_block('body','main'); + if ($msg) $this->t->set_var("message", $msg); else $this->t->set_var("message", ''); + $this->translate(); + + // if there is no accountID with the call of the edit method, retrieve an active account + $account2retrieve = 'active'; + if ((int)$_GET['accountID']) { + $account2retrieve = $_GET['accountID']; + } + if ($_GET['accountID'] == 'new') $account2retrieve = 'new'; + if (!empty($newID) && $newID>0) $account2retrieve = $newID; + if ($account2retrieve != 'new') { + $accountData = $this->bopreferences->getAccountData($preferences, $account2retrieve); + $icServer =& $accountData['icServer']; + //_debug_array($icServer); + $ogServer =& $accountData['ogServer']; + $identity =& $accountData['identity']; + //_debug_array($identity); + } + + if ($icServer) { + foreach($icServer as $key => $value) { + if(is_object($value) || is_array($value)) { + continue; + } + switch($key) { + case 'encryption': + $this->t->set_var('checked_ic_'. $key .'_'. $value, 'checked'); + break; + + case 'enableSieve': + $this->t->set_var('checked_ic_'.$key,($value ? 'checked' : '')); + break; + + case 'validatecert': + $this->t->set_var('checked_ic_'.$key,($value ? '' : 'checked')); + break; + + default: + $this->t->set_var("ic[$key]", $value); + break; + } + } + } + if ($ogServer) { + foreach($ogServer as $key => $value) { + if(is_object($value) || is_array($value)) { + continue; + } + #print "$key => $value
    "; + switch($key) { + case 'smtpAuth': + $this->t->set_var('checked_og_'.$key,($value ? 'checked' : '')); + default: + $this->t->set_var("og[$key]", $value); + } + } + } + $felamimail_bosignatures = new felamimail_bosignatures(); + $signatures = $felamimail_bosignatures->getListOfSignatures(); + $allSignatures = array( + '-2' => lang('no signature') + ); + $systemsig = false; + foreach ($signatures as $sigkey => $sig) { + //echo "Keys to check: $sigkey with ".$sig['fm_signatureid']."
    "; + if ($sig['fm_signatureid'] == -1) $systemsig = true; + $allSignatures[$sig['fm_signatureid']] = $sig['fm_description']; + } + // if there is a system signature, then use the systemsignature as preset/default + $sigvalue = $defaultsig = ($systemsig ? -1 : -2); + if ($identity) { + foreach($identity as $key => $value) { + if(is_object($value) || is_array($value)) { + continue; + } + switch($key) { + case 'signature': + // if empty, use the default + $sigvalue = (!empty($value)?$value:$defaultsig); + break; + default: + $this->t->set_var("identity[$key]", $value); + } + } + $this->t->set_var('accountID',$identity->id); + $this->t->set_var('checked_active',($accountData['active'] ? ($preferences->userDefinedAccounts ? 'checked' : '') : '')); + } else { + if ($signatureData = $felamimail_bosignatures->getDefaultSignature()) { + if (is_array($signatureData)) { + $sigvalue = $signatureData['signatureid']; + } else { + $sigvalue =$signatureData; + } + } + $this->t->set_var('accountID','new'); + } + + $trashOptions = array_merge(array('' => lang('default').' '.lang("folder settings"), 'none' => lang("Don't use Trash")),($accountData['active'] ? $folderList :array($icServer->trashfolder => $icServer->trashfolder))); + $sentOptions = array_merge(array('' => lang('default').' '.lang("folder settings"), 'none' => lang("Don't use Sent")),($accountData['active'] ? $folderList :array($icServer->sentfolder => $icServer->sentfolder))); + $draftOptions = array_merge(array('' => lang('default').' '.lang("folder settings"), 'none' => lang("Don't use draft folder")),($accountData['active'] ? $folderList :array($icServer->draftfolder => $icServer->draftfolder))); + $templateOptions = array_merge(array('' => lang('default').' '.lang("folder settings"), 'none' => lang("Don't use template folder")),($accountData['active'] ? $folderList :array($icServer->templatefolder => $icServer->templatefolder))); + $tomerge = ($accountData['active'] ? $folderList :$icServer->folderstoshowinhome); + $folderList = array_merge( array('' => lang('default').' '.lang("folder settings")),(is_array($tomerge)?$tomerge:array())); + + $this->t->set_var('allowAccounts',($preferences->userDefinedAccounts ? 1 : 0)); + $this->t->set_var('identity_selectbox', html::select('identity[signature]',$sigvalue,$allSignatures, true, " id=\"identity[signature]\" style='width: 250px;'")); + $this->t->set_var('folder_selectbox', html::select('ic[folderstoshowinhome]',$icServer->folderstoshowinhome,$folderList, true, "id=\"ic[folderstoshowinhome]\" style='width: 250px;'",6)); + $this->t->set_var('trash_selectbox', html::select('ic[trashfolder]',$icServer->trashfolder,$trashOptions, true, "id=\"ic[trashfolder]\" style='width: 250px;'")); + $this->t->set_var('sent_selectbox', html::select('ic[sentfolder]',$icServer->sentfolder,$sentOptions, true, "id=\"ic[sentfolder]\" style='width: 250px;'")); + $this->t->set_var('draft_selectbox', html::select('ic[draftfolder]',$icServer->draftfolder,$draftOptions, true, "id=\"ic[draftfolder]\" style='width: 250px;'")); + $this->t->set_var('template_selectbox', html::select('ic[templatefolder]',$icServer->templatefolder,$templateOptions, true, "id=\"ic[templatefolder]\" style='width: 250px;'")); + $linkData = array + ( + 'menuaction' => 'felamimail.uipreferences.editAccountData' + ); + $this->t->set_var('form_action',$GLOBALS['egw']->link('/index.php',$linkData)); + + $this->t->parse("out","main"); + print $this->t->get('out','main'); + } + + function listFolder() + { + if (!isset($this->bofelamimail)) $this->bofelamimail = CreateObject('felamimail.bofelamimail',$GLOBALS['egw']->translation->charset()); + if (!isset($this->bopreferences)) $this->bopreferences = $this->bofelamimail->bopreferences; //CreateObject('felamimail.bopreferences'); + $preferences =& $this->bopreferences->getPreferences(); + if(!(empty($preferences->preferences['prefpreventmanagefolders']) || $preferences->preferences['prefpreventmanagefolders'] == 0)) { + die('you are not allowed to be here'); + } + // rename a mailbox + if(isset($_POST['newMailboxName'])) + { + $oldMailboxName = $this->bofelamimail->sessionData['preferences']['mailbox']; + $newMailboxName = $_POST['newMailboxName']; + + if($position = strrpos($oldMailboxName,'.')) + { + $newMailboxName = substr($oldMailboxName,0,$position+1).$newMailboxName; + } + + + if($this->bofelamimail->imap_renamemailbox($oldMailboxName, $newMailboxName)) + { + $this->bofelamimail->sessionData['preferences']['mailbox'] + = $newMailboxName; + $this->bofelamimail->saveSessionData(); + } + } + + // delete a Folder + if(isset($_POST['deleteFolder']) && $this->bofelamimail->sessionData['preferences']['mailbox'] != 'INBOX') + { + if($this->bofelamimail->imap_deletemailbox($this->bofelamimail->sessionData['preferences']['mailbox'])) + { + $this->bofelamimail->sessionData['preferences']['mailbox'] + = "INBOX"; + $this->bofelamimail->saveSessionData(); + } + } + + // create a new Mailbox + if(isset($_POST['newSubFolder'])) + { + $oldMailboxName = $this->bofelamimail->sessionData['preferences']['mailbox'].'.'; + $oldMailboxName = ($oldMailboxName == '--topfolderselected--.') ? '' : $oldMailboxName; + $newMailboxName = $oldMailboxName.$_POST['newSubFolder']; + + $this->bofelamimail->imap_createmailbox($newMailboxName,True); + } + + $folderList = $this->bofelamimail->getFolderObjects(); + // check user input BEGIN + // the name of the new current folder + if(get_var('mailboxName',array('POST')) && $folderList[get_var('mailboxName',array('POST'))] || + get_var('mailboxName',array('POST')) == '--topfolderselected--') + { + $this->bofelamimail->sessionData['preferences']['mailbox'] + = get_var('mailboxName',array('POST')); + $this->bofelamimail->saveSessionData(); + } + + $this->selectedFolder = $this->bofelamimail->sessionData['preferences']['mailbox']; + + // (un)subscribe to a folder?? + if(isset($_POST['folderStatus'])) + { + $this->bofelamimail->subscribe($this->selectedFolder,$_POST['folderStatus']); + } + + $this->selectedFolder = $this->bofelamimail->sessionData['preferences']['mailbox']; + + // check user input END + + if($this->selectedFolder != '--topfolderselected--') + { + $folderStatus = $this->bofelamimail->getFolderStatus($this->selectedFolder); + } + $mailPrefs = $this->bofelamimail->getMailPreferences(); + + $this->display_app_header(TRUE); + + $this->t->set_file(array("body" => "preferences_manage_folder.tpl")); + $this->t->set_block('body','main'); + #$this->t->set_block('body','select_row'); + $this->t->set_block('body','folder_settings'); + $this->t->set_block('body','mainFolder_settings'); + #$this->t->set_block('body','folder_acl'); + + $this->translate(); + + #print "
    ";print_r($folderList);print "
    "; + // set the default values for the sort links (sort by subject) + $linkData = array + ( + 'menuaction' => 'felamimail.uipreferences.listFolder' + ); + $this->t->set_var('form_action',$GLOBALS['egw']->link('/index.php',$linkData)); + + $linkData = array + ( + 'menuaction' => 'felamimail.uipreferences.addACL' + ); + $this->t->set_var('url_addACL',$GLOBALS['egw']->link('/index.php',$linkData)); + + $linkData = array + ( + 'menuaction' => 'felamimail.uipreferences.listSelectFolder', + ); + $this->t->set_var('folder_select_url',$GLOBALS['egw']->link('/index.php',$linkData)); + + // folder select box + $icServer = $mailPrefs->getIncomingServer(0); + $folderTree = $this->uiwidgets->createHTMLFolder + ( + $folderList, + $this->selectedFolder, + 0, + lang('IMAP Server'), + $icServer->username.'@'.$icServer->host, + 'divFolderTree', + TRUE + ); + $this->t->set_var('folder_tree',$folderTree); + + switch($_GET['display']) + { + case 'settings': + default: + // selected folder data + if($folderStatus['subscribed']) + { + $this->t->set_var('subscribed_checked','checked'); + $this->t->set_var('unsubscribed_checked',''); + } + else + { + $this->t->set_var('subscribed_checked',''); + $this->t->set_var('unsubscribed_checked','checked'); + } + + if(is_array($quota)) + { + $this->t->set_var('storage_usage',$quota['STORAGE']['usage']); + $this->t->set_var('storage_limit',$quota['STORAGE']['limit']); + $this->t->set_var('message_usage',$quota['MESSAGE']['usage']); + $this->t->set_var('message_limit',$quota['MESSAGE']['limit']); + } + else + { + $this->t->set_var('storage_usage',lang('unknown')); + $this->t->set_var('storage_limit',lang('unknown')); + $this->t->set_var('message_usage',lang('unknown')); + $this->t->set_var('message_limit',lang('unknown')); + } + + if($this->selectedFolder != '--topfolderselected--') + { + $this->t->parse('settings_view','folder_settings',True); + } + else + { + $this->t->parse('settings_view','mainFolder_settings',True); + } + + break; + } + + $mailBoxTreeName = ''; + $mailBoxName = $this->selectedFolder; + if($position = strrpos($this->selectedFolder,'.')) + { + $mailBoxTreeName = substr($this->selectedFolder,0,$position+1); + $mailBoxName = substr($this->selectedFolder,$position+1); + } + + $this->t->set_var('mailboxTreeName',$mailBoxTreeName); + $this->t->set_var('mailboxNameShort',$mailBoxName); + $this->t->set_var('mailboxName',$mailBoxName); + $this->t->set_var('folderName',$this->selectedFolder); + $this->t->set_var('imap_server',$icServer->host); + + $this->t->pparse("out","main"); + $this->bofelamimail->closeConnection(); + } + + function listSignatures() + { + $this->display_app_header(TRUE); + + $this->t->set_file(array("body" => "preferences_list_signatures.tpl")); + $this->t->set_block('body','main'); + + $this->translate(); + + #print "
    ";print_r($folderList);print "
    "; + // set the default values for the sort links (sort by subject) + $linkData = array + ( + 'menuaction' => 'felamimail.uipreferences.listFolder' + ); + $this->t->set_var('form_action', $GLOBALS['egw']->link('/index.php',$linkData)); + + $linkData = array + ( + 'menuaction' => 'felamimail.uipreferences.editSignature' + ); + $this->t->set_var('url_addSignature', $GLOBALS['egw']->link('/index.php',$linkData)); + + $this->t->set_var('url_image_add',$GLOBALS['egw']->common->image('phpgwapi','new')); + $this->t->set_var('url_image_delete',$GLOBALS['egw']->common->image('phpgwapi','delete')); + + $felamimail_bosignatures = new felamimail_bosignatures(); + $signatures = $felamimail_bosignatures->getListOfSignatures(); + + $this->t->set_var('table', $this->uiwidgets->createSignatureTable($signatures)); + + $this->t->pparse("out","main"); + $this->bofelamimail->closeConnection(); + } + + function listAccountData() + { + $this->display_app_header(TRUE); + if (!isset($this->bopreferences)) $this->bopreferences = CreateObject('felamimail.bopreferences'); + $preferences =& $this->bopreferences->getPreferences(); + $allAccountData = $this->bopreferences->getAllAccountData($preferences); + if ($allAccountData) { + foreach ($allAccountData as $tmpkey => $accountData) + { + $identity =& $accountData['identity']; + + #_debug_array($identity); + + foreach($identity as $key => $value) { + if(is_object($value) || is_array($value)) { + continue; + } + switch($key) { + default: + $tempvar[$key] = $value; + } + } + $accountArray[]=$tempvar; + } + } + $this->t->set_file(array("body" => "preferences_list_accounts.tpl")); + $this->t->set_block('body','main'); + + $this->translate(); + + #print "
    ";print_r($folderList);print "
    "; + // set the default values for the sort links (sort by subject) + #$linkData = array + #( + # 'menuaction' => 'felamimail.uipreferences.listFolder' + #); + #$this->t->set_var('form_action', $GLOBALS['egw']->link('/index.php',$linkData)); + + $linkData = array + ( + 'menuaction' => 'felamimail.uipreferences.editAccountData', + 'accountID' => 'new' + ); + $this->t->set_var('url_addAccount', $GLOBALS['egw']->link('/index.php',$linkData)); + + $this->t->set_var('url_image_add',$GLOBALS['egw']->common->image('phpgwapi','new')); + $this->t->set_var('url_image_delete',$GLOBALS['egw']->common->image('phpgwapi','delete')); + + $this->t->set_var('table', $this->uiwidgets->createAccountDataTable($accountArray)); + + $this->t->pparse("out","main"); + $this->bofelamimail->closeConnection(); + } + + function listSelectFolder() + { + $this->display_app_header(False); + if (!isset($this->bofelamimail)) $this->bofelamimail = CreateObject('felamimail.bofelamimail',$GLOBALS['egw']->translation->charset()); + if (!isset($this->uiwidgets)) $this->uiwidgets = CreateObject('felamimail.uiwidgets'); + $this->bofelamimail->openConnection(); + $mailPrefs = $this->bofelamimail->getMailPreferences(); + $icServer = $mailPrefs->getIncomingServer(0); + $folderObjects = $this->bofelamimail->getFolderObjects(false); + $folderTree = $this->uiwidgets->createHTMLFolder + ( + $folderObjects, + 'INBOX', + 0, + lang('IMAP Server'), + $icServer->username.'@'.$icServer->host, + 'divFolderTree', + false, + true + ); + print ''; + print '
    '; + print $folderTree; + } + + + function translate() + { + $this->t->set_var('lang_signature',lang('Signatur')); + $this->t->set_var("lang_folder_name",lang('folder name')); + $this->t->set_var("lang_folder_list",lang('folderlist')); + $this->t->set_var("lang_select",lang('select')); + $this->t->set_var("lang_folder_status",lang('folder status')); + $this->t->set_var("lang_subscribed",lang('subscribed')); + $this->t->set_var("lang_unsubscribed",lang('unsubscribed')); + $this->t->set_var("lang_subscribe",lang('subscribe')); + $this->t->set_var("lang_unsubscribe",lang('unsubscribe')); + $this->t->set_var("lang_update",lang('update')); + $this->t->set_var("lang_rename_folder",lang('rename folder')); + $this->t->set_var("lang_create_subfolder",lang('create subfolder')); + $this->t->set_var("lang_delete_folder",lang('delete folder')); + $this->t->set_var("lang_confirm_delete",addslashes(lang("Do you really want to delete the '%1' folder?",$this->bofelamimail->sessionData['preferences']['mailbox']))); + $this->t->set_var("lang_really_delete_accountsettings",lang("Do you really want to delete the selected Accountsettings and the assosiated Identity.")); + $this->t->set_var("lang_delete",lang('delete')); + $this->t->set_var("lang_imap_server",lang('IMAP Server')); + $this->t->set_var("lang_folder_settings",lang('folder settings')); + $this->t->set_var("lang_folder_acl",lang('folder acl')); + $this->t->set_var("lang_anyone",lang('anyone')); + $this->t->set_var("lang_reading",lang('reading')); + $this->t->set_var("lang_writing",lang('writing')); + $this->t->set_var("lang_posting",lang('posting')); + $this->t->set_var("lang_none",lang('none')); + $this->t->set_var("lang_rename",lang('rename')); + $this->t->set_var("lang_move",lang('move')); + $this->t->set_var("lang_move_folder",lang('move folder')); + $this->t->set_var("lang_create",lang('create')); + $this->t->set_var('lang_open_all',lang("open all")); + $this->t->set_var('lang_close_all',lang("close all")); + $this->t->set_var('lang_add',lang("add")); + $this->t->set_var('lang_delete_selected',lang("delete selected")); + $this->t->set_var('lang_cancel',lang("close")); + $this->t->set_var('lang_ACL',lang('ACL')); + $this->t->set_var('lang_save',lang('save')); + $this->t->set_var('lang_cancel',lang('cancel')); + $this->t->set_var('lang_Overview',lang('Overview')); + $this->t->set_var('lang_edit_forwarding_address',lang('edit email forwarding address')); + $this->t->set_var('lang_forwarding_address',lang('email forwarding address')); + $this->t->set_var('lang_keep_local_copy',lang('keep local copy of email')); + $this->t->set_var('hostname_address',lang('hostname / address')); + $this->t->set_var('lang_username',lang('username')); + $this->t->set_var('lang_password',lang('password')); + $this->t->set_var('lang_port',lang('port')); + $this->t->set_var('lang_apply',lang('apply')); + $this->t->set_var('lang_use_costum_settings',lang('use custom settings')); + $this->t->set_var('lang_use_custom_ids',lang('use custom identities')); + $this->t->set_var('lang_identity',lang('identity')); + $this->t->set_var('lang_name',lang('name')); + $this->t->set_var('lang_organization',lang('organization')); + $this->t->set_var('lang_emailaddress',lang('emailaddress')); + $this->t->set_var('lang_encrypted_connection',lang('encrypted connection')); + $this->t->set_var('lang_do_not_validate_certificate',lang('do not validate certificate')); + $this->t->set_var("lang_incoming_server",lang('incoming mail server(IMAP)')); + $this->t->set_var("lang_outgoing_server",lang('outgoing mail server(SMTP)')); + $this->t->set_var("auth_required",lang('authentication required')); + $this->t->set_var('lang_add_acl',lang('add acl')); + $this->t->set_var('lang_foldername',lang('foldername')); + $this->t->set_var('lang_description',lang('description')); + $this->t->set_var('lang_really_delete_signatures',lang('Do you really want to delete the selected signatures?')); + $this->t->set_var('lang_no_encryption',lang('no encryption')); + $this->t->set_var('lang_default_signature',lang('default signature')); + $this->t->set_var('lang_server_supports_sieve',lang('server supports mailfilter(sieve)')); + $this->t->set_var('lang_sent_folder', lang('sent folder')); + $this->t->set_var('lang_trash_folder', lang('trash folder')); + $this->t->set_var('lang_draft_folder', lang('draft folder')); + $this->t->set_var('lang_template_folder', lang('template folder')); + $this->t->set_var('lang_folder_to_appear_on_main_screen', lang('if shown, which folders should appear on main screen')); + $this->t->set_var("th_bg",$GLOBALS['egw_info']["theme"]["th_bg"]); + $this->t->set_var("bg01",$GLOBALS['egw_info']["theme"]["bg01"]); + $this->t->set_var("bg02",$GLOBALS['egw_info']["theme"]["bg02"]); + $this->t->set_var("bg03",$GLOBALS['egw_info']["theme"]["bg03"]); + } + } + +?> diff --git a/felamimail/inc/class.uisieve.inc.php b/felamimail/inc/class.uisieve.inc.php new file mode 100644 index 0000000000..e416aa7f5c --- /dev/null +++ b/felamimail/inc/class.uisieve.inc.php @@ -0,0 +1,1133 @@ + True, + 'addScript' => True, + 'deactivateScript' => True, + 'decreaseFilter' => True, + 'deleteScript' => True, + 'editRule' => True, + 'editScript' => True, + 'editVacation' => True, + 'increaseFilter' => True, + 'listScripts' => True, + 'listRules' => True, + 'updateRules' => True, + 'updateVacation' => True, + 'saveVacation' => True, + 'selectFolder' => True, + 'editEmailNotification' => True, // Added email notifications + ); + + /** + * Flag if we can do a timed vaction message, requires Cyrus Admin User/Pw to enable/disable via async service + * + * @var boolean + */ + var $timed_vacation; + //var $scriptName = 'felamimail'; + + /** + * @var bosieve + */ + var $bosieve; + + var $errorStack; + + function uisieve() + { + if(empty($GLOBALS['egw_info']['user']['preferences']['felamimail']['sieveScriptName'])) { + $GLOBALS['egw']->preferences->add('felamimail','sieveScriptName','felamimail', 'forced'); + $GLOBALS['egw']->preferences->save_repository(); + } + $this->scriptName = (!empty($GLOBALS['egw_info']['user']['preferences']['felamimail']['sieveScriptName'])) ? $GLOBALS['egw_info']['user']['preferences']['felamimail']['sieveScriptName'] : 'felamimail' ; + + $this->displayCharset = $GLOBALS['egw']->translation->charset(); + + $this->t =& CreateObject('phpgwapi.Template',EGW_APP_TPL); + $this->botranslation = $GLOBALS['egw']->translation; + + $this->bopreferences =& CreateObject('felamimail.bopreferences'); + $this->mailPreferences = $this->bopreferences->getPreferences(); + + $this->felamimailConfig = config::read('felamimail'); + + $this->restoreSessionData(); + + $icServer = $this->mailPreferences->getIncomingServer(0); + + if(is_a($icServer,'defaultimap') && $icServer->enableSieve) { + $this->bosieve =& CreateObject('felamimail.bosieve',$icServer); + $this->timed_vacation = is_a($icServer,'cyrusimap') && $icServer->enableCyrusAdmin && + $icServer->adminUsername && $icServer->adminPassword; + } else { + die('Sieve not activated'); + } + + $this->rowColor[0] = $GLOBALS['egw_info']["theme"]["bg01"]; + $this->rowColor[1] = $GLOBALS['egw_info']["theme"]["bg02"]; + } + + function addScript() { + if($scriptName = $_POST['newScriptName']) { + #$script =& CreateObject('felamimail.Script',$scriptName); + #$script->updateScript($this->sieve); + $this->bosieve->installScript($scriptName, ''); + + // always activate and then edit the first script added + #if ($this->sieve->listscripts() && count($this->sieve->scriptlist) == 1) + #{ + # if ($this->sieve->activatescript($scriptName)) + # { + # $GLOBALS['egw']->redirect_link('/index.php',array( + # 'menuaction' => 'felamimail.uisieve.editScript', + # 'scriptname' => $scriptName, + # )); + # } + #} + } + + $this->listScripts(); + } + +# function activateScript() +# { +# $scriptName = $_GET['scriptname']; +# if(!empty($scriptName)) +# { +# if($this->bosieve->setActive($scriptName)) +# { +# #print "Successfully changed active script!
    "; +# } +# else +# { +# #print "Unable to change active script!
    "; +# /* we could display the full output here */ +# } +# } +# +# $this->listScripts(); +# } + + function buildRule($rule) + { + $andor = ' '. lang('and') .' '; + $started = 0; + if ($rule['anyof']) $andor = ' '. lang('or') .' '; + $complete = lang('IF').' '; + if ($rule['unconditional']) $complete = "[Unconditional] "; + + if ($rule['from']) + { + $match = $this->setMatchType($rule['from'],$rule['regexp']); + $complete .= "'From:' " . $match . " '" . $rule['from'] . "'"; + $started = 1; + } + if ($rule['to']) + { + if ($started) $complete .= $andor; + $match = $this->setMatchType($rule['to'],$rule['regexp']); + $complete .= "'To:' " . $match . " '" . $rule['to'] . "'"; + $started = 1; + } + if ($rule['subject']) + { + if ($started) $complete .= $andor; + $match = $this->setMatchType($rule['subject'],$rule['regexp']); + $complete .= "'Subject:' " . $match . " '" . $rule['subject'] . "'"; + $started = 1; + } + if ($rule['field'] && $rule['field_val']) + { + if ($started) $complete .= $andor; + $match = $this->setMatchType($rule['field_val'],$rule['regexp']); + $complete .= "'" . $rule['field'] . "' " . $match . " '" . $rule['field_val'] . "'"; + $started = 1; + } + if ($rule['size']) + { + $xthan = " less than '"; + if ($rule['gthan']) $xthan = " greater than '"; + if ($started) $complete .= $andor; + $complete .= "message " . $xthan . $rule['size'] . "KB'"; + $started = 1; + } + if (!$rule['unconditional']) $complete .= ' '.lang('THEN').' '; + if (preg_match("/folder/i",$rule['action'])) + $complete .= lang('file into')." '" . $rule['action_arg'] . "';"; + if (preg_match("/reject/i",$rule['action'])) + $complete .= lang('reject with')." '" . $rule['action_arg'] . "'."; + if (preg_match("/address/i",$rule['action'])) + $complete .= lang('forward to').' ' . $rule['action_arg'] .'.'; + if (preg_match("/discard/i",$rule['action'])) + $complete .= lang('discard').'.'; + if ($rule['continue']) $complete .= " [Continue]"; + if ($rule['keep']) $complete .= " [Keep a copy]"; + + return $complete; + } + + function buildVacationString($_vacation) + { +# global $script; +# $vacation = $script->vacation; + $vacation_str = ''; + if (!is_array($_vacation)) + { + return @htmlspecialchars($vacation_str, ENT_QUOTES, $GLOBALS['egw']->translation->charset()); + } + + $vacation_str .= lang('Respond'); + if (is_array($_vacation['addresses']) && $_vacation['addresses'][0]) + { + $vacation_str .= ' ' . lang('to mail sent to') . ' '; + $first = true; + foreach ($_vacation['addresses'] as $addr) + { + if (!$first) $vacation_str .= ', '; + $vacation_str .= $addr; + $first = false; + } + } + if (!empty($_vacation['days'])) + { + $vacation_str .= ' ' . lang("every %1 days",$_vacation['days']); + } + $vacation_str .= ' ' . lang('with message "%1"',$_vacation['text']); + return @htmlspecialchars($vacation_str, ENT_QUOTES, $GLOBALS['egw']->translation->charset()); + } + + function checkRule($_vacation) + { + $this->errorStack = array(); + + if (!$_vacation['text']) + { + $this->errorStack['text'] = lang('Please supply the message to send with auto-responses'.'! '); + } + + if (!$_vacation['days']) + { + $this->errorStack['days'] = lang('Please select the number of days to wait between responses'.'!'); + } + + if(is_array($_vacation['addresses'])) + { + $regexp="/^[a-z0-9]+([_\\.-][a-z0-9]+)*@([a-z0-9]+([\.-][a-z0-9]+)*)+\\.[a-z]{2,}$/i"; + foreach ($_vacation['addresses'] as $addr) + { + if (!preg_match($regexp,$addr)) + { + $this->errorStack['addresses'] = lang('One address is not valid'.'!'); + } + } + } + else + { + $this->errorStack['addresses'] = lang('Please select a address'.'!'); + } + + if ($_vacation['status'] == 'by_date') + { + if (!$_vacation['start_date'] || !$_vacation['end_date']) + { + $this->errorStack['status'] = lang('Activating by date requires a start- AND end-date!'); + } + elseif($_vacation['start_date'] > $_vacation['end_date']) + { + $this->errorStack['status'] = lang('Vacation start-date must be BEFORE the end-date!'); + } + } + + if ($_vacation['forwards']) + { + foreach(preg_split('/, ?/',$_vacation['forwards']) as $addr) + { + if (!preg_match($regexp,$addr)) + { + $this->errorStack['forwards'] = lang('One address is not valid'.'!'); + } + } + } + + if(count($this->errorStack) == 0) + { + return true; + } + else + { + return false; + } + } + +# // RalfBecker: that does obviously nothing +# function deactivateScript() +# { +# $scriptName = get_var('scriptname',array('GET')); +# if(!empty($scriptName)) +# { +# #if($this->sieve->activatescript($scriptName)) +# #{ +# # #print "Successfully changed active script!
    "; +# #} +# #else +# #{ +# # #print "Unable to change active script!
    "; +# # /* we could display the full output here */ +# #} +# } +# +# $this->listScripts(); +# } + + function decreaseFilter() + { + $this->getRules(); /* ADDED BY GHORTH */ + $ruleID = get_var('ruleID',array('GET')); + if ($this->rules[$ruleID] && $this->rules[$ruleID+1]) + { + $tmp = $this->rules[$ruleID+1]; + $this->rules[$ruleID+1] = $this->rules[$ruleID]; + $this->rules[$ruleID] = $tmp; + } + + $this->updateScript(); + + $this->saveSessionData(); + + $this->listRules(); + } + + function display_app_header() { + if(preg_match('/^(vacation|filter)$/',get_var('editmode',array('GET')))) + $editMode = get_var('editmode',array('GET')); + else + $editMode = 'filter'; + + $GLOBALS['egw']->js->validate_file('tabs','tabs'); + $GLOBALS['egw']->js->validate_file('jscode','editProfile','felamimail'); + $GLOBALS['egw']->js->validate_file('jscode','listSieveRules','felamimail'); + $GLOBALS['egw']->js->set_onload("javascript:initAll('$editMode');"); + if($_GET['menuaction'] == 'felamimail.uisieve.editRule') { + $GLOBALS['egw']->js->set_onunload('opener.fm_sieve_cancelReload();'); + } + $GLOBALS['egw_info']['flags']['include_xajax'] = True; + $GLOBALS['egw']->common->egw_header(); + + switch($_GET['menuaction']) { + case 'felamimail.uisieve.editRule': + break; + default: + echo parse_navbar(); + break; + } + } + + function displayRule($_ruleID, $_ruleData, $msg='') { + $preferences = $this->mailPreferences; + // display the header + $this->display_app_header(); + $msg = html::purify($msg); + // initialize the template + $this->t->set_file(array("filterForm" => "sieveEditForm.tpl")); + $this->t->set_block('filterForm','main'); + $this->t->set_var('message',$msg); + $linkData = array + ( + 'menuaction' => 'felamimail.uisieve.editRule', + 'ruleID' => $_ruleID + ); + $this->t->set_var('action_url',$GLOBALS['egw']->link('/index.php',$linkData)); + + $linkData = array + ( + 'menuaction' => 'felamimail.uisieve.selectFolder', + ); + $this->t->set_var('folder_select_url',$GLOBALS['egw']->link('/index.php',$linkData)); + + if(is_array($_ruleData)) + { + if($_ruleData['continue']) + $this->t->set_var('continue_checked','checked'); + if($_ruleData['keep']) + $this->t->set_var('keep_checked','checked'); + if($_ruleData['regexp']) + $this->t->set_var('regexp_checked','checked'); + if(intval($_ruleData['anyof'])==1) + $_ruleData['anyof'] = 4; // set the anyof to 4 if set at all, as the template var anyof_selected is anyof_selected0 or anyof_selected4 + $this->t->set_var('anyof_selected'.intval($_ruleData['anyof']),'selected'); + $this->t->set_var('value_from',htmlspecialchars($_ruleData['from'], ENT_QUOTES, $GLOBALS['egw']->translation->charset())); + $this->t->set_var('value_to',htmlspecialchars($_ruleData['to'], ENT_QUOTES, $GLOBALS['egw']->translation->charset())); + $this->t->set_var('value_subject',htmlspecialchars($_ruleData['subject'], ENT_QUOTES, $GLOBALS['egw']->translation->charset())); + $this->t->set_var('gthan_selected'.intval($_ruleData['gthan']),'selected'); + $this->t->set_var('value_size',$_ruleData['size']); + $this->t->set_var('value_field',htmlspecialchars($_ruleData['field'], ENT_QUOTES, $GLOBALS['egw']->translation->charset())); + $this->t->set_var('value_field_val',htmlspecialchars($_ruleData['field_val'], ENT_QUOTES, $GLOBALS['egw']->translation->charset())); + $this->t->set_var('checked_action_'.$_ruleData['action'],'checked'); + $this->t->set_var('value_'.$_ruleData['action'],$_ruleData['action_arg']); + if ($_ruleData['action'] == 'folder') + { + $this->t->set_var('folderName',$_ruleData['action_arg']); + } + if (($_ruleData['action'] == 'address') && + (!empty($preferences->preferences['prefpreventforwarding']) && + $preferences->preferences['prefpreventforwarding'] == 1 )) + { + $this->t->set_var('checked_action_address',''); + $this->t->set_var('value_address',lang('not allowed')); + } + } + $this->t->set_var('value_ruleID',$_ruleID); + + #$bofelamimail =& CreateObject('felamimail.bofelamimail',$this->displayCharset); + #$uiwidgets =& CreateObject('felamimail.uiwidgets'); + #$connectionStatus = $bofelamimail->openConnection(); + #$folders = $bofelamimail->getFolderObjects(false); + + #foreach($folders as $folderName => $folderDisplayName) + #{ + # $this->t->set_var('folderName',$folderName); + # $this->t->set_var('folderDisplayName',$folderDisplayName); + # $this->t->parse("folder_rows", 'folder', true); + #} + + // translate most of the parts + $this->translate(); + $this->t->pfp("out","main"); + } + + function editRule() + { + $preferences = $this->mailPreferences; + $msg = ''; + $error = 0; + $this->getRules(); /* ADDED BY GHORTH */ + + $ruleType = get_var('ruletype',array('GET')); + + if(isset($_POST['anyof'])) { + if(get_var('priority',array('POST')) != 'unset') { + $newRule['priority'] = get_var('priority',array('POST')); + } + $ruleID = get_var('ruleID',array('POST')); + if($ruleID == 'unset') + $ruleID = count($this->rules); + $newRule['priority'] = $ruleID*2+1; + $newRule['status'] = 'ENABLED'; + $newRule['from'] = get_var('from',array('POST')); + $newRule['to'] = get_var('to',array('POST')); + $newRule['subject'] = get_var('subject',array('POST')); + //$newRule['flg'] = get_var('???',array('POST')); + $newRule['field'] = get_var('field',array('POST')); + $newRule['field_val'] = get_var('field_val',array('POST')); + $newRule['size'] = intval(get_var('size',array('POST'))); + $newRule['continue'] = get_var('continue',array('POST')); + $newRule['gthan'] = intval(get_var('gthan',array('POST'))); + $newRule['anyof'] = intval(get_var('anyof',array('POST'))); + $newRule['keep'] = get_var('keep',array('POST')); + $newRule['regexp'] = get_var('regexp',array('POST')); + $newRule['unconditional'] = '0'; // what's this??? + + $newRule['flg'] = 0 ; + if( $newRule['continue'] ) { $newRule['flg'] += 1; } + if( $newRule['gthan'] ) { $newRule['flg'] += 2; } + if( $newRule['anyof'] ) { $newRule['flg'] += 4; } + if( $newRule['keep'] ) { $newRule['flg'] += 8; } + if( $newRule['regexp'] ) { $newRule['flg'] += 128; } + + switch(get_var('action',array('POST'))) + { + case 'reject': + $newRule['action'] = 'reject'; + $newRule['action_arg'] = get_var('reject',array('POST')); + break; + + case 'folder': + $newRule['action'] = 'folder'; + $newRule['action_arg'] = get_var('folder',array('POST')); + #$newRule['action_arg'] = $GLOBALS['egw']->translation->convert($newRule['action_arg'], $this->charset, 'UTF7-IMAP'); + break; + + case 'address': + if (empty($preferences->preferences['prefpreventforwarding']) || + $preferences->preferences['prefpreventforwarding'] == 0 ) + { + $newRule['action'] = 'address'; + $newRule['action_arg'] = get_var('address',array('POST')); + } + else + { + $msg .= lang('Error creating rule while trying to use forward/redirect.'); + $error++; + } + break; + + case 'discard': + $newRule[action] = 'discard'; + break; + } + if($newRule['action']) { + + $this->rules[$ruleID] = $newRule; + + $this->bosieve->setRules($this->scriptName, $this->rules); + + $this->saveSessionData(); + } else { + $msg .= "\n".lang("Error: Could not save rule"); + $error++; + } + // refresh the list + $js = "opener.location.href = '".addslashes(egw::link('/index.php','menuaction=felamimail.uisieve.listRules'))."';"; + if(isset($_POST['save']) && $error == 0) { + echo "\n"; + } else { + $GLOBALS['egw']->js->set_onload($js); + $this->displayRule($ruleID, $newRule, $msg); + } + } + else + { + if(isset($_GET['ruleID'])) + { + $ruleID = get_var('ruleID',Array('GET')); + $ruleData = $this->rules[$ruleID]; + $this->displayRule($ruleID, $ruleData); + } + else + { + $this->displayRule('unset', false); + } + #LK $this->sieve->disconnet(); + } + } + + function editVacation() { + $preferences = $this->mailPreferences; + if(!(empty($preferences->preferences['prefpreventabsentnotice']) || $preferences->preferences['prefpreventabsentnotice'] == 0)) + { + die('You should not be here!'); + } + $uiwidgets =& CreateObject('felamimail.uiwidgets',EGW_APP_TPL); + $boemailadmin = new emailadmin_bo(); + + if ($this->timed_vacation) + { + include_once(EGW_API_INC.'/class.jscalendar.inc.php'); + $jscal = new jscalendar(); + } + if($this->bosieve->getScript($this->scriptName)) + { + if(PEAR::isError($error = $this->bosieve->retrieveRules($this->scriptName)) ) + { + $rules = array(); + $vacation = array(); + } + else + { + $rules = $this->bosieve->getRules($this->scriptName); + $vacation = $this->bosieve->getVacation($this->scriptName); + } + } + else + { + // something went wrong + } + + if ($GLOBALS['egw_info']['user']['apps']['admin']) + { + // store text as default + if (isset($_POST['set_as_default'])) + { + $config = new config('felamimail'); + $config->save_value('default_vacation_text',$_POST['vacation_text'],'felamimail'); + } + $this->t->set_var('set_as_default',''); + } + if(isset($_POST["vacationStatus"])) + { + $newVacation['text'] = get_var('vacation_text',array('POST')); + $newVacation['text'] = $this->botranslation->convert($newVacation['text'],$this->displayCharset,'UTF-8'); + $newVacation['days'] = get_var('days',array('POST')); + $newVacation['addresses'] = get_var('vacationAddresses',array('POST')); + $newVacation['status'] = get_var('vacationStatus',array('POST')); + if (empty($preferences->preferences['prefpreventforwarding']) || + $preferences->preferences['prefpreventforwarding'] == 0 ) # || + #is_a($ogServer, 'defaultsmtp') || $ogServer->editForwardingAddress) + { + $newVacation['forwards'] = get_var('vacation_forwards',array('POST')); + } + if (!in_array($newVacation['status'],array('on','off','by_date'))) $newVacation['status'] = 'off'; + if ($this->timed_vacation) + { + $date = $jscal->input2date($_POST['start_date']); + if ($date['raw']) $newVacation['start_date'] = $date['raw']-12*3600; + $date = $jscal->input2date($_POST['end_date']); + if ($date['raw']) $newVacation['end_date'] = $date['raw']-12*3600; + } + if(isset($_POST['save']) || isset($_POST['apply'])) + { + if($this->checkRule($newVacation)) + { + if (!$this->bosieve->setVacation($this->scriptName, $newVacation)) + { + print "vacation update failed
    "; + #print $script->errstr."
    "; + } + } + else + { + $this->t->set_var('validation_errors',implode('
    ',$this->errorStack)); + } + } + $vacation = $newVacation; + + if(isset($_POST['save']) || isset($_POST['cancel'])) + { + $GLOBALS['egw']->redirect_link('/felamimail/index.php'); + } + } + + $this->saveSessionData(); + + // display the header + $this->display_app_header(); + + // initialize the template + $this->t->set_file(array("filterForm" => "sieveForm.tpl")); + $this->t->set_block('filterForm','vacation'); + + // translate most of the parts + $this->translate(); + + // vacation status + if($vacation['status'] == 'on') + { + $this->t->set_var('checked_active', 'checked'); + } + elseif($vacation['status'] == 'off') + { + $this->t->set_var('checked_disabled', 'checked'); + } + + // vacation text + if (empty($vacation['text'])) { + $config = new config('felamimail'); + $config = $config->read_repository(); + $vacation['text'] = $config['default_vacation_text']; + } + $this->t->set_var('vacation_text',$this->botranslation->convert($vacation['text'],'UTF-8')); + + //vacation days + if(empty($vacation)) { + $this->t->set_var('selected_7', 'selected="selected"'); + // ToDO set default + + } else { + $this->t->set_var('selected_'.$vacation['days'], 'selected="selected"'); + } + if (empty($preferences->preferences['prefpreventforwarding']) || + $preferences->preferences['prefpreventforwarding'] == 0 ) + { + $this->t->set_var('vacation_forwards',''); + } + else + { + $this->t->set_var('vacation_forwards',lang('not allowed')); + unset($vacation['forwards']); + } + + // vacation addresses + if(is_array($vacation['addresses'])) { + foreach($vacation['addresses'] as $address) { + $selectedAddresses[$address] = $address; + } + asort($selectedAddresses); + } + + + $allIdentities = $preferences->getIdentity(); + foreach($allIdentities as $key => $singleIdentity) { + if(empty($vacation) && $singleIdentity->default === true) { + $selectedAddresses[$singleIdentity->emailAddress] = $singleIdentity->emailAddress; + } + $predefinedAddresses[$singleIdentity->emailAddress] = $singleIdentity->emailAddress; + } + asort($predefinedAddresses); + + $this->t->set_var('multiSelectBox',$uiwidgets->multiSelectBox( + $selectedAddresses, + $predefinedAddresses, + 'vacationAddresses', + '400px' + ) + ); + + $linkData = array ( + 'menuaction' => 'felamimail.uisieve.editVacation', + ); + + $this->t->set_var('vacation_action_url',$GLOBALS['egw']->link('/index.php',$linkData)); + + if ($this->timed_vacation) + { + $this->t->set_var('by_date',' : '. + $jscal->input('start_date',$vacation['start_date']).' - '.$jscal->input('end_date',$vacation['end_date'])); + $this->t->set_var('lang_help_start_end_replacement','
    '.lang('You can use %1 for the above start-date and %2 for the end-date.','$$start$$','$$end$$')); + } + $this->t->pfp('out','vacation'); + + #LK $this->bosieve->disconnect(); + } + + function editEmailNotification() { + $preferences = ExecMethod('felamimail.bopreferences.getPreferences'); + if(!(empty($preferences->preferences['prefpreventnotificationformailviaemail']) || $preferences->preferences['prefpreventnotificationformailviaemail'] == 0)) + die('You should not be here!'); + + $uiwidgets =& CreateObject('felamimail.uiwidgets',EGW_APP_TPL); + $boemailadmin = new emailadmin_bo(); + + if($this->bosieve->getScript($this->scriptName)) { + if(PEAR::isError($error = $this->bosieve->retrieveRules($this->scriptName)) ) { + $rules = array(); + $emailNotification = array(); + } else { + $rules = $this->bosieve->getRules($this->scriptName); + $emailNotification = $this->bosieve->getEmailNotification($this->scriptName); + } + } else { + // something went wrong + } + + + // perform actions + if (isset($_POST["emailNotificationStatus"])) { + if (isset($_POST['save']) || isset($_POST['apply'])) { + //$newEmailNotification['text'] = $this->botranslation->convert($newVacation['text'],$this->displayCharset,'UTF-8'); + $newEmailNotification['status'] = get_var('emailNotificationStatus',array('POST')) == 'disabled' ? 'off' : 'on'; + $newEmailNotification['externalEmail'] = get_var('emailNotificationExternalEmail',array('POST')); + $newEmailNotification['displaySubject'] = get_var('emailNotificationDisplaySubject',array('POST')); + if (!$this->bosieve->setEmailNotification($this->scriptName, $newEmailNotification)) { + print lang("email notification update failed")."
    "; + print $script->errstr."
    "; + } + $emailNotification = $newEmailNotification; + } + if (isset($_POST['save']) || isset($_POST['cancel'])) { + $GLOBALS['egw']->redirect_link('/felamimail/index.php'); + } + } + + $this->saveSessionData(); + + // display the header + $this->display_app_header(); + + // initialize the template + $this->t->set_file(array("filterForm" => "sieveForm.tpl")); + $this->t->set_block('filterForm','email_notification'); + + // translate most of the parts + $this->translate(); + $this->t->set_var("lang_yes",lang('yes')); + $this->t->set_var("lang_no",lang('no')); + + // email notification status + if ($emailNotification['status'] == 'on') $this->t->set_var('checked_active', ' checked'); + else $this->t->set_var('checked_disabled', ' checked'); + + // email notification display subject + if ($emailNotification['displaySubject'] == '1') $this->t->set_var('checked_yes', ' checked'); + else $this->t->set_var('checked_no', ' checked'); + + // email notification external email + $this->t->set_var('external_email', $emailNotification['externalEmail']); + + $this->t->set_var('email_notification_action_url',$GLOBALS['egw']->link('/index.php','menuaction=felamimail.uisieve.editEmailNotification')); + $this->t->pfp('out','email_notification'); + } + + function increaseFilter() + { + $this->getRules(); /* ADDED BY GHORTH */ + $ruleID = get_var('ruleID',array('GET')); + if ($this->rules[$ruleID] && $this->rules[$ruleID-1]) + { + $tmp = $this->rules[$ruleID-1]; + $this->rules[$ruleID-1] = $this->rules[$ruleID]; + $this->rules[$ruleID] = $tmp; + } + + $this->updateScript(); + + $this->saveSessionData(); + + $this->listRules(); + } + + function listRules() + { + $preferences = ExecMethod('felamimail.bopreferences.getPreferences'); + if(!(empty($preferences->preferences['prefpreventeditfilterrules']) || $preferences->preferences['prefpreventeditfilterrules'] == 0)) + die('You should not be here!'); + + $uiwidgets =& CreateObject('felamimail.uiwidgets', EGW_APP_TPL); + $boemailadmin = new emailadmin_bo(); + + $this->getRules(); /* ADDED BY GHORTH */ + + $this->saveSessionData(); + + // display the header + $this->display_app_header(); + + // initialize the template + $this->t->set_file(array('filterForm' => 'listRules.tpl')); + $this->t->set_block('filterForm','header'); + $this->t->set_block('filterForm','filterrow'); + + // translate most of the parts + $this->translate(); + + #if(!empty($this->scriptToEdit)) + #{ + $listOfImages = array( + 'up', + 'down' + ); + foreach ($listOfImages as $image) + { + $this->t->set_var('url_'.$image,$GLOBALS['egw']->common->image('felamimail',$image)); + } + + $linkData = array + ( + 'menuaction' => 'felamimail.uisieve.editRule', + 'ruletype' => 'filter' + ); + $this->t->set_var('url_add_rule',$GLOBALS['egw']->link('/index.php',$linkData)); + + $linkData = array + ( + 'menuaction' => 'felamimail.uisieve.editRule', + 'ruletype' => 'vacation' + ); + $this->t->set_var('url_add_vacation_rule',$GLOBALS['egw']->link('/index.php',$linkData)); + + foreach ($this->rules as $ruleID => $rule) + { + $this->t->set_var('filter_status',lang($rule[status])); + if($rule[status] == 'ENABLED') + { + $this->t->set_var('ruleCSS','sieveRowActive'); + } + else + { + $this->t->set_var('ruleCSS','sieveRowInActive'); + } + + $this->t->set_var('filter_text',htmlspecialchars($this->buildRule($rule),ENT_QUOTES,$GLOBALS['egw']->translation->charset())); + $this->t->set_var('ruleID',$ruleID); + + $linkData = array + ( + 'menuaction' => 'felamimail.uisieve.editRule', + 'ruleID' => $ruleID, + ); + $this->t->set_var('url_edit_rule',$GLOBALS['egw']->link('/index.php',$linkData)); + + $linkData = array + ( + 'menuaction' => 'felamimail.uisieve.increaseFilter', + 'ruleID' => $ruleID, + ); + $this->t->set_var('url_increase',$GLOBALS['egw']->link('/index.php',$linkData)); + + $linkData = array + ( + 'menuaction' => 'felamimail.uisieve.decreaseFilter', + 'ruleID' => $ruleID, + ); + $this->t->set_var('url_decrease',$GLOBALS['egw']->link('/index.php',$linkData)); + + $linkData = array + ( + 'menuaction' => 'felamimail.uisieve.updateRules', + ); + $this->t->set_var('action_rulelist',$GLOBALS['egw']->link('/index.php',$linkData)); + + $this->t->parse('filterrows','filterrow',true); + } + + #} + + $linkData = array ( + 'menuaction' => 'felamimail.uisieve.saveScript' + ); + $this->t->set_var('formAction',$GLOBALS['egw']->link('/index.php',$linkData)); + + $linkData = array ( + 'menuaction' => 'felamimail.uisieve.listRules' + ); + $this->t->set_var('refreshURL',$GLOBALS['egw']->link('/index.php',$linkData)); + + $linkData = array + ( + 'menuaction' => 'felamimail.uisieve.listScripts', + 'scriptname' => $scriptName + ); + $this->t->set_var('url_back',$GLOBALS['egw']->link('/index.php',$linkData)); + + $this->t->pfp("out","header"); + + #LK $this->bosieve->disconnect(); + } + + function restoreSessionData() + { + $sessionData = $GLOBALS['egw']->session->appsession('sieve_session_data'); + + $this->rules = $sessionData['sieve_rules']; + $this->scriptToEdit = $sessionData['sieve_scriptToEdit']; + } + + function selectFolder() + { + $GLOBALS['egw']->js->validate_file('dhtmlxtree','js/dhtmlXCommon'); + $GLOBALS['egw']->js->validate_file('dhtmlxtree','js/dhtmlXTree'); + $GLOBALS['egw']->js->validate_file('jscode','editSieveRule','felamimail'); + $GLOBALS['egw']->common->egw_header(); + + $bofelamimail =& CreateObject('felamimail.bofelamimail',$this->displayCharset); + $uiwidgets =& CreateObject('felamimail.uiwidgets'); + $connectionStatus = $bofelamimail->openConnection(); + + $folderObjects = $bofelamimail->getFolderObjects(true,false); + $folderTree = $uiwidgets->createHTMLFolder + ( + $folderObjects, + 'INBOX', + 0, + lang('IMAP Server'), + $mailPreferences['username'].'@'.$mailPreferences['imapServerAddress'], + 'divFolderTree', + false, + true + ); + print '
    '; + print $folderTree; + } + + function setMatchType (&$matchstr, $regex = false) + { + $match = lang('contains'); + if (preg_match("/\s*!/", $matchstr)) + $match = lang('does not contain'); + if (preg_match("/\*|\?/", $matchstr)) + { + $match = lang('matches'); + if (preg_match("/\s*!/", $matchstr)) + $match = lang('does not match'); + } + if ($regex) + { + $match = lang('matches regexp'); + if (preg_match("/\s*!/", $matchstr)) + $match = lang('does not match regexp'); + } + $matchstr = preg_replace("/^\s*!/","",$matchstr); + + return $match; + } + + function saveScript() + { + $scriptName = $_POST['scriptName']; + $scriptContent = $_POST['scriptContent']; + if(isset($scriptName) and isset($scriptContent)) + { + if($this->sieve->sieve_sendscript($scriptName, stripslashes($scriptContent))) + { + #print "Successfully loaded script onto server. (Remember to set it active!)
    "; + } + else + { +/* print "Unable to load script to server. See server response below:
    "; + if(is_array($sieve->error_raw)) + foreach($sieve->error_raw as $error_raw) + print $error_raw."
    "; + else + print $sieve->error_raw."
    "; + print "
    "; + $textarea=stripslashes($script); + $textname=$scriptname; + $titleline="Try editing the script again! Create new script";*/ + } + } + $this->mainScreen(); + } + + function saveSessionData() + { + $sessionData['sieve_rules'] = $this->rules; + $sessionData['sieve_scriptToEdit'] = $this->scriptToEdit; + + $GLOBALS['egw']->session->appsession('sieve_session_data','',$sessionData); + } + + function translate() + { + $this->t->set_var("lang_message_list",lang('Message List')); + $this->t->set_var("lang_from",lang('from')); + $this->t->set_var("lang_to",lang('to')); + $this->t->set_var("lang_save",lang('save')); + $this->t->set_var("lang_apply",lang('apply')); + $this->t->set_var("lang_cancel",lang('cancel')); + $this->t->set_var("lang_active",lang('active')); + $this->t->set_var('lang_disabled',lang('disabled')); + $this->t->set_var('lang_status',lang('status')); + $this->t->set_var("lang_edit",lang('edit')); + $this->t->set_var("lang_delete",lang('delete')); + $this->t->set_var("lang_enable",lang('enable')); + $this->t->set_var("lang_rule",lang('rule')); + $this->t->set_var("lang_disable",lang('disable')); + $this->t->set_var("lang_action",lang('action')); + $this->t->set_var("lang_condition",lang('condition')); + $this->t->set_var("lang_subject",lang('subject')); + $this->t->set_var("lang_filter_active",lang('filter active')); + $this->t->set_var("lang_filter_name",lang('filter name')); + $this->t->set_var("lang_new_filter",lang('new filter')); + $this->t->set_var("lang_no_filter",lang('no filter')); + $this->t->set_var("lang_add_rule",lang('add rule')); + $this->t->set_var("lang_add_script",lang('add script')); + $this->t->set_var("lang_back",lang('back')); + $this->t->set_var("lang_days",lang('days')); + $this->t->set_var("lang_save_changes",lang('save changes')); + $this->t->set_var("lang_extended",lang('extended')); + $this->t->set_var("lang_edit_vacation_settings",lang('edit vacation settings')); + $this->t->set_var("lang_every",lang('every')); + $this->t->set_var('lang_respond_to_mail_sent_to',lang('respond to mail sent to')); + $this->t->set_var('lang_filter_rules',lang('filter rules')); + $this->t->set_var('lang_vacation_notice',lang('vacation notice')); + $this->t->set_var("lang_with_message",lang('with message')); + $this->t->set_var("lang_script_name",lang('script name')); + $this->t->set_var("lang_script_status",lang('script status')); + $this->t->set_var("lang_delete_script",lang('delete script')); + $this->t->set_var("lang_check_message_against_next_rule_also",lang('check message against next rule also')); + $this->t->set_var("lang_keep_a_copy_of_the_message_in_your_inbox",lang('keep a copy of the message in your inbox')); + $this->t->set_var("lang_use_regular_expressions",lang('use regular expressions')); + $this->t->set_var("lang_match",lang('match')); + $this->t->set_var("lang_all_of",lang('all of')); + $this->t->set_var("lang_any_of",lang('any of')); + $this->t->set_var("lang_if_from_contains",lang('if from contains')); + $this->t->set_var("lang_if_to_contains",lang('if to contains')); + $this->t->set_var("lang_if_subject_contains",lang('if subject contains')); + $this->t->set_var("lang_if_message_size",lang('if message size')); + $this->t->set_var("lang_less_than",lang('less than')); + $this->t->set_var("lang_greater_than",lang('greater than')); + $this->t->set_var("lang_kilobytes",lang('kilobytes')); + $this->t->set_var("lang_if_mail_header",lang('if mail header')); + $this->t->set_var("lang_file_into",lang('file into')); + $this->t->set_var("lang_forward_to_address",lang('forward to address')); + $this->t->set_var("lang_send_reject_message",lang('send a reject message')); + $this->t->set_var("lang_discard_message",lang('discard message')); + $this->t->set_var("lang_select_folder",lang('select folder')); + $this->t->set_var("lang_vacation_forwards",lang('Forward messages to').'
    '.lang('(separate multiple addresses by comma)').":"); + + $this->t->set_var("bg01",$GLOBALS['egw_info']["theme"]["bg01"]); + $this->t->set_var("bg02",$GLOBALS['egw_info']["theme"]["bg02"]); + $this->t->set_var("bg03",$GLOBALS['egw_info']["theme"]["bg03"]); + } + + function updateRules() + { + $this->getRules(); /* ADDED BY GHORTH */ + $action = get_var('rulelist_action',array('POST')); + $ruleIDs = get_var('ruleID',array('POST')); + $scriptName = get_var('scriptname',array('GET')); + + switch($action) + { + case 'enable': + if(is_array($ruleIDs)) + { + foreach($ruleIDs as $ruleID) + { + $this->rules[$ruleID][status] = 'ENABLED'; + } + } + break; + + case 'disable': + if(is_array($ruleIDs)) + { + foreach($ruleIDs as $ruleID) + { + $this->rules[$ruleID][status] = 'DISABLED'; + } + } + break; + + case 'delete': + if(is_array($ruleIDs)) + { + foreach($ruleIDs as $ruleID) + { + unset($this->rules[$ruleID]); + } + } + $this->rules = array_values($this->rules); + break; + } + + $this->updateScript(); + + $this->saveSessionData(); + + $this->listRules(); + } + + function updateScript() + { + if (!$this->bosieve->setRules($this->scriptToEdit, $this->rules)) { + print "update failed
    ";exit; + #LK print $script->errstr."
    "; + } + } + + /* ADDED BY GHORTH */ + function getRules() + { + if($script = $this->bosieve->getScript($this->scriptName)) { + $this->scriptToEdit = $this->scriptName; + if(PEAR::isError($error = $this->bosieve->retrieveRules($this->scriptName)) ) { + $this->rules = array(); + $this->vacation = array(); + } else { + $this->rules = $this->bosieve->getRules($this->scriptName); + $this->vacation = $this->bosieve->getVacation($this->scriptName); + } + } else { + // something went wrong + } + } + } +?> diff --git a/felamimail/inc/class.uiwidgets.inc.php b/felamimail/inc/class.uiwidgets.inc.php new file mode 100644 index 0000000000..82e935355b --- /dev/null +++ b/felamimail/inc/class.uiwidgets.inc.php @@ -0,0 +1,1039 @@ +template = $template; + $this->template->set_file(array("body" => 'uiwidgets.tpl')); + $this->charset = $GLOBALS['egw']->translation->charset(); + $this->bofelamimail =& CreateObject('felamimail.bofelamimail',$GLOBALS['egw']->translation->charset()); + if (!is_object($GLOBALS['egw']->html)) { + $GLOBALS['egw']->html = CreateObject('phpgwapi.html'); + } + } + + function encodeFolderName($_folderName) + { + return $GLOBALS['egw']->translation->convert($_folderName, 'UTF7-IMAP', $this->charset); + } + + /** + * create a folder tree + * + * this function will create a foldertree based on javascript + * on click the sorounding form gets submitted + * + * @param _folders array containing the list of folders + * @param _selected string containing the selected folder + * @param _selectedFolderCount integer contains the count of unread messages in the selected folder + * @param _topFolderName string containing the top folder name + * @param _topFolderDescription string containing the description for the top folder + * @param _formName string name of the sorounding form + * @param _hiddenVar string hidden form value, transports the selected folder + * @param _useDisplayCharset bool use displaycharset for foldernames (used by uisieve only) + * + * @return string the html code, to be added into the template + */ + function createHTMLFolder($_folders, $_selected, $_selectedFolderCount, $_topFolderName, $_topFolderDescription, $_divName, $_displayCheckBox, $_useDisplayCharset = false) { + $preferences = $this->bofelamimail->mailPreferences; + //_debug_array(bofelamimail::$autoFolders); + $userDefinedFunctionFolders = array(); + if (isset($preferences->preferences['trashFolder']) && + $preferences->preferences['trashFolder'] != 'none') $userDefinedFunctionFolders['Trash'] = $preferences->preferences['trashFolder']; + if (isset($preferences->preferences['sentFolder']) && + $preferences->preferences['sentFolder'] != 'none') $userDefinedFunctionFolders['Sent'] = $preferences->preferences['sentFolder']; + if (isset($preferences->preferences['draftFolder']) && + $preferences->preferences['draftFolder'] != 'none') $userDefinedFunctionFolders['Drafts'] = $preferences->preferences['draftFolder']; + if (isset($preferences->preferences['templateFolder']) && + $preferences->preferences['templateFolder'] != 'none') $userDefinedFunctionFolders['Templates'] = $preferences->preferences['templateFolder']; + // create a list of all folders, also the ones which are not subscribed + foreach($_folders as $key => $obj) { + $folderParts = explode($obj->delimiter,$key); + if(is_array($folderParts)) { + $partCount = count($folderParts); + $string = ''; + for($i = 0; $i < $partCount-1; $i++) { + if(!empty($string)) $string .= $obj->delimiter; + $string .= $folderParts[$i]; + if(!$allFolders[$string]) { + $allFolders[$string] = clone($obj); + $allFolders[$string]->folderName = $string; + $allFolders[$string]->shortFolderName = array_pop(explode($obj->delimiter, $string)); + $allFolders[$string]->displayName = $this->encodeFolderName($allFolders[$string]->folderName); + $allFolders[$string]->shortDisplayName = $this->encodeFolderName($allFolders[$string]->shortFolderName); + } + } + } + $allFolders[$key] = $obj; + } + + $folderImageDir = $GLOBALS['egw_info']['server']['webserver_url'].'/phpgwapi/templates/default/images'; + + // careful! "d = new..." MUST be on a new line!!! + $folder_tree_new = ''; + $folder_tree_new .= ""; + + return $folder_tree_new; + } + + function createSignatureTable($_signatureList) + { + $linkData = array + ( + 'menuaction' => 'felamimail.uipreferences.editSignature' + ); + $urlEditSignature = $GLOBALS['egw']->link('/index.php',$linkData); + + if(is_array($_signatureList) && !empty($_signatureList)) { + foreach($_signatureList as $signature) { + $description = ($signature['fm_defaultsignature'] == true) ? $signature['fm_description'] .' ('. lang('default') .')' : $signature['fm_description']; + $tableRows[] = array( + '1' => $signature['fm_signatureid'] != -1 ? html::checkbox('signatureID', false, $signature['fm_signatureid']) : '', + '.1' => 'style="width:30px"', + '2' => ''. @htmlspecialchars($description, ENT_QUOTES, $this->charset) .'', + ); + } + + return html::table($tableRows, 'style="width:100%;"'); + } + + return ''; + } + + function createAccountDataTable($_identities) + { + $linkData = array + ( + 'menuaction' => 'felamimail.uipreferences.editAccountData' + ); + $urlEditAccountData = $GLOBALS['egw']->link('/index.php',$linkData); + + if(is_array($_identities) && !empty($_identities)) { + foreach($_identities as $identity) { + $description = $identity['id'].":".$identity['realName']." ".$identity['organization']." <".$identity['emailAddress'].">"; + $description = ($identity['default'] == true) ? $description .' ('. lang('default') .')' : $description; + $tableRows[] = array( + '1' => $identity['id'] != -1 ? html::checkbox('accountID', false, $identity['id']) : '', + '.1' => 'style="width:30px"', + '2' => ''. @htmlspecialchars($description, ENT_QUOTES, $this->charset) .'', + ); + } + + return html::table($tableRows, 'style="width:100%;"'); + } + + return ''; + } + + // $_folderType 0: normal imap folder 1: sent folder 2: draft folder 3: template folder + // $_rowStyle felamimail or outlook + function messageTable($_headers, $_folderType, $_folderName, $_readInNewWindow, $_rowStyle='felamimail',$messageToBePreviewed=0) + { + //error_log(__METHOD__.' preview Message:'.$messageToBePreviewed); + $this->t = CreateObject('phpgwapi.Template',EGW_APP_TPL); + $this->t->set_file(array("body" => 'mainscreen.tpl')); + $this->t->set_block('body','header_row_felamimail'); + $this->t->set_block('body','header_row_outlook'); + $this->t->set_block('body','message_table'); + $timestamp7DaysAgo = + mktime(date("H"), date("i"), date("s"), date("m"), date("d")-7, date("Y")); + $timestampNow = + mktime(date("H"), date("i"), date("s"), date("m"), date("d"), date("Y")); + $dateToday = date("Y-m-d"); + + + $i=0; + $firstuid = null; + foreach((array)$_headers['header'] as $header) + { + //_debug_array($header); + #if($i<10) {$i++;continue;} + #if($i>20) {continue;} $i++; + // create the listing of subjects + $maxSubjectLength = 60; + $maxAddressLength = 20; + $maxSubjectLengthBold = 50; + $maxAddressLengthBold = 14; + + $flags = ""; + if(!empty($header['recent'])) $flags .= "R"; + if(!empty($header['flagged'])) $flags .= "F"; + if(!empty($header['answered'])) $flags .= "A"; + if(!empty($header['forwarded'])) $flags .= "W"; + if(!empty($header['deleted'])) $flags .= "D"; + if(!empty($header['seen'])) $flags .= "S"; + + $this->t->set_var('row_text', ''); + + // the status icon + if($header['deleted']) { + $this->t->set_var('image_url',html::image('felamimail','kmmsgdel')); + } elseif($header['recent']) { + $this->t->set_var('image_url',html::image('felamimail','kmmsgnew')); + } elseif($header['forwarded']) { + $this->t->set_var('image_url',html::image('felamimail','kmmsgforwarded')); + } elseif($header['answered']) { + $this->t->set_var('image_url',html::image('felamimail','kmmsgreplied')); + } elseif($header['seen']) { + $this->t->set_var('image_url',html::image('felamimail','kmmsgread')); + } else { + $this->t->set_var('image_url',html::image('felamimail','kmmsgunseen')); + } + + // the css for this row + if($header['deleted']) { + $this->t->set_var('row_css_class','header_row_D'); + } elseif($header['recent'] && !$header['seen']) { + $this->t->set_var('row_css_class','header_row_R'); + } elseif($header['flagged']) { + if($header['seen']) { + $this->t->set_var('row_css_class','header_row_FS'); + } else { + $this->t->set_var('row_css_class','header_row_F'); + } + } elseif($header['seen']) { + $this->t->set_var('row_css_class','header_row_S'); + } else { + $this->t->set_var('row_css_class','header_row_'); + } + + // filter out undisplayable characters + $search = array('[\016]','[\017]', + '[\020]','[\021]','[\022]','[\023]','[\024]','[\025]','[\026]','[\027]', + '[\030]','[\031]','[\032]','[\033]','[\034]','[\035]','[\036]','[\037]'); + $replace = ''; + + $header['subject'] = preg_replace($search,$replace,$header['subject']); + $header['subject'] = @htmlspecialchars($header['subject'],ENT_QUOTES,$this->displayCharset); + // curly brackets get messed up by the template! + $header['subject'] = str_replace(array('{','}'),array('{','}'),$header['subject']); + + if (!empty($header['subject'])) { + // make the subject shorter if it is to long + $fullSubject = $header['subject']; + #if(strlen($header['subject']) > $maxSubjectLength) + #{ + # $header['subject'] = substr($header['subject'],0,$maxSubjectLength)."..."; + #} + $this->t->set_var('header_subject', $header['subject']); + #$this->t->set_var('attachments', $header['attachment']); + $this->t->set_var('full_subject', $fullSubject); + } else { + $this->t->set_var('header_subject', @htmlspecialchars('('. lang('no subject') .')', ENT_QUOTES, $this->displayCharset)); + } + + #_debug_array($header); + if($header['mimetype'] == 'multipart/mixed' || + $header['mimetype'] == 'multipart/related' || + substr($header['mimetype'],0,11) == 'application' || + substr($header['mimetype'],0,5) == 'audio') { + $image = html::image('felamimail','attach'); + $this->t->set_var('attachment_image', $image); + } else { + $this->t->set_var('attachment_image', ' '); + } + // show priority flag + if ($header['priority'] < 3) { + $image = html::image('felamimail','prio_high'); + } elseif ($header['priority'] > 3) { + $image = html::image('felamimail','prio_low'); + } else { + $image = ''; + } + $this->t->set_var('prio_image', $image); + + if ($_folderType > 0) { + // sent or drafts or template folder + if (!empty($header['to_name'])) { + $sender_name = $header['to_name']; + $full_address = $header['to_name'].' <'.$header['to_address'].'>'; + } else { + $sender_name = $header['to_address']; + $full_address = $header['to_address']; + } + } else { + if (!empty($header['sender_name'])) { + $sender_name = $header['sender_name']; + $full_address = $header['sender_name'].' <'.$header['sender_address'].'>'; + } else { + $sender_name = $header['sender_address']; + $full_address = $header['sender_address']; + } + } + + $this->t->set_var('sender_name', @htmlspecialchars($sender_name, ENT_QUOTES, $this->charset)); + $this->t->set_var('full_address', @htmlspecialchars($full_address, ENT_QUOTES, $this->charset)); + + $this->t->set_var('message_counter', $i); + $this->t->set_var('message_uid', $header['uid']); + + if ($dateToday == date('Y-m-d', $header['date'])) { + $this->t->set_var('date', $GLOBALS['egw']->common->show_date($header['date'],'H:i:s')); + } else { + $this->t->set_var('date', $GLOBALS['egw']->common->show_date($header['date'],$GLOBALS['egw_info']['user']['preferences']['common']['dateformat'])); + } + $this->t->set_var('datetime', $GLOBALS['egw']->common->show_date($header['date']/*,$GLOBALS['egw_info']['user']['preferences']['common']['dateformat']*/)); + + $this->t->set_var('size', $this->show_readable_size($header['size'])); + if ($firstuid === null) + { + //_debug_array($header); + $firstuid = $selecteduid = $header['uid']; + $firstheader = $header; + } + if ($messageToBePreviewed>0 + && $GLOBALS['egw_info']['user']['preferences']['felamimail']['PreViewFrameHeight']>0 + && $messageToBePreviewed == $header['uid']) + { + //error_log(__METHOD__.$header['uid']); + $selecteduid = $header['uid']; + $firstheader = $header; + } + if($_folderType == 2 || $_folderType == 3) { + $linkData = array ( + 'menuaction' => 'felamimail.uicompose.composeFromDraft', + 'icServer' => 0, + 'folder' => base64_encode($_folderName), + 'uid' => $header['uid'], + 'id' => $header['id'], + ); + $this->t->set_var('url_read_message', $GLOBALS['egw']->link('/index.php',$linkData)); + + $windowName = 'composeFromDraft_'.$header['uid']; + $this->t->set_var('read_message_windowName', $windowName); + $this->t->set_var('preview_message_windowName', $windowName); + } else { + # _debug_array($header); + $linkData = array ( + 'menuaction' => 'felamimail.uidisplay.display', + 'showHeader' => 'false', + 'mailbox' => base64_encode($_folderName), + 'uid' => $header['uid'], + 'id' => $header['id'], + ); + $this->t->set_var('url_read_message', $GLOBALS['egw']->link('/index.php',$linkData)); + + $windowName = ($_readInNewWindow == 1 ? 'displayMessage' : 'displayMessage_'.$header['uid']); + $this->t->set_var('read_message_windowName', $windowName); + + if ($GLOBALS['egw_info']['user']['preferences']['felamimail']['PreViewFrameHeight']>0) $windowName = 'MessagePreview_'.$header['uid'].'_'.$_folderType; + + $this->t->set_var('preview_message_windowName', $windowName); + } + + if($_folderType > 0) { + // sent or draft or template folder + if(!empty($header['to_name'])) { + list($mailbox, $host) = explode('@',$header['to_address']); + $senderAddress = imap_rfc822_write_address($mailbox, + $host, + $header['to_name']); + } else { + $senderAddress = $header['to_address']; + } + } else { + if(!empty($header['sender_name'])) { + list($mailbox, $host) = explode('@',$header['sender_address']); + $senderAddress = imap_rfc822_write_address($mailbox, + $host, + $header['sender_name']); + } else { + $senderAddress = $header['sender_address']; + } + } + + $linkData = array + ( + 'menuaction' => 'felamimail.uicompose.compose', + 'send_to' => base64_encode($senderAddress) + ); + $windowName = 'compose'.$header['uid']; + $this->t->set_var('url_compose',"egw_openWindowCentered('".$GLOBALS['egw']->link('/index.php',$linkData)."','$windowName',700,egw_getWindowOuterHeight());"); + /* + $linkData = array + ( + 'menuaction' => 'addressbook.addressbook_ui.edit', + 'presets[email]' => urlencode($header['sender_address']), + 'presets[n_given]' => urlencode($header['sender_name']), + 'referer' => urlencode($_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING']) + ); + //TODO: url_add_to_addressbook isn't in any of the templates. + //If you want to use it, you need to adopt syntax to the new addressbook (popup) + $this->t->set_var('url_add_to_addressbook',$GLOBALS['egw']->link('/index.php',$linkData)); + */ + $this->t->set_var('msg_icon_sm',$msg_icon_sm); + + $this->t->set_var('phpgw_images',EGW_IMAGES); + + switch($_rowStyle) { + case 'outlook': + $this->t->parse('message_rows','header_row_outlook',True); + break; + default: + $this->t->parse('message_rows','header_row_felamimail',True); + break; + } + } + if ($GLOBALS['egw_info']['user']['preferences']['felamimail']['PreViewFrameHeight']>0) + { + $this->t->set_var('selected_style'.$selecteduid,'style="background-color:#ddddFF;"'); + } else { + $this->t->set_var('selected_style'.$selecteduid,''); + } + + $IFRAMEBody = $this->updateMessagePreview($firstheader,$_folderType,$_folderName); + + $this->t->set_var('IFrameForPreview',$IFRAMEBody); + $this->t->set_var('messagelist_height',($GLOBALS['egw_info']['user']['preferences']['felamimail']['PreViewFrameHeight']>0 ? ($GLOBALS['egw_info']['user']['preferences']['felamimail']['PreViewFrameHeight']).'px':'auto')); + + $this->t->parse("out","message_table"); + + return $this->t->get('out','message_table'); + } + + function updateMessagePreview($headerData,$_folderType,$_folderName,$_icServer=0) + { + // IFrame for Preview .... + if ($headerData['uid'] && $GLOBALS['egw_info']['user']['preferences']['felamimail']['PreViewFrameHeight']>0) + { + $jscall =''; + $this->bofelamimail->openConnection($_icServer); + $this->bofelamimail->reopen($_folderName); + $flags = $this->bofelamimail->getFlags($headerData['uid']); + if ($this->bofelamimail->getNotifyFlags($headerData['uid']) === null) + { + $headers = $this->bofelamimail->getMessageHeader($headerData['uid']); + if ( isset($headers['DISPOSITION-NOTIFICATION-TO']) ) { + $sent_not = $this->bofelamimail->decode_header(trim($headers['DISPOSITION-NOTIFICATION-TO'])); + } else if ( isset($headers['RETURN-RECEIPT-TO']) ) { + $sent_not = $this->bofelamimail->decode_header(trim($headers['RETURN-RECEIPT-TO'])); + } else if ( isset($headers['X-CONFIRM-READING-TO']) ) { + $sent_not = $this->bofelamimail->decode_header(trim($headers['X-CONFIRM-READING-TO'])); + } else $sent_not = ""; + if ( $sent_not != "" && strpos( array2string($flags),'Seen')===false) + { + $jscall= " onload='javascript:sendNotifyMS(".$headerData['uid'].")'"; + } + } + //if (strpos( array2string($flags),'Seen')===false) $this->bofelamimail->flagMessages('read', $headerData['uid']); + if ($_folderType > 0) { + // sent or drafts or template folder + if (!empty($headerData['to_name'])) { + $sender_name = $headerData['to_name']; + $sender_address = $headerData['to_address']; + $full_address = $headerData['to_name'].' <'.$headerData['to_address'].'>'; + } else { + $sender_name = $headerData['to_address']; + $sender_address = $headerData['to_address']; + $full_address = $headerData['to_address']; + } + } else { + if (!empty($headerData['sender_name'])) { + $sender_name = $headerData['sender_name']; + $sender_address = $headerData['sender_address']; + $full_address = $headerData['sender_name'].' <'.$headerData['sender_address'].'>'; + } else { + $sender_name = $headerData['sender_address']; + $sender_address = $headerData['sender_address']; + $full_address = $headerData['sender_address']; + } + } + //$fromAddress = uidisplay::emailAddressToHTML(array('PERSONAL_NAME'=>$sender_name,'EMAIL'=>$sender_address,'RFC822_EMAIL'=>$full_address),''); + if ($GLOBALS['egw_info']['user']['apps']['addressbook']) { + $addresslinkData = array ( + 'menuaction' => 'addressbook.addressbook_ui.edit', + 'presets[email]' => $sender_address, + 'referer' => $_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'] + ); + $decodedPersonalName = $sender_name; + if (!empty($decodedPersonalName)) { + if($spacePos = strrpos($decodedPersonalName, ' ')) { + $addresslinkData['presets[n_family]'] = substr($decodedPersonalName, $spacePos+1); + $addresslinkData['presets[n_given]'] = substr($decodedPersonalName, 0, $spacePos); + } else { + $addresslinkData['presets[n_family]'] = $decodedPersonalName; + } + $addresslinkData['presets[n_fn]'] = $decodedPersonalName; + } + + $urlAddToAddressbook = $GLOBALS['egw']->link('/index.php',$addresslinkData); + $onClick = "window.open(this,this.target,'dependent=yes,width=850,height=440,location=no,menubar=no,toolbar=no,scrollbars=yes,status=yes'); return false;"; + $image = $GLOBALS['egw']->common->image('felamimail','sm_envelope'); + $fromAddress .= sprintf(' + %s', + $urlAddToAddressbook, + $onClick, + $image, + lang('add to addressbook'), + lang('add to addressbook')); + } + + $linkData = array ( + 'menuaction' => 'felamimail.uidisplay.display', + 'showHeader' => 'false', + 'mailbox' => base64_encode($_folderName), + 'uid' => $headerData['uid'], + 'id' => $headerData['id'], + ); + $linkDataAttachments = array ( + 'menuaction' => 'felamimail.uidisplay.displayAttachments', + 'showHeader' => 'false', + 'mailbox' => base64_encode($_folderName), + 'uid' => $headerData['uid'], + 'id' => $headerData['id'], + ); + $windowName = 'displayMessage_'.$headerData['uid']; + if($headerData['mimetype'] == 'multipart/mixed' || + $headerData['mimetype'] == 'multipart/related' || + substr($headerData['mimetype'],0,11) == 'application' || + substr($headerData['mimetype'],0,5) == 'audio') { + $image = html::image('felamimail','attach'); + + $image = "link('/index.php',$linkDataAttachments)."', '".$windowName."', this); return false;\" + title=\"".$headerData['subject']."\">".$image.""; + + $windowName = ($_readInNewWindow == 1 ? 'displayMessage' : 'displayMessage_'.$header['uid']); + } else { + $image = ''; + } + $subject = "link('/index.php',$linkData)."', '".$windowName."', this); return false;\" + title=\"".$headerData['subject']."\">".$headerData['subject'].""; + $IFrameHeight = $GLOBALS['egw_info']['user']['preferences']['felamimail']['PreViewFrameHeight']; + $linkData = array ( + 'menuaction' => 'felamimail.uidisplay.displayBody', + 'uid' => $headerData['uid'], + 'mailbox' => base64_encode($_folderName) + ); + + //_debug_array($GLOBALS['egw']->link('/index.php',$linkData)); + $IFRAMEBody = " + + + + + + + + +
    + ".($_folderType > 0?lang('to'):lang('from')).':'.$full_address.' '.($fromAddress?$fromAddress:'') .'
    '. + lang('date').':'.$GLOBALS['egw']->common->show_date($headerData['date']/*,$GLOBALS['egw_info']['user']['preferences']['common']['dateformat']*/)."
    + ".lang('subject').":".$subject." +
    + $image + + + ".$this->navbarSeparator().$this->displayMessageActions($headerData, $_folderName, $_icServer,true)." + +
    + +
    "; + } + else + { + $IFRAMEBody = " "; + } + return $IFRAMEBody; + } + + function displayMessageActions($_headerData, $_folderName, $_icServer, $_forceNewWindow=false) + { + if ($_forceNewWindow) + { + list($fm_width,$fm_height) = explode('x',egw_link::get_registry('felamimail','view_popup')); + } + // navbar start + // compose as new URL + $linkData = array ( + 'menuaction' => 'felamimail.uicompose.composeAsNew', + 'icServer' => $_icServer, + 'folder' => base64_encode($_folderName), + 'reply_id' => $_headerData['uid'], + ); + if($_headerData['partid'] != '') { + $linkData['part_id'] = $_headerData['partid']; + } + $asnewURL = $GLOBALS['egw']->link('/index.php',$linkData); + + // reply url + $linkData = array ( + 'menuaction' => 'felamimail.uicompose.reply', + 'icServer' => $_icServer, + 'folder' => base64_encode($_folderName), + 'reply_id' => $_headerData['uid'], + ); + if($_headerData['partid'] != '') { + $linkData['part_id'] = $_headerData['partid']; + } + $replyURL = $GLOBALS['egw']->link('/index.php',$linkData); + + // reply all url + $linkData = array ( + 'menuaction' => 'felamimail.uicompose.replyAll', + 'icServer' => $_icServer, + 'folder' => base64_encode($_folderName), + 'reply_id' => $_headerData['uid'], + ); + if($_headerData['partid'] != '') { + $linkData['part_id'] = $_headerData['partid']; + } + $replyAllURL = $GLOBALS['egw']->link('/index.php',$linkData); + + // forward url + $linkData = array ( + 'menuaction' => 'felamimail.uicompose.forward', + 'reply_id' => $_headerData['uid'], + 'folder' => base64_encode($_folderName), + ); + if($_headerData['partid'] != '') { + $linkData['part_id'] = $_headerData['partid']; + } + $forwardURL = $GLOBALS['egw']->link('/index.php',$linkData); + + //delete url + $linkData = array ( + 'menuaction' => 'felamimail.uifelamimail.deleteMessage', + 'icServer' => $_icServer, + 'folder' => base64_encode($_folderName), + 'message' => $_headerData['uid'], + ); + $deleteURL = $GLOBALS['egw']->link('/index.php',$linkData); + + $navbarImages = array( + 'new' => array( + 'action' => ($_forceNewWindow ? "egw_openWindowCentered('$asnewURL','composeasnew_".$_headerData['uid']."',".$fm_width.",".$fm_height.");": "window.location.href = '$asnewURL'"), + 'tooltip' => lang('compose as new'), + ), + 'mail_reply' => array( + 'action' => ($_forceNewWindow ? "egw_openWindowCentered('$replyURL','reply_".$_headerData['uid']."',".$fm_width.",".$fm_height.");": "window.location.href = '$replyURL'"), + 'tooltip' => lang('reply'), + ), + 'mail_replyall' => array( + 'action' => ($_forceNewWindow ? "egw_openWindowCentered('$replyAllURL','replyAll_".$_headerData['uid']."',".$fm_width.",".$fm_height.");": "window.location.href = '$replyAllURL'"), + 'tooltip' => lang('reply all'), + ), + 'mail_forward' => array( + 'action' => ($_forceNewWindow ? "egw_openWindowCentered('$forwardURL','forward_".$_headerData['uid']."',".$fm_width.",".$fm_height.");": "window.location.href = '$forwardURL'"), + 'tooltip' => lang('forward'), + ), + 'delete' => array( + 'action' => ($_forceNewWindow ? "window.open('$deleteURL','_blank','dependent=yes,width=100,height=100,toolbar=no,scrollbars=no,status=no')": "window.location.href = '$deleteURL'"), + 'tooltip' => lang('delete'), + ), + ); + foreach($navbarImages as $buttonName => $buttonInfo) { + $navbarButtons .= $this->navbarButton($buttonName, $buttonInfo['action'], $buttonInfo['tooltip']); + } + $navbarButtons .= $this->navbarSeparator(); + + // print url + $linkData = array ( + 'menuaction' => 'felamimail.uidisplay.printMessage', + 'uid' => $_headerData['uid'], + 'folder' => base64_encode($_folderName), + ); + if($_headerData['partid'] != '') { + $linkData['part'] = $_headerData['partid']; + } + $printURL = $GLOBALS['egw']->link('/index.php',$linkData); + + // infolog URL + $linkData = array( + 'menuaction' => 'infolog.infolog_ui.import_mail', + 'uid' => $_headerData['uid'], + 'mailbox' => base64_encode($_folderName) + ); + if($_headerData['partid'] != '') { + $linkData['part'] = $_headerData['partid']; + } + $to_infologURL = $GLOBALS['egw']->link('/index.php',$linkData); + + // viewheader url + $linkData = array ( + 'menuaction' => 'felamimail.uidisplay.displayHeader', + 'uid' => $_headerData['uid'], + 'mailbox' => base64_encode($_folderName) + ); + if($_headerData['partid'] != '') { + $linkData['part'] = $_headerData['partid']; + } + $viewHeaderURL = $GLOBALS['egw']->link('/index.php',$linkData); + + $navbarImages = array(); + + // save message url + $linkData = array ( + 'menuaction' => 'felamimail.uidisplay.saveMessage', + 'uid' => $_headerData['uid'], + 'mailbox' => base64_encode($_folderName) + ); + if($_headerData['partid'] != '') { + $linkData['part'] = $_headerData['partid']; + } + $saveMessageURL = $GLOBALS['egw']->link('/index.php',$linkData); + + $navbarImages = array(); + + //print email + $navbarImages = array( + 'fileprint' => array( + 'action' => ($_forceNewWindow ? "egw_openWindowCentered('$printURL','forward_".$_headerData['uid']."',".$fm_width.",".$fm_height.");": "window.location.href = '$printURL'"), + 'tooltip' => lang('print it'), + ), + ); + if ($GLOBALS['egw_info']['user']['apps']['infolog']) + { + list($i_width,$i_height) = explode('x',egw_link::get_registry('infolog','add_popup')); + $navbarImages['to_infolog'] = array( + 'action' => "window.open('$to_infologURL','_blank','dependent=yes,width=".$i_width.",height=".$i_height.",scrollbars=yes,status=yes')", + 'tooltip' => lang('save as infolog')); + } + + // save email as + $navbarImages['fileexport'] = array( + 'action' => ($_forceNewWindow ? "window.open('$saveMessageURL','_blank','dependent=yes,width=100,height=100,scrollbars=yes,status=yes')": "window.location.href = '$saveMessageURL'"), + 'tooltip' => lang('save message to disk'), + ); + + // view header lines + $navbarImages['kmmsgread'] = array( + 'action' => "fm_displayHeaderLines('$viewHeaderURL')", + 'tooltip' => lang('view header lines'), + ); + + foreach($navbarImages as $buttonName => $buttonData) { + $navbarButtons .= $this->navbarButton($buttonName, $buttonData['action'], $buttonData['tooltip']); + } + return $navbarButtons; + } + + /** + * create multiselectbox + * + * this function will create a multiselect box. Hard to describe! :) + * + * @param _selectedValues Array of values for already selected values(the left selectbox) + * @param _predefinedValues Array of values for predefined values(the right selectbox) + * @param _valueName name for the variable containing the selected values + * @param _boxWidth the width of the multiselectbox( example: 100px, 100%) + * + * @returns the html code, to be added into the template + */ + function multiSelectBox($_selectedValues, $_predefinedValues, $_valueName, $_boxWidth="100%") + { + $this->template->set_block('body','multiSelectBox'); + + if(is_array($_selectedValues)) + { + foreach($_selectedValues as $key => $value) + { + $options .= ""; + } + $this->template->set_var('multiSelectBox_selected_options',$options); + } + + $options = ''; + if(is_array($_predefinedValues)) + { + foreach($_predefinedValues as $key => $value) + { + if($key != $_selectedValues["$key"]) + $options .= ""; + } + $this->template->set_var('multiSelectBox_predefinded_options',$options); + } + + $this->template->set_var('multiSelectBox_valueName', $_valueName); + $this->template->set_var('multiSelectBox_boxWidth', $_boxWidth); + + + return $this->template->fp('out','multiSelectBox'); + } + + function navbarButton($_imageName, $_imageAction, $_toolTip='', $_float='left') + { + $image = $GLOBALS['egw']->common->image('felamimail',$_imageName); + $float = $_float == 'right' ? 'right' : 'left'; + + return ""; + } + + function navbarSeparator() + { + return ''; + } + + /* Returns a string showing the size of the message/attachment */ + function show_readable_size($bytes, $_mode='short') + { + $bytes /= 1024; + $type = 'k'; + + if ($bytes / 1024 > 1) + { + $bytes /= 1024; + $type = 'M'; + } + + if ($bytes < 10) + { + $bytes *= 10; + settype($bytes, 'integer'); + $bytes /= 10; + } + else + settype($bytes, 'integer'); + + return $bytes . ' ' . $type ; + } + + function tableView($_headValues, $_tableWidth="100%") + { + $this->template->set_block('body','tableView'); + $this->template->set_block('body','tableViewHead'); + + if(is_array($_headValues)) + { + foreach($_headValues as $head) + { + $this->template->set_var('tableHeadContent',$head); + $this->template->parse('tableView_Head','tableViewHead',True); + } + } + + if(is_array($this->tableViewRows)) + { + foreach($this->tableViewRows as $tableRow) + { + $rowData .= ""; + foreach($tableRow as $tableData) + { + switch($tableData['type']) + { + default: + $rowData .= ''.$tableData['text'].''; + break; + } + } + $rowData .= ""; + } + } + + $this->template->set_var('tableView_width', $_tableWidth); + $this->template->set_var('tableView_Rows', $rowData); + + return $this->template->fp('out','tableView'); + } + + function tableViewAddRow() + { + $this->tableViewRows[] = array(); + end($this->tableViewRows); + return key($this->tableViewRows); + } + + function tableViewAddTextCell($_rowID,$_text) + { + $this->tableViewRows[$_rowID][]= array + ( + 'type' => 'text', + 'text' => $_text + ); + } + + function quotaDisplay($_usage, $_limit) + { + $this->t = CreateObject('phpgwapi.Template',EGW_APP_TPL); + $this->t->set_file(array("body" => 'mainscreen.tpl')); + $this->t->set_block('body','quota_block'); + + if($_limit == 0) { + $quotaPercent=100; + } else { + $quotaPercent=round(($_usage*100)/$_limit); + } + + $quotaLimit=$this->show_readable_size($_limit*1024); + $quotaUsage=$this->show_readable_size($_usage*1024); + + $this->t->set_var('leftWidth',$quotaPercent); + + if($quotaPercent > 90 && $_limit>0) { + $this->t->set_var('quotaBG','red'); + } elseif($quotaPercent > 80 && $_limit>0) { + $this->t->set_var('quotaBG','yellow'); + } else { + $this->t->set_var('quotaBG','#66ff66'); + } + + if($_limit > 0) { + $quotaText = $quotaUsage .'/'.$quotaLimit; + } else { + $quotaText = $quotaUsage; + } + + if($quotaPercent > 50) { + $this->t->set_var('quotaUsage_left', $quotaText); + $this->t->set_var('quotaUsage_right',''); + } else { + $this->t->set_var('quotaUsage_left',''); + $this->t->set_var('quotaUsage_right', $quotaText); + } + + $this->t->parse('out','quota_block'); + return $this->t->get('out','quota_block'); + } + } +?> diff --git a/felamimail/inc/hook_home.inc.php b/felamimail/inc/hook_home.inc.php new file mode 100644 index 0000000000..c16afea119 --- /dev/null +++ b/felamimail/inc/hook_home.inc.php @@ -0,0 +1,131 @@ + 0) { + $d1 = strtolower(substr(EGW_APP_INC,0,3)); + if($d1 == 'htt' || $d1 == 'ftp' ) { + echo 'Failed attempt to break in via an old Security Hole!
    '."\n"; + $GLOBALS['egw']->common->egw_exit(); + } + unset($d1); + + $tmp_app_inc = $GLOBALS['egw']->common->get_inc_dir('felamimail'); + + $GLOBALS['egw']->translation->add_app('felamimail'); + + $title = lang('felamimail'); + + $portalbox =& CreateObject('phpgwapi.listbox', + Array( + 'title' => $title, + 'primary' => $GLOBALS['egw_info']['theme']['navbar_bg'], + 'secondary' => $GLOBALS['egw_info']['theme']['navbar_bg'], + 'tertiary' => $GLOBALS['egw_info']['theme']['navbar_bg'], + 'width' => '100%', + 'outerborderwidth' => '0', + 'header_background_image' => $GLOBALS['egw']->common->image('phpgwapi/templates/phpgw_website','bg_filler.gif') + ) + ); + + $app_id = $GLOBALS['egw']->applications->name2id('felamimail'); + $var = Array( + 'up' => Array('url' => '/set_box.php', 'app' => $app_id), + 'down' => Array('url' => '/set_box.php', 'app' => $app_id), + 'close' => Array('url' => '/set_box.php', 'app' => $app_id), + 'question' => Array('url' => '/set_box.php', 'app' => $app_id), + 'edit' => Array('url' => '/set_box.php', 'app' => $app_id) + ); + + while(list($key,$value) = each($var)) { + $portalbox->set_controls($key,$value); + } + + $portalbox->data = Array(); + + if($data) { + $portalbox->data = $data; + } + + $this->displayCharset = $GLOBALS['egw']->translation->charset(); + $this->bofelamimail =& CreateObject('felamimail.bofelamimail',$this->displayCharset); + + if(!$this->bofelamimail->openConnection()) { + $extra_data = lang("can't connect to INBOX!!"); + } else { + // it may be cheaper to fetch the folderstatus per folder which is to be displayed, as for all folders + $folderList = $this->bofelamimail->getFolderObjects(true, false); + #_debug_array($folderList); + $extra_data = ' + + + + + '; + $showFolders = array(); + if (!empty($this->bofelamimail->mailPreferences->preferences['mainscreen_showfolders'])) $showFolders = explode(',',$this->bofelamimail->mailPreferences->preferences['mainscreen_showfolders']); + foreach($folderList as $key => $value) { + #echo count($showFolders).'-'.in_array($key, $showFolders).'#
    '; + #_debug_array($value); + if (count($showFolders) == 0 || (count($showFolders)>0 && in_array($key, $showFolders))) { + unset($messages); + unset($unseen); + unset($recent); + /* + if(is_object($value->counter)) { + $messages = $value->counter->messages; + $unseen = $value->counter->unseen; + $recent = $value->counter->recent; + } + */ + // as usually not all subscribed folders are shown in home, it occurrs to speed up things, to fetch + $folderStatus = $this->bofelamimail->getMailBoxCounters($key); + #echo "
    FolderStatus:";_debug_array($folderStatus); + if($folderStatus !== false) { + $messages = $folderStatus->messages; + $unseen = $folderStatus->unseen; + $recent = $folderStatus->recent; + } + + if($recent > 0) { + $newMessages = "$unseen($recent)"; + } else { + $newMessages = "$unseen"; + } + + + $linkData = array + ( + 'menuaction' => 'felamimail.uifelamimail.changeFolder', + 'mailbox' => urlencode($key) + ); + $folderLink = $GLOBALS['egw']->link('/index.php',$linkData); + + $extra_data .= ""; + } + } + $extra_data .= '
    + '.lang('foldername').' + + '.lang('total').' + + '.lang('unseen').' +
    $value->displayName$messages$newMessages
    '; + } + + // output the portalbox and below it (1) the folders listbox (if applicable) and (2) Compose New mail link + echo "\r\n".''."\r\n" + .$portalbox->draw($extra_data) + .''."\r\n"; + } +?> diff --git a/felamimail/inc/hook_notifywindow.inc.php b/felamimail/inc/hook_notifywindow.inc.php new file mode 100644 index 0000000000..ba60999ecb --- /dev/null +++ b/felamimail/inc/hook_notifywindow.inc.php @@ -0,0 +1,13 @@ + 'preferences')); \ No newline at end of file diff --git a/felamimail/index.php b/felamimail/index.php new file mode 100644 index 0000000000..5984a15b81 --- /dev/null +++ b/felamimail/index.php @@ -0,0 +1,16 @@ +0) updateTitle(titletext); +} + +function addEmail(to,email) +{ + //alert(to+': '+email); + + var tableBody = document.getElementById('addressRows'); + var tableRows = tableBody.getElementsByTagName('tr'); + + var lastRow = tableRows[tableRows.length-1]; + var inputElements = lastRow.getElementsByTagName('input'); + + // look for empty fields above to fill in + for(rowCounter = tableRows.length-1; rowCounter > 0; rowCounter--) + { + var rowBefore = tableRows[rowCounter-1]; + var inputBefore = rowBefore.getElementsByTagName('input'); + if(inputBefore[0].value == '') + { + lastRow = rowBefore; + inputElements = inputBefore; + } + else + { + continue; + } + + } + + if (inputElements[0].value != '') // last row not empty --> create new + { + addAddressRow(lastRow); + lastRow = tableRows[tableRows.length-1]; + inputElements = lastRow.getElementsByTagName('input'); + } + // fill with email and set selectbox + inputElements[0].value = email; + var selectElements = lastRow.getElementsByTagName('select'); + selectElements[0].selectedIndex = to == 'cc' ? 1 : (to == 'bcc' ? 2 : 0); + + // add a new empty last row if there is no empty one at all + lastRow = tableRows[tableRows.length-1]; + inputElements = lastRow.getElementsByTagName('input'); + if (inputElements[0].value != '') + { + addAddressRow(lastRow); + } +} + +function addAddressRow(_tableRow) +{ + // the table body + var tableBody = _tableRow.parentNode; + + // all table rows + var tableRows = tableBody.getElementsByTagName('tr'); + + + var newTableRow = _tableRow.cloneNode(true); + var inputElements = newTableRow.getElementsByTagName('input'); + var spanElements = newTableRow.getElementsByTagName('span'); + var tdElements = newTableRow.getElementsByTagName('td'); + + //alert(inputElements.length); + inputElements[0].value = ''; + inputElements[0].disabled = false; + inputElements[0].style.width = '99%'; + for(i=0; i 4) { + neededHeight = singleRowHeight*4; + } else { + neededHeight = singleRowHeight*tableRows.length; + } + + document.getElementById('addressDIV').style.height = neededHeight+'px'; + document.getElementById('addressDIV').scrollTop = document.getElementById('addressTable').clientHeight; +} + +function fm_compose_addAttachmentRow(_tableRow) +{ + // the table body + var tableBody = _tableRow.parentNode; + + // all table rows + var tableRows = tableBody.getElementsByTagName('tr'); + + + var newTableRow = _tableRow.cloneNode(true); + var inputElements = newTableRow.getElementsByTagName('input'); + + //alert(inputElements.length); +// inputElements[0].value = ''; + + if(tableRows.length < 5) { + tableBody.appendChild(newTableRow); + } + +// inputElements[0].focus(); + + singleRowHeight = _tableRow.clientHeight; + if(tableRows.length > 4) { + neededHeight = singleRowHeight*4; + } else { + neededHeight = singleRowHeight*tableRows.length; + } + + //document.getElementById('addressDIV').style.height = neededHeight+'px'; + //document.getElementById('addressDIV').scrollTop = document.getElementById('addressTable').clientHeight; +} + +function deleteTableRow(_imageObject) +{ + // the table body + tableBody = document.getElementById('addressRows'); + + // all table rows + tableRows = tableBody.getElementsByTagName('tr'); + + if(tableRows.length > 4) { + + // the row where the clicked image is located + tableRow = _imageObject.parentNode.parentNode; + + // the table body + tableBody = document.getElementById('addressRows'); + tableBody.removeChild(tableRow); + + singleRowHeight = tableRows[0].clientHeight; + if(tableRows.length > 4) { + neededHeight = singleRowHeight*4; + } else { + neededHeight = singleRowHeight*tableRows.length; + } + + document.getElementById('addressDIV').style.height = neededHeight+'px'; + } else { + // the row where the clicked image is located + tableRow = _imageObject.parentNode.parentNode; + + var inputElements = tableRow.getElementsByTagName('input'); + inputElements[0].value = ''; + + } +} + +function getPosLeft(_node) { + var left=0; + + if(_node.offsetParent) { + while (_node.offsetParent) + { + left += _node.offsetLeft; + _node = _node.offsetParent; + } + } else if (_node.x) { + left += _node.x; + } + + return left; +} + +function getPosTop(_node) { + var top=0; + + if(_node.offsetParent) { + while (_node.offsetParent) { + top += _node.offsetTop; + if(_node.parentNode.scrollTop) { + top -= _node.parentNode.scrollTop + } + _node = _node.offsetParent; + } + } else if (_node.y) { + left += _node.y; + } + + return top; +} + +function hideResultBox() { + var resultBox; + + resultBox = document.getElementById('resultBox'); + resultBox.className = 'resultBoxHidden'; + + //document.title='Search finnished'; + + resultboxVisible=false; +} + +function initResultBox(_inputField) { + //var resultBox; + + currentInputField = _inputField; + //document.title = resultRows.length; + //document.title = "TEST"; + //resultBox = document.getElementById("resultBox"); + + startCapturingEvents(keypressed); +} + +function displayResultBox() { + var top=0; + var left=0; + var width=0; + + var resultBox; + + //document.title='Search finnished'; + selectedSuggestion = -1; + + + resultBox = document.getElementById('resultBox'); + if(searchActive) { + top = getPosTop(currentInputField) + currentInputField.offsetHeight; + left = getPosLeft(currentInputField); + width = currentInputField.clientWidth; + + resultBox.style.top=top + 'px'; + resultBox.style.left=left + 'px'; + resultBox.style.width=width + 'px'; + + resultBox.className = 'resultBoxVisible'; + } + + resultRows = resultBox.getElementsByTagName('div'); + + resultboxVisible=true; +} + +function startCapturingEvents(_callback) { + document.onkeydown = keyDown; + + keyDownCallback=_callback; + // nur fuer NS4 + //if (document.layers) { + // document.captureEvents(Event.KEYPRESS); + //} +} + +function stopCapturingEvents() { + document.onkeydown = null; + delete currentKeyCode; + hideResultBox(); +} + +function keypressed(keycode, keyvalue) { + if(liveSearchTimer) { + window.clearTimeout(liveSearchTimer); + } + + //_pressed = new Date().getTime(); + + switch (keycode) { + // case KEYCODE_LEFT: + case KEYCODE_UP: + if(selectedSuggestion > 0) { + selectSuggestion(selectedSuggestion-1); + } else { + selectSuggestion(resultRows.length-1); + } + break; + + // case KEYCODE_RIGHT: + case KEYCODE_DOWN: + //document.title='down '+selectedSuggestion; + //if(selectedSuggestion) { + if(resultboxVisible) { + //document.title='is selected'; + if(selectedSuggestion < resultRows.length-1) { + selectSuggestion(selectedSuggestion+1); + } else { + selectSuggestion(0); + } + } + break; + + case KEYCODE_ENTER: + if(resultboxVisible) { + currentInputField.value = results[selectedSuggestion]; + hideResultBox(); + } + focusToNextInputField(); + searchActive=false; + break; + + case KEYCODE_ESC: + hideResultBox(); + break; + + case KEYCODE_TAB: + if(resultboxVisible) { + if( selectedSuggestion < resultRows.length-1) { + selectSuggestion(selectedSuggestion+1); + } else { + selectSuggestion(0); + } + } else { + rv = focusToNextInputField(); + if (rv == 'fm_compose_subject') + { + currentKeyCode = 13; + //alert(currentKeyCode); + } + } + break; + + + case KEYCODE_ALT: + case KEYCODE_SHIFT: + break; + + default: + //_setValue(-1); + liveSearchTimer = window.setTimeout('startLiveSearch()', keyboardTimeout); + if(!currentInputField.parentNode.parentNode.nextSibling) { + addAddressRow(currentInputField.parentNode.parentNode); + } + hideResultBox(); + } +} + +function keyDown(e) { + var pressedKeyID = document.all ? window.event.keyCode : e.which; + var pressedKey = String.fromCharCode(pressedKeyID).toLowerCase(); + + currentKeyCode=pressedKeyID; + if(keyDownCallback!=null) { + keyDownCallback(pressedKeyID, pressedKey); + } +} + +function startLiveSearch() { + if(currentInputField.value.length > 2) { + fm_blink_currentInputField(); + searchActive=true; + //document.title='Search started'; + xajax_doXMLHTTP("felamimail.ajax_contacts.searchAddress",currentInputField.value); + } +} + +function selectSuggestion(_selectedSuggestion) { + selectedSuggestion = _selectedSuggestion; + for(i=0; i30) { + _text = _text.substring(0,30) + '...'; + } + + document.title = _text; +} + +function focusToNextInputField() { + var nextRow; + + if(nextRow = currentInputField.parentNode.parentNode.nextSibling) { + if(nextRow.nodeType == 3) { + inputElements = nextRow.nextSibling.getElementsByTagName('input'); + inputElements[0].focus(); + } else { + inputElements = nextRow.getElementsByTagName('input'); + inputElements[0].focus(); + } + return 'addressinput'; + } else { + document.getElementById('fm_compose_subject').focus(); + //document.doit.fm_compose_subject.focus(); + return 'fm_compose_subject'; + } +} + +function focusToPrevInputField() { + var prevRow; + + if(prevRow = currentInputField.parentNode.parentNode.previousSibling) { + if(prevRow.nodeType == 3) { + inputElements = prevRow.previousSibling.getElementsByTagName('input'); + inputElements[0].focus(); + } else { + inputElements = prevRow.getElementsByTagName('input'); + inputElements[0].focus(); + } + } else { + document.getElementById('fm_compose_subject').focus(); + //document.doit.fm_compose_subject.focus(); + } +} + +function keyDownSubject(keycode, keyvalue) { +} + +function startCaptureEventSubjects(_inputField) { + _inputField.onkeydown = keyDown; + + keyDownCallback = keyDownSubject; +} + +function fm_compose_selectFolder() { + egw_openWindowCentered(folderSelectURL,'fm_compose_selectFolder','350','500',window.outerWidth/2,window.outerHeight/2); +} + +function OnLoadingStart(_nodeID) { + return true; +} + +function onNodeSelect(_folderName) { + opener.fm_compose_setFolderSelectValue(_folderName); + self.close(); +} + +function fm_compose_changeInputType(_selectBox) { + var selectBoxRow = _selectBox.parentNode.parentNode; + var inputElements = selectBoxRow.getElementsByTagName('input'); + var spanElements = selectBoxRow.getElementsByTagName('span'); + var tdElements = selectBoxRow.getElementsByTagName('td'); + + if(_selectBox.value == 'folder') { + inputElements[0].value = ''; + for(i=0; i"; + plaineditor.value= ''; + xajax_doXMLHTTP("felamimail.ajaxfelamimail.toggleEditor", composeID, existingAscii, 'simple'); + + htmlFlag.value = "1"; + mimeType.value = "html"; + } + else + { + //Copy the current HTML data and recode it via a XAJAX request + var existingHtml = ckeditor.getData(); + var ckeditor_span = document.getElementById('cke_body'); + ckeditor.setData(''); + //Hide the old editor + ckeditor_span.style.display = "none"; + // we need to destroy the ckeditor, as the/a submit is using the content of the ckeditor instance for content of body + ckeditor.destroy(); + + xajax_doXMLHTTP("felamimail.ajaxfelamimail.toggleEditor", composeID, existingHtml, 'ascii'); + + htmlFlag.value = "0"; + mimeType.value = "text"; + + setupPlainEditor(plaineditor, editorArea.style.height); + } + + showAjaxLoader(editorArea); +} + +function setupPlainEditor(plaineditor, height) +{ + if (plaineditor) + { + //Do some presets on the new editor + plaineditor.style.width = "99%"; + plaineditor.style.borderWidth = 0; + plaineditor.style.height = height; + plaineditor.style.borderWidth = "1px"; + plaineditor.style.borderStyle = "solid"; + plaineditor.style.borderColor = "gray"; + plaineditor.style.margin = "1px"; + plaineditor.value = ''; + } +} + +function showAjaxLoader(elem) +{ + if (elem) + { + elem.style.display = "block"; + elem.style.backgroundImage = "url(phpgwapi/templates/default/images/ajax-loader.gif)"; + elem.style.backgroundRepeat = "no-repeat"; + elem.style.backgroundPosition = "center"; + } +} + +function hideAjaxLoader(elem) +{ + if (elem) + { + elem.style.display = "inline"; + elem.style.backgroundImage = ""; + } +} + +function showPlainEditor(_content) +{ + var plaineditor = document.getElementsByName('body')[0]; + + //Toggle the plain editor visiblity + plaineditor.style.visibility = "visible"; + plaineditor.style.display = "block"; + + plaineditor.value = _content; + + hideAjaxLoader(document.getElementById('editorArea')); +} + +function showHTMLEditor(_content) +{ + var ckeditor = CKEDITOR.instances['body']; + var ckeditor_span = document.getElementById('cke_body'); + + //Set the new content + ckeditor.setData(_content); + + //Toggle the plain editor visiblity + ckeditor_span.style.display = 'block'; + + hideAjaxLoader(document.getElementById('editorArea')); +} + + +function removeFCK(fieldId) +{ +/* var configElement = document.getElementById(fieldId+'___Config'); + var frameElement = document.getElementById(fieldId+'___Frame');*/ + //var textarea = document.forms[this].elements[fieldId]; + var editor = CKEDITOR.instances[fieldId]; + + //if (editor!=null && configElement && frameElement && configElement.parentNode==textarea.parentNode && frameElement.parentNode==textarea.parentNode && document.removeChild) + if (editor!=null/* && configElement && frameElement && document.removeChild*/) + { +/* editor.UpdateLinkedField(); + configElement.parentNode.removeChild(configElement); + frameElement.parentNode.removeChild(frameElement); + //textarea.style.display = ''; + delete FCKeditorAPI.Instances[fieldId]; + delete editor;*/ + editor.destroy(false); +// delete editor; + } + +} + +function changeIdentity(SelectedId) +{ + //alert(SelectedId.value); + xajax_doXMLHTTP("felamimail.ajaxfelamimail.setComposeSignature", SelectedId.value); +} +function setSignature(SelectedId) +{ + for (i = 0; i < document.doit.signatureID.length; ++i) + if (document.doit.signatureID.options[i].value == SelectedId) + document.doit.signatureID.options[i].selected = true; + //else + // document.doit.signatureID.options[i].selected = false; +} diff --git a/felamimail/js/jscode/compose_message.js b/felamimail/js/jscode/compose_message.js new file mode 100644 index 0000000000..a6745d89e5 --- /dev/null +++ b/felamimail/js/jscode/compose_message.js @@ -0,0 +1,10 @@ +var tab = new Tabs(3,'activetab','inactivetab','tab','tabcontent','','','tabpage'); +// var smtp = new Tabs(2,'activetab','inactivetab','smtp','smtpcontent','smtpselector','','smtppage'); +// var imap = new Tabs(3,'activetab','inactivetab','imap','imapcontent','imapselector','','imappage'); + +function initAll() +{ + tab.init(); +// smtp.init(); +// imap.init(); +} diff --git a/felamimail/js/jscode/editAccountData.js b/felamimail/js/jscode/editAccountData.js new file mode 100644 index 0000000000..5657d4fbc8 --- /dev/null +++ b/felamimail/js/jscode/editAccountData.js @@ -0,0 +1,130 @@ +function initEditAccountData() +{ + var activeElement; + + if(activeElement = document.getElementById('active')) { + onchange_active(activeElement); + } +} + +function onchange_active(_checkbox) +{ + identityInputs = document.getElementById('identity').getElementsByTagName('input'); + incomingInputs = document.getElementById('incoming_server').getElementsByTagName('input'); + outgoingInputs = document.getElementById('outgoing_server').getElementsByTagName('input'); + + for(i=0; i 0) { + var accountData = new Array(); + + for(i=0; i 0) { + if(confirm(lang_reallyDeleteAccountSettings)) { + xajax_doXMLHTTP("felamimail.ajaxfelamimail.deleteAccountData", accountData.join(",")); + fm_refreshAccountDataTable(); + } + } + } +} + +function fm_refreshAccountDataTable() { + xajax_doXMLHTTP("felamimail.ajaxfelamimail.refreshAccountDataTable"); +} diff --git a/felamimail/js/jscode/editProfile.js b/felamimail/js/jscode/editProfile.js new file mode 100644 index 0000000000..ca7f0099a5 --- /dev/null +++ b/felamimail/js/jscode/editProfile.js @@ -0,0 +1,13 @@ +var tab = new Tabs(2,'activetab','inactivetab','tab','tabcontent','','','tabpage'); + +function initAll(_editMode) +{ + tab.init(); + + switch(_editMode) + { + case 'vacation': + tab.display(2); + break; + } +} diff --git a/felamimail/js/jscode/editSieveRule.js b/felamimail/js/jscode/editSieveRule.js new file mode 100644 index 0000000000..9c4c7db3ba --- /dev/null +++ b/felamimail/js/jscode/editSieveRule.js @@ -0,0 +1,8 @@ +function OnLoadingStart(_nodeID) { + return true; +} +function onNodeSelect(_folderName) { + opener.document.thisRule.folderName.value = _folderName; + opener.document.thisRule.action_folder.checked = true; + self.close(); +} diff --git a/felamimail/js/jscode/listFolder.js b/felamimail/js/jscode/listFolder.js new file mode 100644 index 0000000000..752eccaf84 --- /dev/null +++ b/felamimail/js/jscode/listFolder.js @@ -0,0 +1,44 @@ +var tab = new Tabs(2,'activetab','inactivetab','tab','tabcontent','','','tabpage'); + +function initAll() +{ + tab.init(); +} + +function onCheckHandler(_nodeID) +{ + xajax_doXMLHTTP('felamimail.ajaxfelamimail.updateFolderStatus',_nodeID,tree.isItemChecked(_nodeID)); +} +function OnLoadingStart(_nodeID) { + return true; +} +function onNodeSelect(_nodeID) +{ + xajax_doXMLHTTP("felamimail.ajaxfelamimail.getFolderInfo",_nodeID); +} + +function resetACLAddView() +{ + xajax_doXMLHTTP('felamimail.ajaxfelamimail.addACL', document.getElementById('accountName').value, xajax.getFormValues('formAddACL') ); + document.getElementById('accountName').value = ''; + document.getElementById('acl_l').checked = false; + document.getElementById('acl_r').checked = false; + document.getElementById('acl_s').checked = false; + document.getElementById('acl_w').checked = false; + document.getElementById('acl_i').checked = false; + document.getElementById('acl_p').checked = false; + document.getElementById('acl_c').checked = false; + document.getElementById('acl_d').checked = false; + document.getElementById('acl_a').checked = false; + opener.updateACLView(); +} + +function updateACLView() +{ + xajax_doXMLHTTP('felamimail.ajaxfelamimail.updateACLView'); +} + +function displayACLAdd(_url) +{ + egw_openWindowCentered(_url,'felamiMailACL','400','200',window.outerWidth/2,window.outerHeight/2); +} diff --git a/felamimail/js/jscode/listSieveRules.js b/felamimail/js/jscode/listSieveRules.js new file mode 100644 index 0000000000..92e8a4f55c --- /dev/null +++ b/felamimail/js/jscode/listSieveRules.js @@ -0,0 +1,31 @@ +// variable used by "edit rule" dialog +var ruleEditWindow; +var ruleEditWindowTimer; +var ruleEditWindowTimeout=500; + +//var searchesPending=0; + +function fm_sieve_displayRuleEditWindow(_displayRuleEditWindowURL) { + //ruleEditWindow = egw_openWindowCentered(_displayRuleEditWindowURL,'fm_sieve_ruleEditWindow','730','510',window.outerWidth/2,window.outerHeight/2); + ruleEditWindow = egw_openWindowCentered(_displayRuleEditWindowURL,'fm_sieve_ruleEditWindow','730','510'); + if(ruleEditWindowTimer) { + window.clearTimeout(ruleEditWindowTimer); + } + ruleEditWindowTimer = window.setInterval('fm_sieve_reloadRulesList()', ruleEditWindowTimeout); +} + +function fm_sieve_reloadRulesList() { +// searchesPending++; +// document.title=searchesPending; + if(ruleEditWindow.closed == true) { + window.clearTimeout(ruleEditWindowTimer); + //xajax_doXMLHTTP("felamimail.ajaxfelamimail.reloadAttachments", composeID); + window.location.href=refreshURL; + } +} + +function fm_sieve_cancelReload() { + if(ruleEditWindowTimer) { + window.clearTimeout(ruleEditWindowTimer); + } +} \ No newline at end of file diff --git a/felamimail/js/jscode/listSignatures.js b/felamimail/js/jscode/listSignatures.js new file mode 100644 index 0000000000..f4bb49f147 --- /dev/null +++ b/felamimail/js/jscode/listSignatures.js @@ -0,0 +1,74 @@ +var ruleSignatureWindowTimeout=500; +var signatureEditWindow; +var signatureEditWindowTimer; + +function fm_getEditorContent() +{ + // Get the editor instance that we want to interact with. + var ckeditor = CKEDITOR.instances['signature']; + return ckeditor.getData(); +} + +function fm_addSignature(_url) +{ + signatureEditWindow = egw_openWindowCentered(_url,'editSignature','750',egw_getWindowOuterHeight()/2,window.outerWidth/2,window.outerHeight/2); + if(signatureEditWindowTimer) { + window.clearTimeout(signatureEditWindowTimer); + } + signatureEditWindowTimer = window.setInterval('fm_checkSignatureEditWindow()', ruleSignatureWindowTimeout); +} + +function fm_saveSignature() { + xajax_doXMLHTTP("felamimail.ajaxfelamimail.saveSignature", "save", + document.getElementById('signatureID').value, + document.getElementById('signatureDesc').value, + fm_getEditorContent(), + document.getElementById('isDefaultSignature').checked + ); + //fm_refreshSignatureTable(); + //window.setTimeout("window.close()", 1000); +} + +function fm_applySignature() { + xajax_doXMLHTTP("felamimail.ajaxfelamimail.saveSignature", "apply", + document.getElementById('signatureID').value, + document.getElementById('signatureDesc').value, + fm_getEditorContent(), + document.getElementById('isDefaultSignature').value + ); + fm_refreshSignatureTable(); +} + +function fm_initEditLayout() { + alert(document.body.offsetHeight); +} + +function fm_deleteSignatures() { + if(document.forms["signatureList"].elements.length > 0) { + var signatures = new Array(); + + for(i=0; i 0) { + if(confirm(lang_reallyDeleteSignatures)) { + xajax_doXMLHTTP("felamimail.ajaxfelamimail.deleteSignatures", signatures.join(",")); + fm_refreshSignatureTable(); + } + } + } +} + +function fm_refreshSignatureTable() { + xajax_doXMLHTTP("felamimail.ajaxfelamimail.refreshSignatureTable"); +} + +function fm_checkSignatureEditWindow() { + if(signatureEditWindow.closed == true) { + window.clearTimeout(signatureEditWindowTimer); + fm_refreshSignatureTable(); + } +} diff --git a/felamimail/js/jscode/viewMainScreen.js b/felamimail/js/jscode/viewMainScreen.js new file mode 100644 index 0000000000..75b14e056e --- /dev/null +++ b/felamimail/js/jscode/viewMainScreen.js @@ -0,0 +1,754 @@ +function parentRefreshListRowStyle(oldID, newID) +{ + var trElement; + var aElements; + trElement = document.getElementById('row_'+oldID); + trElement.style.backgroundColor = "#FFFFFF"; + trElement.style.fontWeight='normal'; + aElements = trElement.getElementsByTagName("a"); + aElements[0].style.fontWeight='normal'; + aElements[1].style.fontWeight='normal'; + trElement = document.getElementById('row_'+newID); + trElement.style.backgroundColor = "#ddddFF"; + trElement.style.fontWeight='normal'; + aElements = trElement.getElementsByTagName("a"); + aElements[0].style.fontWeight='normal'; + aElements[1].style.fontWeight='normal'; + +} +function setStatusMessage(_message) { + document.getElementById('messageCounter').innerHTML = '
     ' + _message + '
    '; +} + +function sendNotifyMS (uid) { + ret = confirm(lang_sendnotify); + xajax_doXMLHTTP("felamimail.ajaxfelamimail.sendNotify",uid,ret); +} + +function changeSorting(_sort, _aNode) { + + resetMessageSelect(); + + document.getElementById('messageCounter').innerHTML = 'Change sorting ...'; + document.getElementById('divMessageList').innerHTML = ''; + aTags = document.getElementById('tableHeader').getElementsByTagName('a'); + aTags[0].style.fontWeight='normal'; + aTags[1].style.fontWeight='normal'; + aTags[2].style.fontWeight='normal'; + aTags[3].style.fontWeight='normal'; + xajax_doXMLHTTP("felamimail.ajaxfelamimail.changeSorting",_sort); + _aNode.style.fontWeight='bold'; +} + +function compressFolder() { + if (document.getElementById('messageCounter').innerHTML.search(eval('/'+lang_updating_view+'/'))<0 ) {MessageBuffer = document.getElementById('messageCounter').innerHTML;} + setStatusMessage(''+ lang_compressingFolder +''); + xajax_doXMLHTTP("felamimail.ajaxfelamimail.compressFolder"); +} + +function deleteMessages(_messageList) { + var Check = true; + var cbAllMessages = document.getElementById('selectAllMessagesCheckBox').checked; + + resetMessageSelect(); + + if (cbAllMessages == true) Check = confirm(lang_confirm_all_messages); + if (cbAllMessages == true && Check == true) + { + _messageList = 'all'; + } + if (Check == true) { + setStatusMessage('' + lang_deleting_messages + ''); + document.getElementById('divMessageList').innerHTML = ''; + xajax_doXMLHTTP("felamimail.ajaxfelamimail.deleteMessages",_messageList); + } else { + for(i=0; i< document.forms.formMessageList.elements.length; i++) { + if(document.forms.formMessageList.elements[i].checked) { + document.forms.formMessageList.elements[i].checked = false; + } + } + } +} + +function displayMessage(_url,_windowName) { + egw_openWindowCentered(_url, _windowName, 850, egw_getWindowOuterHeight()); +} + +function fm_displayHeaderLines(_url) { + egw_openWindowCentered(_url,'fm_display_headerLines','700','600',window.outerWidth/2,window.outerHeight/2); +} + +function emptyTrash() { + if (document.getElementById('messageCounter').innerHTML.search(eval('/'+lang_updating_view+'/'))<0 ) {MessageBuffer = document.getElementById('messageCounter').innerHTML;} + setStatusMessage('' + lang_emptyTrashFolder + ''); + xajax_doXMLHTTP("felamimail.ajaxfelamimail.emptyTrash"); +} + +function tellUser(message,_nodeID) { + if (_nodeID) { + alert(message+top.tree.getUserData(_nodeID, 'folderName')); + } else { + alert(message); + } +} + +function getTreeNodeOpenItems(_nodeID, mode) { + var z = top.tree.getSubItems(_nodeID).split(","); + var oS; + var PoS; + var rv; + var returnValue = ""+_nodeID; + var modetorun = "none"; + if (mode) { modetorun = mode } + PoS = top.tree.getOpenState(_nodeID) + if (modetorun == "forced") PoS = 1; + if (PoS == 1) { + for(var i=0;i"; + if (prefAskForMove == 2) message = message + " "; + message = message + " "; + type = 'prompt'; + autohide = 0; + showDialog(title,message,type,autohide); + Check = false; + actionPending = true; + } + if (prefAskForMove==99) actionPending = 'copy'; + if (Check == true && document.getElementById('selectAllMessagesCheckBox').checked == true) Check = confirm(lang_confirm_all_messages); + if (Check == true) + { + if (document.getElementById('messageCounter').innerHTML.search(eval('/'+lang_updating_view+'/'))<0 ) {MessageBuffer = document.getElementById('messageCounter').innerHTML;} + if (document.getElementById('selectAllMessagesCheckBox').checked == true) { + resetMessageSelect(); + formData = 'all'; + } else { + resetMessageSelect(); + formData = xajax.getFormValues('formMessageList'); + } + if (actionPending == 'copy') + { + setStatusMessage(copyingMessages +' '+ top.tree.getUserData(_nodeID, 'folderName') +''); + document.getElementById('divMessageList').innerHTML = ''; + xajax_doXMLHTTP("felamimail.ajaxfelamimail.copyMessages", _nodeID, formData); + } + else + { + // default: move messages + setStatusMessage(movingMessages +' '+ top.tree.getUserData(_nodeID, 'folderName') +''); + document.getElementById('divMessageList').innerHTML = ''; + xajax_doXMLHTTP("felamimail.ajaxfelamimail.moveMessages", _nodeID, formData); + } + } else { + if (actionPending == false) + { + resetMessageSelect(); + for(i=0; i< document.forms.formMessageList.elements.length; i++) { + if(document.forms.formMessageList.elements[i].checked) { + document.forms.formMessageList.elements[i].checked = false; + } + } + } + } + } else { + resetMessageSelect(); + setStatusMessage('' + lang_loading + ' ' + top.tree.getUserData(_nodeID, 'folderName') + ''); + document.getElementById('divMessageList').innerHTML = ''; + xajax_doXMLHTTP("felamimail.ajaxfelamimail.updateMessageView",_nodeID); + refreshFolderStatus(_nodeID); + } + } + CopyOrMove = true; +} + +function quickSearch() { + var searchType; + var searchString; + var status; + + resetMessageSelect(); + //disable select allMessages in Folder Checkbox, as it is not implemented for filters + document.getElementById('selectAllMessagesCheckBox').disabled = true; + setStatusMessage('' + lang_updating_view + ''); + document.getElementById('divMessageList').innerHTML = ''; + + document.getElementById('quickSearch').select(); + + searchType = document.getElementById('searchType').value; + searchString = document.getElementById('quickSearch').value; + status = document.getElementById('status').value; + if (searchString+'grrr###'+status == 'grrr###any') document.getElementById('selectAllMessagesCheckBox').disabled = false; + + xajax_doXMLHTTP('felamimail.ajaxfelamimail.quickSearch', searchType, searchString, status); +} + +function selectFolderContent(inputBox, _refreshTimeOut) { + maxMessages = 0; + + selectAll(inputBox, _refreshTimeOut); +} + +function selectAll(inputBox, _refreshTimeOut) { + maxMessages = 0; + + for (var i = 0; i < document.getElementsByTagName('input').length; i++) { + if(document.getElementsByTagName('input')[i].name == 'msg[]') { + //alert(document.getElementsByTagName('input')[i].name); + document.getElementsByTagName('input')[i].checked = inputBox.checked; + maxMessages++; + } + } + + folderFunctions = document.getElementById('folderFunction'); + + if(inputBox.checked) { + checkedCounter = maxMessages; + while (folderFunctions.hasChildNodes()) { + folderFunctions.removeChild(folderFunctions.lastChild); + } + var textNode = document.createTextNode(lang_select_target_folder); + folderFunctions.appendChild(textNode); + document.getElementsByName("folderAction")[0].value = "moveMessage"; + fm_startTimerMessageListUpdate(1800000); + } else { + checkedCounter = 0; + while (folderFunctions.hasChildNodes()) { + folderFunctions.removeChild(folderFunctions.lastChild); + } + var textNode = document.createTextNode(''); + folderFunctions.appendChild(textNode); + document.getElementsByName("folderAction")[0].value = "changeFolder"; + fm_startTimerMessageListUpdate(_refreshTimeOut); + } +} + +function toggleFolderRadio(inputBox, _refreshTimeOut) { + + folderFunctions = document.getElementById("folderFunction"); + checkedCounter += (inputBox.checked) ? 1 : -1; + if (checkedCounter > 0) { + while (folderFunctions.hasChildNodes()) { + folderFunctions.removeChild(folderFunctions.lastChild); + } + var textNode = document.createTextNode('{lang_move_message}'); + //folderFunctions.appendChild(textNode); + document.getElementById("folderFunction").innerHTML=lang_select_target_folder; + document.getElementsByName("folderAction")[0].value = "moveMessage"; + fm_startTimerMessageListUpdate(1800000); + } else { + document.getElementById('messageCheckBox').checked = false; + document.getElementById('selectAllMessagesCheckBox').checked = false; + while (folderFunctions.hasChildNodes()) { + folderFunctions.removeChild(folderFunctions.lastChild); + } + //var textNode = document.createTextNode('{lang_change_folder}'); + //folderFunctions.appendChild(textNode); + document.getElementsByName("folderAction")[0].value = "changeFolder"; + fm_startTimerMessageListUpdate(_refreshTimeOut); + } +} + +function extendedSearch(_selectBox) { + resetMessageSelect(); + //disable select allMessages in Folder Checkbox, as it is not implemented for filters + document.getElementById('selectAllMessagesCheckBox').disabled = true; + setStatusMessage('Applying filter '+_selectBox.options[_selectBox.selectedIndex].text+''); + document.getElementById('divMessageList').innerHTML = ''; + + document.getElementById('quickSearch').value = ''; + + xajax_doXMLHTTP('felamimail.ajaxfelamimail.extendedSearch',_selectBox.options[_selectBox.selectedIndex].value); +} + +function flagMessages(_flag) +{ + var Check=true; + var _messageList; + var cbAllMessages = document.getElementById('selectAllMessagesCheckBox').checked; + resetMessageSelect(); + if (cbAllMessages == true) Check = confirm(lang_confirm_all_messages); + if (cbAllMessages == true && Check == true) + { + _messageList = 'all'; + } else { + _messageList = xajax.getFormValues('formMessageList'); + } + + //alert(_messageList); + + if (Check == true) + { + setStatusMessage('' + lang_updating_message_status + ''); + xajax_doXMLHTTP("felamimail.ajaxfelamimail.flagMessages", _flag, _messageList); + document.getElementById('divMessageList').innerHTML = ''; + fm_startTimerMessageListUpdate(refreshTimeOut); + } else { + for(i=0; i< document.forms.formMessageList.elements.length; i++) { + if(document.forms.formMessageList.elements[i].checked) { + document.forms.formMessageList.elements[i].checked = false; + } + } + } +} + +function resetMessageSelect() +{ + if (document.getElementById('messageCounter').innerHTML.search(eval('/'+lang_updating_view+'/'))<0 ) {MessageBuffer = document.getElementById('messageCounter').innerHTML;} + document.getElementById('messageCheckBox').checked = false; + document.getElementById('selectAllMessagesCheckBox').checked = false; + checkedCounter = 0; + folderFunctions = document.getElementById('folderFunction'); + + while (folderFunctions.hasChildNodes()) + folderFunctions.removeChild(folderFunctions.lastChild); + var textNode = document.createTextNode(''); + folderFunctions.appendChild(textNode); + document.getElementsByName("folderAction")[0].value = "changeFolder"; +} + +function skipForward() +{ + resetMessageSelect(); + + setStatusMessage(''+ lang_skipping_forward +''); + document.getElementById('divMessageList').innerHTML = ''; + + xajax_doXMLHTTP('felamimail.ajaxfelamimail.skipForward'); +} + +function skipPrevious() { + resetMessageSelect(); + + setStatusMessage(''+ lang_skipping_previous +''); + document.getElementById('divMessageList').innerHTML = ''; + + xajax_doXMLHTTP('felamimail.ajaxfelamimail.skipPrevious'); +} + +function jumpEnd() { + resetMessageSelect(); + + setStatusMessage(''+ lang_jumping_to_end +''); + document.getElementById('divMessageList').innerHTML = ''; + + xajax_doXMLHTTP('felamimail.ajaxfelamimail.jumpEnd'); +} + +function jumpStart() { + resetMessageSelect(); + + setStatusMessage(''+ lang_jumping_to_start +''); + document.getElementById('divMessageList').innerHTML = ''; + + xajax_doXMLHTTP('felamimail.ajaxfelamimail.jumpStart'); +} + +var searchesPending=0; + +function refresh() { + //searchesPending++; + //document.title=searchesPending; + resetMessageSelect(); + xajax_doXMLHTTP('felamimail.ajaxfelamimail.refreshMessageList'); + if (fm_previewMessageID>0) + { + //setStatusMessage(''+ lang_updating_view +''); + //xajax_doXMLHTTP("felamimail.ajaxfelamimail.refreshMessagePreview",fm_previewMessageID,fm_previewMessageFolderType); + } +} + +function refreshFolderStatus(_nodeID,mode) { + var nodeToRefresh = 0; + var mode2use = "none"; + if (document.getElementById('messageCounter')) { + if (document.getElementById('messageCounter').innerHTML.search(eval('/'+lang_updating_view+'/'))<0 ) {MessageBuffer = document.getElementById('messageCounter').innerHTML;} + } + if (_nodeID) nodeToRefresh = _nodeID; + if (mode) { + if (mode == "forced") {mode2use = mode;} + } + var activeFolders = getTreeNodeOpenItems(nodeToRefresh,mode2use); + xajax_doXMLHTTP('felamimail.ajaxfelamimail.refreshFolderList', activeFolders); +// if (fm_previewMessageID>0) +// { +// //setStatusMessage(''+ lang_updating_view +''); +// //xajax_doXMLHTTP("felamimail.ajaxfelamimail.refreshMessagePreview",fm_previewMessageID,fm_previewMessageFolderType); +// } +} + +function refreshView() { + if (document.getElementById('messageCounter').innerHTML.search(eval('/'+lang_updating_view+'/'))<0 ) {MessageBuffer = document.getElementById('messageCounter').innerHTML;} + document.mainView.submit(); + document.getElementById('messageCounter').innerHTML = MessageBuffer; +} + +function openComposeWindow(_url) { + var Check=true; + var _messageList; + var cbAllMessages = document.getElementById('selectAllMessagesCheckBox').checked; + resetMessageSelect(); + if (cbAllMessages == true) Check = confirm(lang_confirm_all_messages); + if (cbAllMessages == true && Check == true) + { + _messageList = 'all'; + } else { + _messageList = xajax.getFormValues('formMessageList'); + } + sMessageList=''; + for (var i in _messageList['msg']) { + //alert('eigenschaft:'+_messageList['msg'][i]); + sMessageList=sMessageList+_messageList['msg'][i]+','; + //sMessageList.concat(','); + } + if (sMessageList.length >0) { + sMessageList= 'AsForward&forwardmails=1&folder='+activeFolderB64+'&reply_id='+sMessageList.substring(0,sMessageList.length-1); + } + //alert(sMessageList); + if (Check == true) + { + egw_openWindowCentered(_url+sMessageList,'compose',700,egw_getWindowOuterHeight()); + } + for(i=0; i< document.forms.formMessageList.elements.length; i++) { + if(document.forms.formMessageList.elements[i].checked) { + document.forms.formMessageList.elements[i].checked = false; + } + } +} + +// timer functions +function fm_startTimerFolderStatusUpdate(_refreshTimeOut) { + if(fm_timerFolderStatus) { + window.clearTimeout(fm_timerFolderStatus); + } + if(_refreshTimeOut > 5000) { + fm_timerFolderStatus = window.setInterval("refreshFolderStatus()", _refreshTimeOut); + } +} + +function fm_startTimerMessageListUpdate(_refreshTimeOut) { + if(aktiv) { + window.clearTimeout(aktiv); + } + if(_refreshTimeOut > 5000) { + aktiv = window.setInterval("refresh()", _refreshTimeOut); + } +} + +function fm_readMessage(_url, _windowName, _node) { + var windowArray = _windowName.split('_'); + var tableElement =_node.parentNode.parentNode.parentNode.parentNode; + var allRows = tableElement.getElementsByTagName("tr"); + for(i=0; i< allRows.length; i++) { + allRows[i].style.backgroundColor = "#FFFFFF"; + } + if (windowArray[0] == 'MessagePreview') + { + //document.getElementById('spanMessagePreview').innerHTML = ''; + if (document.getElementById('messageCounter').innerHTML.search(eval('/'+lang_updating_view+'/'))<0 ) {MessageBuffer = document.getElementById('messageCounter').innerHTML;} + setStatusMessage(''+ lang_updating_view +''); + fm_previewMessageID = windowArray[1]; + fm_previewMessageFolderType = windowArray[2]; + xajax_doXMLHTTP("felamimail.ajaxfelamimail.refreshMessagePreview",windowArray[1],windowArray[2]); + } else { + egw_openWindowCentered(_url, _windowName, 750, egw_getWindowOuterHeight()); + } + trElement = _node.parentNode.parentNode.parentNode; + trElement.style.fontWeight='normal'; + trElement.style.backgroundColor = "#ddddFF"; + + aElements = trElement.getElementsByTagName("a"); + aElements[0].style.fontWeight='normal'; + aElements[1].style.fontWeight='normal'; + xajax_doXMLHTTP("felamimail.ajaxfelamimail.refreshFolder"); +} + +function fm_readAttachments(_url, _windowName, _node) { + egw_openWindowCentered(_url, _windowName, 750, 220); +} + +function fm_clearSearch() { + var inputQuickSearch = document.getElementById('quickSearch'); + var status = document.getElementById('status').value; + + //enable select allMessages in Folder Checkbox again + if (status == 'any') document.getElementById('selectAllMessagesCheckBox').disabled = false; + + if(inputQuickSearch.value != '') { + inputQuickSearch.value = ''; + quickSearch(); + } + + inputQuickSearch.focus(); +} + +function changeActiveAccount(_accountSelection) +{ + //alert(_accountSelection.value); + xajax_doXMLHTTP('felamimail.ajaxfelamimail.changeActiveAccount',_accountSelection.value); +} + +// stuff to change row background color +function HexToR(h) {return parseInt((cutHex(h)).substring(0,2),16)} +function HexToG(h) {return parseInt((cutHex(h)).substring(2,4),16)} +function HexToB(h) {return parseInt((cutHex(h)).substring(4,6),16)} +function cutHex(h) {return (h.charAt(0)=="#") ? h.substring(1,7):h} +function RGBtoHex(R,G,B) {return toHex(R)+toHex(G)+toHex(B)} +function toHex(N) { + if (N==null) return "00"; + N=parseInt(N); if (N==0 || isNaN(N)) return "00"; + N=Math.max(0,N); N=Math.min(N,255); N=Math.round(N); + return "0123456789ABCDEF".charAt((N-N%16)/16) + + "0123456789ABCDEF".charAt(N%16); +} +function compareColor(colorA, colorB) +{ + var cA = colorA.search(/#/); + var cA2C = colorA; + var cB2C = colorB; + if (cA != -1) + { + cA2C = "rgb("+HexToR(colorA)+", "+HexToG(colorA)+", "+HexToB(colorA)+")"; + } + var cB = colorB.search(/#/); + if (cB != -1) + { + cB2C = "rgb("+HexToR(colorB)+", "+HexToG(colorB)+", "+HexToB(colorB)+")"; + } + if (cA2C == cB2C) + { + //alert("match:"+colorA+cA2C+" == "+colorB+cB2C); + return true; + } + else + { + //alert("not match:"+colorA+cA2C+" == "+colorB+cB2C); + return false; + } +} +function onChangeColor(el,direction) +{ + if (!compareColor(el.style.backgroundColor,"#ddddFF") && !compareColor(el.style.backgroundColor,"#eeeddd")) + { + if (direction == 'in') el.style.backgroundColor="#dddddd"; + if (direction == 'out') el.style.backgroundColor="#FFFFFF"; + } + else + { + if (direction == 'in') el.style.backgroundColor="#eeeddd"; + if (direction == 'out') el.style.backgroundColor="#ddddFF"; + } + return true; +} + +// DIALOG BOXES by Michael Leigeber +// global variables // +var TIMER = 5; +var SPEED = 10; +var WRAPPER = 'divPoweredBy'; + +// calculate the current window width // +function pageWidth() { + return window.innerWidth != null ? window.innerWidth : document.documentElement && document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body != null ? document.body.clientWidth : null; +} + +// calculate the current window height // +function pageHeight() { + return window.innerHeight != null? window.innerHeight : document.documentElement && document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body != null? document.body.clientHeight : null; +} + +// calculate the current window vertical offset // +function topPosition() { + return typeof window.pageYOffset != 'undefined' ? window.pageYOffset : document.documentElement && document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ? document.body.scrollTop : 0; +} + +// calculate the position starting at the left of the window // +function leftPosition() { + return typeof window.pageXOffset != 'undefined' ? window.pageXOffset : document.documentElement && document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ? document.body.scrollLeft : 0; +} + +// build/show the dialog box, populate the data and call the fadeDialog function // +function showDialog(title,message,type,autohide) { + if(!type) { + type = 'error'; + } + var dialog; + var dialogheader; + var dialogclose; + var dialogtitle; + var dialogcontent; + var dialogmask; + if(!document.getElementById('dialog')) { + dialog = document.createElement('div'); + dialog.id = 'dialog'; + dialogheader = document.createElement('div'); + dialogheader.id = 'dialog-header'; + dialogtitle = document.createElement('div'); + dialogtitle.id = 'dialog-title'; + dialogclose = document.createElement('div'); + dialogclose.id = 'dialog-close' + dialogcontent = document.createElement('div'); + dialogcontent.id = 'dialog-content'; + dialogmask = document.createElement('div'); + dialogmask.id = 'dialog-mask'; + document.body.appendChild(dialogmask); + document.body.appendChild(dialog); + dialog.appendChild(dialogheader); + dialogheader.appendChild(dialogtitle); + dialogheader.appendChild(dialogclose); + dialog.appendChild(dialogcontent);; + dialogclose.setAttribute('onclick','hideDialog()'); + dialogclose.onclick = hideDialog; + } else { + dialog = document.getElementById('dialog'); + dialogheader = document.getElementById('dialog-header'); + dialogtitle = document.getElementById('dialog-title'); + dialogclose = document.getElementById('dialog-close'); + dialogcontent = document.getElementById('dialog-content'); + dialogmask = document.getElementById('dialog-mask'); + dialogmask.style.visibility = "visible"; + dialog.style.visibility = "visible"; + } + dialog.style.opacity = .00; + dialog.style.filter = 'alpha(opacity=0)'; + dialog.alpha = 0; + var width = pageWidth(); + var height = pageHeight(); + var left = leftPosition(); + var top = topPosition(); + var dialogwidth = dialog.offsetWidth; + var dialogheight = dialog.offsetHeight; + var topposition = top + (height / 3) - (dialogheight / 2); + var leftposition = left + (width / 2) - (dialogwidth / 2); + dialog.style.top = topposition + "px"; + dialog.style.left = leftposition + "px"; + dialogheader.className = type + "header"; + dialogtitle.innerHTML = title; + dialogcontent.className = type; + dialogcontent.innerHTML = message; + var content = document.getElementById(WRAPPER); + if (typeof content == 'undefined' || content == null) + { + dialogmask.style.height = '10px'; + } + else + { + dialogmask.style.height = content.offsetHeight + 'px'; + } + dialog.timer = setInterval("fadeDialog(1)", TIMER); + if(autohide) { + dialogclose.style.visibility = "hidden"; + window.setTimeout("hideDialog()", (autohide * 1000)); + } else { + dialogclose.style.visibility = "visible"; + } +} + +// hide the dialog box // +function hideDialog() { + var dialog = document.getElementById('dialog'); + clearInterval(dialog.timer); + dialog.timer = setInterval("fadeDialog(0)", TIMER); +} + +// fade-in the dialog box // +function fadeDialog(flag) { + if(flag == null) { + flag = 1; + } + var dialog = document.getElementById('dialog'); + var value; + if(flag == 1) { + value = dialog.alpha + SPEED; + } else { + value = dialog.alpha - SPEED; + } + dialog.alpha = value; + dialog.style.opacity = (value / 100); + dialog.style.filter = 'alpha(opacity=' + value + ')'; + if(value >= 99) { + clearInterval(dialog.timer); + dialog.timer = null; + } else if(value <= 1) { + dialog.style.visibility = "hidden"; + document.getElementById('dialog-mask').style.visibility = "hidden"; + clearInterval(dialog.timer); + } +} diff --git a/felamimail/js/jscode/view_message.js b/felamimail/js/jscode/view_message.js new file mode 100644 index 0000000000..ba9b392674 --- /dev/null +++ b/felamimail/js/jscode/view_message.js @@ -0,0 +1,109 @@ +// var tab = new Tabs(3,'activetab','inactivetab','tab','tabcontent','','','tabpage'); +// var smtp = new Tabs(2,'activetab','inactivetab','smtp','smtpcontent','smtpselector','','smtppage'); +// var imap = new Tabs(3,'activetab','inactivetab','imap','imapcontent','imapselector','','imappage'); + +var headerFullSize=false; + +var headerDIVHeight; + +var bodyDIVTop; + +function getUrlPart(url, name ) +{ + name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]"); + var regexS = "[\\?&]"+name+"=([^&#]*)"; + var regex = new RegExp( regexS ); + var results = regex.exec( url ); + if( results == null ) + return ""; + else + return results[1]; +} + +function sendNotify (uid) { + ret = confirm(lang_sendnotify); + xajax_doXMLHTTP("felamimail.ajaxfelamimail.sendNotify",uid,ret); +} + +function goToMessage(url) { + //alert(getUrlPart(window.location.href,'uid')); + var oldUid = getUrlPart(window.location.href,'uid'); + var newUid = getUrlPart(url,'uid'); + window.opener.parentRefreshListRowStyle(oldUid, newUid); + window.location.href = url; + //opener.refresh(); +} + +function initAll() +{ + //tab.init(); + + var headerTable = document.getElementById('headerTable'); + var headerDIV = document.getElementById('headerDIV'); + if (headerTable) { + if (headerTable.clientHeight) { + if(headerTable.clientHeight > headerDIV.clientHeight) { + var moreDIV = document.getElementById('moreDIV'); + moreDIV.style.display = 'block'; + } + } + } + if(is_ie) { + fm_resizeBodyDIV(); + window.onresize = fm_resizeBodyDIV; + } + updateTitle(); +} + +function updateTitle() { + var _text = document.getElementById('subjectDATA').firstChild.nodeValue; + if(_text.length>40) { + _text = _text.substring(0,40) + '...'; + } + + document.title = _text; +} + +function toggleHeaderSize() { + var toogleSPAN = document.getElementById('toogleSPAN'); + + var headerTable = document.getElementById('headerTable'); + var headerDIV = document.getElementById('headerDIV'); + var bodyDIV = document.getElementById('bodyDIV'); + + if(!headerFullSize) { + var navbarDIV = document.getElementById('navbarDIV'); + var subjectDIV = document.getElementById('subjectDIV'); + + headerDIVHeight = headerDIV.clientHeight; + bodyDIVTop = bodyDIV.offsetTop; + headerDIV.style.height = headerTable.clientHeight + 'px'; + + bodyDIV.style.top = 4 + navbarDIV.clientHeight + subjectDIV.clientHeight + headerDIV.clientHeight + 'px'; + + headerFullSize=true; + toogleSPAN.innerHTML = '-'; + } else { + headerFullSize=false; + toogleSPAN.innerHTML = '+'; + + headerDIV.style.height = headerDIVHeight + 'px'; + bodyDIV.style.top = bodyDIVTop + 'px'; + } +} + +function fm_resizeBodyDIV() { + var attachmentDIV; + var bodyDIV = document.getElementById('bodyDIV'); + var attachmentDIV = document.getElementById('attachmentDIV'); + + if(attachmentDIV = document.getElementById('attachmentDIV')) { + bodyDIV.style.height = attachmentDIV.offsetTop - bodyDIV.offsetTop + 'px'; + } else { + bodyDIV.style.height = egw_getWindowInnerHeight() - bodyDIV.offsetTop - 2 + 'px'; + } +} + +function fm_displayHeaderLines(_url) { + egw_openWindowCentered(_url,'fm_display_headerLines','700','600',window.outerWidth/2,window.outerHeight/2); +} diff --git a/felamimail/lang/egw_bg.lang b/felamimail/lang/egw_bg.lang new file mode 100644 index 0000000000..5f003f4a74 --- /dev/null +++ b/felamimail/lang/egw_bg.lang @@ -0,0 +1,462 @@ +(no subject) felamimail bg (без тема) +(only cc/bcc) felamimail bg (само копие/скрито копие) +(separate multiple addresses by comma) felamimail bg (разделете няколко адреса със запетая) +(unknown sender) felamimail bg (неизвестен подател) +activate felamimail bg Активиране +activate script felamimail bg активиране на скрипт +activating by date requires a start- and end-date! felamimail bg Активиране по дата изисква начална И крайна дата! +add acl felamimail bg добави списък за контрол на достъпа +add address felamimail bg Добави адрес +add rule felamimail bg Добави правило +add script felamimail bg Добави скрипт +add to %1 felamimail bg Добави към %1 +add to address book felamimail bg Добави към Адресния указател +add to addressbook felamimail bg добави към Адресния указател +adding file to message. please wait! felamimail bg Прилагане на файл към съобщението. Моля, почакайте! +additional info felamimail bg Допълнителна информация +address book felamimail bg Адресен указател +address book search felamimail bg Търсене в Адресния указател +after message body felamimail bg След тялото на съобщението +all address books felamimail bg Всички адресни указатели +all folders felamimail bg Всички папки +all of felamimail bg всички +allow images from external sources in html emails felamimail bg Показване на изображения от външни източници в HTML съобщения? +allways a new window felamimail bg винаги в нов прозорец +always show html emails felamimail bg Винаги показва HTML съобщения +and felamimail bg и +any of felamimail bg някой от +any status felamimail bg без значение +anyone felamimail bg всеки +as a subfolder of felamimail bg всички подпапки на +attachments felamimail bg Приложения +authentication required felamimail bg изисква се оторизация +auto refresh folder list felamimail bg Автоматично опресняване на списъка с папки +back to folder felamimail bg Обратно към папка +bad login name or password. felamimail bg Невалидно име или парола. +bad or malformed request. server responded: %s felamimail bg Некоректна заявка. Сървърът отговори: %s +bad request: %s felamimail bg Некоректна заявка: %s +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail bg Съгласно зададен критерий, фонът на входящите съобщения в списъка може да бъде различен. Това помага лесно да разграничите подателите, особено при пощенски списъци. +bcc felamimail bg Скрито копие +before headers felamimail bg Преди заглавната част +between headers and message body felamimail bg Между заглавната част и тялото на съобщението +body part felamimail bg част от тялото +by date felamimail bg по дата +can not send message. no recipient defined! felamimail bg съобщението не може да бъде изпратено - не е посочен получател! +can't connect to inbox!! felamimail bg неуспешна връзка с INBOX!! +cc felamimail bg копие +change folder felamimail bg Смяна на папка +check message against next rule also felamimail bg провери съобщението и съгласно следващото правило +clear search felamimail bg изтрий търсенето +click here to log back in. felamimail bg Кликнете тук за влизане отново. +click here to return to %1 felamimail bg Кликнете тук за връщане към %1 +close all felamimail bg затваряне на всичко +close this page felamimail bg затвори страницата +close window felamimail bg Затваряне на прозореца +color felamimail bg Цвят +compose felamimail bg Ново съобщение +compose as new felamimail bg създай като ново +compress folder felamimail bg Компресиране на папката +condition felamimail bg условие +configuration felamimail bg Конфигурация +connection dropped by imap server. felamimail bg Връзката е прекъсната от IMAP сървъра. +contains felamimail bg съдържа +could not complete request. reason given: %s felamimail bg Неуспешно изпълнение на заявката поради: %s +could not import message: felamimail bg Неуспешен импорт на съобщение: +could not open secure connection to the imap server. %s : %s. felamimail bg Неуспешно изграждане на криптирана връзка с IMAP сървъра. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. felamimail bg CRAM-MD5 или DIGEST-MD5 изискват инсталиране на пакета Auth_SASL. +create felamimail bg Създаване +create folder felamimail bg Създаване на папка +create sent felamimail bg Създаване на "Изпратени" +create subfolder felamimail bg Създаване на подпапка +create trash felamimail bg Създаване на "Кошче" +created folder successfully! felamimail bg Папката е създадена успешно! +dark blue felamimail bg Тъмно син +dark cyan felamimail bg Тъмно синьозелен +dark gray felamimail bg Тъмно сив +dark green felamimail bg Тъмно зелен +dark magenta felamimail bg Тъмно пурпурен +dark yellow felamimail bg Тъмно жълт +date(newest first) felamimail bg По дата (първо най-новите) +date(oldest first) felamimail bg По дата (първо най-старите) +days felamimail bg дни +deactivate script felamimail bg деактивиране на скрипта +default felamimail bg по подразбиране +default signature felamimail bg подпис по подразбиране +default sorting order felamimail bg Подреждане по подразбиране +delete all felamimail bg изтриване на всички +delete folder felamimail bg Изтриване на Папка +delete script felamimail bg изтриване на скрипт +delete selected felamimail bg Изтрий избраните +delete selected messages felamimail bg изтрий избраните съобщения +deleted felamimail bg изтрито +deleted folder successfully! felamimail bg Папката е успешно изтрита! +deleting messages felamimail bg изтриване на съобщенията +disable felamimail bg Забранява +discard felamimail bg изоставяне +discard message felamimail bg изоставяне на съобщението +display message in new window felamimail bg Показване на съобщенията в нов прозорец +display messages in multiple windows felamimail bg показване на съобщенията в отделни прозорци +display of html emails felamimail bg Показване на HTML съобщения +display only when no plain text is available felamimail bg Показва само, когато няма текст +display preferences felamimail bg Настройки за изобразяване +displaying html messages is disabled felamimail bg Показването на HTML съобщения е забранено! +do it! felamimail bg действай! +do not use sent felamimail bg Не използвай "Изпратени" +do not use trash felamimail bg Не използвай "Кошче" +do not validate certificate felamimail bg не проверявай сертификати +do you really want to delete the '%1' folder? felamimail bg Наистина ли желаете да изтриете папка '%1'? +do you really want to delete the selected accountsettings and the assosiated identity. felamimail bg Наистина ли желаете да изтриете избраните настройки на акаунт и съответната им самоличност? +do you really want to delete the selected signatures? felamimail bg Наистина ли желаете да изтриете избраните подписи? +do you really want to move the selected messages to folder: felamimail bg Наистина ли желаете да преместите избраните съобщения в папка +do you want to be asked for confirmation before moving selected messages to another folder? felamimail bg Потвърждение преди преместване на избрани съобщения в друга папка? +do you want to prevent the managing of folders (creation, accessrights and subscribtion)? felamimail bg Желаете ли да забраните управлението на папките (създаване, права на достъп И абонамент)? +does not contain felamimail bg не съдържа +does not exist on imap server. felamimail bg не съществува на IMAP сървъра. +does not match felamimail bg не съвпада с +does not match regexp felamimail bg не съвпада с рег. израз +don't use draft folder felamimail bg Не използвай "Чернови" +don't use sent felamimail bg Не използвай "Изпратени" +don't use template folder felamimail bg Не използвай папка "Шаблони" +don't use trash felamimail bg Не използвай "Кошче" +dont strip any tags felamimail bg не премахвай етикети +down felamimail bg надолу +download felamimail bg изтегляне +download this as a file felamimail bg Изтеглете го като файл +draft folder felamimail bg папка "Чернови" +drafts felamimail bg Чернови +e-mail felamimail bg E-Mail +e-mail address felamimail bg E-Mail адрес +e-mail folders felamimail bg E-Mail папки +edit email forwarding address felamimail bg редактиране на адреса за препращане на e-mail-а +edit filter felamimail bg Редактиране на филтър +edit rule felamimail bg редактиране на правило +edit selected felamimail bg Редактиране на избраните +edit vacation settings felamimail bg редактиране на настройките за "ваканция" +editor type felamimail bg Вид на редактора +email address felamimail bg E-Mail адрес +email forwarding address felamimail bg E-Mail адрес за препращане +email notification update failed felamimail bg Актуализацията на e-mail известието беше неуспешна. +email signature felamimail bg Подпис за E-Mail +emailaddress felamimail bg e-mail адрес +empty trash felamimail bg изпразване на кошчето +enable felamimail bg позволява +encrypted connection felamimail bg криптирана връзка +enter your default mail domain ( from: user@domain ) admin bg Въведете e-mail домейн по подразбиране (От: user@domain) +enter your imap mail server hostname or ip address admin bg Въведете името или IP адреса на IMAP сървъра +enter your sieve server hostname or ip address admin bg Въведете името или IP адреса на SIEVE сървъра +enter your sieve server port admin bg Въведете порта на SIEVE сървъра +enter your smtp server hostname or ip address admin bg Въведете името или IP адреса на SMTP сървъра +enter your smtp server port admin bg Въведете порта на SMTP сървъра +error felamimail bg ГРЕШКА +error connecting to imap serv felamimail bg Грешка при връзка с IMAP сървъра +error connecting to imap server. %s : %s. felamimail bg Грешка при връзка с IMAP сървъра. %s : %s. +error connecting to imap server: [%s] %s. felamimail bg Грешка при връзка с IMAP сървъра: [%s] %s. +error opening felamimail bg Грешка при отваряне на +error: felamimail bg Грешка: +error: could not save message as draft felamimail bg Грешка: неуспешно запазване на съобщнието като Чернова +every felamimail bg всеки +every %1 days felamimail bg на всеки %1 дни +expunge felamimail bg Заличаване +extended felamimail bg разширен +felamimail common bg Електронна поща +file into felamimail bg файл в +files felamimail bg файлове +filter active felamimail bg филтърът е активен +filter name felamimail bg Име на филтъра +filter rules common bg правила на филтриране +first name felamimail bg Собствено име +flagged felamimail bg с флагче +flags felamimail bg Маркери +folder felamimail bg папка +folder acl felamimail bg списък за достъп до папката +folder name felamimail bg Име на папката +folder path felamimail bg Път до папката +folder preferences felamimail bg Настройки на папката +folder settings felamimail bg Настройки на папката +folder status felamimail bg Състояние на папката +folderlist felamimail bg Списък с папки +foldername felamimail bg Име на папката +folders felamimail bg Папки +folders created successfully! felamimail bg Папката е създадена успешно! +follow felamimail bg следва +for mail to be send - not functional yet felamimail bg За изпращане на съобщения - все още не функционира +for received mail felamimail bg За получени съобщения +forward felamimail bg Препращане +forward as attachment felamimail bg препращане като приложение +forward inline felamimail bg препращане в съобщението +forward messages to felamimail bg Препращане на съобщението до +forward to felamimail bg препрати до +forward to address felamimail bg препрати до адрес +forwarding felamimail bg Препращане +found felamimail bg Намерен(и) +fri felamimail bg Пет +from felamimail bg Подател +from(a->z) felamimail bg Подател (A->Z) +from(z->a) felamimail bg Подател (Z->A) +full name felamimail bg Име +greater than felamimail bg по-голямо от +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail bg Посетете www.felamimail.org, за да научите повече за Squirrelmail.
    +header lines felamimail bg Заглавна част +hide header felamimail bg скрий заглавната част +hostname / address felamimail bg име на хост / адрес +how to forward messages felamimail bg как да се препращат съобщенията +html felamimail bg HTML +icons and text felamimail bg Икони и текст +icons only felamimail bg Само икони +identity felamimail bg самоличност +if felamimail bg АКО +if from contains felamimail bg ако "От:" съдържа +if mail header felamimail bg ако заглавната част +if message size felamimail bg ако размерът на съобщението +if shown, which folders should appear on main screen felamimail bg Кои папки да се появяват на главния екран? +if subject contains felamimail bg ако Темата съдържа +if to contains felamimail bg ако "До:" съдържа +if using ssl or tls, you must have the php openssl extension loaded. felamimail bg Ако използвате SSL или TLS, трябва да заредите OpenSSL разширението на PHP. +illegal folder name. please select a different name. felamimail bg Невалидно име на папка. Моля, изберете друго име. +imap felamimail bg IMAP +imap server felamimail bg IMAP сървър +imap server address felamimail bg Адрес на IMAP сървъра +imap server closed the connection. felamimail bg IMAP сървъра прекрати връзката. +imap server closed the connection. server responded: %s felamimail bg IMAP сървъра прекрати връзката с отговор: %s +imap server password felamimail bg парола за IMAP сървъра +imap server type felamimail bg тип на IMAP сървъра +imap server username felamimail bg име на потребител за IMAP сървъра +imaps authentication felamimail bg IMAPS оторизация +imaps encryption only felamimail bg само IMAPS кодиране +import felamimail bg импорт +import mail felamimail bg Импорт на поща +in felamimail bg в +inbox felamimail bg Входящи +incoming mail server(imap) felamimail bg Сървър за входяща поща (IMAP) +index order felamimail bg Подреждане +info felamimail bg Информация +invalid user name or password felamimail bg Грешно име или парола +javascript felamimail bg JavaScript +jumping to end felamimail bg прескачане към края +jumping to start felamimail bg прескачане към началото +junk felamimail bg Нежелани +keep a copy of the message in your inbox felamimail bg запазване на копие от съобщението във Входящи +keep local copy of email felamimail bg запазване на локално копие на съобщенията +kilobytes felamimail bg килобайта +language felamimail bg Език +last name felamimail bg Фамилия +left felamimail bg Наляво +less felamimail bg по-малко +less than felamimail bg по-малко от +light gray felamimail bg Светлосив +list all felamimail bg Покажи всички +loading felamimail bg зареждане +location of buttons when composing felamimail bg Местоположение на бутоните при създаване/писане +mail server login type admin bg Тип на влизане (login) в Mail сървъра +mail settings felamimail bg Настройки на пощата +mainmessage felamimail bg главно съобщение +manage email accounts and identities common bg Управление на E-Mail акаунти и самоличности +manage emailaccounts common bg Управление на E-Mail акаунтите +manage emailfilter / vacation preferences bg Управление на E-Mail филтър / "Ваканция" +manage folders common bg Управление на папките +manage sieve common bg Управление на Sieve скриптовете +manage signatures felamimail bg Управление на подписите +mark as deleted felamimail bg Маркирай като изтрито +mark messages as felamimail bg Маркирай избраните съобщения като +mark selected as flagged felamimail bg Маркирай избраните с флагче +mark selected as read felamimail bg Маркирай избраните като Прочетени +mark selected as unflagged felamimail bg Маркирай избраните без флагче +mark selected as unread felamimail bg Маркирай избраните като Непрочетени +match felamimail bg Съвпада +matches felamimail bg съвпада с +matches regexp felamimail bg съвпада с рег. израз +max uploadsize felamimail bg максимален обем: +message list felamimail bg Списък със съобщения +messages felamimail bg съобщения +mon felamimail bg Пон +move felamimail bg премести +move messages felamimail bg премести съобщенията +move selected to felamimail bg премести избраните в +move to trash felamimail bg Премести в Кошчето +moving messages to felamimail bg преместване на съобщенията в +name felamimail bg Име +never display html emails felamimail bg Не показва HTML съобщения +new common bg Ново +new filter felamimail bg Нов филтър +next felamimail bg Следващо +next message felamimail bg следващо съобщение +no active imap server found!! felamimail bg Не е открит активен IMAP сървър! +no address to/cc/bcc supplied, and no folder to save message to provided. felamimail bg Не е посочен адрес ДО/Копие/Скрито копие и не е зададена папка за запазване на съобщението. +no encryption felamimail bg без криптиране +no filter felamimail bg Без филтър +no folders found felamimail bg Не са намерени папки +no folders were found to subscribe to! felamimail bg Не са намерени папки, за които да се абонирате! +no folders were found to unsubscribe from! felamimail bg Не са намерени папки, за които да отмените абонамент! +no message returned. felamimail bg Не са открити съобщения +no messages found... felamimail bg няма открити съобщения... +no messages selected, or lost selection. changing to folder felamimail bg Няма избрани съобщения или изборът е изгубен. Показване на папка +no messages were selected. felamimail bg Няма избрани съобщения +no plain text part found felamimail bg липсва текстова част +no previous message felamimail bg нама предишно съобщение +no recipient address given! felamimail bg Не е посочен адрес на получател! +no signature felamimail bg няма подпис +no subject given! felamimail bg Не е посочена Тема! +no supported imap authentication method could be found. felamimail bg Не се поддържа зададеният метод за IMAP оторизация. +no valid emailprofile selected!! felamimail bg Не е избран валиден E-Mail профил! +none felamimail bg няма +on felamimail bg на +only inbox felamimail bg Само Входящи +only one window felamimail bg само в един прозорец +only unseen felamimail bg Само не отворените +open all felamimail bg отвори всички +options felamimail bg Опции +or felamimail bg или +organisation felamimail bg организация +organization felamimail bg организация +organization name admin bg Име на организацията +original message felamimail bg оригинално съобщение +outgoing mail server(smtp) felamimail bg сървър за изходяща поща (SMTP) +participants felamimail bg Участници +personal information felamimail bg Лична информация +please select a address felamimail bg Моля, изберете адрес +please select the number of days to wait between responses felamimail bg Моля, изберете брой дни за изчакване между отговорите +please supply the message to send with auto-responses felamimail bg Моля, въведете съобщение за изпращане като Автоматичен отговор +port felamimail bg порт +previous felamimail bg Предишно +previous message felamimail bg предишно съобщение +print it felamimail bg отпечатване +print this page felamimail bg отпечатване на страницата +printview felamimail bg изглед за печат +quicksearch felamimail bg Бързо търсене +read felamimail bg прочетено +reading felamimail bg четене на +receive notification felamimail bg Обратна разписка +refresh time in minutes felamimail bg Време на опресняване в минути +reject with felamimail bg откажи с +remove felamimail bg премахване +remove immediately felamimail bg Премахни незабавно +rename felamimail bg Преименуване +rename a folder felamimail bg Преименуване на папка +rename folder felamimail bg Преименуване на папка +renamed successfully! felamimail bg Успешно преименувана! +replied felamimail bg изпратен отговор +reply felamimail bg Отговор +reply all felamimail bg Отговор до всички +reply to felamimail bg Отговор До +replyto felamimail bg Отговор До +respond felamimail bg В отговор на +respond to mail sent to felamimail bg В отговор на съобщение, изпратено до +return felamimail bg Връщане +return to options page felamimail bg Връщане към страницата с опциите +right felamimail bg Дясно +row order style felamimail bg Стил на изгледа +rule felamimail bg Правило +sat felamimail bg съб +save felamimail bg Запис +save as draft felamimail bg запис като чернова +save as infolog felamimail bg запис в Дневника +save changes felamimail bg запис на промените +save message to disk felamimail bg запис на съобщението на диска +script name felamimail bg име на скрипт +script status felamimail bg състояние на скрипт +search felamimail bg Търсене +search for felamimail bg Търси +select felamimail bg Избор +select all felamimail bg Избери всички +select emailprofile felamimail bg Избор на -Mail профил +select folder felamimail bg избери папка +select your mail server type admin bg Изберете тип на Mail сървъра +send felamimail bg Изпращане +send a reject message felamimail bg изпращане на съобщение за отказ +sent felamimail bg Изпратени +sent folder felamimail bg Папка "Изпратени" +server supports mailfilter(sieve) felamimail bg сървърът поддържа филтър за поща - sieve +set as default felamimail bg По подразбиране +show header felamimail bg покажи заглавната част +show new messages on main screen felamimail bg показване на новите съобщения на началния екран +sieve script name felamimail bg име на sieve скрипт +sieve settings admin bg Настройки на Sieve +signatur felamimail bg Подпис +signature felamimail bg Подпис +simply click the target-folder felamimail bg Кликнете на папката, в която да се копира/премести +size felamimail bg Размер +size of editor window felamimail bg Размер на прозореца на редактора +size(...->0) felamimail bg Размер (...->0) +size(0->...) felamimail bg Размер (0->...) +skipping forward felamimail bg прескачане напред +skipping previous felamimail bg прескачане назад +small view felamimail bg умален изглед +smtp settings admin bg SMTP настройки +start new messages with mime type plain/text or html? felamimail bg Започва нови съобщения като чист текст или HTML? +subject felamimail bg Тема +subject(a->z) felamimail bg Тема (A->Z) +subject(z->a) felamimail bg Тема (Z->A) +submit felamimail bg Предаване +subscribe felamimail bg Включи абонамент +subscribed felamimail bg Включен абонамент +subscribed successfully! felamimail bg Абонаментът е успешен! +sun felamimail bg Нед +system signature felamimail bg генериран от системата +table of contents felamimail bg Съдържание +template folder felamimail bg Папка "Шаблони" +templates felamimail bg Шаблони +text only felamimail bg Само текст +text/plain felamimail bg текст +the connection to the imap server failed!! felamimail bg Неуспешна връзка с IMAP сървъра!! +the imap server does not appear to support the authentication method selected. please contact your system administrator. felamimail bg IMAP сървъра вероятно не поддържа избрания метод на оторизация. Моля, свържете се с Вашия системен Администратор! +the message sender has requested a response to indicate that you have read this message. would you like to send a receipt? felamimail bg Подателят на съобщението е заявил обратна разписка. Желаете ли да му я изпратите? +then felamimail bg ТОГАВА +this folder is empty felamimail bg Папката е празна +this php has no imap support compiled in!! felamimail bg PHP няма включена поддръжка за IMAP!!! +thu felamimail bg Чет +to felamimail bg До +to use a tls connection, you must be running a version of php 5.1.0 or higher. felamimail bg За да използвате TLS е необходима версия на PHP 5.1.0 или по-висока. +translation preferences felamimail bg Настройки за превод +translation server felamimail bg Сървър за превод +trash felamimail bg Кошче +trash fold felamimail bg Папка "Кошче" +trash folder felamimail bg Папка "Кошче" +tue felamimail bg Вт +type felamimail bg тип +unexpected response from server to authenticate command. felamimail bg Неочакван отговор от сървъра на команда AUTHENTICATE. +unexpected response from server to digest-md5 response. felamimail bg Неочакван отговор от сървъра на Digest-MD5. +unexpected response from server to login command. felamimail bg Неочакван отговор от сървъра на команда LOGIN. +unflagged felamimail bg немаркирано +unknown err felamimail bg Неустановена грешка +unknown error felamimail bg Неустановена грешка +unknown imap response from the server. server responded: %s felamimail bg Неизвестен отговор от IMAP сървъра: %s +unknown sender felamimail bg Неизвестен Подател +unknown user or password incorrect. felamimail bg Несъществуващ потребител или грешна парола. +unread common bg Непрочетено +unseen felamimail bg Неотворено +unselect all felamimail bg Размаркира всички +unsubscribe felamimail bg Прекъсва абонамент +unsubscribed felamimail bg Прекъснат абонамент +unsubscribed successfully! felamimail bg Абонаментът е прекъснат успешно! +up felamimail bg нагоре +updating message status felamimail bg обновява състоянието на съобщението +updating view felamimail bg обновява изгледа +use emailadmin to create profiles felamimail bg използвайте EmailAdmin за създаване на профили +use a signature felamimail bg Включване на подпис +use a signature? felamimail bg Включване на подпис? +use addresses felamimail bg Включване на адреси +use custom identities felamimail bg самоличност по избор +use custom settings felamimail bg Настройки по избор +use regular expressions felamimail bg използвай регулярни изрази +use smtp auth admin bg използвай SMTP оторизация +users can define their own emailaccounts admin bg Потребителите могат да дефинират собствени E-Mail акаунти +vacation notice common bg ваканционна бележка +vacation notice is active felamimail bg Активирана е ваканционна бележка +vacation start-date must be before the end-date! felamimail bg Началото на ваканцията трябва да е ПРЕДИ края! +validate certificate felamimail bg валидиране на сертификат +view full header felamimail bg Покажи подробни заглавни части +view header lines felamimail bg Заглавна част (Header) +view message felamimail bg Покажи съобщението +viewing full header felamimail bg Заглавни части (Header) +viewing message felamimail bg Показване на съобщение +viewing messages felamimail bg Показани съобщения +wed felamimail bg Сря +when deleting messages felamimail bg При изтриване на съобщения +which folders - in general - should not be automatically created, if not existing felamimail bg кои папки НЕ следва са се създават автоматично, ако не съществуват. +with message felamimail bg със съобщение +with message "%1" felamimail bg със съобщение "%1" +writing felamimail bg писане +wrote felamimail bg написа +you can use %1 for the above start-date and %2 for the end-date. felamimail bg Може да посочите %1 за началната дата и %2 за крайната. +you have received a new message on the felamimail bg Получено е ново съобщение на +your message to %1 was displayed. felamimail bg Вашето съобщение до %1 е отворено. diff --git a/felamimail/lang/egw_ca.lang b/felamimail/lang/egw_ca.lang new file mode 100644 index 0000000000..402f8a1f0f --- /dev/null +++ b/felamimail/lang/egw_ca.lang @@ -0,0 +1,345 @@ +(no subject) felamimail ca (Sense assumpte) +(only cc/bcc) felamimail ca (només Cc/Cco) +(unknown sender) felamimail ca (remitent desconegut) +activate felamimail ca Activar +activate script felamimail ca activar script +add address felamimail ca Afegir adreça +add rule felamimail ca Afegir regla +add script felamimail ca Afegir script +add to %1 felamimail ca Afegir a %1 +add to address book felamimail ca Afegir a la llibreta d'adreces +add to addressbook felamimail ca Afegir a la llibreta d'adreces +additional info felamimail ca Informació addicional +address book felamimail ca Llibreta d'adreces +address book search felamimail ca Cercar a la llibreta d'adreces +after message body felamimail ca Després del cos del missatge +all address books felamimail ca Totes les llibretes d'adreces +all folders felamimail ca Totes les carpetes +all of felamimail ca tots +allways a new window felamimail ca sempre en una finestra nova +always show html emails felamimail ca Mostra sempre els correus HTML +any of felamimail ca algun +anyone felamimail ca qualsevol +as a subfolder of felamimail ca com una subcarpeta de +attachments felamimail ca Adjunts +auto refresh folder list felamimail ca Autorefrescar la llista de carpetes +back to folder felamimail ca Tornar a la carpeta +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail ca Basat en els criteris donats, els missatges que arribin poden tenir distints colors de fons a la llista de missatges. Això ajuda a distinguir fàcilment de qui són els missatges, especialment per a llistes de correu. +bcc felamimail ca Cco +before headers felamimail ca Abans de les capçaleres +between headers and message body felamimail ca Entre les capçaleres i el cos del missatge +body part felamimail ca Part del cos +can't connect to inbox!! felamimail ca no es pot connectar a la Safata d'Entrada!! +cc felamimail ca Cc +change folder felamimail ca Canviar carpeta +check message against next rule also felamimail ca aplica la següent regla a aquest missatge +checkbox felamimail ca Quadre de verificació +click here to log back in. felamimail ca Pitjeu aquí per tornar a iniciar sessió +click here to return to %1 felamimail ca Pitjeu aquí per tornar a %1 +close all felamimail ca tanca-ho tot +close this page felamimail ca tancar aquesta pàgina +close window felamimail ca Tancar finestra +color felamimail ca Color +compose felamimail ca Redactar +compress folder felamimail ca Comprimir carpeta +configuration felamimail ca Configuració +contains felamimail ca conté +create felamimail ca Crear +create folder felamimail ca Crear carpeta +create sent felamimail ca Crear carpeta d'enviats +create subfolder felamimail ca Crear subcarpeta +create trash felamimail ca Crear Paperera +created folder successfully! felamimail ca La carpeta s'ha creat correctament +dark blue felamimail ca Blau fosc +dark cyan felamimail ca Cyan fosc +dark gray felamimail ca Gris fosc +dark green felamimail ca Verd fosc +dark magenta felamimail ca Magenta fosc +dark yellow felamimail ca Groc fosc +date(newest first) felamimail ca Data (la més recent primer) +date(oldest first) felamimail ca Data (la més antiga primer) +days felamimail ca dies +deactivate script felamimail ca desactivar seqüència +default sorting order felamimail ca Mode d'ordenació predeterminat +delete all felamimail ca Esborrar tots +delete folder felamimail ca Esborrar carpeta +delete script felamimail ca esborra seqüència +delete selected felamimail ca Esborrar la selecció +delete selected messages felamimail ca Esborrar missatges seleccionats +deleted felamimail ca esborrat +deleted folder successfully! felamimail ca Carpeta esborrada correctament +disable felamimail ca Deshabilitar +discard message felamimail ca elimina el missatge +display message in new window felamimail ca Mostrar el missatge a una finestra nova +display messages in multiple windows felamimail ca mostra missatges en múltiples pantalles +display of html emails felamimail ca Mostrar els missatges HTML +display only when no plain text is available felamimail ca Mostrar només quan no hi ha text simple disponible +display preferences felamimail ca Preferències de visualització +do it! felamimail ca Fes-ho! +do not use sent felamimail ca No utilitzar Enviats +do not use trash felamimail ca No utilitzar Paperera +do you really want to delete the '%1' folder? felamimail ca Realment voleu esborrar la carpeta '%1'? +does not contain felamimail ca No conté +does not match felamimail ca No coincideix amb +does not match regexp felamimail ca No coincideix amb l'expressió +don't use sent felamimail ca No utilitzar Enviats +don't use trash felamimail ca No utilitzar Paperera +down felamimail ca avall +download felamimail ca baixar +download this as a file felamimail ca Baixar això com un fitxer +e-mail felamimail ca Correu electrònic +e-mail address felamimail ca Adreça de correu electrònic +e-mail folders felamimail ca Carpetes de correu electrònic +edit email forwarding address felamimail ca edita l'adreça de reenviar correu +edit filter felamimail ca Editar filtre +edit rule felamimail ca Afegir regla +edit selected felamimail ca Editar selecció +edit vacation settings felamimail ca edita configuració de vacances +email address felamimail ca Adreça de correu electrònic +email forwarding address felamimail ca adreça de reenviar correu +email signature felamimail ca Signatura de correu +empty trash felamimail ca Buidar paperera +enable felamimail ca Habilitar +enter your default mail domain ( from: user@domain ) admin ca Introduïu el vostre domini de correu predeterminat (de usuari@domini) +enter your imap mail server hostname or ip address admin ca Introduïu el nom del servidor de correu IMAP o l'adreça IP +enter your sieve server hostname or ip address admin ca Introduïu el nom del servidor SIEVE o l'adreça IP +enter your sieve server port admin ca Introduïu el port del servidor SIEVE +enter your smtp server hostname or ip address admin ca Introduïu el nom del servidor SIEVE o l'adreça IP +enter your smtp server port admin ca Introduïu el port del servidor smtp +error felamimail ca ERROR +error connecting to imap serv felamimail ca Error en connectar al servidor IMAP +error opening felamimail ca Error en obrir +every felamimail ca cada +every %1 days felamimail ca cada %1 dies +expunge felamimail ca Suprimir +felamimail common ca FelaMiMail +file into felamimail ca Informació del fitxer +files felamimail ca Fitxers +filter active felamimail ca Filtre actiu +filter name felamimail ca Nom del filtre +filter rules common ca regles de filtratge +first name felamimail ca Nom de pila +flagged felamimail ca marcat +flags felamimail ca Marques +folder acl felamimail ca ACL de la carpeta +folder name felamimail ca Nom de la carpeta +folder path felamimail ca Ruta de la carpeta +folder preferences felamimail ca Preferències de la carpeta +folder settings felamimail ca Opcions de la carpeta +folder status felamimail ca Estat de la carpeta +folderlist felamimail ca Llista de carpetes +foldername felamimail ca Nom de la carpeta +folders felamimail ca Carpetes +folders created successfully! felamimail ca Les carpetes s'han creat correctament +follow felamimail ca seguir +for mail to be send - not functional yet felamimail ca Pel correu pendent d'enviar - encara no funciona +for received mail felamimail ca Pel correu rebut +forward felamimail ca Reenviar +forward to address felamimail ca reenvia a l'adreça +found felamimail ca Trobat +fri felamimail ca Dv +from felamimail ca De +from(a->z) felamimail ca De (A-> Z) +from(z->a) felamimail ca De (Z-> A) +full name felamimail ca Nom sencer +greater than felamimail ca major que +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail ca Donau un cop d'ull a www.felamimail.org per saber-ne més sobre Squirrelmail.
    +header lines felamimail ca Línies de Capçalera +hide header felamimail ca Ocultar capçalera +html felamimail ca HTML +icons and text felamimail ca Icones i text +icons only felamimail ca Només icones +identifying name felamimail ca Nom identificatiu +if felamimail ca SI +if from contains felamimail ca si el remitent conté +if mail header felamimail ca si la capçalera del correu +if message size felamimail ca si la mida del missatge +if subject contains felamimail ca si l'assumpte conté +if to contains felamimail ca si el destinatari conté +illegal folder name. please select a different name. felamimail ca Nom de carpeta il·legal. Si us plau, seleccioneu un nom distint +imap felamimail ca IMAP +imap server felamimail ca Servidor IMAP +imap server address felamimail ca Adreça del servidor IMAP +imap server type felamimail ca Tipus de servidor IMAP +imaps authentication felamimail ca Identificació IMAPS +imaps encryption only felamimail ca Xifrat IMAPS només +in felamimail ca a +index order felamimail ca Ordre de l'índex +info felamimail ca Informació +invalid user name or password felamimail ca L'usuari o la contrasenya no són vàlids +javascript felamimail ca JavaScript +keep a copy of the message in your inbox felamimail ca manté una còpia del missatge dins la safata d'entrada +keep local copy of email felamimail ca manté una còpia local del correu +kilobytes felamimail ca kilobytes +language felamimail ca Idioma +last name felamimail ca Cognoms +left felamimail ca Esquerra +less felamimail ca menys +less than felamimail ca menor que +light gray felamimail ca Gris clar +list all felamimail ca Llista-ho tot +location of buttons when composing felamimail ca Ubicació dels botons en redactar +mail server login type admin ca Tipus de sessió del servidor de correu +mail settings felamimail ca Configuració del correu +mainmessage felamimail ca missatge principal +manage emailfilter / vacation preferences ca Administra filtre d'Email / Vacances +manage folders common ca Administrar carpetes +manage sieve common ca Administrar scripts Sieve +mark as deleted felamimail ca Marcar com a esborrat +mark messages as felamimail ca Marcar missatges seleccionats com a +mark selected as flagged felamimail ca Marcar la selecció com a senyalat per a descarregar +mark selected as read felamimail ca Marcar la selecció com a llegit +mark selected as unflagged felamimail ca Marcar la selecció com a no senyalat per a descarregar +mark selected as unread felamimail ca Marcar la selecció com a no llegit +match felamimail ca Coincidència +matches felamimail ca coincideix +matches regexp felamimail ca coincideix amb l'expressió +message highlighting felamimail ca Resaltat del missatge +message list felamimail ca Llista de missatges +messages felamimail ca missatges +mon felamimail ca Dl +move felamimail ca moure +move messages felamimail ca moure missatges +move selected to felamimail ca moure els seleccionats a +move to trash felamimail ca Moure a la paperera +moving messages to felamimail ca movent missatges a +name felamimail ca Nom +never display html emails felamimail ca No mostrar mai els correus HTML +new common ca Nou +new filter felamimail ca Nou filtre +next felamimail ca Següent +next message felamimail ca Missatge següent +no filter felamimail ca Sense filtre +no folders found felamimail ca No s'han trobat carpetes +no folders were found to subscribe to! felamimail ca No s'han trobat carpetes on subscriure's +no folders were found to unsubscribe from! felamimail ca No s'han trobat carpetes de les que desubscriure's +no highlighting is defined felamimail ca No s'ha definit un resaltat +no messages found... felamimail ca no s'han trobat missatges... +no messages were selected. felamimail ca No s'han seleccionat missatges. +no previous message felamimail ca No hi ha missatge anterior +no valid emailprofile selected!! felamimail ca No s'ha seleccionat un perfil de correu vàlid!! +none felamimail ca cap +on behalf of felamimail ca en nom de +one address is not valid felamimail ca Una adreça no és vàlida +only inbox felamimail ca Només la Safata d'entrada +only one window felamimail ca només una finestra +only unseen felamimail ca Només els no vists +open all felamimail ca obre-ho tot +options felamimail ca Opcions +organisation felamimail ca Organització +organization felamimail ca Organització +organization name admin ca Nom de l'organització +participants felamimail ca Participants +personal information felamimail ca Informació personal +please select a address felamimail ca Si us plau, seleccioneu una adreça +please select the number of days to wait between responses felamimail ca Si us plau, seleccioneu el número de dies a esperar entre respostes +please supply the message to send with auto-responses felamimail ca Si us plau, indiqueu el missatge a enviar amb auto-respostes +posting felamimail ca enviar +previous felamimail ca Anterior +previous message felamimail ca Missatge anterior +print it felamimail ca Imprimir-lo +print this page felamimail ca Imprimir aquesta pàgina +quicksearch felamimail ca Cerca ràpida +read felamimail ca llegit +reading felamimail ca llegint +recent felamimail ca recent(s) +refresh time in minutes felamimail ca Temps de refresc en minuts +remove felamimail ca eliminar +remove immediately felamimail ca Eliminar inmediatament +rename felamimail ca Renomenar +rename a folder felamimail ca Renomenar una carpeta +rename folder felamimail ca Renomenar carpeta +renamed successfully! felamimail ca Renomenat correctament +replied felamimail ca respost +reply felamimail ca Respondre +reply all felamimail ca Respondre a tots +reply to felamimail ca Respondre A +replyto felamimail ca Respondre A +respond felamimail ca Respondre +respond to mail sent to felamimail ca Respondre al correu enviat a +return felamimail ca Tornar +return to options page felamimail ca Tornar a la pàgina d'opcions +right felamimail ca Dreta +rule felamimail ca Regla +sat felamimail ca Ds +save felamimail ca Desar +save changes felamimail ca desar canvis +script name felamimail ca nom de la seqüència +script status felamimail ca estat de la seqüència +search felamimail ca Cercar +search for felamimail ca Cercar +select felamimail ca Seleccionar +select all felamimail ca Seleccionar tot +select emailprofile felamimail ca Seleccionar perfil de correu +select folder felamimail ca Selecciona la carpeta +select your mail server type admin ca Seleccionar el tipus de servidor de correu +send felamimail ca Enviar +send a reject message felamimail ca envia un missatge de rebuig +sent folder felamimail ca Carpeta d'enviats +show header felamimail ca mostrar capçalera +show new messages on main screen felamimail ca Mostrar missatges nous a la pantalla principal +sieve settings admin ca Configuració de Sieve +signature felamimail ca Signatura +simply click the target-folder felamimail ca Senzillament, cliqueu sobre la carpeta destinació +size felamimail ca Mida +size of editor window felamimail ca Mida de la finestra de l'editor +size(...->0) felamimail ca Mida (...->0) +size(0->...) felamimail ca Mida (0->...) +small view felamimail ca Vista reduïda +smtp settings admin ca Opcions SMTP +subject felamimail ca Assumpte +subject(a->z) felamimail ca Assumpte (A->Z) +subject(z->a) felamimail ca Assumpte (Z->A) +submit felamimail ca Enviar +subscribe felamimail ca Subscriure's +subscribed felamimail ca Subscrit +subscribed successfully! felamimail ca Subscripció correcta +sun felamimail ca Dg +table of contents felamimail ca Taula de continguts +text only felamimail ca Només text +the connection to the imap server failed!! felamimail ca Ha fallat la connexió amb el servidor IMAP! +then felamimail ca ALESHORES +this folder is empty felamimail ca AQUESTA CARPETA ESTÀ BUIDA +this php has no imap support compiled in!! felamimail ca Aquesta instal·lació de PHP no té suport IMAP! +thu felamimail ca Dj +to felamimail ca Per a +to mail sent to felamimail ca al correu enviat a +translation preferences felamimail ca Preferències de la traducció +translation server felamimail ca Servidor de traduccions +trash fold felamimail ca Carpeta Paperera +trash folder felamimail ca Carpeta Paperera +tue felamimail ca Dt +type felamimail ca tipus +unflagged felamimail ca Sense senyalar +unknown err felamimail ca Error desconegut +unknown error felamimail ca Error desconegut +unknown sender felamimail ca Remitent desconegut +unknown user or password incorrect. felamimail ca Usuari desconegut o contrasenya incorrecta +unread common ca No llegit +unseen felamimail ca No vist +unselect all felamimail ca Deseleccionar tot +unsubscribe felamimail ca Desubscriure +unsubscribed felamimail ca No subscrit +unsubscribed successfully! felamimail ca Desubscripció correcta +up felamimail ca a dalt +use emailadmin to create profiles felamimail ca utilitzeu EmailAdmin per a crear perfils de correu +use a signature felamimail ca Utilitzar una signatura +use a signature? felamimail ca Utilitzar una signatura? +use addresses felamimail ca Utilitzar adreces +use custom settings felamimail ca Utilitzar opcions personalitzades +use regular expressions felamimail ca utilitza expressions regulars +use smtp auth admin ca Utilitzar identificació SMTP +users can define their own emailaccounts admin ca Els usuaris poden definir els seus propis comptes de correu +vacation notice common ca notificació de vacances +view full header felamimail ca Veure la capçalera sencera +view message felamimail ca Veure missatge +viewing full header felamimail ca Veient la capçalera sencera +viewing message felamimail ca Veient missatge +viewing messages felamimail ca Veient missatges +wed felamimail ca Dc +when deleting messages felamimail ca En esborrar missatges +with message felamimail ca amb missatge +with message "%1" felamimail ca amb missatge "%1" +wrap incoming text at felamimail ca Ajustar el text entrant a +writing felamimail ca escrivint +wrote felamimail ca ha escrit diff --git a/felamimail/lang/egw_cs.lang b/felamimail/lang/egw_cs.lang new file mode 100644 index 0000000000..cd6a57c0e7 --- /dev/null +++ b/felamimail/lang/egw_cs.lang @@ -0,0 +1,494 @@ +%1 is not writable by you! felamimail cs Pro %1 nemáte oprávnění k zápisu! +(no subject) felamimail cs (žádný předmět) +(only cc/bcc) felamimail cs (jen Kopie/Skrytá kopie) +(separate multiple addresses by comma) felamimail cs (více adres oddělte čárkou) +(unknown sender) felamimail cs (neznámý odesílatel) +activate felamimail cs Aktivovat +activate script felamimail cs aktivovat skript +activating by date requires a start- and end-date! felamimail cs Aktivace datumem vyžaduje nastavení počátečního A koncového data! +add acl felamimail cs přidat acl +add address felamimail cs Přidat adresu +add rule felamimail cs Přidat pravidlo +add script felamimail cs Přidat skript +add to %1 felamimail cs Přidat k %1 +add to address book felamimail cs Přidat do adresáře +add to addressbook felamimail cs přidat do adresáře +adding file to message. please wait! felamimail cs Připojuji soubor ke zprávě. Prosím čekejte! +additional info felamimail cs Další informace +address book felamimail cs Adresář +address book search felamimail cs Vyhledávání v adresáři +after message body felamimail cs Za tělem zprávy +all address books felamimail cs Všechny adresáře +all folders felamimail cs Všechny složky +all of felamimail cs vše z +allow images from external sources in html emails felamimail cs Povolit obrázky z externích zdrojů v HTML e-mailech +allways a new window felamimail cs Vždy nové okno +always show html emails felamimail cs Vždy zobrazovat HTML e-maily +and felamimail cs a +any of felamimail cs kterýkoli z +any status felamimail cs jakýkoli status +anyone felamimail cs kdokoli +as a subfolder of felamimail cs jako podsložka (čeho) +attach felamimail cs Připojit +attachments felamimail cs Přílohy +authentication required felamimail cs vyžadována autentikace +auto refresh folder list felamimail cs Automaticky obnovit seznam složek +back to folder felamimail cs Zpět do složky +bad login name or password. felamimail cs Chybné přihlašovací jméno nebo heslo. +bad or malformed request. server responded: %s felamimail cs Chybný nebo špatně fomulovaný požadavek. Server odpověděl: %s +bad request: %s felamimail cs Chybný požadavek: %s +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail cs Příchozí zprávy mohou mít na základě zadaných kritérií odlišné barvy na pozadí v seznamu zpráv. Snadno pak odlišíte zprávy od různých odesílatelů, což se hodí zejména v diskusních skupinách. +bcc felamimail cs Skrytá kopie +before headers felamimail cs Před hlavičkami +between headers and message body felamimail cs Mezi hlavičkami a tělem zprávy +body part felamimail cs část těla +by date felamimail cs datumem +can not send message. no recipient defined! felamimail cs není možné odeslat zprávu, příjemce nebyl definován! +can't connect to inbox!! felamimail cs nelze se připojit k INBOXu!! +cc felamimail cs Kopie +change folder felamimail cs Změnit složku +check message against next rule also felamimail cs zkontrolovat zprávu také proti následujícímu pravidlu +checkbox felamimail cs Zaškrtávací políčko +clear search felamimail cs Nové hledání +click here to log back in. felamimail cs Klikněte sem pro opětovné přihlášení. +click here to return to %1 felamimail cs Klikněte se pro návrat na %1 +close all felamimail cs zavřít vše +close this page felamimail cs zavřít tuto stránku +close window felamimail cs Zavřít okno +color felamimail cs Barva +compose felamimail cs Nová zpráva +compose as new felamimail cs Vytvořit jako novou zprávu +compress folder felamimail cs Komprimovat složku +condition felamimail cs podmínka +configuration felamimail cs Konfigurace +configure a valid imap server in emailadmin for the profile you are using. felamimail cs Nakonfigurujte platný IMAP server v Administrátoru pošty pro profil, který používáte. +connection dropped by imap server. felamimail cs Připojení ukončeno IMAP serverem. +contact not found! felamimail cs Kontakt nebyl nalezen! +contains felamimail cs obsahuje +could not complete request. reason given: %s felamimail cs Nemohu dokončit požadavek. Důvod: %s +could not import message: felamimail cs Nemohu importovat zprávu: +could not open secure connection to the imap server. %s : %s. felamimail cs Nemohu otevřít zabezpečené připojení k IMAP serveru. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. felamimail cs CRAM-MD5 nebo DIGEST-MD5 vyžadují nainstalovaný balík Auth_SASL. +create felamimail cs Vytvořit +create folder felamimail cs Vytvořit složku +create sent felamimail cs Vytvořit složku Odeslané +create subfolder felamimail cs Vytvořit podsložku +create trash felamimail cs Vytvořit složku Koš +created folder successfully! felamimail cs Složka byla úspešně vytvořena! +dark blue felamimail cs Tmavě modrá +dark cyan felamimail cs Tmavě azurová +dark gray felamimail cs Tmavě šedá +dark green felamimail cs Tmavě zelená +dark magenta felamimail cs Tmavě fialová +dark yellow felamimail cs Tmavě žlutá +date(newest first) felamimail cs Datum (od nejnovějšího) +date(oldest first) felamimail cs Datum (od nejstaršího) +days felamimail cs dny +deactivate script felamimail cs deaktivace skriptu +default felamimail cs výchozí +default signature felamimail cs výchozí podpis +default sorting order felamimail cs Výchozí třídění +delete all felamimail cs smazat vše +delete folder felamimail cs Smazat složku +delete script felamimail cs smazat skript +delete selected felamimail cs Smazat vybrané +delete selected messages felamimail cs smazat vybrané zprávy +deleted felamimail cs smazané +deleted folder successfully! felamimail cs Složka úspěšně smazána ! +deleting messages felamimail cs mažu zprávy +disable felamimail cs Zakázat +discard felamimail cs zahodit +discard message felamimail cs zahodit zprávu +display message in new window felamimail cs Zobrazit zprávu v novém okně +display messages in multiple windows felamimail cs Zobrazovat zprávy ve více oknech +display of html emails felamimail cs Zobrazování HTML zpráv +display only when no plain text is available felamimail cs Zobrazovat jen pokud není k dispozici prostý text +display preferences felamimail cs Předvolby zobrazení +displaying html messages is disabled felamimail cs zobrazování HTML zpráv je zakázáno +do it! felamimail cs Proveď ! +do not use sent felamimail cs Nepoužívat Odeslané +do not use trash felamimail cs Nepoužívat Koš +do not validate certificate felamimail cs neověřovat certifikát +do you really want to delete the '%1' folder? felamimail cs Opravdu chcete smazat složku '%1' ? +do you really want to delete the selected accountsettings and the assosiated identity. felamimail cs Opravdu chcete smazat vybraná nastavení účtu a přiřazené identity? +do you really want to delete the selected signatures? felamimail cs Opravdu chcete smazat vybrané podpisy? +do you really want to move the selected messages to folder: felamimail cs Opravdu chcete přesunout vybrané zprávy do složky: +do you want to be asked for confirmation before moving selected messages to another folder? felamimail cs Chcete být požádáni o potvrzení při přesouvání vybraných zpráv do jiné složky? +do you want to prevent the editing/setup for forwarding of mails via settings (, even if sieve is enabled)? felamimail cs Chcete zablokovat změny v přesměrování pošty prostřednictvím nastavení (i když je povolen SIEVE)? +do you want to prevent the editing/setup of filter rules (, even if sieve is enabled)? felamimail cs Chcete zablokovat změny v pravidlech pro filtrování pošty (i když je povolen SIEVE)? +do you want to prevent the editing/setup of notification by mail to other emailadresses if emails arrive (, even if sieve is enabled)? felamimail cs Chcete zablokovat změny v zasílání upozornění na příchod zprávy (i když je povolen SIEVE)? +do you want to prevent the editing/setup of the absent/vacation notice (, even if sieve is enabled)? felamimail cs Chcete zablokovat změny ve zprávách o nepřítomnosti (i když je povolen SIEVE)? +do you want to prevent the managing of folders (creation, accessrights and subscribtion)? felamimail cs Chcete zablokovat správu poštovních složek (vytváření, přidělování přístupových práv a přihlášení k odebírání)? +does not contain felamimail cs neobsahuje +does not exist on imap server. felamimail cs neexistuje na IMAP serveru. +does not match felamimail cs neshoduje se s +does not match regexp felamimail cs neshoduje se s regulárním výrazem +don't use draft folder felamimail cs Nepoužívat složku Rozepsané +don't use sent felamimail cs Nepoužívat Odeslané +don't use template folder felamimail cs Nepoužívat složku šablon +don't use trash felamimail cs Nepoužívat Koš +dont strip any tags felamimail cs neodstraňovat žádné štítky +down felamimail cs dolů +download felamimail cs stáhnout +download this as a file felamimail cs Stáhnout jako soubor +draft folder felamimail cs Rozepsané +drafts felamimail cs Rozepsané +e-mail felamimail cs E-mail +e-mail address felamimail cs E-mailová adresa +e-mail folders felamimail cs E-mailové složky +edit email forwarding address felamimail cs editovat adresu pro přeposílání +edit filter felamimail cs Editovat filtr +edit rule felamimail cs editovat pravidlo +edit selected felamimail cs Editovat vybrané +edit vacation settings felamimail cs editovat nastavení odpovědi v nepřítomnosti +editor type felamimail cs Typ editoru +email address felamimail cs E-mailová adresa +email forwarding address felamimail cs adresa pro přeposílání +email notification update failed felamimail cs aktualizace e-mailových upozornění se nezdařila +email signature felamimail cs Podpis zprávy +emailaddress felamimail cs e-mailová adresa +empty trash felamimail cs vyprázdnit koš +enable felamimail cs povolit +encrypted connection felamimail cs šifrované připojení +enter your default mail domain ( from: user@domain ) admin cs Zadejte Vaší výchozí poštovní doménu (z: uživatel@doména) +enter your imap mail server hostname or ip address admin cs Zadejte doménové jméno nebo IP adresu Vašeho IMAP serveru +enter your sieve server hostname or ip address admin cs Zadejte doménové jméno nebo IP adresu Vašeho SIEVE serveru +enter your sieve server port admin cs Zadejte port Vašeho SIEVE serveru +enter your smtp server hostname or ip address admin cs Zadejte doménové jméno nebo IP adresu Vašeho SMTP serveru +enter your smtp server port admin cs Zadejte port Vašeho SMTP serveru +error felamimail cs CHYBA +error connecting to imap serv felamimail cs Chyba spojení na IMAP server +error connecting to imap server. %s : %s. felamimail cs Chyba spojení na IMAP server. %s : %s. +error connecting to imap server: [%s] %s. felamimail cs Chyba spojení na IMAP server: [%s] %s. +error opening felamimail cs Chyba při otevírání +error saving %1! felamimail cs Chyba při ukládání %1! +error: felamimail cs Chyba: +error: could not save message as draft felamimail cs Chyba: Zprávu nebylo možné uložit jako rozepsanou +error: message could not be displayed. felamimail cs Chyba: Zprávu nelze zobrazit. +every felamimail cs každý +every %1 days felamimail cs každý %1 den +expunge felamimail cs Vymazat +extended felamimail cs rozšířený +felamimail common cs FelaMiMail +file into felamimail cs soubor do +filemanager felamimail cs Správce souborů +files felamimail cs soubory +filter active felamimail cs filter aktivní +filter name felamimail cs Název filtru +filter rules common cs pravidla filtru +first name felamimail cs Křestní jméno +flagged felamimail cs s příznakem +flags felamimail cs Příznaky +folder felamimail cs složka +folder acl felamimail cs acl složky +folder name felamimail cs Název složky +folder path felamimail cs Cesta ke složce +folder preferences felamimail cs Předvolby složky +folder settings felamimail cs Nastavení složky +folder status felamimail cs Stav složky +folderlist felamimail cs Seznam složek +foldername felamimail cs Název složky +folders felamimail cs Složky +folders created successfully! felamimail cs Složky byly úspěšně vytvořeny ! +follow felamimail cs následovat +for mail to be send - not functional yet felamimail cs Pro odesílanou zprávu - zatím nefunkční +for received mail felamimail cs Pro přijatou poštu +forward felamimail cs Přeposlat +forward as attachment felamimail cs přeposlat jako přílohu +forward inline felamimail cs přeposlat vložené do dopisu +forward messages to felamimail cs Přeposlat zprávu (komu) +forward to felamimail cs přeposlat (komu) +forward to address felamimail cs přeposlat na adresu +forwarding felamimail cs Přeposílání +found felamimail cs Nalezeno +fri felamimail cs Pá +from felamimail cs Od +from(a->z) felamimail cs Od (A->Z) +from(z->a) felamimail cs Od (Z->A) +full name felamimail cs Celé jméno +greater than felamimail cs větší než +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail cs Pokud se o Squirrelmail chcete dozvědět více, navštivte www.felamimail.org.
    +header lines felamimail cs Řádky hlavičky +hide header felamimail cs skrýt záhlaví +hostname / address felamimail cs doménové jméno / adresa +how to forward messages felamimail cs Jak přeposílat zprávy +html felamimail cs HTML +icons and text felamimail cs Ikony a text +icons only felamimail cs Jen ikony +identifying name felamimail cs Indentifikační jméno +identity felamimail cs Identita +if felamimail cs POKUD +if from contains felamimail cs pokud odesílatel obsahuje +if mail header felamimail cs pokud hlavička obsahuje +if message size felamimail cs pokud velikost zprávy +if shown, which folders should appear on main screen felamimail cs Při zobrazení, které složky by se měly objevit na hlavní obrazovce +if subject contains felamimail cs pokud předmět obsahuje +if to contains felamimail cs pokud adresát obsahuje +if using ssl or tls, you must have the php openssl extension loaded. felamimail cs Pro používání SSL nebo TLS musíte mít k aktivní openssl rozšíření PHP. +illegal folder name. please select a different name. felamimail cs Neplatné jméno složky. Vyberte prosím jiné. +imap felamimail cs IMAP +imap server felamimail cs IMAP Server +imap server address felamimail cs Adresa IMAP serveru +imap server closed the connection. felamimail cs IMAP server ukončil spojení. +imap server closed the connection. server responded: %s felamimail cs IMAP server ukončil spojení. Odpověděl: %s +imap server password felamimail cs heslo pro IMAP server +imap server type felamimail cs Typ IMAP serveru +imap server username felamimail cs uživatelské jméno pro IMAP server +imaps authentication felamimail cs IMAPS autentikace +imaps encryption only felamimail cs IMAPS jen šifrování +import felamimail cs importovat +import mail felamimail cs Importovat poštu +in felamimail cs v +inbox felamimail cs INBOX +incoming mail server(imap) felamimail cs server příchozí pošty (IMAP) +index order felamimail cs Pořadí indexu +info felamimail cs Info +invalid user name or password felamimail cs Neplatné uživatelské jméno nebo heslo +javascript felamimail cs JavaScript +jumping to end felamimail cs přeskakuji na konec +jumping to start felamimail cs přeskakuji na začátek +junk felamimail cs Spam +keep a copy of the message in your inbox felamimail cs zachovat kopii zprávy ve Vašem inboxu +keep local copy of email felamimail cs zachovat lokální kopii zprávy +kilobytes felamimail cs kilobytů +language felamimail cs Jazyk +last name felamimail cs Příjmení +left felamimail cs Levý +less felamimail cs menší +less than felamimail cs menší než +light gray felamimail cs Světle šedá +list all felamimail cs Zobrazit vše +loading felamimail cs nahrávám +location of buttons when composing felamimail cs Umístění tlačítek při psaní +mail server login type admin cs Typ přihlášení na poštovní server +mail settings felamimail cs Nastavení pošty +mainmessage felamimail cs hlavní zpráva +manage email accounts and identities common cs Spravovat e-mailové účty a indentity +manage emailaccounts common cs Spravovat e-mailové účty +manage emailfilter / vacation preferences cs Spravovat e-mailový filter / odpověď v nepřítomnosti +manage folders common cs Spravovat složky +manage sieve common cs Spravovat Sieve skripty +manage signatures felamimail cs Spravovat podpisy +mark as deleted felamimail cs Označit jako smazané +mark messages as felamimail cs Označit vybrané zprávy jako +mark selected as flagged felamimail cs Označit vybrané jako zprávy s příznakem +mark selected as read felamimail cs Označit vybrané jako přečtené +mark selected as unflagged felamimail cs Označit vybrané jako zprávy bez příznaku +mark selected as unread felamimail cs Označit vybrané jako nepřečtené +match felamimail cs Shoda +matches felamimail cs shoduje se s +matches regexp felamimail cs shoduje se s regulárním výrazem +max uploadsize felamimail cs maximální velikost uploadu +message highlighting felamimail cs Zvýrazňování zpráv +message list felamimail cs Seznam zpráv +messages felamimail cs zprávy +mon felamimail cs Po +move felamimail cs přesunout +move folder felamimail cs přesunout složku +move messages felamimail cs přesunout zprávy +move selected to felamimail cs přesunout vybrané (kam) +move to trash felamimail cs Přesunout do koše +moving messages to felamimail cs přesouvám zprávy do +name felamimail cs Jméno +never display html emails felamimail cs Nikdy nezobrazovat HTML e-maily +new common cs Nové +new filter felamimail cs Nový filtr +next felamimail cs Další +next message felamimail cs Další zpráva +no active imap server found!! felamimail cs Nenalezen aktivní IMAP server!! +no address to/cc/bcc supplied, and no folder to save message to provided. felamimail cs Nebyly zadány adresy Komu/Kopie/Skrytá kopie ani složka pro uložení zprávy. +no encryption felamimail cs bez šifrování +no filter felamimail cs Žádný filtr +no folders felamimail cs žádné složky +no folders found felamimail cs Nebyly nalezeny žádné složky +no folders were found to subscribe to! felamimail cs Nebyly nalezeny složky k přihlášení! +no folders were found to unsubscribe from! felamimail cs Nebyly nalezeny složky k odhlášení! +no highlighting is defined felamimail cs Žádné zvýrazňování není definováno +no imap server host configured!! felamimail cs Není nakonfigurován IMAP server!! +no message returned. felamimail cs Žádná zpráva se nevrátila. +no messages found... felamimail cs nebyly nalezeny žádné zprávy... +no messages selected, or lost selection. changing to folder felamimail cs Nebyla vybrána žádná zpráva nebo byl výběr ztracen. Přecházím do složky +no messages were selected. felamimail cs Nebyly vybrány žádné zprávy. +no plain text part found felamimail cs nebyla nalezena část ve formě prostého textu +no previous message felamimail cs žádná předchozí zpráva +no recipient address given! felamimail cs Nebyla zadána adresa příjemce! +no signature felamimail cs bez podpisu +no subject given! felamimail cs Nebyl zadán předmět! +no supported imap authentication method could be found. felamimail cs Nebyla nalezena podporovaná metoda IMAP autentikace. +no valid emailprofile selected!! felamimail cs Nebyl vybrán platný e-mailový profil!! +none felamimail cs Žádné +none, create all felamimail cs žádné, vytvořit všechny +notify when new mails arrive on these folders felamimail cs Upozornit na příchod nových zpráv do těchto složek +on felamimail cs na +on behalf of felamimail cs jménem (koho) +one address is not valid felamimail cs Jedna adresa není platná +only inbox felamimail cs Jen INBOX +only one window felamimail cs Jen jedno okno +only unseen felamimail cs Jen nepřečtené +open all felamimail cs otevřít vše +options felamimail cs Volby +or felamimail cs nebo +or configure an valid imap server connection using the manage accounts/identities preference in the sidebox menu. felamimail cs nebo nakonfigurujte připojení k IMAP serveru pomocí volby Spravovat účty/Identity v postranním panelu. +organisation felamimail cs organizace +organization felamimail cs organizace +organization name admin cs Jméno organizace +original message felamimail cs původní zpráva +outgoing mail server(smtp) felamimail cs odchozí poštovní server(SMTP) +participants felamimail cs Účastníci +personal information felamimail cs Osobní údaje +please ask the administrator to correct the emailadmin imap server settings for you. felamimail cs Požádejte prosím administrátora o korektní nastavení IMAP serveru pro Váš účet. +please select a address felamimail cs Prosím vyberte adresu +please select the number of days to wait between responses felamimail cs Vyberte prosím počet dní, jak dlouho čekat mezi odpovědmi +please supply the message to send with auto-responses felamimail cs Zadejte prosím zprávu, která se má odesílat v rámci automatické odpovědi +port felamimail cs port +posting felamimail cs odesílání +previous felamimail cs Předchozí +previous message felamimail cs Předchozí zpráva +print it felamimail cs Tisknout +print this page felamimail cs tisknout aktuální stranu +printview felamimail cs tiskový náhled +quicksearch felamimail cs Rychlé hledání +read felamimail cs přečtené +reading felamimail cs čtení +receive notification felamimail cs Přijímat potvrzení +recent felamimail cs nedávný +refresh time in minutes felamimail cs Čas obnovování v minutách +reject with felamimail cs zamítnout s +remove felamimail cs odstranit +remove immediately felamimail cs Odstranit okamžitě +rename felamimail cs Přejmenovat +rename a folder felamimail cs Přejmenovat složku +rename folder felamimail cs Přejmenovat složku +renamed successfully! felamimail cs Úspěšně přejmenováno! +replied felamimail cs odpovězené +reply felamimail cs Odpovědět +reply all felamimail cs Odpovědět všem +reply to felamimail cs Odpovědět (komu) +replyto felamimail cs Odpovědět (komu) +respond felamimail cs Odpověď +respond to mail sent to felamimail cs Odpověď na e-mail zaslaný (komu) +return felamimail cs Návrat +return to options page felamimail cs Návrat na stránku voleb +right felamimail cs Pravý +row order style felamimail cs Způsob řazení řádků +rule felamimail cs Pravidlo +sat felamimail cs So +save felamimail cs Uložit +save all felamimail cs Uložit vše +save as draft felamimail cs Uložit jako rozepsané +save as infolog felamimail cs Uložit jako infolog +save changes felamimail cs Uložit změny +save message to disk felamimail cs Uložit zprávu na disk +script name felamimail cs jméno skriptu +script status felamimail cs status skriptu +search felamimail cs Hledat +search for felamimail cs Hledat (co) +select felamimail cs Vybrat +select all felamimail cs Vybrat vše +select emailprofile felamimail cs Vybrat e-mailový profil +select folder felamimail cs vybrat složku +select your mail server type admin cs Vybrat typ e-mailového serveru +send felamimail cs Odeslat +send a reject message felamimail cs odeslat zprávu se zamítnutím +sent felamimail cs Odeslané +sent folder felamimail cs Odeslané +server supports mailfilter(sieve) felamimail cs server podporuje poštovní filter (sieve) +set as default felamimail cs Nastavit jako výchozí +show header felamimail cs Zobrazit hlavičku +show new messages on main screen felamimail cs Zobrazovat nové zprávy na hlavní obrazovce +sieve script name felamimail cs Jméno sieve skriptu +sieve settings admin cs Nastavení sieve +signatur felamimail cs Podpis +signature felamimail cs Podpis +simply click the target-folder felamimail cs Jednoduše klikněte na cílovou složku +size felamimail cs Velikost +size of editor window felamimail cs Velikost okna editoru +size(...->0) felamimail cs Velikost (...->0) +size(0->...) felamimail cs Velikost (0->...) +skipping forward felamimail cs vynechávám přeposlání +skipping previous felamimail cs vynechávám předchozí +small view felamimail cs malé zobrazení +smtp settings admin cs Nastavení SMTP +start new messages with mime type plain/text or html? felamimail cs Začínat psaní nových zpráv jako MIME typ plain/text nebo html? +subject felamimail cs Předmět +subject(a->z) felamimail cs Předmět (A->Z) +subject(z->a) felamimail cs Předmět (Z->A) +submit felamimail cs Přijmout +subscribe felamimail cs Přihlásit +subscribed felamimail cs Přihlášeno +subscribed successfully! felamimail cs Úspěšně přihlášeno ! +sun felamimail cs Ne +system signature felamimail cs systémový podpis +table of contents felamimail cs Obsah +template folder felamimail cs Složka šablon +templates felamimail cs Šablony +text only felamimail cs Pouze text +text/plain felamimail cs prostý text +the connection to the imap server failed!! felamimail cs Připojení k IMAP serveru selhalo!! +the imap server does not appear to support the authentication method selected. please contact your system administrator. felamimail cs Zdá se, že IMAP server nepodporuje vybranou metodu autentikace. Zkontaktujte prosím Vašeho systémového administrátora. +the message sender has requested a response to indicate that you have read this message. would you like to send a receipt? felamimail cs Odesílatel požaduje zaslání potvrzení o přečtení zprávy. Přejete si potvrzení odeslat? +the mimeparser can not parse this message. felamimail cs Mimeparser nemůže zpracovat tuto zprávu. +then felamimail cs POTOM +there is no imap server configured. felamimail cs Není nakonfigurován žádný IMAP server. +this folder is empty felamimail cs TATO SLOŽKA JE PRÁZDNÁ +this php has no imap support compiled in!! felamimail cs Toto PHP nemá zkompilovanou podporu IMAPu. +thu felamimail cs Čt +to felamimail cs Komu +to mail sent to felamimail cs na e-mail zaslaný (komu) +to use a tls connection, you must be running a version of php 5.1.0 or higher. felamimail cs Pro použití TLS připojení je třeba provozovat systém na PHP 5.1.0 nebo vyšším. +translation preferences felamimail cs Předvolby překladu +translation server felamimail cs Server pro překlad +trash felamimail cs Koš +trash fold felamimail cs Koš +trash folder felamimail cs Koš +tue felamimail cs Út +type felamimail cs typ +unexpected response from server to authenticate command. felamimail cs Neočekávaná odpověď serveru na příkaz AUTHENTICATE. +unexpected response from server to digest-md5 response. felamimail cs Neočekávaná odpověď serveru na Digest-MD5 zprávu. +unexpected response from server to login command. felamimail cs Neočekávaná odpověď serveru na příkaz LOGIN. +unflagged felamimail cs bez příznaku +unknown err felamimail cs Neznámá chyba +unknown error felamimail cs Neznámá chyba +unknown imap response from the server. server responded: %s felamimail cs Neznámá odpověď IMAP serveru. Server odpověděl: %s +unknown sender felamimail cs Neznámý odesílatel +unknown user or password incorrect. felamimail cs Neznámý uživatel nebo nesprávné heslo. +unread common cs nepřečtené +unseen felamimail cs Nepřečtené +unselect all felamimail cs Zrušit výběr +unsubscribe felamimail cs Odhlásit +unsubscribed felamimail cs Odhlášený +unsubscribed successfully! felamimail cs Úspěšně odhlášeno ! +up felamimail cs nahoru +updating message status felamimail cs aktualizuji stav zprávy +updating view felamimail cs aktualizuji zobrazení +use emailadmin to create profiles felamimail cs pro vytvoření profilů použijte EmailAdmin +use a signature felamimail cs Použít podpis +use a signature? felamimail cs Použít podpis? +use addresses felamimail cs Použít adresy +use custom identities felamimail cs použít uživatelsky definované identity +use custom settings felamimail cs Použít uživatelsky definovaná nastavení +use regular expressions felamimail cs použít regulární výrazy +use smtp auth admin cs Použít SMTP autentikaci +users can define their own emailaccounts admin cs Uživatelé smí definovat vlastní poštovní účty +vacation notice common cs odpověď v nepřítomnosti +vacation notice is active felamimail cs Odpověď v nepřítomnosti je aktivní +vacation start-date must be before the end-date! felamimail cs Počáteční datum automatické odpovědi musí PŘEDCHÁZET koncovému datu! +validate certificate felamimail cs ověřit certifikát +view full header felamimail cs Zobrazit celou hlavičku +view header lines felamimail cs Zobrazit řádky hlavičky +view message felamimail cs Zobrazit zprávu +viewing full header felamimail cs Zobrazuji celou hlavičku +viewing message felamimail cs Zobrazuji zprávu +viewing messages felamimail cs Zobrazuji zprávy +wed felamimail cs St +when deleting messages felamimail cs Při mazání zpráv +which folders (additional to the sent folder) should be displayed using the sent folder view schema felamimail cs Které složky (kromě složky Odeslané) by měly být zobrazeny za použití schématu pro zobrazení složky Odeslané +which folders - in general - should not be automatically created, if not existing felamimail cs Které složky by neměly být automaticky vytvářeny pokud neexistují +with message felamimail cs se zprávou +with message "%1" felamimail cs se zprávou "%1" +wrap incoming text at felamimail cs Zarovnat příchozí text +writing felamimail cs psaní +wrote felamimail cs napsal +you can use %1 for the above start-date and %2 for the end-date. felamimail cs Můžete použít %1 pro počáteční datum a %2 pro koncové datum. +you have received a new message on the felamimail cs Přišla Vám nová zpráva na +your message to %1 was displayed. felamimail cs Vaše zpráva pro %1 byla zobrazena. diff --git a/felamimail/lang/egw_da.lang b/felamimail/lang/egw_da.lang new file mode 100644 index 0000000000..6dd6ad56ea --- /dev/null +++ b/felamimail/lang/egw_da.lang @@ -0,0 +1,367 @@ +(no subject) felamimail da (ingen emne) +(only cc/bcc) felamimail da (kun CC/BCC) +(unknown sender) felamimail da (Ukendt afsender) +activate felamimail da Aktivere +activate script felamimail da aktivere script +add felamimail da tilføj +add address felamimail da Tilføj Adresse +add rule felamimail da Tilføj Regel +add script felamimail da Tilføj Script +add to %1 felamimail da Tilføj til %1 +add to address book felamimail da Tilføj til adressebog +add to addressbook felamimail da tilføj til adressebog +additional info felamimail da Yderligere information +address book felamimail da Adressebog +address book search felamimail da Søg i adressebog +after message body felamimail da Efter meddelsesemne +all address books felamimail da Alle adressebøger +all folders felamimail da Alle Mapper +always show html emails felamimail da Vis altid HTML e-mails +anyone felamimail da alle +as a subfolder of felamimail da sun under mappe af +attachments felamimail da vedhæftet filer +auto refresh folder list felamimail da Automatisk opdatering af mappe liste +back to folder felamimail da Tilbage til mappe +bad reque felamimail da Ugyldig efterspørgelse +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail da Baseret på et given information, indkommende beskeder kan have forskellige baggrundsfarver i meddelelses listen. Dette hjælper at se forskel på hvem beskeden er fra, især for postlister. +bcc felamimail da BCC +before headers felamimail da Før hoved information +between headers and message body felamimail da Mellem hoved information og brødtekst +body part felamimail da brødtekst +can't connect to inbox!! felamimail da kan ikke forbinde til Indbakke!!! +cc felamimail da CC +change folder felamimail da Skift mappe +checkbox felamimail da Afkrydsningsboks +click here to log back in. felamimail da Klik her for at logge ind igen. +click here to return to %1 felamimail da Klik her for at vende tilbage til %1 +close all felamimail da Luk alle +close this page felamimail da luk denne side +close window felamimail da luk vindue +color felamimail da Farve +compose felamimail da Ny meddelse +compress folder felamimail da Komprimere mappe +configuration felamimail da Konfiguration +contains felamimail da indeholder +create felamimail da Opret +create folder felamimail da Opret Mappe +create sent felamimail da Opret Sendt +create subfolder felamimail da Opret Undermappe +create trash felamimail da Opret Skraldespand +created folder successfully! felamimail da Mappe oprettet sucessfuldt +dark blue felamimail da Mørk Blå +dark cyan felamimail da Mørk Cyan +dark gray felamimail da Mørk Grå +dark green felamimail da Mørk Grøn +dark magenta felamimail da Mørk Magenta +dark yellow felamimail da Mørk Gul +date felamimail da Dato +date(newest first) felamimail da Dato (nyeste først) +date(oldest first) felamimail da Dato (ældste først) +deactivate script felamimail da deaktivere script +default sorting order felamimail da Standart soterings rækkefølge +delete felamimail da Slet +delete all felamimail da Slet alle +delete folder felamimail da Slet Mappe +delete selected felamimail da Slet udvalgte +delete selected messages felamimail da slet udvalgte beskeder +deleted felamimail da slettet +deleted folder successfully! felamimail da Mappe er slettet sucessfuldt +disable felamimail da Deaktivere +display message in new window felamimail da Vis besked i nyt vindue +display of html emails felamimail da Vis HTML i emails +display only when no plain text is available felamimail da Vis kun når ren tekst version er tilgængelig +display preferences felamimail da Vis preferencer +do it! felamimail da gør det! +do not use sent felamimail da Brug ikke sendt +do not use trash felamimail da Brug ikke skraldespand +do you really want to delete the '%1' folder? felamimail da Vil du virkelig slette '%1' mappen? +does not contain felamimail da indeholder ikke +does not match felamimail da passer ikke sammen +does not match regexp felamimail da passer ikke til regexp +don't use sent felamimail da Brug ikke Sendt +don't use trash felamimail da Brug ikke skraldespand +done felamimail da Udført +down felamimail da ned +download felamimail da hent +download this as a file felamimail da hent denne som fil +e-mail felamimail da E-mail +e-mail address felamimail da E-mail Adresse +e-mail folders felamimail da E-mail mappe +edit felamimail da Rediger +edit filter felamimail da Rediger filter +edit rule felamimail da rediger regel +edit selected felamimail da Redigere udvalgte +email address felamimail da E-mail Adresse +email signature felamimail da E-mail signatur +empty trash felamimail da tøm skraldespanden +enable felamimail da aktivere +enter your default mail domain ( from: user@domain ) admin da Indtast dit standart post domæne (Fra: bruger@domæne) +enter your imap mail server hostname or ip address admin da Indtast din IMAP post server hostnavn eller IP adresse +enter your sieve server hostname or ip address admin da Indtast din SIEVE post server hostnavn eller IP adresse +enter your sieve server port admin da Indtast din SIEVE server port +enter your smtp server hostname or ip address admin da Indtast din SMTP post server hostnavn eller IP adresse +enter your smtp server port admin da Indtast din SMTP server port +erro felamimail da FEJL +error felamimail da FEJL +error connecting to imap serv felamimail da Forbindelsen til IMAP serveren fejlede +error opening felamimail da Kunne ikke åbne +expunge felamimail da slette +felamimail common da FelaMiMail +file into felamimail da akivere til +files felamimail da filer +filter active felamimail da filter aktiv +filter name felamimail da filter navn +first name felamimail da Navn +flagged felamimail da Flag sat +flags felamimail da Flag +folder acl felamimail da mappe acl +folder name felamimail da Mappe navn +folder path felamimail da Mappe Sti +folder preferences felamimail da Mappe Preferencer +folder settings felamimail da Mappe indstillinger +folder status felamimail da Mappe status +folderlist felamimail da Mappe liste +foldername felamimail da Mappe navn +folders felamimail da Mapper +folders created successfully! felamimail da Mappe oprettet sucessfuldt +follow felamimail da følg +for mail to be send - not functional yet felamimail da Til post der skal sendes - virker ikke endnu +for received mail felamimail da Til modtaget post +forward felamimail da Vidersend +found felamimail da Fundet +from felamimail da Fra +from(a->z) felamimail da Fra (A->Z) +from(z->a) felamimail da Fra (Z->A) +full name felamimail da Fulde navn +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail da Tak et kik på www.felamimail.org for at lære mere om Squirrelmail.
    +help felamimail da Hjælp +hide header felamimail da gem hovedinformation +html felamimail da HTML +icons and text felamimail da Ikoner og tekst +icons only felamimail da Kun Ikoner +identifying name felamimail da Identificerbar navn +if felamimail da HVIS +illegal folder name. please select a different name. felamimail da Ugyldig mappe navn. Vælg venligst et andet navn. +imap felamimail da IMAP +imap server felamimail da IMAP Server +imap server address felamimail da IMAP Server Adresse +imap server type felamimail da IMAP Server type +imaps authentication felamimail da IMAP-S Autifikation +imaps encryption only felamimail da Kun IMAP-S Autorisation +in felamimail da i +in order for squirrelmail to provide the full set of options you need to create the special folders listed below. just click the check box and hit the create button. felamimail da For at SquirrelMail kan levere alle valgmuligheder skaldu oprette special mapperne her under. Vælg bare afkrydsningsboksene af og tryk opret knappen. +in the center felamimail da I midten +index order felamimail da Kartotek Rækkefølge +info felamimail da Information +invalid user name or password felamimail da Forkert brugernavn eller adgangskode +javascript felamimail da JavaScript +language felamimail da Sprog +last name felamimail da Efternavn +left felamimail da Venstre +less felamimail da mindre +let this folder contain subfolders felamimail da Lad denne mappen indeholde undermapper +light blue felamimail da Lys Blå +light cyan felamimail da Lys Cyan +light gray felamimail da Lys Grå +light green felamimail da Lys Grøn +light magenta felamimail da Lys Magenta +light yellow felamimail da Lys Gul +list all felamimail da Vis alle +location of buttons when composing felamimail da Placering af knapper ved Ny Meddelse +location of folder list felamimail da Placering af mappe listen +mail server login type admin da Post server login type +mail settings felamimail da Post indstillinger +mainmessage felamimail da hovedbesked +manage folders felamimail da Administrere mapper +manage sieve felamimail da Administrere Sieve scripts +mark as deleted felamimail da Marker som slettet +mark messages as felamimail da Marker valgte beskeder som +mark selected as flagged felamimail da Sæt flag ved udvalgte +mark selected as read felamimail da Marker valgte som læst +mark selected as unflagged felamimail da Fjern flag ved udvalgte +mark selected as unread felamimail da Marker valgte som ulæst +match felamimail da Resultat +matches felamimail da resultater +matches regexp felamimail da resultater regexp +medium gray felamimail da Mellem Grå +message highlighting felamimail da Besked makering +message list felamimail da Besked Liste +messages felamimail da beskeder +minute felamimail da Minut +minutes felamimail da Minutter +more felamimail da flere +move felamimail da flyt +move messages felamimail da flyt beskeder +move selected to felamimail da flyt valgte til +move to trash felamimail da Flyt til skraldespanden +must be unique felamimail da Skal unik +name felamimail da Navn +never display html emails felamimail da Vis aldrig HTML emails +new felamimail da Ny +new filter felamimail da Nyt filter +next felamimail da Næste +next message felamimail da Næste E-mail +nickname felamimail da Kælenavn +no filter felamimail da Ingen Filter +no folders found felamimail da Ingen mapper fundet +no folders were found to subscribe to! felamimail da Ingen mapper blev fundet til at abonnere på! +no folders were found to unsubscribe from! felamimail da Ingen mapper blev fundet til at opsige abonnement fra! +no highlighting is defined felamimail da Ingen makering er defineret +no messages were selected. felamimail da Ingen beskeder var udvalgt +no next message felamimail da Ikke flere beskeder +no notification felamimail da Ingen underrettelse +no personal address book is defined. contact administrator. felamimail da Ingen personlig asdressebog er digineret. Kontakt systemadministratoren +no persons matching your search was found felamimail da Ingen personer blev fundet +no previous message felamimail da Ingen tidligere beskeder +no valid emailprofile selected!! felamimail da Ingen gyldig E-mail profile er valgt. +none felamimail da ingen +number of messages to index felamimail da Antal beskeder at registere +on behalf of felamimail da på vegne af +only inbox felamimail da Kun Indbakke +only unseen felamimail da Kun ulæste +open all felamimail da åben alle +options felamimail da indstillinger +organisation felamimail da organisation +organization felamimail da organisation +organization name admin da Organisation navn +oth felamimail da Org. +participants felamimail da Deltager +personal information felamimail da Deltager Information +preference file %1 not found. exiting abnormally felamimail da Preferencer fil %1 findes ikke. Afslutter med fejl. +preference file, %1, does not exist. log out, and log back in to create a default preference file. felamimail da Preference file, %1, findes ikke. Log ud, og log ind igen for at oprette en standart preference fil. +previous felamimail da Tidligere +previous message felamimail da Tidligere E-mail +print it felamimail da print +print this page felamimail da print denne side +purge felamimail da tøm +quicksearch felamimail da Hurtig søg. +read felamimail da læst +read da felamimail da Læs da +reading felamimail da læser +reason giv felamimail da Giv Grund +recent felamimail da Helt Ny +refresh folder list felamimail da opdatere mappe liste +refresh page felamimail da Opdatere Siden +refresh time in minutes felamimail da Opdaterings interval i minutter +remove felamimail da fjern +remove immediately felamimail da Fjern nu +rename felamimail da Omdøb +rename a folder felamimail da Omdøb en mappe +rename folder felamimail da Omdøb mappe +renamed successfully! felamimail da Omdøbt succesfuld +replied felamimail da Besvaret +reply felamimail da Besvar +reply all felamimail da Besvar Alle +reply to felamimail da Besvar Til +replyto felamimail da Besvar Til +return felamimail da Tilbage +return to options page felamimail da Tilbage til indstillingerne +right felamimail da Højre +rule felamimail da Regel +running squirrelmail version %1 (c) 1999-2000. felamimail da Køre SquirrelMail version %1 (c) 1999-2000 +same window - not functional yet felamimail da Samme Vindue - virker ikke endnu +save felamimail da Gem +search felamimail da Søg +search for felamimail da Søg efter +seconds felamimail da Sekunder +select felamimail da Vælg +select all felamimail da Vælg Alle +select emailprofile felamimail da Vælg E-mail profil +select home email address felamimail da Vælg privat e-mail adresse +select work email address felamimail da Vælg arbejds e-mail adresse +select your mail server type admin da Vælg din post server type +send felamimail da Send +sent fold felamimail da Sendt Mappe +sent folder felamimail da Sendt Mappe +server respond felamimail da Server svar +show header felamimail da vis hoved information +show new messages on main screen felamimail da Vis nye meddelser på startsiden +sieve settings admin da Sieve indstillinger +signature felamimail da Signatur +simply click the target-folder felamimail da Bare klik destinations mappen +size felamimail da Størrelse +size of editor window felamimail da Størrelse af redigere vindue +size(...->0) felamimail da Størrelse (...->0) +size(0->...) felamimail da Størrelse (0->...) +small view felamimail da Lille overblik +smtp settings admin da SMTP indstillinger +some or all of the help documents are not present! felamimail da Noget eller alt hjælp dokumentation er ikke tilgængelig +source felamimail da Klide +special folder options felamimail da Speciel mappe indstillinger +squirrelmail felamimail da Squirrelmail +subject felamimail da Emne +subject(a->z) felamimail da Emne (A->Z) +subject(z->a) felamimail da Emne (Z->A) +submit felamimail da Godkend +subscribe felamimail da abonnere +subscribed felamimail da Abonneret +subscribed successfully! felamimail da Abonneret sucessfuld! +successfully saved display preferences! felamimail da Skærm indstillingerne er gemt! +successfully saved folder preferences! felamimail da Mappe indstillingerne er gemt! +successfully saved personal information! felamimail da Personlige informationer er gemt! +switch current folder to felamimail da gem nuværende mappe til +table of contents felamimail da Indhold +text only felamimail da Kun Tekst +the connection to the imap server failed!! felamimail da Forbindingen til IMAP serveren fejlede +the help has not been translated to %1. it will be displayed in english instead. felamimail da Hlælp er ikke oversat til %1. Den vil brive vist i Engelsk i stedet +the index order is the order that the columns are arranged in the message index. you can add, remove, and move columns around to customize them to fit your needs. felamimail da Inholdsordenen er måden som kolonnerne er arrangeret op i beskederne. Du kan tilføje, fjerne og flytte kolonnerne rundt så de passer til dit behov. +the order of the message index can be rearanged and changed to contain the headers in any order you want. felamimail da Ordenen som beskederne kan ændres til og ændringer til hoved informationen i hvilken rækkefølge du vil. +theme felamimail da Thema +then felamimail da SÅ +these settings change the way your folders are displayed and manipulated. felamimail da Disse indstillinger ændre på måden mapperne vises og manipuleres. +this contains personal information about yourself such as your name, your email address, etc. felamimail da Her er personlige informationer om dig, som f.eks. dit navn, e-mail addresse osv. +this folder is empty felamimail da Denne mappe er tom +this php has no imap support compiled in!! felamimail da Der er ikke understøttelse for IMAP i din PHP kode. +this port is based on squirrelmail, which is a standalone imap client.
    felamimail da Dette modul er baseret op Squirrelmail, som er en uafhængig IMAP client.
    +to felamimail da Til +to the left felamimail da til venstre +to the right felamimail da til højre +top felamimail da Toppen +translation location felamimail da Oversætnings placering +translation preferences felamimail da Oversætnings indstillinger +translation server felamimail da Oversætnings server +trash fold felamimail da Skrald map. +trash folder felamimail da Skraldespands mappen +type felamimail da type +unable to list addresses from %1 felamimail da ude af stand til at liste adresserne fra %1 +unflagged felamimail da Flag ikke sat +unknown err felamimail da Ukendt fejl +unknown error felamimail da Ukendt fejl +unknown sender felamimail da Ukendt afsender +unknown user or password incorrect. felamimail da Ukendt bruger eller adgangskoden er forkert +unread felamimail da ulæst +unseen felamimail da uset +unseen and total felamimail da Uset og total +unseen message notification felamimail da Uset besked orientering +unseen message notification type felamimail da Uset besked orientering og type +unselect all felamimail da Fravælg alle +unsubscribe felamimail da Fravælg +unsubscribed felamimail da Fravalgt +unsubscribed successfully! felamimail da Fravalgt sucessfuldt +up felamimail da op +update address felamimail da Opdatere adresse +use a signature felamimail da Brug en signatur +use a signature? felamimail da Brug en signatur? +use addresses felamimail da Brug Adresser +use custom settings felamimail da Brug egne indstillinger +use javascript or html addressbook? felamimail da Brug Javascript eller HTML adressebog? +use smtp auth admin da Brug SMTP auth +users can define their own emailaccounts admin da Brugere kan selv definere deres egne e-mail kontoer +view full header felamimail da Vis fuld hoved information +view message felamimail da Vi besked +viewing full header felamimail da Viser fuld hoved information +viewing message felamimail da Viser besked +viewing messages felamimail da Viser beskeder +welcome to %1's webmail system felamimail da Velkommen til %1's WebMail system +when deleting messages felamimail da Når meddelser slettes +white felamimail da Hvid +width of folder list felamimail da Bredde på mappe listen +wrap incoming text at felamimail da indpak inkommende tekst som +writing felamimail da skriver +wrote felamimail da skrev +you can change the way that squirrelmail looks and displays information to you, such as the colors, the language, and other settings. felamimail da Du kan ændre måden SquirrelMail ser ud og viser informationer til dig, som f.eks. farver, sprog og andre indstillinger +you can only edit one address at the time felamimail da Du kan kun ændre i en adresse af gangen +you must login first. felamimail da Du skal logge ind først. +you need a valid user and password to access this page! felamimail da Du skal bruge et gyldig brugernavn og adgangskode for at kunne se denne side! +your search failed with the following error(s) felamimail da Din søgning fejlede med følgende fejl (s) +1 felamimail da 1 diff --git a/felamimail/lang/egw_de.lang b/felamimail/lang/egw_de.lang new file mode 100644 index 0000000000..f033ccbd11 --- /dev/null +++ b/felamimail/lang/egw_de.lang @@ -0,0 +1,512 @@ +%1 is not writable by you! felamimail de %1 is NICHT beschreibar von Ihnen! +(no subject) felamimail de (kein Betreff) +(only cc/bcc) felamimail de (kein Kopie/Blindkopie) +(separate multiple addresses by comma) felamimail de (mehrere Adressen durch Komma trennen) +(unknown sender) felamimail de (unbekannter Absender) +3paneview: if you want to see a preview of a mail by single clicking onto the subject, set the height for the message-list and the preview area here (300 seems to be a good working value). the preview will be displayed at the end of the message list on demand (click). felamimail de Vorschauansicht: Wenn Sie eine Vorschauansicht von eMails wünschen, müssen Sie hier die Höhe des Vorschaubereichs und der Nachrichtenliste festlegen. (300 hat sich als zufriedenstellender Wert erwiesen). Die Vorschau wird durch einen einfachen Klick auf den Betreff der anzuzeigenden Nachricht aktiviert. +aborted felamimail de abgebrochen +activate felamimail de aktivieren +activate script felamimail de Script aktivieren +activating by date requires a start- and end-date! felamimail de Aktivieren nach Datum benötigt ein Start- UND Endedatum! +add acl felamimail de ACL zufügen +add address felamimail de Addresse zufügen +add rule felamimail de Regel hinzufügen +add script felamimail de Script hinzufügen +add to %1 felamimail de Zu %1 zufügen +add to address book felamimail de Zum Adressbuch hinzufügen +add to addressbook felamimail de Zum Adressbuch hinzufügen +adding file to message. please wait! felamimail de Füge Datei zur Nachricht hinzu. Bitte warten! +additional info felamimail de Zusätzliche Info +address book felamimail de Adressbuch +address book search felamimail de Adressbuch durchsuchen +after message body felamimail de nach dem Editorfenster +all address books felamimail de Alle Adressbücher +all folders felamimail de Alle Ordner +all messages in folder felamimail de Alle Nachrichten im Ordner +all of felamimail de mit allen +allow images from external sources in html emails felamimail de Erlaube Bilder von externen Quellen in HTML emails +allways a new window felamimail de jede E-Mail in einem neuen Fenster +always show html emails felamimail de HTML-E-Mails immer anzeigen +and felamimail de und +any of felamimail de mit einem +any status felamimail de Alle Status +anyone felamimail de jeder +as a subfolder of felamimail de als Unterordner von +attach felamimail de Anhängen +attachments felamimail de Anlagen +authentication required felamimail de Anmeldung erforderlich +auto refresh folder list felamimail de Ordnerliste automatisch aktualisieren +back to folder felamimail de zurück zu Ordner +bad login name or password. felamimail de Falscher Benutzername oder Passwort. +bad or malformed request. server responded: %s felamimail de Falsche oder ungültige Anfrage. Server antwortet: %s +bad request: %s felamimail de Falsche Anfrage: %s +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail de Eingehende Nachrichten können, basierend auf angegebenen Kriterien, unterschiedliche Hintergrundfarben in der Nachrichtenliste haben. Das kann helfen einfach zu unterscheiden woher die Nachricht kommt, speziell für Mailinglisten. +bcc felamimail de Blindkopie +before headers felamimail de vor den Kopfzeilen +between headers and message body felamimail de zwischen Kopfzeilen und Editorfenster +body part felamimail de Hauptteil +by date felamimail de nach Datum +can not send message. no recipient defined! felamimail de Kann Nachricht nicht senden. Kein Empfänger angegeben! +can't connect to inbox!! felamimail de kann nicht mit ihrer INBOX verbinden!!! +cc felamimail de Kopie +change folder felamimail de Ordner wechseln +check message against next rule also felamimail de Nachricht auch gegen nächste Regel prüfen +checkbox felamimail de Auswahlbox +clear search felamimail de Suche zurücksetzen +click here to log back in. felamimail de Hier klicken um sich wieder einzulogen. +click here to return to %1 felamimail de Hier klicken um zu %1 zurückzukehren +close all felamimail de Schließe alle +close this page felamimail de Diese Seite schließen +close window felamimail de Fenster schließen +color felamimail de Farbe +compose felamimail de E-Mail schreiben +compose as new felamimail de als neue Nachricht verwenden +compress folder felamimail de Ordner komprimieren +condition felamimail de Bedingung +configuration felamimail de Konfiguration +configure a valid imap server in emailadmin for the profile you are using. felamimail de Konfigurieren Sie einen gültigen IMAP Server im emailadmin für das von Ihnen verwendete Profil +connection dropped by imap server. felamimail de Verbindung von IMAP Server beendet. +contact not found! felamimail de Kontakt nicht gefunden! +contains felamimail de enthält +copy or move messages? felamimail de Nachrichten kopieren oder Verschieben? +copying messages to felamimail de kopiere Nachrichten in folgenden Ordner +could not complete request. reason given: %s felamimail de Konnte Anfrage nicht beenden. Grund: %s +could not import message: felamimail de Konnte diese Nachricht nicht importieren: +could not open secure connection to the imap server. %s : %s. felamimail de Konnte sichere Verbindung zum IMAP Server nicht öffnen. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. felamimail de CRAM-MD5 oder DIGEST-MD5 benötigt das Auth_SASL Packet. +create felamimail de Erzeugen +create folder felamimail de Ordner anlegen +create sent felamimail de Gesendete Objekte (Sent) Ordner anlegen +create subfolder felamimail de Unterordner anlegen +create trash felamimail de Gelöschte Objekte (Trash) Ordner anlegen +created folder successfully! felamimail de Ordner erfolgreich angelegt +dark blue felamimail de Dunkelblau +dark cyan felamimail de Dunkelzyan +dark gray felamimail de Dunkelgrau +dark green felamimail de Dunkelgrün +dark magenta felamimail de Dunkelrot +dark yellow felamimail de Braun +date(newest first) felamimail de Datum (neue zuerst) +date(oldest first) felamimail de Datum (alte zuerst) +days felamimail de Tage +deactivate script felamimail de Script abschalten +default felamimail de Vorgabe +default signature felamimail de Standard Signatur +default sorting order felamimail de Standard-Sortierreihenfolge +delete all felamimail de alle löschen +delete folder felamimail de Ordner löschen +delete script felamimail de Skript löschen +delete selected felamimail de ausgewählte Nachrichten löschen +delete selected messages felamimail de ausgewählte Nachrichten löschen +deleted felamimail de gelöscht +deleted folder successfully! felamimail de Ordner erfolgreich gelöscht +deleting messages felamimail de lösche Nachrichten +disable felamimail de Deaktivieren +discard felamimail de verwerfen +discard message felamimail de Nachricht verwerfen +display message in new window felamimail de Nachricht in neuem Fenster anzeigen +display messages in multiple windows felamimail de Nachrichten in mehreren Fenstern anzeigen +display of html emails felamimail de HTML-E-Mails anzeigen +display only when no plain text is available felamimail de nur anzeigen wenn kein Plain Text vorhanden ist +display preferences felamimail de Anzeige Einstellungen +displaying html messages is disabled felamimail de Die Anzeige von HTML-E-Mails ist deaktiviert. +do it! felamimail de Mach es! +do not use sent felamimail de Gesendete Objekte (Sent) nicht verwenden +do not use trash felamimail de Gelöschte Objekte (Trash) nicht verwenden +do not validate certificate felamimail de Zertifikat nicht überprüfen +do you really want to delete the '%1' folder? felamimail de Wollen Sie wirklich den '%1' Ordner löschen? +do you really want to delete the selected accountsettings and the assosiated identity. felamimail de Wollen Sie die ausgewählten Konteneinstellungen und die damit verbundenen Identitäten wirklich löschen? +do you really want to delete the selected signatures? felamimail de Möchten Sie die ausgewählte Signatur wirklich löschen? +do you really want to move or copy the selected messages to folder: felamimail de Wollen sie die ausgewählten Nachrichten in folgenden Ordner verschieben oder kopieren: +do you really want to move the selected messages to folder: felamimail de Wollen sie die ausgewählten Nachrichten in folgenden Ordner verschieben: +do you want to be asked for confirmation before moving selected messages to another folder? felamimail de Wollen Sie vor dem Verschieben von Mails in andere Ordner gefragt werden? +do you want to prevent the editing/setup for forwarding of mails via settings (, even if sieve is enabled)? felamimail de Wollen Sie das Editieren/Einstellen einer Mailweiterleitung (via SIEVE) unterbinden. +do you want to prevent the editing/setup of filter rules (, even if sieve is enabled)? felamimail de Wollen Sie das Editieren/Einstellen von Filterregeln (via SIEVE) unterbinden. +do you want to prevent the editing/setup of notification by mail to other emailadresses if emails arrive (, even if sieve is enabled)? felamimail de Wollen Sie das Editieren/Einstellen von Benachrichtigungen per eMail (via SIEVE), wenn neue Nachrichten eintreffen, unterbinden. +do you want to prevent the editing/setup of the absent/vacation notice (, even if sieve is enabled)? felamimail de Wollen Sie das Editieren/Einstellen einer Abwesenheitsnotiz (via SIEVE) unterbinden. +do you want to prevent the managing of folders (creation, accessrights and subscribtion)? felamimail de Möchten Sie die Verwaltung von Ordnern verhindern (anlegen, abonnieren, Zugriffsrechte)? +does not contain felamimail de enthält nicht +does not exist on imap server. felamimail de existiert nicht auf dem IMAP Server +does not match felamimail de trifft nicht zu +does not match regexp felamimail de trift nicht zu regulärer Ausdruck +don't use draft folder felamimail de keine Entwurfs Ordner verwenden +don't use sent felamimail de Keinen gesendeten E-Mails speichern +don't use template folder felamimail de Keinen Vorlagen Ordner verwenden +don't use trash felamimail de Keinen Mülleimer verwenden +dont strip any tags felamimail de keine HTML Tags entfernen. +down felamimail de runter +download felamimail de Speichern +download this as a file felamimail de als Datei downloaden +draft folder felamimail de Entwurfs Ordner +drafts felamimail de Entwürfe +e-mail felamimail de E-Mail +e-mail address felamimail de E-Mailadresse +e-mail folders felamimail de E-Mail Ordner +edit email forwarding address felamimail de Bearbeiten der E-Mail-Weiterleitung +edit filter felamimail de Filter bearbeiten +edit rule felamimail de Regel bearbeiten +edit selected felamimail de Ausgewählte bearbeiten +edit vacation settings felamimail de Abwesenheitsnotiz bearbeiten +editor type felamimail de Editortyp +email address felamimail de E-Mail-Adresse +email forwarding address felamimail de Zieladresse +email notification update failed felamimail de Die Benachrichtigung über den Gelesen-Status der eMail ist fehlgeschlagen. +email signature felamimail de E-Mail-Signatur +emailaddress felamimail de E-Mail-Adresse +empty trash felamimail de Papierkorb leeren +enable felamimail de Aktivieren +encrypted connection felamimail de verschlüsselte Verbindung +enter your default mail domain ( from: user@domain ) admin de Geben sie eine Vorgabewert für die Maildomain ein (Von: benutzer@domain) +enter your imap mail server hostname or ip address admin de IMAP-Server Hostname oder IP-Adresse +enter your sieve server hostname or ip address admin de Sieve-Server Hostname oder IP-Adresse +enter your sieve server port admin de Port Adresse des Sieve Servers +enter your smtp server hostname or ip address admin de SMTP-Server Hostname oder IP-Adresse +enter your smtp server port admin de Port Adresse des SMTP Servers +entry saved felamimail de Eintrag gespeichert +error felamimail de FEHLER +error connecting to imap serv felamimail de Konnte den IMAP Server (Mailserver) nicht erreichen +error connecting to imap server. %s : %s. felamimail de Fehler beim Verbinden mit dem IMAP Server. %s : %s. +error connecting to imap server: [%s] %s. felamimail de Fehler beim Verbinden mit dem IMAP Server: [%s] %s. +error opening felamimail de Fehler beim Öffnen +error saving %1! felamimail de Fehler beim Speichern von %1! +error: felamimail de FEHLER: +error: could not save message as draft felamimail de FEHLER: Die Nachricht konnte nicht als Entwurf gespeichert werden. +error: message could not be displayed. felamimail de FEHLER: Die Nachricht kann nicht angezeigt werden. +event details follow felamimail de Termindetails folgend +every felamimail de alle +every %1 days felamimail de alle %1 Tage +expunge felamimail de Endgültig löschen +extended felamimail de Erweitert +felamimail common de eMail +file into felamimail de verschiebe nach +filemanager felamimail de Dateimanager +files felamimail de Dateien +filter active felamimail de Filter aktiv +filter name felamimail de Filtername +filter rules common de Filter Regeln +first name felamimail de Vorname +flagged felamimail de wichtig +flags felamimail de Markierungen +folder felamimail de Ordner +folder acl felamimail de Ordner ACL +folder name felamimail de Ordner Name +folder path felamimail de Ordner Pfad +folder preferences felamimail de Ordnereinstellungen +folder settings felamimail de Ordner Einstellungen +folder status felamimail de Ordner Status +folderlist felamimail de Ordnerliste +foldername felamimail de Ordnername +folders felamimail de Ordner +folders created successfully! felamimail de Ordner erfolgreich angelegt +follow felamimail de folgen +for mail to be send - not functional yet felamimail de Für zu sendende Mail - funktioniert noch nicht +for received mail felamimail de Für empfangene Mail +forward felamimail de Weiterleiten +forward as attachment felamimail de weiterleiten als Anhang +forward inline felamimail de Inline weiterleiten +forward messages to felamimail de Nachricht weiterleiten an +forward to felamimail de weiterleiten an +forward to address felamimail de weiterleiten an Adresse +forwarding felamimail de Weiterleitung +found felamimail de Gefunden +fri felamimail de Fr +from felamimail de Von +from(a->z) felamimail de Von (A->Z) +from(z->a) felamimail de Von (Z->A) +full name felamimail de Vollständiger Name +greater than felamimail de größer als +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail de Schauen Sie mal bei www.felamimail.org vorbei, um mehr über Squirrelmail zu lernen. +header lines felamimail de Kopfzeilen +hide header felamimail de Kopfzeilen verbergen +hostname / address felamimail de Servername / Adresse +how to forward messages felamimail de Wie wollen Sie Nachrichten weiterleiten? +html felamimail de HTML +icons and text felamimail de Icons und Text +icons only felamimail de nur Icons +identifying name felamimail de Identifizierender Name +identity felamimail de Identität +if felamimail de Wenn +if from contains felamimail de wenn Von enthält +if mail header felamimail de wenn E-Mail-Header enthält +if message size felamimail de wenn Nachrichtengröße +if shown, which folders should appear on main screen felamimail de Welche Ordner, sollen in Home angezeigt werden? +if subject contains felamimail de wenn Betreff enthält +if to contains felamimail de wenn An enthält +if using ssl or tls, you must have the php openssl extension loaded. felamimail de Wenn Sie SSL oder TLS benützen, muss die openssl PHP Erweiterung geladen sein. +illegal folder name. please select a different name. felamimail de Ilegaler Ordnername. Bitte wählen Sie einen anderen Namen +imap felamimail de IMAP +imap server felamimail de IMAP Server +imap server address felamimail de IMAP Server Adresse +imap server closed the connection. felamimail de IMAP Server hat die Verbindung beendet. +imap server closed the connection. server responded: %s felamimail de IMAP Server hat die Verbindung beendet. Server antworted: %s +imap server password felamimail de IMAP Server Password +imap server type felamimail de IMAP-Servertyp +imap server username felamimail de IMAP Server Benutzername +imaps authentication felamimail de IMAPS Authetifizierung +imaps encryption only felamimail de IMAPS nur Verschlüsselung +import felamimail de Importieren +import mail felamimail de Mail Importieren +in felamimail de In +inbox felamimail de Posteingang +incoming mail server(imap) felamimail de eingehender Mailserver (IMAP) +index order felamimail de Spaltenanordnung +info felamimail de Info +invalid user name or password felamimail de Falscher Benutzername oder Pasword +javascript felamimail de JavaScript +jumping to end felamimail de springe zum Ende +jumping to start felamimail de springe zum Anfang +junk felamimail de Spammails +keep a copy of the message in your inbox felamimail de eine Kopie der Nachricht in der INBOX behalten +keep local copy of email felamimail de Kopie der E-Mail behalten +kilobytes felamimail de Kilobytes +language felamimail de Sprache +last name felamimail de Nachname +left felamimail de Links +less felamimail de kleiner +less than felamimail de kleiner als +light gray felamimail de Hellgrau +list all felamimail de Alle anzeigen +loading felamimail de lade +location of buttons when composing felamimail de Ort der Knöpfe beim E-Mail schreiben +mail server login type admin de Typ der Mailserver Anmeldung +mail settings felamimail de E-Mail-Einstellungen +mainmessage felamimail de Hauptnachricht +manage email accounts and identities common de Verwaltung von E-Mail-Konten/Identitäten +manage emailaccounts common de E-Mail-Konten verwalten +manage emailfilter / vacation preferences de Verwalten der E-Mail-Filter und Abwesenheitsnotiz +manage folders common de Ordner verwalten +manage sieve common de Sieve-Scripte verwalten +manage signatures felamimail de Signaturen verwalten +mark as deleted felamimail de als gelöscht markieren +mark messages as felamimail de ausgewählte Nachrichten markieren als +mark selected as flagged felamimail de ausgewählte Nachrichten markieren +mark selected as read felamimail de ausgewählte Nachrichten als gelesen markieren +mark selected as unflagged felamimail de ausgewählte Nachrichten nicht markieren +mark selected as unread felamimail de ausgewählte Nachrichten als ungelesen markieren +match felamimail de Übereinstimmung +matches felamimail de stimmt überein (*, ? erlaubt) +matches regexp felamimail de stimmt überein mit regulärem Ausdruck +max uploadsize felamimail de maximal Dateigröße +message highlighting felamimail de Nachrichtenhervorhebung +message list felamimail de Nachrichtenliste +messages felamimail de Nachrichten +mon felamimail de Mo +move felamimail de Verschieben +move folder felamimail de Ordner verschieben +move messages felamimail de Nachrichten verschieben +move messages? felamimail de Nachrichten verschieben? +move selected to felamimail de verschieben nach +move to trash felamimail de in den Papierkorb verschieben +moving messages to felamimail de verschiebe Nachrichten nach +name felamimail de Name +never display html emails felamimail de niemals anzeigen +new common de Neu +new filter felamimail de neuer Filter +next felamimail de nächste +next message felamimail de nächste Nachricht +no active imap server found!! felamimail de Kein aktiver IMAP Server gefunden!! +no address to/cc/bcc supplied, and no folder to save message to provided. felamimail de Keine Empfänger Adresse (To/CC/BCC ) angegeben und kein Ordner zur Ablage der Mail spezifiziert. +no encryption felamimail de keine Verschlüsselung +no filter felamimail de kein Filter +no folders felamimail de Keine Ordner +no folders found felamimail de Keine Ordner gefunden +no folders were found to subscribe to! felamimail de Keine Order gefunden, die bestellt werden können! +no folders were found to unsubscribe from! felamimail de Keine Order gefunden, die abbestellt werden können! +no highlighting is defined felamimail de keine Hervorhebung definiert +no imap server host configured!! felamimail de Kein IMAP Server (Host) konfiguriert! +no message returned. felamimail de Keine Nachrichten gefunden. +no messages found... felamimail de keine Nachrichten gefunden... +no messages selected, or lost selection. changing to folder felamimail de Es wurden keine Nachrichten ausgewählt, oder die Auswahl ging verloren. Wechsel zum Ordner +no messages were selected. felamimail de Es wurde keine NAchricht ausgewählt +no plain text part found felamimail de Kein Text Teil gefunden. +no previous message felamimail de Keine vorherige Nachricht vorhanden +no recipient address given! felamimail de Keine Empfängeradresse angegeben! +no signature felamimail de keine Signatur +no stationery felamimail de Kein Briefkopf +no subject given! felamimail de Kein Betreff angegeben! +no supported imap authentication method could be found. felamimail de Keine unterstützte IMAP Authentifizierungsmethode gefunden. +no valid data to create mailprofile!! felamimail de Keine gültigen Daten zur Erzeugung eines Mailprofils!! +no valid emailprofile selected!! felamimail de Sie haben kein gültiges E-Mail-Profil ausgewählt! +none felamimail de kein +none, create all felamimail de keine, erstellt alle +not allowed felamimail de nicht erlaubt +notify when new mails arrive on these folders felamimail de Benachrichtigung, wenn neue E-Mails in diesen Ordnern ankommen +on felamimail de am +on behalf of felamimail de im Auftrag von +one address is not valid felamimail de Eine Adresse ist ungültig +only inbox felamimail de Nur Posteingang +only one window felamimail de nur ein einziges Fenster +only unseen felamimail de Nur nicht gesehene +open all felamimail de Öffne alle +options felamimail de Optionen +or felamimail de oder +or configure an valid imap server connection using the manage accounts/identities preference in the sidebox menu. felamimail de oder konfigurieren Sie einen gültigen IMAP Server unter Verwendung von persönlichen Identitäten (Sidebox Menü). +organisation felamimail de Organisation +organization felamimail de Organisation +organization name admin de Name der Organisation +original message felamimail de ursprüngliche Nachricht +outgoing mail server(smtp) felamimail de ausgehender Mailserver (SMTP) +participants felamimail de Teilnehmer +personal information felamimail de persönliche Informationen +please ask the administrator to correct the emailadmin imap server settings for you. felamimail de Bitte fragen Sie Ihren Administrator um die IMAP Einstellungen für Sie zu korrigieren +please configure access to an existing individual IMAP account. felamimail de Bitte konfigurieren Sie hier den Zugang zu einem existierenden IMAP Account. +please select a address felamimail de Bitte wählen Sie eine Adresse +please select the number of days to wait between responses felamimail de Bitte wählen wieviele Tage zwischen den Antworten gewartet werden soll +please supply the message to send with auto-responses felamimail de Bitte geben Sie eine Nachricht eine die mit der automatischen Antwort gesendet werden soll +port felamimail de Port +posting felamimail de sende +previous felamimail de vorherige +previous message felamimail de vorherige Nachricht +print it felamimail de E-Mail drucken +print this page felamimail de Diese Seite drucken +printview felamimail de Druckansicht +quicksearch felamimail de Schnellsuche +read felamimail de gelesen +reading felamimail de lese +receive notification felamimail de Empfangsbestätigung +recent felamimail de neu +refresh time in minutes felamimail de Aktualisierungsintervall in Minuten +reject with felamimail de zurückweisen mit +remove felamimail de entfernen +remove immediately felamimail de sofort löschen +rename felamimail de Umbenennen +rename a folder felamimail de Ordner umbenennen +rename folder felamimail de Ordner umbenennen +renamed successfully! felamimail de Erfolgreich umbenannt +replied felamimail de beantwortet +reply felamimail de Antworten +reply all felamimail de allen Antworten +reply to felamimail de Antwort an +replyto felamimail de Antwort an +respond felamimail de Antworte +respond to mail sent to felamimail de Antworte auf E-Mails die gesendet werden an +return felamimail de Zurück +return to options page felamimail de zurück zu Einstellungen +right felamimail de Rechts +row order style felamimail de Spaltenanordnung +rule felamimail de Regel +sat felamimail de Sa +save felamimail de Speichern +save all felamimail de Alle speichern +save as draft felamimail de als Entwurf speichern +save as infolog felamimail de Als Infolog speichern +save changes felamimail de Änderungen speichern +save message to disk felamimail de Nachricht speichern +script name felamimail de Skriptname +script status felamimail de Skriptstatus +search felamimail de Suchen +search for felamimail de Suchen nach +select felamimail de Auswählen +select all felamimail de alle auswählen +select emailprofile felamimail de E-Mail-Profil auswählen +select folder felamimail de Ordner auswählen +select your mail server type admin de Wählen Sie den Typ des Mailservers +send felamimail de Senden +send a reject message felamimail de Ablehnungs-E-Mail senden +sent felamimail de Gesendet +sent folder felamimail de Ordner für gesendete Nachrichten +server supports mailfilter(sieve) felamimail de Server unterstützt Mailfilter(Sieve) +set as default felamimail de Als Vorgabe setzen +show all folders (subscribed and unsubscribed) in main screen folder pane felamimail de zeige alle Ordner (subscribed UND unsubscribed) in der Ordnerleiste des Hauptfensters +show header felamimail de Kopfzeilen anzeigen +show new messages on main screen felamimail de Neue Nachrichten auf der Startseite anzeigen? +sieve script name felamimail de Sieve Skript Name +sieve settings admin de Sieve Einstellungen +signatur felamimail de Signatur +signature felamimail de Signatur +simply click the target-folder felamimail de Ziel Ordner auswählen +size felamimail de Größe +size of editor window felamimail de Größe des Editorfensters +size(...->0) felamimail de Größe(...->0) +size(0->...) felamimail de Größe(0->...) +skipping forward felamimail de blättere vorwärts +skipping previous felamimail de blättere zurück +small view felamimail de schmale Ansicht +smtp settings admin de SMTP Einstellungen +start new messages with mime type plain/text or html? felamimail de Sollen neue E-Mails als plain/text oder HTML Nachrichten verfasst werden? +stationery felamimail de Briefkopf +subject felamimail de Betreff +subject(a->z) felamimail de Betreff(A->Z) +subject(z->a) felamimail de Betreff(Z->A) +submit felamimail de Absenden +subscribe felamimail de Bestellen +subscribed felamimail de abonniert +subscribed successfully! felamimail de Erfolgreich abonniert +sun felamimail de So +system signature felamimail de System Signatur +table of contents felamimail de Inhaltsverzeichnis +template folder felamimail de Vorlagen Ordner +templates felamimail de Vorlagen +text only felamimail de Nur Text +text/plain felamimail de text/plain +the action will be applied to all messages of the current folder.\ndo you want to proceed? felamimail de Die Aktion wird auf ALLE Nachrichten des aktuellen Ordners angewendet.\nMöchten Sie fortfahren? +the action will be applied to all messages of the current folder.ndo you want to proceed? felamimail de Die Aktion wird auf ALLE Nachrichten des aktuellen Ordners angewendet.\nMöchten Sie fortfahren? +the connection to the imap server failed!! felamimail de Die Verbindung zum IMAP Server ist fehlgeschlagen +the imap server does not appear to support the authentication method selected. please contact your system administrator. felamimail de Der IMAP Server scheint die ausgewählte Authentifizierungsmethode nicht zu unterstützen. Bitte sprechen Sie mit Ihrem Systemadministrator. +the message sender has requested a response to indicate that you have read this message. would you like to send a receipt? felamimail de Der Absender der Nachricht hat eine Antwort angefordert, welche Ihm anzeigt das Sie seine Nachricht gelesen haben. Wollen Sie diese Antwort senden? +the mimeparser can not parse this message. felamimail de Der MIME Parser versteht diese Nachricht nicht. +then felamimail de dann +there is no imap server configured. felamimail de Es ist kein IMAP Server Konfiguriert +this folder is empty felamimail de DIESER ORDNER IST LEER +this php has no imap support compiled in!! felamimail de Dieses PHP hat keine IMAP Unterstützung!! +thu felamimail de Do +to felamimail de An +to mail sent to felamimail de Mail an senden an +to use a tls connection, you must be running a version of php 5.1.0 or higher. felamimail de Für eine TLS Verbindung, benötigen Sie PHP 5.1.0 oder neuer. +translation preferences felamimail de Übersetzungseinstellungen +translation server felamimail de Übersetzungsserver +trash felamimail de Papierkorb +trash fold felamimail de Abfall Ordner +trash folder felamimail de Ordner für gelöschte Nachrichten +tue felamimail de Di +type felamimail de Typ +unexpected response from server to authenticate command. felamimail de Unerwartete Antwort vom Server auf das AUTHENTICATE Kommando. +unexpected response from server to digest-md5 response. felamimail de Unerwartete Antwort vom Server auf die Digest-MD5 Antwort. +unexpected response from server to login command. felamimail de Unerwartete Antwort vom Server auf das LOGIN Kommando. +unflagged felamimail de unwichtig +unknown err felamimail de Unbekannter Fehler +unknown error felamimail de Unbekannter Fehler +unknown imap response from the server. server responded: %s felamimail de Unbekannte IMAP Antwort vom Server. Server antworted: %s +unknown sender felamimail de Unbekannter Absender +unknown user or password incorrect. felamimail de Unbekannter Benutzer oder das Password ist falsch +unread common de ungelesen +unseen felamimail de Ungelesen +unselect all felamimail de keine auswählen +unsubscribe felamimail de Abbestellen +unsubscribed felamimail de abbestellt +unsubscribed successfully! felamimail de Erfolgreich abbestellt +up felamimail de hoch +updating message status felamimail de aktualisiere Nachrichtenstatus +updating view felamimail de aktualisiere Ansicht +use emailadmin to create profiles felamimail de benutzen Sie E-MailAdmin um Profile zu erstellen +use a signature felamimail de Signatur benutzen +use a signature? felamimail de Eine Signatur benutzen? +use addresses felamimail de Adresse benutzen +use custom identities felamimail de benutze benutzerdefinierte Identitäten +use custom settings felamimail de benutze angepaßte Einstellungen +use regular expressions felamimail de reguläre Ausdrücke verwenden +use smtp auth admin de SMTP Auth benutzen +users can define their own emailaccounts admin de Anwender können ihre eigenen Konten definieren +vacation notice common de Abwesenheitsnotiz +vacation notice is active felamimail de Abwesenheitsnotiz ist aktiv +vacation start-date must be before the end-date! felamimail de Startdatum der Urlaubsbenachrichtigung muss VOR dem Endedatum liegen! +validate certificate felamimail de Zertifikat überprüfen +view full header felamimail de alle Kopfzeilen anzeigen +view header lines felamimail de Kopfzeilen anzeigen +view message felamimail de zeige Nachricht +viewing full header felamimail de zeige alle Kopfzeilen +viewing message felamimail de zeige Nachricht +viewing messages felamimail de zeige Nachrichten +wed felamimail de Mi +when deleting messages felamimail de wenn Nachrichten gelöscht werden +which folders (additional to the sent folder) should be displayed using the sent folder view schema felamimail de Welche Mailordner, zusätzlich zum Gesendet-Ordner, sollen im Anzeigenschema analog des Gesendet-Ordners dargestellt werden. +which folders - in general - should not be automatically created, if not existing felamimail de Welche Mailordner sollen generell NICHT automatisch angelegt werden, wenn Sie nicht existieren +with message felamimail de mit folgender Nachricht +with message "%1" felamimail de mit der Nachricht "%1" +wrap incoming text at felamimail de Text umbrechen nach +writing felamimail de schreiben +wrote felamimail de schrieb +yes, offer copy option felamimail de ja, mit Kopieroption +you can use %1 for the above start-date and %2 for the end-date. felamimail de Sie können %1 für das obige Startdatum und %2 für das Endedatum verwenden. +you have received a new message on the felamimail de Sie haben eine neue Nachricht erhalten: +your message to %1 was displayed. felamimail de Ihre Nachricht an %1 wurde angezeigt. diff --git a/felamimail/lang/egw_el.lang b/felamimail/lang/egw_el.lang new file mode 100644 index 0000000000..3b914d5871 --- /dev/null +++ b/felamimail/lang/egw_el.lang @@ -0,0 +1,411 @@ +(no subject) felamimail el (κανένα θέμα) +(only cc/bcc) felamimail el (μόνο Cc/Bcc) +(unknown sender) felamimail el (άγνωστος αποστολέας) +activate felamimail el Ενεργοποίηση +activate script felamimail el ενεργοποίηση κειμένου ομιλίας +add acl felamimail el προσθήκη acl +add address felamimail el Προσθήκη διεύθυνσης +add rule felamimail el Προσθήκη Κανόνα +add script felamimail el Προσθήκη Κειμένου ομιλίας +add to %1 felamimail el Προσθήκη στο %1 +add to address book felamimail el Προσθήκη στο βιβλίο διευθύνσεων +add to addressbook felamimail el προσθήκη στο βιβλίο διευθύνσεων +adding file to message. please wait! felamimail el Το αρχείο προστίθεται στο μήνυμα.Παρακαλώ περιμένετε! +additional info felamimail el Επιπλέον πληροφορίες +address book felamimail el Βιβλίο Διευθύνσεων +address book search felamimail el Αναζήτηση Βιβλίου Διευθύνσεων +after message body felamimail el Μετά το κυρίως σώμα του μηνύματος +all address books felamimail el Όλα τα βιβλία διευθύνσεων +all folders felamimail el Όλοι οι Φάκελοι +all of felamimail el όλα από +allow images from external sources in html emails felamimail el Να επιτρέπονται οι εικόνες από εξωτερικές πηγές στα HTML emails +allways a new window felamimail el πάντα νέο παράθυρο +always show html emails felamimail el Να εμφανίζονται πάντοτε τα HTML emails +and felamimail el και +any of felamimail el οποιοδήποτε +any status felamimail el οποιαδήποτε κατάσταση +anyone felamimail el οποιοσδήποτε +as a subfolder of felamimail el ως υποφάκελος του +attachments felamimail el Επισυνάψεις +authentication required felamimail el απαιτείται αυθεντικότητα +auto refresh folder list felamimail el Αυτόματη ανανέωση λίστας φακέλων +back to folder felamimail el Πίσω στο φάκελο +bad login name or password. felamimail el Λάθος όνομα ή κωδικός πρόσβασης +bad request: %s felamimail el Άκυρη απαίτηση: % +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail el Βασισμένο πάνω στα δοθέντα κριτήρια, τα εισερχόμενα μηνύματα μπορούν να έχουν διαφορετικό χρώμα φόντου στη λίστα μηνυμάτων. Αυτό βοηθάει στην εύκολη διάκριση του αποστολέα, ιδιαίτερα στις λίστες μηνυμάτων. +bcc felamimail el BCC +before headers felamimail el Πριν τις κεφαλίδες +between headers and message body felamimail el Ανάμεσα στις κεφαλίδες και το κυρίως σώμα του μηνύματος +body part felamimail el κυρίως σώμα +can't connect to inbox!! felamimail el δεν μπορεί να συνδεθεί με τα ΕΙΣΕΡΧΟΜΕΝΑ +cc felamimail el CC +change folder felamimail el Αλλαγή φακέλου +checkbox felamimail el Checkbox +clear search felamimail el καθαρισμός αναζήτησης +click here to log back in. felamimail el Κάντε κλικ εδώ για να εισέλθετε ξανά πίσω +click here to return to %1 felamimail el Κάντε κλικ εδώ για επιστροφή στο %1 +close all felamimail el κλείσιμο όλων +close this page felamimail el κλείσιμο αυτής της σελίδας +close window felamimail el Κλείσιμο παράθυρου +color felamimail el Χρώμα +compose felamimail el Συνθέτω +compress folder felamimail el Φάκελος συμπίεσης +condition felamimail el κατάσταση +configuration felamimail el Διάρθρωση +connection dropped by imap server. felamimail el Έπεσε η σύνδεση από τον IMAP server +contains felamimail el περιέχει +could not complete request. reason given: %s felamimail el Δεν ολοκληρώθηκε το αίτημα. Αιτία: %s +could not open secure connection to the imap server. %s : %s. felamimail el Δεν έγινε ασφαλής σύνδεση με τον IMAP server. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. felamimail el CRAM-MD5 ή DIGEST-MD5 απαιτεί το Auth_SASL πακέτο να εγκατασταθεί. +create felamimail el Δημιουργία +create folder felamimail el Δημιουργία Φακέλου +create sent felamimail el Δημιουργία Σταλθέντων +create subfolder felamimail el Δημιουργία υποφακέλου +create trash felamimail el Δημιουργία Κάδου Αχρήστων +created folder successfully! felamimail el Δημιουργία φακέλου επιτυχής! +dark blue felamimail el Σκούρο μπλε +dark cyan felamimail el Σκούρο κυανό +dark gray felamimail el Σκούρο γκρι +dark green felamimail el Σκούρο πράσινο +dark magenta felamimail el Σκούρο ματζέντα +dark yellow felamimail el Σκούρο κίτρινο +date(newest first) felamimail el Ημερομηνία (πρώτα η πιο πρόσφατη) +date(oldest first) felamimail el Ημερομηνία (πρώτα η πιο παλιά) +days felamimail el ημέρες +deactivate script felamimail el απενεργοποίηση σεναρίου +default signature felamimail el προεπιλεγμένη υπογραφή +default sorting order felamimail el Προεπιλεγμένη σειρά ταξινόμησης +delete all felamimail el διαγραφή όλων +delete folder felamimail el Διαγραφή Φακέλου +delete script felamimail el διαγραφή σεναρίου +delete selected felamimail el Διαγραφή επιλεγμένων +delete selected messages felamimail el διαγραφή επιλεγμένων μηνυμάτων +deleted felamimail el διεγράφη +deleted folder successfully! felamimail el Φάκελος διεγράφη επιτυχώς +deleting messages felamimail el διαγραφή μηνυμάτων +disable felamimail el Απενεργοποίηση +discard felamimail el απόρριψη +discard message felamimail el απόρριψη μηνύματων +display message in new window felamimail el Προβολή μηνύματος σε νέο παράθυρο +display messages in multiple windows felamimail el προβολή μηνυμάτων σε πολλαπλά παράθυρα +display of html emails felamimail el Προβολή των HTML emails +display only when no plain text is available felamimail el Προβολή μόνο όταν είναι δεν διαθέσιμο κανένα αποκρυπτογραφημένο κείμενο +display preferences felamimail el Προβολή Προτιμήσεων +displaying html messages is disabled felamimail el η προβολή των html μηνυμάτων είναι απενεργοποιημένη +do it! felamimail el Κάντο! +do not use sent felamimail el Μην χρησιμοποιείτε τα Σταλθέντα +do not use trash felamimail el Μην χρησιμοποιείτε τον Κάδο Αχρήστων +do not validate certificate felamimail el μην επικυρώνετε το πιστοποιητικό +do you really want to delete the '%1' folder? felamimail el Θέλετε πραγματικά να διαγράψετε τον φάκελο '%1' ; +do you really want to delete the selected signatures? felamimail el Θέλετε πραγματικά να διαγάψετε τι=ς επιλεγμένες υπογραφές; +does not contain felamimail el δεν περιέχει +does not match felamimail el δεν συμπίπτει +don't use draft folder felamimail el Μην χρησιμοποιείτε των φάκελο προσχεδίων +don't use sent felamimail el Μην χρησιμοποιείτε τα Σταλθέντα +don't use trash felamimail el Μην χρησιμοποιείτε των Κάδο Αχρήστων +down felamimail el κάτω +download felamimail el φόρτωση +download this as a file felamimail el Φόρτωση αυτού του φακέλου +draft folder felamimail el προσχέδιος φάκελος +e-mail felamimail el E-mail +e-mail address felamimail el Διεύθυνση e-mail +e-mail folders felamimail el Φάκελοι e-mail +edit email forwarding address felamimail el επεξεργασία διευθυνσης προωθημένου e-mail +edit filter felamimail el Επεξεργασία φίλτρου +edit rule felamimail el επεξεργασία κανόνα +edit selected felamimail el Επεξεργασία επιλεγμένων +edit vacation settings felamimail el επεξεργασία ρυθμίσεων διακοπών +email address felamimail el Διεύθυνση e-mail +email forwarding address felamimail el διεύθυνση προωθημένου e-mail +email signature felamimail el Υπογραφή e-mail +emailaddress felamimail el Διεύθυνση e-mail +empty trash felamimail el Άδειασμα κάδου αχρήστων +enable felamimail el ενεργοποίηση +encrypted connection felamimail el αποκρυπτογραφημένη σύνδεση +enter your imap mail server hostname or ip address admin el Πληκτρολογήστε το IMAP mail server όνομα χρήστη ή την IP διεύθυνση +enter your sieve server hostname or ip address admin el Πληκτρολογήστε το SIEVE server όνομα χρήστη ή την IP διεύθυνση +enter your sieve server port admin el Πληκτρολογήστε την SIEVE server θύρα +enter your smtp server hostname or ip address admin el Πληκτρολογήστε το SMTP server όνομα χρήστη ή την IP διεύθυνση +enter your smtp server port admin el Πληκτρολογήστε την SMTP server θύρα +error felamimail el ΣΦΑΛΜΑ +error connecting to imap serv felamimail el Σφάλμα κατά τη σύνδεση με τον IMAP serv +error connecting to imap server. %s : %s. felamimail el Σφάλμα κατά τη σύνδεση με τον IMAP server. %s : %s. +error connecting to imap server: [%s] %s. felamimail el Σφάλμα κατά τη σύνδεση με τον IMAP server. [%s] : %s. +error opening felamimail el Σφάλμα στο άνοιγμα +every felamimail el κάθε +every %1 days felamimail el κάθε %1 ημέρες +expunge felamimail el Διαγράφω +extended felamimail el επεκτάθηκε +felamimail common el FelaMiMail +file into felamimail el αρχείο μέσα στο +files felamimail el αρχεία +filter active felamimail el ενεργό φίλτρο +filter name felamimail el Όνομα φίλτρου +filter rules common el κανόνες φίλτρου +first name felamimail el Όνομα +flagged felamimail el σημαιοστολισμένο +flags felamimail el Σημαίες +folder acl felamimail el Acl φακέλου +folder name felamimail el Όνομα φακέλου +folder path felamimail el Διαδρομή φακέλου +folder preferences felamimail el Προτιμήσεις Φακέλου +folder settings felamimail el Ρυθμίσεις φακέλου +folder status felamimail el Κατάσταση φακέλου +folderlist felamimail el Λίστα φακέλου +foldername felamimail el Όνομα φακέλου +folders felamimail el Φάκελοι +folders created successfully! felamimail el Επιτυχής δημιουργία φακέλων! +follow felamimail el ακολουθώ +for mail to be send - not functional yet felamimail el Για αποστολή μηνύματος - δεν λειτουργεί ακόμα +for received mail felamimail el Για εισερχόμενα μηνύματα +forward felamimail el Προώθηση +forward to felamimail el προώθηση σε +forward to address felamimail el προώθηση στην διεύθυνση +forwarding felamimail el Προωθείται +found felamimail el Βρέθηκε +fri felamimail el Παρ +from felamimail el Από +from(a->z) felamimail el Από (Α->Ω) +from(z->a) felamimail el Από (Ω->Α) +full name felamimail el Ολόκληρο το όνομα +greater than felamimail el μεγαλύτερο από +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail el Κοιτάξτε στο www.felamimail.org για να μάθετε περισσότερα για το Squirrelmail.
    +header lines felamimail el Γραμμές Τίτλου +hide header felamimail el απόκρυψη τίτλου +hostname / address felamimail el όνομα χρήστη / διεύθυνση +html felamimail el HTML +icons and text felamimail el Εικόνες και κείμενο +icons only felamimail el Μόνο εικόνες +identifying name felamimail el Αναγνώριση ονόματος +identity felamimail el Ταυτότητα +if felamimail el ΑΝ +if from contains felamimail el αν από τα περιεχόμενα +if mail header felamimail el αν ο τίτλος του μηνύματος +if message size felamimail el αν το μέγεθος του μηνύματος +if subject contains felamimail el αν το θέμα περιέχει +if to contains felamimail el αν το σε περιέχει +if using ssl or tls, you must have the php openssl extension loaded. felamimail el Αν χρησιμοποιείται SSL ή TLS, πρέπει να έχετε την PHP openssl επέκταση φορτωμένη. +illegal folder name. please select a different name. felamimail el Άκυρο όνομα φακέλου. Παρακαλώ επιλέξτε διαφορετικό όνομα. +imap felamimail el IMAP +imap server felamimail el IMAP Server +imap server address felamimail el Διεύθυνση IMAP Server +imap server closed the connection. felamimail el Ο IMAP Server έκλεισε τη σύνδεση +imap server closed the connection. server responded: %s felamimail el Ο IMAP Server έκλεισε τη σύνδεση. Ο Server απάντησε: %s +imap server password felamimail el imap server κωδικός +imap server type felamimail el IMAP Server τύπος +imap server username felamimail el imap server όνομα χρήστη +imaps authentication felamimail el IMAPS ΑΥΘΕΝΤΙΚΟΤΗΤΑ +imaps encryption only felamimail el Μόνο IMAPS κρυπτογράφηση +in felamimail el μέσα +inbox felamimail el Εισερχόμενα +incoming mail server(imap) felamimail el server(IMAP) εισερχομένων μηνυμάτων +index order felamimail el Ταξινόμηση ευρετηρίου +info felamimail el Πληροφορίες +invalid user name or password felamimail el Άκυρο όνομα χρήστη ή κωδικός +javascript felamimail el JavaScript +jumping to end felamimail el μετάβαση στην αρχή +jumping to start felamimail el μετάβαση στο τέλος +keep a copy of the message in your inbox felamimail el κρατήστε ένα αντίγραφο του μηνύματος στα εισερχόμενα +keep local copy of email felamimail el κρατήστε ένα τοπικό αντίγραφο του email +kilobytes felamimail el kilobytes +language felamimail el Γλώσσα +last name felamimail el Επώνυμο +left felamimail el Αριστερά +less felamimail el λιγότερο +less than felamimail el λιγότερο από +light gray felamimail el Ανοιχτό Γκρι +list all felamimail el Δημιουργία λίστας με όλα +loading felamimail el φόρτωση +location of buttons when composing felamimail el Τοποθεσία κουμπιών όταν γίνεται η σύνθεση +mail server login type admin el Τύπος εισόδου μηνύματος server +mail settings felamimail el Ρυθμίσεις μηνύματος +mainmessage felamimail el κύριο μήνυμα +manage emailaccounts preferences el Διαχείριση λογαρισμών Email +manage emailfilter / vacation preferences el Διαχείριση φίλτρου Email / Διακοπών +manage folders common el Διαχείριση Φακέλων +manage sieve common el Διαχείριση Sieve σεναρίων +manage signatures felamimail el Διαχείριση υπογραφών +mark as deleted felamimail el Σημείωση ως διαγραμένο +mark messages as felamimail el Σημείωση επιλεγμένων μηνυμάτων ως +mark selected as flagged felamimail el Σημείωση επιλεγμένων ως σημαιοστολισμένα +mark selected as read felamimail el Σημείωση επιλεγμένων ως διαβασμένα +mark selected as unflagged felamimail el Σημείωση επιλεγμένων ως μη σημαιοστολισμένα +mark selected as unread felamimail el Σημείωση επιλεγμένων ως μη διαβασμένα +match felamimail el Συνδυασμός +matches felamimail el συνδυάζεται +matches regexp felamimail el συνδυάζεται regexp +max uploadsize felamimail el μέγιστο μέγεθος φορτώματος +message highlighting felamimail el Υπογράμμιση Μηνύματος +message list felamimail el Κατάλογος μηνυμάτων +messages felamimail el μηνύματα +mon felamimail el Δευ +move felamimail el μετακίνηση +move messages felamimail el μετακίνηση μηνυμάτων +move selected to felamimail el μετακίνηση επιλεγμένων στο +move to trash felamimail el Μετακίνηση στον Κάδο Αχρήστων +moving messages to felamimail el μετακίνηση επιλεγμένων στο +name felamimail el Όνομα +never display html emails felamimail el Να μην προβάλονται τα HTML emails +new common el Νέο +new filter felamimail el Νέο φίλτρο +next felamimail el Επόμενο +next message felamimail el επόμενο μήνυμα +no active imap server found!! felamimail el Δεν βρέθηκε ενεργός IMAP server!!! +no encryption felamimail el Καμία κρυπτογράφηση +no filter felamimail el Κανένα φίλτρο +no folders found felamimail el Δεν βρέθηκε κανένας φάκελος +no folders were found to subscribe to! felamimail el Δεν βρέθηκε κανένας φάκελος για εγγραφή σε αυτόν! +no folders were found to unsubscribe from! felamimail el Δεν βρέθηκε κανένας φάκελος για παύση συνδρομής! +no highlighting is defined felamimail el Δεν έχει όριστει κάποια υπογράμμιση +no message returned. felamimail el Δεν επεστράφη κάποιο μήνυμα. +no messages found... felamimail el δεν βρέθηκαν μηνύματα... +no messages were selected. felamimail el Δεν επιλέχθηκαν κάποια μηνύματα. +no plain text part found felamimail el δεν βρέθηκε μέρος αποκρυπτογραφημένου κειμένου +no previous message felamimail el κανένα προηγούμενο κείμενο +no supported imap authentication method could be found. felamimail el Δεν βρέθηκε καμία υποστηριζόμενη IMAP επικυρωμένη μέθοδος. +no valid emailprofile selected!! felamimail el Έχει επιλεχθεί άκυρο προφίλ Email! +none felamimail el κανένα +on behalf of felamimail el εκ μέρους του +one address is not valid felamimail el Κάποια διεύθυνση είναι άκυρη +only inbox felamimail el Μόνο τα ΕΙΣΕΡΧΟΜΕΝΑ +only one window felamimail el μόνο ένα παράθυρο +only unseen felamimail el μόνο αυτά που δεν έχουν προβληθεί +open all felamimail el άνοιγμα όλων +options felamimail el Επιλογές +or felamimail el ή +organisation felamimail el οργανισμός +organization felamimail el οργανισμός +organization name admin el Όνομα οργανισμού +participants felamimail el Συμμετέχοντες +personal information felamimail el Προσωπικές πληροφορίες +please select a address felamimail el Παρακαλώ επιλέξτε μία διεύθυνση +please select the number of days to wait between responses felamimail el παρακαλώ επιλέξτε τον αριθμό των ημερών για αναμονή μεταξύ των απαντήσεων +please supply the message to send with auto-responses felamimail el Παρακαλώ τροφοδοτήστε το μήνυμα προς αποστολή με αυτόματες απαντήσεις +port felamimail el θύρα +posting felamimail el ταχυδρόμηση +previous felamimail el Προηγούμενο +previous message felamimail el προηγούμενο μήνυμα +print it felamimail el εκτύπωση +print this page felamimail el εκτύπωση σελίδας +quicksearch felamimail el Γρήγορη αναζήτηση +read felamimail el ανάγνωση +reading felamimail el ανάγνωση +receive notification felamimail el Παρελήφθη ειδοποίηση +recent felamimail el πρόσφατα +refresh time in minutes felamimail el Ανανέωση ώρας σε λεπτά +reject with felamimail el απόρριψη με +remove felamimail el μετακίνηση +remove immediately felamimail el Άμεση μετακίνηση +rename felamimail el Μετονομασία +rename a folder felamimail el Μετονομασία ενός Φακέλου +rename folder felamimail el Μετονομασία φακέλου +renamed successfully! felamimail el Επιτυχής μετονομασία! +replied felamimail el απαντήθηκε +reply felamimail el Απάντηση +reply all felamimail el Απάντηση σε όλα +reply to felamimail el Απάντηση στο +replyto felamimail el Απάντησηστο +respond felamimail el Απόκριση +return felamimail el Επιστροφή +return to options page felamimail el Επιστροφή στη σελίδα επιλογών +right felamimail el Δεξιά +row order style felamimail el Στυλ ταξινόμησης σειράς +rule felamimail el Κανόνας +sat felamimail el Σάβ +save felamimail el Αποθήκευση +save as draft felamimail el Αποθήκευση ως προσχέδιο +save as infolog felamimail el Αποθήκευση ως infolog +save changes felamimail el αποθήκευση αλλαγών +save message to disk felamimail el αποθήκευση αλλαγών στο δίσκο +script name felamimail el όνομα σεναρίου +script status felamimail el κατάσταση σεναρίου +search felamimail el Αναζήτηση +search for felamimail el Αναζήτηση για +select felamimail el Επιλογή +select all felamimail el Επιλογή όλων +select emailprofile felamimail el Επιλογή προφίλ Email +select folder felamimail el επιλογή φακέλου +select your mail server type admin el Επιλέξτε τον τύπο mail server +send felamimail el Αποστολή +send a reject message felamimail el αποστολή μηνύματος απόρριψης +sent folder felamimail el Φάκελος σταλθέντων +show header felamimail el Προβολή τίτλου +show new messages on main screen felamimail el Προβολή νέων μηνυμάτων στην κύρια οθόνη +sieve script name felamimail el όνομα sieve σεναρίου +sieve settings admin el Ρυθμίσεις Sieve +signature felamimail el Υπογραφή +simply click the target-folder felamimail el Απλά κάντε κλικ στον στόχο-φάκελο +size felamimail el Μέγεθος +size of editor window felamimail el Μέγεθος παραθύρου συντάκτη +size(...->0) felamimail el Μέγεθος (...->0) +size(0->...) felamimail el Μέγεθος (0->...) +skipping forward felamimail el παράληψη προώθησης +skipping previous felamimail el παράληψη προηγουμένων +small view felamimail el μικρή προβολή +smtp settings admin el Ρυθμίσεις SMTP +subject felamimail el Θέμα +subject(a->z) felamimail el Θέμα (Α->Ω) +subject(z->a) felamimail el Θέμα (Ω->Α) +submit felamimail el Υποβολή +subscribe felamimail el Εγγραφή +subscribed felamimail el Έχει εγγραφεί +subscribed successfully! felamimail el Η εγγραφή ήταν επιτυχής +sun felamimail el Κυρ +table of contents felamimail el Πίνακας περιεχομένων +text only felamimail el Μόνο κείμενο +the connection to the imap server failed!! felamimail el Αποτυχία σύνδεση με τον IMAP Server +the imap server does not appear to support the authentication method selected. please contact your system administrator. felamimail el Ο IMAP server δεν υποστηρίζει την επιλεγμένη μέθοδο αυθεντικότητας.Παρακαλώ επικοινωνήστε με τον διαχειριστή σας. +then felamimail el ΜΕΤΑ +this folder is empty felamimail el ΑΥΤΟΣ Ο ΦΑΚΕΛΟΣ ΕΙΝΑΙ ΑΔΕΙΟΣ +this php has no imap support compiled in!! felamimail el Αυτό το PHP δεν έχει καθόλου IMAP υποστήριξη μεταφρασμένη!! +thu felamimail el Πέμ +to felamimail el Στο +to use a tls connection, you must be running a version of php 5.1.0 or higher. felamimail el Για τη χρησιμοποίηση TLS σύνδεσης, πρέπει να έχετε PHP 5.1.0 ή υψηλότερη έκδοση. +translation preferences felamimail el Προτιμήσεις Μετάφρασης +translation server felamimail el Server μετάφρασης +trash fold felamimail el Φάκ Κάδου Αχρήστων +trash folder felamimail el Φάκελος Κάδου Αχρήστων +tue felamimail el Τρί +type felamimail el τύπος +unexpected response from server to authenticate command. felamimail el Απρόσμενη απάντηση από τον server στην ΕΞΑΚΡΙΒΩΣΗ ΓΝΗΣΙΟΤΗΤΑΣ εντολής. +unexpected response from server to digest-md5 response. felamimail el Απρόσμενη απάντηση από τον server στην Digest-MD5 απάντηση. +unexpected response from server to login command. felamimail el Απρόσμενη απάντηση από τον server στην εντολή ΕΙΣΟΔΟΥ +unflagged felamimail el αποσημαιοστολίστηκε +unknown err felamimail el Άγνωστο λάθ +unknown error felamimail el Άγνωστο λάθος +unknown imap response from the server. server responded: %s felamimail el Άγνωστη IMAP απάντηση από τον server.Απάντηση Server:%s +unknown sender felamimail el Άγνωστος αποστολέας +unknown user or password incorrect. felamimail el Άγνωστος χρήστης ή λάθος κωδικός. +unread common el Αδιάβαστα +unseen felamimail el Αθέατα +unselect all felamimail el Αποεπιλογή όλων +unsubscribe felamimail el Παύση συνδρομής +unsubscribed felamimail el Η συνδρομή σταμάτησε +unsubscribed successfully! felamimail el Η συνδρομή σταμάτησε επιτυχώς! +up felamimail el πάνω +updating message status felamimail el ενημέρωση κατάστασης μηνύματος +updating view felamimail el ενημέρωση εμφάνισης +use emailadmin to create profiles felamimail el χρησιμοποιήστε EmailAdmin για τη δημιουργία προφίλ +use a signature felamimail el Χρήση υπογραφής +use a signature? felamimail el Χρήση υπογραφής; +use addresses felamimail el Χρήση διευθύνσεων +use custom settings felamimail el Χρήση σύνηθων Ρυθμίσεων +use regular expressions felamimail el χρήση κανονικών εκφράσεων +use smtp auth admin el Χρήση SMTP αυθ +users can define their own emailaccounts admin el Οι χρήστες μπορούν να ορίσουν τους δικούς τους email λογαριασμούς +vacation notice common el ειδοποίηση διακοπών +vacation notice is active felamimail el Η ειδοποίηση διακοπών είναι ενεργή +validate certificate felamimail el επικύρωση πιστοποιητικού +view full header felamimail el Προβολή πλήρους τίτλου +view header lines felamimail el Προβολή γραμμών τίτλου +view message felamimail el Προβολή μηνύματος +viewing full header felamimail el Προβάλλεται πλήρης τίτλος +viewing message felamimail el Προβολή μηνύματος +viewing messages felamimail el Προβολή μηνυμάτων +wed felamimail el Τετ +when deleting messages felamimail el Όταν διαγράφονται τα μηνύματα +with message felamimail el με μήνυμα +with message "%1" felamimail el με μήνυμα "%1" +wrap incoming text at felamimail el Τύλιγμα εισερχόμενου μηνύματος σε +writing felamimail el γράφεται +wrote felamimail el γράφτηκε diff --git a/felamimail/lang/egw_en.lang b/felamimail/lang/egw_en.lang new file mode 100644 index 0000000000..5682793b00 --- /dev/null +++ b/felamimail/lang/egw_en.lang @@ -0,0 +1,514 @@ +%1 is not writable by you! felamimail en %1 is NOT writable by you! +(no subject) felamimail en (no subject) +(only cc/bcc) felamimail en (only Cc/Bcc) +(separate multiple addresses by comma) felamimail en (separate multiple addresses by comma) +(unknown sender) felamimail en (unknown sender) +3paneview: if you want to see a preview of a mail by single clicking onto the subject, set the height for the message-list and the preview area here (300 seems to be a good working value). the preview will be displayed at the end of the message list on demand (click). felamimail en 3PaneView: If you want to see a preview of a mail by single clicking onto the subject, set the height for the message-list and the preview area here (300 seems to be a good working value). The preview will be displayed at the end of the message list on demand (click). +aborted felamimail en aborted +activate felamimail en Activate +activate script felamimail en activate script +activating by date requires a start- and end-date! felamimail en Activating by date requires a start- AND end-date! +add acl felamimail en add acl +add address felamimail en Add address +add rule felamimail en Add Rule +add script felamimail en Add Script +add to %1 felamimail en Add to %1 +add to address book felamimail en Add to address book +add to addressbook felamimail en add to addressbook +adding file to message. please wait! felamimail en Adding file to message. Please wait! +additional info felamimail en Additional info +address book felamimail en Address Book +address book search felamimail en Address Book Search +after message body felamimail en After message body +all address books felamimail en All address books +all folders felamimail en All Folders +all messages in folder felamimail en all messages in folder +all of felamimail en all of +allow images from external sources in html emails felamimail en Allow images from external sources in HTML emails +allways a new window felamimail en always a new window +always show html emails felamimail en Always show HTML emails +and felamimail en and +any of felamimail en any of +any status felamimail en any status +anyone felamimail en anyone +as a subfolder of felamimail en as a subfolder of +attach felamimail en Attach +attachments felamimail en Attachments +authentication required felamimail en authentication required +auto refresh folder list felamimail en Auto refresh folder list +back to folder felamimail en Back to folder +bad login name or password. felamimail en Bad login name or password. +bad or malformed request. server responded: %s felamimail en Bad or malformed request. Server Responded: %s +bad request: %s felamimail en Bad request: %s +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail en Based upon given criteria, incoming messages can have different background colors in the message list. This helps to easily distinguish who the messages are from, especially for mailing lists. +bcc felamimail en BCC +before headers felamimail en Before headers +between headers and message body felamimail en Between headers and message body +body part felamimail en body part +by date felamimail en by date +can not send message. no recipient defined! felamimail en can not send message. no recipient defined! +can't connect to inbox!! felamimail en can't connect to INBOX!! +cc felamimail en CC +change folder felamimail en Change folder +check message against next rule also felamimail en check message against next rule also +checkbox felamimail en Checkbox +clear search felamimail en clear search +click here to log back in. felamimail en Click here to log back in. +click here to return to %1 felamimail en Click here to return to %1 +close all felamimail en close all +close this page felamimail en close this page +close window felamimail en Close window +color felamimail en Color +compose felamimail en Compose +compose as new felamimail en compose as new +compress folder felamimail en Compress folder +condition felamimail en condition +configuration felamimail en Configuration +configure a valid imap server in emailadmin for the profile you are using. felamimail en Configure a valid IMAP Server in emailadmin for the profile you are using. +connection dropped by imap server. felamimail en Connection dropped by IMAP server. +contact not found! felamimail en Contact not found! +contains felamimail en contains +copy or move messages? felamimail en Copy or Move Messages? +copying messages to felamimail en copying messages to +could not complete request. reason given: %s felamimail en Could not complete request. Reason Given: %s +could not import message: felamimail en Could not import Message: +could not open secure connection to the imap server. %s : %s. felamimail en Could not open secure connection to the IMAP server. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. felamimail en CRAM-MD5 or DIGEST-MD5 requires the Auth_SASL package to be installed. +create felamimail en Create +create folder felamimail en Create Folder +create sent felamimail en Create Sent +create subfolder felamimail en Create subfolder +create trash felamimail en Create Trash +created folder successfully! felamimail en Created folder successfully! +dark blue felamimail en Dark Blue +dark cyan felamimail en Dark Cyan +dark gray felamimail en Dark Gray +dark green felamimail en Dark Green +dark magenta felamimail en Dark Magenta +dark yellow felamimail en Dark Yellow +date(newest first) felamimail en Date (newest first) +date(oldest first) felamimail en Date (oldest first) +days felamimail en days +deactivate script felamimail en deactivate script +default felamimail en default +default signature felamimail en default signature +default sorting order felamimail en Default sorting order +delete all felamimail en delete all +delete folder felamimail en Delete Folder +delete script felamimail en delete script +delete selected felamimail en Delete selected +delete selected messages felamimail en delete selected messages +deleted felamimail en deleted +deleted folder successfully! felamimail en Deleted folder successfully! +deleting messages felamimail en deleting messages +disable felamimail en Disable +discard felamimail en discard +discard message felamimail en discard message +display message in new window felamimail en Display message in new window +display messages in multiple windows felamimail en display messages in multiple windows +display of html emails felamimail en Display of HTML emails +display only when no plain text is available felamimail en Display only when no plain text is available +display preferences felamimail en Display Preferences +displaying html messages is disabled felamimail en displaying html messages is disabled +do it! felamimail en do it! +do not use sent felamimail en Do not use Sent +do not use trash felamimail en Do not use Trash +do not validate certificate felamimail en do not validate certificate +do you really want to delete the '%1' folder? felamimail en Do you really want to delete the '%1' folder? +do you really want to delete the selected accountsettings and the assosiated identity. felamimail en Do you really want to delete the selected Account settings and the associated Identity. +do you really want to delete the selected signatures? felamimail en Do you really want to delete the selected signatures? +do you really want to move or copy the selected messages to folder: felamimail en Do you really want to move or copy the selected messages to folder: +do you really want to move the selected messages to folder: felamimail en Do you really want to move the selected messages to folder: +do you want to be asked for confirmation before moving selected messages to another folder? felamimail en Do you want to be asked for confirmation before moving selected messages to another folder? +do you want to prevent the editing/setup for forwarding of mails via settings (, even if sieve is enabled)? felamimail en Do you want to prevent the editing/setup for forwarding of mails via settings (, even if SIEVE is enabled)? +do you want to prevent the editing/setup of filter rules (, even if sieve is enabled)? felamimail en Do you want to prevent the editing/setup of filter rules (, even if SIEVE is enabled)? +do you want to prevent the editing/setup of notification by mail to other emailadresses if emails arrive (, even if sieve is enabled)? felamimail en Do you want to prevent the editing/setup of notification by mail to other email addresses if emails arrive (, even if SIEVE is enabled)? +do you want to prevent the editing/setup of the absent/vacation notice (, even if sieve is enabled)? felamimail en Do you want to prevent the editing/setup of the absent/vacation notice (, even if SIEVE is enabled)? +do you want to prevent the managing of folders (creation, accessrights and subscribtion)? felamimail en Do you want to prevent the managing of folders (creation, access rights AND subscription)? +does not contain felamimail en does not contain +does not exist on imap server. felamimail en does not exist on IMAP Server. +does not match felamimail en does not match +does not match regexp felamimail en does not match regexp +don't use draft folder felamimail en Don't use draft folder +don't use sent felamimail en Don't use Sent +don't use template folder felamimail en Don't use template folder +don't use trash felamimail en Don't use Trash +dont strip any tags felamimail en dont strip any tags +down felamimail en down +download felamimail en download +download this as a file felamimail en Download this as a file +draft folder felamimail en draft folder +drafts felamimail en Drafts +e-mail felamimail en E-Mail +e-mail address felamimail en E-Mail address +e-mail folders felamimail en E-Mail Folders +edit email forwarding address felamimail en edit email forwarding address +edit filter felamimail en Edit filter +edit rule felamimail en edit rule +edit selected felamimail en Edit selected +edit vacation settings felamimail en edit vacation settings +editor type felamimail en Editor type +email address felamimail en E-Mail Address +email forwarding address felamimail en email forwarding address +email notification update failed felamimail en email notification update failed +email signature felamimail en Email signature +emailaddress felamimail en emailaddress +empty trash felamimail en empty trash +enable felamimail en enable +encrypted connection felamimail en encrypted connection +enter your default mail domain ( from: user@domain ) admin en Enter your default mail domain ( From: user@domain ) +enter your imap mail server hostname or ip address admin en Enter your IMAP mail server hostname or IP address +enter your sieve server hostname or ip address admin en Enter your SIEVE server hostname or IP address +enter your sieve server port admin en Enter your SIEVE server port +enter your smtp server hostname or ip address admin en Enter your SMTP server hostname or IP address +enter your smtp server port admin en Enter your SMTP server port +entry saved felamimail en Entry saved +error felamimail en ERROR +error connecting to imap serv felamimail en Error connecting to IMAP serv +error connecting to imap server. %s : %s. felamimail en Error connecting to IMAP server. %s : %s. +error connecting to imap server: [%s] %s. felamimail en Error connecting to IMAP server: [%s] %s. +error creating rule while trying to use forward/redirect. felamimail en Error creating rule while trying to use forward/redirect. +error opening felamimail en Error opening +error saving %1! felamimail en Error saving %1! +error: felamimail en Error: +error: could not save message as draft felamimail en Error: Could not save Message as Draft +error: could not save rule felamimail en Error: Could not save rule +error: message could not be displayed. felamimail en ERROR: Message could not be displayed. +event details follow felamimail en Event Details follow +every felamimail en every +every %1 days felamimail en every %1 days +expunge felamimail en Expunge +extended felamimail en extended +felamimail common en eMail +file into felamimail en file into +filemanager felamimail en Filemanager +files felamimail en files +filter active felamimail en filter active +filter name felamimail en Filter name +filter rules common en filter rules +first name felamimail en First name +flagged felamimail en flagged +flags felamimail en Flags +folder felamimail en folder +folder acl felamimail en folder acl +folder name felamimail en Folder name +folder path felamimail en Folder Path +folder preferences felamimail en Folder Preferences +folder settings felamimail en Folder settings +folder status felamimail en Folder status +folderlist felamimail en Folderlist +foldername felamimail en Folder name +folders felamimail en Folders +folders created successfully! felamimail en Folders created successfully! +follow felamimail en follow +for mail to be send - not functional yet felamimail en For mail to be send - not functional yet +for received mail felamimail en For received mail +forward felamimail en Forward +forward as attachment felamimail en forward as attachment +forward inline felamimail en forward inline +forward messages to felamimail en Forward messages to +forward to felamimail en forward to +forward to address felamimail en forward to address +forwarding felamimail en Forwarding +found felamimail en Found +fri felamimail en Fri +from felamimail en From +from(a->z) felamimail en From (A->Z) +from(z->a) felamimail en From (Z->A) +full name felamimail en Full Name +greater than felamimail en greater than +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail en Have a look at www.felamimail.org to learn more about Squirrelmail.
    +header lines felamimail en Header Lines +hide header felamimail en hide header +hostname / address felamimail en hostname / address +how to forward messages felamimail en how to forward messages +html felamimail en HTML +icons and text felamimail en Icons and text +icons only felamimail en Icons only +identifying name felamimail en Identifying name +identity felamimail en identity +if felamimail en IF +if from contains felamimail en if from contains +if mail header felamimail en if mail header +if message size felamimail en if message size +if shown, which folders should appear on main screen felamimail en If shown, which folders should appear on main screen +if subject contains felamimail en if subject contains +if to contains felamimail en if to contains +if using ssl or tls, you must have the php openssl extension loaded. felamimail en If using SSL or TLS, you must have the PHP openssl extension loaded. +illegal folder name. please select a different name. felamimail en Illegal folder name. Please select a different name. +imap felamimail en IMAP +imap server felamimail en IMAP Server +imap server address felamimail en IMAP Server Address +imap server closed the connection. felamimail en IMAP server closed the connection. +imap server closed the connection. server responded: %s felamimail en IMAP Server closed the connection. Server Responded: %s +imap server password felamimail en imap server password +imap server type felamimail en IMAP Server type +imap server username felamimail en imap server username +imaps authentication felamimail en IMAPS Authentication +imaps encryption only felamimail en IMAPS Encryption only +import felamimail en import +import mail felamimail en Import Mail +import message felamimail en import message +in felamimail en in +inbox felamimail en INBOX +incoming mail server(imap) felamimail en incoming mail server(IMAP) +index order felamimail en Index Order +info felamimail en Info +invalid user name or password felamimail en Invalid user name or password +javascript felamimail en JavaScript +jumping to end felamimail en jumping to end +jumping to start felamimail en jumping to start +junk felamimail en Junk +keep a copy of the message in your inbox felamimail en keep a copy of the message in your inbox +keep local copy of email felamimail en keep local copy of email +kilobytes felamimail en kilobytes +language felamimail en Language +last name felamimail en Last name +left felamimail en Left +less felamimail en less +less than felamimail en less than +light gray felamimail en Light Gray +list all felamimail en List all +loading felamimail en loading +location of buttons when composing felamimail en Location of buttons when composing +mail server login type admin en Mail server login type +mail settings felamimail en Mail Settings +mainmessage felamimail en mainmessage +manage email accounts and identities common en Manage eMail Accounts and Identities +manage emailaccounts common en Manage EMailaccounts +manage emailfilter / vacation preferences en Manage EMailfilter / Vacation +manage folders common en Manage Folders +manage sieve common en Manage Sieve scripts +manage signatures felamimail en Manage Signatures +mark as deleted felamimail en Mark as deleted +mark messages as felamimail en Mark selected messages as +mark selected as flagged felamimail en Mark selected as flagged +mark selected as read felamimail en Mark selected as read +mark selected as unflagged felamimail en Mark selected as unflagged +mark selected as unread felamimail en Mark selected as unread +match felamimail en Match +matches felamimail en matches +matches regexp felamimail en matches regexp +max uploadsize felamimail en max uploadsize +message highlighting felamimail en Message Highlighting +message list felamimail en Message List +messages felamimail en messages +mon felamimail en Mon +move felamimail en Move +move folder felamimail en move folder +move messages felamimail en move messages +move messages? felamimail en Move Messages? +move selected to felamimail en move selected to +move to trash felamimail en Move to trash +moving messages to felamimail en moving messages to +name felamimail en Name +never display html emails felamimail en Never display HTML emails +new common en New +new filter felamimail en New filter +next felamimail en Next +next message felamimail en next message +no active imap server found!! felamimail en No active IMAP server found!! +no address to/cc/bcc supplied, and no folder to save message to provided. felamimail en No Address TO/CC/BCC supplied, and no folder to save message to provided. +no encryption felamimail en no encryption +no filter felamimail en No Filter +no folders felamimail en no folders +no folders found felamimail en No folders found +no folders were found to subscribe to! felamimail en No folders were found to subscribe to! +no folders were found to unsubscribe from! felamimail en No folders were found to unsubscribe from! +no highlighting is defined felamimail en No highlighting is defined +no imap server host configured!! felamimail en No IMAP server host configured!! +no message returned. felamimail en No message returned. +no messages found... felamimail en no messages found... +no messages selected, or lost selection. changing to folder felamimail en No messages selected, or lost selection. Changing to folder +no messages were selected. felamimail en No messages were selected. +no plain text part found felamimail en no plain text part found +no previous message felamimail en no previous Message +no recipient address given! felamimail en No recipient address given! +no signature felamimail en no signature +no stationery felamimail en no stationery +no subject given! felamimail en No subject given! +no supported imap authentication method could be found. felamimail en No supported IMAP authentication method could be found. +no valid data to create mailprofile!! felamimail en No valid data to create MailProfile!! +no valid emailprofile selected!! felamimail en No Valid Email Profile Selected!! +none felamimail en none +none, create all felamimail en none, create all +not allowed felamimail en not allowed +notify when new mails arrive on these folders felamimail en notify when new mails arrive on these folders +on felamimail en on +on behalf of felamimail en on behalf of +one address is not valid felamimail en One address is not valid +only inbox felamimail en Only INBOX +only one window felamimail en only one window +only unseen felamimail en Only unseen +open all felamimail en open all +options felamimail en Options +or felamimail en or +or configure an valid imap server connection using the manage accounts/identities preference in the sidebox menu. felamimail en or configure an valid IMAP Server connection using the Manage Accounts/Identities preference in the Sidebox Menu. +organisation felamimail en organisation +organization felamimail en organization +organization name admin en Organization name +original message felamimail en original message +outgoing mail server(smtp) felamimail en outgoing mail server(SMTP) +participants felamimail en Participants +personal information felamimail en Personal Information +please ask the administrator to correct the emailadmin imap server settings for you. felamimail en Please ask the administrator to correct the emailadmin IMAP Server Settings for you. +please configure access to an existing individual imap account. felamimail en please configure access to an existing individual IMAP account. +please select a address felamimail en Please select a address +please select the number of days to wait between responses felamimail en Please select the number of days to wait between responses +please supply the message to send with auto-responses felamimail en Please supply the message to send with auto-responses +port felamimail en port +posting felamimail en posting +previous felamimail en Previous +previous message felamimail en previous message +print it felamimail en print it +print this page felamimail en print this page +printview felamimail en printview +quicksearch felamimail en Quicksearch +read felamimail en read +reading felamimail en reading +receive notification felamimail en Receive notification +recent felamimail en recent +refresh time in minutes felamimail en Refresh time in minutes +reject with felamimail en reject with +remove felamimail en remove +remove immediately felamimail en Remove immediately +rename felamimail en Rename +rename a folder felamimail en Rename a Folder +rename folder felamimail en Rename folder +renamed successfully! felamimail en Renamed successfully! +replied felamimail en replied +reply felamimail en Reply +reply all felamimail en Reply All +reply to felamimail en Reply To +replyto felamimail en ReplyTo +respond felamimail en Respond +respond to mail sent to felamimail en respond to mail sent to +return felamimail en Return +return to options page felamimail en Return to options page +right felamimail en Right +row order style felamimail en Row order style +rule felamimail en Rule +sat felamimail en Sat +save felamimail en Save +save all felamimail en Save all +save as draft felamimail en save as draft +save as infolog felamimail en save as infolog +save changes felamimail en save changes +save message to disk felamimail en save message to disk +script name felamimail en script name +script status felamimail en script status +search felamimail en Search +search for felamimail en Search for +select felamimail en Select +select all felamimail en Select All +select emailprofile felamimail en Select Email Profile +select folder felamimail en select folder +select your mail server type admin en Select your mail server type +send felamimail en Send +send a reject message felamimail en send a reject message +sent felamimail en Sent +sent folder felamimail en Sent Folder +server supports mailfilter(sieve) felamimail en server supports mailfilter (sieve) +set as default felamimail en Set as default +show all folders (subscribed and unsubscribed) in main screen folder pane felamimail en show all Folders (subscribed AND unsubscribed) in Main Screen Folder Pane +show header felamimail en show header +show new messages on main screen felamimail en Show new messages on main screen +sieve script name felamimail en sieve script name +sieve settings admin en Sieve settings +signatur felamimail en Signatur +signature felamimail en Signature +simply click the target-folder felamimail en Simply click the target-folder +size felamimail en Size +size of editor window felamimail en Size of editor window +size(...->0) felamimail en Size (...->0) +size(0->...) felamimail en Size (0->...) +skipping forward felamimail en skipping forward +skipping previous felamimail en skipping previous +small view felamimail en small view +smtp settings admin en SMTP settings +start new messages with mime type plain/text or html? felamimail en Start new messages with mime type plain/text or html? +stationery felamimail en stationery +subject felamimail en Subject +subject(a->z) felamimail en Subject (A->Z) +subject(z->a) felamimail en Subject (Z->A) +submit felamimail en Submit +subscribe felamimail en Subscribe +subscribed felamimail en Subscribed +subscribed successfully! felamimail en Subscribed successfully! +sun felamimail en Sun +system signature felamimail en system signature +table of contents felamimail en Table of Contents +template folder felamimail en Template folder +templates felamimail en Templates +text only felamimail en Text only +text/plain felamimail en text/plain +the action will be applied to all messages of the current folder.\ndo you want to proceed? felamimail en The action will be applied to all messages of the current folder.\nDo you want to proceed? +the connection to the imap server failed!! felamimail en The connection to the IMAP Server failed!! +the imap server does not appear to support the authentication method selected. please contact your system administrator. felamimail en The IMAP server does not appear to support the authentication method selected. Please contact your system administrator. +the message sender has requested a response to indicate that you have read this message. would you like to send a receipt? felamimail en The message sender has requested a response to indicate that you have read this message. Would you like to send a receipt? +the mimeparser can not parse this message. felamimail en The mimeparser can not parse this message. +then felamimail en THEN +there is no imap server configured. felamimail en There is no IMAP Server configured. +this folder is empty felamimail en THIS FOLDER IS EMPTY +this php has no imap support compiled in!! felamimail en This PHP has no IMAP support compiled in!! +thu felamimail en Thu +to felamimail en To +to mail sent to felamimail en to mail sent to +to use a tls connection, you must be running a version of php 5.1.0 or higher. felamimail en To use a TLS connection, you must be running a version of PHP 5.1.0 or higher. +translation preferences felamimail en Translation Preferences +translation server felamimail en Translation server +trash felamimail en Trash +trash fold felamimail en Trash Fold +trash folder felamimail en Trash Folder +tue felamimail en Tue +type felamimail en type +unexpected response from server to authenticate command. felamimail en Unexpected response from server to AUTHENTICATE command. +unexpected response from server to digest-md5 response. felamimail en Unexpected response from server to Digest-MD5 response. +unexpected response from server to login command. felamimail en Unexpected response from server to LOGIN command. +unflagged felamimail en unflagged +unknown err felamimail en Unknown err +unknown error felamimail en Unknown error +unknown imap response from the server. server responded: %s felamimail en Unknown IMAP response from the server. Server Responded: %s +unknown sender felamimail en Unknown Sender +unknown user or password incorrect. felamimail en Unknown user or password incorrect. +unread common en Unread +unseen felamimail en Unseen +unselect all felamimail en Unselect All +unsubscribe felamimail en Unsubscribe +unsubscribed felamimail en Unsubscribed +unsubscribed successfully! felamimail en Unsubscribed successfully! +up felamimail en up +updating message status felamimail en updating message status +updating view felamimail en updating view +use emailadmin to create profiles felamimail en use EmailAdmin to create profiles +use a signature felamimail en Use a signature +use a signature? felamimail en Use a signature? +use addresses felamimail en Use Addresses +use custom identities felamimail en use custom identities +use custom settings felamimail en Use Custom Settings +use regular expressions felamimail en use regular expressions +use smtp auth admin en Use SMTP auth +users can define their own emailaccounts admin en Users can define their own emailaccounts +vacation notice common en vacation notice +vacation notice is active felamimail en Vacation notice is active +vacation start-date must be before the end-date! felamimail en Vacation start-date must be BEFORE the end-date! +validate certificate felamimail en validate certificate +view full header felamimail en View full header +view header lines felamimail en view header lines +view message felamimail en View message +viewing full header felamimail en Viewing full header +viewing message felamimail en Viewing message +viewing messages felamimail en Viewing messages +wed felamimail en Wed +when deleting messages felamimail en When deleting messages +which folders (additional to the sent folder) should be displayed using the sent folder view schema felamimail en Which folders (additional to the Sent Folder) should be displayed using the Sent Folder View Schema +which folders - in general - should not be automatically created, if not existing felamimail en Which folders - in general - should NOT be automatically created, if not existing +with message felamimail en with message +with message "%1" felamimail en with message "%1" +wrap incoming text at felamimail en Wrap incoming text at +writing felamimail en writing +wrote felamimail en wrote +yes, offer copy option felamimail en yes, offer copy option +you can use %1 for the above start-date and %2 for the end-date. felamimail en You can use %1 for the above start-date and %2 for the end-date. +you have received a new message on the felamimail en You have received a new message on the +your message to %1 was displayed. felamimail en Your message to %1 was displayed. diff --git a/felamimail/lang/egw_es-es.lang b/felamimail/lang/egw_es-es.lang new file mode 100644 index 0000000000..19f8e71040 --- /dev/null +++ b/felamimail/lang/egw_es-es.lang @@ -0,0 +1,498 @@ +%1 is not writable by you! felamimail es-es ¡NO tiene permiso de escritura en %1! +(no subject) felamimail es-es (Sin asunto) +(only cc/bcc) felamimail es-es (sólo Cc/Cco) +(separate multiple addresses by comma) felamimail es-es (separar múltiples direcciones con comas) +(unknown sender) felamimail es-es (remitente desconocido) +aborted felamimail es-es abortado +activate felamimail es-es Activar +activate script felamimail es-es activar script +activating by date requires a start- and end-date! felamimail es-es Activar por fecha requiere una fecha de inicio y otra de final +add acl felamimail es-es añadir acl +add address felamimail es-es Añadir dirección +add rule felamimail es-es Añadir regla +add script felamimail es-es Añadir script +add to %1 felamimail es-es Añadir a %1 +add to address book felamimail es-es Añadir a la libreta de direcciones +add to addressbook felamimail es-es Añadir a la libreta de direcciones +adding file to message. please wait! felamimail es-es Añadiendo fichero al mensaje. Por favor, espere. +additional info felamimail es-es Información adicional +address book felamimail es-es Libreta de direcciones +address book search felamimail es-es Buscar en la libreta de direcciones +after message body felamimail es-es Después del cuerpo del mensaje +all address books felamimail es-es Todas las libretas de direcciones +all folders felamimail es-es Todas las carpetas +all of felamimail es-es todos los +allow images from external sources in html emails felamimail es-es Permitir imágenes de origen externo en correos HTML +allways a new window felamimail es-es siempre una ventana nueva +always show html emails felamimail es-es Mostrar siempre los correos HTML +and felamimail es-es y +any of felamimail es-es cualquiera de +any status felamimail es-es cualquier estado +anyone felamimail es-es cualquiera +as a subfolder of felamimail es-es como una subcarpeta de +attach felamimail es-es Adjuntar +attachments felamimail es-es Adjuntos +authentication required felamimail es-es se requiere identificación +auto refresh folder list felamimail es-es Refrescar automáticamente la lista de carpetas +back to folder felamimail es-es Volver a la carpeta +bad login name or password. felamimail es-es El usuario o contraseña son incorrectos +bad or malformed request. server responded: %s felamimail es-es Petición mal formada o errónea. El servidor respondió: %s +bad request: %s felamimail es-es Petición errónea: %s +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail es-es Basado en los criterios dados, los mensajes que lleguen pueden tener distintos colores de fondo en la lista de mensajes. Esto ayuda a distinguir fácilmente de quién son los mensajes, espcialmente para listas de correo. +bcc felamimail es-es CCO +before headers felamimail es-es Antes de las cabeceras +between headers and message body felamimail es-es Entre las cabeceras y el cuerpo del mensaje +body part felamimail es-es Parte del cuerpo +by date felamimail es-es por fecha +can not send message. no recipient defined! felamimail es-es ¡no puedo enviar el mensaje por no tener destinatario! +can't connect to inbox!! felamimail es-es ¡¡No se puede leer la Bandeja de entrada!! +cc felamimail es-es CC +change folder felamimail es-es Cambiar carpeta +check message against next rule also felamimail es-es comprobar el mensaje también con la regla siguiente +checkbox felamimail es-es Casilla +clear search felamimail es-es Limpiar búsqueda +click here to log back in. felamimail es-es Pulse aquí para volver a iniciar sesión +click here to return to %1 felamimail es-es Pulse aquí para volver a %1 +close all felamimail es-es cerrar todas +close this page felamimail es-es cerrar esta página +close window felamimail es-es Cerrar ventana +color felamimail es-es Color +compose felamimail es-es Redactar +compose as new felamimail es-es Redactar como nuevo +compress folder felamimail es-es Comprimir carpeta +condition felamimail es-es condición +configuration felamimail es-es Configuración +configure a valid imap server in emailadmin for the profile you are using. felamimail es-es Configure un servidor IMAP válido en emailadmin para el perfil que está usando. +connection dropped by imap server. felamimail es-es La conexión ha sido ignorada por el servidor IMAP +contact not found! felamimail es-es ¡No se encontró el contacto! +contains felamimail es-es contiene +could not complete request. reason given: %s felamimail es-es No se pudo completar la petición. Razón: %s +could not import message: felamimail es-es No se pudo importar el mensaje: +could not open secure connection to the imap server. %s : %s. felamimail es-es No se pudo abrir una conexión segura al servidor IMAP. %s: %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. felamimail es-es CRAM-MD5 o DIGEST-MD5 necesitan que esté instalado el paquete Auth_SASL. +create felamimail es-es Crear +create folder felamimail es-es Crear carpeta +create sent felamimail es-es Crear carpeta Enviados +create subfolder felamimail es-es Crear subcarpeta +create trash felamimail es-es Crear carpeta Papelera +created folder successfully! felamimail es-es La carpeta se ha creado correctamente +dark blue felamimail es-es Azul oscuro +dark cyan felamimail es-es Cyan oscuro +dark gray felamimail es-es Gris oscuro +dark green felamimail es-es Verde oscuro +dark magenta felamimail es-es Violeta oscuro +dark yellow felamimail es-es Amarillo oscuro +date(newest first) felamimail es-es Fecha (la más reciente primero) +date(oldest first) felamimail es-es Fecha (la más antigua primero) +days felamimail es-es días +deactivate script felamimail es-es desactivar script +default felamimail es-es predeterminado +default signature felamimail es-es Firma predeterminada +default sorting order felamimail es-es Modo de ordenar predeterminado +delete all felamimail es-es Borrar todos +delete folder felamimail es-es Borrar carpeta +delete script felamimail es-es borrar script +delete selected felamimail es-es Borrar la selección +delete selected messages felamimail es-es Borrar mensajes seleccionados +deleted felamimail es-es Borrado +deleted folder successfully! felamimail es-es Carpeta borrada correctamente +deleting messages felamimail es-es borrando mensajes +disable felamimail es-es Deshabilitar +discard felamimail es-es descargar +discard message felamimail es-es descartar mensaje +display message in new window felamimail es-es Mostrar el mensaje en una ventana nueva +display messages in multiple windows felamimail es-es mostrar los mensajes en múltiples ventanas +display of html emails felamimail es-es Mostrar los mensajes HTML +display only when no plain text is available felamimail es-es Mostrar sólo cuando no hay texto simple disponible +display preferences felamimail es-es Preferencias de visualización +displaying html messages is disabled felamimail es-es Mostrar los mensajes en HTML está desactivado +do it! felamimail es-es ¡Hacerlo! +do not use sent felamimail es-es No usar Enviados +do not use trash felamimail es-es No usar Papelera +do not validate certificate felamimail es-es No validar el certificado +do you really want to delete the '%1' folder? felamimail es-es ¿Realmente quiere borrar la carpeta '%1'? +do you really want to delete the selected accountsettings and the assosiated identity. felamimail es-es ¿Realmente desea borrar las configuraciones de cuenta seleccionadas y la identidad asociada? +do you really want to delete the selected signatures? felamimail es-es ¿Realmente desea borrar las firmas seleccionadas? +do you really want to move the selected messages to folder: felamimail es-es ¿Realmente desea mover los mensajes seleccionados a la carpeta: +do you want to be asked for confirmation before moving selected messages to another folder? felamimail es-es ¿Desea que se le pida confirmación antes de mover los mensajes seleccionados a otra carpeta? +do you want to prevent the editing/setup for forwarding of mails via settings (, even if sieve is enabled)? felamimail es-es ¿Desea prevenir la edición o configuración de los correos mediante las preferencias (incluso si SIEVE está activado)? +do you want to prevent the editing/setup of filter rules (, even if sieve is enabled)? felamimail es-es ¿Desea prevenir la edición o configuración de las reglas de filtrado (incluso si SIEVE está activado)? +do you want to prevent the editing/setup of notification by mail to other emailadresses if emails arrive (, even if sieve is enabled)? felamimail es-es ¿Desea prevenir la edición o configuración de la notificación a otras direcciones si llegan correos (incluso si SIEVE está activado)? +do you want to prevent the editing/setup of the absent/vacation notice (, even if sieve is enabled)? felamimail es-es ¿Desea prevenir la edición o configuración de la notificación de ausencia o vacaciones (incluso si SIEVE está activado)? +do you want to prevent the managing of folders (creation, accessrights and subscribtion)? felamimail es-es ¿Desea prevenir la gestión de carpetas (creación, derechos de acceso Y suscripción)? +does not contain felamimail es-es No contiene +does not exist on imap server. felamimail es-es No existe en el servidor IMAP +does not match felamimail es-es No coincide con +does not match regexp felamimail es-es No coincide con la expresión +don't use draft folder felamimail es-es No usar la carpeta borradores +don't use sent felamimail es-es No usar Enviados +don't use template folder felamimail es-es No usar la carpeta de plantillas +don't use trash felamimail es-es No usar Papelera +dont strip any tags felamimail es-es no separar ninguna etiqueta +down felamimail es-es abajo +download felamimail es-es descargar +download this as a file felamimail es-es Descargar esto como un fichero +draft folder felamimail es-es Carpeta borradores +drafts felamimail es-es Borradores +e-mail felamimail es-es Correo electrónico +e-mail address felamimail es-es Dirección de correo electrónico +e-mail folders felamimail es-es Carpetas de correo electrónico +edit email forwarding address felamimail es-es editar la dirección de reenvío del correo +edit filter felamimail es-es Editar filtro +edit rule felamimail es-es Añadir regla +edit selected felamimail es-es Editar selección +edit vacation settings felamimail es-es editar configuración de vacaciones +editor type felamimail es-es Tipo de editor +email address felamimail es-es Dirección de correo electrónico +email forwarding address felamimail es-es dirección de reenvío del correo +email notification update failed felamimail es-es falló la actualización de la notificación de correo electrónico +email signature felamimail es-es Firma de correo +emailaddress felamimail es-es dirección de correo electrónico +empty trash felamimail es-es Vaciar papelera +enable felamimail es-es Habilitar +encrypted connection felamimail es-es conexión cifrada +enter your default mail domain ( from: user@domain ) admin es-es Introduzca su dominio de correo predeterminado (From: usuario@dominio) +enter your imap mail server hostname or ip address admin es-es Introduzca el nombre del servidor de correo IMAP o la dirección IP +enter your sieve server hostname or ip address admin es-es Introduzca el nombre del servidor SIEVE o la dirección IP +enter your sieve server port admin es-es Introduzca el puerto del servidor SIEVE +enter your smtp server hostname or ip address admin es-es ntroduzca el nombre del servidor SMTP o la dirección IP +enter your smtp server port admin es-es Introduzca el el puerto del servidor SMTP +entry saved felamimail es-es Se ha guardado la entrada +error felamimail es-es ERROR +error connecting to imap serv felamimail es-es Error al conectar al servidor IMAP +error connecting to imap server. %s : %s. felamimail es-es Error al conectar con el servidor IMAP: %s: %s +error connecting to imap server: [%s] %s. felamimail es-es Error al conectar con el servidor IMAP: [%s] %s +error opening felamimail es-es Error al abrir +error saving %1! felamimail es-es ¡Error al guardar %1! +error: felamimail es-es Error: +error: could not save message as draft felamimail es-es Error: no se pudo salvar el mensaje como borrador +error: message could not be displayed. felamimail es-es ERROR: No se pudo mostrar el mensaje +every felamimail es-es cada +every %1 days felamimail es-es cada %1 días +expunge felamimail es-es Suprimir +extended felamimail es-es extendida +felamimail common es-es FelaMiMail +file into felamimail es-es Información del fichero +filemanager felamimail es-es Administrador de ficheros +files felamimail es-es Ficheros +filter active felamimail es-es Filtro activo +filter name felamimail es-es Nombre del filtro +filter rules common es-es reglas de filtrado +first name felamimail es-es Nombre de pila +flagged felamimail es-es marcado +flags felamimail es-es Marcas +folder felamimail es-es carpeta +folder acl felamimail es-es ACL de la carpeta +folder name felamimail es-es Nombre de la carpeta +folder path felamimail es-es Ruta de la carpeta +folder preferences felamimail es-es Preferencias de la carpeta +folder settings felamimail es-es Opciones de la carpeta +folder status felamimail es-es Estado de la carpeta +folderlist felamimail es-es Lista de carpetas +foldername felamimail es-es Nombre de carpeta +folders felamimail es-es Carpetas +folders created successfully! felamimail es-es Las carpetas se han creado correctamente +follow felamimail es-es seguir +for mail to be send - not functional yet felamimail es-es Para el correo pendiente de enviar - todavía no funciona +for received mail felamimail es-es Para el correo recibido +forward felamimail es-es Reenviar +forward as attachment felamimail es-es reenviar como adjunto +forward inline felamimail es-es reenviar como incorporado +forward messages to felamimail es-es Reenviar mensajes a +forward to felamimail es-es reenviar a +forward to address felamimail es-es reenviar a la dirección +forwarding felamimail es-es Reenviando +found felamimail es-es Encontrado +fri felamimail es-es Vie +from felamimail es-es De +from(a->z) felamimail es-es De (A-> Z) +from(z->a) felamimail es-es De (Z-> A) +full name felamimail es-es Nombre completo +greater than felamimail es-es mayor que +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail es-es Eche un vistazo a www.felamimail.org para saber más acerca de Squirrelmail.
    +header lines felamimail es-es Líneas de encabezado +hide header felamimail es-es Ocultar cabecera +hostname / address felamimail es-es servidor / dirección +how to forward messages felamimail es-es cómo reenviar mensajes +html felamimail es-es HTML +icons and text felamimail es-es Iconos y texto +icons only felamimail es-es Sólo iconos +identifying name felamimail es-es Nombre identificativo +identity felamimail es-es identidad +if felamimail es-es SI +if from contains felamimail es-es si el remitente contiene +if mail header felamimail es-es si el encabezado +if message size felamimail es-es si el tamaño del mensaje +if shown, which folders should appear on main screen felamimail es-es Si se muestra, qué carpetas deben aparecer en la pantalla principal +if subject contains felamimail es-es si el asunto contiene +if to contains felamimail es-es si el destinatario contiene +if using ssl or tls, you must have the php openssl extension loaded. felamimail es-es Si se usa SSL o TLS, debe tener la extensión openssl de PHP cargada. +illegal folder name. please select a different name. felamimail es-es Nombre de carpeta ilegal. Por favor, seleccione un nombre distinto +imap felamimail es-es IMAP +imap server felamimail es-es Servidor IMAP +imap server address felamimail es-es Dirección del servidor IMAP +imap server closed the connection. felamimail es-es El servidor IMAP cerró la conexión. +imap server closed the connection. server responded: %s felamimail es-es El servidor IMAP cerró la conexión. El servidor respondió: %s +imap server password felamimail es-es contraseña del servidor IMAP +imap server type felamimail es-es Tipo de servidor IMAP +imap server username felamimail es-es usuario del servidor IMAP +imaps authentication felamimail es-es Identificación IMAPS +imaps encryption only felamimail es-es Cifrado IMAPS solamente +import felamimail es-es importar +import mail felamimail es-es Importar correo +in felamimail es-es en +inbox felamimail es-es Bandeja de entrada +incoming mail server(imap) felamimail es-es servidor de correo entrante (IMAP) +index order felamimail es-es Orden del índice +info felamimail es-es Información +invalid user name or password felamimail es-es El usuario o la contraseña no son válidos +javascript felamimail es-es JavaScript +jumping to end felamimail es-es saltando al final +jumping to start felamimail es-es saltando al principio +junk felamimail es-es Basura +keep a copy of the message in your inbox felamimail es-es guardar una copia del mensaje en la bandeja de entrada +keep local copy of email felamimail es-es guardar copia local del correo +kilobytes felamimail es-es kilobytes +language felamimail es-es Idioma +last name felamimail es-es Apellidos +left felamimail es-es Izquierda +less felamimail es-es menos +less than felamimail es-es menor que +light gray felamimail es-es Gris claro +list all felamimail es-es Listar todo +loading felamimail es-es cargando +location of buttons when composing felamimail es-es Ubicación de los botones al redactar +mail server login type admin es-es Tipo de sesión del servidor de correo +mail settings felamimail es-es Configuración del correo +mainmessage felamimail es-es mensaje principal +manage email accounts and identities common es-es Administrar cuentas de correo e identidades +manage emailaccounts common es-es Administrar cuentas de correo +manage emailfilter / vacation preferences es-es Administrar filtros de correo / Vacaciones +manage folders common es-es Administrar carpetas +manage sieve common es-es Administrar scripts Sieve +manage signatures felamimail es-es Administrar firmas +mark as deleted felamimail es-es Marcar como borrado +mark messages as felamimail es-es Marcar mensajes seleccionados como +mark selected as flagged felamimail es-es Marcar la selección como para descargar +mark selected as read felamimail es-es Marcar la selección como leído +mark selected as unflagged felamimail es-es Marcar la selección como para no descargar +mark selected as unread felamimail es-es Marcar la selección como no leído +match felamimail es-es Coincidencia +matches felamimail es-es coincide +matches regexp felamimail es-es coincide con la expresión +max uploadsize felamimail es-es tamaño máximo de subida +message highlighting felamimail es-es Resaltado del mensaje +message list felamimail es-es Lista de mensajes +messages felamimail es-es mensajes +mon felamimail es-es Lun +move felamimail es-es mover +move folder felamimail es-es mover carpeta +move messages felamimail es-es mover mensajes +move selected to felamimail es-es mover los seleccionados a +move to trash felamimail es-es Mover a la papelera +moving messages to felamimail es-es mover mensajes a +name felamimail es-es Nombre +never display html emails felamimail es-es Nunca mostar los correos en HTML +new common es-es Nuevo +new filter felamimail es-es Nuevo filtro +next felamimail es-es Siguiente +next message felamimail es-es Mensaje siguiente +no active imap server found!! felamimail es-es ¡No se encontró ningún servidor IMAP activo! +no address to/cc/bcc supplied, and no folder to save message to provided. felamimail es-es No se ha suministrado dirección para el campo A/CC/CCO, ni carpeta donde guardar el mensaje. +no encryption felamimail es-es Sin cifrar +no filter felamimail es-es Sin filtro +no folders felamimail es-es no hay carpetas +no folders found felamimail es-es No se encontraron carpetas +no folders were found to subscribe to! felamimail es-es No se encontraron carpetas a las que suscribirse +no folders were found to unsubscribe from! felamimail es-es No se encontraron carpetas de las que desuscribirse +no highlighting is defined felamimail es-es No se definió un resaltado +no imap server host configured!! felamimail es-es ¡No se ha configurado un servidor IMAP! +no message returned. felamimail es-es No se devolvió ningún mensaje. +no messages found... felamimail es-es no se encontraron mensajes... +no messages selected, or lost selection. changing to folder felamimail es-es No hay mensajes seleccionados, o se ha perdido la selección. Cambiando a la carpeta +no messages were selected. felamimail es-es No se seleccionaron mensajes +no plain text part found felamimail es-es No se encontró ninguna parte con texto sencillo +no previous message felamimail es-es No hay mensaje anterior +no recipient address given! felamimail es-es ¡No se han indicado destinatarios! +no signature felamimail es-es sin firma +no stationery felamimail es-es sin material preimpreso +no subject given! felamimail es-es ¡No se ha indicado un asunto! +no supported imap authentication method could be found. felamimail es-es No se pudo encontrar ningún método de identificación IMAP +no valid emailprofile selected!! felamimail es-es No se ha seleccionado un perfil de correo válido +none felamimail es-es ninguno +none, create all felamimail es-es ninguno, crear todo +not allowed felamimail es-es no permitido +notify when new mails arrive on these folders felamimail es-es notificar cuando lleguen mensajes nuevos a estas carpetas +on felamimail es-es en +on behalf of felamimail es-es en nombre de +one address is not valid felamimail es-es Una dirección no es válida +only inbox felamimail es-es Sólo la Bandeja de entrada +only one window felamimail es-es sólo una ventana +only unseen felamimail es-es Sólo los no vistos +open all felamimail es-es abrir todas +options felamimail es-es Opciones +or felamimail es-es o +or configure an valid imap server connection using the manage accounts/identities preference in the sidebox menu. felamimail es-es o configurar una conexión a un servidor IMAP válido usando la preferencia de Gestionar cuentas/identidades en el menú lateral. +organisation felamimail es-es Organización +organization felamimail es-es Organización +organization name admin es-es Nombre de la organización +original message felamimail es-es mensaje original +outgoing mail server(smtp) felamimail es-es servidor de correo de salida (SMTP) +participants felamimail es-es Participantes +personal information felamimail es-es Información personal +please select a address felamimail es-es Por favor, seleccione una dirección +please select the number of days to wait between responses felamimail es-es Por favor, seleccione el número de días a esperar entre las respuestas +please supply the message to send with auto-responses felamimail es-es Por favor, indique el mensaje a enviar para respuestas automáticas +port felamimail es-es puerto +posting felamimail es-es enviar +previous felamimail es-es Anterior +previous message felamimail es-es Mensaje anterior +print it felamimail es-es Imprimirlo +print this page felamimail es-es Imprimir esta página +printview felamimail es-es vista de impresión +quicksearch felamimail es-es Búsqueda rápida +read felamimail es-es leídos +reading felamimail es-es leyendo +receive notification felamimail es-es Recibir notificación +recent felamimail es-es reciente(s) +refresh time in minutes felamimail es-es Tiempo de refresco en minutos +reject with felamimail es-es rechazar con +remove felamimail es-es eliminar +remove immediately felamimail es-es Eliminar inmediatamente +rename felamimail es-es Renombrar +rename a folder felamimail es-es Renombrar una carpeta +rename folder felamimail es-es Renombrar carpeta +renamed successfully! felamimail es-es Renombrado correctamente +replied felamimail es-es respondido +reply felamimail es-es Responder +reply all felamimail es-es Responder a todos +reply to felamimail es-es Responder A +replyto felamimail es-es Responder A +respond felamimail es-es Responder +respond to mail sent to felamimail es-es Responder al correo enviado a +return felamimail es-es Volver +return to options page felamimail es-es Volver a la página de opciones +right felamimail es-es Derecha +row order style felamimail es-es estilo de ordenar filas +rule felamimail es-es Regla +sat felamimail es-es Sab +save felamimail es-es Guardar +save all felamimail es-es Guardar todo +save as draft felamimail es-es guardar como borrador +save as infolog felamimail es-es guardar como registro de notas y tareas +save changes felamimail es-es guardar cambios +save message to disk felamimail es-es Guardar mensaje en el disco +script name felamimail es-es nombre del script +script status felamimail es-es estado del script +search felamimail es-es Buscar +search for felamimail es-es Buscar +select felamimail es-es Seleccionar +select all felamimail es-es Seleccionar todo +select emailprofile felamimail es-es Seleccionar perfil de correo +select folder felamimail es-es seleccionar carpeta +select your mail server type admin es-es Seleccionar el tipo de servidor de correo +send felamimail es-es Enviar +send a reject message felamimail es-es enviar un mensaje de rechazo +sent felamimail es-es Enviados +sent folder felamimail es-es Carpeta de enviados +server supports mailfilter(sieve) felamimail es-es El servidor soporta filtro de correo (sieve) +set as default felamimail es-es Establecer como predeterminado +show header felamimail es-es mostrar cabecera +show new messages on main screen felamimail es-es Mostrar mensajes nuevos en la pantalla principal +sieve script name felamimail es-es nombre del script sieve +sieve settings admin es-es Configuración de Sieve +signatur felamimail es-es Firma +signature felamimail es-es Firma +simply click the target-folder felamimail es-es Simplemente pulse en la carpeta destino +size felamimail es-es Tamaño +size of editor window felamimail es-es Tamaño de la ventana del editor +size(...->0) felamimail es-es Tamaño (...->0) +size(0->...) felamimail es-es Tamaño (0->...) +skipping forward felamimail es-es saltando el siguiente +skipping previous felamimail es-es saltando el anterior +small view felamimail es-es Vista reducida +smtp settings admin es-es Opciones SMTP +start new messages with mime type plain/text or html? felamimail es-es ¿Comenzar nuevos mensajes con el tipo MIME plain/text o html? +stationery felamimail es-es material preimpreso +subject felamimail es-es Asunto +subject(a->z) felamimail es-es Asunto (A->Z) +subject(z->a) felamimail es-es Asunto (Z->A) +submit felamimail es-es Enviar +subscribe felamimail es-es Suscribirse +subscribed felamimail es-es Suscrito +subscribed successfully! felamimail es-es Suscripción correcta +sun felamimail es-es Dom +system signature felamimail es-es firma del sistema +table of contents felamimail es-es Tabla de contenidos +template folder felamimail es-es Carpeta de plantillas +templates felamimail es-es Plantillas +text only felamimail es-es Sólo texto +text/plain felamimail es-es text/plain +the connection to the imap server failed!! felamimail es-es ¡Ha fallado la conexión con el servidor IMAP! +the imap server does not appear to support the authentication method selected. please contact your system administrator. felamimail es-es El servidor IMAP no parece que soporte el método de identificación seleccionado. Por favor, póngase en contacto con su administrador del sistema. +the message sender has requested a response to indicate that you have read this message. would you like to send a receipt? felamimail es-es El remitente del mensaje ha solicitado una respuesta para indicar que usted ha leído este mensaje. ¿Desea enviar una confirmación? +the mimeparser can not parse this message. felamimail es-es El intérprete mime no puede interpretar este mensaje +then felamimail es-es ENTONCES +there is no imap server configured. felamimail es-es No se ha configurado un servidor IMAP. +this folder is empty felamimail es-es ESTA CARPETA ESTA VACIA +this php has no imap support compiled in!! felamimail es-es ¡Esta instalación de PHP no tiene soporte IMAP! +thu felamimail es-es Jue +to felamimail es-es Para +to mail sent to felamimail es-es al correo enviado a +to use a tls connection, you must be running a version of php 5.1.0 or higher. felamimail es-es Para usar una conexión TLS, debe estar ejecutando una versión de PHP 5.1.0 o superior. +translation preferences felamimail es-es Preferencias de la traducción +translation server felamimail es-es Servidor de traducciones +trash felamimail es-es Papelera +trash fold felamimail es-es Carpeta Papelera +trash folder felamimail es-es Carpeta Papelera +tue felamimail es-es Mar +type felamimail es-es tipo +unexpected response from server to authenticate command. felamimail es-es Respuesta inesperada del servidor al comando AUTHENTICATE. +unexpected response from server to digest-md5 response. felamimail es-es Respuesta inesperada del servidor a la respuesta Digest-MD5. +unexpected response from server to login command. felamimail es-es Respuesta inesperada del servidor al comando LOGIN. +unflagged felamimail es-es Sin marcar +unknown err felamimail es-es Error desconocido +unknown error felamimail es-es Error desconocido +unknown imap response from the server. server responded: %s felamimail es-es Respuesta IMAP desconocida del servidor. El servidor respondió: %s +unknown sender felamimail es-es Remitente desconocido +unknown user or password incorrect. felamimail es-es Usuario desconocido o contraseña incorrecta +unread common es-es No leído +unseen felamimail es-es No vistos +unselect all felamimail es-es Deseleccionar todo +unsubscribe felamimail es-es Desuscribir +unsubscribed felamimail es-es No suscrito +unsubscribed successfully! felamimail es-es Desuscripción correcta +up felamimail es-es arriba +updating message status felamimail es-es actualizando estado del mensaje +updating view felamimail es-es Actualizando la vista +use emailadmin to create profiles felamimail es-es use EmailAdmin para crear perfiles +use a signature felamimail es-es Usar una firma +use a signature? felamimail es-es ¿Usar una firma? +use addresses felamimail es-es Usar direcciones +use custom identities felamimail es-es usar identidades personalizadas +use custom settings felamimail es-es Usar opciones personalizadas +use regular expressions felamimail es-es usar expresiones regulares +use smtp auth admin es-es Usar identificación SMTP +users can define their own emailaccounts admin es-es Los usuarios pueden definir sus propias cuentas de correo +vacation notice common es-es aviso de vacaciones +vacation notice is active felamimail es-es El aviso de vacaciones está activo +vacation start-date must be before the end-date! felamimail es-es ¡La fecha de inicio de las vacaciones debe ser ANTES de la fecha de fin! +validate certificate felamimail es-es validar certificado +view full header felamimail es-es Ver la cabecera completa +view header lines felamimail es-es Ver líneas del encabezado +view message felamimail es-es Ver mensaje +viewing full header felamimail es-es Viendo la cabecera completa +viewing message felamimail es-es Viendo mensaje +viewing messages felamimail es-es Viendo mensajes +wed felamimail es-es Mié +when deleting messages felamimail es-es Al borrar mensajes +which folders (additional to the sent folder) should be displayed using the sent folder view schema felamimail es-es qué carpetas (además de la de Enviados) debe mostrarse usando el equema de la vista de Enviados +which folders - in general - should not be automatically created, if not existing felamimail es-es qué carpetas, en general, NO deben crearse automáticamente si no existen +with message felamimail es-es con mensaje +with message "%1" felamimail es-es con mensaje "%1" +wrap incoming text at felamimail es-es Ajustar el texto entrante a +writing felamimail es-es escribiendo +wrote felamimail es-es escribió +you can use %1 for the above start-date and %2 for the end-date. felamimail es-es Puede usar %1 para la fecha de inicio de arriba y %2 para la fecha de fin. +you have received a new message on the felamimail es-es Ha recibido un mensaje nuevo en la +your message to %1 was displayed. felamimail es-es Su mensaje para %1 ha sido mostrado diff --git a/felamimail/lang/egw_et.lang b/felamimail/lang/egw_et.lang new file mode 100755 index 0000000000..e72c9f965a --- /dev/null +++ b/felamimail/lang/egw_et.lang @@ -0,0 +1,187 @@ +(unknown sender) felamimail et (tundmatu saatja) +activate felamimail et Aktiveeri +activate script felamimail et Aktiveeri skript +add address felamimail et Lisa aadress +add script felamimail et Lisa skript +all address books felamimail et Kõik Aadressi raamatud +all folders felamimail et Kõik Kaustad +all of felamimail et kõik välja +always show html emails felamimail et Alati näita HTML emaile +and felamimail et ja +any status felamimail et kõik staatused +back to folder felamimail et Tagasi kausta +bad login name or password. felamimail et Vale kasutajanimi või parool +change folder felamimail et Muuda kausta +close all felamimail et sule kõik +close this page felamimail et sulge see leht +close window felamimail et Sulge aken +color felamimail et Värv +configuration felamimail et Konfiguratsioon +contains felamimail et sisaldab +date(newest first) felamimail et Kuupäev (uuemad enne) +date(oldest first) felamimail et Kuupäev (vanemad enne) +default felamimail et vaikimisi +default sorting order felamimail et Vaikimisi sorteerimise järjekord +delete all felamimail et kustuta kõik +delete folder felamimail et Kustuta kaust +delete script felamimail et kustuta skript +delete selected felamimail et Kustuta valitud +delete selected messages felamimail et kustuta valitud teated +deleted felamimail et kustutatud +deleted folder successfully! felamimail et Kaust kustutatud täielikult! +deleting messages felamimail et kustutan kirjad +disable felamimail et Keela +discard felamimail et unusta +discard message felamimail et unusta kirjad +display message in new window felamimail et Näita kirju uues aknas +display messages in multiple windows felamimail et Näita kirju mitmes aknas +display of html emails felamimail et Näita HTML emaile +display only when no plain text is available felamimail et Näita ainult kui plain tekst pole saadaval +display preferences felamimail et Näita Eelistusi +displaying html messages is disabled felamimail et html kirjade näitamine on välja lülitatud +do it! felamimail et tee seda! +do not use sent felamimail et Ära kasuta Sent +do not use trash felamimail et Ära kasuta Trash +do not validate certificate felamimail et ära valideeri sertifikaati +do you really want to delete the '%1' folder? felamimail et Tahad tõesti kustutada '%1' kaust? +do you really want to delete the selected signatures? felamimail et Tahad tõesti kustutada valitud signatuurid? +does not contain felamimail et ei sisalda +don't use sent felamimail et Ära kasuta Sent +don't use trash felamimail et Ära kasuta Trash +down felamimail et alla +download felamimail et lae alla +download this as a file felamimail et Lae see alla kui fail +e-mail felamimail et E-Mail +e-mail address felamimail et E-Mail aadress +e-mail folders felamimail et E-Mail Kaustad +edit email forwarding address felamimail et edit emaili edasisaatmise aadressi +edit filter felamimail et Muuda filtrit +edit selected felamimail et Muuda valitut +email address felamimail et E-Mail Aadress +email forwarding address felamimail et email edasisaatmise aadress +empty trash felamimail et tühjenda prügi +enable felamimail et luba +encrypted connection felamimail et krüpteeritud ühendus +error felamimail et VIGA +error opening felamimail et Viga avamisel +every felamimail et iga +extended felamimail et laiendatud +file into felamimail et faili info +files felamimail et failid +filter active felamimail et filter aktiivne +filter name felamimail et Filtri nimi +first name felamimail et Eesnimi +flags felamimail et Lipud +folder name felamimail et Kausta nimi +folder path felamimail et Kausta Teekond +folder preferences felamimail et Kausta Eelistused +folder settings felamimail et Kausta setingud +folder status felamimail et Kausta staatus +folderlist felamimail et Kausta nimekiri +foldername felamimail et Kausta nimi +folders felamimail et Kaustad +folders created successfully! felamimail et Kaustad tehtud täielikult! +forward felamimail et Edasi +fri felamimail et Re +full name felamimail et Täis nimi +icons only felamimail et Ikoonid ainult +if felamimail et KUI +illegal folder name. please select a different name. felamimail et Lubamatu kaustanimi. Palun vali uus. +imap felamimail et IMAP +imap server felamimail et IMAP Server +imap server address felamimail et IMAP Serveri Aadress +imap server closed the connection. felamimail et IMAP server sulges ühenduse. +imap server closed the connection. server responded: %s felamimail et IMAP Server sulges ühenduse. Server Vastas: %s +imap server password felamimail et imap serveri parool +imap server type felamimail et IMAP Serveri tüüp +imap server username felamimail et imap serveri kasutajanimi +imaps authentication felamimail et IMAPS Audentimine +imaps encryption only felamimail et IMAPS Krüpteering ainult +in felamimail et sisse +incoming mail server(imap) felamimail et Sissetuleva meili server(IMAP) +invalid user name or password felamimail et vale kasutaja või parool +language felamimail et Keel +last name felamimail et perekonnanimi +left felamimail et Vasak +less felamimail et vähem +less than felamimail et vähem kui +mail server login type admin et Mail serveri logimise tüüp +mail settings felamimail et Mail setingud +manage emailaccounts preferences et Manageeri Emailkontosid +manage folders common et Manageeri Kaustu +manage signatures felamimail et Manageeri Signatuure +mark as deleted felamimail et Märgi kui kustutatud +mark messages as felamimail et Märgi valitud kirjad kui +mark selected as flagged felamimail et Märgi valitud kui flagged +mark selected as read felamimail et Märgi valitud kui loetud +mark selected as unflagged felamimail et Märgi valitud kui unflagged +mark selected as unread felamimail et Märgi valitud kui lugematta +messages felamimail et kirjad +mon felamimail et Esm +move felamimail et liiguta +move messages felamimail et liiguta kirjad +move to trash felamimail et Liiguta trash-i +name felamimail et Nimi +never display html emails felamimail et Ära näita kunagi HTML emaile +new common et Uus +new filter felamimail et Uus filter +next felamimail et Järgmine +next message felamimail et järgmine kiri +no active imap server found!! felamimail et Aktiivset IMAP serverit ei leitud !! +no folders found felamimail et Kaustu ei leitud +no signature felamimail et pole signatuuri +only inbox felamimail et Ainult INBOX +only one window felamimail et ainult üks aken +only unseen felamimail et Ainult nägematta +open all felamimail et ava kõik +or felamimail et või +organisation felamimail et organisatsioon +personal information felamimail et Personaalne informatsioon +please select a address felamimail et Palun vali aadress +port felamimail et port +posting felamimail et postitan +previous felamimail et Eelmine +previous message felamimail et eelmine teade +print it felamimail et prindi see +print this page felamimail et prindi see leht +quicksearch felamimail et Kiirotsing +read felamimail et loetud +reading felamimail et loen +recent felamimail et hiljutised +refresh time in minutes felamimail et Värkendamise aeg minutites +remove felamimail et eemalda +remove immediately felamimail et Eemalda koheselt! +rename felamimail et Nimeta ümber +replied felamimail et vastatud +reply felamimail et Vasta +save felamimail et Salvesta +save changes felamimail et Salvesta muudatused +script name felamimail et skripti nimi +script status felamimail et scripti staatus +search felamimail et Otsi +select felamimail et Vali +select all felamimail et Vali Kõik +select emailprofile felamimail et Vali Email Profiil +select folder felamimail et vali kaust +select your mail server type admin et Vali mailiserveri tüüp +send felamimail et Saada +size(...->0) felamimail et Suurus (...->0) +size(0->...) felamimail et Suurus (0->...) +text only felamimail et Tekst ainult +the connection to the imap server failed!! felamimail et Ühendus IMAP Serveriga ebaõnnestus!! +this folder is empty felamimail et SEE KAUST ON TÜHI +trash folder felamimail et Trash Kaust +unknown error felamimail et Tundmatu vida +unknown sender felamimail et Tundmatu saatja +unknown user or password incorrect. felamimail et Tundmatu kasutaja või vale parool. +unread common et lugematta +unseen felamimail et Nägematta +up felamimail et üles +updating view felamimail et uuendan vaadet +use a signature felamimail et Kasuta signatuuri +use a signature? felamimail et Kasuta signatuuri ? +use addresses felamimail et Kasuta Aadresse +view message felamimail et Vaata teadet +viewing message felamimail et Näitan kirja +viewing messages felamimail et Näitan kirju +writing felamimail et Kirjutan diff --git a/felamimail/lang/egw_eu.lang b/felamimail/lang/egw_eu.lang new file mode 100644 index 0000000000..2b01826011 --- /dev/null +++ b/felamimail/lang/egw_eu.lang @@ -0,0 +1,352 @@ +(no subject) felamimail eu (gai gabe) +(only cc/bcc) felamimail eu (bakarrik kopia/kopia izkutua) +(unknown sender) felamimail eu (bidaltzaile ezezaguna) +activate felamimail eu Aktibatu +activate script felamimail eu Script-a aktibatu +add acl felamimail eu acl gehitu +add address felamimail eu Helbidea gehitu +add rule felamimail eu Erregela gehitu +add script felamimail eu Script bat gehitu +add to %1 felamimail eu gehitu %1 -i +add to address book felamimail eu Gehitu kontaktu agendara +add to addressbook felamimail eu gehitu kontaktu agendara +adding file to message. please wait! felamimail eu Fitxategia mezura atxikitzen ari da. Itxaron mesedez! +additional info felamimail eu Informazio gehiago +address book felamimail eu Kontaktu agenda +address book search felamimail eu Bilatu kontaktu agedan +after message body felamimail eu Mezuaren gorputzaren ondoren +all address books felamimail eu Kontaktu agenda guztiak +all folders felamimail eu Karpeta guztiak +all of felamimail eu guztiak +allways a new window felamimail eu beti leiho berri bat +always show html emails felamimail eu Betik erakutsi HTML formatuan emailak +and felamimail eu eta +any of felamimail eu batekin +anyone felamimail eu Edozein +as a subfolder of felamimail eu Barne karpeta gisa +attachments felamimail eu Atxikiak +authentication required felamimail eu Autentifikazioa behar da +auto refresh folder list felamimail eu Berritu karpeta lista +back to folder felamimail eu Itzuli karpetara +bad login name or password. felamimail eu Izen edo pasahitz okerra +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail eu ezarritako kriterioen arabera erakutzia. Mezuak kolore ezberdinak izan ditzake. Hau mezua nondik datorren garbiago ikusteko erabiltzen da, bereziki email listetarako. +bcc felamimail eu Kopia izkutua +before headers felamimail eu Goiburuen aurretik +between headers and message body felamimail eu Mezuaren buru eta gorputzaren artean +body part felamimail eu emailaren gorputza +can't connect to inbox!! felamimail eu Ezin Sarrera karpetara konektatu!! +cc felamimail eu Kopia +change folder felamimail eu Karpeta aldatu +checkbox felamimail eu Kontrol-laukia +click here to log back in. felamimail eu Klikatu hemen berriz sartzeko +click here to return to %1 felamimail eu Klikatu hemen %1 -era bueltatzeko +close all felamimail eu Guztia itxi +close this page felamimail eu Orri hau itxi +close window felamimail eu Leihoa itxi +color felamimail eu Kolorea +compose felamimail eu Idatzi +compress folder felamimail eu Karpeta konprimatu +condition felamimail eu baldintza +configuration felamimail eu Konfigurazioa +contains felamimail eu dauka +create felamimail eu Sortu +create folder felamimail eu Karpeta sortu +create sent felamimail eu Bidalitakoen karpeta sortu +create subfolder felamimail eu Barne karpeta sortu +create trash felamimail eu Zakar karpeta sortu +created folder successfully! felamimail eu Karpeta arrakastaz sortua +dark blue felamimail eu Urdin iluna +dark cyan felamimail eu Cyan iluna +dark gray felamimail eu Gris iluna +dark green felamimail eu Berde iluna +dark magenta felamimail eu Magenda iluna +dark yellow felamimail eu Ori iluna +date(newest first) felamimail eu Data (berriak lehenik) +date(oldest first) felamimail eu Data (Zaharrak lehenik) +days felamimail eu egunak +deactivate script felamimail eu Script-a ezgaitu +default sorting order felamimail eu sailkapen lehenetsia +delete all felamimail eu Dena ezabatu +delete folder felamimail eu Karpeta ezabatu +delete script felamimail eu ezabatu script-a +delete selected felamimail eu Ezabatu hautaturikoa +delete selected messages felamimail eu Ezabatu hautaturiko mezuak +deleted felamimail eu Ezabatua +deleted folder successfully! felamimail eu Karpeta arrakastaz ezabatua +deleting messages felamimail eu Mezuak ezabatzen +disable felamimail eu Ezgaitu +discard felamimail eu baztertu +discard message felamimail eu mezua baztertu +display message in new window felamimail eu mezua lehio berri batean erakutzi +display of html emails felamimail eu HTML emailak erakutzi +display only when no plain text is available felamimail eu Erakutsi soilik testu sinpleko bertsiorik ez denean +display preferences felamimail eu Erakutsi lehentasunak +do it! felamimail eu Egin! +do not use sent felamimail eu Ez erabili Bidalitakoak karpeta +do not use trash felamimail eu Ez erabili Zakarra karpeta +do you really want to delete the '%1' folder? felamimail eu Ziur zaude '%1' karpeta ezabatu nahi duzula? +does not contain felamimail eu ez da agertzen +does not match felamimail eu ez du parekatzen +does not match regexp felamimail eu ez du parekatzen regexp +don't use sent felamimail eu Ez erabili Bidalitakoak karpeta +don't use trash felamimail eu Ez erabili Zakarra karpeta +down felamimail eu behea +download felamimail eu deskargatu +download this as a file felamimail eu artxibo gisa deskargatu +e-mail felamimail eu E-Posta elektronikoa +e-mail address felamimail eu E-Posta helbidea +e-mail folders felamimail eu E-Posta karpetak +edit filter felamimail eu Iragazkia aldatu +edit rule felamimail eu erregela aldatu +edit selected felamimail eu hautatua aldatu +edit vacation settings felamimail eu oporrent lehentasunak aldatu +email address felamimail eu E-Posta helbidea +email signature felamimail eu E-Posta sinadura +emailaddress felamimail eu helbide elektronikoa +empty trash felamimail eu Zakarra hutsik +enable felamimail eu indarrean jarri +encrypted connection felamimail eu konexioa enkriptatua +enter your default mail domain ( from: user@domain ) admin eu Sartu zure oinarrizko posta domeinua (From: erabiltzailea@domeinua) +enter your imap mail server hostname or ip address admin eu Sartu zure IMAP posta zerbitzariaren ostalari-izena (hostname) edo IP helbidea +enter your sieve server hostname or ip address admin eu Sartu zure SIEVE zerbitzariaren ostalari-izena (hostname) edo IP helbidea +enter your sieve server port admin eu Sartu zure SIEVE zerbitzariaren portu-zenbakia +enter your smtp server hostname or ip address admin eu Sartu zure SMTP zerbitzariaren ostalari-izena (hostname) edo IP helbidea +enter your smtp server port admin eu Sartu zure SMTP zerbitzariaren portu-zenbakia +error felamimail eu ERROREA +error connecting to imap serv felamimail eu IMAP zerbitzariarekin konektatzerakoan errorea +error opening felamimail eu Errorea irekitzean +every felamimail eu guztiak +every %1 days felamimail eu guztiak %1 egunetan +expunge felamimail eu Deuseztu +extended felamimail eu hedatua +felamimail common eu Posta +file into felamimail eu Filtroa +files felamimail eu artxiboak +filter active felamimail eu Filtro aktiboa +filter name felamimail eu Filtroaren izena +filter rules felamimail eu Filtratzeko erregelak +first name felamimail eu Lehen izena +flagged felamimail eu Bandera du +flags felamimail eu Banderak +folder acl felamimail eu Karpetaren ACL-ak +folder name felamimail eu Karpeta izena +folder path felamimail eu Karpetaren bidea +folder preferences felamimail eu Karpetaren preferentziak +folder settings felamimail eu Karpeta ezarpenak +folder status felamimail eu Karpetaren egoera +folderlist felamimail eu Karpeta zerrenda +foldername felamimail eu Karpetaren izena +folders felamimail eu Karpetak +folders created successfully! felamimail eu Karpeta arrakastaz sortua! +follow felamimail eu Jarraitu +for mail to be send - not functional yet felamimail eu Bidali beharreko e-Postentzat - ez erabilgarri oraindik +for received mail felamimail eu Jasotako e-Postarentzat +forward felamimail eu Birbidali +forward to felamimail eu Birbidali hona +forward to address felamimail eu Birbidali helbide honetara +found felamimail eu Aurkitua +fri felamimail eu Ostirala +from felamimail eu Nork +from(a->z) felamimail eu Nork (A->Z) +from(z->a) felamimail eu Nork (Z->A) +full name felamimail eu Izen Abizenak +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail eu Begiratu ondorengo helbidean www.felamimail.org Squirrelmailaren inguruan informazio gehiago izateko.
    +header lines felamimail eu Goiburua +hide header felamimail eu Goiburua ezkutatu +html felamimail eu HTML +icons and text felamimail eu Ikonoak eta testuak +icons only felamimail eu Ikonoak soilik +identifying name felamimail eu Izena identifikatzen +identity felamimail eu identitate +if felamimail eu baldin +illegal folder name. please select a different name. felamimail eu Karpeta izen desegokia. Mesedez hautatu izen ezberdin bat. +imap felamimail eu IMAP +imap server felamimail eu IMAP Zerbitzaria +imap server address felamimail eu IMAP Zerbitzariaren helbidea +imap server closed the connection. felamimail eu IMAP zerbitzariak konexioa itxi du +imap server password felamimail eu imap zerbitzariko pasahitza +imap server type felamimail eu IMAP Zerbitzari tipoa +imap server username felamimail eu imap zerbitzariko erabiltzaile izena +imaps authentication felamimail eu IMAPS Autentifikazioa +imaps encryption only felamimail eu IMAPS Enkripzioa soilik +in felamimail eu barne +index order felamimail eu Indize ordena +info felamimail eu Informazioa +invalid user name or password felamimail eu Erabiltzaile edo pasahitz okerra +javascript felamimail eu JavaScript +language felamimail eu Hizkuntza +last name felamimail eu Abizena +left felamimail eu Ezkerra +less felamimail eu Gutxiago +light gray felamimail eu Gris argia +list all felamimail eu Guztiak zerrendatu +loading felamimail eu kargatzen +location of buttons when composing felamimail eu Botoien posizioa idazterakoan +mail server login type admin eu E-Posta zerbitzarian saioa hasteko era +mail settings felamimail eu E-Posta lehentasunak +mainmessage felamimail eu Mezu nagusia +manage folders common eu Karpetak kudeatu +manage sieve common eu Kudeatu Sieve Script-a +mark as deleted felamimail eu Guztiak ezabatzeko hautatu +mark messages as felamimail eu Hautatu mezua +mark selected as flagged felamimail eu Hautatutakoari bandera jarri +mark selected as read felamimail eu Hautatutakoa irakurrita bezala +mark selected as unflagged felamimail eu Hautatutakoari bandera kendu +mark selected as unread felamimail eu Hautatutakoa irakurri gabe bezala +match felamimail eu Parekatu +matches felamimail eu Parekatuak +matches regexp felamimail eu Regexp parekatuak +message highlighting felamimail eu Mezua nabaritu +message list felamimail eu Mezu zerrenda +messages felamimail eu mezuak +mon felamimail eu Astelehena +move felamimail eu mugitu +move messages felamimail eu mugitu mezuak +move selected to felamimail eu mugitu hautatuak +move to trash felamimail eu Mugitu Zakarra karpetara +moving messages to felamimail eu mezua mugitu hona +name felamimail eu Izena +never display html emails felamimail eu Inoiz ez bistaratu HTML emailak +new common eu Berria +new filter felamimail eu Iragazki berria +next felamimail eu Hurrengoa +next message felamimail eu hurrengo mezua +no filter felamimail eu Iragazki gabe +no folders found felamimail eu Ez da karpetarik aurkitu +no folders were found to subscribe to! felamimail eu Ez da harpidedun egiteko karpetarik aurkitu! +no folders were found to unsubscribe from! felamimail eu Ez da harpidedun izateari uzteko karpetarik aurkitu! +no highlighting is defined felamimail eu Ez dago mezu nabariturik definituta +no message returned. felamimail eu Ez da mezurik itzuli +no messages found... felamimail eu ez da mezurik aurkitu... +no messages were selected. felamimail eu Ez da mezurik hautatu. +no previous message felamimail eu ez dago aurreko mezurik +no valid emailprofile selected!! felamimail eu posta elektroniko profil egokirik hautatu gabe! +none felamimail eu bat ere ez +on behalf of felamimail eu kontura +one address is not valid felamimail eu Helbideetako baten formatua okerra da +only inbox felamimail eu Sarrerako ontzia bakarrik +only one window felamimail eu leiho bat bakarrik +only unseen felamimail eu Ikusi gabeak bakarrik +open all felamimail eu guztiak ireki +options felamimail eu Aukerak +organisation felamimail eu erakundea +organization felamimail eu erakundea +organization name admin eu Erakundearen izena +participants felamimail eu Partaideak +personal information felamimail eu Informazio pertsonala +please select a address felamimail eu Mesedez hautatu helbide da +please select the number of days to wait between responses felamimail eu Mesedez hautatu erantzunen artean itxaron beharreko tartea +please supply the message to send with auto-responses felamimail eu Sar ezazu erantzun automatikoetan bidali beharreko mezua +port felamimail eu ataka +posting felamimail eu bidalketa +previous felamimail eu Aurrekoa +previous message felamimail eu aurreko mezua +print it felamimail eu inprimatu +print this page felamimail eu inprimatu orri hau +quicksearch felamimail eu Bilaketa azkarra +read felamimail eu irakurria +reading felamimail eu irakurtzen +recent felamimail eu berria +refresh time in minutes felamimail eu Eguneratze denbora tartea minututan +remove felamimail eu ezabatu +remove immediately felamimail eu ezabatu bat batean +rename felamimail eu Izena aldatu +rename a folder felamimail eu Karpeta baten izena aldatu +rename folder felamimail eu Karpeta izena aldatu +renamed successfully! felamimail eu Izena aldatua izan da +replied felamimail eu erantzunda +reply felamimail eu Erantzun +reply all felamimail eu Erantzun guztiei +reply to felamimail eu Erantzun +replyto felamimail eu Erantzun +respond felamimail eu Erantzun +respond to mail sent to felamimail eu Erantzun nori bidalitako emailari +return felamimail eu Itzuli +return to options page felamimail eu Itzuli aukeren orrialdera +right felamimail eu Zuzen +rule felamimail eu Erregela +sat felamimail eu Larunbata +save felamimail eu Gorde +save changes felamimail eu aldaketak gorde +script name felamimail eu scriptaren izena +script status felamimail eu scriptaren egoera +search felamimail eu Bilatu +search for felamimail eu Bilatu +select felamimail eu Hautatu +select all felamimail eu Guztiak hautatu +select emailprofile felamimail eu Posta profila hautatu +select folder felamimail eu Karpeta hautatu +select your mail server type admin eu Hautatu zure posta zerbitzari mota +send felamimail eu Bidali +send a reject message felamimail eu bidali eta hautatu mezua +sent folder felamimail eu Bidalitakoen karpeta +show header felamimail eu bistaratu goiburuak +show new messages on main screen felamimail eu Erakutzi posta berria lehendabizio pantailan +sieve settings admin eu SIEVE ren lehentasunak +signature felamimail eu Sinadura +simply click the target-folder felamimail eu hautatu non gorde nahi duzun karpeta zerrendan +size felamimail eu Tamainua +size of editor window felamimail eu Edizio leihoaren tamainua +size(...->0) felamimail eu Tamainua (...->0) +size(0->...) felamimail eu Tamainua (0->...) +small view felamimail eu ikuspegi txikia +smtp settings admin eu SMTP lehentasunak +subject felamimail eu Gaia +subject(a->z) felamimail eu Gaia (A->Z) +subject(z->a) felamimail eu Gaia (Z->A) +submit felamimail eu Bidali +subscribe felamimail eu Harpidetu +subscribed felamimail eu Harpidetuta +subscribed successfully! felamimail eu Harpidetza burutua +sun felamimail eu Igandea +table of contents felamimail eu Edukien taula +text only felamimail eu Testua bakarrik +the connection to the imap server failed!! felamimail eu IMAP zerbitzariarekiko konexioak hutsegin du +then felamimail eu ORDUAN +this folder is empty felamimail eu KARPETA HAU UTZIK DAGO +this php has no imap support compiled in!! felamimail eu PHParendako IMAPa konpilatu gabe +thu felamimail eu Osteguna +to felamimail eu Nori +to mail sent to felamimail eu Nori bidalitako postari +translation preferences felamimail eu Itzulpenen lehentasunak +translation server felamimail eu Itzulpenen zerbitzaria +trash fold felamimail eu Zakar karpeta +trash folder felamimail eu Zakar karpeta +tue felamimail eu Asteartea +type felamimail eu mota +unflagged felamimail eu bandera gabea +unknown err felamimail eu errore ezezaguna +unknown error felamimail eu errore ezezaguna +unknown sender felamimail eu Bidaltzaile ezezaguna +unknown user or password incorrect. felamimail eu Erabiltzaile ezezaguna edo pasahitz okerra +unread common eu Irakurri gabea +unseen felamimail eu Ikusi gabea +unselect all felamimail eu Hautaketa guztiak kendu +unsubscribe felamimail eu Harpidetza kendu +unsubscribed felamimail eu Harpidetza kenduta +unsubscribed successfully! felamimail eu Harpidetza arrakastaz kenduta +up felamimail eu gora +use emailadmin to create profiles felamimail eu erabili EmailAdmin profilak sortzeko +use a signature felamimail eu Erabili sinadura +use a signature? felamimail eu Sinadura erabili? +use addresses felamimail eu Helbideak erabili +use custom settings felamimail eu Lehentasun hautatuak erabili +use javascript or html addressbook? felamimail eu Javascript edo HTML helbide liburua erabili? +use smtp auth admin eu SMTP autentifikazioa erabili +users can define their own emailaccounts admin eu Erabiltzaileek euren posta kontuak defini ditzazkete +vacation notice felamimail eu Opor abisua +validate certificate felamimail eu balioztatu ziurtagiria +view full header felamimail eu Goiburu osoak ikusi +view message felamimail eu Mezua ikusi +viewing full header felamimail eu Goiburu osoak ikusten +viewing message felamimail eu Mezua ikusten +viewing messages felamimail eu Mezuak ikusten +wed felamimail eu Asteazkena +welcome to %1's webmail system felamimail eu Ongietorri %1 webmail sistemara +when deleting messages felamimail eu Mezuak ezabatzerakoan +with message felamimail eu mezuarekin +with message "%1" felamimail eu %1 mezuarekin +wrap incoming text at felamimail eu Posta sarrerak bateratu +writing felamimail eu Idazten +wrote felamimail eu Idatzia +you must login first. felamimail eu Lehenbizi sisteman sartu beharra daukazu diff --git a/felamimail/lang/egw_fa.lang b/felamimail/lang/egw_fa.lang new file mode 100644 index 0000000000..6aa78da61c --- /dev/null +++ b/felamimail/lang/egw_fa.lang @@ -0,0 +1,351 @@ +(no subject) felamimail fa (بدون عنوان) +(only cc/bcc) felamimail fa (فقط رونوشت/رونوشت دوم) +(unknown sender) felamimail fa (فرستنده نامشخص) +activate felamimail fa فعال سازی +activate script felamimail fa اسکریپت فعال سازی +add address felamimail fa افزودن نشانی +add rule felamimail fa افزودن قانون +add script felamimail fa افزودن اسکریپت +add to %1 felamimail fa افزودن به %1 +add to address book felamimail fa افزودن به دفترچه آدرس +add to addressbook felamimail fa افزودن به دفترچه آدرس +additional info felamimail fa اطلاعات بیشتر +address book felamimail fa دفترچه آدرس +address book search felamimail fa جستجوی دفترچه آدرس +after message body felamimail fa پس از بدنه پیام +all address books felamimail fa همه دفترچه آدرسها +all folders felamimail fa همه پوشه ها +all of felamimail fa همه +allways a new window felamimail fa همیشه پنجره جدید +always show html emails felamimail fa همیشه رایانامه های زنگام را نمایش بده +any of felamimail fa هرکدام از +anyone felamimail fa همه +as a subfolder of felamimail fa بعنوان زیر پوشه +attachments felamimail fa پیوندها +auto refresh folder list felamimail fa بازخوانی خودکار فهرست پوشه +back to folder felamimail fa بازگشت به پوشه +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail fa برپایه شاخصهای تعیین شده، پیامهای ورودی در فهرست پیامها می توانند رنگهای پس زمینه متفاوتی داشته باشند. این کمک می کند که به راحتی پیامها از یکدیگر تشخیص داده شوند +bcc felamimail fa رونوشت دوم +before headers felamimail fa قبل از سرآیندها +between headers and message body felamimail fa بین سرآیندها و بدنه پیام +body part felamimail fa قسمت بدنه +can't connect to inbox!! felamimail fa ناتوان از اتصال به صندوق ورودی!!! +cc felamimail fa رونوشت +change folder felamimail fa تغییر پوشه +check message against next rule also felamimail fa پیام را در مقابل قانون بعد هم بازرسی کن +checkbox felamimail fa جعبه انتخاب +click here to log back in. felamimail fa برای ورود مجدد اینجا کلیک کنید +click here to return to %1 felamimail fa برای بازگشت به %1 اینجا را کلیک کنید +close all felamimail fa بستن همه +close this page felamimail fa بستن این صفحه +close window felamimail fa بستن پنجره +color felamimail fa رنگ +compose felamimail fa نامه جدید +compress folder felamimail fa فشرده سازی پوشه +configuration felamimail fa پیکربندی +contains felamimail fa شامل +could not add folder %1 (%2) !!! felamimail fa ناتوان از افزودن پوشه %1 (%2) !!! +could not delete folder %1 (%2) !!! felamimail fa ناتوان از حذف پوشه %1 (%2) !!! +could not rename folder %1 to %2 (%3) !!! felamimail fa ناتوان از تغییر نام پوشه %1 به %2 (%3) !!! +create felamimail fa ایجاد +create folder felamimail fa ایجاد پوشه +create sent felamimail fa ایجاد ارسال شده +create subfolder felamimail fa ایجاد زیر پوشه +create trash felamimail fa ایجاد بازیافت +created folder successfully! felamimail fa پوشه با موفقیت ایجاد شد +custom felamimail fa سفارشی +dark blue felamimail fa آبی تیره +dark cyan felamimail fa فیروزه ای تیره +dark gray felamimail fa خاکستری تیره +dark green felamimail fa سبز تیره +dark magenta felamimail fa بنفش تیره +dark yellow felamimail fa زرد تیره +date(newest first) felamimail fa تاریخ (جدیدها اول) +date(oldest first) felamimail fa تاریخ (قدیمی ها اول) +days felamimail fa روز +deactivate script felamimail fa غیرفعال سازی اسکریپت +default sorting order felamimail fa ترتیب مرتب سازی پیش فرض +delete all felamimail fa حذف همه +delete folder felamimail fa حذف پوشه +delete script felamimail fa حذف اسکریپت +delete selected felamimail fa حذف انتخاب شده ها +delete selected messages felamimail fa حذف پیامهای انتخاب شده +deleted felamimail fa حذف شد +deleted folder successfully! felamimail fa پوشه با موفقیت حذف شد! +disable felamimail fa غیر فعال +discard message felamimail fa نادیده گرفتن پیام +display messages in multiple windows felamimail fa نمایش پیامها در چند پنجره +display of html emails felamimail fa نمایش رایانامه های زنگام +display only when no plain text is available felamimail fa نمایش فقط وقتی که متن معمولی موجود نیست +display preferences felamimail fa مشخصات نمایش +do it! felamimail fa انجامش بده! +do not use sent felamimail fa از ارسال شده استفاده نشود +do not use trash felamimail fa از بازیافت استفاده نشود +do you really want to delete the '%1' folder? felamimail fa آیا واقعا مطمئنید که می خواهید پوشه '%1' را حدف کنید؟ +does not contain felamimail fa شامل نیست +does not match felamimail fa جور نیست +does not match regexp felamimail fa با عبارت باقاعده جور نبود +don't use sent felamimail fa از ارسال شده استفاده نشود +don't use trash felamimail fa از بازیافت استفاده نشود +down felamimail fa پائین +download felamimail fa دریافت +download this as a file felamimail fa دریافت این بعنوان یک پرونده +e-mail felamimail fa رایانامه ۲ +e-mail address felamimail fa نشانی رایانامه +e-mail folders felamimail fa پوشه رایانامه +edit email forwarding address felamimail fa ویرایش نشانی رایانامه پیش سو +edit filter felamimail fa ویرایش صافی +edit rule felamimail fa ویرایش قانون +edit selected felamimail fa ویرایش انتخاب شده ها +edit vacation settings felamimail fa ویرایش تنظیمات بیکاری +email address felamimail fa نشانی رایانامه +email forwarding address felamimail fa نشانی رایانامه پیش سو +email signature felamimail fa امضاء رایانامه +empty trash felamimail fa خالی کردن زباله +enable felamimail fa فعال +enter your default mail domain ( from: user@domain ) admin fa حوزه پیش فرض رایانامه خود را وارد کنید( از: user@domain‌ ) +enter your imap mail server hostname or ip address admin fa نام میزبان یا نشانی IP کارگزار IMAP را وارد کنید +enter your sieve server hostname or ip address admin fa نام میزبان یا نشانی IP کارگزار SIEVE را وارد کنید +enter your sieve server port admin fa درگاه کارگزار SIEVE راوارد کنید +enter your smtp server hostname or ip address admin fa نام میزبان یا نشانی IP کارگزار SMTP را وارد کنید +enter your smtp server port admin fa درگاه کارگزار SMTP راوارد کنید +error felamimail fa خطا! +error connecting to imap serv felamimail fa خطا در اتصال به کارگزار آی مپ +error opening felamimail fa خطا در باز کردن +every felamimail fa هر +every %1 days felamimail fa هر %1 روز +expunge felamimail fa محو کردن +felamimail common fa رایانامه ۲ +file into felamimail fa پرونده در +files felamimail fa پرونده ها +filter active felamimail fa فعالسازی صافی +filter name felamimail fa نام صافی +filter rules felamimail fa قوانین صافی +first name felamimail fa نام +flagged felamimail fa علامت گذاری شده +flags felamimail fa علامتها +folder acl felamimail fa حق دسترسی پوشه +folder name felamimail fa نام پوشه +folder path felamimail fa مسیر پوشه +folder preferences felamimail fa مشخصات پوشه +folder settings felamimail fa تنظیمات پوشه +folder status felamimail fa وضعیت پوشه +folderlist felamimail fa فهرست پوشه +foldername felamimail fa نام پوشه +folders felamimail fa پوشه ها +folders created successfully! felamimail fa پوشه ها با موفقیت ایجاد شدند! +follow felamimail fa پیرو +for mail to be send - not functional yet felamimail fa برای رایانامه هایی که ارسال می شوند - هنوز عملیاتی نیست +for received mail felamimail fa برای رایانامه های دریافت شده +forward felamimail fa پیش سو +forward to address felamimail fa پیش سو به نشانی +forwarding felamimail fa پیش سو می شود +found felamimail fa پیدا شدن +fri felamimail fa جمعه +from felamimail fa از +from(a->z) felamimail fa از(A->Z) +from(z->a) felamimail fa از (Z->A) +full name felamimail fa نام کامل +greater than felamimail fa بزرگتر از +header lines felamimail fa خطوط سرآیند +hide header felamimail fa پنهانسازی سرآیند +html felamimail fa زنگام +icons and text felamimail fa نمایه و متن +icons only felamimail fa فقط نمایه +identifying name felamimail fa نام شناخته شده +if felamimail fa اگر +if from contains felamimail fa اگر از شامل باشد +if mail header felamimail fa اگر سرآیند نامه باشد +if message size felamimail fa اگر اندازه پیام باشد +if subject contains felamimail fa اگر موضوع شامل باشد +if to contains felamimail fa اگر به شامل باشد +illegal folder name. please select a different name. felamimail fa نام نامعتبر برای پوشه. لطفا نام دیگری برگزینید +imap felamimail fa آی مپ +imap server felamimail fa کارگزار آی مپ +imap server address felamimail fa نشانی کارگزار آی مپ +imap server type felamimail fa نوع کارگزار آی مپ +in felamimail fa در +index order felamimail fa ترتیب اندیکس +info felamimail fa اطلاعات +invalid user name or password felamimail fa نام کاربری یا گذرواژه نادرست +javascript felamimail fa جاوا اسکریپت +keep a copy of the message in your inbox felamimail fa یک نسخه از پیام را در صندوق ورودی نگهداری شود +keep local copy of email felamimail fa نسخه محلی از رایانامه نگهداری شود +kilobytes felamimail fa کیلوبایت +language felamimail fa زبان +last name felamimail fa نام خانوادگی +left felamimail fa چپ +less felamimail fa کمتر +less than felamimail fa کمتر از +light gray felamimail fa خاکستری روشن +list all felamimail fa فهرست همه +location of buttons when composing felamimail fa محل دکمه ها در زمان نوشتن نامه جدید +mail server login type admin fa نوع ورود کارگزار رایانامه +mail settings felamimail fa تنظیمات رایانامه +mainmessage felamimail fa پیام اصلی +manage emailfilter / vacation preferences fa مدیریت بیکاری/صافی رایانامه +manage folders common fa مدیریت پوشه ها +manage sieve common fa مدیریت اسکریپتهای Sieve +mark as deleted felamimail fa شناسائی بعنوان حذف شده +mark messages as felamimail fa شناسائی انتخاب شده ها بعنوان +mark selected as flagged felamimail fa شناسائی انتخاب شده ها بعنوان علامت دار +mark selected as read felamimail fa شناسائی انتخاب شده ها بعنوان خوانده شده +mark selected as unflagged felamimail fa شناسائی انتخاب شده ها بعنوان بدون علامت +mark selected as unread felamimail fa شناسائی انتخاب شده ها بعنوان خوانده نشده +match felamimail fa جور شود +matches felamimail fa جور شده ها +matches regexp felamimail fa عبارات باقاعده جور شده +message highlighting felamimail fa نمایان سازی پیامها +message list felamimail fa فهرست پیامها +messages felamimail fa پیام +mon felamimail fa دوشنبه +move felamimail fa انتقال دادن +move messages felamimail fa انتقال پیامها +move selected to felamimail fa انتقال انتخاب شده ها به +move to trash felamimail fa انتقال به بازیافت +moving messages to felamimail fa در حال انتقال پیامها به +name felamimail fa نام +never display html emails felamimail fa هرگز پیامهای زنگام را نشان نده +new common fa جدید +new filter felamimail fa صافی جدید +next felamimail fa بعدی +next message felamimail fa پیام بعدی +no filter felamimail fa بدون صافی +no folders found felamimail fa پوشه ای پیدا نشد +no folders were found to subscribe to! felamimail fa پوشه ای برای عضویت پیدا نشد! +no folders were found to unsubscribe from! felamimail fa پوشه ای برای لغو عضویت پیدا نشد! +no highlighting is defined felamimail fa نمایان سازی تعریف نشده +no messages found... felamimail fa پیامی پیدا نشد... +no messages were selected. felamimail fa پیامی انتخاب نشده +no previous message felamimail fa پیام قبلی موجود نیست +no valid emailprofile selected!! felamimail fa تنظیمات معتبری برای رایانامه انتخاب نشده!!! +none felamimail fa هیچ +on behalf of felamimail fa در نیمه +one address is not valid felamimail fa یکی از نشانیها معتبر نیستند +only inbox felamimail fa فقط صندوق ورودی +only one window felamimail fa فقط یک پنجره +only unseen felamimail fa فقط ندیده ها +open all felamimail fa بازکردن همه +options felamimail fa گزینه ها +organisation felamimail fa سازمان +organization felamimail fa سازمان +organization name admin fa نام سازمان +participants felamimail fa همکاران +personal information felamimail fa اطلاعات شخصی +please select a address felamimail fa لطفا یک نشانی انتخاب کنید +please select the number of days to wait between responses felamimail fa لطفا تعداد روزها برای انتظار مابین پاسخها را انتخاب کنید +please supply the message to send with auto-responses felamimail fa لطفا پیامی را برای ارسال پاسخ خودکار تعیین کنید +posting felamimail fa درحال پست +previous felamimail fa قبلی +previous message felamimail fa پیام قبلی +print it felamimail fa چاپش کن +print this page felamimail fa چاپ این صفحه +quicksearch felamimail fa جستجوی سریع +read felamimail fa خوانده شده +reading felamimail fa در حال خواندن +recent felamimail fa اخیر +refresh time in minutes felamimail fa زمان بازخوانی به دقیقه +remove felamimail fa حذف کردن +remove immediately felamimail fa فورا حذف شود +rename felamimail fa تغییر نام +rename a folder felamimail fa تغییر نام یک پوشه +rename folder felamimail fa تغییر نام پوشه +renamed successfully! felamimail fa با موفقیت تغییر نام یافت! +replied felamimail fa پاسخ داده شده +reply felamimail fa پاسخ +reply all felamimail fa پاسخ به همه +reply to felamimail fa پاسخ به +replyto felamimail fa پاسخ به +respond felamimail fa پاسخ +respond to mail sent to felamimail fa پاسخ به نامه ارسال شده به +return felamimail fa بازگشت +return to options page felamimail fa بازگشت به صفحه گزینه ها +right felamimail fa راست +rule felamimail fa قانون +sat felamimail fa شنبه +save felamimail fa ذخیره +save changes felamimail fa ذخیره تغییرات +script name felamimail fa نام اسکریپت +script status felamimail fa وضعیت اسکریپت +search felamimail fa جستجو +search for felamimail fa جستجو برای +select felamimail fa انتخاب +select all felamimail fa انتخاب همه +select emailprofile felamimail fa تنظیمات رایانامه را انتخاب کنید +select folder felamimail fa پوشه را انتخاب کنید +select your mail server type admin fa نوع کارگزار رایانامه خود را انتخاب کنید +send felamimail fa ارسال +send a reject message felamimail fa ارسال یک پیام برگشتی +sent folder felamimail fa پوشه ارسال شده +show header felamimail fa نمایش سرآیند +show new messages on main screen felamimail fa نمایش پیامهای جدید در صفحه اصلی(خانه) +sieve settings admin fa تنظیمات Sieve +signature felamimail fa امضاء +simply click the target-folder felamimail fa برای انتقال انتخاب شده ها فقط روی پوشه مقصد کلیک کنید +size felamimail fa اندازه +size of editor window felamimail fa اندازه پنجره ویرایشگر +size(...->0) felamimail fa اندازه (...->0) +size(0->...) felamimail fa اندازه (0->...) +skipping forward ... felamimail fa پرش به جلو ... +small view felamimail fa نمای کوچک +smtp settings admin fa تنظیمات SMTP +subject felamimail fa موضوع +subject(a->z) felamimail fa موضوع (A->Z) +subject(z->a) felamimail fa موضوع (Z->A) +submit felamimail fa ثبت +subscribe felamimail fa عضو شدن +subscribed felamimail fa عضو شده +subscribed successfully! felamimail fa عضویت با موفقیت انجام شد! +sun felamimail fa یکشنبه +table of contents felamimail fa فهرست محتویات +text only felamimail fa فقط متن +the connection to the imap server failed!! felamimail fa اتصال به کارگزار آی مپ ناموفق بود!!! +the mimeparser can not parse this message. felamimail fa تشخیص دهنده نوع فایل قادر به تشخیص این پیام نیست +then felamimail fa سپس +this folder is empty felamimail fa این پوشه خالی است +this php has no imap support compiled in!! felamimail fa این PHP پشتیبانی از آی مپ را در خود ندارد! +thu felamimail fa پنجشنبه +to felamimail fa به +to mail sent to felamimail fa برای نامه های ارسال شده +translation preferences felamimail fa مشخصات ترجمه +translation server felamimail fa کارگزار ترجمه +trash fold felamimail fa پوشه بازیافت +trash folder felamimail fa پوشه بازیافت +tue felamimail fa سه شنبه +type felamimail fa نوع +unflagged felamimail fa بی علامت +unknown err felamimail fa خطای ناشناخته +unknown error felamimail fa خطای ناشناخته +unknown sender felamimail fa فرستنده ناشناس +unknown user or password incorrect. felamimail fa نام کاربری یا گذرواژه نادرست است +unread common fa خوانده نشده +unseen felamimail fa دیده نشده +unselect all felamimail fa خارج کردن از انتخاب همه +unsubscribe felamimail fa لغو عضویت +unsubscribed felamimail fa عضویت لغو شده +unsubscribed successfully! felamimail fa لغو شدن عضویت با موفقیت انجام شد! +up felamimail fa بالا +use emailadmin to create profiles felamimail fa از مدیر رایانامهz) felamimail fi A:sta Z:taan +from(z->a) felamimail fi Z:sta A:han +full name felamimail fi Koko nimi +greater than felamimail fi Suurempi kuin +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail fi Katso www.felamimail.org oppiaksesi lisää Squirrelmailista.
    +header lines felamimail fi Ylätunnisterivit +hide header felamimail fi Piilota ylätunniste +hostname / address felamimail fi Palvelimen nimi / osoite +how to forward messages felamimail fi Kuinka viestejä välitetään +html felamimail fi HTML +icons and text felamimail fi Kuvakkeet ja teksti +icons only felamimail fi Vain kuvakkeet +identifying name felamimail fi Tunniste +identity felamimail fi Identiteetti +if felamimail fi JOS +if from contains felamimail fi Jos lähettäjä sisältää +if mail header felamimail fi Jos postin ylätunniste +if message size felamimail fi Jos viestin koko +if shown, which folders should appear on main screen felamimail fi Jos näytetään, mitkä kansiot tulisi näyttää etusivulla? +if subject contains felamimail fi Jos aihe sisältää +if to contains felamimail fi Jos vastaanottaja sisältää +if using ssl or tls, you must have the php openssl extension loaded. felamimail fi Jos käytetään SSL tai TLS, sinulla pitää olla ladattuna PHP openssl lisäpaketti. +illegal folder name. please select a different name. felamimail fi Kansion nimi ei kelpaa. Anna uusi nimi. +imap felamimail fi IMAP +imap server felamimail fi IMAP -palvelin +imap server address felamimail fi IMAP -palvelimen osoite +imap server closed the connection. felamimail fi IMAP -palvelin katkaisi yhteyden. +imap server closed the connection. server responded: %s felamimail fi IMAP -palvelin katkaisi yhteyden. Palvelin palauttaa: %s +imap server password felamimail fi IMAP -palvelimen salasana +imap server type felamimail fi IMAP -palvelin tyyppi +imap server username felamimail fi IMAP -palvelimen käyttäjätunnus +imaps authentication felamimail fi IMAPS -tunnistus +imaps encryption only felamimail fi Vain IMAPS -salaus +import felamimail fi Tuonti +import mail felamimail fi Tuo sähköposteja +import message felamimail fi Tuo sähköpostiviesti +in felamimail fi sisältää +inbox felamimail fi Saapuneet +incoming mail server(imap) felamimail fi Saapuvan sähköpostin palvelin (IMAP) +index order felamimail fi Indeksijärjestys +info felamimail fi Info +invalid user name or password felamimail fi Virheellinen käyttäjänimi tai salasana +javascript felamimail fi JavaScript +jumping to end felamimail fi Siirry loppuun +jumping to start felamimail fi Siirry alkuun +junk felamimail fi Roskaposti +keep a copy of the message in your inbox felamimail fi Pidä kopio viestistä Inboxissa +keep local copy of email felamimail fi Säilytä kopio viestistä +kilobytes felamimail fi Kilotavu(a) +language felamimail fi Kieli +last name felamimail fi Sukunimi +left felamimail fi Vasen +less felamimail fi Vähemmän +less than felamimail fi Vähemmän kuin +light gray felamimail fi Vaaleanharmaa +list all felamimail fi Näytä kaikki +loading felamimail fi Ladataan +location of buttons when composing felamimail fi Painikkeiden sijainti kirjoitettaessa +mail server login type admin fi Sähköpostipalvelimen kirjautumistyyppi +mail settings felamimail fi Viestien asetukset +mainmessage felamimail fi Pääviesti +manage email accounts and identities common fi Hallitse sähköpostitilejä ja identiteettejä +manage emailaccounts common fi Hallitse sähköpostitilejä +manage emailfilter / vacation preferences fi Hallitse sähköpostisuodatinta / Lomaviestejä +manage folders common fi Hallitse kansioita +manage sieve common fi Hallitse SIEVE skriptejä +manage signatures felamimail fi Hallitse allekirjoituksia +mark as deleted felamimail fi Merkitse poistetuksi +mark messages as felamimail fi Merkitse valitut viestit +mark selected as flagged felamimail fi Merkitse tunnuksella +mark selected as read felamimail fi Merkitse valitut luetuiksi +mark selected as unflagged felamimail fi Poista tunniste valituista viesteistä +mark selected as unread felamimail fi Merkitse valitut lukemattomiksi +match felamimail fi Yhteensopivuus +matches felamimail fi Täsmäävät +matches regexp felamimail fi Täsmäävät merkkijonoon +max uploadsize felamimail fi Suurin latauskoko +message highlighting felamimail fi Viestien korostus +message list felamimail fi Viestilista +messages felamimail fi Viestiä +mon felamimail fi Ma +move felamimail fi Siirrä +move folder felamimail fi Siirrä kansio +move messages felamimail fi Siirrä viesti(t) +move messages? felamimail fi Siirretäänkö viestit? +move selected to felamimail fi Siirrä valitut: +move to trash felamimail fi Siirrä roskakoriin +moving messages to felamimail fi Siirretään viestejä +name felamimail fi Nimi +never display html emails felamimail fi Älä näytä HTML -sähköposteja +new common fi Uusi +new filter felamimail fi Uusi suodatin +next felamimail fi Seuraava +next message felamimail fi Seuraava viesti +no active imap server found!! felamimail fi Aktiivista IMAP palvelinta ei löydetty !! +no address to/cc/bcc supplied, and no folder to save message to provided. felamimail fi Osoitetta ei ole annettu kohtaan Kenelle/Kopio/Piilokopio , eikä Kansiota, mihin viesti pitäisi tallentaa löydy. +no encryption felamimail fi Ei salausta +no filter felamimail fi Ei suodatinta +no folders felamimail fi Ei kansioita +no folders found felamimail fi Kansioita ei löytynyt +no folders were found to subscribe to! felamimail fi Ei tilattavia kansioita! +no folders were found to unsubscribe from! felamimail fi Ei peruttavia kansioita! +no highlighting is defined felamimail fi Korostusta ei määritelty +no imap server host configured!! felamimail fi IMAP palvelinta ei ole konfiguroitu +no message returned. felamimail fi Ei palautettuja viestejä +no messages found... felamimail fi Viestejä ei löytynyt... +no messages selected, or lost selection. changing to folder felamimail fi Ei valittuja viestejä tai yhteys menetettyn. Vaihdetaan kansioon: +no messages were selected. felamimail fi Ei valittuja viestejä. +no plain text part found felamimail fi Pelkkää tekstiä ei löytynyt +no previous message felamimail fi Ei edellistä viestiä +no recipient address given! felamimail fi Vastaanottajan osoite puuttuu! +no signature felamimail fi Ei allekirjoitusta +no stationery felamimail fi Ei sähköpostin taustakuvamalleja +no subject given! felamimail fi Aihe puuttuu! +no supported imap authentication method could be found. felamimail fi Tuettua IMAP tunnistustapaa ei löydetty. +no valid data to create mailprofile!! felamimail fi Ei voimassaolevia tietoja sähköpostiprofiilin luomiseen! +no valid emailprofile selected!! felamimail fi Voimassaolevaa sähköpostiprofiilia ei ole valittuna!! +none felamimail fi Ei mitään +none, create all felamimail fi Ei mitään, luo kaikki +not allowed felamimail fi Ei sallittu +notify when new mails arrive on these folders felamimail fi Huomauta uusien viestien saapuessa näihin kansioihin +on behalf of felamimail fi Puolesta +one address is not valid felamimail fi Yksi osoite ei kelpaa +only inbox felamimail fi Vain Saapuneet +only one window felamimail fi Vain yksi ikkuna +only unseen felamimail fi Vain avaamattomat +open all felamimail fi Avaa kaikki +options felamimail fi Asetukset +or felamimail fi Tai +or configure an valid imap server connection using the manage accounts/identities preference in the sidebox menu. felamimail fi Tai konfiguroi IMAP -palvelin kohdassa Hallitse sähköpostitilejä ja Identiteettejä (sivuvalikossa). +organisation felamimail fi Organisaatio +organization felamimail fi Organisaatio +organization name admin fi Organisaation nimi +original message felamimail fi Alkuperäinen viesti +outgoing mail server(smtp) felamimail fi Lähtevän sähköpostin palvelin (SMTP) +participants felamimail fi Osallistujat +personal information felamimail fi Omat tiedot +please ask the administrator to correct the emailadmin imap server settings for you. felamimail fi Pyydä ylläpitäjiltä IMAP palvelinasetukset. +please configure access to an existing individual imap account. felamimail fi Konfiguroi jo olemassaolevan IMAP sähköpostitilisi asetukset. +please select a address felamimail fi Valitse osoite +please select the number of days to wait between responses felamimail fi Valitse päivien lukumäärä, joka vastausten välillä odotetaan +please supply the message to send with auto-responses felamimail fi Anna viesti joka lähetetään automaattisella vastauksella +port felamimail fi Portti +posting felamimail fi Postitus +previous felamimail fi Edellinen +previous message felamimail fi Edellinen viesti +print it felamimail fi Tulosta +print this page felamimail fi Tulosta tämä sivu +printview felamimail fi Tulostuksen esikatselu +quicksearch felamimail fi Pikahaku +read felamimail fi Luettu +reading felamimail fi Luetaan... +receive notification felamimail fi Pyydä vastaanottokuittaus +recent felamimail fi Viimeaikaiset +refresh time in minutes felamimail fi Päivitysaika minuutteina +reject with felamimail fi Hylkää +remove felamimail fi Poista +remove immediately felamimail fi Poista heti +rename felamimail fi Vaihda nimi +rename a folder felamimail fi Nimeä kansio uudelleen +rename folder felamimail fi Nimeä kansio uudelleen +renamed successfully! felamimail fi Nimi vaihdettu! +replied felamimail fi Vastattu +reply felamimail fi Vastaa +reply all felamimail fi Vastaa kaikille +reply to felamimail fi Vastaanottaja +replyto felamimail fi Vastaanottaja +respond felamimail fi Vastaa +respond to mail sent to felamimail fi Vastaa viestiin, mikä lähetettiin osoitteeseen: +return felamimail fi Takaisin +return to options page felamimail fi Takaisin asetukset -sivulle +right felamimail fi Oikea +row order style felamimail fi Rivijärjestyksen muotoilu +rule felamimail fi Sääntö +sat felamimail fi La +save felamimail fi Tallenna +save all felamimail fi Tallenna kaikki +save as draft felamimail fi Tallenna luonnoksena +save as infolog felamimail fi Tallenna InfoLogina +save changes felamimail fi Tallenna muutokset +save message to disk felamimail fi Tallenna viesti levylle +script name felamimail fi Skriptin nimi +script status felamimail fi Skriptin tila +search felamimail fi Etsi +search for felamimail fi Etsi +select felamimail fi Valitse +select all felamimail fi Valitse kaikki +select emailprofile felamimail fi Valitse sähköpostin profiili +select folder felamimail fi Valitse kansio +select your mail server type admin fi Valitse (posti)palvelimesi tyyppi +send felamimail fi Lähetä +send a reject message felamimail fi Lähetä kieltäytymisviesti +sent felamimail fi Lähetetyt +sent folder felamimail fi Lähetetyt kansio +server supports mailfilter(sieve) felamimail fi Palvelin tukee sähköpostin suodatusta (SIEVE) +set as default felamimail fi Aseta oletukseksi +show all folders (subscribed and unsubscribed) in main screen folder pane felamimail fi Näytä kaikki kansiot (tilatut ja tilaamattomat) sähköpostivalikossa. +show header felamimail fi Näytä ylätunniste +show new messages on main screen felamimail fi Näytä uudet viestit etusivulla +sieve script name felamimail fi SIEVE skriptin nimi +sieve settings admin fi SIEVE asetukset +signatur felamimail fi Allekirjoitus +signature felamimail fi Allekirjoitus +simply click the target-folder felamimail fi Valitse kohdekansio +size felamimail fi Koko +size of editor window felamimail fi Muokkausikkunan koko +size(...->0) felamimail fi Koko (...->0) +size(0->...) felamimail fi Koko (0->...) +skipping forward felamimail fi Siirry seuraavaan +skipping previous felamimail fi Siirry edelliseen +small view felamimail fi Pieni näkymä +smtp settings admin fi SMTP asetukset +start new messages with mime type plain/text or html? felamimail fi Haluatko aloitaa uudet viestit pelkkänä tekstinä vai HTML:nä? +stationery felamimail fi Sähköpostin taustakuva -mallipohjat +subject felamimail fi Aihe +subject(a->z) felamimail fi Aiheet A > Z +subject(z->a) felamimail fi Aiheet Z > A +submit felamimail fi Lähetä +subscribe felamimail fi Tilaa +subscribed felamimail fi Tilattu +subscribed successfully! felamimail fi Tilattu onnistuneesti! +sun felamimail fi Su +system signature felamimail fi Yleinen allekirjoitus +table of contents felamimail fi Sisältö +template folder felamimail fi Mallipohjat -kansio +templates felamimail fi Mallipohjat +text only felamimail fi Vain tekstiä +text/plain felamimail fi Pelkkä teksti +the action will be applied to all messages of the current folder.ndo you want to proceed? felamimail fi Toiminto on kaikille tämän kansion viesteille. Haluatko jatkaa? +the connection to the imap server failed!! felamimail fi Yhteys IMAP palvelimeen epäonnistui!! +the imap server does not appear to support the authentication method selected. please contact your system administrator. felamimail fi IMAP palvelin ei tue valittua tunnistustapaa. Ota yhteyttä järjestelmän ylläpitäjään. +the message sender has requested a response to indicate that you have read this message. would you like to send a receipt? felamimail fi Viestin lähettäjä haluaa vahvistuksen, että olet saanut tämän viestin. Haluatko lähettää sen? +the mimeparser can not parse this message. felamimail fi Mimeparseri ei voi jäsentää tätä viestiä +then felamimail fi TAI +there is no imap server configured. felamimail fi IMAP palvelinta ei ole konfiguroitu +this folder is empty felamimail fi Kansio on tyhjä +this php has no imap support compiled in!! felamimail fi Tällä PHP:llä ei ole IMAP -tukea!! +thu felamimail fi To +to felamimail fi Kenelle: +to mail sent to felamimail fi Kenelle posti lähetetään: +to use a tls connection, you must be running a version of php 5.1.0 or higher. felamimail fi Käyttääksesi TLS yhteyttä, sinulla pitää olla PHP 5.1.0 tai uudempi versio. +translation preferences felamimail fi Käännösten asetukset +translation server felamimail fi Käännöspalvelin +trash felamimail fi Roskakori +trash fold felamimail fi Roskakori -kansio +trash folder felamimail fi Roskakori -kansio +tue felamimail fi Ti +type felamimail fi Tyyppi +unexpected response from server to authenticate command. felamimail fi Odottamaton vastaus palvelimelta AUTHENTICATE komentoon. +unexpected response from server to digest-md5 response. felamimail fi Odottamaton vastaus palvelimen Digest-MD5 vastaukselta. +unexpected response from server to login command. felamimail fi Odottamaton vastaus palvelimelta LOGIN kirjautumiskomentoon +unflagged felamimail fi Tunnukseton +unknown err felamimail fi Tunt. virh. +unknown error felamimail fi Tuntematon virhe +unknown imap response from the server. server responded: %s felamimail fi Tuntematon vastaus IMAP palvelimelta. Palvelin vastasi: %s +unknown sender felamimail fi Tuntematon lähettäjä +unknown user or password incorrect. felamimail fi Tuntematon käyttäjä tai väärä salasana. +unread common fi Lukematon +unseen felamimail fi Lukematon +unselect all felamimail fi Poista kaikki valinnat +unsubscribe felamimail fi Peruuta tilaus +unsubscribed felamimail fi Peruutettu +unsubscribed successfully! felamimail fi Tilaus peruutettu! +up felamimail fi Ylös +updating message status felamimail fi Päivitä viestin tila +updating view felamimail fi Päivitysnäkymä +use emailadmin to create profiles felamimail fi Käytä EmailAdmin tehdäksesi profiileja +use a signature felamimail fi Käytä allekirjoitusta +use a signature? felamimail fi Käytetäänkö allekirjoitusta? +use addresses felamimail fi Käytä osoitteita +use custom identities felamimail fi Käytä muokattuja identiteettejä +use custom settings felamimail fi Käytä muokattuja (lisä-) asetuksia +use regular expressions felamimail fi Käytä tavanomaisia ilmaisuja +use smtp auth admin fi Käytä SMTP -tunnistusta +users can define their own emailaccounts admin fi Käyttäjät voivat määritellä omia (uusia) sähköpostitilejä +vacation notice common fi Lomavastaaja +vacation notice is active felamimail fi Lomavastaaja on käytössä +vacation start-date must be before the end-date! felamimail fi Lomavastaajan aloituspäivän pitää olla ennen loppumispäivää +validate certificate felamimail fi Tarkista sertifikaatti +view full header felamimail fi Näytä koko ylätunniste +view header lines felamimail fi Näytä ylätunnisterivit +view message felamimail fi Näytä viesti +viewing full header felamimail fi Näytetään kaikki ylätunnisterivit +viewing message felamimail fi Viestien katselu +viewing messages felamimail fi Viestien katselu +wed felamimail fi Ke +when deleting messages felamimail fi Kun poistetaan viestejä +which folders (additional to the sent folder) should be displayed using the sent folder view schema felamimail fi Minkä kansioiden (Lähetetyt-kansion lisäksi) tulisi käyttää Sent Folder View Schemaa? +which folders - in general - should not be automatically created, if not existing felamimail fi Mitä kansioita -yleisesti ottaen - EI pitäisi automaattisesti luoda, jos ne eivät ole jo olemassa? +with message felamimail fi Vastausviesti +with message "%1" felamimail fi Viestin "%1" kanssa +wrap incoming text at felamimail fi Aseta rivinleveydeksi +writing felamimail fi Kirjoitetaan +wrote felamimail fi Kirjoitettu +yes, offer copy option felamimail fi Kyllä, tarjoa kopiointimahdollisuutta +you can use %1 for the above start-date and %2 for the end-date. felamimail fi Käytä aloituspäivälle %1 ja lopetuspäivälle %1. +you have received a new message on the felamimail fi Uusi viesti kansiossa: +your message to %1 was displayed. felamimail fi Viesti henkilölle %1 esitetty diff --git a/felamimail/lang/egw_fr.lang b/felamimail/lang/egw_fr.lang new file mode 100644 index 0000000000..5e22dda51c --- /dev/null +++ b/felamimail/lang/egw_fr.lang @@ -0,0 +1,425 @@ +(no subject) felamimail fr (pas de sujet) +(only cc/bcc) felamimail fr (seulement Cc/Bcc) +(unknown sender) felamimail fr (envoyeur inconnu) +activate felamimail fr Activer +activate script felamimail fr Activer le script +add acl felamimail fr ajouter acl +add address felamimail fr Ajouter l'adresse +add rule felamimail fr Ajouter une règle +add script felamimail fr Ajouter un script +add to %1 felamimail fr Ajouter à %1 +add to address book felamimail fr Ajouter au carnet d'adresses +add to addressbook felamimail fr Ajouter au carnet d'adresses +adding file to message. please wait! felamimail fr Ajout fichier au message. Veuillez patienter! +additional info felamimail fr Informations additionnelles +address book felamimail fr Carnet d'adresses +address book search felamimail fr Recherche dans le carnet d'adresses +after message body felamimail fr Après le corps du message +all address books felamimail fr Tous les carnets d'adresses +all folders felamimail fr Tous les dossiers +all of felamimail fr tous de +allow images from external sources in html emails felamimail fr Autoriser les images de sources externes dans les emails HTML +allways a new window felamimail fr toujours une nouvelle fenêtre +always show html emails felamimail fr Toujours affecher les messages HTML +and felamimail fr et +any of felamimail fr un de +any status felamimail fr n'importe quel statut +anyone felamimail fr N'importe qui +as a subfolder of felamimail fr Comme un sous-dossier de +attachments felamimail fr Attachements +authentication required felamimail fr authentification requise +auto refresh folder list felamimail fr Auto-rafraîchir la liste des dossiers +back to folder felamimail fr Retour au dossier +bad login name or password. felamimail fr Mauvais login ou mot de passe +bad or malformed request. server responded: %s felamimail fr Requête invalide ou malformée. Le serveur a répondu: %s +bad request: %s felamimail fr Requête invalide: %s +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail fr En se basant sur les critères donnés, les messages entrants peuvent avoir des couleurs de fond différentes dans la liste des messages. Ceci aide à distinguer aisément de qui sont les messages, spécialement pour les listes de diffusion. +bcc felamimail fr Copie cachée +before headers felamimail fr Avant les entêtes +between headers and message body felamimail fr Entre les entêtes et le corps du message +body part felamimail fr Corps du message +can not send message. no recipient defined! felamimail fr Impossible d'envoyer le message, il n'y a pas de destinataire +can't connect to inbox!! felamimail fr Impossible de se connecter au serveur! +cc felamimail fr Copie à +change folder felamimail fr Changer de dossier +check message against next rule also felamimail fr vérifiez le message avec la prochaine règle également +checkbox felamimail fr Case à cocher +clear search felamimail fr réinitialiser termes de la recherche +click here to log back in. felamimail fr Cliquez ici pour vous reconnecter +click here to return to %1 felamimail fr Cliquez ici pour retourner à %1 +close all felamimail fr Tout fermer +close this page felamimail fr Fermer cette page +close window felamimail fr Fermer la fenêtre +color felamimail fr Couleur +compose felamimail fr Composer +compress folder felamimail fr Compresser le dossier +condition felamimail fr condition +configuration felamimail fr Configuration +connection dropped by imap server. felamimail fr Connexion annulée par le serveur IMAP +contains felamimail fr contient +could not complete request. reason given: %s felamimail fr Requête non achevée. Raison invoquée: %s +could not open secure connection to the imap server. %s : %s. felamimail fr Impossible d'avoir une connexion sécurisée avec le serveur IMAP. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. felamimail fr CRAM-MD5 ou DIGEST-MD5 requièrent l'installation du paquetage Auth_SASL. +create felamimail fr Créer +create folder felamimail fr Créer un dossier +create sent felamimail fr Créer Sent (envoyés) +create subfolder felamimail fr Créer un sous-dossier +create trash felamimail fr Créer la corbeille +created folder successfully! felamimail fr Dossier créé avec succès! +dark blue felamimail fr Bleu foncé +dark cyan felamimail fr Cyan foncé +dark gray felamimail fr Gris foncé +dark green felamimail fr Vert foncé +dark magenta felamimail fr Magenta foncé +dark yellow felamimail fr Jaune foncé +date(newest first) felamimail fr Date (plus récente d'abord) +date(oldest first) felamimail fr Date (plus ancienne d'abord) +days felamimail fr jours +deactivate script felamimail fr désactiver les scripts +default felamimail fr défaut +default signature felamimail fr signature par défaut +default sorting order felamimail fr Ordre de tri par défaut +delete all felamimail fr Effacer tous +delete folder felamimail fr Effacer le dossier +delete script felamimail fr Effacer le script +delete selected felamimail fr Effacer sélectionnés +delete selected messages felamimail fr Effacer les messages sélectionnés +deleted felamimail fr Effacés +deleted folder successfully! felamimail fr Dossier effacé avec succès! +deleting messages felamimail fr suppression des messages +disable felamimail fr Désactiver +discard felamimail fr annuler +discard message felamimail fr annuler les modifications +display message in new window felamimail fr Afficher le message dans une nouvelle fenêtre +display messages in multiple windows felamimail fr afficher les messages dans plusieurs fenêtres +display of html emails felamimail fr Afficher les messages HTML +display only when no plain text is available felamimail fr Afficher seulement quand le format texte n'est pas disponible +display preferences felamimail fr Afficher les préférences +displaying html messages is disabled felamimail fr l'affichage des messages html est désactivé +do it! felamimail fr Fais-le! +do not use sent felamimail fr Ne pas utiliser Sent (envoyés) +do not use trash felamimail fr Ne pas utiliser la corbeille +do not validate certificate felamimail fr ne pas valider le certificat +do you really want to delete the '%1' folder? felamimail fr Voulez-vous vraiment effacer le dossier '%1'? +do you really want to delete the selected signatures? felamimail fr Voulez-vous vraiment supprimer les signatures sélectionnées? +does not contain felamimail fr ne contient pas +does not match felamimail fr ne correspond pas +does not match regexp felamimail fr ne correspond pas à la regexp +don't use draft folder felamimail fr Ne pas utiliser un dossier brouillon +don't use sent felamimail fr Ne pas utiliser Eléments envoyés +don't use trash felamimail fr Ne pas utiliser la Corbeille +down felamimail fr bas +download felamimail fr Télécharger +download this as a file felamimail fr Télécharger en tant que fichier +draft folder felamimail fr dossier brouillon +e-mail felamimail fr EMail +e-mail address felamimail fr Adresse de messagerie +e-mail folders felamimail fr Dossiers EMail +edit email forwarding address felamimail fr Editer l'adresse de transfert d'email +edit filter felamimail fr Modifier le filtre +edit rule felamimail fr Modifier la règle +edit selected felamimail fr Modifier sélectionné +edit vacation settings felamimail fr Editer les paramètre de vacances +email address felamimail fr Adresse de messagerie +email forwarding address felamimail fr Adresse mail de transfert +email signature felamimail fr Signature de messagerie +emailaddress felamimail fr adresse email +empty trash felamimail fr Vider la Corbeille +enable felamimail fr Activer +encrypted connection felamimail fr connexion chiffrée +enter your default mail domain ( from: user@domain ) admin fr Entrez votre domaine par défaut (De: utilisateur@domaine.com) +enter your imap mail server hostname or ip address admin fr Entrez le nom de votre serveur de mail IMAP ou son adresse IP +enter your sieve server hostname or ip address admin fr Entrez le nom de votre serveur SIEVE ou son adresse IP +enter your sieve server port admin fr Entrez le port de votre serveur SIEVE +enter your smtp server hostname or ip address admin fr Entrez le nom ou l'adresse IP de votre serveur SMTP +enter your smtp server port admin fr Entrez le port SMTP +error felamimail fr ERREUR +error connecting to imap serv felamimail fr Erreur lors de la connexion au serveur IMAP +error connecting to imap server. %s : %s. felamimail fr Erreur lors de connexion au serveur IMAP. %s : %s. +error connecting to imap server: [%s] %s. felamimail fr Erreur lors de connexion au serveur IMAP: [%s] %s. +error opening felamimail fr Erreur à l'ouverture +every felamimail fr tous +every %1 days felamimail fr tous les %1 jours +expunge felamimail fr Purger +extended felamimail fr étendu +felamimail common fr Messagerie +file into felamimail fr Fichier dans +files felamimail fr Fichiers +filter active felamimail fr Filtre actif +filter name felamimail fr Nom du filtre +filter rules common fr Règles de filtrage +first name felamimail fr Prénom +flagged felamimail fr Marqué +flags felamimail fr Drapeaux +folder acl felamimail fr Droits sur le dossier +folder name felamimail fr Nom du dossier +folder path felamimail fr Chemin du dossier +folder preferences felamimail fr Préférences du dossier +folder settings felamimail fr Réglages du dossier +folder status felamimail fr Etat du dossier +folderlist felamimail fr Liste des dossiers +foldername felamimail fr Nom du dossier +folders felamimail fr Dossiers +folders created successfully! felamimail fr Dossiers crées avec succès! +follow felamimail fr Suivre +for mail to be send - not functional yet felamimail fr Pour le mail à envoyer - pas encore fonctionnel +for received mail felamimail fr Pour le mail reçu +forward felamimail fr Transférer +forward to felamimail fr transférer à +forward to address felamimail fr Tranférer à l'adresse +forwarding felamimail fr Transfert +found felamimail fr Trouvé +fri felamimail fr Ven +from felamimail fr De +from(a->z) felamimail fr De (A->Z) +from(z->a) felamimail fr De (Z->A) +full name felamimail fr Nom complet +greater than felamimail fr plus grand que +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail fr Jettez un oeil à www.felamimail.org pour en savoir plus sur Squirrelmail.
    +header lines felamimail fr Lignes d'Entête +hide header felamimail fr Cacher l'entête +hostname / address felamimail fr nom d'hôte / adresse +html felamimail fr HTML +icons and text felamimail fr Icônes et texte +icons only felamimail fr Icônes seulement +identifying name felamimail fr Identifie le nom +identity felamimail fr identité +if felamimail fr SI +if from contains felamimail fr Si l'expéditeur contient +if mail header felamimail fr Si l'en-tête de courrier +if message size felamimail fr Si la taille du message +if subject contains felamimail fr Si le sujet contient +if to contains felamimail fr Si A contient +if using ssl or tls, you must have the php openssl extension loaded. felamimail fr Si vous utilisez SSL ou TLS, l'extension PHP openssl doit être chargée. +illegal folder name. please select a different name. felamimail fr Nom de dossier illégal. SVP choisissez-en un autre. +imap felamimail fr IMAP +imap server felamimail fr Serveur IMAP +imap server address felamimail fr Adresse IP du serveur IMAP +imap server closed the connection. felamimail fr le serveur IMAP a fermé la connexion. +imap server closed the connection. server responded: %s felamimail fr le serveur IMAP a fermé la connexion. Le serveur a répondu: %s +imap server password felamimail fr mot de passe du serveur imap +imap server type felamimail fr Type de serveur IMAP +imap server username felamimail fr utilisateur du serveur imap +imaps authentication felamimail fr Authentification IMAPS +imaps encryption only felamimail fr Chiffrement IMAPS seulement +in felamimail fr Dans +inbox felamimail fr Boîte de réception +incoming mail server(imap) felamimail fr serveur de courier entrant (IMAP) +index order felamimail fr Ordre d'index +info felamimail fr Info +invalid user name or password felamimail fr Nom d'utilisateur ou mot de passe invalide +javascript felamimail fr JavaScript +jumping to end felamimail fr saut à la fin +jumping to start felamimail fr saut au début +keep a copy of the message in your inbox felamimail fr Garder une copie du message dans votre courrier entrant +keep local copy of email felamimail fr Garder un copie local de votre email +kilobytes felamimail fr kilo-octets +language felamimail fr Langue +last name felamimail fr Nom de famille +left felamimail fr Gauche +less felamimail fr Moins +less than felamimail fr Moins que +light gray felamimail fr Gris léger +list all felamimail fr Lister tous +loading felamimail fr chargement +location of buttons when composing felamimail fr Emplacement des boutons lors de la composition +mail server login type admin fr Type d'authentification de messagerie +mail settings felamimail fr Réglages EMail +mainmessage felamimail fr Message principal +manage emailaccounts preferences fr Gérer les comptes email +manage emailfilter / vacation preferences fr Gérer les filtres / les vacances +manage folders common fr Gérer les dossiers +manage sieve common fr Gérer les scripts SIEVE +manage signatures felamimail fr Gérer les signatures +mark as deleted felamimail fr Marquer comme effacé +mark messages as felamimail fr Marquer les messages sélectionnés comme +mark selected as flagged felamimail fr Marquer le choix comme marqués +mark selected as read felamimail fr Marquer le choix comme lus +mark selected as unflagged felamimail fr Marquer le choix comme non-marqués +mark selected as unread felamimail fr Marquer le choix comme non-lus +match felamimail fr Correspond +matches felamimail fr correspond +matches regexp felamimail fr correspond +max uploadsize felamimail fr taille de dépôt maximale +message highlighting felamimail fr Mise en évidence de message +message list felamimail fr Liste des messages +messages felamimail fr Messages +mon felamimail fr Lun +move felamimail fr Déplacer +move messages felamimail fr Déplacer les messages +move selected to felamimail fr Déplacer le choix vers +move to trash felamimail fr Déplacer vers la Corbeille +moving messages to felamimail fr Déplacer les messages vers +name felamimail fr Nom +never display html emails felamimail fr Ne jamais afficher les messages HTML +new common fr Nouveau +new filter felamimail fr Nouveau filtre +next felamimail fr Suivant +next message felamimail fr Message suivant +no active imap server found!! felamimail fr Aucun serveur IMAP trouvé!! +no encryption felamimail fr pas de chiffrement +no filter felamimail fr Pas de filtre +no folders found felamimail fr Aucun dossier trouvé +no folders were found to subscribe to! felamimail fr Aucun dossier auquel s'inscrire n'a été trouvé! +no folders were found to unsubscribe from! felamimail fr Aucun dossier auquel se désinscrire n'a été trouvé! +no highlighting is defined felamimail fr Aucune mise en évidence n'est définie +no message returned. felamimail fr Aucun message retourné. +no messages found... felamimail fr Aucuns messages trouvés... +no messages were selected. felamimail fr Aucun message n'a été choisi. +no plain text part found felamimail fr aucune section texte plein trouvée +no previous message felamimail fr Pas de message précédent +no recipient address given! felamimail fr Il n'a pas d'adresse de destinataire +no signature felamimail fr pas de signature +no supported imap authentication method could be found. felamimail fr Aucune méthode d'authentification IMAP n'a été trouvée. +no valid emailprofile selected!! felamimail fr Aucun profil de messagerie selectionné! +none felamimail fr Aucun +on behalf of felamimail fr sur la base de +one address is not valid felamimail fr Une adresse n'est pas valide +only inbox felamimail fr Seulement INBOX +only one window felamimail fr Seulement une fenêtre +only unseen felamimail fr Seulement les non-vus +open all felamimail fr Tout ouvrir +options felamimail fr Options +or felamimail fr ou +organisation felamimail fr Entreprise +organization felamimail fr Entreprise +organization name admin fr Nom de l'entreprise +outgoing mail server(smtp) felamimail fr serveur de courrier sortant (SMTP) +participants felamimail fr Participants +personal information felamimail fr Informations personnelles +please select a address felamimail fr Sélectionner une adresse +please select the number of days to wait between responses felamimail fr Sélectionner le nombre de jours pour attendre entre les réponses +please supply the message to send with auto-responses felamimail fr Ecriver le message pour envoyer en réponse automatique +port felamimail fr port +posting felamimail fr Poster +previous felamimail fr Précédent +previous message felamimail fr Message précédent +print it felamimail fr Imprimes-la +print this page felamimail fr Imprimer cette page +quicksearch felamimail fr Recherche Rapide +read felamimail fr lu +reading felamimail fr Lire +receive notification felamimail fr Notification de réception +recent felamimail fr Récent +refresh time in minutes felamimail fr Temps de rafraîchissement en minutes +reject with felamimail fr rejecter avec +remove felamimail fr Enlever +remove immediately felamimail fr Enlever immédiatement +rename felamimail fr Renommer +rename a folder felamimail fr Renommer un dossier +rename folder felamimail fr Renommer le dossier +renamed successfully! felamimail fr Renommage réussi! +replied felamimail fr Répondu +reply felamimail fr Répondre +reply all felamimail fr Répondre à tous +reply to felamimail fr Répondre à +replyto felamimail fr Répondre A +respond felamimail fr Répondre +respond to mail sent to felamimail fr Répondre au courrier envoyé à +return felamimail fr Retourner +return to options page felamimail fr Retourner à la page des options +right felamimail fr Droit +row order style felamimail fr style d'ordonnancement de ligne +rule felamimail fr Règle +sat felamimail fr Sa +save felamimail fr Sauver +save as draft felamimail fr enregistrer comme brouillon +save as infolog felamimail fr enregistrer comme infolog +save changes felamimail fr enregistrer les modifications +save message to disk felamimail fr enregistrer le message sur le disque +script name felamimail fr nom du script +script status felamimail fr status du script +search felamimail fr Rechercher +search for felamimail fr Rechercher +select felamimail fr Sélectionner +select all felamimail fr Sélectionner tous +select emailprofile felamimail fr Sélectionner le profil de messagerie +select folder felamimail fr Sélectionner un dossier +select your mail server type admin fr Sélectionner votre type de serveur de messagerie +send felamimail fr Envoyer +send a reject message felamimail fr envoyez un message de rejet +sent folder felamimail fr Dossier contenant les messages envoyés +server supports mailfilter(sieve) felamimail fr le serveur support les filtres de messages (sieve) +show header felamimail fr Montrer les entêtes +show new messages on main screen felamimail fr Afficher les nouveaux messages sur l'écran principal +sieve script name felamimail fr nom du script sieve +sieve settings admin fr Réglages SIEVE +signature felamimail fr Signature +simply click the target-folder felamimail fr Cliquer sur le dossier de destination +size felamimail fr Taille +size of editor window felamimail fr Taille de la fenêtre d'édition +size(...->0) felamimail fr Taille (MAX -> 0) +size(0->...) felamimail fr Taille (0 -> MAX) +skipping forward felamimail fr saut en avant +skipping previous felamimail fr saut en arrière +small view felamimail fr Affichage réduit +smtp settings admin fr Réglages SMTP +subject felamimail fr Sujet +subject(a->z) felamimail fr Sujet (A->Z) +subject(z->a) felamimail fr Sujet (Z->A) +submit felamimail fr Soumettre +subscribe felamimail fr Souscrire +subscribed felamimail fr Souscrit +subscribed successfully! felamimail fr Souscrit avec succès! +sun felamimail fr Di +system signature felamimail fr signature systéme +table of contents felamimail fr Table des contenus +text only felamimail fr Texte seulement +the connection to the imap server failed!! felamimail fr La connexion au serveur IMAP a échoué!! +the imap server does not appear to support the authentication method selected. please contact your system administrator. felamimail fr Le serveur IMAP ne supporte pas la méthode d'authentification choisie. Veuillez contacter votre administrateur système. +the mimeparser can not parse this message. felamimail fr L'analyseur mime ne peut pas décoder ce message. +then felamimail fr ALORS +this folder is empty felamimail fr CE DOSSIER EST VIDE +this php has no imap support compiled in!! felamimail fr PHP n'est pas compilé avec le support IMAP! +thu felamimail fr Jeu +to felamimail fr A +to mail sent to felamimail fr au message envoyé à +to use a tls connection, you must be running a version of php 5.1.0 or higher. felamimail fr Pour utiliser une connexion TLS vous devez avoir PHP 5.1.0 ou supérieur. +translation preferences felamimail fr Préférences de traduction +translation server felamimail fr Serveur de traduction +trash fold felamimail fr Corbeille +trash folder felamimail fr Dossier Corbeille +tue felamimail fr Ma +type felamimail fr Type +unexpected response from server to authenticate command. felamimail fr Réponse inattendue du serveur à la commande AUTHENTICATE. +unexpected response from server to digest-md5 response. felamimail fr Réponse inattendue du serveur à la réponse Digest-MD5. +unexpected response from server to login command. felamimail fr Réponse inattendue du serveur à la commande LOGIN. +unflagged felamimail fr Dé-marqué +unknown err felamimail fr Erreur inconnue +unknown error felamimail fr Erreur inconnue +unknown imap response from the server. server responded: %s felamimail fr Réponse IMAP inconnue du serveur. Le serveur a répondu: %s +unknown sender felamimail fr Expéditeur inconnu +unknown user or password incorrect. felamimail fr Utilisateur inconnu ou mot de passe incorrect. +unread common fr Non-lu +unseen felamimail fr Non-lu +unselect all felamimail fr Désélectionner tout +unsubscribe felamimail fr Se désinscrire +unsubscribed felamimail fr Désinscrit +unsubscribed successfully! felamimail fr Désinscrit avec succès! +up felamimail fr Haut +updating message status felamimail fr mise à jour du statut des messages +updating view felamimail fr mise à jour des vues +use emailadmin to create profiles felamimail fr utiliser Admin mailpour créer les profiles +use a signature felamimail fr Utiliser une signature +use a signature? felamimail fr Utiliser une signature? +use addresses felamimail fr Utiliser les adresses +use custom settings felamimail fr Utiliser les préférences personnelles +use regular expressions felamimail fr Utiliser des expressions régulières +use smtp auth admin fr Utiliser l'authentification SMTP +users can define their own emailaccounts admin fr Les utilisateurs peuvent définir leurs propres comptes de messagerie +vacation notice common fr Notification de vacances +vacation notice is active felamimail fr La notice d'absence est activée +validate certificate felamimail fr valider le certificat +view full header felamimail fr Voir l'entête complet +view header lines felamimail fr voir les lignes d'entête +view message felamimail fr Voir message +viewing full header felamimail fr Visualise toutes les entêtes +viewing message felamimail fr Visualise le message +viewing messages felamimail fr Visualise les messages +wed felamimail fr Me +when deleting messages felamimail fr Quand j'efface les messages +with message felamimail fr avec message +with message "%1" felamimail fr avec message "%1" +wrap incoming text at felamimail fr Couper le texte entrant à +writing felamimail fr Ecrire +wrote felamimail fr Ecrivait diff --git a/felamimail/lang/egw_hr.lang b/felamimail/lang/egw_hr.lang new file mode 100644 index 0000000000..e3343d8a04 --- /dev/null +++ b/felamimail/lang/egw_hr.lang @@ -0,0 +1,811 @@ +%1 %2 in %3 calendar hr %1 %2 u %3 +%1 matches found calendar hr Prona.eno %1 podataka koji ispunjavaju kriterij +%1 records imported calendar hr Podataka %1 uneseno +%1 records read (not yet imported, you may go %2back%3 and uncheck test import) admin hr %1 zapisa pročitano (još nije uvezeno, možete se %2vratiti%3 i odznačiti Testiraj Uvoz) +%1 records read (not yet imported, you may go back and uncheck test import) calendar hr %1 podataka pročitano (još nije uneseno, možete se vratiti i deselektirati testno unošenje) +(e.g. 1969) admin hr (npr. 1969) +(for weekly) calendar hr (Za tjedno ponavljanje) +(i/v)cal calendar hr (i/v)Cal +(no subject) felamimail hr (nema teme) +(only cc/bcc) felamimail hr (samo Cc/Bcc) +(unknown sender) felamimail hr (nepoznat pošaljioc) +1 match found calendar hr Prona.en 1 zapis???????? +no conversion type <none> could be located. please choose a conversion type from the list admin hr Nema konverzijskog tipa <nema> nemogu locirati. Molim vas izaberite vrstu konverzije s liste +@-eval() is only availible to admins!!! admin hr @-eval() je dostupan samo administratorima!!! +a calendar hr a +accept calendar hr Prihvati +accepted calendar hr Prihva.eno +action that caused the notify: added, canceled, accepted, rejected, ... calendar hr Akcija čija je posljedica poruka: Dodano, Prekinuto, Primljeno, Odbijeno, ... +actions admin hr Akcije +activate felamimail hr Aktiviraj +activate script felamimail hr aktiviraj skriptu +add a single entry by passing the fields. calendar hr Dodaj jedan unos proslije.uju.i polja +add address felamimail hr Dodaj adresu +add alarm calendar hr Dodaj alarm +add contact calendar hr Dodaj kontakt +add custom field admin hr Dodaj proizvoljno polje +add or update a single entry by passing the fields. calendar hr Dodaj ili obnovi jedan unos proslije.uju.i polja. +add rule felamimail hr Dodaj pravilo +add script felamimail hr Dodaj skriptu +add to %1 felamimail hr Dodaj k %1 +add to address book felamimail hr Dodaj u adresar +add to addressbook felamimail hr dodaj u adrersar +added calendar hr Dodano +additional info felamimail hr Dodatne informacije +address book felamimail hr Adresar +address book - vcard in admin hr Adresar - VCard in +address book - view admin hr Adresar - pregled +address book search felamimail hr Pretraživanje adresara +address line 2 admin hr Adresa Linija 2 +address line 3 admin hr Adresa Linija 3 +address type admin hr Tip Adrese +addressbook common hr Adresar +addressbook preferences admin hr Postavke Adresara +addressbook-fieldname admin hr Adresar-Naziv polja +addvcard admin hr Dodaj VCard +after message body felamimail hr Nakon poruke +alarm calendar hr Alarm +alarm for %1 at %2 in %3 calendar hr Alarm za %1 pri %2 u %3 +alarm management calendar hr Upravljanje alarmom +alarm-management calendar hr Upravljanje-alarmom +alarms calendar hr Alarmi +all address books felamimail hr svi adresari +all day calendar hr Cijeli dan +all folders felamimail hr Sve mape +alt. csv import admin hr Alt. CSV Uvoz +always show html emails felamimail hr Uvijek prikaži HTML e-mailove +anyone felamimail hr svi +are you sure you want to delete this country ? calendar hr Da li ste sigurni da želite obrisati ovu zemlju? +are you sure you want to delete this field? admin hr Da li ste sigurni da želite obrisati ovo polje? +are you sure you want to delete this holiday ? calendar hr Da li ste sigurni da želite obrisati ovaj praznik? +are you sure\nyou want to\ndelete these alarms? calendar hr Da li ste sigurni da želite obrisati ovaj alarm? +are you sure\nyou want to\ndelete this entry ? calendar hr Da li ste sigurni da želite obrisati ovaj podatak? +are you sure\nyou want to\ndelete this entry ?\n\nthis will delete\nthis entry for all users. calendar hr Jeste li sigurni da želite obrisati ovaj zapis ?\n\nOvaj zapis .e biti obrisan za sve korisnike. +are you sure\nyou want to\ndelete this single occurence ?\n\nthis will delete\nthis entry for all users. calendar hr Da li ste sigurni da želite obrisati occurence ?\n\nOvaj zapis .e biti obrisan za sve korisnike. +as a subfolder of felamimail hr kao podmapa od +attachments felamimail hr Privitci +auto refresh folder list felamimail hr Automatsko obnavljavljanje liste mapa +back to folder felamimail hr Povratak u mapu +bad reque felamimail hr Nepravilno ponavljanje reda +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail hr U ovisnosti o danim uvjetima, ulazne poruke mogu imati različite podloge u listi poruka. Ovime lakše razlikujete od koga ste dobili poruke, posebno ukoliko ste na nekoj mail listi. +bbs phone admin hr BBS Telefon +bcc felamimail hr BCC +before headers felamimail hr Prije zaglavlja +before the event calendar hr prije obveze +between headers and message body felamimail hr Između zaglavlja i teksta poruke +birthday common hr Datum Ro.enja +birthdays common hr Ro.endani +blank admin hr Prazno +body part felamimail hr body part +brief description calendar hr Kratki opis +business calendar hr Poslovno +business address type admin hr Vrsta Poslovne Adrese +business city admin hr Tvrtka - Grad +business country admin hr Tvrtka - Država +business email admin hr Tvrtka - E-mail +business email type admin hr Tvrtka - Vrsta e-maila +business fax admin hr Tvrtka - Fax +business phone admin hr Tvrtka - Broj telefona +business state admin hr Tvrtka - Županija +business street admin hr Tvrtka - Ulica +business zip code admin hr Tvrtka - Poštanski broj +calendar common hr Kalendar +calendar - [iv]cal importer calendar hr Calendar - [iv]Cal Importer +calendar - add calendar hr Kalendar - Dodaj +calendar - edit calendar hr Kalendar - Obrada +calendar event calendar hr Kalendarska obveza +calendar holiday management admin hr ure.ivanje kalendarskih praznika +calendar preferences calendar hr Postavke kalendara +calendar settings admin hr Postavke kalendara +calendar-fieldname calendar hr Kalendar - Ime polja +can't connect to inbox!! felamimail hr nemogu se spojiti sa INBOX!! +canceled calendar hr Otkazano +car phone admin hr Telefon u Automobilu +cc felamimail hr CC +cell phone admin hr Mobilni telefon +change all events for $params['old_owner'] to $params['new_owner']. calendar hr Promijeni sve obveze od $params['old_owner'] u $params['new_owner']. +change folder felamimail hr Promijeni mapu +change status calendar hr Status promjene +charset of file calendar hr Charset of file +checkbox felamimail hr selektiraj +city common hr Grad +click %1here%2 to return to the calendar. calendar hr Pritisnite %1ovdje%2 za povratak u kalendar. +click here to log back in. felamimail hr Ponovni prijavak +click here to return to %1 felamimail hr Povratak na %1 +close all felamimail hr zatvori sve +close this page felamimail hr zatvori ovu stranicu +close window felamimail hr Zatvori prozor +color felamimail hr Boja +company common hr Tvrtka +company name common hr Naziv tvrtke +compose felamimail hr Pisanje nove poruke +compress folder felamimail hr Smanjii mapu +configuration felamimail hr Konfiguracija +contact common hr Kontakt +contact application admin hr Aplikacija kontakta +contact settings admin hr Podešenja kontakta +contains felamimail hr sadrži +copied by %1, from record #%2. admin hr Kopirao %1, iz zapisa #%2. +countries calendar hr Zemlje +country calendar hr Zemlja +create felamimail hr Napravi +create folder felamimail hr Napravi mapu +create sent felamimail hr Napravi poslano +create subfolder felamimail hr Napravi podmapu +create trash felamimail hr Napravi smeće +created by calendar hr Napravio +created folder successfully! felamimail hr Mapa uspješno napravljena +csv-fieldname calendar hr CSV-Ime polja +csv-filename calendar hr CSV-Ime datoteke +custom admin hr Proizvoljno +custom fields calendar hr Proizvoljna polja +custom fields and sorting common hr Proizvoljna polja i sortiranje +daily calendar hr Dnevno +daily matrix view calendar hr Dnevni matrični pregled +dark blue felamimail hr Tamno plavo +dark cyan felamimail hr Tamno cijan +dark gray felamimail hr Tamno sivo +dark green felamimail hr Tamno zeleno +dark magenta felamimail hr Tamno magenta +dark yellow felamimail hr Tamno žuto +date(newest first) felamimail hr po datumu (noviji prvo) +date(oldest first) felamimail hr po datumu (stariji prvo) +days calendar hr dana +days repeated calendar hr dana ponavljano +dayview calendar hr Dnevni pregled +deactivate script felamimail hr deaktiviraj skriptu +debug output in browser admin hr Prikaz poruka o izlaznim greškama unutar pretraživača +default appointment length (in minutes) calendar hr Početno vrijeme obveze (u minutama) +default calendar filter calendar hr Početna vrijednost kalendarskog filtra +default calendar view calendar hr Početni izgled kalendara +default filter admin hr Osnovni Filter +default length of newly created events. the length is in minutes, eg. 60 for 1 hour. calendar hr Početno postavljeno trajanje novostvorenih obveza. Trajanje je u minutama, tj. 60 za 1 sat +default sorting order felamimail hr Početno postavljen redoslijed sortiranja +defines the size in minutes of the lines in the day view. calendar hr Definira veličinu u minutama linija u dnevnom pregledu. +delete a single entry by passing the id. calendar hr Obriši jedan unos proslije.uju.i polja +delete all felamimail hr obriši sve +delete an entire users calendar. calendar hr Obriši korisnikov cijelokupni kalendar. +delete folder felamimail hr Obriši mapu +delete selected felamimail hr Obriši izabrano +delete selected contacts calendar hr Obriši izabrane kontakte +delete selected messages felamimail hr obriši izabrane poruke +delete series calendar hr Obriši serije +delete single calendar hr Obriši jedan +deleted felamimail hr obrisano +deleted folder successfully! felamimail hr Uspješno obrisana mapa +department common hr Odjel +description calendar hr Opis +disable felamimail hr Onemogući +disabled calendar hr Onesposobljeno +display interval in day view calendar hr Prikaži interval u dnevnom izgledu +display message in new window felamimail hr Prikaži poruku u novom prozoru +display mini calendars when printing calendar hr Prikaži smanjene kalendare prilikom ispisa +display of html emails felamimail hr Prikaz HTML emailova +display only when no plain text is available felamimail hr Prikaži samo u neprisutnosti običnog teksta +display preferences felamimail hr Prikaži postavke +display status of events calendar hr Prikaži status obveza +displays your default calendar view on the startpage (page you get when you enter egroupware or click on the homepage icon)? calendar hr Prikazuje vaš početno postavljen izgled kalendara na početnoj stranici (stranica koja se učita kada otvorite eGroupware ili kliknete na ikonu za početnu stranicu)? +do it! felamimail hr Učini to!! +do not use sent felamimail hr Ne upotrebljavaj mapu Poslano +do not use trash felamimail hr Ne upotrebljavaj mapu Smeće +do you really want to delete the '%1' folder? felamimail hr Da li zaista želite obrsati mapu: '%1'? +do you want to be notified about new or changed appointments? you be notified about changes you make yourself.
    you can limit the notifications to certain changes only. each item includes all the notification listed above it. all modifications include changes of title, description, participants, but no participant responses. if the owner of an event requested any notifcations, he will always get the participant responses like acceptions and rejections too. calendar hr Da li želite biti obaviješteni o novim ili promijenjenim obvezama? Biti .e te obaviješteni o promijenama kada ih sami napravite.
    Obavijesti možete ograničiti na samo o odre.ene promjene. Svaka obavijest uključuje doga.aje nabrojene gore. Sve promjene uključuju promjene naslova, opisa, sudionika, ali ne i odgovor sudionika. Ukoliko je vlasnik obveze zahtijevao neku obavijest, uvijek .e dobiti sudionikov odgovor poput prihvata ali i odbijanja. +do you want to receive a regulary summary of your appointsments via email?
    the summary is sent to your standard email-address on the morning of that day or on monday for weekly summarys.
    it is only sent when you have any appointments on that day or week. calendar hr Da li želite primati redoviti sažetak vaših obveza na vaš e-mail?
    Sažetak .e biti poslan na vašu e-mail adresu ujutro toga dana ili u ponedjeljak za tjedne sažetke.
    Sažetak .e biti poslan samo ako imate obvezu taj dan ili tjedan. +do you wish to autoload calendar holidays files dynamically? admin hr Da li želite dinamičko automatizirano punjenje datoteka za praznike? +does not contain felamimail hr ne sadrži +does not match felamimail hr nema podudarnosti +does not match regexp felamimail hr nema podudarnosti regexp +domestic admin hr Doma.i +don't use sent felamimail hr Ne upotrebljavaj Pošiljanje +don't use trash felamimail hr Ne upotrebljavaj Smeće +down felamimail hr dolje +download felamimail hr Prenesi sa poslužitelja +download export file (uncheck to debug output in browser) admin hr Preuzmi sa poslužitelja izvezenu datoteku (Odznači za prikaz poruka o izlaznim greškama unutar pretraživača) +download this as a file felamimail hr Prenesi sa poslužitelja kao datoteku +duration calendar hr Trajanje +e-mail felamimail hr E-Mail +e-mail address felamimail hr E-Mail adresa +e-mail folders felamimail hr E-Mail mapa +edit custom field admin hr Uredi proizvoljno polje +edit custom fields admin hr Uredi proizvoljna polja +edit filter felamimail hr Uredi filter +edit rule felamimail hr uredi pravilo +edit selected felamimail hr Uredi izabrano +edit series calendar hr Uredi serije +edit single calendar hr Uredi pojedinačan +email address felamimail hr E-Mail adresa +email notification calendar hr Obavijesti putem e-maila +email notification for %1 calendar hr Obavijesti o Emailu za %1 +email signature felamimail hr Email potpis +empty for all calendar hr isprazni za sve +empty trash felamimail hr isprazni Smeće +enable felamimail hr omogući +enabled calendar hr Omogu.eno +end date/time calendar hr Datum/Vrijeme kraja +enddate calendar hr Datum kraja +ends calendar hr Završava +enter output filename: ( .vcs appended ) calendar hr Unesite ime izlazne datoteke: ( .vcs nastavak ) +enter the path to the exported file here admin hr Unesi stazu do izvezene datoteke +enter your default mail domain ( from: user@domain ) admin hr Unesite vašu početno postavljenu domenu za poruke (format: korisnik@domena) +enter your imap mail server hostname or ip address admin hr Unesite ime vašeg IMAP poslužitelja ili IP adresu +enter your sieve server hostname or ip address admin hr Unesite ime vašeg SIEVE poslužitelja ili IP adresu +enter your sieve server port admin hr Unesite port vašeg SIEVE poslužitelja +enter your smtp server hostname or ip address admin hr Unesite ime vašeg SMTP poslužitelja ili IP adresu +enter your smtp server port admin hr Unesite port vašeg SMTP poslužitelja +error felamimail hr GREŠKA +error connecting to imap serv felamimail hr Greška prilikom spajanja na IMAP poslužitelj +error opening felamimail hr Greška prilikom otvaranja +event details follow calendar hr Slijede detalji obveze +exceptions calendar hr Iznimke +export calendar hr Export +export a list of entries in ical format. calendar hr Export a list of entries in iCal format. +export contacts admin hr Izvezi Kontakte +export file name admin hr Izvezi Datoteku +export from addressbook admin hr Izvezi iz Adresara +expunge felamimail hr Izbriši +extended calendar hr Produži +extended updates always include the complete event-details. ical's can be imported by certain other calendar-applications. calendar hr Prošireni updates uvijek uključuju potpune detalje o obvezama. iCal-ove datoteke mogu uvezesti i odre.ene kalendarske aplikacije. +external participants calendar hr Vanjski sudionici +extra admin hr Ekstra +failed sending message to '%1' #%2 subject='%3', sender='%4' !!! calendar hr Nisam uspio poslati poruku za '%1' #%2 subject='%3', sender='%4' !!! +fax admin hr Fax +fax number common hr Fax - Broj +felamimail common hr FelaMiMail +field %1 has been added ! admin hr Polje %1 je dodano ! +field %1 has been updated ! admin hr Polje %1 ažurirano ! +field name admin hr Ime Polja +fields to show in address list admin hr Polja za prikazati u listi adresa +fieldseparator calendar hr Razmaknica polja +file into felamimail hr informacije o datoteci +files felamimail hr datoteke +filter active felamimail hr aktivni filtri +filter name felamimail hr Ime filtra +first name felamimail hr Ime +firstname of person to notify calendar hr Ime osobe za obavijestiti +flagged felamimail hr flagged +flags felamimail hr Flags +folder acl felamimail hr acl mapa +folder name felamimail hr Ime mape +folder path felamimail hr Folder Path +folder preferences felamimail hr Postavke mape +folder settings felamimail hr Postavke mape +folder status felamimail hr Status mape +folderlist felamimail hr Lista mapa +foldername felamimail hr Ime mape +folders felamimail hr Mape +folders created successfully! felamimail hr Mape napravljene uspješno! +follow felamimail hr prati +for mail to be send - not functional yet felamimail hr Slanje pošte još nije u funkciji +for received mail felamimail hr Za primljenu poštu +format of event updates calendar hr Ažuriranje formata ili doga.aja +forward felamimail hr Proslijedi +found felamimail hr Pronađeno +fr calendar hr P +free/busy calendar hr Obveze +freebusy: unknow user '%1', wrong password or not availible to not loged in users !!! calendar hr Obveze: Nepoznat korisnik '%1', pogrešna zaporka ili nije dostupno neprijavljenim korisnicima !!! +frequency calendar hr Frekvencija / Učestalost +fri felamimail hr Pet +from felamimail hr Pošaljitelj +from(a->z) felamimail hr po pošaljitelju (silazno A->Z) +from(z->a) felamimail hr po pošaljitelju (uzlazno Z->A) +full description calendar hr Puni opis +full name felamimail hr Puno ime +fullname of person to notify calendar hr Puno ime osobe za obavijestiti +generate printer-friendly version calendar hr Verzija za ispis +geo admin hr GEO +global categories calendar hr Globalne kategorije +global public and group public calendar hr Global Public and group public +global public only calendar hr Samo javno globalno +go! calendar hr Kreni! +grant addressbook access common hr Dozvole Pristupa Adresaru +grant calendar access common hr Dozvoli pristup kalendaru +group planner calendar hr Grupni planer +group public only calendar hr Samo javna grupa +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail hr Pogledajte www.felamimail.org da bi naučili nešto više o Squirrelmail.
    +header lines felamimail hr Linije zaglavlja +here is your requested alarm. calendar hr Ovo je vaš zahtijevani alarm +hide header felamimail hr sakrij zaglavlje +high priority calendar hr Visoki prioritet +holiday calendar hr Praznik +holiday management calendar hr Ure.ivanje praznika +holiday-management calendar hr Upravljanje praznicima +holidays calendar hr Praznici +home address type admin hr Vrsta doma.e adrese +home city admin hr Osobno - Grad +home country admin hr Osobno - Država +home email admin hr Osobno - Email +home email type admin hr Osobno - vrsat Email +home phone admin hr Osobno - Telefon +home state admin hr Osobno - Županija +home street admin hr Osobno - Ulica +home zip code admin hr Osobno - Poštanski broj +hours calendar hr sati +html felamimail hr HTML +i participate calendar hr Sudjelujem +ical / rfc2445 calendar hr iCal / rfc2445 +icons and text felamimail hr Ikone i tekst +icons only felamimail hr Samo ikone +identifying name felamimail hr Ime za prepoznavanje +if felamimail hr AKO +if checked holidays falling on a weekend, are taken on the monday after. calendar hr ukoliko izabrani, praznici koji padaju na subotu ili nedjelju, primjenjuju se na slijede.i ponedjeljak. +if you dont set a password here, the information is availible to everyone, who knows the url!!! calendar hr Ukoliko tu ne postavite zaporku, ova informacija je dostupna svima koji poznaju URL!!! +ignore conflict calendar hr Zanemari sukob +illegal folder name. please select a different name. felamimail hr Nažalost nemožete koristiti unešeno ime. Molimo vas unesite drugo ime za mapu. +imap felamimail hr IMAP +imap server felamimail hr IMAP Poslužitelj +imap server address felamimail hr IMAP Adresa poslužitelja +imap server type felamimail hr IMAP vrsta poslužitelja +imaps authentication felamimail hr IMAPS provjera valjnanosti +imaps encryption only felamimail hr Samo IMAPS enkripcija +import calendar hr Uvezi +import contacts admin hr Uvezi Kontakte +import csv-file common hr Uvezi CSV-File +import csv-file into addressbook admin hr Uvezi CSV-Datoteku u Adresar +import file admin hr Uvezi Datoteku +import from ldif, csv, or vcard admin hr Uvezi iz LDIF, CSV, ili VCard +import from outlook admin hr Uvezi iz Outlook +import next set admin hr Uvezi slijede.i set +import_instructions admin hr U Netscape, otvori Adresar i izaberi Export iz File menija. Izvezena datoteka biti .e u LDIF formatu.

    Ili, u Outlook, izaberite vaš Contacts mapu, izaberite Import and Export... iz File menija i izvezite vaše kontakte u tekst razmaknut zarezom (comma separated text (CSV)) datoteku.

    Ili, u Palm Desktop 4.0 ili više, izaberite vaš adresar i izaberite Export iz File menija. Izvezena datoteka biti .e u VCard formatu. +in felamimail hr u +in order for squirrelmail to provide the full set of options you need to create the special folders listed below. just click the check box and hit the create button. felamimail hr Kako bi SquirelMail ponudio sve mogućnosti morate ispod napraviti posebnu listu mapa. Samo označite i izaberite "napravi". +in the center felamimail hr u centru +index order felamimail hr Redoslijed indeksa +info felamimail hr Informacije +international admin hr Me.unarodni +interval calendar hr Interval +intervals in day view calendar hr intervali u dnevnom pregledu +intervals per day in planner view calendar hr intervali po danu u planerskom preledu +invalid entry id. calendar hr Nevaže.i unos indetiteta +invalid user name or password felamimail hr Nevaljani korisnik ili zaporka +isdn phone admin hr ISDN Telefon +javascript felamimail hr JavaScript +label admin hr LAbela +language felamimail hr Jezik +last calendar hr poslijednji +last name felamimail hr Prezime +lastname of person to notify calendar hr Prezime osobe za obavijestiti +ldap context for contacts admin hr LDAP kontekst za kontakte +ldap host for contacts admin hr LDAP poslužitelj za kontakte +ldap root dn for contacts admin hr LDAP root dn for contacts +ldap root pw for contacts admin hr LDAP root pw for contacts +ldif admin hr LDIF +left felamimail hr Lijevo +length shown
    (emtpy for full length) calendar hr Pruikazana dužina
    (Ostavite prazno za punu dužinu) +length
    (<= 255) calendar hr Dužina
    (<= 255) +less felamimail hr manje +let this folder contain subfolders felamimail hr Ova mapa smije sadržavati podmape +light blue felamimail hr Svijetlo plavo +light cyan felamimail hr Svijetlo cijan +light gray felamimail hr Svijetlo sivo +light green felamimail hr Svijetlo zeleno +light magenta felamimail hr Svijetlo magenta +light yellow felamimail hr Svijetlo žuto +line 2 admin hr Linija 2 +link calendar hr Link +link to view the event calendar hr Link to view the event +list all felamimail hr Prikaži sve +list all categories. calendar hr Prikaži sve kategorije. +load [iv]cal calendar hr Unesi [iv]Cal +location calendar hr Lokacija +location of buttons when composing felamimail hr Lokacija buttons prilikom pisanja poruke +location of folder list felamimail hr Lokacija liste mapa +location to autoload from admin hr Lokacija za automatsko unošenje forme +mail server login type admin hr Vrsta prijave mail poslužitelja +mail settings felamimail hr Postavke pošte +mainmessage felamimail hr glavna poruka +make freebusy information availible to not loged in persons? calendar hr Omogu.i pristup informacijama o obvezama korisnicima koji nisu prijavljeni +manage folders felamimail hr Uređivanje mapa +manage sieve felamimail hr Uređivanje Sieve skripti +mark as deleted felamimail hr Označi obrisanim +mark messages as felamimail hr Označi izabranu poruku kao +mark records as private admin hr Označi podatak kao privatan +mark selected as flagged felamimail hr Označi izabrano kao flagged +mark selected as read felamimail hr Označi izabrano pročitanim +mark selected as unflagged felamimail hr Označi izabrano kao unflagged +mark selected as unread felamimail hr Označi izabrano nepročitanim +match felamimail hr Pronađi podudarnosti +matches felamimail hr podudarnosti +matches regexp felamimail hr podudara se sa regexp +matrixview calendar hr Matrični pregled +medium gray felamimail hr Srednje sivo +message felamimail hr Poruka +message highlighting felamimail hr Istaknuto u poruci +message list felamimail hr Lista poruka +message phone admin hr Telefon za poruke +messages felamimail hr poruke +middle name admin hr Srednje Ime +minute felamimail hr Minuta +minutes felamimail hr Minute +mo calendar hr P +mobile admin hr Mobilni +mobile phone admin hr Mobilni Telefon +modem phone admin hr Modemski Telefon +modified calendar hr Promijenjeno +modify list of external participants calendar hr Promijeni listu vanjskih sudionika +mon felamimail hr Pon +month calendar hr Mjesec +monthly calendar hr Mjesečno +monthly (by date) calendar hr Mjesečno (po datumima) +monthly (by day) calendar hr Mjesečno (po danima) +monthview calendar hr Mjesečni pregled +more felamimail hr još (više) +move felamimail hr premjesti +move messages felamimail hr premjesti poruku +move selected to felamimail hr premjesti izabrano u +move to trash felamimail hr Premjesti u Smeće +must be unique felamimail hr Mora biti jedinstven +name felamimail hr Ime +never display html emails felamimail hr Nikad ne prikaži HTML emailove +new common hr Novo +new entry calendar hr Novi unos +new filter felamimail hr Novi filter +new name must not exist and not be empty!!! calendar hr Novo ime ne smije ve. postojati i ne smije biti prazno!!! +next felamimail hr Slijedeće +next message felamimail hr slijedeća poruka +nickname felamimail hr Nadimak +no filter felamimail hr Nema filtera +no folders found felamimail hr Nisam našao mapu(e) +no folders were found to subscribe to! felamimail hr Nisam našao mape za pretplatu! +no folders were found to unsubscribe from! felamimail hr Nisam našao mape za odjaviti pretplatu! +no highlighting is defined felamimail hr Nije definirano ništa za istaknuti u poruci +no matches found calendar hr Nemogu na.i podudarnosti +no messages were selected. felamimail hr Niste izabrali nijednu poruku +no next message felamimail hr Nema više slijedećih poruka +no notification felamimail hr Bez obavijesti +no personal address book is defined. contact administrator. felamimail hr Ne postoji osobni adresar. Kontaktirajte vašeg administratora. +no persons matching your search was found felamimail hr Nisam našao osobe koje se podudaraju sa vašom pretragom +no previous message felamimail hr Nema više prethodnih poruka +no response calendar hr Nema odgovora +no valid emailprofile selected!! felamimail hr Izabrani profil nije važeći!! +no vcard admin hr Bez VCard +none felamimail hr nikakav +notification messages for added events calendar hr Obavještavaju.a poruka o dodanim obvezama +notification messages for canceled events calendar hr Obavještavaju.a poruka o otkazanim obvezama +notification messages for modified events calendar hr Obavještavaju.a poruka o promijenjenim obvezama +notification messages for your alarms calendar hr Obavještavaju.a poruka o vašim alarmima +notification messages for your responses calendar hr Obavještavaju.a poruka o vašim odgovorima +number of intervals per day in planner view calendar hr Broj intervala po danu u pogledu planera +number of messages to index felamimail hr Proj poruka za indeksirati +number of months calendar hr Broj mjeseci +number of records to read (%1) calendar hr Broj zapisa za pročitati (%1) +observance rule calendar hr Pravilo nadgledanja +occurence calendar hr Učestalost +old startdate calendar hr Stari datum početka +olddate calendar hr Stari datum +on %1 %2 %3 your meeting request for %4 calendar hr On %1 %2 %3 your meeting request for %4 +on all changes calendar hr Za bilo koju promjenu +on all modification, but responses calendar hr Za sve promjene, ali i odgovore +on any time change too calendar hr Za bilo koju promjenu vremena +on behalf of felamimail hr u ime +on invitation / cancelation only calendar hr Samo za poziv / otkaz +on participant responses too calendar hr Prlikomi odgovora sudionika +on time change of more than 4 hours too calendar hr Prlikomi promjeei vremena više od 4 sata +only inbox felamimail hr Samo INBOX +only unseen felamimail hr Samo neviđene +open all felamimail hr otvori sve +open todo's: calendar hr Open To Do Items: +options felamimail hr Opcije +order calendar hr Naredba +organisation felamimail hr organizacija +organization felamimail hr organization +organization name admin hr Ime organizacije +oth felamimail hr Oth +other number admin hr Drugi broj +other phone admin hr Drugi telefon +overlap holiday calendar hr overlap holiday +pager common hr Pager +parcel admin hr paketski +participant calendar hr Sudionik +participants felamimail hr Sudionici +participates calendar hr Sudjeluje +password for not loged in users to your freebusy information? calendar hr Zaporka za neprijavljene korisnike za vaše informacije o obvezama? +people holiday calendar hr državni praznik +permission denied calendar hr Uskra.ena dozvola +personal information felamimail hr Osobne informacije +phone number common hr Broj Telefona +phone numbers common hr Brojevi Telefona +planner calendar hr Planer +planner by category calendar hr Planer po kategoriji +planner by user calendar hr Planer po korisniku +please confirm,accept,reject or examine changes in the corresponding entry in your calendar calendar hr Molimo vas potvrdite, prihvatite, odbijte ili pregledajte promjene u odgovaraju.em unosu u vašem kalendaru +please enter a filename !!! calendar hr Molimo vas unesite ime datoteke!!! +please enter a name for that field ! admin hr Molim vas unesite naziv za to polje ! +postal common hr Poštanski +posting felamimail hr posting +pref admin hr pref +preference file %1 not found. exiting abnormally felamimail hr Datoteka o postavkama %1 nije nađena. ------------------ +preference file, %1, does not exist. log out, and log back in to create a default preference file. felamimail hr Datoteka o postavkama, %1, ne postoji. Odjavite se i ponovo prijavite radi stvaranja početne datoteke postavki. +prefix admin hr Prefiks +preselected group for entering the planner calendar hr Predizabrana grupa za unos planera +previous felamimail hr Prijašnja +previous message felamimail hr prijašnja poruka +print calendars in black & white calendar hr Ispis crno bijelog kalendara +print it felamimail hr ispiši +print the mini calendars calendar hr Ispis smanjenih kalendara +print this page felamimail hr ispiši ovu stanicu +printer friendly calendar hr Verzija za ispis +privat calendar hr Privatno +private and global public calendar hr Private and Global Public +private and group public calendar hr Private and Group Public +private only calendar hr Samo privatno +public key admin hr Javni ključ +purge felamimail hr izbriši +quicksearch felamimail hr Brza pretraga +re-edit event calendar hr Ponovo uredi obvezu +read felamimail hr pročitaj +read a list of entries. calendar hr Pročitaj listu svih unosa +read a single entry by passing the id and fieldlist. calendar hr Pročitaj jedan zapis proslije.uju.i šifru i listu polja +read da felamimail hr Pročitaj da +read this list of methods. calendar hr Pročitaj listu metoda +reading felamimail hr čitam +reason giv felamimail hr Razlog Giv +receive email updates calendar hr Receive email updates +receive extra information in event mails calendar hr Receive extra information in event mails +receive summary of appointments calendar hr Primi sažetak obveza +recent felamimail hr nedavni +record access admin hr Pristup Podacima +record owner admin hr Vlasnik Podataka +recurring event calendar hr ponavljaju.a obveza +refresh calendar hr Obnovi +refresh folder list felamimail hr obnovi listu mapa +refresh page felamimail hr Obnovi stranicu +refresh time in minutes felamimail hr Obnovi vrijeme u minutama +reinstate calendar hr Ponovi postavi +rejected calendar hr Odbijeno +remove felamimail hr makni +remove immediately felamimail hr Obriši odmah +rename felamimail hr Preimenuj +rename a folder felamimail hr Preimenuj mapu +rename folder felamimail hr Preimenuj mapu +renamed successfully! felamimail hr Uspješno preimenovano +repeat day calendar hr Ponovi na dan +repeat end date calendar hr Krajnji datum ponavljanja +repeat type calendar hr Tip ponavljanja +repeating event information calendar hr Informacije o ponavljaju.oj obvezi +repetition calendar hr Ponavljanje +repetitiondetails (or empty) calendar hr Detalji ponavljanja (ili prazno) +replied felamimail hr odgovoreno +reply felamimail hr Odgovori +reply all felamimail hr Odgovori svima +reply to felamimail hr Odgovori +replyto felamimail hr Odgovori +reset calendar hr Postavi ponovo +retrieve contacts admin hr Ispravi kontakte +return felamimail hr Povratak +return to options page felamimail hr Povratak na stranicu opcija +right felamimail hr Desno +rule felamimail hr Pravilo +running squirrelmail version %1 (c) 1999-2000. felamimail hr Pokrećem SquirrelMail verziju %1 (c) 1999-2000. +sa calendar hr Su +same window - not functional yet felamimail hr Isti prozor - još nije u funkciji +sat felamimail hr Sub +save felamimail hr Spremi +scheduling conflict calendar hr Sukob u rasporedu +search felamimail hr Potraga +search for felamimail hr Traži +search results calendar hr Rezultat pretrage +seconds felamimail hr Sekunde +select felamimail hr Izaberite +select all felamimail hr Izaberite sve +select emailprofile felamimail hr Izabertei e-mail profil +select home email address felamimail hr Izaberite kućnu e-mail adresu +select the type of conversion admin hr Izaberite vrstu konverzije +select the type of conversion: admin hr Izaberite vrstu konverzije: +select where you want to store admin hr Izaberite gdje želite spremiti +select work email address felamimail hr Izaberite poslovnu e-mail adresu +select your mail server type admin hr Izaberte vrstu mail poslužitelja +selected contacts (%1) calendar hr Izabrani kontakti (%1) +send felamimail hr Pošalji +send updates via email common hr Send updates via EMail +send/receive updates via email calendar hr Send/Receive updates via EMail +sent fold felamimail hr Pošalji mapa +sent folder felamimail hr Mapa poslano +server respond felamimail hr Odgovor poslužitelja +set a year only for one-time / non-regular holidays. calendar hr Set a Year only for one-time / non-regular holidays. +set new events to private calendar hr Postavi nove doga.aju u privatno +should invitations you rejected still be shown in your calendar ?
    you can only accept them later (eg. when your scheduling conflict is removed), if they are still shown in your calendar! calendar hr Da li .e pozivi koje ste odbili i dalje biti prikazani u vašem kalendaru?
    Možete ih prihvatiti kasnije (tj. kada su sukobi u rasporedu riješeni), ako su još uvijek prikazani u vašem kalendaru! +should new events created as private by default ? calendar hr Trebaju li se nove obvezei postaviti kao privatne? +should not loged in persons be able to see your freebusy information? you can set an extra password, different from your normal password, to protect this informations. the freebusy information is in ical format and only include the times when you are busy. it does not include the event-name, description or locations. the url to your freebusy information is %1. calendar hr Da li želite da neprijavljenji korisnici vide informacije o vašim obvezama? Možete dodati još jednu dodatnu zaporku, različitu od vaše uobičajne zaporke, radi zaštite vaših informacija. Informacije o vašim obvezama su u iCal formatu i uključuju samo vremena kada ste zauzeti. Ne uključuje ime doga.aja, opis ili lokaciju. URL informacija o vašim obvezama je: %1. +should the mini calendars by printed / displayed in the printer friendly views ? calendar hr Da li .e se smanjeni kalendari ispisati / prikazati u verziji za ispis? +should the printer friendly view be in black & white or in color (as in normal view)? calendar hr Da li .e se verzija za ispis prikazati crno-bijelo ili u boji? +should the status of the event-participants (accept, reject, ...) be shown in brakets after each participants name ? calendar hr Da li bi se status sudionika obveze (prihva.en, odbijen, ...) trebao prikazati nakon imena sudionika u zagradama? +show birthday reminders on main screen admin hr Pokaži ro.endanske podsjetnike na glavnom ekranu +show day view on main screen calendar hr Prikaži dnevni prikaz na glavnom ekranu +show default view on main screen calendar hr Prikaži početno postavljeni prikaz na glavnom ekranu +show header felamimail hr prikaži zaglavlje +show high priority events on main screen calendar hr Prikaži obveze visokog prioriteta na glavnom ekranu +show invitations you rejected calendar hr Prikaži odbijene pozive +show list of upcoming events calendar hr Prikaži listu dolaze.ih obvezama +show new messages on main screen felamimail hr Prikaži novu poruku na glavnom ekranu +sieve settings admin hr Postavke Sieve +signature felamimail hr Potpis +simply click the target-folder felamimail hr Samo izaberite ciljanu mapu +single event calendar hr jedna obveza +size felamimail hr Veličina +size of editor window felamimail hr Veličina prozora za uređivanje +size(...->0) felamimail hr po veličini (silazno ...->0) +size(0->...) felamimail hr po veličini (uzlazno 0->...) +small view felamimail hr smanji pogled +smtp settings admin hr Postavke SMTP +some or all of the help documents are not present! felamimail hr Nedostaju neke ili sve datoteke za pomoć! +sorry, the owner has just deleted this event calendar hr Žao mi je, vlasnik je upravo obrisao ovu obvezu +sorry, this event does not exist calendar hr Nažalost, ova obveza ne postoji +sorry, this event does not have exceptions defined calendar hr Žao mi je, ova obveza nema definirane iznimke +sort by calendar hr Poredaj po +source felamimail hr Izvor +special folder options felamimail hr Posebne mogućnosti sa mapama +specifies the the number of intervals shown in the planner view. calendar hr Specificira broj intervala prikazanih u pregledu planera. +squirrelmail felamimail hr Squirrelmail +start date/time calendar hr Datum/vrijeme početka +start- and enddates calendar hr Početni i krajnji datumi +startdate calendar hr Datum početka +startrecord calendar hr Početak zapisa +state common hr Županija +street common hr Ulica +su calendar hr Ne +subject felamimail hr Tema +subject(a->z) felamimail hr po temi (silazno A->Z) +subject(z->a) felamimail hr po temi (uzlazno Z->A) +submit felamimail hr Pošalji +submit to repository calendar hr Submit to Repository +subscribe felamimail hr Pretplata +subscribed felamimail hr Pretplaćen +subscribed successfully! felamimail hr Uspješno ste pretplaćeni! +successfully imported %1 records into your addressbook. admin hr Uspješno uneseno %1 zapis(a) u vaš Adresar. +successfully saved display preferences! felamimail hr Uspješno spremljene postavke prikaza! +successfully saved folder preferences! felamimail hr Uspješno spremljene postavke mapa! +successfully saved personal information! felamimail hr Uspješno spremljene osobne informacije! +suffix admin hr Sufiks +sun felamimail hr Ned +switch current folder to felamimail hr promijeni trenutnu mapu u +table of contents felamimail hr Tabela sadržaja +tentative calendar hr Probni +test import (show importable records only in browser) calendar hr Test Import (show importable records only in browser) +text calendar hr Tekst +text only felamimail hr Samo tekst +th calendar hr . +that field name has been used already ! admin hr Ovaj naziv polja je ve. u upotrebi ! +the connection to the imap server failed!! felamimail hr Neuspjelo spajanje na IMAP poslužitelja!! +the following conflicts with the suggested time:

      %1
    calendar hr Slijede.e se koosi sa predloženim vremenom:
      %1
    +the help has not been translated to %1. it will be displayed in english instead. felamimail hr Pomoć nije prevedena na %1. Biti će prikazana na engleskom. +the index order is the order that the columns are arranged in the message index. you can add, remove, and move columns around to customize them to fit your needs. felamimail hr Indeks redoslijeda je redoslijed rasporeda kolona u indeksu poruka. Možete dodati, maknuti, i pomaknuti kolumne po vlastitom nahođenju +the order of the message index can be rearanged and changed to contain the headers in any order you want. felamimail hr Redoslijed indeksa poruka se može promijeniti tako da sadrži zaglavlja u redoslijedu kakvim vi želite. +the user %1 is not participating in this event! calendar hr Korisnik %1 ne sudjeluje o ovoj obvezi! +theme felamimail hr Tema +then felamimail hr TADA +there was an error trying to connect to your news server.
    please contact your admin to check the news servername, username or password. calendar hr Dogodila se greška prilikom spajanja na vašeg poslužitelja vijesti.
    Molimo vas kontaktirajte vašeg administratora, radi provjere imena posljužitelja, korisničkog imena i zaporke. +these settings change the way your folders are displayed and manipulated. felamimail hr Ovim postavkama mijenjate način na koji se prikazuju vaše mape i kako ih uređujete. +this contains personal information about yourself such as your name, your email address, etc. felamimail hr Ovdije su sdržane vaše osobne informacije poput imena, e-maila, i sl. +this day is shown as first day in the week or month view. calendar hr Ovaj dan je prikazan kao prvi dan u tjednu u mjesečnom pregledu. +this defines the end of your dayview. events after this time, are shown below the dayview. calendar hr Ovdje odre.ujete kraj vašeg dnevnog pregleda. Obveze koje su poslije ovog vremena prikazane su ispod vašeg dnevnog pregleda. +this defines the start of your dayview. events before this time, are shown above the dayview.
    this time is also used as a default starttime for new events. calendar hr Ovdje odre.ujete početak vašeg dnevnog pregleda. Obveze prije ovog vremena su prikazane iznad vašeg dnevnog pregleda.
    Ovo vrijeme se tako.er koristi kao početna vrijednost početka novih obveza. +this folder is empty felamimail hr OVA MAPA JE PRAZNA +this group that is preselected when you enter the planner. you can change it in the planner anytime you want. calendar hr Ova grupa je predizabrana kada u.ete u planer. Možete je promijeniti u planeru kad god ho.ete. +this is mostly caused by a not or wrongly configured smtp server. notify your administrator. calendar hr Uzrok ovoga je vjerovatno nepodešen ili loše podešen SMTP server. Obavijestite vašeg administratora. +this message is sent for canceled or deleted events. calendar hr Ova poruka je poslana za otkazane ili obrisane obveze. +this message is sent for modified or moved events. calendar hr Ova poruka je poslana za promijenjene ili pomaknute obveze. +this message is sent to every participant of events you own, who has requested notifcations about new events.
    you can use certain variables which get substituted with the data of the event. the first line is the subject of the email. calendar hr Ova poruka je poslana svim sudionicima u obvezama koje posjedujete, a koji zahtijevaju poruku o novim doga.ajima.
    Možete upotrijebiti odre.ene varijable koje su zamijenjene sa podacima o obvezi. Prva linija je tema e-mail poruke. +this message is sent when you accept, tentative accept or reject an event. calendar hr Ova poruka se šalje kada prihvatite, probno prihvatite ili odbijete neku obvezu. +this message is sent when you set an alarm for a certain event. include all information you might need. calendar hr Ova poruka se šalje kada postavite alarm za odre.ene obveze. Uključite sve informacije koje bi mogli zatrebati. +this month calendar hr Ovog mjeseca +this person's first name was not in the address book. admin hr Ime ove osobe nije u Adresaru. +this person's last name was not in the address book. admin hr Prezime ove osobe nije u Adresaru. +this php has no imap support compiled in!! felamimail hr Ovaj PHP nema ugrađenu podršku za IMAP!! +this port is based on squirrelmail, which is a standalone imap client.
    felamimail hr Ovaj port se bazira na Squirrelmail-u, koji je samostalni klijent za IMAP.
    +this week calendar hr Ovog tjedna +this year calendar hr Ove godine +thu felamimail hr Čet +title calendar hr Naslov +title of the event calendar hr Ime obveze +title-row calendar hr Title-row +to felamimail hr Za +to many might exceed your execution-time-limit calendar hr to many might exceed your execution-time-limit +to the left felamimail hr prema lijevo +to the right felamimail hr prema desno +to-firstname calendar hr Prema - Imenu +to-fullname calendar hr Prema - Imenu i prezimenu +to-lastname calendar hr Prema - Prezimenu +today calendar hr Danas +today is %1's birthday! common hr Danas je %1's ro.endan! +tomorrow is %1's birthday. common hr Sutra je %1's ro.endan. +top felamimail hr Vrh +translation calendar hr Prijevod +translation location felamimail hr Lokacija prijevoda +translation preferences felamimail hr Postavke prijevoda +translation server felamimail hr Poslužitelj prijevoda +trash fold felamimail hr Mapa Smeće +trash folder felamimail hr Mapa Smeće +tu calendar hr U +tue felamimail hr Uto +type felamimail hr vrsta (tip) +unable to list addresses from %1 felamimail hr Nemogu prikazati adrese iz %1 +unflagged felamimail hr unflagged +unknown err felamimail hr Nepoznata greška +unknown error felamimail hr Nepoznata greška +unknown sender felamimail hr Pošiljatelj nepoznat +unknown user or password incorrect. felamimail hr Nepoznat korisnik ili nevažeća zaporka. +unread common hr nepročitano +unseen felamimail hr Neviđeno +unseen and total felamimail hr Neviđeno i ukupno +unseen message notification felamimail hr Obavijest o neviđenim porukama +unseen message notification type felamimail hr Vrsta obavijesti o neviđenim porukama +unselect all felamimail hr Odizaberi sve +unsubscribe felamimail hr Odpretplata +unsubscribed felamimail hr Odpretplaćen +unsubscribed successfully! felamimail hr Uspiješan prekid pretplate! +up felamimail hr gore +update a single entry by passing the fields. calendar hr Update a single entry by passing the fields. +update address felamimail hr Obnovi adresu +updated calendar hr Updated +use a signature felamimail hr Upotrijebi potpis +use a signature? felamimail hr Upotrijebi potpis? +use addresses felamimail hr Upotrijebi adresu +use country list admin hr Upotrijebi listu zemalja +use custom settings felamimail hr Upotrijebi prilagođene postavke +use end date calendar hr Upotrijebi krajnji datum +use javascript or html addressbook? felamimail hr Upotrijebi Javascript ili HTML adresar? +use smtp auth admin hr Upotrijebi SMTP autorizaciju +users can define their own emailaccounts admin hr Korisnici mogu sami definirati svoje e-mail račune +vcard common hr VCard +vcards require a first name entry. admin hr VCard zahtijevaju unos imena +vcards require a last name entry. admin hr Vcard zahtijevaju unos prezimena +video phone admin hr Video telefon +view full header felamimail hr Prikaži cijelo zaglavlje +view message felamimail hr Prikaži poruku +view this entry calendar hr Prikaži ovaj unos +viewing full header felamimail hr Prikazujem cijelo zaglavlje +viewing message felamimail hr Prikazujem poruku +viewing messages felamimail hr Prikazujem poruku +voice phone admin hr Glasovni telefon +warning!! ldap is valid only if you are not using contacts for accounts storage! admin hr UPOZORENJE!! LDAP je valjan samo ako NE upotrebljavate kontakte za spremanje korisničkih računa! +we calendar hr S +wed felamimail hr Sri +week calendar hr Tjedan +weekday starts on calendar hr Početak radnog tjedna +weekly calendar hr Tjedno +weekview calendar hr Tjedni pregled +welcome to %1's webmail system felamimail hr Dobrodošli u %1-ov WebMail sustav +when creating new events default set to private calendar hr Prilikom stvaranja novih obveza početno postavi na privatno +when deleting messages felamimail hr Prilikom brisanja poruka +which events do you want to see when you enter the calendar. calendar hr Koje obveze želite vidjeti kada otvorite kalendar. +which of calendar view do you want to see, when you start calendar ? calendar hr Koji kalendarski pregled želite imati kada pokrenete kalendar ? +white felamimail hr Zapiši +width of folder list felamimail hr Širina liste mapa +work day ends on calendar hr Radni dan završava u +work day starts on calendar hr Radni dan počinje u +work phone admin hr Telefon na poslu +workdayends calendar hr Kraj radnog tjedna +wrap incoming text at felamimail hr Omotaj ulazni tekst pri +writing felamimail hr zapisujem +wrote felamimail hr zapisano (zapisao je) +yearly calendar hr Godišnje +yearview calendar hr Godišnji pregled +you can change the way that squirrelmail looks and displays information to you, such as the colors, the language, and other settings. felamimail hr Možete promijeniti način na koji SquirelMail izgleda i prikazuje informacije poput boje, jezika ili drugih postavki. +you can either set a year or a occurence, not both !!! calendar hr You can either set a Year or a Occurence, not both !!! +you can only edit one address at the time felamimail hr Možete urediti samo jednu adresu istovremeno. +you can only set a year or a occurence !!! calendar hr You can only set a year or a occurence !!! +you do not have permission to add alarms to this event !!! calendar hr Nemate dozvolu za dodavanje alarma na ovu obvezu !!! +you do not have permission to delete this alarm !!! calendar hr Nemate dozvolu za brisanje ovog alarma !!! +you do not have permission to enable/disable this alarm !!! calendar hr Nemate dozvolu za aktiviranje/deaktiviranje ovog alarma!!!! +you do not have permission to read this record! calendar hr Nemate dozvolu čitanja ovog zapisa +you have %1 high priority events on your calendar today. common hr Danas imate %1 obveza visokog prioriteta. +you have 1 high priority event on your calendar today. common hr Danas imate 1 obvezu visokog proioriteta. +you have a meeting scheduled for %1 calendar hr Imate sastanak na rasporedu za %1 +you have not entered a title calendar hr Nist unijeli ime +you have not entered a valid date calendar hr Niste unijeli važe.i datum +you have not entered a valid time of day calendar hr Niste unijeli važe.e vrijeme dana +you have not entered participants calendar hr Niste unijeli sudionike +you must enter one or more search keywords calendar hr Morate unijeti bar jednu ili više ključnih riječi za pretraživanje +you must login first. felamimail hr Morate se prvo prijaviti. +you must select a [iv]cal. (*.[iv]cs) calendar hr Morate izabrati [iv]Cal. (*.[iv]cs) +you must select a vcard. (*.vcf) admin hr Morate izabrati vcard. (*.vcf) +you must select at least 1 column to display admin hr Morate izabrati bar 1 kolumnu za prikazati +you need a valid user and password to access this page! felamimail hr Trebate biti važeći korisnik ili imati važeću zaporku za pristup ovim stranicama! +you need to set either a day or a occurence !!! calendar hr You need to set either a day or a occurence !!! +your meeting scheduled for %1 has been canceled calendar hr Vaš sastanak na rasporedu za %1 je otkazan +your meeting that had been scheduled for %1 has been rescheduled to %2 calendar hr Vaš sastanak zakazan za %1 je premiješten na %2 +your search failed with the following error(s) felamimail hr Neuspjela pretraga sa slijedečom(im) greškom(ama) +your suggested time of %1 - %2 conflicts with the following existing calendar entries: calendar hr Vaše predloženo vrijeme od %1 - %2 je u sukobu sa postoje.im obvezama u kalendaru +zip code common hr Poštanski Broj +zip_note admin hr

    Obavijest: Datoteka može biti zip kolekcija .csv, .vcf, ili .ldif datoteka. Ipak, nemojte miješati vrste datoteka po uvozu. +1 felamimail hr 1 diff --git a/felamimail/lang/egw_hu.lang b/felamimail/lang/egw_hu.lang new file mode 100644 index 0000000000..23e958f67c --- /dev/null +++ b/felamimail/lang/egw_hu.lang @@ -0,0 +1,494 @@ +%1 is not writable by you! felamimail hu %1-hez nincs írási jogosultságod! +(no subject) felamimail hu (nincs tárgy) +(only cc/bcc) felamimail hu (csak CC/BCC) +(separate multiple addresses by comma) felamimail hu (több címezett elválasztása vesszővel) +(unknown sender) felamimail hu (ismeretlen feladó) +activate felamimail hu Aktivál +activate script felamimail hu szkript aktiválás +activating by date requires a start- and end-date! felamimail hu Dátum szeretni aktiváláshoz kezdés ÉS befejezés időpont is szükséges! +add acl felamimail hu ACL hozzáadása +add address felamimail hu Cím hozzáadása +add rule felamimail hu Szabály hozzáadása +add script felamimail hu Szkript hozzáadása +add to %1 felamimail hu Add hozzá ehhez: %1 +add to address book felamimail hu Címjegyzékhez hozzáad +add to addressbook felamimail hu címjegyzékhez hozzáad +adding file to message. please wait! felamimail hu Fájl hozzáadása az üzenethez. Kérlek várj. +additional info felamimail hu További információ +address book felamimail hu Címjegyzék +address book search felamimail hu Címjegyzékben keresés +after message body felamimail hu Üzenetrész után +all address books felamimail hu Összes címjegyzék +all folders felamimail hu Összes mappa +all of felamimail hu összes innnen +allow images from external sources in html emails felamimail hu Külső forrásból származó képek megjelenítése a HTML email-ekben +allways a new window felamimail hu mindig új ablak +always show html emails felamimail hu Mindig jelenítse meg a HTML üzenetet +and felamimail hu és +any of felamimail hu bármennyi +any status felamimail hu bármilyen állapot +anyone felamimail hu bárki +as a subfolder of felamimail hu mint almappa innen +attach felamimail hu Csatol +attachments felamimail hu Mellékletek +authentication required felamimail hu hitelesítés szükséges +auto refresh folder list felamimail hu Mappalista automatikus frissítése +back to folder felamimail hu Vissza a mappába +bad login name or password. felamimail hu Hibás belépési név vagy jelszó. +bad or malformed request. server responded: %s felamimail hu Hibás vagy sérült kérés. Szerver válasza: %s +bad request: %s felamimail hu Hibás kérés: %s +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail hu A megadott feltételek alapján a bejövő levelek különböző színű háttérrel jelennek meg a listán. Ez nagyban megkönnyíti a feladók azonosítását, különösen levelezőlista esetén. +bcc felamimail hu BCC +before headers felamimail hu Fejlécek előtt +between headers and message body felamimail hu Feljécek és üzenet között +body part felamimail hu test rész +by date felamimail hu dátum szerint +can not send message. no recipient defined! felamimail hu Üzenet kézbesítése nem lehetséges, nincs megadva címzett! +can't connect to inbox!! felamimail hu nem tudok csatlakozni az INBOX-hoz!!! +cc felamimail hu CC +change folder felamimail hu Mappa változtatása +check message against next rule also felamimail hu üzenet ellenőrzése a következő szabály szerint is +checkbox felamimail hu Jelölőnégyzet +clear search felamimail hu keresés törlése +click here to log back in. felamimail hu Kattints ide a bejelentkezéshez. +click here to return to %1 felamimail hu Kattints ide hogy %1 +close all felamimail hu összes bezárása +close this page felamimail hu lap bezárása +close window felamimail hu Ablak bezárása +color felamimail hu Szín +compose felamimail hu Szerkeszt +compose as new felamimail hu szerkesztés újként +compress folder felamimail hu Mappa tömörítése +condition felamimail hu feltétel +configuration felamimail hu Beállítás +configure a valid imap server in emailadmin for the profile you are using. felamimail hu IMAP szerver beállítása az aktuális profilhoz. +connection dropped by imap server. felamimail hu A kapcsolatot az IMAP szerver eldobta. +contact not found! felamimail hu Nem találom a címzettet! +contains felamimail hu tartalmaz +could not complete request. reason given: %s felamimail hu Kérést nem lehet teljesíteni. Az ok: %s +could not import message: felamimail hu Nem lehetséges az üzenet importálása: +could not open secure connection to the imap server. %s : %s. felamimail hu Nem lehetséges biztonságosan kapcsolódni az IMAP szerverhez. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. felamimail hu CRAM-MD5 vagy DIGEST-MD5 használatához az Auth_SASL csomagot telepíteni kell. +create felamimail hu Létrehoz +create folder felamimail hu Mappa létrehozása +create sent felamimail hu 'Elküldött' mappa létrehozása +create subfolder felamimail hu Almappa létrehozása +create trash felamimail hu 'Szemetes' létrehozása +created folder successfully! felamimail hu Mappa létrehozása sikeres. +dark blue felamimail hu Sötétkék +dark cyan felamimail hu Sötétcián +dark gray felamimail hu Sötétszürke +dark green felamimail hu Sötétzöld +dark magenta felamimail hu Sötét bíborvörös +dark yellow felamimail hu Sötétsárga +date(newest first) felamimail hu Dátum (újak elsőnek) +date(oldest first) felamimail hu Dátum (régiek elsőnek) +days felamimail hu napok +deactivate script felamimail hu szkript deaktiválása +default felamimail hu alapértelmezett +default signature felamimail hu alapértelmezett aláírás +default sorting order felamimail hu Alapértelmezett rendezési sor +delete all felamimail hu összes törlése +delete folder felamimail hu Mappa törlése +delete script felamimail hu szkript törlése +delete selected felamimail hu Kijelölt törlése +delete selected messages felamimail hu Kijelölt üzenetek törlése +deleted felamimail hu törölve +deleted folder successfully! felamimail hu Mappa törlése sikeres. +deleting messages felamimail hu üzenetek törlése +disable felamimail hu Letilt +discard felamimail hu elvet +discard message felamimail hu üzenet elvetése +display message in new window felamimail hu Üzenet megjelenítése új ablakban +display messages in multiple windows felamimail hu üzenetek megjelenítése több ablakban +display of html emails felamimail hu HTML email-ek megjelenítése +display only when no plain text is available felamimail hu Csak akkor jelenítse meg, ha nincs egyszerű szöveg +display preferences felamimail hu Beállítások megjelenítése +displaying html messages is disabled felamimail hu HTML levelek megjelenítése tiltva +do it! felamimail hu csináld! +do not use sent felamimail hu Ne használd az 'Elküldött' mappát +do not use trash felamimail hu Ne használd az 'Szemetes' mappát +do not validate certificate felamimail hu ne ellenőrizze a tanúsítványt +do you really want to delete the '%1' folder? felamimail hu Valóban törölni kívánja a '%1' mappát? +do you really want to delete the selected accountsettings and the assosiated identity. felamimail hu Valóban törölni szeretnéd a kijelölt fiókot és a hozzá tartozó beállításokat? +do you really want to delete the selected signatures? felamimail hu Valóban törölni szeretnéd a kiválasztott aláírást? +do you really want to move the selected messages to folder: felamimail hu Valóban át szeretnéd mozgatni a kijelölt üzenetet a következő mappába: +do you want to be asked for confirmation before moving selected messages to another folder? felamimail hu Szeretnél megerősítést a kijelölt üzenetek áthelyezése előtt? +do you want to prevent the editing/setup for forwarding of mails via settings (, even if sieve is enabled)? felamimail hu Meg szeretnéd akadályozni a továbbított üzenetek módosítását? (engedélyezett SIEVE esetén is) +do you want to prevent the editing/setup of filter rules (, even if sieve is enabled)? felamimail hu Meg szeretnéd akadályozni a szűrő szabályok létrehozását és alkalmazását? (engedélyezett SIEVE esetén is) +do you want to prevent the editing/setup of notification by mail to other emailadresses if emails arrive (, even if sieve is enabled)? felamimail hu Meg szeretnéd akadályozni más címre küldött figyelmeztető e-mail beállítását beérkező üzenet esetén? (engedélyezett SIEVE esetén is) +do you want to prevent the editing/setup of the absent/vacation notice (, even if sieve is enabled)? felamimail hu Meg szeretnéd akadályozni a "szabadságon vagyok" üzenet módosításának lehetőségét? (engedélyezett SIEVE esetén is) +do you want to prevent the managing of folders (creation, accessrights and subscribtion)? felamimail hu Meg szeretnéd akadályozni a mappák létrehozásának és módosításának lehetőségét? (létrehozás, hozzáférés korlátozás, feliratkozás) +does not contain felamimail hu nem tartalmazza +does not exist on imap server. felamimail hu nincs létrehozva az IMAP szerveren +does not match felamimail hu nem egyezik +does not match regexp felamimail hu nem egyezik a reguláris kifejezéssel +don't use draft folder felamimail hu Ne használd a 'Vázlat' mappát +don't use sent felamimail hu Ne használja a 'Elküldött' mappát +don't use template folder felamimail hu Ne használja a "Sablonok" mappát +don't use trash felamimail hu Ne használja a 'Szemetes' mappát +dont strip any tags felamimail hu Címkék meghagyása +down felamimail hu Le +download felamimail hu Letölt +download this as a file felamimail hu Letöltés mint állomány +draft folder felamimail hu vázlat mappa +drafts felamimail hu Piszkozatok +e-mail felamimail hu E-Mail +e-mail address felamimail hu E-Mail cím +e-mail folders felamimail hu E-Mail mappa +edit email forwarding address felamimail hu az email továbbítási címének szerkesztése +edit filter felamimail hu Szűrő szerkesztése +edit rule felamimail hu szabály szerkesztése +edit selected felamimail hu Kijelölt szerkesztése +edit vacation settings felamimail hu szabadság beállítások szerkesztése +editor type felamimail hu Szerkesztő típusa +email address felamimail hu E-Mail cím +email forwarding address felamimail hu az email továbbítási cím +email notification update failed felamimail hu e-mail értesítő frissítés mező +email signature felamimail hu E-Mail aláírás +emailaddress felamimail hu E-Mail cím +empty trash felamimail hu Szemetes ürítése +enable felamimail hu engedélyez +encrypted connection felamimail hu titkosított kapcsolat +enter your default mail domain ( from: user@domain ) admin hu Add meg az alapértelmezett levelező tartományt (a felhasználó@tartomány-ból) +enter your imap mail server hostname or ip address admin hu Add meg az IMAP szerver nevét vagy IP címét +enter your sieve server hostname or ip address admin hu Add meg a SIEVE szerver nevét vagy IP címét +enter your sieve server port admin hu Add meg a SIEVE szerver portcímét +enter your smtp server hostname or ip address admin hu Az SMTP-kiszolgáló hosztneve vagy IP-címe +enter your smtp server port admin hu Az SMTP-kiszolgáló portszáma +error felamimail hu Hiba +error connecting to imap serv felamimail hu IMAP szerverhez csatlakozáskor hiba történt +error connecting to imap server. %s : %s. felamimail hu Hiba történt az IMAP szerverhez csatlakozás közben. %s : %s +error connecting to imap server: [%s] %s. felamimail hu Hiba történt az IMAP szerverhez csatlakozás közben. [%s ]: %s +error opening felamimail hu Nem sikerült megnyitni +error saving %1! felamimail hu Hiba %1 mentése során! +error: felamimail hu Hiba: +error: could not save message as draft felamimail hu Hiba: üzenet mentése piszkozatként nem sikerült +error: message could not be displayed. felamimail hu Hiba: az üzenet nem megjeleníthető +every felamimail hu minden +every %1 days felamimail hu minden %1 napon +expunge felamimail hu Kitöröl +extended felamimail hu kibővített +felamimail common hu FelaMiMail +file into felamimail hu állományba +filemanager felamimail hu Filekezelő +files felamimail hu Fájlok +filter active felamimail hu Szűrő aktív +filter name felamimail hu Szűrő neve +filter rules common hu Szűrési szabály +first name felamimail hu Vezetéknév +flagged felamimail hu megjelölt +flags felamimail hu Címkék +folder felamimail hu mappa +folder acl felamimail hu Mappa ACL +folder name felamimail hu Mappa név +folder path felamimail hu Mappa útvonala +folder preferences felamimail hu Mappa tulajdonságok +folder settings felamimail hu Mappa beállításai +folder status felamimail hu Mappa státusz +folderlist felamimail hu Mappa lista +foldername felamimail hu Mappa név +folders felamimail hu Mappák +folders created successfully! felamimail hu Mappák sikeresen létrehozva! +follow felamimail hu követés +for mail to be send - not functional yet felamimail hu Elküldött levelekre - még nem működik +for received mail felamimail hu Bejövő levelekre +forward felamimail hu Továbbít +forward as attachment felamimail hu továbbítás mellékletként +forward inline felamimail hu továbbítás beágyazva +forward messages to felamimail hu Üzenetek továbbítása +forward to felamimail hu Továbbítás ide +forward to address felamimail hu Címzettnek továbbít +forwarding felamimail hu Továbbítás +found felamimail hu Talált +fri felamimail hu Pé +from felamimail hu Feladó +from(a->z) felamimail hu Feladó (A->Z) +from(z->a) felamimail hu Feladó (Z->A) +full name felamimail hu Teljes Neve +greater than felamimail hu nagyobb mint +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail hu Keresd fel a www.felamimail.org oldalt további információkért a Squirrelmail-ről.
    +header lines felamimail hu Email fejléce +hide header felamimail hu Fejléc elrejtése +hostname / address felamimail hu gazdagépnév / cím +how to forward messages felamimail hu Üzenet továbbítás módja +html felamimail hu HTML +icons and text felamimail hu Ikonok és képek +icons only felamimail hu Csak ikonok +identifying name felamimail hu Azonosító név +identity felamimail hu azonosító +if felamimail hu HA +if from contains felamimail hu ha feladó tartalmazza +if mail header felamimail hu ha a levél fejléce +if message size felamimail hu ha a levél mérete +if shown, which folders should appear on main screen felamimail hu a főképernyőn megjelenő mappák kijelölése +if subject contains felamimail hu ha a tárgy tartalmazza +if to contains felamimail hu ha a címzett tartalmazza +if using ssl or tls, you must have the php openssl extension loaded. felamimail hu SSL vagy TLS használatához a PHP openssl bővítményét telepíteni kell. +illegal folder name. please select a different name. felamimail hu Érvénytelen mappanév. Kérlek válassz másik nevet. +imap felamimail hu IMAP +imap server felamimail hu IMAP szerver +imap server address felamimail hu IMAP szerver címe +imap server closed the connection. felamimail hu Az IMAP szerver lezárta a kapcsolatot. +imap server closed the connection. server responded: %s felamimail hu Az IMAP szerver lezárta a kapcsolatot. A szerver válasza: %s +imap server password felamimail hu IMAP szerver jelszava +imap server type felamimail hu IMAP szerver típusa +imap server username felamimail hu IMAP szerver felhasználóneve +imaps authentication felamimail hu IMAPS azonosítás +imaps encryption only felamimail hu csak IMAPS titkosítás +import felamimail hu import +import mail felamimail hu Üzenet importálása +in felamimail hu be +inbox felamimail hu Bejövő +incoming mail server(imap) felamimail hu bejövő levélszerver (IMAP) +index order felamimail hu Index rendezés +info felamimail hu Info +invalid user name or password felamimail hu Érvénytelen felhasználónév vagy jelszó +javascript felamimail hu JavaScript +jumping to end felamimail hu ugrás az utolsóra +jumping to start felamimail hu ugrás az elsőre +junk felamimail hu Spam +keep a copy of the message in your inbox felamimail hu másolat megőrzése a Bejövő postafiókban +keep local copy of email felamimail hu helyi másolat megőrzése +kilobytes felamimail hu kilobájt +language felamimail hu Nyelv +last name felamimail hu Keresztnév +left felamimail hu Balra +less felamimail hu kisebb +less than felamimail hu kisebb mint +light gray felamimail hu Világosszürke +list all felamimail hu Összes listázása +loading felamimail hu betöltés +location of buttons when composing felamimail hu Szerkesztéskor a gombok elhelyezkedése +mail server login type admin hu Mail szerver bejelentkezés típusa +mail settings felamimail hu Levelezési beállítások +mainmessage felamimail hu főüzenet +manage email accounts and identities common hu felhasználói fiókók és azonosítók szerkesztése +manage emailaccounts common hu E-mail azonosítók kezelése +manage emailfilter / vacation preferences hu E-mail szűrő/szabadság kezelése +manage folders common hu Mappák kezelése +manage sieve common hu Sieve szkriptek kezelése +manage signatures felamimail hu Aláírások kezelése +mark as deleted felamimail hu Törlésre megjelöl +mark messages as felamimail hu Kiválasztott üzenetek címkézése mint +mark selected as flagged felamimail hu Kiválasztott üzenetek címkéje mint "Megjelölt" +mark selected as read felamimail hu Kiválasztott üzenetek megjelölése mint "Olvasott" +mark selected as unflagged felamimail hu Kiválasztott üzenetek címkézése mint "Jelöletlen" +mark selected as unread felamimail hu Kiválasztott üzenetek megjelölése mint "Olvasatlan" +match felamimail hu Egyezés +matches felamimail hu egyezés +matches regexp felamimail hu reguláris kifejezés egyezése +max uploadsize felamimail hu max feltölthető fájl méret +message highlighting felamimail hu Üzenet színkiemelés +message list felamimail hu Üzenetlista +messages felamimail hu üzenetek +mon felamimail hu Hé +move felamimail hu Mozgat +move folder felamimail hu mappa mozgatása +move messages felamimail hu üzenetek mozgatása +move selected to felamimail hu kijelöltek mozgatása +move to trash felamimail hu Szemetesbe mozgatás +moving messages to felamimail hu üzenetek mozgatása +name felamimail hu Név +never display html emails felamimail hu Soha ne jelenítse meg a HTML formátumú emaileket +new common hu Új +new filter felamimail hu Új szűrő +next felamimail hu Következő +next message felamimail hu következő üzenet +no active imap server found!! felamimail hu Atkív IMAP szerver nem található! +no address to/cc/bcc supplied, and no folder to save message to provided. felamimail hu Nincs címzett és mappa az üzenet mentéséhez beállítva. +no encryption felamimail hu titkosítás nélkül +no filter felamimail hu Szűrő nélkül +no folders felamimail hu nincs mappa +no folders found felamimail hu Mappa nem található +no folders were found to subscribe to! felamimail hu Nincs mappa melyre feliratkozhatna! +no folders were found to unsubscribe from! felamimail hu Nincs mappa melyről leíratkozhatna! +no highlighting is defined felamimail hu Színkiemelés nincs definiálva +no imap server host configured!! felamimail hu IMAP szerver nincs beállítva. +no message returned. felamimail hu Nincs visszaadott üzenet. +no messages found... felamimail hu üzenetek nem találhatóak... +no messages selected, or lost selection. changing to folder felamimail hu Nincs üzenet kiválasztva, átlépek a következő mappába: +no messages were selected. felamimail hu Nincsenek kiválasztva üzenetek. +no plain text part found felamimail hu nem található egyszerű szöveges tartalom +no previous message felamimail hu nincs előző üzenet +no recipient address given! felamimail hu Címzett nincs megadva! +no signature felamimail hu nincs aláírás +no subject given! felamimail hu Az üzenethez nincs tárgy megadva. +no supported imap authentication method could be found. felamimail hu Nem található támogatott IMAP azonosítási eljárás. +no valid emailprofile selected!! felamimail hu Nincs érvényes email profil kiválasztva!!! +none felamimail hu Semmi +none, create all felamimail hu egyik sem, összes létrehozása +notify when new mails arrive on these folders felamimail hu értesítés ha új üzenet érkezik ezekbe a mappákba +on felamimail hu be +on behalf of felamimail hu kinek a nevében +one address is not valid felamimail hu Egy cím érvénytelen +only inbox felamimail hu Csak a Bejövő postafiók +only one window felamimail hu csak egy ablak +only unseen felamimail hu Csak az újak +open all felamimail hu összes megnyitása +options felamimail hu Opciók +or felamimail hu vagy +or configure an valid imap server connection using the manage accounts/identities preference in the sidebox menu. felamimail hu állíts be egy érvényes IMAP szervert az oldaldoboz Fiókok/azonosítok beállítása menüben. +organisation felamimail hu szervezet +organization felamimail hu szervezet +organization name admin hu Szervezet neve +original message felamimail hu eredeti üzenet +outgoing mail server(smtp) felamimail hu kimenő levelező szerver +participants felamimail hu Résztvevők +personal information felamimail hu Személyes információk +please ask the administrator to correct the emailadmin imap server settings for you. felamimail hu Kérlek lépj kapcsolatban a rendszergazdával az IMAP szerver beállításaival kapcsolatban. +please select a address felamimail hu Kérlek válassz címet +please select the number of days to wait between responses felamimail hu Kérlek add hány napot várjon a válaszok között +please supply the message to send with auto-responses felamimail hu Kérlek add meg az automatikus válaszüzenetet +port felamimail hu portcím +posting felamimail hu kézbesítés +previous felamimail hu előző +previous message felamimail hu előző üzenet +print it felamimail hu nyomtat +print this page felamimail hu oldal nyomtatása +printview felamimail hu nyomtatási kép +quicksearch felamimail hu Gyorskeresés +read felamimail hu olvasott +reading felamimail hu olvasás +receive notification felamimail hu Tértivevény +recent felamimail hu legfrissebb +refresh time in minutes felamimail hu Frissítési időintervallum percben +reject with felamimail hu elutasítás +remove felamimail hu eltávolítás +remove immediately felamimail hu Azonnali eltávolítás +rename felamimail hu Átnevez +rename a folder felamimail hu Mappa átnevezése +rename folder felamimail hu Mappa átnevezése +renamed successfully! felamimail hu Sikeres átnevezés! +replied felamimail hu megválaszolt +reply felamimail hu Válasz +reply all felamimail hu Válasz mindenkinek +reply to felamimail hu Válasz +replyto felamimail hu Válasz +respond felamimail hu Válaszol +respond to mail sent to felamimail hu Válaszol a címzettnek +return felamimail hu Vissza +return to options page felamimail hu Vissza az opciók lapra +right felamimail hu Jobbra +row order style felamimail hu sorok rendezése +rule felamimail hu Szabály +sat felamimail hu Szo +save felamimail hu Elment +save all felamimail hu Összes mentése +save as draft felamimail hu Mentés vázlatként +save as infolog felamimail hu Mentés InfoLog-ként +save changes felamimail hu Változások mentése +save message to disk felamimail hu Üzenet mentése lemezre +script name felamimail hu szkript név +script status felamimail hu szkript státusz +search felamimail hu Keres +search for felamimail hu Keres +select felamimail hu Kiválaszt +select all felamimail hu Mindet kiválaszt +select emailprofile felamimail hu Email profil kiválasztása +select folder felamimail hu Mappa kiválasztása +select your mail server type admin hu Válassza ki a levelezőszerver típusát +send felamimail hu Küld +send a reject message felamimail hu Visszautasító levél küldése +sent felamimail hu Elköldött üzenetek +sent folder felamimail hu 'Elküldött' mappa +server supports mailfilter(sieve) felamimail hu a szerver támogatja a levélszűrőket (sieve) +set as default felamimail hu Beállítás alapértelmezettként +show header felamimail hu fejléc megjelenítése +show new messages on main screen felamimail hu Új üzenetek megjelenítése a főképernyőn +sieve script name felamimail hu sieve szűrő szkript neve +sieve settings admin hu SIEVE beállítások +signatur felamimail hu Aláírás +signature felamimail hu Aláírás +simply click the target-folder felamimail hu Kattintson a célmappára +size felamimail hu Méret +size of editor window felamimail hu Szerkesztőablak mérete +size(...->0) felamimail hu Méret (...->0) +size(0->...) felamimail hu Méret (0->...) +skipping forward felamimail hu következőre ugrás +skipping previous felamimail hu előzőre ugrás +small view felamimail hu tömör nézet +smtp settings admin hu SMTP beállítások +start new messages with mime type plain/text or html? felamimail hu Új üzenet írása egyszerű szöveg vagy html-ként? +subject felamimail hu Tárgy +subject(a->z) felamimail hu Tárgy (A->Z) +subject(z->a) felamimail hu Tárgy (Z->A) +submit felamimail hu Elküld +subscribe felamimail hu Feliratkozás +subscribed felamimail hu Feliratkozva +subscribed successfully! felamimail hu Sikeres feliratkozás! +sun felamimail hu Va +system signature felamimail hu rendszer aláírás +table of contents felamimail hu Tartalomjegyzék +template folder felamimail hu Sablonok mappa +templates felamimail hu Sablonok +text only felamimail hu Csak szöveg +text/plain felamimail hu szöveg +the connection to the imap server failed!! felamimail hu Sikertelen csatlakozás az IMAP szerverhez! +the imap server does not appear to support the authentication method selected. please contact your system administrator. felamimail hu Az IMAP szerver úgy tűnik nem támogatja a kiválasztott hitelesítést. Tovább információért lLépj kapcsolatba a rendszergazdával. +the message sender has requested a response to indicate that you have read this message. would you like to send a receipt? felamimail hu A feladó kéri tértivevényt küldését amely jelzi, hogy megkaptad az üzenetet. Szeretnéd hogy elküldjem? +the mimeparser can not parse this message. felamimail hu A MIME feldolgozó nem tudta feldolgozni ezt az üzenetet. +then felamimail hu AKKOR +there is no imap server configured. felamimail hu Nincs IMAP szerver beállítva. +this folder is empty felamimail hu EZ A MAPPA ÜRES +this php has no imap support compiled in!! felamimail hu Az alkalmazott PHP verzió nem tartalmaz IMAP támogatást! (telepíteni kell) +thu felamimail hu Csü +to felamimail hu Címzett +to mail sent to felamimail hu az üzenet elküldlve +to use a tls connection, you must be running a version of php 5.1.0 or higher. felamimail hu TLS kapcsolat használatához a PHP verziója legalább 5.1.0 kell legyen. +translation preferences felamimail hu Fordítási tulajdonságok +translation server felamimail hu Fordító szerver +trash felamimail hu Törölt üzenetek +trash fold felamimail hu "Szemetes" mappa +trash folder felamimail hu "Szemetes" mappa +tue felamimail hu Ke +type felamimail hu Típus +unexpected response from server to authenticate command. felamimail hu Váratlan válasz a szervertől az AUTHENTICATE parancsra. +unexpected response from server to digest-md5 response. felamimail hu Váratlan válasz a szervertől a DIGEST-MD5 parancsra. +unexpected response from server to login command. felamimail hu Váratlan válasz a szervertől a LOGIN parancsra. +unflagged felamimail hu jelöletlen +unknown err felamimail hu Ismeretlen hiba +unknown error felamimail hu Ismeretlen hiba +unknown imap response from the server. server responded: %s felamimail hu Ismeretlen válasz a szervertől: %s. +unknown sender felamimail hu Ismeretlen feladó +unknown user or password incorrect. felamimail hu Ismeretlen felhasználó vagy jelszó +unread common hu Olvasatlan +unseen felamimail hu Új +unselect all felamimail hu Összes kijelölés megszüntetése +unsubscribe felamimail hu Leiratkozás +unsubscribed felamimail hu Leiratkozva +unsubscribed successfully! felamimail hu Sikeres leiratkozás! +up felamimail hu Fel +updating message status felamimail hu üzenet állapotok frissítése +updating view felamimail hu nézet frissítése +use emailadmin to create profiles felamimail hu Használd az Email Adminisztrációt profilkészítésre +use a signature felamimail hu Aláírás használata +use a signature? felamimail hu Használjuk az aláírást? +use addresses felamimail hu Címek használata +use custom identities felamimail hu Egyedi azonosító használata +use custom settings felamimail hu Egyedi beállítások használata +use regular expressions felamimail hu reguláris kifejezés használata +use smtp auth admin hu SMTP hitelesítés használata +users can define their own emailaccounts admin hu A felhasználók saját maguk állíthatják be az email postafiókjaikat +vacation notice common hu szabadság értesítés +vacation notice is active felamimail hu Szabadság értesítő aktív +vacation start-date must be before the end-date! felamimail hu Szabadság kezdete korábban legyen mint a vége! +validate certificate felamimail hu tanúsítvány ellenőrzése +view full header felamimail hu Teljes fejléc megjelenítése +view header lines felamimail hu fejléc tartalom megjelenítése +view message felamimail hu Üzenet megjelenítése +viewing full header felamimail hu Teljes fejléc megjelenítése +viewing message felamimail hu Üzenet megjelenítése +viewing messages felamimail hu Üzenetek megjelenítése +wed felamimail hu Sze +when deleting messages felamimail hu Üzenet törlése esetén +which folders (additional to the sent folder) should be displayed using the sent folder view schema felamimail hu melyik mappa legyen az Elküldött levelek mappa szerint megjelenítve? +which folders - in general - should not be automatically created, if not existing felamimail hu Melyik mappa ne legyen automatikusan létrehozva? +with message felamimail hu üzenettel +with message "%1" felamimail hu "%1" üzenettel +wrap incoming text at felamimail hu Bejövő szöveg tördelése +writing felamimail hu írás +wrote felamimail hu írta +you can use %1 for the above start-date and %2 for the end-date. felamimail hu %1-t használd kezdő dátumként, %2-t befejező dátumként. +you have received a new message on the felamimail hu Új üzenet érkezett a +your message to %1 was displayed. felamimail hu Az üzeneted %1 magkapta. diff --git a/felamimail/lang/egw_it.lang b/felamimail/lang/egw_it.lang new file mode 100644 index 0000000000..afbc913759 --- /dev/null +++ b/felamimail/lang/egw_it.lang @@ -0,0 +1,343 @@ +(no subject) felamimail it (nessun oggetto) +(only cc/bcc) felamimail it (solo Cc/Ccn) +(unknown sender) felamimail it (mittente sconosciuto) +activate felamimail it Attiva +activate script felamimail it attiva script +add address felamimail it Aggiungi indirizzo +add rule felamimail it Aggiungi Regola +add script felamimail it Aggiungi Script +add to %1 felamimail it Aggiungi a %1 +add to address book felamimail it Aggiungi alla rubrica +add to addressbook felamimail it aggiungi alla rubrica +additional info felamimail it Informazioni Addizionali +address book felamimail it Rubrica +address book search felamimail it Ricerca Rubrica +after message body felamimail it Dopo il corpo del messaggio +all address books felamimail it Tutte le rubriche +all folders felamimail it Tutte le Cartelle +all of felamimail it tutto di +allways a new window felamimail it sempre in una nuova finestra +always show html emails felamimail it Visualizza sempre le e-mail HTML +any of felamimail it qualche di +anyone felamimail it chiunque +as a subfolder of felamimail it come sottocartella di +attachments felamimail it Allegati +auto refresh folder list felamimail it Auto aggiorna elenco cartelle +back to folder felamimail it Torna alla cartella +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail it In base ai criteri stabiliti, i messaggi in entrata possono avere differenti colori nell'elenco messaggi. Ciò aiuta a distinguere facilmente la provenienza dei messaggi, specialmente per liste di distribuzione. +bcc felamimail it CCN +before headers felamimail it Prima degli header +between headers and message body felamimail it Tra gli header e il corpo del messaggio +body part felamimail it body part +can't connect to inbox!! felamimail it non riesco a connettermi alla INBOX !! +cc felamimail it CC +change folder felamimail it Cambia cartella +check message against next rule also felamimail it controlla il messaggio anche con regola seguente +checkbox felamimail it Checkbox +click here to log back in. felamimail it Clicca qui per loggarti di nuovo. +click here to return to %1 felamimail it Clicca qui per tornare a %1 +close all felamimail it chiudi tutto +close this page felamimail it chiudi questa pagina +close window felamimail it Chiudi finestra +color felamimail it Colore +compose felamimail it Componi +compress folder felamimail it Comprimi cartella +configuration felamimail it Configurazione +contains felamimail it contiene +create felamimail it Crea +create folder felamimail it Crea Cartella +create sent felamimail it Crea Messaggi Inviati +create subfolder felamimail it Crea sottocartella +create trash felamimail it Crea Cestino +created folder successfully! felamimail it Cartella creata correttamente! +dark blue felamimail it Blu Scuro +dark cyan felamimail it Ciano Scuro +dark gray felamimail it Grigio Scuro +dark green felamimail it Verde Scuro +dark magenta felamimail it Magenta Scuro +dark yellow felamimail it Giallo Scuro +date(newest first) felamimail it Data (prima più recenti) +date(oldest first) felamimail it Data (prima meno recenti) +days felamimail it giorni +deactivate script felamimail it disattiva script +default sorting order felamimail it Ordinamento predefinito +delete all felamimail it cancella tutto +delete folder felamimail it Cancella Cartella +delete script felamimail it cancella script +delete selected felamimail it Cancella selezionati +delete selected messages felamimail it cancella i messaggi selezionati +deleted felamimail it cancellato +deleted folder successfully! felamimail it Cartella cancellata! +disable felamimail it Disabilita +discard message felamimail it scarta messaggio +display message in new window felamimail it Visualizza i messaggi in una nuova finestra +display of html emails felamimail it Visualizzazione delle e-mail HTML +display only when no plain text is available felamimail it Visualizza solo quando non disponibile il testo normale +display preferences felamimail it Visualizza Preferenze +do it! felamimail it fallo! +do not use sent felamimail it Non usare Inviati +do not use trash felamimail it Non usare Cestino +do you really want to delete the '%1' folder? felamimail it Vuoi veramente cancellare la cartella '%1' ? +does not contain felamimail it non contiene +does not match felamimail it non corrisponde +does not match regexp felamimail it non corrisponde a regexp +don't use sent felamimail it Non usare Posta Inviata +don't use trash felamimail it Non usare il Cestino +down felamimail it sotto +download felamimail it download +download this as a file felamimail it Download come un file +e-mail felamimail it E-Mail +e-mail address felamimail it indirizzo E-Mail +e-mail folders felamimail it Cartelle E-Mail +edit filter felamimail it Modifica filtro +edit rule felamimail it modifica regola +edit selected felamimail it Modifica selezionato +edit vacation settings felamimail it Modifica impostazioni vacation +email address felamimail it Indirizzo E-Mail +email signature felamimail it Firma E-mail +empty trash felamimail it svuota cestino +enable felamimail it abilita +enter your default mail domain ( from: user@domain ) admin it Inserisci il tuo dominio di posta predefinito ( Da: utente@dominio ) +enter your imap mail server hostname or ip address admin it Enter your IMAP mail server hostname or IP address +enter your sieve server hostname or ip address admin it Enter your SIEVE server hostname or IP address +enter your sieve server port admin it Enter your SIEVE server port +enter your smtp server hostname or ip address admin it Enter your SMTP server hostname or IP address +enter your smtp server port admin it Enter your SMTP server port +error felamimail it ERRORE +error connecting to imap serv felamimail it Errore in connessione al server IMAP +error opening felamimail it Errore in apertura +every felamimail it ogni +every %1 days felamimail it ogni %1 giorni +expunge felamimail it Svuota +felamimail common it FelaMiMail +file into felamimail it file in +files felamimail it files +filter active felamimail it filtro attivo +filter name felamimail it Nome Filtro +filter rules felamimail it Regole Filtro +first name felamimail it Nome +flagged felamimail it contrassegnato +flags felamimail it Flags +folder acl felamimail it acl cartella +folder name felamimail it Nome Cartella +folder path felamimail it Path della Cartella +folder preferences felamimail it Preferenze Cartelle +folder settings felamimail it Impostazioni Cartelle +folder status felamimail it Stato Cartelle +folderlist felamimail it Lista Cartele +foldername felamimail it Nome cartella +folders felamimail it Cartelle +folders created successfully! felamimail it Cartella creata correttamente! +follow felamimail it segue +for mail to be send - not functional yet felamimail it For mail to be send - not functional yet +for received mail felamimail it For received mail +forward felamimail it Inoltra +forward to address felamimail it inoltra a indirizzo +found felamimail it Trovato +fri felamimail it Ven +from felamimail it Da +from(a->z) felamimail it Da (A->Z) +from(z->a) felamimail it Da (Z->A) +full name felamimail it Nome Completo +greater than felamimail it superiore a +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail it Have a look at www.felamimail.org to learn more about Squirrelmail.
    +header lines felamimail it Linee Intestazione +hide header felamimail it nascondi intestazione +html felamimail it HTML +icons and text felamimail it Icone e Testo +icons only felamimail it Solo icone +identifying name felamimail it Nome identificativo +if felamimail it SE +if from contains felamimail it se da contiene +if mail header felamimail it se intestazione messaggio +if message size felamimail it se dimensione messaggio +if subject contains felamimail it se oggetto contiene +if to contains felamimail it se a contiene +illegal folder name. please select a different name. felamimail it Nome cartella non permesso. Prego scegli un altro nome. +imap felamimail it IMAP +imap server felamimail it Server IMAP +imap server address felamimail it Indirizzo Server IMAP +imap server type felamimail it Tipo Server IMAP +imaps authentication felamimail it IMAPS Authentication +imaps encryption only felamimail it IMAPS Encryption only +in felamimail it nel +index order felamimail it Index Order +info felamimail it Info +invalid user name or password felamimail it Nome utente o password errati +javascript felamimail it JavaScript +keep a copy of the message in your inbox felamimail it mantieni una copia del messaggio nella tua posta in arrivo +kilobytes felamimail it kilobyte +language felamimail it Lingua +last name felamimail it Cognome +left felamimail it Sinistra +less felamimail it pochi +less than felamimail it meno di +light gray felamimail it Grigio Chiaro +list all felamimail it Visualizza tutti +location of buttons when composing felamimail it Location of buttons when composing +mail server login type admin it Mail server login type +mail settings felamimail it Imposazioni Mail +mainmessage felamimail it messaggio principale +manage emailfilter / vacation preferences it Gestione Filtro Email / Assenze +manage folders common it Gestione Cartelle +manage sieve common it Gestione script Sieve +mark as deleted felamimail it Segna come cancellato +mark messages as felamimail it Segna i messaggi selezionati come +mark selected as flagged felamimail it Segna come contrassegnati +mark selected as read felamimail it Segna come già letto +mark selected as unflagged felamimail it Segna come non contrassegnati +mark selected as unread felamimail it Segna come da leggere +match felamimail it Corrisponde +matches felamimail it corrispondenze +matches regexp felamimail it matches regexp +message highlighting felamimail it Message Highlighting +message list felamimail it Lista Messaggi +messages felamimail it messaggi +mon felamimail it Lun +move felamimail it sposta +move messages felamimail it sposta messaggi +move selected to felamimail it sposta selezionato in +move to trash felamimail it Sposta nel cestino +moving messages to felamimail it spostamento messaggi in +name felamimail it Nome +never display html emails felamimail it Non visualizzare mai le e-mail HTML +new common it Nuovo +new filter felamimail it Nuovo Filtro +next felamimail it Successivo +next message felamimail it prossimo messaggio +no filter felamimail it Nessun Filtro +no folders found felamimail it Nessuna cartella trovata +no folders were found to subscribe to! felamimail it No folders were found to subscribe to! +no folders were found to unsubscribe from! felamimail it No folders were found to unsubscribe from! +no highlighting is defined felamimail it Nessuna evidenziazione definita +no messages found... felamimail it nessun messaggio trovato... +no messages were selected. felamimail it Nessun messaggio selezionato. +no previous message felamimail it nessun Messaggio precedente +no valid emailprofile selected!! felamimail it Nessun Profilo E-Mail valido selezionato!! +none felamimail it nessuno +on behalf of felamimail it on behalf of +one address is not valid felamimail it Un indirizzo non è valido +only inbox felamimail it Solo INBOX +only one window felamimail it solo una finestra +only unseen felamimail it Solo non letti +open all felamimail it apri tutto +options felamimail it Opzioni +organisation felamimail it organizzazione +organization felamimail it organizzazione +organization name admin it Nome organizzazione +participants felamimail it Partecipanti +personal information felamimail it Informazioni Personali +please select a address felamimail it Prego seleziona un indirizzo +please select the number of days to wait between responses felamimail it Prego seleziona il numero di giorni da aspettare tra le risposte +please supply the message to send with auto-responses felamimail it Prego fornisci il messaggio ta inviare con la risposta automatica +posting felamimail it invio +previous felamimail it Precedente +previous message felamimail it messaggio precedente +print it felamimail it stampa +print this page felamimail it stampa questa pagina +quicksearch felamimail it Ricerca Veloce +read felamimail it leggi +reading felamimail it leggendo +recent felamimail it recenti +refresh time in minutes felamimail it Tempo di aggiornamento in minuti +remove felamimail it rimuovi +remove immediately felamimail it Rimuovi immediatamente +rename felamimail it Rinomina +rename a folder felamimail it Rinomina una Cartella +rename folder felamimail it Rinomina cartella +renamed successfully! felamimail it Rinominato correttamente! +replied felamimail it risposto +reply felamimail it Rispondi +reply all felamimail it Rispondi a Tutti +reply to felamimail it Rispondi A +replyto felamimail it Rispondi A +respond felamimail it AutoRispondi +respond to mail sent to felamimail it AutoRispondi alle mail inviate a +return felamimail it Ritorna +return to options page felamimail it Return to options page +right felamimail it Destra +rule felamimail it Regole +sat felamimail it Sab +save felamimail it Salva +save changes felamimail it salva modifiche +script name felamimail it nome script +script status felamimail it stato script +search felamimail it Ricerca +search for felamimail it Cerca +select felamimail it Seleziona +select all felamimail it Seleziona Tutti +select emailprofile felamimail it Seleziona Profilo E-Mail +select folder felamimail it seleziona cartella +select your mail server type admin it Selezona il tipo di server mail +send felamimail it Invia +send a reject message felamimail it invia messaggio di rifiuto +sent folder felamimail it Cartella Posta Inviata +show header felamimail it visualizza header +show new messages on main screen felamimail it Visualizza i nuovi messaggi nella schermata principale +sieve settings admin it Impostazioni Sieve +signature felamimail it Firma +simply click the target-folder felamimail it Semplicemente clicca la cartella destinazione +size felamimail it Dimensione +size of editor window felamimail it Dimensione della finestra di edit +size(...->0) felamimail it Dimensione (...->0) +size(0->...) felamimail it Dimensione (0->...) +small view felamimail it visualizzazione ridotta +smtp settings admin it Impostazioni SMTP +subject felamimail it Oggetto +subject(a->z) felamimail it Oggetto (A->Z) +subject(z->a) felamimail it Oggetto (Z->A) +submit felamimail it Invia +subscribe felamimail it Sottoscrivi +subscribed felamimail it Sottoscritti +subscribed successfully! felamimail it Sottoscritto con successo! +sun felamimail it Dom +table of contents felamimail it Indice dei contenuti +text only felamimail it Solo testo +the connection to the imap server failed!! felamimail it La connessione al server IMAP è fallita!! +then felamimail it ALLORA +this folder is empty felamimail it QUESTA CARTELLA E' VUOTA +this php has no imap support compiled in!! felamimail it Questo PHP non contiene il supporto IMAP!! +thu felamimail it Gio +to felamimail it A +to mail sent to felamimail it to mail sent to +translation preferences felamimail it Preferenze Traduzioni +translation server felamimail it Server Traduzioni +trash fold felamimail it Cestino +trash folder felamimail it Cestino +tue felamimail it Mar +type felamimail it tipo +unflagged felamimail it non contrassegnato +unknown err felamimail it Errore Sconosciuto +unknown error felamimail it Errore Sconosciuto +unknown sender felamimail it Mittente Sconosciuto +unknown user or password incorrect. felamimail it Utente sconosciuto o password sbagliata. +unread common it da leggere +unseen felamimail it Nuovi +unselect all felamimail it Deseleziona Tutto +unsubscribe felamimail it Unsubscribe +unsubscribed felamimail it Unsubscribed +unsubscribed successfully! felamimail it Unsubscribed successfully! +up felamimail it su +use a signature felamimail it Usa una firma +use a signature? felamimail it Usare una firma? +use addresses felamimail it Usa Indirizzo +use custom settings felamimail it Usa Impostazioni Personali +use javascript or html addressbook? felamimail it Usa rubrica Javascript o HTML? +use regular expressions felamimail it usa espressioni regolari +use smtp auth admin it usa autenticazione SMTP +users can define their own emailaccounts admin it Gli utenti possono definire i propri account email +vacation notice felamimail it notifica assenza +view full header felamimail it Visualizza gli header completi +view message felamimail it Visualizza messaggio +viewing full header felamimail it Viewing full header +viewing message felamimail it Viewing message +viewing messages felamimail it Viewing messages +wed felamimail it Mer +welcome to %1's webmail system felamimail it Benvenuti al sistema WebMail %1 +when deleting messages felamimail it Durante la cancellazione dei messaggi +with message felamimail it con messaggio +with message "%1" felamimail it con messaggio "%1" +wrap incoming text at felamimail it Affianca testo a +writing felamimail it scrittura +wrote felamimail it scritto +you must login first. felamimail it Devi prima eseguire il Login. diff --git a/felamimail/lang/egw_iw.lang b/felamimail/lang/egw_iw.lang new file mode 100755 index 0000000000..d64dcaaec0 --- /dev/null +++ b/felamimail/lang/egw_iw.lang @@ -0,0 +1,369 @@ +(no subject) felamimail iw (ללא נושא) +(only cc/bcc) felamimail iw (רק העתק/העתק מוסתר) +(unknown sender) felamimail iw (שולח לא ידוע) +activate felamimail iw הפעל +activate script felamimail iw הפעל סקריפט +add address felamimail iw הוסף כתובת +add rule felamimail iw הוסף חוק +add script felamimail iw הוסף סקריפט +add to %1 felamimail iw הוסף אל %1 +add to address book felamimail iw הוסף לספר כתובות +add to addressbook felamimail iw הוסף לספר כתובות +additional info felamimail iw מידע נוסף +address book felamimail iw ספר כתובות +address book search felamimail iw חיפוש בספר כתובות +after message body felamimail iw אחרי גוף ההודעה +all address books felamimail iw כל ספרי הכתובות +all folders felamimail iw כל התיקיות +always show html emails felamimail iw HTML תמיד להציג דואר אלקטרוני +anyone felamimail iw כל אחד +as a subfolder of felamimail iw כתת תיקיה של +attachments felamimail iw מצורפים +auto refresh folder list felamimail iw רענן רשימת תיקיות אוטומטית +back to folder felamimail iw חזור לתיקיה +bad reque felamimail iw בקשה לא חוקית +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail iw בהתאם לקרטריונים מוגדרים, צבע הרקע של דואר נכנס מתקבל בהתאם לשם השולח. זה שימושי במיוחד ברשימות תפוצה. +bcc felamimail iw העתק מוסתר +before headers felamimail iw לפני הכותרות +between headers and message body felamimail iw בין הכותרות לגוף ההודעה +body part felamimail iw ההודעה גופה +can't connect to inbox!! felamimail iw !לא יכול להתחבר לתיבת הדואר הנכנס +cc felamimail iw העתק +change folder felamimail iw שנה תיקיה +checkbox felamimail iw תיבת סימון +click here to log back in. felamimail iw הקלק כאן להכנס שוב +click here to return to %1 felamimail iw הקלק כאן כדי לחזור אל %1 +close all felamimail iw סגור הכל +close this page felamimail iw סגור עמוד זה +close window felamimail iw (סגור חלון (קר בבית :-) +color felamimail iw צבע +compose felamimail iw חדש +compress folder felamimail iw קבץ תיקיה +configuration felamimail iw הגדרה +contains felamimail iw מכיל +create felamimail iw צור +create folder felamimail iw צור תיקיה +create sent felamimail iw צור פריטים שנשלחו +create subfolder felamimail iw צור תת תיקיה +create trash felamimail iw צור אשפה +created folder successfully! felamimail iw התיקיה נוצרה בהצלחה +dark blue felamimail iw כחול כהה +dark cyan felamimail iw ציאן כהה +dark gray felamimail iw אפור כהה +dark green felamimail iw ירוק כהה +dark magenta felamimail iw סגול כהה +dark yellow felamimail iw צהוב כהה +date(newest first) felamimail iw (תאריך (חדשים תחילה +date(oldest first) felamimail iw (תאריך (ישנים תחילה +days felamimail iw ימים +deactivate script felamimail iw הפס הפעלת סקריפט +default sorting order felamimail iw סדר מיון מחדלי +delete all felamimail iw מחק הכל +delete folder felamimail iw מחק תיקיה +delete script felamimail iw מחק סקריפט +delete selected felamimail iw מחק נבחרים +delete selected messages felamimail iw מחק הודעות מובחרות +deleted felamimail iw נמחקו +deleted folder successfully! felamimail iw !מחקתי תיקיה בהצלחה +disable felamimail iw הפוך ללא פעיל +display message in new window felamimail iw הצג הודעה בחלון חדש +display of html emails felamimail iw HTML הצגת דואר +display only when no plain text is available felamimail iw הצג רק כאשר טקסט פשוט לא זמין +display preferences felamimail iw עדיפויות תצוגה +do it! felamimail iw !עשה זאת +do not use sent felamimail iw לא להשתמש בתיקית נשלח +do not use trash felamimail iw לא להשתמש בתיקית אשפה +do you really want to delete the '%1' folder? felamimail iw ?בטוח שברצונך למחוק את תיקיית '%1' +does not contain felamimail iw אינו מכיל +does not match felamimail iw אינו תואם +does not match regexp felamimail iw regexp אינו תואם +don't use sent felamimail iw לא להשתמש בתיקית פריטים שנשלחו +don't use trash felamimail iw לא להשתמש בתיקית אשפה +down felamimail iw למטה +download felamimail iw הורד +download this as a file felamimail iw הורד את זה כקובץ +e-mail felamimail iw דוא"ל +e-mail address felamimail iw כתובת דוא"ל +e-mail folders felamimail iw תיקיות דוא"ל +edit filter felamimail iw ערוך מסנן +edit rule felamimail iw ערוץ חוק +edit selected felamimail iw ערוך נבחרים +edit vacation settings felamimail iw ערוך הגדרת חופשות +email address felamimail iw כתובת דוא"ל +email signature felamimail iw חתימת דוא"ל +empty trash felamimail iw רוקן אשפה +enable felamimail iw אפשר +enter your default mail domain ( from: user@domain ) admin iw (user@domain :הכנס את דומיין הדואר המחדלי שלך (לדוגמא +enter your imap mail server hostname or ip address admin iw שלו IP-שלך או אתכתובת ה IMAP-הכנס את שם שרת ה +enter your sieve server hostname or ip address admin iw שלו IP-שלך או אתכתובת ה Sieve-הכנס את שם שרת ה +enter your sieve server port admin iw שלך Sieve-הכנס את פורט שרת ה +enter your smtp server hostname or ip address admin iw שלו IP-שלך או אתכתובת ה SMTP-הכנס את שם שרת ה +enter your smtp server port admin iw שלך SMTP-הכנס את פורט שרת ה +error felamimail iw שגיאה +error connecting to imap serv felamimail iw IMAP שגיאה בחיבור לשרת +error opening felamimail iw שגיעה בפתיחת +every felamimail iw כל +every %1 days felamimail iw כל %1 ימים +expunge felamimail iw השמד +file into felamimail iw תייק בתוך +files felamimail iw קבצים +filter active felamimail iw מסנן פעיל +filter name felamimail iw שם מסנן +filter rules felamimail iw חוקי סינון +first name felamimail iw שם פרטי +flagged felamimail iw מדוגל +flags felamimail iw דגלים +folder acl felamimail iw רשימת גישה לתיקיה +folder name felamimail iw שם תיקיה +folder path felamimail iw מסלול אל התיקיה +folder preferences felamimail iw עדיפויות תיקיה +folder settings felamimail iw הגדרות תיקיה +folder status felamimail iw סטאטוס תיקיה +folderlist felamimail iw רשימת תיקיות +foldername felamimail iw שם תיקיה +folders felamimail iw תיקיות +folders created successfully! felamimail iw !התיקיה נוצרה בהצלחה +follow felamimail iw עקוב +for mail to be send - not functional yet felamimail iw עבור דואר שישלח - עדיין לא עובד +for received mail felamimail iw עבור דואר נכנס +forward felamimail iw העבר +found felamimail iw נמצא +fri felamimail iw שישי +from felamimail iw מאת +from(a->z) felamimail iw (מאת (א ->ת +from(z->a) felamimail iw (מאת (ת->א +full name felamimail iw שם מלא +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail iw תסתכל ב- www.felamimail.org כדי ללמוד עוד על Squirrelmail.
    +header lines felamimail iw שורות כותרת +hide header felamimail iw הסתר כותרת +icons and text felamimail iw צלמיות וטקסט +icons only felamimail iw צלמיות בלבד +identifying name felamimail iw שם מזהה +if felamimail iw אם +illegal folder name. please select a different name. felamimail iw שם תיקיה לא חוקי. נא לבחור שם אחר. +imap server felamimail iw שרת IMAP +imap server address felamimail iw כתובת שרת IMAP +imap server type felamimail iw סוג שרת IMAP +imaps authentication felamimail iw אימות IMAPS +imaps encryption only felamimail iw הצפנת IMAPS בלבד +in felamimail iw בתוך +in order for squirrelmail to provide the full set of options you need to create the special folders listed below. just click the check box and hit the create button. felamimail iw כדי ש-SquirrelMail יוכל לספק את מלוא האופציות האפשריות עליך ליצור את התיקיות המיוחדות הרשומות למטה. רק סמן את התיבה ולחץ על כפתור צור. +in the center felamimail iw במרכז +index order felamimail iw סדר אינדקס +info felamimail iw מידע +invalid user name or password felamimail iw שם משתמש או סיסמא לא חוקי +language felamimail iw שפה +last name felamimail iw שם משפחה +left felamimail iw שמאל +less felamimail iw פחות +let this folder contain subfolders felamimail iw תיקיה זו מכילה תתי תיקיות +light blue felamimail iw כחול בהיר +light cyan felamimail iw ציאן בהיר +light gray felamimail iw אפור בהיר +light green felamimail iw ירוק בהיר +light magenta felamimail iw סגול בהיר +light yellow felamimail iw צהוב בהיר +list all felamimail iw הצג הכל +location of buttons when composing felamimail iw מיקום הכפתורים בעת כתיבת הודעה +location of folder list felamimail iw מיקום רשימת התיקיות +mail server login type admin iw סוג הכניסה לשרת הדואר +mail settings felamimail iw הגדרות דואר +mainmessage felamimail iw הודעה ראשית +manage folders common iw ניהול תיקיות +manage sieve common iw ניהול סקריפטים של Sieve +mark as deleted felamimail iw סמן כמחוק +mark messages as felamimail iw סמן הודעות נבחרות כ- +mark selected as flagged felamimail iw סמן נבחרות כמדוגלות +mark selected as read felamimail iw סמן נבחרות כנקראו +mark selected as unflagged felamimail iw סמן נבחרות כלא מדוגלות +mark selected as unread felamimail iw סמן נבחרות כלא נקראו +match felamimail iw התאם +matches felamimail iw התאמות +matches regexp felamimail iw התאמות regexp +medium gray felamimail iw אפור בינוני +message felamimail iw הודעה +message highlighting felamimail iw הדגשות הודעה +message list felamimail iw רשימת הודעות +messages felamimail iw הודעות +minute felamimail iw דקה +minutes felamimail iw דקות +mon felamimail iw שני +more felamimail iw עוד +move felamimail iw הזז +move messages felamimail iw הזז הודעות +move selected to felamimail iw הזז הודעות אל +move to trash felamimail iw הזז לאשפה +must be unique felamimail iw חייב להיות ייחודי +name felamimail iw שם +never display html emails felamimail iw לעולם לא להציג הודעות HTML +new common iw חדש +new filter felamimail iw מסנן חדש +next felamimail iw הבאה +next message felamimail iw ההודעה הבאה +nickname felamimail iw שם חיבה +no filter felamimail iw ללא מסנן +no folders found felamimail iw לא נמצאו תיקיות +no folders were found to subscribe to! felamimail iw לא נמצאו תיקיות שאפשר להרשם אליהן! +no folders were found to unsubscribe from! felamimail iw לא נמצאו תיקיות שאפשר לבטל הרשמה מהן! +no highlighting is defined felamimail iw לא מוגדרת הדגשה כלשהי +no messages were selected. felamimail iw לא נבחרה אף הודעה. +no next message felamimail iw אין הודעה הבאה +no notification felamimail iw אין התרעה +no personal address book is defined. contact administrator. felamimail iw לא הוגדרה ספר כתובות אישי. צור קשר אם המנהל. +no persons matching your search was found felamimail iw לא נמצאו אנשים המתאימים לחיפוש. +no previous message felamimail iw אין הודעה קודמת +no valid emailprofile selected!! felamimail iw לא נבחרה פרופיל דוא"ל חוקי !! +none felamimail iw ללא +number of messages to index felamimail iw מספר ההודעות למיפתוח +on behalf of felamimail iw בשם +only inbox felamimail iw רק תיבת דואר נכנס +only unseen felamimail iw רק לא נקראו +open all felamimail iw פתח הכל +options felamimail iw אפשריות +organisation felamimail iw אירגון +organization felamimail iw אירגון +organization name admin iw שם האירגון +oth felamimail iw אחר +participants felamimail iw משתתפים +personal information felamimail iw מידע אישי +posting felamimail iw שולח +preference file %1 not found. exiting abnormally felamimail iw קובץ עדיפויות %1 לא נמצא. יוצא יציאה לא טבעית. +preference file, %1, does not exist. log out, and log back in to create a default preference file. felamimail iw קובץ עדיפויות, %!, לא קיים. צא מהמערכת וכנס מחדש כדי ליצור קובץ עדיפויות מחדלי. +previous felamimail iw הקודמת +previous message felamimail iw ההודעה הקודמת +print it felamimail iw הדפס +print this page felamimail iw הדפס עמוד זה +purge felamimail iw טהר +quicksearch felamimail iw חיפוש מהיר +read felamimail iw קרא +read da felamimail iw קרא מידע +reading felamimail iw קורא +reason giv felamimail iw הסיבה הניתנת +recent felamimail iw לאחרונה +refresh folder list felamimail iw רענן רשימת תיקיות +refresh page felamimail iw רענן עמוד +refresh time in minutes felamimail iw זמן רענון בדקות +remove felamimail iw הסר +remove immediately felamimail iw הסר מיד +rename felamimail iw שנה שם +rename a folder felamimail iw שנה שם תיקיה +rename folder felamimail iw שנה שם תיקיה +renamed successfully! felamimail iw השם שונה בהצלחה! +replied felamimail iw הישיב +reply felamimail iw השב +reply all felamimail iw השב לכל +reply to felamimail iw השב ל +replyto felamimail iw השב ל +return felamimail iw חזור +return to options page felamimail iw חזור לעמוד אפשריות +right felamimail iw ימין +rule felamimail iw חוק +running squirrelmail version %1 (c) 1999-2000. felamimail iw מריץ SquirrelMail גירסא%1 (c) 1999-2000. +same window - not functional yet felamimail iw אותו חלון - עוד לא עובד +sat felamimail iw שבת +save felamimail iw שמור +search felamimail iw חפש +search for felamimail iw חפש +seconds felamimail iw שניות +select felamimail iw בחר +select all felamimail iw בחר הכל +select emailprofile felamimail iw בחר פרופיל דוא"ל +select home email address felamimail iw בחר כתובת דוא\"ל בבית +select work email address felamimail iw בחר כתובת דוא\"ל בעבודה +select your mail server type admin iw בחר את סוג שרת הדואר שלך +send felamimail iw שלח +sent fold felamimail iw תיקית נשלחו +sent folder felamimail iw תיקיית נשלחו +server respond felamimail iw תגובת השרת +show header felamimail iw הצג כותרת +show new messages on main screen felamimail iw הצג הודעות חדשות במסך הראשי. +sieve settings admin iw הגדרות Sieve +signature felamimail iw חתימה +simply click the target-folder felamimail iw פשוט הקלק על תיקיית היעד +size felamimail iw גודל +size of editor window felamimail iw גודל חלון העריכה +size(...->0) felamimail iw גודל (...->0) +size(0->...) felamimail iw גודל (0->...) +small view felamimail iw תצוגה קטנה +smtp settings admin iw הגדרות SMTP +some or all of the help documents are not present! felamimail iw לפחות חלק מקבצי העזרה חסרי! +source felamimail iw מקור +special folder options felamimail iw אפשריות תיקיה מיוחדות +subject felamimail iw נושא +subject(a->z) felamimail iw נושא (א -> ת) +subject(z->a) felamimail iw נושא (ת -> א) +submit felamimail iw הגש +subscribe felamimail iw הרשם +subscribed felamimail iw רשום +subscribed successfully! felamimail iw נרשם בהצלתה~! +successfully saved display preferences! felamimail iw עדיפויות תצוגה נשמרו בהצלחה! +successfully saved folder preferences! felamimail iw עדיפויות תיקיה נשמרו בהצלחה! +successfully saved personal information! felamimail iw מידע אישי נשמר בהצלחה! +sun felamimail iw ראשון +switch current folder to felamimail iw החלף תיקיה נוכחית ל- +table of contents felamimail iw תוכן העיניינים +text only felamimail iw טקסו בלבד +the connection to the imap server failed!! felamimail iw הקישור לשרת IMAP נכשל!! +the help has not been translated to %1. it will be displayed in english instead. felamimail iw העזרה עדיין לא תורגמה ל %1. היא תוצג באנגלית במקום זאת. +the index order is the order that the columns are arranged in the message index. you can add, remove, and move columns around to customize them to fit your needs. felamimail iw סדר האינדקס הוא הסדר בו העמודות מסודרות באינדקס ההודעות. אפשר להוסיף, להסיר ולהזיז עמודות כדי להתאים אותן לצורכיך. +the order of the message index can be rearanged and changed to contain the headers in any order you want. felamimail iw ניתן לשנות את סדר אינדקס ההודעות כדי להכיל את הכותרות בכל סדר רצוי לך. +theme felamimail iw ערכת נושא +these settings change the way your folders are displayed and manipulated. felamimail iw הגדרות אלו משנות את הדרך בה התיקיות שלך מוצגות ומטופלות. +this contains personal information about yourself such as your name, your email address, etc. felamimail iw זה מכיל מידע אישי ודותך כמו שמך, כתובת דו"ל וכדומה. +this folder is empty felamimail iw תיקיה זו ריקה +this port is based on squirrelmail, which is a standalone imap client.
    felamimail iw פורט זה מבוסס על Squirrelmail, שהנו לקוח IMAP העומד בפני עצמו.
    +thu felamimail iw חמישי +to felamimail iw אל +to the left felamimail iw לשמאל +to the right felamimail iw לימין +top felamimail iw עליון +translation location felamimail iw מיקום התרגום +translation preferences felamimail iw עדיפויות תרגום +translation server felamimail iw שרת תרגום +trash fold felamimail iw תיקיית אשפה +trash folder felamimail iw תיקיית אשפה +tue felamimail iw שלישי +type felamimail iw סוג +unable to list addresses from %1 felamimail iw לא יכול להציג כתובות מ-%1 +unflagged felamimail iw לא מדוגלים +unknown err felamimail iw שגיאה לא ידועה +unknown error felamimail iw שגיאה לא ידועה +unknown sender felamimail iw שולח לא ידוע +unknown user or password incorrect. felamimail iw משתמש לא מוכר או שגיאה בסיסמא. +unread common iw לא נקרא +unseen felamimail iw לא נראה +unseen and total felamimail iw לא נראו וסך הכל +unseen message notification felamimail iw התרעה על הודעה שלא נראה +unseen message notification type felamimail iw סוג ההתרעה על הודעה שלא נראה +unselect all felamimail iw נקה בחר הכל +unsubscribe felamimail iw בטל הרשמה +unsubscribed felamimail iw הרשמה בוטלה +unsubscribed successfully! felamimail iw הרשמה בוטלה בהצלחה! +up felamimail iw למעלה +update address felamimail iw עדכן כתובת +use emailadmin to create profiles felamimail iw השתמש ב-EmailAdmin כדי ליצור פרופילים +use a signature felamimail iw השתמש בחתימה +use a signature? felamimail iw השתמש בחתימה? +use addresses felamimail iw השתמש בכתובת +use custom settings felamimail iw השתמש בהגדרות מותאמות אישית +use javascript or html addressbook? felamimail iw להשתמש בספר כתובת Javascript או HTML? +use smtp auth admin iw השתמש באימות משתמשים של SMTP +users can define their own emailaccounts admin iw משתמשים יכולים להגדיר בעצמם את חשבונות דואר האלקטרוני שלהם +view full header felamimail iw הצג כותרת מלאה +view message felamimail iw הצג הודעה +viewing full header felamimail iw מציג כותרת מלאה +viewing message felamimail iw מציג הודעה +viewing messages felamimail iw מציג הודעות +wed felamimail iw רביעי +welcome to %1's webmail system felamimail iw ברוך בואך אל מערכ ה-WebMail של %1 +when deleting messages felamimail iw בשעת מחיקת הדעות +white felamimail iw לבן +width of folder list felamimail iw רוחב רשימת התיקיות +wrap incoming text at felamimail iw גלל טקסט נכנס ב- +writing felamimail iw כותב +wrote felamimail iw כתב +you can change the way that squirrelmail looks and displays information to you, such as the colors, the language, and other settings. felamimail iw אפשר לשנות את הצורה בה SquirrelMail נראה ומציג מידע, לדוגמת צבעים, שפות והגדרות נוספות. +you can only edit one address at the time felamimail iw אשפר לערוך רק כתובת אחת בכל פעם +you must login first. felamimail iw עליך להכנס למערכת קודם. +you need a valid user and password to access this page! felamimail iw צריך שם משתמש וסיסמה בתוקף כדי לגשת לעמוד זה! +your search failed with the following error(s) felamimail iw חיפשך נכשל עם השגיאה(ות) הבאות diff --git a/felamimail/lang/egw_ja.lang b/felamimail/lang/egw_ja.lang new file mode 100644 index 0000000000..79c5dfee87 --- /dev/null +++ b/felamimail/lang/egw_ja.lang @@ -0,0 +1,71 @@ +add address felamimail ja 追加 +add to %1 felamimail ja %1 追加 +additional info felamimail ja 追加情報 +as a subfolder of felamimail ja 親フォルダ +attach: felamimail ja 添付ファイル +attachments felamimail ja 添付ファイル +bcc: felamimail ja BCC: +body felamimail ja 本文 +cc: felamimail ja CC: +checkbox felamimail ja チェックボックス +checked messages felamimail ja 指定メッセージ +color felamimail ja 色 +create folder felamimail ja フォルダ作成 +Created folder successfully! felamimail ja フォルダを作成しました。 +current folder felamimail ja 現在のフォルダ +current folder: felamimail ja 現在のフォルダ +date: felamimail ja 送信日付: +delete folder felamimail ja フォルダ削除 +deleted folder successfully! felamimail ja フォルダを削除しました。 +delete selected felamimail ja 削除 +down felamimail ja 下 +download this as a file felamimail ja このメッセージをダウンロード +e-mail address felamimail ja 電子メール +edit selected felamimail ja 訂正 +everywhere felamimail ja すべて +from: felamimail ja 差出人: +identifying name felamimail ja 定義名 +index order felamimail ja 表示項目設定 +info felamimail ja 追加情報 +message list felamimail ja メッセージ一覧 +message highlighting felamimail ja メッセージ強調表示 +move felamimail ja 移動 +move & follow felamimail ja 移動と選択 +move selected to: felamimail ja 選択メッセージ移動先 +must be unique felamimail ja 重複しない値を入力 +new felamimail ja 新規作成 +new name: felamimail ja 新しいフォルダ名: +nickname felamimail ja ニックネーム +no folders found felamimail ja フォルダなし +no folders were found to subscribe to! felamimail ja 表示可能なフォルダがありません。 +no folders were found to unsubscribe from! felamimail ja 非表示可能なフォルダがありません。 +no highlighting is defined felamimail ja 強調表示は未定義です。 +no messages found felamimail ja メッセージが見つかりません。 +no messages were selected. felamimail ja メッセージを選択してください。 +options felamimail ja オプション +original message felamimail ja Original Message +personal address book felamimail ja 個人アドレス帳 +personal information felamimail ja 個人情報 +refresh folder list felamimail ja フォルダ再表示 +remove felamimail ja 削除 +rename a folder felamimail ja フォルダ名の変更 +renamed successfully! felamimail ja フォルダ名を変更しました。 +reply to felamimail ja リプライ +select all felamimail ja 全て選択 +signature felamimail ja 署名 +subscribe felamimail ja 表示 +subscribed successfully! felamimail ja 表示にしました。 +this contains personal information about yourself such as your name, your email address, etc. felamimail ja 電子メールアドレスや送信者名などの個人情報を設定します。 +to felamimail ja to +to: felamimail ja 宛先: +unsubscribe felamimail ja 非表示 +unsubscribed successfully! felamimail ja 非表示にしました。 +unselect all felamimail ja 全て選択解除 +up felamimail ja 上 +update address felamimail ja アドレス更新 +use a signature? felamimail ja 署名を使用 +view full header felamimail ja ヘッダ表示 +viewing full header felamimail ja ヘッダ表示 +viewing message felamimail ja 表示数 +view messages felamimail ja メッセージ表示 +viewing messages felamimail ja 表示数 diff --git a/felamimail/lang/egw_lt.lang b/felamimail/lang/egw_lt.lang new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/felamimail/lang/egw_lt.lang @@ -0,0 +1 @@ + diff --git a/felamimail/lang/egw_lv.lang b/felamimail/lang/egw_lv.lang new file mode 100644 index 0000000000..95e1a01375 --- /dev/null +++ b/felamimail/lang/egw_lv.lang @@ -0,0 +1,302 @@ +(no subject) felamimail lv (nav temata) +(only cc/bcc) felamimail lv (tikai Cc/Bcc) +(unknown sender) felamimail lv (nezināms sūtītājs) +activate felamimail lv Aktivizēt +activate script felamimail lv aktivizēt skriptu +add address felamimail lv Pievienot adresi +add rule felamimail lv Pievienot kārtulu +add script felamimail lv Pievienot skriptu +add to %1 felamimail lv Pievinot %1 +add to address book felamimail lv Pievienot adrešu grāmatai +add to addressbook felamimail lv pievienot adrešu grāmatai +additional info felamimail lv Papildus informācija +address book felamimail lv Adrešu grāmata +address book search felamimail lv Adrešu grāmatas meklētājs +after message body felamimail lv Pēc vēstules teksta +all address books felamimail lv Visas adrešu grāmatas +all folders felamimail lv Visas mapes +always show html emails felamimail lv Vienmēr rādīt HTML e-pasta vēstules +anyone felamimail lv jebkurš +as a subfolder of felamimail lv kā apakšmape +attachments felamimail lv Pielikumi +auto refresh folder list felamimail lv Automātiski atsvaidzināt mapes sarakstu +back to folder felamimail lv Atpakaļ uz mapi +bcc felamimail lv BCC +before headers felamimail lv Pirms galvenes +between headers and message body felamimail lv Starp galveni un vēstules tekstu +body part felamimail lv teksta daļa +can't connect to inbox!! felamimail lv nevar pieslēgties iesūtnei!! +cc felamimail lv CC +change folder felamimail lv Pāriet uz mapi +checkbox felamimail lv izvēles rūtiņa +click here to log back in. felamimail lv Noklikšķini šeit, lai autorizētos vēlreiz. +click here to return to %1 felamimail lv Noklikšķini šeit, lai atgrieztos uz %1 +close all felamimail lv aizvērt visu +close this page felamimail lv aizvērt šo lapu +close window felamimail lv Aizvērt logu +color felamimail lv Krāsa +compose felamimail lv Rakstīt jaunu +compress folder felamimail lv Kompresēt mapi +configuration felamimail lv Konfigurēšana +contains felamimail lv satur +create felamimail lv Izveidot +create folder felamimail lv Izveidot mapi +create sent felamimail lv Izveidot Nosūtītās +create subfolder felamimail lv Izveidot apakšmapi +create trash felamimail lv Izveidot mapi Dzēstās +created folder successfully! felamimail lv Mape veiksmīgi izveidota! +dark blue felamimail lv Tumši zils +dark cyan felamimail lv Tumšs ciāns +dark gray felamimail lv Tumši pelēks +dark green felamimail lv Tumši zaļš +dark magenta felamimail lv Tumšs fuksīns +dark yellow felamimail lv Tumši dzeltens +date(newest first) felamimail lv Datums (jaunākais pirmais) +date(oldest first) felamimail lv Datums (vecākais pirmais) +days felamimail lv dienas +deactivate script felamimail lv deaktivizēt skriptu +default sorting order felamimail lv Noklusētā kārtošanas secība +delete all felamimail lv izdzēst visu +delete folder felamimail lv Izdzēst mapi +delete selected felamimail lv Izdzēst atzīmēto +delete selected messages felamimail lv izdzēst atzīmētās vēstules +deleted felamimail lv izdzēsts +deleted folder successfully! felamimail lv Mape veiksmīgi izdzēta! +disable felamimail lv Neatļauts +display message in new window felamimail lv Parādīt vēstuli jaunā logā +display of html emails felamimail lv Parādīt HTML vēstules +display only when no plain text is available felamimail lv Parādīt tikai tad, kad pieejams atklāts teksts +display preferences felamimail lv Parādīt izvēles +do it! felamimail lv dari to! +do not use sent felamimail lv Nelieto nosūtīts +do not use trash felamimail lv Nelieto atkritumi +do you really want to delete the '%1' folder? felamimail lv Vai tiešām vēlies dzēst mapi "%1"? +does not contain felamimail lv nesatur +does not match felamimail lv neatbilst +don't use sent felamimail lv Nelieto nosūtīts +don't use trash felamimail lv Nelieto atkritui +down felamimail lv lejā +download felamimail lv lejupielādēt +download this as a file felamimail lv Lejupielādēt šo kā failu +e-mail felamimail lv E-pasts +e-mail address felamimail lv E-pasta adrese +e-mail folders felamimail lv E-pasta mapes +edit filter felamimail lv Rediģēt filtru +edit rule felamimail lv rediģēt kārtulu +edit selected felamimail lv Rediģēt atzīmēto +email address felamimail lv E-pasta adrese +email signature felamimail lv E-pasta paraksts +empty trash felamimail lv atbrīvot atkritumus +enable felamimail lv atļaut +enter your default mail domain ( from: user@domain ) admin lv Ievadi noklusēto pasta domēnu (NO: lietotājs@domēns) +enter your imap mail server hostname or ip address admin lv Ievadi tava IMAP servera hosta vārdu vai IP adresi +enter your sieve server hostname or ip address admin lv Ievadi tava SIEVE servera hosta vārdu vai IP adresi +enter your sieve server port admin lv Ievadi tava SIEVE servera portu +enter your smtp server hostname or ip address admin lv Ievadi tava SMTP servera hosta vārdu vai IP adresi +enter your smtp server port admin lv Ievadi tava SMTP servera portu +error felamimail lv Kļūda! +error connecting to imap serv felamimail lv Kļūda pieslēdzoties IMAP serverim +error opening felamimail lv Kļūda atverot +every felamimail lv katru +every %1 days felamimail lv katras %1 dienas +expunge felamimail lv Izņemt +felamimail common lv ViA e-pasts +file into felamimail lv ievietot +files felamimail lv datnes +filter active felamimail lv aktīvais filtrs +filter name felamimail lv Filtra nosaukums +first name felamimail lv Vārds +flagged felamimail lv arkarodziņiem +flags felamimail lv Karodziņi +folder name felamimail lv Mapes nosaukums +folder path felamimail lv Mapes ceļš +folder preferences felamimail lv Mapes izvēles +folder settings felamimail lv Mapes uzstādījumi +folder status felamimail lv Mapes statuss +folderlist felamimail lv Mapes saraksts +foldername felamimail lv Mapes nosaukums +folders felamimail lv Mapes +folders created successfully! felamimail lv Mapes tika veiksmīgi izveidotas! +follow felamimail lv sekot +for received mail felamimail lv Saņemtām vēstulēm +forward felamimail lv Pārsūtīt +forward to address felamimail lv pārsūtīt uz adresi +found felamimail lv Atrasts +fri felamimail lv Pk +from felamimail lv No +from(a->z) felamimail lv No (A->Z) +from(z->a) felamimail lv No (Z->A) +full name felamimail lv Pilns vārds +greater than felamimail lv lielāks nekā +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail lv Lai vairāk uzzinātu par Squirrelmail, paskaties www.felamimail.org
    +header lines felamimail lv Galvenes rindas +hide header felamimail lv noslēpt galveni +html felamimail lv HTML +icons and text felamimail lv Ikonas un teksts +icons only felamimail lv Rādīt tikai ikonas +identifying name felamimail lv Identificē vārdu +if felamimail lv Ja +illegal folder name. please select a different name. felamimail lv Neatļauts mapes nosaukums. Lūdzu, izvēlies citu! +imap felamimail lv IMAP +imap server felamimail lv IMAP serveris +imap server address felamimail lv IMAP servera adrese +imap server type felamimail lv IMAP servera tips +imaps authentication felamimail lv IMAP servera autentifikācija +imaps encryption only felamimail lv IMAP servera šifrēšana +in felamimail lv in +index order felamimail lv Indeksu kārtība +info felamimail lv Informācija +invalid user name or password felamimail lv Nederīgs lietotājvārds vai parole +javascript felamimail lv JavaScript +keep a copy of the message in your inbox felamimail lv saglabāt vēstules kopiju IESŪTNĒ +kilobytes felamimail lv kb +language felamimail lv Valoda +last name felamimail lv Uzvārds +left felamimail lv Pa kreisi +less felamimail lv mazāk +less than felamimail lv mazāk nekā +light gray felamimail lv Gaiši pelēks +list all felamimail lv Uzskaitīt visu +location of buttons when composing felamimail lv Pogu novietojums, kad raksta +mail settings felamimail lv Pasta uzstādījumi +mainmessage felamimail lv galvenais ziņojums +manage folders common lv Pārvaldīt mapes +manage sieve common lv Pārvaldīt SIEVE skriptus +mark as deleted felamimail lv Atzīmēt kā izdzēstu +mark messages as felamimail lv Atzīmēt atlasītās vēstules kā +mark selected as read felamimail lv Atzīmēt atlasītās kā izlasītas +mark selected as unread felamimail lv Atzīmē atlasītās kā nelasītas +message highlighting felamimail lv Vēstules izgaismošana +message list felamimail lv Vēstuļu saraksts +messages felamimail lv vēstules +mon felamimail lv Pr +move felamimail lv pārvietot +move messages felamimail lv pārvietot vēstules +move selected to felamimail lv pārvietot atlasītās uz +move to trash felamimail lv Pārvietot uz atkritumiem +moving messages to felamimail lv vēstules tiek pārvietoti uz +name felamimail lv Vārds +never display html emails felamimail lv Nekas nerādīt HTML vēstules +new common lv Jauns +new filter felamimail lv Jauns filtrs +next felamimail lv Nākošais +next message felamimail lv nākamā vēstule +no filter felamimail lv Bez filtra +no folders found felamimail lv Netika atrasta neviena mape +no folders were found to subscribe to! felamimail lv Netika atrasta neviena mape, kurai pierakstīties! +no folders were found to unsubscribe from! felamimail lv Netika atrasta neviena mape, no kuras izrakstīties! +no highlighting is defined felamimail lv Nav definēta izgaismošana +no messages found... felamimail lv netika atrasta neviena vēstule... +no messages were selected. felamimail lv Netika atlasīta neviena vēstule +no previous message felamimail lv nav iepriekšējās vēstules +no valid emailprofile selected!! felamimail lv Nav atlasīts derīgs E-pasta profils +none felamimail lv neviens +only inbox felamimail lv Tikai iesūtne +only unseen felamimail lv Tikai neredzētos +open all felamimail lv atvērt visus +options felamimail lv Iespējas +organization felamimail lv organizācija +organization name admin lv Organizācijas nosaukums +participants felamimail lv Dalībnieki +personal information felamimail lv Personīgā informācija +please select a address felamimail lv Lūdzu, izvēlieties adresi +posting felamimail lv apziņošana +previous felamimail lv Iepriekšējā +previous message felamimail lv Iepriekšējā vēstule +print it felamimail lv izdrukā to +print this page felamimail lv izdrukā šo lapu +quicksearch felamimail lv Ātrā meklēšana +read felamimail lv lasīt +reading felamimail lv lasīšana +recent felamimail lv nesen +refresh time in minutes felamimail lv Atjaunošanas laiks ( minūtēs ) +remove felamimail lv pārvietot +remove immediately felamimail lv Pārvietot nekavējoties +rename felamimail lv Pārsaukt +rename a folder felamimail lv Pārsaukt mapi +rename folder felamimail lv Pārsaukt mapi +renamed successfully! felamimail lv Veiksmīgi pārsaukts! +replied felamimail lv atbildēts +reply felamimail lv Atbildēt +reply all felamimail lv Atbildēt visiem +reply to felamimail lv Atbildēt +replyto felamimail lv Atbildēt +return felamimail lv Atgriezties +return to options page felamimail lv Atgriezties opciju lapā +right felamimail lv Pa labi +rule felamimail lv Kārtula +sat felamimail lv Se +save felamimail lv Saglabāt +save changes felamimail lv sag;abāt izmaiņas +search felamimail lv Meklēt +search for felamimail lv Meklēt +select felamimail lv Atzīmēt +select all felamimail lv Atzīmēt visu +select emailprofile felamimail lv Atzīmē e-pasta profilu +select your mail server type admin lv Atzīmē tava e-pasta servera tipu +send felamimail lv Sūtīt +sent folder felamimail lv Mape nosūtīts +show header felamimail lv rādīt galveni +show new messages on main screen felamimail lv Rādīt jaunās vēstules galvenajā logā +sieve settings admin lv SIEVE uzstādījumi +signature felamimail lv Paraksts +simply click the target-folder felamimail lv Vienkārši noklikšķini uz mērķa mapes +size felamimail lv Izmērs +size of editor window felamimail lv Redaktora loga izmērs +size(...->0) felamimail lv Izmērs (...->0) +size(0->...) felamimail lv Izmērs (0->...) +small view felamimail lv mazais skats +smtp settings admin lv SMTP uzstādījumi +subject felamimail lv Tēma +subject(a->z) felamimail lv Tēma (A->Z) +subject(z->a) felamimail lv Tēma (Z->A) +submit felamimail lv Iesniegt +subscribe felamimail lv Parakstīties +subscribed felamimail lv Parakstīts +subscribed successfully! felamimail lv Veiksmīgi parakstīts! +sun felamimail lv Sv +table of contents felamimail lv Satura rādītājs +text only felamimail lv Tikai teksts +the connection to the imap server failed!! felamimail lv Neveiksmīga pieslēgšanās IMAP serverim! +then felamimail lv THEN +this folder is empty felamimail lv Šī mape ir tukša +this php has no imap support compiled in!! felamimail lv Šim PHP nav IMAP nokompilēts atbalsts +thu felamimail lv Ce +to felamimail lv Uz +translation preferences felamimail lv Vēlamie tulkošanas iestatījumi +translation server felamimail lv Tulkojuma serveris +trash folder felamimail lv Atkritumu mape +tue felamimail lv Ot +type felamimail lv tips +unknown err felamimail lv Nezināma kļūda +unknown error felamimail lv Nezināma kļūda +unknown sender felamimail lv Nezināms sūtītājs +unknown user or password incorrect. felamimail lv Nezināms lietotājs vai nepareiza parole +unread common lv Nelasīts +unseen felamimail lv Neredzēts +unselect all felamimail lv Noņemt atzīmi no visām +unsubscribe felamimail lv Atrakstīties +unsubscribed felamimail lv Atrakstīts +unsubscribed successfully! felamimail lv Veiksmīgi atrakstīts! +up felamimail lv augšup +use emailadmin to create profiles felamimail lv lai izveidotu profilus,lieto EmailAdmin +use a signature felamimail lv Lietot parakstu +use a signature? felamimail lv Lietot parakstu? +use addresses felamimail lv Lietot adreses +use custom settings felamimail lv Lietot persnonalizētus iestatījumus +use javascript or html addressbook? felamimail lv LIetot Javascript vai HTML adrešu grāmatu? +use smtp auth admin lv Lieto SMTP autentifikāciju +users can define their own emailaccounts admin lv Lietotāji paši var kontrolēt savus e-pasta kontus +vacation notice felamimail lv norāde par atrašanos atvaļinājumā +view full header felamimail lv Rādīt pilnu galveni +view message felamimail lv Rādīt vēstuli +viewing full header felamimail lv Rāda pilnu galveni +viewing message felamimail lv Rāda vēstuli +viewing messages felamimail lv Rāda vēstules +wed felamimail lv Tr +welcome to %1's webmail system felamimail lv Lapni lūdzam %1 WebMail sistēmā +when deleting messages felamimail lv Kad dzēš vēstules +wrap incoming text at felamimail lv Ienākošo tekstu dalīt rindās pie +writing felamimail lv raksta +wrote felamimail lv rakstīja +you must login first. felamimail lv Jums vispirms jāautorizējas! diff --git a/felamimail/lang/egw_nl.lang b/felamimail/lang/egw_nl.lang new file mode 100644 index 0000000000..86f46ef995 --- /dev/null +++ b/felamimail/lang/egw_nl.lang @@ -0,0 +1,471 @@ +(no subject) felamimail nl (geen onderwerp) +(only cc/bcc) felamimail nl (alleen Cc./Bcc.) +(separate multiple addresses by comma) felamimail nl (meerdere adressen scheiden door komma's) +(unknown sender) felamimail nl (onbekende afzender) +activate felamimail nl Activeren +activate script felamimail nl script inschakelen +activating by date requires a start- and end-date! felamimail nl Activering op datum vereist een begin- EN einddatum! +add acl felamimail nl ACL toevoegen +add address felamimail nl Adres toevoegen +add rule felamimail nl Regel toevoegen +add script felamimail nl Script toevoegen +add to %1 felamimail nl Aan %1 toevoegen +add to address book felamimail nl Aan adresboek toevoegen +add to addressbook felamimail nl Aan adresboek toevoegen +adding file to message. please wait! felamimail nl Een bestand wordt aan het bericht toegevoegd. Even wachten! +additional info felamimail nl Extra informatie +address book felamimail nl Adresboek +address book search felamimail nl Zoeken in adresboek +after message body felamimail nl Na tekstgedeelte +all address books felamimail nl Alle adresboeken +all folders felamimail nl Alle mappen +all of felamimail nl alles van +allow images from external sources in html emails felamimail nl Afbeeldingen vanaf externe bronnen in HTML emails toestaan +allways a new window felamimail nl altijd in een nieuw venster +always show html emails felamimail nl Altijd HTML-emails weergeven +and felamimail nl en +any of felamimail nl iedere van +any status felamimail nl iedere status +anyone felamimail nl iedereen +as a subfolder of felamimail nl als een submap van +attachments felamimail nl bijlagen +authentication required felamimail nl authenticatie vereist +auto refresh folder list felamimail nl Automatisch mappenlijst verversen +back to folder felamimail nl Terug naar map +bad login name or password. felamimail nl Ongeldige login of wachtwoord +bad or malformed request. server responded: %s felamimail nl Ongeldig of slecht geformuleerde aanvraag. Server reageerde: %s +bad request: %s felamimail nl Ongeldig verzoek: %s +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail nl Gebaseerd op opgegeven criteria, kunnen inkomende berichten verschillende achtergrondkleuren krijgen in de berichtenlijst. Dit maakt het makkelijker te zien van wie de berichten afkomstig zijn, vooral in mailinglijsten. +bcc felamimail nl BCC +before headers felamimail nl Voor berichtkoppen +between headers and message body felamimail nl Tussen berichtkoppen en tekstgedeelte +body part felamimail nl tekstgedeelte +by date felamimail nl op datum +can not send message. no recipient defined! felamimail nl kan bericht niet verzenden. Geen ontvanger ingevuld! +can't connect to inbox!! felamimail nl kan geen verbinding maken met INBOX!! +cc felamimail nl CC +change folder felamimail nl Wijzig map +check message against next rule also felamimail nl controleer bericht ook tegen de volgende regel +checkbox felamimail nl Checkbox +clear search felamimail nl zoekveld leegmaken +click here to log back in. felamimail nl Klik hier om opnieuw in te loggen. +click here to return to %1 felamimail nl Klik hier om terug te gaan naar %1 +close all felamimail nl alles sluiten +close this page felamimail nl Sluit dit venster +close window felamimail nl Venster sluiten +color felamimail nl Kleur +compose felamimail nl Schrijf nieuw bericht +compose as new felamimail nl Stel op als nieuw +compress folder felamimail nl Comprimeer map +condition felamimail nl conditie +configuration felamimail nl Configuratie +connection dropped by imap server. felamimail nl Connectie verbroken door IMAP server. +contains felamimail nl bevat +could not complete request. reason given: %s felamimail nl Kon verzoek niet afmaken. Opgegeven reden: %s +could not import message: felamimail nl Kon het bericht niet importeren: +could not open secure connection to the imap server. %s : %s. felamimail nl Kon beveiligde verbinding met de IMAP server niet openen. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. felamimail nl CRAM-MD5 of DIGEST-MD5 vereist dat het Auth_SASL package geinstalleerd is. +create felamimail nl Aanmaken +create folder felamimail nl Map aanmaken +create sent felamimail nl Verzondenmap aanmaken +create subfolder felamimail nl Submap aanmaken +create trash felamimail nl Prullenmandmap aanmaken +created folder successfully! felamimail nl Map met succes aangemaakt! +dark blue felamimail nl Donker blauw +dark cyan felamimail nl Donker cyaan +dark gray felamimail nl Donker grijs +dark green felamimail nl Donker groen +dark magenta felamimail nl Donker magenta +dark yellow felamimail nl Donker geel +date(newest first) felamimail nl Datum (nieuwste eerst) +date(oldest first) felamimail nl Datum (oudste eerst) +days felamimail nl dagen +deactivate script felamimail nl script uitschakelen +default felamimail nl standaard +default signature felamimail nl standaard ondertekening +default sorting order felamimail nl Standaard volgorde +delete all felamimail nl Alles verwijderen +delete folder felamimail nl Map verwijderen +delete script felamimail nl script verwijderen +delete selected felamimail nl Het geselecteerde verwijderen +delete selected messages felamimail nl Geselecteerde berichten verwijderen +deleted felamimail nl verwijderde +deleted folder successfully! felamimail nl Map met succes verwijderd! +deleting messages felamimail nl berichten worden verwijderd +disable felamimail nl Deactiveren +discard felamimail nl negeer +discard message felamimail nl bericht negeren +display message in new window felamimail nl Bericht in nieuw venster weergeven +display messages in multiple windows felamimail nl berichten in meerdere vensters weergeven +display of html emails felamimail nl Weergave van HTML-emails +display only when no plain text is available felamimail nl Alleen weergeven als platte tekst niet beschikbaar is. +display preferences felamimail nl Weergavevoorkeuren +displaying html messages is disabled felamimail nl weergeven van html berichten is uitgeschakeld +do it! felamimail nl Nu uitvoeren! +do not use sent felamimail nl 'Verzonden' niet gebruiken +do not use trash felamimail nl 'Prullenmand' niet gebruiken +do not validate certificate felamimail nl valideer het certificaat niet +do you really want to delete the '%1' folder? felamimail nl Weet u zeker dat u de '%1' map wilt verwijderen? +do you really want to delete the selected accountsettings and the assosiated identity. felamimail nl Wilt u de geselecteerde Account instellingen en de bijbehorende identiteit echt verwijderen? +do you really want to delete the selected signatures? felamimail nl Wilt u de geselecteerde ondertekening echt verwijderen? +do you really want to move the selected messages to folder: felamimail nl Wilt u de geselecteerde bericht werkelijk verplaatsen naar folder: +do you want to be asked for confirmation before moving selected messages to another folder? felamimail nl Wilt u een bevestigingsvraag krijgen voordat de geselecteerde berichten naar een andere folder worden verplaatst? +does not contain felamimail nl bevat niet +does not exist on imap server. felamimail nl bestaat niet op IMAP server. +does not match felamimail nl komt niet overeen met +does not match regexp felamimail nl komt niet overeen met regexp +don't use draft folder felamimail nl Concepten folder niet gebruiken +don't use sent felamimail nl 'Verzonden' niet gebruiken +don't use template folder felamimail nl Sjablonenfolder niet gebruiken +don't use trash felamimail nl 'Prullenmand' niet gebruiken +dont strip any tags felamimail nl geen enkele tag verwijderen +down felamimail nl omlaag +download felamimail nl Downloaden +download this as a file felamimail nl Dit als een bestand downloaden +draft folder felamimail nl conceptenfolder +drafts felamimail nl Concepten +e-mail felamimail nl Email +e-mail address felamimail nl Emailadres +e-mail folders felamimail nl Emailmappen +edit email forwarding address felamimail nl wijzig email doorstuur adres +edit filter felamimail nl Filter wijzigen +edit rule felamimail nl regel bewerken +edit selected felamimail nl Het geselecteerde wijzigen +edit vacation settings felamimail nl afwezigheidsinstellingen bewerken +editor type felamimail nl Tekstbewerker type +email address felamimail nl Emailadres +email forwarding address felamimail nl email doorstuur adres +email notification update failed felamimail nl email melding kon niet worden bijgewerkt +email signature felamimail nl Emailondertekening +emailaddress felamimail nl emailadres +empty trash felamimail nl Prullenmand legen +enable felamimail nl inschakelen +encrypted connection felamimail nl versleutelde verbinding +enter your default mail domain ( from: user@domain ) admin nl Vul uw standaard mail domein in ( Van: gebruiker@domein ) +enter your imap mail server hostname or ip address admin nl Voer de naam of het IP-adres in van uw IMAP-mailserver +enter your sieve server hostname or ip address admin nl Voer de naam of het IP-adres in van uw SIEVE-server +enter your sieve server port admin nl Voer de poort in van uw SIEVE-server +enter your smtp server hostname or ip address admin nl Vul uw SMTP server hostnaam of IP adres in +enter your smtp server port admin nl Vul uw SMTP server poort in +error felamimail nl FOUT +error connecting to imap serv felamimail nl Fout met het verbinden met de IMAP-server +error connecting to imap server. %s : %s. felamimail nl Fout bij verbinden met de IMAP server. %s : %s +error connecting to imap server: [%s] %s. felamimail nl Fout bij verbinden met de IMAP server: [%s] %s +error opening felamimail nl Fout bij het openen +error: felamimail nl Fout: +error: could not save message as draft felamimail nl Fout: Bericht kon niet worden opgeslagen als Concept +every felamimail nl iedere +every %1 days felamimail nl iedere %1 dagen +expunge felamimail nl Definitief verwijderen +extended felamimail nl uitgebreid +felamimail common nl FelaMiMail +file into felamimail nl bestand naar +files felamimail nl bestanden +filter active felamimail nl Filter actief +filter name felamimail nl Naam filter +filter rules common nl filter regels +first name felamimail nl Voornaam +flagged felamimail nl gemarkeerd +flags felamimail nl Markeringen +folder felamimail nl folder +folder acl felamimail nl folder acl +folder name felamimail nl Mapnaam +folder path felamimail nl Mappad +folder preferences felamimail nl Map voorkeuren +folder settings felamimail nl Map instellingen +folder status felamimail nl Map status +folderlist felamimail nl Mappenlijst +foldername felamimail nl Mapnaam +folders felamimail nl Mappen +folders created successfully! felamimail nl Mappen met succes aangemaakt! +follow felamimail nl volgen +for mail to be send - not functional yet felamimail nl Voor nog te vezenden email - nog niet functioneel +for received mail felamimail nl Voor ontvangen email +forward felamimail nl Doorsturen +forward as attachment felamimail nl doorsturen als bijlage +forward inline felamimail nl doorsturen in het bericht +forward messages to felamimail nl Berichten doorsturen naar +forward to felamimail nl doorsturen naar +forward to address felamimail nl doorsturen naar adres +forwarding felamimail nl Wordt doorgezonden +found felamimail nl Gevonden +fri felamimail nl Vri +from felamimail nl Van +from(a->z) felamimail nl Van (A->Z) +from(z->a) felamimail nl Van (Z->A) +full name felamimail nl Volledige naam +greater than felamimail nl groter dan +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail nl Surf naar www.felamimail.org voor meer informatie over Squirrelmail.
    +header lines felamimail nl Kopregels +hide header felamimail nl Verberg berichtkop +hostname / address felamimail nl host naam / adres +how to forward messages felamimail nl hoe berichten doorgestuurd moeten worden +html felamimail nl HTML +icons and text felamimail nl Icoontjes en tekst +icons only felamimail nl Alleen icoontjes +identifying name felamimail nl Naam voor identificatie +identity felamimail nl identiteit +if felamimail nl ALS +if from contains felamimail nl als van bevat +if mail header felamimail nl als berichtkop bevat +if message size felamimail nl als berichtgrootte +if shown, which folders should appear on main screen felamimail nl indien getoond, welke folders moeten zichtbaar worden op het hoofdscherm +if subject contains felamimail nl als onderwerp bevat +if to contains felamimail nl als aan bevat +if using ssl or tls, you must have the php openssl extension loaded. felamimail nl Indien SSL of TLS gebruikt wordt, moet de PHP extensie openssl geladen zijn. +illegal folder name. please select a different name. felamimail nl Mapnaam niet toegestaan. Select a.b.u. een andere naam. +imap felamimail nl IMAP +imap server felamimail nl IMAP server +imap server address felamimail nl IMAP serveradres +imap server closed the connection. felamimail nl IMAP server sloot de verbinding +imap server closed the connection. server responded: %s felamimail nl IMAP server sloot de verbinding af. Server antwoordde: %s +imap server password felamimail nl imap server wachtwoord +imap server type felamimail nl IMAP servertype +imap server username felamimail nl imap server gebruikersnaam +imaps authentication felamimail nl IMAPS authenticatie +imaps encryption only felamimail nl Uitsluitend IMAPS encryptie +import felamimail nl importeren +import mail felamimail nl Berichten importeren +in felamimail nl in +inbox felamimail nl POSTVAK IN +incoming mail server(imap) felamimail nl inkomene mail server (IMAP) +index order felamimail nl Index volgorde +info felamimail nl Informatie +invalid user name or password felamimail nl Ongeldige gebruikersnaam of -wachtwoord +javascript felamimail nl JavaScript +jumping to end felamimail nl springt naar eind +jumping to start felamimail nl springt naar begin +junk felamimail nl Junk +keep a copy of the message in your inbox felamimail nl bewaar een kopie van het bericht in uw postvak in +keep local copy of email felamimail nl bewaar een lokale kopie van het bericht +kilobytes felamimail nl kilobytes +language felamimail nl Taal +last name felamimail nl Achternaam +left felamimail nl Links +less felamimail nl minder +less than felamimail nl minder dan +light gray felamimail nl Licht grijs +list all felamimail nl Alles weergeven +loading felamimail nl wordt geladen +location of buttons when composing felamimail nl Locatie van knoppen bij het schrijven van een nieuw bericht +mail server login type admin nl Mail server login type +mail settings felamimail nl Emailinstellingen +mainmessage felamimail nl hoofdbericht +manage email accounts and identities common nl Beheer email accounts en identiteiten +manage emailaccounts common nl Beheer email accounts +manage emailfilter / vacation preferences nl Beheer emailfilter / afwezigheid +manage folders common nl Beheer mappen +manage sieve common nl Beheer Sieve scripts +manage signatures felamimail nl Beheer ondertekeningen +mark as deleted felamimail nl Markeer als verwijderd +mark messages as felamimail nl Markeer geselecteerde berichten als +mark selected as flagged felamimail nl Markeer geselecteerde als 'gemarkeerd' +mark selected as read felamimail nl Markeer geselecteerde als 'gelezen' +mark selected as unflagged felamimail nl Markeer geselecteerde als 'niet gemarkeerd' +mark selected as unread felamimail nl Markeer geselecteerde als 'niet gezelezen +match felamimail nl Overeenkomstige +matches felamimail nl komt overeen met +matches regexp felamimail nl komt overeen met regexp +max uploadsize felamimail nl maximum upload grootte +message highlighting felamimail nl Bericht inkleuring +message list felamimail nl Berichtenlijst +messages felamimail nl berichten +mon felamimail nl Maa +move felamimail nl verplaatsen +move messages felamimail nl berichten verplaatsen +move selected to felamimail nl geselecteerde verplaatsen naar +move to trash felamimail nl Verplaatsen naar prullenmand +moving messages to felamimail nl berichten verplaatsen naar +name felamimail nl Naam +never display html emails felamimail nl Nooit HTML-emails weergeven +new common nl Nieuw +new filter felamimail nl Nieuwe filter +next felamimail nl Volgende +next message felamimail nl volgende bericht +no active imap server found!! felamimail nl Geen actieve IMAP server gevonden!! +no address to/cc/bcc supplied, and no folder to save message to provided. felamimail nl Geen adres in AAN/CC/BCC opgegeven en geen map aangegeven waar bericht opgeslagen moet worden. +no encryption felamimail nl geen versleuteling +no filter felamimail nl Geen filter +no folders found felamimail nl Geen mappen gevonden +no folders were found to subscribe to! felamimail nl Geen mappen gevonden om lid van te worden! +no folders were found to unsubscribe from! felamimail nl Geen mappen gevonden om lidmaatschap van op te zeggen! +no highlighting is defined felamimail nl Geen inkleuring ingesteld +no message returned. felamimail nl Geen bericht teruggekomen. +no messages found... felamimail nl geen berichten gevonden... +no messages selected, or lost selection. changing to folder felamimail nl Geen berichten geselecteerd of selectie is verloren gegaan. Schakelt naar folder +no messages were selected. felamimail nl Geen berichten geselecteerd. +no plain text part found felamimail nl geen platte tekst onderdeel gevonden +no previous message felamimail nl geen vorig bericht +no recipient address given! felamimail nl Geen ontvanger adres opgegeven! +no signature felamimail nl geen ondertekening +no subject given! felamimail nl Geen onderwerp opgegeven! +no supported imap authentication method could be found. felamimail nl Geen ondersteunde IMAP authenticatie methode werd gevonden. +no valid emailprofile selected!! felamimail nl Geen geldig Emailprofiel geselecteerd! +none felamimail nl geen +on felamimail nl op +on behalf of felamimail nl namens +one address is not valid felamimail nl Een adres is ongeldig +only inbox felamimail nl Alleen INBOX +only one window felamimail nl uitsluitend één venster +only unseen felamimail nl Alleen ongelezen +open all felamimail nl open alle +options felamimail nl Opties +or felamimail nl of +organisation felamimail nl organisatie +organization felamimail nl Organisatie +organization name admin nl Organisatienaam +original message felamimail nl originele bericht +outgoing mail server(smtp) felamimail nl uitgaande mail server (SMTP) +participants felamimail nl Deelnemers +personal information felamimail nl Persoonlijke informatie +please select a address felamimail nl Kies s.v.p. een adres +please select the number of days to wait between responses felamimail nl Kies s.v.p. het aantal dagen dat gewacht moet worden tussen de antwoorden +please supply the message to send with auto-responses felamimail nl Vul s.v.p. het bericht in dat met de automatisch antwoorden meegezonden moet worden +port felamimail nl poort +posting felamimail nl plaatsen +previous felamimail nl Vorig +previous message felamimail nl Vorig bericht +print it felamimail nl Uitprinten +print this page felamimail nl Deze pagina uitprinten +printview felamimail nl afdrukweergave +quicksearch felamimail nl Snelzoeken +read felamimail nl lezen +reading felamimail nl lezen +receive notification felamimail nl Ontvangst bevestiging +recent felamimail nl Recente +refresh time in minutes felamimail nl Ververstijd in minuten +reject with felamimail nl weiger met +remove felamimail nl Verwijderen +remove immediately felamimail nl Meteen verwijderen +rename felamimail nl Hernoemen +rename a folder felamimail nl Een map hernoemen +rename folder felamimail nl Map hernoemen +renamed successfully! felamimail nl Met succes hernoemd! +replied felamimail nl gereageerd +reply felamimail nl Reageer +reply all felamimail nl Reageer aan adressen in bericht +reply to felamimail nl Reageer aan +replyto felamimail nl Reageer aan +respond felamimail nl Antwoorden +respond to mail sent to felamimail nl antwoorden op mail gezonden aan +return felamimail nl Terug +return to options page felamimail nl Terug naar pagina met opties +right felamimail nl Rechts +row order style felamimail nl rijvolgorde stijl +rule felamimail nl Regel +sat felamimail nl Zat +save felamimail nl Opslaan +save as draft felamimail nl opslaan als concept +save as infolog felamimail nl opslaan als infolog +save changes felamimail nl wijzigingen bewaren +save message to disk felamimail nl bericht opslaan op schijf +script name felamimail nl script naam +script status felamimail nl script status +search felamimail nl Zoeken +search for felamimail nl Zoeken naar +select felamimail nl Selecteren +select all felamimail nl Alles selecteren +select emailprofile felamimail nl Emailprofiel selecteren +select folder felamimail nl map selecteren +select your mail server type admin nl Selecteer uw mail server type +send felamimail nl Verzenden +send a reject message felamimail nl verstuur een weigeringsbericht +sent felamimail nl Verzonden +sent folder felamimail nl Verzondenmap +server supports mailfilter(sieve) felamimail nl server ondersteunt mailfilter (sieve) +set as default felamimail nl Instellen als standaard +show header felamimail nl berichtkop weergeven +show new messages on main screen felamimail nl Nieuwe berichten op hoofdscherm weergeven +sieve script name felamimail nl sieve script naam +sieve settings admin nl SIEVE instellingen +signatur felamimail nl Ondertekening +signature felamimail nl Ondertekening +simply click the target-folder felamimail nl Klik gewoon op de doelmap +size felamimail nl Grootte +size of editor window felamimail nl Grootte van schrijfvenster +size(...->0) felamimail nl Grootte (...->0) +size(0->...) felamimail nl Grootte 0->...) +skipping forward felamimail nl springt voorwaarts +skipping previous felamimail nl springt achterwaarts +small view felamimail nl kleine weergave +smtp settings admin nl SMTP-instellingen +start new messages with mime type plain/text or html? felamimail nl begin nieuwe berichten met mime type, plain/text of html? +subject felamimail nl Onderwerp +subject(a->z) felamimail nl Onderwerp (A->Z) +subject(z->a) felamimail nl Onderwerp (Z->A) +submit felamimail nl Verzend +subscribe felamimail nl Lid worden +subscribed felamimail nl Lid van +subscribed successfully! felamimail nl Met succes lid geworden! +sun felamimail nl Zon +system signature felamimail nl systeem ondertekening +table of contents felamimail nl Inhoudsopgave +template folder felamimail nl Sjabloon folder +templates felamimail nl Sjablonen +text only felamimail nl Alleen tekst +text/plain felamimail nl text/plain +the connection to the imap server failed!! felamimail nl De vebinding met de IMAP-server is mislukt!! +the imap server does not appear to support the authentication method selected. please contact your system administrator. felamimail nl De IMAP server blijkt de authenticatie methode niet te ondersteunen. Neem contact op met uw systeem beheerder. +the message sender has requested a response to indicate that you have read this message. would you like to send a receipt? felamimail nl De afzender heeft verzocht om een leesbevestiging. Wilt u een leesbevestiging verzenden? +the mimeparser can not parse this message. felamimail nl De mimeparsers kan dit bericht niet lezen. +then felamimail nl DAN +this folder is empty felamimail nl DEZE MAP IS LEEG +this php has no imap support compiled in!! felamimail nl In deze PHP versie is geen IMAP ondersteuning meegecompileerd!! +thu felamimail nl Don +to felamimail nl Aan +to mail sent to felamimail nl naar mail gezonden aan +to use a tls connection, you must be running a version of php 5.1.0 or higher. felamimail nl Om een TLS verbinding te gebruiken moet u PHP versie 5.1.0 of hoger gebruiken. +translation preferences felamimail nl Voorkeuren vertaling +translation server felamimail nl Server vertaling +trash felamimail nl Prullenbak +trash fold felamimail nl Prullenbak +trash folder felamimail nl Prullenbak +tue felamimail nl Din +type felamimail nl type +unexpected response from server to authenticate command. felamimail nl Onverwacht antwoord van de server op het AUTHENTICATIE verzoek. +unexpected response from server to digest-md5 response. felamimail nl Onverwacht antwoord van de server op het Digest-MD5 verzoek. +unexpected response from server to login command. felamimail nl Onverwachte reactie van de server op LOGIN opdracht. +unflagged felamimail nl niet gemarkeerd +unknown err felamimail nl Onbekende fout +unknown error felamimail nl Onbekende fout +unknown imap response from the server. server responded: %s felamimail nl Onbekend IMAP antwoord van de server. De server antwoordde: %s +unknown sender felamimail nl Onbekende afzender +unknown user or password incorrect. felamimail nl Onbekende gebruiker of ongeldig wachtwoord. +unread common nl ongelezen +unseen felamimail nl Ongezien +unselect all felamimail nl Deselecteer alles +unsubscribe felamimail nl Afmelden +unsubscribed felamimail nl Afgemeld +unsubscribed successfully! felamimail nl Met succes afgmeld +up felamimail nl boven +updating message status felamimail nl bericht status wordt bijgewerkt +updating view felamimail nl weergave wordt bijgewerkt +use emailadmin to create profiles felamimail nl gebruik EmailAdmin om profielen aan te maken +use a signature felamimail nl Gebruik een ondertekening +use a signature? felamimail nl Een ondertekening gebruiken? +use addresses felamimail nl Gebruik adressen +use custom identities felamimail nl gebruik aangepaste identiteiten +use custom settings felamimail nl Gebruik aangepaste instellingen +use regular expressions felamimail nl gebruik reguliere expressies +use smtp auth admin nl Gebruik SMTP-authenticatie +users can define their own emailaccounts admin nl Gebruikers kunnen hun eigen email accounts maken +vacation notice common nl afwezigheidsbericht +vacation notice is active felamimail nl Afwezigheidbericht is ingeschakeld +vacation start-date must be before the end-date! felamimail nl Afwezigheidbericht startdatum moet VOOR de einddatum liggen! +validate certificate felamimail nl certificaat valideren +view full header felamimail nl Volledige berichtkop weergeven +view header lines felamimail nl kopregels weergeven +view message felamimail nl Bericht weergeven +viewing full header felamimail nl volledige berichtkop weergeven +viewing message felamimail nl bericht weergeven +viewing messages felamimail nl berichten weergeven +wed felamimail nl Woe +when deleting messages felamimail nl Bij het verwijderen van berichten +with message felamimail nl met bericht +with message "%1" felamimail nl met bericht "%1" +wrap incoming text at felamimail nl Kort tekst binnenkomende berichten af op +writing felamimail nl schrijft +wrote felamimail nl schreef +you can use %1 for the above start-date and %2 for the end-date. felamimail nl U kunt %1 gebruiken voor de bovenstaande startdatum en %2 voor de einddatum. +you have received a new message on the felamimail nl U heeft een nieuw bericht ontvangen op de +your message to %1 was displayed. felamimail nl Uw bericht aan %1 is bij de ontvanger weergegeven. diff --git a/felamimail/lang/egw_no.lang b/felamimail/lang/egw_no.lang new file mode 100644 index 0000000000..8a5f62fe56 --- /dev/null +++ b/felamimail/lang/egw_no.lang @@ -0,0 +1,344 @@ +(no subject) felamimail no (uten emne) +(only cc/bcc) felamimail no (kun Kopi/Blindkopi) +(unknown sender) felamimail no (ukjent avsender) +activate felamimail no Aktiviser +activate script felamimail no Aktiviser skript +add address felamimail no Legg til adresse +add rule felamimail no Legg til regel +add script felamimail no Legg til skript +add to %1 felamimail no Legg til %1 +add to address book felamimail no Legg til i adressebok +add to addressbook felamimail no legg til i adressebok +additional info felamimail no Tilleggsinformasjon +address book felamimail no Adressebok +address book search felamimail no Søk i adressebok +after message body felamimail no Etter meldingstekst +all address books felamimail no Alle adressebøker +all folders felamimail no Alle mapper +all of felamimail no alle av +allways a new window felamimail no altid et nytt vindu +always show html emails felamimail no Vis alltid HTML meldinger +any of felamimail no noen av +anyone felamimail no hvem som helst +as a subfolder of felamimail no som en undermappe av +attachments felamimail no Vedlegg +auto refresh folder list felamimail no Oppdater mappeliste automatisk +back to folder felamimail no TIlbake til mappe +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail no Basert på gitte kriterier, kan innkommende meldinger ha forskjellig bakgrunnsfarge i meldingslisten. Dette gir deg oversikt over hvem meldingene er fra, spesielt for e-post lister. +bcc felamimail no Blindkopi +before headers felamimail no Før overskrift +between headers and message body felamimail no Mellom overskift og meldingstekst +body part felamimail no meldingstekst +can't connect to inbox!! felamimail no kan ikke koble til Innboks!! +cc felamimail no Kopi +change folder felamimail no Bytt mappe +check message against next rule also felamimail no Kontroller melding mot neste regel også +checkbox felamimail no Sjekkboks +click here to log back in. felamimail no Klikk her for å logge på igjen +click here to return to %1 felamimail no Klikk her for å returnere til %1 +close all felamimail no lukk alle +close this page felamimail no lukk denne siden +close window felamimail no Lukk vindu +color felamimail no Farge +compose felamimail no Ny melding +compress folder felamimail no Komprimer mappe +configuration felamimail no Konfigurasjon +contains felamimail no inneholder +create felamimail no Opprett +create folder felamimail no Opprett Mappe +create sent felamimail no Opprett Sendt +create subfolder felamimail no Opprett Undermappe +create trash felamimail no Opprett Søppelkurv +created folder successfully! felamimail no Opprettet mappe +dark blue felamimail no Mørk Blå +dark cyan felamimail no Mørk Cyan +dark gray felamimail no Mørk Grå +dark green felamimail no Mørk Grønn +dark magenta felamimail no Mørk Magenta +dark yellow felamimail no Mørk Gul +date(newest first) felamimail no Dato (nyeste først) +date(oldest first) felamimail no Dato (eldste først) +days felamimail no dager +deactivate script felamimail no deaktiver skript +default sorting order felamimail no Standard sortering +delete all felamimail no slett alle +delete folder felamimail no Slett Mappe +delete script felamimail no Slett skript +delete selected felamimail no Slett valgt +delete selected messages felamimail no slett valgte meldinger +deleted felamimail no slettet +deleted folder successfully! felamimail no Slettet mappe +disable felamimail no Deaktiver +discard message felamimail no Forkast melding +display message in new window felamimail no Vis melding i nytt vindu +display of html emails felamimail no Visning av HTML e-post +display only when no plain text is available felamimail no Vis bare når ingen normal tekst er tilgjengelig +display preferences felamimail no Vis Preferanser +do it! felamimail no gjør det! +do not use sent felamimail no Bruk ikke Sendt +do not use trash felamimail no Bruk ikke Søppelkurv +do you really want to delete the '%1' folder? felamimail no Vil du virkelig slette mappen %1? +does not contain felamimail no inneholder ikke +does not match felamimail no stemmer ikke +does not match regexp felamimail no stemmer ikke med regexp +don't use sent felamimail no Ikke bruk Sendt +don't use trash felamimail no Ikke bruk Søppelkurv +down felamimail no ned +download felamimail no last ned +download this as a file felamimail no Last ned dette som en fil +e-mail felamimail no E-mail +e-mail address felamimail no E-mailadresse +e-mail folders felamimail no E-mailmapper +edit filter felamimail no Rediger filter +edit rule felamimail no Rediger regel +edit selected felamimail no Rediger valgt +edit vacation settings felamimail no Redigere ferieinnstillinger +email address felamimail no E-post Adresse +email signature felamimail no E-post signatur +empty trash felamimail no tøm søppelkurv +enable felamimail no muliggjør +enter your default mail domain ( from: user@domain ) admin no Skriv inn ditt standard e-post domene (Fra: bruker@domene) +enter your imap mail server hostname or ip address admin no Skriv inn IMAP tjenernavn eller IP-adresse +enter your sieve server hostname or ip address admin no Skriv inn SIEVE tjenernavn eller IP adresse +enter your sieve server port admin no Skriv inn SIEVE tjenerport +enter your smtp server hostname or ip address admin no Skriv inn SMTP tjenernavn eller IP adresse +enter your smtp server port admin no Skriv inn SMTP tjenerport +error felamimail no FEIL +error connecting to imap serv felamimail no Feil ved tilkobling til IMAP tjener +error opening felamimail no Kunne ikke åpne +every felamimail no hver +every %1 days felamimail no hver %1 dag +expunge felamimail no Slett for godt +felamimail common no E-post +file into felamimail no fil til +files felamimail no filer +filter active felamimail no aktivt filter +filter name felamimail no Filternavn +filter rules felamimail no Regler for filter +first name felamimail no Fornavn +flagged felamimail no flagget +flags felamimail no Flagg +folder acl felamimail no mappe acl +folder name felamimail no Mappemavn +folder path felamimail no Mappesti +folder preferences felamimail no Mappepreferanser +folder settings felamimail no Mappeinnstillinger +folder status felamimail no Mappestatus +folderlist felamimail no Mappeliste +foldername felamimail no Mappenavn +folders felamimail no Mapper +folders created successfully! felamimail no Mappe opprettet! +follow felamimail no følg +for mail to be send - not functional yet felamimail no For mail som skal sendes - ikke funksjonell ennå +for received mail felamimail no For mottatt e-post +forward felamimail no Videresend +forward to address felamimail no Videresend til adresse +found felamimail no Funnet +fri felamimail no Fre +from felamimail no Fra +from(a->z) felamimail no Fra (A -> Å) +from(z->a) felamimail no Fra (Å -> A) +full name felamimail no Fullt Navn +greater than felamimail no Større enn +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail no Ta en kikk på www.felamimail.org for å lære mer om Squirrelmail.
    +header lines felamimail no Hodelinjer +hide header felamimail no gjem hode +html felamimail no HTML +icons and text felamimail no Ikoner og tekst +icons only felamimail no Kun ikoner +identifying name felamimail no Identifiserbart navn +if felamimail no Dersom +if from contains felamimail no dersom fra inneholder +if mail header felamimail no dersom meldingshodet +if message size felamimail no dersom meldingsstørrelse +if subject contains felamimail no dersom emnet inneholder +if to contains felamimail no dersom til inneholder +illegal folder name. please select a different name. felamimail no Ulovlig mappenavn. Vennligst velg et annet navn. +imap felamimail no IMAP +imap server felamimail no IMAP Tjener +imap server address felamimail no IMAP Tjener Adresse +imap server type felamimail no IMAP Tjener type +imaps authentication felamimail no IMAPS Autentisering +imaps encryption only felamimail no Kun IMAPS Kryptering +in felamimail no i +index order felamimail no Inndeks Sortering +info felamimail no Informasjon +invalid user name or password felamimail no Galt brukernavn eller passord +javascript felamimail no JavaScript +keep a copy of the message in your inbox felamimail no behold en kopi av meldingen i din innboks +kilobytes felamimail no kilobytes +language felamimail no Språk +last name felamimail no Etternavn +left felamimail no Venstre +less felamimail no mindre +less than felamimail no mindre enn +light gray felamimail no Lys Grå +list all felamimail no List ut alle +location of buttons when composing felamimail no Knappers lokasjon ved opprettelse +mail server login type admin no E-post tjener innloggingstype +mail settings felamimail no E-post innstillinger +mainmessage felamimail no hovedmelding +manage emailfilter / vacation preferences no Betjen e-mailfilter / ferie +manage folders common no Behandle Mapper +manage sieve common no Behandle Sieve skript +mark as deleted felamimail no Merk som slettet +mark messages as felamimail no Merk valgt melding som +mark selected as flagged felamimail no Merk valgt som flagget +mark selected as read felamimail no Merk valgt som lest +mark selected as unflagged felamimail no Merk valgt som uflagget +mark selected as unread felamimail no Merk valgt som ulest +match felamimail no Treff +matches felamimail no treff +matches regexp felamimail no treffer regexp +message highlighting felamimail no Meldingsmerking +message list felamimail no Meldingsliste +messages felamimail no meldinger +mon felamimail no Man +move felamimail no flytt +move messages felamimail no flytt meldinger +move selected to felamimail no flytt valgt til +move to trash felamimail no Flytt til søppelkurv +moving messages to felamimail no Flytter meldinger til +name felamimail no Navn +never display html emails felamimail no Vis aldri HTML e-post +new common no Ny +new filter felamimail no Nytt filter +next felamimail no Neste +next message felamimail no neste melding +no filter felamimail no Ingen filter +no folders found felamimail no Fant ingen mapper +no folders were found to subscribe to! felamimail no Fant ingen mapper å melde på +no folders were found to unsubscribe from! felamimail no Fant ingen mapper å avmelde fra +no highlighting is defined felamimail no Ingen merking er definert +no messages found... felamimail no Ingen meldinger funnet +no messages were selected. felamimail no Ingen meldinger er valgt +no previous message felamimail no ingen foregående Melding +no valid emailprofile selected!! felamimail no Ingen Gyldig E-post profil er valgt +none felamimail no ingen +on behalf of felamimail no på vegne av +one address is not valid felamimail no En av adressene er ikke gyldig +only inbox felamimail no Kun INNBOKS +only one window felamimail no Bare et vindu +only unseen felamimail no Bare usett +open all felamimail no åpne alle +options felamimail no Alternativer +organisation felamimail no organisering +organization felamimail no organisasjon +organization name admin no Organisasjonsnavn +participants felamimail no Deltagere +personal information felamimail no Personlig informasjon +please select a address felamimail no Vennligst velg en adresse +please select the number of days to wait between responses felamimail no Vennligst velg antall dager for vent melding tilbakemeldinger +please supply the message to send with auto-responses felamimail no Vennligst registrer meldingen som skal sendes som automatisk tilbakemelding +posting felamimail no posting +previous felamimail no Forrige +previous message felamimail no forrige melding +print it felamimail no skriv ut +print this page felamimail no skriv ut denne siden +quicksearch felamimail no Hurtigsøk +read felamimail no les +reading felamimail no lesing +recent felamimail no siste +refresh time in minutes felamimail no Oppdateringstid i minutter +remove felamimail no fjern +remove immediately felamimail no Fjern umiddelbart +rename felamimail no Gi nytt navn +rename a folder felamimail no Gi en Mappe nytt navn +rename folder felamimail no Gi mappen nytt navn +renamed successfully! felamimail no Vellykket nytt navn +replied felamimail no svart +reply felamimail no Svar +reply all felamimail no Svar alle +reply to felamimail no Svar til +replyto felamimail no SvarTil +respond felamimail no Responder +respond to mail sent to felamimail no Responder på mail sent til +return felamimail no Tilbake +return to options page felamimail no Tilbake til alternativer +right felamimail no Høyre +rule felamimail no Regel +sat felamimail no Lør +save felamimail no Lagre +save changes felamimail no Lagre endringer +script name felamimail no Navn på skript +script status felamimail no Status for skript +search felamimail no Søk +search for felamimail no Søk etter +select felamimail no Velg +select all felamimail no Velg alle +select emailprofile felamimail no Velg E-post Profil +select folder felamimail no Velg mappe +select your mail server type admin no Velg din e-post tjener type +send felamimail no Send +send a reject message felamimail no send en avvisningsmelding +sent folder felamimail no Sendt Mappe +show header felamimail no vis meldingshode +show new messages on main screen felamimail no Vis nye meldinger på hovedside +sieve settings admin no Sieve innstillinger +signature felamimail no Signatur +simply click the target-folder felamimail no Klikk på målmappe +size felamimail no Størrelse +size of editor window felamimail no Størrelse på editeringsvindu +size(...->0) felamimail no Størrelse (...->0) +size(0->...) felamimail no Størrelse (0->...) +small view felamimail no liten visning +smtp settings admin no SMTP innstillinger +subject felamimail no Emne +subject(a->z) felamimail no Emne (A->Å) +subject(z->a) felamimail no Emne (Å->A) +submit felamimail no Send +subscribe felamimail no Meld på +subscribed felamimail no Meldt på +subscribed successfully! felamimail no Påmelding vellykket +sun felamimail no Søn +table of contents felamimail no Innhold +text only felamimail no Kun tekst +the connection to the imap server failed!! felamimail no Koblingen til IMAP tjeneren feilet!! +then felamimail no DA +this folder is empty felamimail no DENNE MAPPEN ER TOM +this php has no imap support compiled in!! felamimail no PHP versjonen har ingen IMAP-støtte kompilert inn +thu felamimail no Tor +to felamimail no Til +to mail sent to felamimail no Til mail sent til +translation preferences felamimail no Oversettelses innstillinger +translation server felamimail no Oversettelses tjener +trash fold felamimail no Søppelmappe +trash folder felamimail no Søppelmappe +tue felamimail no Tir +type felamimail no type +unflagged felamimail no avflagget +unknown err felamimail no Ukjent feil +unknown error felamimail no Ukjent feil +unknown sender felamimail no Ukjent Avsender +unknown user or password incorrect. felamimail no Ukjent bruker eller galt passord +unread common no Ulest +unseen felamimail no Usett +unselect all felamimail no Velg bort Alle +unsubscribe felamimail no Avmeld +unsubscribed felamimail no Avmeldt +unsubscribed successfully! felamimail no Vellykket avmelding +up felamimail no opp +use emailadmin to create profiles felamimail no bruk EmailAdmin for å opprette profiler +use a signature felamimail no Bruk en signatur +use a signature? felamimail no Bruk en signatur? +use addresses felamimail no Bruk adresser +use custom settings felamimail no Bruk Normale Innstillinger +use javascript or html addressbook? felamimail no Bruk Javascript eller HTML adressebok? +use regular expressions felamimail no bruk regulære uttrykk +use smtp auth admin no Bruk SMTP autentisering +users can define their own emailaccounts admin no Brukere kan definere egne e-post kontoer +vacation notice felamimail no Ferie melding +view full header felamimail no Vis hele meldingshodet +view message felamimail no Vis melding +viewing full header felamimail no Viser hele meldingshodet +viewing message felamimail no Viser melding +viewing messages felamimail no Viser meldinger +wed felamimail no Ons +welcome to %1's webmail system felamimail no Velkommen til %1 WebMail system +when deleting messages felamimail no Når du sletter meldinger +with message felamimail no Med melding +with message "%1" felamimail no Med melding "%1" +wrap incoming text at felamimail no Bryt innkommende tekst ved +writing felamimail no skrivning +wrote felamimail no skrev +you must login first. felamimail no Du må logge inn først diff --git a/felamimail/lang/egw_pl.lang b/felamimail/lang/egw_pl.lang new file mode 100755 index 0000000000..042b840cbe --- /dev/null +++ b/felamimail/lang/egw_pl.lang @@ -0,0 +1,410 @@ +(no subject) felamimail pl (bez tematu) +(only cc/bcc) felamimail pl (tylko DW/UDW) +(unknown sender) felamimail pl (nieznany nadawca) +activate felamimail pl Aktywuj +activate script felamimail pl aktywuj skrypt +add acl felamimail pl dodaj listę ACL +add address felamimail pl Dodaj adres +add rule felamimail pl Dodaj regułę +add script felamimail pl Dodaj skrypt +add to %1 felamimail pl Dodaj do %1 +add to address book felamimail pl Dodaj do książki adresowej +add to addressbook felamimail pl dodaj do książki adresowej +adding file to message. please wait! felamimail pl Dodaję plik do wiadomości. Proszę czekać +additional info felamimail pl Informacje dodatkowe +address book felamimail pl Książka adresowa +address book search felamimail pl Przeszukiwanie książki adresowej +after message body felamimail pl Za treścią wiadomości +all address books felamimail pl Wszystkie książki adresowe +all folders felamimail pl Wszystkie foldery +all of felamimail pl wszystkie z +allow images from external sources in html emails felamimail pl Zezwalaj na wyświetlanie obrazkow z zewnętrznych serwerów w wiadomościach HTML +allways a new window felamimail pl zawsze w nowym oknie +always show html emails felamimail pl Zawsze pokazuj maile napisane w HTML +and felamimail pl i +any of felamimail pl dowolny z +any status felamimail pl dowolny status +anyone felamimail pl ktokolwiek +as a subfolder of felamimail pl jako podfolder w +attachments felamimail pl Załączniki +authentication required felamimail pl wymagane jest uwierzytelnianie +auto refresh folder list felamimail pl Automatycznie odświeżaj listę folderów +back to folder felamimail pl Wróć do folderu +bad login name or password. felamimail pl Zła nazwa użytkownika lub hasło +bad or malformed request. server responded: %s felamimail pl Nieprawidłowe lub źle skonstruowane żądane. Serwer odpowiedział: %s +bad request: %s felamimail pl Nieprawidłowe żądanie: %s +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail pl Zgodnie ze wskazanymi dyspozycjami, wiadomości przychodzące będą miały odpowiednie tło wiadomości na liście. Pozwala to łatwo odróżnić nadawców wiadomości, szczególnie gdy są to listy mailingowe. +bcc felamimail pl UDW +before headers felamimail pl Przed nagłówkiem +between headers and message body felamimail pl Pomiędzy nagłówkiem a treścią +body part felamimail pl treść wiadomości +can't connect to inbox!! felamimail pl nie można podłączyć się do INBOX! +cc felamimail pl DW +change folder felamimail pl Zmień folder +check message against next rule also felamimail pl sprawdź również kolejnę regułę +clear search felamimail pl wyczyść wyszukiwanie +click here to log back in. felamimail pl Kliknij aby zalogować się ponownie +click here to return to %1 felamimail pl Kliknij tutaj aby wrócić do %1 +close all felamimail pl zamknij wszystko +close this page felamimail pl zamknij tę stronę +close window felamimail pl Zamknij okno +color felamimail pl Kolor +compose felamimail pl Utwórz +compress folder felamimail pl Kompaktuj folder +condition felamimail pl warunek +configuration felamimail pl Konfiguracja +connection dropped by imap server. felamimail pl Połączenie zerwane przez serwer IMAP +contains felamimail pl zawiera +could not complete request. reason given: %s felamimail pl Nie udało się zrealizować żądania. Powód: %s +could not open secure connection to the imap server. %s : %s. felamimail pl Nie udało się nawiązać bezpiecznego połączenia +cram-md5 or digest-md5 requires the auth_sasl package to be installed. felamimail pl CRAM-MD5 lub DIGEST-MD5 wymagają obecności pakietu Auth_SASL. +create felamimail pl Stwórz +create folder felamimail pl Tworzenie folderu +create sent felamimail pl Stwórz Wysłane +create subfolder felamimail pl Stwórzy podfolder +create trash felamimail pl Stwórz Kosz +created folder successfully! felamimail pl Utworzono folder pomyślnie! +dark blue felamimail pl Ciemno Niebieski +dark cyan felamimail pl Ciemny Cyan +dark gray felamimail pl Ciemny Szary +dark green felamimail pl Ciemny Zielony +dark magenta felamimail pl Ciemny Magenta +dark yellow felamimail pl Ciemny Żółty +date(newest first) felamimail pl Data (od najnowszych) +date(oldest first) felamimail pl Data (od najstarszych) +days felamimail pl dni +deactivate script felamimail pl deaktywuj skrypt +default signature felamimail pl domyślna sygnaturka +default sorting order felamimail pl Domyślny porządek sortowania +delete all felamimail pl kasuj wszystko +delete folder felamimail pl Usuń folder +delete script felamimail pl usuń skrypt +delete selected felamimail pl Usuń zaznaczone +delete selected messages felamimail pl skasuj wybrane wiadomości +deleted felamimail pl skasowany +deleted folder successfully! felamimail pl Folder został pomyślnie usunięty! +deleting messages felamimail pl usuwanie wiadomości w toku +disable felamimail pl Wyłącz +discard felamimail pl odrzuć +discard message felamimail pl odrzuć wiadomość +display message in new window felamimail pl Wyświetl wiadomość w nowym oknie +display messages in multiple windows felamimail pl wyświetl wiadomości w wielu oknach +display of html emails felamimail pl Wyświetlaj wiadomość w HTML +display only when no plain text is available felamimail pl Wyświetlaj jedynie, jeżeli nie ma wersji tekstowej +display preferences felamimail pl Wyświetl preferencje +displaying html messages is disabled felamimail pl Wyświetlanie wiadomości w HTML jest wyłączone +do it! felamimail pl zrób to! +do not use sent felamimail pl Nie używaj Wysłanych +do not use trash felamimail pl Nie używaj Kosza +do not validate certificate felamimail pl nie sprawdzaj poprawności certyfikatu +do you really want to delete the '%1' folder? felamimail pl Czy na pewno chcesz usunąć folder '%1'? +do you really want to delete the selected signatures? felamimail pl Czy na pewno chcesz usunąć wybrane podpisy? +does not contain felamimail pl nie zawiera +does not match felamimail pl nie pasuje +does not match regexp felamimail pl nie pasuje do wzorca +don't use draft folder felamimail pl Nie używaj folderu szkiców +don't use sent felamimail pl Nie używaj Wysłanych +don't use trash felamimail pl Nie używaj Kosza +down felamimail pl w dół +download felamimail pl pobierz +download this as a file felamimail pl pobierz jako plik +draft folder felamimail pl folder szkiców +e-mail felamimail pl E-mail +e-mail address felamimail pl Adres e-mail +e-mail folders felamimail pl Foldery e-mail +edit email forwarding address felamimail pl edytuj adres e-mail przekazywania wiadomości +edit filter felamimail pl Edytuj filtr +edit rule felamimail pl edytuj regułę +edit selected felamimail pl Edytuj wybrane +edit vacation settings felamimail pl edytuj ustawienia autorespondera +email address felamimail pl Adres e-mail +email forwarding address felamimail pl adres e-mail przekazywania wiadomości +email signature felamimail pl Sygnaturka +emailaddress felamimail pl adres_email +empty trash felamimail pl opróżnij kosz +enable felamimail pl włącz +encrypted connection felamimail pl połączenie szyfrowane +enter your default mail domain ( from: user@domain ) admin pl Podaj domyślną domenę pocztową (Od: użytkownik@domena) +enter your imap mail server hostname or ip address admin pl Podaj nazwę hosta lub IP serwera IMAP +enter your sieve server hostname or ip address admin pl Podaj nazwę hosta lub IP serwera SIEVE +enter your sieve server port admin pl Podaj port serwera SIEVE +enter your smtp server hostname or ip address admin pl Podaj nazwę hosta lub IP serwera SMTP +enter your smtp server port admin pl Podaj port serwera SMTP +error felamimail pl BŁĄD +error connecting to imap serv felamimail pl Błąd łączenia z serwerem IMAP +error connecting to imap server. %s : %s. felamimail pl Błąd połączenia do serwera IMAP. %s : %s +error connecting to imap server: [%s] %s. felamimail pl Błąd połączenia do serwera IMAP. [%s] %s +error opening felamimail pl Błąd podczas otwierania +every felamimail pl co +every %1 days felamimail pl co %1 dni +expunge felamimail pl Opróżnij +extended felamimail pl rozszerzone +felamimail common pl FelaMiMail +file into felamimail pl informacja o pliku +files felamimail pl pliki +filter active felamimail pl filtr jest aktywny +filter name felamimail pl nazwa filtra +filter rules common pl reguły filtra +first name felamimail pl Imię +flagged felamimail pl oflagowano +flags felamimail pl flagi +folder acl felamimail pl lista ACL folderu +folder name felamimail pl Nazwa foldera +folder path felamimail pl Ścieżka foldera +folder preferences felamimail pl Preferencje folderów +folder settings felamimail pl Ustawienia foldera +folder status felamimail pl Status foldera +folderlist felamimail pl Lista folderów +foldername felamimail pl Nazwa foldera +folders felamimail pl Foldery +folders created successfully! felamimail pl Pomyślnie utworzono folder +follow felamimail pl odpowiedz +for mail to be send - not functional yet felamimail pl Dla wiadomości przygtowanych do wysłania - jeszcze nie działa ;-) +for received mail felamimail pl Dla wiadomości otrzymanych +forward felamimail pl Prześlij dalej +forward to felamimail pl Prześlij do +forward to address felamimail pl Prześlij na adres +forwarding felamimail pl Przekazywanie +found felamimail pl Znaleziono +fri felamimail pl Pią +from felamimail pl Od +from(a->z) felamimail pl Od (A->Z) +from(z->a) felamimail pl Od (Z->A) +full name felamimail pl Pełna nazwa +greater than felamimail pl większe niż +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail pl Aby dowiedzieć się więcej o Squirrelmail, zajrzyj na www.felamimail.org.
    +header lines felamimail pl Linie nagłówka +hide header felamimail pl ukryj nagłówek +hostname / address felamimail pl adres domenowy / adres IP +html felamimail pl HTML +icons and text felamimail pl Ikony i tekst +icons only felamimail pl Tylko ikony +identifying name felamimail pl Nazwa identyfikatora +identity felamimail pl tożsamość +if felamimail pl JEŻELI +if from contains felamimail pl jeżeli pole 'From:" zawiera +if mail header felamimail pl jeżeli nagłówek wiadomości +if message size felamimail pl jeżeli rozmiar wiadomości +if subject contains felamimail pl jeżeli pole "Temat" zawiera +if to contains felamimail pl jeżeli pole "Adresat" zawiera +if using ssl or tls, you must have the php openssl extension loaded. felamimail pl Jeżeli korzystasz z SSL lub TLS, musisz mieć dołączone rozszerzenie OpenSSL do PHP. +illegal folder name. please select a different name. felamimail pl Nazwa folderu nie jest poprawna. Proszę wybrać inną nazwę. +imap felamimail pl IMAP +imap server felamimail pl Serwer IMAP +imap server address felamimail pl Adres serwera IMAP +imap server closed the connection. felamimail pl Serwer IMAP zakończył połączenie. +imap server closed the connection. server responded: %s felamimail pl Serwer IMAP zakończył połączenie. Serwer zwrócił: %s +imap server password felamimail pl hasło do serwera IMAP +imap server type felamimail pl Typ serwera IMAP +imap server username felamimail pl nazwa użytkownika do serwera IMAP +imaps authentication felamimail pl Autentykacja IMAPS +imaps encryption only felamimail pl Tylko szyfrowanie IMAPS +in felamimail pl w +inbox felamimail pl ODEBRANE +incoming mail server(imap) felamimail pl serwer poczty przychodzącej (IMAP) +index order felamimail pl Porządek indeksu +info felamimail pl Info +invalid user name or password felamimail pl Zła nazwa użytkownika lub hasło +javascript felamimail pl JavaScript +jumping to end felamimail pl skacze na koniec +jumping to start felamimail pl skacze na początek +keep a copy of the message in your inbox felamimail pl zachowaj kopię wiadomości w folderze ODEBRANE +keep local copy of email felamimail pl zachowja lokalną kopię tej wiadomości +kilobytes felamimail pl kilobajtów +language felamimail pl Język +last name felamimail pl Nazwisko +less felamimail pl mniej +less than felamimail pl mniej niż +light gray felamimail pl Jasny Szary +list all felamimail pl Pokaż wszystko +loading felamimail pl ładowanie +location of buttons when composing felamimail pl Położenie przycisków przy pisaniu maila +mail server login type admin pl Typ logowania do serwera poczty +mail settings felamimail pl Ustawienia poczty +mainmessage felamimail pl treść_wiadomości +manage emailaccounts preferences pl Zarządzaj kontami pocztowymi +manage emailfilter / vacation preferences pl Zarządzaj filtrem pocztym / powiadomieniami +manage folders common pl Zarządzanie folderami +manage sieve common pl Zarządzaj skryptami Sieve +manage signatures felamimail pl Zarządzaj sygnaturkami +mark as deleted felamimail pl Zaznacz jako usunietą +mark messages as felamimail pl Zaznacz wybrane wiadomości jako +mark selected as flagged felamimail pl Zaznacz wybrane oflagowaniem +mark selected as read felamimail pl Zaznacz wybrane wiadomości jako przeczytane +mark selected as unflagged felamimail pl Zaznacz wybrane jako nie oflagowane +mark selected as unread felamimail pl Zaznacz wybrane wiadomości jako nieprzeczytane +match felamimail pl Zgodne +matches felamimail pl pasuje do +matches regexp felamimail pl pasuje do wyrażenia regularnego +max uploadsize felamimail pl limit ładowania danych +message highlighting felamimail pl Podświetlanie wiadomości +message list felamimail pl Lista wiadomości +messages felamimail pl wiadomości +mon felamimail pl Pon +move felamimail pl przenieś +move messages felamimail pl przenieś wiadomości +move selected to felamimail pl przenieś wiadomości do +move to trash felamimail pl przenieś do kosza +moving messages to felamimail pl przenoszę wiadomości do +name felamimail pl Nazwa +never display html emails felamimail pl Nigdy nie wyświetlaj emaili HTML +new common pl Nowe +new filter felamimail pl Nowy filtr +next felamimail pl Następny +next message felamimail pl następna wiadomość +no active imap server found!! felamimail pl Nie znaleziono aktywnego serwera IMAP! +no encryption felamimail pl brak szyfrowania +no filter felamimail pl Brak filtra +no folders found felamimail pl Nie znaleziono folderów +no folders were found to subscribe to! felamimail pl Nie znaleziono folderów do aktywowania subskrypcji! +no folders were found to unsubscribe from! felamimail pl Nie znaleziono folderów do anulowania subskrypcji! +no highlighting is defined felamimail pl Nie zdefiniowano podświetleń +no message returned. felamimail pl Nie otrzymano wiadomości. +no messages found... felamimail pl nie znaleziono wiadomości... +no messages were selected. felamimail pl Nie wybrano żadnej wiadomości +no plain text part found felamimail pl brak części 'czystym' tekstem +no previous message felamimail pl brak poprzedniej wiadomości +no supported imap authentication method could be found. felamimail pl Nie znaleziono obsługiwanej metody autentykacji IMAP. +no valid emailprofile selected!! felamimail pl Nie wybrano poprawnego profilu e-mail. +none felamimail pl Żaden +on behalf of felamimail pl w imieniu +one address is not valid felamimail pl Jeden adres nie jest poprawny +only inbox felamimail pl Tylko ODEBRANE +only one window felamimail pl tylko jedno okno +only unseen felamimail pl tylko nie przeczytane +open all felamimail pl otwórzy wszystkie +options felamimail pl Opcje +or felamimail pl lub +organisation felamimail pl instytucja +organization felamimail pl instytucja +organization name admin pl Nazwa instutucji +outgoing mail server(smtp) felamimail pl serwer poczty wychodzącej (SMTP) +participants felamimail pl Uczestnicy +personal information felamimail pl Informacje osobiste +please select a address felamimail pl Proszę wybrać adres +please select the number of days to wait between responses felamimail pl Wybierz, ile dni czekać między odpowiedziami +please supply the message to send with auto-responses felamimail pl Proszę wprowadzić wiadomość przesyłaną w automatycznych odpowiedziach +previous felamimail pl Poprzedni +previous message felamimail pl poprzednia wiadomość +print it felamimail pl wydrukuj to +print this page felamimail pl wydrukuj tę stronę +quicksearch felamimail pl Szybkie wyszukiwanie +read felamimail pl Odczytaj +reading felamimail pl odczytywanie +receive notification felamimail pl Odebrano powiadomienie +recent felamimail pl ostatnie +refresh time in minutes felamimail pl Czas odświeżania w minutach +reject with felamimail pl odrzuć z +remove felamimail pl usuń +remove immediately felamimail pl usuń natychmiast +rename felamimail pl Zmiana nazwy +rename a folder felamimail pl Zmiana nazwy foldera +rename folder felamimail pl Zmień nazwę foldera +renamed successfully! felamimail pl Pomyślnie zmieniono nazwę +replied felamimail pl odpowiedziano +reply felamimail pl Odpowiedz +reply all felamimail pl Odpowiedz wszystkim +reply to felamimail pl Odpowiedz +replyto felamimail pl Odpowiedz +respond felamimail pl Odpowiedź +respond to mail sent to felamimail pl odpowiedz na mail wysłany do +return felamimail pl Powrót +return to options page felamimail pl Powrót do strony konfiguracji +row order style felamimail pl styl porządku wierszy +rule felamimail pl Reguła +sat felamimail pl Sob +save felamimail pl Zapisz +save as draft felamimail pl zapisz jako szkic +save as infolog felamimail pl zapisz jako zadanie Dziennika CRM +save changes felamimail pl zachowaj zmiany +save message to disk felamimail pl zachowaj wiadomość na dysku +script name felamimail pl nazwa skryptu +script status felamimail pl status skryptu +search felamimail pl Szukaj +search for felamimail pl Szukaj dla +select felamimail pl Wybierz +select all felamimail pl Wybierz wszystko +select emailprofile felamimail pl Wybierz profil email +select folder felamimail pl Wybierz folder +select your mail server type admin pl Wybierz typ serwera email +send felamimail pl Wyślij +send a reject message felamimail pl odeślij wiadomość odrzucającą +sent folder felamimail pl Folder Wysłane +server supports mailfilter(sieve) felamimail pl serwer posiada filtr poczy (sieve - sito) +show header felamimail pl pokaż nagłówek +show new messages on main screen felamimail pl Wyświetlać nowe wiadomości na stronie głównej? +sieve script name felamimail pl Nazwa skryptu sita ('sieve') +sieve settings admin pl Ustawienia Sieve +signature felamimail pl Sygnaturka +simply click the target-folder felamimail pl Kliknij folder docelowy +size felamimail pl Wielkość +size of editor window felamimail pl Wielkość okna edytora +size(...->0) felamimail pl Rozmiar (...->0) +size(0->...) felamimail pl Rozmiar (0->...) +skipping forward felamimail pl omija kolejną +skipping previous felamimail pl omija poprzednią +small view felamimail pl widok uproszczony +smtp settings admin pl Ustawienia SMTP +subject felamimail pl Temat +subject(a->z) felamimail pl Temat (A->Z) +subject(z->a) felamimail pl Temat (Z->A) +submit felamimail pl Wyślij +subscribe felamimail pl Subskrybuj +subscribed felamimail pl Uruchomiono subskrypcję +subscribed successfully! felamimail pl Uruchomiono subskrypcję poprawnie! +sun felamimail pl Nie +table of contents felamimail pl Spis treści +text only felamimail pl Tylko tekst +the connection to the imap server failed!! felamimail pl Nieudane połączenie z serwerem SMTP!! +the mimeparser can not parse this message. felamimail pl Nie udało się przetworzyć zawartości MIME tej wiadomości +then felamimail pl WTEDY +this folder is empty felamimail pl TEN FOLDER JEST PUSTY +this php has no imap support compiled in!! felamimail pl PHP nie ma skompilowanej obsługi IMAP!! +thu felamimail pl Czw +to felamimail pl Do +translation preferences felamimail pl Preferencje tłumaczenia +translation server felamimail pl Serwer tłumaczeń +trash fold felamimail pl Folder Kosza +trash folder felamimail pl Folder Kosza +tue felamimail pl Wto +type felamimail pl typ +unexpected response from server to authenticate command. felamimail pl Niespodziewana odpowiedź z serwera na polecenie AUTHENTICATE +unexpected response from server to digest-md5 response. felamimail pl Niespodziewana odpowiedź z serwera na polecenie Digest-MD5 +unexpected response from server to login command. felamimail pl Niespodziewana odpowiedź serwera na polecenie LOGIN. +unflagged felamimail pl nie oflagowano +unknown err felamimail pl Nieznany błąd +unknown error felamimail pl Nieznany błąd +unknown sender felamimail pl Nieznany nadawca +unknown user or password incorrect. felamimail pl Użytkownik nieznany lub hasło niezgodne. +unread common pl nieprzeczytane +unseen felamimail pl nieprzeczytane (nie pobrane) +unselect all felamimail pl Odznacz wszystko +unsubscribe felamimail pl Anuluj subskrypcję +unsubscribed felamimail pl Anulowano subskrypcję +unsubscribed successfully! felamimail pl Anulowano subskrypcję poprawnie! +up felamimail pl w górę +updating message status felamimail pl aktualizuję status wiadomości +updating view felamimail pl aktualizuję widok +use a signature felamimail pl Użyj sygnaturki +use a signature? felamimail pl Użyć sygnaturki? +use addresses felamimail pl użyj adresów +use custom settings felamimail pl Użyj ustawień użytkownika +use regular expressions felamimail pl użyj wyrażeń regularnych +use smtp auth admin pl Skorzystaj z autentykacji SMTP +users can define their own emailaccounts admin pl Użytkownicy mogą definiować swoje własne konta poczty elektronicznej +vacation notice common pl powiadomienie urlopowe +vacation notice is active felamimail pl Powiadomienie urlopowe jest aktywne +validate certificate felamimail pl sprawdź poprawność certyfikatu +view full header felamimail pl Pokaż pełny nagłówek +view header lines felamimail pl pokaż linie nagłówka +view message felamimail pl Pokaż wiadomość +viewing full header felamimail pl Pokazuje cały nagłówek +viewing message felamimail pl Pokazuje wiadomość +viewing messages felamimail pl Pokazuje wiadomości +wed felamimail pl Śro +when deleting messages felamimail pl Gdy usuwasz wiadomość +with message felamimail pl z wiadomością +with message "%1" felamimail pl z wiadomością '%1' +wrap incoming text at felamimail pl Szerokość zawijania werszy +writing felamimail pl zapisywanie +wrote felamimail pl zapisano diff --git a/felamimail/lang/egw_pt-br.lang b/felamimail/lang/egw_pt-br.lang new file mode 100644 index 0000000000..9367aff1f6 --- /dev/null +++ b/felamimail/lang/egw_pt-br.lang @@ -0,0 +1,471 @@ +(no subject) felamimail pt-br (sem assunto) +(only cc/bcc) felamimail pt-br (somente Cc/Cco) +(separate multiple addresses by comma) felamimail pt-br (separar vários endereços por vírgula) +(unknown sender) felamimail pt-br (remetente desconhecido) +activate felamimail pt-br Ativar +activate script felamimail pt-br Ativar script +activating by date requires a start- and end-date! felamimail pt-br Ativação por data requer uma data inicial e final! +add acl felamimail pt-br Adicionar ACL +add address felamimail pt-br Adicionar endereço +add rule felamimail pt-br Adicionar Regra +add script felamimail pt-br Adicionar Script +add to %1 felamimail pt-br Adicionar a %1 +add to address book felamimail pt-br Adicionar aos Contatos +add to addressbook felamimail pt-br Adicionar aos Contatos +adding file to message. please wait! felamimail pt-br Adicionando arquivo à mensagem. Por favor, aguarde... +additional info felamimail pt-br Adicionar informação +address book felamimail pt-br Contatos +address book search felamimail pt-br Procurar nos Contatos +after message body felamimail pt-br Após o corpo da mensagem +all address books felamimail pt-br Todos os contatos +all folders felamimail pt-br Todas as pastas +all of felamimail pt-br Todos +allow images from external sources in html emails felamimail pt-br Todas as imagens de origem externa em e-mails em HTML +allways a new window felamimail pt-br sempre uma nova janela +always show html emails felamimail pt-br Sempre mostar mensagens em HMTL +and felamimail pt-br e +any of felamimail pt-br qualquer +any status felamimail pt-br qualquer status +anyone felamimail pt-br qualquer um +as a subfolder of felamimail pt-br como subpasta de +attachments felamimail pt-br Anexos +authentication required felamimail pt-br autenticação requerida +auto refresh folder list felamimail pt-br Auto atualizar lista de pastas +back to folder felamimail pt-br Voltar para a pasta +bad login name or password. felamimail pt-br Nome de usuário ou senha incorretos. +bad or malformed request. server responded: %s felamimail pt-br Requisição mal formada ou incorreta. Servidor respondeu: %s +bad request: %s felamimail pt-br Requisição incorreta: %s +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail pt-br Baseado nos critérios fornecidos, mensagens de entrada podem ter cores de fundo diferentes na lista de mensagens. Isso ajuda a distinguir de quem são as mensagens, particularmente no caso de listas de mensagens. +bcc felamimail pt-br CCO +before headers felamimail pt-br Antes dos cabeçalhos +between headers and message body felamimail pt-br Entre cabeçalho e corpo da mensagem +body part felamimail pt-br corpo da mensagem +by date felamimail pt-br por data +can not send message. no recipient defined! felamimail pt-br não foi possível enviar mensagem. Sem conteúdo definido! +can't connect to inbox!! felamimail pt-br não foi possível conectar com CAIXA DE ENTRADA +cc felamimail pt-br cc +change folder felamimail pt-br Mudar pasta +check message against next rule also felamimail pt-br Verificar mensagem com a próxima regra também +checkbox felamimail pt-br Caixa de seleção +clear search felamimail pt-br limpar procura +click here to log back in. felamimail pt-br Clique aqui para conectar +click here to return to %1 felamimail pt-br Clique aqui para voltar a %1 +close all felamimail pt-br Fechar todos +close this page felamimail pt-br Fechar esta página +close window felamimail pt-br Fechar janela +color felamimail pt-br Cor +compose felamimail pt-br Compor +compose as new felamimail pt-br compor como novo +compress folder felamimail pt-br Compactar pasta +condition felamimail pt-br condição +configuration felamimail pt-br Configuração +connection dropped by imap server. felamimail pt-br Conexão interrompida pelo servidor IMAP. +contains felamimail pt-br contém +could not complete request. reason given: %s felamimail pt-br Não foi possível completar a requisição. Motivo informado: %s +could not import message: felamimail pt-br Não foi possível importar Mensagem: +could not open secure connection to the imap server. %s : %s. felamimail pt-br Não foi possível abrir conexão segura ao servidor IMAP. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. felamimail pt-br CRAM-MD5 ou DIGEST-MD5 requerem que o pacote Auth_SASL esteja instalado. +create felamimail pt-br Criar +create folder felamimail pt-br Criar pasta +create sent felamimail pt-br Criar Enviadas +create subfolder felamimail pt-br Criar sub-pasta +create trash felamimail pt-br Criar Lixeira +created folder successfully! felamimail pt-br Pasta criada com sucesso! +dark blue felamimail pt-br Azul escuro +dark cyan felamimail pt-br Cyan escuro +dark gray felamimail pt-br Cinza escuro +dark green felamimail pt-br Verde escuro +dark magenta felamimail pt-br Vinho +dark yellow felamimail pt-br Amarelo escuro +date(newest first) felamimail pt-br Data (mais novas primeiro) +date(oldest first) felamimail pt-br Data (mais antigas primeiro) +days felamimail pt-br dias +deactivate script felamimail pt-br desativar script +default felamimail pt-br padrão +default signature felamimail pt-br assinatura padrão +default sorting order felamimail pt-br Ordem padrão de classificação +delete all felamimail pt-br Remover todas +delete folder felamimail pt-br Remover pasta +delete script felamimail pt-br Remover script +delete selected felamimail pt-br Remover selecionados +delete selected messages felamimail pt-br Remover mensagens selecionadas +deleted felamimail pt-br Removido +deleted folder successfully! felamimail pt-br Pasta removida com sucesso! +deleting messages felamimail pt-br removendo mensagens +disable felamimail pt-br Desabilitada +discard felamimail pt-br descartar +discard message felamimail pt-br Descartar mensagem +display message in new window felamimail pt-br Exibir mensagem em uma nova janela +display messages in multiple windows felamimail pt-br Exibir mensagens em múltiplas janelas +display of html emails felamimail pt-br Exibir emails em HTML +display only when no plain text is available felamimail pt-br Exibir somente quando não possuir versão em texto plano disponível +display preferences felamimail pt-br Preferências de Exibição +displaying html messages is disabled felamimail pt-br a exibição de mensagens HTML está desativada +do it! felamimail pt-br faça! +do not use sent felamimail pt-br Não usar Enviadas +do not use trash felamimail pt-br Não usar Lixeira +do not validate certificate felamimail pt-br não valide certificados +do you really want to delete the '%1' folder? felamimail pt-br Você realmente deseja apagar a pasta '%1'? +do you really want to delete the selected accountsettings and the assosiated identity. felamimail pt-br Você realmente deseja remover as configurações de conta selecionadas e as identidades associadas? +do you really want to delete the selected signatures? felamimail pt-br Você realmente deseja remover as assinaturas selecionadas ? +do you really want to move the selected messages to folder: felamimail pt-br Você realmente deseja mover a(s) mensagem(ns) selecionada(s) para a pasta: +do you want to be asked for confirmation before moving selected messages to another folder? felamimail pt-br Você deseja ser perguntado para confirmação ao mover mensagens para outra pasta? +does not contain felamimail pt-br não contém +does not exist on imap server. felamimail pt-br não existe no Servidor IMAP. +does not match felamimail pt-br Não coincide +does not match regexp felamimail pt-br não coincide com a expressão usada +don't use draft folder felamimail pt-br Não usar pasta Rascunhos +don't use sent felamimail pt-br Não usar pasta Mensagens Enviadas +don't use template folder felamimail pt-br Não usar pasta Modelos +don't use trash felamimail pt-br Não usar pasta Lixeira +dont strip any tags felamimail pt-br Não remover nenhuma tag +down felamimail pt-br baixo +download felamimail pt-br Download +download this as a file felamimail pt-br Fazer download como arquivo +draft folder felamimail pt-br Pasta Rascunho +drafts felamimail pt-br Rascunhos +e-mail felamimail pt-br E-Mail +e-mail address felamimail pt-br Endereço de E-Mail +e-mail folders felamimail pt-br Pastas de E-Mail +edit email forwarding address felamimail pt-br Editar e-mail de encaminhamento +edit filter felamimail pt-br Editar filtro +edit rule felamimail pt-br Editar regra +edit selected felamimail pt-br Editar selecionado +edit vacation settings felamimail pt-br Editar configurações de ausência +editor type felamimail pt-br Tipo do Editor +email address felamimail pt-br Endereço de E-Mail +email forwarding address felamimail pt-br E-Mail de encaminhamento +email notification update failed felamimail pt-br Atualização do email de notificação falhou +email signature felamimail pt-br Assinatura de E-Mail +emailaddress felamimail pt-br endereço de e-mail +empty trash felamimail pt-br Esvaziar Lixeira +enable felamimail pt-br habilitado +encrypted connection felamimail pt-br conexão criptografada +enter your default mail domain ( from: user@domain ) admin pt-br Digite o seu domínio de correio eletrônico (do modelo usuario@dominio) +enter your imap mail server hostname or ip address admin pt-br Digite o nome ou o endereço IP do seu servidor IMAP +enter your sieve server hostname or ip address admin pt-br Digite o nome ou o endereço IP do seu servidor SIEVE +enter your sieve server port admin pt-br Digite a porta do seu servidor SIEVE +enter your smtp server hostname or ip address admin pt-br Digite o nome ou o endereço IP do seu servidor SMTP +enter your smtp server port admin pt-br Preencha a porta do seu servidor SMTP +error felamimail pt-br ERRO +error connecting to imap serv felamimail pt-br Erro conectando ao servidor IMAP +error connecting to imap server. %s : %s. felamimail pt-br Erro conectando ao servidor IMAP. %s : %s. +error connecting to imap server: [%s] %s. felamimail pt-br Erro conectando ao servidor IMAP: [%s] %s. +error opening felamimail pt-br Erro abrindo +error: felamimail pt-br Erro: +error: could not save message as draft felamimail pt-br Erro: Não foi possível salvar a mensagem como Rascunho +every felamimail pt-br cada +every %1 days felamimail pt-br cada %1 dia(s) +expunge felamimail pt-br Excluir +extended felamimail pt-br extendido +felamimail common pt-br eMail +file into felamimail pt-br Arquivar em +files felamimail pt-br arquivos +filter active felamimail pt-br filtro ativo +filter name felamimail pt-br Nome do filtro +filter rules common pt-br Regras de filtros +first name felamimail pt-br Primeiro nome +flagged felamimail pt-br sinalizado +flags felamimail pt-br Sinalizadores +folder felamimail pt-br pasta +folder acl felamimail pt-br permissão da pasta +folder name felamimail pt-br Nome da pasta +folder path felamimail pt-br Caminho da Pasta +folder preferences felamimail pt-br Preferências de pastas +folder settings felamimail pt-br Configurações da Pasta +folder status felamimail pt-br Status da Pasta +folderlist felamimail pt-br Lista de Pastas +foldername felamimail pt-br Nome da pasta +folders felamimail pt-br Pastas +folders created successfully! felamimail pt-br Pastas criadas com sucesso! +follow felamimail pt-br seguir +for mail to be send - not functional yet felamimail pt-br Para mensagem a ser enviada (não funcionando ainda) +for received mail felamimail pt-br Para email recebido +forward felamimail pt-br Encaminhar +forward as attachment felamimail pt-br encaminhar como anexo +forward inline felamimail pt-br encaminhar no corpo da mensagem +forward messages to felamimail pt-br Encaminhar mensagens para +forward to felamimail pt-br encaminhar para +forward to address felamimail pt-br Encaminhar para endereço +forwarding felamimail pt-br Encaminhando +found felamimail pt-br Encontrado +fri felamimail pt-br Sex +from felamimail pt-br De +from(a->z) felamimail pt-br de (A->Z) +from(z->a) felamimail pt-br de (Z->A) +full name felamimail pt-br Nome completo +greater than felamimail pt-br maior que +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail pt-br Dê uma olhada em www.felamimail.org para aprender um pouco mais sobre o Squirrelmail.
    +header lines felamimail pt-br Linhas de Cabeçalho +hide header felamimail pt-br esconder cabeçalho +hostname / address felamimail pt-br servidor / endereço +how to forward messages felamimail pt-br como encaminhar mensagens +html felamimail pt-br HTML +icons and text felamimail pt-br Ícones e texto +icons only felamimail pt-br Somente ícones +identifying name felamimail pt-br Nome de identificação +identity felamimail pt-br identificar +if felamimail pt-br SE +if from contains felamimail pt-br Se "De" contém +if mail header felamimail pt-br Se cabeçalho de e-mail +if message size felamimail pt-br Se tamanho da mensagem +if shown, which folders should appear on main screen felamimail pt-br se exibidas, quais pastas deverão aparecer na tela principal +if subject contains felamimail pt-br Se assunto contém +if to contains felamimail pt-br Se "Para" contém +if using ssl or tls, you must have the php openssl extension loaded. felamimail pt-br Se estiver usando SSL ou TLS, você deve ter a extensão php 'openssl' carregada. +illegal folder name. please select a different name. felamimail pt-br Nome de pasta inválido. Por favor escolha um nome diferente. +imap felamimail pt-br IMAP +imap server felamimail pt-br Servidor IMAP +imap server address felamimail pt-br Endereço do Servidor IMAP +imap server closed the connection. felamimail pt-br O servidor IMAP fechou a conexão. +imap server closed the connection. server responded: %s felamimail pt-br O servidor IMAP fechou a conexão. O servidor respondeu: %s +imap server password felamimail pt-br senha do servidor IMAP +imap server type felamimail pt-br Tipo do Servidor IMAP +imap server username felamimail pt-br nome do usuário do servidor IMAP +imaps authentication felamimail pt-br Autenticação IMAPS +imaps encryption only felamimail pt-br Somente encriptação IMAPS +import felamimail pt-br importar +import mail felamimail pt-br Importar email +in felamimail pt-br em +inbox felamimail pt-br Caixa de Entrada +incoming mail server(imap) felamimail pt-br servidor IMAP de entrada +index order felamimail pt-br Índices de classificação +info felamimail pt-br Informação +invalid user name or password felamimail pt-br Usuário e/ou senha inválido(s) +javascript felamimail pt-br JavaScript +jumping to end felamimail pt-br Indo para o final +jumping to start felamimail pt-br Indo para o início +junk felamimail pt-br Spam +keep a copy of the message in your inbox felamimail pt-br Manter uma cópia da mensagem em sua caixa de entrada +keep local copy of email felamimail pt-br manter uma cópia local do e-mail +kilobytes felamimail pt-br Kbytes +language felamimail pt-br Idioma +last name felamimail pt-br Último nome +left felamimail pt-br Esquerda +less felamimail pt-br menor +less than felamimail pt-br menor que +light gray felamimail pt-br Cinza claro +list all felamimail pt-br Listar todos +loading felamimail pt-br carregando +location of buttons when composing felamimail pt-br Localização dos botões na composição +mail server login type admin pt-br Tipo de conexão do servidor de correio +mail settings felamimail pt-br Preferências de Correio +mainmessage felamimail pt-br mensagem principal +manage email accounts and identities common pt-br Gerenciar contas de e-mail e identidades +manage emailaccounts common pt-br Gerenciar contas de e-mail +manage emailfilter / vacation preferences pt-br Gerenciar Filtros / Ausência +manage folders common pt-br Gerenciar pastas +manage sieve common pt-br Gerenciar scripts Sieve +manage signatures felamimail pt-br Gerenciar assinaturas +mark as deleted felamimail pt-br Remover mensagem(ns) selecionada(s) +mark messages as felamimail pt-br Marcar mensagem(ns) selecionada(s) como +mark selected as flagged felamimail pt-br Marcar mensagem(ns) selecionada(s) como sinalizada(s) +mark selected as read felamimail pt-br Marcar mensagem(ns) selecionada(s) como lida(s) +mark selected as unflagged felamimail pt-br Marcar mensagem(ns) selecionada(s) como não sinalizada(s) +mark selected as unread felamimail pt-br Marcar mensagem(ns) selecionada(s) como não lida(s) +match felamimail pt-br Coincidente +matches felamimail pt-br coincidentes +matches regexp felamimail pt-br coincidentes com a expressão +max uploadsize felamimail pt-br tamanho máximo para upload +message highlighting felamimail pt-br Destaque de mensagens +message list felamimail pt-br Lista de mensagens +messages felamimail pt-br mensagens +mon felamimail pt-br Seg +move felamimail pt-br mover +move messages felamimail pt-br mover mensagens +move selected to felamimail pt-br mover selecionados para +move to trash felamimail pt-br Mover para a lixeira +moving messages to felamimail pt-br Movendo mensagens para +name felamimail pt-br Nome +never display html emails felamimail pt-br Nunca mostar mensagens em HTML +new common pt-br Novo +new filter felamimail pt-br Novo Filtro +next felamimail pt-br Próximo +next message felamimail pt-br próxima mensagem +no active imap server found!! felamimail pt-br Nenhum servidor IMAP ativo encontrado!! +no address to/cc/bcc supplied, and no folder to save message to provided. felamimail pt-br Nenhum endereço em PARA/CC/CCO informado e nenhuma pasta para salvar mensagens definida. +no encryption felamimail pt-br sem criptografia +no filter felamimail pt-br Sem filtro +no folders found felamimail pt-br Nenhuma pasta encontrada +no folders were found to subscribe to! felamimail pt-br Nenhuma pasta encontrada para inscrição +no folders were found to unsubscribe from! felamimail pt-br Nenhuma pasta encontrada para desinscrever +no highlighting is defined felamimail pt-br Nenhum destaque foi definido +no message returned. felamimail pt-br Nenhuma mensagem retornada. +no messages found... felamimail pt-br Nenhuma mensagem foi encontrada... +no messages selected, or lost selection. changing to folder felamimail pt-br Nenhuma mensagem selecionada (ou perdeu-se a seleção). Alternando para pasta +no messages were selected. felamimail pt-br Nenhuma mensagem foi selecionada. +no plain text part found felamimail pt-br Nehuma parte em texto puro encontrada +no previous message felamimail pt-br Nenhuma mensagem anterior +no recipient address given! felamimail pt-br Nenhum endereço informado! +no signature felamimail pt-br sem assinatura +no subject given! felamimail pt-br Nenhum assunto informado! +no supported imap authentication method could be found. felamimail pt-br Nenhum método de autenticação suportado pelo servidor IMAP foi encontrado. +no valid emailprofile selected!! felamimail pt-br Nenhum perfil de e-mail válido selecionado!!! +none felamimail pt-br Nenhum +on felamimail pt-br em +on behalf of felamimail pt-br em nome de +one address is not valid felamimail pt-br Um endereço não é válido +only inbox felamimail pt-br Somente Caixa de Entrada +only one window felamimail pt-br Somente uma janela +only unseen felamimail pt-br Somente não vistas +open all felamimail pt-br abrir tudo +options felamimail pt-br Opções +or felamimail pt-br ou +organisation felamimail pt-br organização +organization felamimail pt-br organização +organization name admin pt-br Nome da organização +original message felamimail pt-br mensagem original +outgoing mail server(smtp) felamimail pt-br servidor SMTP de saída +participants felamimail pt-br Participantes +personal information felamimail pt-br Informação pessoal +please select a address felamimail pt-br Por favor, selecione um endereço +please select the number of days to wait between responses felamimail pt-br Por favor, selecione o número de dias para aguardar entre respostas. +please supply the message to send with auto-responses felamimail pt-br Por favor, informe a mensagem para enviar como auto-resposta. +port felamimail pt-br porta +posting felamimail pt-br envio +previous felamimail pt-br Anteriores +previous message felamimail pt-br mensagem anterior +print it felamimail pt-br imprima +print this page felamimail pt-br Imprimir esta página +printview felamimail pt-br visualização da impressão +quicksearch felamimail pt-br Pesquia rápida +read felamimail pt-br Lido +reading felamimail pt-br Lendo +receive notification felamimail pt-br Receber notificação de entrega +recent felamimail pt-br recente +refresh time in minutes felamimail pt-br Tempo de atualização em minutos +reject with felamimail pt-br rejeitar com +remove felamimail pt-br Remover +remove immediately felamimail pt-br Remover imediatamente +rename felamimail pt-br Renomear +rename a folder felamimail pt-br Renomear uma pasta +rename folder felamimail pt-br Renomear pasta +renamed successfully! felamimail pt-br Renomeado com sucesso! +replied felamimail pt-br Respondido +reply felamimail pt-br Responde +reply all felamimail pt-br Responde a todos +reply to felamimail pt-br Responde a +replyto felamimail pt-br Responde a +respond felamimail pt-br Responder +respond to mail sent to felamimail pt-br Responder para e-mail de origem +return felamimail pt-br Voltar +return to options page felamimail pt-br Voltar à página de opções +right felamimail pt-br Direita +row order style felamimail pt-br estilo da ordem de linha +rule felamimail pt-br Regra +sat felamimail pt-br Sáb +save felamimail pt-br salvar +save as draft felamimail pt-br salvar como rascunho +save as infolog felamimail pt-br salvar como tarefa +save changes felamimail pt-br Salvar alterações +save message to disk felamimail pt-br Salvar mensagem no disco +script name felamimail pt-br Nome do script +script status felamimail pt-br Status do script +search felamimail pt-br Pesquisa +search for felamimail pt-br Pesquisa por +select felamimail pt-br Selecionar +select all felamimail pt-br Selecionar todos +select emailprofile felamimail pt-br Selecionar perfil de E-Mail +select folder felamimail pt-br Selecionar pasta +select your mail server type admin pt-br Selecionar o tipo do seu servidor de e-mail +send felamimail pt-br Enviar +send a reject message felamimail pt-br Enviar uma mensagem de rejeição +sent felamimail pt-br Enviado +sent folder felamimail pt-br Pasta Enviadas +server supports mailfilter(sieve) felamimail pt-br Servidor suporta filtro de e-mails (sieve) +set as default felamimail pt-br Definir como padrão +show header felamimail pt-br Exibir cabeçalho +show new messages on main screen felamimail pt-br Exibir novas mensagens na tela principal +sieve script name felamimail pt-br nome do script sieve +sieve settings admin pt-br Configurações SIEVE +signatur felamimail pt-br Assinatura +signature felamimail pt-br Assinatura +simply click the target-folder felamimail pt-br Clique no diretório destino +size felamimail pt-br Tamanho +size of editor window felamimail pt-br Tamanho da janela do editor +size(...->0) felamimail pt-br Tamanho (...->0) +size(0->...) felamimail pt-br Tamanho (0->...) +skipping forward felamimail pt-br buscando as próximas mensagens +skipping previous felamimail pt-br buscando as mensagens anteriores +small view felamimail pt-br Visão resumida +smtp settings admin pt-br Cofigurações SMTP +start new messages with mime type plain/text or html? felamimail pt-br iniciar novas mensagens com mime type plain/text ou html ? +subject felamimail pt-br Assunto +subject(a->z) felamimail pt-br Assunto (A->Z) +subject(z->a) felamimail pt-br Assunto (Z->A) +submit felamimail pt-br Enviar +subscribe felamimail pt-br Inscrever +subscribed felamimail pt-br Inscrito +subscribed successfully! felamimail pt-br Inscrito com sucesso! +sun felamimail pt-br Dom +system signature felamimail pt-br assinatura do sistema +table of contents felamimail pt-br Índice +template folder felamimail pt-br Pasta Modelos +templates felamimail pt-br Modelos +text only felamimail pt-br Somente texto +text/plain felamimail pt-br texto/plano +the connection to the imap server failed!! felamimail pt-br A conexão com o servidor IMAP falhou! +the imap server does not appear to support the authentication method selected. please contact your system administrator. felamimail pt-br O servidor IMAP aparentemente não suporta o método de autenticação selecionado. Por favor, entre em contato com o administrador do sistema. +the message sender has requested a response to indicate that you have read this message. would you like to send a receipt? felamimail pt-br O remetente da mensagem solicitou uma resposta para indicar que você a leu. Gostaria de enviá-la? +the mimeparser can not parse this message. felamimail pt-br O analisador mime não pôde processar esta mensagem. +then felamimail pt-br ENTÃO +this folder is empty felamimail pt-br ESTA PASTA ESTÁ VAZIA +this php has no imap support compiled in!! felamimail pt-br Esse aplicativo PHP não foi compilado com suporte IMAP +thu felamimail pt-br Qui +to felamimail pt-br Para +to mail sent to felamimail pt-br Enviar e-mail para +to use a tls connection, you must be running a version of php 5.1.0 or higher. felamimail pt-br Para usar uma conexão TLS você precisar estar rodadndo a versão 5.1.0 ou maior do PHP. +translation preferences felamimail pt-br Preferências de tradução +translation server felamimail pt-br Servidor de tradução +trash felamimail pt-br Lixeira +trash fold felamimail pt-br Pasta Lixeira +trash folder felamimail pt-br Pasta Lixeira +tue felamimail pt-br Ter +type felamimail pt-br tipo +unexpected response from server to authenticate command. felamimail pt-br Resposta inesperada do servidor para o comando AUTENTICAR. +unexpected response from server to digest-md5 response. felamimail pt-br Resposta inesperada do servidor para a resposta Digest-MD5. +unexpected response from server to login command. felamimail pt-br Resposta inesperada do servidor para o comando LOGIN. +unflagged felamimail pt-br dessinalizado +unknown err felamimail pt-br Erro desconhecido +unknown error felamimail pt-br Erro desconhecido +unknown imap response from the server. server responded: %s felamimail pt-br Resposta desconhecida do servidor IMAP. O servidor respondeu: %s +unknown sender felamimail pt-br Remetente desconhecido +unknown user or password incorrect. felamimail pt-br Usuário ou senha inválido. +unread common pt-br Não lido +unseen felamimail pt-br Não lido +unselect all felamimail pt-br Desmarcar todos +unsubscribe felamimail pt-br Desincrever +unsubscribed felamimail pt-br Desinscrito +unsubscribed successfully! felamimail pt-br Desinscrito com sucesso! +up felamimail pt-br para cima +updating message status felamimail pt-br atualizando status da(s) mensagem(ns) +updating view felamimail pt-br atualizando exibição +use emailadmin to create profiles felamimail pt-br usar Administrador de E-Mails para criar perfis. +use a signature felamimail pt-br Usar uma asinatura +use a signature? felamimail pt-br Usar uma asinatura? +use addresses felamimail pt-br Usar endereços +use custom identities felamimail pt-br Usar identifidades personalizadas +use custom settings felamimail pt-br Usar configurações personalizadas +use regular expressions felamimail pt-br Usar expressões regulares +use smtp auth admin pt-br Usar autenticação SMTP +users can define their own emailaccounts admin pt-br Usuário pode definir suas próprias contas de correio +vacation notice common pt-br Notícia de ausência +vacation notice is active felamimail pt-br Notícia de ausência está ativa +vacation start-date must be before the end-date! felamimail pt-br Data inicial de ausência deve ser ANTERIOR à data final ! +validate certificate felamimail pt-br validar certificado +view full header felamimail pt-br Exibir cabeçalho completo +view header lines felamimail pt-br Exibir linhas de cabeçalho +view message felamimail pt-br Exibir mensagem +viewing full header felamimail pt-br Exibindo cabeçalho completo +viewing message felamimail pt-br Exibindo mensagem +viewing messages felamimail pt-br Exibindo mensagens +wed felamimail pt-br Qua +when deleting messages felamimail pt-br Ao remover mensagens +with message felamimail pt-br com mensagem +with message "%1" felamimail pt-br com mensagem "%1" +wrap incoming text at felamimail pt-br Quebrar a linha do texto de entrada em +writing felamimail pt-br escrevendo +wrote felamimail pt-br escreveu +you can use %1 for the above start-date and %2 for the end-date. felamimail pt-br Você pode usar %1 para a data inicial acima e %2 para a data final. +you have received a new message on the felamimail pt-br Você recebeu uma nova mensagem na +your message to %1 was displayed. felamimail pt-br Sua mensagem para %1 foi lida diff --git a/felamimail/lang/egw_pt.lang b/felamimail/lang/egw_pt.lang new file mode 100644 index 0000000000..8c505ca38f --- /dev/null +++ b/felamimail/lang/egw_pt.lang @@ -0,0 +1,352 @@ +(no subject) felamimail pt (sem assunto) +(only cc/bcc) felamimail pt (apenas Cc/Bcc) +(unknown sender) felamimail pt (remetente desconhecido) +activate felamimail pt Activar +activate script felamimail pt activar script +add address felamimail pt Adicionar endereço +add rule felamimail pt Adicionar regra +add script felamimail pt Adicionar script +add to %1 felamimail pt Adicionar a %1 +add to address book felamimail pt Adicionar ao livro de endereços +add to addressbook felamimail pt adicionar ao livro de endereços +additional info felamimail pt Informação adicional +address book felamimail pt Livro de Endereços +address book search felamimail pt Pesquisa no livro de endereços +after message body felamimail pt Depois do corpo da mensagem +all address books felamimail pt Todos os livros de endereços +all folders felamimail pt Todas as pastas +all of felamimail pt todos de +allways a new window felamimail pt Sempre numa nova janela +always show html emails felamimail pt Exibir sempre mensagens HTML +any of felamimail pt algum de +anyone felamimail pt alguém +as a subfolder of felamimail pt como subpasta de +attachments felamimail pt Anexos +auto refresh folder list felamimail pt Actualização automática da lista de pastas +back to folder felamimail pt Voltar à pasta +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail pt Baseado em critérios dados, as mensagens recebidas podem ter cores de fundo diferentes na lista de mensagens. Isso facilita a distinção da origem das mensagens, particularmente no caso de listas de mensagens. +bcc felamimail pt Bcc +before headers felamimail pt Antes do cabeçalho +between headers and message body felamimail pt Entre cabeçalho e corpo da mensagem +body part felamimail pt corpo da mensagem +can't connect to inbox!! felamimail pt não é possível aceder à caixa de entrada!! +cc felamimail pt Cc +change folder felamimail pt Alterar pastas +check message against next rule also felamimail pt Verificar mensagem aplicando a regra seguinte também +checkbox felamimail pt Caixa de selecção +click here to log back in. felamimail pt Clique aqui para (re-)entrar. +click here to return to %1 felamimail pt Clique aqui para voltar a %1 +close all felamimail pt fechar tudo +close this page felamimail pt fechar esta página +close window felamimail pt Fecha janela +color felamimail pt Cor +compose felamimail pt Compor +compress folder felamimail pt Comprimir pasta +configuration felamimail pt Configuração +contains felamimail pt contém +could not add folder %1 (%2) !!! felamimail pt Não foi possível adicionar a pasta %1 (%2) !!! +could not delete folder %1 (%2) !!! felamimail pt Não foi possível eliminar a pasta %1 (%2) !!! +could not rename folder %1 to %2 (%3) !!! felamimail pt Não foi possível renomear a pasta %1 para %2 (%3) !!! +create felamimail pt Criar +create folder felamimail pt Criar pasta +create sent felamimail pt Criar a pasta Enviados +create subfolder felamimail pt Criar subpasta +create trash felamimail pt Criar a pasta Lixo +created folder successfully! felamimail pt Pasta criada com sucesso! +dark blue felamimail pt Azul escuro +dark cyan felamimail pt Cyan escuro +dark gray felamimail pt Cinza escuro +dark green felamimail pt Verde escuro +dark magenta felamimail pt Bordeaux escuro +dark yellow felamimail pt Amarelo escuro +date(newest first) felamimail pt Data (+ recente primeiro) +date(oldest first) felamimail pt Data (+ antiga primeiro) +days felamimail pt dias +deactivate script felamimail pt desactivar script +default sorting order felamimail pt Ordenar por (por omissão) +delete all felamimail pt eliminar tudo +delete folder felamimail pt Eliminar pasta +delete script felamimail pt eliminar script +delete selected felamimail pt Eliminar seleccionados +delete selected messages felamimail pt eliminar mensagens seleccionadas +deleted felamimail pt eliminado/a +deleted folder successfully! felamimail pt Pasta eliminada com sucesso! +disable felamimail pt Desactivar +discard message felamimail pt Cancelar mensagem +display messages in multiple windows felamimail pt Apresentar mensagens +display of html emails felamimail pt Apresentar mensagens em HTML +display only when no plain text is available felamimail pt Apresentar apenas quando a versão de texto não estiver disponível +display preferences felamimail pt Preferências de apresentação +do it! felamimail pt Executa! +do not use sent felamimail pt Não utilizar a pasta Enviados +do not use trash felamimail pt Não utilizar a pasta Lixo +do you really want to delete the '%1' folder? felamimail pt Tem a certeza de que deseja eliminar a pasta '%1'? +does not contain felamimail pt não contém +does not match felamimail pt não coincide +does not match regexp felamimail pt regexp não coincide +don't use sent felamimail pt Não utilizar a pasta Enviados +don't use trash felamimail pt Não utilizar a pasta Lixo +down felamimail pt baixo +download felamimail pt transferência +download this as a file felamimail pt Transferir como ficheiro +e-mail felamimail pt Correio electrónico +e-mail address felamimail pt Endereço de correio electrónico +e-mail folders felamimail pt Pastas de correio electrónico +edit email forwarding address felamimail pt editar endereço de reencaminhamento de mensagens +edit filter felamimail pt Editar filtro +edit rule felamimail pt Editar regra +edit selected felamimail pt Editar seleccionado +edit vacation settings felamimail pt editar definições de ausência +email address felamimail pt Endereço de correio electrónico +email forwarding address felamimail pt endereço de reencaminhamento de mensagens +email signature felamimail pt Assinatura +empty trash felamimail pt Esvaziar o Lixo +enable felamimail pt Activar +enter your default mail domain ( from: user@domain ) admin pt Insira o seu domínio de correio electrónico por omissão ( De: utilizador@domínio ) +enter your imap mail server hostname or ip address admin pt Insira o nome do seu servidor de correio electrónico IMAP ou o endereço IP +enter your sieve server hostname or ip address admin pt Insira o nome do seu servidor SIEVE ou o endereço IP +enter your sieve server port admin pt Insira o porto do seu servidor SIEVE +enter your smtp server hostname or ip address admin pt Insira o nome do seu servidor SMTP ou o endereço IP +enter your smtp server port admin pt Insira o porto do seu servidor SMTP +error felamimail pt Erro +error connecting to imap serv felamimail pt Erro na ligação ao servidor IMAP +error opening felamimail pt Erro ao abrir +every felamimail pt todos +every %1 days felamimail pt todos os %1 dias +expunge felamimail pt Apagar +felamimail common pt FelaMiMail +file into felamimail pt Ficheiro em +files felamimail pt ficheiros +filter active felamimail pt filtro activo +filter name felamimail pt Nome do filtro +filter rules felamimail pt regras do filtro +first name felamimail pt Primeiro nome +flagged felamimail pt marcado +flags felamimail pt Marcadores +folder acl felamimail pt Pasta ACL +folder name felamimail pt Nome da pasta +folder path felamimail pt Folder Path +folder preferences felamimail pt Preferências de pastas +folder settings felamimail pt Definições das pastas +folder status felamimail pt Estado das pastas +folderlist felamimail pt Lista de pastas +foldername felamimail pt Nome da pasta +folders felamimail pt Pastas +folders created successfully! felamimail pt Pastas criadas com sucesso! +follow felamimail pt seguir +for mail to be send - not functional yet felamimail pt Para mensagens a ser enviadas - ainda não funcional +for received mail felamimail pt Para mensagens recebidas +forward felamimail pt Encaminhar +forward to address felamimail pt Encaminhar para o endereço +forwarding felamimail pt A encaminhar +found felamimail pt Encontrado +fri felamimail pt Fri +from felamimail pt De +from(a->z) felamimail pt De (A->Z) +from(z->a) felamimail pt De (Z->A) +full name felamimail pt Nome completo +greater than felamimail pt maior que +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail pt Para mais informações sobre o Squirrelmail, visite a ligação www.felamimail.org.
    +header lines felamimail pt Linhas do cabeçalho +hide header felamimail pt esconder cabeçalho +html felamimail pt HTML +icons and text felamimail pt Ícones e texto +icons only felamimail pt Apenas ícones +identifying name felamimail pt Nome de identificação +if felamimail pt Se +if from contains felamimail pt Se o campo de contiver +if mail header felamimail pt Se o cabeçalho da mensagem for +if message size felamimail pt Se o tamanho da mensagem for +if subject contains felamimail pt Se o assunto contiver +if to contains felamimail pt Se o campo para contiver +illegal folder name. please select a different name. felamimail pt Nome de pasta inválida. Por favor, escolha um nome diferente. +imap felamimail pt IMAP +imap server felamimail pt Servidor IMAP +imap server address felamimail pt Endereço de servidor IMAP +imap server type felamimail pt Tipo de servidor IMAP +imaps authentication felamimail pt Autenticação IMAP +imaps encryption only felamimail pt Apenas cifra IMAP +in felamimail pt em +index order felamimail pt Índice +info felamimail pt Info +invalid user name or password felamimail pt Nome de utilizador ou senha inválidos +javascript felamimail pt JavaScript +keep a copy of the message in your inbox felamimail pt Guardar uma cópia da mensagem na suca caixa de entrada +keep local copy of email felamimail pt Guardar cópia local de mensagens +kilobytes felamimail pt kilobytes +language felamimail pt linguagem +last name felamimail pt Apelido +left felamimail pt Esquerda +less felamimail pt menos +less than felamimail pt menos de +light gray felamimail pt Cinza claro +list all felamimail pt Listar todos +location of buttons when composing felamimail pt Localização dos botões na hora de compor +mail server login type admin pt Tipo de acesso ao servidor de correio electrónico +mail settings felamimail pt Preferências de mensagens +mainmessage felamimail pt mensagem principal +manage emailfilter / vacation preferences pt Gerir filtro de mensagens / ausência +manage folders common pt Gerir pastas +manage sieve common pt Gerir scripts SIEVE +mark as deleted felamimail pt Marcar como apagada +mark messages as felamimail pt Marcar mensagens seleccionadas como +mark selected as flagged felamimail pt Marcar mensagens seleccionadas como marcadas +mark selected as read felamimail pt Marcar mensagens seleccionadas como lidas +mark selected as unflagged felamimail pt Marcar mensagens seleccionadas como não marcadas +mark selected as unread felamimail pt Marcar mensagens seleccionadas como não lidas +match felamimail pt Exacto +matches felamimail pt Coincide +matches regexp felamimail pt Coincide com regexp +message highlighting felamimail pt Colorização de mensagens +message list felamimail pt Lista de mensagens +messages felamimail pt Mensagens +mon felamimail pt Seg +move felamimail pt Mover +move messages felamimail pt Mover mensagens +move selected to felamimail pt Mover mensagens seleccionadas para +move to trash felamimail pt Mover para o lixo +moving messages to felamimail pt A mover mensagens para +name felamimail pt Nome +never display html emails felamimail pt Nunca apresentar mensagens HTML +new common pt Novo +new filter felamimail pt Novo filtro +next felamimail pt Seguinte +next message felamimail pt mensagem seguinte +no filter felamimail pt Sem filtro +no folders found felamimail pt Nenhuma pasta encontrada +no folders were found to subscribe to! felamimail pt Nenhuma pasta encontrada para subscrição! +no folders were found to unsubscribe from! felamimail pt Nenhuma pasta encontrada para desistência de subscrição! +no highlighting is defined felamimail pt Nenhuma colorização foi definida +no messages found... felamimail pt Nenhuma mensagem encontrada... +no messages were selected. felamimail pt Nenhuma mensagem foi seleccionada. +no previous message felamimail pt Nenhuma mensagem anterior +no valid emailprofile selected!! felamimail pt Nenhum perfil válido de correio electrónico seleccionado!! +none felamimail pt Nenhum +on behalf of felamimail pt em nome de +one address is not valid felamimail pt Um endereço não é válido +only inbox felamimail pt Apenas caixa de entrada +only one window felamimail pt Apenas numa janela +only unseen felamimail pt Apenas não vistas +open all felamimail pt abrir tudo +options felamimail pt Opções +organisation felamimail pt empresa +organization felamimail pt empresa +organization name admin pt Nome da empresa +participants felamimail pt Participantes +personal information felamimail pt Informação pessoal +please select a address felamimail pt Por favor, seleccione um endereço +please select the number of days to wait between responses felamimail pt Por favor, seleccione o número de dias a esperar entre respostas +please supply the message to send with auto-responses felamimail pt Por favor, insira uma mensagem a enviar como auto-resposta +posting felamimail pt publicar +previous felamimail pt Anterior +previous message felamimail pt mensagens anterior +print it felamimail pt imprimir +print this page felamimail pt imprimir esta página +quicksearch felamimail pt Pesquisa simples +read felamimail pt Lido +reading felamimail pt A ler +recent felamimail pt recente +refresh time in minutes felamimail pt Actualizar (em minutos) +remove felamimail pt eliminar +remove immediately felamimail pt Eliminar imediatamente +rename felamimail pt Renomear +rename a folder felamimail pt Renomear uma pasta +rename folder felamimail pt Renomear pasta +renamed successfully! felamimail pt Renomeado com sucesso! +replied felamimail pt respondido +reply felamimail pt Responder +reply all felamimail pt Responder a todos +reply to felamimail pt Responder a +replyto felamimail pt Responder a +respond felamimail pt Responder +respond to mail sent to felamimail pt Responder a mensagem enviada para +return felamimail pt Voltar +return to options page felamimail pt Voltar à página de opções +right felamimail pt Direita +rule felamimail pt Regra +sat felamimail pt Sáb +save felamimail pt Guardar +save changes felamimail pt Guardar alterações +script name felamimail pt Nome do script +script status felamimail pt Estado do script +search felamimail pt Pesquisa +search for felamimail pt Pesquisar por +select felamimail pt Seleccionar +select all felamimail pt Seleccionar todos +select emailprofile felamimail pt Seleccionar perfil de correio electrónico +select folder felamimail pt Seleccionar pasta +select your mail server type admin pt Seleccionar o tipo do seu servidor de correio electrónico +send felamimail pt Enviar +send a reject message felamimail pt enviar mensagem de rejeição +sent folder felamimail pt Pasta Enviados +show header felamimail pt exibir cabeçalho +show new messages on main screen felamimail pt Exibir novas mensagens no ecrã principal +sieve settings admin pt Configurações do Sieve +signature felamimail pt Assinatura +simply click the target-folder felamimail pt Clique simplesmente na pasta de destino +size felamimail pt Tamanho +size of editor window felamimail pt Tamanho da janela para editar +size(...->0) felamimail pt Tamanho (...->0) +size(0->...) felamimail pt Tamanho (0->...) +small view felamimail pt Sumário +smtp settings admin pt Configurações do SMTP +subject felamimail pt Assunto +subject(a->z) felamimail pt Assunto (A->Z) +subject(z->a) felamimail pt Assunto (Z-->A) +submit felamimail pt Enviar +subscribe felamimail pt Subscrever +subscribed felamimail pt Subscrito +subscribed successfully! felamimail pt Subscreveu com sucesso! +sun felamimail pt Dom +table of contents felamimail pt Tabela de conteúdos +text only felamimail pt Apenas texto +the connection to the imap server failed!! felamimail pt Falha na ligação ao servidor IMAP!! +the mimeparser can not parse this message. felamimail pt O mimeparser não pode analisar estas mensagem. +then felamimail pt então +this folder is empty felamimail pt Esta pasta está vazia +this php has no imap support compiled in!! felamimail pt O PHP não tem suporte de IMAP compilado!! +thu felamimail pt Qui +to felamimail pt Para +to mail sent to felamimail pt Para mensagens enviadas para +translation preferences felamimail pt Preferências de tradução +translation server felamimail pt Servidor de tradução +trash fold felamimail pt Pasta Lixo +trash folder felamimail pt Pasta Lixo +tue felamimail pt Ter +type felamimail pt Tipo +unflagged felamimail pt desmarcado +unknown err felamimail pt Erro desconhecido +unknown error felamimail pt Erro desconhecido +unknown sender felamimail pt Remetente desconhecido +unknown user or password incorrect. felamimail pt Utilizador desconhecido ou senha incorrecta. +unread common pt Não lida +unseen felamimail pt Não vista +unselect all felamimail pt Não seleccionar tudo +unsubscribe felamimail pt Desistir de subscrição +unsubscribed felamimail pt Desistência de subscrição +unsubscribed successfully! felamimail pt Desistência de subscrição executada com sucesso! +up felamimail pt para cima +use emailadmin to create profiles felamimail pt utilizar Administração do Correio Electrónico para criar perfis +use a signature felamimail pt Utilizar uma assinatura +use a signature? felamimail pt Utilizar uma asinatura? +use addresses felamimail pt Utilizar endereços +use custom settings felamimail pt Utilizar definições personalizadas +use javascript or html addressbook? felamimail pt Utilizar livro de endereços Javascript ou HTML? +use regular expressions felamimail pt Utilizar expressões regulares +use smtp auth admin pt Utilizar autenticação SMTP +users can define their own emailaccounts admin pt Os utilizadores podem definir as suas contas de correio electrónico +vacation notice felamimail pt aviso de ausência +view full header felamimail pt Ver cabeçalho completo +view message felamimail pt Ver mensagem +viewing full header felamimail pt A ver cabeçalho completo +viewing message felamimail pt A ver mensagem +viewing messages felamimail pt A ver mensagens +wed felamimail pt Qua +welcome to %1's webmail system felamimail pt Bem-vindo ao sistema de WebMail %1 +when deleting messages felamimail pt Ao eliminar mensagens +with message felamimail pt com mensagem +with message "%1" felamimail pt com mensagem "%1" +wrap incoming text at felamimail pt Quebrar a linha do texto de entrada em +writing felamimail pt A escrever +wrote felamimail pt Escreveu +you must login first. felamimail pt É necessário entrar primeiro. diff --git a/felamimail/lang/egw_ru.lang b/felamimail/lang/egw_ru.lang new file mode 100644 index 0000000000..7613fdc429 --- /dev/null +++ b/felamimail/lang/egw_ru.lang @@ -0,0 +1,466 @@ +(no subject) felamimail ru (без темы) +(only cc/bcc) felamimail ru (только Cc/Bcc) +(separate multiple addresses by comma) felamimail ru (разделять подряд идущие адреса запятой) +(unknown sender) felamimail ru (неизвестный отправитель) +activate felamimail ru Активировать +activate script felamimail ru Активировать скрипт +activating by date requires a start- and end-date! felamimail ru Активация по дате требует наличия начайльной И конечной даты! +add acl felamimail ru добавить ACL +add address felamimail ru Добавить адрес +add rule felamimail ru Добавить правило +add script felamimail ru Добавить скрипт +add to %1 felamimail ru Добавить в %1 +add to address book felamimail ru добавить в адресную книгу +add to addressbook felamimail ru добавить в адресную книгу +adding file to message. please wait! felamimail ru Добавление файла в сообщение.Пожалуйста подождите. +additional info felamimail ru Добавочная информация. +address book felamimail ru Адресная книга +address book search felamimail ru Поиск по адресной книге +after message body felamimail ru После основного сообщения +all address books felamimail ru Все адресные книги +all folders felamimail ru Все папки +all of felamimail ru все из +allow images from external sources in html emails felamimail ru Разрешать изображения из внешних источников в письмах формата HTML +allways a new window felamimail ru всегда новое окно +always show html emails felamimail ru Всегда показывать письма формата HTML +and felamimail ru и +any of felamimail ru любой из +any status felamimail ru любое состояние +anyone felamimail ru хоть один +as a subfolder of felamimail ru как подпапка +attachments felamimail ru Вложения +authentication required felamimail ru требуется идентификация +auto refresh folder list felamimail ru Автообновление списка папок +back to folder felamimail ru Обратно в папку +bad login name or password. felamimail ru Неверное имя пользователя или пароль +bad or malformed request. server responded: %s felamimail ru Неверный или нераспознанный запрос. Ответ Сервера: %s +bad request: %s felamimail ru Неверный запрос: %s +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail ru Основываясь на вышеуказанных правилах, входящие сообщения могут имет разные цвета заливки в списке сообщений. Это помогает легче определять какое письмо от кого, особенно при использовании почтовых рассылок. +bcc felamimail ru BCC(скрытая копия) +before headers felamimail ru Перед заголовком +between headers and message body felamimail ru Между заголовком и телом сообщения +body part felamimail ru раздел тела +by date felamimail ru по дате +can not send message. no recipient defined! felamimail ru не могу послать сообщение. не указаны получатели! +can't connect to inbox!! felamimail ru не могу соединиться с INBOX(входящие) +cc felamimail ru CC(Твердая копия) +change folder felamimail ru Сменить папку +check message against next rule also felamimail ru Проверить сообщение также на соответствие следующему правилу +checkbox felamimail ru Флажок +clear search felamimail ru очистить поиск +click here to log back in. felamimail ru Кликните здесь чтобы вернуться +click here to return to %1 felamimail ru Кликните здесь чтобы вернуться к %1 +close all felamimail ru закрыть все +close this page felamimail ru закрыть эту страницу +close window felamimail ru Закрыть окно +color felamimail ru Цвет +compose felamimail ru Новое письмо +compose as new felamimail ru Создать как новое +compress folder felamimail ru Сжать папку +condition felamimail ru состояние +configuration felamimail ru Конфигурация +connection dropped by imap server. felamimail ru Соединение разорвано IMAP сервером +contains felamimail ru содержат +could not complete request. reason given: %s felamimail ru Не могу завершить запрос. Возможная Причина: %s +could not open secure connection to the imap server. %s : %s. felamimail ru Не могу открыть защищенное соединение с сервером IMAP. %s : %s +cram-md5 or digest-md5 requires the auth_sasl package to be installed. felamimail ru CRAM-MD5 и DIGEST-MD5 требуют установленного пакета Auth_SASL. +create felamimail ru создать +create folder felamimail ru Создать папку +create sent felamimail ru Создать Отправку +create subfolder felamimail ru Создать подпапку +create trash felamimail ru Создать мусорный ящик +created folder successfully! felamimail ru Папка успешно создана +dark blue felamimail ru Темно-синий +dark cyan felamimail ru Темно-голубой +dark gray felamimail ru Темно-серый +dark green felamimail ru Темно-зеленый +dark magenta felamimail ru Темно-малиновый +dark yellow felamimail ru Темно-желтый +date(newest first) felamimail ru Дата (новые - первыми) +date(oldest first) felamimail ru Дата (старые - первыми) +days felamimail ru дни +deactivate script felamimail ru Отключить скрипт +default felamimail ru По умолчанию +default signature felamimail ru подпись по умолчанию +default sorting order felamimail ru Порядок сортировки по умолчанию +delete all felamimail ru стереть все +delete folder felamimail ru Удалить папку +delete script felamimail ru удалить скрипт +delete selected felamimail ru Удалить выбранное +delete selected messages felamimail ru удалить отмеченные сообщения +deleted felamimail ru стерто +deleted folder successfully! felamimail ru Папка успешно удалена! +deleting messages felamimail ru Удаление сообщения +disable felamimail ru Отключено +discard felamimail ru отклонить +discard message felamimail ru отклонить сообщение +display message in new window felamimail ru Показать сообщение в новом окне +display messages in multiple windows felamimail ru Показать сообщения в нескольких окнах +display of html emails felamimail ru Показывать письма в формате HTML +display only when no plain text is available felamimail ru Показывать только если не доступен обычный тект +display preferences felamimail ru Показать Настройки +displaying html messages is disabled felamimail ru показ сообщений HTML отключен +do it! felamimail ru так их! +do not use sent felamimail ru Не использовать Sent (Отправленные) +do not use trash felamimail ru Не использовать Trash (Корзина) +do not validate certificate felamimail ru не проверять сертификат +do you really want to delete the '%1' folder? felamimail ru Вы правда желаете удалить папку %1? +do you really want to delete the selected accountsettings and the assosiated identity. felamimail ru Вы действительно хотите удалить выбранные настройки Учетной записи и связанного Идентификатора. +do you really want to delete the selected signatures? felamimail ru Вы правда желаете удалить выбранную подпись? +do you really want to move the selected messages to folder: felamimail ru что желаете переместить выбранные сообщения в папку: +do you want to be asked for confirmation before moving selected messages to another folder? felamimail ru Желаете ли вы получать запрос на подтверждение прежде чем выбранные сообщения будут перемещены в другую папку? +does not contain felamimail ru не содержит +does not exist on imap server. felamimail ru не существует на сервере IMAP. +does not match felamimail ru не совпадает +does not match regexp felamimail ru не совпадает regexp +don't use draft folder felamimail ru Не использовать папку Draft (Черновики) +don't use sent felamimail ru Не использовать Sent (Отправленные) +don't use template folder felamimail ru Не использовать папку шаблонов +don't use trash felamimail ru Не использовать Trash (Корзина) +dont strip any tags felamimail ru не сбрасывать никакие тэги +down felamimail ru вниз +download felamimail ru загрузить(скачать) +download this as a file felamimail ru Скачать этот файл +draft folder felamimail ru Папка черновиков +drafts felamimail ru Черновики +e-mail felamimail ru E-mail +e-mail address felamimail ru адрес эл. почты +e-mail folders felamimail ru папки эл. почты +edit email forwarding address felamimail ru редактировать адрес перенаправления эл. почты +edit filter felamimail ru Редактировать фильтр +edit rule felamimail ru редактировать правило +edit selected felamimail ru Редактировать выбранное +edit vacation settings felamimail ru редактировать настройки отказа +editor type felamimail ru Тип редактора +email address felamimail ru Адрес эл. почты +email forwarding address felamimail ru адрес перенаправления эл. почты +email notification update failed felamimail ru неудачное обновление почтового уведомления +email signature felamimail ru Подпись эл. письма +emailaddress felamimail ru адрес почты +empty trash felamimail ru очистить корзину +enable felamimail ru включить +encrypted connection felamimail ru зашифрованное соединение +enter your default mail domain ( from: user@domain ) admin ru Ведите ваш почтовый домен по умолчанию (От: user@domain) +enter your imap mail server hostname or ip address admin ru Укажите имя компьютера или IP адрес вашего сервера IMAP +enter your sieve server hostname or ip address admin ru Укажите имя компьютера или IP адрес вашего сервера SIEVE +enter your sieve server port admin ru Укажите порт сервера SIEVE +enter your smtp server hostname or ip address admin ru Укажите имя компьютера или IP адрес вашего сервера SMTP +enter your smtp server port admin ru Укажите порт сервера SMTP +error felamimail ru ОШИБКА +error connecting to imap serv felamimail ru Ошибка соединения с сервером IMAP +error connecting to imap server. %s : %s. felamimail ru Ошибка соединения с сервером IMAP. %s : %s. +error connecting to imap server: [%s] %s. felamimail ru Ошибка соединения с сервером IMAP: [%s] %s. +error opening felamimail ru Ошибка открытия +error: could not save message as draft felamimail ru Ошибка: Не могу сохранить Сообщение как Черновик +every felamimail ru каждый +every %1 days felamimail ru каждые %1 дни +expunge felamimail ru Вычеркнуть +extended felamimail ru расширенный +felamimail common ru Почта FelaMi +file into felamimail ru в файл +files felamimail ru файлы +filter active felamimail ru фильтр активирован +filter name felamimail ru Имя фильтра +filter rules common ru правила фильтрования +first name felamimail ru Имя +flagged felamimail ru отмечено флажком +flags felamimail ru Флажки +folder felamimail ru папка +folder acl felamimail ru ACL папки +folder name felamimail ru Имя папки +folder path felamimail ru Путь Папки +folder preferences felamimail ru Настройки Папки +folder settings felamimail ru Установки папки +folder status felamimail ru Состояние папки +folderlist felamimail ru Список папок +foldername felamimail ru Имя папки +folders felamimail ru Папки +folders created successfully! felamimail ru Папки созданы успешно! +follow felamimail ru следовать +for mail to be send - not functional yet felamimail ru Для писем подготовленных к отправке - пока не работает +for received mail felamimail ru Для принятого письма +forward felamimail ru Переслать +forward as attachment felamimail ru переслать как вложение +forward inline felamimail ru переслать как есть +forward messages to felamimail ru Переслать сообщения +forward to felamimail ru переслать +forward to address felamimail ru переслать на адрес +forwarding felamimail ru Пересылка +found felamimail ru Найдено +fri felamimail ru Птн +from felamimail ru От +from(a->z) felamimail ru От (А->Я) +from(z->a) felamimail ru От (Я->А) +full name felamimail ru Полное имя +greater than felamimail ru больше чем +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail ru Чтобы узнать больше о Squirrelmail посетите страницу www.felamimail.org.
    +header lines felamimail ru Строки заголовка +hide header felamimail ru Скрыть заголовок +hostname / address felamimail ru имя компьютера / адрес +how to forward messages felamimail ru как перенаправлять сообщения +html felamimail ru HTML +icons and text felamimail ru Пиктограммы и подписи +icons only felamimail ru Только пиктограммы +identifying name felamimail ru Имя для идентификации +identity felamimail ru идентификация +if felamimail ru ЕСЛИ +if from contains felamimail ru если поле ОТ содержит +if mail header felamimail ru если заголовок письма +if message size felamimail ru если размер сообщения +if shown, which folders should appear on main screen felamimail ru если показано, какие папки следует выводить на основной экран +if subject contains felamimail ru если поле Предмет содержит +if to contains felamimail ru если поле Кому содержит +if using ssl or tls, you must have the php openssl extension loaded. felamimail ru При использовании SSL либо TLS, у вас должно быть загружено расширение PHP openssl +illegal folder name. please select a different name. felamimail ru Недопустимое имя папки. Пожадуйста выберите другое. +imap felamimail ru IMAP +imap server felamimail ru Сервер IMAP +imap server address felamimail ru Адрес Сервера IMAP +imap server closed the connection. felamimail ru Сервер IMAP разорвал соединение. +imap server closed the connection. server responded: %s felamimail ru Сервер IMAP разорвал соединение. Ответ сервера: %s +imap server password felamimail ru пароль сервера IMAP +imap server type felamimail ru Тип Сервера IMAP +imap server username felamimail ru Имя пользователя сервера IMAP +imaps authentication felamimail ru Авторизация IMAPS +imaps encryption only felamimail ru Шифрование только IMAPS +in felamimail ru в +inbox felamimail ru Входящие (INBOX) +incoming mail server(imap) felamimail ru Сервер входящих сообщений (IMAP) +index order felamimail ru Порядок Индексации +info felamimail ru Информация +invalid user name or password felamimail ru Неверно указаны имя пользователя или пароль +javascript felamimail ru JavaScript +jumping to end felamimail ru перейти в конец +jumping to start felamimail ru перейти к началу +junk felamimail ru Спам +keep a copy of the message in your inbox felamimail ru хранить копию сообщений в вашей папке Входящие (inbox) +keep local copy of email felamimail ru хранить локальную копию эл. письма +kilobytes felamimail ru килобайт +language felamimail ru Язык +last name felamimail ru Фамилия +left felamimail ru Левый +less felamimail ru меньше +less than felamimail ru меньше чем +light gray felamimail ru Светло-серый +list all felamimail ru Показать все +loading felamimail ru загружаю +location of buttons when composing felamimail ru Расположение кнопок при создании письма +mail server login type admin ru Тип входа сервера почты +mail settings felamimail ru Настройки почты +mainmessage felamimail ru основное сообщение +manage email accounts and identities common ru Управлять учетными записями электропочты и идентификациями +manage emailaccounts common ru Управление учетными записями эл. почты +manage emailfilter / vacation preferences ru Управлять Фильтром/Отказом +manage folders common ru Управление папками +manage sieve common ru Управлени скриптами Sieve +manage signatures felamimail ru Управление подписями +mark as deleted felamimail ru Отметить как стертое +mark messages as felamimail ru Отметить выбранное сообщение как +mark selected as flagged felamimail ru Отметить флажком +mark selected as read felamimail ru Отметить как прочтенное +mark selected as unflagged felamimail ru Снять флажок +mark selected as unread felamimail ru Отметить как не прочтенное +match felamimail ru Совпадает +matches felamimail ru совпадения +matches regexp felamimail ru саовпадает с regexp +max uploadsize felamimail ru макс. размер публикации +message highlighting felamimail ru Подсветка Сообщений +message list felamimail ru Список Сообщений +messages felamimail ru сообщения +mon felamimail ru Пнд +move felamimail ru переместить +move messages felamimail ru переместить сообщения +move selected to felamimail ru переместить выбранное в +move to trash felamimail ru Переместить в корзину +moving messages to felamimail ru Перемещение сообщений в +name felamimail ru Имя +never display html emails felamimail ru Никогда не показывать эл. письма в формате HTML +new common ru Новое +new filter felamimail ru Новый фильтр +next felamimail ru Следующее +next message felamimail ru Следующее сообщение +no active imap server found!! felamimail ru Не обнаружен действующий сервер IMAP +no encryption felamimail ru без шифрования +no filter felamimail ru Без Фильтра +no folders found felamimail ru Папки не найдены +no folders were found to subscribe to! felamimail ru Не обнаружено папок для подписки! +no folders were found to unsubscribe from! felamimail ru Не обнаружено папок для отказа от подписки! +no highlighting is defined felamimail ru Подсветка не определена +no message returned. felamimail ru Нет ответного сообщения. +no messages found... felamimail ru сообщения не найдены... +no messages selected, or lost selection. changing to folder felamimail ru Сообщения не выбраны либо выбор утерян. Переход на папку +no messages were selected. felamimail ru Сообщения не выбраны +no plain text part found felamimail ru не найдена текстовая часть +no previous message felamimail ru нет предыдущего Сообщения +no recipient address given! felamimail ru Не указан адрес получателя! +no signature felamimail ru без подписи +no subject given! felamimail ru Тема не указана! +no supported imap authentication method could be found. felamimail ru Не может быть найден поддерживаемый метод IMAP авторизации. +no valid emailprofile selected!! felamimail ru Не выбран правильный профиль эл. почты!! +none felamimail ru ничего +on felamimail ru на +on behalf of felamimail ru от имени +one address is not valid felamimail ru Один из адресов неверен +only inbox felamimail ru Только Входящие (INBOX) +only one window felamimail ru Только одно окно +only unseen felamimail ru Только не просмотренные +open all felamimail ru открыть все +options felamimail ru Настройки +or felamimail ru или +organisation felamimail ru Организация +organization felamimail ru Организация +organization name admin ru Название организации +original message felamimail ru исходное сообщение +outgoing mail server(smtp) felamimail ru сервер исходящих сообщений (SMTP) +participants felamimail ru Подписчики +personal information felamimail ru Личная Информация +please select a address felamimail ru Пожалуйста выберите адрес +please select the number of days to wait between responses felamimail ru Пожалуйста выборите количество дней ожидания между ответами +please supply the message to send with auto-responses felamimail ru Пожалуйста введите сообщение для отправки автоответчиком +port felamimail ru порт +posting felamimail ru публикация +previous felamimail ru Предыдущий +previous message felamimail ru Предыдущее сообщение +print it felamimail ru распечатать +print this page felamimail ru распечатать страницу +printview felamimail ru предвартельный просмотр +quicksearch felamimail ru Быстрый поиск +read felamimail ru прочитано +reading felamimail ru чтение +receive notification felamimail ru Получать напоминания +recent felamimail ru недавнее +refresh time in minutes felamimail ru Время бновления в минутах +reject with felamimail ru отклонить с +remove felamimail ru Удалить +remove immediately felamimail ru Удалить немедленно +rename felamimail ru Переименовать +rename a folder felamimail ru Переименовать Папку +rename folder felamimail ru Переименовать папку +renamed successfully! felamimail ru Успешно переименовано! +replied felamimail ru был ответ +reply felamimail ru Ответить +reply all felamimail ru Ответить всем +reply to felamimail ru Ответить +replyto felamimail ru Ответить +respond felamimail ru Ответ +respond to mail sent to felamimail ru ответить на письмо посланное на +return felamimail ru Вернуться +return to options page felamimail ru Вернуться на страницу настроек +right felamimail ru Вправо +row order style felamimail ru порядок сортировки строк +rule felamimail ru Правило +sat felamimail ru Сбт +save felamimail ru Сохранить +save as draft felamimail ru сохранить как черновик +save as infolog felamimail ru сохранить как элемент ИнфоЖурнала +save changes felamimail ru сохранить изменения +save message to disk felamimail ru сохранить сообщение на диск +script name felamimail ru имя скрипта +script status felamimail ru состояние скрипта +search felamimail ru Поиск +search for felamimail ru Искать +select felamimail ru Выбрать +select all felamimail ru Выбрать Все +select emailprofile felamimail ru Выбрать профиль эл. почты +select folder felamimail ru выбрать папку +select your mail server type admin ru Выберите тип вашего сервера почты +send felamimail ru Отправить +send a reject message felamimail ru Отправить отказ +sent felamimail ru Отправлено +sent folder felamimail ru Отправленные +server supports mailfilter(sieve) felamimail ru сервер поддерживает фильтрацию почты (sieve) +set as default felamimail ru Установить по умолчанию +show header felamimail ru Показать заголовок +show new messages on main screen felamimail ru Показывать новые сообщения на основном экране +sieve script name felamimail ru название скрипта sieve +sieve settings admin ru Настройки Sieve +signatur felamimail ru Подпись +signature felamimail ru Подпись +simply click the target-folder felamimail ru Простой щелчек на целевой папке +size felamimail ru Размер +size of editor window felamimail ru Размер окна редактирования +size(...->0) felamimail ru Размер (...->0) +size(0->...) felamimail ru Размер (0->...) +skipping forward felamimail ru Прокрутить вперед +skipping previous felamimail ru прокрутка предыдущих(?) +small view felamimail ru просмотр в небольшом окне +smtp settings admin ru Параметры SMTP +start new messages with mime type plain/text or html? felamimail ru новое сообщение начинать как текст или html? +subject felamimail ru Тема +subject(a->z) felamimail ru Тема (А->Я) +subject(z->a) felamimail ru Тема (Я->А) +submit felamimail ru Отправить +subscribe felamimail ru Подписаться +subscribed felamimail ru Подписано +subscribed successfully! felamimail ru Подписались успешно! +sun felamimail ru Вскр +system signature felamimail ru системная подпись +table of contents felamimail ru Содержание +template folder felamimail ru Папка шаблонов +templates felamimail ru Шаблоны +text only felamimail ru Только текст +text/plain felamimail ru простой текст +the connection to the imap server failed!! felamimail ru Соединиться с сервером IMAP не удалось!! +the imap server does not appear to support the authentication method selected. please contact your system administrator. felamimail ru Сервер IMAP не сообщил о поддержке выбранного метода авторизации. Пожалуйста свяжитесь с системным администратором. +the message sender has requested a response to indicate that you have read this message. would you like to send a receipt? felamimail ru Отправитель сообщения затребовал ответ для определения факта прочтения вами сообщения. Вы хотите послать подтверждение о прочтении? +the mimeparser can not parse this message. felamimail ru Обработчик MIME не может обработать это сообщение.и +then felamimail ru ТОГДА +this folder is empty felamimail ru ЭТА ПАПКА ПУСТА +this php has no imap support compiled in!! felamimail ru Эта версия PHP собрана без поддержки IMAP!! +thu felamimail ru Чт +to felamimail ru Кому +to mail sent to felamimail ru отправить сообщение получателю +to use a tls connection, you must be running a version of php 5.1.0 or higher. felamimail ru Для использования соединения TLS, у вас должен работать PHP версии 5.1.0 или выше. +translation preferences felamimail ru Настройки перевода +translation server felamimail ru Сервер перевода +trash felamimail ru Корзина +trash fold felamimail ru Папка Корзина +trash folder felamimail ru Папка Корзина +tue felamimail ru Вт +type felamimail ru тип +unexpected response from server to authenticate command. felamimail ru Непредусмотренный ответ сервера на команду AUTHENTICATE +unexpected response from server to digest-md5 response. felamimail ru Непредусмотренный ответ сервера на сообщение Digest-MD5 +unexpected response from server to login command. felamimail ru Непредусмотренный ответ сервера на команду LOGIN +unflagged felamimail ru не отмечено флажком +unknown err felamimail ru Неизвестная ошибка +unknown error felamimail ru Неизвестная ошибка +unknown imap response from the server. server responded: %s felamimail ru Неизвестный ответ серера IMAP. Сервер ответил: %s +unknown sender felamimail ru Неизвестный отправитель +unknown user or password incorrect. felamimail ru Неизвестный пользователь либо неверный пароль +unread common ru Не прочитано +unseen felamimail ru Не просмотрено +unselect all felamimail ru Снять все отметки +unsubscribe felamimail ru Отказаться от подписки +unsubscribed felamimail ru Отказ от подписки +unsubscribed successfully! felamimail ru Отказ от подписки удался! +up felamimail ru вверх +updating message status felamimail ru обновление состояния сообщения +updating view felamimail ru обновление окна просмотра +use emailadmin to create profiles felamimail ru используйте EmailAdmin для создания профиля +use a signature felamimail ru Использовать подпись +use a signature? felamimail ru Использовать подпись? +use addresses felamimail ru Использовать Адреса +use custom identities felamimail ru использовать пользовательскую идентификацию +use custom settings felamimail ru Использовать Пользовательские Настройки +use regular expressions felamimail ru использоватьрасширенные правила (reg exp) +use smtp auth admin ru Использовать авторизацию по SMTP +users can define their own emailaccounts admin ru Пользователь может назначать свои собственные учетные записи эл. почты. +vacation notice common ru уведомление об отказе +vacation notice is active felamimail ru Уведомление об отказе активно +vacation start-date must be before the end-date! felamimail ru Дата начала отказа должно быть РАНЬШЕ даты окончания! +validate certificate felamimail ru проверить сертификат +view full header felamimail ru Просмотр заголовка полностью +view header lines felamimail ru Просмотр строк заголовка +view message felamimail ru Просмотреть сообщение +viewing full header felamimail ru Просмотр заголовка полностью +viewing message felamimail ru Просмотр сообщения +viewing messages felamimail ru Просмотр сообщений +wed felamimail ru Ср +when deleting messages felamimail ru При удалении сообщений +with message felamimail ru с сообщением +with message "%1" felamimail ru с сообщением "%1" +wrap incoming text at felamimail ru Перевод строк поступающего текста на +writing felamimail ru записываю +wrote felamimail ru записано +you can use %1 for the above start-date and %2 for the end-date. felamimail ru Вы можете использовать %1 в качестве даты начала и %2 в качестве даты окончания. +you have received a new message on the felamimail ru Вы получили новое сообщение на +your message to %1 was displayed. felamimail ru Ваше сообщение получателю %1 было показано. diff --git a/felamimail/lang/egw_sk.lang b/felamimail/lang/egw_sk.lang new file mode 100644 index 0000000000..fa81f7473e --- /dev/null +++ b/felamimail/lang/egw_sk.lang @@ -0,0 +1,494 @@ +%1 is not writable by you! felamimail sk na %1 NEmáte právo zápisu! +(no subject) felamimail sk (bez predmetu) +(only cc/bcc) felamimail sk (iba Kópia/Skrytá kópia) +(separate multiple addresses by comma) felamimail sk (oddeliť viacero adries čiarkou) +(unknown sender) felamimail sk (neznámy odosielateľ) +activate felamimail sk Aktivovať +activate script felamimail sk aktivovať skript +activating by date requires a start- and end-date! felamimail sk Aktivácia dátumom vyžaduje dátum začiatku AJ konca! +add acl felamimail sk Pridať ACL +add address felamimail sk Pridať adresu +add rule felamimail sk Pridať pravidlo +add script felamimail sk Pridať skript +add to %1 felamimail sk Pridať do %1 +add to address book felamimail sk Pridať do adresára +add to addressbook felamimail sk Pridať do adresára +adding file to message. please wait! felamimail sk Pripájam súbor k správe. Prosím čakajte. +additional info felamimail sk Ďalšie info +address book felamimail sk Adresár +address book search felamimail sk Hľadanie v Adresári +after message body felamimail sk Za telom správy +all address books felamimail sk Všetky Adresáre +all folders felamimail sk Všetky priečinky +all of felamimail sk všetko z +allow images from external sources in html emails felamimail sk Povoliť v HTML E-mailoch obrázky z externých zdrojov +allways a new window felamimail sk Vždy nové okno +always show html emails felamimail sk Vždy zobraziť HTML správy +and felamimail sk a +any of felamimail sk ktorýkoľvek z +any status felamimail sk ktorýkoľvek stav +anyone felamimail sk ktokoľvek +as a subfolder of felamimail sk ako podpriečinok (čoho) +attach felamimail sk Priložiť +attachments felamimail sk Prílohy +authentication required felamimail sk požaduje sa overenie +auto refresh folder list felamimail sk Automaticky obnoviť zoznam priečinkov +back to folder felamimail sk Naspäť do priečinka +bad login name or password. felamimail sk Chybné prihlasovacie meno alebo heslo. +bad or malformed request. server responded: %s felamimail sk Chybná požiadavka. Odpoveď servera: %s +bad request: %s felamimail sk Chybná požiadavka: %s +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail sk Na základe zadaných kritérií, príchodzie správy môžu mať rozličnú farbu pozadia v zozname správ. Je to pomôcka pre ľahšie rozlíšenie odosielateľa, najmä v prípade mailing listov. +bcc felamimail sk Skrytá kópia +before headers felamimail sk Pred hlavičkou +between headers and message body felamimail sk Medzi hlavičkou a telom správy +body part felamimail sk časť tela +by date felamimail sk podľa dátumu +can not send message. no recipient defined! felamimail sk Nepodarilo sa odoslať správu. Nebol zadaný adresát! +can't connect to inbox!! felamimail sk nedá sa pripojiť k Doručenej pošte! +cc felamimail sk Kópia +change folder felamimail sk Zmeniť priečinok +check message against next rule also felamimail sk skontrolovať správu aj voči ďalšiemu pravidlu +checkbox felamimail sk Začiarkávacie políčko +clear search felamimail sk vyčistiť hľadanie +click here to log back in. felamimail sk Ak sa chcete znovu prihlásiť, kliknite sem. +click here to return to %1 felamimail sk Ak sa chcete vrátiť do %1, kliknite sem +close all felamimail sk zavrieť všetko +close this page felamimail sk zavrieť túto stránku +close window felamimail sk Zavrieť okno +color felamimail sk Farba +compose felamimail sk Nová správa +compose as new felamimail sk vytvoriť ako nové +compress folder felamimail sk Zhutniť priečinok +condition felamimail sk okolnosť +configuration felamimail sk Konfigurácia +configure a valid imap server in emailadmin for the profile you are using. felamimail sk Nakonfigurujte v emailadmin platný IMAP server pre profil, ktorý používate. +connection dropped by imap server. felamimail sk Spojenie prerušené IMAP serverom. +contact not found! felamimail sk Kontakt sa nenašiel! +contains felamimail sk obsahuje +could not complete request. reason given: %s felamimail sk Nepodarilo sa dokončiť požiadavku. Dôvod: %s +could not import message: felamimail sk Nepodarilo sa importovať správu: +could not open secure connection to the imap server. %s : %s. felamimail sk Nepodarilo sa nadviazať zabezpečené spojenie k IMAP serveru. %s : %s. +cram-md5 or digest-md5 requires the auth_sasl package to be installed. felamimail sk CRAM-MD5 alebo DIGEST-MD5 vyžaduje, aby bol nainštalovaný balík Auth_SASL. +create felamimail sk Vytvoriť +create folder felamimail sk Vytvoriť priečinok +create sent felamimail sk Vytvoriť [Odoslaná pošta] +create subfolder felamimail sk Vytvoriť podpriečinok +create trash felamimail sk Vytvoriť [Odpadkový kôš] +created folder successfully! felamimail sk Priečinok vytvorený! +dark blue felamimail sk Tmavá modrá +dark cyan felamimail sk Tmavá zelenomodrá +dark gray felamimail sk Tmavá sivá +dark green felamimail sk Tmavá zelená +dark magenta felamimail sk Tmavá purpurová +dark yellow felamimail sk Tmavá žltá +date(newest first) felamimail sk Dátum (novšie na začiatok) +date(oldest first) felamimail sk Dátum (staršie na začiatok) +days felamimail sk dni +deactivate script felamimail sk deaktivovať skript +default felamimail sk predvolené +default signature felamimail sk predvolený podpis +default sorting order felamimail sk Predvolené triedenie +delete all felamimail sk odstrániť všetko +delete folder felamimail sk Odstrániť priečinok +delete script felamimail sk odstrániť skript +delete selected felamimail sk Odstrániť označené +delete selected messages felamimail sk odstrániť označené správy +deleted felamimail sk Odstránené +deleted folder successfully! felamimail sk Priečinok bol odstránený! +deleting messages felamimail sk Odstraňujem správy +disable felamimail sk Vypnúť +discard felamimail sk Zahodiť +discard message felamimail sk zahodiť správu +display message in new window felamimail sk Zobraziť správu v novom okne +display messages in multiple windows felamimail sk Zobraziť správy vo viacerých oknách +display of html emails felamimail sk Zobrazovanie HTML správ +display only when no plain text is available felamimail sk Zobraziť iba keď nie je poruke čistý neformátovaný text +display preferences felamimail sk Nastavenia zobrazovania +displaying html messages is disabled felamimail sk Zobrazovanie HTML správ je vypnuté +do it! felamimail sk Vykonaj! +do not use sent felamimail sk Nepoužívať [Odoslana pošta] +do not use trash felamimail sk Nepoužívať [Odpadkový kôš] +do not validate certificate felamimail sk Nepotvrdiť certifikát +do you really want to delete the '%1' folder? felamimail sk Naozaj chcete odstrániť priečinok '%1'? +do you really want to delete the selected accountsettings and the assosiated identity. felamimail sk Naozaj chcete odstrániť vybrané nastavenia účtu a súvisiacu Identitu? +do you really want to delete the selected signatures? felamimail sk Naozaj chcete odstrániť označené podpisy? +do you really want to move the selected messages to folder: felamimail sk Ste si istý, že chcete presunúť vybrané správy do priečinka: +do you want to be asked for confirmation before moving selected messages to another folder? felamimail sk Vyžadovať potvrdenie pred presunutím vybraných správ do iného priečinka? +do you want to prevent the editing/setup for forwarding of mails via settings (, even if sieve is enabled)? felamimail sk Zabrániť úpravám/nastaveniam pre preposielanie pošty pomocou nastavení (, aj keď je povolený SIEVE)? +do you want to prevent the editing/setup of filter rules (, even if sieve is enabled)? felamimail sk Zabrániť úpravám/nastaveniam pre filtrovacie pravidlá (, aj keď je povolený SIEVE)? +do you want to prevent the editing/setup of notification by mail to other emailadresses if emails arrive (, even if sieve is enabled)? felamimail sk Zabrániť úpravám/nastaveniam pre e-mailové upozornenia na iné e-mailové adresy (, aj keď je povolený SIEVE)? +do you want to prevent the editing/setup of the absent/vacation notice (, even if sieve is enabled)? felamimail sk Zabrániť úpravám/nastaveniam pre oznámenia o absencii/dovolenke (, aj keď je povolený SIEVE)? +do you want to prevent the managing of folders (creation, accessrights and subscribtion)? felamimail sk Zabrániť správe priečinkov (vytváranie, prístupové práva A členstvo)? +does not contain felamimail sk neobsahuje +does not exist on imap server. felamimail sk neexistuje na IMAP serveri. +does not match felamimail sk nezodpovedá +does not match regexp felamimail sk nezodpovedá regulárnemu výrazu +don't use draft folder felamimail sk Nepoužívať priečinok návrhov +don't use sent felamimail sk Nepoužívať [Odoslana pošta] +don't use template folder felamimail sk Nepoužívať [Šablóny] +don't use trash felamimail sk Nepoužívať [Odpadkový kôš] +dont strip any tags felamimail sk neodstraňovať značky +down felamimail sk dole +download felamimail sk Stiahnuť +download this as a file felamimail sk Stiahnuť to do súboru +draft folder felamimail sk Priečinok návrhov +drafts felamimail sk Návrhy +e-mail felamimail sk E-Mail +e-mail address felamimail sk E-mailová adresa +e-mail folders felamimail sk E-mailové priečinky +edit email forwarding address felamimail sk upraviť preposielaciu adresu E-mailu +edit filter felamimail sk Upraviť filter +edit rule felamimail sk upraviť pravidlo +edit selected felamimail sk Upraviť vybrané +edit vacation settings felamimail sk upraviť nastavenia vyprázdňovania +editor type felamimail sk Typ editora +email address felamimail sk E-mailová adresa +email forwarding address felamimail sk preposielacia adresa E-mailu +email notification update failed felamimail sk zlyhala e-mailová aktualizácia upozornenia +email signature felamimail sk E-mailový podpis +emailaddress felamimail sk E-mailová adresa +empty trash felamimail sk Vyprázdniť Odpadkový kôš +enable felamimail sk Zapnúť +encrypted connection felamimail sk šifrované spojenie +enter your default mail domain ( from: user@domain ) admin sk Zadať predvolenú poštovú doménu (Z tvaru: používateľ@doména) +enter your imap mail server hostname or ip address admin sk Zadajte názov (hostname) alebo IP vášho IMAP servera +enter your sieve server hostname or ip address admin sk Zadajte názov (hostname) alebo IP vášho SIEVE servera +enter your sieve server port admin sk Zadajte port vášho SIEVE servera +enter your smtp server hostname or ip address admin sk Zadajte názov (hostname) alebo IP vášho SMTP servera +enter your smtp server port admin sk Zadajte port vášho SMTP servera +error felamimail sk CHYBA +error connecting to imap serv felamimail sk Chyba počas pripájania na IMAP server +error connecting to imap server. %s : %s. felamimail sk Chyba počas pripájania k IMAP serveru. %s : %s. +error connecting to imap server: [%s] %s. felamimail sk Chyba počas pripájania k IMAP serveru: [%s] %s. +error opening felamimail sk Chyba pri otváraní +error saving %1! felamimail sk Chyba počas ukladania %1! +error: felamimail sk Chyba: +error: could not save message as draft felamimail sk Chyba: Nepodarilo sa uložiť správu ako Návrh +error: message could not be displayed. felamimail sk CHYBA: Správa sa nedá zobraziť. +every felamimail sk každý +every %1 days felamimail sk každých +expunge felamimail sk Odstrániť +extended felamimail sk Rozšírené +felamimail common sk FelaMiMail +file into felamimail sk súbor do +filemanager felamimail sk Správca súborov +files felamimail sk súbory +filter active felamimail sk filter aktívny +filter name felamimail sk Názov filtra +filter rules common sk pravidlá filtra +first name felamimail sk Krstné meno +flagged felamimail sk označené +flags felamimail sk Príznaky +folder felamimail sk priečinok +folder acl felamimail sk prístupové práva (acl) priečinku +folder name felamimail sk Názov priečinku +folder path felamimail sk Cesta k priečinku +folder preferences felamimail sk Predvoľby priečinku +folder settings felamimail sk Nastavenia priečinku +folder status felamimail sk Stav priečinku +folderlist felamimail sk Zoznam priečinkov +foldername felamimail sk Názov priečinku +folders felamimail sk Priečinky +folders created successfully! felamimail sk Priečinky boli úspešne vytvorené! +follow felamimail sk nasledovať +for mail to be send - not functional yet felamimail sk Pre správu určenú na odoslanie - v súčasnosti nefunkčné +for received mail felamimail sk Pre prijaté správy +forward felamimail sk Odoslať ďalej +forward as attachment felamimail sk Odoslať ďalej ako prílohu +forward inline felamimail sk Odoslať ďalej v texte +forward messages to felamimail sk Odoslať správy ďalej (komu) +forward to felamimail sk Odoslať ďalej (komu) +forward to address felamimail sk Odoslať ďalej na adresu +forwarding felamimail sk Odosielanie ďalej +found felamimail sk Našiel +fri felamimail sk Pia +from felamimail sk Od +from(a->z) felamimail sk Od (A->Z) +from(z->a) felamimail sk Od (Z->A) +full name felamimail sk Celé meno +greater than felamimail sk väčšie než +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail sk Pozrite na t www.felamimail.org pre ďalšie informácie o Squirrelmail.
    +header lines felamimail sk Riadky hlavičky +hide header felamimail sk skryť hlavičku +hostname / address felamimail sk názov stroja (hostname) / adresa +how to forward messages felamimail sk Ako odosielať ďalej +html felamimail sk HTML +icons and text felamimail sk Ikony a text +icons only felamimail sk Len ikony +identifying name felamimail sk Identifikačné meno +identity felamimail sk identita +if felamimail sk AK +if from contains felamimail sk ak Od obsahuje +if mail header felamimail sk ak hlavička správu +if message size felamimail sk ak veľkosť správy +if shown, which folders should appear on main screen felamimail sk Ak je zobrazené, ktoré priečinky sa majú objaviť na hlavnej obrazovke +if subject contains felamimail sk ak predmet obsahuje +if to contains felamimail sk ak Komu obsahuje +if using ssl or tls, you must have the php openssl extension loaded. felamimail sk Ak používate SSL alebo TLS, musíte mať nahraté rozšírenie PHP openssl. +illegal folder name. please select a different name. felamimail sk Nepovolený názov priečinka. Prosím zvoľte iný názov. +imap felamimail sk IMAP +imap server felamimail sk IMAP server +imap server address felamimail sk Adresa IMAP servera +imap server closed the connection. felamimail sk IMAP server ukončil spojenie. +imap server closed the connection. server responded: %s felamimail sk IMAP server ukončil spojenie. Odpoveď servera: %s +imap server password felamimail sk Heslo pre IMAP server +imap server type felamimail sk Typ IMAP servera +imap server username felamimail sk Používateľské meno pre IMAP server +imaps authentication felamimail sk IMAPS overovanie +imaps encryption only felamimail sk Iba IMAPS šifrovanie +import felamimail sk Import +import mail felamimail sk Import Správy +in felamimail sk v +inbox felamimail sk Doručená pošta +incoming mail server(imap) felamimail sk Príchodzí mail server (IMAP) +index order felamimail sk Poradie indexu +info felamimail sk Info +invalid user name or password felamimail sk Chybné používateľské meno alebo heslo +javascript felamimail sk JavaScript +jumping to end felamimail sk skočiť na koniec +jumping to start felamimail sk skočiť na začiatok +junk felamimail sk Spam +keep a copy of the message in your inbox felamimail sk ponechať kópiu správy v priečinku Doručenej pošty +keep local copy of email felamimail sk uschovať lokálnu kópiu správy +kilobytes felamimail sk kilobajtov +language felamimail sk Jazyk +last name felamimail sk Priezvisko +left felamimail sk Vľavo +less felamimail sk menej +less than felamimail sk menej než +light gray felamimail sk Svetlosivá +list all felamimail sk Zobraziť všetko +loading felamimail sk načítava sa +location of buttons when composing felamimail sk Rozmiestnenie tlačidiel pri písaní správy +mail server login type admin sk Typ prihlásenia poštového servera +mail settings felamimail sk Nastavenia pošty +mainmessage felamimail sk hlavná správa +manage email accounts and identities common sk Správa E-mailových Priečinkov a Identít +manage emailaccounts common sk Správa E-mailových účtov +manage emailfilter / vacation preferences sk Správa E-mailového filtra / Odstraňovania +manage folders common sk Správa priečinkov +manage sieve common sk Správa Sieve skriptov +manage signatures felamimail sk Správa Podpisov +mark as deleted felamimail sk Označiť ako odstránené +mark messages as felamimail sk Označiť vybrané správy ako +mark selected as flagged felamimail sk Označiť vybrané ako označkované +mark selected as read felamimail sk Označiť vybrané ako prečítané +mark selected as unflagged felamimail sk Označiť vybrané ako neoznačkované +mark selected as unread felamimail sk Označiť vybrané ako neprečítané +match felamimail sk Zhoda +matches felamimail sk zhody +matches regexp felamimail sk spĺňa regulérny výraz +max uploadsize felamimail sk max.veľkosť pre odovzdanie +message highlighting felamimail sk Zvýrazňovanie správ +message list felamimail sk Zoznam správ +messages felamimail sk správy +mon felamimail sk Pon +move felamimail sk presunúť +move folder felamimail sk presunúť priečinok +move messages felamimail sk presunúť správy +move selected to felamimail sk presunúť vybrané do +move to trash felamimail sk Presunúť do Odpadkového koša +moving messages to felamimail sk presúvam správy do +name felamimail sk Meno +never display html emails felamimail sk Nezobrazovať HTML správy +new common sk Nové +new filter felamimail sk Nový filter +next felamimail sk Ďalší +next message felamimail sk ďalšia správa +no active imap server found!! felamimail sk Nenašiel sa žiadny aktívny IMAP server !! +no address to/cc/bcc supplied, and no folder to save message to provided. felamimail sk Nebola zadaná adresa KOMU/KÓPIA/SLEPÁ KÓPIA, ani priečinok pre uloženie správy. +no encryption felamimail sk bez šifrovania +no filter felamimail sk Žiadny filter +no folders felamimail sk žiadne priečinky +no folders found felamimail sk Žiadne priečinky sa nenašli +no folders were found to subscribe to! felamimail sk Nenašli sa priečinky pre prihlásenie! +no folders were found to unsubscribe from! felamimail sk Nenašli sa priečinky pre odhlásenie! +no highlighting is defined felamimail sk Nebolo nastavené zvýrazňovanie +no imap server host configured!! felamimail sk Nebola nastavená host adresa IMAP servera!! +no message returned. felamimail sk Žiadna správa sa nevrátila. +no messages found... felamimail sk žiadne správy sa nenašli +no messages selected, or lost selection. changing to folder felamimail sk Neboli označené žiadne správy, alebo sa označenie stratilo. Prechádzam do priečinku +no messages were selected. felamimail sk Neboli vybrané žiadne správy +no plain text part found felamimail sk Nebola nájdená žiadna čisto textová časť +no previous message felamimail sk žiadna predchádzajúca správa +no recipient address given! felamimail sk Nebol zadaný adresát! +no signature felamimail sk žiadny podpis +no subject given! felamimail sk Nebol zadaný predmet sprrávy! +no supported imap authentication method could be found. felamimail sk Nenašla sa žiadna z podporovaných metód IMAP overovania. +no valid emailprofile selected!! felamimail sk Nebol vybratý platný E-mailový profil! +none felamimail sk žiadne +none, create all felamimail sk žiadne, vytvoriť všetko +notify when new mails arrive on these folders felamimail sk upozorniť, keď do týchto priečinkov príde správa +on felamimail sk ohľadom +on behalf of felamimail sk pre koho +one address is not valid felamimail sk Jedna adresa je neplatná +only inbox felamimail sk Iba Doručená pošta +only one window felamimail sk Iba jedno okno +only unseen felamimail sk Iba neprečítané +open all felamimail sk otvoriť všetko +options felamimail sk Voľby +or felamimail sk alebo +or configure an valid imap server connection using the manage accounts/identities preference in the sidebox menu. felamimail sk alebo nastavte platné pripojenie na IMAP server pomocou predvolieb v Správe Účtov/Identít v postrannej ponuke. +organisation felamimail sk organizácia +organization felamimail sk organizácia +organization name admin sk Názov organizácie +original message felamimail sk Pôvodná správa +outgoing mail server(smtp) felamimail sk Odchodzí mail server (SMTP) +participants felamimail sk Účastníci +personal information felamimail sk Osobné informácie +please ask the administrator to correct the emailadmin imap server settings for you. felamimail sk Prosím požiadajte správcu, aby opravil nastavenia IMAP servera. +please select a address felamimail sk Prosím vyberte adresu +please select the number of days to wait between responses felamimail sk Prosím vyberte počet dní, koľko čakať medzi odpoveďami +please supply the message to send with auto-responses felamimail sk Prosím zadajte správu, ktorá sa má posielať v rámci automatickej odpovede +port felamimail sk port +posting felamimail sk posielanie +previous felamimail sk Predchádzajúca +previous message felamimail sk predchádzajúca správa +print it felamimail sk vytlač to +print this page felamimail sk vytlačiť túto stránku +printview felamimail sk Náhľad pre tlač +quicksearch felamimail sk Rýchle hľadanie +read felamimail sk čítať +reading felamimail sk číta sa +receive notification felamimail sk Prijať upozornenie +recent felamimail sk súčasné +refresh time in minutes felamimail sk Čas obnovovania (v minútach) +reject with felamimail sk odmietnuť ako +remove felamimail sk odstrániť +remove immediately felamimail sk Odstrániť ihneď +rename felamimail sk Premenovať +rename a folder felamimail sk Premenovať priečinok +rename folder felamimail sk Premenovať priečinok +renamed successfully! felamimail sk Úspešne premenované. +replied felamimail sk zodpovedané +reply felamimail sk Odpoveď +reply all felamimail sk Odpoveď všetkým +reply to felamimail sk Odpovedať (komu) +replyto felamimail sk Odpovedať (komu) +respond felamimail sk Odpovedať +respond to mail sent to felamimail sk odpoveď odoslaná (komu) +return felamimail sk Návrat +return to options page felamimail sk Návrat na stránku volieb +right felamimail sk Vpravo +row order style felamimail sk Štýl usporiadania riadkov +rule felamimail sk Pravidlo +sat felamimail sk Sob +save felamimail sk Uložiť +save all felamimail sk Uložiť všetko +save as draft felamimail sk uložiť ako návrh +save as infolog felamimail sk uložiť do Záznamníka +save changes felamimail sk uložiť zmeny +save message to disk felamimail sk uložiť správu na disk +script name felamimail sk názov skriptu +script status felamimail sk stav skriptu +search felamimail sk Hľadať +search for felamimail sk Hľadaj +select felamimail sk Vybrať +select all felamimail sk Vybrať všetko +select emailprofile felamimail sk Vybrať E-mailový profil +select folder felamimail sk vybrať priečinok +select your mail server type admin sk Vyberte typ vášho poštového servera +send felamimail sk Odoslať +send a reject message felamimail sk odoslať odmietaciu správu +sent felamimail sk Odoslaná pošta +sent folder felamimail sk Priečinok Odoslaná pošta +server supports mailfilter(sieve) felamimail sk server podporuje mailfilter (sieve) +set as default felamimail sk Nastaviť ako predvolené +show header felamimail sk zobraziť hlavičku +show new messages on main screen felamimail sk Zobrazovať nové správy na hlavnej stránke +sieve script name felamimail sk Názov Sieve skriptu +sieve settings admin sk Nastavenia Sieve +signatur felamimail sk Podpis +signature felamimail sk Podpis +simply click the target-folder felamimail sk Jednoducho kliknúť na cieľový priečinok +size felamimail sk Veľkosť +size of editor window felamimail sk Veľkosť okna editora +size(...->0) felamimail sk Veľkosť (...->0) +size(0->...) felamimail sk Veľkosť (0->...) +skipping forward felamimail sk preskočiť vpred +skipping previous felamimail sk preskočiť späť +small view felamimail sk zmenšený pohľad +smtp settings admin sk Nastavenia SMTP +start new messages with mime type plain/text or html? felamimail sk Vytvárať nové správy pomocou mime typu plain/text, alebo HTML? +subject felamimail sk Predmet +subject(a->z) felamimail sk Predmet (A->Z) +subject(z->a) felamimail sk Predmet (Z->A) +submit felamimail sk Odoslať +subscribe felamimail sk Prihlásiť +subscribed felamimail sk Prihlásené +subscribed successfully! felamimail sk Úspešne prihlásené! +sun felamimail sk Ned +system signature felamimail sk podpis systému +table of contents felamimail sk Obsahová tabuľka +template folder felamimail sk Priečinok Šablóny +templates felamimail sk Šablóny +text only felamimail sk Iba text +text/plain felamimail sk text/plain +the connection to the imap server failed!! felamimail sk Pripojenie na IMAP server sa nepodarilo!!! +the imap server does not appear to support the authentication method selected. please contact your system administrator. felamimail sk Tento IMAP server nepodporuje vybranú metódu overovania. Prosím kontaktujte správcu systému. +the message sender has requested a response to indicate that you have read this message. would you like to send a receipt? felamimail sk Odosielateľ správy si vyžiadal potvrdenie o tom, že ste si jeho správu už prečítali. Chcete, aby sa mu toto potvrdenie odoslalo? +the mimeparser can not parse this message. felamimail sk Analyzátor MIME nedokázal spracovať túto správu. +then felamimail sk TAK +there is no imap server configured. felamimail sk Nie je nastavený žiadny IMAP server. +this folder is empty felamimail sk TENTO PRIEČINOK JE PRÁZDNY +this php has no imap support compiled in!! felamimail sk Tento PHP nemá zakompilovanú podporu IMAP!! +thu felamimail sk Štv +to felamimail sk Komu +to mail sent to felamimail sk pre správu poslanú (komu) +to use a tls connection, you must be running a version of php 5.1.0 or higher. felamimail sk Ak chcete používať TLS spojenie, musíte fungovať na PHP verzii 5.1.0 alebo vyššej. +translation preferences felamimail sk Nastavenia prekladu +translation server felamimail sk Prekladový server +trash felamimail sk Odpadkový kôš +trash fold felamimail sk Priečinok Odpad +trash folder felamimail sk Priečinok Odpadkový kôš +tue felamimail sk Uto +type felamimail sk typ +unexpected response from server to authenticate command. felamimail sk Neočakávaná odpoveď servera na príkaz AUTENTHICATE. +unexpected response from server to digest-md5 response. felamimail sk Neočakávaná odpoveď servera na Digest-MD5 odpoveď. +unexpected response from server to login command. felamimail sk Neočakávaná odpoveď od servera na príkaz LOGIN. +unflagged felamimail sk neoznačkovaný +unknown err felamimail sk Bližšie neurčená chyba +unknown error felamimail sk Bližšie neurčená chyba +unknown imap response from the server. server responded: %s felamimail sk Neznáma IMAP odpoveď od servera: %s +unknown sender felamimail sk Neznámy odosielateľ +unknown user or password incorrect. felamimail sk Neznámy používateľ alebo chybné heslo +unread common sk Neprečítané +unseen felamimail sk Neotvorené +unselect all felamimail sk Zrušiť výber +unsubscribe felamimail sk Odhlásiť +unsubscribed felamimail sk Odhlásené +unsubscribed successfully! felamimail sk Úspešne odhlásené! +up felamimail sk hore +updating message status felamimail sk Aktualizujem stav správy +updating view felamimail sk aktualizácia pohľadu +use emailadmin to create profiles felamimail sk pre vytváranie profilov použite EmailAdmin +use a signature felamimail sk Použiť podpis +use a signature? felamimail sk Použiť podpis? +use addresses felamimail sk Použiť adresy +use custom identities felamimail sk použiť používateľské identity +use custom settings felamimail sk Použiť používateľské nastavenia +use regular expressions felamimail sk použiť regulérne výrazy +use smtp auth admin sk Použiť SMTP overovanie +users can define their own emailaccounts admin sk Používatelia smú definovať ich vlastné poštové účty +vacation notice common sk Upozornenie o odstraňovaní +vacation notice is active felamimail sk Upozornenie o odstraňovaní je aktívne +vacation start-date must be before the end-date! felamimail sk Dátum začiatku odstraňovania musí byť PRED dátumom konca! +validate certificate felamimail sk Potvrdiť certifikát +view full header felamimail sk Zobraziť celú hlavičku +view header lines felamimail sk zobraziť riadky hlavičky +view message felamimail sk Zobraziť správu +viewing full header felamimail sk Zobrazujem celú hlavičku +viewing message felamimail sk Zobrazujem správu +viewing messages felamimail sk Zobrazujem správy +wed felamimail sk Str +when deleting messages felamimail sk Ako odstraňovať správy +which folders (additional to the sent folder) should be displayed using the sent folder view schema felamimail sk Ktoré priečinky (popri priečinku Odoslané) sa majú zobrazovať pomocou schémy Zobrazenie Priečinka Odoslaných správ +which folders - in general - should not be automatically created, if not existing felamimail sk Ktoré priečinky - vo všeobecnosti - sa NEMAJÚ vytvárať automaticky, keď neexistujú +with message felamimail sk so správou +with message "%1" felamimail sk so správou "%1" +wrap incoming text at felamimail sk Zarovnať príchodzí text: +writing felamimail sk zapisuje sa +wrote felamimail sk zapísal +you can use %1 for the above start-date and %2 for the end-date. felamimail sk Môžete použiť %1 pre vyššieuvedený dátum začiatku a %2 pre dátum konca. +you have received a new message on the felamimail sk Dostali ste novú správu: +your message to %1 was displayed. felamimail sk Vaša správa adresátovi %1 bola zobrazená. diff --git a/felamimail/lang/egw_sl.lang b/felamimail/lang/egw_sl.lang new file mode 100644 index 0000000000..67e5f5cb80 --- /dev/null +++ b/felamimail/lang/egw_sl.lang @@ -0,0 +1,471 @@ +(no subject) felamimail sl (brez zadeve) +(only cc/bcc) felamimail sl (le CC/BCC) +(separate multiple addresses by comma) felamimail sl (več naslovov ločite z vejico) +(unknown sender) felamimail sl (neznan pošiljatelj) +activate felamimail sl Aktiviraj +activate script felamimail sl Skripta za aktiviranje +activating by date requires a start- and end-date! felamimail sl Aktiviranje glede na datum zahteva določitev začetnega in končnega datuma! +add acl felamimail sl Dodaj ACL +add address felamimail sl Dodaj naslov +add rule felamimail sl Dodaj pravilo +add script felamimail sl Dodaj skripto +add to %1 felamimail sl Dodaj v %1 +add to address book felamimail sl Dodaj v adresar +add to addressbook felamimail sl Dodaj v adresar +adding file to message. please wait! felamimail sl Dodajam datoteko k sporočilu. Počakajte, prosim. +additional info felamimail sl Podrobnosti +address book felamimail sl Imenik +address book search felamimail sl Iskanje po adresarju +after message body felamimail sl Za besedilom +all address books felamimail sl Vsi adresarji +all folders felamimail sl Vse mape +all of felamimail sl Vse od +allow images from external sources in html emails felamimail sl Dovoli slike iz zunanjih virov v sporočilih HTML +allways a new window felamimail sl Vedno novo okno +always show html emails felamimail sl Vedno prikaži HTML sporočila +and felamimail sl in +any of felamimail sl Katerikoli od +any status felamimail sl Katerikoli status +anyone felamimail sl Kdorkoli +as a subfolder of felamimail sl Kot podmapa v +attachments felamimail sl Priponke +authentication required felamimail sl Zahtevana je avtentikacija +auto refresh folder list felamimail sl Samodejno osveži seznam map +back to folder felamimail sl Nazaj v mapo +bad login name or password. felamimail sl Napačno uporabniško ime ali geslo +bad or malformed request. server responded: %s felamimail sl Napačna ali napačno oblikovana zahteva. Odgovor strežnika: %s +bad request: %s felamimail sl Napačna zahteva: %s +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail sl Glede na podane kriterije imajo prispela sporočila v seznamih različne barve ozadij. To pomaga pri razlikovanju med pošiljatelji sporočil, še posebej v poštnih seznamih. +bcc felamimail sl BCC +before headers felamimail sl Pred glavo sporočila +between headers and message body felamimail sl Med glavo in telesom sporočila +body part felamimail sl Telo sporočila +by date felamimail sl Po datumu +can not send message. no recipient defined! felamimail sl Ne morem poslati sporočila - ni določen prejemnik! +can't connect to inbox!! felamimail sl Ne morem se povezati z INBOX nabiralnikom! +cc felamimail sl CC +change folder felamimail sl Spremeni mapo +check message against next rule also felamimail sl Preverite sporočilo tudi z naslednjim pravilom +checkbox felamimail sl Potrditveno polje +clear search felamimail sl Zbriši iskanje +click here to log back in. felamimail sl Kliknite tu za ponovno prijavo. +click here to return to %1 felamimail sl Kliknite tu za vrnitev v %1 +close all felamimail sl Zapri vse +close this page felamimail sl Zapri to stran +close window felamimail sl Zapri okno +color felamimail sl Barva +compose felamimail sl Novo sporočilo +compose as new felamimail sl Sestavi kot novo +compress folder felamimail sl Stisni mapo +condition felamimail sl Pogoj +configuration felamimail sl Nastavitev +connection dropped by imap server. felamimail sl Strežnik IMAP je prekinil povezavo. +contains felamimail sl Vsebuje +could not complete request. reason given: %s felamimail sl Ne morem dokončati zahteve. Podan vzrok: %s +could not import message: felamimail sl Sporočila ni bilo mogoče uvoziti: +could not open secure connection to the imap server. %s : %s. felamimail sl Ne morem vzpostaviti varne povezave s strežnikom IMAP. %s: %s +cram-md5 or digest-md5 requires the auth_sasl package to be installed. felamimail sl CRAM-MD5 ali DIGEST-MD5 zahteva nameščen paket Auth_SASL. +create felamimail sl Ustvari +create folder felamimail sl Ustvari mapo +create sent felamimail sl Ustvari mapo Poslano (Sent) +create subfolder felamimail sl Ustvari podmapo +create trash felamimail sl Ustvari mapo Koš (Trash) +created folder successfully! felamimail sl Mapa je bila uspešno ustvarjena. +dark blue felamimail sl Temno modra +dark cyan felamimail sl Temno sinja +dark gray felamimail sl Temno siva +dark green felamimail sl Temno zelena +dark magenta felamimail sl Temno vijolična +dark yellow felamimail sl Temno rumena +date(newest first) felamimail sl Datum (najprej novejši) +date(oldest first) felamimail sl Datum (najprej starejši) +days felamimail sl Dni +deactivate script felamimail sl Skript za deaktiviranje +default felamimail sl Privzeto +default signature felamimail sl Privzeti podpis +default sorting order felamimail sl Privzet način razvrščanja +delete all felamimail sl Briši vse +delete folder felamimail sl Briši mapo +delete script felamimail sl Izbriši skript +delete selected felamimail sl Briši označene +delete selected messages felamimail sl Briši označena sporočila +deleted felamimail sl Izbrisano +deleted folder successfully! felamimail sl Mapa je bila uspešno izbrisana! +deleting messages felamimail sl Brisanje sporočila +disable felamimail sl Onemogoči +discard felamimail sl Zavrzi +discard message felamimail sl Zavrzi sporočilo +display message in new window felamimail sl Prikaži sporočilo v novem oknu +display messages in multiple windows felamimail sl Prikaži sporočila v več oknih +display of html emails felamimail sl Prikazovanje HTML sporočil +display only when no plain text is available felamimail sl Prikaži le, ko ni na voljo navadnega besedila +display preferences felamimail sl Prikaži nastavitve +displaying html messages is disabled felamimail sl Prikazovanje sporočil HTML je onemogočeno +do it! felamimail sl Izvedi! +do not use sent felamimail sl Ne uporabljaj mape Poslano (Sent) +do not use trash felamimail sl Ne uporabljaj mape Koš (Trash) +do not validate certificate felamimail sl Ne preverjaj certifikata +do you really want to delete the '%1' folder? felamimail sl Ali res želite izbrisati mapo '%1'? +do you really want to delete the selected accountsettings and the assosiated identity. felamimail sl Res želite izbrisati izbrano nastavitev računa in identiteto? +do you really want to delete the selected signatures? felamimail sl Res želite izbrisati izbrane podpise? +do you really want to move the selected messages to folder: felamimail sl Res želite premakniti izbrana sporočila v mapo: +do you want to be asked for confirmation before moving selected messages to another folder? felamimail sl Želite biti vprašani za potrditev pred premikanjem izbranih sporočil v drugo mapo? +does not contain felamimail sl Ne vsebuje +does not exist on imap server. felamimail sl Ne obstaja na strežniku IMAP. +does not match felamimail sl Se ne ujema +does not match regexp felamimail sl Se ne ujema z regularnim izrazom +don't use draft folder felamimail sl Ne uporabljaj mape Osnutki +don't use sent felamimail sl Ne uporabljaj mape Poslano (Sent) +don't use template folder felamimail sl Ne uporabljaj mape s predlogami +don't use trash felamimail sl Ne uporabljaj mape Koš (Trash) +dont strip any tags felamimail sl Ne razčleni značk +down felamimail sl Navzdol +download felamimail sl Prenesi +download this as a file felamimail sl Prenesi kot datoteko +draft folder felamimail sl Mapa Osnutki +drafts felamimail sl Osnutki +e-mail felamimail sl E-Pošta +e-mail address felamimail sl E-Poštni naslov +e-mail folders felamimail sl E-Poštne mape +edit email forwarding address felamimail sl Uredi posredovalni naslov E-pošte +edit filter felamimail sl Uredi filter +edit rule felamimail sl Uredi pravilo +edit selected felamimail sl Uredi označeno +edit vacation settings felamimail sl Uredi nastavitve odsotnosti +editor type felamimail sl Vrsta urejevalnika +email address felamimail sl E-Poštni naslov +email forwarding address felamimail sl Posredovalni naslov E-pošte +email notification update failed felamimail sl Posodobitev obvestila elektronske pošte ni uspelo +email signature felamimail sl E-poštni podpis +emailaddress felamimail sl Poštni naslov +empty trash felamimail sl Izprazni smeti +enable felamimail sl Omogoči +encrypted connection felamimail sl Kodirana povezava +enter your default mail domain ( from: user@domain ) admin sl Vnesite svojo privzeto domeno za naslove: +enter your imap mail server hostname or ip address admin sl Vnesite ime ali naslov IP strežnika IMAP +enter your sieve server hostname or ip address admin sl Vnesite ime ali naslov IP strežnika SIEVE +enter your sieve server port admin sl Vnesite vrata strežnika SIEVE +enter your smtp server hostname or ip address admin sl Vnesite ime ali naslov IP strežnika SMTP +enter your smtp server port admin sl Vnesite vrata strežnika SMTP +error felamimail sl NAPAKA +error connecting to imap serv felamimail sl Napaka pri povezovanju s strežnikom IMAP +error connecting to imap server. %s : %s. felamimail sl Napaka pri povezavi s strežnikom IMAP. %s: %s. +error connecting to imap server: [%s] %s. felamimail sl Napaka pri povezovanja s strežnikom IMAP: [%s] %s. +error opening felamimail sl Napaka pri odpiranju +error: felamimail sl Napaka: +error: could not save message as draft felamimail sl Napaka: ne morem shraniti sporočila kot osnutek +every felamimail sl Vsak +every %1 days felamimail sl Vsakih %1 dni +expunge felamimail sl Počisti +extended felamimail sl Razširjeno +felamimail common sl E-pošta +file into felamimail sl Shrani v +files felamimail sl Datoteke +filter active felamimail sl Filter je aktiven +filter name felamimail sl Ime filtra +filter rules common sl Pravila filtra +first name felamimail sl Ime +flagged felamimail sl Označen +flags felamimail sl Zastavice +folder felamimail sl Mapa +folder acl felamimail sl ACL mape +folder name felamimail sl Ime mape +folder path felamimail sl Pot mape +folder preferences felamimail sl Lastnosti mape +folder settings felamimail sl Nastavitve mape +folder status felamimail sl Status mape +folderlist felamimail sl Seznam map +foldername felamimail sl Ime mape +folders felamimail sl Mape +folders created successfully! felamimail sl Mape so bile uspešno ustvarjene! +follow felamimail sl Sledi +for mail to be send - not functional yet felamimail sl Za pošiljanje sporočila - še ne deluje +for received mail felamimail sl Za prejeto pošto +forward felamimail sl Posreduj +forward as attachment felamimail sl Posreduj kot prilogo +forward inline felamimail sl Posreduj v sporočilu +forward messages to felamimail sl Posreduj sporočilo osebi +forward to felamimail sl Posreduj +forward to address felamimail sl Posreduj na naslov +forwarding felamimail sl Posredujem +found felamimail sl Najdenih +fri felamimail sl Pet +from felamimail sl Pošiljatelj +from(a->z) felamimail sl Pošiljatelj (A->Z) +from(z->a) felamimail sl Pošiljatelj (Z->A) +full name felamimail sl Polno ime +greater than felamimail sl Večje kakor +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail sl Oglejte si www.felamimail.org za več informacij o SquirrelMail.
    +header lines felamimail sl Glava sporočila +hide header felamimail sl Skrij glavo +hostname / address felamimail sl Ime gostitelja/naslov +how to forward messages felamimail sl Kako naj se posreduje sporočilo +html felamimail sl HTML +icons and text felamimail sl Ikone in besedilo +icons only felamimail sl Le ikone +identifying name felamimail sl Določujoče ime +identity felamimail sl Identiteta +if felamimail sl IF +if from contains felamimail sl Če od vsebuje +if mail header felamimail sl Če glava elektronskega sporočila +if message size felamimail sl Če velikost sporočila +if shown, which folders should appear on main screen felamimail sl Če so prikazana, katere mape naj bodo prikazane na prvi strani? +if subject contains felamimail sl Če zadeva vsebuje +if to contains felamimail sl Če za vsebuje +if using ssl or tls, you must have the php openssl extension loaded. felamimail sl Če želite uporabljati SSL ali TSL, morate naložiti razširitev PHP openssl. +illegal folder name. please select a different name. felamimail sl Nedovoljeno ime mape. Prosim, izberite drugo ime. +imap felamimail sl IMAP +imap server felamimail sl Strežnik IMAP +imap server address felamimail sl Naslov strežnika IMAP +imap server closed the connection. felamimail sl Strežnik IMAP je prekinil povezavo. +imap server closed the connection. server responded: %s felamimail sl Strežnik IMAP je prekinil povezavo. Odgovor strežnika: %s +imap server password felamimail sl Geslo strežnika IMAP +imap server type felamimail sl Tip strežnika IMAP +imap server username felamimail sl Uporabniško ime strežnika IMAP +imaps authentication felamimail sl Avtentikacija IMAPS +imaps encryption only felamimail sl Le IMAPS šifriranje +import felamimail sl Uvozi +import mail felamimail sl Uvozi pošto +in felamimail sl V +inbox felamimail sl Prejeto +incoming mail server(imap) felamimail sl Strežnik za prihajajočo pošto (IMAP) +index order felamimail sl Vrstni red kazala +info felamimail sl Podatki +invalid user name or password felamimail sl Napačno uporabniško ime ali geslo +javascript felamimail sl Javascript +jumping to end felamimail sl Skok na konec +jumping to start felamimail sl Skok na začetek +junk felamimail sl Smeti +keep a copy of the message in your inbox felamimail sl Obdrži kopijo sporočila v mapi Prejeto +keep local copy of email felamimail sl Obdrži lokalno kopijo E-pošte +kilobytes felamimail sl Kilobajtov +language felamimail sl Jezik +last name felamimail sl Priimek +left felamimail sl Levo +less felamimail sl Manj +less than felamimail sl Manj kot +light gray felamimail sl Svetlo siva +list all felamimail sl Izpiši vse +loading felamimail sl Nalaganje +location of buttons when composing felamimail sl Položaj gumbov pri pisanju novega sporočila +mail server login type admin sl Način prijave v poštni strežnik +mail settings felamimail sl Nastavitve mape +mainmessage felamimail sl Glavno sporočilo +manage email accounts and identities common sl Urejanje računov in identitet +manage emailaccounts common sl Upravljanje poštnih računov +manage emailfilter / vacation preferences sl Uredi EMailFilter/ odsotnost +manage folders common sl Upravljanje map +manage sieve common sl Upravljanje skript za Sieve +manage signatures felamimail sl Upravljanje podpisov +mark as deleted felamimail sl Označi kot izbrisano +mark messages as felamimail sl Označi izbrana sporočila kot +mark selected as flagged felamimail sl Označenim sporočilom dodaj zastavico +mark selected as read felamimail sl Označi izbrana sporočila kot prebrana +mark selected as unflagged felamimail sl Označenim sporočilom odvzemi zastavico +mark selected as unread felamimail sl Označi izbrana sporočila kot neprebrana +match felamimail sl Ujemanje +matches felamimail sl Se ujema z +matches regexp felamimail sl Se ujema z regularnim izrazom +max uploadsize felamimail sl Največja velikost prenosa +message highlighting felamimail sl Poudarjanje sporočil +message list felamimail sl Seznam sporočil +messages felamimail sl Sporočila +mon felamimail sl Pon +move felamimail sl Premakni +move messages felamimail sl Premakni sporočila +move selected to felamimail sl Premakni označeno v +move to trash felamimail sl Premakni v smeti +moving messages to felamimail sl Premikanje sporočila v +name felamimail sl Ime +never display html emails felamimail sl Nikoli ne prikaži sporočil HTML +new common sl Novo +new filter felamimail sl Nov filter +next felamimail sl Naslednji +next message felamimail sl Naslednje sporočilo +no active imap server found!! felamimail sl Ni aktivnega strežnika IMAP! +no address to/cc/bcc supplied, and no folder to save message to provided. felamimail sl Ni bil podan niti naslov Za/Kp/Skp niti mapa, kamor naj bi se sporočilo shranilo. +no encryption felamimail sl Brez šifriranja +no filter felamimail sl Brez filtra +no folders found felamimail sl Ne najdem map +no folders were found to subscribe to! felamimail sl Ni map za naročilo! +no folders were found to unsubscribe from! felamimail sl Ni map za odjavo! +no highlighting is defined felamimail sl Poudarjanje ni definirano +no message returned. felamimail sl Ni vrnjenega sporočila. +no messages found... felamimail sl Nobeno sporočilo ni najdeno +no messages selected, or lost selection. changing to folder felamimail sl Nobeno sporočilo ni izbrano ali pa je izbira izgubljena. Grem v mapo +no messages were selected. felamimail sl Nobeno sporočilo ni izbrano +no plain text part found felamimail sl Ni najdenega čistega besedila +no previous message felamimail sl Ni predhodnjega sporočila +no recipient address given! felamimail sl Ni nobenega nsalove prejemnika! +no signature felamimail sl Brez podpisa +no subject given! felamimail sl Ni zadeve! +no supported imap authentication method could be found. felamimail sl Ni podprte metode avtentikacije IMAP. +no valid emailprofile selected!! felamimail sl Ni veljavnega E-poštnega profila! +none felamimail sl Prazno +on felamimail sl Vključeno +on behalf of felamimail sl V imenu +one address is not valid felamimail sl En naslov ni veljaven +only inbox felamimail sl Le nabiralnik INBOX +only one window felamimail sl Le eno okno +only unseen felamimail sl Le nova +open all felamimail sl Odpri vse +options felamimail sl Možnosti +or felamimail sl ali +organisation felamimail sl Organizacija +organization felamimail sl Organizacija +organization name admin sl Ime organizacije +original message felamimail sl Izvirno sporočilo +outgoing mail server(smtp) felamimail sl Strežnik za odhajajočo pošto (IMAP) +participants felamimail sl Soudeleženci +personal information felamimail sl Osebni podatki +please select a address felamimail sl Izberite naslov +please select the number of days to wait between responses felamimail sl Izberite koliko dni naj počakam med odgovori +please supply the message to send with auto-responses felamimail sl Vpišite sporočilo, ki se bo poslalo pri samodejnem odgovoru +port felamimail sl Vrata +posting felamimail sl Objavljanje +previous felamimail sl Predhodnje +previous message felamimail sl Predhodnje sporočilo +print it felamimail sl Natisni +print this page felamimail sl Natisni to stran +printview felamimail sl Predogled tiskanja +quicksearch felamimail sl Hitro iskanje +read felamimail sl Prebrano +reading felamimail sl Branje +receive notification felamimail sl Sprejmi potrdilo +recent felamimail sl Nedavno +refresh time in minutes felamimail sl Osvežitveni čas v minutah +reject with felamimail sl Zavrni z +remove felamimail sl Odstrani +remove immediately felamimail sl Takoj odstrani +rename felamimail sl Preimenuj +rename a folder felamimail sl Preimenuj mapo +rename folder felamimail sl Preimenuj mapo +renamed successfully! felamimail sl Preimenovanje je bilo uspešno! +replied felamimail sl Odgovorjeno +reply felamimail sl Odgovori +reply all felamimail sl Odgovori vsem +reply to felamimail sl Odgovori na naslov +replyto felamimail sl Odgovori na +respond felamimail sl Odgovori +respond to mail sent to felamimail sl Odgovori na sporočilo poslano na +return felamimail sl Vrnitev +return to options page felamimail sl Vrnitev na stran opcij +right felamimail sl Desno +row order style felamimail sl Slog zaporednih vrstic +rule felamimail sl Pravilo +sat felamimail sl Sob +save felamimail sl Shrani +save as draft felamimail sl Shrani kot osnutek +save as infolog felamimail sl Shrani kot Infolog +save changes felamimail sl Shrani spremembe +save message to disk felamimail sl Shrani sporočilo na disk +script name felamimail sl Ime skripte +script status felamimail sl Status skripte +search felamimail sl Iskanje +search for felamimail sl Išči +select felamimail sl Označi +select all felamimail sl Označi vse +select emailprofile felamimail sl Izberite E-poštni profil +select folder felamimail sl Izberi mapo +select your mail server type admin sl Izberite tip poštnega strežnika +send felamimail sl Pošlji +send a reject message felamimail sl Pošlji zavrnjeno sporočilo +sent felamimail sl Poslano +sent folder felamimail sl Mapa s poslanimi +server supports mailfilter(sieve) felamimail sl Strežnik podpira mailfilter (sieve) +set as default felamimail sl Nastavi kot privzeto +show header felamimail sl Prikaži glavo +show new messages on main screen felamimail sl Prikaži nova sporočila na začetnem zaslonu +sieve script name felamimail sl Ime skripte sieve +sieve settings admin sl Nastavitve Sieve +signatur felamimail sl Podpis +signature felamimail sl Podpis +simply click the target-folder felamimail sl Kliknite ciljno mapo +size felamimail sl Velikost +size of editor window felamimail sl Velikost okna za urejanje +size(...->0) felamimail sl Velikost (... -> 0) +size(0->...) felamimail sl Velikost (0 -> ...) +skipping forward felamimail sl Skok naprej +skipping previous felamimail sl Skok nazaj +small view felamimail sl Skrčen pogled +smtp settings admin sl Nastavitve SMTP +start new messages with mime type plain/text or html? felamimail sl Začnem novo sporočilo kot navadno besedilo ali kot HTML? +subject felamimail sl Zadeva +subject(a->z) felamimail sl Zadeva (A->Z) +subject(z->a) felamimail sl Zadeva (Z->A) +submit felamimail sl Pošlji +subscribe felamimail sl Naroči +subscribed felamimail sl Naročeno +subscribed successfully! felamimail sl Uspešno naročeno! +sun felamimail sl Ned +system signature felamimail sl Sistemski podpis +table of contents felamimail sl Kazalo +template folder felamimail sl Mapa s predlogami +templates felamimail sl Predloge +text only felamimail sl Le besedilo +text/plain felamimail sl Navadno besedilo +the connection to the imap server failed!! felamimail sl Povezava na strežnik IMAP ni uspela. +the imap server does not appear to support the authentication method selected. please contact your system administrator. felamimail sl Strežnik IMAP verjetno ne podpira izbrane metode avtentikacije. Kontaktirajte sistemskega administratorja. +the message sender has requested a response to indicate that you have read this message. would you like to send a receipt? felamimail sl Pošiljatelj sporočila je zahteval potrdilo, da ste sporočilo prebrali. Želite poslati obvestilo o tem? +the mimeparser can not parse this message. felamimail sl Mimeparser ne more prebrati tega sporočila. +then felamimail sl THEN +this folder is empty felamimail sl TA MAPA JE PRAZNA +this php has no imap support compiled in!! felamimail sl Ta PHP ne vsebuje podpore za IMAP! +thu felamimail sl Čet +to felamimail sl Prejemnik +to mail sent to felamimail sl Sporočilo poslano na +to use a tls connection, you must be running a version of php 5.1.0 or higher. felamimail sl Če želite uporabljati povezavo TLS, morate imeti različico PHP 5.1.0 ali več. +translation preferences felamimail sl Nastavitve prevodov +translation server felamimail sl Strežnik s prevodi +trash felamimail sl Koš +trash fold felamimail sl Koš +trash folder felamimail sl Mapa Koš +tue felamimail sl Tor +type felamimail sl Vrsta +unexpected response from server to authenticate command. felamimail sl Nepričakovan odgovor strežnika na ukaz AUTHENTICATE. +unexpected response from server to digest-md5 response. felamimail sl Nepričakovan odgovor strežnika na odgovor Digest-MD5. +unexpected response from server to login command. felamimail sl Nepričakovan odgovor strežnika na ukaz LOGIN. +unflagged felamimail sl Brez zastavice +unknown err felamimail sl Neznana napaka +unknown error felamimail sl Neznana napaka +unknown imap response from the server. server responded: %s felamimail sl Neznan odgovor IMAP strežnika. Strežnik je odgovoril: %s +unknown sender felamimail sl Neznan pošiljatelj +unknown user or password incorrect. felamimail sl Neznan uporabnik ali napačno geslo. +unread common sl Neprebrano +unseen felamimail sl Novo +unselect all felamimail sl Odznači vse +unsubscribe felamimail sl Odjavi +unsubscribed felamimail sl Odjavljen +unsubscribed successfully! felamimail sl Uspešno odjavljen! +up felamimail sl Gor +updating message status felamimail sl Posodabljanje stanja sporočil +updating view felamimail sl Posodabljanje pogleda +use emailadmin to create profiles felamimail sl uporabi EmailAdmin za izdelavo profilov +use a signature felamimail sl Uporabi podpis +use a signature? felamimail sl Uporabim podpis? +use addresses felamimail sl Uporabi naslove +use custom identities felamimail sl Uporabi identiteto po meri +use custom settings felamimail sl Uporabi lastne nastavitve +use regular expressions felamimail sl uporabite regularne izraze +use smtp auth admin sl Uporabi SMTP avtentikacijo +users can define their own emailaccounts admin sl Uporabniki lahko definirajo lastne E-poštne račune +vacation notice common sl Obvestilo o odsotnosti +vacation notice is active felamimail sl Obvestilo o odsotnosti je aktivno +vacation start-date must be before the end-date! felamimail sl Začetni datum počitnic mora biti pred končnim +validate certificate felamimail sl Preveri certifikat +view full header felamimail sl Pokaži celotno glavo +view header lines felamimail sl Pokaži glavo +view message felamimail sl Pokaži sporočilo +viewing full header felamimail sl Prikaz celotne glave +viewing message felamimail sl Prikaz sporočila +viewing messages felamimail sl Prikaz sporočil +wed felamimail sl Sre +when deleting messages felamimail sl Ob brisanju sporočil +with message felamimail sl S sporočilom +with message "%1" felamimail sl S sporočilom "%1" +wrap incoming text at felamimail sl Besedilo prelomi pri +writing felamimail sl Pisanje +wrote felamimail sl Je napisal +you can use %1 for the above start-date and %2 for the end-date. felamimail sl Za začetni datum lahko uporabite %1 in za končni datum %2 +you have received a new message on the felamimail sl Prejeli ste novo sporočilo na +your message to %1 was displayed. felamimail sl Vaše sporočilo za %1 je bilo prikazano. diff --git a/felamimail/lang/egw_sv.lang b/felamimail/lang/egw_sv.lang new file mode 100644 index 0000000000..12faa932c6 --- /dev/null +++ b/felamimail/lang/egw_sv.lang @@ -0,0 +1,417 @@ +(no subject) felamimail sv (ingen rubrik) +(only cc/bcc) felamimail sv (endast Cc/Bcc) +(unknown sender) felamimail sv (okänd avsändare) +activate felamimail sv Aktivera +activate script felamimail sv Aktivera skript +add acl felamimail sv Lägg till ACL +add address felamimail sv Lägg till adress +add rule felamimail sv Lägg till regel +add script felamimail sv Lägg till skript +add to %1 felamimail sv Lägg till %1 +add to address book felamimail sv Lägg till i Adressbok +add to addressbook felamimail sv Lägg till i Adressbok +adding file to message. please wait! felamimail sv Bifogar fil i meddelandet. Var god och vänta! +additional info felamimail sv Övrig information +address book felamimail sv Adressbok +address book search felamimail sv Sök i Adressbok +after message body felamimail sv Efter meddelandets innehåll +all address books felamimail sv Alla adressböcker +all folders felamimail sv Alla kataloger +all of felamimail sv Alla +allways a new window felamimail sv Alltid nytt fönster +always show html emails felamimail sv Visa alltid HTML e-post +and felamimail sv Och +any of felamimail sv Någon av +any status felamimail sv Alla status +anyone felamimail sv Alla +as a subfolder of felamimail sv Som underkatalog till +attachments felamimail sv Bilagor +authentication required felamimail sv Autentisering krävs +auto refresh folder list felamimail sv Auto uppdatera katalog lista +back to folder felamimail sv Tillbaks till katalog +bad login name or password. felamimail sv Ogiltigt användarna eller lösenord +bad or malformed request. server responded: %s felamimail sv Ogiltig eller ofullständig förfrågan. Server svarade: %s +bad request: %s felamimail sv Ogiltig förfrågan: %s +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail sv Baserat på given kriteria kan inkommande meddelanden ha olika bakgrundsfärg i meddelande listan. Detta är hjälper till att skilja på meddelande typ/avsändare. +bcc felamimail sv Bcc +before headers felamimail sv Före brevhuvud +between headers and message body felamimail sv Mellan brevhuvud och meddelandets innehåll +body part felamimail sv Meddelandeinnehåll +can't connect to inbox!! felamimail sv Kan inte ansluta till Inkorg +cc felamimail sv Cc +change folder felamimail sv Byt katalog +check message against next rule also felamimail sv Verifiera meddelande även mot nästa regel +checkbox felamimail sv Kryssruta +clear search felamimail sv Rensa sökning +click here to log back in. felamimail sv Till inloggningen +click here to return to %1 felamimail sv Återgå till %1 +close all felamimail sv Stäng alla +close this page felamimail sv Stäng sidan +close window felamimail sv Stäng fönster +color felamimail sv Färg +compose felamimail sv Skriv +compress folder felamimail sv Komprimera katalog +condition felamimail sv vilkor +configuration felamimail sv Alternativ +connection dropped by imap server. felamimail sv Anslutningen stängd av IMAP server +contains felamimail sv Innehåller +could not complete request. reason given: %s felamimail sv Kunde inte fullfölja förfrågan. Svaret: %s +could not open secure connection to the imap server. %s : %s. felamimail sv Kunde inte öppna en söker anslutning till IMAP servern. %s: %s +cram-md5 or digest-md5 requires the auth_sasl package to be installed. felamimail sv CRAM-MD5 och DIGEST-MD5 kräver att Auth_SASL paketet installerats +create felamimail sv Skapa +create folder felamimail sv Skapa Katalog +create sent felamimail sv Skapa Skickat +create subfolder felamimail sv Skapa Underkatalog +create trash felamimail sv Skapa Borttaget +created folder successfully! felamimail sv Skapade katalog +dark blue felamimail sv Mörk Blå +dark cyan felamimail sv Mörk Cyan +dark gray felamimail sv Mörk Grå +dark green felamimail sv Mörk Grön +dark magenta felamimail sv Mörk Magenta +dark yellow felamimail sv Mörk Gul +date(newest first) felamimail sv Datum (nyaste först) +date(oldest first) felamimail sv Datum (äldsta först) +days felamimail sv Dagar +deactivate script felamimail sv Inaktivera skript +default signature felamimail sv Standard signatur +default sorting order felamimail sv Standard sorterings ordning +delete all felamimail sv Radera alla +delete folder felamimail sv Radera katalog +delete script felamimail sv Radera skript +delete selected felamimail sv Radera valda +delete selected messages felamimail sv Radera valad meddelanden +deleted felamimail sv Raderade +deleted folder successfully! felamimail sv Katalog raderad +deleting messages felamimail sv Raderar meddelanden +disable felamimail sv Inaktivera +discard felamimail sv Ignorera +discard message felamimail sv Ignorera meddelande +display message in new window felamimail sv Visa meddelanden i nytt fönster +display messages in multiple windows felamimail sv Visa meddelanden i flera fönster +display of html emails felamimail sv Visning av HTML e-post +display only when no plain text is available felamimail sv Visa endast när textformat inte är tillgängligt +display preferences felamimail sv Visa alternativ +displaying html messages is disabled felamimail sv Cisa HTML meddelanden är inaktiverat +do it! felamimail sv Gör Det! +do not use sent felamimail sv Använd inte Skickat +do not use trash felamimail sv Använd inte Borttaget +do not validate certificate felamimail sv Validera inte certifikat +do you really want to delete the '%1' folder? felamimail sv Vill du verkligen radera katalogen '%1'? +do you really want to delete the selected signatures? felamimail sv Vill du verkligen radera vald signatur? +does not contain felamimail sv Innehåller inte +does not match felamimail sv Matchar inte +does not match regexp felamimail sv Matchar inte regexp +don't use draft folder felamimail sv Använd inte Utkast +don't use sent felamimail sv Använd inte Skickat +don't use trash felamimail sv Använd inte Borttaget +down felamimail sv Ner +download felamimail sv Ladda ner +download this as a file felamimail sv Ladda ner som fil +draft folder felamimail sv Utkast katalog +e-mail felamimail sv E-post +e-mail address felamimail sv E-post adress +e-mail folders felamimail sv E-post katalog +edit email forwarding address felamimail sv Ändra e-post vidarebefodrings adressen +edit filter felamimail sv Ändra filter +edit rule felamimail sv Ändra regler +edit selected felamimail sv Ändra valda +edit vacation settings felamimail sv Ändra frånvaro alternativ +email address felamimail sv E-post adress +email forwarding address felamimail sv E-post vidarebefodrings adress +email signature felamimail sv E-post signatur +emailaddress felamimail sv E-post adress +empty trash felamimail sv Töm Borttaget +enable felamimail sv Aktivera +encrypted connection felamimail sv Krypterad anslutning +enter your default mail domain ( from: user@domain ) admin sv Standard e-post domän (From: user@domain) +enter your imap mail server hostname or ip address admin sv IMAP e-post server värdnamn eller IP adress +enter your sieve server hostname or ip address admin sv SIEVE server värdnamn eller IP adress +enter your sieve server port admin sv SIEVE server port +enter your smtp server hostname or ip address admin sv SMTP server värdnamn eller IP adress +enter your smtp server port admin sv SMTP server port +error felamimail sv FEL +error connecting to imap serv felamimail sv Fel: Kunde inte ansluta till IMAP server +error connecting to imap server. %s : %s. felamimail sv Kunde inte ansluta till IMAP server %s : %s +error connecting to imap server: [%s] %s. felamimail sv Kunde inte ansluta till IMAP server [%s] %s +error opening felamimail sv Fel: Kunde inte öppna +every felamimail sv Varje +every %1 days felamimail sv Var %1 dag +expunge felamimail sv Utplåna +extended felamimail sv Utökad +felamimail common sv FelaMiMail +file into felamimail sv Flytta till +files felamimail sv Filer +filter active felamimail sv Aktiva filter +filter name felamimail sv Filter namn +filter rules felamimail sv Filter regler +first name felamimail sv Förnamn +flagged felamimail sv Flaggad +flags felamimail sv Flaggor +folder acl felamimail sv Katalog ACL +folder name felamimail sv Katalognamn +folder path felamimail sv Katalogsökväg +folder preferences felamimail sv Katalog alternativ +folder settings felamimail sv Katalog alternativ +folder status felamimail sv Katalog status +folderlist felamimail sv Kataloglista +foldername felamimail sv Katalognamn +folders felamimail sv Kataloger +folders created successfully! felamimail sv Katalogen skapad +follow felamimail sv Följ +for mail to be send - not functional yet felamimail sv För meddelande att skicka - inte ännu funktionell +for received mail felamimail sv För mottagna meddelanden +forward felamimail sv Vidarebefodra +forward to felamimail sv Vidarebefodra till +forward to address felamimail sv Vidarebefodra till adress +forwarding felamimail sv Vidarebefodrar +found felamimail sv Hittade +fri felamimail sv Fre +from felamimail sv Från +from(a->z) felamimail sv Från (A->Ö) +from(z->a) felamimail sv Från (Ö->A) +full name felamimail sv Fullständigt namn +greater than felamimail sv Större än +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail sv Se vidare på adressen www.felamimail.org för att läsa mer om Squirrelmail.
    +header lines felamimail sv Brevhuvud +hide header felamimail sv Göm brevhuvud +hostname / address felamimail sv värdnamn / adress +html felamimail sv HTML +icons and text felamimail sv Ikoner och text +icons only felamimail sv Ikoner endast +identifying name felamimail sv ID namn +identity felamimail sv Identitet +if felamimail sv OM +if from contains felamimail sv om Från innehåller +if mail header felamimail sv om brevhuvud +if message size felamimail sv om meddelande storlek +if subject contains felamimail sv om Ämne innehåller +if to contains felamimail sv om Till innehåller +if using ssl or tls, you must have the php openssl extension loaded. felamimail sv Om du vill använda SSL eller TLS måste PHP openssl stödet laddas +illegal folder name. please select a different name. felamimail sv Ogiltigt katalognamn, var god och välj annat. +imap felamimail sv IMAP +imap server felamimail sv IMAP Server +imap server address felamimail sv IMAP Server Adress +imap server closed the connection. felamimail sv IMAP server stängde anslutningen +imap server closed the connection. server responded: %s felamimail sv IMAP server stängde anslutningen. Serverna svarade: %s +imap server password felamimail sv IMAP Server lösenord +imap server type felamimail sv IMAP Server typ +imap server username felamimail sv IMAP Server användarnamn +imaps authentication felamimail sv IMAPS Autentisering +imaps encryption only felamimail sv IMAPS Kryptering endast +in felamimail sv den +inbox felamimail sv Inkorg +incoming mail server(imap) felamimail sv Inkommande e-post server (IMAP) +index order felamimail sv Index Ordning +info felamimail sv Info +invalid user name or password felamimail sv Oglitigt användarnamn eller lösenord +javascript felamimail sv JavaScript +jumping to end felamimail sv Hoppa till slutet +jumping to start felamimail sv Hoppa till början +keep a copy of the message in your inbox felamimail sv Spara en kopia av brev i din Inkorg +keep local copy of email felamimail sv Spara en lokal kopia av brev +kilobytes felamimail sv Kb +language felamimail sv Språk +last name felamimail sv Efternamn +left felamimail sv Vänster +less felamimail sv Färre +less than felamimail sv Mindre än +light gray felamimail sv Ljus Grå +list all felamimail sv Lista alla +loading felamimail sv Laddar +location of buttons when composing felamimail sv Knapp placering medans man skriver meddelande +mail server login type admin sv E-post server inloggnings typ +mail settings felamimail sv E-post alternativ +mainmessage felamimail sv huvudmeddelande +manage emailaccounts felamimail sv Hantera e-postkonton +manage emailfilter / vacation preferences sv Hantera E-postfilter / Frånvaro +manage folders common sv Katalog hantering +manage sieve common sv Hantera Sieve skript +manage signatures felamimail sv Hantera signaturer +mark as deleted felamimail sv Markera som raderad +mark messages as felamimail sv Markera valda meddelanden som +mark selected as flagged felamimail sv Flagga för uppföljning +mark selected as read felamimail sv Markera som läst +mark selected as unflagged felamimail sv Ta bort flagga +mark selected as unread felamimail sv Markera som oläst +match felamimail sv Matcha +matches felamimail sv Matchar +matches regexp felamimail sv Matchar regexp +max uploadsize felamimail sv Max uppladdnings storlek +message highlighting felamimail sv Meddelande fokusering +message list felamimail sv Meddelande lista +messages felamimail sv Meddelanden +mon felamimail sv Mån +move felamimail sv Flytta +move messages felamimail sv Flytta meddelanden +move selected to felamimail sv Flytta valda till +move to trash felamimail sv Flytta till Borttaget +moving messages to felamimail sv Flyttar meddelanden till +name felamimail sv Namn +never display html emails felamimail sv Visa inte HTML meddelanden +new common sv Nya +new filter felamimail sv Nytt filter +next felamimail sv Nästa +next message felamimail sv Nästa meddelande +no active imap server found!! felamimail sv Hittade ingen IMAP server! +no encryption felamimail sv Ingen kryptering +no filter felamimail sv Inga filter +no folders found felamimail sv Ingen katalog funnen +no folders were found to subscribe to! felamimail sv Inga kataloger hittades att prenumerera +no folders were found to unsubscribe from! felamimail sv Inga kataloger hittades att avprenumerera +no highlighting is defined felamimail sv Ingen fokusering definierad +no message returned. felamimail sv Inget svar meddelandes +no messages found... felamimail sv Inga meddelanden ... +no messages were selected. felamimail sv Inga meddelanden valda +no plain text part found felamimail sv Hittade inget textfält +no previous message felamimail sv Inga tidigare meddelanden +no supported imap authentication method could be found. felamimail sv Kunde inte hitta supporterad IMAP autentiserings metod +no valid emailprofile selected!! felamimail sv Ingen giltig e-post profil vald +none felamimail sv Inga +on behalf of felamimail sv Företräder +one address is not valid felamimail sv En adress är ogiltig +only inbox felamimail sv Endast Inkorg +only one window felamimail sv Endast ett fönster +only unseen felamimail sv Endast olästa +open all felamimail sv Öpnna alla +options felamimail sv Alternativ +or felamimail sv eller +organisation felamimail sv Organisation +organization felamimail sv Organisation +organization name admin sv Organisations namn +outgoing mail server(smtp) felamimail sv Utgående e-post server (SMTP) +participants felamimail sv Deltagare +personal information felamimail sv Personlig information +please select a address felamimail sv Välj adress +please select the number of days to wait between responses felamimail sv Antal dagar mellan svar +please supply the message to send with auto-responses felamimail sv Meddelande att skicka med autosvar +port felamimail sv Port +posting felamimail sv Postat +previous felamimail sv Tidigare +previous message felamimail sv Tidigare meddelande +print it felamimail sv Skriv ut +print this page felamimail sv Skriv ut sida +quicksearch felamimail sv Snabbsök +read felamimail sv Läst +reading felamimail sv Läser +receive notification felamimail sv Mottag notifieringar +recent felamimail sv Tidigare +refresh time in minutes felamimail sv Uppdaterings intervall i minuter +reject with felamimail sv Avvisa med +remove felamimail sv Radera +remove immediately felamimail sv Radera omedelbart +rename felamimail sv Byt namn +rename a folder felamimail sv Byt namn på katalog +rename folder felamimail sv Byt namn på katalog +renamed successfully! felamimail sv Namnet bytt +replied felamimail sv Svarade +reply felamimail sv Svara +reply all felamimail sv Svara alla +reply to felamimail sv Svara till +replyto felamimail sv Svara till +respond felamimail sv Svara +respond to mail sent to felamimail sv Svars meddelande skickat till +return felamimail sv Återvänd +return to options page felamimail sv Återvänd till alternativ +right felamimail sv Höger +row order style felamimail sv Rad sortering +rule felamimail sv Regel +sat felamimail sv Lör +save felamimail sv Spara +save as draft felamimail sv Spara som utkast +save as infolog felamimail sv Spara som InfoLogg +save changes felamimail sv Spara ändringar +save message to disk felamimail sv Spara meddelanden till disk +script name felamimail sv Skript namn +script status felamimail sv Skript status +search felamimail sv Sök +search for felamimail sv Sök efter +select felamimail sv Välj +select all felamimail sv Välj alla +select emailprofile felamimail sv Välj e-post profil +select folder felamimail sv Välj katalog +select your mail server type admin sv Välj e-post server typ +send felamimail sv Skicka +send a reject message felamimail sv Skicka ett nekande meddelande +sent folder felamimail sv Skickat katalog +show header felamimail sv Visa brevhuvud +show new messages on main screen felamimail sv Visa nya meddelanden på Startsidan +sieve script name felamimail sv Sieve skript namn +sieve settings admin sv Sieve alternativ +signature felamimail sv Signatur +simply click the target-folder felamimail sv Välj målkatalog +size felamimail sv Storlek +size of editor window felamimail sv Editor fönster storlek +size(...->0) felamimail sv Storlek (...->0) +size(0->...) felamimail sv Storlek (0->...) +skipping forward felamimail sv Hoppar framåt +skipping previous felamimail sv Hoppar bakåt +small view felamimail sv Liten vy +smtp settings admin sv SMTP alternativ +subject felamimail sv Ämne +subject(a->z) felamimail sv Ämne (A->Ö) +subject(z->a) felamimail sv Ämne (Ö->A) +submit felamimail sv Skicka +subscribe felamimail sv Prenumerera +subscribed felamimail sv Prenumererad +subscribed successfully! felamimail sv Prenumeration lyckad +sun felamimail sv Sön +table of contents felamimail sv Innehåll +text only felamimail sv Text endast +the connection to the imap server failed!! felamimail sv Anslutningen till IMAP servern misslyckades +the imap server does not appear to support the authentication method selected. please contact your system administrator. felamimail sv IMAP servern verkar inte stödja den autentiserings metod du valt. Var god och kontakta administratör. +the mimeparser can not parse this message. felamimail sv MIME-tolken kunde inte tolka meddelandet +then felamimail sv SEN +this folder is empty felamimail sv Katalogen är tom +this php has no imap support compiled in!! felamimail sv Denna installation har inte IMAP stöd kompilerat i PHP. +thu felamimail sv Tor +to felamimail sv Till +to mail sent to felamimail sv Till meddelande skickat till +to use a tls connection, you must be running a version of php 5.1.0 or higher. felamimail sv För att använda TLS anslutning måste du ha PHP version 5.1.0 eller högre +translation preferences felamimail sv Översättnings alternativ +translation server felamimail sv Översättnings server +trash fold felamimail sv Borttaget +trash folder felamimail sv Borttaget +tue felamimail sv Tis +type felamimail sv Typ +unexpected response from server to authenticate command. felamimail sv Oväntat svar från servern på AUTENTISERINGS kommandot +unexpected response from server to digest-md5 response. felamimail sv Oväntat svar från servern på Digest-MD5 +unexpected response from server to login command. felamimail sv Oväntat svar från servern på INLOGGINGS kommandot +unflagged felamimail sv Oflaggad +unknown err felamimail sv Okänt fel +unknown error felamimail sv Okänt fel +unknown imap response from the server. server responded: %s felamimail sv Okänt IMAP svar från server. Svarade: %s +unknown sender felamimail sv Okänd avsändare +unknown user or password incorrect. felamimail sv Ogiltig användare eller fel lösenord +unread common sv Oläst +unseen felamimail sv Oläst +unselect all felamimail sv Avmarkera alla +unsubscribe felamimail sv Avprenumerera +unsubscribed felamimail sv Avprenumererad +unsubscribed successfully! felamimail sv Avprenumererad +up felamimail sv Upp +updating message status felamimail sv Uppdaterar meddelande status +updating view felamimail sv Uppdaterar vy +use emailadmin to create profiles felamimail sv Använd E-post Admin för att skapa profiler +use a signature felamimail sv Använd signatur +use a signature? felamimail sv Använd signatur? +use addresses felamimail sv Använd adresser +use custom settings felamimail sv Använd anpassade inställningar +use regular expressions felamimail sv Använd regexp +use smtp auth admin sv Använd SMTP autentisering +users can define their own emailaccounts admin sv Användare kan definiera egna epost konton +vacation notice felamimail sv Frånvaro meddelande +validate certificate felamimail sv Validera certifikat +view full header felamimail sv Visa hela brevhuvudet +view header lines felamimail sv Visa brevhuvudet +view message felamimail sv Visa meddelandet +viewing full header felamimail sv Visar hela brevhuvudet +viewing message felamimail sv Visar meddelandet +viewing messages felamimail sv Visar meddelanden +wed felamimail sv Ons +when deleting messages felamimail sv Vid meddelande radering +with message felamimail sv Med meddelande +with message "%1" felamimail sv Med meddelande "%1" +wrap incoming text at felamimail sv Avrunda inkommande text vid +writing felamimail sv Skriver +wrote felamimail sv Skrev diff --git a/felamimail/lang/egw_zh-tw.lang b/felamimail/lang/egw_zh-tw.lang new file mode 100644 index 0000000000..71896cc5da --- /dev/null +++ b/felamimail/lang/egw_zh-tw.lang @@ -0,0 +1,421 @@ +(no subject) felamimail zh-tw (沒有標題) +(only cc/bcc) felamimail zh-tw (只要副本/密件副本) +(unknown sender) felamimail zh-tw (不知名的寄件者) +activate felamimail zh-tw 啟用 +activate script felamimail zh-tw 啟用程式 +add acl felamimail zh-tw 新增存取控制 +add address felamimail zh-tw 新增位址 +add rule felamimail zh-tw 新增規則 +add script felamimail zh-tw 新增程式 +add to %1 felamimail zh-tw 新增到 %1 +add to address book felamimail zh-tw 加入通訊錄 +add to addressbook felamimail zh-tw 加入通訊錄 +adding file to message. please wait! felamimail zh-tw 新增檔案到訊息中,請等待! +additional info felamimail zh-tw 其他資訊 +address book felamimail zh-tw 通訊錄 +address book search felamimail zh-tw 搜尋通訊錄 +after message body felamimail zh-tw 在訊息內容之後 +all address books felamimail zh-tw 所有通訊錄 +all folders felamimail zh-tw 所有資料夾 +all of felamimail zh-tw 所有的 +allow images from external sources in html emails felamimail zh-tw 在 HTML 郵件中允許來自外部的圖片 +allways a new window felamimail zh-tw 都開啟一個新視窗 +always show html emails felamimail zh-tw 都用HTML顯示郵件 +and felamimail zh-tw 且 +any of felamimail zh-tw 任意的 +any status felamimail zh-tw 任意狀態 +anyone felamimail zh-tw 任何人 +as a subfolder of felamimail zh-tw 子資料夾在 +attachments felamimail zh-tw 附加檔案 +authentication required felamimail zh-tw 需要登入 +auto refresh folder list felamimail zh-tw 自動更新資料夾清單 +back to folder felamimail zh-tw 回到資料夾 +bad login name or password. felamimail zh-tw 帳號或密碼有誤 +bad or malformed request. server responded: %s felamimail zh-tw 錯誤的請求,伺服器回應: %s +bad request: %s felamimail zh-tw 錯誤的請求: %s +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail zh-tw 基於給予的規則,收進來的信件在清單中可以使用不同的背景顏色。這樣子可以輕易的辨識郵件的來源,特別是電子報。 +bcc felamimail zh-tw 密件副本 +before headers felamimail zh-tw 頁首之前 +between headers and message body felamimail zh-tw 頁首與訊息內容之間 +body part felamimail zh-tw 內容部份 +can't connect to inbox!! felamimail zh-tw 無法連結收件夾! +cc felamimail zh-tw 副本 +change folder felamimail zh-tw 改變資料夾 +check message against next rule also felamimail zh-tw 也用下一個規則檢查郵件 +checkbox felamimail zh-tw 核選方塊 +clear search felamimail zh-tw 清除搜尋 +click here to log back in. felamimail zh-tw 點這裡登入 +click here to return to %1 felamimail zh-tw 點這裡回到%1 +close all felamimail zh-tw 全部關閉 +close this page felamimail zh-tw 關閉這一頁 +close window felamimail zh-tw 關閉視窗 +color felamimail zh-tw 顏色 +compose felamimail zh-tw 建立 +compress folder felamimail zh-tw 壓縮資料夾 +condition felamimail zh-tw 條件 +configuration felamimail zh-tw 設定 +connection dropped by imap server. felamimail zh-tw 連線被 IMAP 伺服器中斷了 +contains felamimail zh-tw 包含 +could not complete request. reason given: %s felamimail zh-tw 無法完成請求,理由: %s +could not open secure connection to the imap server. %s : %s. felamimail zh-tw 無法開啟安全連線到 IMAP 伺服器。 %s: %s +cram-md5 or digest-md5 requires the auth_sasl package to be installed. felamimail zh-tw CRAM-MD5 或 DIGEST-MD5 需要安裝 Auth_SASL 程式。 +create felamimail zh-tw 建立 +create folder felamimail zh-tw 建立資料夾 +create sent felamimail zh-tw 建立寄件備份 +create subfolder felamimail zh-tw 建立子資料夾 +create trash felamimail zh-tw 建立垃圾桶 +created folder successfully! felamimail zh-tw 建立資料夾完成! +dark blue felamimail zh-tw 深藍 +dark cyan felamimail zh-tw 深青綠 +dark gray felamimail zh-tw 深灰 +dark green felamimail zh-tw 深綠 +dark magenta felamimail zh-tw 深紅 +dark yellow felamimail zh-tw 深黃 +date(newest first) felamimail zh-tw 日期(新的在前) +date(oldest first) felamimail zh-tw 日期(舊的在前) +days felamimail zh-tw 日 +deactivate script felamimail zh-tw 停用程式 +default signature felamimail zh-tw 預設簽名 +default sorting order felamimail zh-tw 預設排序 +delete all felamimail zh-tw 刪除全部 +delete folder felamimail zh-tw 刪除資料夾 +delete script felamimail zh-tw 刪除指令 +delete selected felamimail zh-tw 刪除所選擇的 +delete selected messages felamimail zh-tw 刪除所選擇的訊息 +deleted felamimail zh-tw 刪除日期 +deleted folder successfully! felamimail zh-tw 刪除資料夾完成! +deleting messages felamimail zh-tw 刪除信件中 +disable felamimail zh-tw 停用 +discard felamimail zh-tw 取消 +discard message felamimail zh-tw 取消郵件 +display message in new window felamimail zh-tw 在新視窗顯示訊息 +display messages in multiple windows felamimail zh-tw 開啟多個視窗顯示訊息 +display of html emails felamimail zh-tw 顯示HTML郵件 +display only when no plain text is available felamimail zh-tw 只有在不包含存文字時顯示 +display preferences felamimail zh-tw 顯示設定 +displaying html messages is disabled felamimail zh-tw 顯示 html 信件的功能停用中 +do it! felamimail zh-tw 執行! +do not use sent felamimail zh-tw 不使用寄件備份 +do not use trash felamimail zh-tw 不使用垃圾桶 +do not validate certificate felamimail zh-tw 不驗證執照 +do you really want to delete the '%1' folder? felamimail zh-tw 您確定要刪除資料夾 '%1' ? +do you really want to delete the selected signatures? felamimail zh-tw 您確定要刪除選擇的簽名? +does not contain felamimail zh-tw 不包含 +does not match felamimail zh-tw 不符合 +does not match regexp felamimail zh-tw 不符合條件 +don't use draft folder felamimail zh-tw 不使用草稿夾 +don't use sent felamimail zh-tw 不使用寄件備份 +don't use trash felamimail zh-tw 不使用垃圾桶 +down felamimail zh-tw 下 +download felamimail zh-tw 下載 +download this as a file felamimail zh-tw 另存新檔 +draft folder felamimail zh-tw 草稿夾 +e-mail felamimail zh-tw E-Mail +e-mail address felamimail zh-tw E-Mail位址 +e-mail folders felamimail zh-tw 郵件資料夾 +edit email forwarding address felamimail zh-tw 編輯郵件轉寄位址 +edit filter felamimail zh-tw 編輯規則 +edit rule felamimail zh-tw 編輯規則 +edit selected felamimail zh-tw 編輯選取的 +edit vacation settings felamimail zh-tw 編輯假期設定 +email address felamimail zh-tw 郵件位址 +email forwarding address felamimail zh-tw 郵件轉寄位址 +email signature felamimail zh-tw 簽名檔 +emailaddress felamimail zh-tw 郵件位址 +empty trash felamimail zh-tw 清空垃圾桶 +enable felamimail zh-tw 啟用 +encrypted connection felamimail zh-tw 加密的連線 +enter your default mail domain ( from: user@domain ) admin zh-tw 輸入您的預設郵件網域 +enter your imap mail server hostname or ip address admin zh-tw 輸入您的IMAP伺服器主機名稱或IP位址 +enter your sieve server hostname or ip address admin zh-tw 輸入您的SIEVE伺服器主機名稱或IP位址 +enter your sieve server port admin zh-tw 輸入您的SIEVE伺服器連接埠 +enter your smtp server hostname or ip address admin zh-tw 輸入您的SMTP伺服器主機名稱或IP位址 +enter your smtp server port admin zh-tw 輸入您的SMTP伺服器連接埠 +error felamimail zh-tw 錯誤 +error connecting to imap serv felamimail zh-tw 連結IMAP伺服器錯誤 +error connecting to imap server. %s : %s. felamimail zh-tw 連線到 IMAP 伺服器時發生錯誤。 %s : %s +error connecting to imap server: [%s] %s. felamimail zh-tw 連線到 IMAP 伺服器時發生錯誤: [%s] %s +error opening felamimail zh-tw 開啟錯誤 +every felamimail zh-tw 每一 +every %1 days felamimail zh-tw 每 %1 天 +expunge felamimail zh-tw 刪去 +extended felamimail zh-tw 延伸的 +felamimail common zh-tw FelaMiMail +file into felamimail zh-tw 檔案插入 +files felamimail zh-tw 檔案 +filter active felamimail zh-tw 規則啟用中 +filter name felamimail zh-tw 規則名稱 +filter rules common zh-tw 過濾規則 +first name felamimail zh-tw 名 +flagged felamimail zh-tw 被標示 +flags felamimail zh-tw 標示 +folder acl felamimail zh-tw 資料夾 ACL +folder name felamimail zh-tw 資料夾名稱 +folder path felamimail zh-tw 資料夾路徑 +folder preferences felamimail zh-tw 資料夾偏好 +folder settings felamimail zh-tw 資料夾設定 +folder status felamimail zh-tw 資料夾狀態 +folderlist felamimail zh-tw 資料夾清單 +foldername felamimail zh-tw 資料夾名稱 +folders felamimail zh-tw 資料夾 +folders created successfully! felamimail zh-tw 資料夾建立成功! +follow felamimail zh-tw 跟 +for mail to be send - not functional yet felamimail zh-tw 要寄出的郵件 - 尚未寄出 +for received mail felamimail zh-tw 收到的郵件 +forward felamimail zh-tw 轉寄 +forward to felamimail zh-tw 轉寄給 +forward to address felamimail zh-tw 轉寄到信箱 +forwarding felamimail zh-tw 轉寄中 +found felamimail zh-tw 找到 +fri felamimail zh-tw 五 +from felamimail zh-tw 來自 +from(a->z) felamimail zh-tw 從 (A->Z) +from(z->a) felamimail zh-tw 從 (Z->A) +full name felamimail zh-tw 全名 +greater than felamimail zh-tw 大於 +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail zh-tw 更多訊息請參考www.felamimail.org
    +header lines felamimail zh-tw 頭條新聞 +hide header felamimail zh-tw 隱藏標頭 +hostname / address felamimail zh-tw 主機名稱/位址 +html felamimail zh-tw HTML +icons and text felamimail zh-tw 圖示與文字 +icons only felamimail zh-tw 只顯示圖示 +identifying name felamimail zh-tw 識別名稱 +identity felamimail zh-tw 識別 +if felamimail zh-tw 如果 +if from contains felamimail zh-tw 如果寄件人包含 +if mail header felamimail zh-tw 如果郵件標頭 +if message size felamimail zh-tw 如果信件大小 +if subject contains felamimail zh-tw 如果主旨包含 +if to contains felamimail zh-tw 如果收件人包含 +if using ssl or tls, you must have the php openssl extension loaded. felamimail zh-tw 如果使用 SSL 或 TLS ,您必須先載入 PHP openssl 外掛。 +illegal folder name. please select a different name. felamimail zh-tw 錯誤的資料夾名稱,請重新輸入 +imap felamimail zh-tw IMAP +imap server felamimail zh-tw IMAP伺服器 +imap server address felamimail zh-tw IMAP伺服器位址 +imap server closed the connection. felamimail zh-tw IMAP伺服器關閉連線 +imap server closed the connection. server responded: %s felamimail zh-tw IMAP伺服器關閉連線,伺服器回應: %s +imap server password felamimail zh-tw IMAP伺服器密碼 +imap server type felamimail zh-tw IMAP伺服器種類 +imap server username felamimail zh-tw IMAP伺服器帳號 +imaps authentication felamimail zh-tw IMAPS驗證 +imaps encryption only felamimail zh-tw 只透過IMAPS加密 +in felamimail zh-tw 在 +inbox felamimail zh-tw 收件匣 +incoming mail server(imap) felamimail zh-tw 收信伺服器(IMAP) +index order felamimail zh-tw 排序 +info felamimail zh-tw 資訊 +invalid user name or password felamimail zh-tw 錯誤的帳號或密碼 +javascript felamimail zh-tw JavaScript +jumping to end felamimail zh-tw 跳到結束的地方 +jumping to start felamimail zh-tw 跳到開始的地方 +keep a copy of the message in your inbox felamimail zh-tw 在收件夾保留郵件副本 +keep local copy of email felamimail zh-tw 在本機保留信件備份 +kilobytes felamimail zh-tw KB +language felamimail zh-tw 語言 +last name felamimail zh-tw 姓 +left felamimail zh-tw 左 +less felamimail zh-tw 少 +less than felamimail zh-tw 小於 +light gray felamimail zh-tw 淺灰 +list all felamimail zh-tw 顯示全部 +loading felamimail zh-tw 載入中 +location of buttons when composing felamimail zh-tw 建立按鈕時的位置 +mail server login type admin zh-tw 郵件伺服器登入種類 +mail settings felamimail zh-tw 郵件設定 +mainmessage felamimail zh-tw 郵件主體 +manage emailaccounts preferences zh-tw 管理郵件帳號 +manage emailfilter / vacation preferences zh-tw 管理郵件規則/假期 +manage folders common zh-tw 管理資料夾 +manage sieve common zh-tw 管理Sieve程式 +manage signatures felamimail zh-tw 管理簽名 +mark as deleted felamimail zh-tw 標示刪除 +mark messages as felamimail zh-tw 標示選取的訊息為 +mark selected as flagged felamimail zh-tw 標示選取的為標註 +mark selected as read felamimail zh-tw 標示選取的為已讀取 +mark selected as unflagged felamimail zh-tw 標示選取的為取消標註 +mark selected as unread felamimail zh-tw 標示選取的為未讀取 +match felamimail zh-tw 符合 +matches felamimail zh-tw 符合 +matches regexp felamimail zh-tw 符合規則 +max uploadsize felamimail zh-tw 上傳檔案大小上限 +message highlighting felamimail zh-tw 訊息醒目標示 +message list felamimail zh-tw 訊息清單 +messages felamimail zh-tw 訊息 +mon felamimail zh-tw 一 +move felamimail zh-tw 移動 +move messages felamimail zh-tw 移動訊息 +move selected to felamimail zh-tw 移動選取的到 +move to trash felamimail zh-tw 移到垃圾桶 +moving messages to felamimail zh-tw 移動信件到 +name felamimail zh-tw 名稱 +never display html emails felamimail zh-tw 不顯示HTML郵件 +new common zh-tw 新增 +new filter felamimail zh-tw 新規則 +next felamimail zh-tw 下一個 +next message felamimail zh-tw 下一封郵件 +no active imap server found!! felamimail zh-tw 找不到可以使用的 IMAP 伺服器! +no encryption felamimail zh-tw 沒有加密 +no filter felamimail zh-tw 沒有過濾規則 +no folders found felamimail zh-tw 找不到資料夾 +no folders were found to subscribe to! felamimail zh-tw 找不到可以訂閱的資料夾 +no folders were found to unsubscribe from! felamimail zh-tw 找不到可以取消訂閱的資料夾 +no highlighting is defined felamimail zh-tw 未定義醒目標示 +no message returned. felamimail zh-tw 沒有訊息回應。 +no messages found... felamimail zh-tw 沒有任何信件... +no messages were selected. felamimail zh-tw 沒有選取任何訊息 +no plain text part found felamimail zh-tw 找不到純文字部份 +no previous message felamimail zh-tw 沒有上一個 +no recipient address given! felamimail zh-tw 沒有輸入收件人信箱! +no supported imap authentication method could be found. felamimail zh-tw 找不到能夠使用的 IMAP 驗證方式。 +no valid emailprofile selected!! felamimail zh-tw 沒有選取可以使用的郵件資料! +none felamimail zh-tw 無 +on behalf of felamimail zh-tw 代表 +one address is not valid felamimail zh-tw 其中一個信箱格式有誤 +only inbox felamimail zh-tw 只有收件夾 +only one window felamimail zh-tw 只開啟一個視窗 +only unseen felamimail zh-tw 只有未讀取 +open all felamimail zh-tw 全部開啟 +options felamimail zh-tw 選項 +or felamimail zh-tw 或 +organisation felamimail zh-tw 組織 +organization felamimail zh-tw 組織 +organization name admin zh-tw 組織名稱 +outgoing mail server(smtp) felamimail zh-tw 寄信伺服器(SMTP) +participants felamimail zh-tw 參與人 +personal information felamimail zh-tw 個人資訊 +please select a address felamimail zh-tw 請選擇一個位址 +please select the number of days to wait between responses felamimail zh-tw 請選擇回應之間要等待的天數 +please supply the message to send with auto-responses felamimail zh-tw 請提供要自動回信的內容 +port felamimail zh-tw 連接埠 +posting felamimail zh-tw 發佈中 +previous felamimail zh-tw 上一個 +previous message felamimail zh-tw 上一封郵件 +print it felamimail zh-tw 列印 +print this page felamimail zh-tw 印出這一頁 +quicksearch felamimail zh-tw 快速搜尋 +read felamimail zh-tw 讀取 +reading felamimail zh-tw 讀取中 +receive notification felamimail zh-tw 收到提醒 +recent felamimail zh-tw 最近 +refresh time in minutes felamimail zh-tw 重新整理的分鐘數 +reject with felamimail zh-tw 拒絕 +remove felamimail zh-tw 移除 +remove immediately felamimail zh-tw 立刻移除 +rename felamimail zh-tw 改名 +rename a folder felamimail zh-tw 修改資料匣名稱 +rename folder felamimail zh-tw 修改資料匣名稱 +renamed successfully! felamimail zh-tw 修改名稱完成! +replied felamimail zh-tw 已回信 +reply felamimail zh-tw 回信 +reply all felamimail zh-tw 全部回覆 +reply to felamimail zh-tw 回覆到 +replyto felamimail zh-tw 回覆到 +respond felamimail zh-tw 回覆 +respond to mail sent to felamimail zh-tw 回覆到郵件收件人 +return felamimail zh-tw 回上頁 +return to options page felamimail zh-tw 回到選項 +right felamimail zh-tw 正確 +row order style felamimail zh-tw 列順序風格 +rule felamimail zh-tw 規則 +sat felamimail zh-tw 六 +save felamimail zh-tw 儲存 +save as draft felamimail zh-tw 儲存為草稿 +save as infolog felamimail zh-tw 儲存為記事 +save changes felamimail zh-tw 儲存修改 +save message to disk felamimail zh-tw 儲存訊息到硬碟 +script name felamimail zh-tw 指令名稱 +script status felamimail zh-tw 指令狀態 +search felamimail zh-tw 搜尋 +search for felamimail zh-tw 搜尋 +select felamimail zh-tw 選擇 +select all felamimail zh-tw 選擇全部 +select emailprofile felamimail zh-tw 選擇郵件資料 +select folder felamimail zh-tw 選擇資料夾 +select your mail server type admin zh-tw 選擇您的郵件伺服器種類 +send felamimail zh-tw 送出 +send a reject message felamimail zh-tw 寄送一個拒絕信件 +sent folder felamimail zh-tw 寄件備份 +server supports mailfilter(sieve) felamimail zh-tw 伺服器支援郵件規則(sieve) +show header felamimail zh-tw 顯示標頭 +show new messages on main screen felamimail zh-tw 在主要畫面顯示新訊息 +sieve script name felamimail zh-tw sieve 程式名稱 +sieve settings admin zh-tw Sieve設定 +signature felamimail zh-tw 簽名檔 +simply click the target-folder felamimail zh-tw 點選目標資料夾 +size felamimail zh-tw 大小 +size of editor window felamimail zh-tw 編輯視窗大小 +size(...->0) felamimail zh-tw 大小 (...->0) +size(0->...) felamimail zh-tw 大小(0->...) +skipping forward felamimail zh-tw 略過轉寄 +skipping previous felamimail zh-tw 略過上一個 +small view felamimail zh-tw 縮小 +smtp settings admin zh-tw SMTP設定 +subject felamimail zh-tw 主旨 +subject(a->z) felamimail zh-tw 標題(A->Z) +subject(z->a) felamimail zh-tw 標題(Z->A) +submit felamimail zh-tw 送出 +subscribe felamimail zh-tw 訂閱 +subscribed felamimail zh-tw 已訂閱 +subscribed successfully! felamimail zh-tw 訂閱完成! +sun felamimail zh-tw 日 +table of contents felamimail zh-tw 內容表單 +text only felamimail zh-tw 純文字 +the connection to the imap server failed!! felamimail zh-tw 連結IMAP伺服器發生錯誤! +the imap server does not appear to support the authentication method selected. please contact your system administrator. felamimail zh-tw IMAP 伺服器不支援指定的認證方式,請聯繫您的系統管理員。 +the mimeparser can not parse this message. felamimail zh-tw mime 解析程式無法處理這封郵件 +then felamimail zh-tw 然後 +this folder is empty felamimail zh-tw 這個資料夾沒有任何信件 +this php has no imap support compiled in!! felamimail zh-tw 您的PHP並未編譯為支援IMAP的狀態 +thu felamimail zh-tw 四 +to felamimail zh-tw 到 +to mail sent to felamimail zh-tw 到郵件寄件人 +to use a tls connection, you must be running a version of php 5.1.0 or higher. felamimail zh-tw 要使用 TLS 連線,您必須執行在 PHP 5.1.0 或是更新版本中。 +translation preferences felamimail zh-tw 翻譯偏好 +translation server felamimail zh-tw 翻譯伺服器 +trash fold felamimail zh-tw 垃圾桶 +trash folder felamimail zh-tw 垃圾桶 +tue felamimail zh-tw 二 +type felamimail zh-tw 格式 +unexpected response from server to authenticate command. felamimail zh-tw 伺服器 AUTHENTICATE 指令傳回了不明的回應。 +unexpected response from server to digest-md5 response. felamimail zh-tw 伺服器 Digest-MD5 指令傳回了不明的回應。 +unexpected response from server to login command. felamimail zh-tw 伺服器登入指令傳回了不明的回應。 +unflagged felamimail zh-tw 取消標示 +unknown err felamimail zh-tw 不知名的錯誤 +unknown error felamimail zh-tw 不知名的錯誤 +unknown imap response from the server. server responded: %s felamimail zh-tw 不明的 IMAP 伺服器回應,回應內容: %s +unknown sender felamimail zh-tw 不知名的寄件人 +unknown user or password incorrect. felamimail zh-tw 不知名的使用者或是密碼錯誤 +unread common zh-tw 未讀取 +unseen felamimail zh-tw 未讀取 +unselect all felamimail zh-tw 取消全部選取 +unsubscribe felamimail zh-tw 取消訂閱 +unsubscribed felamimail zh-tw 取消訂閱 +unsubscribed successfully! felamimail zh-tw 取消訂閱完成! +up felamimail zh-tw 上一層 +updating message status felamimail zh-tw 更新訊息狀態中 +updating view felamimail zh-tw 更新檢視 +use emailadmin to create profiles felamimail zh-tw 使用 郵件管理 來建立資料 +use a signature felamimail zh-tw 使用簽名檔 +use a signature? felamimail zh-tw 使用簽名檔? +use addresses felamimail zh-tw 使用位址 +use custom settings felamimail zh-tw 使用個人設定 +use regular expressions felamimail zh-tw 使用樣式比對 +use smtp auth admin zh-tw 使用SMTP認證 +users can define their own emailaccounts admin zh-tw 使用者可以自行定義郵件帳號 +vacation notice common zh-tw 假期提醒 +vacation notice is active felamimail zh-tw 假期提醒功能啟用中 +validate certificate felamimail zh-tw 驗證 +view full header felamimail zh-tw 顯示完整標頭 +view header lines felamimail zh-tw 檢視檔頭 +view message felamimail zh-tw 顯示訊息 +viewing full header felamimail zh-tw 顯示完整標頭中 +viewing message felamimail zh-tw 顯示訊息中 +viewing messages felamimail zh-tw 顯示訊息中 +wed felamimail zh-tw 三 +when deleting messages felamimail zh-tw 當刪除訊息時 +with message felamimail zh-tw 信件 +with message "%1" felamimail zh-tw 信件 "%1" +wrap incoming text at felamimail zh-tw 自動斷行 +writing felamimail zh-tw 編輯中 +wrote felamimail zh-tw 寫 diff --git a/felamimail/lang/egw_zh.lang b/felamimail/lang/egw_zh.lang new file mode 100644 index 0000000000..6808bc8d21 --- /dev/null +++ b/felamimail/lang/egw_zh.lang @@ -0,0 +1,434 @@ +(no subject) felamimail zh (无主题) +(only cc/bcc) felamimail zh (仅抄送/密送) +(separate multiple addresses by comma) felamimail zh (多个地址由逗号分开) +(unknown sender) felamimail zh (未知发件人) +activate felamimail zh 激活 +activate script felamimail zh 启用脚本 +activating by date requires a start- and end-date! felamimail zh 以日期激活需要一个开始和结束日期! +add acl felamimail zh 添加 ACL +add address felamimail zh 添加地址 +add rule felamimail zh 添加规则 +add script felamimail zh 添加脚本 +add to %1 felamimail zh 添加至%1 +add to address book felamimail zh 添加至通讯录 +add to addressbook felamimail zh 添加至通讯录 +adding file to message. please wait! felamimail zh 添加文件到邮件,请稍候! +additional info felamimail zh 附加信息 +address book felamimail zh 通讯簿 +address book search felamimail zh 通讯簿搜索 +after message body felamimail zh 在邮件内容后 +all address books felamimail zh 所有通讯簿 +all folders felamimail zh 所有邮件夹 +all of felamimail zh 所有的 +allow images from external sources in html emails felamimail zh 在HTML邮件中允许外部图片来源 +allways a new window felamimail zh 允许新窗口 +always show html emails felamimail zh 总是显示HTML邮件 +and felamimail zh 和 +any of felamimail zh 任何 +any status felamimail zh 任何状态 +anyone felamimail zh 任何人 +as a subfolder of felamimail zh 作为该邮件夹的子邮件夹 +attachments felamimail zh 附件 +authentication required felamimail zh 必要附件 +auto refresh folder list felamimail zh 自动刷新邮件夹列表 +back to folder felamimail zh 返回邮件夹 +bad login name or password. felamimail zh 错误登录名或密码 +bad or malformed request. server responded: %s felamimail zh 不正确的请求。服务器或应:%s +bad request: %s felamimail zh 错误请求:%s +based upon given criteria, incoming messages can have different background colors in the message list. this helps to easily distinguish who the messages are from, especially for mailing lists. felamimail zh 基于给定的标准,接收的邮件在列表中可以使用不同的背景颜色,这可以有助于轻易辨别邮件的来源,特别是邮件列表。 +bcc felamimail zh 密送 +before headers felamimail zh 在邮件头之前 +between headers and message body felamimail zh 在邮件头和邮件内容之间 +body part felamimail zh 内容部份 +by date felamimail zh 以日期 +can not send message. no recipient defined! felamimail zh 不能发送邮件。收件人没有定义! +can't connect to inbox!! felamimail zh 无法连接收件箱! +cc felamimail zh 抄送 +change folder felamimail zh 更改邮件夹 +check message against next rule also felamimail zh 也用下一个规则检查邮件 +checkbox felamimail zh 复选框 +clear search felamimail zh 清除搜索 +click here to log back in. felamimail zh 点击此处登录. +click here to return to %1 felamimail zh 点击此处返回到 %1 +close all felamimail zh 全部关闭 +close this page felamimail zh 关闭该页面 +close window felamimail zh 关闭窗口 +color felamimail zh 颜色 +compose felamimail zh 撰写 +compress folder felamimail zh 压缩文件夹 +condition felamimail zh 条件 +configuration felamimail zh 配置 +connection dropped by imap server. felamimail zh 连接被 IMAP 服务器中断 +contains felamimail zh 包含 +could not complete request. reason given: %s felamimail zh 无法完成请求。原因是:%s +could not open secure connection to the imap server. %s : %s. felamimail zh 无法开启到 IMAP 服务器的安全连接。%s:%s。 +cram-md5 or digest-md5 requires the auth_sasl package to be installed. felamimail zh CRAM-MD5 或 DIGEST-MD5 需要安装 Auth_SASL 包。 +create felamimail zh 创建 +create folder felamimail zh 创建邮件夹 +create sent felamimail zh 创建发件箱 +create subfolder felamimail zh 创建子邮件夹 +create trash felamimail zh 创建回收站 +created folder successfully! felamimail zh 邮件夹创建成功! +dark blue felamimail zh 暗蓝色 +dark cyan felamimail zh 暗青色 +dark gray felamimail zh 暗灰色 +dark green felamimail zh 暗绿色 +dark magenta felamimail zh 暗紫色 +dark yellow felamimail zh 暗黄色 +date(newest first) felamimail zh 日期 (最近邮件优先) +date(oldest first) felamimail zh 日期 (最早邮件优先) +days felamimail zh 天 +deactivate script felamimail zh 停用脚本 +default felamimail zh 默认 +default signature felamimail zh 默认签名 +default sorting order felamimail zh 默认排序 +delete all felamimail zh 全部删除 +delete folder felamimail zh 删除邮件夹 +delete script felamimail zh 删除脚本 +delete selected felamimail zh 删除所选 +delete selected messages felamimail zh 删除选择的邮件 +deleted felamimail zh 已删除 +deleted folder successfully! felamimail zh 邮件夹删除成功! +deleting messages felamimail zh 删除邮件 +disable felamimail zh 禁用 +discard felamimail zh 取消 +discard message felamimail zh 取消邮件 +display message in new window felamimail zh 打开新窗口以查看邮件 +display messages in multiple windows felamimail zh 在多窗口显示邮件 +display of html emails felamimail zh 显示HTML邮件 +display only when no plain text is available felamimail zh 仅当邮件非纯文本时显示 +display preferences felamimail zh 显示用户参数 +displaying html messages is disabled felamimail zh 显示HTML邮件被禁用 +do it! felamimail zh 执行! +do not use sent felamimail zh 不使用发件箱 +do not use trash felamimail zh 不使用回收站 +do not validate certificate felamimail zh 不确认证书 +do you really want to delete the '%1' folder? felamimail zh 确定要删除邮件夹'%1'吗? +do you really want to delete the selected signatures? felamimail zh 您确定要删除选择的签名吗? +does not contain felamimail zh 不包含 +does not match felamimail zh 不符合 +does not match regexp felamimail zh 不符合条件 +don't use draft folder felamimail zh 不使用草稿夹 +don't use sent felamimail zh 不使用发件箱 +don't use trash felamimail zh 不使用回收站 +down felamimail zh 向下 +download felamimail zh 下载 +download this as a file felamimail zh 作为文件下载 +draft folder felamimail zh 草稿夹 +e-mail felamimail zh 电子邮件 +e-mail address felamimail zh 邮件地址 +e-mail folders felamimail zh 邮件夹 +edit email forwarding address felamimail zh 编辑邮件转发地址 +edit filter felamimail zh 编辑过滤器 +edit rule felamimail zh 编辑规则 +edit selected felamimail zh 编辑选定 +edit vacation settings felamimail zh 编辑假期设置 +email address felamimail zh 邮件地址 +email forwarding address felamimail zh 邮件转发地址 +email signature felamimail zh 邮件签名 +emailaddress felamimail zh 邮件地址 +empty trash felamimail zh 清空回收站 +enable felamimail zh 启用 +encrypted connection felamimail zh 加密的连接 +enter your default mail domain ( from: user@domain ) admin zh 输入您的默认邮件域(如:user@domain 中 @ 之后的所字母) +enter your imap mail server hostname or ip address admin zh 输入您的 IMAP 服务器主机名或 IP 地址 +enter your sieve server hostname or ip address admin zh 输入您的 ISIEV 服务器主机名或 IP 地址 +enter your sieve server port admin zh 输入您的 ISIEV 服务器端口 +enter your smtp server hostname or ip address admin zh 输入您的 SMAP 服务器主机名或 IP 地址 +enter your smtp server port admin zh 输入您的 SMAP 服务器端口 +error felamimail zh 错误 +error connecting to imap serv felamimail zh 连接 IMAP 服务器错误 +error connecting to imap server. %s : %s. felamimail zh 连接到 IMAP 服务器错误。%s:%s。 +error connecting to imap server: [%s] %s. felamimail zh 连接到 IMAP 服务器错误:[%s] %s。 +error opening felamimail zh 打开错误 +every felamimail zh 每一 +every %1 days felamimail zh 每 %1 天 +expunge felamimail zh 删掉 +extended felamimail zh 延伸的 +felamimail common zh 我的邮箱 +file into felamimail zh 文件插入 +files felamimail zh 文件 +filter active felamimail zh 过滤器激活 +filter name felamimail zh 过滤器名称 +filter rules common zh 过滤规则 +first name felamimail zh 名 +flagged felamimail zh 已标记 +flags felamimail zh 标记 +folder felamimail zh 邮件夹 +folder acl felamimail zh 邮件夹 ACL +folder name felamimail zh 邮件夹名称 +folder path felamimail zh 邮件夹路径 +folder preferences felamimail zh 邮件夹用户参数 +folder settings felamimail zh 邮件夹设置 +folder status felamimail zh 邮件夹状态 +folderlist felamimail zh 邮件夹列表 +foldername felamimail zh 邮件夹名称 +folders felamimail zh 邮件夹 +folders created successfully! felamimail zh 邮件夹创建成功! +follow felamimail zh 跟 +for mail to be send - not functional yet felamimail zh 要发出的邮件 - 尚未发出 +for received mail felamimail zh 收到的邮件 +forward felamimail zh 转发 +forward messages to felamimail zh 转发邮件到 +forward to felamimail zh 转发到 +forward to address felamimail zh 转发到地址 +forwarding felamimail zh 转发中 +found felamimail zh 建立 +fri felamimail zh 五 +from felamimail zh 发件人 +from(a->z) felamimail zh 从 (A->Z) +from(z->a) felamimail zh 从 (Z->A) +full name felamimail zh 姓名 +greater than felamimail zh 大于 +have a look at www.felamimail.org to learn more about squirrelmail.
    felamimail zh 更多信息请参考www.felamimail.org
    +header lines felamimail zh 邮件头 +hide header felamimail zh 隐藏邮件头 +hostname / address felamimail zh 主机名 / 地址 +html felamimail zh HTML +icons and text felamimail zh 图标与文字 +icons only felamimail zh 只显示图标 +identifying name felamimail zh 正在识别名称 +identity felamimail zh 身份 +if felamimail zh 如果 +if from contains felamimail zh 如果发件人包含 +if mail header felamimail zh 如果邮件头 +if message size felamimail zh 如果邮件大小 +if subject contains felamimail zh 如果主题包含 +if to contains felamimail zh 如果收件人包含 +if using ssl or tls, you must have the php openssl extension loaded. felamimail zh 如果使用 SSL 或 TLS,您必须加载 PHP openssl 扩展。 +illegal folder name. please select a different name. felamimail zh 邮件夹名称无效。请指定其他名称。 +imap felamimail zh IMAP +imap server felamimail zh IMAP 服务器 +imap server address felamimail zh IMAP 服务器地址 +imap server closed the connection. felamimail zh IMAP 服务器已关闭连接。 +imap server closed the connection. server responded: %s felamimail zh IMAP 服务器已关闭连接。服务器回应:%s +imap server password felamimail zh IMAP 服务器密码 +imap server type felamimail zh IMAP 服务器类型 +imap server username felamimail zh IMAP 服务器用户名 +imaps authentication felamimail zh IMAPS 身份验证 +imaps encryption only felamimail zh 仅 IMAPS 加密 +in felamimail zh 在 +inbox felamimail zh 收件箱 +incoming mail server(imap) felamimail zh 收件服务器(IMAP) +index order felamimail zh 索引顺序 +info felamimail zh 信息 +invalid user name or password felamimail zh 用户名或密码无效 +javascript felamimail zh JavaScript +jumping to end felamimail zh 跳到结尾 +jumping to start felamimail zh 跳到开始 +keep a copy of the message in your inbox felamimail zh 在收件箱保留一个邮件副本 +keep local copy of email felamimail zh 在本地保留邮件副本 +kilobytes felamimail zh kb +language felamimail zh 语言 +last name felamimail zh 姓 +left felamimail zh 左 +less felamimail zh 少 +less than felamimail zh 少于 +light gray felamimail zh 亮灰色 +list all felamimail zh 全部列出 +loading felamimail zh 载入 +location of buttons when composing felamimail zh 排版时按钮的位置 +mail server login type admin zh 邮件服务器登录类型 +mail settings felamimail zh 邮件设置 +mainmessage felamimail zh 主要邮件 +manage emailaccounts preferences zh 管理邮件帐户 +manage emailfilter / vacation preferences zh 管理邮件过滤 / 假期 +manage folders common zh 邮件夹管理 +manage sieve common zh 管理服务器脚本 +manage signatures felamimail zh 管理签名 +mark as deleted felamimail zh 标记为已删除 +mark messages as felamimail zh 将选定邮件标记为 +mark selected as flagged felamimail zh 标记选定邮件 +mark selected as read felamimail zh 将选定邮件标记为已读 +mark selected as unflagged felamimail zh 清除选定邮件标记 +mark selected as unread felamimail zh 将选定邮件标记为未读 +match felamimail zh 符合 +matches felamimail zh 符合 +matches regexp felamimail zh 符合规则 +max uploadsize felamimail zh 最大上传 +message highlighting felamimail zh 邮件高亮显示 +message list felamimail zh 邮件列表 +messages felamimail zh 邮件 +mon felamimail zh 一 +move felamimail zh 移动 +move messages felamimail zh 移动邮件 +move selected to felamimail zh 将选定邮件移至 +move to trash felamimail zh 移动至回收站 +moving messages to felamimail zh 移动邮件到 +name felamimail zh 名称 +never display html emails felamimail zh 从不显示 HTML 邮件 +new common zh 新建 +new filter felamimail zh 新建过滤器 +next felamimail zh 下一个 +next message felamimail zh 下一封邮件 +no active imap server found!! felamimail zh 找不到可使用的 IMAP 服务器! +no encryption felamimail zh 未加密 +no filter felamimail zh 无过滤器 +no folders found felamimail zh 找不到邮件夹 +no folders were found to subscribe to! felamimail zh 找不到可以订阅的文件夹! +no folders were found to unsubscribe from! felamimail zh 找不到可以取消订阅的邮件夹 +no highlighting is defined felamimail zh 为定义突出显示 +no message returned. felamimail zh 没有邮件回应 +no messages found... felamimail zh 未发现邮件... +no messages were selected. felamimail zh 没有选择任何邮件。 +no plain text part found felamimail zh 未找到纯文本部分 +no previous message felamimail zh 没有上一个 +no recipient address given! felamimail zh 没有给定收件人地址! +no signature felamimail zh 没有签名 +no subject given! felamimail zh 没有指定的主题! +no supported imap authentication method could be found. felamimail zh 找不到支持 IMAP 验证方法。 +no valid emailprofile selected!! felamimail zh 指定的邮件帐户无效! +none felamimail zh 无 +on behalf of felamimail zh 代表 +one address is not valid felamimail zh 其中一个地址无效 +only inbox felamimail zh 只有收件箱 +only one window felamimail zh 只一个窗口 +only unseen felamimail zh 只有未读取 +open all felamimail zh 全部打开 +options felamimail zh 选项 +or felamimail zh 或 +organisation felamimail zh 组织 +organization felamimail zh 组织 +organization name admin zh 组织名称 +outgoing mail server(smtp) felamimail zh 发件邮件服务器(IMAP) +participants felamimail zh 参与者 +personal information felamimail zh 个人信息 +please select a address felamimail zh 请选择地址 +please select the number of days to wait between responses felamimail zh 请选择回复之间要等待的天数 +please supply the message to send with auto-responses felamimail zh 请提供要自动回复的内容 +port felamimail zh 端口 +posting felamimail zh 发布中 +previous felamimail zh 上一个 +previous message felamimail zh 上一封邮件 +print it felamimail zh 打印 +print this page felamimail zh 打印该页 +quicksearch felamimail zh 快速搜索 +read felamimail zh 已读 +reading felamimail zh 读取中 +receive notification felamimail zh 接收通知 +recent felamimail zh 最近 +refresh time in minutes felamimail zh 刷新时间分钟数 +reject with felamimail zh 拒绝 +remove felamimail zh 删除 +remove immediately felamimail zh 立刻删除 +rename felamimail zh 重命名 +rename a folder felamimail zh 重命名一个文件夹 +rename folder felamimail zh 重命名邮件夹 +renamed successfully! felamimail zh 重命名邮件夹成功! +replied felamimail zh 已回复 +reply felamimail zh 回复 +reply all felamimail zh 全部回复 +reply to felamimail zh 回复到 +replyto felamimail zh 回复到 +respond felamimail zh 回复 +respond to mail sent to felamimail zh 回复邮件收件人 +return felamimail zh 返回 +return to options page felamimail zh 返回到选项 +right felamimail zh 正确 +row order style felamimail zh 行排序类型 +rule felamimail zh 规则 +sat felamimail zh 六 +save felamimail zh 保存 +save as draft felamimail zh 存为草稿 +save as infolog felamimail zh 存为记事本 +save changes felamimail zh 保存为修改 +save message to disk felamimail zh 保存邮件到磁盘 +script name felamimail zh 脚本名 +script status felamimail zh 脚本状态 +search felamimail zh 搜索 +search for felamimail zh 搜索 +select felamimail zh 选择 +select all felamimail zh 全选 +select emailprofile felamimail zh 选择邮件 Profile +select folder felamimail zh 选择文件夹 +select your mail server type admin zh 选择您的邮件服务器类型 +send felamimail zh 发送 +send a reject message felamimail zh 发送一拒绝邮件 +sent folder felamimail zh 发件夹 +server supports mailfilter(sieve) felamimail zh 服务器支持邮件过滤(sieve) +set as default felamimail zh 设置作为缺省 +show header felamimail zh 显示邮件头 +show new messages on main screen felamimail zh 在首页上显示新邮件 +sieve script name felamimail zh Sieve 脚本名 +sieve settings admin zh Sieve 设置 +signature felamimail zh 签名 +simply click the target-folder felamimail zh 简单地点击目标文件夹 +size felamimail zh 大小 +size of editor window felamimail zh 编辑窗口大小 +size(...->0) felamimail zh 大小 (...->0) +size(0->...) felamimail zh 大小(0->...) +skipping forward felamimail zh 跳到前面 +skipping previous felamimail zh 跳回上一个 +small view felamimail zh 小视图 +smtp settings admin zh SMTP设置 +subject felamimail zh 主题 +subject(a->z) felamimail zh 主题 (A->Z) +subject(z->a) felamimail zh 主题 (Z->A) +submit felamimail zh 提交 +subscribe felamimail zh 订阅 +subscribed felamimail zh 已订阅 +subscribed successfully! felamimail zh 订阅成功! +sun felamimail zh 日 +system signature felamimail zh 系统签名 +table of contents felamimail zh 目录 +text only felamimail zh 纯文字 +the connection to the imap server failed!! felamimail zh 连接 IMAP 服务器发生错误! +the imap server does not appear to support the authentication method selected. please contact your system administrator. felamimail zh IMAP 服务器不支持选定的认证方法。请联系系统管理员。 +the mimeparser can not parse this message. felamimail zh mime 解析器不能解析这个邮件。 +then felamimail zh 然后 +this folder is empty felamimail zh 这个文件夹时空的 +this php has no imap support compiled in!! felamimail zh 您的 PHP 并未编译为支持 IMAP! +thu felamimail zh 四 +to felamimail zh 收件人 +to mail sent to felamimail zh 到邮件收件人 +to use a tls connection, you must be running a version of php 5.1.0 or higher. felamimail zh 要使用 TLS 连接,您必须运行 PHP 5.1.0 或更高版本。 +translation preferences felamimail zh 翻译偏好 +translation server felamimail zh 翻译服务器 +trash fold felamimail zh 垃圾桶 +trash folder felamimail zh 回收站 +tue felamimail zh 二 +type felamimail zh 类型 +unexpected response from server to authenticate command. felamimail zh 服务器 AUTHENTICATE 指令返回了不明回应。 +unexpected response from server to digest-md5 response. felamimail zh 服务器 Digest-MD5 指令返回了不明回应。 +unexpected response from server to login command. felamimail zh 服务器登录指令返回了不明回应。 +unflagged felamimail zh 已清除标记 +unknown err felamimail zh 未知错误 +unknown error felamimail zh 未知错误 +unknown imap response from the server. server responded: %s felamimail zh 未知 IMAP 服务器回应。服务器回应:%s +unknown sender felamimail zh 未知发件人 +unknown user or password incorrect. felamimail zh 未知用户或密码错误。 +unread common zh 未读 +unseen felamimail zh 未读 +unselect all felamimail zh 取消全部选择 +unsubscribe felamimail zh 取消订阅 +unsubscribed felamimail zh 已取消订阅 +unsubscribed successfully! felamimail zh 取消订阅成功! +up felamimail zh 向上 +updating message status felamimail zh 更新邮件状态 +updating view felamimail zh 更新查看 +use emailadmin to create profiles felamimail zh 使用邮件管理来创建配置文件(profile) +use a signature felamimail zh 使用签名 +use a signature? felamimail zh 使用签名? +use addresses felamimail zh 使用地址 +use custom settings felamimail zh 使用自定义设置 +use regular expressions felamimail zh 使用正则表达式 +use smtp auth admin zh 使用 SMTP 认证 +users can define their own emailaccounts admin zh 用户可定义他们自己的邮件帐户 +vacation notice common zh 假期通知 +vacation notice is active felamimail zh 假期通知已激活 +vacation start-date must be before the end-date! felamimail zh 假期开始日期必须是在结束日期之前! +validate certificate felamimail zh 有效证书 +view full header felamimail zh 查看完整邮件头 +view header lines felamimail zh 查看邮件头 +view message felamimail zh 查看邮件 +viewing full header felamimail zh 查看完整邮件头 +viewing message felamimail zh 查看邮件 +viewing messages felamimail zh 查看邮件 +wed felamimail zh 三 +when deleting messages felamimail zh 当删除邮件时 +with message felamimail zh 与邮件 +with message "%1" felamimail zh 与邮件"%1" +wrap incoming text at felamimail zh 邮件换行设置 +writing felamimail zh 写 +wrote felamimail zh 写信 +you can use %1 for the above start-date and %2 for the end-date. felamimail zh 您可以使用上述开始日期%1和结束日期%2。 diff --git a/felamimail/setup/etemplates.inc.php b/felamimail/setup/etemplates.inc.php new file mode 100644 index 0000000000..b6ce6be0e4 --- /dev/null +++ b/felamimail/setup/etemplates.inc.php @@ -0,0 +1,65 @@ + 'felamimail.stationery.sample','template' => '','lang' => '','group' => '0','version' => '1.7.003','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:4:{i:0;a:0:{}i:1;a:1:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"span";s:7:",header";s:5:"label";s:6:"Header";}}i:2;a:1:{s:1:"A";a:4:{s:4:"type";s:4:"html";s:4:"name";s:7:"message";s:4:"span";s:8:",message";s:5:"label";s:7:"message";}}i:3;a:1:{s:1:"A";a:4:{s:4:"type";s:4:"html";s:4:"name";s:9:"signature";s:4:"span";s:10:",signature";s:5:"label";s:9:"signature";}}}s:4:"rows";i:3;s:4:"cols";i:1;s:4:"size";s:21:"100%,,0,fullwidth,0,0";s:7:"options";a:5:{i:3;s:9:"fullwidth";i:0;s:4:"100%";i:4;s:1:"0";i:5;s:1:"0";i:2;s:1:"0";}}}','size' => '100%,,0,fullwidth,0,0','style' => 'body { + font-family: "Lucida Grande"; + font-size: 12px; + color: #000000; + background-color: #eaeaea; + margin: 0; + padding: 0; +} + +table.fullwidth { + table-layout:fixed; + width: 100%; + margin: 0; + padding: 0; + border: 0; +} + +td.header { + background-color: #322f40; + color: #ffffff; + font-weight: bold; + margin: 0; + padding: 1em; + border-left: 6px solid #504a66; + border-bottom: 1px solid #504a66; +} + +td.message { + margin: 0.5em; + padding: 1em; + color: #333333; + font-family: "Lucida Grande"; + font-size: 12px; +} + +td.signature { + color: #666666; + border-left: 5px solid #747474; + margin: 0.5em; + padding-left: 8px; + font-family: "Lucida Grande"; + font-size: 12px; +} + +img { + border: 0; + margin: 0; + padding: 0; +} +','modified' => '1250287711',); + diff --git a/felamimail/setup/phpmailer.lang-br.php b/felamimail/setup/phpmailer.lang-br.php new file mode 100644 index 0000000000..b948c264f3 --- /dev/null +++ b/felamimail/setup/phpmailer.lang-br.php @@ -0,0 +1,21 @@ + diff --git a/felamimail/setup/phpmailer.lang-de.php b/felamimail/setup/phpmailer.lang-de.php new file mode 100644 index 0000000000..89d249f970 --- /dev/null +++ b/felamimail/setup/phpmailer.lang-de.php @@ -0,0 +1,23 @@ + \ No newline at end of file diff --git a/felamimail/setup/phpmailer.lang-en.php b/felamimail/setup/phpmailer.lang-en.php new file mode 100644 index 0000000000..2f45383fec --- /dev/null +++ b/felamimail/setup/phpmailer.lang-en.php @@ -0,0 +1,23 @@ + diff --git a/felamimail/setup/phpmailer.lang-it.php b/felamimail/setup/phpmailer.lang-it.php new file mode 100644 index 0000000000..26ef64dd1c --- /dev/null +++ b/felamimail/setup/phpmailer.lang-it.php @@ -0,0 +1,28 @@ + +*/ + +$PHPMAILER_LANG = array(); + +$PHPMAILER_LANG["provide_address"] = 'Deve essere fornito almeno un'. + ' indirizzo ricevente'; +$PHPMAILER_LANG["mailer_not_supported"] = 'Mailer non supportato'; +$PHPMAILER_LANG["execute"] = "Impossibile eseguire l'operazione: "; +$PHPMAILER_LANG["instantiate"] = 'Impossibile istanziare la funzione mail'; +$PHPMAILER_LANG["authenticate"] = 'SMTP Error: Impossibile autenticarsi.'; +$PHPMAILER_LANG["from_failed"] = 'I seguenti indirizzi mittenti hanno'. + ' generato errore: '; +$PHPMAILER_LANG["recipients_failed"] = 'SMTP Error: I seguenti indirizzi'. + 'destinatari hanno generato errore: '; +$PHPMAILER_LANG["data_not_accepted"] = 'SMTP Error: Data non accettati dal'. + 'server.'; +$PHPMAILER_LANG["connect_host"] = 'SMTP Error: Impossibile connettersi'. + ' all\'host SMTP.'; +$PHPMAILER_LANG["file_access"] = 'Impossibile accedere al file: '; +$PHPMAILER_LANG["file_open"] = 'File Error: Impossibile aprire il file: '; +$PHPMAILER_LANG["encoding"] = 'Encoding set dei caratteri sconosciuto: '; +?> diff --git a/felamimail/setup/setup.inc.php b/felamimail/setup/setup.inc.php new file mode 100644 index 0000000000..7807a438f9 --- /dev/null +++ b/felamimail/setup/setup.inc.php @@ -0,0 +1,75 @@ + 'phpgwapi', + 'versions' => Array('1.3','1.4','1.5','1.6','1.7') +); +$setup_info['felamimail']['depends'][] = array( + 'appname' => 'emailadmin', + 'versions' => Array('1.3','1.4','1.5','1.6','1.7') +); +$setup_info['felamimail']['depends'][] = array( + 'appname' => 'egw-pear', + 'versions' => Array('1.4.000','1.5','1.6','1.7') +); +// installation checks for felamimail +$setup_info['felamimail']['check_install'] = array( + '' => array( + 'func' => 'pear_check', + ), +# get's provided by egw-pear temporarly + 'Net_Sieve' => array( + 'func' => 'pear_check', + ), + 'Net_IMAP' => array( + 'func' => 'pear_check', + ), + 'Auth_SASL' => array( + 'func' => 'pear_check', + ), + 'imap' => array( + 'func' => 'extension_check', + ), + 'magic_quotes_gpc' => array( + 'func' => 'php_ini_check', + 'value' => 0, + 'verbose_value' => 'Off', + ), +); diff --git a/felamimail/setup/tables_current.inc.php b/felamimail/setup/tables_current.inc.php new file mode 100644 index 0000000000..f4642298ed --- /dev/null +++ b/felamimail/setup/tables_current.inc.php @@ -0,0 +1,73 @@ + array( + 'fd' => array( + 'fmail_filter_accountid' => array('type' => 'int','precision' => '4','nullable' => False), + 'fmail_filter_data' => array('type' => 'text') + ), + 'pk' => array('fmail_filter_accountid'), + 'fk' => array(), + 'ix' => array(), + 'uc' => array() + ), + 'egw_felamimail_accounts' => array( + 'fd' => array( + 'fm_owner' => array('type' => 'int','precision' => '4','nullable' => False), + 'fm_id' => array('type' => 'auto'), + 'fm_realname' => array('type' => 'varchar','precision' => '128'), + 'fm_organization' => array('type' => 'varchar','precision' => '128'), + 'fm_emailaddress' => array('type' => 'varchar','precision' => '128','nullable' => False), + 'fm_signatureid' => array('type' => 'int','precision' => '4'), + 'fm_ic_hostname' => array('type' => 'varchar','precision' => '128'), + 'fm_ic_port' => array('type' => 'int','precision' => '4'), + 'fm_ic_username' => array('type' => 'varchar','precision' => '128'), + 'fm_ic_password' => array('type' => 'varchar','precision' => '128'), + 'fm_ic_encryption' => array('type' => 'int','precision' => '4'), + 'fm_og_hostname' => array('type' => 'varchar','precision' => '128'), + 'fm_og_port' => array('type' => 'int','precision' => '4'), + 'fm_og_smtpauth' => array('type' => 'bool'), + 'fm_og_username' => array('type' => 'varchar','precision' => '128'), + 'fm_og_password' => array('type' => 'varchar','precision' => '128'), + 'fm_active' => array('type' => 'bool','nullable' => False), + 'fm_ic_validatecertificate' => array('type' => 'bool'), + 'fm_ic_enable_sieve' => array('type' => 'bool','precision' => '255'), + 'fm_ic_sieve_server' => array('type' => 'varchar','precision' => '128'), + 'fm_ic_sieve_port' => array('type' => 'int','precision' => '4'), + 'fm_ic_folderstoshowinhome' => array('type' => 'text'), + 'fm_ic_sentfolder' => array('type' => 'varchar','precision' => '128'), + 'fm_ic_trashfolder' => array('type' => 'varchar','precision' => '128'), + 'fm_ic_draftfolder' => array('type' => 'varchar','precision' => '128'), + 'fm_ic_templatefolder' => array('type' => 'varchar','precision' => '128'), + ), + 'pk' => array('fm_id'), + 'fk' => array(), + 'ix' => array('fm_owner'), + 'uc' => array() + ), + 'egw_felamimail_signatures' => array( + 'fd' => array( + 'fm_signatureid' => array('type' => 'auto'), + 'fm_accountid' => array('type' => 'int','precision' => '11'), + 'fm_signature' => array('type' => 'text'), + 'fm_description' => array('type' => 'varchar','precision' => '255'), + 'fm_defaultsignature' => array('type' => 'bool') + ), + 'pk' => array('fm_signatureid'), + 'fk' => array(), + 'ix' => array(), + 'uc' => array(array('fm_signatureid','fm_accountid')) + ) + ); +?> diff --git a/felamimail/setup/tables_update.inc.php b/felamimail/setup/tables_update.inc.php new file mode 100644 index 0000000000..398a8299bf --- /dev/null +++ b/felamimail/setup/tables_update.inc.php @@ -0,0 +1,544 @@ +oProc->AddColumn('phpgw_felamimail_cache','to_name',array('type' => 'varchar', 'precision' => 120)); + $GLOBALS['egw_setup']->oProc->AddColumn('phpgw_felamimail_cache','to_address',array('type' => 'varchar', 'precision' => 120)); + + $GLOBALS['setup_info']['felamimail']['currentver'] = '0.8.3'; + return $GLOBALS['setup_info']['felamimail']['currentver']; + } + + $test[] = '0.8.3'; + function felamimail_upgrade0_8_3() + { + + $GLOBALS['egw_setup']->oProc->AddColumn('phpgw_felamimail_cache','attachments',array('type' => 'varchar', 'precision' => 120)); + + $GLOBALS['setup_info']['felamimail']['currentver'] = '0.8.4'; + return $GLOBALS['setup_info']['felamimail']['currentver']; + } + + $test[] = '0.8.4'; + function felamimail_upgrade0_8_4() + { + $GLOBALS['setup_info']['felamimail']['currentver'] = '0.9.0'; + return $GLOBALS['setup_info']['felamimail']['currentver']; + } + + $test[] = '0.9.0'; + function felamimail_upgrade0_9_0() + { + $GLOBALS['egw_setup']->oProc->AlterColumn('phpgw_felamimail_folderstatus', 'accountname', array('type' => 'varchar', 'precision' => 200, 'nullable' => false)); + $GLOBALS['egw_setup']->oProc->AlterColumn('phpgw_felamimail_cache', 'accountname', array('type' => 'varchar', 'precision' => 200, 'nullable' => false)); + + $GLOBALS['setup_info']['felamimail']['currentver'] = '0.9.1'; + return $GLOBALS['setup_info']['felamimail']['currentver']; + } + + $test[] = '0.9.1'; + function felamimail_upgrade0_9_1() + { + $GLOBALS['setup_info']['felamimail']['currentver'] = '0.9.2'; + return $GLOBALS['setup_info']['felamimail']['currentver']; + } + + $test[] = '0.9.2'; + function felamimail_upgrade0_9_2() + { + $GLOBALS['egw_setup']->oProc->CreateTable('phpgw_felamimail_displayfilter', + Array( + 'fd' => array( + 'accountid' => array('type' => 'int', 'precision' => 4, 'nullable' => false), + 'filter' => array('type' => 'text') + ), + 'pk' => array('accountid'), + 'fk' => array(), + 'ix' => array(), + 'uc' => array() + ) + + ); + + $GLOBALS['setup_info']['felamimail']['currentver'] = '0.9.3'; + return $GLOBALS['setup_info']['felamimail']['currentver']; + } + + $test[] = '0.9.3'; + function felamimail_upgrade0_9_3() + { + $GLOBALS['egw_setup']->oProc->DropTable('phpgw_felamimail_cache'); + $GLOBALS['egw_setup']->oProc->query('delete from phpgw_felamimail_folderstatus',__LINE__,__FILE__); + $GLOBALS['egw_setup']->oProc->CreateTable('phpgw_felamimail_cache', + Array( + 'fd' => array( + 'accountid' => array('type' => 'int', 'precision' => 4, 'nullable' => false), + 'hostname' => array('type' => 'varchar', 'precision' => 60, 'nullable' => false), + 'accountname' => array('type' => 'varchar', 'precision' => 200, 'nullable' => false), + 'foldername' => array('type' => 'varchar', 'precision' => 200, 'nullable' => false), + 'uid' => array('type' => 'int', 'precision' => 4, 'nullable' => false), + 'subject' => array('type' => 'text'), + 'striped_subject'=> array('type' => 'text'), + 'sender_name' => array('type' => 'varchar', 'precision' => 120), + 'sender_address'=> array('type' => 'varchar', 'precision' => 120), + 'to_name' => array('type' => 'varchar', 'precision' => 120), + 'to_address' => array('type' => 'varchar', 'precision' => 120), + 'date' => array('type' => 'varchar', 'precision' => 120), + 'size' => array('type' => 'int', 'precision' => 4), + 'attachments' => array('type' => 'varchar', 'precision' =>120) + ), + 'pk' => array('accountid','hostname','accountname','foldername','uid'), + 'fk' => array(), + 'ix' => array(), + 'uc' => array() + ) + ); + + $GLOBALS['setup_info']['felamimail']['currentver'] = '0.9.4'; + return $GLOBALS['setup_info']['felamimail']['currentver']; + } + + + + $test[] = '0.9.4'; + function felamimail_upgrade0_9_4() + { + $GLOBALS['egw_setup']->oProc->AlterColumn('phpgw_felamimail_cache','accountname',array( + 'type' => 'varchar', + 'precision' => '25', + 'nullable' => False + )); + $GLOBALS['egw_setup']->oProc->AlterColumn('phpgw_felamimail_cache','date',array( + 'type' => 'int', + 'precision' => '8' + )); + + $GLOBALS['setup_info']['felamimail']['currentver'] = '0.9.5'; + return $GLOBALS['setup_info']['felamimail']['currentver']; + } + + + $test[] = '0.9.5'; + function felamimail_upgrade0_9_5() + { + $GLOBALS['setup_info']['felamimail']['currentver'] = '1.0.0'; + return $GLOBALS['setup_info']['felamimail']['currentver']; + } + + + $test[] = '1.0.0'; + function felamimail_upgrade1_0_0() + { + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_cache','accountid','fmail_accountid'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_cache','hostname','fmail_hostname'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_cache','accountname','fmail_accountname'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_cache','foldername','fmail_foldername'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_cache','uid','fmail_uid'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_cache','subject','fmail_subject'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_cache','striped_subject','fmail_striped_subject'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_cache','sender_name','fmail_sender_name'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_cache','sender_address','fmail_sender_address'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_cache','to_name','fmail_to_name'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_cache','to_address','fmail_to_address'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_cache','date','fmail_date'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_cache','size','fmail_size'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_cache','attachments','fmail_attachments'); + + $GLOBALS['setup_info']['felamimail']['currentver'] = '1.0.0.001'; + return $GLOBALS['setup_info']['felamimail']['currentver']; + } + + + $test[] = '1.0.0.001'; + function felamimail_upgrade1_0_0_001() + { + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_folderstatus','accountid','fmail_accountid'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_folderstatus','hostname','fmail_hostname'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_folderstatus','accountname','fmail_accountname'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_folderstatus','foldername','fmail_foldername'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_folderstatus','messages','fmail_messages'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_folderstatus','recent','fmail_recent'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_folderstatus','unseen','fmail_unseen'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_folderstatus','uidnext','fmail_uidnext'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_folderstatus','uidvalidity','fmail_uidvalidity'); + + $GLOBALS['setup_info']['felamimail']['currentver'] = '1.0.0.002'; + return $GLOBALS['setup_info']['felamimail']['currentver']; + } + + + $test[] = '1.0.0.002'; + function felamimail_upgrade1_0_0_002() + { + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_displayfilter','accountid','fmail_filter_accountid'); + $GLOBALS['egw_setup']->oProc->RenameColumn('phpgw_felamimail_displayfilter','filter','fmail_filter_data'); + + $GLOBALS['setup_info']['felamimail']['currentver'] = '1.0.0.003'; + return $GLOBALS['setup_info']['felamimail']['currentver']; + } + + $test[] = '1.0.0.003'; + function felamimail_upgrade1_0_0_003() + { + $GLOBALS['egw_setup']->oProc->AlterColumn('phpgw_felamimail_cache', 'fmail_accountname', array('type' => 'varchar','precision' => '200','nullable' => False)); + + $GLOBALS['setup_info']['felamimail']['currentver'] = '1.0.0.004'; + return $GLOBALS['setup_info']['felamimail']['currentver']; + } + + + + $test[] = '1.0.0.004'; + function felamimail_upgrade1_0_0_004() + { + // index was to big for mysql with charset utf8 (max 1000byte = 333 utf8 chars) + $GLOBALS['egw_setup']->oProc->AlterColumn('phpgw_felamimail_cache','fmail_accountname',array( + 'type' => 'varchar', + 'precision' => '128', + 'nullable' => False + )); + $GLOBALS['egw_setup']->oProc->AlterColumn('phpgw_felamimail_cache','fmail_foldername',array( + 'type' => 'varchar', + 'precision' => '128', + 'nullable' => False + )); + + $GLOBALS['egw_setup']->oProc->RenameTable('phpgw_felamimail_cache','egw_felamimail_cache'); + + $GLOBALS['setup_info']['felamimail']['currentver'] = '1.0.0.005'; + return $GLOBALS['setup_info']['felamimail']['currentver']; + } + + + $test[] = '1.0.0.005'; + function felamimail_upgrade1_0_0_005() + { + // index was to big for mysql with charset utf8 (max 1000byte = 333 utf8 chars) + $GLOBALS['egw_setup']->oProc->AlterColumn('phpgw_felamimail_folderstatus','fmail_accountname',array( + 'type' => 'varchar', + 'precision' => '128', + 'nullable' => False + )); + $GLOBALS['egw_setup']->oProc->AlterColumn('phpgw_felamimail_folderstatus','fmail_foldername',array( + 'type' => 'varchar', + 'precision' => '128', + 'nullable' => False + )); + + $GLOBALS['egw_setup']->oProc->RenameTable('phpgw_felamimail_folderstatus','egw_felamimail_folderstatus'); + $GLOBALS['egw_setup']->oProc->RenameTable('phpgw_felamimail_displayfilter','egw_felamimail_displayfilter'); + + $GLOBALS['setup_info']['felamimail']['currentver'] = '1.0.0.006'; + return $GLOBALS['setup_info']['felamimail']['currentver']; + } + + + $test[] = '1.0.0.006'; + function felamimail_upgrade1_0_0_006() + { + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.2'; + } + + // next version should be 1.2.001 + + + $test[] = '1.2'; + function felamimail_upgrade1_2() + { + $GLOBALS['egw_setup']->oProc->CreateTable('fm_accounts',array( + 'fd' => array( + 'fm_owner' => array('type' => 'int','precision' => '4','nullable' => False), + 'fm_id' => array('type' => 'auto'), + 'fm_realname' => array('type' => 'varchar','precision' => '128'), + 'fm_organization' => array('type' => 'varchar','precision' => '128'), + 'fm_emailaddress' => array('type' => 'varchar','precision' => '128','nullable' => False), + 'fm_ic_hostname' => array('type' => 'varchar','precision' => '128','nullable' => False), + 'fm_ic_port' => array('type' => 'int','precision' => '4','nullable' => False), + 'fm_ic_username' => array('type' => 'varchar','precision' => '128','nullable' => False), + 'fm_ic_password' => array('type' => 'varchar','precision' => '128'), + 'fm_ic_encryption' => array('type' => 'bool','nullable' => False), + 'fm_og_hostname' => array('type' => 'varchar','precision' => '128','nullable' => False), + 'fm_og_port' => array('type' => 'int','precision' => '4','nullable' => False), + 'fm_og_smtpauth' => array('type' => 'bool','nullable' => False), + 'fm_og_username' => array('type' => 'varchar','precision' => '128'), + 'fm_og_password' => array('type' => 'varchar','precision' => '128') + ), + 'pk' => array('fm_id'), + 'fk' => array(), + 'ix' => array('fm_owner'), + 'uc' => array() + )); + + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.2.001'; + } + + + $test[] = '1.2.001'; + function felamimail_upgrade1_2_001() + { + $GLOBALS['egw_setup']->oProc->AddColumn('fm_accounts','fm_active',array( + 'type' => 'bool', + 'nullable' => False + )); + + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.2.002'; + } + + + $test[] = '1.2.002'; + function felamimail_upgrade1_2_002() + { + $GLOBALS['egw_setup']->oProc->AddColumn('fm_accounts','fm_validatecertificate',array( + 'type' => 'bool', + 'nullable' => False + )); + + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.2.003'; + } + + $test[] = '1.2.003'; + function felamimail_upgrade1_2_003() + { + $GLOBALS['egw_setup']->oProc->RenameColumn('fm_accounts','fm_validatecertificate','fm_ic_validatecertificate'); + + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.2.004'; + } + + $test[] = '1.2.004'; + function felamimail_upgrade1_2_004() + { + $GLOBALS['egw_setup']->oProc->query('delete from egw_felamimail_folderstatus',__LINE__,__FILE__); + + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.3.000'; + } + + $test[] = '1.3.000'; + function felamimail_upgrade1_3_000() + { + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_felamimail_cache','fmail_sender_name',array( + 'type' => 'varchar', + 'precision' => '256' + )); + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_felamimail_cache','fmail_sender_address',array( + 'type' => 'varchar', + 'precision' => '256' + )); + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_felamimail_cache','fmail_to_name',array( + 'type' => 'varchar', + 'precision' => '256' + )); + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_felamimail_cache','fmail_to_address',array( + 'type' => 'varchar', + 'precision' => '256' + )); + + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.3.001'; + } + + $test[] = '1.3.001'; + function felamimail_upgrade1_3_001() + { + $GLOBALS['egw_setup']->oProc->RenameTable('fm_accounts','egw_felamimail_accounts'); + + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.3.002'; + } + + + $test[] = '1.3.002'; + function felamimail_upgrade1_3_002() + { + $GLOBALS['egw_setup']->oProc->CreateTable('egw_felamimail_signatures',array( + 'fd' => array( + 'fm_signatureid' => array('type' => 'auto'), + 'fm_accountid' => array('type' => 'int','precision' => '11'), + 'fm_signature' => array('type' => 'text'), + 'fm_description' => array('type' => 'varchar','precision' => '255') + ), + 'pk' => array('fm_signatureid'), + 'fk' => array(), + 'ix' => array(), + 'uc' => array(array('fm_signatureid','fm_accountid')) + )); + + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.3.003'; + } + + + $test[] = '1.3.003'; + function felamimail_upgrade1_3_003() + { + #$GLOBALS['egw_setup']->oProc->AlterColumn('egw_felamimail_accounts','fm_ic_encryption',array( + # 'type' => 'int', + # 'precision' => '4', + # 'nullable' => False + #)); + + $GLOBALS['egw_setup']->oProc->RefreshTable('egw_felamimail_accounts',array( + 'fd' => array( + 'fm_owner' => array('type' => 'int','precision' => '4','nullable' => False), + 'fm_id' => array('type' => 'auto'), + 'fm_realname' => array('type' => 'varchar','precision' => '128'), + 'fm_organization' => array('type' => 'varchar','precision' => '128'), + 'fm_emailaddress' => array('type' => 'varchar','precision' => '128','nullable' => False), + 'fm_ic_hostname' => array('type' => 'varchar','precision' => '128','nullable' => False), + 'fm_ic_port' => array('type' => 'int','precision' => '4','nullable' => False), + 'fm_ic_username' => array('type' => 'varchar','precision' => '128','nullable' => False), + 'fm_ic_password' => array('type' => 'varchar','precision' => '128'), + 'fm_ic_encryption' => array('type' => 'int','precision' => '4'), + 'fm_og_hostname' => array('type' => 'varchar','precision' => '128','nullable' => False), + 'fm_og_port' => array('type' => 'int','precision' => '4','nullable' => False), + 'fm_og_smtpauth' => array('type' => 'bool','nullable' => False), + 'fm_og_username' => array('type' => 'varchar','precision' => '128'), + 'fm_og_password' => array('type' => 'varchar','precision' => '128'), + 'fm_active' => array('type' => 'bool','nullable' => False), + 'fm_ic_validatecertificate' => array('type' => 'bool','nullable' => False), + ), + 'pk' => array('fm_id'), + 'fk' => array(), + 'ix' => array('fm_owner'), + 'uc' => array() + ), array( + 'fm_ic_encryption' => "CASE WHEN fm_ic_encryption THEN 1 ELSE 0 END", + ) + ); + + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.3.004'; + } + + + $test[] = '1.3.004'; + function felamimail_upgrade1_3_004() + { + $GLOBALS['egw_setup']->oProc->AddColumn('egw_felamimail_signatures','fm_defaultsignature',array( + 'type' => 'bool' + )); + + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.3.005'; + } + + + $test[] = '1.3.005'; + function felamimail_upgrade1_3_005() + { + $GLOBALS['egw_setup']->oProc->AddColumn('egw_felamimail_accounts','fm_ic_enable_sieve',array( + 'type' => 'bool', + 'precision' => '255' + )); + $GLOBALS['egw_setup']->oProc->AddColumn('egw_felamimail_accounts','fm_ic_sieve_server',array( + 'type' => 'varchar', + 'precision' => '128' + )); + $GLOBALS['egw_setup']->oProc->AddColumn('egw_felamimail_accounts','fm_ic_sieve_port',array( + 'type' => 'int', + 'precision' => '4' + )); + + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.3.006'; + } + + + $test[] = '1.3.006'; + function felamimail_upgrade1_3_006() + { + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.4'; + } + + $test[] = '1.4'; + function felamimail_upgrade1_4() + { + $GLOBALS['egw_setup']->oProc->DropTable('egw_felamimail_cache'); + $GLOBALS['egw_setup']->oProc->DropTable('egw_felamimail_displayfilter'); + $GLOBALS['egw_setup']->oProc->DropTable('egw_felamimail_folderstatus'); + $GLOBALS['egw_setup']->oProc->AddColumn('egw_felamimail_accounts','fm_signatureid',array( + 'type' => 'int', + 'precision' => '4' + )); + + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.5.001'; + } + + $test[] = '1.5.001'; + function felamimail_upgrade1_5_001() + { + + $GLOBALS['egw_setup']->oProc->CreateTable('egw_felamimail_displayfilter', + Array( + 'fd' => array( + 'fmail_filter_accountid' => array('type' => 'int', 'precision' => 4, 'nullable' => false), + 'fmail_filter_data' => array('type' => 'text') + ), + 'pk' => array('fmail_filter_accountid'), + 'fk' => array(), + 'ix' => array(), + 'uc' => array() + ) + ); + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.5.002'; + } + + $test[] = '1.5.002'; + function felamimail_upgrade1_5_002() + { + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_felamimail_accounts','fm_ic_encryption',array( + 'type' => 'int', + 'precision' => '4', + )); + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_felamimail_accounts','fm_ic_hostname',array( + 'type' => 'varchar', + 'precision' => '128', + )); + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_felamimail_accounts','fm_ic_port',array( + 'type' => 'int', + 'precision' => '4', + )); + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_felamimail_accounts','fm_ic_username',array( + 'type' => 'varchar', + 'precision' => '128', + )); + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_felamimail_accounts','fm_ic_validatecertificate',array( + 'type' => 'bool', + )); + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_felamimail_accounts','fm_og_hostname',array( + 'type' => 'varchar', + 'precision' => '128', + )); + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_felamimail_accounts','fm_og_port',array( + 'type' => 'int', + 'precision' => '4', + )); + $GLOBALS['egw_setup']->oProc->AlterColumn('egw_felamimail_accounts','fm_og_smtpauth',array( + 'type' => 'bool', + )); + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.5.003'; + } + + $test[] = '1.5.003'; + function felamimail_upgrade1_5_003() + { + $GLOBALS['egw_setup']->oProc->AddColumn('egw_felamimail_accounts','fm_ic_folderstoshowinhome', array('type' => 'text')); + $GLOBALS['egw_setup']->oProc->AddColumn('egw_felamimail_accounts','fm_ic_sentfolder', array('type' => 'varchar','precision' => '128')); + $GLOBALS['egw_setup']->oProc->AddColumn('egw_felamimail_accounts','fm_ic_trashfolder', array('type' => 'varchar','precision' => '128')); + $GLOBALS['egw_setup']->oProc->AddColumn('egw_felamimail_accounts','fm_ic_draftfolder', array('type' => 'varchar','precision' => '128')); + $GLOBALS['egw_setup']->oProc->AddColumn('egw_felamimail_accounts','fm_ic_templatefolder', array('type' => 'varchar','precision' => '128')); + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.6.001'; + } + + $test[] = '1.6.001'; + function felamimail_upgrade1_6_001() + { + // no real changes here + return $GLOBALS['setup_info']['felamimail']['currentver'] = '1.7.001'; + } +?> diff --git a/felamimail/smartsieve-NOTICE b/felamimail/smartsieve-NOTICE new file mode 100644 index 0000000000..c5ec127049 --- /dev/null +++ b/felamimail/smartsieve-NOTICE @@ -0,0 +1,19 @@ +SMARTSIEVE - SIEVE SCRIPT MANAGER +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Copyright 2002 Stephen Grier + +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 + diff --git a/felamimail/templates/default/app.css b/felamimail/templates/default/app.css new file mode 100644 index 0000000000..dad796313a --- /dev/null +++ b/felamimail/templates/default/app.css @@ -0,0 +1,507 @@ +th.activetab +{ + color:#000000; + background-color:#D3DCE3; + border-top : 1px solid Silver; + border-left : 1px solid Silver; + border-right : 1px solid Silver; +} + +th.inactivetab +{ + color:#000000; + background-color:#E8F0F0; + border-bottom : 1px solid Silver; +} + +.td_left +{ + border-left : 1px solid Gray; + border-top : 1px solid Gray; +} + +.input_text { + border : 1px solid Silver; +} + +.td_right +{ + border-right : 1px solid Gray; + border-top : 1px solid Gray; +} + +.text_small { font-size: 10px; } +.text_small_bold { font-size: 10px; font-weight : bold; } + +div.activetab{ display:inline; } +div.inactivetab{ display:none; } + +.quoted1 { color:#660066; } +.quoted2 { color:#007777; } +.quoted3 { color:#990000; } +.quoted4 { color:#000099; } +.quoted5 { color:#bb6600; } + + +TR.header_row_ { + FONT-SIZE: 11px; + height : 20px; + padding: 0; + font-weight : bold; + background : White; + white-space: nowrap; +} + +A.header_row_ { + FONT-SIZE: 11px; + height : 14px; + padding: 0; + font-weight : bold; +} + +TR.header_row_D { + FONT-SIZE: 11px; + height : 20px; + padding: 0; + color: silver; + text-decoration : line-through; + background : White; + white-space: nowrap; +} + +A.header_row_D { + FONT-SIZE: 11px; + height : 14px; + padding: 0; + color: silver; + text-decoration : line-through; + font-weight : bold; +} + +TR.header_row_F { + color: red; + FONT-SIZE: 11px; + height : 20px; + padding: 0; + font-weight : bold; + background : White; + white-space: nowrap; +} + +A.header_row_F { + color: red; + FONT-SIZE: 11px; + height : 14px; + padding: 0; + font-weight : bold; +} + + +TR.header_row_FS { + color: red; + FONT-SIZE: 11px; + height : 20px; + padding: 0; + background : White; + white-space: nowrap; +} + +A.header_row_FS { + color: red; + FONT-SIZE: 11px; + height : 14px; + padding: 0; +} +TR.header_row_R { + FONT-SIZE: 11px; + height : 20px; + padding: 0; + font-weight : bold; + background : White; + white-space: nowrap; +} + +A.header_row_R { + FONT-SIZE: 11px; + height : 14px; + padding: 0; + font-weight : bold; +} + +TR.header_row_S { + FONT-SIZE: 11px; + height : 20px; + padding: 0; + background : White; + white-space: nowrap; +} + +A.header_row_S { + FONT-SIZE: 11px; + height : 14px; + padding: 0; +} + +TR.header_row_DS, TR.header_row_ADS +{ + FONT-SIZE: 11px; + height : 20px; + padding: 0; + color: silver; + text-decoration : line-through; + background : White; + white-space: nowrap; +} + +A.header_row_DS, A.header_row_ADS +{ + FONT-SIZE: 11px; + height : 14px; + padding: 0; + color: silver; + text-decoration : line-through; +} + +TR.header_row_RS +{ + FONT-SIZE: 11px; + height : 20px; + padding: 0; + background : White; + white-space: nowrap; +} + +A.header_row_RS +{ + FONT-SIZE: 11px; + height : 14px; + padding: 0; +} + +TR.header_row_AS,TR.header_row_RAS +{ + FONT-SIZE: 11px; + height : 20px; + padding: 0; + background : White; + white-space: nowrap; +} + +A.header_row_AS, A.header_row_RAS +{ + FONT-SIZE: 11px; + height : 14px; + padding: 0; +} + +TR.header_row_FAS, TR.header_row_FS +{ + color: red; + FONT-SIZE: 11px; + height : 20px; + padding: 0; + background : White; + white-space: nowrap; +} + +A.header_row_FAS, A.header_row_FS +{ + color: red; + FONT-SIZE: 11px; + height : 14px; + padding: 0; +} + +.subjectBold +{ + FONT-SIZE: 12px; + font-weight : bold; + font-family : Arial; +} + +.subject +{ + FONT-SIZE: 12px; + font-family : Arial; +} + +.body +{ + FONT-SIZE: 12px; + font-family : Arial; +} + +TR.sieveRowActive +{ + FONT-SIZE: 11px; + height : 20px; + padding: 0; + background : White; +} + +A.sieveRowActive +{ + FONT-SIZE: 11px; + height : 14px; + padding: 0; +} + +TR.sieveRowInActive +{ + FONT-SIZE: 11px; + height : 20px; + padding: 0; + background : White; + color: Silver; +} + +A.sieveRowInActive +{ + FONT-SIZE: 11px; + height : 14px; + padding: 0; + color: Silver; +} + + +.dtree { + font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; + font-size: 11px; + color: #666; + white-space: nowrap; +} +.dtree img { + border: 0px; + vertical-align: middle; +} +.dtree a { + color: #333; + text-decoration: none; +} +.dtree a.node, .dtree a.nodeSel { + white-space: nowrap; + padding: 1px 2px 1px 2px; +} +.dtree a.node:hover, .dtree a.nodeSel:hover { + color: #333; + text-decoration: underline; +} +.dtree a.nodeSel { + background-color: #c0d2ec; +} +.dtree .clip { + overflow: hidden; +} +.dtree table, .dtree tr, .dtree td { + border: none; +} +tr.navbarBackground { + background-color:#dddddd; +} + +div.parentDIV { + background-color:#dddddd; + position: relative; + top: 0px; + left: 0px; +} + +div.navButton { + background-color:#dddddd; + float:left; + padding: 2px; + margin: 2px; + border: solid #dddddd 1px; +} + +div.navButton:hover, div.navButtonHover { + background-color:#eeeeee; + float:left; + padding: 2px; + margin: 2px; + border: solid white 1px; + border-right: solid black 1px; + border-bottom: solid black 1px; + position: relative; +} + +div.navButton:active, div.navButtonActive { + background-color:#dddddd; + float:left; + padding: 2px; + margin: 2px; + border: solid white 1px; + border-left: solid black 1px; + border-top: solid black 1px; + position: relative; +} + +div.navSeparator { + background-color:#dddddd; + float:left; + padding: 0px; + margin: 2px; + border: solid silver 1px; + height:24px; + position: relative; +} + +div.inactiveResultRow { + background-color: white; + text-align: left; +} + +div.activeResultRow { + background-color: silver; + text-align: left; +} + +div.resultBoxHidden { + width: 450px; + position: absolute; + display: none; +} + +div.resultBoxVisible { + border: solid 1px black; + width: 450px; + position: absolute; + display: block; + background: white; +} + +button.menuButton { + float:left; + padding: 2px; + margin: 2px; + border: solid #dddddd 1px; + position: relative; + height: 25px; + width: 26px; + background-color:#dddddd; +} + +button.menuButton:hover { + background-color:#eeeeee; + float:left; + padding: 2px; + margin: 2px; + border: solid white 1px; + border-right: solid black 1px; + border-bottom: solid black 1px; + position: relative; + height: 25px; + width: 26px; +} + +button.menuButton:active { + background-color:#dddddd; + float:left; + padding: 2px; + margin: 2px; + border: solid white 1px; + border-left: solid black 1px; + border-top: solid black 1px; + position: relative; +} + +fieldset.bordertop { + border-left:0px; + border-right:0px; + border-bottom:0px; + border-top:1px solid silver; +} + +TD.mainscreenRow { + border-bottom:1px solid #CCCCEE; +} + +DIV.divButton { + width:16px; + height:16px; + border: 0px solid red; + background-repeat:no-repeat; + background-position: center center; +} + +#navbarDIV { + position:absolute; + top:0px; + height:30px; + left:0px; + right:0px; + border: solid white 1px; + border-right: solid black 1px; + border-bottom: solid black 1px; +} + +#subjectDIV { + position:absolute; + background-color:#ffffff; + top:32px; + height:20px; + width:100%; + font-weight:bold; + text-align:left; + line-height:20px; +} + +#headerDIV { + position:absolute; + background-color:#efefdf; + top:52px; + height:80px; + left:0px; + right:0px; + border-top: 1px solid silver; + border-bottom: 1px solid silver; + overflow:hidden; +} + +.bodyDIV { + position:absolute; + background-color:white; + top:134px; + bottom:0px; + width:100%; + border-top: 1px solid #efefdf; +} + +.bodyDIVAttachment { + bottom:80px; +} + +#messageIFRAME { + width:100%; + border:0px solid black; + height:100%; +} + +#attachmentDIV { + position:absolute; + background-color:#efefdf; + bottom:0px; + height:80px; + width:100%; + border-top: 1px solid silver; + overflow:auto; +} +/* +* new dialog style definitions +*/ +#contentdialog {padding:20px} +#dialog {position:absolute; width:425px; padding:10px; z-index:200; background:#fff} +#dialog-header {display:block; position:relative; width:411px; padding:3px 6px 7px; height:14px; font-size:14px; font-weight:bold} +#dialog-title {float:left} +#dialog-close {float:right; cursor:pointer; margin:3px 3px 0 0; height:11px; width:11px; background:url(images/dialog_close.gif) no-repeat} +#dialog-content {display:block; height:160px; padding:6px; color:#666666; font-size:13px} +#dialog-mask {position:absolute; top:0; left:0; min-height:100%; width:100%; background:#FFF; opacity:.75; filter:alpha(opacity=75); z-index:100} +.error {background:#fff url(images/error_bg.jpg) bottom right no-repeat; border:1px solid #924949; border-top:none} +.errorheader {background:url(images/error_header.gif) repeat-x; color:#6f2c2c; border:1px solid #924949; border-bottom:none} +.warning {background:#fff url(images/warning_bg.jpg) bottom right no-repeat; border:1px solid #c5a524; border-top:none} +.warningheader {background:url(images/warning_header.gif) repeat-x; color:#957c17; border:1px solid #c5a524; border-bottom:none} +.success {background:#fff url(images/success_bg.jpg) bottom right no-repeat; border:1px solid #60a174; border-top:none} +.successheader {background:url(images/success_header.gif) repeat-x; color:#3c7f51; border:1px solid #60a174; border-bottom:none} +.prompt {background:#fff url(images/prompt_bg.jpg) bottom right no-repeat; border:1px solid #4f6d81; border-top:none} +.promptheader {background:url(images/prompt_header.gif) repeat-x; color:#355468; border:1px solid #4f6d81; border-bottom:none} + diff --git a/felamimail/templates/default/composeForm.tpl b/felamimail/templates/default/composeForm.tpl new file mode 100644 index 0000000000..dd0d9d02af --- /dev/null +++ b/felamimail/templates/default/composeForm.tpl @@ -0,0 +1,266 @@ + + +

    +
    + + + + + + + +
    + + + + + + +
    + {lang_identity} + + {select_from} + +   +
    + +
    +{destinationRows}
    +
    + + + + + + + +
    + {lang_subject} + + + +   +
    +
    + + + + + + + + +
    +  
    +
    + {errorInfo}
    +
    + + + {tinymce} + + + + +
    +
    {lang_signature}/{lang_stationery}/{lang_editormode} + {select_signature}   {select_stationery}   {toggle_editormode} + +
    +
    + + + +
    + +
    + + + + + +
    {lang_attachments} +
    + +{attachment_rows} +
    +
    +
    + +
    +
    + + + + + + {name} + + + {type} + + + {size} + + + + + + + + + + + {name} + + + {type} + + + {size} + + + + + + + + + + + {select_destination} + + + + + +
    + + + + +
    +
    + + + + + + + + + + +
    +   +
    + +
    + {lang_max_uploadsize}: {max_uploadsize} +
    +
    +
    + + diff --git a/felamimail/templates/default/config.tpl b/felamimail/templates/default/config.tpl new file mode 100644 index 0000000000..a922af39f3 --- /dev/null +++ b/felamimail/templates/default/config.tpl @@ -0,0 +1,136 @@ + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
     {title}
     
     {lang_Mail_settings}
    {lang_Enter_your_IMAP_mail_server_hostname_or_IP_address}:
    {lang_Select_your_mail_server_type}: + +
    IMAP server type: + +
    {lang_Enter_your_default_mail_domain_(_From:_user@domain_)}:
    {lang_Mail_server_login_type}: + +
    {lang_Users_can_define_their_own_emailaccounts}: + +
    {lang_Organization_name}:
     
     {lang_SMTP_settings}
    {lang_Enter_your_SMTP_server_hostname_or_IP_address}:
    {lang_Enter_your_SMTP_server_port}:
    {lang_Use_SMTP_auth}: + +
     
     {lang_Sieve_settings}
    {lang_Enter_your_SIEVE_server_hostname_or_IP_address}:
    {lang_Enter_your_SIEVE_server_port}:
    +  +
    + + +
    +
    + diff --git a/felamimail/templates/default/edit_account_data.tpl b/felamimail/templates/default/edit_account_data.tpl new file mode 100644 index 0000000000..c298b8fdfc --- /dev/null +++ b/felamimail/templates/default/edit_account_data.tpl @@ -0,0 +1,270 @@ + + + +
    +
    {message}
    +
    + +
    {lang_identity} {accountID} + + + + + + + + + + + + + + + + + + +
    + {lang_name} + + +
    + {lang_organization} + + +
    + {lang_emailaddress} + + +
    + {lang_signature} + + {identity_selectbox} +
    +
    + +
    +{lang_use_costum_settings} +
    + + + + + + +
    {lang_incoming_server}{lang_folder_settings}
    +
    +
    {lang_incoming_server} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + {hostname_address} + + +
    + {lang_port} + + +
    + {lang_username} + + +
    + {lang_password} + + +
    + {lang_encrypted_connection} + + STARTTLS + TLS + SSL + {lang_no_encryption} +
    + {lang_do_not_validate_certificate} + + +
    + {lang_server_supports_sieve} + + +
    + {lang_port} + + +
    +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + +
    + {lang_folder_to_appear_on_main_screen} + + {folder_selectbox} +
    + {lang_trash_folder} + + {trash_selectbox} +
    + {lang_sent_folder} + + {sent_selectbox} +
    + {lang_draft_folder} + + {draft_selectbox} +
    + {lang_template_folder} + + {template_selectbox} +
    +
    +
    + +
    {lang_outgoing_server} + + + + + + + + + + + + + + + + + + + + + +
    + {hostname_address} + + +
    + {lang_port} + + +
    + {auth_required} + + +
    + {lang_username} + + +
    + {lang_password} + + +
    +
    + + + + + +
    + + + +
    + +
    + diff --git a/felamimail/templates/default/edit_forwarding_address.tpl b/felamimail/templates/default/edit_forwarding_address.tpl new file mode 100644 index 0000000000..e276bac59f --- /dev/null +++ b/felamimail/templates/default/edit_forwarding_address.tpl @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + +
    + {lang_edit_forwarding_address} +
    + {lang_forwarding_address} + + +
    + {lang_keep_local_copy} + + +
    +   +
    + + +
    + + diff --git a/felamimail/templates/default/filterForm.tpl b/felamimail/templates/default/filterForm.tpl new file mode 100644 index 0000000000..6366b3165f --- /dev/null +++ b/felamimail/templates/default/filterForm.tpl @@ -0,0 +1,116 @@ + + + + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + {lang_filter_name}: + + +
    + {lang_from}: + + +
    + {lang_to}: + + +
    + {lang_subject}: + + +
    +   +
    + {lang_new_filter} + + +
    + + +
    + + + + + + + + +{filterrows} +
    + {lang_no_filter} + + {lang_activate} + +   + +   +
    + +
    + + + + + + + + {filtername} + + + {lang_activate} + + + {lang_delete} + + + {lang_edit} + + + \ No newline at end of file diff --git a/felamimail/templates/default/images/Read.png b/felamimail/templates/default/images/Read.png new file mode 100644 index 0000000000000000000000000000000000000000..8314163b08a8202cf5e36347e93f446992022932 GIT binary patch literal 961 zcmV;y13vtTP)lE%h%T1<>%?` z1P>zy5hMo^CJ7WL2@@tgLrw=0B*DnkxW33xS79+bNr8-;&C}b$#mVUF?{|ZejhLm3 zm!zDgvX`K%&eq_~(%3RSOffx5Vs3n8aei}vj)9Jxgpi(tkDZ5;p^BEHh?Jp~p|7d4 zzOT5#$I#l-+vLE;%`Q4dW^;gMa(-lQdUu48gp#0Wa(s!Ep_8Aht+~aUrm=Ki!OIBZJbbon= zlYEMnevFukm!i|&=a`UWNd+sm|bRV zo~pBsn4o@#j+vvY$+9;`;o$S}@&Et;!j|~}00001bW%=J06^y0W&i*H0b)x> zM7P}lJ7)j@02XvbSaefwW^{L9a%BK#X=XBTZf77eE;KGOqh3c20003PNklJV+pXJZdhD+NMv1c*My}j3vzr#c|n5B%qkkvQc}|D jlB$wY;;h?cDRnsj6lqMdPyb3L00000NkvXXu0mjfH4f$d literal 0 HcmV?d00001 diff --git a/felamimail/templates/default/images/Replied.png b/felamimail/templates/default/images/Replied.png new file mode 100644 index 0000000000000000000000000000000000000000..757f90582c63cc0e57e9205f6913a5edad7ab050 GIT binary patch literal 1427 zcmV;E1#J3>P)9DiA00IZi(b}@LykTT&y1=ZkwKP3PjhUx~keqvjj%;*&a(aWHsy~dN7pvceHzQoH} zX?lK$l5%^5o20FdmY%%D&bh+N-R14LzQpnL_fA@6dWe;9d4aRQ%zliRtG&#So~o6g zsj9WUueG}C@%D6$p=EZ1owCBDx5kE*p{%>czR1vQh?|zHxm#v#Vr_M$tg+eR=)%d) z+uq=;z|Ew($E~-$;N<4E!p22VP_eze@$&Moy1AaGrKPHr*Miwka7&TNKJXR=6WH%y9 z05WRZN7wu56fq+0HA}jy^WLa4>7#Z>L@#^a8ME|7+^2GoE02XvbSaefwW^{L9a%BK#X=XBTZf77eE;KGOqh3c20006K zNklZs@@vf_irFewb?Tar#{0B=HEnl&6^_p!v z)_!Lo4y0t~WX2-#b7oGjOGM&lH+5FSox{LT(lev8H7^6kRTQb{?XHcJSAg;z0~jh> z3KQ(*p?vdyejMrIMjFCUzV|;V2NnDO4yIrpBRZ$`i={fV~PwuX( z!6scev2n_zrfHpR^?5Z}74aDI(d857&Yj%V-q2E%&M9h*B4@1~tjLz!*wWBZSHa9` zq|PIZBCTwm9OI^BY+YQH>KUeErYRwZB5i1{mSF7atj8swq80LAz*!ba+W5(nmycfC ziRtROTUZ)-gxmUCe!cec?rW$t)1AG`4*&7-iE@eb3G#LE4GQGHabWx5Z*b|Ii}#&7 zdg<8lP000{Z0{{R4$@t{V0008|P)t-sz`(!& z01W^D3IG5C^Yiuc^7Gl+@@;X2=WxWUoa=4EVrprfk1!ONST zq_)1yrmC^r;O8teK6rhF&(+_yxxR#tpTWn_e}jpmr>$yqfqH+2g^H1Yg^a|?(w(5B z01FsIOH_-NqoJs=dw_;|e}&Q6;{Xd63Kk;`872=KC=eVe5gjU2UTJ=dnQV1`hmxL| zrLvHlr*3t9j+URUx51yMu)4#|w!Ov7)7uLeB@G%UevF!cj+|(7erU1x4zX>g95 zriGE2fs2xPf{2-;s-&*9&eht$#>#_{nrU%%=k-Eb5w0TXoXCSoqVdjm{XwyN`(zTatv9Z5p2F0aK#&Jz8X4a4sO34 zIb#ntTn=-`A9>Cqd(S0-*eGwgBtK^sh1oBL+c1aPG(l(?jpH|r;5U%sJ#eovM{OUV z_DE%yGEH+PSAH(8{9iUrAGiN*fwE7t^KM>%J6(S}yZ(1eWii74fq9-$$N!3BfJM6P zhsE-jafw*Q?w)LZS(K}NnXiMIuZ4h-Z;_*avBICEw3PAn?dUe)P-NNP8(2a(SoE!zsD43F)M z22vAw)E$9TcR-6A18(s0-My7?&euyHPwbup)N-g4MH0usl2o;vg|Q zeLa19JrzF&(!lN8TQ#ar*W5 z8|UY(!IXJ><>`ZSM;2^A6Ml2~_=WqA@0>ieW7X`LcabEzLp-a{v#Ws;tQ9lQ2v#WC(JfuaW}V(dwiUMCPJo&MZ&GjjE}=A z$N6V*uC4}LrZV_vo2PA%g-6GP-a1n$y+F8(YE-GKnTtzWRf>^=iE*s9KU_vgTtm}G nQ&Ur3US31qPf;cmf1m&Wh#rT#32p`G00000NkvXXu0mjfjJJ5G literal 0 HcmV?d00001 diff --git a/felamimail/templates/default/images/attach.png b/felamimail/templates/default/images/attach.png new file mode 100755 index 0000000000000000000000000000000000000000..97ad911c896f224b3fb4bc19c7d274a940b3cddd GIT binary patch literal 528 zcmV+r0`L8aP)7XtSwhq!d zNF9pcrlXTmq4cd^-fG(0BJ0=lI1h~qC#G4jl81umN> z%RW-6JwQSmVh-#j#Z4s4A~MCkS@#d5xPa<0q`1WEu>q=!#P}Rz4*)+=y#Y+J`+g0; z(YQ5)hB~F6;?T7=w(1#bLnMoL2%Gm3R@h;bT~!&G-H(EarU zksqXV2htiEt|MXCF?w@@5F#2T2*oPFpClB+7`wutw}FHv8ZM*qfznS{p4R&$St9B~ z;55cI(RhZax7k_WMU-V!H*uBUq}0g(SlaJ_mt0)!5aTq?trKH|B40%0Gf)QvFm}t8 zDDP02A?iVlZ4ttEtlNWi>%`awQ#JpsJilxy{RlpvqsXfa@-F>9(C^jo`O&{|7}B$T SXcf8u0000!lvI6;RN#5=* z4F5rJ!QSPQfg+swZf?au8Uz>_4jZ=j0~wqJ9+5ynZb1-ctWSxb2oz*5@$_|Nzr@HW zpvxQLdK8qXij)R^#MrO!b@ zCG%>=S)Rg5*9-*%r|3r}x&1#|BmHCXlO^@LPwYQ3YkfnU&2|%}{r!(Q4s6S1NQwOR zW$ts!(pcsREd}?#pZVNl*tRXV@Z83A+UG29Z96J)*nsEbjcZX`uVq~?tqNIlZ@t3r zXUj6@soBZ#PfPu|ZRIMhu0;v6)Eag(L`_S5WBBpj;#KimJ2q7B{m$?`Bvi2T|5@cd z*B6=#3Uc-;*0ea~f6DCOvpkfpdAT_-B($C>X|IaG95u^elj(7Dl$7%K-}{y_`89ZJ6T-G@yGywn+!j=U9 literal 0 HcmV?d00001 diff --git a/felamimail/templates/default/images/dialog_close.gif b/felamimail/templates/default/images/dialog_close.gif new file mode 100644 index 0000000000000000000000000000000000000000..31292f8e4c8b5c6daec7b47afa45cbd1771aa788 GIT binary patch literal 64 zcmZ?wbhEHbv{9L1R56@PFNMTY&T~}CU-)GP)dzn^Gt`HMXvozjN9gD6}JO*6A3otc&7uE zGL{7S1v5B2yO9Ruh?TfTlmzFem6RtIr81;vrWqCFr7IZendliUj&tXOsc_EE%}vcK zVem~%NmVG%EXh!C_w)^@OO>4pRKb$&=>{^Gt0wYoFpxI$ba4!+xRspX!1$?vA%&ak z!{?8iJ{A-kHdU;dBlG6Xn;ZqRDeS4u6*^}O%qARfNoe*-Il#}L@6FuuNXe`B`t&A z5ke>=QV5Aep;5vhP-ygyZGfwY$c`PDZAkqM2poYx38BQ$XfY{KQPIES|M$aI3xGiZ znLs8Cf&riy2n+++Y6UI=01SXZAP|t~Uw|M$eo!G47y}dkjc)G{C=8Ae2OuzTMwYV{{|4^!SwIUux z39oX^E^R*8+`F)wdaO>}C*TC<1Z~V|J&W)%_$z0~W`q>o?e|9WYGX2fF>O7Tr>I(N z>XSFUL4NbN>Z^^D{~J`;g-?~0h7x$jiq*&X_vFgJe%Ge^s!!5a#MWMX)hn5OcSzgZ z+s)c*$@FllYORu0v8Z<}G%EZ@>Ri^zL1tfL)pnZs~s+K zYYAdY%dUR?G(f(s>%ET9uhq}xj5nwGF2hbNm1w#^iI$jFq3JiC*plO`zXjO+UeFk5 z3uk?%3n?}RP=-iwV!k-aER{{hw(V&M`8+D7*yxu{*YjVJYmKei7}&3E-4!aP&4!=S zk~yVEsq-z(JmzJ%0vJ1)RbgM%?=g2uR%ZIBZ;3 zZnCs;@_AB!UGbydG@D78@Ot$K^5Le?BiZ~3pM!@Ikye_$2L=8v#U28V zX6DYa>FlcD^64rSUq{3Jk_H(c#)D%CybEh<=s`ieTwr-YC3{#>-k?_G)?0|AMv#K_ z>`ZlkUF1~_WHsY(1tOz-T#&MOI;kUj#Kx3j$m6r~0Zk;)!RQvK9-9i?_MG*20YW!E;$!WUo8JQXY_kVYxT@ zzMa8?faXb2vm;=sR`H51y{#E{Ct@Xfe)YQ5KUns1*OZ0zVfxzY=ycpZ-Tn|aa%i=`5CN1ubrAb%X_EaJC2)N5FowWF(BjaY}gYbO%>sR82qyc(eb zRIb@C@yS6>%;u9`n){_!Q-04oIJEXJ!-+TPyay<0SNJWLii&+I9yZ4O zVx~lys>pIHodL6kR>~%De4gn<+;Q@f+^?`Wdt>pqWfHS)nd33C&|Nn~t}kw`+1#7H zI&>k~thr{=l+;(VY8o*aP0r2Y8F;tQ?5`$J}J zMKyR=(E7q4FHPl%5xIm+%;LbS|Jx7BDBAQPVGr&+@OcEwEA>ku3H!B z>XWr`QG}eid)#h)n1mAnD+m)IjMt~?DDMidS)O<0_b0Imc!P(>S3}(IE9cymp7*=k zowyddR{U$mg@%=T^}^Egu3^-n8Sb@waTNk_vaS(TdG67AtCdThvwF?j$p~#yN5rbk z=;SMMY0GaK`gn5wr4s)+l@sw%k+p?P%tKJNiNuc#PkRXxuB*%xpMGuE#O3?#$V9}6 z{dST$L;AJtao+ZwaD`8WC3UacHIuQ5fu=nOhokro$w7L&WzdVDkEaXAhfOzH#R?u| zuQ5mWrj$L7fJSTbMoW{@EA^EeZuccbsMi*dcu*eNfj6v|5nA-u?f6{Y0PnK2Rb_O^7O;FdFkY$J z*eQGMT-uo};A_vKg)WEh#>))a(`iOMKq^6C30O|?0#ZdeYc0~Cg9&@+SX%uvF0814 zw-idiIt4Qva{PJ|GytgRS<1lCGt*KhQbem21?RctIgDh42%0BBB8xLWleusAO^7Qx zoqgey{$WGie@Q8Fs(%$-#^bQGTqDWbWvJv-;vwe>wFF4+cVf;)`VkRV(U~T=rgc|7jble8ONeX%;T_4P&5gws7f$Pan5fd$ z2pQK)w)MUfRmvsA5qKQ6IHJp=mYRQ`?w=$gg?@G{MZ>rh(T&wdrv`)n1K1gMzLQ@t zhuE_~_m9t>RLTwVeD_{KS|=#^^Awj#t#E`UJD2TfT~cQ^1O z6P=$LBJ9i^jE>7f;I2N@?8Fjb32~H`ySpq#r%++EzcRt?T2JHWsl7OM0o&tBA6#IN zypILRcTI}}umXc`-LkT)-VL2@c=ye`%LfON)QH9(Rv0~(*psPu8qUs{Ah$=Q;?Ger zUUYWUO*4b_b-h(mQaxXm{JvRQi&vH)#0-T6o}R4^chP@P&(ovhXJ_9C#2AIqg%O1# z4o8eIZ1+Y{o`=I6K`0?F;foKKK4Jw&kSYD8@$rspyZa19wN`XL1wDErC$A};WsY?U zb?+01%OmXZV6Q_d12@55TU`l``tI`RU%ujSsD$F8fD;nfoV7@t;Bm`4w~VXrC$i@0 z|CpV*k4McPbo3;iHJ1E5ogH))_;#$M&o6mOC&^Yn0AcXADJ?r+c;3wz-;)~M>JLUj25AXXf2(@ zcm6|E6@@wOZ4+?r5@aSn$YQGgRMmu6CTu6Jm4CY^;Nmu4k8gZwAm2F?^=)-^z3S=` z`&4y`l6QiiUsSfqY|wt+#$TSLA(P}DrXA=WriHdE@0{6Z{1%m4?^~E$cxOb!=E*y; zueJh=MQO|mh3VGbY_KZ0gloHsDEC)xnL~M)4xU;vo1dRv(1W!Gxp0%?iBu9eAfxvi zQ+q#ltG)~xV9_#iD~FESx`g$v6h49sfhKUEB!w=5bfGCcHWgs2NPSpzA2WKITb?A= zl4MuZb3fbTjpCaB%VP&)j7(SLa6hSEkpA(Bl7}KLTq8u$$K{e|`78?mbIAS9<0cON zkeusBtRN3tnDj%6cg#)Aj|!er@1>J=sN8+gz@na{LDZnO-;WxFeSZR@OhOG3NCdX` eWi@*hC_Djxvh-0GBfgs9Z__ z;`NOiSJth2b@l4y)vIsq-1+p(nJa78UfZ5s!0< z_ksSP)YloH*;AlX4=ZOwJjR!2Y*i6h%#pX$EjE5H!;L-DUsBDZwH^ zBdU?0M(qNlVL@?TA`+-;M@m-!UIIQC<8fl4)g+}BMkJacRgJ5JWJ(K&rqs1u2RNBT z*m$tYqlfF%wNOgoL0t@rcYE zG$)T35U&h}6=snbjTj>_M$95+Ha#OwJl^~35yUCyqmo-UTFCP9)UsW1FtM*{h?@hb zYDZBxZr@y@*DF!A%Yh5PMen^QgaBLt)TL1LhxD3})s-b04W-eDfC2_6IU6|}qrm_v zOQr^9pJ{XRSzFauTx^kZA|*&EO)pNCDWyzR)l`)u#+~-uRsC1}1-gaal@pe+p8x;= M07*qoM6N<$f=Un=0{{R3 literal 0 HcmV?d00001 diff --git a/felamimail/templates/default/images/fileprint.png b/felamimail/templates/default/images/fileprint.png new file mode 100644 index 0000000000000000000000000000000000000000..d6defce21cce92643bac58f0802db1909272e4a1 GIT binary patch literal 684 zcmV;d0#p5oP)j+v8FGw(TX-n;j2PGw;>YAFE`S;9|3Z-HD_TcU<4Lq-~{w)=rR0u676bi-ke;K$N z#J;Z)LgTvmtqpA34(TJP3H zJC2JfAicbFxU=)(rInR$rO{|Ko=T-`(cXUk?A5E+A6ixj!!UU8>^=JrHKLS81Jc)M ztuTaO_TxBbP9DK91er{R-rnwJv%mlL%i7v~mT4M*L|4?%us=$y(xRf=B3f=yR$fB1 z++sExIyzfOPu19gwn+4TnP!$H_5p>l#X_KOaWc z`tn-61727bU0uBZxURDt$mesDWo6+#rs+{#T}4k%_a^y4Db3K(T_TYkm}Y>brPOQA zoohceGBTl)$t4|+f7btl?@K*8`a#dkEa>6kCvJUxeckVKiLb!Zi}60wrDMq*-;n>05!_x>ISO)KJovz^a!!_#vz1s<@t+@SC+$e*uMh1sYXAh!jRr zFxsuKH@lnRpw#egh){5khzW5u)KSoQ1czuL^_*j?y`K4l|I(aU4Yc z00lI*$m{30`G;uiViRc+`KN5YdmAU{U}WPI17OM}ys4YmWQO*QY5aS6bo)+H(|2&+ z&7+RH4qQ=?p*`sNOX!xZIQz!I2*KnOc4ZkkbQrhpZ-6gfOF?0-5DS7*frTR0f)zy- jboK=;ziorgS`XkCEsw|UxDe9400000NkvXXu0mjfW-{%0 literal 0 HcmV?d00001 diff --git a/felamimail/templates/default/images/kmmsgforwarded.png b/felamimail/templates/default/images/kmmsgforwarded.png new file mode 100644 index 0000000000000000000000000000000000000000..a26af4a2cc31b53b6a07c54a95fb74c0023c7485 GIT binary patch literal 241 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&kwj^(N7l!{JxM1({$v_d#0*}aI z1_o|n5N2eUHAey{$X?><>&kwEnT=13*W&2cKA=#Yr;B5V#`&oeeEA#<1l;a(WOo(_ zdOzP*#Hv2A<4D|+1uwys^-W&eq|5@`z-3T_0! zf~{^s@f{;Rh!3Y%hy%wz7%yxi4k0uL>lZ262Ss=Z_h2w;D`I0AX2RS$JNF^Rru8 z+A=iPE#hYG(JGG+g3g{8L5nji|9y@|qhwmsY_1mB$rpJr+muTVUER~z(q?&4(BEtB zBtWP_DvuQo_Wsb2a*5SkHV#Lzv?9Ixg_v8U%KkS#ELEx!;Nyql;usI_+y)p*0Vws)Ek100!8svH z1Si7m^aQ8^&<~UM_wHBTt*%sN167zRk8`nfmUcIy7YSiM!8*Z-vbEV{{>IeI%Ck>{ zND3rYc>Z#OFt#`=jOKHcFN_f$#=Lq_<5WIR6q(;gqcDGclFmVl9>q{R+CMs6I&+#* zsYE7|1;8KlZ>iQAyj|ZJ*5{#|%;kt8L$}*Qjur)~kXX1icNt@a#0ar<7%OD5S&HKY zTCIKJel!qj9~L2&CAOyxmF!$q5Rqdk(jC1bykN*u2prVbx*vmZM9`S?0P%uyQ&ca9A>5 zvLmELmVx1Jnvv;>;5}kMtv*#D5hcO-X(i=}MX3x76}O5n1YG-a#@EOHtFO;_pL1ab z7mY6&2W{AL#oXYkxj~4B-YFful_e+E>gb*Hx#q2V&0ACV#Ch$D-sjG3NAIr4WOSjSYNEeEp0K41G)tjkbCCd6}A;n)?`GW6BklgWI?0{yumh!egmqf7_g^etbC$ib8#S-!(-)PdTNR zAbh-2lthQ_xzznCW8-yrb?o~rM$0^#l>s#cd#@r2wE%P+Vt}e z_tLMM3}p6xy`;S|OK*1S)(4w7gv-i|J0c#YEb~#b>o$nuy8HZK>f?2FJ=ZdLwp{U8 o8sIh2qg87p00i_>zopr06UGKb^rhX literal 0 HcmV?d00001 diff --git a/felamimail/templates/default/images/mail_find.png b/felamimail/templates/default/images/mail_find.png new file mode 100644 index 0000000000000000000000000000000000000000..156187d6e6b76396458d40742436465f9a332453 GIT binary patch literal 932 zcmV;V16%xwP)v|4trwF zCZl)mtiPJg7LNjWaKMs-`N-*P9gW9BfoRktNRoh5Dv!<0C;F{h z_djej^vSDN-!l&{xN>FA!I=4iEQ{|biha1dyTj}8v_NYxl&X7>C$RWB zWC}k5r~&{#IXV9prQB#J2tZ=Ex5Ou#ndJb67<61x5KpCpgSGd)lIajB{=OepG@vZ zk;rR5rBc%tM+g=eW1OZnkW6l4dZh|ES#{q%}7yw)V+Vmz0>)YUY0rh$lJkJeSmKEmCpMTvj40dB_ zDU(waFZ$b>sPCjf2!mn$+mU9|!0KNQk-WQ%N?{kj+`OC5<%(YsLY5DUbn)W#iII_k zk58QF!1bF8$Pf|jM-@0Jpl;=``0H(i#f;U1+t$VocLCbQ_@}>B89fjr5^t9&<=#Dh z+)smn4oG_qIQAP*(?z8I%t9;I@AcYd^}$y<-L2|cbYrKUe%>#w9SY*{;i|41{fgo^ zMJWf$3CL|%joIIm%eh?T^IE0+nXNFhDzv#0u|!YAtQH0{kL!;P1p@;khN|xKvMdel z?yADvTr#_`@Zj4@MLT!x+PRt3`X5@CL>?yZ=hJq@GuRtH68t+=I!&Ja!n0?;Ic2xE zd~cd&rdX_gX<63N)YKx_00000}A`-2EN%9_D3iy_|UzC zLeUo|?nM}*eHepv53{X~z(gNPw?@HgmUdY}Qqr0jo#~C<-@V`89`*;u{+;*pIUG2L z;eT}Q+}8ourM`v+VKL6z;y*UClrfSD2fMOuY`jK+d7HF(9qDhBsmVH`1(=Pn$_MPs8M?d`#*ICuIOhM~rSPoCb^?w#FK?lpRu7hV1?ygx9C z4*7BXa6Jbifmo~!x~_pSfJk6%t%%v#?=Q+Yf_S;DIA-=*;0O7C>pU(r%U04>!)|Q1#rWlnFz!{}SiKqb;fyMyhMjTW9Q}A{BFu5`g z!_d**9)hCCa2yx5?O=I1$LHr$>$TeMhaNqs_YZdr<7nt86iLA@?P4%Eh{R(FoLV{c zdv`*uwu{x(BHg%gC!bCiKIfcICzE3Z4CdV8Akof?ACDocTuk2mHc6}Qsn@{4VeG{WUj>4PPp#OAeXKrqJ zDVMu{dS|Ep2_SCI&7Gw`cH&{1EFrJRN zaE!{JAhJCaVf4Y_$W~nGCQ@fxSTAIuHY78;WNB?YSwx3Pfj~fgqqDQ=NyCUfkk4<5 z`T6x1@7$?=1(^Q;oIX9RxULKeAs$u~@m@S0eSFWJ_U48L9nS+*6=X7nmv7%L9S2hP z0mjF#HhG@+bX{HWRl}%zX4kG}e>@&WRRyl=Q7oGH{XTZ=F!ZIR+*`mffS8!LRxhRZ zN-*dj?C5A5NF?f_h7mzk6#zWX!?Gl+t9ioV0FL8v=1g)ipTGOu`Sb5&6)9!!wr%>! z{rew$wx=f%HH_%rW&qdqux&{$S3=W#`27mIcei#*=?xAJexfLjBYzQsv~5dKDw(XU z70G5xn5Ko4f23C`7M|zfx)R%#baXW8x?cN~l(IpQQm$pQrKIahCmPexBMPQzF*}=L zW+p|Uutll#8vwTL;y5m$P=L0!*go5KdIfJ2?20`$w5k7mw4nVILO^$*oA)36h<5c6 zZhW_nlpbAOtwf_bLV%PW%gZ?~Ui|)?%3fY7wB|;94=J(XfnkhJgDc7vuC30py=FUm zclHyDg^9mjz>Ee_Nlpg-Kt^^NPCT{-(_ zcS*T?kDE7ha&9i2SzXP3VcYij^z=y9hYI)s0adR`l`4u)LDMu4U|BAiOp)2yWou<6 zcdl6c^>Zn`nd#{f2f$a|sQxgP9qThf1_vVtxm3QysHcEr!U`kI>GA%wTSk7s4;Z7$!O{WC}(6v&$mppl>0urJb7~AzwZ7!V2*=zaYGs( P00000NkvXXu0mjfXA`fy literal 0 HcmV?d00001 diff --git a/felamimail/templates/default/images/mail_replyall.png b/felamimail/templates/default/images/mail_replyall.png new file mode 100644 index 0000000000000000000000000000000000000000..c839a8acec58e3cb26c1e5f5c2f39f2f376f8202 GIT binary patch literal 928 zcmV;R17G}!P)MScFZcG8-pCahs^U6bIgHI0T`+k+EVg zEM+LnD|a=7L5DwsbsKfw6xxEZHSMydX_6*sPP3#Z%{k}$J}(A>i1^+=&vWr|_@7Nq z-gXm02OJLD2ZmvtX*61&7>0RkX68Kx0OEgvSFipgTNWLWW#N2xcl)cV>g^~NYuxhk z)?4Lr>ka_@UxL}$dpsf3$#L9^JkNa^3V9R5!|`x1sDLp*5IAJBm9zQ0HU%L455e{8 z584@Hulan=cU9GQy00%Rg+gu!0tZ4E_V#p0l8BxjRY|3GJ_K+D0Js}Ber=>-!a zpz8)GeO7Na4KT()2!&}AQ5eWs*_k1U6wL{$b zaRrZ7i>Nah+odM-0|Sa(glQ6IHd_`&Od$5H@%cGh!|wL{=0eMC;iPgBmtOh|?ZG&9 z#Ri3+nabms$Ypt65fES$@(wYoV$88@|#}KdwFeD6N&^3rPeGM1Z zE}+mn!1)-5(YOeU0h6yhyLMt<6z4^U0sx|>X@%+Hv>I39s9IHA-oA`nGY7F{N1U@` zKE*H+Wl~X#=I*O#l%1xqJ=AoVJ}NE>PFZkEuU8Y0nJPikX_ z*&Y+W91TclS->CZDh}>HxNmJ`t^tppayW;OBjotV7x7(;s!_GNuj%qyrxo8%%*ltr z?-#Z_y*97!N+jBLT(2L}!bX0vzWL;$)tFiZfWH75cab?zA}2+1vYXCkb|xBghq?jgH)kndni=I zN~s~Igdp}(!4@JZSy*bC9weq=A(drFH(6(!-R5I6-E}sZ|NQ@d4^=_@diVE!@9>_0 z|Iz8wS2apme>kih@%`Y%dVS|z-zVRmKmR%h0QujH=gwVIgMbaFs`N%zSL%>u#oNne zS6EnBd1-BJ=X(I&-vTaP%!-tw{N$ZOh&;uAV~s>#r2o(-mRVi zVE-jxbo7T5=lt13BJ!GLB@XY|V}=YvgCq%{lw)JVLntJpyW5K1zFj&B;3EJK#>Q^8 zFveerL_&khrA%@;0R8g@j+SpTkF z(a#Sa?0LSguPts_@juM~Kq&_y45d;PiXtNv64BfHa2I2IaB%PoQ49ihPY|#~2otJR z4~4=89H$D;^TF5ydZXcka}G)w2w_O4Tcgov_!-7nQe=!39H*M0lm({Q3|)`F^L)(C z+L)QKvA$kIwfZXnfDnoxpoqm(bad$Z2?_e8$;om0$o?m3rB;4UZrP62$rjqJR&;e* zaNTW8Pv>CUWu#IGFb4R3@Ov{FDHhjc32(uilctaSq|82H2l=K6djd;$me8B*gQjX| zX^BDCH5f)5O-(Wgq3}F{tt}6>T}n$hgin?udolX|>I>A{7<1-R73)aDcp#14Q-6oN|O`xM3E z1|}!x{i&(>iG2Q-HyLA}X0xXp0Fa%EQyDG|r{YQ+$N6!LZ;oT8I)kKdV#fup-kh)H za?5kBTmP)l@UII38kx+;{EwZ;*u+<2LHtnPt49{@F8~6dI4aui?4{RpD?hKU)V^el zeRt)`2kZZIIzc=t8mg`iCCtRJPOCGudT-T>+1)|M{l`bt?c_I?FTa=jue<*Sg&dcB TVkZV700000NkvXXu0mjfihQmb literal 0 HcmV?d00001 diff --git a/felamimail/templates/default/images/manage_filter.png b/felamimail/templates/default/images/manage_filter.png new file mode 100644 index 0000000000000000000000000000000000000000..13c113b4879fb9230102fcea9cfc7314f6e4b9ae GIT binary patch literal 899 zcmV-}1AP36P)nT%lb=XnG{Kp2JuLBMc0yp7{H#`k?J z%fk2lUEl$bl%gp5!m_O3;^N|?d_Iq+X^5hTBuRLlhwHkeQYpIKE{BJQ?Ck7te0+>; z+rJzg9jyT`fT1uwJ)ImMAAi#@jHjhi>4~oEIF3WF*F%yd(&;q1u9L}RXti4G?d@UP z_K&Bhr)$k-b32Nn=YW&AzP^sm&dwUc;jpZ#sy;V2_s-(tBJ=a}6bc0-NkY>!>h(Ic zS`FK_f3hs=yH2OG6~}QEXaK_me=BOWTHfyN?s^!8uaAw5y)`p4lSrjf)a!K|$6;%0 zE3hnUtx~Cc8;0R7un)9=A;1j?AO;5e`}^zte*dAOD36N8qEx9=D3{Cqa=E--tyaGQ zsw0RCMBF0*$So`^>>L~%#49T+v1yur08fDTfZV9&UlRWV6a&|aqVx>Ipx^H^7z_ZK zfIV^&zX}K-76c*6X0zzJezP_N`gdLDE)W2{UJpf4h~t+GygDeEOww#NnVg(N6z@F` z0O_ucTCMiU^78U;K@cQPPEMWyKKK06ORxVAC4dRw?NRf3kkzJ2`oFqXFE3nrefjE}Yd78*T2HcY zn&lb1+&^-4Lgv=gyq$#=`zjlcwDz2wv*_yVg;(Y+zP@DT&5c{{ZQc3c+{IV7?tHj$ z>s?Un+JvmF$+_E`x=!>=KC^n`o$Y%bA3FBz{fF;elh1D4@!-($XD80Sdiwm!wOj9h z{QUdl=O2*khcZz7$->CM;J}~*@&qVO7}%Q|7&yc^THD$=np8M@diywKTR9EwxH-AG zW^kL!YfsWunz@KufL~L361Rk+JvZ+K)w5&11}Cs;^U`Ic(wf-R L@xPOak--`OFsZJ; literal 0 HcmV?d00001 diff --git a/felamimail/templates/default/images/navbar.png b/felamimail/templates/default/images/navbar.png new file mode 100644 index 0000000000000000000000000000000000000000..0ae28269d7f6789d5d239a796151c0a795d123c6 GIT binary patch literal 2460 zcmV;N31jw&P)??9=4$m#$B zh=rP#E?&G#k&%%lA82uakPx4|jEpG5uU~%|jvl=jrJ|y;1?YfVKxIFW^#BAARUEKp z&B4UKfBz?NaIo7+Nr^DX$cQii*$iL5erNdp{Wk+IFQ2xIjD`tN=_4Tig&Yb10YtU~ zHf}tm$i&11^esbzh=>5cq@*x|n3x~~C{h3W_a98ZefyDtkB^T56cR6AYJ^!>SR6QU z;>1^E2LJ>R$qv}P`(z?0ZrRz{?Zm`{7(f=Yv$H`hW?+D2s(0@`0YiZk%$AcAWw>~e z$3#a*M;7RSmq4LEKnzw15I{sZ;J|^Cz_?}32l^~QP>`P=WU;U?Kh(niP|N@`lL6>J zVDSG020ag$&&9>gASER#{N;=e9Zt4 zjVDiDF@PM+!otkJ2rOklp}+`aFae7^P_(>z_wCE)&ySD1c=6&J$N>NWgi;df>FHkl z_3QUXpd%RGe)+|4=lySnGjA9ej=yANxb>ca;lod4Uo#-ZJw)uyn~%UKVg)Bkkj2c* zOhB3mNHcTKfm&EW1tCBHp+~|0Ppq6g%1jq>(^hhsH+Pe zxNzaZM}Po=N5O+Xe-|(_veq$ivoLV-Ffxcs2r#IK0J9J;Fku0m$pj25p!p0xfxh7o zWM??{UYKFVSr&%p&tEY-d-j^)$B&;3zyb+u0Vo6@G>pv%jS40PO-(5vo83rST2&2b zEgL`pfkWWkpFe@iPW)^C@Q;~+my3Zx0*Ix6G6Fz3kb*D3(ERobihn}zkN?aJ_ujBE z2ml>xtiTOS_1wVx&WVxm5TO7OXJuspX46lsZ{Ga)`1kLdlK=t4^z#3If!X_h&3n(t z$^Z;`1`S}@Aq}*Z1z5=Z2I6o3K?Mu2=mKJ3`N9Co{{Nr}k%y0sVZ~WChL7KW0OOYz z!{;zxqbEpfYjt3HVe+)KwUq@3Af_Mx{w1Dz`dU#h$4=`@TfQAAsW&~Qm2n@RW-#}3VvG6-E=sy7+@g7)>eE0_8|AAH~U*3FY zIC!0hA==<4xXgfLOGczZ2$37^+<65ojP5aKYs%Y5nxDs1X}*-2ZRl>;OE!h3?G3GxN-+nsIi0Nn~@Q@ zSY`xP$G;d(pT5U%@Zb$#?fBs_E9-l|n6o&f|9%cEz%8NPh|%g}S^ z7lWx98-ueHFdBf-Ar4H44}iJs$tOr5_YoKZpT9#K@#_!7f{*v#f=j$_?|(2{f6K*S zDS)v2{{7bsXV2aTT7Ku-|NlQPFf+f~@%#7Pi-!-Ncy|8$`L{qNplbO$Kmf6P{P>6A z%ZJ|#Opm`ZoMmAGR}U^gN3a8#MnKvah>zT7V7T)Vk_&!AE$9CAo#EA^uMFRTp}-9+ z_nCq5|KrDRV72>@;n=ZTpmO0cBje{i3=GeXT)%$y-mzoHUcCd=(LiIMts+pc{RIdh z7G_|r^WoJ`aFG7_{h#5?4=x5R9$@v!3kgn8i1Gug^-td*rTuSU@%Z=MX9h`OCWc=? zwwawc1D`Z6!&KrNf?e5w zA;HV={K+?lPal6Xm`U?7uzr2K=fj7yE3RL^a2IGXR^P&FH6#EKKr9l{%v;{Q_#XWe zXt}ik4}-Nn7Xv>qS8#IxOFULa1{RzCL=-@aVxehG0)&22C}7h8wrP1IvG) zN51@KP#6FCx7Ywc0I{&LeP66+EExUr@izurQ$7X}K~QPP z$iM^iJtwe00=fZgLXsD-m}M7YP*mb#*s|jt!yjOrdwPm9d<6PWoa57t`HL1^0TrrH z2mHooDKY>EAeI(4slE9dJ{(&#^|RHlpZ|d6J<#VsZ*u@G=Vpc^Mo_`zVa3Pr1sI4Q ze*9-}uoq-_{oyZzv@9pX{f~@aUhXZQbLY+-P+Wf@#c~h;2p~|h|NH*+{j%@``A;0c zU?HN|00Ic)fd7k9 z4Nt!N@;vYJf2Pl{avns3eE#zvq=ftnuLJ&r=_j9=86Mv}GqX9xeFZe=Kf~I2qyT^b zVnm|Z9jdq3nAPKZho`kI=04kDLw;Kmajf;e(oKz=D{82a4H|deQ%&dHO3f$iI=A=+FT` afB^v2MBe@zopr0LA(% Ang9R* literal 0 HcmV?d00001 diff --git a/felamimail/templates/default/images/prio_low.png b/felamimail/templates/default/images/prio_low.png new file mode 100644 index 0000000000000000000000000000000000000000..25c253a0fa846178d10eb09a69499ffb8a7b2d0b GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ##0(@~B^+M>q<8{+LR|m<{|{t>$^WX_?S()N zV@Z%-FoVOh8)+a;lDE4HLkFv@2av;A;1OBOz`!j8!i<;h*8KqrvX^-Jy0Twk;TF`e zp5_rf5hx_=>EaktF(>&!V!{EJ|NI6wnk5)SEt%qX>@AW3N;7!6`njxgN@xNAQ(7!C literal 0 HcmV?d00001 diff --git a/felamimail/templates/default/images/prompt_bg.jpg b/felamimail/templates/default/images/prompt_bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d80e9164ac6cd792116e9389edcf0f35e2733513 GIT binary patch literal 2864 zcma)7c{tSD8~@J67)!F}vW1~#EHNP|J6R$v47#Cdk}WgF(jA%@ zW1>bzQCY^&h%6V$Rt?vUYJTHB_qosg^Y=N=S)R{x&ii@abKd7Y!V%#FAnR=JWDkJA z01zZE~%L}UvIK?1hGkMC)A>auVs7zD-V9(={Cn2I%GPu2&F7D>b4p2o-}jLpsAHy|c4%Ie$)En={4?6tIbxPM zIh(D;McGowb4sfXUj%XM^@%-d?;R2!5Z_WSpC^U3pSTr~9^flLrjd8O@9+ z#kRUTOc#{&{*SZ}bAtw|-anoJ8P!6d#9;Adp6w%xzfPv~B?e5ix*5i>y59sWwC0Xs zif8Oo;j9mVq4din$C)I$pKJ8)qsn;>-~1du97eyW;{@-26-GGqTX9m-v5fG^9Zqq1 zTrTIDf3JNd1ZR+j+RZtYBJ?AvnIB4BLv-QkdyE0SV|!mQHxb;P1+ zts4BW&x`)fqh=f#(Cmdx4kK>vE;^M-_XO#rc`o~(8Mks^DovP6afdo7OC`N_oP^Gr z+PpSt#IC-`BXBwOGAr45gD?!*#bPYKeEh(6I_Xd$-|-7t5O-@+k;~c6>b(#nfhUHe zq~W_A8KEYpBzGBBMVsV9eZc8#q~FT(mWI^Z0k$r=&jr>RKnA*!@{EiT1e+#2x9Ezr zQQhrvKeU0C!+Ki!6KBe%Uc@`xsk|WBuXBL6Kyq*O$d=~Mc*svRpT~iCv2_daivR*l zsYCV5Q^PKqKmWvUUcit|zkX8R$3eH)|@t(4eHFL(H?=z--O) zgq=E40!a4)C<+o_D(HA`*TBT5pq#NsCR_z7g|B;82I^Big0*N;v2AjH0^h27{5MyY0p^lJ%RG zR90)G`%4|`N+Q^Q)+`TKHh(N2jW734kXff3Z4VKan2+OiS=O2dhz76G(`C%s zYcyJdb?ytfAlWCVo5->6Gf(nX)oM($%ZKk-%{JvN>5}Di=%lD2fN;=>8qJ6aBVFQqv4uhc| zK7(noHN%LTx_9QuC_)!p_;m2i8MT(rc?tJlb%!?fXbb zv+1YVpoBzb;Q8sAJ=TX<`bRQ)FhCj==D9t#mE;}!Izn=WGu9pYxGpfZ)vYS0X+f#! zwAxpGj1)T}rgMWwmNQAB>?w3Y1!&zQ#b|Tu_X<1_)a$Xt`$Lsks8eW2dS^Z`#t0GY z_NY~a}d-sWEP?ZpIKGGTp0tivs!JkgSgPM!7KSq*dZ z!u-x#c5S$8#Xq-BD0U z&zbWplhvonfn@UozpgfH(2~`!Nw3AK_7I{+XZwGRtovY0uW&>GQyLTZA1jdQm%p|A zQ1A-C-k|KUY)v%gkEj`4%2PeLEe!iJdU(ONHu{B${bG`m-}LtS4udD>pzwSnJxfOC zn&yErFHdbSNS2ze{&eOe7BXXLk+yf!Dg{p%U?xu=X0$fG=h&)pFJ!=T>HB&uIa(h< zu~S!2sl^-B0jL`k-54w>@t$v^1<_jj_IQ)v^YGxS#_kjcRW{#y0U6Rb;+_zbwt(p- zPI(=qmWyglmM4M&RjrQ*V&*$2v!`M^6j(T{pg#A0li?Iz*}~5llu)0j&2hPxvs9iu zpkkVKyZCg&KpoNlmh}+3p+URl%H7$=?~NfLm_+Svfj|A3r+(S(-n<5y#imB)H_(a) zLGr_IE-0)Ja7Y{qG4S3IA2Xlkg?jmSkoo#$vVfc&xM~8x1cz3>wUjAQo*w&>`r^&{ z&;4$;yh7d^t60>586>h z-`0H8wppDZ_0PpVsIQ7A-rv;WRd8Ig$LQb&{`4&8VZsvqBdMDvg$L*AuSv&_59jHn z)^||KzS75ZpG8LFRpYcw@tsgn-j!b7P70!Dq|J`}Wop(Q zRIqOYqs0iFn@lbBignw_+rgn-syjSXl%b)npRO*e4Rd!H5CZFL-pX_Dq|YDF{`Lt6 z1uO(QxP@rOR){hTA|;wv^O8xYQmt8&rCdv(Sm9-k?K!b9>&+o}ymz&g1Qn2xifX#bqR`te# z~GPxd3QW+-+lA{G3bJ;@%Lk~LJd24(1bbors8*Fs3 zKA8@!4b4d~ZWA)vEI`f!3=kvSNp3W`lA3Nu6_x39FYy6EU}%jX;%xW)##P>G)#d4% z>#8}6FB88p(KgjSR=c8&R9l)^eg#Is6;zN&bxV2|tyK92MQQPf(#5 zgLa_dD%4Zo@2=R*&-0w3wu7&NT9~^m@8<@Sf-4?)rYaeJnR(kTMO~Z{T`oi(LzF8^NHYDIHTCPT&jOG50hzWTR3N{?CK%Z=m;e;>4tJCc3snyhi)(>U8lYQF6p zt3!Ix6H)Rudse+_G;B^2}w_aT19PYQuwzPp}WVUyARvH_UoO(msZwS98u pD=6e4wXB}xgqRh!4%4C#K#*L;R^`qjw`tTqDXet60TLI!`yY}N_|^ab literal 0 HcmV?d00001 diff --git a/felamimail/templates/default/images/prompt_header.gif b/felamimail/templates/default/images/prompt_header.gif new file mode 100644 index 0000000000000000000000000000000000000000..2709af8f85ec264cc324437392653cf0fb2ba61d GIT binary patch literal 150 zcmZ?wbhEHbWMq(FIKsd%XY=6=ht8kA{-AuyidmZuUApsR>#<9#_n%p`tv zGH>hA<5%u3-+glN&J+92-dM5s^!Zzl4qv>z^VHRu8xKz3aDV|XQ2faPme&E1AUhdY bg%g5Yn3QcN3(D{=VhB+c?q=pyWUvMR@%lNP literal 0 HcmV?d00001 diff --git a/felamimail/templates/default/images/read_answered_small.png b/felamimail/templates/default/images/read_answered_small.png new file mode 100644 index 0000000000000000000000000000000000000000..af0b3b3e19d8497126a57ea93accb03e0ca7ae6e GIT binary patch literal 1052 zcmV+%1mpXOP)>nM_Ro{Xc&EmcYo!xSatC00M}G z0SEZ^??1!OpMRa1m>8qY%rpY^^kf7cK77ltef!zy&!4~V0*e0ysRIZg3fv$Nd>sRsxkxB)-~oIij5@!{rX zPted%@G>@*XONW@gd6H#=>u~OF)MG`t_edM@OE4gM&Tb=g(hU00G2o z<>>qV{hMzBvI+wB{8E1zUw?ed@cSzR!?jDV8LnP`1~%l~yDtncUw#C7ffpRbK+QlG zy_LOl=g~fZ0AfDMyPo0J*9*$m-(K-pdVLbpsT9F!1-U8Vf&8L3>Pmx zV33v;0mcF=&^139faw5~Mp&+0d+-+^fLQ+i{_DV_^0(D3(1JZ&J%WLYjf-LGsi_Pt z+iMxJ&8r!_+$x7AHIVP0Y)>>C2TPO0mQ^D!QB!b5g`$z7RKN#NM_{kvo(0rEIUxTTC8Ghdb1>E1i|9}bUFE|iEE&#Ean3x#=0t^6H WWR!`Y=bvi;0000J%=P)E5|(hx^f+lXFl-q@jbl1kC*3rMJa__iA5PV zb!HkiTZf)@iu36am2BSK(3B;nsWYRG@TARPHayB|o55_uW-GBM<1N8PkyL1yR{%ki z*x?x-Wwlr1K}+ykiFcK45_rgWmd&frBn5Dq7E*O0ZqJC5|Mi7yQ^ zwU_5k2tbrl$Xa+By?ZE7%J$#B#6@SrPLB3;R2lB^HGouKaT#m(TsaVXf9!ic@z*OP z4Pf3>7FKl*Up?}8EtGRMbXHjR0>!zj@>X9VcqTKpk-ZV@AphqF+wM^QC#O`icp8{s zePDrwz$2&cRYz7%P42zmceRJh13x9*Il&1!wyRjxIrhs#_!v70{0B8uz@6<*OE>@k N002ovPDHLkV1hV{{fPho literal 0 HcmV?d00001 diff --git a/felamimail/templates/default/images/read_small.png b/felamimail/templates/default/images/read_small.png new file mode 100644 index 0000000000000000000000000000000000000000..f2ac5de112771fc6ad97310090d7579c5027ba89 GIT binary patch literal 621 zcmV-z0+RiSP)J`H2?4c>iZMS-nkH?Q=Jmbz?I8I@(=5GkxNy%opL6f`oGVD;B+D_v zcPkc)tpb2$S4vJrG55nBAR^$BVhmEOVP#zFuD9d^}E)k4cLD*kQ?!G)?2y z_dN5tb>?&HtX2yA@P37wrjcZL6d$0nIt!|X;v!*CRaaFRaKIV zbZ#R0L<~ox(RXwA@4?}au&tiBZDW7n$uC~Mg0AaN06gsiB9RCmKA3})5|(8htE`j~ zq>X0_&yh$Z#6TAW6zuM{;68gE9rgPY0ifBaLyF$H(hr!qdIhc49{!b!Xw<84IAqrv z^(wZjCDbZK2t^K`gYofGxE;QObSj0dAKx(T+3WgB#lM)GyntZnCYn3-;|GZ#-0su3 z;rGKSdzC!XQz#Vvz<1GyoqBCJz%UG?Q=j4Ud2#K!A7jozzSB8|w{KS9@k|W|WYV8- z>GBMGUN0=$LfdFV5ejVDP=tcO>@3>GKAO$uQGjWhaJ$dI<#M51E~_J|n(0Nb`<92_7N4E%5XNx$YZMX~$vhXoKnVxg(&u2mXM7DIhF`gAo8bVvSG| literal 0 HcmV?d00001 diff --git a/felamimail/templates/default/images/save_all.png b/felamimail/templates/default/images/save_all.png new file mode 100644 index 0000000000000000000000000000000000000000..b565abf05c7594c2d2dbd0a28b52f364468594ee GIT binary patch literal 917 zcmV;G18V$sSB)10qR8 zK~#90b&@-89Ay-SpV`ao&U)ADOQdiqC_o?u(m{bx3My(E{s2FPjuNFn3JoGr3jP41 zKuAd%Bxq2$1v$i$ZGz3t%s1a{zAMG9jREmWr+svubKZhYKD&LdD2ifHPDX{*4(}a8 zXxdiNbsD7%S{t;sG>zin55MHI(?bJz@4sbq4l0UbF&qva&SsNkk-_$k1k4u|WjUm( z#u!s#OvR`ivpn8bZ8QGBTJ_0baNQNR@7!ZD8B-L4<+Lh~Z@hhdR+u1ZDXh#$<_S@F+{ZPflSVj zQesti)SY559983T0>J28X}*~57}alm{lzzQ%J9nm7T)#T`SeSywHV{6TgjtGPk7_a zmpNHEdTW#SZVj4F%VJuUd;e9s@xMy9KDxz=uU#X=KuQUKfe@Omv$2&Pp**WbG8_&V zkB0m^LK^B$5n@INMT~)zA}K{iN*Q8GbkZ^@$GrQ_>nyitRMQEacI3RiO^lI0PHRq% zP6*CndQAwPl;T>glZKEoLRwM`>@DZ?KJeX-M>yx{oyVA-u9N(FaLn21ikKqK7-Ecn zgQV2NoRF%g77FJA+Vm)8>7+&oNmC2jrbTp$w(W?~V~ioCK+fqhD5Fi!)%_V)mNT3W zXyp+?BRWObX`Jo({-?*>KRm>HPj3}DMPLI`$`UhJ>sUUs&GY+9Y#*_eXJ=ZW=3A(3 zOAL|UpRVXPO5RyA{{R_c&IqZIvZrZ0O{>tlM{A4L7NsmHCE8YEv?fN6Hx5#`cBw|d&7|A))iU!k3)|;%AE^g#~=zv#)?+a@a rMr%?^mnLu8ow3$#dNau9O6U0tiSUp6QLE`M00000NkvXXu0mjffUKc2 literal 0 HcmV?d00001 diff --git a/felamimail/templates/default/images/sm_delete.gif b/felamimail/templates/default/images/sm_delete.gif new file mode 100644 index 0000000000000000000000000000000000000000..37c0047c86dd6d328f242c5539213b8084a7d264 GIT binary patch literal 1043 zcmeIx>q}Ds9LDjV&N~suwJe?GyitfzkclfRXBQI_r2?%t-V&!{BDS<<;glSPn$1h7 znN2fwIJ_ijd@{b8_uB<-LTE(j#+<0FZ=NQ3m$l)qHl&#QxHHvR}I0z z%yM@x9+4ap!Wst%4P~JK-w6cN4rTx%!%A#kv(maTJ|i z-c~C0O6B_U^2W-_hDv2nsWz9?CZ%Qv!weXx-I*(=6+2bb5eW${o>e#8J-p7;urTAtADlubzv~kqHhO z#kPj?D&px}BWC|$WXRD^O^Vcxj+9-_nE(tTRK;$w0fE1^hPggL0dB}`esMgB`XHdc cBgHP2OFogvM{?}c!>;6W4)Mv>qzJh58!+(3r2qf` literal 0 HcmV?d00001 diff --git a/felamimail/templates/default/images/sm_delete.png b/felamimail/templates/default/images/sm_delete.png new file mode 100644 index 0000000000000000000000000000000000000000..65c7422aaabae0ea81b1ca535d8a8a85277d433a GIT binary patch literal 1042 zcmV+t1nv8YP)>nM_Ro{Xc&EmcYo!xSatC00M}G z0SEZ^??1!OpMRa1m>8qY%rpY^^kf7cK77ltef!zy&!4~V0*e0ysRIZg3fv$Nd>sRsxkxB)-~oIij5@!{rX zPted%@G>@*XONW@gd6=)7=XW_VZsQEh2LP8fDHTf>pz2zjywYg2YbNJpTD>O0*Kko z%J;*o_uqt7^i}NC6!;ncad0qv`u2z6t3JVzCy#2$Vm72yNCnv=4`STBOVE+C4m*LQ%t3Z6=?w2oL+W-QHMTmjH znhh8@|8;a2xG!8_U}Rxo_*-4gAPZFZ+*yXN zCr>gg{`Q|?HM`-h%h#V*{r>r*2x#j~paK6u=>dqq>4K4wi2)#hn0*--PTcwS?c1-X zPt88?^8S7C>cy|sFFt?Uq8{A;nOUHSh2hU$phbTn8ete=06>5N0LH$d<6t8AyZ`_I M07*qoM6N<$f;Lq5kpKVy literal 0 HcmV?d00001 diff --git a/felamimail/templates/default/images/sm_envelope.gif b/felamimail/templates/default/images/sm_envelope.gif new file mode 100644 index 0000000000000000000000000000000000000000..a756a38094afe0097fb9e69ab81aea0745d233af GIT binary patch literal 1013 zcmeH`+fPyf0LG7H3eGlK^YY*l)CX(Mwz5W+tF$t#7MVI9=p+e$U_bmEx{p&()#;6yWUy z%F9WWm6V2t9wL$Qx<2L&|@N`QdYnw)! z=+wuBy`10Y@l<@i%su^-$I}V~s+k$RP^cCPH6jrt66wTZ9SEvH zPz!>35Hv|7T8Ts_l`c!A28C3ilYW-SR%9|*CNqXb&*gH1Tn@|SX0gJxuwYzRSWzfU zi;GsJ5>_frDwSETcB|D^lWN|k6lyePt6HGZSRlv-LH4C3n;BZvYFBl-Sl0CVRTb=C zUUnG_4uipIFvP?S!*&>U!m!6^bitu!(7v$^hB_j>()e<%?6wYm8-7z_o2zeAy|a5%CZiR|p`?(XjG?d?bZ^Dh>_?5C7G zCe)G%_2`yHG7()tB%n)ix9|Wa5+9cYM1edY#^1952tE)+W?Y|Qi#t-!X5@uyamOwo zQyJ_diFkI=!-90y$F4r~#g;KYWuT5tKk;PxO5`9ddGKT%6>$gMk7Q?7tf0c&3J)VoZJJ!v} z&rg{CQCxiJz|ni%SWy0 zAr@3EOE%4h3X)1y)ha0Tk~r7_x0oc*G|0xnNsL1$WRkHx_V_ZlZkni4Ti`5T>3wt- z&mnlpoIgK7blv1uS67s4*DmP0cj`rtmo9xrnI@ucH~SgOwj9Z3m(BsW3BY+KEq<#LPZJ;2md!bb@8F2lG^`~BRgAOz^PHWxHagCrFpiaV%O z8emxl!C((RG&K4_F1MHkU{LY+;zhUHJr)RX`&DVpZZ)5RWx7x(Y(iD*uq+##P6j;B zqEu4gZ~%jYuYCmID*#0s!?->PhX)SG>%ZCUri|6p_lRHp0&X`8LFj~G5J-}YLO}#z z!Q*Mg$jHIrNMtMufY`RTi`Sp7=OCtMke(ZdQ~48NHV3U%K_-)jESKT&v_cTtVY3m4 z;uiY)cs3LoJ^{dK+uD-8+1xBv)5&RQ&o*#qq#q{D0>lol*8`4gMYXCzl4Q`d6W!eb z&@_ceWaxcC81Ax1qlbzeUHzkP96mD8%QdjFX~&PxqHy~Jm|7i;MiV|?8yJR0rBZ{U zRKc<|Shkg0SjaBfXJ@C4qesW6R|a1{E^%*@+s0ck2BP@<=Mn~8P4u+4pj@uNG)?&Z z9K2o+*4KBmSnS?fI{n~x3IH}Xp4aGC3o=xG)vmy9=ohX&+ zn4iy7=I8G&C6lq~$B&aSRh6^kZ->a_C`Y literal 0 HcmV?d00001 diff --git a/felamimail/templates/default/images/sm_forward.gif b/felamimail/templates/default/images/sm_forward.gif new file mode 100644 index 0000000000000000000000000000000000000000..c8c823d401c2ebb4dbb01ce5e73c74a669617b1e GIT binary patch literal 1042 zcmZ?wbhEHb6krfwcs_+eM<sfLDj+2#H55RkZ+P21nO zeCo`Zhi1(>G-vjadGn4eT6A>U=2_WSvzISFxnjksl`BuLS#y5fx^o2&3pQ@NuyNzX zjTu*>hv^qsjaC-#&c!?$N_HjvTo&@7cT)C+?j% z@$mGqXY*dqTk?F#iF4OZoV$Md^n>~D=B;|Z>dcvkXU;r2cMgaiUpV*h{Q1Y{&p)|v z{@J=W>n>cqed*G(%a@;R{;>JR)o0hPJ->ea<@M{YZ`^os>&DAlw}9yNom+43-hH#@ z$DVul-aLHx_Tj^Kj~;$}^yuy5haVq5`gruu(Q6;CJ%9fB$&V-RKEM0;`QxWgKR$o{ z@%{Vn@8AFa{{83ApTA)64+#E`0*XUG@t>%3QEFmIYKlU6W=V!ZNJgrHyQgmegW^vX zMlOc`3_1)z0Lm;39M>5BbIN#pVBu=wU|+>>h_$n$g*o}p1!c}jl9B?s8b6I!Dl3?H znh0ERbPYJ}IZ-NeVes?A4vKXWbLV`?xH!?KCX0v1DI-AIrdQ3>nM_Ro{Xc&EmcYo!xSatC00M}G z0SEZ^??1!OpMRa1m>8qY%rpY^^kf7cK77ltef!zy&!4~V0*e0ysRIZg3fv$Nd>sRsxkxB)-~oIij5@!{rX zPted%@G>@*XONW@gd69gv`sG&)H*UQIYkL3w3&YEoAAw%r1xGPZGtfnE zW$)a1v=1PFSlUlVGYE4@f1bCH;op0%7oc!qkYbf)C^4yIP-C-W*s%U2!*@{!ZQ(19V(EuUfizx51T z4sT-664YRDGjd@N6y^d3tPlea4+qc-e;K}i|Hbg>6VR2{A8G>x5EFwCLnDI)g8&mR z69Weq2Sc_@Hp42XRSay_Yz#doni+Wc85j%=6oG-u0S*U{3l1H+%CKzNp1WVZe9Zy~ zAQl!$7OiycbOw7Ndxl>?`0Up+25&xZhN-qw8M4o2Gko~@fq{jU9T=#87=Q_gVb`wn zZ|>fGH2d%0KNHy4*j@ny5DNn^C9v|a0u`|^eEIc-;nUAg3{q@T42;YS42*2R0AXMR zI`sv^mTgBF&Y!=v=-am+Q-M)=iV>s$2mk_zks+4hEK?$r5fcX!gTa3ThP`@w8BVjF zW(YnV$iTLdharivkKydOJ4fEUecQ&!$gmTfH2#62^e-@FGBW@K5Ho`q!!za|%zpf8 z{A~Vm{tP05A`Cg#vKXGOeZin|$^G_=TmP$m{Q6b|wDl&?fd8Oy03vXBFfuYR00a;t zgDWV#GWfE|vegQy2x&3`o&4p_F9wPGW^<(em{0!8@aG=Tzreuz2euUyh{!Gg2rvL@ WriXixs?D(g00007%L;`1pPgE>7sA;yjS(~{uDoGboIUTFbRx3+r{ObKbf3M0~&ar zKzw{DTnD%TF{!-7L?k#jI4KF)dn+n|dj-k??f{!DVzb4708~TpJyKA05QifPt|5~} zr1Z3UdU-Vc4uc}5&?_0#2h@ufo3gSVMl?jwrS#a^n4Fwe=mmHV1QY~IJ9LZK4gLve9;S=n=nfkHNstEyhq+*64}FX`qekw{%zt7chPb&>(8bg;2;NG2PW z$+T^4+RU-c_I6!!Ut33qUM|;nJ~Q$$zCvNlx99itd}<$*7h;8deP)$v1Vt@swXFuL z>F*yc!%M|Zu|_kd(Tr;}6GN};gPKW^OZ4{bl=dAqJUpq@Vl8tmI^DE%wb5Xh`D~ar z8o!!MvnCU6`Rq|HDm%V)pdQp>nKO?%&0}_}6(6xVtX9|PXrTFlg#nvw-ez-;+g$2p z^|;M5G2yY>J?IZ~YRZdEdL52MhhquD7M$3k(-~;#t8-;$W_fmY8OK*}eAR{fT&|UQ zm(T55^Lp34s~)%Cy|(6GU-$bqeH$B_8ynl3n_F93+kgEE*!l0D7hwI0O1oQ-ixlKD ztBVjJ^Rlpj$>n8c1M4S=5CS_84*`G90+cD(p&rbjNki%=yZZgU7;{rYP=SBpFg09$ zfL4Btnuzu)Ph3c(87rjOUwAUceNDaBkji>M@9O-X5f*-?wj`9qH??%0eiWOWf~03D z;=;&!4)Wq*WL)J4tzw>RZI(nGy!0*GcwzTG?i&H#TK_>uI@G>Q@hQ1akKCLUqWU}z zgkO!_eUzZrcX1F*Ao)1gO+4~={}3zBeU5Rq7%2hfD?%Hu*=Q_k{b-GhAX7pF$8Ymn f=tqxfl@LaJlydD>Mk-VY2z#RUgsQd^m~iSh!U(XM literal 0 HcmV?d00001 diff --git a/felamimail/templates/default/images/sm_reply.png b/felamimail/templates/default/images/sm_reply.png new file mode 100644 index 0000000000000000000000000000000000000000..cfb937993432c65092a7be57cd4ddac575a44a7a GIT binary patch literal 1061 zcmV+=1ls$FP)>nM_Ro{Xc&EmcYo!xSatC00M}G z0SEZ^??1!OpMRa1m>8qY%rpY^^kf7cK77ltef!zy&!4~V0*e0ysRIZg3fv$Nd>sRsxkxB)-~oIij5@!{rX zPted%@G>@*XONW@gd6gipRe*CCw#N|#984{!N8}^&v5+j zafV%|wlio7s57`3xiAO{a{&WZh=GTP1L%dn4Bx;1V)*pw8^iVM548aTh>1a%p^?Rw zMWEk&0z;cx8-qBrI0F+O6T@%4KMcJmTN!xy85s->6oG-u0S*U{3l1H+%CKzNp1WVZ ze9Zy~06_r0{{#RO04jGbcK~i4ZUFQB^8iZ~O8`X^MF76?z5t=vp#bvw@Bjq)1_1f_ z`~bNcg#nln{&V~Xhd9W9kBlD~c-VLt*g4r47+D#C zwlV{q`hsE0wxbN^&)-_~?c0y3z^FXM$jA)V0}wzg46hij^*!t}lIN3WNaagq*z|rA z!?b|j+MuwfNtStXPF#`ht0mRH8%JA&}m;Zj3 zB`&i`2}v<c_8dML=6`GJ+fg3->W}&4zYKrw0sRXMynnzn@fRG3AQynx fOiauS009O7q=uJJ(R^M`00000NkvXXu0mjfudwWW literal 0 HcmV?d00001 diff --git a/felamimail/templates/default/images/sm_reply_all.gif b/felamimail/templates/default/images/sm_reply_all.gif new file mode 100644 index 0000000000000000000000000000000000000000..c4d0c26689133e50f986645c2a0f9f0c64566c4c GIT binary patch literal 1062 zcmZ?wbhEHb6krfwc)pH-O`@JjX&SHQ1R>2y@+SSFmWz#zOPC!FaK~{=1?n?oGe|hC zwzsczbgXf7Y~(57k<6D62)d+|Y9(4F>h0aZAA7?fbdzz&29{oyVEh%%x!hJj5R^#-~N04{PWfCS8u%g_xAbEi(mg;|Mc(fkGl_kK6w54&x3ytK7IP} z`SXvLzh6H4_w3u}Kc9d6`TqUq_wT>IfB*aa&-dTIfBydc=g*(NzyJOI3j+WC0TCGg zACW-upQv+DYGO%hib8p2Nrpm5Myi6lr*8m*;!hSvE{6XMIt)Mn$}9{VuNeMw%6NQW z;cDVw-xk2+e!9JdIbXqW$*U`Kp_p6b-z#FKL=Lr~UXVN`EdO6vs$BR-aAFM?lPoUfPs?M9=L`gvJl=I|E=LeD49 zl-Ex?@IditM`OJ}*9ykNOx&tUM)S5jG*WV9W(l;KcxiI$kx3GX4yjd>TMpRs)`b21 z8RXW&Ez=jVbK$1cgZuerM8!^8aRm#KpOG3u22FJTL_>Lf-7QAb*y!8%m)ltcDIpD*l5 zmnRy;8vIp^c;Al9LhUYvcVbq{%*~pb?l>-YYIyR*jgzNOGuGdCb>$;M;dRLk--57? z&dzz{K8eig!o?8pM3-B2N;N-OB1zGPgx3nbtD%3r-~8|JaisAP`sB%~AXjj0Ig!!I9fr2Z2ux}pn#Fx;8Dty@~H%!j{2R)*gUMSAi1ne2`Fz|d9=H^yy?cqSL+lJ*OEuaom zz^rC)a3pg&A;a2i49C$GNrnly*fkQMUOv(CJj*gdPU9?N$881pGF# z2(vm8^i6MrOuh+rm=*TXNQ9{=h2=E{^TPbe9@bl-QGWZQ0-}LPK%lv|8H}bK;Id<3 zRAqn{yUuVZkOkaGCXlFP__bRK+Z$TYZ)yBrW2i@{KW1fRM+=V%A#`6Ttf6aQqMM*& z@G-y&1H?)NnX?4xry?5aRede&-)%x{ z8#h%gVeA}+6|a=C1#Y?H(x6Z7Or{@xxr$bJwgmJm(~=pKl6R+`wcSQh^%)eceT1Sv zj7JF_svn=T0Y+J)J%t-fVadoBNEPcYt4bA9YFN)hnnQm=t7mQo%DYY4q2`FoAGXN6|Qn3%^!ZEYu zcAk2`H-UW-+dVnb-uk__@7Tzf*lH77lYe%ZXEbCUkPyoOkAg7v{HJyN-Cdhf5YJ7D JYl}_4{2%Oo?ArhU literal 0 HcmV?d00001 diff --git a/felamimail/templates/default/images/sm_unimportant.png b/felamimail/templates/default/images/sm_unimportant.png new file mode 100644 index 0000000000000000000000000000000000000000..a242858082ab211e19fb36d78ae1ff5fd2c943dd GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^Qa~)s!3HGzTxCJj1Wy;okcv5PrydkKAi(3Y^zr}t z%IXVCOpH8_U0HZ}uR({p4hO?2Hd$*0`wY*}tpZy=ed3rHvQ&H3y)-G4#HfQaBZ^-U^z*zlNbLQeQcf7u(boFyt=akR{0B3hi AM*si- literal 0 HcmV?d00001 diff --git a/felamimail/templates/default/images/sm_unread.png b/felamimail/templates/default/images/sm_unread.png new file mode 100644 index 0000000000000000000000000000000000000000..a85a7084ed952f4dcb119a0e8bcb70542ab1410e GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^Qa~)s!3HGzTxCI2ucwP+NX4A9Qv$gTDDXJX-uOFy z=Wn4oN488otNWl`X`fou!*_YoB^z8D&Nu!JsCJ*bnTx^rS?N{#(kpx^S9|+@l`dVW z9D1NjrDNx-=e)O)!q$Cwxw_ifXxED-_mw$8{fb=X!2uGn6(=XxX*Y}LaC zP6eu9N%wS12hv6w7I8?V@Sm<-?OJV85}sA4=S82OX`hYbGG6`^LsN1fkxdI v|9$fmt{znQm=qG=D_t7XA-<^Lw+Z9CU96`kHJ^D7G=jm?)z4*}Q$iB}34fOBqPHlL=8z>az2%aOf@7FHsuhJd1y@1Xqza>)ING)8(6BNOc?V#ZI^P{)C>(uAw6)d{tF-kt%ZRS zZ9J3$RtEujDGxzI(SQ}OyaX_<@hAigqKM1#cfY4w=c+z4&wrY52T4|LVsG4eUq>cy z{=<{yBD;k1Nd_&QU*AZg+NXUM;&C`xYr;bArdNfMepby?rGD$E@R!Gz=$C%x+2gWt zEB#OdlM3<6{-c(QSXz+FkFL0?&^2wKROE?^?J&!Q1|wd3_5kC1R>>mxzP`%yQ+7*T zl3_igP&~FrP?@s|@LE*n8nU%ErZ`cEZ% zHJ^L!OXs+eb2=5|scxl$t4|#(jP>xV zEs^S1GyaONOYe%D_WrXhEPGVhr|nFY6~)NuNMnmG^D1xNvA1|h;})6mp?{h!4l9bM z%IO`W1dA`Y>21uiT9?E+Tp2;v zNniT$n3(#yNE7 zWW4L=HIw(*?V5;1E3Pn8FQ#qZ4!{8s+{mIGVyz7!;3?MZwaCapVBz$1s!DZF%5~n9 zqhzu-a}`iiatx0e{94*^sM@Nc$=AGpBCdDydLku6o0cUX8s-4B!h)Wi+JJR-ZuQqJ#!@SjHnXuwez`X0n|lR8XZFk)l9pd z#e36q7zAxw_+MAYS`Q{ir;>cfY-O!%p#|ZdG0~|S{r7@BI%kqahR$zQR|f94i5pHj ziN1$ULj>-W#N9Kb>W?0CO%I2sFsLwf|B7yf&bi#|n*0sDez(m&#*dq@S&ey~RGDtP z!#=uh=T`T6-QWtQwUWK+1`4VTC_!NGc$7g&PHpWrZ5LTUz5s!)hYvWo+g8@+X?~hqv9KJFbe!5GyxYAB)I!J0=!p+g z_Y@hP?rl&Sc5oz`n|Oz!v_~yUbh2h2<~E0%{!OW1P@KO%GM!{)@w%BR99&xbmW@xb zQP$bckG?Fm%b>)WaPs6n(Pf)fBSK7&`s_j1W5-IoPj<-|M<0GUiBf~R>;h7nIdtRu zQQ2GZ8r9_Iw%sF*aV-r7+%EpG)6$GW4{LBz|LxQ&5YZQVeHG|os3vK7oBV#_NEt>f zN>+CN?I-WEzMgkCqd*`yX`~t`V87DSh*2*6M_I%d%e@__n=E3px6tR=fu|^E?bKkE z@IWry3nGWZVZIY`BG*Q=_!1$*7pCZnL=tnsN#vZtFhzJ^Z9s4fV~d1}Hb+M!{&adpVN)=})3y6P`nBN6>R-8qE4=wX9ch(Iun5}X`NPljPrvgL5OAla z9O=`zm!PeO~Vf7|tk`9fbJ zycnj zqSJ6++w4P1n%rws=m1^OA#^IA$H{RxfbTJ}?g?DDn`ImYmUvxZ0{Ch==}L7$U^+W| zJ>>m^A6vzruP01d+L>@uv0mpXa#&B}xb5Z>BR+BQCjw5yd3oO2`-RWHWS*db8^*P5 zdQ2T_$V5Jx^lHl-DQ|KbdM-EBPTgjB1B1d^bJJs}NB6v%Qx*QwwRE0#wpVTLa7p2n z?UrdJ--6j=;L-}94(%{<`6HZY?_4jN95upFiEXTJDdTcQ+?%>m z8Q22`CCx^DT=&K=4^Jg7r(Js4sQz|Vl{{6~_x;^+NIvJY+@JbOek{$g-LVEjPwAT( zl*(bGS@e+-tJblwLNKbmH^QW@%=pD?n}*03fECPW@jm z%()veslQesIoJaP94sWKVe*dl*(RP}wt~OATJDumP01y7`!8oDaY~;S?t@$orw7OMs& zCAFi7ib}2b@d?}fe+}C3gPjRsB7s(RX*KQS$t&9uJX4jL-jV0bY=uX??K$9zo>#Tg|Z>vx`D^WQT+#_K8Gd^!5(?F3rsyxP0NN zgc-W?fhcxkmLPInEdP7Ew+ZHdS%Q1n&apLRPp`7|Td1YSb!^57Z9+m0T3R{?l0W2j z?0u?&>8Vw9dZ=WL$0hYq4pl5aYsbGNzzMW7uL-n^QA@r844a@-x}dnoouoP$6&1Y4 zsH_}Kcz7%r3^&Mnc7f8rMYXY3^E17dMUt&2Ke0qbfE}$ez%E(W^DdxXhYm3ll@(?1 z@CbshZ}LPhF8iLS1GNF=>zZS8?b)P=^z zP6z~DC}YJzBYwjm&$3Zxo?3Q?Y`yU37(PC9+Kn5mq^vA%lb6?x56N4j3%KZs5!fzKvQAB1CDwP&}eJb?yDA3v2hxT?kgu*V=*0v#?9t%O?W?e_JohHR| zS<=rECr{orJ%2u96N4dCH8pnYU0lw1k+-Lhl3<*%r4i^l{;Pm!CEA*6{!~IH8l= z1qc851(Vs_#pAX0dU*H;nwd?QL&A=pwAm+ZX#~2K{UT6p3sFPW6CFoKM=w%SOOTe$ z2Cu${%na3#NPD{)of0*wtJ_JNvpF#_Y$2cDMMX!aKd`rd{cRF*!efP*e%zKuplg`+ zK*=%)_?1s2!QnI`JTe8JUUY_g$PqkXRieJ32W_qDArYxm1F={EHoFzs*?hgLtM_Sh zbJ}xbwkZ9m4UIt897rrK-Xj}1F{#OzNT!HfWbgPr_*C#Ks_WN zmG%$SLdf+5d=UI^EcY|P3ztmrQkWT5M^46;=;v`N@i-oouu1S9(%L$RJNgW+`vd(Z zPMkbrOo@bpHZ%fVeSa}Pp9@|Ud*r`223IIF8R6iyuASH?@Yyp zq^WrG{xfh)n~rxf328I2H_{2rQXceriWF|g;I{3Dj*K5~HhoNqTW&Tq0$m-y07#q# zZbj)x`qgS3ksF#{u@6$Yhj|X9vms(xP&6^SeSq z&3&vje_q#ItZ4+gDsr}g%C#8el$Q+E!EZ&38R_ckBNtXW3Yd*ZV$pGp8-Oh3b+GjJ zz@c(cMx`NK`8E6=`a;y)i|#%xBI3$KJHEW^>HK|(^~X^y&%EMt$>cGKtDjoa2z2G` z=k!#urJ;(=8Y#$Mix_Kz$*e_mGy~=3U8Lv~D6J6UZs|Sb2$RvSZNLC}kRrT|yZMFS zNVLcns1W-|M@2sx)c8EqaNUy!u5Y>Y=!NA@UZZD4@JH4(0$rI!x}(?<6|CY>oiQw; zCj}`-WMl?X(|9N<>L3yW<1iCWM8elHP!}L_}>jbEK)C6vABWkM~z^UXT zHKhYqKy(w} zOOm`ZUa#M9LBg_f@?UB;Y0B`?T-<3rk&r0Quq4B3F%%D0LXrCl6xpjVko7VK(qBSv z>S_e}dLcZlhzzL)G698T5=u!n`bQ*0A|>hs3i#%#kX4O?RiwSU7x6mlVQ#tGNWJ#$RQvj7AmmCZ zxwao6Ev<3rND2$v!RPl6N$~i+xRKX`O+hkzo~=cOm}Ef?+#wQvCBVK^l7$3d%T*;7 z?P-9`{z``V({q-LDp2P&^QP>2W!}2?UYzZ`ZN==5jBGWs%GPcB=Fbbfy)*FLcSX2) zlS7V#kG#C*A&J^r*-#d$Io*iJlHw(gRybVf#<@Z*3ZxX+G78_716!j9u`#$G?_H3> z=95Oedg4*R#AoJMjx{!ng<>{t__`fp^=ik-PEH>0J3IT=oj7q<6Lz%}cka|7H&;Yj zR!l~+40UzAsH~DArC18fJ#|>?(SlHx2KgPNL*x{q$~9PXtQGr0rFidLJLYZYV&xY( zH_fL^w-|GHjkVUU-C(|T>t`Ex?mQWN{8+R+EWDU97N;>298M3Jie2QV6!+4q)$0${ zDqMp*k=tefrwGr%JvVfh1yDOY1Z5!vF`rn1`V{kiFciDTa-zqc$bmYKcw+NN1s zx4P|earIBRbSb?zHMP#bW=qJ|!Va)lLcOPFDC3>45(Be009600{{ie;C6My_dWms002ovPDHLkV1imY)~@p%Mztg?NaCXo!R$ z-~kJ0fCZuwlqfmIKGt$chPkV|xFdHmGjmfnaYIsIQO#9d#TChjy<#rvA}%07jylYt z&RyVEQYIJ~lOj2>#@)mwG_g30RFgSF&BP2Tj%%5znu;k>D_O88Y9c0}bdqAPK@DP{ zJeon8oTe8PPZCr})&wJIvScfHa51q7O)R8sS!T`LRhyv+x zo`k&EPM6c!G$YO8H0>ZK3Z_D`CKyR`lC;Q!i-}EW>nM_Ro{Xc&EmcYo!xSatC00M}G z0SEZ^??1!OpMRa1m>8qY%rpY^^kf7cK77ltef!zy&!4~V0*e0ysRIZg3fv$Nd>sRsxkxB)-~oIij5@!{rX zPted%@G>@*XONW@gd6=)7=XW_VZsQEh2LP8fDHTf>pz2zjywYg2YbNJpTD>O0*Kko z%J;*o_uqt7^i}NC6!;ncad0qv`u2z6t3JVzCy#2$Vm72yNCnv=4`STBOVE+C4m*LQ%t3Z6=?w2oL+W-QHMTmjH znhh8@|8;a2xG!8_U}Rxo_*-4gAPZFZ+*yXN zCr>gg{`Q|?HM`-h%h#V*{r>r*2x#j~paK6u=>dqq>4K4wi2)#hn0*--PTcwS?c1-X zPt88?^8S7C>cy|sFFt?Uq8{A;nOUHSh2hU$phbTn8ete=06>5N0LH$d<6t8AyZ`_I M07*qoM6N<$f;Lq5kpKVy literal 0 HcmV?d00001 diff --git a/felamimail/templates/default/images/unread_deleted_small.gif b/felamimail/templates/default/images/unread_deleted_small.gif new file mode 100644 index 0000000000000000000000000000000000000000..b307c397fbe26559840544e21048f2bc98648097 GIT binary patch literal 890 zcmchWv1*i25QPtDv7!MnVi9Zv7s3)7r-_I~#ApOTA0QxFj2cTTtwakeQLLQK5J9Zm zfG;3gC`@OSPQ(Y$%5wbX>N9woWte-YQ%ts5-fTQMjL6gcwB9$YfiYQ zd$m8tQbl;AN3~rjXl8h(XWFO2rZQ9hFVq*k}KgLpJRWER?zbVE>d!J)T4K;G_^^Pc;air7R9)=rvc1p0wzIEjF{ii3d#On0s=H9*O W)$N5-vvW(kZ@<2|wlh04(b+$GC2e>B literal 0 HcmV?d00001 diff --git a/felamimail/templates/default/images/unread_deleted_small.png b/felamimail/templates/default/images/unread_deleted_small.png new file mode 100644 index 0000000000000000000000000000000000000000..adecaa53facdb6118790b059d64f42af10573860 GIT binary patch literal 364 zcmV-y0h9iTP)lvWAC6+XeGlIyfhCj{kg*Y);H zamyM>Adn1v%rJa^hGm1*YK4^Y$RBDlnFI|f<#9Z|M~ILx49*Bub@H{gqAV?CS$AVB zQp#fpkR(&AtvDR)8TR{wht@TU!eERgO=kdv0He_zNiuZ_)|1P!`X&TO(;40F;A8+W z9Nw~6JUgMKD2x{wV^K<>l=5P&3ji7bgW&}L*F60Ca5r4}`RVbkHh6tm0-%&4%jN*I zT76H{x**Tj0K{?6?G#vd!B=s+eTgxK&1UJzdA=r&duXl5^EEa*Q`xRjmqZ@RwYyqZK&y$k;P6F&hi_}cyijBg|W0000< KMNUMnLSTY?zn!%J literal 0 HcmV?d00001 diff --git a/felamimail/templates/default/images/unread_flagged_small.png b/felamimail/templates/default/images/unread_flagged_small.png new file mode 100644 index 0000000000000000000000000000000000000000..aec3e4365898cd876d81ae19b7ddc2c195a96094 GIT binary patch literal 585 zcmV-P0=E5$P)a`Ff z1sENG;wq#7cHwMT%3*6pIKhv{Mc}v21ErNa_IE=^%ftMLl*<4vXPcp;1>sqpPLm^A zd;xcXWdOwq=3(B1AmDSl9^TIialK|^3wZZ@v>i2Qc4k4y?!x6KonlUm1&EyM=9F&+ z6Tl7E`eD`%{De#$v;&l&eHBvT^CXMH!;1GF=K7MN?`V!T4L7ZO`gsD~lf zdWz|;9(vM)l)9c$wuVdl4Ic2nt?3 zGfm@}UMkTW;>w{xfD_M|Fw1nt-l6^%c>23s+4w>(a+QwTeIjyb5a8qjGx3-79@O{; Xb8@IX?^kHu00000NkvXXu0mjf@QVFk literal 0 HcmV?d00001 diff --git a/felamimail/templates/default/images/unread_small.png b/felamimail/templates/default/images/unread_small.png new file mode 100644 index 0000000000000000000000000000000000000000..0973c296963968aa7e4a00cf5003bc198ccbffdb GIT binary patch literal 455 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPSD?6v0zWDiFN(>B)A)YRdAr_~v20MB)1q%GTce%*$ z)Yq`PT$h%5r?_-Ku=L{1*J8Vv`ajU+?Lyvf@hl5-QeB^SD7?~e%+d_{RdqS>tU$Pi zjp_9FXA}4Rd^WqXr^CRjphrSk_{V9fe zdUlHUA&Z)Sg$ufq8x?X+AGuV-!|3`^Z9j{qx`yJu zs=aNqUl;jz3e738J|0$3U)~*%ajKe|AzBWN_%tGC0fp zV%NL14_4K*rC2dv%-nr!;*ncfJe#cBrU>nf;X6OIYkSkqpR6{vb`2c|B%J?G-R-&g vV_Vc-Lyrj^uW#J8|8rT9k>U6M`7gQm$}dm6c|_a<7~~9|u6{1-oD!M<0e-sm literal 0 HcmV?d00001 diff --git a/felamimail/templates/default/images/up_pointer.png b/felamimail/templates/default/images/up_pointer.png new file mode 100644 index 0000000000000000000000000000000000000000..956c3285dd275a74f8c00d4e3ce26a281e6d42f2 GIT binary patch literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CF!3-p~fAT*8q!I#rLR|m<|Ih9fqg~c5T|Oar z;Wo3W>v{9L1R56@PFNMTY&T~}CU-)GP)dzn^Gt`HMXvozjN9gD6}JO*6A3otc&7uE zGL{7S1v5B2yO9Ruh?TfTlmzFem6RtIr81;vrWqCFr7IZendliUj&tXOsc_EE%}vcK zVem~%NmVG%EXh!C_w)^@OO>4pRKb$&=>{^Gt0wYoFpxI&ba4!+xRso6fd9$Ui8p$D zK5>{CbFa4PIeYBfLC%MbH{Jxyvr!f|=a<%(-`}9n!Op(IjDca6A9Kr!h4Ywz1~7QK L`njxgN@xNA558G$ literal 0 HcmV?d00001 diff --git a/felamimail/templates/default/images/warning_bg.jpg b/felamimail/templates/default/images/warning_bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..379e2b8942ffabd9f303a1eed2bc343436c6982c GIT binary patch literal 2685 zcma)8c{o&UAAV-RBxK$!FHyGY%0yWs`9cxdGMLHI$XK!r*^LoWc1^tquaN8Yk$qH5h4sCd>Q#heZ7Bw_qopVoa=th@7(wA_nhne&cWEh2f%+*&p;1Apa3|s z4{)#okk|bk+=BoFzySbyY>El^v>or`oq%Htn}HlKKm>rp4#6JboN)HZ#Q}$Na3MH3 zxi~oy+=wG=Ah@}C4#6IId3kt{hY+AXB)AIpc7GY+$o$*p4pt_+(I`j} zlTea(Bfq%sv_>X<$g5WPs#ro{=R)1b`PeKUTEOO&_jY~_Us_R_cICPERXZ1B9LbG- zk(2VQ{`h&z)ibX>!i?``Hu^O%m>8$Xw;y&F;{R+M6@TsWVsEUZw%W%gV#eEF=cd^# zx#ogRdrhW24)2im%;lF6_H6ck2hmzyv1VxH()23Tf5FTy`jp7hmYl01p*cIKFWcXb?s^9j`&86uy;~hh=4@m1 zcnTrESZPGJhnVaUa%a%MOc<|>H;@1l;F`fgPz^rlMUh>3-i(|`S$FKq)B!yMT3wA^ zoUf?d_0Rod_es_j{(Dp%Q&U**JcGHmG({wxT`}*C$6Xw{?8JX)hBM4-5>1h7v}@nj zi|z>|g=U5{`%LkK4WA#%cws0+C#jY8EH*iJ#l5PpWS)1cr4)(Wjjs?@fNB9P03Lxs zwGA0UHiLIy+vnkI|vYPKpqp^yeydjzgg+Xf^ z?=b42SB}fAu51-H#~y$PYZ@81ZEbM+IzdWGGF;{%2)7=Y{W|s)rEG^?Av8PfPp#47 zUkBMX3rvr9|0lF<+isG{GTAFAb^>sOTVZrM_V$2maJrg$?%H{lS#j?(-HgDkbAm!A zGrno)0}yMVCy(}vvm|V~>*Ae*bnq(n%nJ=Wwo_KRUN?lPed=YZSq`pGGsgxrfIG~iXK=}zUJQ(kMrmmupGO|^4d8~zJe~mxNeYAqz=GQ zzi%)L0O(AcCzOp)rLWRio5p?Ly;t{ARkywu+-sHhF|*EK=~Ysda+E!^b!8nZRfz?8 zf*K~JkAKI2CcW3@Imd1irx|y@UoFJlv#VWS9u|)a z_$0p1>rSv+ZiZ9-m$BCGq7Q>EvMS z_ST?^MGYS{H=Fh%4r_J0dWjb?C|jmVD9UxPRG-B#dT8#(FSGfH><_r41Yg6ktk0=w zV;(HouQ%|S)UNhV8x?iyCBvGLL9Mavr2q=xs#FBzx+rIs8>bifg z=&k>eZi|nPr}1#3jhc;7&$3*#UVJdoPp3>B-~IbXeQe{heD6@VQjzE}32@}l`l$Wp zK6+C_yg3q=zhYjie*67*)k`M@>+{OX)XdaqEkFy?64iOsR%=`%SLmK!6ZQn^^qS$z zX!V8hx^}hYzk1#dwKlw%};gODHy^RAa|d^&qiSNLVK_hf^{vjw70|A)=_ zZ)s;H6&Zs~V=;jf?Fqi5`Of1{)!aG~iHl5UJUfGjkRNF{MC1u)nTKYWw7I%aWPAJq zyv!S26|1N$!p{H7*QQw&Z_8HmkwM)>ImYCR?lH3Nd#F|=F4+|ft$hi+I6)$YsXR~_ z>2K|W#d?S;JTtN&O0DSqQJ_?u^PF9Gb~^x6n&v=UB4lp$ z*i*7P1k4xiQN>=2+x(D-BuEO%xa_zN3eC`{SKsZYhpD|zE(swWfK$CETs|uHRo0i% zh@<_!&p)D4Umm5^-1;d2w|H2Rc$vV|#bx4(I>nvaTFPoEmOc;Y48|YH^=D(IcZIeC zS`}D5+jKKRNupqRgsMKK#X3=0qqw;qIV1YbMm~tvjIQ{+hua=l@1l&J$VgJ&rB*r4 zQLM1+Z2^b^=m{CrABZ`27^ahdO#7E#M82rz=mEHHw~ixJeLATeHoBT(T-&|sH4%EF zdxVUUCs2drQUuxmCusPgCRR#^0;TBd_ZnkV+>6q&HD#=?z7FSo;6Pr$* zJ{2@wU~^70x$?)YQ7v)d6_YdMqKsKqZ*;~xvd8F=i9R(mM)#}FrFA5eFtH^RmTXU? z6w0z+JWMC|PmkPV+P1Nx=|^t`SYo0*bJhZen3 z?B{PHwoBsOc|p6!CGxS1uX)#ju{{0Zt!3dWl9+?@Kzvf%XN#2l2C?V4e0e#NLvVi? zR6h4-eeA7A^@)N*yqd|~8KUu)?Iv^5cCj+a9 bLWs*LCCPIW3>q&eh`NSe{>b3M!C(ylVtPUH literal 0 HcmV?d00001 diff --git a/felamimail/templates/default/images/write_mail.png b/felamimail/templates/default/images/write_mail.png new file mode 100644 index 0000000000000000000000000000000000000000..98713acb9f8befd30956996053481c18f7827bd0 GIT binary patch literal 710 zcmV;%0y+JOP)O3LQODjbR2bN-n;MK+rmFHqf!SB+=w`NG_$>;l9r~unVN=RsSkLu8gwqW4_9iWGAv{yuGCD=J!ls2#0xWR^5vMrMlvM(5`!Sg!7~Avy4b>Lay`JiiM + +
    +
    + + + + + + + +
    + + + + + + + + + + + +
    +   +
    + +
    + {lang_max_uploadsize}: {max_uploadsize} +
    + +
    + + diff --git a/felamimail/templates/default/listRules.tpl b/felamimail/templates/default/listRules.tpl new file mode 100644 index 0000000000..8277f0af9e --- /dev/null +++ b/felamimail/templates/default/listRules.tpl @@ -0,0 +1,64 @@ + + +
    + + + + + + +
    +{lang_rule}: {lang_enable} +{lang_disable} +{lang_delete} + + +{lang_add_rule} +
    +
    + + + + + + + + + + + {filterrows} + + +
     Status{lang_rule}Order
    +
    + +
    + + + + + + + + + {filter_status} + + + {filter_text} + + + Move rule up + Move rule down + + + \ No newline at end of file diff --git a/felamimail/templates/default/mainscreen.tpl b/felamimail/templates/default/mainscreen.tpl new file mode 100644 index 0000000000..21e927f18c --- /dev/null +++ b/felamimail/templates/default/mainscreen.tpl @@ -0,0 +1,401 @@ + + + + + + + + + + + + + + +
    +
    +
    + + + + + + + + + + + + + + + +
    + + + + {message} + + {vacation_warning} + + {quota_display} +
    + + + + {messageListTableHeader} + + + + + + +
    +
    + + {header_rows} + +
    +
    + + +
    + + + +
    + + {message_rows} +
    +
    + + {IFrameForPreview} + + + + + + + + + + + + + +
    + {link_previous} +   + + + {message} + + {trash_link} + + {link_next} +
    + + + + + + + + + + + {image_url} + + + {prio_image}{attachment_image} + +
    + {header_subject} + + + {date} + + + {sender_name} + + + {size} + + + + + + + + + + + + {image_url} + + + {prio_image}{attachment_image} + + + {sender_name} + + + + + {header_subject} + + + {date} + + + {size} + + + + + + + + + + +
    + {lang_connection_failed}
    +
    {connection_error_message}

    +
    + + + + + + + + +
    +  {quotaUsage_left} + +  {quotaUsage_right} +
    + + + + + {header_subject} + + + + + + {header_subject} + + + + + + + + + + + + + + + +
    + + +   + +   + + {lang_subject} + +   {lang_date} + +  {lang_from} + + {lang_size}  + +   +
    + + + + + + + + + + + + + + +
    + + +   + +   + +  {lang_from} + + {lang_subject} + +   {lang_date} + + {lang_size}  + +   +
    + diff --git a/felamimail/templates/default/preferences_edit_signature.tpl b/felamimail/templates/default/preferences_edit_signature.tpl new file mode 100644 index 0000000000..2f1b7eff87 --- /dev/null +++ b/felamimail/templates/default/preferences_edit_signature.tpl @@ -0,0 +1,24 @@ + + + + + + + +
    + {lang_description} + + + + {checkbox_isDefaultSignature} + {lang_default_signature} +
    +{tinymce} + + + + + + diff --git a/felamimail/templates/default/preferences_list_accounts.tpl b/felamimail/templates/default/preferences_list_accounts.tpl new file mode 100755 index 0000000000..86b1fb8809 --- /dev/null +++ b/felamimail/templates/default/preferences_list_accounts.tpl @@ -0,0 +1,13 @@ + + +{lang_add}  +{lang_delete} +
    +
    +{table} +
    +
    + diff --git a/felamimail/templates/default/preferences_list_signatures.tpl b/felamimail/templates/default/preferences_list_signatures.tpl new file mode 100644 index 0000000000..becfdff33a --- /dev/null +++ b/felamimail/templates/default/preferences_list_signatures.tpl @@ -0,0 +1,14 @@ + + + + + +
    +
    +{table} +
    +
    + diff --git a/felamimail/templates/default/preferences_manage_folder.tpl b/felamimail/templates/default/preferences_manage_folder.tpl new file mode 100644 index 0000000000..a7c46cac75 --- /dev/null +++ b/felamimail/templates/default/preferences_manage_folder.tpl @@ -0,0 +1,459 @@ + + + + + + + + + + +
    + {lang_folder_list} + + {lang_folder_settings} +
    +
    + +
    + {folder_tree} + +
    + + + + + +
    {lang_Overview}{lang_ACL}
    + {settings_view} +
    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + {lang_imap_server}: + + {imap_server} + +   +
    + {lang_foldername}: + + {folderName} + + +
    + {lang_rename_folder} + + + + +
    + {lang_move_folder} + + + + + +
    + {lang_create_subfolder} + + + + +
    +   + +   +
    +
    +
    + + + + + + + + +
    +
    + +
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Mailbox Access Rights +
    +

    Access Right

    + +
    + +

    Purpose

    + +
    +

    l

    + +
    +

    Look up the name of the mailbox (but not its contents).

    + +
    +

    r

    + +
    +

    Read the contents of the mailbox.

    + +
    +

    s

    + +
    +

    Preserve the "seen" and "recent" status of messages across IMAP sessions.

    + +
    +

    w

    + +
    +

    Write (change message flags such as "recent," "answered," and "draft").

    + +
    + +

    i

    + +
    +

    Insert (move or copy) a message into the mailbox.

    + +
    +

    p

    + +
    + +

    Post a message in the mailbox by sending the message to the mailbox's submission address (for example, post a message in the cyrushelp mailbox by sending a message to sysadmin+cyrushelp@somewhere.net).

    + +
    +

    c

    + +
    + +

    Create a new mailbox below the top-level mailbox (ordinary users cannot create top-level mailboxes).

    + +
    +

    d

    + +
    +

    Delete a message and/or the mailbox itself.

    + +
    +

    a

    + +
    +

    Administer the mailbox (change the mailbox's ACL).

    + +
    + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +Abbreviations for Common Access Rights +
    +

    Abbreviation

    + +
    + +

    Access Rights

    + +
    +

    Result

    + +
    +

    none

    + +
    + +

    Blank

    + +
    +

    The user has no rights whatsoever.

    + +
    +

    read

    + +
    + +

    lrs

    + +
    +

    Allows a user to read the contents of the mailbox.

    + +
    +

    post

    + +
    + +

    lrps

    + +
    +

    Allows a user to read the mailbox and post to it through the delivery system by sending mail to the mailbox's submission address.

    + +
    +

    append

    + +
    + +

    lrsip

    + +
    +

    Allows a user to read the mailbox and append messages to it, either via IMAP or through the delivery system.

    + +
    +

    write

    + +
    + +

    lrswipcd

    + +
    +

    Allows a user to read the maibox, post to it, append messages to it, and delete messages or the mailbox itself. The only right not given is the right to change the mailbox's ACL.

    + +
    +

    all

    + +
    + +

    lrswipcda

    + +
    +

    The user has all possible rights on the mailbox. This is usually granted to users only on the mailboxes they own.

    + +
    +

    +
    + + + + + + + + + + + + +
    + Host: {imap_server} +
    + {lang_create_subfolder} + +
    + +
    +   + +
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Name + + L + + R + + S + + W + + I + + P + + C + + D + + A +
    + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + diff --git a/felamimail/templates/default/selectprofile.tpl b/felamimail/templates/default/selectprofile.tpl new file mode 100755 index 0000000000..21c4e14d58 --- /dev/null +++ b/felamimail/templates/default/selectprofile.tpl @@ -0,0 +1,47 @@ + +
    + +
    + +
    + + + + + + + + +
    + {lang_site_configuration} + +   +
    + {lang_select_email_profile}: + + + {lang_go_emailadmin} +
    +

    + + + + + +
    + {lang_back} + + {lang_save} +
    + + +
    +
    + + + + + diff --git a/felamimail/templates/default/sieveEditForm.tpl b/felamimail/templates/default/sieveEditForm.tpl new file mode 100644 index 0000000000..9a6904bf3a --- /dev/null +++ b/felamimail/templates/default/sieveEditForm.tpl @@ -0,0 +1,136 @@ + + +
    {message}
    +
    + +
    {lang_condition} + + + + + + + + + + + + + + + + + + + + + + + + + +
    + {lang_match}: + + +
    + {lang_if_from_contains}: + + +
    + {lang_if_to_contains}: + + +
    + {lang_if_subject_contains}: + + +
    + {lang_if_message_size} + + + {lang_kilobytes} +
    + {lang_if_mail_header}: + + + {lang_contains}: + +
    +
    +
    {lang_action} + + + + + + + + + + + + + + + + + +
    + + + + {lang_select_folder}... +
    + + + +
    + + + +
    + +  
    +
    +
    {lang_extended} + + + + +
    +
    +
    + +
    +
    + + + + +
    +   +   + +
    + +
    + diff --git a/felamimail/templates/default/sieveForm.tpl b/felamimail/templates/default/sieveForm.tpl new file mode 100644 index 0000000000..d565cb5ab7 --- /dev/null +++ b/felamimail/templates/default/sieveForm.tpl @@ -0,0 +1,363 @@ + + + +
    + + + + + + +
    {lang_filter_rules}{lang_vacation_notice}({lang_vacation_status})
    + + + +
    + +
    + + + + + +
    +{lang_rule}: {lang_enable} +{lang_disable} +{lang_delete} + +{lang_add_rule} +
    +
    + + + + + + + + + + + {filterrows} + + +
     Status{lang_rule}Order
    +
    +
    + + + + +
    +
    + + + + +
    +{lang_rule}: {lang_enable} +{lang_disable} +{lang_delete} +{lang_save} +
    +
    + + + + + + + + + + + + + + + + + + + + +
    + {lang_edit_vacation_settings} +
    + {lang_respond_to_mail_sent_to}: + + {multiSelectBox} +
    + {lang_every}: + + + {lang_days} +
    + {lang_with_message}: + + +
    +   +
    + +
    + +
    + + + + + + +
    + {lang_back} +
    +
    + + + + + + + + + {filter_status} + + + {filter_text} + + + Move rule up + Move rule down + + + + + + +
    +

    {validation_errors}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + {lang_edit_vacation_settings} +
    + {lang_status}: + + + + {by_date} +
    + {lang_respond_to_mail_sent_to}: + + {multiSelectBox} +
    + {lang_every}: + + + {lang_days} +
    + {lang_with_message}:
    {set_as_default} +
    + + {lang_help_start_end_replacement} +
    + {lang_vacation_forwards} + + {vacation_forwards} +
    +   +
    + + + + + + + +
    + + + +   + +
    +
    +
    + + + + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + +
    email notification settings
    Status: + {lang_active} + {lang_disabled} +
    External email:
    Display mail subject in notification: + {lang_yes} + {lang_no} +
    +   +
    + + + + + + + +
    + + + +   + +
    +
    +
    + diff --git a/felamimail/templates/default/sieveScriptList.tpl b/felamimail/templates/default/sieveScriptList.tpl new file mode 100644 index 0000000000..62b738572d --- /dev/null +++ b/felamimail/templates/default/sieveScriptList.tpl @@ -0,0 +1,56 @@ + + +
    +Scripts available for this account.
    +
    +
    + + + + + + + + + + {scriptrows} +
    + {lang_add_script} +
    + {lang_script_name} + + {lang_script_status} + + {lang_delete_script} +
    + +
    +
    + + + + + + {scriptname} (Script {scriptnumber}) + + + {lang_activate}{active} + + + {lang_delete} + + + + diff --git a/felamimail/templates/default/uiwidgets.tpl b/felamimail/templates/default/uiwidgets.tpl new file mode 100644 index 0000000000..53db712f6e --- /dev/null +++ b/felamimail/templates/default/uiwidgets.tpl @@ -0,0 +1,176 @@ + + + + + + + + + + + + + + +
    + + + >> + + << + + +
    + << + + +
    + + + + + + + {tableView_Head} + + +{tableView_Rows} + +
    + + + +{tableHeadContent} + + + +
    + + + + + + + +
    + {folderTree} +
    +
    +

    + {lang_open_all} | {lang_close_all} +

    +
    +
    + diff --git a/felamimail/templates/default/vacationForm.tpl b/felamimail/templates/default/vacationForm.tpl new file mode 100644 index 0000000000..1f964a3a89 --- /dev/null +++ b/felamimail/templates/default/vacationForm.tpl @@ -0,0 +1,107 @@ + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + {lang_edit_vacation_settings} +
    + {lang_vacation_notice}: + + +
    + {lang_send_vacation_notice_every}: + + + {lang_days} +
    + {lang_local_email_address}: + + {multiSelectBox} +
    +   +
    + + + + + +
    + {lang_back} + + {lang_save_changes} +
    +
    + +
    + + + + + + \ No newline at end of file diff --git a/felamimail/templates/default/view_attachments.tpl b/felamimail/templates/default/view_attachments.tpl new file mode 100644 index 0000000000..2a47f421ec --- /dev/null +++ b/felamimail/templates/default/view_attachments.tpl @@ -0,0 +1,34 @@ + + +
    + {subject_data} +
    +
    + +{attachment_rows} +
    +
    + + + + + + + {filename} + + + {mimetype} + + + {size} + +   + + {url_img_save} + {vfs_save} + + + + diff --git a/felamimail/templates/default/view_message.tpl b/felamimail/templates/default/view_message.tpl new file mode 100644 index 0000000000..939fca8a1f --- /dev/null +++ b/felamimail/templates/default/view_message.tpl @@ -0,0 +1,183 @@ + + + + +
    + {subject_data} +
    +
    + {header} +
    +
    + +
    + + + + + + + +
    + {subject_data} +
    +
    + {header} +
    +
    + +
    +
    + +{attachment_rows} +
    +
    + + + + + +
    {raw_header_data}
    + + + + + + + + + + + +
    + + + + + + + + + + + + {filename} + + + {mimetype} + + + {size} + +   + + {url_img_save} + {vfs_save} + + + + + + + + {lang_cc}: + + + {cc_data} + + + + + + + + {lang_bcc}: + + + {bcc_data} + + + + + + + + {lang_on_behalf_of}: + + + {onbehalfof_data} + + + + + + + + + + + + +{on_behalf_of_part} + + + + + + + + + + + +{cc_data_part} +{bcc_data_part} +
    + {lang_from}: + + {from_data} + + +
    + {lang_date}: + + {date_received} +
    + {lang_to}: + + {to_data} +
    + + + +{lang_previous_message} + + + +{lang_next_message} + diff --git a/felamimail/templates/default/view_message_printable.tpl b/felamimail/templates/default/view_message_printable.tpl new file mode 100644 index 0000000000..212cc13a1d --- /dev/null +++ b/felamimail/templates/default/view_message_printable.tpl @@ -0,0 +1,154 @@ + + + + + + + + +
    + {subject_data} +
    +
    + + + + + + + + + + +
    +   +
    +{header} +
    +
    +{body} +
    +
    + +{attachment_rows} +
    +
    + + + + + + + {filename} + + + {mimetype} + + + {size} + + + + + + + + {lang_cc}: + + + {cc_data} + + + + + + + + {lang_organisation}: + + + {organization_data} + + + + + + + + {lang_on_behalf_of}: + + + {onbehalfof_data} + + + + + + + +
    + + + + + +{on_behalf_of_part} + + + + + + +{cc_data_part} + + + + + + +
    + {lang_from}: + + {from_data} +
    + {lang_to}: + + {to_data} +
    + {lang_date}: + + {date_data} +
    +
    + + + +{lang_previous_message} + + + +{lang_next_message} + diff --git a/felamimail/templates/jerryr/app.css b/felamimail/templates/jerryr/app.css new file mode 100644 index 0000000000..bf8f6512b0 --- /dev/null +++ b/felamimail/templates/jerryr/app.css @@ -0,0 +1,550 @@ +.fmToggle +{ + background-color:#f6efe0; + border-top: 2px solid #f6efe0; + border-bottom: 1px solid #f6efe0; + border-left: 1px solid white; + border-right: 1px solid #9f9f9f; + font-size: 10px; +} + +.fmToggleOver +{ + background-color:#ede6d8; + border-top: 2px solid #ffc600; + border-bottom: 1px solid #ede6d8; + border-left: 1px solid white; + border-right: 1px solid #9f9f9f; + font-size: 10px; +} + +.fmTogglePush +{ + background-color:#dedcca; + border-top: 2px solid #dedcca; + border-bottom: 1px solid white; + border-left: 1px solid #9f9f9f; + border-right: 1px solid white; + font-size: 10px; +} + +th.activetab +{ + color:#000000; + background-color:#D3DCE3; + border-top : 1px solid Silver; + border-left : 1px solid Silver; + border-right : 1px solid Silver; +} + +th.inactivetab +{ + color:#000000; + background-color:#E8F0F0; + border-bottom : 1px solid Silver; +} + +.td_left +{ + border-left : 1px solid Gray; + border-top : 1px solid Gray; +} + +.input_text { + border : 1px solid Silver; +} + +.td_right +{ + border-right : 1px solid Gray; + border-top : 1px solid Gray; +} + +.text_small { font-size: 10px; } +.text_small_bold { font-size: 10px; font-weight : bold; } + +div.activetab{ display:inline; } +div.inactivetab{ display:none; } + +.quoted1 { color:#660066; } +.quoted2 { color:#007777; } +.quoted3 { color:#990000; } +.quoted4 { color:#000099; } +.quoted5 { color:#bb6600; } + + +TR.header_row_ { + FONT-SIZE: 11px; + height : 20px; + padding: 0; + font-weight : bold; + background : white; + white-space: nowrap; +} + +A.header_row_ { + FONT-SIZE: 11px; + height : 14px; + padding: 0; + font-weight : bold; +} + +TR.header_row_D { + FONT-SIZE: 11px; + height : 20px; + padding: 0; + color: silver; + text-decoration : line-through; + background : white; + white-space: nowrap; +} + +A.header_row_D { + FONT-SIZE: 11px; + height : 14px; + padding: 0; + color: silver; + text-decoration : line-through; + font-weight : bold; +} + +TR.header_row_F { + color: red; + FONT-SIZE: 11px; + height : 20px; + padding: 0; + font-weight : bold; + background : white + white-space: nowrap; +} + +A.header_row_F { + color: red; + FONT-SIZE: 11px; + height : 14px; + padding: 0; + font-weight : bold; +} + + +TR.header_row_FS { + color: red; + FONT-SIZE: 11px; + height : 20px; + padding: 0; + background : white; + white-space: nowrap; +} + +A.header_row_FS { + color: red; + FONT-SIZE: 11px; + height : 14px; + padding: 0; +} +TR.header_row_R { + FONT-SIZE: 11px; + height : 20px; + padding: 0; + font-weight : bold; + background : white; + white-space: nowrap; +} + +A.header_row_R { + FONT-SIZE: 11px; + height : 14px; + padding: 0; + font-weight : bold; +} + +TR.header_row_S { + FONT-SIZE: 11px; + height : 20px; + padding: 0; + background : White; + white-space: nowrap; +} + +A.header_row_S { + FONT-SIZE: 11px; + height : 14px; + padding: 0; +} + + + + + + + + + + + + + + + +TR.header_row_DS, TR.header_row_ADS +{ + FONT-SIZE: 11px; + height : 20px; + padding: 0; + color: silver; + text-decoration : line-through; + background : white; + white-space: nowrap; +} + +A.header_row_DS, A.header_row_ADS +{ + FONT-SIZE: 11px; + height : 14px; + padding: 0; + color: silver; + text-decoration : line-through; +} + +TR.header_row_RS +{ + FONT-SIZE: 11px; + height : 20px; + padding: 0; + background : White; + white-space: nowrap; +} + +A.header_row_RS +{ + FONT-SIZE: 11px; + height : 14px; + padding: 0; +} + +TR.header_row_AS,TR.header_row_RAS +{ + FONT-SIZE: 11px; + height : 20px; + padding: 0; + background : White; + white-space: nowrap; +} + +A.header_row_AS, A.header_row_RAS +{ + FONT-SIZE: 11px; + height : 14px; + padding: 0; +} + +TR.header_row_FAS, TR.header_row_FS +{ + color: red; + FONT-SIZE: 11px; + height : 20px; + padding: 0; + background : White; + white-space: nowrap; +} + +A.header_row_FAS, A.header_row_FS +{ + color: red; + FONT-SIZE: 11px; + height : 14px; + padding: 0; +} + +.subjectBold +{ + FONT-SIZE: 12px; + font-weight : bold; + font-family : Arial; +} + +.subject +{ + FONT-SIZE: 12px; + font-family : Arial; +} + +.body +{ + FONT-SIZE: 12px; + font-family : Arial; +} + +TR.sieveRowActive +{ + FONT-SIZE: 11px; + height : 20px; + padding: 0; + background : White; +} + +A.sieveRowActive +{ + FONT-SIZE: 11px; + height : 14px; + padding: 0; +} + +TR.sieveRowInActive +{ + FONT-SIZE: 11px; + height : 20px; + padding: 0; + background : White; + color: Silver; +} + +A.sieveRowInActive +{ + FONT-SIZE: 11px; + height : 14px; + padding: 0; + color: Silver; +} + + +.dtree { + font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; + font-size: 11px; + color: #666; + white-space: nowrap; +} +.dtree img { + border: 0px; + vertical-align: middle; +} +.dtree a { + color: #333; + text-decoration: none; +} +.dtree a.node, .dtree a.nodeSel { + white-space: nowrap; + padding: 1px 2px 1px 2px; +} +.dtree a.node:hover, .dtree a.nodeSel:hover { + color: #333; + text-decoration: underline; +} +.dtree a.nodeSel { + background-color: #c0d2ec; +} +.dtree .clip { + overflow: hidden; +} +.dtree table, .dtree tr, .dtree td { + border: none; +} + +tr.navbarBackground { + background-color:#dddddd; +} + +div.parentDIV { + background-color:#dddddd; + position: relative; + top: 0px; + left: 0px; +} + +div.navButton { + background-color:#dddddd; + float:left; + padding: 2px; + margin: 2px; + border: solid #dddddd 1px; +} + +div.navButton:hover, div.navButtonHover { + background-color:#eeeeee; + float:left; + padding: 2px; + margin: 2px; + border: solid white 1px; + border-right: solid black 1px; + border-bottom: solid black 1px; + position: relative; +} + +div.navButton:active, div.navButtonActive { + background-color:#dddddd; + float:left; + padding: 2px; + margin: 2px; + border: solid #9f9f9f 1px; + position: relative; +} + +div.navSeparator { + background-color:#dddddd; + float:left; + padding: 0px; + margin: 2px; + border: solid silver 1px; + height:24px; + position: relative; +} + +div.inactiveResultRow { + background-color: white; + text-align: left; +} + +div.activeResultRow { + background-color: silver; + text-align: left; +} + +div.resultBoxHidden { + width: 450px; + position: absolute; + display: none; +} + +div.resultBoxVisible { + border: solid 1px black; + width: 450px; + position: absolute; + display: block; + background: white; +} + +button.menuButton { + float:left; + padding: 2px; + margin: 2px; + border: solid #dddddd 1px; + position: relative; + height: 25px; + width: 26px; + background-color:#dddddd; +} + +button.menuButton:hover { + background-color:#eeeeee; + float:left; + padding: 2px; + margin: 2px; + border: solid white 1px; + border-right: solid black 1px; + border-bottom: solid black 1px; + position: relative; + height: 25px; + width: 26px; +} + +button.menuButton:active { + background-color:#dddddd; + float:left; + padding: 2px; + margin: 2px; + border: solid white 1px; + border-left: solid black 1px; + border-top: solid black 1px; + position: relative; +} + +fieldset.bordertop { + border-left:0px; + border-right:0px; + border-bottom:0px; + border-top:1px solid silver; +} + +TD.mainscreenRow { + border-bottom:1px solid #CCCCEE; +} + +DIV.divButton { + width:16px; + height:16px; + border: 0px solid red; + background-repeat:no-repeat; + background-position: center center; +} + +#navbarDIV { + position:absolute; + top:0px; + height:30px; + left:0px; + right:0px; + border: solid white 1px; + border-right: solid black 1px; + border-bottom: solid black 1px; +} + +#subjectDIV { + position:absolute; + background-color:#ffffff; + top:32px; + height:20px; + width:100%; + font-weight:bold; + text-align:left; + line-height:20px; +} + +#headerDIV { + position:absolute; + background-color:#efefdf; + top:52px; + height:80px; + left:0px; + right:0px; + border-top: 1px solid silver; + border-bottom: 1px solid silver; + overflow:hidden; +} + +.bodyDIV { + position:absolute; + background-color:white; + top:134px; + bottom:0px; + width:100%; + border-top: 1px solid #efefdf; +} + +.bodyDIVAttachment { + bottom:80px; +} + +#messageIFRAME { + width:100%; + border:0px solid black; + height:100%; +} + +#attachmentDIV { + position:absolute; + background-color:#efefdf; + bottom:0px; + height:80px; + width:100%; + border-top: 1px solid silver; + overflow:auto; +} +/* +* new dialog style definitions +*/ +#contentdialog {padding:20px} +#dialog {position:absolute; width:425px; padding:10px; z-index:200; background:#fff} +#dialog-header {display:block; position:relative; width:411px; padding:3px 6px 7px; height:14px; font-size:14px; font-weight:bold} +#dialog-title {float:left} +#dialog-close {float:right; cursor:pointer; margin:3px 3px 0 0; height:11px; width:11px; background:url(../default/images/dialog_close.gif) no-repeat} +#dialog-content {display:block; height:160px; padding:6px; color:#666666; font-size:13px} +#dialog-mask {position:absolute; top:0; left:0; min-height:100%; width:100%; background:#FFF; opacity:.75; filter:alpha(opacity=75); z-index:100} +.error {background:#fff url(../default/images/error_bg.jpg) bottom right no-repeat; border:1px solid #924949; border-top:none} +.errorheader {background:url(../default/images/error_header.gif) repeat-x; color:#6f2c2c; border:1px solid #924949; border-bottom:none} +.warning {background:#fff url(../default/images/warning_bg.jpg) bottom right no-repeat; border:1px solid #c5a524; border-top:none} +.warningheader {background:url(../default/images/warning_header.gif) repeat-x; color:#957c17; border:1px solid #c5a524; border-bottom:none} +.success {background:#fff url(../default/images/success_bg.jpg) bottom right no-repeat; border:1px solid #60a174; border-top:none} +.successheader {background:url(../default/images/success_header.gif) repeat-x; color:#3c7f51; border:1px solid #60a174; border-bottom:none} +.prompt {background:#fff url(../default/images/prompt_bg.jpg) bottom right no-repeat; border:1px solid #4f6d81; border-top:none} +.promptheader {background:url(../default/images/prompt_header.gif) repeat-x; color:#355468; border:1px solid #4f6d81; border-bottom:none} + diff --git a/felamimail/templates/jerryr/images/mail_find.png b/felamimail/templates/jerryr/images/mail_find.png new file mode 100644 index 0000000000000000000000000000000000000000..156187d6e6b76396458d40742436465f9a332453 GIT binary patch literal 932 zcmV;V16%xwP)v|4trwF zCZl)mtiPJg7LNjWaKMs-`N-*P9gW9BfoRktNRoh5Dv!<0C;F{h z_djej^vSDN-!l&{xN>FA!I=4iEQ{|biha1dyTj}8v_NYxl&X7>C$RWB zWC}k5r~&{#IXV9prQB#J2tZ=Ex5Ou#ndJb67<61x5KpCpgSGd)lIajB{=OepG@vZ zk;rR5rBc%tM+g=eW1OZnkW6l4dZh|ES#{q%}7yw)V+Vmz0>)YUY0rh$lJkJeSmKEmCpMTvj40dB_ zDU(waFZ$b>sPCjf2!mn$+mU9|!0KNQk-WQ%N?{kj+`OC5<%(YsLY5DUbn)W#iII_k zk58QF!1bF8$Pf|jM-@0Jpl;=``0H(i#f;U1+t$VocLCbQ_@}>B89fjr5^t9&<=#Dh z+)smn4oG_qIQAP*(?z8I%t9;I@AcYd^}$y<-L2|cbYrKUe%>#w9SY*{;i|41{fgo^ zMJWf$3CL|%joIIm%eh?T^IE0+nXNFhDzv#0u|!YAtQH0{kL!;P1p@;khN|xKvMdel z?yADvTr#_`@Zj4@MLT!x+PRt3`X5@CL>?yZ=hJq@GuRtH68t+=I!&Ja!n0?;Ic2xE zd~cd&rdX_gX<63N)YKx_00000??9=4$m#$B zh=rP#E?&G#k&%%lA82uakPx4|jEpG5uU~%|jvl=jrJ|y;1?YfVKxIFW^#BAARUEKp z&B4UKfBz?NaIo7+Nr^DX$cQii*$iL5erNdp{Wk+IFQ2xIjD`tN=_4Tig&Yb10YtU~ zHf}tm$i&11^esbzh=>5cq@*x|n3x~~C{h3W_a98ZefyDtkB^T56cR6AYJ^!>SR6QU z;>1^E2LJ>R$qv}P`(z?0ZrRz{?Zm`{7(f=Yv$H`hW?+D2s(0@`0YiZk%$AcAWw>~e z$3#a*M;7RSmq4LEKnzw15I{sZ;J|^Cz_?}32l^~QP>`P=WU;U?Kh(niP|N@`lL6>J zVDSG020ag$&&9>gASER#{N;=e9Zt4 zjVDiDF@PM+!otkJ2rOklp}+`aFae7^P_(>z_wCE)&ySD1c=6&J$N>NWgi;df>FHkl z_3QUXpd%RGe)+|4=lySnGjA9ej=yANxb>ca;lod4Uo#-ZJw)uyn~%UKVg)Bkkj2c* zOhB3mNHcTKfm&EW1tCBHp+~|0Ppq6g%1jq>(^hhsH+Pe zxNzaZM}Po=N5O+Xe-|(_veq$ivoLV-Ffxcs2r#IK0J9J;Fku0m$pj25p!p0xfxh7o zWM??{UYKFVSr&%p&tEY-d-j^)$B&;3zyb+u0Vo6@G>pv%jS40PO-(5vo83rST2&2b zEgL`pfkWWkpFe@iPW)^C@Q;~+my3Zx0*Ix6G6Fz3kb*D3(ERobihn}zkN?aJ_ujBE z2ml>xtiTOS_1wVx&WVxm5TO7OXJuspX46lsZ{Ga)`1kLdlK=t4^z#3If!X_h&3n(t z$^Z;`1`S}@Aq}*Z1z5=Z2I6o3K?Mu2=mKJ3`N9Co{{Nr}k%y0sVZ~WChL7KW0OOYz z!{;zxqbEpfYjt3HVe+)KwUq@3Af_Mx{w1Dz`dU#h$4=`@TfQAAsW&~Qm2n@RW-#}3VvG6-E=sy7+@g7)>eE0_8|AAH~U*3FY zIC!0hA==<4xXgfLOGczZ2$37^+<65ojP5aKYs%Y5nxDs1X}*-2ZRl>;OE!h3?G3GxN-+nsIi0Nn~@Q@ zSY`xP$G;d(pT5U%@Zb$#?fBs_E9-l|n6o&f|9%cEz%8NPh|%g}S^ z7lWx98-ueHFdBf-Ar4H44}iJs$tOr5_YoKZpT9#K@#_!7f{*v#f=j$_?|(2{f6K*S zDS)v2{{7bsXV2aTT7Ku-|NlQPFf+f~@%#7Pi-!-Ncy|8$`L{qNplbO$Kmf6P{P>6A z%ZJ|#Opm`ZoMmAGR}U^gN3a8#MnKvah>zT7V7T)Vk_&!AE$9CAo#EA^uMFRTp}-9+ z_nCq5|KrDRV72>@;n=ZTpmO0cBje{i3=GeXT)%$y-mzoHUcCd=(LiIMts+pc{RIdh z7G_|r^WoJ`aFG7_{h#5?4=x5R9$@v!3kgn8i1Gug^-td*rTuSU@%Z=MX9h`OCWc=? zwwawc1D`Z6!&KrNf?e5w zA;HV={K+?lPal6Xm`U?7uzr2K=fj7yE3RL^a2IGXR^P&FH6#EKKr9l{%v;{Q_#XWe zXt}ik4}-Nn7Xv>qS8#IxOFULa1{RzCL=-@aVxehG0)&22C}7h8wrP1IvG) zN51@KP#6FCx7Ywc0I{&LeP66+EExUr@izurQ$7X}K~QPP z$iM^iJtwe00=fZgLXsD-m}M7YP*mb#*s|jt!yjOrdwPm9d<6PWoa57t`HL1^0TrrH z2mHooDKY>EAeI(4slE9dJ{(&#^|RHlpZ|d6J<#VsZ*u@G=Vpc^Mo_`zVa3Pr1sI4Q ze*9-}uoq-_{oyZzv@9pX{f~@aUhXZQbLY+-P+Wf@#c~h;2p~|h|NH*+{j%@``A;0c zU?HN|00Ic)fd7k9 z4Nt!N@;vYJf2Pl{avns3eE#zvq=ftnuLJ&r=_j9=86Mv}GqX9xeFZe=Kf~I2qyT^b zVnm|Z9jdq3nAPKZho`kI=04kDLw;Kmajf;e(oKz=D{82a4H|deQ%&dHO3f$iI=A=+FT` afB^v2MBe@HP)kdg00002VoOIv0RM-N z%)bBt010qNS#tmY3ljhU3ljkVnw%H_000McNliru)(i;=1|_1zzgGYN1PMt*K~zY` zy_HW)TvZgtfA7tkzsxYh3&+E^nYG`512mPjcTiU@>4VSs^Q{xEOeyqWi|i+Rjo1lz>K@8rJ4OV0P5 z@7{Cnl?49{GXE#e9sm5&S#jp{GZkfF<>6AlYLR-3W5MPIbcRm0UcNJp_Rs_uyUmER zvz`WAWXMwaRAV~}=$H>A_@PDaF(TFeN2ozyBG{mk23AgVTpi9lfZ$5E5pi~gsl$Ol zAb>b-ppo(RryGY?DIj(wxYi=|n2{=f4M9vR6~I8n3%IEdrH?jDEom74AQaQ>U*-v~xqq#hBe^alwbEXP>I3j`{8eAd5xj6D0;0p`&$ zZN>EQgU-otN0Tdz+tMq4i?~k+1qm4mnGEr*d6IoN@Uc!3fl3yYJg|&Hid6yt%yWz1 zR53=cdV6^J)&?1}N{SRRHlP(7%{22TE958uf+#9pWHjzD%;uu#FAPr14XwpfsA%XI z3d9i<$P*%f1h`QV=%fjgqk}Lvxu_P#^1W-@x*9nO#d%X)$yI-z9APw6?8xMaks!*; zm_$kO5?cTIg~{3B9lGT?Q)(~APH7yV4KFV2$TYLY0jH7o7<=8`HbC@E1+P1gEcrfSgD9iSV<0iH^6lv}-?2`7Z+)x|m2l#J|4rZP z3x@(gf~pzgr|&P#MA@_kgnuUh2?Y;cyf~2o6P*lc)V(%u8-D>*yxCRD1~$n60000< KMNUMnLSTY8^!6nH literal 0 HcmV?d00001 diff --git a/felamimail/templates/jerryr/images/write_mail.png b/felamimail/templates/jerryr/images/write_mail.png new file mode 100644 index 0000000000000000000000000000000000000000..98713acb9f8befd30956996053481c18f7827bd0 GIT binary patch literal 710 zcmV;%0y+JOP)O3LQODjbR2bN-n;MK+rmFHqf!SB+=w`NG_$>;l9r~unVN=RsSkLu8gwqW4_9iWGAv{yuGCD=J!ls2#0xWR^5vMrMlvM(5`!Sg!7~Avy4b>Lay`JiiM + + + + + + + + + + + + + +
    +
    +
    + + + + + + + + + + + + + + + + + +
    + + + {message} + + {vacation_warning} + + {quota_display} +
    + + + + {messageListTableHeader} + + + + + + +
    +
    + + {header_rows} + +
    +
    + + + +
    + + + + + +
    + + {message_rows} +
    +
    + + {IFrameForPreview} + + + + + + + + + + + + +
    + {link_previous} +   + + + {message} + + {trash_link} + + {link_next} +
    + + + + + + + + + + + {image_url} + + + {prio_image}{attachment_image} + +
    + {header_subject} + + + {date} + + + {sender_name} + + + {size} + + + + + + + + + + + {image_url} + + + {prio_image}{attachment_image} + + + {sender_name} + + + + + {header_subject} + + + {date} + + + {size} + + + + + + + + + +
    + {lang_connection_failed}
    +
    {connection_error_message}

    +
    + + + + + + + + +
    +  {quotaUsage_left} + +  {quotaUsage_right} +
    + + + + + {header_subject} + + + + + + {header_subject} + + + + + + + + + + + + + + + +
    + + +   + +   + + {lang_subject} + +   {lang_date} + +  {lang_from} + + {lang_size}  + +   +
    + + + + + + + + + + + + + + +
    + + +   + +   + +  {lang_from} + + {lang_subject} + +   {lang_date} + + {lang_size}  + +   +
    + diff --git a/felamimail/testimapserver.php b/felamimail/testimapserver.php new file mode 100644 index 0000000000..2f341cbc5e --- /dev/null +++ b/felamimail/testimapserver.php @@ -0,0 +1,168 @@ +THIS SCRIPT IS DISABLED FOR SECURITY REASONS.

    PLEASE COMMENT OUT LINE ". __LINE__ ." TO ENABLE THIS SCRIPT.
    "); + +######################################## +# SSL example +######################################## +#$host = 'ssl://127.0.0.1'; +#$port = 993; +#$username1 = 'username'; +#$password1 = 'password'; +#$username2 = 'username'; +#$password2 = 'password'; + +######################################## +# TLS example +######################################## +#$host = 'tls://127.0.0.1'; +#$port = 993; +#$username1 = 'username'; +#$password1 = 'password'; +#$username2 = 'username'; +#$password2 = 'password'; + +######################################## +# no encryption or STARTTLS +######################################## +$host = '127.0.0.1'; +$port = 143; +$username1 = 'username'; +$password1 = 'password'; +$username2 = ''; +$password2 = ''; + +# folder to use for testing the SORT feature +$testFolder = 'INBOX'; +$enableSTARTTLS = true; + +$startTime = microtime(true); + +print "
    ";
    +
    +set_include_path('../egw-pear'. PATH_SEPARATOR .'/usr/share/php'. PATH_SEPARATOR . get_include_path());
    +
    +require_once 'Net/IMAP.php';
    +
    +print "

    ATTENTION: THIS OUTPUT CONTAINS YOUR USERNAME AND PASSWORD!!!

    "; + +$elapsedTime = microtime(true) - $startTime; +print "

    $elapsedTime :: Login as user $username1

    "; +$imapClient = new Net_IMAP($host, $port, $enableSTARTTLS); +$imapClient->setDebug(true); +$imapClient->login($username1, $password1, true, false); +$imapClient->selectMailbox($testFolder); + +if(!empty($username2) && !empty($password2)) { + $elapsedTime = microtime(true) - $startTime; + print "

    $elapsedTime :: Login as user $username2

    "; + $imapClient2 = new Net_IMAP($host); + $imapClient2->setDebug(true); + $imapClient2->login($username2, $password2, true, false); +} + +$elapsedTime = microtime(true) - $startTime; +print "

    $elapsedTime :: Getting hierarchy delimiter

    "; +$delimiter = $imapClient->getHierarchyDelimiter(); +print "delimiter is: $delimiter
    "; + +$elapsedTime = microtime(true) - $startTime; +print "

    $elapsedTime :: List all folders

    "; +$imapClient->getMailboxes(); + +$elapsedTime = microtime(true) - $startTime; +print "

    $elapsedTime :: List all subscribed folders

    "; +$imapClient->listsubscribedMailboxes(); + +$elapsedTime = microtime(true) - $startTime; +print "

    $elapsedTime :: Checking for ACL support: "; +if($imapClient->hasCapability('ACL')) { + print "supported

    "; + $imapClient->getMyRights($testFolder); + $imapClient->getACLRights($username1, $testFolder); + if(!empty($username2)) { + $imapClient->setACL($testFolder, $username2, 'lrswipcda'); + $imapClient->getACLRights($username2, $testFolder); + $imapClient->deleteACL($testFolder, $username2); + $imapClient->getACLRights($username2, $testFolder); + } + $imapClient->getACL($testFolder); +} else { + print "not supported"; +} + +$elapsedTime = microtime(true) - $startTime; +print "

    $elapsedTime :: Checking for NAMESPACE support: "; +if($imapClient->hasCapability('NAMESPACE')) { + print "supported

    "; + $nameSpace = $imapClient->getNameSpace(); + #print "parsed NAMESPACE info:
    "; + #var_dump($nameSpace); +} else { + print "not supported"; +} + +$elapsedTime = microtime(true) - $startTime; +print "

    $elapsedTime :: Checking for QUOTA support: "; +if($imapClient->hasCapability('QUOTA')) { + print "supported

    "; + $quota = $imapClient->getStorageQuotaRoot(); + print "parsed QUOTA info:
    "; + var_dump($quota); +} else { + print "not supported"; +} + +$elapsedTime = microtime(true) - $startTime; +print "

    $elapsedTime :: Checking for SORT support: "; +if($imapClient->hasCapability('SORT')) { + print "supported

    "; + $elapsedTime = microtime(true) - $startTime; + print "

    $elapsedTime :: Sorting $testFolder by DATE:

    "; + $sortResult = $imapClient->sort('DATE'); + $elapsedTime = microtime(true) - $startTime; + print "

    $elapsedTime :: Sorting $testFolder by SUBJECT:

    "; + $sortResult = $imapClient->sort('SUBJECT'); +} else { + print "not supported"; +} + +$elapsedTime = microtime(true) - $startTime; +print "

    $elapsedTime :: Logout

    "; + +$imapClient->disconnect(); +print "
    "; + + +?> From 6a1b8b74f135a9afa28de1c6d477ae6c2dc4c9cc Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 9 Jun 2010 18:40:59 +0000 Subject: [PATCH 002/496] added EPL logo --- phpgwapi/templates/default/images/logo.png | Bin 3596 -> 8704 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/phpgwapi/templates/default/images/logo.png b/phpgwapi/templates/default/images/logo.png index 13c35b02871a8d0d608fafd9788f01a2457a4d6f..baea5fba3679d78ad8e8630bc795eaeb50e887bc 100644 GIT binary patch literal 8704 zcmW++2{csi8=i%+U3-{G*|VfFmO^ApmQo_2jj@a^Wl2)W%oxU6w(QBYh)|T0A~Vd` zX^5f-V@X8DKFs!?-~XO-?|1Jx_q*?V-|u;s^Socm*)#UyqPs;wAdtADgRLun%;BGQ z!Z7}|Q~pH?e-H??K5Y#G)pQyQrq1)95m6^Rqt1l|MBVaC-!MshpfwR(?oyYPtszo1r=Xb=|K(bKT+OLG^e&1S>^4`oW`(2v%%uhM z`vA58Zl^sti4xNK6lNJ$_@=gwH|&w)hw__a^Ojh8x@QBXe*X@D3qA*9LB5Et$Go)+ zoU>cz-{<*_yR|vkmhV??J>YKls6hOi_nubz@2%ZNDJl2y;-0f?Vs9qT1YJZdL-s;6 zH3NQ|(HrJWiLoo%af0Dpu%n^7~i4lA!VA-^%xAn4!Te&Eehe|{Y5q=K%y$r(5k9v7On+uedtN{V}0l?L^7SK$KG^z?Kf zoyX(c-PoGI$idw0V1#9iYGoYc{68+ zjMYfkAm#rebqc9eTZH?oG4kYMXb)p$TI+4!ZO-ap{L>~i%JKv$D^afh8;7-(VQu3^ zouSU#mmdtB#qE==jhgcHGr6&@im!f@&iQP1OCrk;<9AONpIIvml@t=gzsS?1grUj< zG&D4%K*B`pZvirLay}!CftL8PL{rKf%{%$qra~cfVQ*x31d`2V7KeZ9?vDDsQ{pig z$7Sc2sp_?cuh9(&jTzoF>0Ohmx~kuX>ka-a1RH=xF9TzXy}$&9yVvF09xIUeCs+fK zs6xql)&Wm<0uaq{+b2JP$rrCKkADU>>o;SPcEbzd2oqCN?D+%so0Pe*I^!jib?-}; z@GkDIyG9&*1@bRH$Nt`lh8^77C;ck`!dLi5@wAY;SoxX9=>Eas0Osa~;`~xLD!(*Q z{LkS%!6HTvsKTKc$`+B3r+JBj+U>pJyzwi9(GS;gvPBQmHK4M!5hsA;j8kY~iS87C0fD5#^5$&5i9di1%I+}hdA_}dYdjntJ@q*S7-5HZ`g-#mwQrGzwV)putjKg%jsnnR-q2BO6aNg}eX%rk_)6>)bf0jzWsOYFlgbqu+ zZXYojL2NFXQ8RZbw2<{wgq1nbw>JFFx_J21zI_YI4|xWHfFMErNdl6!{tdU+j^eYk z)nXR#a1|}xzOxqwf$BSKIGf#y`z9|7l{J*5SfYA7y`78c9kf#0Q9X@L8ZvC)B+L$V zlQ~BVBk;&mJzvHNxWt=A(odj#Cz4TZ?Q3fbU;BOqCMb9z{8^#2@C1e_9Hy)a)zJ|l z{2T8AQbi-JK9Ydc)Kvh3yFX9D@C?{OQ=?l-2HN1+IGJ1`91+LaX;A@%Qr>`M)x|1A z{nhn4l`Lt~?2wXr^e@>wq(qEq!8Qm-kbiJkvt%i29?}^)oI3nOPiOzb*a& zPi>w9rHYA|+%l9mD^6L_;)D2Qir3jLP-V1L*=hSrW=OQK!5C(BHQHlh4}tqq4Dmf| z418Tu+NogA9$+|Z935U;hejST@RgF2^NV4#k3qF0_3$rKbns>G_famPx`Zy`toAcm zl5Tr_ALx}FyO&3Ad!`7mB=-2AAe-{m1x`qX`@Dx#*8>toR`ru-@z+FzUHpvr5Y_My zXM=x#@HT(z;kOr2bpZTE}7fBJGyH;HNEdCEM609Eo1%R`t-23uA}thWB<z93E>KeDZyAbz@xT->lLmq6=_ye7h#D9*A<87ko_Y%IlWf*#H9cY# zyX*9#n$+JXDI$16S8~NpG6V#+jqv3kn)bzDBXS%)$jJA-sOP;g8L52Tbhjp&N-u@V zSU6^ehxcFzqJuObf+kqc3x;ndBXbH16KC0+4!!8Zf}Pl6)rr#Bz{y?yJ`Q!# zsGu=+tX{wO7os!__HKT+6X+l0GMB|$j=ptQ97fP1M>B@KfpphcAn&Lv&~eDJN=P&B zI!g69tb2o}D%dsQmsCHowvvWI%}x4)ZUO^4(kf=8%uBzJD(?0w(0eLzg4Cx$Q#lp6 z1t3WBQz}0&clHnUx1Sw8+s4>D=-7k#lH)HOb6NUpv%tZNIWv%YYfNPP@WWU(rISo! zW>{w?W#!n}iHbw(s5^<=Mbr^h;c%*mO5_r@)MqXGh9xNqc zxP}IXGA?OIL-vk{letRSB6%{FCFuM8Ln+X7xf%!!T@>eMFk^C4OM9>AKSxnfkt;rP zzL*`}gmSP$VEQMH+@2|7nMuw7m05w-u>!e_1-QDL52&aK_LY*ChfVWrt%4e4GH@$2 za<70B)G57m{BywNdt#nH*LY|t`c4m7Z>N~PsvAvU)$k6@`3CN5HMi@hDo&TvN)g*J zOm@aEW-nRgOE+0${~*;A{=ka`ESjz+#j!SXrALYg6&+W{E!!h~IN5&{6CtOMGwncmU+zW&P?CL(>Eu-2iZ zZ+>UxMSt5`XCd0*x>OW`}tcF1U@6qlHlXzhM6kG}A}O5-NUT8w2nf?Lvf zt@mp9@tgM+JNwpnoW@%S_5sU)_}_!vy0X)Z{JB> zFn~x}#IhxnZm7v)Wp)L%?UmFLn|}G1c8$kl)%3KtH$BWRUQ$1@aj|Ftn40pP9N&{y zdoiJ7zpt#UqWqipR@Dh7%(E^AgH*6V21cNehtn<9>EuXdqcR^9ip<#1jktDFTuzX% zSb3dr%HuVX0X-$wjqJWz%9SRiQd&i_LGvoS&n5Q-yaYZR;jFKQ*BQmL|0ECG@TX$Vz#FQzl-W0{q>1Io#)emi%}y?&l!-HZX>{E(g^zGs|c! z(V?*4o8hkQRU&lI9)la_Nr*?U`f%clHT)FzTR=bPPQdI>ajCUL0hO}H1yU4}HwI2U zk$`Zo`6c|CV2yt^6co_u;HdA=)n(w&9gH+F9g#U{JB&~{m3|?!{hkJvsgx_bC#b2r zw1^+JrM@*v6F>X338I0eEB66OCG*x7GpbS~LWD)!PABo{3vxJT=O9d4S|4?HPN?D5 zx){7r#wHf z)fK+DC`j-o*XMj}K0;~CD8;5sD^p087;=e?goFgcU290fqC!&OWn`j>>U(OVq%xdp zn*g`KY(u>AT3aF1&}wo>Q6aAIej+ZnP_QXk;+=4Yi2Y6RqKvv5TS7ah3tGPajIU66 z9-+R+NL~T!_qY%j|+j9 z&TIM0t{KC$5UXB7{y|zUzQOPe4VrjuI;`U3KezhJ$^pIcxOrC3z8@^ka;aanQ*z6t zv!kL3&R$L3sOneXfA(+Q+(4RxKP44*zR{PLkSFwbT-P6RR{;HD%09x56j+O-+{f)5 z5%WU_!oplk z+_>W=#E(OD(&771asxlddooLlB|`t$WVcog*GQLvBJVm}$!+N|6Bt2$!#-585{@ij zDh%bOm2zvr(ZmmM>Lmo3BN9qn$F{U z%N-{kc~C2LH4<=sY$;S7w34L*s)ZCs4w<<}~CiZZ`enR_}52M~jb0h~bPg zO0m<;1N!c&!pLOeL%Ru_$jLJoQ|Ui?JQ#$dK}VrO55OCpDzdfd0L`n(-{EwsU(D*d zsf*ZTGuB;+%@RK(#5}=7EbQLjG9|t85}H*IQxU4<@;3_%N&bD~266U7Hu*a8L$*2I zJ{+LL7oM9q7Pm7K?B%GA7pRRmsG?0JzI>8;^95&knKY^N^8=|GPz&`|KBRvU>?Ga< zNH(WJt6F$K?aDlfWQrKUtm@BbD}hr?X&98d3T4FyqW*65fxhtCnh+jRoA4=W>5$12 z#@btG)uA|)FIOPcn_H_g4>qQb$Rxz@Jb77>)+}Q;8j-9^-9Rfl61q+?^n4KLz z76yfqEhch7>Tc)Hm(b@~rCO&rxu0Ixry;95&-pNn^355m(=`X0(7LtytR-Vv{A2PB zJ@GFdk~oi>l!C)=Z1D;SNe488 zl~D!PqB;wuwtEhb*`KRclep4Ll$8=j`*#7E8C)yL!8A}{twC7eSsmk=~TJgsV z&{I$DdXt}Nn|e(F!%FuGch(#1mf~95bwi%F38p7wLMH|AlGxv9 z9@_`qPmiIfP;Co<2AhHT^<(D&t*zdZAJBA?i<@RecvwXuN!^we8(NRSbGU z!}f!Ow_4x&=b$kNx?-+pkx0q%__t_Kq;6 z{=DF56m6lyl8{DrJ(-!GlvS7|cy)6Qy8xJUYFHw(SLJ${BCs zp82~#H<#;ekZc=*&^q_Jf`nBxFK0m(PV%@M=bKBfiveYCj30AzUWih^*BEYbZ%4Y< zW-9XBb$;Gy)N3xUKXkj7F}Wd0(A^>-XAZ@R8kCmGC0z)$V(E?FX(e-6dnt)DQL@{% zvS&Sy!gnL=rs|uxK$8_m3C~RZnxl8H=BUmC>I!hw2TXel(u;_Bvcyq@A?ZT&GW z`@RoHU6Am@*@*Sa_qXXAh&c4w)Mn z@izNgpY$xcWh!Y=%i*zSdwd9%-itA&Ba8*GxYS!iUSI?71TlJAcOw9k^%uBB zN;M2O^v&}l;pDP+t=(d@zC&lM!!lcpiCuh$VbPQy-INbnRq%uwbcWvxoo}FbhHvFd;SFfIsJlWVH=vr? zmVgvntRU0BkYrH1`q{6uX{wL0W?8jItYR1CT>3qb`?Rt}TtLj`l-%*B`LZ?v_%1Y+-1m`hZefVxHaq&a9m8d=!}+mKsdnN6 z6t+EE;77AT`{Pu$ch%>#mUDk3YQ;O!gB}`kd}Fx9rB7BvcTxJB)y_O!^j4m}F_;sm z2VWhWf;Znwib7dG8zz2^tgfyGJ|aXI4?5HG!w@4sF4&(F$>NvRooAeuEt`b$O^C0B zD>?*1N_m{Ee7dp}kGGXUmplu4H#EI6T~1!ezE2<48){#iqb1v%adHCS5qj2D?3OZ- zpu?Jm7ni7C)-$XhuBrR=p||o9n>4@uw%I}?6q1m!f&Kvv8yE8E{Z|t&#U7X#YWqRL zW>9h9e#anx7P*DZ?k6CJP69~Z zA!9jZ^eE?dpBXIdmItAn=8gTJU1EMyG&WNqNKSomQn-Khyd6qcamZ^MU*83K7bWmc zCoica1(%V7r*GDM00@CaPKW`c(N{49a4Sewuk z&9aC&4-ygz5fS*gRhkL!sST#c6E7uC%s#7lPG(FFsKdY(%>!~y*Y#AC#r<3WFFq0o9-i4P6kZjIcK7D?$9M#AG zpS`4jaAhx_JQlZ6Y<<}cq`f`&BWJi2H)RPwS?7oNXBj8qgd$VBzSyCV zx!~BRqB@{=4+V@mG_^HMiXv-4SWv5j6LHYWD(mmxTyEes}kD03Sja*L{cMyOm?@iaPbVV}M+y&Rxn zA}_xGb$FZiM@+23+V1Pjeo0A5yTcAZ?T7aPCb3L7{`td^AW<7WX(r(8#3xZuXI)&O zTG}D_WfJ#I$f>%vog(O{Vh#4%z9X6hx4U3MN~6URmyOHH8rf^?cjs(JK9`s8ri zn1(VkmZj0F(zTNN#A90EIMb|0jGUeJr;W+uvY}f;ou)^G1mf{f#P{ke6ykHDQBf+9 zAD74}B1RS(YHHv!XEi|mj*0?XmvQ+5wYA8KRNUq&56zUgsJs4GFUG9C0c1#-)%E6z zF$@f)j#kJ=rt7FPlmUO9nGW$nDcrVzhl}2Vj5@Oc z;|b&y=H|AXy4Vc!a_c`|eye9&d{(=)VPM7z@n4dUsV`TZM4^2fwpO>EA5OB+M+!4Q zjjUcEXDb%P+@8+RQ5U(2wH6O^e61X4Z0_>0ex-0fWrCy(|Hq#6ulN|;LgvoptG=v4 zz!3=hb09ge6=>kvW2?+G9p0vHyUvfg*W*+4+0W|x$LprS3$-VZBF7*)j?+ z+AsQUxsC~`K!4^2cjbt;y(|HKi}UD1jThDf#Aa__HL??u;zPFYlx9D!>~l^zF2fQA zK7aed6K@PJxq6}jak&qh_q%exc6{JJ5pe&;t38$&!=^jigeUa|N%Vo~K%%4PN^5$7 z5RqUJR5?2^T@J9Do;@3ag82(nnKIv#Uqg=W3nO4Ks#oo;MxUD9DcA4p>3UZGq~HR= zWJC&|rsqvUPfpW)W7fFGC>b>qa0?uxJOen{-5q}T!}SSt!PjB%>Ro z38k2w9l-&y-27a@W$Hd7h=pi{BwyJ66p^TiwZFq*a5gj+as6`h7sleZ8w`!Br&t0E z*eM&(J6nZ!?b=%EDb`lleCzY)@8i<)`JvZ7-uk>F4kxWmy51E__-iaZn#eexK^#2w z*!-^D(7@4W*gJf@YoB!D_X7i&>}^9lE(Kg`v?CV4V{eEx^(nfYL-26+V#JG^J$3qdk7l!O)*9k zYSbcTF(VdbAfjl7k54yZ-ie8`7*bTX?)Zj{{?HV=DHCP3uj}!-%yXz1aOfj^9x)yA zliv~Yz0FxTY|`5K@e1@I2*Yb9apa=LN*_GX#1~b{Ky}3wDNoCECn6)?lG5&r2-OUY zVHi@BTd3URt4c}_iBDyp!lS{bw7k5&Ds1=YXk%%>Bz^b6Cqd$T^%KWF>bQb}48ebj zhQcOz;guD^g`$ibb;s^0-9~f1k)Mu&UZuX3M;|cts8Y_rmy~=)OL}8$+m(cUvvT>@)-H2pDSa znWw&xNql|h2A-H{PN@s5vG*&n<4>XK)Ac5%=7TbrPOzbNBx_!oB8VK>MDPw&jQvdCt(Y<2D=cvE#vNg=^5bf z36Od(dk!KsXFz@s>*Mdgv&Gud648%HQ3$iJ%=b_LMNeQwM2z0>grZVMF|c6Ah;}}u zQwN#O!-FH9iYk1!jsM{ouK9TwxqJTIe=U+F>bh*Ii`w$?#Dv~Ii#s1matgc7IbVVo zXcxev|9uo(6p25n&j`>wn=ke85)*9{LQwjzj{Q(*RV>omCvH9M;8k98>_KzX@@zK0 ziExj{TP}U_u%WYWKpSrHp9SBBfTH&b=*m)Dt-T)S*u??dF%qJoW#aeA60#nIXU8f{gkvcs>V9d~#JYRV|_~HQoZu3yReW-|U+T zo3JqS5702E_Nv2KySqml1rSvDdQ@s@_M6(LIIc{t2{a72gRQ_pY~jEvGo5`|^r4k= h&-4uiz*bl=X!D7O1)H`U&)>oUay)Uy_O%Tv{(l7GmDvCQ literal 3596 zcmbVP`#;m||9|g1jEyOW$XIgw(U&vIC(<~)*AMCdk$oFc;rm3vFpxDh$0 zLL~K}CaOhp%&mh$DkQ$UzyHAZ@%a95U9ao<;ksVe^}L?1=j(c9(>xqyrB$T?0FZTd zqS7Vyj-(kQ;gY^(1=lGt&@i$)831k%Si*8XNaiXrhZr%3Pld+B1)K>1$ib%qLvYR~ z1HwY+ApybXPd^EY% zn4*9`liF8;BqxwJNFSg5b>KO#rY3>p?fpZ{Izsk`&g9TamF>^dv4(nV&hMMr{uCAV z+h_<9SMu}gNC_$K=>D&hU1oGW&@Q0*yoj1B$IQNq z71pblmUd>+9})!NWRJkz3!w@oTYTc|jWDESJ>`$~hEQliV8(L6d$O`8xH5>D_)7_m zey*cWn7OcD!Ne2;oiXBVlpU;7%m_H+BIx;eC1t=(f=22fDE5n+o7=e~et!Fs)>jDa z5X2{uvx|!O~w%Gq37P9u{@ zKt)5Nxrr{cnxSx7rP*#1C>I?h4@nbai%A`C((VtrEec?UHQOl`yZk~Q@A&ueQtQ_x z;6&nlB}}>2FnK=_VRV6k4OG<@7AmCG)*8g8Lajh)+D@b)xw-T_!=553kxkr) zl<>H$>uXZ&ey+nl2T&|P0s@GJ99J*e477LlNC z$NPB}t5^0N?_Ollv;-I-Z}~aqg>iY-|DJUxtvctJbkGTOnu1O(_mKb|48MCs5jd1U zpf50D_l#DYQCp1lxj8QFKO=3cGQZl|g<$w`( zKo}V!fB(&4I2UoqU$xaOW5~#$EXcB6UPY)n2TaN?A_gf<`ijD5P@$!|^Iu@$S-0-b zaiV8LU3~lWX&YftUAi_}I^T=&7IbD8tAnI;hM^f2Z#n~TyI=E_B57tMEc0kXIvPWA zTTmwkj<+26a}$%Wy>fjdH>dE% zfn<79>R|fO97Q(6Z!bf^#APnPnb8d93A}ZpZr{A9^;1ctaA$7`NjgSqz=v&y8F_y|V&$d)QNu`>7M*O!UTTRHc zk)Tw;E2s}v&bJ(&X2VK~Eb{!Pz@Z#fy+h)gGvNboag`sdO?d;W037 zF7bz(EJOcnigCjpcu??<*SC*PuZ_2zibfSCt}XEga0?np3f4iTwu8MVv*O7$l9zI` z>RC!rrB4R5MXH$R4m#MZeMQq(%Qo-xAFL1kZ0=O_OSXV@?u)~0<&}1xpjaM>6;2Ff zr@5@o%L~iEhQw6SAQFbe?L0$KWQ=Wv1q7_aBC%(++8VP#xbKmXk;y_45jP4yLl9}& zpxt>I4P2KD;RW}ln=-j)L1Vk!4th`r)X}ObrbNp@hfDD^tt2)cl1qs4{Wf4OugeEbcs?PGjVb$|X4`98?5g{QR*jm-^E4}ygb0>DZKfkCC zv~T8BeZ8Z0$>t|bPmVJYuaT)5yuB9;#mFRRX$!)8B>BeA%jVbf3x@johZo-_sP7K`q#x9M8i1|jrty0Ua7x*V_$@+)-&J&wt8^mFx#mnew;A9~LYL8jEq(=|! zO0zIc@%P1!+wZ)||LODvD`E7rkZU|@+~Sz|(%qo&@bDY5&<_yv|B%Xnn@U^`d8jxO ztzl}Lyrp(cFUv{9n-&n86~Zl26fS|Di{zaNfc$lLFK~iTmWq5y+P|3uuRExpRYLp1 z)H8U7E$V5^4V?O1dRS~g>?tT9pDb)^s=_u%aAzqa* zL(okhU0t4iEO=gFXLey@Rga8%@oVdMV#pl6jmgf;%q08yT_yYbUn?z;Sp|+}9=lFi zzs_<;i=gl~CxZ9|xwcY;Ig$Ig*K;B@N@~_1DFWmZyout;FZ>Z~!xb={-`O?XK7iaw!Nk@gezVJ!P zdo~L>*Zmh_R0DbxKb2Yq*A!5{re8LFn|XJrm=yZ3*!U~%ikM_JS-Bo&37e+uV22pO zSQp0;qA@wvhuqzWFbPz!SM?VO-ppSmQUhUH%_pG8cdajuw*|JHn%oJq(2JT<&A@Xx z{HCxb(b&^eR#I*#sMw;S^&s{Jj;`%{@z6vf{IgBFj~UO%81bPi-vW#HD&~kf$}j4q z$d9|(A#YPj zEVqRiH%yhqmYI#HWF5aJcg*=vodU?I3d<*|j~i=v)?RY@^fX(|q1P*->v0&I81U}# z;f=4_twpGz=%%Iipq)Eh-`i135qHd_`u_b|iA2gQ7ggdHnOnW8Cv3`>uF+fvp~=~qe)s6*9v=5v2R18RBka9aIQk6tq_wBFiT z{AoVDY7SPmNKNmGn+=b!#WfcBUnUg2%eO;f9+5=|Hp%gv%yN6&4qN-)9WkhCOWpuO}bx`g7<;Rn_;W6BGA$ zGpuKA2QZ_{__LoCI|`CBc6Z(y{!Dn|5fg_U;gTks5aWKC%|JcJgD^)X6pX{!y_E> From 398e672b45c9d1c7da77a31a372381811a62c95d Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 9 Jun 2010 19:02:03 +0000 Subject: [PATCH 003/496] EPL build files --- doc/rpm-build/apache.conf | 2 +- doc/rpm-build/checkout-build-archives.php | 25 +- doc/rpm-build/debian.changes | 707 +++++++++++++++++ doc/rpm-build/debian.control | 310 ++++++++ .../debian.egroupware-epl-core.conffiles | 2 + doc/rpm-build/debian.rules | 112 +++ doc/rpm-build/debian.tar.gz | Bin 0 -> 37315 bytes doc/rpm-build/egroupware-epl.dsc | 11 + doc/rpm-build/egroupware-epl.spec | 713 ++++++++++++++++++ doc/rpm-build/egroupware_fedora.tar.bz2 | Bin 1443 -> 0 bytes doc/rpm-build/egroupware_suse.tar.bz2 | Bin 1462 -> 0 bytes doc/rpm-build/phpfreechat_data_public.tar.gz | Bin 0 -> 101462 bytes 12 files changed, 1869 insertions(+), 13 deletions(-) create mode 100644 doc/rpm-build/debian.changes create mode 100644 doc/rpm-build/debian.control create mode 100644 doc/rpm-build/debian.egroupware-epl-core.conffiles create mode 100644 doc/rpm-build/debian.rules create mode 100644 doc/rpm-build/debian.tar.gz create mode 100644 doc/rpm-build/egroupware-epl.dsc create mode 100644 doc/rpm-build/egroupware-epl.spec delete mode 100644 doc/rpm-build/egroupware_fedora.tar.bz2 delete mode 100644 doc/rpm-build/egroupware_suse.tar.bz2 create mode 100644 doc/rpm-build/phpfreechat_data_public.tar.gz diff --git a/doc/rpm-build/apache.conf b/doc/rpm-build/apache.conf index c590b9a723..227b541d03 100644 --- a/doc/rpm-build/apache.conf +++ b/doc/rpm-build/apache.conf @@ -29,7 +29,7 @@ Alias /egroupware /usr/share/egroupware php_value memory_limit 64M php_value session.gc_maxlifetime 14400 php_value include_path .:/usr/share/pear - php_admin_value open_basedir /usr/share/egroupware:/var/lib/egroupware:/tmp:/usr/share/pear:/usr/bin/zip:/usr/share/jpgraph:/usr/bin/tnef + php_admin_value open_basedir /usr/share/egroupware:/var/lib/egroupware:/tmp:/usr/share/pear:/usr/bin/zip:/usr/share/jpgraph:/usr/bin/tnef:/usr/bin/aspell php_value upload_max_filesize 64M php_admin_value upload_tmp_dir /tmp php_value post_max_size 65M diff --git a/doc/rpm-build/checkout-build-archives.php b/doc/rpm-build/checkout-build-archives.php index c10765aff9..055b6450b0 100755 --- a/doc/rpm-build/checkout-build-archives.php +++ b/doc/rpm-build/checkout-build-archives.php @@ -17,30 +17,31 @@ date_default_timezone_set('Europe/Berlin'); // to get ride of 5.3 warnings $verbose = 0; $config = array( - 'packagename' => 'eGroupware', - 'version' => 'trunk', // '1.6' + 'packagename' => 'egroupware-epl', + 'version' => '10.1', // '1.6' 'packaging' => date('Ymd'), // '001' 'egwdir' => 'egroupware', - 'svndir' => '/tmp/build_root/egw_buildroot-svn', - 'egw_buildroot' => '/tmp/build_root/egw_buildroot', - 'sourcedir' => '~/rpm/SOURCES', - 'svnbase' => 'http://svn.egroupware.org/egroupware', - 'svnbranch' => 'trunk', // 'branches/1.6' or 'tags/1.6.001' - 'svnalias' => 'aliases/default', // default alias + 'svndir' => '/tmp/build_root/epl_10.1_buildroot-svn', + 'egw_buildroot' => '/tmp/build_root/epl_10.1_buildroot', + 'sourcedir' => '/srv/obs/download/stylite-epl/egroupware-epl-10.1', + 'svnbase' => 'svn+ssh://stylite@svn.stylite.de/stylite', + 'egwbase' => 'svn+ssh://svn@dev.egroupware.org/egroupware', + 'svnbranch' => 'branches/Stylite-EPL-10.1', // 'branches/1.6' or 'tags/1.6.001' + 'svnalias' => 'epl-ssh', // default alias 'aliasdir' => 'egroupware', // directory created by the alias - 'extra' => array('egw-pear','gallery','mydms','icalsrv'), + 'extra' => array('stylite','$egwbase/$svnbranch/egw-pear','$egwbase/$svnbranch/gallery','$egwbase/$svnbranch/phpfreechat','svn+ssh://stylite@svn.stylite.de/stylite/trunk/eventmgr'), 'types' => array('tar.bz2','tar.gz','zip'), 'svn' => '/usr/bin/svn', 'clamscan' => '/usr/bin/clamscan', 'freshclam' => '/usr/bin/freshclam', 'gpg' => '/usr/bin/gpg', - 'packager' => 'packager@egroupware.org', + 'packager' => 'build@stylite.de', 'obs' => false, 'changelog' => false, // eg. '* 1. Zeile\n* 2. Zeile' for debian.changes 'changelog_packager' => 'Ralf Becker ', - 'svntag' => false, // eg. '$version.$packaging' + 'svntag' => 'Stylite-EPL-$version.$packaging', // eg. '$version.$packaging' 'skip' => array(), - 'run' => array('checkout','copy','virusscan','create','sign') + 'run' => array('svntag','checkout','copy','virusscan','create','sign') ); // process config from command line diff --git a/doc/rpm-build/debian.changes b/doc/rpm-build/debian.changes new file mode 100644 index 0000000000..3861f09fb7 --- /dev/null +++ b/doc/rpm-build/debian.changes @@ -0,0 +1,707 @@ +egroupware-epl (9.2.20100112-1) hardy; urgency=low + + * Fixes for session problems "Wrong domain" with basic auth clients (sogo connector eg.) + * EventMgr: OMSE offset, bigger title and storing index state in user prefs + * Furhter fixes/improvments for Funambol + + -- Ralf Becker Tue, 12 Jan 2010 05:00:00 +0200 + +egroupware-epl (9.2.20100108-1) hardy; urgency=low + + * CardDAV: getctag and supported-report-set support for Sogo connector + * Replaced xajax with new version 0.5 allowing synchronious requests too + * stylite/mobile.php supports now a 2 column layout for landscape displays + * Furhter fixes/improvments for Funambol + + -- Ralf Becker Fri, 08 Jan 2010 04:00:00 +0200 + +egroupware-epl (9.2.20091231-1) hardy; urgency=low + + * Exception support for CalDAV (eg. display or set Status for single recurrences) + * Fixed problems with not set timezone preference (fallback to server tz) + * Fixed Funambol problems with SyncML (use iCal format, NOT SIF!) + * Fixed several problems with mergeprint (dates, Excel2003 rows, ...) + + -- Ralf Becker Fri, 31 Dec 2009 23:30:00 +0200 + +egroupware-epl (9.2.20091216-1) hardy; urgency=low + + * eMail: 3PaneView + * Infolog: print and copy + * bugfixes + + -- Ralf Becker Wed, 16 Dec 2009 21:30:00 +0200 + +egroupware-epl (9.2.20091208-1) hardy; urgency=low + + * SLES / openSuSE Mailserver support + * bugfixes + + -- Ralf Becker Sun, 07 Dec 2009 19:00:00 +0200 + +egroupware-epl (9.2.20091129-1) hardy; urgency=low + + * special calendar app for mobil devices + * many fixes in all modules + + -- Ralf Becker Sun, 29 Nov 2009 17:30:00 +0200 + +egroupware-epl (9.2.20091124-1) hardy; urgency=low + + * fixed problem inviting participants: permission denied + * several fixes in EventMgr + + -- Ralf Becker Tue, 24 Nov 2009 14:30:00 +0200 + +egroupware-epl (9.2.20091122-1) hardy; urgency=low + + * calendar: favorites + * improvments in syncml + + -- Ralf Becker Sun, 22 Nov 2009 18:30:00 +0200 + +egroupware-epl (9.2.20091118-1) hardy; urgency=low + + * email: folder tree in sidebox, import ical/vcard onclick, select all messages in folder + * calendar: visualisation of participant status of events, mark invitations + * improvments in syncml + + -- Ralf Becker Wed, 18 Nov 2009 21:30:00 +0200 + +egroupware-epl (9.2.20091114-1) hardy; urgency=low + + * new timezone save implementation of recurring events + * EventMgr: fixing number-format and cell-type in excel 2003 reports + * other bugfixes + + -- Ralf Becker Sat, 14 Nov 2009 18:00:00 +0200 + +egroupware-epl (9.2.20091107-1) hardy; urgency=low + + * some SyncML fixes + * improved timezone support in calendar (schema update) + * EventMgr: resource categories under location category, bugfixes + * other bugfixes + + -- Ralf Becker Mon, 11 Nov 2009 17:00:00 +0200 + +egroupware-epl (9.2.20091031-1) hardy; urgency=low + + * some SyncML fixes + * other bugfixes + + -- Ralf Becker Mon, 2 Nov 2009 15:00:00 +0200 + +egroupware-epl (9.2.20091023-1) hardy; urgency=low + + * some bugfixes in EventMgr, plus add. contract status in index + * bugfixes around preferences and calendar + * added tnef requirement and path to open_basdir + + -- Ralf Becker Thu, 23 Oct 2009 12:00:00 +0200 + +egroupware-epl (9.2.20091014-1) hardy; urgency=low + + * many bugfixes and missing features + * EventMgr is now feature complete, with exception of a links plugin + + -- Ralf Becker Wed, 14 Oct 2009 14:30:00 +0200 + +egroupware-epl (9.2.20091012-1) hardy; urgency=low + + * many bugfixes and missing features + + -- Ralf Becker Mon, 12 Oct 2009 14:30:00 +0200 + +egroupware-epl (9.2.20090920-1) hardy; urgency=low + + * first EventMgr version (not yet feature complete) + + -- Ralf Becker Sun, 20 Sep 2009 14:30:00 +0200 + +egroupware-epl (9.1.20090902-1) hardy; urgency=low + + * divers Bugfixes + * added phpFreeChat + + -- Ralf Becker Wed, 02 Sep 2009 14:30:00 +0200 + +egroupware-epl (9.1.20090731-1) hardy; urgency=low + + * IE Bugfixes onChange on checkboxes not working + * bugfixes in mail handling and sitemgr's navigation module + * fixed problems in translation cache and automatic loading of translations + + -- Ralf Becker Fri, 31 Jul 2009 12:30:00 +0200 + +egroupware-epl (9.1.20090720-1) hardy; urgency=low + + * eGroupware EPL 9.1 security and bugfix release + * fixes 3 security problems: + + FCKeditor (remote file upload) + + tracker (XSS problem) + + knowledgebase (SQL injection) + * added HTML Purifier as preventive measure for FCKeditor content + * many bugfixes + + -- Ralf Becker Mon, 20 Jul 2009 18:30:00 +0200 + +egroupware-epl (9.1.20090629-1) hardy; urgency=low + + * bugfixes + + -- Ralf Becker Mon, 29 Jun 2009 22:00:00 +0200 + +egroupware-epl (9.1.20090626-1) hardy; urgency=low + + * bugfixes + + -- Ralf Becker Fri, 26 Jun 2009 12:00:00 +0200 + +egroupware-epl (9.1.20090618-2) hardy; urgency=low + + * bugfixes and no more diff.gz + + -- Ralf Becker Tue, 21 Jun 2009 23:00:00 +0200 + +egroupware-epl (9.1.20090614) hardy; urgency=low + + * Use config-files from tarball instead of debian/ + * Include egroupware.cron script, install to /etc/cron.d + + -- root Sun, 14 Jun 2009 21:34:10 +0200 + +egroupware-epl (9.1.20090609) hardy; urgency=low + + * Inclusion of postinstall script + + -- Lars Volker Tue, 09 Jun 2009 18:03:54 +0200 + +egroupware-epl (9.1.20090603) hardy; urgency=low + + * Initial Release of EPL + * Renamed Package for EPL + + -- Lars Volker Tue, 09 Jun 2009 09:37:14 +0200 + +egroupware (1.6.001+dfsg-2) unstable; urgency=low + + * Upload to unstable (closes: #519566) + + [ Jan Wagner ] + * add egroupware-notifications package, cause the application was missing + and it's needed by calendar application + * depend egroupware-calendar on egroupware-notifications (closes: #511913) + + [ Peter Eisentraut ] + * Depend egroupware-tracker on egroupware-notifications (closes: #511704) + * Add newline after egw:Modules substitution variable; fixes FTBFS + (closes: #518840) (This is caused by a change in debhelper 7.1.0.) + * Added ${misc:Depends} to all Depends lines, per lintian + + -- Peter Eisentraut Fri, 13 Mar 2009 23:38:03 +0200 + +egroupware (1.6.001+dfsg-1) experimental; urgency=low + + * New upstream release + * Updated copyright notices + * Added php5-cli dependency to filemanager application, per lintian + + -- Peter Eisentraut Sat, 06 Dec 2008 11:25:37 +0200 + +egroupware (1.6~rc5-2+dfsg-1) experimental; urgency=low + + * New upstream release candidate + + -- Peter Eisentraut Tue, 18 Nov 2008 23:30:37 +0200 + +egroupware (1.6~rc4+dfsg-1) experimental; urgency=low + + * New upstream release candidate + - mydms application removed + * Changed watch file temporarily for RC versions + + -- Peter Eisentraut Sat, 15 Nov 2008 12:35:17 +0200 + +egroupware (1.4.004-2.dfsg-4) unstable; urgency=low + + * Debconf translation updates (closes: #498957) + + -- Peter Eisentraut Thu, 02 Oct 2008 01:02:49 +0300 + +egroupware (1.4.004-2.dfsg-3) unstable; urgency=low + + * Debconf translation updates (closes: #491763) + + -- Peter Eisentraut Fri, 12 Sep 2008 15:49:05 +0300 + +egroupware (1.4.004-2.dfsg-2) unstable; urgency=low + + * Debconf translation updates (closes: #480979, #486531, #488573, #489940) + * Renamed README.maintainer to now standardized name README.source + * Updated standards version + * Reference .../doc/egroupware-core/README.Debian.gz with gz suffix + (closes: #489023) + * Removed obsolete lintian overrides + * Simplified setup code, obsoleting 06-egw-header-template.dpatch + * Removed obsolete 08-egw-checkinstall-symlink.dpatch and all of dpatch + * Replaced gawk by perl in debian/rules, simplified code a bit + + -- Peter Eisentraut Mon, 14 Jul 2008 14:20:37 +0200 + +egroupware (1.4.004-2.dfsg-1) unstable; urgency=low + + * New upstream release (closes: #476977) + - Obsoletes 01-kses-security.dpatch + * Added Vcs-* control fields for move to collab-maint + * Made egw-sanitize-tarball compatible with uscan and updated watch file to + use it + * Debconf translation updates (closes: #472064, #475252) + + -- Peter Eisentraut Fri, 09 May 2008 16:57:05 +0200 + +egroupware (1.4.002.dfsg-2.1) unstable; urgency=high + + * Non-maintainer upload by the Security Team. + * Fix multiple security issues in kses _bad_protocol_once function. Details + are under embargo for now (01-kses-security.dpatch; Closes: #471839). + + -- Nico Golde Sat, 22 Mar 2008 16:26:39 +0100 + +egroupware (1.4.002.dfsg-2) unstable; urgency=low + + * Upload to unstable + * Updated standards version + * Converted copyright files to UTF-8 + * Added information in egroupware-addressbook/NEWS.Debian about upgrading an + LDAP-based addressbook (closes: #445834) + * Switched back to integrated version of ttf-bitstream-vera, because the + package has been removed (closes: #433807, #447988, #461254) + * Debconf templates and package description review (closes: #464110) + * Debconf translation updates (closes: #465063, #465133, #465799, #467163, + #467173, #467479, #467497, #467536, #468479) + * Added Homepage control field + + -- Peter Eisentraut Sat, 01 Mar 2008 19:22:24 +0100 + +egroupware (1.4.002.dfsg-1) experimental; urgency=low + + * New upstream release + - Fixes mishandling of empty web server docroot (closes: #439912) + - Includes fix for cross-site-scripting security problem + (CVE-2007-5091) (closes: #444351) + * Removed obsolete LDAP setup instructions from egroupware-core's + README.Debian (closes: #439323) + + -- Peter Eisentraut Thu, 04 Oct 2007 23:22:14 +0200 + +egroupware (1.4.001.dfsg-2) experimental; urgency=low + + * Removed support for Apache 1 and PHP 4 (closes: #432236) + * Replaced ${Source-Version} by ${binary:Version} + * Fixed bugs in translations of debconf templates + * Reenabled outdated translations pt_BR and vi, because the really + outdated parts are now obsolete + + -- Peter Eisentraut Mon, 09 Jul 2007 13:05:03 +0200 + +egroupware (1.4.001.dfsg-1) experimental; urgency=low + + * New upstream release + * Removed egroupware-ldap package + * Some installation cleanup + + -- Peter Eisentraut Fri, 15 Jun 2007 11:25:39 +0200 + +egroupware (1.3.023.dfsg-1) experimental; urgency=low + + * New upstream release + - workflow application removed + - Obsoletes patch 04-egw-ldap-doc + * Added tracker application + * Updated Apache configuration with upstream recommendations + * Fixed ttf-bitstream-vera handling + * Disabled compression of *.php files installed as documentation + * Some installation cleanup + + -- Peter Eisentraut Tue, 29 May 2007 15:18:00 +0200 + +egroupware (1.3.022.dfsg-1) experimental; urgency=low + + * New upstream release + * Updated egw-sanitize-tarball script to exclude debian/ directory + maintained by upstream + + -- Peter Eisentraut Mon, 21 May 2007 10:30:53 +0200 + +egroupware (1.2.106-2.dfsg-3) unstable; urgency=low + + * New Galician translation of debconf templates by Jacobo Tarrio + (closes: #412187) + * Only change permissions on /var/lib/egroupware/ during initial + installation, in case someone wants a different setup + (closes: #419094) + + -- Peter Eisentraut Fri, 11 May 2007 18:41:23 +0200 + +egroupware (1.2.106-2.dfsg-2) unstable; urgency=low + + * Fixed watch file to ignore beta versions + * New Portuguese translation of debconf templates by Carlos Lisboa + (closes: #409410) + + -- Peter Eisentraut Fri, 9 Feb 2007 12:49:08 +0100 + +egroupware (1.2.106-2.dfsg-1) unstable; urgency=low + + * New upstream release + + -- Peter Eisentraut Mon, 8 Jan 2007 14:43:34 +0100 + +egroupware (1.2-106.dfsg-1) unstable; urgency=medium + + * New upstream release + * Enabled installation with php5 >=5.2 (closes: #402405) + * Set php_flag display_errors to off to work around php5 bug + * New Spanish translation of debconf templates by César Gómez Martín + (closes: #402306) + * Added PEAR path to open_basedir (closes: #401892, #402720) + + -- Peter Eisentraut Tue, 2 Jan 2007 13:38:05 +0100 + +egroupware (1.2-105.dfsg-4) unstable; urgency=medium + + * Disabled installation with php5 >=5.2 (closes: #399832) + * Changed some php_{flag|value} directives to php_admin_{flag|value} + as required + * Disabled outdated translations pt_BR and vi + + -- Peter Eisentraut Sat, 2 Dec 2006 10:07:54 +0100 + +egroupware (1.2-105.dfsg-3) unstable; urgency=low + + * Placed php5 dependencies before php4 alternatives + * Raised php4 dependency to 4.3 + + -- Peter Eisentraut Sat, 4 Nov 2006 17:17:52 +0100 + +egroupware (1.2-105.dfsg-2) unstable; urgency=medium + + * New French translation of debconf templates by "Steve" + (closes: #390186) + * New Japanese translation of debconf templates by Hideki Yamane + (closes: #391806) + + -- Peter Eisentraut Fri, 13 Oct 2006 23:36:56 +0200 + +egroupware (1.2-105.dfsg-1) unstable; urgency=low + + * New upstream release + * New Czech translation of debconf templates by Miroslav Kure + (closes: #389217) + + -- Peter Eisentraut Sun, 24 Sep 2006 19:33:20 +0200 + +egroupware (1.2-104.dfsg-3) unstable; urgency=medium + + * New Dutch translation of debconf templates by Kurt De Bree + (closes: #387655) + * Added missing build dependency po-debconf + * Added note about tcpip_socket not enabled by default for PostgreSQL + 7.4 (closes: #336930) + * Set all of /var/lib/egroupware/ owned by www-data:www-data + * Handle purging egroupware-core when debconf is not installed + (closes: #387980) + + -- Peter Eisentraut Mon, 18 Sep 2006 13:40:16 +0200 + +egroupware (1.2-104.dfsg-2) unstable; urgency=low + + * Enhanced watch file + * Enable mod_actions for Apache 2 (closes: #381339) + * Removed recommendations of php5-mcal and php5-xslt, which don't exist + * Altered Debconf templates to fit recommendations in Developer's + Reference + * Code clean-up in maintainer scripts + * Updated setup instructions for new PostgreSQL packaging scheme + * Simplified documentation for LDAP setup + * Added php{4,5}-odbc as dependency alternative + * Updated for new fpdf path + + -- Peter Eisentraut Mon, 28 Aug 2006 19:29:49 +0200 + +egroupware (1.2-104.dfsg-1) unstable; urgency=low + + * New upstream release (closes: #362295) + * Dropped 05-egw-projects-jpgraph-path patch because upstream clearly + believes this feature is relevant + * New stuff relative to previous unstable version ... + - New applications: mydms, projectmanager, resources, sambaadmin, + timesheet, workflow + - Dropped applications: backup, comic, email, forum, ftp, fudforum, + headlines, jinn, messenger, phpldapadmin, projects, stocks, tts + (closes: #271058, #271881, #347460, #365314) + - MySQL 5 support (closes: #347480, #372636, #378032) + - XMLRPC variable names fixed (closes: #355956) + - Added PHP5 dependencies as alternatives (closes: #328056, #367397) + - Language installation more robust (closes: #281762) + - IPv6 support (#330873) + - Calendar support for all-day events (closes: #292603) + * Fixed spelling mistake in package description (closes: #363386) + * New Dutch translation of debconf templates by Kurt De Bree + (closes: #363045) + + -- Peter Eisentraut Fri, 28 Jul 2006 23:31:57 +0200 + +egroupware (1.2-102.dfsg-2) experimental; urgency=low + + * New upstream release + * Fixed php[45]-gd dependency (closes: #372779) + + -- Peter Eisentraut Mon, 12 Jun 2006 10:04:54 +0200 + +egroupware (1.2-2.dfsg-1) experimental; urgency=low + + * New upstream release + * Added PHP5 dependencies as alternatives + * Added Subversion support to egw-sanitize-tarball + * Changed to Debhelper level 5 + * Sorted out Build-Depends vs. Build-Depends-Indep + * Changes to default Apache configuration by Lars Kneschke: + - Added /usr/share/php to include_path + - Improved ical handling + - Improved rpc handling + + -- Peter Eisentraut Wed, 31 May 2006 15:27:12 +0200 + +egroupware (1.2-1.dfsg-1) experimental; urgency=low + + * New upstream release + - New applications: mydms, projectmanager, resources, sambaadmin, + timesheet, workflow + - Dropped applications: backup, comic, email, forum, ftp, fudforum, + headlines, jinn, messenger, phpldapadmin, projects, stocks, tts + * Most patches obsoleted + * Calculate dependencies of meta package automatically + + -- Peter Eisentraut Thu, 20 Apr 2006 17:37:44 +0200 + +egroupware (1.0.0.009.dfsg-3-4) unstable; urgency=high + + * Fixed fudforum arbitrary code execution security problem (CVE-2005-2781) + (closes: #340495) + * Fixed watch file to exclude RC versions + + -- Peter Eisentraut Mon, 28 Nov 2005 14:01:13 +0100 + +egroupware (1.0.0.009.dfsg-3-3) unstable; urgency=high + + * Corrected fudforum fix + * Fixed cross-site-scripting [phpsysinfo/includes/system_footer.php, + phpsysinfo/includes/system_header.php, + debian/patches/22-egw-CVE-2005-0870-xss.dpatch] + * Backported parts of changes by Christopher Kunz to fix arbitrary file + inclusion [phpsysinfo/index.php, + debian/patches/23-egw-CVE-2005-3347-file.dpatch] + * Initialise charset variable to fix cross-site scripting + [phpsysinfo/index.php, debian/patches/24-egw-CVE-2005-3348-xss.dpatch] + + -- Peter Eisentraut Tue, 15 Nov 2005 00:20:10 +0100 + +egroupware (1.0.0.009.dfsg-3-2) unstable; urgency=low + + * Fixed fudforum cross-site scripting security problem (CAN-2005-2600) + (closes: #323928) + * New Swedish translation of debconf templates by Daniel Nylander + (closes: #333750) + + -- Peter Eisentraut Tue, 1 Nov 2005 23:47:36 +0100 + +egroupware (1.0.0.009.dfsg-3-1) unstable; urgency=high + + (The actual upstream release name is "1.0.0.009-3".) + + * New upstream release (closes: #329597) + - Obsoletes patch 10-egw-xmlrpc-fix-fix + + -- Peter Eisentraut Mon, 26 Sep 2005 11:11:11 +0200 + +egroupware (1.0.0.009.dfsg-2) unstable; urgency=high + + * Added upstream's fix for the previous fix + + -- Peter Eisentraut Mon, 5 Sep 2005 11:11:11 +0200 + +egroupware (1.0.0.009.dfsg-1) unstable; urgency=high + + * New upstream release + - Includes fix for (another) XML-RPC remote execution security problem + (CAN-2005-2498) (closes: #323350) + + -- Peter Eisentraut Thu, 1 Sep 2005 11:11:11 +0200 + +egroupware (1.0.0.008-2.dfsg-1) unstable; urgency=low + + * New upstream release + * New Czech translation of debconf templates by Miroslav Kure + (closes: #318156) + * Improved version recognition in watch file + + -- Peter Eisentraut Fri, 29 Jul 2005 11:11:11 +0200 + +egroupware (1.0.0.008-1.dfsg-1) unstable; urgency=high + + * New upstream release + - Contains better fix for XML-RPC security problem (bug #317263) + - Obsoletes patches 09-egw-calendar-konqueror, 10-egw-pam-auth + + -- Peter Eisentraut Sat, 9 Jul 2005 11:11:11 +0200 + +egroupware (1.0.0.007-3.dfsg-1) unstable; urgency=high + + * New upstream release + - Includes fix for XML-RPC remote execution security problem + (CAN-2005-1921) (closes: #317263) + * Updated standards version + + -- Peter Eisentraut Thu, 7 Jul 2005 11:11:11 +0200 + +egroupware (1.0.0.007-2.dfsg-4) unstable; urgency=low + + * New Vietnamese translation of debconf templates by Clytie Siddall + (closes: #311614) + * Changed maintainer address + + -- Peter Eisentraut Sat, 11 Jun 2005 11:11:11 +0200 + +egroupware (1.0.0.007-2.dfsg-3) unstable; urgency=medium + + * Fixed PAM authentication (closes: #306729) + + -- Peter Eisentraut Tue, 24 May 2005 11:11:11 +0200 + +egroupware (1.0.0.007-2.dfsg-2) unstable; urgency=medium + + * Fixed calendar month display in Konqueror + + -- Peter Eisentraut Thu, 12 May 2005 11:11:11 +0200 + +egroupware (1.0.0.007-2.dfsg-1) unstable; urgency=high + + * New upstream version + - fixes several security problems (closes: #304496, #305576) + - fixes SQL error in calendar matrix view (closes: #302341) + - skel application removed + * Added php4-cli to dependencies of -fudforum + * Made Apache 2 the preferred web server alternative in dependencies and + debconf question, adjusted debconf translations manually + * Added setup instructions for MySQL (thanks to Christian Motschke) + + -- Peter Eisentraut Thu, 21 Apr 2005 11:11:11 +0200 + +egroupware (1.0.00.006-1.dfsg-1) unstable; urgency=low + + * New upstream version + * Adjusted patch egw-projects-jpgraph-path for upstream changes + * Removed patch egw-admin-save-email, obsoleted by upstream changes + * Added patch to ignore dangling symlinks in check_install.php; + phpldapadmin/config.php is initially a dangling symlink, so we don't + want to complain about that. + * Added perl to dependencies of -core (needed for postinst) + + -- Peter Eisentraut Mon, 08 Nov 2004 11:11:11 +0100 + +egroupware (1.0.00.005-1.dfsg-3) unstable; urgency=low + + * Converted dpatch to use /usr/share/dpatch/dpatch-run + * No longer set php_flag display_errors off; this should be chosen by + the system administrator or the user. + * -calendar depends on -infolog (closes: #275871) + * New Japanese translation of debconf templates by Hideki Yamane + (closes: #278511) + * Added patch to save email addresses when creating new users + (closes: #270672) + + -- Peter Eisentraut Mon, 01 Nov 2004 11:11:11 +0100 + +egroupware (1.0.00.005-1.dfsg-2) unstable; urgency=low + + * Removed PHP conditionals in apache.conf; besides having been + relatively useless, this also gets Apache 2 working. + * Symlinked to ttf-bitstream-vera instead of installing our own copy + * Symlinked to fpdf instead of installing our own copy (except + fpdf.php, which is patched by egroupware) + + -- Peter Eisentraut Sat, 25 Sep 2004 11:11:11 +0200 + +egroupware (1.0.00.005-1.dfsg-1) unstable; urgency=low + + * New upstream version + * Added ".dfsg" to version name to make explicit that this is not the + original upstream tarball + * egroupware-infolog.remove now obsolete + * Removed new .htaccess file from installation + * Adjusted patch egw-ldap-doc for upstream changes + * Adjusted patch egw-projects-var-www for upstream changes and renamed + to egw-projects-jpgraph-path + * Added suggestions of php4-imap and php4-auth-pam to -core package + * Removed dependencies on php4-gd2 (see bug #261186) + + -- Peter Eisentraut Sat, 11 Sep 2004 11:11:11 +0200 + +egroupware (1.0.00.004-2+cvs20040825-2) unstable; urgency=low + + * Added sitemgr-link symlink into the -sitemgr package + * New Brazilian Portuguese translation of debconf templates by + André Luís Lopes (closes: #269531) + * Removed some obsolete files from -filemanager package + * phpldapadmin was by fault in debian/rules filtered from the list of + modules, so it did not get any files installed at all; fixed + * Added symlinks and instructions for setting up a phpldapadmin + configuration file + * Converted the executable dpatch 00template, which doesn't work, to + the nonexecutable variant + + -- Peter Eisentraut Sat, 04 Sep 2004 11:11:11 +0200 + +egroupware (1.0.00.004-2+cvs20040825-1) unstable; urgency=low + + * New upstream release plus additional fixes (check out from CVS using + -r Version-1_0_0-branch -D '2004-08-25 00:00:00 UTC') + * Updated egw-ldap-doc patch for new translations + * Sorted out the web server and PHP dependencies: + - Support only Apache variants and PHP as module + - New Apache 2 support (experimental) + - Changed dependency on php4-cgi to php4-cli + * Use invoke-rc.d in maintainer scripts + * Ignore web server reload failures (closes: #267362) + * New French (fr) translation of debconf templates by Florent Usseil + (closes: #267828) + * Added more dependencies on PHP modules in the applications + * Force PHP mbstring overloading to be on + * Remove executable permission from installed PHP files + + -- Peter Eisentraut Thu, 26 Aug 2004 11:11:11 +0200 + +egroupware (1.0.00.003-2-1) unstable; urgency=low + + * New upstream release (first stable upstream release, so it can go + into Debian unstable now) + * Patches now handled by dpatch + * More detailed copyright information added + * More careful selection of installed files + * More nonfree files removed from source package + * Dependencies revised + * debian/rules simplified + * Configuration adjusted for new upstream version, web server + selection changed in preparation for more supported servers + + -- Peter Eisentraut Tue, 17 Aug 2004 11:11:11 +0200 + +egroupware (0.9.99.015-1-1) experimental; urgency=low + + * Initial release (closes: #237854) + * Removed calendar/doc/rfc2445.txt, because it is not free. + * Changed fudforum setup to work better in Debian directory structure. + + -- Peter Eisentraut Fri, 11 Jun 2004 22:37:12 +0200 diff --git a/doc/rpm-build/debian.control b/doc/rpm-build/debian.control new file mode 100644 index 0000000000..44fc4c6052 --- /dev/null +++ b/doc/rpm-build/debian.control @@ -0,0 +1,310 @@ +Source: egroupware-epl +Section: web +Priority: optional +Maintainer: Lars Volker +Build-Depends: debhelper (>= 5), po-debconf +Standards-Version: 3.8.0 +Homepage: http://www.stylite.de/EPL + +Package: egroupware-epl +Architecture: all +Depends: egroupware-epl-core, egroupware-epl-stylite, ${egw:Modules}, ${misc:Depends} +Replaces: egroupware +Description: web-based groupware suite - metapackage + ${commondesc} + . + This package is a metapackage containing dependencies on all the + eGroupWare applications. It can be used to conveniently install + eGroupWare with all available applications. + +Package: egroupware-epl-core +Architecture: all +Depends: apache2, + libapache2-mod-php5, + php5-cli, + php5-sqlite, + php5-mysql | php5-pgsql | php5-odbc, + php5-gd, php-log, php-pear, + egroupware-epl-egw-pear, + perl, + php5-mcrypt, + ${misc:Depends} +Recommends: mysql-server, php-apc, mysql-client | postgresql-client +Suggests: egroupware-epl, + php5-ldap, + php5-mhash, + php5-auth-pam +Replaces: egroupware-core +Description: web-based groupware suite - core modules + ${commondesc} + . + The core package provides the modules for initial setup, global + administration, and preferences, and the API for the applications. It + does not, by itself, provide any groupware functionality. The actual + eGroupWare applications are shipped separately in packages named + "egroupware-epl-". + +Package: egroupware-epl-addressbook +Architecture: all +Depends: egroupware-epl-core (>= ${binary:Version}), egroupware-epl-etemplate (>= ${binary:Version}), + ${misc:Depends} +Replaces: egroupware-addressbook +Description: web-based groupware suite - addressbook management application + ${commondesc} + . + This eGroupWare application provides a contact manager with vCard + support. It can store and retrieve contact information via SQL, LDAP, + or Active Directory. + +Package: egroupware-epl-bookmarks +Architecture: all +Depends: egroupware-epl-core (>= ${binary:Version}), + ${misc:Depends} +Replaces: egroupware-bookmarks +Description: web-based groupware suite - bookmark management application + ${commondesc} + . + This eGroupWare application provides a bookmark management facility. + +Package: egroupware-epl-calendar +Architecture: all +Depends: egroupware-epl-core (>= ${binary:Version}), egroupware-epl-etemplate (>= ${binary:Version}), egroupware-epl-infolog (>= ${binary:Version}), + egroupware-epl-notifications (>= ${binary:Version}), + ${misc:Depends} +Replaces: egroupware-calendar +Description: web-based groupware suite - calendar management application + ${commondesc} + . + This eGroupWare application provides a powerful calendar with a meeting + request system, alarms, iCal and e-Mail support, and ACL security. + +Package: egroupware-epl-developer-tools +Architecture: all +Depends: egroupware-epl-core (>= ${binary:Version}), + ${misc:Depends} +Replaces: egroupware-developer-tools +Description: web-based groupware suite - developer tools + ${commondesc} + . + This eGroupWare application contains tools for eGroupWare developers + and translators. The translation tools allow creating and extending + translation files for eGroupWare. They can search the sources for new + or added phrases and show the ones missing in a given language. + +Package: egroupware-epl-emailadmin +Architecture: all +Depends: egroupware-epl-core (>= ${binary:Version}), + ${misc:Depends}, php5-imap +Replaces: egroupware-emailadmin +Description: web-based groupware suite - e-mail user administration application + ${commondesc} + . + This eGroupWare application allows the administration of e-mail user + accounts. It is intended to be used with the package + egroupware-epl-felamimail. + +Package: egroupware-epl-etemplate +Architecture: all +Depends: egroupware-epl-core (>= ${binary:Version}), + ${misc:Depends} +Replaces: egroupware-etemplate +Description: web-based groupware suite - widget-based template system + ${commondesc} + . + This eGroupWare application contains a widget-based template system for + eGroupWare with an interactive editor and a database-table editor + (creates tables_current.inc.php and automatically updates + tables_update.inc.php). + +Package: egroupware-epl-felamimail +Architecture: all +Depends: egroupware-epl-core (>= ${binary:Version}), egroupware-epl-emailadmin (>= ${binary:Version}), tnef, + php5-imap, + ${misc:Depends} +Provides: mail-reader, imap-client +Replaces: egroupware-felamimail +Description: web-based groupware suite - e-mail application + ${commondesc} + . + FeLaMiMail is an e-mail application for eGroupWare. + +Package: egroupware-epl-filemanager +Architecture: all +Depends: egroupware-epl-core (>= ${binary:Version}), + ${misc:Depends} +Suggests: php5-cli +Replaces: egroupware-filemanager +Description: web-based groupware suite - file manager application + ${commondesc} + . + This eGroupWare application provides a web-based file manager. + Abilities include all common file actions (upload, mkdir, rename, + delete, copy, move), creating, and editing text files, and syncing with + the file system. Per file/directory comments are stored, and version + history is tracked. Group sharing and ACLs are fully supported. + +Package: egroupware-epl-infolog +Architecture: all +Depends: egroupware-epl-core (>= ${binary:Version}), egroupware-epl-etemplate (>= ${binary:Version}), + ${misc:Depends} +Replaces: egroupware-infolog +Description: web-based groupware suite - infolog application + ${commondesc} + . + This eGroupWare application allows tracking on-going and previous support + requests, phone calls, and other customer relations. + +Package: egroupware-epl-manual +Architecture: all +Depends: egroupware-epl-core (>= ${binary:Version}), egroupware-epl-wiki (>= ${binary:Version}), + ${misc:Depends} +Replaces: egroupware-manual +Description: web-based groupware suite - manual + ${commondesc} + . + This package contains the eGroupWare manual, provided as an + eGroupWare application. + +Package: egroupware-epl-news-admin +Architecture: all +Depends: egroupware-epl-core (>= ${binary:Version}), + ${misc:Depends} +Replaces: egroupware-news-admin +Description: web-based groupware suite - news administration interface + ${commondesc} + . + This eGroupWare application provides an interface to handle a simple + web-based news system. + +Package: egroupware-epl-notifications +Architecture: all +Depends: egroupware-epl-core (>= ${binary:Version}), + ${misc:Depends} +Replaces: egroupware-notifications +Description: web-based groupware suite - notifications + ${commondesc} + . + This package contains the eGroupWare notifications, provided as an + eGroupWare application. + +Package: egroupware-epl-phpbrain +Architecture: all +Depends: egroupware-epl-core (>= ${binary:Version}), + ${misc:Depends} +Replaces: egroupware-phpbrain +Description: web-based groupware suite - phpbrain application + ${commondesc} + . + This eGroupWare application provides a knowledge base system. + +Package: egroupware-epl-phpsysinfo +Architecture: all +Depends: egroupware-epl-core (>= ${binary:Version}), + php5-gd, + ${misc:Depends} +Replaces: egroupware-phpsysinfo +Description: web-based groupware suite - phpSysInfo application + ${commondesc} + . + This application displays information about the host being accessed, such as + uptime, lm-sensors readings, CPU, memory, SCSI, IDE, PCI, Ethernet, floppy, + and video information. + +Package: egroupware-epl-polls +Architecture: all +Depends: egroupware-epl-core (>= ${binary:Version}), + ${misc:Depends} +Replaces: egroupware-polls +Description: web-based groupware suite - polling application + ${commondesc} + . + This eGroupWare application provides a simple polling system. + +Package: egroupware-epl-projectmanager +Architecture: all +Depends: egroupware-epl-core (>= ${binary:Version}), egroupware-epl-etemplate (>= ${binary:Version}), + php5-gd, jpgraph-epl, + ${misc:Depends} +Replaces: egroupware-projectmanager +Description: web-based groupware suite - project management application + ${commondesc} + . + This eGroupWare application provides a project workflow tracker. + +Package: egroupware-epl-registration +Architecture: all +Depends: egroupware-epl-core (>= ${binary:Version}), + ${misc:Depends} +Replaces: egroupware-registration +Description: web-based groupware suite - registration application + ${commondesc} + . + This eGroupWare application allows users to create eGroupWare accounts + through a web interface. Site administrators can decide what pieces of + information are requested and whether each is required or not. + +Package: egroupware-epl-resources +Architecture: all +Depends: egroupware-epl-core (>= ${binary:Version}), egroupware-epl-etemplate (>= ${binary:Version}), egroupware-epl-filemanager (>= ${binary:Version}), + ${misc:Depends} +Suggests: egroupware-epl-calendar +Replaces: egroupware-resources +Description: web-based groupware suite - resource manager application + ${commondesc} + . + This eGroupWare application provides a resource management and booking + system, which integrates into eGroupWare's calendar. + +Package: egroupware-epl-sambaadmin +Architecture: all +Depends: egroupware-epl-core (>= ${binary:Version}), + php5-ldap, + ${misc:Depends} +Replaces: egroupware-sambaadmin +Description: web-based groupware suite - Samba administration application + ${commondesc} + . + This eGroupWare application allows managing LDAP-based Samba servers. + +Package: egroupware-epl-sitemgr +Architecture: all +Depends: egroupware-epl-core (>= ${binary:Version}), egroupware-epl-etemplate (>= ${binary:Version}), + ${misc:Depends} +Replaces: egroupware-sitemgr +Description: web-based groupware suite - site manager application + ${commondesc} + . + This is a content management system application for eGroupWare. + +Package: egroupware-epl-timesheet +Architecture: all +Depends: egroupware-epl-core (>= ${binary:Version}), egroupware-epl-etemplate (>= ${binary:Version}), + ${misc:Depends} +Suggests: egroupware-epl-projectmanager +Replaces: egroupware-timesheet +Description: web-based groupware suite - timesheet application + ${commondesc} + . + This eGroupWare application allows tracking times and other activities + for the project manager. + +Package: egroupware-epl-tracker +Architecture: all +Depends: egroupware-epl-core (>= ${binary:Version}), egroupware-epl-etemplate (>= ${binary:Version}), egroupware-epl-notifications (>= ${binary:Version}), + ${misc:Depends} +Replaces: egroupware-tracker +Description: web-based groupware suite - tracker application + ${commondesc} + . + This eGroupWare application is a universal tracker for bugs, feature + requests, etc. with voting and bounties. + +Package: egroupware-epl-wiki +Architecture: all +Depends: egroupware-epl-core (>= ${binary:Version}), egroupware-epl-etemplate (>= ${binary:Version}), + ${misc:Depends} +Replaces: egroupware-wiki +Description: web-based groupware suite - wiki application + ${commondesc} + . + This eGroupWare application provides a wiki. diff --git a/doc/rpm-build/debian.egroupware-epl-core.conffiles b/doc/rpm-build/debian.egroupware-epl-core.conffiles new file mode 100644 index 0000000000..ed34b23dbf --- /dev/null +++ b/doc/rpm-build/debian.egroupware-epl-core.conffiles @@ -0,0 +1,2 @@ +/var/lib/egroupware/header.inc.php +/etc/egroupware/apache.conf diff --git a/doc/rpm-build/debian.rules b/doc/rpm-build/debian.rules new file mode 100644 index 0000000000..e3000d995b --- /dev/null +++ b/doc/rpm-build/debian.rules @@ -0,0 +1,112 @@ +#!/usr/bin/make -f + +SHELL = /bin/sh -e + + +PACKAGES := $(shell dh_listpackages) +MODULES = $(filter-out core,$(patsubst egroupware-epl-%,%,$(filter egroupware-epl-%,$(PACKAGES)))) +COREDIR = debian/egroupware-epl-core/usr/share/egroupware +COREDOC = debian/egroupware-epl-core/usr/share/doc/egroupware-core +PACKAGEDIR = debian/egroupware-epl-$${APP}/usr/share/egroupware/$${APPDIR} +PACKAGEDOC = debian/egroupware-epl-$${APP}/usr/share/doc/egroupware-$${APPDIR} + +COPYRIGHT = -iname 'copyright*' -or -iname 'copying*' -or -iname '*license*' +CHANGELOG = -iname 'changelog*' +EXTRADOC = -iname readme -or -iname todo + +FINDOPT = -type f +APPFILES = -not \( -path '*doc*' -or -path '.' -or -name '*.pl' -or $(COPYRIGHT) -or $(CHANGELOG) -or -iname install -or $(EXTRADOC) \) +SPECIALDOC = -size 0 -or -iname install -or $(CHANGELOG) -or $(COPYRIGHT) -or \ + -name '*.sgml' -or -name '*.lyx' -or -name '*.ps' -or -name '*.dvi' -or -name '*.rtf' +DOCFILES = -not \( $(SPECIALDOC) \) + +INSTALL = install -D -m 644 + + +clean: + dh_testdir + dh_testroot + debconf-updatepo + dh_clean + + +install: build + dh_testdir + dh_testroot + dh_clean -k + dh_installdirs + + # apply the patch + cat ./doc/rpm-build/class.uiasyncservice.inc.php.patch | patch -p1 + + # customize apache config + mkdir -p $(CURDIR)/debian/egroupware-epl-core/etc/egroupware + sed 's/\/usr\/share\/pear/\/usr\/share\/php:\/usr\/local\/zend\/share\/pear/' $(CURDIR)/doc/rpm-build/apache.conf > $(CURDIR)/debian/egroupware-epl-core/etc/egroupware/apache.conf + + + # install core modules + + for DIR in admin home phpgwapi preferences setup syncml doc; do \ + cd $(CURDIR)/$${DIR}; \ + find $(FINDOPT) $(APPFILES) \ + -exec $(INSTALL) {} $(CURDIR)/$(COREDIR)/$${DIR}/{} \; ; \ + done + + # install applications + + for APP in $(MODULES) ; do \ + APPDIR=$$(echo $${APP} | sed 's/-/_/g') ; \ + if [ -d $(CURDIR)/$${APPDIR} ] ; then \ + cd $(CURDIR)/$${APPDIR}; \ + find $(FINDOPT) $(APPFILES) \ + -exec $(INSTALL) {} $(CURDIR)/$(PACKAGEDIR)/{} \; ; \ + if [ -d $(CURDIR)/$${APPDIR}/doc ] ; then \ + cd $(CURDIR)/$${APPDIR}/doc; \ + find $(FINDOPT) $(DOCFILES) \ + -exec $(INSTALL) {} $(CURDIR)/$(PACKAGEDOC)/{} \; ;\ + fi ; \ + else \ + echo "PACKAGING ERROR: directory $${APP} not found" 1>&2; exit 1 ; \ + fi ; \ + done + + # install cron-file + mkdir -p debian/egroupware-epl-core/etc/cron.d + sed 's/apache/www-data/' doc/rpm-build/egroupware.cron > debian/egroupware-epl-core/etc/cron.d/egroupware + + dh_install + + # delete some stuff + for APKG in $(PACKAGES) ; do \ + if [ -f debian/$${APKG}.remove ] ; then \ + perl -l0 -p -e '' debian/$${APKG}.remove | xargs -0ri /bin/sh -c "rm -rf debian/$${APKG}/{}" ; \ + fi ; \ + done + + # remove executable bit from php files + find debian/egroupware*/ -type f -and -perm +111 -and -name '*.php' -print0 | xargs -0ri chmod a-x '{}' + # make files starting with #! executable + find debian/egroupware*/ -type f -exec grep -q '^#!' '{}' \; -print0 | xargs -0ri chmod a+x '{}' + + +binary-indep: build install + dh_testdir -i + dh_testroot -i + dh_installdebconf -i + dh_installdocs -i + dh_installexamples -i + dh_installchangelogs -i + dh_link -i + dh_compress -i -X .php + dh_fixperms -i + dh_installdeb -i + (echo -n "egw:Modules="; for x in $(MODULES); do echo -n "egroupware-epl-$$x,"; done; echo) >>debian/egroupware-epl.substvars + perl -l0 -p -e 's/^/-V/' debian/substvars | xargs -0 dh_gencontrol -i -- + dh_md5sums -i + dh_builddeb -i + + +binary: binary-indep binary-arch + + +.PHONY: build binary binary-arch binary-indep clean install diff --git a/doc/rpm-build/debian.tar.gz b/doc/rpm-build/debian.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..4dae3a3825dce3a4a04fd3436b8c8a1ecdd8c9c3 GIT binary patch literal 37315 zcmV(~K+nG)iwFSa=w|p4t z#+}|{Fw%Vx3Ss@mOz4cE$pYqqYWd6wJUtBHWJq7wnE;bruXhTrBWZe&f&2knBQFcN z+#wY5$Hn~d!H@7?IW*>1&}aI+Wsjkw`-s_fAn3D6U3y^Qmyzq;NnO|DSush&{;=n{ z;c%pTOqQfYa@~<*ySj-;yPi9Meh>_g6=gIU$!uB>$yBiP&Cm}#rVjvH(sw=oSdswP zC4s#|Fr??6+3t{eK7Kz*MWsw(P6=q5lbz`V)E)&u4BJn6B$(Q4*G8IX&5Arzu#9*(1Vo;d&0U zt0*26Ozy#Xx4OFvxtW>pry@L~%-er83 z8NQ#n_e}R?!yTm7MhN_Xb&2GN#TtKo9Fu>9zdL9S*DkYd!f_`L#N*k31^P%IbJmiO zh01zv&qKw-N8|?s-|YsZG_PRnhF~Bu9y5_|p4ABh237#NV=8D11J|^=WBh=aLe62b z4m81m4{n#gT-I;kk~z%NZD@ua+cKbL8O-q+pn(kOi{BUKjNpjp4N;&)6u=u7@p21% z1tbHk;vRLFEV2++5#h@KQuI;}h-eQHxkDur0V=UADDo97Cre-3i+;N) z>i-jNj16sh=%NWb{u4z5Yx@6E?yyMxe<^=}-TqMt`~PCGc)0EVH<9+f0|gy58kZ#P zu@6Jn3!tK&Uo`4(Zt?HU9-bI7mu@z2Wv z+A%7Y;W}N>EAC5j(uSivh5kVY7urlRJGT?BBj>QE9I=kiJp6V`zVg;%)XTrzhu@_g zt4nSKD={H^kAC9by<=I=kWDzH?pbj{+lIpF_xV@kK^$pkCkeCrJim)B27BhLKnj2S z0msq~vweo3|Ag!ZP*`9n=>7xQR5<*<;rs6wzoua6TGB^}5)%1OQP*prc3Qm7OvVUhVAjH$w*w6hW# z{VhqzUjt@hcN*G(K>k43sD5cj@apw$8ZZWt*aOOzW5^g6?n*n@uMDZno?i%;n4TAm-k6bDcxpuljHUWINB(86QF_}hBAM4=>E zqTo`h67<-*(+e>|PsdETgpd9%U>S`4|F*$%-C#w7@Do8ql+)wNrbIBe!%?CHz9lNB z&Q7=OTiYeoqx`upF&jb12*I(S8o}u)JWrJ5tq^wq;rW~p(d1v_=UvF^lsn7Ixy%H; z@NdqUYB%y17?5V*d4W_j!1&bX;S)L_jCe7&3Ox_UX*kM?h+-y2Y!uOrZ~%ufnKklSkk?9(WHymU;p=Fy2#Rj)AH_)oMr-eU+f2Xb_z~~YiGQ*jj z*u8#I4gVtAvRPq|Ty>H3gn{kOL2$mBQE`Ne%URn_pDKO@8eU87O z?1J%-MS48_$TfO57VYj_4vKo3$>shqrebe{oHhE`tEiU~^NU~rVZhh#G4v1InUayc zofEf{b}QHg*t4SXdUO7dyg9kPJq!hG$X-{h9`l3aSeW#gLEAKIgrhs%0KYWYQ2*9s3`ucsL=1?tN&3^qECCjYijGQ+PZBu8tspJ zsrs`wfvwgrYBv@2A;1bEZr?O-%NMn2ZOZSJ#&x+`ztz;5deJ^_{QObr>ZrO2fb-j? z+S008TdlVjay3=cs*SpK+kW3vKcefIW~ue^c}=~&zG%H~E*2D@Z{HH?M*XAWxXxm3 z_3eDdm0GSKbIO%#B)VDFw0DhG<)e}i&hhcUEZ+9nhnFwr?cv3~!UU#0947|o2XK6< z2i&PJF$6QnvH0$QVXZKH24F|oN(ML-|Dsb>?i9iI*&_kC96qH#w{Ec*+D{Lkv zpUTHA80k(xgyNvO%g9**2DRZ(mV`sh{x;(ikuceov1|L3OE@qc#c zxxX?ah&lq4wj}!9%%FMtY2b=+u z+T$U@@WRL% z1#y^({k|QV%$H_yxLu&(7;P-b2!zpBod#Su-r~c|c*rZ!Dk^4)In+d*Gf*(Hf0eGv!*i!$3hGG3z@{wXn>F7YRe6M=-F-u2lca! zL`t#kJ=6kXt8SVz8#u)55!_ok%|>|cy+u1iXvB^3VP01^_%4zat(+)|XzAp2MdM-^ zY+Ey$iS4^CEx%8)Al}!q(C`P6BW%(ed;(bz73KU(&?vqxQWckbC}ji7=QBVNY0UFn zZ;q~JymkT;V6Fzi$epgM@U0Mx#KcAB(fW*-i}F!%WQYk5yfNrK@(W7{oUV5)QCENL zyTdsW%M*!6P)+)mk!9PlT`ln&33oB^7LxE68Id>YyMu{U@>RTevxC4)%wE-)hiRo~ zLv!Nl$}{p@QUOh0FX59p@9b;w!VYLdX3)kIeX`iYRh%}4%+12F9wEZN_}ulD5D`s% zFQJ2H%~Dc17mGwfVB|>od?dPkPD0!xaG(q-5~{yF789KKKYd-MJ=0nES!&YjpY|&; z+anrgNx;g!c2A$4(&Ins9|pb8p7@E<+VS7P(L(%J*zW(>NLo7ni&Q`v=ywdWWWS$2 zITOQ0e|b5jALs@~9sZwG>9=W;R*e5>8P*#-K^^PtzjU-<|M|o1{_l;XT{f7iFZ z_bR#bN_1e;^*oGsvtD=Q<|aiztzT$cznC^d$}seL52Iw7NfabAIMU=2-Dk@`egCHz zay@~1@wCSN^SM$f+W%QB6%Wb&i}{1?{O?9mn*Bd|ujXU-I!Z8?5ToVL4un3AnU?OV zBQp=YkUhTmbnDLJQ6zTHeRAo~sb6d_dVIObR-;cY$~Pj#rK7ENF84uSTWh!JsZx6U z$KtvF&tLp|_JHwUz7Vbd;eW*givRFw>;E^AR<8d|)F6HFZ<4)T`TJ(m68op~dc5m; z3J0*>{txHZ|8qy%@!v+$YWtt4!4d~B$=`Z_Z!|^rA0POWN9@UleUr5A{68B0-2BhM z!O?d7w~@5>T|E5TgIEbbtaI=Mo%w|UaX4GrLvWw5V=(*iNe$Gbm-+qaC=vm}!9e%M zv>?)VM`H0MLLD!D@k1)d2pgpz;3THv6n>eEC11eF06%9vX7B?p*-4I>jfSG9Ge}(9 z%q9@&9oGx8(J=G{oo^pOYB|DdTSnk|FZ@LWVm9do{9-xTu72-^9^#5NJS6Y{uOOYU zWjJSmOg3#_8XbxJ8DeHg=%Q~%_C(Uj#$>`tOc(sZ>$aTUY{8fZn2}NnK}j!679f5< zLt2o$bYXfg1n*G9E4Ba;jumh{EIz&YA^INg8IdH3A2;B$2A0DItdoZBOFQ(w$8|=W zQ0R>&DofvlY6-AUIcCJ`d-Y1pPRwY`A4yUDu^@x}nUX*3Pe$6}WX{B_gtm(X;n2Br z=wyNJ^}+$2L-^M(&+{*K;q?2$wD<=rfP9Rc`MNts5AjLx(3j^90&q%brsr$Bt8IGXv}FIkYuo;l zjQuICjsJ6nx%j_CTY|U!{|3^^_@Apmdg#xywo(5#pVIB0&U!x4;h$&g?LSwXJO6`E z`O?<@H<40}J0X50V1D2$TPyz$P3iVO7@GtCiFSWIp#MLbzyGg9R|0PBe*-Di{<-*- zcxV)S2-3HH2{3o4$dmnEE8x7)sk?#I9bePH)RQ}Uu=OfmJ*C^fZkis7v*WsVPcRBt zKmT8v#Q!)Lp#Hy5+Rp!PB(0496Kaq?3P=EK#{%DEdeHg*&%7OY-TZ%k@%(>jYyX=` z+xvevdH*jw?rz`t`-0zjRuC|UpL~01?DNZhAAMo)_Db4~TuDp1O66?Z9nlp<6CX;a z+7J@-;n2324}mMCuU4$Rh2wZ4OZ@+D!%NBno`ubaMu$p6!?Wm2oe9mW<{=1}rtR`W zlweyOPxr<$$HVB98n%po923szrN=KXxVGgpbW1h-&Fy0aO=PU^I`Jh&bT-eNs08tj zHiv#~|F%u5(~|i=X6plsU)ucyzYMUZ|35l7$j{IJ9UX1w|2LAh{Xd(Y<=sI4U(-Dw z{_Zf}=-)9ovG1ZsEaHS8vU-puHl+6cf6ZPSzO`<9>N|OtZP>c+%l%+rWBtMOGUB-( zfQZ7m0x`D|qH5eY7Uw}Q{%qM}`HA!&FMBMVBK=3mp5(h+`YR*0FCz?%Z*rIsgmztS zwY94HR)s8xzuHBs+HAvhxn90hTL|+%>(Z=5xiqza4e4^-OOLKgKk>zDkKWGsH2|qj z;wda0(R_-u=Vgs(9w+S-StE|GDDBWfE)8vcJR|T0+;F3u5*T+jmdiF$b4_90Vf@AO4?^;H56$aT3zr8k~0omkw z8h%MoFvk_gw1gVcSyM#BL=f=999`U`BZByLuK@)L@0kWotmU)ufStRV5e^lYs3rLxX(*Dq@X88*mN2eNK;ML=I4FY8#Mu zv2@!{+yg}N;els@e9@$OZswTym63uVMFVspAXpSo)a{`O)9{%`v0|%i>~14<0-xWxg1&m_S)^sr zY|!*RWUjaEtEvWC<4yZrxupU=H(QOj)rwky^Y@ska!1puUS74~s!^+`Ee*=`3VyA( zTh;TMcB7>smff<3Wp{a2x&9v1pPMaJ)1c9U>UFbLMRbV2Rj#+Is+Iw9?>4%x3?K@q zH`-9EURT>{g(zxdc*Tnaq45T;)z-xozLw9cwQBo4uklT_U8maKV0C3^V&7c7xT%$? z7jE9Pnhi|_YFwqNUDV3eYqf%Iv5vI@cHH$gXjkQ0ZLY12cXhReOXD}46~t9zQ(XY zgO|%WLwunIwHg;UE%llRM|Nm8=UThkzGV>Mkf?7l4OuNz44A#*u zXGD__3Gxg95c>Q^t8(sD>ut5wx@oqnjru+c`yFxz=`3U63TJbp&Kr!3YP8-XS{k2J zBROQ?-Ia6w%bx%UbnPtzW2=-yl5is+ziwVykM@ z%T-0y@5)&34R1J!3n>$iRnoy&i8EZRP<;dC%G)XtAAzGHXw^t40;_lC-`x}W zbg1B(2a`fDmmcfEl|Jsdt_d&wzBj&OW@xgr4nxz$XrWJ4?*Db?jkZ5P_@I>T|3}uH zC1Y&;6ubW)u>UtdzyGgTJlx*@wvj}V-d@-C*G((z|H*z6d|muk$}iskUD)3Lv5~Zm z|2Dh+_gVXY7WQN0Xu3HMn&AfYThy)-Z4TlyV02aaVv!=Ou9fdIvhMDzHvb2u_7_@# zSQ0aK=~Bamcrl%NWQ#NxLc*UogpB-u^bCl3Hg)KjJ--267RxyNQhk#R85+4`(5g*`1tZ3U+9yWV zd{IX%gG_Ed$7)T9JMD6_SubC!(XSAQU*wB_vv(Vle$kYE|7YY5gfIN;I@a0$LH=NV z{CBjy|79~NVWSj!35iRu|DV05-)h@f{%`aYTbENH*OIXb&_hB_2oOR72^Z6(_qIKW zEXlTtEV=ps%(+@`VMN5zVo32B!%@s|-N!9y}vvx;~ZeS!J&i&?-T%`EkK0?(>Y# z|38}y5R>yiY-RZ$>HZhIy}8)`^LWPI{}N9h-<^d{ z-xNiXFg!A%j?aQ9?u1VB?Js!vCqM&fS0Y<}tb&Upz2&__O7+@7~ zuspc8+r`PmUHG-r)tb!{wu&B~Xw48uW|Ug19|kdAqag=IX!?-|wMi=tQ55HjmQ}Gr z{|h>S0^jtg2oS)dLT}h)kE#Q(I@v(*r|VpaBI>PyCKHNbuv2l=hydPLhoJ(+#>zy{3H$KROXed80e;6C=6HAo@SNta7A&r7}cf9x@UlJ zS@lm8siP1rTx%>XuknzxYo~=3DJZ#`tW$@GDb{gN%DDsJ7YTW$G+tWFcX+gz9S~$* zpS}uzlf8_dQ^NoaS=2(~l?U;CoDTNS9jwaKBT+Rl@I*~QfeWl@g)~Gd?r=Q|C==Rv zWbnITh}gR$j$8DIzTA z*z;gnMlFGY_ZB*V9hUeR>J?0DigP5zI>JkQUS5~{r&Lc+@uG-135G3Q;zPJWlEoll zI}o)f)og%#SrF^wq>eRwg)aj!zpe?~2?K_ME5Z~HO;jf0*m=*6I5L;01o*4D4yuah zSf*`My!};W${K}@X27fBo*~t9L02_?39PxT`@$@~*G1b?mLmuDh<)WjzO^nGlh%yaQgz zkUrxAIX5t=n77r5dpou!(nGS&Ca2sGtep+m@$u`up9fGrD%ud-GWr`+485a%lw77RK9E~f#T!$rhh z7A5_D5XLgtM>(up9XK(nR?VaX>@5v#2U77sVI!x{WX*8G!7MA|E@U%CoA zJSQ^KDQhi^Fw&NV^PQUNdrUuI`k9h*S^I^=Pgx;ZzORsLVK8|gQ2tvA&TgqNG?jg2 z<#`k|!S|flGYP41d)Ukx-^@mK-5eL2+VG{ed8tl#Vb8|$$|!u{KbJyJ!n+)(1Ida1 z;ni-8L9HDGwSMPgw`Gzp#8$6yo3jf1R>4lNcX_PmC%qPMu_yu71>{`$(WqCrOsD{u z^mR3M-|~_uRd|r3MPsdkRe~#PRfb8WSp=3H*#*R3aJzDC4lM~#=waDNgH=$P|GVDU zHrC;vI%AE^O+)#Yv7WuDX{&@Z!d685n0bAxLW3hk#vr4;I^ASRS` zB%rz9UBbkG_%7~E4=c7_nVxHBWqv`13L$NVlFukWw~fb~zep0|q;j!;R>S>}S`j%N zN-%$*450@L*($Uy7F&I{|1k=zONUQ3Opx_x8G%Uc_}FJZ8tb&sq?1((klaY*Ro3v( z-SIzWJ5*jF5yXkFMoGI3b`b0;e>tTT^c$=y>qlO<1Jr>^ z887;#X{SM$zpZ7qP}NY-XnEKxMIONarMjmE9BRsGu~zW1E8W6J?7D{6w`v@!o`*^| zyAYeXK#Cy|1|*>Y{%cskDpA;r4T<3foMid-1WaRw{UR$@W)$7+h~*s^*uZ=7 zlx2J2>iugyWBk8!ivQc#c)Yzi6#uuexc@PiXA%E5*ZUtIq#M<_K`u?)ne-Onsj3!y ztnwnbxD;I;1z2Y%forh?u;0vZP#Px)Mh9I?9~DJc1wG3eYAG+Yud}yKjCb>ndaYON zO$Y-H2Zd?~e>k#GCM7V0PJ|-wCSh1?hq&J90r`D{WNeS*B>PRZdB#pbkYa z!#Ezp=v`keg#B{KH(6BnT0vO zIq;yIn0?2#2ka?uH}5$blCH+E4Yx96sn2qmC5+!wU|QRmmy0^r~gJ2zvXO@DQrPhHyB$66H^;Tj7&nbD-)tT6Cv zW;F0EBv}}Dga-xH5zTlFM>U&@+EgAhkh^UJ1b)z$LAa0wgv-;hNRhgU1a7j6Bk>9W$MIX}!Fy`q7ivDn-j;n z`4DlDVd$$x#OxVJ2fVp%jWlV`CbKv$pLq8^0q5(wZ zvR6SHr6Lb334<1TXwfgUcQg`7o9u&$2Sn_jLFlKFLu7mXY?9*y-LB#1y4GXViy{QY zMmQ6RQI^w6o95<@$Z7S9ybR&X0FyMQ)85&!ILD&{JFjqH9x>Q@u7{_!nu1$|iwCt} zY6ISS!pW!xw8VJ$oNLdUYkX2LEOhWGrgZq*EOHX7(u{NZzTIBr+*;(^TIAeXsA&GW3c_zV(5NmRtqeNTf=hGAY{A`~` zHoZEl3<)(9Y1woiD%t4ytB5yZl_?v)pLj!`RYAbrO}yb=KLjp&(G&vcPGSvOmkG9M z#2V%>7%$kS5NpWc#|yS8#2NsZLaPmr6uB?f0 zSi0O3S{Qu_pM0>zm2VKFA}19oCiyQv_(j73S-KG5CcT?!c@H5msC2=$n3o3#@sgEkVaw9jEXMcpHVt_~u zAt1zNJn$SntG`il6|=<8rUp+mav>D2gRT!;xc6D@m%Q~N43YbI-csx3VTQ}FiJ-B& z+AI%tx;=0ZcQH`_@Fb@j^3)NAi6oIydt{s;0x+jAMec5c;B@je6v2b zcHeH(e^PC}_Gq>bx%%Y^-wu0ucJPut?BO8a^V7Z^h9xf>GXZ%3ymW^?(?NH=p>M1| z5ab>i90>HC=U!nEDA-r9#{alKNTC<(@aP+U2kC*Moaw_s{zKeIOfc3*7U!r#8!-^m|mJaErc+X*Id_iQXedwZ%I!{fNO;&=a{ zluFm@% zy%tqMaol)kr7*7&@&nzkNhu`H(;bgq%auZTSUvU8>u2^*i$J|(_Er|dDZ58sKis{~YaPy!isnScb=Hfk}*60Csjo1X2sp~>F( zW~+rZAUQvPY>$r7#@Rmvnu9Os`;*k4G#rtJ-rQm~2q|$RmPH-&gfTk=4+cLb{P}$r z#~g}qvsF6KJ32e5tZ@#e%)R3$bm=G!6q5xP)vm_J%e_|v-|~H)OxdYd?DaIbbv@4< z)m44CtJBh+dK?b*25;cMIyB~e@ijYy4X3QwjOjA~LJ4C~e`_P^=<-m}BTUe70^&0K z|Nl$FAbAoK8SY0C3&SDtYCH((fM+q`_ja;T_Ar+g=H=npq+$@3e~Hw@<@Y~ZL2%hK z!^_#!0Gp8iv$4KetpBpTwYjMOFqda>|MLsh|9X)cgkrw|u7~eRf#5go&;)*c?)YY> zYx**$6v9L`Q%VitaBB zXe-{gD<`1Im+-zcw^}^2e#Ynjo=pmfN%H^ku>9Xxf7?|I`o%{0h|4 z*9sX4ir4fPTEQ353d}V9(>)XfnSNjVpIA2O3V4gsNZg{5puhd;&EXFF;I!!GBJ|nh z$#YA>OC|)G(8ctZq3K(0WCiR+65hI6s(wPBesW2BZX#hBX;$TLp_15N!r(7F|67gCh5Vn(Q_4mb^vd=?)CxPmyuq3l;Yk;0&2F3h!Ya%43fpD6o(SVYm+HfB zPjF1WwiI<;m|p{wL`}00SvT0|26GH7Ju*7CH)~5UEl^W;Z=XEDuUfZ_?7QFbyBqlI zSls}+Ti+2Uxl#zq}>#FhS*EIvctgNv=|74?Dr0T{;(INm1lQ&a) z!67e8eE!MMbXH5+EXSc9jk#ytGSL0Zog0 zeIOa=vv&!Cu+MaRO#|}ivr5=wde~;m{EZ4b{Q39--Up=V`|?|+-!OfdFBsF|<+|2S zqOL7}ud!!nIM)2c^R(WTnm$_5yyVD4+mc^$aKyj_2VcVHdv?5Hv(OZQA$U#&JEJ$C zB=uM~B*Yx(9$JA^xT_Ynt;XZWn?`&SQ}gqe`z!p63yI_4W%Ed<4GHar!v~}N z0GneLT0iL9DlTX_ET-QQ_LY?{#o|zNSQ6b$7c18u%r?GrKB4P^zFJ=Yw8O5kFcAB- zqQ3lVrSh$*Oy&ANtToufc!yyYF2G6he`B*y{}aOk7WKd8@+|y+U-0~I;dJ{Jj^Z+A zh@#I+Yydqb$sPJ!hjXn>Orbk3a+p3zm&RoMpob*sVszcMgbdhBvUE*F2>g!Wmu9tJ zl+LCKaWS+|7iV7yVl6n_;y-I4K@4^u$aVi zG`saN+wkl7(K7oj5bf4w0*nl{a({PS!+MX%Ms_Q0(~BH1$gaD%PrqZ!@+bBL9S(8!;F##?qmr6JEzpXt*!cmD%7#L}FOV*hed z1%gBeZKRJ9(DJ=n&y9L!Y;_S)j^o4s_?i|bJdFMELr+V#sBorlRujZB4)5QyCeR>e zgt&5pB*J=h{oHyqQj~3wG1_&kODwLGm3^g|OH_5nW2%C$Wdyx^et1!tu4OtId_CO- zDFES-$}slbE__T8@EemZDQ@gLxT0K3;ED`I!x|F5p)+B{hgO70WPFR!q%l>OrK>qr z*ICOkLr8Z6VkO;OcObTG59Glf1XQAsxD-+qYDCxOfPVST@h@G?5$ELHbnww|XP zV(@aT>Z={lckB6gGbxZC9S)A1ic1>ywu~dp+TrwemseLg+`qB<8cxHx0)=%s@S}vE zPAx5^fA6lWXcBR-Sg{*>SSc+v?bPLf?r@_8$}o%lEsGVQZcF+tbet|(9*)kIB?IAr z3at+g!{NumDRO`!v z@u)FT$cvi%Sk`hR@Tp(ADr;#W5m3XPCG8a+PknT4Io~#|pt25F!N})dmAa;R~Ta4|+!jR>qs|7;+ zG#50+?DA^Nye1@7?L_qW&b0zCTY%hDs3oGB&gRGjCTD?IfV&yG<^JDm_tG_B5SKII z2b1=HeSIDF|Hk^}_EvopHa^;ai~3*ldGci@OUQtg`o!=TY_V{veB)2~{s%r3>0|}Y zf(uOE|67IqzrDV(i2s_)Gj{)HWKhlp@b?85_@rpbN?@x1dIJY zhX-uFn&-A^LoN+@rd7W4^Y3WcJMc;5lnSWy^K|*A;9YGjCn8mPJhTNLy3bR-{~hTN zGGI?5I*Knp#!eK|M*q^oT|6^>%J;wGfid15 zerP_dk4gLg@kXO~|6{wc$p0{xM_G7f(b;O zAEVFd?wNf7APIpW0ZF@h5M0cor>Cc@D=hDlbg4qJ z#Ps->2w8hdSe;z|WpniK`XC$s@#DMi|78Cgn@o)#pEz*>%B4~hW1#;ZKRl3v=P6(R z!Tj5mMA>eZz)=7(f%m3ra4?61;*1d zB-;*+ni>IUm09v`nT8_LE5lxUQb|rKsT4~cpH8Ko$8djHSXtqCO+vWrl#)E5j6qr0 znx|-Irm~Bw?I;21PUAN2Xa+l@7K@zCWGzaLdOB<4E%Y{jQC2dFE`X`5akT_v*~CcN zbv9#HPU{+p1ypQl0p`WW6rhLRf{=mtyDDp2Wq=HcY?SV+c!A}BHf-*k(riu>YRGh{GD9|111!gm7Dbk8rV0jfJR~18%bCMG2 z7$aN7E6d3Z?1%4Q;52%IH4CEwpBW1E8!botkSyaEiY*!yX_kYO2I2@JtXthI3bp-NCxwh@NK)`GS?N0)D5>&5e@zsD)?mH_ z^S~?8Rip9%Lpr#T2+xeSin^Jb@!hD!YcxbGiw{8qgjYZ?K0DisVtNJFvQTq#>!yie zD1N)lJKWS7!y5pdMv6jY>Js{0Vec7EC-%cBlcAGDMSVi>L>mMPs9I6#M=l4TUM!a_ zURHgqb_z1LEYs=+-s53-gD7DyJhT;u7=`(ulo$8NvxgN9pxB9?!$SF+H_cGwG79`0 zc@6O$DfuH#ZQ#AI&?UA(kY;KTx7-Lj3cmb>TNlc9m8 z{ngd$9cwbWKP-gh4a!R(w^&b*Xp$mA!hw$h2h25)g^~y_&H#Gj#To)IrVBR9&7AA7Nz^b`T(4(H@G(pyqEPN0m3sgkU6H z1sX4+5od3;Ml>gs8xcHgasRNbuSbc1-q2V_0{D1nn1Qw_ZaXT%kh#COctrRQhxI0g zB--U9U|S*O9Hr?>R3k^$6l!dP?!jeQ6_fxKb9mw^0ttbKGq;58`F`JRVj;eqs z8HtTqH1WWK`UHcAbx)z-76COPWqjzzKn+2EU?VJ~O%!A+70p&dfDYTTsgO2e+ge`r zRv`4N8Dt>@-u&J4W0z9nv3dggzt1)jW%FS9ew&|t{J$qs$?@j=U#aof{(mITF}8YP zDZ}P6tFtQ$%WDglGHh*OZ83v(xztCgS*}1x-eoL!{Da&IqD^mC!QST=R#w-%yQgO|OX-Eh)9JZ6yq4+35rT$NdwD`% zr-pB@r%RcY)rAY^2gcNm15%bQD068*=Je9S^FO|DKGWXRJ%4d=k)2P&v^AlnosoMn zeg5T(IN+JZ#hzHXXV0crRx@jlkBK`rR>#Kbz8I^Y0&Dcq8+8ZHVB2>q?0{HUkJM^9 z=w{K_m^lc>%zZ4Bhu7C(8FXTEVQelOICEjYRoM7Bz!TViEVobbpX0|{^MAzgpGWi@ zV~(^eNL7=_0F|;8*S3K)j@Awo3QG)3LD1aLmTPGVgBN(-teh@lA`raVaEQ&c|3YMN zpF%s*kDvfMXI|FL3Y*!WpNXwDCA*58#6uDjiaaJUXmOKJb`m~LPn>){Ik8*ZeSXW^g~7DHKmcAJELZ~j+Yw4JPAbU zpa<*9JnY=|G-F1Yez#AJzre)DQ_mWImP(#Fm0~~m0mF~UKRE^Xeu*X7H2wbKsWI^t zw3bTFoSMMjs8Vt!mBb`d^cjjJpMz?c?tbjK7Y4%)R{ur)M*Y9*H+SBGpI_B)@4Un6 z_v&{Ue7>=BW#`SEzp3A?e_6j%zsc&KLXlhW>u2!qb1ZWYUcfgyZ`N31# z`ujwfx9eXq_)!Jo{0zug(&~-+7eME?iN*z8-vGM3i$9-=2+{h#co^AvyZ+@K_+aq* zZvA(-tQmZN3%LVSdI!qP)jw7`}n;W_AV1|@Q}XY<2g+5Bwh zUAeG(A6dGWy*5}d$R56ealkr9@!}pqd}HUIcHSIpn{NF*U|9e#&V@G!7{M2WYm|+U z^4^Y2Q2lm-?Kyk9&PQxCei9;J2Vj@zabRqZMid*sV*~gTWB`xjWd|f)w*DS$u*jc4 zeYgo6=*lkYNr%=AD7bSKSQ@EExVhh>T^%=mV0jE#8)+!8_shXRt0c}K2gJT_3uQ;B zM4`R^oxKHVR{vK~=oax;)OP+sw1Y229jPFZ+IE9}yB!AN-p*BQ))PBErS`AFS2t1Z zBVdHa^<^NN0H&A+i|AwLYCHS|7z!H-MCZGj3t&*cM*EYeb0P-A_@#Lx{jdt(-WKX& zQ{OvRN4zn%BH=cb`V7&CRcVe9elZ=OMeh6^4g40(!cDXu$hM<3CE{+-wg##zA)ZuS zg7G$~z`ygSLk3s-C`mkC4za-hQ+8fGvvMddpnd#5lM^EUOEmv`od4}eo=5k343d*$ zLc!uGylpU*Qj+7lIXTis-ueSubpL3xMYGIpHUpcDh50s4H#;htTpi+qGUdz)lURv5 zJrE0S(d9PpvEO51^}=J9OX9rgs2~FeWxoHtiOEc$F5Z<|2C*!sl~p`vF87el*oP4N z5PI!HXg(6KuQOqR@}8hEsD$QrDC0IP%?!;+9>xk^e}E>`06=W)6@VCUXz-kt zR}<`#nfqV5hE~2r+gC{tW*HCm;pLs)Kzi%>*mKpiae;V?Mun*|*41v-P48e1R!%dq zcJ2)6K_K{0FnuzY5>B6oA)3HWu+&>eN=FmBn@6S3v)pz7UHDLXFpPtFB-&7F;4aC- zujq&nR|pO@8=%_xQ&w>pHZy*Y@Y-srhu)mdx1;ucmFQ@8^Qjz0Dw4D|O_r8+~g z4{1PrNa;s3Uop*UFx!MSH8dpKCJ724=Zoe@b&K%y2rmbD1GNG<1yCQ=LoFv}0Q!d! zmC^LaJcNO)qE>j3_5o5T)E0OH*f2-4rRoAAUSbhfWk=?j5PCW)-;RvCo7w1`ipCB$ zvx^NO^`Vjvb0%RSoQF|35}E=0j#yJ30m`FF9|6U}5;pXV9e@9SJfiXoAl1AoviLP2 zMvAf|?e4C_NHLeLS-?X6dtXwP@DQ5wCP3iJ-lBrM(j3!AOTpSS0I67?7)KV*UTla= z)6$nk&1#M>Vz*!tWn?KJYpp`d9>Pi>NV8eh_B!0aFPvMrO#F^ynY_oE zRD@bXSm475(@|-_X)be6NKCO-M4g7Bt4$)kKR0Pu>`-%Tgo#hyPqw% zBh(6SX;Ffh6-Eb|$jx;P<`20ojG@9UF@r?G547B1x$_kd;LP z*N`63;D&@IN+99tnh-!s!oEk{kaRY#IAnL8H909@BiHj~G|fzw&t<(nXF<<{GVA070)Tto=B%vY0+UHyA+;vyt!e zxc$P`>x9+8;rKvg9L&(~i!n?RU-jV-?zwAyeeJ0@@wnJDY|#2ZohbpUDrhLxYK1~= z8}}u0=c}dKZyc0|^UYMiiMZ9*Ky=1xB(@_gzG6@CAzb=!;KtvSV)ap~M0FF~OjXX-nP%^>%iGfC7L&Wsm zu-90zk9p91%m+RQc!Z3)#|Qo%5%Spo9Q&W2DF1WplpP4C?4oabciTwqdnx6#)xiE+ z<{#Kg+|+Pe24w;5-cYOq0V%=KP}v(R3>-Sp@bWy=3QVh1~$0c1jd0a z9HxU&Y3E=JygPwk2luwnvCT;1t60PpUN+Lcf`W2;k3E$=^;EX#z&aPh4Nrp3flKMY zDuCm`f4%}ocki^GI*nr3pi8z5yvmy64cE{H(yZ*nre2VR6l=dBYrS;qBX&!8njyC* zzvUpv>l&b`wvFrt;e>xS3!I&Dr4M^f&NVcs&=x{zAZem-kZP&6t!pNZ$QDsB&_h%!qItwAu1CZti@{r2fS$`km1 zmoKc%FDzzO6PnTEKK8l)DVaRceExepH8~mke~;q%bB9!`B8pJ2JEK-1H#If}MDdqw zPmSuaqVf3I{R!58MeA4m$M{5>{NJf~{U611j9t>WgGLBaCxcKB)EF{>d>Kgt{`EFx zm_|=NC@yBfAuW5}bd9{!uNI6PRnfN`4T@;_JZM8~CP%-Yw(xAN4(eaR;7&qygKXVh zMuj9&$rD}{?(sp23z<@qW6Ib`%)&jMd_I*N-z6@jQ$)3k4GB%)Ohr>Joj+YP&7v;G zXa`BWk0u->nq%8fv7Pc$Y$so64I5cBbMtBrK5k|58d}9ti4)oJ9tME4v50qM$MX&3 zU4@P`?tJL7_1bTZbw&=M~n0&T4b&EpFpg|Z*MfJ|E{ro?MtHw zYJB6)2L|i`jq2O1yxzF;k-_f23qRbRX1f^J7?SfHqa#=QoNd6H514WPDij6U+rsav z|E950qxwsS*^TPEXrpS}x#uvwap&VQ%Y~Q$^yZkgYcSA8^}`&ifZklv8r3UCcmzi6 znhC8!U(R~%3xY_M%@;M*gmuxVzGYCPHI({*lq&ikqVmJq^&B$*rjMJ(aTK$0z#tWxgV!H@0Ee6R!1okJ z;#Ky|&7f)sc=i2qWE4k~p`okL7GW<8ts9x+=MeKXoN3&-ZV1jrQ(k84surF04Z-&u z3zuGk5sk>Qz*DbBOUGd|PhQx}Q8Te#2hVf^e;h&+htNDxAvC>6;oy07gQyzv!Ac## z%eo+=Yz`h@Bir-BYz`J+BO7ZMWf6xL4Mup;8Y*hYn@Ky%?PIn9?e5N3q%iypG_l&9 za+9X#pmI$*9r1tBg{M+9svoJ5y&%Ev|8t{ymD%53C#msQ8hhO|iX+hI{i`K1$rhVB z2!R6SN%MT$n=Jv>*ZLl*V4_j8fi%YsVI zY!|U9Q48p~a~8MG&G-aZf`|pxozft>2wB4v~!>>^GLwp-)NvPhn zYZ`6lx11wSC-A7zK5K%=K>{Ju1N=`W1jJ^f%99)Q)330fM)g0CTz-vGLG8Dm#lhKq zKFIi!B|WL+HmdI$5#kO9|Fj?$TKfg@mk+Rk4;^GY+wJ-yD^ui?G5BT zf;oyV+OSBu7?JISS_s*}vXZ;5Bb)Ogf|kgrA_iA%R6hnTOK*VTmStbC`qoWYQ#o2% zpOgjPZOd`n;}G=6>$%4)AOBH5f&VvW_sRb|nH+D)|35w%`+tw*!L$7E1inbz(uGj3 zN_$R0Em4*cVRb<6w|s$7@*QWy3mg%xD(UPvy{~4 zGkD;9_!)_SRop9NP9Y)QkanwK^dtzx3ak^{atJAEMb&gQtE0#p>It4v*S1FObri7x z7o$PF(UnYkZYiUXhdopW_8An^KuX)(+zh#&M`07vNAZaN?v03M=6D6~F+lrH-lX|5 zxCjL-sfJ6q#uN51XKUCSP937CJ74?Yxz@*6>g054Vvm#yOPXcE=L$QABFW4K{9p2J zeaKyI>rtP*%wg+~BwEPftA6HLc$^*K=e+N7oMlzL_VI?>tmnqA@YogJ7gzYjZ|-Up zsHWQ+wQcrVskUu|vPadf0}oN33jcRHGGI# zWnNy#q%fdP;NW1&CghTpqz&33P_)A zOVoNl)uh$Q-4P+`H}Z-E5~g8hy`q&bWqlws-krv|v_A}eNYV4^9H)34kYLp!nBk## zgK=jD?42|GY`^9a+aZx=xdzxZQO9Fr&#h5)Y<~M}2fGTO)kEbp&moe}}#~Fw4 zbI@2PbFz|;V#!ZlEcwwY`j7+1YXciaiK8fS6eW(L#8H%Z^P^{NzH1cBqKqQnInBn)xEv_5 zkiWa2i+LbR9(o5`EbGufVLw3-rU5{J;m&E%dHBw0?29cZvKMq1JD4SdIr6az8ISY% z3dG1NcW>Q2Y4ANCkScxWa~+hDba%mnV$t;m00nJT22*)qPONdebruA>%Yjn3b?kvl z5;NS&?(B&0Ym9Af+D!pBPfH}YUFSc{PEeJZ^IaqZ+zq%t>ZL(yI)!SND-Kcj(IfzU zIVBAoN;_ zLRPGWa^EN~;OdWCytFc*qHjn@&)R3%sEQ37nGpdh&MgQReB+Sa{f^9lX$IQ!k`AIe z`^3F2gW;g&6|oJ@>7ZRcnNxB?#+boZWE@g5Mw;2Bvh9Vi-zq~Vj5Lsg+p{pX#vFC& z)U+~Z+p>UbJ_gOA%%qW_a-ac$2LQ<;fmMg{)9|5l-Yq-^x5}5InE6xlapM1J+NSt_ zGU)vOp57?_zZsur$UX{2s7$i3YT^dYQv)ta+*)^4TibzfZX@zA^dX8Wa7fhfpchz1 zNM8=G(A};`DL?o>)_R>cGc`LY0L|O>kmPnSdshiSj|i$pjwn(FaMUN|cS|&r2WSE# z&w~s|nDWV)!I61sn za+rbSkfO+~hL8tEN<2Pr6$}&|5AhSdL}HEPx!(^m8sTkV4ncz*UYZ*CfTtJSYog@K z6M~%S0$nHbe%XUSQ$E2xR5tWEAcf`n(iy#Y3qTh(XAm6CAq4fU(e&u|&`kp>;V=lB z4Et@8DPNam=x1C+0|G7}Av4Hb9s7d6YKW`OOB&cC;<2bl%Zt;J zr7x%x8f#`s9gs`VJg}g*HNCv3i>PcmCA(lf;4^BuCJ|!7K@+J2>|Xi0ih5ns#cUSW zDjAnJE}T?+1OSB^?8k+F4%Q#yno1WaDQdI+6sQqEH<=bDFvQqsmW0a<>NX=aZA%V1 zic-^AL3(U+1Hw!USa()H-L4FDI^UAXo{bS7zP3lH?T7r^Ay^f<*xfX~wi8#Wfc?!B zWupKeq3Br~r_hvI$O#JVSZYE}TWEC(Q8Gi6%7Gql^Mx1NvV|D6%q?Du;j##2Mme_$MVcpwbNW9p{Bfnov(~L-7 z7XU?+Jjb2xv6l}$Px@fPkB&VjauJ`&1$ydV7IN^g>wUa4)`h3rL+^UVEdF2?zcx!B zn5B|g{N616Y8IEw!sQ1SE-hdF%q)Cs78cFI+h*ZhRQwecf3>Cf%j3WS)-+4!7@J;S ze*g4SQS{|SfIWM&@SSu+dOvMEPP{$aPjQ&;=A`h z|IsXb0_|}av$$xMKyr+c%fr z`^qewHw&lD!Y#A#sd=o}4&QG*Z+w6gDSgML_HO6-dmGWx4>^+U_}`Y_`<&ClEC6)@ z;UA$c4iD8W`+R-V@Pb~ryz=!g5576wDIVT6m;_OM;`H(_=bA+LBX{%G;dB1p(y<5c zFbPIs``j#k*x7Dg8W{tnrR zx*o72$7$p^eUcofQKeI7R64E0h(FJ5g_X+-EAO9paO^l3PG;dk{kF|4+{Vql^%QP4 z_)vV2UOxH7{l9+cSQVG&@BMNDZxv55KLHM5mOeI17tP{1+|(A&-n)6*Ec}n(mZ$+% z`iz6hNWh0$EBOcqK2uydem-!6U>3eG3m@Wyj}>e{-!@C{uwianlPP`5e*O$_@F^|N ze~h5xv#d|c$^q1zWT^Sp-pHK8QHrNLlR>Vo#gKcsMmLyDjUDXieZsiF!nlKLAX^RB9Lvxw0MT&k%lgV09JCRl zVQ7xxRWRFu1zn!monJnAapf-;xG)iJqhDhvc|WS{3ct3?%ULVMUzq;72;aT9w>8)a zrW;Q&CGjCwFb@k$V1+TB^O-1h1AK>AgTM33r=Zap-w@bCk!hDJtpAIQ*S&X{3Pl?U zuYbXAowNn=6H6^|zAwz%Kw3KX-p#+>|J$W|OPBa6VAEjbhZ{A0@9x##-?8Go8y_QH zoMqJo+~u0|-+%Yi@_PXK2aZ~XDZ#=}I*T$29itv*>r)Bf`-aVP-aGU69->Nk@7@wD zCm-3T=q&DS$bSHYd>(Bp9MEM_^@p*>qgDrjvi_YAYf3WFs*0N`{TGgNP z0_bN5vnE)HApA|Eg)PGNjk2hxrN_{nOQ3ryV>m6}H8aTS+3ZbL+NMiU-%mOHgt`ji!CDXMPJXqU;9hYO;dw zk$tN25e_Q404Bl&TA)tDlvw^jCMi~~D#5~!R`H(u2 zlmPsT@Iar6Py9)irqQ1ObdaY72Qq}SE%j)qazT%aGT^&Oe&~qQgdr`ZfTjX8GJ&-=B2ZZsS4H%C}|b;N1mMEaJRLg#Fa$r>~w@tOuIES z7fJzk*h-+XP?fZi5)J4L^dTlh!xl}1h4Y9aGv!4! zFOoi*Hg<~{F+M2NfMNkxY zV$9;K&VT5JEE|vFAh^zRwAW*TbN3>-nCGXfXk3|@pEpdbNZ z@EG!vBl3BwW-^K(8C28-!hcy9zAlNPuFqx}(ghr+J*T||@PG#UT}_ZX(5HR`Hubtj zYY>9L;Rhe=t@eA)SHr3dygdzzy6%&$HoD1=aDal)>A=0YXS0o4qvC;Cc@QlE;AmL{ zud{vQ2LwsfcJ|zdMa71F ztXZ=#M{e-Q4Ia6{BR6>HZt&?DD&hM8T+h@S(0D4QPBRMoi97W?9&7H?Th{Ai#4I$1 zt$J-A222Jz4%c0FBq!|BaZiRD|FnRqp>#Tpb^zP7YZMHCEX8~dzZ=_zMHBM|-d8jQ z4^zcgORNX^<03_{Ys1e7dPWd@^Ax%`m~cZEsjg)3wL~~6`xRXohVt@t5kZG%Wf>lK zzj->QDS14hIs^SaZf`X^Fso5f<7l$6?V}d6!}!#>akg=UDV!61*y_L%xFd{HbAki} z7C}a5Fb&j&UfZ-UFGfXhkKhGomT8&~q5^=&UYp=o8YqPp>w=~Vz#ue%iDa3LpbOK2 ztO>pmbOFc62v$=-=1yqbMY8BpusVbbSz9PHd=(cUQ?wpn8gm9z7XIbfjAac2|6!lH_zzqn+a3utzRy!0 z|MAfuLliMwslw!h_0zuxzDM-mj88-Q=kz!CjKy;bUS?NXA7ichuWfbl-`?)t?kN7d z8J|$&zfPld#(a0g5?f=5Zj#usGqKgFh6;@NV!$_+NRsa4&SVmvYZUYCm(%J)GGhEw zBO^+VYNQYL-YTAzyH@p-bsp@VF=AoD8wkdk8&gL3N4*Y@kH&WF*!H4zsBZZ6Rga>! z%AMY{VzNpVcviueje>!b5_3GY%6UCoC{PD@_qO2omV6Yj3(V$pwz0PZFTAs`d=?;|3>~ zom4y-4?UsIM@%3wjrE+9p>tV-!t^T-<;Yvu*T@l~TOcfYyhNP?}FKeWM z#rYfKSmLhwk1W+yUT}v3?`CGFJWoi2L@2Vr3iSTT3iMpUC%|y|htP$)G!HsM9}(bC zrYSKkV7X1|e_@zBwJu`tEX$dai4xT`YEPuKaCuOOe^qG-NItNI#icLSD=*=|>qv~B zNt;hl*l=^Yg}kD6u>wbgA}_F=h&N`iIcIIP9K`ePDD42rMuK=F zzj3^=x{cp#SiB`0Y}?nUU?a^6Hr$|CWgEO;W99#-XL0n@YCKVgkRg{@EGE|Lq*Zv= zVMQ_^X!d~ivp&v7-2TZBYwV3tzie$Ft4-SW+~Xkupb1sheHW2f-~`B=qae}>U#|Ew zzr`e>kx*;a4bBC?bq0b8kT;v(`RZcUNVcnf4)N#wq#tWy@o z7afL~o-U9kkZX42F5b20R_Zs^DYdf2GPSH0O1X$hwpXk}zz18dg?}lsJ zBLDwpe4ZiWqpu8+!J+YivEf69hmQ=A!^4M1hVV?b0VOxfQc%fr1J9G!hx*6J;r&D8 zQ2)Sz{(VEwj+24WL$8kw@7sTv>>nK&92#r=P&lhk_laMT8XteDi$TNQVdpb!)(m9WBOMtU8y_A$*w$zUP9pZoXl$?_5V-S|;TPT* zJvbB`&Di_u$Ot*u52W&;A}D|{(tmK@t2oKNk&)e!xbeuu!2bTR@u9*`|M%AC|7`C~M(_XLl+QE%W1kt_(fS_4G=4$eTst7}aA@dm z%dDY_ahXoiw36RF1uLQyhaJ-v(ieQ=rP?{s=7oY1Y;$E zHXKnB?6aiUUPaAnI|-3mLaJy6ZXl-;#-4yOQL0za#iH@vpm*N%BXMAUoOb zmv(jAxB7PV;8*rUqA!^sfBrLn1llB?hi8)TO!xDDXulCu`J{5C@@wT<^&R+ov$9k@ zLn^l`w+MW{QY}=A)nk=gm7goWRIZWA_t4}g_<0rn`vKeBh6`|~TC7~z$YI!#UDbBG zYD?uTkQ0erJplwQR0~LOKMyQ5%>&S|TB`hr*Gc7S^%U|{9P%Q;v z&Q*bg<2A(^m9J4a3C#CagBPOTSGn^HUG35aK z1*-{T0gmQdjJr_Wt&0JAg$v=2R@V zd>_MEprnE>cpD|RS_m(9t4Y^K<;$7^o8JKAwcTq{Im>WbQ+>BvomP0sR;~D7fE=Ky zELb)=mGDxpTKDFJMi&BN@^1A5OOQj#b!x&(Dn{NxM|5Yt^t|zH- z7E}`ei!`t&z!ql2F>a1-u^o_`FqI`(+*hNTj}Gm&{#Wt;fHk^zcw}fi4mjDM7ibOt z58m|GfAwsS{6CxW`462*-W2RS&=OZCQ#-o5fhqozG?cgw;M(XD)~BKTPpX^b|4k;h z*UA6(?Y+_a|2E}Q=l^xY{>@}O5l`U1t+DP{@=eAOL|2$YcCQ3FLDtEunnp#5`A~b} zb=OIsc2pE|JCeIGBQHLwzEo@3n!gp`fTx+awY%Nk*6mn`n(QITN8T2SDuc_(aQ;4CD@_9jo?TPmwVnA@J-RBSo`CPZglMPQP zW-vE6qyDfmoH8NxGIsJ#Y10oaS{`63AB+Y$%4s|=GpTsmtT6;MJQ^hancVD zTa|DyCAddfPuBc33m}j>u!V0t^V zeH0^4t-@o9xv8Z56$4UbrE$=SW{7!AB>wwXJOBPwGnC$B2jD>^8-!Q@_euBgjrgVv ztZC@LacST{%%~P8C(9RcMP@~pLbiNCS7`v(QzqfUjA9^TrCG{2!cr?LVelbb$d?;_ z58?*AZm+B%O+KQx-Me|q^T69FL5EICES^$%OdNsS=T ziArJD0gFqDs*l@Qiv#E!;lNo7KcIq%Ev}2ufh731E>tGY>J8|qot0Uu=Tl_4e38Oj zpgTMcPqu6Nur<{@K)Hdn-$BLZfjvCR60%qrXEBar6NA@LF6qOnX-; z8sHz?MC|6VvV*pw1+Gij0s;#?&Y&fVaKis3s~>0cclzew7~2svTU0kUOfw@w;UdA_ znK6WgE0U_#3e1oc1`SQH2P1Kp?4sHV2nNoQLN|*#_$TXedU+!s(tR{tJjlj33j?)D zu=fI;g3ll`Xu1J>Rj|Do&6`Q-d2&~<`=2+nMKNZ!JiTi@(v6MGPQybEP z!A%}jskH2QZX1@wYPm^^cQ_X~Iyf8C=%YcO;z_-uwItw22sW>Gbon_yx;&iNH9WLJ zbh$lzG>b2X2tS4=mEB3dFd}UI?#7dQtc;;|#k&|T{uYY;;h_DP?*@$d9%^1bVHHxt zfVv6dNZ4M5@hlZF<0|BYfGrLTO;uGe0$`Te&QaqD;6R4LtU}Dm)Qs zDHyLy)7>C3!3_QZF2k?PuqQ&d!$HXZi4Pnfig9fHWe0HsH{dCtXVI&G(RXTK@!{~MY?uD)9z#YWA*gx;uBm1j8BW#k zA~L2{6|c_VQ5wTAH8S@`fY}#b@r5+V(?Un-vc@=bofLs{8<+MgETDVYmp-dYA0!ho ztyu^LMrifkjydlES>bXSpfy+ozHtQsVq0LX3RkU3;y)mpKpf$)HR1&KaaD~sD7zC^ z%)O9>xqeqm|6h~c%KsW39**~a*s){#NZ3TT-;>JWC7~{Bmq1EelYrbTR?MR-$ANwE_F@4+5j^JEq017 zs!=HR9*j@TtCJJVc1;s~Ms*8aSWk})m~8XYJ`m3UT>FKg%grm^J9j0vtq>G>RoE8%U1YCd9Cs`S|K@|P587nYXvp)E zx|WG1+G+UJdgj?Zo<<361sk4POGM?B;5RVx!Ikl5b8bAu(JNgbg75Z%cI0u)Nn1LEe{!LQDZerz3Ru7x*JtyeMd7uw!6M&>w}pn;qisDSW^uE%X&ge|Z#nb$o?^G4A!uwM(l zp0*_J=_t6wueg;v*p%Q=VlRg+r)WEreh`dGRQMB^)~ zgRg$#P%;BktpeeI$1;DYa0H_qVAYAa5 zg6z(9mIdhp#`&xRTXo`zYm`Aas44qEre>O%Qf$&H@SK~)<`{>qoSP!iYX%C|pVQQn zZVJeuL^jMV$>vOf!893&YrwUdL(k)$Ng+cOKmq~}0Fni>K)$Ow_%OH{79NA2yxHG* zEPg$%mhu0T-nIO{;T@xm@&9f8_C=m~jb5%)jn2zs>yr1k)*4Dr)x^03Y)17{n-Uf`M?iD(V(3wu6)*r2tS27zM00%H^ zx_DmIWC!v6KBg1{IB25>4!T2Q>-;JxE|M&aN|9iw5d_C9m zWOQKYIZO#0-tp|v&Q=kb7s2$-3HDbGXwlizD$p|U^5JLL7-$%DChM`8!EB*vbmnDV zfQLi%__F>Nzu%}#=$UHyMz#E9b?RJoYN}fPwmS7wwfsZ1bnX7t+2w1WRZCx2OVicT zTh-F#er#p~#%3OZ(pRdb>(%3>d)F%W&c1#B_=)ASXR4*Ecz^lF>eO|-f9hShzgoIo zEq@R^^+~n#bG7to^>`U(TR!>u-G6@J|5W~9`P%8FxwrAx@+smZ9KSmCadm2@TE1K@ z--LUXZr!eyE&_Xn*HedT>N5pr4d*b+3TS6I>-*(>>F5q}Jc zJaw5Mz6o6L#K&)BKMYomA(K9-@WpW>hTlR(pPmppMLl5`R|ZH zj+bznfJtr>hX8wA!Eb1h~l@;EYDqT6VZ<~ zLeqf9(@Q@bzyHp6f#y12Eq~a%5t;ylO2vH9xR~D*LIV*|ErX7G8&QNleSXfFtt+QjWW8I)Au5)yRv+8 z=HB10Dg%uv&GkK@$oo+F!h2L6uXKCp`4CS&^)nV%mjyY;uy4`o-gfa=0Z)p4(;`QjSWR{~u!S6q(pH2oF@)O_SReWDM z9RTUu?Mt`*dH2%n(hsxBtq5pv@5X%1fe4QpAMbd1Y5rrxi<&M5`nB5bzx(c~<@W&e zb9E^PO9E$O>I2-PFff|;_$@&I;2*&m0(%o;% zfl_TIxI0sAu-V>TK6{SX_3Nmg*x*i=PW|^<%Mo^nARR7U*uOe(weJ5Ty4L@Fw6Xtt zzyD8{t_@iOVB5gZPBuKeYiQ@QL&L2C{`+LkVtZ_!^``BjU}Jj9-7Rur@Th3sZAX}< zkg*B?N7a|>+-s+?n~nmjMLV7SFCFZSRyv`yq6t_OC@*=ins4Zxe>$O&5gYO~Wq4Ob<-a z%yK5V!6i3gGqEGy^h8QG41u|h+<=j&Ah}3!jw5DL-ZW-p=5pXL!Zymotvm!uFuxQ< z7k{y&h3O-h%-$Yu$AykS)~3vICkNn1SH-s|(BKD0=#G`cqe!?ATh9?jy_*67g{Mpt z9tv7>fYmhMx7wp2IKU14w`vbxk`Cvy#JW&nE6#fHb@@B#Q#Q*vYl)&16 zO3q5Xg2O||}YAF!)01%7_ z9+iXp86Gldr=vP3;t_jJ@@j?nkKVQVpCgGxWB=zJ{rFE;uEze)QgwM|`(%N8-&zKH zTK&bJ`NO72PmX$0Y?%3VUR=VxX*ht61d?7?*{hXc@;#BH*2ynkeJ*aOoNb|4E5CTGjNY!>kQ2S zD+N?I$O4n(I!IZD!jtleEq3@2h!I$zM$O`|sQ?3;!G;esMlEq#6W$H#1nVa&*K?*- z@nSGYFm+l3u=OB!8jm}2Y*?k!SpJk4jsX3ZMZ?L$|7xxSrh^sEpl&mTdi5M?w(oDQ zC{Sw!>LjA6bpW1qpNkYYRG4`SEFEN$>f}{>LVzX6u#<@dWhHd=qmLE~si)|-&p;J6 zp##F>v%yFI_;hGqwTu;VtfgYst?I@`Y=Z&GWqc~#YD>T@j)#vXupbdNCZZNQFmuuX1H(qU!?f~AT%X^X76>7AFyUzY zNMnk@cv~VP)|V)ND~Tt}!Il%Y3Qd9Yh(%}hwCXcLW=*|2k>BN~rro0F2k;PRds!{r zZ4Z>RRf8buVu-pCSuNU-Jc)_yU}v>~23Bx&Y#qh(NjxCPjkIfqn+5rHDvak>C6K_9 z=t}@AAyA^BQ4p(j3L;C{hi=jj9AH^Dusm>BFnhZmUVnb2oz&qTHIJ!xkRh@h9I2>O zpuRzRTNLk&wm~(yvYL47`NlzyxPTt0aeF{*^Z<0J9ACe^P`}=7RL`R?8$(y9l~EQC z?lOsIrok1#)4BCFMq6rqj5O{m=P1K4Fj|V%Mtl3PPra;C217x&^TG+4T^LlBfH2S# zBNHJ)I(%pU2MU4xxXkH$ySeg5YPgYdzkXr7NQ ztIp&xXF+)a!T5pk<)cu=)`D8OV88f9uM%iM=j#2VLP<|98|$ z`|5Hn@-pX_8P({0KT7A?3!VLzYo`2&$xEh2j~EjU6@W^mz(QbS8hzevW2rg=Oo>5L zcLurpUu$X9&Ju&egNdQhpd!ggZ$zkf!k^&8J)0OBX%(Sv6FJSI)FGmc6~(~o2Y06} zD{ZLt$$HE8?u4cf8=#Ynf&G@9m%Er*ppWuTi9a&+=bwiD*cie-U}^g~zBilLml7Bz zObm`DM>cdUdvWfP%QD`-%nVC=Hv}`h??u=+=*O=6vFj%#c6~%F&fNwx+a`9`R$+Z6 z7w2w)bXlB#m!*X_hp5H@9A+%e&B7<|E0Yzy3oH*G9hS>1&dsRhEzVy-BYbi0B2KnA ze`=5|oL!usV)EAt-Z%e+U~gJjUChZWOyx<3rDLOq;DGzt!Z{d*`_TOIHBQq8;@L0r z-A>;=f><%rzkahg|G8i(??+f!7!|Alc)DWZg66Kc?1>LbA8Z>HnsfpNmHyT7UxTmV-Tiy!Gcj?E+^xCM-Xv; z__W~QxWNms;-a1YK>=z8e-)$qP*mxtCpcKxDvaf0^g88a#wH0&VKE;p=i z%=&-5ipETUXEwHm$4!Mb2CE78Z$3Qmz1E9uoD0$u=L?Y)^dr>u+SH446;nwlB6Wdf zxQLQFr{o)Gd)R7&jCjMp7i4E8diO?)MIRxP0fhMk$(2IJn*n8joS#Gqb6$&Rh9oEv zCS9~ReDebY)LaFg1%pJQeUVz6zs?Ml{VpjEHOs;|(nLA$mKu9;eg;0my_fLY$Vf_A zcozh1ssA`VAEZ8_tU! z$LC$Jfy@YVuh{GjM*D;${zV+%l7qIN(`J!y?J`~F~B0Gcgx~#L##cATS#l*x#za;^pV!{^}4ay)skW0wvyrPaP$E% zuUm9eRMtTUtEJfKr0af}j>lQ1BScs_Ll~tdk~e&O)yn6w-3=x^bL0SWz!3_h`)p#IvQ{j3416w`3WW$p*JFm5~CXWo;yl}I)ggx0{p8~>- zB}r#7k+Mhq=VAAUlUg=QT6e&tQlvPTjmW45%q2|H9bla=cR1YHPJc2GEHJS`Z45_G zY88zao2(TZkujhuaF2z}#(f~_)K}aYA|sd(#63&tG*{FIFqTZ@@i1%%6M&Aur0peB zN^Cg>thU!>`DILrDJ~gVbqjGMvJf4aB_`wXrghy2tRC<;gulsFWsP-@sqR7UK@0|4 zxh34|8#nD1V%HcZeXUTi^#ZS9vt4i>YyFKH?l7XZl&1q3uzMa9G3QJ6a38S{;H|LO zup(L#sU!Iy$Na8s>+M%+QeP}GgQM<)A2$8wcSq# zll_zafe7gEIeqpr*Q}()j&K_fpp0c5`lF$N_~=?P#d^T4-9C^QVM9Z^Mz*iu)~=3= zW}a=0j$>fcy@?0pcjGAm)51Km-%UTNgIFU*T1h%f7R#5`s2RIKM=|_Emhv$iF79U{ zbvF~~P&iROex5c=YDIq`8xPd7OmMI!Na@EA93Wc{&g=-27-yBkv(3)VZo#@hnEr2u z&dYigJpA&ee_FQT5O4@QYChiHfmt@l_IR_nmV%X1uU3&50bJ2pqUUMq$7$3-8XXAo zrhkwobdCm|la0rDW2b4lduBI!VmC%0LM~70nl5bq#HU9cs^OtE5{NZw2X^TNri}4l z{k*O~M$o}~j~v&H?wb8*dQYY+W>NgKcvW z49TI)m=aZzvSXv@f4SHXi~FHiEEf9<{Kxj3nc+*KElQ?kC!Ika62*DXne#q}2F%?A zu>L8jMy7C=kO%S4Ww6@u96UHXew6tM3eJ}E##O_7kCF}>`luXolUuLL{&(Syy!$tW z7w)d(zE>u`I?aN4Oz`(K@uP(qxk1<-EI?`J_1}m3Ay>uCT zGFSfTD@A+yFAwYySjm@m6-ga0W;8ux2Ffe}SmSNv5rMglno&>799@Wxgh>2@FvK7Vr%fLM^7nD0XL467etxi zc3t4=7K;nD(}r}4!2`~T<(EOb80aaeb}C~4n6pUZ=NQ~SVA?}~uPf~BJemh=zpl_Q zot-q`4yW`ALvSaHecPYB0Hm;t&fw-|%On=%t;nJL_D{odeUzv-bCg?ejvi!R;^x@V zOhr-t10Y}qG<+d_5$*BYhhI+sQ&<9@gKrWt*+Nz{0_wx?SNC%*>XDa)g29i6V@ z#I||gf22TU`hzMJaP92gBF_YBp&CCL5hj=oZVq$`eRe_C)=vQr*~7d7cvzslWC1@fFW9=4i}G82Res~k(udiyXl*O&<&Vit zbcNbIV2fOml4x01>{rn@lCl9UV-gnJ9&c_+um4*N12?peeJes5!DKl{N;yE{_MC71 zGRgrXr>i-q9-(6>ye8ga7-+>A^yVYklV9ksy*P&c+HV}gUwiWm{dL_n^b>TgeIU=; zzeY5J*15#yqCCeJ0Eg@>FYC*7K>?JNS_o4Hoys!+?kYs0=!}u^utp|KAD|horRBV& zm=z?%gC?xh-U|*yb2HBCUfsxnS9M@#VhTtl3X1WC{xe-P0iBd^yU}vwXRBX>|$&U)!9Hf#X+zp%DQ=5x(wR z;YR99pkzgP$uUX!yu|9|EE$_evx-jO6;gVRY$M9G1rdV`ipbO+4gNnC%XyuhGcP=aXU$l^ed#~RG)Kw&yG zO&zM*iLMAAtJt2<%qsX920_y~-h}uKHHz6VPW-b$ zt!S=otG22REj^?|)qtMdiDL~(;H!Z{9M3ZR!Dj>JJ2ZiIZs-I}~p=KSL_Q*A?iR-|ORLj(h z8GSbJv(DWHrbBd1H62QIgXo6lTbAmou1f=3pG-p0tvS@K6K!&+>xZT@awfK|X+I5I z!*r@%7x}xdzwg}f#8Qn=ca4y^x;asary6dk`nDZ)zv|V-Ro0zD%N*&Js+&6YY8zFrwEH55R5L<4F?`+h2yqR^b3NB2 zfuWiv4aqi(Jnw#@oJrvMuBEA-sZ%oubx+d*LTzGA45FI;7QKFVeDZHEUmd+3Me~lk z>v>k-=%MY9z}6;4Kuj2fqx!lw&uj1sE+2l zj=M##b>o!0WAB>kdcI@%6FTvI(+mR53j){FoWQmm%iIc-I?vgpeh}!;iA{8Bd#X?L za5Ay2FmQa+@$K$6;b((%*|}TIAh?l+@0z*`mk+?K=j(*}-h_ssuWxf*u~;zOy45w0 zdWPzIx((aw>!Ak6+Xcv_s&9FdKy(X#>=PB%*g90zk?J_AhGT|vVOHG+wEHbdCzFX2 zS|lL0raN$k4V~zA;Oi69c1>f8t$j~A_v(h)#D)d6eAr&ycMV;4CeDPNGnBq_1x?8&=yF-zwY8nkZ3wn19+j8ANQzv!^s~$SK?vpL<$W{7}TNw3B zV{D-Rpy;dgpC#k}?59j56ZeNM75p=lb}xNwu>aKoH?6?GZc6yyPx&)un#z~cbvt0?ml(zms6qjBX+pM8zlw_0xQdvz9moh(zI)?Xgd zMZBc}DZ}oXrU2okXqQZoVtSlF$=jGf- zd+r&NT%Vx+Bbxj1GT?bP8?69LS87pT97%jil-Eo{g2p7{QtG`#t1JNAG-Jx-TEETr znB9HNWD*-?7eh8;_F1S^4x$ubExuIZWXi{tC-s?-Ffa5-sIO&a^?cH$3it=;G&^if z3Q^Apfy$sM^H<<=;u; zU$1{(%T-&Zs_n(^wPmrlv3&cE#N<3BL;Q($JqLXauEzwm=ni{Il;sRtsZXi!h^-EL zbFW!;;5%ihZJFeq9b*OVSe?w8i|HNn)NUAhKe=kVPhtl{u9g{eb(9rHKNG{6XK`K`{!@6*R#{@p_gJKdd2)`nVfosY?Gm4% zWi9O5T0AR3x^G-)H&M;YIwixD=>mBdB+3eXQX@-Bs)Umz%vzfLdU2Y}O5~4~GKRZ6 zD%uW4?UT9-Tsphi$MSV9z~BMz{X30+(a-pIKU9<2p(=Qwz7KA_kJrpm6QEv+MQ;oz zGUui`ZGHgU8_c-vx?Opy`Y*mA{Cs`3onMtK{mf6RBHvvU$*1H^)N^FvUX%HG)euOgzQ#Zi+7z zi1<>tQT6arf(ffeSIPex5vCqmWco>!O8(C@>G#sd2Km43IIHpsvVJGTMpxkXi;DS4CQxRBIx@cjV{oT?7;8$KU<|)g2 zRu|wHm>?=+kvWFY4?`jKA=d(4d~^Me3{Jy~>;Ik6E0$j3`uDl=C13=Sj;3&dU)AL3 zA~wkhipw#NG0hH?EP{I;??%8P3Yx7meR`sNcYL7CV1n>8hN~ISg@SG$@P)Ne1|}&3 z0E%EBRZJ4j&&4p=jQTzdn-;N20=z*Lw9RF0i7pX)1A2Lnv`K>h`^y{r7UUxQCa)0zSFWJ;A_E)}QU0S?mIQZ? z@8403DEbn^o38c-U!Swvtllr5#w}4yGJaUc{KfUv21cG_t6kA~=XP2BV)U zFlhtrwDXTgD_2roadR^J*qr|Layw4qZmO`}@^il;S$+5!XP|`k?q0|H@n!1f#4U?z z-&nGmrtm#V8p{~F7)-I!5+0OlLLc=JA}D$D+zZQzSI#) z9pNXXBfK?$Pe*lO5qP6g8?rDNf)yx&iu9IhRkYVn#?>OA%bHTEEsT)VpFV{C^wnC< zrOg5y%)b*S3dXCxMAa$kPzwzp48e=3Pm%dR1u8P!mmBHbwX{6(x(c-z9UyVwE2AmU z25h;MY*|aw!>FX1B30-idF4XETc1m}L_Mt<|Hm8n>ImwTtFWNyEUE>%AsBim1A-Lz zbH-!GG;8X9<4XBkjxa%{zKDyJGC_NhV~BD8H)j`m%+ao1!z&S<8w7RE7&il6$q-Gw zhG=?CW1$PR9Hw{@;@N|9uph|3l{g_ygzv z*t^PF<^tJsE|9*p+aFy%5UKB$`tCmT-S?h;;-&%06cjQA#lBNe+)?3w&-n>%8r>g0 z6~#^J_K!Oq#TK*rgi=!MV0iF&(o*bXh46<>O(AU!J|$a&{ojT?TN~^)0cmd_?G2>8 z!IoJ=f9p4G=x@8_4VC5tkHdVRuY97sHJ$<0OUBcqx;0N5)4Gm5%LZn3~fMQpw~%mcXQlSaH@Q_Rf?xtY2uS)G7kLd-3Mo>!a^~Jo^6K_s7R4tPB41<+tCw`r-Kze+;C7 zM?9GIG~w8r&14g}5ybS?YWk~F^$N4Gj(iDb{tuRu6 z8R!5)3n;Am0F7mYel%eAH0Ds#hN>fjLhV?@{l6kYTAVJj%M1<9Mk$>EQo2(goASSC zj=ggKJBH=R`+py$G6}5FW!3hNIVCxQC!;yN7;JhyWB1i~<9m6M#MxLv?Sq%n;&!&^ zJ?~Rdw$J~BpC$b7qgWCK|Ino!|1%Ympd0Vr$42~bS_uETYFmb88UX*cZc6`;y%cl= zNEfrAw~XRo%*8CQ^FCsHl^^cIE#L^Jqp#SJB2U%4!&@0jlI5^3GKjl%z$yXUqI_ ztI8Q_W|O%XuK1RXW|!G7@d*BQZYZZ&p53e$S$+LO7I%3$Tm<3x^N|mHSm&2d^I7+o zyR8*_8SzKgcf(|!cYZlv=1CfnP79Keb288M@oVva=VdP{{&@8L>zBvhZm97-8waqC z@rOL66zT``!zjZCTh&{n$-9sew6e-ZTi5Ok3e9R@*kQm~ggZ0TcCM-KT+`UOrn!C14i`nU!VZT>#G;`u-fUHk9lS-7MQFRS{mig> z2aE}oKFs2D;s1L!Wzl4kEsmVH(fY#w?erhTBuAVH+=u;#xhns4r2c157Qofd310%et>VHsXJ0mH*e_nS}p+6yZwu zl`%*bdG=KxzR$>f8q=?`@!Kyjn({x7#|O)`pGK)a{tf;rZwDewbQX^0G_PMJ+?nv_ zHy3|H-16jSZRq~(?dWG!H|+_2NPTtaj)s5x;_2HFY{c8q^hyz7z>EK(xr<>&Fml5c z9l}c +Homepage: http://www.stylite.de/EPL +Standards-Version: 3.8.0 +Build-Depends: debhelper (>= 5), po-debconf +Debtransform-Tar: egroupware-epl-9.2.20100112.tar.gz +Debtransform-Files-Tar: debian.tar.gz diff --git a/doc/rpm-build/egroupware-epl.spec b/doc/rpm-build/egroupware-epl.spec new file mode 100644 index 0000000000..91e2ad12aa --- /dev/null +++ b/doc/rpm-build/egroupware-epl.spec @@ -0,0 +1,713 @@ +Name: egroupware-epl +Version: 9.2.20100504 +Release: +Summary: EGroupware is a web-based groupware suite written in php. +Group: Web/Database +License: GPLv2 with exception of stylite module, which is proprietary +URL: http://www.stylite.de/EPL +Vendor: Stylite GmbH, http://www.stylite.de/ +Packager: Ralf Becker +Prefix: /usr/share +%define egwdir %{prefix}/egroupware +%define egwdatadir /var/lib/egroupware +%define egw_packagename eGroupware + +%if 0%{?suse_version} + %define php php5 + %define httpdconfd /etc/apache2/conf.d + %define distribution SUSE Linux %{?suse_version} + %define extra_requires apache2 apache2-mod_php5 php_any_db php5-dom php5-bz2 php5-openssl php5-zip php5-ctype php5-sqlite + %define cron cron + %define apache_user wwwrun + %define apache_group www + %define pear_dir \\/usr\\/share\\/php5\\/PEAR +%else + %define php php + %define httpdconfd /etc/httpd/conf.d + %define cron crontabs + %define apache_user apache + %define apache_group apache + %define pear_dir \\/usr\\/share\\/pear +%endif +%define install_log /root/%{name}-install.log +%define post_install /usr/bin/%{php} %{egwdir}/doc/rpm-build/post_install.php --source_dir %{egwdir} --data_dir %{egwdatadir} +%if 0%{?fedora_version} + %define osversion %{?fedora_version} + %define distribution Fedora Core %{?fedora_version} + %define extra_requires httpd php-mysql php-xml +%endif +%if 0%{?mandriva_version} + %define osversion %{?mandriva_version} + %define distribution Mandriva %{?mandriva_version} + %define extra_requires apache php-mysql php-dom php-pdo_mysql php-pdo_sqlite +# try to keep build from searching (for wrong) dependencys + %undefine __find_provides + %undefine __find_requires +%endif +%if 0%{?rhel_version} + %define osversion %{?rhel_version} + %define distribution Red Hat %{?rhel_version} + %define extra_requires httpd php-mysql php-xml +%endif +%if 0%{?centos_version} + %define osversion %{?centos_version} + %define distribution CentOS %{?centos_version} + %define extra_requires httpd php-mysql php-xml +%endif + +Distribution: %{distribution} + +Source0: %{name}-%{version}.tar.gz +Source1: %{name}-egw-pear-%{version}.tar.bz2 +Source2: %{name}-stylite-%{version}.tar.bz2 +Source3: %{name}-eventmgr-%{version}.tar.bz2 +Source4: %{name}-phpfreechat-%{version}.tar.bz2 +Source5: phpfreechat_data_public.tar.gz +Source6: debian.changes +Source7: %{name}-rpmlintrc +Patch0: class.uiasyncservice.inc.php.patch +Patch1: stylite-postfix-suse.patch +#Patch2: mandriva_upload_tmp_dir.patch +BuildRoot: %{_tmppath}/%{name}-9.2-buildroot + +#otherwise build fails because of jar files in G2 +BuildRequires: unzip sed + +Buildarch: noarch +AutoReqProv: no + +Requires: %{name}-core >= %{version} +Requires: %{name}-egw-pear >= %{version} +Requires: %{name}-stylite >= %{version} +#Requires: %{name}-addressbook >= %{version} +Requires: %{name}-bookmarks >= %{version} +Requires: %{name}-calendar >= %{version} +Requires: %{name}-developer_tools >= %{version} +Requires: %{name}-emailadmin >= %{version} +Requires: %{name}-felamimail >= %{version} +Requires: %{name}-filemanager >= %{version} +Requires: %{name}-infolog >= %{version} +Requires: %{name}-importexport >= %{version} +Requires: %{name}-manual >= %{version} +Requires: %{name}-news_admin >= %{version} +Requires: %{name}-notifications >= %{version} +Requires: %{name}-phpbrain >= %{version} +Requires: %{name}-phpsysinfo >= %{version} +Requires: %{name}-polls >= %{version} +Requires: %{name}-projectmanager >= %{version} +Requires: %{name}-registration >= %{version} +Requires: %{name}-resources >= %{version} +Requires: %{name}-sambaadmin >= %{version} +Requires: %{name}-sitemgr >= %{version} +Requires: %{name}-syncml >= %{version} +Requires: %{name}-timesheet >= %{version} +Requires: %{name}-tracker >= %{version} +Requires: %{name}-wiki >= %{version} +Obsoletes: %{egw_packagename} +Obsoletes: %{egw_packagename}-core +Obsoletes: %{egw_packagename}-egw-pear +Obsoletes: %{egw_packagename}-addressbook +Obsoletes: %{egw_packagename}-bookmarks +Obsoletes: %{egw_packagename}-calendar +Obsoletes: %{egw_packagename}-developer_tools +Obsoletes: %{egw_packagename}-emailadmin +Obsoletes: %{egw_packagename}-felamimail +Obsoletes: %{egw_packagename}-filemanager +Obsoletes: %{egw_packagename}-infolog +Obsoletes: %{egw_packagename}-importexport +Obsoletes: %{egw_packagename}-manual +Obsoletes: %{egw_packagename}-news_admin +Obsoletes: %{egw_packagename}-notifications +Obsoletes: %{egw_packagename}-phpbrain +Obsoletes: %{egw_packagename}-phpsysinfo +Obsoletes: %{egw_packagename}-polls +Obsoletes: %{egw_packagename}-projectmanager +Obsoletes: %{egw_packagename}-registration +Obsoletes: %{egw_packagename}-resources +Obsoletes: %{egw_packagename}-sambaadmin +Obsoletes: %{egw_packagename}-sitemgr +Obsoletes: %{egw_packagename}-syncml +Obsoletes: %{egw_packagename}-timesheet +Obsoletes: %{egw_packagename}-tracker +Obsoletes: %{egw_packagename}-wiki +%post +%if 0%{?rhel_version} || 0%{?fedora_version} || 0%{?centos_version} + chcon -R -u user_u -r object_r -t httpd_sys_content_t %{egwdatadir} + setsebool -P httpd_can_network_connect=1 +%endif +/bin/date >> %{install_log} +%{post_install} 2>&1 | tee -a %{install_log} +echo "EGroupware install log saved to %{install_log}" + +%description +EGroupware is a web-based groupware suite written in PHP. + +EGroupware EPL combines Stylite's actual EGroupware enhancements and the recent development of the EGroupware open source project in one software package. +- Brand new Stylite features, which are not available publicly in the community edition of EGroupware +- The latest possible state of open source community features. + +This package automatically requires the EGroupware default applications: + +egroupware core with: admin, api, docs, etemplate, prefereces and setup, +addressbook, bookmarks, calendar, translation-tools, emailadmin, felamimail, +filemanager, infolog, manual, news admin, knowledgebase, polls, +projectmanager, resources, sambaadmin, sitemgr, syncml, timesheet, tracker, wiki + +It also provides an API for developing additional applications. + +Further contributed applications are available as separate packages. + +%package core +Summary: The EGroupware core +Group: Web/Database +Requires: %{php} >= 5.2.1 +Requires: %{php}-mbstring %{php}-gd %{php}-mcrypt %{php}-pear %{php}-posix %{extra_requires} %{cron} zip +Provides: egw-core %{version} +Provides: egw-etemplate %{version} +Provides: egw-addressbook %{version} +Obsoletes: %{egw_packagename}-core +Obsoletes: %{egw_packagename}-addressbook +%description core +This package provides the EGroupware core applications +(API, admin, etemplate, preferences and setup) plus addressbook. + +%package egw-pear +Version: %{version} +Summary: The EGroupware egw-pear application +Group: Web/Database +Requires: %{php}-pear +AutoReqProv: no +Requires: egw-core >= %{version} +Provides: egw-pear %{version} +Obsoletes: %{egw_packagename}-egw-pear +%description egw-pear +egw-pear contains modified pear classes necessary for EGroupware + +# addressbook is part of core now, as it contains required classes for accounts +#%package addressbook +#Version: %{version} +#Summary: The EGroupware addressbook application +#Group: Web/Database +#AutoReqProv: no +#Requires: egw-core >= %{version} +#Obsoletes: %{egw_packagename}-addressbook +#%description addressbook +#Contact manager with Vcard support. +#Addressbook is the egroupware contact application. +#It has different backends to store and retrive contacts +#from SQL or LDAP. + +%package bookmarks +Version: %{version} +Summary: The EGroupware bookmarks application +Group: Web/Database +AutoReqProv: no +Requires: egw-core >= %{version} +Obsoletes: %{egw_packagename}-bookmarks +%description bookmarks +Manage your bookmarks with EGroupware. Has Netscape plugin. + +%package calendar +Version: %{version} +Summary: The EGroupware calendar application +Group: Web/Database +AutoReqProv: no +Requires: egw-core >= %{version} +Obsoletes: %{egw_packagename}-calendar +%description calendar +Powerful calendar with meeting request system, Alarms, ICal and E-Mail support, +and ACL security. + +%package developer_tools +Version: %{version} +Summary: The EGroupware developer_tools application +Group: Web/Database +AutoReqProv: no +Requires: egw-core >= %{version} +Obsoletes: %{egw_packagename}-developer_tools +%description developer_tools +The TranslationTools allow to create and extend translations-files for EGroupware. +They can search the sources for new / added phrases and show you the ones missing in your language. + +%package emailadmin +Version: %{version} +Summary: The EGroupware emailadmin application +Group: Web/Database +AutoReqProv: no +Requires: egw-core >= %{version} +Requires: %{php}-imap +Requires: %{name}-egw-pear >= %{version} +Obsoletes: %{egw_packagename}-emailadmin +%description emailadmin +EmailAdmin allow to maintain User email accounts + +%package felamimail +Version: %{version} +Summary: The EGroupware Webmail application +Group: Web/Database +AutoReqProv: no +Requires: egw-core >= %{version} +Requires: %{name}-emailadmin >= %{version} +Requires: %{name}-egw-pear >= %{version} +Requires: tnef +Obsoletes: %{egw_packagename}-felamimail +%description felamimail +The Email application for EGroupware. + +%package filemanager +Version: %{version} +Summary: The EGroupware filemanager application +Group: Web/Database +AutoReqProv: no +Requires: egw-core >= %{version} +Requires: %{name}-egw-pear >= %{version} +Obsoletes: %{egw_packagename}-filemanager +%description filemanager +This is the filemanager app for EGroupware. + +#%package gallery +#Version: %{version} +#Summary: The EGroupware gallery application +#Group: Web/Database +#AutoReqProv: no +#Requires: egw-core >= %{version} +#Obsoletes: %{egw_packagename}-gallery +#%description gallery +#An embedded Gallery2 for EGroupware. + +%package infolog +Version: %{version} +Summary: The EGroupware infolog application +Group: Web/Database +AutoReqProv: no +Requires: egw-core >= %{version} +Obsoletes: %{egw_packagename}-infolog +%description infolog +This is the infolog app for EGroupware (Notes, ToDo, Phonelogs, CRM). + +%package importexport +Version: %{version} +Summary: The EGroupware importexport application +Group: Web/Database +AutoReqProv: no +Requires: egw-core >= %{version} +Obsoletes: %{egw_packagename}-importexport +%description importexport +This is the importexport app for EGroupware. It includes a comandline client. + +%package manual +Version: %{version} +Summary: The EGroupware manual application +Group: Web/Database +AutoReqProv: no +Requires: egw-core >= %{version} +Requires: %{name}-wiki >= %{version} +Obsoletes: %{egw_packagename}-manual +%description manual +This is the manual app for EGroupware: online help system. + +#%package mydms +#Version: %{version} +#Summary: The EGroupware mydms application +#Group: Web/Database +#AutoReqProv: no +#Requires: egw-core >= %{version} +#Requires: %{name}-egw-pear >= %{version} +#Provides: %{egw_packagename}-mydms +#Obsoletes: %{egw_packagename}-mydms +#%description mydms +#This is a mydms port to EGroupware. + +%package news_admin +Version: %{version} +Summary: The EGroupware news_admin application +Group: Web/Database +AutoReqProv: no +Requires: egw-core >= %{version} +Obsoletes: %{egw_packagename}-news_admin +%description news_admin +This is the news_admin app for EGroupware. + +%package notifications +Version: %{version} +Summary: The EGroupware notifications application +Group: Web/Database +AutoReqProv: no +Requires: egw-core >= %{version} +Obsoletes: %{egw_packagename}-notifications +%description notifications +This is the notifications app for EGroupware. + +%package phpbrain +Version: %{version} +Summary: The EGroupware phpbrain application +Group: Web/Database +AutoReqProv: no +Requires: egw-core >= %{version} +Obsoletes: %{egw_packagename}-phpbrain +%description phpbrain +This is a knowledgebase for EGroupware. + +%package phpfreechat +Version: %{version} +Summary: The EGroupware chat application +Group: Web/Database +AutoReqProv: no +Requires: egw-core >= %{version} +Obsoletes: %{egw_packagename}-phpfreechat +%description phpfreechat +Chat with other EGroupware users. A port of phpFreeChat for EGroupware. + +%package phpsysinfo +Version: %{version} +Summary: The EGroupware phpsysinfo application +Group: Web/Database +AutoReqProv: no +Requires: egw-core >= %{version} +Obsoletes: %{egw_packagename}-phpsysinfo +%description phpsysinfo +This is the phpsysinfo app for EGroupware. + +%package polls +Version: %{version} +Summary: The EGroupware polls application +Group: Web/Database +AutoReqProv: no +Requires: egw-core >= %{version} +Obsoletes: %{egw_packagename}-polls +%description polls +This is the polls app for EGroupware. + +%package projectmanager +Version: %{version} +Summary: The EGroupware projectmanager application +Group: Web/Database +AutoReqProv: no +Requires: egw-core >= %{version}, +Requires: jpgraph-epl +Obsoletes: %{egw_packagename}-projectmanager +%description projectmanager +The projectmanager is EGroupware's new project management application. +It's fully integrated into EGroupware and use the data of InfoLog and Calendar. +Plugable datasources allow to support and manage further applications. + +%package registration +Version: %{version} +Summary: The EGroupware registration application +Group: Web/Database +AutoReqProv: no +Requires: egw-core >= %{version} +Obsoletes: %{egw_packagename}-registration +%description registration +This is the registration app for EGroupware. + +%package resources +Version: %{version} +Summary: The EGroupware resources application +Group: Web/Database +AutoReqProv: no +Requires: egw-core >= %{version} +Obsoletes: %{egw_packagename}-resources +%description resources +resources is a resource booking sysmtem for EGroupware. +Which integrates into the calendar. + +%package sambaadmin +Version: %{version} +Summary: The EGroupware sambaadmin application +Group: Web/Database +AutoReqProv: no +Requires: egw-core >= %{version} +Obsoletes: %{egw_packagename}-sambaadmin +%description sambaadmin +Manage LDAP based sambaacounts and workstations. + +%package sitemgr +Version: %{version} +Summary: The EGroupware Sitemanager CMS application +Group: Web/Database +AutoReqProv: no +Requires: egw-core >= %{version} +Obsoletes: %{egw_packagename}-sitemgr +%description sitemgr +This is the Sitemanager CMS app for EGroupware. + +%package stylite +Version: %{version} +Summary: Stylite EPL enhancements +License: proprietary, see http://www.stylite.de/EPL +Group: Web/Database +AutoReqProv: no +Requires: egw-core >= %{version} +%description stylite +The package contains Stylite proprietary EPL enhancements: +- stylite.links stream wrapper allows browsing of app directories +- filemanger favorites + +%package syncml +Version: %{version} +Summary: The EGroupware syncml application +Group: Web/Database +AutoReqProv: no +Requires: egw-core >= %{version} +Requires: %{name}-egw-pear >= %{version} +Obsoletes: %{egw_packagename}-syncml +%description syncml +This is the syncml app for EGroupware. + +%package timesheet +Version: %{version} +Summary: The EGroupware timesheet application +Group: Web/Database +AutoReqProv: no +Requires: egw-core >= %{version} +Obsoletes: %{egw_packagename}-timesheet +%description timesheet +Simple timesheet application, which allow to record and report +the times and other expenses. It can be uses as well standalone +as together with the ProjectManager application. + +%package tracker +Version: %{version} +Summary: The EGroupware trouble ticket system application +Group: Web/Database +AutoReqProv: no +Requires: egw-core >= %{version} +Obsoletes: %{egw_packagename}-tracker +%description tracker +This is the trouble ticket system app for EGroupware. + +%package wiki +Version: %{version} +Summary: The EGroupware wiki application +Group: Web/Database +AutoReqProv: no +Requires: egw-core >= %{version}, +Obsoletes: %{egw_packagename}-wiki +%description wiki +This is the wiki app for EGroupware. + +%package eventmgr +Version: %{version} +Summary: Stylite EventMgr for Thomson-Reuters +License: proprietary +Group: Web/Database +AutoReqProv: no +Requires: egw-core >= %{version} +%description eventmgr +The package contains Stylite's EventMgr (Production Schedule) +for Thomson-Reuters. + +%prep +%setup0 -c -n %{egwdirname} +%setup1 -T -D -a 1 -n %{egwdirname} +%setup2 -T -D -a 2 -n %{egwdirname} +%setup3 -T -D -a 3 -n %{egwdirname} +%setup4 -T -D -a 4 -n %{egwdirname} +%setup5 -T -D -a 5 -n %{egwdirname} +%patch0 -p 0 +%patch1 -p 0 +#%patch2 -p 0 + +%build + +%install +[ "%{buildroot}" != "/" ] && rm -rf %{buildroot} +mkdir -p $RPM_BUILD_ROOT%{egwdir} +mkdir -p $RPM_BUILD_ROOT%{httpdconfd} +sed 's/\/usr\/share\/pear/%{pear_dir}/' egroupware/doc/rpm-build/apache.conf > $RPM_BUILD_ROOT%{httpdconfd}/egroupware.conf +mkdir -p $RPM_BUILD_ROOT/etc/cron.d +sed 's/apache/%{apache_user}/' egroupware/doc/rpm-build/egroupware.cron > $RPM_BUILD_ROOT/etc/cron.d/egroupware +mkdir -p $RPM_BUILD_ROOT%{egwdatadir}/default/files +mkdir -p $RPM_BUILD_ROOT%{egwdatadir}/default/backup +cp egroupware/doc/rpm-build/header.inc.php $RPM_BUILD_ROOT%{egwdatadir} +cp -aRf egroupware/* $RPM_BUILD_ROOT%{egwdir} +cd %{buildroot}%{egwdir} +ln -s ../../..%{egwdatadir}/header.inc.php +# create symlink for suse to get scripts with /usr/bin/php working +%if 0%{?suse_version} + #/usr/sbin/update-alternatives --install /usr/bin/php php /usr/bin/php5 99 + mkdir %{buildroot}/usr/bin + cd %{buildroot}/usr/bin + ln -s php5 php +%endif +# copy current changelog to doc/rpm-build +install -m 444 %{SOURCE6} $RPM_BUILD_ROOT%{egwdir}/doc/rpm-build + +%clean +[ "%{buildroot}" != "/" ] && rm -rf %{buildroot} + +# egroupware metapackage seems to need some files to be build ... +%files +%defattr(-,root,root) +%dir %{egwdir} +%dir %attr(0700,%{apache_user},%{apache_group}) %{egwdatadir} + +%files core +%defattr(-,root,root) +%dir %{egwdir} +%{egwdir}/about.php +%{egwdir}/anon_wrapper.php +%{egwdir}/header.inc.php +%{egwdir}/header.inc.php.template +%{egwdir}/index.php +%{egwdir}/login.php +%{egwdir}/logout.php +%{egwdir}/notify.php +%{egwdir}/notify_simple.php +%{egwdir}/notifyxml.php +%{egwdir}/redirect.php +%{egwdir}/rpc.php +%{egwdir}/set_box.php +%{egwdir}/soap.php +%{egwdir}/svn-helper.php +%{egwdir}/xajax.php +%{egwdir}/xmlrpc.php +%{egwdir}/groupdav.php +%{egwdir}/webdav.php +%{egwdir}/addressbook +%{egwdir}/admin +%{egwdir}/doc +%{egwdir}/etemplate +%{egwdir}/home +%{egwdir}/phpgwapi +%{egwdir}/preferences +%{egwdir}/setup +%attr(0644,root,root) /etc/cron.d/egroupware +%config(noreplace) %attr(0644,root,root) %{httpdconfd}/egroupware.conf +%if 0%{?suse_version} + %dir %attr(0755,root,root) /etc/apache2 + %dir %attr(0755,root,root) %{httpdconfd} + # symlink for suse to get scripts with /usr/bin/php working + /usr/bin/php +%endif +%dir %attr(0700,%{apache_user},%{apache_group}) %{egwdatadir} +%dir %attr(0700,%{apache_user},%{apache_group}) %{egwdatadir}/default +%dir %attr(0700,%{apache_user},%{apache_group}) %{egwdatadir}/default/files +%dir %attr(0700,%{apache_user},%{apache_group}) %{egwdatadir}/default/backup +%config(noreplace) %attr(0640,%{apache_user},%{apache_group}) %{egwdatadir}/header.inc.php + +# addressbook is part of core now, as it contains required classes for accounts +#%files addressbook +#%defattr(-,root,root) +#%{egwdir}/addressbook + +%files bookmarks +%defattr(-,root,root) +%{egwdir}/bookmarks + +%files calendar +%defattr(-,root,root) +%{egwdir}/calendar + +%files developer_tools +%defattr(-,root,root) +%{egwdir}/developer_tools + +%files egw-pear +%defattr(-,root,root) +%{egwdir}/egw-pear + +%files emailadmin +%defattr(-,root,root) +%{egwdir}/emailadmin + +%files felamimail +%defattr(-,root,root) +%{egwdir}/felamimail + +%files filemanager +%defattr(-,root,root) +%{egwdir}/filemanager + +#%files gallery +#%defattr(-,root,root) +#%{egwdir}/gallery + +%files infolog +%defattr(-,root,root) +%{egwdir}/infolog + +%files importexport +%defattr(-,root,root) +%{egwdir}/importexport + +%files manual +%defattr(-,root,root) +%{egwdir}/manual + +#%files mydms +#%defattr(-,root,root) +#%{egwdir}/mydms + +%files news_admin +%defattr(-,root,root) +%{egwdir}/news_admin + +%files notifications +%defattr(-,root,root) +%{egwdir}/notifications + +%files phpbrain +%defattr(-,root,root) +%{egwdir}/phpbrain + +%files phpfreechat +%defattr(-,root,root) +%{egwdir}/phpfreechat + +%files phpsysinfo +%defattr(-,root,root) +%{egwdir}/phpsysinfo + +%files polls +%defattr(-,root,root) +%{egwdir}/polls + +%files projectmanager +%defattr(-,root,root) +%{egwdir}/projectmanager + +%files registration +%defattr(-,root,root) +%{egwdir}/registration + +%files resources +%defattr(-,root,root) +%{egwdir}/resources + +%files sambaadmin +%defattr(-,root,root) +%{egwdir}/sambaadmin + +%files sitemgr +%defattr(-,root,root) +%{egwdir}/sitemgr + +%files syncml +%defattr(-,root,root) +%{egwdir}/syncml + +%files stylite +%defattr(-,root,root) +%{egwdir}/stylite + +%files timesheet +%defattr(-,root,root) +%{egwdir}/timesheet + +%files tracker +%defattr(-,root,root) +%{egwdir}/tracker + +%files wiki +%defattr(-,root,root) +%{egwdir}/wiki + +#%files workflow +#%defattr(-,root,root) +#%{egwdir}/workflow + +%files eventmgr +%defattr(-,root,root) +%{egwdir}/eventmgr diff --git a/doc/rpm-build/egroupware_fedora.tar.bz2 b/doc/rpm-build/egroupware_fedora.tar.bz2 deleted file mode 100644 index b551f832af62616a04342b4111ad3c41d8c159cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1443 zcmV;U1zh?6MN|r+F)Z1TN}fN5xE9V&D=|1aD#0$+XOIe zA)qBhlAwf$uw$X`2sdcQEI^;|wF@n&~d;;dQ zXQ~9C^zlCdY95-6=9ACU9M|i_#{0Y}U>)rJE%LXNcrBq&jpnfwRY8pbRWx5HTI~C= z$rx(Fhl7`XESV$3I}nYYCU`SWEHS!1ve%vk`2v8B*YbcQbQo0+Zo%k5l?7d)RfFfe z5`d~(H(Z!|1PyA~=q1Az6aIz%c<@3l@9gULQQ7o0-qhN2@?A$yTTcBjWigQ(;+&@I za)s;}r7~%xU56XEj$g+xAkilavIk%30V(dn0W%-~nYgrXi+{SRt0J`J_W}r%CnmsA z1xl3W1R)B zL@Z_dGYD5G#KJ2HDo8Q~nn$&JlFQv9Fv=|~p70b^T6T{UG2arPi`hnVPGJyS*kZ~d zBMhq87`M~o>1!RoU)(Te_r(OWqeGwXKcIiUhoo}K_-Uh3*b=&w5GL1(#`7x(gSP1# zUOes2_pSF%VG!$&bE@j%%*nIsiDVrjw;hX#UrK{Ye6*?*R=87M5)DelV#@U;AqQ*K zTk0Y0oY-jJ-yR2da$QwyV~WJnM11MPBW;3K*o-7Q;_Rga;aNzH4IxQfLO_4bVDbQ1 zZ;p7kWe>=CIXcWxFo|FR=c%e3;4lEd!wK&5T2Bb%w7{8M6k=D>l=$)v`jZsq8xn&B zkJ7|MN{le=K(Ptvz*2A;cIj0vomPp96A&yWnAuMiFSTpJ93gUZS(?E`Og?B`q1p2} zvBBqh^RYIGx@645HS8oklBGh9T%`Aq*vMwj5{0$*0w#WhV`pwn&etw?Hd zG}4}$5pY@O#^}yK+rks>^g_zUnIM@1pg89Zq|4N6yK!?&h6tHpSj*vXj=gdSc-LW) zXb1})tfih~0mMdwWy%(~8tWuzL`cf!rg5wuWOWeI>P^18ia@yeR2j-m0Oe?nqC3!A#$?(9gJ!_jR@^=9yMY8 z+3w`7YbF;c3In@#5=u2PWjr7z(5ItQ(^J%WKs`VP)Xhz#Y3c@ynWl;A21IBkl){aq z^lA@knlPC#2*@*0lR&~6XgyC;O$3Pvq{%frDd{u~8Kh_igFpajpa3)gG&mYGVhtK( z!VExSF*In=pba$80003ZiKaj!L7X7<7)ug za;T56VRli0pn6{t?CgA;j@B-&s^RIRo^V~gAbnPZehtqvgD2AJ4^ zq?$o0Nh%PLmu96c(~;Xs8M?3W;pP8hjzelWYH%u(X1 zTSPueHw3o<2GElUK#*NzgR?(1zS_id*s&vCJ(OFqf07+f#brYc5;-BxHp(u%45X|h zNkmnjpZWr_8S)s?EowtQe5?83^X!3Ed0f zZr|?RpWy~)J}|juc4AJtPj=QC3>$RO<|f(Vy=BRZAv2G1*?FEyOElOrY-C1ZO6g}! zbId79SG%;JS{;cSetW=$g(nMhFOWPttOTj;ix>$&z$NClpPBdhb@ga_S6w~<2*5Kk z7+@-s3bIY`8)$TIyVDA#GKhqtmPE&uk+BML&nh_}N|)dy9t4#TU@&;+X&Amikj>ML zQ*+>XmIo*bg&!uHkg}lEXUqVxLeNK{im0FlD?&tdYARKhIx9)W0?`z>Zm|JaR9prz z$eCD`YEDEk-!*{1TY4QvBKNaN}A*x+HJ*UYmy2hExwGM(T^{uqp-YF*0 zt|9o@`JidXKN!^d@YdUrf{60*WW#9WCmx6v_ff|}%?EIV2QT*rh<01`j0;vfqEVAB;)`LQmYyD=|K zWEN^#?n;^LA^H`UZXUr+2 zDx`!!+i*rq>BkgrhSVczzG)*%jL=$@Z8XBhKw=JCg1%N2~bXn_qXkr(Ej3EHQWD5xvxsTFRq87+7r z9F_XPf5KH~aI>Y21DFuXXJq=qC@(jm7tBk1GzRu1dEA0B@PkOygP9UkeSI@K)!HOt Q5SRR2$rRy2K!VMRgpVVc$p8QV diff --git a/doc/rpm-build/phpfreechat_data_public.tar.gz b/doc/rpm-build/phpfreechat_data_public.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..7ebe44b8ad7f78e1c08b75d946a881a9976498ca GIT binary patch literal 101462 zcmV*#Ksvu4iwFR^Yo|&81MFG{TvJ!uPeOns5J*^pP(6f^gpq`eh=WaJyZfn?OSmCv zLlTl3z}2!uQBXjuSSyv`tfTH)d@UkU+z2RG(Sm>jWvDoKRr1{=SV!&K+WMov@BMs! zNbWu7InR04|9Q>{!U-~oLYe}}V762s<;!50CxDRGp5q||VoMcqA|a2B`76Xh$;-n- z{fW|>pXz597grA#Pfs^bH&+bDmE+~&iUA&fX}5PIg&cuo0AOSi3G$!#{%HRHD8cU* ze?$N$!t!@agLjX=tBaS{hxiW%{k8bV!+b~~LjGhPyi5GOyj;-uyLq~Pi2tzA-;2Kx zmWmVj!c>+3;r;#|ssMX>y8mAMQOvu&fqzdIcQ*{+42J{$pU2-<6IdUfBvC36!(wDS zne<`|LJ){20B|xoJdP$2OJx!%EJNm@Ss_kVnuW~<+#nB@ha-rN3;}*3sQ?0~43O-?;!F;3S2HkpOyJ7l zxI3f2Jb<4#K_LfI6*6(0LL>qL1d;l%*(oV0EF?uJ7QiAj3sED6gijR+E(Z{5mr6sPM9dc^C}ik1sA}^h3Lu8zcvLMRA23u-mGCv|xrqs2 z+&Dm28OIlj;dnZeOj$Qn^W` zD<54z51h$W@l2ILVmV(TOJqd|c`}Jy!be!@3{lU9OCU6o^s%aye1({&_7PtwLKtYA z5{K+pIZ8E#Mt2r}4mt?bUU@mhg2hmr2+fOeKn^AVM5cg&58y*0IjpusB|y#uDMB<} zuSx<7fLz8?tr`pD!uhDPB49)yQOQXJs5R<;Fe>GR1UWKK1hX^}R5qd*N)X2T&>i`X zbOtJF9F6WMccjytUX`XAOhgBn^cOz*)zTrTY0N|u%ug;yBa4E`OO@_XVXPtRt=SP% zxIuv7F`MPF&~rA6$z~z29ASu|WMKk?NMtO99G3Ydph>|53m2+vW~k8&?CpUyn-K@` zK2x;@ar{D5%NMKF9IO|0AQDQ1nM@{-!3YXVbwo6Ym!Qc2oGSQ8me6&t{>$$CfQ*YE)Bcsp8PEsCi!7KSdai#!@8< zQXmq#%FNg11+XwdfV^Z-%K}3>4lM=}K3@(aGt_U6XfRXh>TDUxKN-&n(B(Wx1k;(C zaZRqgK!SQql_0NVh>XV)4#DdM8x!~f4pSpjE$6kI(l{5@Uh`m$>MKSI@$24E&#@9A zgePFIKT*g;vluk`97hJrLG3l>ET-yJ<-Av1rV5=LRd+I+5R@uq*}9DV2R!-KoB%J3 zeAU~iuhHrtec@_#M?vd7T2)mC5)C6-!x<{G#Ha+$SoFge@B~6pe552Ema{~#H~|r$ z!;X$aI;w5`m0^~64oj^M6TD@RC6&m9YD}Wq$zYMXDbU}D@oPa;BY6nG>NNLdYkH!p z=dyp(h=-;B|IPECrl$YF9`Ant^Wb=KKAiuDgWgO0c@mLC<}4Ab+WK4e_=EGmD)eu} z-^7EN|Zf47yQDw+s{cVetyz;X`uP%hl9O8 z_dfo3=b4NC;b+H(q@HN+8Bq4ESatK?7ss#M{Zsez2Zt)UpFC5Zs2ymy*xd8@V$b8} zcY8khw&wIqsD8@qj;9S>PcLt%la@6og34-kUz;bZ`la}ktn@r`zsRC!?Es`|SveDOfTrB#*jyxnJ39fvDy*^c@9 z58Qe-cgLxxPoJWO{L{{VldK2uSPUi#JzNK)5=;#BT%ev)osr&!P;h<7f4$%I6JcG7$~U?Kf%u2%|M1T>NpT$(@rJf zF=PK}KYpM;P4A`t$02hQ(Tno$l>a}f{~UKumpALbi(;G9M-2?fl}GpQ*}WM(8GmGDIdjI8RfWsWoH>(~xsV$gl&p}PJ6n~&hkSgzu3o7_ z3u$Rd(Vy8&Q{Rj<^-Z-WMtj%Ba(uk7IGv_5@y=0B{@$eLg$LX`!l>+biS^S@g^=}yD6flJA^n`)F@0_7c9 z@AXT{?gh%8Ol9wKWpBa#Ti29*Yn1njmG?I(AM8~2?^E{wpnP~-`RI)DNt1HmuJZXK z<=-IdLDK-$x3h4(=9{~z0vLpFBcg{2&xBVFRyxI%-$+B9j6SX{-&?zVX7QIKJEMZ{ zvUe;mJTPfPG~*8YwEwzESe&zV?MJ%nwavGfYj3o$wlAN6x5RDPhj$VXcTXSyoh?TR zPKFM|8U9*?t>y%5sNsnKV=STZOnqpbKZ%6BiY1YaG28&Z;VLxmtN*L7fPd}&hr-?S zH}}5}{eO7qW&f`*eA)khI#Gdkd$i9(v9nNIUAcUYLNT^LXMOn-zx`KwE#?O$$WMX>V)zb)po|g5@upwV_TP2$p;t$)LFusv8+}Q~ zFsmv3K8AiaCLCYvj~QJxr^GWx^*(B*+D=;PSP5oww1qvhVj15pmqkNOIt6|Nt+1({ zbG?kSgGU;h=b4P8{?|3*e}LZS_dk68U+n)Juix~457!U)9}ari|F6<8gM)+5o;};X zeS2G5+lmz{l9G}RA3j`BQSsoxgUZUvJ9qAE*|O#N^XDZcB}b1QZD?qyudiRddUa!C zV@*v>XJ_Z;&6^J$I&|&YwWg+~UAuOng=5>cZQp$J&CQ!P3knLBE?rt(U48cK+4=M5 zXJuubKYxD7k|pKkh+_-V;)~zQ`o;-c}^sUBd>JjGEHeWt5O-dk`=Y*ETRQlR4&oJ5SA)u|* zBHjQN`o8Jb$6G0aBlO;C6V^x**JF42S8R=p%>smV47|HFhhbnqv05NzdE-W~NoEv^ z0iLQKtU~}FS&~R8c)Xz@t%&GIFfJ+4E3+6Kj5Q+=Y^fi)j2NY-XJMC!C09{BbO~0b zrn)wXLBUjtkqKE>*HruLB&>sp$r0`5%K_Nd*0oXXdjf~8*}sL}Pyhe*&oyr?0RI{P z=vANd=Kufj^5T5J|FDn-|EZW%Ox8%ul`B_TT3W7Ny^3NOg&zt$v=Cgse!acDy`!T8 zML3E;6wD|HZ{NP%)zyVo1QeFt-Q6fYdwYBP`ugtOyLbQoeY9Sn0RHXyT#ZZBUKs7c z*7nfz#@44wZBM3CIy1m&FeUFupm&v%Pqmi6+YE8$5Co$%E zRh1Wt!htL6K-+9z5+S6JMq3x{utx7u{sogT;w&neLD1D<>Jatx-Sx=2%sh&Vlb()V z%p7uz_$$5?Y@-%K5`N+Xq#}!y=0c{9FrVi? z)z`85?BYVcR=Y(BzdOxFVn+Z=^X+xNHd#rsr8UD7Nj5FDh!OEv?oPLsK^dpMKRiz> zoIqM#yC3<9Ado03}9;h!s-j(2&w}9Km#CQdw+d5Z+yTdia?O{Yqk2R2LHQeS@oFvRln#FBDwoW^@)O+W*%nZD)89(FmnWd-9g44j%j8@X5unJrA zv`%8Wf7uaYWtv}~_x+CiHCvDi8(OLM5d+O_PqEvo<1nKm+V2Lg3difh6?KF6%2uAX zj;_fVt(UlDJuy~VuxP~M-tf6CKe?t9b2l{L8!os-+1>B23MaWQ8f?$8U6zC;MuKgz zjq|&z`+)U^plKNdD5o+~WXfqs!xxscSrAE~-v#;j#)MR+-J`^UQA8HN;E3kHKuZvR zJi}&+x#?6IHBC5ftm^qUy zmucmQW;w-%5uf*WgnLLH9rMS@SH#habH&Z8KbdryVod4nzgIe0i@JZ!cR?&WU?Wkojezk7Kq0uXr6*i|gP?&>h1>5y!IMq2Imk&;<#c18# zMl#i>P_B9zcX`Fpzs!P7DBV&h&cS5Q#0yhnQq7|brp!OMX8N?&{l=`8BICtAR~<;Z zzR#Kt^@Qsnr{|16YXxe`Cf)NRuC!d!DHu^Rv8rLF7`cIAMi8l`B|eYZ8V&arP&b^)(uC3V>N@g)h`e~#QHEi!>_|&sX!h##o_cmIxg9?78tc^ajDc5;j z+5dR6;RoT_c8RyAn^kO`GG}z4<<7bFj-lUAvrZM*rQ0k&)4D3AuDV^zg0eMrfBD!x zW5q1H_~QT6`6aWe%CGXk z^gPS!-@C3qIe(9bSrEb9G{qXqJ9>g(R~r*(U080s)+oU@f2rHox4iyszq!5E(RRFd z;QYmxx7KOzKDw2YIX$uKkhTyHgpJebkc8Re2`+F&5{snV}=^<PAHcML=z&|pQ zx#s%Tx90kgWm(Cjeo=TWFuZP5i{~`QFi>K~ORzffxxlvTL&EKdw$R{(j9y_f_T+0dI+O!*tY|5U(Q}jx4}F|ZzhZOg z2os)lG5MrOG5{SsTw{`5NXIEugfdp5j=GQq+S_S4&SVT!4H10!w+Yna>f$GDQXuSy zvY`6jl@jhNeI;{P$ob4PLTxYrI@p)ec+geEf*CG$SYaxa$WbXX&AJXw!9o}5^#j5oNXl@Z?8LUqK~k5lIin<1)DZ!nXX ze~R1xH9Z}?kB@lvY>XK9VvOFiCvyJX-F-p|lhAPLOU&i zLgO-v9G5<}ZNwaKwXz%6?6K5QSwqG>^QL_&Zv-kTVC>WB=d36`yGJN%x4~fuh|?a- zzXv@u=Y!N1nNENj-Zckvpy88)PK~Y2LM#4dmzg;XB*w*^-#o35IwA%%A%PmF$70L| z$4H1H$hcLB1Tx~lAdOyi{2nzi1gHY6R#yR~(?`26nc+jl2KJ=t1CaQ3qbeb-JG5rF zQVB8gK5F74AMw?s9+~8RE@`}&E6sd(g^Gqx}FWUko##so6H>3U93n?NBa6ZvCG1qd4|fg`JQrgu+|E3 z#tc|3Pgxc(SEg|K0pH{3ZbgB241A+&$$Ex0gTD(3HK2C#EvlbjsEdkk*`tsx(7w=cGmwr|q6#G-Qidxr*;QKi z^!8zo{!^#bX0#j~WUy%~yuwX%V6l~JZCA*Zj2vACv(pnS^@AR%iVG-?=d?^wZ;-<6 zlUGBdCQ*llAcaRUO4Xy)K9!)%5R&LgwyxkENFNUK7MuadDBE*k-W8BGOb^ce~XUvhq0IZQd z*(O$vHsVfn9fo1nYB*Wp*lnj%Vrs?yyoCl%3YtRVj}Ci1bQ+u}V3E3rn0zR|YS{;A5^TVVsz+!V_sqSVA-nqm291*|ndVPv5_7R)kiv z>Rh_KRHTO&SU8$YDzh#g)sA_7MLszuQCZQ2Z>AC-+K^=Gb_=0veZb9jqSUpLV{dzl zq}y=!yrBk~2%_saxw8J^;Vso%;TDF>^8v%}&SxCimNB5cGGEGi zB9o@-ExU~%V|19RojaeDfS@T-?U@|2ZI`Z3(&05IUj`b8$rL<`rS5B0T4Li-B%>wg z$q^UelM|8}MDGnE#=eXG(j;6V79G9HS?NYkHHx~4L|74Q^p&7tWUGP=oPLiOCJ#y~ z6`Ts=cySkY1BsAXLC*rRFIQsK6xbEiG{n|8ACPc@9HIy1MK8oLxsw4_fZ+*~^o0s0 z8h~9R6df_<87wFz7bjzI9adHrdk7+%MS{s+P}%}p?k`Z*HWEYOEN9RJLo!E)8+bF` zTs;wNIjUga73U-EV-y0NHm78=ARy&yFdkYUu!O-Tr%Md)Gcy3@p8Nqq)m>hE$ z3o~e=guq$d={X<-9)p-S7E)+LopTd7*`{mR%%cM^&?|5+62&cSj|9p&WCA8jH+Gk- z+47HZ8DKDWWoo+;gHxM0+B`DO3klIb5h!#K-7U{hjl@Tkapyr$Js5YXBN&t+ZB5IiT~Dx1wfxL~J)c3DiK26fRJ z#ar1TnGp(jD7VP>o0i-mM6$ULpx>?74`-J zV8P4?xNkH=z7Z$U!cooYX5lDPU-Ibx=P5t6@!`n#rQ7oueY6 zsojax-e~ATKefdQb+8;wIC)#Vww6W~2_ck8sFgyrN;Q`74hC~#Aq3Z5E6}GVGSALX zi7L=mAtAM;wDpu690_V7inkKQFLs@fRbr4m0DWVU+MBUIk!UzL3Oj*>znHVkALakp zD-2?%MWw=7igwkF(mG@yUd&0WG6}Ac^f!p?9{|fwD~z%83J_2+bvJ!h26DU$srW9{ zx{N``JIPQPvHOYgQmINhQ2C20V_6C!(wp1i4a#=jQOSkbZ;U|K&#V(egTp!K&+{0? zXd;?fIGdQd1_8cqlmHV-$OXklMwKL2%Yc{_V%Q9DoWf+aASQMTJi8-_{Q!=0eV&~x zz>#OoA;iU+vYlz0x(aq^V!hTDrua-Ieh-@`iS29!o0`CxeN5tYW1MBn zg@)(z%12@aPLphn^Hum2px4wf!f*J*7SyD`1)C5-DlnVUf-YS%0@2LI6yn8F&Io^z zey2l#1|mQhcem~lv|Rw~LfFm6-5nQ%FC#^`OhtA_iD=-xeS1W33sGFF3Wj()swyGq zJ)!OHiDoMWqvlniq#nOF9b#ge^5(8}C!YE9rHZqciX*zjNpHl1WVA3cf-F>!0D5epDuJ{PAtdM=;q97({D(M!I6O}8^jBpo#qKJxt zWJTBoMUU%5M~uEnJn)Wh$>|;@?Qdq%2ybO;8rL{24WUh0K) z>QP_KJ}m_o8zyRXJmTJ0IuNtO#xGC3KYazVGUl$fXru z(IhqN*y5a?wF<4qL5i`u*_maV6}r2obno^@+!e%@wP{m7)^=jj*=MLTi}6@u?rpE2 zbz9b14ZXpg1Mse)J$dkSI6NN*M@l??`yzgK3|TFvLg6t_-UPNIm+kE~n&;9gb5dJ_ z)skIO@qhpbZ>z{4S4y`#%*1k%A*Wl|l4xMdLG`-Sy$CJr3^i15715j&^?>RZqV<~{ z^0nMq?$nqN&+EH?xZhXD@{*d9-`Hp*Js7V(*q_$`H{Ov+uq2b}h}bjF*Jf7EWAC`% z(6f0!3^cYC?^sOt^0czZrM0{+aFiS6uyxQU>lAm8@AW-5 zZi%f_oM_Or#2+ox^MKtFGu zHgiGMs92+e*0=-aorAE5Kp8z^%X9CmYOzF;N8KI1b9cND&Gs@RQDtQHdtnDu3}0SC zZ(-X#|H*sn%J}Nig7OT_=~TxOy7RZ5IFdP>@|vM{s%oaMZ@Z3>vJ9{x9aQ?A$_!WU zuofd7=dYj^103Ju_w6EvoF$EYXbua^2>(dMBE7bMquK^yc#4{h@nIWr{v9>K)0yJ} z`uTNgiI*LzijY;?Ie(}9@Z{ zF4b!V8~c-hhJ2ghm-K*cO>CLT>CifG_u7=JBHIP&>QlCT!IAJT>gpZoi|5=Th<>op`3)!@7^3GC!rx zTO|qBH}40{)U8Bdh7E&8^GXL5tXl&EuApdUsHyK&YXQCGMD+5OR$$Z;b4VI9W6dZk z3Cv=rr-RRWZJo*ECC8s1jS=-uejNQd(Y&biWa*d?l_-^6eB}?t9@cj_*lZ z3DXwU(0;eqphYCkF3kM#E{k&9;R(XYk71UohLKG~X)lJ0Y@v!zyp>cjs;Z*wFH^Pp z-;6@Tm@STR1*MRTQnqbp!$mEPX{fNdh~sk#nM2ImM~$4wk+=5OI7N(s!+NPI3HEmJ z?USsGes?3dqu*v|Msk;<^Nl8o`XgkYf;TvA${G-kp_ZboT$=F*Q{toQ?YK{OMRC4} zItv^~3A4V__)Y=siikZBK6BH*Li?H#Q@1Gm2?n?xIVr#*{04TQH|dTFQRz!xpA6HV)s21<&a+F;nK z;elMe^?)YvA(VRFuHebtxUmex8Gf$iB;AJ3H&{7@*`s!IwS$j!Y4NwK`9ClbGG@di z_X$XnC6}Z{h#1e)ba(6b_VvXL*>k3VXYFn#7u>6f?V`s|6gz->^q{BGB!_$KGb@2-N7I zX6s|%eIZYmVFo?N;$bR|YFui#&Dfh^LP0n5;N4#Q7F=5yz&v?ho&ZgIioola-1_u~ zNLkf$TLJ@$f@n!>>2$-k9TgHZ$b`KfE9M{o^9=Ab0*ebZad><-w|fvi^UMQ?r0WB4 zth4q{=6FRX%f_XsZuRgoz0hhhPD(_^Kag1@G8yisgO*}JjcV}&$#9@-mjHfpG!~^u zw8>(X)*l#vL2Z%~;)L3p^r%Gd%RiDta5Rn>+S8LV9QBv580HYB72xn$DgqW@#S_UH z`_j4$AtudL>D)*)Qkp)!IIa&$MYJ^9FC*g94>k{66_U`9wxW|0CSH63j}y8}O?8bl zu_PHY4(`rG@Tm6*(IC-e1bo#?RFyso#ZHyPBG<)p>M`~hO2+@WK1YK*G6522NbqJ2 zRIjWBXKxG5rAVI~Bv1wlr~+Bz5RL4Ch|z?8J7R3`Zj*L_iz_QHBN zgK=rRC+?}8zV!TIi~*FLD2Fn*+ukS=q2IpP6#v1u`@ClC{HlrkgT`4=fjW=*TgCY= ztM#QETW8@NYB0yyK-^qfLYVZEjm8*RG`2f95?PMtu$Vrh;3j=>%!;D}TS|3#g9W#! z{Zek8EwXs4Cr{NK>2iXZeKoDS-v;t7C47HSNCA7G44xXwx;X(*aXiV>166Xk^-XQ> z6Pu-;C8*=C-Qw$VgPhf#dME9H)m0F|4A(3eI zFs58s*>$`Mfpp>#1SDe1oeilDb1q3Z`)z^MKQUD*{yBPAyPa;ZZ+ zr&it}{FfUIXotAQhVe-ShsJs}q0W#64FHQ)GA-^CSzng$F!HX9*al% z93YG|M{z7dF8j|zlh8fQ9Ki|aIdQV%n{-kd(92WHu6vJLlSiTJ>>I<|^PneZaa3|d zy*>44?f|zqI+|wi(fH#I!p42OT;q6UfLb%%i4>m6(w5z6IAR@^m)G7yU8c3q%7`TR zyb{o~kRm&t9k?n?1-duOAM5?#a8z z(IdHpWDk_XFm!f-@mVAu5p)k5Arngyk^`C24`I`6hRzJ3Ot_>OZ5Z^rfNGXF`ITRU zK2)SJ--t|Jmp&G7PY%bVqLvVt0~|T!%fJ*nUu5CG!0$hQTerYdMp&*_Yi_V{wi#^0sF6H55ekj5wPEE~HN3^zQ+r(n28YFdcO7$!xHxRm77*1&kcXf}q*!^b57;q6i-rd&f<^Dz;0a(mo_cA3MA zO*49A7FcZ@%S8jkO6--3xduzu))J31&cu!%yTw={E}c13%%qqEueOhy)0>SN71AGQ zKCF+!F}Pb@%$SSe@25Q_>MOt&ZR}2kU#g(efM0%5?8EJ`^c3xgvpqwJHbS@|l^!{| zDz!L}Og($J{b<(S={Y#nI~v>gx#n}3uEH!rDWbl%jJfKuDCDl2_}GjDKfv>7bk#Hr z$~|<>SP04Rc!C2OswcZfM2;APKXsN~GJcxQ@PueELL0bnTtp<4$2kgHanvqL{lHCJ z>gq8gt3@{UE9;0RhN{BkgyDW%r6Q6mS^fUPiN&^V3HMUx)|?eBI0-{#os^dM?I;W9aace*2;CzEKu{?e6eDw? zvcySEPF2qdOmLRN;WOr-no;(Cabii(R%0j5;Cb;!a&Z#H!Y~)h6p;X>ldRJ?yyf#8${YA*NmkmdGS*;-)fxug-$UfJ^%cc9Er~O~@%1XcQ|BzGJ>HqvG_}c$L4^RUw0O0QKE;3Y#h9)v(Jm>3(34EJPbrSkG{mzNc2XsC8wZH5ynub{ z|B6E6zxcmE0>AmclojR9ffi+ZG4kF#v~m2y;cD&l*^dKeP%O@jXXuu!#9GP8s63?o z5#@$DDT491P0L}Kf>{8P)a4T$!*I||)=m~q8!Llkkfn>?X9G|fK_Kb!zJPa*cXDLD zV99AovC97+om_tnKZ^gPkUubg0sn;mKQ(p}+B;LjG^<@n3lh z{f4&?17qg<+b*@h*()6SMISw!YlB^>^F&himd??#(L;jn+{it-xUsum*8a7T)T|he zhoI`HY+1uC6N$i=cTYAlG8_yB8yXtK#6-u&lI_K%*lFp$%u7P^M?{1b7Z)`&)E_;1 z$X{ONg|~mR{_eE2)XdC`jEv(aP8=^UFRiVuEh{UHj0kfOlM+Ruo;bKJ?avT&Hw-90CZn-kMGcrdcCuplxrA}}z3K(Nr!(Q$Tm^z?LfH(@^!FP3Q{%+Fq&8^^;F!jBdZFrj8vipvj?)Hun1+>{?1Vj04t9HOCNYND;J z3&pmTso7jMx@wB`*yYg{dog7Hkeywh$7sTxgg#TR`^jGO8F5dZK6@6k6ORAw@I&H% zP@un0pvNB?0RJrhtIB`3{!^hy!cP4E3HUAk|AP7QoD#1np&kN(K%r17Dk^GfY8o0E z7z_r7!)a-0>FDU_>FF657!U{qBO@aciDY78LZML1%*-q-EUc`oY;0_lI7kVIoSd9o zTwL7T+&nxyyu7@8e0==;{1m|u5D>s%FoJ@DLPA2q!ongVBBG+AVq#+A;^Gn#5|WaV zQc_aV($X?AGP1I=Up^d^4~Bw*qN1Xbl9IBrvWkj|s;a7*nwq-0x`u{^rlzKrmX@}* zHYI@T>gr;#SR4+A$K&<%^z`-h4Gatn4GoQqj3`22Vq#)yYHDU?W^Qi2YuB#byLVey zSP%#VOG`_NQdnDC+t}FH+S=~fv&YWP&febM!NFng-o5+w?Q?W=baHZ{2+IEb`-w!N zi;Ih^tE-!v8%1S2JUl2%WG^o-Z*OlOA0J;|ibnYP`}+q31W*JcC@6?TB2lC&BqSs> zG&C$MEId3sA|fI(GBPSE>cD{m2M-=Rbm$O8&W;>8a`foY=;&xNnH&=nL(##wxHyW^ zB_t$JBrho`DLFYgB_$;_HTBrBV`*t=>FMdmk5jbu1Vt`0Gc&WYva++Yb8>QWb93|Z z^78ZZ3knJ-d3;e((aDo1i;IgX+FDXla{Bb?($dnhva<5>@`{Rz%F4>Bs;cVh>YADw zia?(^bLQ;XvvqZK_4W1V&Yf#$XgGiVd}Cu{Q&UrOb8|~eOKWRuTU*rF6B84YlaqJu+?kr1x_kHT^z`)1%*^cU z?2k31y?gg=eSLjnV`Fo3^ZonxA3l8e`0?Y`*4C#_pSHKR|9pPL_BX~-*a_ehd@E^* zy(W%^=@aw7C_irZBIfvFW#c?{*K?%7WUWux_2}mNpSa%#6-%99_-uelu6?4bDMn+3 zNv12q7tntmmP(eJzoyI=u9Kr?DNtCdDDTVDzxs%+68+#xs@l896ET8k#c8MG4WO17gBn6^AkW=ZU+iDh?jI8Wzl@UI@97cX;{Oke z0Dl($znlN3C?}`16aRk-zM22`>vIYVwsK29bo6W-KmF#|$=8X68+p}l{FC2@q%V0T zd^l9_?r7l#DPz$$>6f7NxuDdo%(@rBS&Km@w$kfnT;o5GtEK|e-^Wya%5U3>u9*tX z+(@loJJ&bjmh|yZ^^EU{k4I`Q`o#BnC4Wq9**bFWf>*+YfRyf-qOIcI!Th>`yt7*| zZ67b+{djeDE3Ny}h3SpWj~_mM`t)&Q`_so)kA@5FQJc4l*Kb#?jh$T^t9vzEvouik za`^14+x5?H)t$6QWm_{{&mj(;4CpEFZ$05NQ6E2ApY(R<^jJg6tD)+9mkVFstl5}6 zzcGJv>*I$cQ^q7SrVw4ma2zVZoYl_&lWNSEVTR1JK*gGHdFb$T#MxEmCMV$;(hU$< z1fEI{mEsV~Bpv!BUHW5q#uOZ5G7gz$z?_6b9W!7#X3SmSfo(6%IGdYD)@8d;oOVcG z>c2E)@N1X}{`>iV!LhNRgv7Yy_@MoEdmI8lDe?aHSQQ+>$}uwqM09p@vb3?@TbvAX z_1R}=W?<`Sk#%ObvAMREvb$1?hpCRbhOVYpO`L+ap6ae$YItAymOvT(JNnY38^Itx zKRH<`VJ=P=zMA_GUU4A-HWoT2@Y8$xyP#+u4iu6e&PuZ@ndPhZPqc4lS>4eBDs~7hlZR_$l%2{Eswj zu7rU({KSCUkh_FNdJo3i%25goq6<57MoVrO=Ay{Onszg-e@qTXpGff5C#q@kCxDr_ zV0ZxPC5|!^p$$F?2ZUnv>3Co;cJQ$;ixxo|eUR7@a9V*dWg#PaN-Q<4u&TONuSBe+ z1tZ+jXh}~`MMERn&O$J?=;|;r5f|+rFdph19_jt>ob&NV_%ZW;{DVS0q$9n9d_rA= zqP~j*f5v|$1;yXzf659w`@cU0U-=IMXn+UAFUj8(yxvB2^{|QD+WGT$&G{B2fh7@O zH9C4lNcf?oWV?gI=g@!;ZEY{YLO%xte(tT@uCLlO2i8nXCVhNv5D7Khv=>=`85*EY zko`V2tcaV}fQMV3gCh*dkjF?H%gTOCSNbYHRjQKG87ZlQs;b=z=vSxnOI1{U$cy>H ze_G&g^MAg)CV*NF+l7VzrECD*C-U*wNP3*4omSUtfRr?AbGC&eYb{QX)%rb#-NB zWkp3rd3kwRSy^dm>FLv_OG-+Li;IhjiV6w}^7Hfa^73+Way zWMo7{gr}z`B`~?Uxw*Kw5Q)V7`}aFLJ3Bc!IXXJ--MiP`-hR)XJ+`*C{{s(s_)qXP zo*I5z|7j!}{zv^sQe8_&TNacOFQ%ccuBodpmze@m)xlwPb@U91lR-EwWg%WAye@Ut z85(936AMg-szn#Yh(KJ_s)>W>NTcZK8Ra#=SKzV}va}l44M8$$bZlJQTqqTpnprvq zBs&im8xJe<;~80cb_ot{j0i8E6f1oO=&6UXWo%y(Qq;V5Y32NAGP@FyRA4-IJ&j!m zLxl!h6ONrgd&Hv&w=xFxV!=CM{(l#KSp1iEaS!nM#~na_y8e^@ZvMNeKq{%z4hOt@n$qYBP0a+wXsQ)Sxny#{TlQ=Zjv`)d|n1mrNG>1U|gF z@am@RhlfdT7cVc}I`(?R@%_r+)9XRQ*{I%VhL;0`@sqrduJB)vL)^c>^Q~Wi|C{(m zl{B|;pnNG)SR>+>4)t@Y8GQF1+p#D_-G!6-IB=dDuU^46h5Vdd?R)UIE4=*sR zuePT6jlo@b>`9g*L zY1k~ibJFr98QEa4=#tZt5GLR18bK&KQR19Pv+%!dJMfR}{|NOUxrF?Bw&dSOfj{Fv zCENR5{wGg~2|N7%8Ti6~RTmII3nYVpuL;wy?EG>C07K$WQ2o0y6|Nh;HiQ&6<#~wYpH$6Q*IXN;uerslC;@-Wx z)6)~*-t23A_HTZ{FZcYS|8D_zpQ45KdjEUiMeMCGC%ebQ<-?DRI$}x2LcSrH?!-Yy z5yA9g_gVkl!fB3f+|viS9|VZ>i_r{u-{|NZRDT$A@jg@ZzL40%=-ceeZ&}olaiF+F zWI|jF0AW6EYkr&=tWKMkUr>;fMsup<^l5f=SY=gpHHRDkuRqt&Acqlc5ytH3|G((} z@d)_C^6#Jff0TdU|4I4no&DdRf`5Ge%dK0t9^4zv&Pt__yz6SKy`6PLc#xE&czIa? z0>Qw`!|mzmIWpYyHJ_*c_WT$7(KKw`6_>v||3#n)hQ}5Ai=zd6`GTF};NA3~@U>a?_x}H1*YnWBD}&F@o-DZ3YcXuqEB&}fxv(9krwQwcF}!YS6m)9{c=j1hc;gN zym|NiRKzdca-UykzL>E6{37JbNscRdpWiRP7*qWG`q=9c{8T>XMFHx?gw*{q(HH%M zKdk>9ofAFoZgSB3Y#txe6=;mZ)YJ5mii6ltH0++}FE}}oV|WZMhDU-e=T(6_UWOVn z7lQ#ZOlkMvbV%9-wD$f4h28Q?l*2P1^~( zyP3dr7H}^gcu)vDECL>#1m=o?g%V)2LhNxFFkU0MR1GZG0T0g_Pc><;Gy)6FLJQ3z zZ<>KStww8Yz`F~;yNkejJFw9KyuS>*?*u+{0xvtoUtW=Vd5!Wd`>I>$Wx>{BG9$-K^*O)X}x+ zL+|bdu1@8zKk#0E==*UteB+_t`oqADM*-^(4u8CNXk#wu?d-{oxsZ*ysI_~i*6-)9 zKT6$LjM!L=T7Ou$`7r0*!_v*iQR|P2HXfC%KPuaN60@7aplU^+pd4*#M~Wxi~rRB zMGJfeq(A@&Kv2E_SU2z)&Jxw5pTY!T-ZqO7VX8Dryc9+#s3ZvL`u1eJk4w6NWl2WN zm_Vq_SVZ@4x^G67GYD$?ad{W^l)^IPZDb1Ug$B|&W%d+tytnK%I!!Btxud@LWQbV^ zAJP}qbM#j}a%H1)8&X;MtZP#y!VtlXd?Z1f~AjD@xm4T^q+! zs9n6Bp$k`IG`(KUU_D+==iVIHweLdE)2L5oDu|Mf;B%J(+-%di+5_4%u9&IH6src# z)bEN@8NM&=_I4=YBlRR#oA*d@VV$kiLp7VeR;M}<20KyDr`}AVsttR^UG7xBe6F<2 z*>6?y`lP%9M;`C~EP(-?_^?neJpq*e^Fs z%&G`P>AlU4=kU35=xg@Lnj479UZbJ$euDf1Mw(OFKOTh)l|LdpVEC0X9TIT03&EJ$u6cq>lgR5ZRZ{0v&9)oRm zcH#bi!w=#Af8zcAfGZ-}$HND}T2!5c%82K>schQVlVeey&L3aPTh;rG)vW z10vF8d`T5mWm9UbR#LZrnfNWsfyU61HJ8;Ku^?KmPs zOA`>w&gT${VPg;EWPyW^pP?=S{q0{YQ( zDVF!W<>&EMPw;tycPz`qA~NySEbj;cGEr^#8+~`Oh$4=doAb0b%z`z3F(mi{cbx{l zu{P*|Fz&uMe*o%Tx`3?UpRXu;V%&*MIsovP@8*fNisQ0%<{?@Mi8y%%bIBRhj1^%x86FI=?TTqbLZ8V(KEg;mxS(vP(Z>BU%Hoa#G z#b0k#*KW+~>TP@r_^RGqY(%pmazPj$dkq%&jTTG+Eq&s30o)Wm7?v1QOoFkb_N*WP8GqS3xcnji z@>8V$IJyw|H$DHp|J!3_(4_8&%w^3`Kl*H^kw|oMj}o^nre7ZDQfQQkqmKiSiTmh! z2}0D+B7mcdiIohz^g=4_JHFsbi;Oy-Wd&AaPzIOpc3bvfp*_~BF$(Ek>|GH>+V?$S zQN!cO#55te~fBFReEB;SK)qmjs+^PTk6#U-*IW;v(xjH+0XJ%&d!GoE* zcgG(+nq63Uc>n(0uU=3J?Z?J$Zfvag^jsbp8TkCG3-rI_|77~s{~1YS0e$g*4t(){ zR>Xbre^yp3AAZE%5%;VAGodo1;opU~_qm_@dGFuzyP+?5`U;HqwX>HDI;zG>dNo;2%h=1M_S)}PXm+~#Brfeog@Q-p zZfGbuX@1J{94|VI7Q0Iz^Pe>4i0i0>+85uAM*_?mzde1MhM(aQR zUjFB+^&hH=>-@j(gI}%xNbO#{@od>6x%#+g{Hi|hl?RK9OUsQzG!!`H-#=Xc zkrAY4_)ddRcE+a2`=;yRcu-Hy3@p+gAw@tK^K;y3Yu8m0=R?_uzt!bHOVgb^!Btyu z(>gRO4icz!F$MwIVH2iq0RZw)50M}3T+jLWi*EE3iHHCgB0?oLa&XW?AkY{Vxa`i< zSQ%Mpc8+>peq6@-`j0iO|MnN>|BA5RSpTK6uK(~|@Ei5tj{Lg*o2sg6P*4yZ9i6_u zespwnOiT<4h2rMsmXeYR3=AwSEp2OSi-?FYGBPSIE)EC?NKa4yMb)pmy1JpEp{lA% zL_}mY)qq4IQ&Us#-n~08Fwo!MUtV5*_Uu`0ZEX^Xq^GBso12@EkWgP=pO}~!A0Hnc z9`5Jo7Z(@j<>j?y%a)9cjM&)N$jHdkr%yXLI2=26%)r0^hr`Ls%M*#j;NV~%A0IO_ zGaVfrEEenP>WV-hG&D4llarmCobY(Ox3{;ar{~F&C!L+0ckbLNC@83+q5_3Ng@uKM zgoHM1*nq)cY;0^mAdtGcx{{I-8ylOPoZLTqdYCNmM?TemLxu(+;o$_Nq-a#2WfaD`c5mC`}Nu5kWGEx>935ORXW|hTgYH~2?6r3+PQU*`gsnaaDe4*^>)f&x+ z^MP04-GLcFHPL~$2Om9JulV+F$C~B;{~!YV=KN1p^~?BAWj+7@eef&&zyEpu=j-^- zjT--1ypE6?!;(Dmav5!}u=*9DrabEHQpqy6jkpC3 zA%c8A_#Bs#k>0c(^nHf4;{Riv-2SruyRz!n^}m(Z=YQV?pYi{B{>%UOaCcr^0#II> zNA0&g-7SFuzRitSvM(mB>H^u>*_oOci9m%pIM~s;I)8F!zrp`MMLtC1|06%+|Cfq$ zLk1)uErkA-21bJ5(>-qD@dpNZt8p9B(GG8u&K^GBeecfI8(PIy2yL>PIP@jIWDH#B z*;a-hElo9qU?wmYMo&e8YKRqGctm8lWoW2!Oo+UsT=F{Y|2ME!`5$L@+*;OuQe4;n z`#$)r{?jHP@#?FAH|3NW_pythj){d4A`mv_89{sb$ zkjuSOl#eN|qJZuR(nLJyMH;Z!AsckdRVVxP@%X{l`E-x#)VBsd>=-YcEa#oAVCzZ% zEq1BS)^NW}01j8~pRVE|J<~WxmtqoCaQekZxPy_Tc9ti-M zbEA-q4bMI(8-wWUFxX}C)Dvk9V~md;jZ;YB_s83jH-SgB|6JL zRaCyp|EjI)|9l^Os{h6Xj6?!kMMY79f;v!P92Yy`2Z01mmK0%;8a^Ojm<6S+_kam_ z%*b3MDd4T9c1B(CmojeWcW*U1awJPt^}3SSs0{FIGhk}tFtmB|w3M{9HP+VFu|Z3_ z8x3=Ea=w3Hqnj(P*34}F0O0LSc#B5=WNAPkgarhI+`(eQ!?UBKFC`>ojpN*slCmhL zoKjLQQQS_YrCmx-PfttB&&tTk%p}eD`DJAl=Va&R=2qtAUCGO<%Fn-&pI=>AKq@RO zDl9C%e7U5sur|A-yod%;QBmpT%XK7DSy53viFCEN_-aW>V`*t4sj{-Htf``+ysE0| zO=eVYZ^vP9T`s~!y3N?Ltg_{2J3Ojv; zpiZNxzkC0F?h{RYg{i(mR$pBFxU}?NvidsK9KXms(0T^*3eA5nK!HGY%d)NqF!S=f zZAOSOa8tN^lMR~zeg)7nx_#i;o_I$3&23)XR^$Ly7XBac(^JjNtn|z$s>(HjB2l+)a=s)d$%AnZy?-y3u7f)U!V1x54xeSlRsrxBKKz#3Pp>+$5jXxrFwuTB@d(R zR(!$u!7ERe=zNEJo8tj`YFtdU0h5UKoBG7$EPyTz+@PP%C-_Ri*ZpJn<3`1(_)`z8 zr=@Yh_#krS02Bzt8xU*!&$BQGN8T1RKT|DAP&LF*-tN7hg;=tg;1?ds>T0}ZiZSG# zPh8$D>?heo8KX>6hAG*Ug)1ftH5QJElpa67<;exghoMr~?rUdCo=29yIvUqh(s^0Q z;!sy-Ge|~I)!r!hp1Dnn9nA*f8we6vIgd^N%=H*C1+B|_Hs0*aD-=vj=Q|Q6j}~`FwqWnx$;rd;-q7}B!)s6+gTImif1kC+xK>0 zvZMC&<}Tw+JD8D`GU_xN@beR%1(8LCT=0ZoAA4Bk#&{ia@8zzP4*xhMZlR_!_@7I39aO~BI<|7&{7S$IV`G5`{jesxrdfMD6V}FdSy!k zVvBiSzssH0<`cc#wQVzHdw9g;_ua=#^zz3Tu~y{V^`tgpsNm;3Mr)3;w0AJeZ>8mh z^s+R^T!EFtSnhvU^ynVA`iW}KYtj&-^VxySoiCX0kl>aPTptDQ2GMNbEf7#|ix55N zlD;~mElcc_C3bmDgYBd69b_-1U5t#J`0M`j@b*QQiFxuEMh4ppMD|Uybwcpr6iU+^ zt**n^E)LO5wy4yusF99L5r*Daj>ZETOI|wL1pCUT=(%V%@Dwg^YM|%?^bE}%C%4gS zTXGOB)sFemZ+QXP&dx@!K1Q@fLW*{M^BwpDNeG2hK7}GQHO>BIdlqnxt zI<_Z`ZLoGUCkjxOjYQE~QMc%G@k#84_EcLmM;w;GDqYx)J1dZ2x|jN&K7=ay3mr(} zE-1vRUpS*geI!ySL4IG2;Zz$Winn?Qg5tA)wTunEKr1~6;6nV<-uv(4Z;t;f!hdet z{&*j>L0(No<@fbpU|;5cRFoBAfSAhnFu=cj{9l{%Po4YYur|(47*8uKR>8%|{#X0> z*8G3_m-=7IFx7Sb*Y`oF!NI-kEJC!Z>Fj7-lp#R7aZY_QGg4ngXDL?HH;|j*UM--c z2l|@&1#FMhLjpi~6zifDHAn=+Y;+Cv0Ki*@8nOifzyfs>ew1of>d70k1b`h$03hI! zR)0u?`hy@&#}sGeY=@&=Z-9Xn)(NL@P{&xzLs3IKGmXcW>Iu74?Za=+1O zzMJ|}XQk)&8XKDWYnsO5EO}zE+j2agrnV90By23VhOu_LC#I=s;Ur{dY3m-iyR}qZ#0L8KTHA$%3K>zD8qSZ&mGjm zV$L5qIHP&SWTod5x(v5rmo($bHT`_b<#*_&P4ppVa0q_A=%Dw+k}3&}QvX3c=rH=S zu`Z8TYQc7g!$`AJmO6V-M^17*ljp{z?d>xQo%Ym}c&t4ie0W;0a62fJesG(;6MIbV zqJuWB74Od^eWETq_)-Hjp}L}W*iS#Ac|a%dxSpxAG`2WM>G{G93lb)Mf)xCsp0gLX zA$ViqQ^mxr{U%&BNuuXJY;l;r$2$G!@=Q)L4h`^j<~hD=w%;wRzb^^y#a$e?RYcfTl?|n+t!%yGi-f;iDW1mkrjn98@>6s$a;(C z#sHWZF`}QYOZc#0QRfXqpN-d^2hH5I8@$=3V)+1J$kW_&U&g0?+AW*TrfP5h@hX9a zL^oLB?)ET_)?=vw8T)-;=j_!UAFpGEXIi5(2k3TUj-NoDZ+~b5=I=#TWCjnLvz=am zgJ;F3CDo@>Jg)DojfI%{M?ki|dXq$19hViSwGt|cUe){Qi zU3Pd!Vr)M7XhF!5D!NilZu0}JF00l9IJNHfVQiV_emA$|*c~!#!En8V z>3u!(5s~2 z6Sa8{8F&JiL38@pInJh8_2F5~5l=9%bpHoB)Q~?Y?B|oZFUNDZ^*I@yJmJH+_Y>zs zjUze2c3h*ll(h}(Ygr;g$sVk99_)107V~OCPm>R|4DBJzNunjhtq=(9P3IcG*XJBK z9D+R?z)lx|lAu(VWEQenaiEEpe}g!rI(5@apn}t~qrdSSPry;V=_%uxR}x-<8XS$F zk;f{;+bl%PZE{)@eN-KPYJ`;2c7wN#eixbU9~FZA;Py(!>ppzYmo@zd6LLx~VfN^b z9hsZT)J}7}n?VKhwOYyjWG)gP4022muYCj>j=DK*%JS6WR?zrIceuSW+>Hh5t5ASx92rA3m#|A~yvCNUGDm21mve*y+eT4oq3EqR zL3tYG9doe>AqQVmYDf8`^i*L%E67@0qPjh&c5H;vbHU6$$*_CY26n@P2j}DaLOEm| z1>pPsYkE2#XSg}VLNB5ocg5}>WnuH-tY3@S-xVu2A;T`b&bvVf9}LiaIVK(c?w*uBy&Om29@Wusx!`Q-@a z{k*G7$OVJHds8sunb4Kdu+_+@t-d8VA=%7ViIvSgiA%Z6f>K7nRe4~S^cj^@GrWa} z65eiVY4=$JX99qmdtf~1HnwYPwJd78MUrgO7G%N4k0I)*C-P~d4x$HfuGz*>h_AiLco$NV8N_3adOI~Q#zb&@h|kBlBw`Z85#Oh_bw zYb4=IV*u8%*Z8gbIikAq-RGU3$fY6)s@k%zl)*X_89v*{Zzx;TH4k+gzukWSVzIQc zJEvs3U17x*IOCW0Ld8ZO|GJx= zg<~9>#2h-zI+tzS1WC&X=U6$w(${F7mQYC~0IND~!`Cs&O#R}q)$W1KnDd~ z%$I9}AK^9+nJ+3do&txKVfQ3w+xyE`+-V74wi+ zDG=jzr8M-E4$>;eS+wx3VYf$SqvYHxqqSnI@rLWTj2t10uO&HJWz`CauEnk&CBzxz z=pXVoSM2o$@7BOn>os`f%5!cM7&jNT)DTRL*}k#V1)g+;8NhhAKCg8za#xwM<8acU zGt=;E7Wab}U@@l7n(s69=F#X|#!%?}KzaF;cQxX}ujK4n2Rb~W0cVCzgUj2>Exw(n zf3@E6qw^nkAJ2a}|B?Rv{-?Br>@WWR9Q|4TKlV5OKVraO#5j-|Vak8Zc_Fayrje{n zP?B0v68QxL{gv_T2@sEdH-+}>G;1#KAvXkhz#Gd=%VWeySHbkGNJ0s2Owoe7s)&0> z1GO={0{X^{FKis*{70^1VzLgnsg`wlUG zcvN+Aw6BM0=uF z8Tut?s1u^`vI9Z1vY)+{f7v(%KXudxMNm>+Kv4mvrmBf;r3y0C#k*S?MmK( z2I+Q{(YN{dh-+%CKfgw9U$UE|EFj4PD!wL&eS+-+GTZN_Q(xM2L9m8jmA}EsFJPKi z2YZWDT768LQ(sMjLvmWXxUneOYNFTSrFS1C&15(}LVj6X8KR}m;Tco3cx0&|gsFQk zba9#Q7;||dfZ9HluveOL;6p}NX=~DuTF}`>-U~`A6<~D>A2`@7wY!dK!9)8X z{FYd>*W0;#(Ntm2@)!}g0{bUv$>ssFvt3r*4YPD%3QvHf5wnzV0a z{;!7RpQazf{}5;Uzkl(!4e;>|`Th#xCqE=rD+(nK*Ha}r9bnD8@ARY* z+|z{BrKW1keSW+$<104?*xnnDgK6PCZnn>Tmdkx^Rc(r^n5+=gF|M(?a1<@OOJsMm z2#dUaofrqU?^@_{l8SMt7iNH1fk?;KKSAewvOJqDbvtaPTpQWU?-CEb!6tnSr8BRwiHa4FEu`g(&nF^CYT04v2|{pIT1mJJgMmm zZg-AxtYCJiXT3>KW!$z{XEiHuyFHysfm{SJ@ z)Icgl*fKhrL>*y9{|J~rFs57d4);pLO3isF3lTQXOZMn0k2qPo%s%iUg_pooLu7cK z+{ZjjG=Wd}QW(SOkyaEzPh_EPNNhIdTb2C6=fA6du>TJT^7r$14{&z+-(BDj^M6U{ z-{=2w(!ciqev1Aq|DX3i7&r0OGqGpwJlYiMSpY>M3SyI0Mrn1Arv03aoRGtYO)TbQ z1KpP5+Kf8<9u_6~R~jUmukXs_+!Jps$64i-AEHe5gM))x9`sCh#5-CTjuVc_j|E@? zZ1;n#_fNbCRZnH`fO3;}B~5NDY`j}TB3*^%Lsulr)2kd5*?`^|EuW5G+FhT3#7Y%u zjm`o4r-=KHn6b_b%R0(Xah>fZln4_)c|l;Bpu$6lS9wBQ4xNpNmbP#V*aR?a0X)1R z(A%qg5OLj4F5QKJpP)Mf$Hz?XSgDVwxxTw(JOrU5UFEwNM2~;Wj9)!NR4T3-Jh{}K zgnp~3YjD64U1w8-7ke|RPbThPSINp5;?JX>5AnkbEBJUWaj6h3l!}p@Q|~rS=nt0? zB$yVv;nhK%mbs2x#qfYDGxdOV4?G0 zacnS23~MJwMaxLOS^xObDl|OUp~#g*sC>XnCP@cSQ>%Zo%MNB-l9#wo-H&+o@$`}w zbk5cmai`|P=prB%lbBs|C9V6DOu`uwc-B_qdRVsGrCkof2t68EF~wO|VL$K4)pZp7jfG3Wy}$LY_r!XIJhJ z?Laxv_bj1XIL8e^@;)=2lR?w@+f1g`&}IS8n*e z?%Ie3B%7h}6}ES@za4@9=;ro=`R``$=NI<-8^9muKi|!NCBVP-e}0PoEdEFTX5;7d zOm4Cc=5Kb;A1gjti+^}43~OhW=ER}~G2yQ+!esEJTnwMZylcI z?0G@%{*!k`Q&uIOii)n{uB-QtKYJ}@^9iq!cI`$ej;-!1Evz1X0IHr&Ho$soz8P08&Id`K`*E8fGi#nh@AV{H9cLBf+{$CJ}&pAAjxsu!M7lx9hoPi4poEf z$+J=Lgu!GrnJPvAk2SuUD7 zFS}+6eOerrH|YXjvMp`Yz;RJxa$KF>8V+BTUW|M&-{O^@)hU)gY2Zqksvv%U=%Scm z=#5eJyY_ZqVK=?a=r}N&=M!@F6Il>ahSsirHrxqt&vz=#M*h}>u?&i`6uJEXres1e z?CkKyA3e_nJHWyx{7GX!EMo{!wdaaP-ke#z97=kjPcf8ozVM;SG?76x=R<}FHoHE5 zj-)VEyg-trSGI2#tofcA8lr+&isw{rXYqga@y(nMb1RcxHUBEXecRR+>=?`vq1SOx zUJh+(d{+@WbcG?p50uocJ}Soo?>=lUfiep(9U-Bv1!%MB@Jd)+e4rCE-Cz`R9eXa9 z*tRSaf;CdpIZXwXxoE20Mf z;of!8<>v6)GWqcmfixT~(yZRX2@wY*4!tID66$HF-k~CrAEu5;*-xwT1*^?f#OxF? zb|&qvg;~KjwJ!TLF+uWFQnqKEg*O$dm@ zl6hWVRc&Cyp40*GXrqJ-wT7&o8wPh7Vf_v3Uun=&n-GgO#G1bjJt+9Wa{6vM;3h9i z&yqT5@HXPf`cgSx1O@0&^``aN*nXdBpDDZpB{1jw;glp zW{%qiX8uHpbT-hKwu&ak$DMb}Ms8JKeL=&T6#7YUsO7;{AROzPSRgri!shpOY z9XBnu*n_zo_~IH*WfWX}esIew!3HvJL|oWUmK#qIEb{^b&*e*97bOzXN08M%7O5?S z*2Xs}XY291uYkg)2v$FU(&$sfKl&0*qRf3}`g&Li2K1WI=5SL zGIA_O<%YX z@NNG;e@vNa-nw#i&7f=^`k}laD+&U({~LSf85Gr)Z}AS~*o_DXs5CY~l4MYn+~kZR zv>?!=77?(KC`mFR0s@kR1`!)1gV5>8SOI^JoMmrF3}+s39PY-da+JO&&uB*~+j;kIe{$A?~xcGq~P zS4pQ0;8v^Li&H1GSsCVhS1(~t&yC(q1E3EVxj{UR#=?||)$Eg}1vedI$I2^QZWad3 z+i%)+Xi^ju>aOoKka>I1roL-ltrY}{)dk0hcn7effqpH758@A7Iz-kNAK2j z^+^ISa~i#toa4z8UxQvv+3MCyOaWPcjjey(-0a?|fKY^Frd! zTWu`cY*etQRVJ#6IHnfMz(ZSf=~OFb$8sZf{({OODC?(Pl;rsVYW z&^K0}?kLI;ed;Jjojqgv<{ykKZ^>SJoR7y3-l{+v69|O7q9PG&yDiO~J9jRB^{Law z_1#*r!k@OsJ2U_~N8cZg)OFP#t^8khaHRhL|K0v9|HVcBe*afY^w<9H&(U9v|G@FT z@xL%$J8IZ~xvlTOHz>>Uc}~7R%V4?3)vH0{9Q~na=<&Wd7%RazCF|+L&WJRlO4B@nWkQztkz1bGJzgo-j6Ve2AZ~=y z?OL3+?}L&Bzfmt9TwM3MNV?NV9W;I_TFsUDrXRIr1wHsm;I%@^7rnvu<Qv!P z;<>wo!XOk>&?9RkE;G3Fda-r+&}&SUZ7IRoS~~5Gr#T;Bg&--^#MWq)Sr$TYZVPIj ze*NlJa`)Vlrk;38=a|>U>%_eS?D>~&(ZQIhOgg7IMjitxEncyzOiz%(hm7&(HL zMX)EiFM@c18kMF(rt6Ls7l04-&@BCWlI(sLz?bs}T;kh9{NS+VJRXda;_kJnwPe3O z_md^$hjf8_t2R~UTLX)mJdICKrEljpzNv|)TqFbC^MfVQswk&-D7!Ws*T89_BdkjRe2oz_XsGyb0wqP!QWvv?R?r%0hEqw@T-!*2a30k z{k6|5+!TN0XUl)?hUy9|tsg=DZEqu87pXv9-A!Xt1+JC_T-u^QR+29y9G|3RdfMHd zK-&)b3KST4!pj!L;Nhs^Sjw)M1-idV#vDN2@8YgO?Fl(8Ze10vH3+*2V5kx$=$EZ! zA0O5NyA*{8B$RL5hCgRi*)rwQUr|BL()BAIdyLdzP{?YOIuK{<8Z6q&-XEp-mr_!S=eCQBKJjt%=mnJ`3ka9uKUb| z+C(4&8M|gDh^Y>~P%1BfAjHB~1Euwbg*nKW+6zxRwRC%?nT=9(%EUe)clEQ_#qfaz zU|smBq@uNk=%x=w5jr0+WO8xDu{IqGJsNY%yS+D61bkT^;W_hmKzEC0AtqUB&mkv9 zyFibvXM*W7hB=|x-MRd|N*IBiWb#@-yC0br@vLM!rLa7`ch{RN7aQO<_ex=SP1tm# z;N=8e*v6ap){zX4xz1nh<{nT?{nY(pbut!DtVzzoLEQ$G&@xRo_&UPWkXTo@1XsV% zPszvc6Jzt&sTKx#-`1-M(O+Bpc7b{-seQlAx7Y^_?3o-_!qJ$bTe7|DOL6 z;=l5rpQ69o{15W^!#GIV$8NK=En4=7F4MxGAqr@JrOtXbxeaZfPTe_sVcY{9N11J1 z4B}~6vTAOM3XH!bNJ|$E=YCKYQT?Fb`KGgfif30E`RaM_aHlQO!=cxKuLYXFr6V#3?IpqKA`-pBN&^l0@*9(Ubv)gR6Etu`j)Hl zr0$OMM=Ccda)A(lDozYGY&&jJJ*rwe`vRUv<}!E>e}!wSIXrYRX{|y4YqRN1ZR@|T zzR-8dBXtUeI~Al-40?80+MC;g0n@Mb0PGjgzR${+1r#s5e&=`JPgpfqR)EZ`(pFf# zvWPB@LnOq-XRQdHegzmsZ)do6`!rchT*3=k0e~6Xi%Y@eZfAp7gt>$9qKF*C6~&Tz z*=qUGs4L-0!dE;-cO-S$%82T^)Sy-rS*Ij7nBaBAm7ig}>*lA#3==BCsfx=(Vwf8G zeZSMtU3$d$R~&R*oa&{Fjkto;=f;BhX9sB&pv5N70V6wg9@~l9B8VH3CST=}SH4_m zOOLAH5B)9 zec*kcjXxH3DSaGCNPZe)BPlUN5;`;AonN4MJwrBG)>|miJI*sO{Vky_W^QSst?bcI z+!@WzzONPm0Xid=!wvf+3Uvfd;|f>Vv7_(ezr`wk4F9b$7#B}VCp-H)|L6elKjFWq zjM#VcznJu|{O70Wuf~5M-{1Ievri%^fDr&&08cXad#gcXlw25)r%mEhpqI?qu&0%P z+;1Ke6aA~UCjkAvrF%|Iq^)=C_6OL28^a{CIX)8B=lLor#5kQ) z6N5i=Q5fE7m^WA^RfCU{q$I9DDFEqy&z4m;NjX>N_AR}xFon|S&IMCpjF1*2#7Tf?2@;vD<%d=7#O~Lfqv3OF+|r} z0O5;r1iXc0VqHK7`zOCR(4xRhJS>5!LxHKDko=Tg>PY4^Ysb8_g!bD&z(QmGUc>_9 z(I5K$9a#O?{P*{J0Gw|)JN&u+huC-duhg&k@8{^R_WgtS|2Y5uKFY|DtrZt>7+7mz z?EyWYALv3{en~|q3A*~~Hjl_CT`O0SIb5l_J^Ctful$6%+dlU@#>V{Yklb7;3B4Z4 z=_@<=uoVAarU5@tIQdYgk zO(X;o7rMxrnB6(;$im?|L%rt9^ai8Zg+2o>=ZRawq3qdZ$OKn>yg6bm-dlqcGD zL3IgJ^;(q9Nt(kbkC~YUVF@Tf7W#0*&8XolQTKHCpiGfu`~C`*dlOTTWOEVL3!-W7 zqj=*rT}n-fZ+z}nTGwoPmIx>ZAVPxi++TyZm&l7IHhT%iDLSnhIYtvFb(Z!uql)+S zB6FI0RUY`)HfnmFm;zHYpuW1E(^9}5fcH64z z-Me{CE%~a>?jg`Av%7|}!Rq&`r~g}~wI8n^%YTgZKZt+-5BwKBx)Smi|9^u1s{GH1 zw}@gg2_ep;6X2*Bq;Z5_08Es4F3N2U}Qwyk}u%DQHZZ4md*%K*n)kx`Td<)pJ+w&G=8 z7gwmmn+m$;YzWTywi!(Op>z#PtRBv;)O3kWI9U%Tnxd0Qa1L&okbO1e#1uirpQy$0 z&G+*ot(;`Eq>mUU!#!&@HadzA%N|*Si%L00!1AG`s#ImNY0P=;hA~!7?+LVIkRA^F z-u{?l1$#n=9l8Q(CCMJZK^F#jIOQ1%EI>!9g67%A(~D^g#T8vOc;g#qSNUP+is4wY zz;~$DsZuUyNp^$c!O*tftOQ~XAqN48dj|$WEJ}qYmRf-8#e+tLCW!6dTnNpieCIkO zQk9F1jz;k-OM+I8Bv7}H1Fnf&@{qHsK%Tg4^43<|4^9;{u((;EhZ96grlxA;RA1(2 zhEH0woYD4ipR5nvNc7apXRz1fY3bEJ>CnY@y1wVyh^2F3^)c<{7#2LE z0@m$IGlS!Amby(hve$fjy-s4uZ6|E2v0~msOVETF&OJesVtK3rC?^cOI!2itVGj z2og`M&M`P}GHH+U81IZRR(#Z-)+GS~US|}^7PkJX_WfJ>(dR#p9{lP4pTu|l?_d3o zpQJyr|5yB0hW!4K1^g=*FZ!d#cT>aIn$3T2_1v3XLxo+a;aTRH7;YQoNHC1afeAs5 z(1^3Jg6Xgf3&e}?$K~3YWhEn}Ukat)h_k?v1+ebXn`R0`++^18}5 zeAWB&ocHJLYrw$6MVe!(V@7f9uKV*W?rw&6e*4D7ZGj|8f)MbqJ0&| z6)gxY`>2HZ!Zl=hM%I{qEQ0Bw8k3X0CW|f;EcQ;qsih>Cq(xUIatF6DaU3&#LID_a zma^W3he(T`Sc-jv)SlOdN0AAgm;RuJ`l3!BhK=IXI^2k`L8nENBu(SJ~F} zKkQuzd=tg~NA8CE5Ge5Iw56r3O_Qc4>1Amtg+f7Yq0nxUZMt-`8+JE6sod}Y6}jc` zVL3$PRul`?atb0MAj+ScilB1H4FxQDGrP&=PK)w*@BfiabM4OjX685F-#OFlF73v> zWWq|FTK?DarCLlROh z88l?ojF$T0kB)rNZsLt$7na7>yOA6jyL|R;UF^;U-&bB)6c+7y|H0|XDlq*-MuRlJ z-+b%;Yf;;l)i=Ap{Kwheo6FNQCq0HA@!PzhMBgzD3-B3xL9wrA@RWpt=(eBTZ(C3?pGoc6 zd9?qU!@CUB#e7A^v`;p7>H}iutjtWBdA=b*?AkMDclFEH%KH>dX>?}6^qVCcrbLgP zcrx9uVUym!?nu6!@b>Lv{l6)hx%i8;hdsLAd$*6r%6)C`pI%wf=V5t+@!k7=)BjY( z`tfyFp5B(8*s2QM`}Xf;OrG)YzZm|^`d^s+@BfF%!(QC~`S~3GbN+uvv;Uu#J1DX3 z{;LO9A1RA!Q$O)ak5(B~t^TNgYgEL&*MnQH`e)-)!9kz5dUxU(M{dK72*L zb?dg@TvJjCgW&p2v?% z3of1sR_AVd?`-b8^zx&N$EFjyga9Q z%jnM@%`^sn@pBqOKb)%mW#Ex58%ie~t8X0HbZp!GgFta06XRNjb$R!b_LyI}d~W&h0&4mX4F<1HeMhsRbKahVXC_oJ zU3`k#`7krDbzMKd{kj{oeY}p$xpVbhucJS_uL}c<8~82#Xy&h;4LW|mADc4!oh59* z{*X2wKFn>jw)Fry@#M%`7d-|uB`q^|H2xh_b=Wl>8<#i7C+gF&&1TV~4#XaPr^}Bc zuD1Q7^A9%``n1pbYP-k$o8ApNRaS>jPpgW!)Z@yQ9~a-$pJ6R9+5SqHW)L7NMZ6K_~>!{a(d#49o&kOmy(^UDVbFNHW za9?$4P`6`GA`dm&vf)aOas1B`b6p=FAJ_6-e5Ka#OC+X;n|=- zAdi#$H{|~r=YOmaZE2&%{Exz6{Wo0x;`hIv%kiJu|Gn0d|Cxt%D0y^4miTDY@#Ttx zw|fl?UAz9Z@hJOKzc-)#38=^B%?asR%4dIY|JO$xPMfpna>lnyF5h0dp>XN;)7u_L zMaPXqw*V=*IqKZ(2g`n0b|?0Rq|V*UVN<}9h1&zXS9uS)+3eoKn1E}!Yc@adyEj9Y zdWl*+< zK|eGdlbrQYhj?$VbGO>uTyne8_}beO^qn?#@g(1xUzXh3FYD_WyV6_lVVgDncG#`U zb*rWhYI=C8_HN_7ts3m@|N6~0-aM<)v~hs#-BZ_{BK{V zE^6B4qW8vS9^29nU*Mw8(No!1n=dbGzHr2`{f)oa6wskv@$g3t?w8D6?WO%~x_8Hq zFLXKAVo_fE&LyX_#_#aFe{Qfpx&g?t(7OFQb@%HPGc2LS^1$}&DUuty>isfKx+HCA z>BUE5hM$hwb*}uS08>D$zgcHHm8HJy|556jt@PvX&Asl~rtQwi`I8r}yP7rb%ZrO{ z?BY6f{PAM%qkV>tII($BctPL%(4k$l6Cba;?>VG#-(kt$|I0J$x9ug@io2!tR}YY^ zk1O8%VeiXz?#Rz?+I`^D&s$#aA4rtW*gN5pccbBL{bp3<-KVElj|%!G{q0Hb)oXM? zF?9EUl%Mp0e*1!x;|rqO-rv}?>dPTaD&Bc?YL+GSbNrjKuD_n@GZRU}-!H0omizxib7|K`jr;!`{{K@R z7NK~d|DVV4zn1@b3Ao(<_jSXn@3`~VyC0p??Bu|?8Fh~Tadz#VN0I!tz$cUSm6gYh zWsh4Mwb%Yxy?krvPvZ|AykNwdlo;#jp0qgrM*=bSxbfYxQe(eY?#gyIeQ8IXRfT6a ztTqliKm6|aho2T2+h;DmH~z_L!l-?3`5)u2EdJ8iCf)GlM*O))71cQxjUOa^YOLp9 zRDI&m;5d&K_1^jRl})m$in~{q8Jozyt4esVd%iL3aKEaAhuj0>m-DV0V`fKG)7>*3 zR8(gDU|dpy8_SC_jO)6-(q&?&3E!Q3HNm)zl2_k2g&7kl?C0^{QSINkd?#Qu@DIAz zWNYw*!%vzYA2;vX@H%78mA34b_C~mh4eb3}mcC=1I&{|Bx^pX@l%v`E>-y@i$-f#( z53M7L@Q^XkH_y>KZ=)vp53|4jnrj$6yqzhoGR;g}jXQ?iq?q?4aJqvX@h~| zX?O+{O8`*eIanS+GfH4!$N-<%1c(y=VMT+kYH7R{=Te{pIfNlo7+NSuMNN~aN4^kz=&M*QRIV>TCv*fQ&B2i~s{{(uITfbPMWRA!q~_`=DJgbW2py)y zpJu42JS($M2+l?6B}IEhvnE^9A7KQJgdz zgMNCU5)8!|4Mt(XU=W;M=^&gTvSR?GlTSch3@reMQo)RY#DjU2%V8=ZD@)NFWE#WZ zYK|-v)iYGgDJcjQPUi+g&;Z5aG$1~L64)aNUl8(GhZVS=LA8Nl5vTPubQEz0fxx;Q zXjL-t0zF1)c-*=rC0vklv>u)aQQ$gTMCD)DCaW0@G7r? z0aXD+| zB!i}k$c7l>gP)qF$J{tiNKwNyNi6CXEtl5L2!+b+tPnKXG-=>?@fGYHuTc5H%B@UO zG*WJGjKdNKruRlhHsynIClF)R+M+(n5q1Bq^GI6^T)~fQ5kcLU0jG@rp>4^<3~P0;sL`!RvFDD1xWD3yz%&4R0X%7SRMa^%meG0@+jNL5nj3lbD$3JlZfr-@Zw+ zy0kZmIzpo%aUMMgqiESylmwt>Xy{Ap5M)g_bR;ZT4d>RtNpXr+F#raW)KfbjE}K9{ zj)GUZ7Q~XKiEuQXsF=bNg$)_LlP+IJcxuy3zp%BL{NDIOPFH~vBM6!M~Aa4 zk`njf>0cHZ3eVTE+NTK_ok|Ktn?A+>D_Jp*;i>&l6TGa&j?}<@+S|TAt0#D3&v?)h z1W&%NC`B0z#IHHHfibx)CMBuD(Zdc(Q38_0Y6$x_wX$IsLZh7P3+q6Xp!5dLMS_FZ z7wBOhcDbs|f3G28b5)n)Lu#w=UGVi>SYg+F;8e7x@LAB&@LA$o({V#caLF_ZXTD^F z;0)RX??^)+B0M?dqp-EhJE363q`X62=a3T7!%4!xT2U#4>h>uqR}r9XWn5=nH&o1h zSjNQS(2UnkH;X~HcwJ!~57shPOG-+z@8#1BNgfhqKdA1)2`5gxCC8)F*a?>N#Eq3( z;9T4!dY&G1_BAzSom}StZ1HAd40Htr?mAHt$Srfi%AP%YTIKmH+Q_nrj*m6bCQB}# z=F=Oz)yG8t)6U{61&7XlBA_G8gEWWWpp&M@)UX{rBbYsm=Lbn^Y4_Z)H>!L!J&LZ1 zfsJou(sa)2i(1`k#LretRQzFjgF3X=pR94 z(_$z2FU9sXgoulydAUR)C`N_`tsso>vT2XAumYP+Gg>@^!Z{hoz~17FjL!w2HMoRq z1Er4B;1DIGKSpTcLL!sTK9{4!rAe*(5D_lNpU6BjM-9w`q6jtd1WS|4D=^#K^t zruQF=wuc+^mg(WE0Gbg)S}}=bi5^@s&4n&=D%Vz7e^}B!d2HkGJM+t-G=_+^Z6pBM zWy|W1i$suH`4rtfNHW(XmQIzVc?hN*Q?=ANf|tXu&_Mpe2%pWNg ztYoosR)mL#yHs8&_Wpi^pQs{4!Z29CG&L?tx`e&!$lug6J{mUhO^us5>eN+m&1UCa zHqWogLYvbnPcea(A&2qC2)!yqFxkxjC$86-onFDEb&7&N5sBDSc={N`p2AZ^AN)fh zEOtsv(T0WL>QIXzv5x{B3!@mtVb1hx({hUIMJ!X>VG(j$o>?g8DD2dXV*u%dJnwFZ-Un}{9GtH_VT*uce8#!d zHnwr8v+n9`t*+b@T7|l-06iR?ov+H*5?|~QE(R5jv@B^5Ct9DMixR6~Sge( zMTCdh@BfN`mtXAvdJab{T3~~rfR7M5BX__jULxU7^G$d=SL$>wyE`WV~$oZC3Jcdq2r z2R;gDG)c*JX7~M#b|;n^K%r156bgkx6-lFtR3Yt1Ei7+c>3xaTtC8)-)}nYHuhXE% zD0(>29a?qXY;t0)E8U0MMAEJ02!_yX&`VPs2pSeTolb+y#1HWff}v}ejqamLLAEVVB!K`hws`g9l#?c0bSGXX#f1PnLd=mnpO3*CWvt$mD5`fIhzu1L|F= z`}jIo7wIV+^}iNPX48}JzZ&pzQh>I2via3INctdIKqvfqER%yS38L)lEiHV+o|2?O z=b*3F4@kQ{`Q?Aj9!_W3*92dv2MJ%Z57yee9u{1dqxr;EY)Ej)mu`%A^=Po@6*B2kgW2Hfq5-Fn6PV1 z34Qcm9b9DNL4GkGW~hY+lx=j^VLNK!K{=j|VSbN1R+$IIZ4n0Namy0mYPm&GcA6Zs z-{KO(bX(NIBibs1=yLEx3tt8>V;&__UdXe_LK#qL;Y%oVQocIU+_H>>k}WFSLgpTH za9&nOtv%B2&>k#MpbHO>fOVU0_j*xM6v-9nH)sh=ll~cPvgU0`QbxD4X*y~}AE?3p zAu2xjWxs*iMB{M#QxGkz93C4SP0sNGdAYHv+JT{YaF!jKZuTWdmQPY#6YoJ|6nrpm zWR({F0@Yp!!@OWG_vHpC+p!BN4D;L>V>vr6rv+$0?Tyy*L)7Y{i_)Tv*tQ6O*$ zp+*Yst=)4xDCWo1ag#Zt9mQy#iQ5r+9H3N> zVW7pXX-JQ6J>h@qRD+Gw))RfeQ;4&HsVn^+X}8$-C@hbhh8aE!r(JE7H72tL!^mlFFcm=}q|A|hX zbe=vuL^G^CgG<9TY+lOb+wiQ`-_={K)vsu(4jZtmMrTC_yskmJb+pc}LF`Q#*}5Bm z=r}j_h)LDX{2#D~O(tnll<4?#oJMJevFOn81FyRW=v6Ztm$S))11TO~VR(fiIxaxX zPK!>X-T1HMJbB9o2U@39OE?8~yhx9+tD$bFo--#ObtADU`sW?2+pX$lvh!5ig5*9EUG9egS<=O z>se%Q5w0j~-ZB#9Q?hE8%@!`l0UR1eDD^H1*nFGu*O)=o;TN601u*}Jxzi|k$e=t# zSrvt7zw<7+{No6Zy?s%t&jYAPeluEHz%KcA(9oU!woCIkcvbv@#{qn?QC$6jWMm}% zFiO4{M=wwckJD)c`!NV_z*kw!$_R!6%0>}Q@oe#3XT2REtcaehO@=8F1BNjx@mf$} z-ih4xpgso{MSlilyfUj}{^Fp1Yo^qh%Ud7p25fgQ*arQXOt z1@=dlkx6t`q$jw(fDp{3Z&($LBBui?YUoBnefei! z@z4GFJpT{$Xr3GThkh2t|JvB_@;_`o*!=ci`QQGKAL7%0zjYh**fTmDG~TDh}5(w=*^X|Sc+$c8*#^93cJ63;fFzQ0RX14lI;`NqCml}5_&tbNXA!%7j^9&z`d z4OOKO0NuS&6VSbkl?<oKPcH2r)yOeSTzrGL@>atH$b;q70A z{dEwL$AKd5V8gT_?>vnfzkF=mvIL8)hO`phJ}L5lq+>Eewv=7U{Lm!D5zSJs5l0=R z+wY>v$y&E@3BY)ijTTgip`r^W!mloqCgpqdWoRD62XU(rhw3Y;dA{onWhYZVpX48p zAIZNYqX`{$YYX@t0KJ{0{VW;6r^5II7=wl4EJd#FbWlt6O-XfjUba?^hCePnDfBS8 zQmW`&IZ6p~>xceKZCY+V6j-3cbbLBJbJx1O2c>r1N6U=wUfuZkZmf2M_)NJ{c%BSr zp#i?d%Hh$}(c~%ek_v*FNAxIK5~v26!-Iny`+dm`Kt6^E(iKatD;6XCfs0$ObVq*3 z$IFhuatNA0zGxq*nrN0fss2ZK zi0(wvMaP3)$5}Ur9|;ahoI_=B-eC)H=bXZ>=((JbdAt@$ENvOTRcQFgv%wp#6wCQ| zI&Op}?;1J*PULJVcKg7T8MM7Z!KT@m0eLl?^{KDTfne%aRAK~;^;Z0qhDtXMYx(%| z25WtZ=8e_XIzs*J4<0D`D1G)o3Ci60#0vj};gQeOXAh5{%o`rRky|u8D+d5;&%eeI z248^=)J+W`>S$nwf0keTm<`gmj4PsJ>bPWZD~4zxN#TgA5OIXJ&{w993TpP*jG_qe zD0gJ> zoEez$49u=O1A}y!PQMoU0r)cHXB?KI{WGq59m3CP;!-_`#vGEDO!BgxIXT z>;C@_`RR6}C(3zg0Qv*_Pml5v6TM86_vtt~f$buaFXf|+&V$Yd{NKNmH+EJYW%{Mg z%8GIi?I5qHdQf{?P~khK!raC$-@e$5zN4m~Man+(K|EXL@-cHlWSu#$eA7;bh6&7{>UAyb6=fAz^DZOasSMJRgF`yP1^{`)Nhu457EMIWHU2>%C=rWqUnF>H~2nt&xAaCZKk zHd)|$bQGgbPK#u6hB3`B5f(;Go~FeKhBrK(WkWd0a0|N1IGttoZNm?le zQ8EVgs)(AyJ)p5GNzKb674y!Ubej|^g`HH$p*3l4h|o9 z;CrGU4dPUUx6?I6CRi9oQZmJ6&=hcs-usC6-oqi$p~M;2fiO)AjKzhevk8%7fZ+@& zdu;SRy~2w(#ot&9cBa!astw%$$6raDM+5bd#=N8690h9tUDQeq6_#b16#X;gKmD|V zD=M7tdX%CUXiDCNy5%a_pbS;PHDRi%M_==xsVX(lM8#<~N->3(_)#zNtCf!MUt0-y z?-?z}4xAD8vQdToLJz!q)yLY~bxqVO?m!bRkqu$RPoYjZ$>I3Kh}NR$H-b%~)Pq~H zk&YO$peM}=5x%OQ8L0`3g~{>okz2%KyENJKFbxO3sEm>b??P2M1Bz6rI%p67oq&*o zHtBf^%uIM7%m3F~T0GEUA6El;7W2z51EaaA5a9$MdTEs?Day1gDU=?38H4o3?ObHh z#D2>&(E0`~mnYp=13f4HfXfx;4lQM|BbSbm9p;f>jcnm3N%f1#ycqPWh)R@OXF8hH zgP|J3JfF<3q1TYDK`ZQ2o4eC*)wY}`Zwv(a2K~M}ZuVmPa zOj$>-u|0g0rD*|!<})0nt59b*VRZ)X*hOou8+zM6DCdDExZAvsi3G1O&6 z{#2=H&(x--`9zgrYZ2A$^Knx>SLb~Xu!@T(WL5#o}CaB7ax z^c}leY+dKpk0q{X4=M)F9M}TM9)-dB_%X77SCMw0y4^2@EqSE4h;oFVFNmWCX!F#g#;hpN8=c%}MVx>IOjc>N^r9@`9ML}$EmiH-LLP#1 zGF~z8Q%QG1oT4u|A3k6szD(e%@Ih6$1G;Lyt`K<45UOT8jzWdhf4ImBjixKL*$#(i zx3|Dm7#c61%qGzwO8{GXN?N{WT@Zd(%#)Zy8#g7DOL@Bs*{>_LNqwammfHcaE5fb? zOLJrGOnP?Y7o3R`SORcl6b32BKqXfPna?oM5Se&Yob==T((X4fofD&)rqkC{1t`|- zDtnmvQdRgh)e(Z(O7RS;se!>|BJnKXjXLc>!L~l*P-Dic*|b!{g=2;qJ&t1bqScQF zC};$nn;VbfRoiGaRz9;2kBjc3ID*q!+*;KZJ{;XoXaj7<=EZU4y+aHez5d-9A1Nz> zk<9GtK}jx1FX-8Un0cC5@j0@mLM-yn@@55UiII*6`cNBpDaK+WUR3~B9ExOa zYaO#K4B%6ErMyYu7?bKF5ud3eeR>s3f=`YCn)FA5HZ^GT`Py3+`k8f!r!S6+rd<9@ z_t3>}en6%C{AJq~Y8bG%8nDGQNFLh1HydIy1kA`n zy!~U7e{XG9%Yphpb+qh);%RCkGpetxR ztTk3~Vpj1N1vwj+6LQR!kUj}JhQnkY1+&tpVOHLpihn5fKt)dI>5SkVoNt%Ff9Icr z{|&luEKNcy@K#dfNh(~ZfEh+`m_*u62Mx8k!_>RBX;-zwb;|Z_YqID+!w<5S5txo8 zeJuz(dc*+j>^YOyhmD}vV=xX(Zw{q#zlRYhbQ|0gJ4`Q%phfOPut-%<)jA;a$N@7Z zE%|opD|3assib)$w5#BxQ>FZUP%KuiwU9UV*AKTNua2}btAH087tI!^5YpZ-$%jKq z)_w)Y=aC1Y}9CnXe*3dd=nKr4_r^gR-YwTIL8bh>EKi#e=}7^V^(CH>W+OPCjgCR}%1)Rm^K$}6Lri6!t*@6A#WAwC_iW3TFh4=u3-R`d39In)wq9FEmaC9H3mH4fy_A#bf|cB16jH)lO)u(Y`YZ$G+9!hDhQ5D zRo~`{)!I$>pD$M@=e2UxjOzu$y^7`C_fzfx26E zCXdk)Fn54cX!VQI%A6 zaGmerj|R8e=?5Y43$WG8bec5HnFB>pjK9R%BIHX0UM?motRvQeWdLj+iN(_CbXvxQ=Bot= zdl#WK*-^&fsMb;oI4jXnYVO2w4}tai6jWi5e$tmI8FEZS1d4`K<-k)RppFtl)84)b z?4?ErY^(%Hov{7&j9sgBq#W|cg>xwfjPyLUBnEA50;McF?C0P>#>TNl0K?wk4QwZR zq0)3~gJ)u5zhIwqw508YnXKageQ~0-SY3{Ip}@p;lT-;-?tnb4F!(#7>3~Vl>0(S_ z?h%~2G?PQ6J%JZ{$7AUV-k--ZLfY4G3=?x)A_#``>aSmpwLuEyS8Ai-kc!aR1BieB?rZ;nosOD_y*Fv8rae0JhV?gPD z4m$X7Vm>wkU8j52GQ%wFf#5yn22cXKn$S+aJT*9e?*Ev{Atk4Rjy)gak8rCzrPJt( zfe_m4Qf2*CWnJ7Xo^mWedX7s?y)&n2>nNd(hCV~!e`=7|&gT{Ummy6pMb1*#J<(~K z_UA7Od(qvU>4d@AD?69m>J^MKPVmhne-pa&(n4Dv9<*W}J}xmC$)D*cLM3)OU% zuuGd7JyI)02#=>T2CJCboJ{y-}0>Oq!Iq_?(f!`F!tQZ6Tq~qdRxxH$@sC z32>Qlsiz}8z0RN~UgKnV6*bwxSQ9auwtP76DSf8mp+G-eegZ1*058@SR5=YhFdNaNYaAK)L)s6S|OJr z-X_SSh}yayNsi%(-yibfRiCgUdR(N}Kc3JI$nd^L zGLOf63Eej`ynk~U-oL&K@6VUv{n7sW!;1W7*{66%7CK#g5eewXz%MHftpm@(Q(_e0 z1Hyofj!*Lu9JtI&vTGewDN1gwAwUCJ#!AhuhWI~sk$OI-*`VTV$TH>59kpK6!($Q( zs)dA6=DE=Z~$1 zQJo>yGiq>(Jp4;jv^1jz$F3Q5F`w3TUCXCVtnivQT)1ss=zU+`uWXAlzzf|FI)vZ0 zaK7J}VAu}!n5Kl6+JE|tqaG;hKBI18A@J2VLUms-xseq7MoK*hHwZ>oFlfFFBgr=$ z3dcfwE2=b{jo+IG-Th?kA3JOR&-&V*4_8~wsM)#O`q(nQ1vtq#3KbQmNLxNTA&JbR zThzYIbq8NvQfrgdGi^ul?G2$<>Qhai+C5RNqOa198%Ob~I?1T4x9ja{D)QB6^RBvW zwCWx|ZffhbEWp*wM#D?|TLCyjI5PBAZ9p2>~>e@(CqxJ^?62nA1K*1e8WqeKKWw zF+RP4$5<=$4hAF=;h_9b=%WxH3e9+*+VsAmRHronK_@*V^^_XHU(r5C1wV|%I0EM! zIxxoE&f@^J{G~SUgxHr-$3CmrD=6HGemX7Q1HqZ-eTrwH7jK^OD{FeytONAy?L0vN z-BEDxAf#A_xh5LHQ3fy9=(RNk1C9EiZYJ3{>SslNHY%sd*svEq@IYQ6$6W?Mz>*;u zX#g|zwV8HKJMHMs__&;Gw<5d_G9V~?lg`42C+acC4|WRX`Z&}gJ)I3P6EMMRM`ex= z_Ye-9eAry1VVL3NQ;^O`34BCuFAa%W&bSF+HjRM*v;J9>CMBjLWXSm7N`>m^L|ZKd zTSrd%AuW<(5WUXE=A}Qo&B=G|H{2r1boiDWq|G*Aj&rbDo^c*0!qQN0ikEh57}Hq{ z0Sbo(>-H1iE%YhK=$1;`E;>$+yW;`*s&m&08zc08Nb3Q1gaF5_^sTP<22IYDX90MT zo+@06bZAcS6l!6>YDO6tof?+_!`qJPj44L9;`$Q~$s26s64!0LE$U#~$gQ(G9#qA+ z8n$wt1EE2KM)6~wlp6qn4GkzUnw5(P@nYBGad#Xq~IzSEKcGqwXmtg5SKq?kGQo&RAKq zl_osJ6I`z|uyJlJOPqOjGKYlf$xNkO57wezXC|w@`tte%(v3K@O@g7Ow98pG#6USX zX=)#HJjtACL4~&$y-Yy)8)ailBc9f_gR$UV4+&CT-=`@#>lFBERLgt3`a$W9QZc6p zbwnQN$)oXkN4({JC&uFfD1T^hhQAz>XkeBRlbvbvU5g~49EK^W0Ej?Br-=>gFmK*8 zG<%YG*Q%RH^Q&W^4)BziU#nbtvT4;tXVnox+Y*4kOR{$0g44S7YG|qh#|N74m-vi> zv$^54qVUU4jMBt@WgU0*g_H_Otw6ci%i0G0);8-gpmf^Cm8X&FHpoD0UZBAbo#}SH zi7I{+Wn}s9rzwmtQ6|dLrrvmdOel|b$#2s-2+*KQwiH6&80c%npNht-><+s-1c~;hGXEkz7)qi%P+>u z@XVOwm;8%g=JU(yLVkHvXF;p=Ls`!LCV31eU-KBE6q4tS1~s9yeCjoUiOx~`yy43+ z>W>`zPl+RnfJv8)s<=#3*r(w{T@&z3o|0?AunDeC&;4L1JD>xYGhuq!PbX7-JSxxf z*>FHn=Nizkb8(jS&pHjOZex^xJV%&9JS~_%;9!8i!(g65Jz@T~2J9@Lb z_sg4~TNqw%_vgLcH)Pw_FXjvvNDIA}VR9)`Aek$2Aap_SRqkeC-Ba)_v)ArNpD}4v zU)B3{=grSAe*R%AdJE@pZClcK>7%O(eaAruBh}LUppgl;F)TCD1_8TnPNSSnRIoz7 z9Yr%g$?#0nna@K5S1@`kWbY$n?3AkE?RrlpuFG9j=DPPi%EYD#eE#vH3ee8KaGY`e zokNPZTI?2KqcHm{bT`_2_3YJF^gO$?^*~V0@DWn)?Gls_3}eYC1sK!W$L ztMce;c&$uT-bEqpd5-@|`-rQ~MUhutIl^ifiglI!jlev6_0omo))9wnhsj9nv&15U zD~u}`%M0sb`fQpukIm;Rc0r_C8#t=i(yEbXtt^Gbpj!hmMk1%iojapnT?+|CMW2osmFkkv3ZYipCauc zAHn})k_y5e4*iOqT;b!iA~QgGnf7PXlpi0d{f7D?jENjicAvj`vx^m+=6W+ivY73L zcONC$!bsv%isV=Y--bhd30RTbX>tq)S_h8G1tFroSVjELNKOmUr>a}q|NLe2wtg9PzPid3jF&rC z8T~m;2kF4*pV_!C?l1AdCae?S+S*$f_L4g-&h`A=cT7`Y}cc!qV4|gL6~Co z&P6v8XE7UgT>Ht`$G+-pqc43~zjNZ)wj|8TV__MoPh5C?1!_sN(n3O+7{hajbT=}t z@H$E#yCBmAFkpLy_ewg)Nhp~COG6!Mn{2V_0htC7P4KZPWuVFN=x{un@^PV3fxCh# zdLz@X*)et!J!U5eD*m~*fR|UzgE#HiMJOhrdlEX!2Kq%cOjcr_&{8G=JkOkD=};v; zQD+Qu1`zX*4N8@qMoh1XOW&cWliD#AZ}`XgIMuiOzP~O8uLxa)5KO`gyW7tWJ9G;^w95h1vScP(T)sBf)tT& zp`iNqa%4NExXfRQZZODN!cqOGfV~>DCzTH5_$s22nt@6(Py>e}+7#AK-SH|aRKvx| zlok8gz(km#Y}ZY61k^Eg73+&~hEI}CjmBF;qKDB0q2rs1Cb`5BX;G|T=D6{I9B#~d zS{}_n;tkc0ALEW^;2=h~8M3g&2XXr###iPCF-E+5u)gkDLMmfKPWOg5XE@rtB?&OM z1H`4$f!T6Q`Vk%=hOr4K$Mf-tzj^-r+4HCC(wRL3Jld@4Ytn>wtq$>LVTT*l4!_#W z8s|ylsV^3e@Y(mphY1Y;rOs1-vq%5uG#}(3qfpF6$LSPLBK-o6CrWROE)w#W(lW({ zh}EIHFicB2bsmuLj*ih}l4JXvldCWPlJw^9NDX3B9NHylAK#h*z)8szpG~Ket!|f- zkAZYNO*`Xs+Qs0W@6)17H`SfV+2k?Ox;IDxmEoNv8}v3F+<$O?{oWl)B6&m~zW@IF z^*eBu8uY$j|MR!&%Jht>N_*CggR&cqlj1=!Cv3cv5`e>Y18P4E*Yxh}8!@F$6**<`y-lQlIil#Lt8qied>+9GDjRQM zuaDwYU?Gh5jM-IVNn_w0d{UTb&sz-W!S1YjheW3XCC$y#UatQ1EE^7*0J60$^#BTU z1zb2Bk_kh(Pf)dgzs0+UUJ-$pBi_;|on@h(03A_qZYMVrm4L!a(XiYiJy!F4q;vzu zn(dW#*O9*b8qqBoRaf^x^v&$F&Ye&uymfliXdmhx$~a^cs}(&11JyR%Y9iB_Q*G0& zh8kd6RIA-{s}*TKo2dL)vf6#O8hZJLI(^_)V<+NjwQt>OXt4(2lw5h$zH_VP!vTuE z3bgNSHF3g)IT|JG;x<7$iWgA@0jd-T;)NJ}S=Gx&XC6i_idO|`R%7^^UgF6m1{lHT zNO?e0L+;aqj~&3q6#YlE$qq3Xf}QH)0fS!8ZmAFX0EcYbC!d!jmRyU=M zN1-uN)ORre{_ulG^1`jX*avUCe0LLH^csk}#Z>NTOm3a(3 zBE_&ySwD@%tLqpO2h>i7paWS48jtRx6FF@zAb!eJ-z2JFJRyd1FMt9% z;r{_+FM$C6NEb>WEgfeqb7XK8LG*24rA}5BN&=&U@ir@QEB!&M+;dG1;=y((%tP1m z@n92*msKt+DcK#y3cqtFs-~iwiyx<)b5@Sk8Te@}I#9DQa zw(48e_r2;t6#Hobnk>cYBz-TrH0+eo4HYa6mD2^()G@ILf-2>hSB%nC>A7VUvMRp9 z;7_Ehg#tPl{&x;2%Q>HfVoTxNa<-zI>SaZDD6RUao}L>@IuFoMJ&c6)rRIsbqZCTT z3jq61%-yq86xFOSH~uXydmvb5ZI|w^BLy4QGBYMC(&Rw8eP$u2rsS9 zb3pvPxiZBoEHa3~^h{B<*d45tc#RewsFb|oFn#G1ubY4wN#LejGis)nTj=jRZkfD_ zl;}|vpQYL9nFo)APs-fZ#(xB#Y@zs0WLTku{)2m6E18get`)+YY8l4I(7z=JtgD|6vW)FoST70tc z%)R*5gnq=h*>QM}!_?K49Z=9$9C?qj2EPOSLuEsEL-^i}enkZZT*)9rLxhM51K%I3>oS2O=u`D(tix;3HbK`YS8qn=hyCzh`8XZl^}`69hxYV9 zUv9L$UK~G;*W)eOFVwodDUyWipkB(+XXvZ|JKR};=GI_#c!g&rm3&R&c+|aXGRMby zp~PDoFvOF1%Vg*xkiaW35F*|pqR4FWPf3qlm`uKAHENf6_nD3sMZ|*rd`77c^}XnX zPS4{()=#FnpKXA)7}b2KG+v)5i?T|aY)AEW*6+Ix;o)KNu~!#$l*@+}F|1u)A_vpa z`8YjG&NI;1K_UJN?&@BsvCkeiXH#1)e;Ia|qW_8(P4ANPgn7$NmPkKXvl-cu>Kgdy zI9f=~r^*ZPGuXt91fuXqQ9T>#0T6{yV%X@6K4iWcqGyB2vGN!S&~B}UoBXGlO3y;D zG3@@%pVdSF_H=5SC z1!1N$v4KaJ2PBG}eJ3Wq6I;98FdT;qe9J7h^MxA|63VvnT?SlN8nu5155v5+fj;c0q{9&GGdO8#42zy|@*ae@LSA8+YP-HVHh&T;aOd`wrmBha<-ybBOB znCY?uJKz&bT@Ex)CY?1agmx4rsEPl*%=hMyUof}qRq%EIO5UEGggk@rkV*cTT z^m217Nkx9GzB~=Dw+x;rGnol4REfBw2sY;#X$TFIYu>1r>$Fc%!klL1y19Cck0*a4vUSIawecm< zMS&LN!aVT!A${M^6-g`7*uL|4F^$ObUh2dfrF~aN7Xj+o%78{-nvtEJe6Ha{eR_&{ z;@A~_nXSN+p?;W3$}Vs%SslE!Q6eEwT|VBJC+@fqO|Qgy&4!8W0pdW)xlj{e&|m{( z+_kx_d69U2PlilX$6e50dMP^rLw!phyHEhbm6SAAEF~`CT(VNjrw_}94YRycA1y=f zzD^tr@}`;>4~uRj>Vjd(2j;=hMMg&^}L zE!uMbcDTTez9xBb?h~+I#%lSZxkle1p?|NY%+!#ILznV9O4#)9AX#>NeqI%`Fo(hP z#_c2&nHzE2_%7!Y=$Rv5${k8y>t<7Wc>@yzBO2zsha##Rwh#?efIQcI`uZ2VuqbDv zjPHBZwPl&BSrC4nEErO5!3DhsqEOHG{Xt7I@xJ}MZl79dY`ygpjSqtiLK zL8-l>8=WqTA9dw4B#S$FUSMz8xhPU@#PSI{zG8JZ4cmVH+sVM8**@;_2N0J4ET6B;*_>+fl$ji5lKvu7na)z?rV}$qdHQimV`ae}Vw?$A zg)^>Rdgky2xthHoysS(HpvVP5DnrUCDz4=jzR-=bz8|L3K(cAh=2cKh&K6Xm6lbDN zUD(!XF^^M1nQ20UON}Uci=k+>pdX2F9(h_fT zQQH`{b@a#tfwNhyDz72W-BR~48C0%uw00e#17qK~-q<&m9{YyZ_75lZhC{#ipF`b^ z*3GC-!pp5&)H&|?`!$Ke;GR7xvU8Mh^!U7~9I~(wWyXn-`Y1oH@>!wpoYjJH^3ba! zJ8Ji!rw3Yr!%ZV36_?XmuA#R~&P6NiA(_)dBI+jIS~@Gz6ZCd*su0C7ms{=9J(6y#3iuc5^UjKpzCQ>>FxaFcGuK+f;x|2&g-dpH`9}H;O5D>s~<@X zsZO&AXil$zIOrIm-x0Rt9M`B(e$i)jCmCA;70Dih8n+_4ILSGuBbn){a-efgykGHj zq?lNrj4F9>UGC+JQBpJJHqxqybS5$FDDJ!fvSYvije`)$5OE!>qd6Zgfty%-52F z=(-{emHssXB80W`@_Sn9p zcme0hFyrt|lb94omg*-~`c5o{&(m~`GA(T3eQg}|;aF14JXXUTm{LGRW1G1G8krN z7w~TbZR88b*v+Lj@RT-b*Twq2>&kv%Qcj0QIhm6Msh6^S3ZtieJY#K`GJr+hkmQ@K zKn!!Ls2&-YwNcE~@t=pJygJcyU&I{Y;?M(~>g57?dP?jBLh{wKzz4wlTQmE;^EIys zA;Z9D#juoBkJxS8b(8v{_UF#Q!G9mX-v^Hm4tfU% zcMcBL4i1hE4!+si{*U&59^O^ef>jVALH>B#bH1nZ+H}g#_&Tt;WYZ=i=RDMzPVN29 zhLh`jWt^O6r|9vFERTy#rRZzGn1*?g79UOQ*hXtk)4!%giC!D3HMw6mDp~$2Igahy zQ@)PM9$IAQCXdNaPC!`Twgn9^5||p`TJ#+{_}ZXL#&?wr%hlTOzi*uoo#tj2Pu<_G zaz|?fAXIBp)LQjxDe7a7D)S*vPMxX4O{knisQdI9l)sLk;OB;$K3SVsP>;vMCa`4i z>9+$qG7%tDKvQhZN)C3}K8TMf4E+IcnzQeFojX7&^K+9(@Ms-$S~YO%F7REO>DodJ zI-O2r2PSGURol))VR9!`v&E^U6DOv_a>f*iEdvXIsOEF_m>9QG706NTso!>OfMvbC zx*jLEGWoW%NKeztiB+m}@|gJchMDl&n+-R9$f60hU~KxAFEYtNz>jWk;so5jXX_c# zinlyR^iD?oEsj}tDORV@XWr0m6eY81zJ?=A2b3rwGq?6g0+nB);wa_6Rx(5!CE0MA zZ#6r2AGaFtpGWY&hX=?wjtC9o?&lY+@8(Ou|Kt#Z={(41XvSBmukzUx@A}C+oSc^U zV5OlFDK?N;7z#q^CqAZ8^Kma~H6O3+|Nijs?xU8IB(w%M25o8?BUmRYsEfJQ z40N73oo6@ioPOT|y&6>P{<6K#oZe?Q>K*TbVB6{E90+@hGk2oew=5Q=gGKpeus{UX zre|=rI6Vs?!jX7G=)j@EL5Tl$QNqk+HCRD)>JI;nDJ+}T(n6i3xcsrZ{T))Q4)+fZ zE;?(6cmGpOwPiNba+ro9{EDG2%n@ZD7S z>S%UhlsT_%Q{{XS`2>f?RDDp@<(S$lr?;oDD@Pxn5x1gZq#MhrtI z%4IaY$oi=hPa}{CIKy)@wj1W+@r%kJ%L(*2k<%H5Q%IaH;E;b@;LAaiQSW~V+1!oT z5%26BCr&-;gLiArzO6qd<(YH4TMmQu{=&Dw*ctw+{nC#y_6EE5U8$tg>>W9rVPCGF6dIs9X`DZEenO{zus+n&nXIwlzC-{WPP2tt|R*PS9?cL~sK#ZeZ?a zK1R?tIz{jeb>(aKk9i8SJq=y?E@;ZQIW&puaD+6C*Hht4;02ItnK^#8AfJ{XPsZBm)KXC zR?8<>Pqp!spjRxY-W6;>l4|J77-L{JJyQ2mx)}v$*T%c;YW2Ph>y4g% z*E)x)`MSMh++q+SBThMx?d780nJvO5nsr|Ad-{QnMy7HIY0ZUk3sTj)q4ZKt^y$%n zW4g{t!?&=d6=c@Xi-a!qh6QYYS4Xyzn^A^1weNX)HEm*F%HM0aouFv>gBd?6;AM(m z!-md^p{o1uFhVg!C)C6A7&nBtmz$aJuEG@|ja}hE4!ae&6)ohh%-q3jhhc~KwFYXN z_`K~(B;K-lD>V;k5^+FYrDr*;C?0e{htuS}lQk6kG%?VKDb>r8yf7~o3=3F9X!X+F zD#du93#KOj3hnbzvvoI&=-P(3oVR2()%N=~qQAdhXq$rF9;&p3laI$UlueXEwNNm5 zENDYdt%{9BKj`YuS!qu-A!s{}sfRd9yf+N^h-OA2+eB#fu~=p_ z3BFv4V(CDIX|7^}UQ5tBL3L>na7bM#`8~NWJFC11F)x{9t$-XBGB~_*>d*=aGajg3 zDpp;ojHl{=)gQ8_1l{KKui8LrLvI`wg`ly5BH3 zR>xeSn(K!RS1*g2mN=Yd>Ep*}Wj=__Rx9Wnswl}TQGlp(rqe1GH*?f1Om;&vTUjvG zNo`YYe`ZrmT)ND9sRFE790;-InG}U!ITIFntZSEsaQonBpL!>hcNMiwtjk#FX7*<- zq}9zhqR~Cm&%$`YSheq{yh!R2l83ZT?*W*&fp<6gPy7sXPVMTGdnYuYt*a0BWjcKd zhwChDR#jIYO(Dsv0Ou&$TEHseprf_DkQP14^U(?cVGUniUW2YXEHR`KKJao{EKub= z1Uhh(k4*lNy2lMDWY==#-?Ci?3O)FIQ0zR{_z|reW0!dv^^nL|pwxS>hrq6Fo&uehT9W5lN3uE6$BzQ5Y@&z&8S%sTFa4>m|lZ;BF8CQMn?G!7RV~9Tqmm>SXySe z=mumL6)%)sB~ZteT-2^Ahur?W6{MjowSEXrRT>!>a~99DtR#982u{DD?(51BB)x(p z=!MeYCS$3{f@KD?JN}Ym3C6DGm<(N!eYUbdRKbz0vv{G{IMJ>wsZaPCptGY?lk&z- z6|A~KrAhf7wNPOQbA7`CJ?pVHR0Lw(fqdulsk&f>`6(Ri^3!})M*?~*VQYB{N0fw? zk54p12p{57jK}pouB$+rzmyb4^8jeB3qfAEl9c`;e2M)qqmB!8a}FL$k|gtm%5^C6 z^vjVWq&vUN#uP}V`!cztUzFt-W1asaA4^3Vx2vO(s*i~%=$A$7(#@#tO@mXo%m(H+ zsBU21F6A`PyOfL5c3|hL46_;9%$6mFPU^|e47Db~ACA(?38-9^ck{>7F%8>hgdn7= zYdDm$+z<_*5SPy9QH{RGrr5YPl)=m7bex@BdDS&5s-{+fU5r0>9L}37Cs2{Q-kv-mUx2+lA3jOsjhaZ6C*vYc(s7%EbhI&++-L$DGCu3a zTO2l<3mzMlr<8cxG7b3&_+dv*`V(P9cui1^n8VVJ0HlAF#fX(+PW)9CaXb+!qF-g1 zk3ZD$KRKYZBecR*Q0PdPZ3_=05t^=hH`*CqBv+-nbwo!JKfJJw%x9whn*Ey|xpX)N zC0aXdNK1;;=muTX6!L=Lp|!iN2z83}N)Bn#e6jp>UJA<34X%g5Q%fRuwR$L6FF9#& zpg7aO551>xXe;pI>8_3kP8jxd_m~~d=S|&2*pCDggx=ilQp|h`Pl5+1jRIAB=9o4f=6aQ)xtdOsCB@Sja)@?Xsv5bHla64g=`^f8mRhU38ilp)LqJh_k z2GrnN+kxq}Z7EWqGpAgo7d0CHH_fFbERglNmL~e$1g>UIU!z0*)owpuXt05yI@eV~ z!w3yhW?-7%}ZtlQNt3ih#%tiE`1z>>VCxZzHimE~{ARn5+L1 z?bj9Uz!ycL{WrY8**6#5QbbTfPAyX!4Qa=B`o zh9P9tn9=){mc}ZhzN%KhYJF=aQQNQJhmKY231h4B+$z#?e|mtc4s}%TK6xTJ(SAT% z-9y{-)e1GNk)+lt`c?L|Wf@ZdpQQ(w?(gJY~1X~twq4V@g1{A@hIWRWO4j`K@F935-lcWwA4UX^&e zb)}36UMZ@_L;+U^{Dv3fT%|5XhOr!Cb@iwxoZriq`?lFy(H&^G&_*k&Yi5wBh3vCx zgh8w9{Lxchzk+>3(dl-}Qj)oy$!jJuXuH+eR*bP#k}hjAl(KT6wbTq{O83?z6gfO7 zFHsxTQ=5`4>MoB!*)pSWwq|G(+8vfN(lXrYMe71PE%|%cxv4a)GuSSSxbVdWRJmpX=+bHT4?dCB49mk|~KtYlEN^1@cRzQ}OeE+sW= z3n@4RnjzU?#~c(N3rVs_f;f?xTtTv=o0X6`*L#FzXi=+k;PWd1dQk{uEBQnt8Qf$( zf6NtTUYI)9)VI`ykzdV5xZA)8cQ!EDw{85TAD$mp2VpPAm%=cLv9Bd5F{>ElnsU~% z(-TkBuAtbFroW|E+j4@5+g2s*VmYf8A!VcRWK+Fl`rO+)jc!GbE|#L7gRdhRD1oRI z3a(Inla_db!>e&2NoCV|fl+W<{mN&W9G9AR|2XMDzH47lHUKydvo=RItjrS*Vy{)e z)Iz?<24qCUb^IU8A1rHt%=09sCqH}zI%fx5(J?w(f@vlk7Y|MY@SD0t6?gjyjI^-f z9A$nCsKPw<@3%g|FaP#O{iLTwKAT)5McSR5O@MDxq?q&jAekoJ$?SNT^}FxNE}G+M zWSw{Aa(%4B&$svQ)4%ZJ{kyS=Wg8ot_rJUU;M;o}@O|^%ckB25En5G&L+76v+JmF$ z-*8dPtGB59f9VgV`lNt|>MpBgGe@b&1Y}Lh#^od{5*0FI>lQQ<`GwDBW8AngePy~mr;N=3#hXj=}EraB} zWyKJ|0N^9YYH4D~!Mtc@Ih@QY712hmeDK0X-|E1r)Yqf+f zq1ssUclcc%=d9RYKiszBz&4K}B@^jSQ3aDXm>(nPnN+-OiMpqvwqN(uudT@Kd4Cwl zTo7uZ_r^*KD!>*3B@9PRF;ceukEiDIr#80GRi#XICTK+ygsJ~Qo&|8=i&F1+^*i)% z*du49(!4;&;krtr#2J9CsHT$EPOW-+OYDHaWv6&Q*)oHy0LahN;snEcAV#xkZm{{J z0qK-P^<+8Qv{dl}k=F%2#|SvCI`x7~S#LNY^?<^j`(t(hW5n`XvWCZ2^AZKrH4Dw9 zV#m42Q~+7jD2i=fjOJj3#TF_2t79=xI+jz4Df5m;8J0OQzd=}ed%XhEIU3||sR>3Y z`ZRYe*h84IdWqKty~Y^~Q?A26zQ>@}^d!?Eb)iw5%q4^!xa+@lz2{FG6 zyYYh~%W@UkaThNA40kU{Kdv979~Z@5O-;XWX+8a3{bddpaBGhfoKY;bqXX5aRkp?L zipxKFJKgCLd);ZxZg+a^{q8il$wNixljvmr+3r92IHyRHe*P@p4wjUIWYl@5m&=Tf7fMtD>Tf+2kCpip6*j8nus zV?6Y`Q9Z2odLyY0ZF;Ut8VHR%M}8mYLtp zdZ-&BrQZwlU!aqqmI~6au8O{dC+AZP#_5tfF4d(!YvWi*Ejkr&>O><_O_1}o*#?Y~ zCT$v|je*3LJAtVvGJDgjW$YX+-zcETuSKiAWuy{DT5$;@*Q{Bk$hMIm_Q-1JD+w}9 zOT>cf$b^+nv`OGd3cjc%Vw**IKABDEnuYR=;s!Rnn#-DY2gknIp$9i9cSaU2q&g71 zV&-xRA84vg$>W16itU-+>Cwrx2>v&DP)M3-KG?vxUEr-t8&?Pj&EAJfxnO;?|U7*=H3S5VvB z^w3g_)<96puNNSualniJyiFeb3JU0Cx8Q$Y)BbxS`#*+AUe@^kZ;R~z_wIlD-96v_ zzwzMyzwG~i#83C`-CNOJe)~YN*P=cq!?1BmVY=h!ha#DrWqk}r4H_+ODkm7kdX$W_ z$!y5601ynEFYu&8TDmpX53}PUDXv;r<3E$x^bGc+x6>5PZR0fh0puM>dr(!?J-`pM zEPM$71?~+1tdLtZcL2PCI82ANNz;i@-Od5DC;ZK^T^pCf66 z4_D)3E%8~15d)Ef5jV$*Q6+U3$d?3fj$}t?=6rECT60P$Hok8E?A1%-)T{$GVghT_ zY3W?ev2)cOdNzQ4P0M(}QRG@ut#et(27l@bnr{yt477)-05^v_ZU zxwC9AfPR}Y&j5Bw+1isn#*1&+5$G;t?bw8@iKBPPc>;fC6PPOANn$!_}`2PFv*YCi#IOu)9{^xJkH_QMBv%z1J!urS9s8KvMmCvZA z%DHyz4x1qfFIlGoPHUgMbCyqOe;xP>Q>;Z2?&LD(y9J3oO}|!PzaVF+nMKJpF&=(T zuSs)DQRtJVqjj6ZNu&)~s-Q`8@#;hZZfls2FhsQ+rIok!!@Pd3WW#%o-)EU9yMSUg z+;DT2m&)dXXkMG$tExwEZ|9k>R<7d%A`j=Cp|@qYRPZ2cUU#5EQ>z*+(2Ybfy*P)j z)0|u&BbE2ktX|&f&?0Sw%v8VKCA*dSHJh$P9y@Y?;wmc!I8kB2*U-X$LOIo`>*Q6J zS&jTut*aqhRBP>#SJ!^tI#5;YAr@zZhpgyfO7sBgQ`hRrvlm1NPhC`WlEJ|G0cv11 zt=uWIgBLZzY+;mP^!%%>teAvI;GVsOVb-I{Y226ier5i)jO$LYW!>Ck-MlZQGV34<4=KcXl)9MC?b!er$Z{D}o+K=@0}n>{ z75a9dc7N{k5?6n(SDFP|>DpDmLP-|&1>#y8V@Db6u~MgBsnZvdPi(v>$8qjdpY{Zv zos;~#j&7veIG48S{!gXeMs99&W)ln&-2`Q`ftRigg=`c4bnZlrHH|Fgz z(FZc09Ii=F2wQIV5Hnh72;wR;G-9cqS-V28sm zPvlslFa?xj$<8$fuQ89}gjA_)G*qz{>3*dCXAflJ7^Vu>joc!W4E(?HA5V@w>=hrX zASGX7+f~a(>0WB7YYRno(iEYY9djoXDdM?hVYr;UH{p{NLeyt85g}Qb&5ZTdhq&~V zb-T$hEv8Kl`rPvbqh2#A*%*a#@z*Sug__YyQN=g~20iZ5LZ9YuIlPr#8)l-0*+Q@V zVWxKpU3s2n8`?8uZ}ZgP-)qWH|n~lZ`o8BpQcgW4`{RO$l}N zV@!yR7=I&bsD{KhVkJUJz}dU?K_@Ksg^>Z%+IG#UpCtJtC6Wz27s%+8oq-i51T!*v zytJlaCg3@~;GAVW7Ec$U~*laV-%=SG?+zdk=zP^se7_Rf}wu$C~}qZJ37%R-Ec#Od;q!JS1F}sHP*q+|q;&AD4Yi zLBAjjwJ=ny;-q{d#Fe3mJECsKb8CB4F)t|50vbOi*=0)325dt)$u99t#`wK*QZ?sC zGh{rby1wfuE$h*BJhV5Ym$apn3-AWu?E$oAb25M@_wN+w1N7>urEf zuQhrN_>H+8e|==1uF~jMad?xYNJgaE^ct}1WNCwaxO)wZK^WSoh;AL|KE}|)@nW!l zpCw2z1NcWkDBLO?9ph7?T2jOAxjbILO0!c8_yGH=Av3-_@+f?ocL5Axfy|c{4N~TM z4NO9AeY(amRD9|gp zMDO%}&Ptw3V0PzNR%)ZJO=+jDC$U{a(wDolaolv!A#+w(Jn<#s5LuBfBT9bLp)O-< zZ&eLO*R#folTXN`X>}5GNlV6qp+OU07@@8kjq-s>!DisHcC9w%(2<&6@qqH{h-_sB zopaEpAYF5h)@$rEs6uqr0Ir^~7XhA}2LPj19-t1sO~80FQF?L$@*TUDz|AT^59esb`LONRnr5RE-MxC` zBFBFarO2XW8U7$vG+T`ipi?-!JXl|^JYKGm2+~o-h=eIR-SIv&zNcC#{AFx2b{K|BfWM$(b_WGRV7&$aRj`fp9o0+vSGf-%2Hujmk!mg+? za=hERFb&#|N^iB5IKOsRHgSyw(HQuf6jjXhM^H_gt?h2t6sRv22EOf6fI9CvjxiN# zkY!$|rhnm5da936^i{xEYy_vlzIxUh2;^4|>%Ak(qgjD(KM;$d@Y^eo%B#_FF0n(u z1*+2uRZ_pgmYJ6QWRjxt&@?px=QphUM0fr^%ctAypWRSFImz4e*Yx;(HZ`y2JGSW_ zzDLq8fI9EWNa^pr4A6$MjzX@NWIupfOap9`xdi zBIf1Z}yA@KlSM(vQT}`_rEY zI0gfaI1(sHtmj#gp5&MOZZiIHZ|^la+g-&VDzURtrA|VhDg%->BXwz;pNP$Yn$SbP z250G_e1+rWJUdN5AIBHNgIS+b8B$WXMhgxe!*rTPs3knpfUI7@AWh&WD;krcc&adz z5|Tc3%E=IvmS(&i$tyu$NTZClV8Y(#E~SGA;EkMtLYZAu?>)bB{Hc6ELYnsb>xaH4 z&^$bN_Q{ezNO4p8<;{zyAQJL1y#}>lHx2`+e7aTtSLpsy+3>^|E{bfL`mERHGh{nT zFDJlUaEt>Hb@qQXLt@`*w9Bv#`XwqG<}>`Y8JHZb(^0knIEUe1r}{564L9*e^$7?4 z&HF9*@3-srzZ)RUTde?O-3YemZT&|N?a|c9H2>k{9{V6w@N!v%GSmrR@>Pr^%nD6E zF#%TVhU$4Uru-Dh3o9L08JifawW>N_g>fKssEq&Avn!ul7mG^%VM8=>xaR8^l#8_u zK@=IDM5~z3fO-1U5{KST#^iUMDBjhM)#^0GTBF8AeSFL5*h(c&ny$hasXc)4YQ}0! z?2_3SRW*qnX_t9EeCkvJ+A0{hZ&W~t_NE%S&CaPvIa;b6!K&M+BW{g+x#gAnuTcX; z76jF~?8<28U2+-Cr7zZ~5ZB6(=(m?Y{WzUYl*b1N2otK0govuQLuS$6UhxH6wHn`K z=;Vw+XkUOv%aaIs5?!Aa-dJp69JmBiHPmdrDt;N;U=Jk~Ii@eNFrgfb;9c~7C zoZIWtW9;1TtcSXGy1!S`z3HVwbOYjAS_5(cO{2;SxnM7p3|<4({x(N6{Im7;FZFZ% z^ItiEje2^rx%>%m!TE1v{oVur{CEG}`oGS9f5eXwy?R^xji#N_rS= zMjU8OEe0s#D7Ua)l!lqmx#V;|T92>*P0&>IzPGU*y?^I&uHU-JKt_(Ac^ zYWt3w*QgqN&#h1i!WWFdSI$UQc}`aOc*e2G*c@Sv0&qT?3b;>(vtl{0WJ}PP2-2n=QG-J@&($m~TRw4{PB)0ya=nP-q3C8-?PwP2 zDl7SPu`mdQ?vZyk42F8Edl!Q`{xSxt4#*d@jZe4XuM^Py$(DCAD=1(*Ce4X5bP!UB zrb>!%J4~R@Gvy{AFc@8x=}-mQr$_t4ff#TVA35^jV3L=YnwB_tPQ#H8!Eq}2r7 zhB;@upqhW?wU@XqUOJXB$#D3iV)>~AL%*8Df$x` zNjvDs`WxQx^RIt{e*W~~)}Q{QpsNbo{N>7g`5S!sbn8!Kb7VmMVFqv&DE{Mbt>{m} zz#xF?%B$AWh`AwDTp5g60JZ-lO7$=Ly@##npr-n*fxDMamI6x==l=A`Wm1JZ^N(M0 z#U)p29`APlxFm)D`uS=<*Vq5>CG&M|e;4Y1oA)+0J^gRe6n)!@?m(LjXz~&M?XMf-Wqr#&HMysn ze829ZwYX>Mcw>{Br_1!{;9BYUCb+Uiz+Bg&CE%8waD-7mcoLto)fKpUQzgT5J;j$^Vr4dG`Q?1rv=no$PxpleV9#y5U0rx|IH);THFyL?N z;eM~+N}yqmt}u`3-6%AleAd^*+OXjLHnnVl1Nj(P=BO?#4Sll${ho$SKzag-AV&bw zy)TYu7+iq0|JjoCf9KB)@;?X%+~xY1yZ_(&_S?+|-&OKIKlqpZ=MVYm-i@Ny#-8(E z$$9dYqrjgO$tcATRc+yA{cUHxvx#XOV7a!U&Gq#MYw(}%qqoV3GdiT>65k|IP6+`Q zUxWZV4X+|Nb+YRu-tdwcyWkfSX)&T$$;mi+`C@O4gT(>M0YvoL1#r({`{A(LWgCNh zQ#;$oMS2{Sx3G~cl4|BUHU%nEwx^gjNZrZH{5Tt?Z`>^qvOzr9YTX9(IHfm3weNv0`dpbo;j zms8*^%v`c%X^Hr%a<2S#lJ@bjUA2+k*5-wR=o}pp2Ob?+gV3@KR(d_FP|VFxY#SNU z@FIR*B&S#r*zh4Ici8{^(c#@k&HaOew+9F1;oZlrhX-9QdKBY`|Lg6mpPy55&8?{W z`$6~M?pm4lfxK(bs62Rkc(-+M7e1GFZ+EFDio^9>DV1A}sg})se-R%qMQ++l_F^V$ zlvzF1DK2jML$elD3_tMK;AeTTwQe zFc5lL+0jX9$Q-T~Hcx;%PMRjNPm#;G@+fKJQx#a6Q}!3Vy@NNaG>fIshS|fSla-o; zP1|aJ{m^8hH=u2Cr##C}FmW_H1{%fwJ)+yRiWuAWjEx@M%7^@1gKj1rl+a%ipDv3~Nv>GigOqS8(nj zl()Y5q$|I#)T9913dFWUU4baaO{2yxWkP2lF(m4+$1k)QTLyZ*=Suts? z@Nh&8K*z2TXHlvi{HA?aBGY2lpVHHb_e>6HgMY6n#Ou_Vezh9xsN~HLWzdl80v8uP zj*LvG7r`;;*XDlmXOWhcTuX{Q>6x7BO_EU-e~5H=yDhSqN1t@eZ?m%O?9rq*bOSg7 zH^}Sr)k(uFGH3eRk#dgc1$h8iBXBr&#&hK~1%6PT%y@vNf$i&x=8+CLZ)<`A@v0Jp zT~*~3M8r@#db#6s91sy5dKKTK{kd_QCZN&sOzWRhL;z=SQmaIRV%eCgF>%vx=yKQ&=nQLsxj80Dm^#G~Pl`W7NaqI49i zyufB#x#nIwcba^TC=pj(c9kK?caBTUI)l=l#NI83)>1AGfPmSUcB^(I*PY>0!)Mu8 zSD?;CO9#ym*BN(z(`5Tr1ueCcwbhMq3A?hqUt`Y|%^R5VLmGb!5C5Y5T66;w4m&n3 zFR@$+xpsn8?ti8_{$*5 zzXq3uOK_7FS4ugB2G_KU!+BG`5@2GM#MUQOVZnB%ZSG(d(Az)i?;WR|OjbJ0@ocmRlA3hbmdpfF^q9x) z-(sb~;)BD+1lr3r$9>`sK6hoj=V$lJOs`g;@CCa=enn=j^gy{qfaYO73S8xSNN^iQ zqlTvxI$YBt)F0;KbkQWZav6_dQH8W-{akxS$N3=LQ^6xPBtS|`vLv__77F4~gAo@| zgMV#U1t!MlZT&R1l*EQHa=-W{al!BkOQIq~_>U@rl!g*G)&?O}hoI{>B)H`kV-=Ws zMkYc1OfIa~2gR^U`cKp8P39l6oanZ}#VmxZ_FYz@+35*p7n=Eug5k`tt!fjYxbbgpqAn>#T5 zCnKSUVLBH(8lDNofbdV)QRj?nNlGg~4x#rAmdN$&xp}xG<+-7ku3B&t`-z%b1BaPp zK`moB1M^#XX0^G*XEWwLf>Aq zZ>&jIVdrAfgG^%|5Cj!jYJWj>ysQTYa{yswkNARVavWz%gYT0J8_ z)^Pp3K>Z)#EM3+$*a|dwnT==D^jb~cVz!|{ZIl0}5pNs2!d`Ku>~_<$w5&5?Gg<%2 z<_cG%^^IP>+*@Gt8YZLTK_c6U*fY{35J@DUJ~xz4!|ijK$UC09nHLq0IAhYL7LMg9 z7>)D_=&n)#b27CJIK-6XM^GsomQ+)KpKZ9P=6>hy>f_&gD_gfed}_8n?jIZ;bPo;= zTisJQz#SZLAW%fC`!y~o(;@=_&`*ZDmuVlktnmH(*=`f?lbOxWyX5*eU zc-d(Sq_QfAAuGGMbEr{<9(5dj9L2G<0a_~z8H~|J2#W*#mh@F~d~l2wn*;c#tv*co z!_<5j^M|qdaKax>%!h(M6z0PLe}I4Mj#bKb;vK3^%bARsIl&;i#kd_Q88i|~vbB#< z91U$fHYy*g66tHoIMc4eqrlZtWE-1?q3ElQB;Y%encm*%hF$PeAC*$WpvNo z&&OI&J+5R9cD65UCj`jCX~vY_v#~hA%PC~_0e~!?I}$wz$=X8Y;Z=3=7!J%^TyMK_ zw?REwB<)2J(b}2*wKeYRA@YU3fKkNtO!?JWQ<|uhv;AZoqEiO{pvQ?LtX(Wk6-Sp= za={blAoEZ&mfHX`LR%NXC*7CPozyRI3caTeOSW>D*b>-dzFUa4M60UWZ5zGfE$Ve&F^@HX8sTuMz#vy zn90jgt196Ssaq1DaJsPd)D)lDbRo_)r+{itvF(&6C1Tq%^R{$B1lJ=8q>KkW5 zd{*DFj+$UPg&IHQ7rKVrt_EpQ_VZ#w;Y5znl9zYyZ#TYK#BfPuBi% z*y^_9Z$4~%I{N0r<|k1R$_@sHs%E&-8hky9YjGXGLQadtWMN=O0BlVz+^VnAtW2Nf zv*TggQ}L!i-+wZ=r?G1i5B zedh5GJ+|3n@jKZHX6x&*Jcqm6H!^Aaz_%D5d1yEAmFb~lvyvZ1m^#f~D< zh#U1yW7YH^rnXR5%3;qfDm0_oZ;NuXNaj5u4|Wd%e+&v{m_IJX{oN|j))^kN^a5Wx zd{fq7NSfrda5O|DFMR7z?!KnI=M~m1+e93U4mw1m|CFbt#{TaOAlmq#IK0c$_ci-yX1!2D9_bsLhK8BH}O_cAyX4A79 zfe9-e@bOTk%*>Lp%fu2+w-|JygPG5wu5Ze#=l+Ry~oMGKIA#Sg4 zg0=wQLuNxy(O~;rK6LFW`U*cxOyq?Tjfr}}DKp$9_C~NIbnFd3K6E~w z^2bN9q@O?bI@6-OF{@al!*5|^H6tj*N5q0WWYw&z^Rrov!i>HYa?ab@6 z75T}K5pqjk9$OMGcWtO?Sy`=oS7pH&qWjLo>`l*&>GZ(A!IIR-bYAl}cmJA&goeED zsxq4KPSubF-ReE&47^MY#ndkh=zC7G7&|%L-<$itclHlgKOXEin~%3TcOUQn zjekwBqxUGhCB)eBMN1;BYI%d_p%{$S)e_fT(RE$3 z3MMTP-9L@kQ*~*}}q3@XtTGgAUW$61!)6bzQ=tz|tG8lz>yFvoRUxUa5&EG%5 zL>C_q#;xWz2OroK^ApZG$&lMLaPzDMKkbe|Y8CVtoLy7Wq%Rd6eG${9EKw+rgv!Gg za3&~(t_xrEuY8@an^tvG_Kw0ntwGtjCYErU>IoEe3#WfW$%W5EfGc_It?Dz7>O&wF zWPsCKG#CkDu=lRLovIKeKmp*JFfo9AtY-64wvDkFF`nS zoo<~V`1+#CU21glK1H=vzo7f^N|5i|Hz!7aP%kEMltE^& zBCDn3t4ko`{N_J_j0{ZQp>N3*N6jUPe!wtOB|glqXfrTPL)64|_xkU!7mTg_n0@xP zOali4Ljh8vY-h%*iJ$F=Nq6Co_RWsgU-&a|is@btU#cXIlB@>)&K0$McmBEJX6a>s z-3eH#`+z>-%^%j2qrj(A&M4^Vy->wNPehbHx6!IjjN`%Kai;Xl+~=NjfB=QKdpaD?QxkFW(yjF%ZnjjGFX zz<(dTXj3lIcVA1#y|IS3@bq$H6%UicKe_3FE;QQtvN~`!VK*u&-O~F@9}@-^S+Z5L zl0WIeQF43R$1pvawxc3DJ@cY6B;+@Hf;Mi3+>Va%%#1b7H*aH3Ko}guQd~n9$fz@pr+__^grE8mgbr*!!dicT~Zze>HuWM5J zOVIkp)DG@sM0Dzd93V*~R#qaHi+gs&bSq3~|8zZsG{fxsq!$}H=3vaj%=|mczq3U-)McP$m%7_&01an zwL|9>${hF3r4EAEjVtHg?A1q;Tl$#DV-LrQJJh-^?wZ{$<>$uOj^{RQ_kX>`i0@ud zWJE4GPqHEIxVORw6n`s)-ETL+ceT)CWd}x@1-4(+rfy5uhVx20Rp9AmBUsT&U!}!M z+i+Fk^jM7aSAL9|*%zCuQHF)IrPu7)+KdmIH7ylhZh8R;brZctKh=#ICKKEv3cD5EzenmWeM*F0azS{)z`bGEkPCJPFq(4~Y*V`#&`~7z|0B7Z?eN7wT{bc{^Z@6?4akYMq zx96+<)BI^Z%!}7au}G(_eSxv;<1xJ=!;ifD^TzEr`k5KMK~Gz}HHBZby9WXn)4-ed zA{k_tl7ma|y61%Y$s^xQZLS?saBkV-f z<}DF-R_%HqN#f+Vj0(Ey?5EifP7Qfp#4T?lSGQf*q0a~UehNnaGMS#4>nam(3+0Pz zLHW^9420`CMxV5*fOe3>ufET%G)K9i)NYA90LJ?`EAV-ycciHayKHp~!VB6tbBE77 zL3`-YgP?KcX=ufDP=RBr+udTs1UH8r}@ ziGEXM0WU_JK-jw{Q}9lGc#8qK0A}L~N@4Z51`dTSg!4&#xik*AeQVAL$Pm-aVHjto zU07aR;xHN1tpe1Iz2=pu!gB$LYY7X2w640)MuC^{{;AG=qi*_@9M|)oPx}W{?%>WH z6>`V0uEr5W)aksH?L1i}lD9gu$-sN0Be;jk76bHUsXp%Wb|{{p;JL_uuCFiQFj!?% zFU+g)pYZiu2pe{c*0 zORbQ4O9H4FRqRZB_D8YL8#P*uFOig;Kq)nPi}S`@XLhMB3}bhROe{5mb_+|LV_E2Z z3ourt-YXS>n+mk`{>N?7V7QFZBg|7|=rkA72d((lscnS6~$jS-oHo;)11=Af5*oyhu^l;tj+C4~C(5rvK7Oil>UlYvs8yB6S6BJ1 zGqlUmH0{S^M*U$k^t>UQvxK^2V#;6kvdL%a__4j z*Tu*R->mDjwF7izN44DV)t0yqwDpc_l3KgAhOg1P*5t(Isn!bdtsrS zhJ0K`Is6kL1i9YI{a6Lij}P?#B;x)E83nE9SrRzhGttol^a%W+yD6Kv)E&XaSvrn> z*xhSK{JLLA2RMU7zr6WL>_!fXfFn{%KCn~Mw%Suw;SWQ@_%XeuhVvL2Tp!0O*cIWg zq>Nr%-M{2xV2>g%K5~}VkCZG}MFRkrLXw~4h?UbL00VU`?bbso#PaASG3%|x`_snJNv z{l@lD8KP6o(T(=_tWTkR-`BSB`zBn#{kZIG~9^B8{H>+v7o7zfhFb=wsWvjI|(KvkDw@snj#yd zFS8LP-trcsLsmmA*4V1=(b*cP_;UBMpArtuv~t>Xz}C7!Xbv&AKL%@CW{;bq{v(xR zsVP6gMBZ;13YhIJcsP*!*{tnb-m&?dRWqnFE){xR{M(vpnGV+Q@fVtT+;gJQub{5E z8(vdc;A8pTLwz&#cltO72oc@yyYG_ogk#sXDX>fTY&sf}+_qXFexNe??QZvOtTi?F zVDB#v%LQtT`|(p&KGzU6yJu;}6soBSQ5ktlOlzSi_O~f29T2)_Y-*KiTO6*;Usnyl zWXwL}TWHBD(*~`jdOzvq(}~`uspqv#3_FupIO`{DEv6`m7_hmb`MRy0J*j#EW)O7z7aM=AGlQxg^khIiVN()HlZhMc zXNQLd!hW`DgS?=wVw&ClQQ_p@4l6^kfvOGhhmHZ>-V1nPMKP%yMb72sj;NFSk}JHL z*sN{(#J{9pFd7ikvQEO`UNtk*1Nz-t`ryToUQyM^*^z&J)I+920j)kfjP5xJQ4Fk* zPqI+V9M=dtNYkNyo8uTGRHJpVNd@)-#~Ng|0dMrFKG7(mb|^baxo=w>wwKZz&2lOA z1{Q0pgjf@S>?vk*tGuyx#Opq2j>?IT`c*VKwA>8T3N>ITiVvEkl)vRaNHu?+WW!kj zIJ%H(GRU`#s%xpzVcw&pz2?Rvpl~cyIU*a0h+it%J*Q`T1I|*M@9tUk+B@4bXi83S zi;0Bn_=WMKF#&=PRm0+X2Xpu9`5(>{uAy9L7ha;^2ai97tq zv_DE(yw5kcF*-R#Ld;q%Pq{<949~d|L^4&7XNV;azreK4JJy(v{DaLrkRd)gn&hu~b;t}!d2*dc}sK5C@H*fuX_^I3d=EEQ#CE55Be1$Q5iaR25 zW>Zr|H`t1XxytaNKWRmj!H775{K420>2k%kMyt?cPD$r|MFo$E({gtPUcWK`1W;`G z-Qg6sK;|g12a;kWo`8gQ40;=Gr%JA=<@PBGOzgl3qq#zW*R2J{D9l^*2Cgw@xUB=GOtr&CJt*Ffe;Hdd>)Vgk6jMDIyI+E*WF_F5 z?lGD22Csx;(88=%PR|a9DUFJM>hwLQE^%|UE`IjvJNzHWs})`;E)2Uf*glVpsE`4r zjr_0L3*^ZIPQ)I4x$ECJ7fS_s_#TDh%m5@2Vg~*SwpW=+4dQRa_v#IPsdQudS#O&! zdlbPHFKJvI+F3v%zOJs})@LX;*1N47nM-SYuJAY9 zyNtxIY#lY5(6u%mXK$Ewh*U3$%um z_F^|Q3PDNt@IYgVnw5_$<^W=?KPydtqTEA`)+fxpinRYBrQ=phQm`VBO`-vDSgA~T z-FkBXnJN7rFpEO1_=TK7D@kmn9Gc@&rtd@X@CHh5-PI`JX6guwu(7W+O{qR>0%;u1@J+?LQfPG#S71y6O- z#YJBS(p)GGHdVvheogpo(<|_`{lo88u|mtaJfd&v65E+XD?uFuEAB!HL+4(jpJwN& z$;V-)V83crDTP%<&1igRH9=397$FjtA}YmQEAo^pXGO|nhK|34K>N1&L;4<`Sn-qr zv_hU8DwCt`ldBC}&tMK2tjZz|?QB2nSDGJs!`XHu6yvOFH*KG`mY40T0^bb09R(Rs zx2M*oL*;iKXyFSUn@D?}2(nHZpCffcVAg>CE0EZpuX(UyQ5+LV2ODv(s` z^H+S<E3Q$f}>n+uihMbIw6sdGzst+l>O@in)qcoN+b~j+oU+^{o?n z`hx-;&t6mwA0pES5ns+WzZ(UZXDjmE2MiEl@vRDpPj&`$s`JVex~>Ytgz4pCW7F7M z+AYYE?(w*}4^T3o>GHbp&Tz&rj3f3vU^5+hc~Jb9xp-M#7fD7n)?ov$@w(T@K?cB{ zwzs{9y^bMLSLIQJw+lTO2Cx3YbA>i5g3hZ_m^`_9F);NJrs_r&YhOcKqwekXbCA2R z?UtS2UMD(?tm*H_c33{Sq8idO9aAE}_Ki34=ph2Nc84{I(q*^@{Q7s5_QiB%lEz4& zx0@bVSmC;bRufRuYe$6J8-9KC>dmv=H@nY{etz|A_vr1-KQ^iSbd6qO2((N zp{`+ZR9oaP;Emw|j4X zkx;)=9lm-g(EXl2K6~}_7xDGa-dAKWJ-&6X?D?CWALRHI0e*h9w<9{=*u2G#;=l$? zPmGdlz|hG;uec3aNB%8W=rlR~nJ&ANDTtWknaId!zo5jkf3PF6+T^)8cF4a~(@5$R zqy00irWXMHZBP3l3oM#uZMPk1N|GJN56K-y{k43B<@kqUA;=% zX5BjS@&W^3?&zw`n!Hg8jg~`Cxxdm%qQUR0x`(aE{aa8;t&;_vx$>e0VYd%H&Qc01 za&E37OcNaNOIP5{-e~>O;pB+#BbqEqPzP})+Xxf=^(8q_X;-lGtjsWsq}V*%twIgY z?&zS%USa6Rtek)*LYAO049bZzbb2}uq+Kqzovkv`MBLZ7D(ox(IGdhjgOm=YAiFQ( zLl1(xt6Q9~RXs+vqmzTH2acHB4EO@TMLNpQZ$wG;SBLj$+Cvx^CqY||XqCswspdlE zAg~w@TzIOoa4Z0EWmE@U+N%~e1rVc?=`xK%%R^rudt3Uztt+adi|NjInxl)hS4+c^ z$>}wEzNtb$mG%x1ff%QrU5pnHT&4E==TqExw6DyeyWSL*BdO9ll?Q?*aDD*XxjMDf0EWt=As zn4bAHqB)oJ`X~JkWU@SZ1ICn0?i1!QwfI>E5!1oDeudE93d|A|LI*Hh(qB zXNFdmsp@2aptOVhG@sOtNZ`_O!iKtds>oI}H7dY_u|aI#x|!Hh(^e;VE{bFl5v z%(~T+%KSa3!hH&oS@yTh7hh?voO)^>F)Gn!Kx=fBIm_!ha6BN8;YO5<)(}99tjdd? z-KlmnFnGA+QlFhPwZZK|RdlusFC@s)8lscMj!$zM{W*uq+dnox#MuC!c4Xww)W>TA ztc{=OkN8uKH@Q#)bmj}~PEHYBFH&xje`)N7N9WRlEhsi3nnz3CyGI0fn#Xg{u zK%dt-t#b6}#@&X1MeO#>0KDGvVP>UO8k`E)wJYRaL2^fx$?A-O#&6+>tKtF%1|Zh@ zXp{~zP*k5SLkSMWzW{$fn&_7ui(ow4kNRN3B@4U+0IOv?_^Av%uybaxRqMK+&2KI| z$#fE>&+SIQl3kPw!PmjAOx2eOZuIeu1+p??$-Y8urF^!Hd+k=(^Bn5??auR&nH@$xL^x17&; zW7l){k0&)Eu$atJ4u&_g>ycMBT%NSD)qJw*L`yYsx2svV+74kUkyd$@olN~5*1?Ok z1BF~^=g#D)R2tvl9UN_fz6D<&8zGYwVkYcWKzACz-`UC4O%F=hK=1}S>)XRBo`YJn zJDxZ$3V11#io3RKV58+L#c`0s;g&$hiMBr+sa}rg5gGu6jeCag4=_ZOR?luDG|yD+ zouT=72Gtz0W+H#BGmOwml~;fB7iah-hdl5(wlH(#lD04+t30nw`H``H2yDE0ozEV& zZhQP>nvd0msr)Ld;|J@TycK)dx;g&;irMEK6Gh;&?pC|J8cxSrD zZ|2!^+jqI3ZdSdR$@6*Nxsd(<{VX$?goljXz%TE4666zm2fDooCcBJJq41*?ouY`I z97kI^z%PL@24Dn*#^0(HEAlx5tB@%Hf3b!KHaZBDs9um^sYGy`{A?$}4VEcWSL>8R zCiQDiC4;S;*wv+8fE^4GUBG0`s6Z)wj`Efh0h&|U$=4EKS<9dFIsj8!UgtCgjh zSXedDDby068%%?lK{NRYZ_V_5+1aZe@gkn1KPuqiNfQ@N>|o|evuD{d-+WT(_AuTD-d*Mz>` zWG`pk8D5v~uVVrk_;=%Q!S+E-Q#)5D=9nGL6Z&C-hwc_54?phgd9gyM{5 zz2WWAqfZYg;lHY1C+MSfbG3uaVav&;SFzy+hV&TU1e7U_S|6UaqK%H5QCA-sU|XC` z^VmM!G^bQEJ+HW*Yii#-WQ(LUaV?nfB|H#>M*LRIzB6}izUQ!WS53D^9oflrns;Ct z=xq;PBX4uOAgr(F%;es~kJhSSXT&}%62~e2 zwX742WCQE=q_5dCjf)f@_7dJpx6qBc{N4a%upzPHK zQ$)S3!IgQGjwyxx^vu{r-~ce1{S8Zl-E2|0dYyW5rJ$|>|D1(UmB&!*GbsC(7r1{Som*qTn1fT4B8zt{k-E%tl zJOxXem&{5tk|);Vm1~X~^-vUoGS(-ty8_>;d)d(_83-gJH*BLTt|UhkDXV$rO%E&z zIz}j>m9#K;F-E#F#<#`K8W0A~?X%Byo1?iWV+&4`B`d8XrGa!jgXNY_XfY4dlWBC8 zz}Im;jgC`*qxKB3)hP`$caJ*$5D{cg$LXvVQ%|D2-b8P?U_SFUgFI^Op;GTE6nn4;LCmJ30H)ySUt>h#n*JCSFG=y z{KF3mkN9tOvStL-VD`k}X<`=t|9ZN39)wnE%avu`767+BdG+jXunv!lG=pZ9Xu zRDl`BDM;b*EEx{3qT{QGUmRTV#+^;0aheWF_@!eX>hO#@j!PbMN)roiH2Blg?e;fB zTmsr^oYHksN-7$a&eb+qXRB7zYNjWSlxFu6cim$g)}-|$upJVYw|vQ_K<)7udpy`V zps;)%AXcvZqlLZ13^b{z*xckSH1?{-S2+Xt*qULj!g9I{RvS8mtgm;W2gkqES3J{0 zQoqQW^;d7SYkbWmX0+q4yTq1O&&}%U&1X2~IAF_WkZ}b+niV+*;!unHFhsK>w1T|% zg<0y%XMS&4%w@yy>RVPlc}rIBueup)!}`L_m@6)^8H-z%FTcy7$yjXm^WQLp)PsP7 zwo_bLtGFzU37(Q5g&tZ^D>csfw=m*e1lq7%&_Z`vO64Ham{u{2`ca3U`R;aVse7KK z7Z`)J!f_{gvAaCenF^K=7Qk0k5UmYBnFLR=%c?%;%y?yfWloyqCc)E?yI7>d9QD@f!HVi@3nhV}d!=ec7KF9h@G@{&@|seBLZRplF?iKO_oU$< zwr+$JO%cUM6pLDB0cA$4W(O^e-&p0lc2aY`8=l@$k*@7W?suJuCnDMHZytInM1il- zrx`ZRQ)>$YC~CY^hkqsgLs3Ck1o85MK6c!t-t>Fu=Xo)J{c4&<2Qj7{reylq@q1h%S{~6p*OA#b=MC;XB!TY(b49_CiID&e=&&E#~WMXmY7j6$e#a!0c7Ml~I{MS$SEWb{Z>4lY#QNDAo_P!mU9DtXp2 zgP4ScmqnDi#}pZBUKJrV9aJ%iR!v=CTOVDt&T48Iq)bR;2H%RpI#&fWgdJ$sTEb=v+76iH!S>(Dtu}_2RyCqR#>ewYe-xt&4b1ApjD?3Hh>NIjI z5R|E--zjLPe*nEvNlfiE;!ti*L_qy|Vk`1H;O8T_^!oBqMYUq+wJAr8HF7@a`5kdw zDf0i`Qj9!iKU&Szed`LSUW{v5ig^K_Bia##7gs4)+PBOOhER0$+U=UiiPE9TAC(pt z!W`rmb?}iryG7au>_y%Okz^jPc%CO9utCyc3~=u=CaWydD8?ldZ>c{pK7{_Atl;J^ zHkrrr(pufqWAAk$P8z5x;m|D(%&Vp^S_V#6d zcmpH*^N?QA^z~zSc}Rv4z=uZN%#%?xl=QihM)>iO&QmzV;sJqwWiO2A2rW%K%f^7$0 zLWk^c@|UuYz^eci(OEo(sCT*4K}4m(%PKT@`hKO7@1_R)oPWnQMuMY zqKp_GNXv#c%r)>Y*l?`CDKV%r2wKrBI!^lUJK;_2m2>!ARAZSbsoW(8P6oy$!Fr(7 zn?mIsj%l(I+O52)6V7Ey*V52Gh_i$>a+_3+KywgyyTgaSZ)pzTPrG4#sIqm4|Ap0!5Y@U z4-Z3*rPhzMRk4*Xr(t`_Qsu zn^Zv#0=7fE^teW+ftQ=IV~S<$pHf_*gpD8b(@mbdt*FtcMRE818pz2&i}T46!pydQ zY=0MV7dz!J1JSj4uN|#zww#wrKH?|CB;d8UXePz;0}x3etR-gi5Gcb>jpp)?^9Cp! z0odt-4y@Pg!#U(yONBkFFSAHF4u@H)YH@~d&-&?bs0=8$SmCeN{Fhm-_zmAN+Zu2A zFKwt@Cd3Oz*=Tu2UERZ3+J7JNllC@K{4x6&w}C;fthl;pTU*O&=6DWJ_mx-AJe||a zFg6OrH75kP6{q8qIY0Juq~bU#@(cR+d}o-Qjw6g=kJ+2>n3I;}U(%~+njG^x-q?!y zblj&$+oR-?6XK9KeuWRxhxzyvjrWxkC?e*cKj*QJh>PO#Iv!JPkd(y(UjRZK7%Zaa z8cUa9&)a6g&WiM8OV8bTM+<6mkz4dlX`mQQKXY0qeLnnn#T0Q$RRO&e-vJG_R239v zZJ(C|WjIL~H6YY(G#gH{$uJF-L7O}oI4JF&+rpVGt`_z|B){LPX*oC^>hfwK#-&O* zl3-2YjBeL!3em5-wk0RHsB1Z!1`#^R`#R-xweWa2D{3k9KE0yYYC*72$fK+&oK5Qb zEN91~Y+6Hj=r5htwoEymTX@RI8t4?Vv{47_<}&h@W$Z%J=MTWGIV$hn;(Tl4p!5Af zXI+PXNY1m<1mCX1oD@5!sfi)~IR~QpLyIefgYP8i;bZ5|^y9ydbYD*1@Xh2Ra{Zbf z|0SFLld14|uSEj~BLH|d*4_VsN&oyY>$Sp|v`rY`&j$|Msl^1%# z)#rc2Ol(fx)PQ#b-%_E`oBaj>!)TP1CEjg|)J5fNLibl_2jAOy^3(1b*@;1A#-?v~ zf7*SzXYQ{8Ji`f}w7!G;u3V>>y4t2~HQ8_W@jKn^@hAP#e<(h2Y=9|$5$RvH z9Y4+md=iCHz@p*XA_amc3gjVbc~N(l;C@7v_9DFu0FEPar|h(g{bMRu^WJj0zj;W> z$V(^LtwIf<*Z_q3D9RJ>_kf@U#b9^C8e(Vjs23cSvR-nouwX=E5%(}4>H-Twt~oN( zPV-<^i4f#^a5Axqfvi&5EeX7`ybK&lAofK^@5IEjlt@mEJ(iTktti@$A5PKC^(byf z-cS6nTUP`>8;2@$G(KICfF4d!cbAP25Pb^*+|+>HupPw*^l)0}1_-ElR0r*z2K1~R z(8K8f>m#7SqdI8!6(Clhw-6AUa;lU7Ky^h#qg&dY+0QK<$ODYiqs^atKkn|pFwFN3 zky(xJ`KwoZb!9*D3mIGX>{jID5}v;xTLH)Qw;7!)$qbL!$xE4~Zg=E;)RLBDDlw6| z=`X8wsEao@Ox66mH+k!Zp&oJhU=FbCB;)WYVW0gcS9=L+6r5%`=&IlLmB^OP?p`_H zJqI;(23w2H_`HjN*!5YxX`8FEc8-oF2=eHN39AC%pggvFkjf)oE$d7)I#n}FT|Wrv zI-}4rhQxlr`Sw*Z1CV*~pw&rQG5M@vqpZT}b2Hjp_)4s5)&(lZ#GS<}d1=}z(7 z1YG(6AYSwxal3TzYMt_ox%Kd#^$ zj-H!4B{sgIV~Yb{&tAnhMWh#0*MJ@FQn-zM@r=pl&>R&q_x+bQS%(BD(kM-z-}f14|R1($RIk3 zGCU8Ogj9r^SyS#*az_fD-MuYIS|DZHikYd#|3F|=J3hB<025a~P6h)jxjcvB(jFn6 zJG|!2Xgk`QE9rgSUyyWPR5cZzSa zGfeJ2UBionrl8e!?%m{FIgS z=PUa2mHzV?{rQal)S#Zdctc;ag5K<2VZ|Re@Y9cJg8o&tvVXz%_c{vsOfjQeMKfq%Yu`2&7%AAR zes1VX=*Au%nV%-~mYOOsQTTH{RG-YO$nSK*^&q`X`x+7*a!ngqfQQ{+!5a_SoBV=1 zvR$V`?)zEg)AKhwFL!Cu4I31|e`@MqP%+VhJ~xPrH>vU3KH(MpbmT39WxrfoYismBFY^@m>l&Oq-9Fm!qU=xki>_Mqp~7p~5oL?9+R zwF_(yG~7L8WY`#~QiUQ$vM+5fp$Hf0)ObR8I;(3-&T(AXZ`B3kV#$+`Ue3kn2+Dye^g|f$8fM_m*fZpKXUS>W+wS-28DaB@ za#f-uuNfHLw9FEAlg2EQ`!U(=aX~*j6k+qBxpFvo?D}2o#~eFRw-6~V)Gvyr=B1M$`{jZ(ZlQE@%YX@Fn3HkbLUTXY_e0TBS==!6&u{8>3KXY0 z%6TE0+@LPDtX&2Ex21urzrA=xjQjY<0UA7Z;tY zS+<6b`u%*=CHXkY3-rw(cPom=7~SpOx`hkN45}BA7*yK{Imu_^Y?{$>lNN1}{a2k> zkfH2nG_ILH+>B{d6Z1P|!}KM(qv zNadnxjeN>#bT0xe?|n*sZd-TP@{={%ZP9ILi)>g1jXDQO6Ns&8ldCo~pawl!6a@^l z(Q0|guq5t)9Stn%CuqItJYjss3Lyv&-@b)q?sUT?1cEZ)9*>L64em= zG;hk=(FFG?lWute6if^BJUo-1by98nq@^#5`}jUyF$)>g0We#84#!=>2-zS?dWJym%D z;@&zWOFjMC#LRg*)ur&m;YW&kNJdf1P)(aSmR0mMn3VgO2v&lm#MhCjdf_{95)`}S z=uBpy<5bV{eSnBNIsV%m>GU{%VgTrKum=kebyBWrv;?T@yaJEP8BZ* zxBq;pGJ}kAL$UK&XEx6MK1tU(#@oLse~7AA@I8rR8naZ76t>?Z2LyDJ8~k# z@h)QPw+X7Nmdi0VO|eeM0iWw%G_r32s19@r+CRMMCX_heK_6pp1YzOxHk=Aq|1(80 zXdAOKb(Cc>24icVjfX%7s#dCME|3fg^PD8qFum-ELb^7f_2tE(5);7dYd>qd*Ak=F zp|b>*S|^`EVY?`9+i=#OCSweW1R7al*bakk;jogTf95x$>^*t@o^LFfrI7AOhy*Ve zoCcC95&OS6i<>UZ2?6#`-~{L@OP~&}CfI{sL=b(q`5(>IOmk$D zC|g~%)1s5XV=+-yK{nquTw{EIVfGP*NFc8uI83L1V*oP&1bn};SYC8n14AaxV~vK}@bHPq3wRq?6OK=@LSg)D`IBs55xX$Ll& z{ul4^8nF8*C6HVY&C}0@`JN2k0q>91YrRJI1kS*->t5>n_Zcs*QV3p*-le zqBvMvJ)Tx}NY$miyLE%4j4;e8zD~JoBPqpxsFKD$oT-!H8gfIk)r*mq*wB4gYn}+} zF~$*aZ*5C)rH15>4^@}}^@v@B>_k}mXz@#6!q7ptpG@&-Ry+Dns>P|n@xR}E*!Tp$ zYHDSc-~{78vq3M$I%%vJKuJ`)xw~pxjyni|j_RmM=(-*?8K#+roXC^o%BdnbKlIj!Dqgp|2W&cq<0TZeZqKXa)5GzsnpZbHS!`VYE7#zB(C;Nkf zIK1YqGK~_aP3q~K<0t;q9YN1UR9SX(1T{*TF877Hd(9Ig{gw5% z(6pY7^G=KlPKnzdR5Ng8jA-HpdET+&VFQSzopaXk5jt#@twt5jVnrH%yhA7c$au6> zja8@s$T5hWMVStv4Py2NBc}Io5sD@rPtWX{qxlH(mg*-g(mMbIh{G$Y(+$c75{gj+ zl+;!j2}fdlJ`zCzu@DJmhh|#b7zzEdxVd=1w!@nb83B=&wtP2aVhvpg3=4R?)V z1o*bG(b%4k#=b+k!)B;YZ?IpePX}taW7<>}cdQd>gnKi{O!htMkyu&9?~8F6J9jqv zeI3q`hsX%SOXmf816Xlhz>e^w8x^F$k{y(tcVD;EDf{gUhsj&vqPyH3GZAkHov?dBu>Er0<+2}YexG8QH zmCDCldDE@DNtM@SWiwmI%=^veHy<# zN6j8#J1f!!(Vb1spdxlUclXqNY(-{KnRx`vz>+cfOAhG8Mcti#plo2lU%c({iCW-57h9jYY1K}E9^w5qL_ z0%ZXj9ix*g9BQM{ti+_`(J(8~nSpi_U9X8kz>Y#?J(^N7NZeiopjH5{?(YZX-T#LF zbwh)v(nq$`9XOR9tlDCiz*yXEi#$QROP1;!7FhEHuz7Izmz8^&{4D5x%;?v0J{!#`my=AcTj%Z-&+0eM{pkLhU5ew zyN}2Mq6ddvDFn>8p+fWV7P}K{wI0(iP#Y-sc&oX;^84+(|NZgsagV+<_u~d^efz&3 z+&@HA?tg^e;S+o~#1DWPbYu9i%K(2sfWMwCMxkLtFmjkOlz&5Cpr$n_SHySqQH-`R z8{r`B#%WnK9`+UnNm0w%pYG-R7B709n(e`Fg?qZ&R~8H_S=Whq?meK`S{AAcw8mt4 zoiPL+0M(Ac+f?ei(NAFisyzR7e@?27IUPE$VgIT_og3~FW=qv_^YE}~>RNzmhf{x< zea@;9+QmZ1&tLXl{Pbe)Z_)E#etwFsiC!}waau9&UE-1UN%E$>bcZ?{&mX`S#%iYBj2C03CLuzX zSru@Nx~24k*|fCj3-COI2eSyDxvN)L(7KVI;8WX1gt0cGY|I*TiJ6xv+tfuGlf&R3 zy~OA-3W(lMG!&Vd%Gg<0^k7RtIT-<`NYVEZeqkK^EQLSUQ)mH~pcYBcBObu)!AL@VM7j~~TF9aq5l z&ot&pxV`Az>T2M;;$Ktyyh+1o&nLkm-u=p>`Q)=Whj=d|%$G8lO@@j`af|1h(UPA1 zTK`3Mp{if78h!cRaJ>~+XEIz4`*WZdT+Ol{dVGV-@-P~D#G`Ad=2%d-6{L~FT;rQ9 z1Qs5IJj-?WO+a(p3LJTTbClkvIxGg83Sg@uiJrcC`Q*jVJA1F*cpI2hvFB|9K@Y?_ zYI~Eigvf<6HD3{_rrfIIcn9sNqdVS1`x~HY=IL>K_W0w660DZ+LQ%7C2X&}u=_`XGx^&}iBdmPL3(%Vl-f(Y_LFj<5xyYA! zu4D`kUkzOs0^81~=^VR+!}{5vp6jPc0e$?eqg-W!))M@@Vp|zf@4K!+Jb$p`v9qy# zSZf89)Rk_?(Q_oLY)TApJ`V}^Tn=_2ReQ575e)ytB zA@Hxo-eac4+-gunq01>5h;zX$|Ij4Uup1R7t4Rn*z1f=Ut`>kWBF3!{sT-< z{O)2d4^V`bvwBi3MWA_vsW|^e74j%oJfA={3zIxjgDtBayH5nZR>vY}lH0xG>iZSD zS3v@5u&8qa{u)FGB2jS${*t6!`ffiMX>4}9PlF! z_EfuywEdLj62BEjFW6|9pJsh3h0XN^URrfK zZQ_PE`1FCnz>-$)`2K#w^LQ zs;LbNjqtB02=V}}t`^Ifw)~=~-sYD;)>o|M+~B+Z+TnFods#pKF4eWMUBij{nl9Y6 z`&L%Fy8T&)?lxU@?q*uFQ35;j{TN&`)LDlxYkCc)7JQ%wfik7v` z%nogh=lQ{4^|o;{e}}%C38?Vs`7NzTiuTGSTzwEdeWsBb|DzlNjBothBY`#ceYQ8f ze1*)e^i@xK<45nh(O13bjSs!+LSOZuCt9)a3W(Q^6>UnO$(6Q%?(C4DfE$;DMcnJ( zCU3((wgplvwQqQ08P|&KdfFOp4WKojVa>DH zugkK5A)3dxH?+0MXTN_S@?Qpb`>OemMqS6#yDsL&;8O`7z`+CTIL=`ZxY6m0<#UuW z=iBBqK+y!|RbO$c|GuDlhvN?XieU%NTejWpMeWdkuhQ!7qE^~AFB|>$+(z2cf9{+2 z`MdsX!F^l+ZjHfJVu)bW0SlaJg)41~=`1J1Ou9o=qieFv)L*5&S4P?FC*x+fiLWuf z+3NiFqt#~XpjP(v#&PsD zRMw@wb|WAGmwC%7kCLDxH zD0v^WO#*aaohM!?!Ri_W_@VX+q@!CuCpT}j@Ql#ao47NAvY-?M1G=6$h|oyc8^=;BL=fSOE3%B%8LG`g4-MOLm)?hs*0D} z7)wh28TBIj@`&;fq*q4eEN91~Y|05Gl`)w=!QUDPe-N=H2gx)M+m|*~Qj$L#QIi(F zO#_c-EPJiK^CH{1L!XjCb zg&1F^%Stl5j&j+Qz*VM0zjn}8VD&$_9v$|6%>1}zGo(}edycT!#4;OS|CY>Ori6l7 z&YobXEMe6-fvCs;&Oavh9Tq1Rh?O6rQjILKiJY}ms(&{kE()|DuL>i6G~wBeos4O3 z^?-_U-+6`MhT}VIIdiK7K2 zTt+~YrM8BER3~nU;Lt0&6SjpZS7kjN46_9)>BJjvOJ>v*yC^BIz=$t2HmDBj%L|30 z`-DsXF4a3T9@9p=_@e;&5^btsq?;~jvBl4+Ggi-RXqUH9jyBfnK}&W{M{d=LMZ)Qt zZInC1VQo5G8zSf|8w}EMO!4F7eur%B@4oIS8xbL!@RKY3VA8DgrTf=iINo;gG&v@a zaZ7Ia`YXS7Rk(D@yZ{VBJ^6i@_Mcj8%x-%7g)^GR?w?!k;1-W;UrCKN=nbTm;%^w( zFoE4UKJ>#Qhvlea*idW&dThA_pM;o{M4ZoOz%B_iKgU2X^Z2t!;mlV0-Bq?fx8JtV zSe<~^`m;%GX?SXq6v?O*iY0wWr*y1KSnpTT+I0eqxiBUP7K>D8{JnELOvdjqG@AjU zlJsC4UaE0cq$k|0+PCi0Z0Swq&0xA=#9a;6C{s$$P<2{%l>CcUM_$ukRyTFexgm-u zh>k?nm#N;e;t=P&sPw5prFqms-TkV^%zwFy1?>kr?~=>T8|Di|WlxhKZK`{B?Th_j zY9OhRDD8|^MSTQ(q5o4&kI}W!O`P3^ZuIPWcwBW3K&w#dy>PK&>2+sqfww(7-Zf82 zGX1EoQ9Tej#~~B>p%Sq#$%;rMRl^_rwlBL5DDsL#K{XuPd$)p)5s6o|Q2+_=n~=?B zWsgD;aw>tPrA{AGg&EeN(~IV$IxMw+@fSySSu8aI^Or(@m?nWJH-VL)8B2@aI*96A zS`Skz(mv>wp2Glo*SZM$y{bhoO)K5`@o-i&y>CY3Nb6A@ z4i%;P+9-(b#C<@W(EZZ;4w(rty)bky7uhzI+dB z257H0o!%D`sm7ve--tM84Rw_crwILpMc9^jiO-4Hy#~E#WyNfmDh-Gl&lg5fY|9QN zT8w*G)Tu=CF8nMGTqlqwZ(lMU`5bXaYj8-2qsL~_)#q3EbxZ&CG8tdRhZR{Nf(_xq z1clTZvO&wB=Y+nQlM&QBSGjG|mKcrgLQ@Q>(xQRVik%2dn$i>qge$Nn2ETjOX~w&1 z6jmU5?j#5l)Ry5%Xm=@vjk5MPqNoRp`m-Jn&WiN|)S9WQ7yZiTP+Ad8Z*%~6BzZ>!(IBm^eDyryK5G zrhU9fZL4iJkel{)Ih$YwBR5aTqB8DZwJ8AJangTpv}&r`)SpFNt-n&bCPnxtq~Kx& zbgTcX6f*8vPibY0dQE!8^ZMpt3y0e=*&6&RYSXg9-9vUoZ9Xv5H9(<;1IsQMPQ9w= z)|6!O^@<9G#D>TT(a9|3s2O#P5M~!%!4NeYw57!@$$mw8ilL|rB>Yp= zd)X9D4Ag1fl#2 z^=g2$1-S2Iu5)&(Jw4T(pQ4DSu#@wWu$&(Ehgtu9+*ZnuGvS?Myq}<Xs_m^_5=JUxEdH|l zx1%RJPyh1v_0H4Xt?2u<`nI?8L_ahBv;OvGckh=sKjY_(d-~h%+o!7D=6CwrPrJ|e z_~SkE?U&aY+&$CBn-@R)$QAFIKAye$^=Gbmf8BiB{b_e^7r);BR)72P)yrMghxxYq z^E1`Sy$AZ+>zyBVx$k@TV9tDP%(f`C`>C=?3Y&*kOE|s>^+_d!8mR`s1p~J4a zu&N#4eqPS@ZldY2F`Zt@CuGH>9df>hrh0Hj)n6tP;@tHujPtv(72R(~n_JPQzB0{E^Dpe8M(|2XTyv}egdRst7r!30;rw1(y3ouH zm$uBLs9Q<}Sfle(dNO^Ao0=1jK(9t~@K(4F37e$sc9h zjXU}mJ&k3*$cIB@cbPT5bDR&ZL|Ln4vqfIXj{jEa_;1(hcrTyS^$SJDLi;I5t>5M> zEanJRQ8V8@A4--8_{+EWCG)%+9KmxA*B)*>rZ@R@g^+gP&S69EfxfR-4I{De;%}iHl}>_0_9G@w<;|7dFHI)b`UcU$c=_aN!HdGo zxVuPnO?TE(dnVwYsZw3@-8j?ZsYquId6F7#{JXmyT`sKwFIc7XLgkUm;!0CoodqV;JK z3c*8KNHoyd#EgLcq5+$CE@< zSvQ>F*8;~~eRVYe!v|Go+AC>tPaG^2Hp{#=4Ky8K;}aIJ3BE3f&E$}_{O#bcy@3YO1d&YVgvwN z!N5Vizi%264)RYxV?RJz=6!{Tc*>|7wslxX=Q3`ak%TC2Jgfv1|If;EpOM7EgAwodig+;_S)78%N3SDl>^sD?Nd~8|$rt++6KL4U2f+ zqrD^BB0av2jj^eI<7$1r&{MTsrcfWNQ;&MFo_J?Yf^&Y|8PzQ5c|>az?Vem2ni-pR zZFaC8fWBYkSJy^7v}}kcvI-W2h&#NvuSe)Qq~WJFf-;rdl@{y7hNPrG>@4w z%Zr&1JL2(${^a6ruDG?Hr!0xdbP5f2<$|e}G#mMNHXi25pwV_vw-=!E)prt{o`UV9?jcH4CD&R6lkxv(hE~ zm+h+&a7ySTA-KfX9eeKi!dAfvhEn=R9~rJg!q5zQ>SitTBmap8c8IPrTHQ@*bz5No zt3B+x)-AM?**#KyCBF_{9p;Cd;YTzl7%f8#A@>dwxzXKdY*^!U77-Yk*z@LS6*C@}XN}b-f%)Mg7l(6p&OMJSnFs}FtXsBJr z>SI42O@`?-?RKX4%FbX!F&^GdK~Om7(>e;9<;_XQ^?T-YIyiRanybQc-Hv9&)OGa%JU zKDyp>@1AZ5A8)V%z@OyPDF~-8fIkBYbg^^d-F4ouhlJp`9gzPuJ%G~jAR>+~wp$c= z(Tp3@GZ2fmw1IohAe|H`rc4Hv8hyqa+;ao(cBZf{DA)$3sDz~wm1p^EI6xP2JPHh= zX&&(c?j-%$Fz?JLJM=W`r?k^q*xFo=kWOX=B?LcChbZHwXUQ}gB@+aOjR0XNR0G%T zIyA1=I$t@n8^8hqPVMkk3syenV#0yIhB)TaH7wkd{4#<=1Nwa8U05_Ja?l<}B}4f6 z)gCs(cCumGVQVOV?wJt&gXQ&c-?rV@Nh10+&dP<1NQciy;du|4%I6}~z- z0bJ3Gl7cqf;)Wv(r47_1dpyz=*`EHw^^FFvZ2W@2z~2lgCqSet7FV>NA=MZh;f~Wp zHB(Ho4ikV52mx0(l6`}8I8A;7dg>jKu8|m7v6u0WyvC`&OrP7#yIc>|RRJX|dVllK z``eAt1L3hOb~RPk?MeoEljX0BF1uI26r9%-b{l$*4NQrv38yeZFSKET@OVZ;%m1<+ zT{)r0aQGn(3cTFv%wd$$>p~Fs61PO4?WOp3rM_K>ZwyH62tcjbke-k*PU2K7WmoeG z9|j2!7#H0O(RCF)jQlFA_KgjF`!PjtAiw3M4}84>{L%-$UIqSZHc+wBc~<9fUsg1xXf8x2Svl zd56`^Q}4^<0qh|CDeM6(obkBH%UN*4hyv;d?t@oGxyXsRZjVl*oHJ*}=cqtISFyLQ zo6V)@)zULeWNt;>in&474)lMP7ui2>LtB7BEeSOOm-7*z$_}}oDdhn7bI?v<&j+0t zWoA$T0JY*GYHoBMbT(TZ@*?&awt9m1YjDT|r9z~Gx@LY2j&N{X=EK=^Zfp>(opjWm z>$&|HgNp$b2vR{l9@+Vq=*NNz_LB@3(@hF1e$Ya{z9x^xYQxiX`btz_dc%fYt$CiM z7ibd^peY!U7<8G>iay#D$=#(A+{gwqa^n{TNkOnR*_s-n?&0f)$sti-vdcP#_YprGiAq=txZz^)vG7J9h;B*iPP&GkzLb zGwyV|cPVKuR2CbBPAT;%3Z4i*f8^4u_fSBjR|U(^Lp{}YuJA1oyv-1GD*+=79y;Bn z8~xRiNe0N=u8g%N;V{+npL44$SN-ue{~FciWg#yZ3Y=*nV_2E~*mmg^a}EGi%lOL( z3OJEwnl7d6U!6n-P2v4FGa!FVz@1UeQE{5*DMhMG!(>!U!`vg z?*lUmkwBXr-gn(i%R~}#N-L+YR*m@ZRv+GWG`&sbYrKcmT|AWw$9abay;dtZ&X6B& z&3`Q$d?V}MHS(@~gtyTG0?H+sqtS16)MWYBN5_}5U|}^ z%-k^D70DGwOo}lJDj5typ!V{e!JzJh>{oN|DySx&X>RZE`$+w;!E2>Nex&jOXiW)C zU15ygP?@9f*I}iqE<#NEI8|E)k<+4~{-vXVY?@m&$Ga$;!^Z7scMOZPKoi&3Txa4k zvbFth|N8l|Kj~?a&n6cjfV-2k$w`sob;s2C9WU6sliBew>v!Lk-OB{yO1>+X?_(W) zzP*2+{)Hd!-~0C-Y<~N18ylPVzq|k7+j|@Eee>S>`gi{pt$)2?+n*U`A&R1Z!@N!N z>Mbh&U;5L%8_|SD|CO94>Y{F#9T!P)6>V)rm`M`P59^%=QS(VUP4Gz`tWMOfs9o;^ z+C*OQacS!VpUk&nI51CRkVklF{Q~}`y1&97@hV;C$>`i6fN3Iv=p zCeTSrcOmGrwlhqN>DGP&syEv3-wpcjCjIvw{r5in_W_kYpwb6a`T$A~+qa&j$FtLy zX<6a{*GONCh12?wozO3K2i*YPZ{epNeJ^MDdcC>crthnbPN#D)-iJf#X{6CSJQ%~* z#`d(hB5-WQgD!t1LwK)eqJe(==ojL7w@e4U9{J;ZsI*nK^n8-Sj*uL~ezQf2W!&bu zJEF=*@hTgaXa$e7go7Jg-8`EgQ|y{oir1NPZJaFd|F@J4k;1+eQ> zko2yOcHLFO%8yVV6rDcDWwvjL>E?SQS1$9AxKs z8Qq`~IA%1UDSU(fa?>vL3iy4xW#^|zC&Q$lHoJGar|rg_WHi}sv_j<%seCxCDSkx7 zr&O#F=+zU#s=iOIUJRPCZUWfpUu~Yp9#HJ~QM}r;Ypf-X3ac@U@X=NTlL#omUuQ)Z zhPhe=wEc-09$o zqqWVMpZ?yX>wa8kjO=eOfBJDcou~#Yy@pwBFq2dti0)Pbg$3HLK%p7(4u(Zdf8*|4 zARlmDYd}uDX5(dfIT~(u5d7ZW>jo0u%+S1M8LY)JKbeMFZeF9u&i&51Y;v6O9l!e#rw_kQP0buP^4l~&NX(FK(UL5q|a(XpP%d<4) z`NQvGcKc;%K4Ylx2EhXMgn~Y{R68GEMXt(+(iL zYhakYIUjf1aV!>;t)!;ltD?B#p@<(>B?`4@{m9Pl5-XlZP|~<^yVQFvqY7x~7e>DG zq(Xs}5@%u*=B@1%og*7m;dV0yv1GbiZN#mrlOa{XFHqcu-z6@qjkfY9BvFQrgdfVC z;Zz_Y2){H6;(ZR5YJiIo_=M*IG_U**BWmcW#UD>s`Ap;5bY&4E2+Eg&NKcSZZQ7!h zXyTHd!oyS~fuu016I}>P)lysp<-9NW*wEz+aDitDlggq8z82!gVne}2g{iBH24E;=JY46hq%FqN?MBZ zVC#%#P{*ScrQvK-XQ5*3FK(+lk!rD_wAo3NuE_oSG!v^cK)rd3RF!MK&|xg8gUVbu z3-Qh!vE;6^D1GF`$_yi4zd&z-y{b&;E6DP9!O%3S&t0~JOa0niZp3B@f8_yx_(BWY zZq45L&d2?Bvj$NufGid@pVe+l{3hYoRB>67@g$wnL9}gSXSd6@X;Sph+T|Or$dhzz z3?gjtKxNUi>Gc}MK+|a5QV`5+DF+HHZK^W8o6~!rOGBJkog-m8#~ob5ZwX@u)|NJz z57hi}Dy&J{7FjaY&`B4on6r*T;?dd$k8Ye^>;afK-o5~$rS+9Bd!eFL^@}=&t!`{H zz*VYk?5CG4qtI7~ysd|!YG1ae#w5FTiBl&)A~}w&1&c@-D-s$J-|EDIgsX9n0c;yV zA8AYNMK&BhrKco5FL0CAjk+LagW1REr4*2)uNAxmfvhZ z7;CA%bH{w$-#An@;TsTSZQp*dA`8({K=4rn<=Ou!wHiA zo(}}cd*@E@GYpl(9Dn>+Q*6Q`x9;5WtEe<7J?5tQNa$oiRVccI`RvY}8a}IZqJvZP zLPSFp#`=(k{ISxD9R`Vkq2cptFTNAk5eJD;@zQ1D`A!-jexpp^ct(_7=wHM^5z9z zkL6?3E$0B^u;8nWI}MU6d|Sfy| z7<-RfASn9VK;rR&nBpNcpnxxPCLrV<_8zR8%QpD1y1LEK*p1o_TIXo7RoB*lhKL0G z&swMs5ApseK7^k~4_Ee|KHJ&b*?&Y9Jp@btU81(0mGsfW_qL?53Vp3MuyPkZpUV=0 ztjh4FEPd3FcMwb7y`&vxrL72fsWalQ%q)gc%q)8>aztTObN}9lqNma#)S*|&cGio( z>7(PqTA8Zp{h+hn_oycRrt}c}n?Fi@^8?mc6_w4QN&TgFcfVsEfYTvfuTUbRmb>^L zQd{z|LzS|0mOiZWXe!A%E(LVaL1$20-)z{ZPylNk1m^9x0umEhoqfftR{y)764qk)!C-RkT}-q!wfS~U#ft5A7IbeYBbunY;s)XgW-0eKJvSo zH_Gop)D$0XeWJC*8`xjcE8Gw2G1xct4tq)Uo3c+reR;#8ersE>q}sKMHu|?b!+F>4 zdV(O94!9;ASJpdsq?Ei!vgy-VQRYSKmiOKeZ(2HiD(l5qk8~2*m>nsUU@esbphFn2 zlSTYC9S_7Mcc;^_U?{Ev6zV~)Snm-yfKiQw?A8lH5_g`R0VoMSeO5=>v!_=J5ceUB zGl8Bx=qIUPw<%vAv#IJ2y^`IIurB*Gblip8Y&F`pjd3Ds`BPBqVeodE6jLNTLnp5S z)b}gvOQm=Ipj-}cynAF&ME+`MQ=wm40|vVg)mD1V1{@3AjGdOSB_t<$W{mZ=ZQ1FxYGVLqdb9L z42S7yGSnPN7I4((B)YEO4#R={(%7mTA0F)h(sCLV?29I#wgK}thm&$Sy{DL2`Lm!n zRvqB2GsZY!2jWJ%@%q)v|IBNg0Z4ZDD*$z(Fj_-$hMa_!>c zVhxWzYqMg=vpI0RazJ(fKS#xO!4yv1#oCKc@f!XA&)(BNw{0W)voq8G0pYZ<6w5Nd zMOsnX)JdDP&9yI1+v{u73?|(K4 zEEWrO-=C6@Y9<|&2^wm;Mm{+^e7cO&vowhhPt(N&TY4Jd)d}pYXu)jLG?{50)Bo9* zPoMK}5lw!RQPo<>lw2vdM{W_SAoOMNPI$C33`eUHtdD%rsml|Q+d$brgx*1=B73TX z{d;U26eG&$icVX^9r>`KpW954Kf>IKb>o>KG~{TGEJ;y9(a5P=CA+j0vSJyUNz^0r z-MjJ!bi|fb66a_=>S>asuao%rmjw*0z6=0;PBC|)claYvH+Sw-e%A9GbZ-&MSJ`p` z=%oo&MZx`Otb!RUgOOzjc$q7wK)_*086_A$%l*P5gMw*~DQF2W7s0DMr^lNp7g0)> zS|eM|shqgZDb2x#13j3=ePgKL1pWETVh2lxP-;F;;%92ht3}E+@vnH~W!f|Nl&pcg zT?6gjsyF4Q<%XR{uM-B#$2F7$ybNeVO2)}FU0|9Kwmf53%S~3$PjS2Ln+dJ__|I!5 z=3Le^kZX7akFcFIeg8X#+7sTlRjHuL_DhG8v_&FZE}w`~sLI7)`jG9O9BAF{PJtAH zR!AT|JHuoSZ?Ma7K42UVO=tq=jYLty!uMMTkRd~fMS%o0-kw6tj_>tdk>!cz^uQ8#u>9+59PvB-I z&MdSOH(&jeEL)l;p-Ch7uaVCa>w;IpA8~Et$W3~Yu7I)gXc6aN+*Y~4#Hi^w#jk#99N3o4F9Ma-)HU4#4VaJTU~3EARq2=6BJrlWY;q9@cuC zySQ)MKH>aUkX|nbO=tEGQrZi%xYEoUk}t8f;J3o992ms)=}4{o#&|M0oN8Fw3V!!i ztfyH^C3*7Y=*5kId3<|hyaGMb4D3loxDu540;U7n+7&A=RNA1OCR~5Zx9|jK>ufG3 zGh-<7f8axyN;k9hNc`%=av6EM^1eD7j$k?yN{v?;&FWQ>6)5d#j#SwVA)r^yc7ol) z8<$TqsN`V3L+)DIi!fivtqFK}FxnRn%gyB3$QsV>(Gpfj^$ew&m+n#V{e#)T{tIqw z^XJ{+J`WLspPDA-^(OLj5=U9WGhi7USWjTOs6&^j>i~%{tQ>aOhGV%C37!C{BElzI zkWKOiJp$3Z#}M(q?6DLP>r#sdXq72&FZ5R*q;kC6}_XkRuf$r_c2C9Yt&T=1%l;u?(e ztHFkB-b9FTcm+QEL29DW|4C!SQP``16v;cFAy{#5J4tB+507Ll1d-CRw!jnV@laT1 z1sOeQfpL=RDWpKo3Yk2#6EIRHhwB>JK&u3yRvLOkv|AWZ2Ddhm7p!PgL-M*YWJHX& zF)Xa)#z}}0U;QjZDuX7K!JuT>cxxQc&@hJYHN!1B*EB|)F)6i=c+gZF&5_l>S2?y) z84tU#UKhn7{r*2a)JP$WZHOmnEBg1jt8Oc0sYN5%puG3sw$r+GR~XDKKm<2;Sy zWMK@etW-}v6m3SQqC`|4|3_AE|4GTHQM24o1G-=AMJcez_R^RsSuWGjMQR8$ZNX4j zYc+e<+sY;iTFsF@qW!HvqK#;m6_6UF+PNB#>w+RN7JB#80wMx>7SqTRh7JFv#KQ{^ zq28lPNW7@}_Gl#Fy0@w%)sqxpCd*SwB&iM%dGjUDX#rEk&Xc+Z=LsH}Em(A5h}0AY z9s6u}$dyPOeAgrY%k$+4M&&Ad-uLKj-2+GuVTm>xRls&p+VqIx&hX?)hIK^oYfJ(e zB_3HTO=*^oqptZ;2D-ik^hS6-pO^hQ9Xo6*KeiUDUk(5sG zls^aw?K`Z_@TVpVB7afMe8{$?KE#BSO47WY>ak3!dAo5jmnMs3<;_1%YZ><_ENP1Q z6&KO#bc$IF`x}^d9!wLu7ezh2U#93w^Oq?S)ad|h8G|#=ae0V0)E-)tlap27qa_K; z9?Y{11sVv!_(7Z;c@z2#I#mSn2JAeV?1F{Yb=WdxqJS?LBW|$3Y+&&+A-kIHpW>$Q zjDjtnJUV(BP0EC>m|H@<%1uA7VJVu|hD^zKh}r}jFOHvW>p5(`nlgv-1LNN|0I07N z>^Dw-nN5$ZFbt0_aUwN(%%G|P)A3GB9a(NzYjo8ZG}aU=#0;4c<63}u62meW+X3}~ z@z)h>K{i!QzXC($Y5*8<>r=tKqUluZ6ccsiKkFV!zx*MyUMNX6SF738Gf?Sj#%(%a zvdr+p*~tuMSBkkSMyh-bmCLUpv*>aB)KN2%N|>gv+afOT;$hQN<> z;Y*nvw?3+HMB`x8^~2T|N}kom)l@}~qq_i`q!L-}r`lCiJjrKO|KEK6&ys2KA@e_) zre|5T`QIK4tiR{~zvAy%GJSNp>L>XmT2<1?Q+_v|s2E3Ld47}bzyLM&?2&rMNxn)Z zFr`ygaUpg4NBcdt-^Y);_;G+ApW??m{P-9@e%+V1&Fy#acNaf?#*Y{H@fJVc{G!PT&8u+5f@u=iaG^afP_&l+b43~zJsS-%#2MHPC0Io2DiLNM~%qR)ky97*g{SB z{(4sbpZvS|_@Bq#jYj`<n?jh`Cm`PMUCj?Ls{oj zB&Gv6PuR252N+TxvD0L-$m;KbqX3xZ>k@e`+QktkOeBkB50lr)3~gV@j&HMc znl9kY38GAM1o$r6%;>t+e7#)YgC9itT)S^Uxz$xh_Zf9gy49i#O;WJNY#0q#Kl@fR zcERn$WtJbaFJas25iMPu`{j4v zRN$wJO%-sun)S*3ENds}A?AM;ZJ^0ng(7-hW>gO8H=1)i0zZ!NrZ~&&vv0wg!wnST zi4`21*0Ez#=`2BqF@OgHA08Zibn7Gadf~VDdk^Ph?6(oLWDg$g?VTr=bhP6buft$_ zdq;O+fpIC4;?nu^Xx(Qfh~NwtyI6L}Ecm&>EC>WD{;kg236j&{ve}8>drnjjNdHeh8t1`MpeZ|l^iDnbL z6pRloGy`C2j9|9KodouvAw{xLT6aK7{iN0djPMTU=Wti(e-v%0J!A~bcrzu5Gd6Y;n}5E z!u!9k(HzHV2yeIatuxZh-@(3F>u0F!{OsbE_IVT?RPeet15A1$>(p6_}=0XnIH^7=S5 zf!YWAIfnIgTk|uO-%%#99O2wSpiVv?kUQ z#KH%xXadu<+f(ZcY7Z?J#K*B5*J@4fK$7cv1Jerwr!}#GAQq|~n5N^oR{O3EW!G9E zO1tY?gSOOKrli)jP2XutsAU!X8iuB8LTl}|q*``CDs+r*I(}fcCDn2ysjdnAVwqNJ zLfxWUJrnJEJ2YEU>j`S1YRC5+&#{XUprLs>ZFVp6%OhF#y+P=EmZ>EfKpVY_@)#1R z>4%UFcHc?*;Kw}IXQ{TZlVm(Rhz_dJ2 zG@;d&SQ1AhmN@}XYL)}&T2ehh>Y?wO?jUd+uQjQzB-J%N&lv=6(3;dxkjgwia9!YX z(3(`Y>{lxcU>KAFc^$E&R*6_E7&yKY`g#?mBQ_AkG7BWhb6_-BZKVgt+d z^(t8>#YsF&H@Rj*)wQt`}yP(KrY| zn6>l*T!UWZvtyw6bLenw5QoD|8unmeym>q1d=a`}A`P$yq zQEEv_ErbkVKF}*E9ks5Y7Bu9*4ni1xt*Pbx>r=g+8x9oxb}g}{B-S!R5DU|H_2z|! zToPs^mw_PLgU}kdt*JF--#T6Z3d6Sb8d*oIBZ&nl&$hyW-j>o3OA`SS%Lcw_hgJ}_ z?%7cGEbzziT{qAVTMel+fQVGrwgSrwO0{~e6nj#NL7WCIP^+JCb)?#|U&9bg#sKEa z9iui)^@g%fvK$7!V}fqhQVgJt&Lwf=3ext2&~hz3$pEW2GCWd{s9oLA)Xzcy+n||@ z4CFK@3kPQ+ZTD)3r9Sex?P!`VXsLmI!qrjh2x?&_30>e7nE0)!H4AD@&+=@&R@RYf zNm6YScx1!q)6251XM=)RnEJpvcf7DIv0Ng_rh$bF40!z0r3W!wC$LSi(leW~7 zqOnOgf?Bma%XiyT>lSkCdca|GpjXK{Vy&WQVG(3oFz1G?$+ZQ!Yyeyi2DYcyQo6nk zW#2j=#UP7Yhi)F7B`>2mMxt>U-Ke1`Fs1_IM(c|L6Dlxiu%;*wQ-N3%c&~b1cpku# z@uhpE;#}c=%hF$2?8%5Nkqvnp(+Q)1B3=gHL~`GSZMZucktyC4WaDJMs5n=CEBd0x z@*Z1naTgWT3Fp!JWwxAkG_O=n|3>lu>cdN{0ljzK-nik*;wz#`>nbw3vw?!PPG`*S zut}G_W1Y^w$6fdlck3kTDxOY1M8z>xJb`bWf5+Wc6`!B~!HUQ1S2ltF;x@IV=^v~O zYl14@T|?jwXW`?g4^9rBK7(d4+EG+ zL==Aem6?~Y4x|4GCA8EQ@=o~wR7F&@^E}GW8SO1C;cV8}T( z@k*T30>0p|oF!-L2Hir@SI7o1P#Fu2qQFII)q^H~W6PAnDNw$W@ zi5)j+)iv7*Vt#varU)RWk)r*o(w zZUIdRvi5en5dZ4d)jF%I8w%W&Nq);7j`9oaVheeq3=#~z+^PfsyKZEOT>%A)P*~~W z=k)%4z7c{=>m%J5mhfQRN!d}Q-aFJJ+5qXKpA<`9dG;q=T-!UldxSbobYN4G_&r ztz^zV%}C_?k#+tN(i#(S({mjawyg{R_>>u@Wjn6t4}$Q)=O+&zePQ4(e)%vOPvYcE zVScqc^o&+d6alwgK8dMwm|(ML7D*^bXVH3OvyE&9lP&$k?cNOzTw*lnHPD3|M|)t# z3Sf;1{-L@`Zujqy_Ob7_=`G$<2JetBA3yo(>u;X^>TO(+&#P8AG0P&If>?!|>53 zMaO;771I>Q^sWkhVAY^I@Tgmd4p;%rD$sTl+O9wgyQs)>!%4^c7J$%KQamM@Xb`4= zCxD6f75wXiN!Vl&jDAsE3N&8}Q8 zRQE!SM{b%L7>Fw3X~w8e>ac+U7bxpJa`ygyEx!$;{RRK@@w(G zu5CJh$N&Bnf1pKfF%d&M!Q*>u0`_o5hx15?J4D)svTVP+hRb|WJ0K{koAT6Xgu6VA+4UPxsfrzZI6^E!5vvmFbo3smpJFwaL$m z_7ZER`bKHkB3rbJE%h?jvPEgYV=#ZTQm?6?3H^+-;U-7~=bE^_hL>%TT&S(dm)UhF zj*i$Vlwzb###d~%T+p!#SeN9WQ1N`e@Qkf8N_Ly$s+@3w0=`JtahIR_9w+E&*Ug^^l(r;lbrk9+CU_$7Fnwu4Mv~yk7;!(;TIB`6_2J65s0or@d=^O(O{6 zpCjad*yM|M)SQoK0}&}Dr6r{eQiLXiAXYDlt<8z2snYnrcV4%$^Jz7r&?qzQti%Ly;|}2IZSo z!5Ce;`IJo*S!A{b=NvzB`XejeN;$LvLV9%QCF~I} z$oI}|M_@s@XT(K?2j*W<{t%kp$^jkM}c*$Ag)V zPr0M(5j@dOqA?yB!|U_T_#&yzc`q7Y@ToBT1NpCXz^|jYUhMj8=k&aeQM)LGVs?sa zR8Zk`*dO8B%&;@QE`S++cKSC3;6}hYU*Qr2{osEx62mnp>L?y2Zs18{euzjsAKb?A zBu8JpQTck3KlAc+FpfTaZY6=0)uGDgSrV%tVt7e1cww<{{e+3X5F1}wjEMro$Y1iD zjO!)_Kp{~|D+tMRZPPCy)Dk=jFe_@^TV~v=lyQyO=wL#oFf1Pzw2JDokGpbq3=KPb z+^WlnO0FFB*0jWKgBCs+O8$zrW_n!%g;G}t10kVu>$EbZJYi(u7FuY!N7RzBgmxN; z(;yFBLaE1PI`}8VM&^0dP?e0L5``meL8>&SESSlv|89YE)s-g!uDZx}ld~kcOsQX{ zIJuiRKOP90_`*_km5MT4z#?cH&vc7-3{SYCQ!t2OYS7t(%=8j&?nbs3CE9W_Se=l( zvUbW2$mbkJ*7$8*PYSA3-uu|O**nldmdY4pDPK2+We|MZR_~#wo`hpYT&M(73RH%B z(Uzsa+7!MFkAxbt;NCSf3-LE_2R_ujyhCdaI_w$$Y>R_Jgt*C!3|1&KF(f4t$cUA7 zAo1}$`<@mBR}!UsOGS$>rDzM^NYFo*c8Mp$A-q7?Q!w9&xshWJAF@qqEL7P{&>VFd z%4kD&ZO*PO!U*7i?>mrMuI%GC_}4ily#yLo-=fCUHn>`^6b%~1Sa`|cP9frL|9>zL z5BL9Qv9Ap?0)~AIM^DFpE4^M=|E-luRp);1z6n?h|5FX1g?%gISYI;a9Qr76OK{Q9a)e;t_g0OT;n0q~6wh zk=f%B_%G2U4u?^^{u|(`@qbX;&%XcFst*5YBcz82HET19Pd#)v#I26vDGdQ0Ejy4x z-YMJ@lxA96l;kiNLhnBH)fR|viLBfNmbpAJnYBCUgX99U+$P5>g(uw|MT5bo@N$eJ z%u3CK&9WG&$jpKmmQ&BobGZez&(dno9;)`4(PXC8K3k&p0<+v+qIN49uBA2bEm3-g zO5fZ5j~M?mdlhw^KDKK7S8G}Pr)uTE;lFN#tf7#+UNU&J;(*3}4i~WRdm^S#qz!%} z_VWZw8ed5zo1`=L>jqzKubdu>xT23C2`%($hM403*s=8kORkdzE2;icso#qggSP_7 yAD3TfKPySgqQC*e($V9{kt0Wr96562$dMyQjvP61 Date: Wed, 9 Jun 2010 19:46:25 +0000 Subject: [PATCH 004/496] CalDAV Infolg support for Evolution (Stylite #602) --- infolog/inc/class.infolog_groupdav.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/infolog/inc/class.infolog_groupdav.inc.php b/infolog/inc/class.infolog_groupdav.inc.php index eb652f7aea..b50c135568 100644 --- a/infolog/inc/class.infolog_groupdav.inc.php +++ b/infolog/inc/class.infolog_groupdav.inc.php @@ -237,7 +237,7 @@ class infolog_groupdav extends groupdav_handler switch($filter['attrs']['name']) { case 'VTODO': - //case 'VCALENDAR': + case 'VCALENDAR': break; default: return false; From be4ae4a37e123f274d1fa2b966b634c1136170c5 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 10 Jun 2010 05:36:28 +0000 Subject: [PATCH 005/496] changing (forced) template from idots to jdots for 10.1 --- preferences/inc/class.preferences_hooks.inc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/preferences/inc/class.preferences_hooks.inc.php b/preferences/inc/class.preferences_hooks.inc.php index e6e8b616d9..804d56a744 100644 --- a/preferences/inc/class.preferences_hooks.inc.php +++ b/preferences/inc/class.preferences_hooks.inc.php @@ -126,7 +126,7 @@ class preferences_hooks 'help' => 'A template defines the layout of eGroupWare and it contains icons for each application.', 'xmlrpc' => True, 'admin' => False, - 'forced' => 'idots', + 'forced' => 'jdots', ), 'theme' => array( 'type' => 'select', @@ -136,7 +136,7 @@ class preferences_hooks 'help' => 'A theme defines the colors and fonts used by the template.', 'xmlrpc' => True, 'admin' => False, - 'forced' => 'idots', + 'forced' => 'jdots', ), 'navbar_format' => array( 'type' => 'select', From 78a410850c393576178acfe52bb2dc4c9206be4b Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 10 Jun 2010 05:55:48 +0000 Subject: [PATCH 006/496] always enable spellchecker, ckeditor now uses spell-as-you-type via a public webservice --- setup/inc/class.setup_process.inc.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/setup/inc/class.setup_process.inc.php b/setup/inc/class.setup_process.inc.php index 39af398422..c14911cb10 100755 --- a/setup/inc/class.setup_process.inc.php +++ b/setup/inc/class.setup_process.inc.php @@ -256,6 +256,9 @@ class setup_process { unset($current_config['aspell_path']); } + // always enable spellchecker, ckeditor now uses spell-as-you-type via a public webservice + $current_config['enabled_spellcheck'] = 'True'; + // RalfBecker: php.net recommend this for security reasons, it should be our default too $current_config['usecookies'] = 'True'; From 7f6ee30cc68f5b9ad01a3f441082309c1b2c7b22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20St=C3=B6ckel?= Date: Thu, 10 Jun 2010 07:34:02 +0000 Subject: [PATCH 007/496] Initializing $top_menu_extra as an array --- phpgwapi/inc/class.egw_framework.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpgwapi/inc/class.egw_framework.inc.php b/phpgwapi/inc/class.egw_framework.inc.php index befbc91589..f6f4e61293 100644 --- a/phpgwapi/inc/class.egw_framework.inc.php +++ b/phpgwapi/inc/class.egw_framework.inc.php @@ -881,7 +881,7 @@ abstract class egw_framework */ abstract function _add_topmenu_info_item($content); - static $top_menu_extra; + static $top_menu_extra = array(); /** * Called by hooks to add an entry in the topmenu location. From 1a7822712006c84377aac907268fdab130e29454 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20St=C3=B6ckel?= Date: Thu, 10 Jun 2010 07:42:15 +0000 Subject: [PATCH 008/496] Including the wz_dragdrop.js again --- phpgwapi/inc/class.dragdrop.inc.php | 1 + 1 file changed, 1 insertion(+) diff --git a/phpgwapi/inc/class.dragdrop.inc.php b/phpgwapi/inc/class.dragdrop.inc.php index 91cba751da..f8d8339e5e 100644 --- a/phpgwapi/inc/class.dragdrop.inc.php +++ b/phpgwapi/inc/class.dragdrop.inc.php @@ -323,6 +323,7 @@ class dragdrop { if($this->browserTestMode || $clientBrowser->get_agent() == $validatedBrowser) { + egw_framework::validate_file('wz_dragdrop', 'wz_dragdrop'); return true; } From 8123e956d44a8dbd2259fbc2cee5cd14cadc96db Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 10 Jun 2010 09:10:17 +0000 Subject: [PATCH 009/496] remove setting of not defined block "submit_column", causing holiday admin to fail --- calendar/inc/class.uiholiday.inc.php | 1 - 1 file changed, 1 deletion(-) diff --git a/calendar/inc/class.uiholiday.inc.php b/calendar/inc/class.uiholiday.inc.php index e2df96b837..8ac72d24e0 100755 --- a/calendar/inc/class.uiholiday.inc.php +++ b/calendar/inc/class.uiholiday.inc.php @@ -78,7 +78,6 @@ $p->set_block('locales','list','list'); $p->set_block('locales','row','row'); $p->set_block('locales','row_empty','row_empty'); - $p->set_block('locales','submit_column','submit_column'); $var = Array( 'th_bg' => $GLOBALS['egw_info']['theme']['th_bg'], From b2d782dcd94d31aa0b660968efc15600acf4758c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20St=C3=B6ckel?= Date: Thu, 10 Jun 2010 10:48:39 +0000 Subject: [PATCH 010/496] Fixed usage of stripslashes in xajax.php --- xajax.php | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/xajax.php b/xajax.php index 6080f02a4c..b4470ca0ad 100644 --- a/xajax.php +++ b/xajax.php @@ -83,17 +83,6 @@ function doXMLHTTP() $argList = func_get_args(); $arg0 = array_shift($argList); - if(get_magic_quotes_gpc()) { - foreach($argList as $key => $value) { - if(is_array($value)) { - foreach($argList as $key1 => $value1) { - $argList[$key][$key1] = stripslashes($value1); - } - } else { - $argList[$key] = stripslashes($value); - } - } - } //error_log("xajax_doXMLHTTP('$arg0',...)"); if (strpos($arg0,'::') !== false && strpos($arg0,'.') === false) // static method name app_something::method @@ -119,6 +108,10 @@ function doXMLHTTP() ); include('./header.inc.php'); + if(get_magic_quotes_gpc()) { + $argList = array_stripslashes($argList); + } + // now the header is included, we can set the charset $GLOBALS['xajax']->configure('characterEncoding',translation::charset()); define('XAJAX_DEFAULT_CHAR_ENCODING',translation::charset()); From de3ee335a926e0172132828d25e84aca3fad141b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20St=C3=B6ckel?= Date: Thu, 10 Jun 2010 10:48:59 +0000 Subject: [PATCH 011/496] Fixed handling of json requests using etemplate.process_exec and fixes in the json encoding of hierarchical values --- phpgwapi/inc/class.egw_json.inc.php | 16 ++-- phpgwapi/js/egw_json.js | 143 ++++++++++++++++++++++++---- 2 files changed, 132 insertions(+), 27 deletions(-) diff --git a/phpgwapi/inc/class.egw_json.inc.php b/phpgwapi/inc/class.egw_json.inc.php index 53ce04295c..8e8874c947 100644 --- a/phpgwapi/inc/class.egw_json.inc.php +++ b/phpgwapi/inc/class.egw_json.inc.php @@ -51,7 +51,6 @@ class egw_json_request $parameters = $request['parameters']; /*$parameters = array_stripslashes($request['parameters']);*/ } - //Call the supplied callback function along with the menuaction and the passed parameters $this->handleRequest($menuaction, $parameters); } @@ -82,15 +81,15 @@ class egw_json_request switch($handler) { case '/etemplate/process_exec': - $menuaction = $appName.'.'.$className.'.'.$functionName; + $_GET['menuaction'] = $appName.'.'.$className.'.'.$functionName; $appName = $className = 'etemplate'; $functionName = 'process_exec'; $menuaction = 'etemplate.etemplate.process_exec'; $parameters = array( - $argList[0]['etemplate_exec_id'], - $argList[0]['submit_button'], - $argList[0], + $parameters[0]['etemplate_exec_id'], + $parameters[0]['submit_button'], + $parameters[0], 'xajaxResponse', ); //error_log("xajax_doXMLHTTP() /etemplate/process_exec handler: arg0='$menuaction', menuaction='$_GET[menuaction]'"); @@ -127,6 +126,10 @@ class egw_json_request $parameters = translation::convert($parameters, 'utf-8'); +// error_log(print_r($parameters, true)); + +// _debug_array($parameters); + call_user_func_array(array($ajaxClass, $functionName), $parameters); } } @@ -351,8 +354,7 @@ class egw_json_response /** * Deprecated legacy xajax wrapper functions for the new egw_json interface */ -/* -class xajaxResponse extends egw_json_response +/*class xajaxResponse extends egw_json_response { public function addScript($script) { diff --git a/phpgwapi/js/egw_json.js b/phpgwapi/js/egw_json.js index ce7d392b3d..f93fee4d9c 100644 --- a/phpgwapi/js/egw_json.js +++ b/phpgwapi/js/egw_json.js @@ -117,6 +117,27 @@ egw_json_request.prototype.sendRequest = function(_async, _callback, _sender) success: this.handleResponse}); } +egw_json_request.prototype.getFormValues = function(_form) +{ + var elem = null; + if (typeof _form == 'object') + { + elem = _form; + } + else + { + elem = document.getElementsByName(_form)[0]; + } + + var serialized = new Object; + if (typeof elem != "undefined" && elem && elem.childNodes) + { + _egw_json_getFormValues(serialized, elem.childNodes) + } + + return serialized; +} + egw_json_request.prototype.alertFunc = function(_message, _details) { alert(_message); @@ -222,30 +243,28 @@ egw_json_request.prototype.handleResponse = function(data, textStatus, XMLHttpRe } - /** * Deprecated legacy xajax wrapper functions for the new egw_json interface */ -/* _xajax_doXMLHTTP = function(_async, _menuaction, _arguments) { - /* Assemble the parameter array *//* + /* Assemble the parameter array */ var paramarray = new Array(); for (var i = 1; i < _arguments.length; i++) { paramarray[paramarray.length] = _arguments[i]; } - /* Create a new request, passing the menuaction and the parameter array *//* + /* Create a new request, passing the menuaction and the parameter array */ var request = new egw_json_request(_menuaction, paramarray); - /* Send the request *//* + /* Send the request */ request.sendRequest(_async); return request; } -xajax_doXMLHTTP = function(_menuaction) +/*xajax_doXMLHTTP = function(_menuaction) { return _xajax_doXMLHTTP(true, _menuaction, arguments); } @@ -257,19 +276,103 @@ xajax_doXMLHTTPsync = function(_menuaction) window.xajax = { "getFormValues": function(_form) - { - var elem = null; - if (typeof _form == 'object') - { - elem = _form; - } - else - { - elem = document.getElementsByName(_form)[0]; - } - - var serialized = $(_form).serializeArray(); - alert("\nSerialized:\n" + serialized); - return serialized; + { + return egw_json_request.prototype.getFormValues(_form); } };*/ + +/* + The following code is adapted from the xajax project which is licensed under + the following license + @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson + @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson + @license http://www.xajaxproject.org/bsd_license.txt BSD License +*/ + +/** + * used internally by the legacy "egw_json_response.getFormValues" to recursively + * run over all form elements + * @param serialized is the object which will contain the form data + * @param children is the children node of the form we're runing over + */ +function _egw_json_getFormValues(serialized, children) +{ + for (var i = 0; i < children.length; ++i) { + var child = children[i]; + + if (typeof child.childNodes != "undefined") + _egw_json_getFormValues(serialized, child.childNodes); + + _egw_json_getFormValue(serialized, child); + } +} + +/** + * used internally to serialize + */ +function _egw_json_getFormValue(serialized, child) +{ + //Return if the child doesn't have a name, is disabled, or is a radio-/checkbox and not checked + if ((typeof child.name == "undefined") || (child.disabled && child.disabled == true) || + (child.type && (child.type == 'radio' || child.type == 'checkbox') && (!child.checked))) + { + return; + } + + var name = child.name; + var values = null; + + if ('select-multiple' == child.type) + { + values = new Array; + for (var j = 0; j < child.length; ++j) + { + var option = child.options[j]; + if (option.selected == true) + values.push(option.value); + } + } + else + { + values = child.value; + } + + //Special treatment if the name of the child contains a [] - then all theese + //values are added to an array. + var keyBegin = name.indexOf('['); + if (0 <= keyBegin) { + var n = name; + var k = n.substr(0, n.indexOf('[')); + var a = n.substr(n.indexOf('[')); + if (typeof serialized[k] == 'undefined') + serialized[k] = new Object; + var p = serialized; // pointer reset + while (a.length != 0) { + var sa = a.substr(0, a.indexOf(']')+1); + + var lk = k; //save last key + var lp = p; //save last pointer + + a = a.substr(a.indexOf(']')+1); + p = p[k]; + k = sa.substr(1, sa.length-2); + if (k == '') { + if ('select-multiple' == child.type) { + k = lk; //restore last key + p = lp; + } else { + k = p.length; + } + } + if (typeof p[k] == 'undefined') + p[k] = new Object; + } + p[k] = values; + } else { + //Add the value to the result object with the given name + if (typeof values != "undefined") + { + serialized[name] = values; + } + } +} From d992e4659d86b7b4cdf1e0f1056b65361d7c15bf Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 10 Jun 2010 12:30:06 +0000 Subject: [PATCH 012/496] fixed not working resource selection in calendar --- resources/inc/class.ui_resources.inc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/inc/class.ui_resources.inc.php b/resources/inc/class.ui_resources.inc.php index 675b00477f..4ca0d0648d 100755 --- a/resources/inc/class.ui_resources.inc.php +++ b/resources/inc/class.ui_resources.inc.php @@ -534,8 +534,8 @@ class ui_resources $selected, array_merge($resources,$res_cats), $no_lang=true, - $options='style="width: 165px;" onchange="load_cal(\''. - $GLOBALS['egw']->link('/index.php',$param).'\',\'uical_select_resource\');" id="uical_select_resource"', + $options='style="width: 100%;" onchange="load_cal(\''. + egw::link('/index.php',$param,false).'\',\'uical_select_resource\');" id="uical_select_resource"', $multiple=count($selected) ? 4 : 0 ); return array( From 68c60ad574812c4f894ca8a397bd7cd6024f7078 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 10 Jun 2010 13:22:02 +0000 Subject: [PATCH 013/496] fixes to be able to start CKEditor without expanded toolbar --- phpgwapi/inc/class.html.inc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpgwapi/inc/class.html.inc.php b/phpgwapi/inc/class.html.inc.php index f4584ed026..51c8e1827f 100644 --- a/phpgwapi/inc/class.html.inc.php +++ b/phpgwapi/inc/class.html.inc.php @@ -584,7 +584,7 @@ class html } // run content through htmlpurifier if ($_purify && !empty($_content)) $_content = self::purify($_content); - $oCKeditor = self::initCKEditor($_height, $_mode); + $oCKeditor = self::initCKEditor($_height, $_mode, $_options); /* Resize the editor to the actual size delivered by the $_height parameter once it is initialized */ $pxheight = (strpos('px', $_height) === false) ? (empty($_height)?400:$_height) : str_replace('px', '', $_height); @@ -595,7 +595,7 @@ class html return $oCKeditor->editor($_name, $_content, null, $events); } - static function &initCKEditor($_height, $_mode) + static function &initCKEditor($_height, $_mode, $_options) { include_once(EGW_INCLUDE_ROOT."/phpgwapi/js/ckeditor3/ckeditor_php5.php"); // use the lang and country information to construct a possible lang info for CKEditor UI and scayt_slang From d3a9f7a2ced4fb992b2579b33d590f9a7e916623 Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Thu, 10 Jun 2010 13:25:05 +0000 Subject: [PATCH 014/496] fix some problems regarding position of divs, and footer information --- felamimail/inc/class.uifelamimail.inc.php | 6 ++---- felamimail/templates/default/app.css | 9 +++++---- felamimail/templates/default/view_attachments.tpl | 4 ++-- felamimail/templates/jerryr/app.css | 9 +++++---- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/felamimail/inc/class.uifelamimail.inc.php b/felamimail/inc/class.uifelamimail.inc.php index 275fd5ae0f..50a16248ba 100644 --- a/felamimail/inc/class.uifelamimail.inc.php +++ b/felamimail/inc/class.uifelamimail.inc.php @@ -512,8 +512,7 @@ $this->t->parse("out","main"); print $this->t->get('out','main'); - - $GLOBALS['egw']->common->egw_footer(); + $GLOBALS['egw']->framework->footer(false); exit; } $this->t->set_var('activeFolder',$urlMailbox); @@ -861,8 +860,7 @@ $this->t->parse("out","main"); print $this->t->get('out','main'); - - $GLOBALS['egw']->common->egw_footer(); + $GLOBALS['egw']->framework->footer(false); } function array_merge_replace( $array, $newValues ) diff --git a/felamimail/templates/default/app.css b/felamimail/templates/default/app.css index dad796313a..af381597b2 100644 --- a/felamimail/templates/default/app.css +++ b/felamimail/templates/default/app.css @@ -436,10 +436,10 @@ DIV.divButton { } #subjectDIV { - position:absolute; + position:fixed; background-color:#ffffff; top:32px; - height:20px; + min-height:20px; width:100%; font-weight:bold; text-align:left; @@ -478,10 +478,11 @@ DIV.divButton { } #attachmentDIV { - position:absolute; + position:fixed; background-color:#efefdf; bottom:0px; - height:80px; + min-height:80px; + max-height:240px; width:100%; border-top: 1px solid silver; overflow:auto; diff --git a/felamimail/templates/default/view_attachments.tpl b/felamimail/templates/default/view_attachments.tpl index 2a47f421ec..20029e0e24 100644 --- a/felamimail/templates/default/view_attachments.tpl +++ b/felamimail/templates/default/view_attachments.tpl @@ -2,10 +2,10 @@ -
    +
    {subject_data}
    -
    +
    {attachment_rows}
    diff --git a/felamimail/templates/jerryr/app.css b/felamimail/templates/jerryr/app.css index bf8f6512b0..11b49e9166 100644 --- a/felamimail/templates/jerryr/app.css +++ b/felamimail/templates/jerryr/app.css @@ -479,10 +479,10 @@ DIV.divButton { } #subjectDIV { - position:absolute; + position:fixed; background-color:#ffffff; top:32px; - height:20px; + min-height:20px; width:100%; font-weight:bold; text-align:left; @@ -521,10 +521,11 @@ DIV.divButton { } #attachmentDIV { - position:absolute; + position:fixed; background-color:#efefdf; bottom:0px; - height:80px; + min-height:80px; + max-height:240px; width:100%; border-top: 1px solid silver; overflow:auto; From 1b641c54b39cb695a3b5caa88ce5232e8701ff59 Mon Sep 17 00:00:00 2001 From: Nathan Gray Date: Thu, 10 Jun 2010 14:28:03 +0000 Subject: [PATCH 015/496] Use json_encode() instead of removed convert_phparray_jsarray() --- etemplate/inc/class.ajax_select_widget.inc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/etemplate/inc/class.ajax_select_widget.inc.php b/etemplate/inc/class.ajax_select_widget.inc.php index c35965b2fe..b8ddb6e79f 100644 --- a/etemplate/inc/class.ajax_select_widget.inc.php +++ b/etemplate/inc/class.ajax_select_widget.inc.php @@ -235,11 +235,11 @@ class ajax_select_widget unset($options[$key]); } } - $options = $GLOBALS['egw']->js->convert_phparray_jsarray("options['$name']", $options, true); + $options = json_encode($options); $GLOBALS['egw']->js->set_onload("if(!options) { var options = new Object(); }\n - $options;\n + options['$name'] = $options;\n ajax_select_widget_setup('$name', '$onchange', options['$name'], '" . $GLOBALS['egw_info']['flags']['currentapp'] . "'); "); $GLOBALS['egw']->js->validate_file('.', 'ajax_select', 'etemplate'); From fd4cc1f95326c17443cadab7b115acc614b7ed59 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 10 Jun 2010 14:31:59 +0000 Subject: [PATCH 016/496] allow json in body on(Load|Unload|Resize) tags --- phpgwapi/inc/class.egw_framework.inc.php | 2 +- phpgwapi/templates/idots/class.idots_framework.inc.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/phpgwapi/inc/class.egw_framework.inc.php b/phpgwapi/inc/class.egw_framework.inc.php index f6f4e61293..43a24e4160 100644 --- a/phpgwapi/inc/class.egw_framework.inc.php +++ b/phpgwapi/inc/class.egw_framework.inc.php @@ -979,7 +979,7 @@ abstract class egw_framework { if (!empty($data)) { - $js .= ' '.$what.'="' . str_replace(array('\\\'','"','\\','''),array(''','\\"','\\\\','\\\''),$data) . '"'; + $js .= ' '.$what.'="' . htmlspecialchars($data) . '"'; } } return $js; diff --git a/phpgwapi/templates/idots/class.idots_framework.inc.php b/phpgwapi/templates/idots/class.idots_framework.inc.php index 08e3634d2c..c23379ed13 100644 --- a/phpgwapi/templates/idots/class.idots_framework.inc.php +++ b/phpgwapi/templates/idots/class.idots_framework.inc.php @@ -97,7 +97,7 @@ class idots_framework extends egw_framework // the instanciation of the template has to be here and not in the constructor, // as the old Template class has problems if restored from the session (php-restore) - $this->tpl = new Template(EGW_TEMPLATE_DIR); + $this->tpl = new Template(EGW_TEMPLATE_DIR,'keep'); $this->tpl->set_file(array('_head' => 'head.tpl')); $this->tpl->set_block('_head','head'); From 3ade470dd084c802ac512934629fa369472b3664 Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Thu, 10 Jun 2010 14:56:11 +0000 Subject: [PATCH 017/496] fixed a few issues regarding the body background-image; is now owned by felamimail/templates/default/images --- felamimail/templates/default/app.css | 5 +++++ .../templates/default/images/body-background.png | Bin 0 -> 229 bytes felamimail/templates/jerryr/app.css | 5 +++++ 3 files changed, 10 insertions(+) create mode 100644 felamimail/templates/default/images/body-background.png diff --git a/felamimail/templates/default/app.css b/felamimail/templates/default/app.css index af381597b2..bd83778f24 100644 --- a/felamimail/templates/default/app.css +++ b/felamimail/templates/default/app.css @@ -225,6 +225,11 @@ A.header_row_FAS, A.header_row_FS font-family : Arial; } +body +{ + background-image:url(images/body-background.png);; +} + .body { FONT-SIZE: 12px; diff --git a/felamimail/templates/default/images/body-background.png b/felamimail/templates/default/images/body-background.png new file mode 100644 index 0000000000000000000000000000000000000000..e345bc3109b706854b9501fba65911823807e727 GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ)!2~2x`7I;J!Gce?B24O}8;pk~VLG}_)Usv{9Y+QVLJkuAyPyhCBD!6<42IxSz#re6Z3i)XYnRz9tMQN!;sd>q%3Q3g; z0hzf9!Fj1Uw=YX-1I-ilba4#fxSssy=Vx_ht%Rfl3@O}<41z0|zH-e>a|SA4@O1Ta JS?83{1OWYkLR$a; literal 0 HcmV?d00001 diff --git a/felamimail/templates/jerryr/app.css b/felamimail/templates/jerryr/app.css index 11b49e9166..ed1376b18e 100644 --- a/felamimail/templates/jerryr/app.css +++ b/felamimail/templates/jerryr/app.css @@ -269,6 +269,11 @@ A.header_row_FAS, A.header_row_FS font-family : Arial; } +body +{ + background-image:url(../default/images/body-background.png);; +} + .body { FONT-SIZE: 12px; From 910ff4f8f291386edaa76dacabba285421569697 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 10 Jun 2010 15:38:36 +0000 Subject: [PATCH 018/496] setting vars empty, which get only conditionally set --- phpgwapi/inc/class.egw_framework.inc.php | 1 + phpgwapi/templates/idots/class.idots_framework.inc.php | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/phpgwapi/inc/class.egw_framework.inc.php b/phpgwapi/inc/class.egw_framework.inc.php index 43a24e4160..7a55c08656 100644 --- a/phpgwapi/inc/class.egw_framework.inc.php +++ b/phpgwapi/inc/class.egw_framework.inc.php @@ -201,6 +201,7 @@ abstract class egw_framework 'img_root' => $GLOBALS['egw_info']['server']['webserver_url'] . $this->template_dir.'/images', 'version' => $GLOBALS['egw_info']['server']['versions']['phpgwapi'] ); + $var['page_generation_time'] = ''; if($GLOBALS['egw_info']['user']['preferences']['common']['show_generation_time']) { $totaltime = sprintf('%4.2lf',microtime(true) - $GLOBALS['egw_info']['flags']['page_start_time']); diff --git a/phpgwapi/templates/idots/class.idots_framework.inc.php b/phpgwapi/templates/idots/class.idots_framework.inc.php index c23379ed13..7e57b2fb17 100644 --- a/phpgwapi/templates/idots/class.idots_framework.inc.php +++ b/phpgwapi/templates/idots/class.idots_framework.inc.php @@ -474,6 +474,10 @@ class idots_framework extends egw_framework )); } } + else + { + $this->tpl->set_var('upper_tabs',''); + } if (!($max_icons=$GLOBALS['egw_info']['user']['preferences']['common']['max_icons'])) { From 6c508a5741dd2fb0394d265bc58cbd0278619f2e Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 10 Jun 2010 16:19:45 +0000 Subject: [PATCH 019/496] default for html::initCKEditor 3. parameter, to fix warning in fmail --- phpgwapi/inc/class.html.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpgwapi/inc/class.html.inc.php b/phpgwapi/inc/class.html.inc.php index 51c8e1827f..d596533350 100644 --- a/phpgwapi/inc/class.html.inc.php +++ b/phpgwapi/inc/class.html.inc.php @@ -595,7 +595,7 @@ class html return $oCKeditor->editor($_name, $_content, null, $events); } - static function &initCKEditor($_height, $_mode, $_options) + static function &initCKEditor($_height, $_mode, $_options=array()) { include_once(EGW_INCLUDE_ROOT."/phpgwapi/js/ckeditor3/ckeditor_php5.php"); // use the lang and country information to construct a possible lang info for CKEditor UI and scayt_slang From c4eab70b7fd94b28d56d3dab33973c3571fa5d8b Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 10 Jun 2010 17:25:18 +0000 Subject: [PATCH 020/496] - missing target for new button in sidebox - adding message to opener.location.search, instead using referer (which points to toplevel frame and reloads framework) --- calendar/inc/class.calendar_ui.inc.php | 2 +- calendar/inc/class.calendar_uiforms.inc.php | 39 ++++++++------------- 2 files changed, 15 insertions(+), 26 deletions(-) diff --git a/calendar/inc/class.calendar_ui.inc.php b/calendar/inc/class.calendar_ui.inc.php index 4644d8312b..a1a02bd629 100644 --- a/calendar/inc/class.calendar_ui.inc.php +++ b/calendar/inc/class.calendar_ui.inc.php @@ -511,7 +511,7 @@ class calendar_ui function popup($link,$target='_blank',$width=750,$height=410) { return 'egw_openWindowCentered2('.($link == 'this.href' ? $link : "'".$link."'").','. - ($target == 'this.target' ? $target : "'".$target."'").",$width,$height,'yes')"; + ($target == 'this.target' ? $target : "'".$target."'").",$width,$height,'yes','calendar')"; } /** diff --git a/calendar/inc/class.calendar_uiforms.inc.php b/calendar/inc/class.calendar_uiforms.inc.php index 8832902382..2b63e659fb 100644 --- a/calendar/inc/class.calendar_uiforms.inc.php +++ b/calendar/inc/class.calendar_uiforms.inc.php @@ -172,7 +172,6 @@ class calendar_uiforms extends calendar_ui } $messages = null; $msg_permission_denied_added = false; - $referer = !empty($content['referer']) ? $content['referer'] : '/index.php?menuaction='.$this->view_menuaction; list($button) = @each($content['button']); if (!$button && $content['action']) $button = $content['action']; // action selectbox unset($content['button']); unset($content['action']); @@ -216,9 +215,8 @@ class calendar_uiforms extends calendar_ui { $msg = lang('Alarm deleted'); unset($content['alarm'][$id]); - $js = 'opener.location.href=\''.addslashes(egw::link($referer,array( - 'msg' => $msg, - ))).'\';'; + $js = "opener.location.search += (opener.location.search?'&msg=':'?msg=')+'". + addslashes($msg)."';"; } else { @@ -398,9 +396,8 @@ class calendar_uiforms extends calendar_ui } if (!$content['no_popup']) { - $js = 'opener.location.href=\''.addslashes(egw::link($referer,array( - 'msg' => $msg, - ))).'\';'; + $js = "opener.location.search += (opener.location.search?'&msg=':'?msg=')+'". + addslashes($msg)."';"; } } } @@ -421,7 +418,6 @@ class calendar_uiforms extends calendar_ui 'reference' => $content['reference'], 'recurrence' => $content['recurrence'], 'actual_date' => $content['actual_date'], - 'referer' => $referer, 'no_popup' => $content['no_popup'], $this->tabs => $content[$this->tabs], 'template' => $content['template'], @@ -615,7 +611,6 @@ class calendar_uiforms extends calendar_ui htmlspecialchars(egw::link('/index.php',array( 'menuaction' => 'calendar.calendar_uiforms.edit', 'cal_id' => $content['id'], - 'referer' => $referer, ))).'">','
    '); $noerror = false; $event = $orig_event; @@ -661,7 +656,6 @@ class calendar_uiforms extends calendar_ui htmlspecialchars(egw::link('/index.php',array( 'menuaction' => 'calendar.calendar_uiforms.edit', 'cal_id' => $content['id'], - 'referer' => $referer, ))).'">',''); $noerror = false; } @@ -718,9 +712,8 @@ class calendar_uiforms extends calendar_ui { egw_link::link('calendar',$event['id'],$content['link_to']['to_id']); } - $js = 'opener.location.href=\''.addslashes(egw::link($referer,array( - 'msg' => $msg, - ))).'\';'; + $js = "opener.location.search += (opener.location.search?'&msg=':'?msg=')+'". + addslashes($msg)."';"; if ($button == 'print') { @@ -741,9 +734,8 @@ class calendar_uiforms extends calendar_ui case 'cancel': if($content['cancel_needs_refresh']) { - $js = 'opener.location.href=\''.addslashes(egw::link($referer,array( - 'msg' => $msg, - ))).'\';'; + $js = "opener.location.search += (opener.location.search?'&msg=':'?msg=')+'". + addslashes($msg)."';"; } break; @@ -783,9 +775,8 @@ class calendar_uiforms extends calendar_ui { $msg = lang('Event deleted'); } - $js = 'opener.location.href=\''.addslashes(egw::link($referer,array( - 'msg' => $msg, - ))).'\';'; + $js = "opener.location.search += (opener.location.search?'&msg=':'?msg=')+'". + addslashes($msg)."';"; } break; @@ -823,9 +814,8 @@ class calendar_uiforms extends calendar_ui $event['alarm'][$alarm_id] = $alarm; $msg = lang('Alarm added'); - $js = 'opener.location.href=\''.addslashes(egw::link($referer,array( - 'msg' => $msg, - ))).'\';'; + $js = "opener.location.search += (opener.location.search?'&msg=':'?msg=')+'". + addslashes($msg)."';"; } else { @@ -852,7 +842,8 @@ class calendar_uiforms extends calendar_ui } if ($content['no_popup']) { - $GLOBALS['egw']->redirect_link($referer,array( + egw::redirect_link('/index.php',array( + 'menuaction' => 'calendar.calendar_uiviews.index', 'msg' => $msg, )); } @@ -982,7 +973,6 @@ class calendar_uiforms extends calendar_ui * @param array $perserv=null following keys: * view boolean view-mode, if no edit-access we automatic fallback to view-mode * hide_delete boolean hide delete button - * referer string menuaction of the referer * no_popup boolean use a popup or not * edit_single int timestamp of single event edited, unset/null otherwise * @param string $msg='' msg to display @@ -1008,7 +998,6 @@ class calendar_uiforms extends calendar_ui { $preserv = array( 'no_popup' => isset($_GET['no_popup']), - 'referer' => common::get_referer('/index.php?menuaction='.$this->view_menuaction), 'template' => isset($_GET['template']) ? $_GET['template'] : (isset($_REQUEST['print']) ? 'calendar.print' : 'calendar.edit'), ); $cal_id = (int) $_GET['cal_id']; From 3ddd42896511a5fb633d36a8a1010a5158df490b Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 10 Jun 2010 17:26:29 +0000 Subject: [PATCH 021/496] returning something, replaces whole window in FF, if used in link as "javascript:egw_openWindowCentered2()" --- phpgwapi/js/jsapi/jsapi.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/phpgwapi/js/jsapi/jsapi.js b/phpgwapi/js/jsapi/jsapi.js index a9877adc50..19090de9ef 100644 --- a/phpgwapi/js/jsapi/jsapi.js +++ b/phpgwapi/js/jsapi/jsapi.js @@ -112,7 +112,8 @@ function egw_openWindowCentered2(_url, _windowName, _width, _height, _status) ",screenX=" + positionLeft + ",left=" + positionLeft + ",screenY=" + positionTop + ",top=" + positionTop + ",location=no,menubar=no,directories=no,toolbar=no,scrollbars=yes,resizable=yes,status="+_status); - return windowID; + // returning something, replaces whole window in FF, if used in link as "javascript:egw_openWindowCentered2()" + //return windowID; } function egw_openWindowCentered(_url, _windowName, _width, _height) From f488a7075b875228962100640848841fbe972577 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 10 Jun 2010 17:54:51 +0000 Subject: [PATCH 022/496] reverting setting of target app, as it is unneccessary --- calendar/inc/class.calendar_ui.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/calendar/inc/class.calendar_ui.inc.php b/calendar/inc/class.calendar_ui.inc.php index a1a02bd629..4644d8312b 100644 --- a/calendar/inc/class.calendar_ui.inc.php +++ b/calendar/inc/class.calendar_ui.inc.php @@ -511,7 +511,7 @@ class calendar_ui function popup($link,$target='_blank',$width=750,$height=410) { return 'egw_openWindowCentered2('.($link == 'this.href' ? $link : "'".$link."'").','. - ($target == 'this.target' ? $target : "'".$target."'").",$width,$height,'yes','calendar')"; + ($target == 'this.target' ? $target : "'".$target."'").",$width,$height,'yes')"; } /** From 968f0407b1ea8919a18c473579b1561cfad0d8cb Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 10 Jun 2010 18:31:53 +0000 Subject: [PATCH 023/496] changelog and spec file for 10.1 --- doc/rpm-build/debian.changes | 269 +++++++++++ doc/rpm-build/egroupware-1.6.spec | 772 ------------------------------ doc/rpm-build/egroupware-epl.spec | 24 +- 3 files changed, 289 insertions(+), 776 deletions(-) delete mode 100644 doc/rpm-build/egroupware-1.6.spec diff --git a/doc/rpm-build/debian.changes b/doc/rpm-build/debian.changes index 3861f09fb7..2550b89529 100644 --- a/doc/rpm-build/debian.changes +++ b/doc/rpm-build/debian.changes @@ -1,3 +1,272 @@ +egroupware-epl (10.1.20100610-1) hardy; urgency=low + + * Versioning for filemanager + * Mail files directly from filemanager + * CKEditor 3 with EGroupware plugin to upload and insert images from filemanager + * History logging in calendar + * Global search over all EGroupware applications + * Search in all apps allow to use AND, OR, NOT + * Bookmarks: new frontend + * Group specific categories + * CalDAV improved support for Lightning, iCal and iPhone + * Stylite template set as preview to new user interface comming later this year + -- Ralf Becker Thu, 10 Jun 2010 20:30:00 +0200 + +egroupware-epl (9.2.20100610-1) hardy; urgency=low + + *API:-Solved problem with magic_quotes_pgc and xajax request with depth greater 1 + * -fix typo that prevented the redisplay of the saved setting for inital-dot-last and intial-last email creation schemes + * -update to Version 4.1.1:HTML Purifier 4.1.1 is a major security and bugfix release that + * improves on 4.1s fix for an XSS vulnerability exploitable on Internet Explorer. + * It also contains a number of important bugfixes, including + * the removal of improper logic that could result in infinite loops and + * fixed parsing for single-attributes with entities with DirectLex. + * -postgres: fix for problem with db_backup/update -> no MetaColumns retrieved anymore: if tablenames are quoted, + * remove the quotes as the use of tablenames in MetaColumns is for comparsion of content of fields in postgres + * system tables; quoting tablenames breaks comparsion here. + *SYNC:CalDAV Infolg support for Evolution + *eMAIL: -fix: display inline text attachment as attachment too, as they are part of a multipart/mixed mail, + * and was not displayed as attachment, but indicated as mail with attachment by headerinformation + * -some additional stuff to improve mailheader decoding + * -remove message_org block in displayMsg as it is used only in view_message_printable template + * -fix to make sure that MDN Send Messages are treated for previewmode as well + *EMAILADMIN: -fix problem regarding the ability to save smtp forwardings triggered by the user + *TRANSLATIONS: various changes and additions + + -- Ralf Becker Thu, 10 Jun 2010 18:13:58 +0200 + +egroupware-epl (9.2.20100528-1) hardy; urgency=low + + * addressbook: fixes in lettersearch, speed regarding the merging of addressdata into documents + * calendar: Allow upgrade of single events to series via SyncML/CalDAV + * CalDAV improvements, Improve series event exception handling + * email: fix sendNotify, printView and draftFolder handling + * notifications: language issues + * various fixes and improvements in file backend, sync, admin + + -- Ralf Becker Fri, 28 May 2010 14:31:48 +0200 + +egroupware-epl (9.2.20100518-1) hardy; urgency=low + + * allow special chars like #, ?, &, " in filenames + * fixes varius GroupDAV & CalDAV issues + * fixes varius SyncML issues + * allow German umlauts in domain names + * other bugfixes in all modules + + -- Ralf Becker Tue, 18 May 2010 14:34:02 +0200 + +egroupware-epl (9.2.20100504-1) hardy; urgency=low + + * addressbook: Add CardDAV support for Apples latest Addressbook.app + * Fix addressbook_bo::find_contact + * htmlpurifier: allow h4-6 in all definitions, allow style for divs + * allow |align|style|width|height for img + * upgrade to 4.1.0 + * eMail: feature to allow copying mails to other folders, (configure via prefs -> ask for cofirmation before moving selected messages) + * use purify to clean potential malicious content out of msg/message + * calendar: feature to allow filter for public events only, + * nicer styling for edit series popup, moved stylites to app.css file + * Export all-day events as EVENT to Nokia devices + * Fix mounthly by day recurrence issues, Fix iCal export of incomplete events + * Reset status of participants when copying an event + * Add Nokia 5800 XpressMusic to supported devices + * Admin: removed Admin >> Manage applications + * api: customfields with links break certian actions in listviews, + * fixed not working $type==owngroups for ldap, + * fixed not exported custom fields + * + + -- Ralf Becker Tue, 04 May 2010 09:36:29 +0200 + +egroupware-epl (9.2.20100420-1) hardy; urgency=low + + * fixed wrong handling of group ACL (wrong grayed out rights) + * fixed wrong sorted and paginated grant ACL dialog + + -- Ralf Becker Tue, 20 Apr 2010 13:44:08 +0200 + +egroupware-epl (9.2.20100418-1) hardy; urgency=low + + * some more SyncML fixes + + -- Ralf Becker Sun, 18 Apr 2010 23:17:48 +0200 + +egroupware-epl (9.2.20100416-1) hardy; urgency=low + + * Bugfixes in SyncML + * improved performance of iCal import + * 3 new indexes for calendar tables and improved queries + * improved signature handling in felamimail (eg. default signatur) + * felamimail folder list sorted now by displayed translated name and + new preference to show all (not only subscribed) folders + * fixed missing information when assigning infolog to project + * fixed global category listing (lost application) + + -- Ralf Becker Fri, 16 Apr 2010 12:14:31 +0200 + +egroupware-epl (9.2.20100406-1) hardy; urgency=low + + * fixed not working planner in 9.2.20100404 + + -- Ralf Becker Tue, 06 Apr 2010 11:23:26 +0200 + +egroupware-epl (9.2.20100404-1) hardy; urgency=low + + * many bugfixes in all areas (inc. Windows 7 WebDAV) + + -- Ralf Becker Sun, 04 Apr 2010 11:33:18 +0200 + +egroupware-epl (9.2.20100322-1) hardy; urgency=low + + * fixed broken install in last version (9.2.20100318) + * ldap account backend can limit now account lists based on application permissions (calendar) + * support for Mandriva mailAccount schema in emailadmin + * bugfixes in several modules + + -- Ralf Becker Mon, 22 Mar 2010 18:05:18 +0100 + +egroupware-epl (9.2.20100318-1) hardy; urgency=low + + * fixed InfoLog loosing links and attachments + * some SyncML and CalDAV/CardDAV/GroupDAV fixes + + -- Ralf Becker Thu, 18 Mar 2010 15:00:00 +0200 + +egroupware-epl (9.2.20100316-1) hardy; urgency=low + + * eventmgr: migrated WPM inhouse and contract status to main table + * mergeprint: fixed bug introduced in 9.2.20100309 (8 and , got lost) + * some SyncML and CalDAV/CardDAV/GroupDAV fixes + * WebDAV is working with Mac OS again + * Further bugfixes/improvments + + -- Ralf Becker Tue, 16 Mar 2010 18:00:00 +0200 + +egroupware-epl (9.2.20100309-1) hardy; urgency=low + + * security problems found by Nahuel Grisolia from CYBSEC S.A. Security Systems: + + one is a serious remote command execution (allowing to run + arbitrary command on the web server by simply issuing a HTTP request!) + + the other a reflected cross-site scripting (XSS) + --> both require NO valid EGroupware account and work without being + logged in! + * eventmgr: fixed deleting of costs, divers reporting problems + * many SyncML and CalDAV/CardDAV/GroupDAV fixes + * Further bugfixes/improvments + + -- Ralf Becker Tue, 9 Mar 2010 00:00:00 +0200 + +egroupware-epl (9.2.20100226-1) hardy; urgency=low + + * eventmgr: fixing issue of timeshifting, when apply failed due to concurrent + * save by another user; display of the unmodified attempted content data, + * removed the option to override in that particular case, added reload option + * addressbook: fix for failed add to organisation from org-view, when colon + * in org_unit/org_location/organisation + * egw-pear: fix for broken native windows WebDav Support + * Furhter fixes/improvments + + -- Ralf Becker Fri, 26 Feb 2010 13:00:00 +0200 + +egroupware-epl (9.2.20100224-1) hardy; urgency=low + + * timesheet: fixes statuschange for whole query + * infolog: fixes lost links, when copying entrys + * fix for issue regarding the linking of entrys (no entry found issue (when entrys are to be found)) + * Furhter fixes/improvments + + -- Ralf Becker Wed, 24 Feb 2010 13:00:00 +0200 + +egroupware-epl (9.2.20100222-1) hardy; urgency=low + * tracker: fixes for categories + * news-admin: fixes for categories, fixes for apply behavior + * phpbrain/knowledgebase: fix for the increasing of the views count for all + * articles shown in list + * email: improving session control for felamimail bosieve async_vacation. + * improving addressselection, + * eventmgr: timezone issues, fixed "missing cat_id or Contract_status attributes" bug + * fixed SQL error, if WPM inhouse is defined more then once in different calendar + * events / for different times + * stylite: ongoing work for versioning streamwrapper (backend) + * sync: various improvements (proper refresh, ti mezoneissues, newline issues) + * general: css adaption for IE7 + * Furhter fixes/improvments + + -- Ralf Becker Mon, 22 Feb 2010 13:00:00 +0200 + +egroupware-epl (9.2.20100215-1) hardy; urgency=medium + * Move some config options to setup, security fixes for fckeditor + * Furhter fixes/improvments + + -- Ralf Becker Mon, 15 Feb 2010 13:00:00 +0200 + +egroupware-epl (9.2.20100212-1) hardy; urgency=low + + * Calendar: database UPDATE + * IMPORTANT NOTE FOR ALL SYNCML USERS. PLEASE READ! + * All users who sync their devices with SyncML have to be aware that an + * "initial sync" will be necessary on any synced device directly after the + * next update of an EGroupware instance. + * GroupDAV devices should be updated automatically and there are no + * further things to do for GroupDAV devices. + * Which updates are affected? + * Updates from EPL9.1 Packages to current EPL9.2 released after 11.th Feb.2010 + * Updates from EPL9.2 Packages prior to 11.th Feb. 2010 to current EPL9.2 + * released after 11.th Feb. 2010 + * Updates from any official version <= 1.6.002 + * - to future 1.6.003 + * - to current SVN versions [branch (Revision 29097) or trunk (Revision 29096)] + * Updates from any SVN version + * - to current SVN versions [branch (Revision 29097) or trunk (Revision 29096)] + * Reason: + * In current EGroupware versions (<= 1.6002) we did not fully match the + * iCal RFC on calendar entries. This caused some hard to resolve problems + * for syncing the calendar entries. With the next update we change the + * contents of the calendar's UID and RECURRENCE-ID database fields to fit + * the iCal RFC. + * Here's some advice on performing the next EGroupware update: + * - let your SyncML users perform a last sync before EGroupware gets updated + * - tell your users to not change any entries on the sync devices until + * the update is finished + * - after the update, let your users perform an "initial sync" on every + * device; this means to let the sync remove all the contents on the device + * and refresh it with the server data; this can be done by a setting on + * your device + * Furhter fixes/improvments / translations + + -- Ralf Becker Fri, 12 Feb 2010 13:00:00 +0200 + +egroupware-epl (9.2.20100205-1) hardy; urgency=low + + * eMail: PreView Issues (Attachment window, tabbing order, feature to be + * able to include/attach more than one message from a given mailbox to a message + * on opening the/a compose window + * Calendar: allow to set calendar favorites on (primary) group level + * Eventmgr: changed in eventmgr.edit some fields in contract-tab for additional OMSE-number + * implemented link-notify method to remove deleted addresses from events + * Furhter fixes/improvments / translations + + -- Ralf Becker Fri, 05 Feb 2010 13:00:00 +0200 + +egroupware-epl (9.2.20100126-1) hardy; urgency=low + + * Fixes in eMail: eMailPreview, Compose TabOrder + * Fixes in setup/backup: Handling of files, Internationalization + * Fixes in Addressbook: emailpopup - layout + * Fixes in Filemanager: pysical files where not deleted + + -- Ralf Becker Tue, 26 Jan 2010 15:00:00 +0200 + +egroupware-epl (9.2.20100115-1) hardy; urgency=low + + * Fixes in eMail: eMailAdresshandling, using preferences regarding folders from profile + * Eventmgr Print with MSExcel always uses . for numbers + * Fix for category display + * Furhter fixes/improvments for Funambol + + -- Ralf Becker Fri, 15 Jan 2010 13:00:00 +0200 + egroupware-epl (9.2.20100112-1) hardy; urgency=low * Fixes for session problems "Wrong domain" with basic auth clients (sogo connector eg.) diff --git a/doc/rpm-build/egroupware-1.6.spec b/doc/rpm-build/egroupware-1.6.spec deleted file mode 100644 index f91b694774..0000000000 --- a/doc/rpm-build/egroupware-1.6.spec +++ /dev/null @@ -1,772 +0,0 @@ -%define packagename eGroupware -%define egwdirname egroupware -%define egwversion 1.6 -%define packaging 001 -#define epoch 1 -%if 0%{?suse_version} - %define httpdroot /srv/www/htdocs - %define httpdconfd /etc/apache2/conf.d - %define source5 egroupware_suse.tar.bz2 - %define distribution SUSE Linux %{?suse_version} - %define php php5 - %define extra_requires apache2 apache2-mod_php5 php_any_db php5-dom - %define cron cron -%endif -%if 0%{?fedora_version} - %define httpdroot /var/www/html - %define httpdconfd /etc/httpd/conf.d - %define osversion %{?fedora_version} - %define source5 egroupware_fedora.tar.bz2 - %define distribution Fedora Core %{?fedora_version} - %define php php - %define extra_requires httpd php-mysql php-xml - %define cron crontabs -%endif -%if 0%{?mandriva_version} - %define httpdroot /var/www/html - %define httpdconfd /etc/httpd/conf.d - %define osversion %{?mandriva_version} - %define source5 egroupware_fedora.tar.bz2 - %define distribution Mandriva %{?mandriva_version} - %define php php - %define extra_requires apache php-mysql php-dom - %define cron crontabs -%endif -%if 0%{?rhel_version} - %define httpdroot /var/www/html - %define httpdconfd /etc/httpd/conf.d - %define osversion %{?rhel_version} - %define source5 egroupware_fedora.tar.bz2 - %define distribution Red Hat %{?rhel_version} - %define php php - %define extra_requires httpd php-mysql php-xml - %define cron crontabs -%endif -%if 0%{?centos_version} - %define httpdroot /var/www/html - %define httpdconfd /etc/httpd/conf.d - %define osversion %{?centos_version} - %define source5 egroupware_fedora.tar.bz2 - %define distribution CentOS %{?centos_version} - %define php php - %define extra_requires httpd php-mysql php-xml - %define cron crontabs -%endif - -%define addressbook addressbook -%define bookmarks bookmarks -%define calendar calendar -%define developer_tools developer_tools -%define egw-pear egw-pear -%define emailadmin emailadmin -%define etemplate etemplate -%define felamimail felamimail -%define filemanager filemanager -%define gallery gallery -%define icalsrv icalsrv -%define infolog infolog -%define importexport importexport -%define manual manual -%define mydms mydms -%define news_admin news_admin -%define notifications notifications -%define phpbrain phpbrain -%define phpsysinfo phpsysinfo -%define polls polls -%define projectmanager projectmanager -%define registration registration -%define resources resources -%define sambaadmin sambaadmin -%define sitemgr sitemgr -%define syncml syncml -%define timesheet timesheet -%define tracker tracker -%define wiki wiki - -Name: %{packagename} -Version: %{egwversion}.%{packaging} -Release: -#Epoch: %{epoch} -Summary: eGroupware is a web-based groupware suite written in php. -Distribution: %{distribution} - -Group: Web/Database -License: GPL/LGPL -URL: http://www.egroupware.org/ -Source0: %{packagename}-%{egwversion}.%{packaging}.tar.bz2 -Source1: %{packagename}-egw-pear-%{egwversion}.%{packaging}.tar.bz2 -Source2: %{packagename}-icalsrv-%{egwversion}.%{packaging}.tar.bz2 -Source3: %{packagename}-mydms-%{egwversion}.%{packaging}.tar.bz2 -Source4: %{packagename}-gallery-%{egwversion}.%{packaging}.tar.bz2 -Source5: %{?source5} -Source6: %{name}-%{version}-rpmlintrc -Patch0: class.uiasyncservice.inc.php.patch -BuildRoot: /tmp/%{packagename}-buildroot -Requires: %{php} %{php}-mbstring %{php}-imap %{php}-gd %{php}-pear %{extra_requires} %{cron} %{packagename}-egw-pear = %{egwversion}.%{packaging} -Provides: egw-core egw-%{addressbook} egw-%{etemplate} -Conflicts: %{packagename}-core %{packagename}-%{addressbook} %{packagename}-%{bookmarks} %{packagename}-%{calendar} %{packagename}-%{developer_tools} %{packagename}-%{emailadmin} %{packagename}-%{felamimail} %{packagename}-%{filemanager} %{packagename}-%{infolog} %{packagename}-%{importexport} %{packagename}-%{manual} %{packagename}-%{news_admin} %{packagename}-%{notifications} %{packagename}-%{phpbrain} %{packagename}-%{polls} %{packagename}-%{projectmanager} %{packagename}-%{registration} %{packagename}-%{resources} %{packagename}-%{sambaadmin} %{packagename}-%{sitemgr} %{packagename}-%{syncml} %{packagename}-%{timesheet} %{packagename}-%{wiki} -Obsoletes: %{packagename}-%{icalsrv} -#otherwise build fails because of jar files in G2 -BuildRequires: unzip - -Prefix: /usr/share -Buildarch: noarch -AutoReqProv: no - -Vendor: eGroupware -Packager: Ralf Becker - -%description -eGroupware is a web-based groupware suite written in PHP. - -This package provides the eGroupware default applications: - -egroupware core with: admin, api, docs, etemplate, prefereces and setup, -addressbook, bookmarks, calendar, translation-tools, emailadmin, felamimail, -filemanager, infolog, manual, news admin, knowledgebase, polls, -projectmanager, resources, sambaadmin, sitemgr, syncml, timesheet, tracker, wiki - -It also provides an API for developing additional applications. - -Further contributed applications are avalible in single packages. - -%package core -Summary: The eGroupware contrib package -Group: Web/Database -Provides: egw-core -Conflicts: %{packagename} -%description core -This package provides the eGroupware core applications. -%post core -%if 0%{?rhel_version} || 0%{?fedora_version} || 0%{?centos_version} - chcon -R -u user_u -r object_r -t httpd_sys_content_t /var/lib/egroupware - setsebool -P httpd_can_network_connect=1 -%endif - -%package %{addressbook} -Version: %{egwversion}.%{packaging} -Summary: The eGroupware %{addressbook} application -Group: Web/Database -Conflicts: %{packagename} -AutoReqProv: no -Requires: egw-core = %{egwversion}.%{packaging} -Provides: egw-%{addressbook} -%description %{addressbook} -Contact manager with Vcard support. -%{addressbook} is the egroupware contact application. -It has different backends to store and retrive contacts -from SQL or LDAP. - -%package %{bookmarks} -Version: %{egwversion}.%{packaging} -Summary: The eGroupware %{bookmarks} application -Group: Web/Database -AutoReqProv: no -Requires: egw-core = %{egwversion}.%{packaging} -%description %{bookmarks} -Manage your bookmarks with eGroupware. Has Netscape plugin. - -%package %{calendar} -Version: %{egwversion}.%{packaging} -Summary: The eGroupware %{calendar} application -Group: Web/Database -Conflicts: %{packagename} -AutoReqProv: no -Requires: egw-core = %{egwversion}.%{packaging} -%description %{calendar} -Powerful calendar with meeting request system, Alarms, ICal and E-Mail support, -and ACL security. - -%package %{developer_tools} -Version: %{egwversion}.%{packaging} -Summary: The eGroupware %{developer_tools} application -Group: Web/Database -Conflicts: %{packagename} -AutoReqProv: no -Requires: egw-core = %{egwversion}.%{packaging} -%description %{developer_tools} -The TranslationTools allow to create and extend translations-files for eGroupware. -They can search the sources for new / added phrases and show you the ones missing in your language. - -%package egw-pear -Version: %{egwversion}.%{packaging} -Summary: The eGroupware egw-pear application -Group: Web/Database -Requires: %{php}-pear -#Conflicts: %{packagename} -AutoReqProv: no -Requires: egw-core = %{egwversion}.%{packaging} -%description egw-pear -egw-pear contains modified pear classes necessary for eGroupware - -%package %{emailadmin} -Version: %{egwversion}.%{packaging} -Summary: The eGroupware %{emailadmin} application -Group: Web/Database -Conflicts: %{packagename} -AutoReqProv: no -Requires: egw-core = %{egwversion}.%{packaging}, %{packagename}-egw-pear = %{egwversion}.%{packaging}, php-openssl -%description %{emailadmin} -EmailAdmin allow to maintain User email accounts - -%package %{felamimail} -Version: %{egwversion}.%{packaging} -Summary: The eGroupware Webmail application -Group: Web/Database -Conflicts: %{packagename} -AutoReqProv: no -Requires: egw-core = %{egwversion}.%{packaging}, %{packagename}-%{emailadmin} = %{egwversion}.%{packaging}, %{packagename}-egw-pear = %{egwversion}.%{packaging} -%description %{felamimail} -The Email application for eGroupware. - -%package %{filemanager} -Version: %{egwversion}.%{packaging} -Summary: The eGroupware %{filemanager} application -Group: Web/Database -Conflicts: %{packagename} -AutoReqProv: no -Requires: egw-core = %{egwversion}.%{packaging}, egw-pear = %{egwversion}.%{packaging} -%description %{filemanager} -This is the %{filemanager} app for eGroupware. - -%package %{gallery} -Version: %{egwversion}.%{packaging} -Summary: The eGroupware %{gallery} application -Group: Web/Database -Conflicts: %{packagename} -AutoReqProv: no -Requires: egw-core = %{egwversion}.%{packaging}, egw-pear = %{egwversion}.%{packaging} -%description %{gallery} -An embedded Gallery2 for eGroupware. - -%package %{icalsrv} -Version: %{egwversion}.%{packaging} -Summary: The eGroupware %{icalsrv} application -Group: Web/Database -AutoReqProv: no -Requires: egw-core = %{egwversion}.%{packaging} -%description %{icalsrv} -This is the old %{icalsrv} app for eGroupware. -It is NOT necessary for GroupDAV, CalDAV or CardDAV, -which is build into the eGroupware core. - -%package %{infolog} -Version: %{egwversion}.%{packaging} -Summary: The eGroupware %{infolog} application -Group: Web/Database -Conflicts: %{packagename} -AutoReqProv: no -Requires: egw-core = %{egwversion}.%{packaging}, egw-%{etemplate} = %{egwversion}.%{packaging} -%description %{infolog} -This is the %{infolog} app for eGroupware (Notes, ToDo, Phonelogs, CRM). - -%package %{importexport} -Version: %{egwversion}.%{packaging} -Summary: The eGroupware %{importexport} application -Group: Web/Database -Conflicts: %{packagename} -AutoReqProv: no -Requires: egw-core = %{egwversion}.%{packaging}, egw-%{etemplate} = %{egwversion}.%{packaging} -%description %{importexport} -This is the %{importexport} app for eGroupware. It includes a comandline client. - -#%package %{jinn} -#Version: %{egwversion}.%{packaging} -#Summary: The eGroupware %{jinn} application -#Group: Web/Database -#AutoReqProv: no -#Requires: egw-core = %{egwversion}.%{packaging} -#%description %{jinn} -#The %{jinn} app is a multi-site, multi-database, multi-user/-group, database driven Content Management System written in and for the eGroupware Framework. - -%package %{manual} -Version: %{egwversion}.%{packaging} -Summary: The eGroupware %{manual} application -Group: Web/Database -Conflicts: %{packagename} -AutoReqProv: no -Requires: egw-core = %{egwversion}.%{packaging} -%description %{manual} -This is the %{manual} app for eGroupware: online help system. - -%package %{mydms} -Version: %{egwversion}.%{packaging} -Summary: The eGroupware %{mydms} application -Group: Web/Database -Conflicts: %{packagename} -AutoReqProv: no -Requires: egw-core = %{egwversion}.%{packaging}, egw-pear = %{egwversion}.%{packaging} -%description %{mydms} -This is a %{mydms} port to eGroupware. - -%package %{news_admin} -Version: %{egwversion}.%{packaging} -Summary: The eGroupware %{news_admin} application -Group: Web/Database -Conflicts: %{packagename} -AutoReqProv: no -Requires: egw-core = %{egwversion}.%{packaging} -%description %{news_admin} -This is the %{news_admin} app for eGroupware. - -%package %{notifications} -Version: %{egwversion}.%{packaging} -Summary: The eGroupware %{notifications} application -Group: Web/Database -Conflicts: %{packagename} -AutoReqProv: no -Requires: egw-core = %{egwversion}.%{packaging} -%description %{notifications} -This is the %{notifications} app for eGroupware. - -%package %{phpbrain} -Version: %{egwversion}.%{packaging} -Summary: The eGroupware %{phpbrain} application -Group: Web/Database -Conflicts: %{packagename} -AutoReqProv: no -Requires: egw-core = %{egwversion}.%{packaging}, %{packagename}-%{addressbook} = %{egwversion}.%{packaging} -%description %{phpbrain} -This is the %{phpbrain} app for eGroupware. - -%package %{phpsysinfo} -Version: %{egwversion}.%{packaging} -Summary: The eGroupware %{phpsysinfo} application -Group: Web/Database -Conflicts: %{packagename} -AutoReqProv: no -Requires: egw-core = %{egwversion}.%{packaging} -%description %{phpsysinfo} -This is the %{phpsysinfo} app for eGroupware. - -%package %{polls} -Version: %{egwversion}.%{packaging} -Summary: The eGroupware %{polls} application -Group: Web/Database -AutoReqProv: no -Requires: egw-core = %{egwversion}.%{packaging} -%description %{polls} -This is the %{polls} app for eGroupware. - -%package %{projectmanager} -Version: %{egwversion}.%{packaging} -Summary: The eGroupware %{projectmanager} application -Group: Web/Database -Conflicts: %{packagename} -AutoReqProv: no -Requires: egw-core = %{egwversion}.%{packaging}, -%description %{projectmanager} -The %{projectmanager} is eGroupware's new project management application. -It's fully integrated into eGroupware and use the data of InfoLog and Calendar. -Plugable datasources allow to support and manage further applications. - -%package %{registration} -Version: %{egwversion}.%{packaging} -Summary: The eGroupware %{registration} application -Group: Web/Database -Conflicts: %{packagename} -AutoReqProv: no -Requires: egw-core = %{egwversion}.%{packaging} -%description %{registration} -This is the %{registration} app for eGroupware. - -%package %{resources} -Version: %{egwversion}.%{packaging} -Summary: The eGroupware %{resources} application -Group: Web/Database -Conflicts: %{packagename} -AutoReqProv: no -Requires: egw-core = %{egwversion}.%{packaging} -%description %{resources} -%{resources} is a resource booking sysmtem for eGroupware. -Which integrates into the calendar. - -%package %{sambaadmin} -Version: %{egwversion}.%{packaging} -Summary: The eGroupware %{sambaadmin} application -Group: Web/Database -Conflicts: %{packagename} -AutoReqProv: no -Requires: egw-core = %{egwversion}.%{packaging} -%description %{sambaadmin} -Manage LDAP based sambaacounts and workstations. - -%package %{sitemgr} -Version: %{egwversion}.%{packaging} -Summary: The eGroupware Sitemanager CMS application -Group: Web/Database -Conflicts: %{packagename} -AutoReqProv: no -Requires: egw-core = %{egwversion}.%{packaging} -%description %{sitemgr} -This is the Sitemanager CMS app for eGroupware. - -%package %{syncml} -Version: %{egwversion}.%{packaging} -Summary: The eGroupware %{syncml} application -Group: Web/Database -Conflicts: %{packagename} -AutoReqProv: no -Requires: egw-core = %{egwversion}.%{packaging}, php >= 5.0.0 -%description %{syncml} -This is the %{syncml} app for eGroupware. - -%package %{timesheet} -Version: %{egwversion}.%{packaging} -Summary: The eGroupware timesheet application -Group: Web/Database -Conflicts: %{packagename} -AutoReqProv: no -Requires: egw-core = %{egwversion}.%{packaging} -%description %{timesheet} -Simple timesheet application, which allow to record and report -the times and other expenses. It can be uses as well standalone -as together with the ProjectManager application. - -%package %{tracker} -Version: %{egwversion}.%{packaging} -Summary: The eGroupware trouble ticket system application -Group: Web/Database -AutoReqProv: no -Requires: egw-core = %{egwversion}.%{packaging} -%description %{tracker} -This is the trouble ticket system app for eGroupware. - -%package %{wiki} -Version: %{egwversion}.%{packaging} -Summary: The eGroupware %{wiki} application -Group: Web/Database -Conflicts: %{packagename} -AutoReqProv: no -Requires: egw-core = %{egwversion}.%{packaging}, -%description %{wiki} -This is the %{wiki} app for eGroupware. - -#%package %{workflow} -#Version: %{egwversion}.%{packaging} -#Summary: The eGroupware %{workflow} application -#Group: Web/Database -#AutoReqProv: no -#Requires: egw-core = %{egwversion}.%{packaging}, -#%description %{workflow} -#This is the %{workflow} app for eGroupware. - -%prep -%setup0 -c -n %{egwdirname} -%setup1 -T -D -a 1 -n %{egwdirname} -%setup2 -T -D -a 2 -n %{egwdirname} -%setup3 -T -D -a 3 -n %{egwdirname} -%setup4 -T -D -a 4 -n %{egwdirname} -%setup5 -T -D -a 5 -n %{egwdirname} -%patch0 -p 0 - -%build - -%install -[ "%{buildroot}" != "/" ] && rm -rf %{buildroot} -mkdir -p $RPM_BUILD_ROOT%{prefix}/%{egwdirname} -cp -aRf etc var $RPM_BUILD_ROOT -cp -aRf egroupware/* $RPM_BUILD_ROOT%{prefix}/%{egwdirname} - -rm -f $RPM_BUILD_ROOT%{prefix}/%{egwdirname}/.htaccess -rm -rf $RPM_BUILD_ROOT%{prefix}/%{egwdirname}/switchuser -rm -rf $RPM_BUILD_ROOT%{prefix}/%{egwdirname}/skel -rm -rf $RPM_BUILD_ROOT%{prefix}/%{egwdirname}/soap -rm -rf $RPM_BUILD_ROOT%{prefix}/%{egwdirname}/xmlrpc -rm -rf $RPM_BUILD_ROOT%{prefix}/%{egwdirname}/messenger -rm -rf $RPM_BUILD_ROOT%{prefix}/%{egwdirname}/workflow -rm -rf $RPM_BUILD_ROOT%{prefix}/%{egwdirname}/jinn -rm -f $RPM_BUILD_ROOT%{prefix}/%{egwdirname}/admin/inc/*.orig - -find $RPM_BUILD_ROOT%{prefix}/%{egwdirname} -name .svn | xargs rm -rf - -cd $RPM_BUILD_ROOT%{prefix}/%{egwdirname} -ln -s ../../../var/lib/egroupware/header.inc.php - -%clean -[ "%{buildroot}" != "/" ] && rm -rf %{buildroot} - -%post -%if 0%{?rhel_version} || 0%{?fedora_version} || 0%{?centos_version} - chcon -R -u user_u -r object_r -t httpd_sys_content_t /var/lib/egroupware - setsebool -P httpd_can_network_connect=1 -%endif -%postun - -%files -%defattr(-,root,root) -%dir %attr(0755,root,root) %{prefix}/%{egwdirname} -%dir %attr(0755,root,root) /var/lib/egroupware -%{prefix}/%{egwdirname}/about.php -%{prefix}/%{egwdirname}/anon_wrapper.php -%{prefix}/%{egwdirname}/header.inc.php -%{prefix}/%{egwdirname}/header.inc.php.template -%{prefix}/%{egwdirname}/index.php -%{prefix}/%{egwdirname}/login.php -%{prefix}/%{egwdirname}/logout.php -%{prefix}/%{egwdirname}/notify.php -%{prefix}/%{egwdirname}/notify_simple.php -%{prefix}/%{egwdirname}/notifyxml.php -%{prefix}/%{egwdirname}/redirect.php -%{prefix}/%{egwdirname}/rpc.php -%{prefix}/%{egwdirname}/set_box.php -%{prefix}/%{egwdirname}/soap.php -%{prefix}/%{egwdirname}/xajax.php -%{prefix}/%{egwdirname}/xmlrpc.php -%{prefix}/%{egwdirname}/svn-helper.php -%{prefix}/%{egwdirname}/webdav.php -%{prefix}/%{egwdirname}/groupdav.php -%{prefix}/%{egwdirname}/admin -%{prefix}/%{egwdirname}/doc -%{prefix}/%{egwdirname}/etemplate -%{prefix}/%{egwdirname}/home -%{prefix}/%{egwdirname}/phpgwapi -%{prefix}/%{egwdirname}/preferences -%{prefix}/%{egwdirname}/setup -%{prefix}/%{egwdirname}/addressbook -%{prefix}/%{egwdirname}/bookmarks -%{prefix}/%{egwdirname}/calendar -%{prefix}/%{egwdirname}/developer_tools -%{prefix}/%{egwdirname}/emailadmin -%{prefix}/%{egwdirname}/felamimail -%{prefix}/%{egwdirname}/filemanager -%{prefix}/%{egwdirname}/icalsrv -%{prefix}/%{egwdirname}/infolog -%{prefix}/%{egwdirname}/importexport -%{prefix}/%{egwdirname}/manual -%{prefix}/%{egwdirname}/mydms -%{prefix}/%{egwdirname}/news_admin -%{prefix}/%{egwdirname}/notifications -%{prefix}/%{egwdirname}/phpbrain -%{prefix}/%{egwdirname}/phpsysinfo -%{prefix}/%{egwdirname}/polls -%{prefix}/%{egwdirname}/projectmanager -%{prefix}/%{egwdirname}/registration -%{prefix}/%{egwdirname}/resources -%{prefix}/%{egwdirname}/sambaadmin -%{prefix}/%{egwdirname}/sitemgr -%{prefix}/%{egwdirname}/syncml -%{prefix}/%{egwdirname}/timesheet -%{prefix}/%{egwdirname}/tracker -%{prefix}/%{egwdirname}/wiki -%attr(0644,root,root) /etc/cron.d/egroupware -%config %attr(0644,root,root) %{httpdconfd}/egroupware.conf -%if 0%{?suse_version} - %dir %attr(0755,root,root) /etc/apache2 - %dir %attr(0755,root,root) %{httpdconfd} - %dir %attr(0755,wwwrun,www) /var/lib/egroupware/default - %dir %attr(0755,wwwrun,www) /var/lib/egroupware/default/files - %dir %attr(0755,wwwrun,www) /var/lib/egroupware/default/backup - %config %attr(0640,wwwrun,www) /var/lib/egroupware/header.inc.php -%endif -%if 0%{?rhel_version} || 0%{?fedora_version} || 0%{?centos_version} - %dir %attr(0755,apache,apache) /var/lib/egroupware/default - %dir %attr(0755,apache,apache) /var/lib/egroupware/default/files - %dir %attr(0755,apache,apache) /var/lib/egroupware/default/backup - %config %attr(0640,apache,apache) /var/lib/egroupware/header.inc.php -%endif -%if 0%{?mandriva_version} - %dir %attr(0755,apache,apache) /var/lib/egroupware/default - %dir %attr(0755,apache,apache) /var/lib/egroupware/default/files - %dir %attr(0755,apache,apache) /var/lib/egroupware/default/backup - %config %attr(0640,apache,apache) /var/lib/egroupware/header.inc.php -%endif - -%files core -%defattr(-,root,root) -%dir %{prefix}/%{egwdirname} -%dir /var/lib/egroupware -%{prefix}/%{egwdirname}/about.php -%{prefix}/%{egwdirname}/anon_wrapper.php -%{prefix}/%{egwdirname}/header.inc.php -%{prefix}/%{egwdirname}/header.inc.php.template -%{prefix}/%{egwdirname}/index.php -%{prefix}/%{egwdirname}/login.php -%{prefix}/%{egwdirname}/logout.php -%{prefix}/%{egwdirname}/notify.php -%{prefix}/%{egwdirname}/notify_simple.php -%{prefix}/%{egwdirname}/notifyxml.php -%{prefix}/%{egwdirname}/redirect.php -%{prefix}/%{egwdirname}/rpc.php -%{prefix}/%{egwdirname}/set_box.php -%{prefix}/%{egwdirname}/soap.php -%{prefix}/%{egwdirname}/xajax.php -%{prefix}/%{egwdirname}/xmlrpc.php -%{prefix}/%{egwdirname}/groupdav.php -%{prefix}/%{egwdirname}/webdav.php -%{prefix}/%{egwdirname}/admin -%{prefix}/%{egwdirname}/doc -%{prefix}/%{egwdirname}/etemplate -%{prefix}/%{egwdirname}/home -%{prefix}/%{egwdirname}/phpgwapi -%{prefix}/%{egwdirname}/preferences -%{prefix}/%{egwdirname}/setup -%attr(0644,root,root) /etc/cron.d/egroupware -%config %attr(0644,root,root) %{httpdconfd}/egroupware.conf -%if 0%{?suse_version} - %dir %attr(0755,root,root) /etc/apache2 - %dir %attr(0755,root,root) %{httpdconfd} - %dir %attr(0755,wwwrun,www) /var/lib/egroupware/default - %dir %attr(0755,wwwrun,www) /var/lib/egroupware/default/files - %dir %attr(0755,wwwrun,www) /var/lib/egroupware/default/backup - %config %attr(0640,wwwrun,www) /var/lib/egroupware/header.inc.php -%endif -%if 0%{?rhel_version} || 0%{?fedora_version} || 0%{?centos_version} - %dir %attr(0755,apache,apache) /var/lib/egroupware/default - %dir %attr(0755,apache,apache) /var/lib/egroupware/default/files - %dir %attr(0755,apache,apache) /var/lib/egroupware/default/backup - %config %attr(0640,apache,apache) /var/lib/egroupware/header.inc.php -%endif -%if 0%{?mandriva_version} - %dir %attr(0755,apache,apache) /var/lib/egroupware/default - %dir %attr(0755,apache,apache) /var/lib/egroupware/default/files - %dir %attr(0755,apache,apache) /var/lib/egroupware/default/backup - %config %attr(0640,apache,apache) /var/lib/egroupware/header.inc.php -%endif - -%files %{addressbook} -%defattr(-,root,root) -%{prefix}/%{egwdirname}/%{addressbook} - -%files %{calendar} -%defattr(-,root,root) -%{prefix}/%{egwdirname}/%{calendar} - -%files %{developer_tools} -%defattr(-,root,root) -%{prefix}/%{egwdirname}/%{developer_tools} - -%files egw-pear -%defattr(-,root,root) -%{prefix}/%{egwdirname}/egw-pear - -%files %{emailadmin} -%defattr(-,root,root) -%{prefix}/%{egwdirname}/%{emailadmin} - -%files %{felamimail} -%defattr(-,root,root) -%{prefix}/%{egwdirname}/%{felamimail} - -%files %{filemanager} -%defattr(-,root,root) -%{prefix}/%{egwdirname}/%{filemanager} - -%files %{gallery} -%defattr(-,root,root) -%{prefix}/%{egwdirname}/%{gallery} - -%files %{icalsrv} -%defattr(-,root,root) -%{prefix}/%{egwdirname}/%{icalsrv} - -%files %{infolog} -%defattr(-,root,root) -%{prefix}/%{egwdirname}/%{infolog} - -%files %{importexport} -%defattr(-,root,root) -%{prefix}/%{egwdirname}/%{importexport} - -#%files %{jinn} -#%defattr(-,root,root) -#%{prefix}/%{egwdirname}/%{jinn} - -%files %{manual} -%defattr(-,root,root) -%{prefix}/%{egwdirname}/%{manual} - -%files %{mydms} -%defattr(-,root,root) -%{prefix}/%{egwdirname}/%{mydms} - -%files %{news_admin} -%defattr(-,root,root) -%{prefix}/%{egwdirname}/%{news_admin} - -%files %{notifications} -%defattr(-,root,root) -%{prefix}/%{egwdirname}/%{notifications} - -%files %{phpbrain} -%defattr(-,root,root) -%{prefix}/%{egwdirname}/%{phpbrain} - -%files %{phpsysinfo} -%defattr(-,root,root) -%{prefix}/%{egwdirname}/%{phpsysinfo} - -%files %{polls} -%defattr(-,root,root) -%{prefix}/%{egwdirname}/%{polls} - -%files %{projectmanager} -%defattr(-,root,root) -%{prefix}/%{egwdirname}/%{projectmanager} - -%files %{registration} -%defattr(-,root,root) -%{prefix}/%{egwdirname}/%{registration} - -%files %{resources} -%defattr(-,root,root) -%{prefix}/%{egwdirname}/%{resources} - -%files %{sambaadmin} -%defattr(-,root,root) -%{prefix}/%{egwdirname}/%{sambaadmin} - -%files %{sitemgr} -%defattr(-,root,root) -%{prefix}/%{egwdirname}/%{sitemgr} - -%files %{timesheet} -%defattr(-,root,root) -%{prefix}/%{egwdirname}/%{timesheet} - -%files %{tracker} -%defattr(-,root,root) -%{prefix}/%{egwdirname}/%{tracker} - -%files %{wiki} -%defattr(-,root,root) -%{prefix}/%{egwdirname}/%{wiki} - -#%files %{workflow} -#%defattr(-,root,root) -#%{prefix}/%{egwdirname}/%{workflow} - - -%changelog -* Mon Nov 24 2008 Ralf Becker 1.6.001 -- eGroupware 1.6.001 final 1.6 release - -* Sun Nov 16 2008 Ralf Becker 1.6.rc5 -- eGroupware 1.6.rc5 5. release candidate for 1.6 release - -* Sun Nov 9 2008 Ralf Becker 1.6.rc4 -- eGroupware 1.6.rc4 4. release candidate for 1.6 release - -* Wed Oct 29 2008 Ralf Becker 1.6.rc3 -- eGroupware 1.6.rc3 3. release candidate for 1.6 release - -* Wed Oct 22 2008 Ralf Becker 1.6.rc2 -- eGroupware 1.6.rc2 2. release candidate for 1.6 release - -* Fri Oct 10 2008 Ralf Becker 1.6.rc1 -- eGroupware 1.6.rc1 first release candidate for 1.6 release - -* Tue Jul 22 2008 Ralf Becker 1.6.pre1 -- eGroupware 1.6.pre1 first preview of upcomming 1.6 release - -* Mon Apr 15 2008 Ralf Becker 1.4.004 -- eGroupware 1.4.004 FCKeditor update (2.6) & security release - -* Mon Mar 19 2008 Ralf Becker 1.4.003 -- eGroupware 1.4.003 security & maintainace release - -* Mon Sep 24 2007 Ralf Becker 1.4.002 -- eGroupware 1.4.002 bugfix & maintainace release - -* Mon Jun 4 2007 Ralf Becker 1.4.001 -- final eGroupware 1.4 release diff --git a/doc/rpm-build/egroupware-epl.spec b/doc/rpm-build/egroupware-epl.spec index 91e2ad12aa..f6a34a057e 100644 --- a/doc/rpm-build/egroupware-epl.spec +++ b/doc/rpm-build/egroupware-epl.spec @@ -1,5 +1,5 @@ Name: egroupware-epl -Version: 9.2.20100504 +Version: 10.1.20100610 Release: Summary: EGroupware is a web-based groupware suite written in php. Group: Web/Database @@ -62,9 +62,10 @@ Source1: %{name}-egw-pear-%{version}.tar.bz2 Source2: %{name}-stylite-%{version}.tar.bz2 Source3: %{name}-eventmgr-%{version}.tar.bz2 Source4: %{name}-phpfreechat-%{version}.tar.bz2 -Source5: phpfreechat_data_public.tar.gz -Source6: debian.changes -Source7: %{name}-rpmlintrc +Source5: %{name}-jdots-%{version}.tar.bz2 +Source6: phpfreechat_data_public.tar.gz +Source7: debian.changes +Source8: %{name}-rpmlintrc Patch0: class.uiasyncservice.inc.php.patch Patch1: stylite-postfix-suse.patch #Patch2: mandriva_upload_tmp_dir.patch @@ -88,6 +89,7 @@ Requires: %{name}-felamimail >= %{version} Requires: %{name}-filemanager >= %{version} Requires: %{name}-infolog >= %{version} Requires: %{name}-importexport >= %{version} +Requires: %{name}-jdots >= %{version} Requires: %{name}-manual >= %{version} Requires: %{name}-news_admin >= %{version} Requires: %{name}-notifications >= %{version} @@ -295,6 +297,15 @@ Obsoletes: %{egw_packagename}-importexport %description importexport This is the importexport app for EGroupware. It includes a comandline client. +%package jdots +Version: %{version} +Summary: New jQuery based Stylite template for EGroupware +Group: Web/Database +AutoReqProv: no +Requires: egw-core >= %{version} +%description jdots +Stylite template is a preview to the new jQuery based user interface coming later this year. + %package manual Version: %{version} Summary: The EGroupware manual application @@ -505,6 +516,7 @@ for Thomson-Reuters. %setup3 -T -D -a 3 -n %{egwdirname} %setup4 -T -D -a 4 -n %{egwdirname} %setup5 -T -D -a 5 -n %{egwdirname} +%setup6 -T -D -a 6 -n %{egwdirname} %patch0 -p 0 %patch1 -p 0 #%patch2 -p 0 @@ -632,6 +644,10 @@ install -m 444 %{SOURCE6} $RPM_BUILD_ROOT%{egwdir}/doc/rpm-build %defattr(-,root,root) %{egwdir}/importexport +%files jdots +%defattr(-,root,root) +%{egwdir}/jdots + %files manual %defattr(-,root,root) %{egwdir}/manual From b2ace2053627b3bec544b584692253d23494949d Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 10 Jun 2010 18:36:03 +0000 Subject: [PATCH 024/496] removed outdated changelog --- emailadmin/Changelog | 49 -------------------------------------------- 1 file changed, 49 deletions(-) delete mode 100644 emailadmin/Changelog diff --git a/emailadmin/Changelog b/emailadmin/Changelog deleted file mode 100644 index 448204b38b..0000000000 --- a/emailadmin/Changelog +++ /dev/null @@ -1,49 +0,0 @@ -2007-06-19 Lars Kneschke - * added support for defining signature handling in emailadmin - -2007-01-05 Lars Kneschke - * improved parsing of content-type response - -2007-01-03 Lars Kneschke - * enabled renaming of dbmail accounts - * made SSL/TLS settings working again - -2006-12-31 Lars Kneschke - * major rewrite of the imap backend. the imap backend is not handled - by the php extension php-imap anymore, but the PEAR class Net_IMAP. - * improved handling of namespaces - * improved performance of most imap operations - * improved folderhandling - * make emailadmin dependent on egw-pear - -20061010 lkneschke@metaways.de - -- added support for dbmailuser schema - -20060416 RalfBecker-AT-outdoor-training.de: - -- added plesk plugin to create mail accounts and manage passwords, aliases - forwards and quota on a plesk system (tested with plesk7.5 Linux) - -20051128 - -- added function to retrieve users profile based on applicationname and - groupmembership. No need to select profile as admin anymore. - -20051120 - -- fixed opening "edit profile" dialog in new window -- fixed handling of groups in "edit profile" dialog - -20051123 - -- polished gui a little bit. the gui looks much better now. at least i hope so :-) -- added option to define global used smtp auth options -- made multiple profiles useable. you can now assign profiles depending on - application name and group membership. - - -20051013 - -- Postfix LDAP users can now update there email forwardingaddress - themself(if enabled) From f9f15a32a9c70938811a0364cb3c51686868c4af Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 10 Jun 2010 18:42:10 +0000 Subject: [PATCH 025/496] disabling no longer needed stylite-postfix-suse.patch and fixed wrong source# of debian.changelog --- doc/rpm-build/egroupware-epl.spec | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/rpm-build/egroupware-epl.spec b/doc/rpm-build/egroupware-epl.spec index f6a34a057e..14b38b057f 100644 --- a/doc/rpm-build/egroupware-epl.spec +++ b/doc/rpm-build/egroupware-epl.spec @@ -67,7 +67,7 @@ Source6: phpfreechat_data_public.tar.gz Source7: debian.changes Source8: %{name}-rpmlintrc Patch0: class.uiasyncservice.inc.php.patch -Patch1: stylite-postfix-suse.patch +#Patch1: stylite-postfix-suse.patch #Patch2: mandriva_upload_tmp_dir.patch BuildRoot: %{_tmppath}/%{name}-9.2-buildroot @@ -518,7 +518,7 @@ for Thomson-Reuters. %setup5 -T -D -a 5 -n %{egwdirname} %setup6 -T -D -a 6 -n %{egwdirname} %patch0 -p 0 -%patch1 -p 0 +#%patch1 -p 0 #%patch2 -p 0 %build @@ -544,7 +544,7 @@ ln -s ../../..%{egwdatadir}/header.inc.php ln -s php5 php %endif # copy current changelog to doc/rpm-build -install -m 444 %{SOURCE6} $RPM_BUILD_ROOT%{egwdir}/doc/rpm-build +install -m 444 %{SOURCE7} $RPM_BUILD_ROOT%{egwdir}/doc/rpm-build %clean [ "%{buildroot}" != "/" ] && rm -rf %{buildroot} From 66b10eaad0864ddebce28011a4e48f9521be9107 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 10 Jun 2010 18:45:22 +0000 Subject: [PATCH 026/496] only force jdots template, if it is available --- preferences/inc/class.preferences_hooks.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/preferences/inc/class.preferences_hooks.inc.php b/preferences/inc/class.preferences_hooks.inc.php index 804d56a744..0ce9eb9132 100644 --- a/preferences/inc/class.preferences_hooks.inc.php +++ b/preferences/inc/class.preferences_hooks.inc.php @@ -126,7 +126,7 @@ class preferences_hooks 'help' => 'A template defines the layout of eGroupWare and it contains icons for each application.', 'xmlrpc' => True, 'admin' => False, - 'forced' => 'jdots', + 'forced' => file_exists(EGW_SERVER_ROOT.'/jdots') ? 'jdots' : 'idots', ), 'theme' => array( 'type' => 'select', From 9647798988ab709f84cb0de8f5c94d0fa6f525ba Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 10 Jun 2010 18:56:58 +0000 Subject: [PATCH 027/496] small fixes --- doc/rpm-build/checkout-build-archives.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/rpm-build/checkout-build-archives.php b/doc/rpm-build/checkout-build-archives.php index 055b6450b0..df91de6c41 100755 --- a/doc/rpm-build/checkout-build-archives.php +++ b/doc/rpm-build/checkout-build-archives.php @@ -39,7 +39,7 @@ $config = array( 'obs' => false, 'changelog' => false, // eg. '* 1. Zeile\n* 2. Zeile' for debian.changes 'changelog_packager' => 'Ralf Becker ', - 'svntag' => 'Stylite-EPL-$version.$packaging', // eg. '$version.$packaging' + 'svntag' => 'tags/Stylite-EPL-$version.$packaging', // eg. '$version.$packaging' 'skip' => array(), 'run' => array('svntag','checkout','copy','virusscan','create','sign') ); @@ -77,7 +77,7 @@ while(($arg = array_shift($argv))) } else { - $config[$name] = array_unique(preg_split('/[ ,]+/',$value)); + $config[$name] = array_unique(split('[ ,]+',$value)); } break; @@ -150,7 +150,7 @@ function do_obs() ++$n; } // updating dsc, spec and changelog files - if (substr($path,-4) == '.dsc' || substr($path,-5) == '.spec' || + if (substr($path,-4) == '.dsc' || substr($path,-5) == '.spec' || !empty($config['changelog']) && basename($path) == 'debian.changes') { $content = $content_was = file_get_contents($path); From fbd71f1f1c12f936b3aad77a9d66b65e9f5f89ff Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 10 Jun 2010 19:02:07 +0000 Subject: [PATCH 028/496] forgot jdots --- doc/rpm-build/checkout-build-archives.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/rpm-build/checkout-build-archives.php b/doc/rpm-build/checkout-build-archives.php index df91de6c41..218aef4666 100755 --- a/doc/rpm-build/checkout-build-archives.php +++ b/doc/rpm-build/checkout-build-archives.php @@ -29,7 +29,7 @@ $config = array( 'svnbranch' => 'branches/Stylite-EPL-10.1', // 'branches/1.6' or 'tags/1.6.001' 'svnalias' => 'epl-ssh', // default alias 'aliasdir' => 'egroupware', // directory created by the alias - 'extra' => array('stylite','$egwbase/$svnbranch/egw-pear','$egwbase/$svnbranch/gallery','$egwbase/$svnbranch/phpfreechat','svn+ssh://stylite@svn.stylite.de/stylite/trunk/eventmgr'), + 'extra' => array('stylite','jdots','$egwbase/$svnbranch/egw-pear','$egwbase/$svnbranch/gallery','$egwbase/$svnbranch/phpfreechat','svn+ssh://stylite@svn.stylite.de/stylite/trunk/eventmgr'), 'types' => array('tar.bz2','tar.gz','zip'), 'svn' => '/usr/bin/svn', 'clamscan' => '/usr/bin/clamscan', From 7417e91bc204606adbf40ceeefeb648e43e7c1d2 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 10 Jun 2010 20:05:04 +0000 Subject: [PATCH 029/496] fixed line numbers --- doc/rpm-build/class.uiasyncservice.inc.php.patch | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/doc/rpm-build/class.uiasyncservice.inc.php.patch b/doc/rpm-build/class.uiasyncservice.inc.php.patch index 0886263e04..0e6b2e5bda 100644 --- a/doc/rpm-build/class.uiasyncservice.inc.php.patch +++ b/doc/rpm-build/class.uiasyncservice.inc.php.patch @@ -1,8 +1,8 @@ Index: egroupware/phpgwapi/inc/class.egw.inc.php =================================================================== ---- egroupware/phpgwapi/inc/class.egw.inc.php (Revision 28514) +--- egroupware/phpgwapi/inc/class.egw.inc.php (Revision 30699) +++ egroupware/phpgwapi/inc/class.egw.inc.php (Arbeitskopie) -@@ -490,10 +490,12 @@ +@@ -534,10 +534,12 @@ } // call the asyncservice check_run function if it is not explicitly set to cron-only // @@ -17,9 +17,9 @@ Index: egroupware/phpgwapi/inc/class.egw.inc.php } Index: egroupware/admin/inc/class.uiasyncservice.inc.php =================================================================== ---- egroupware/admin/inc/class.uiasyncservice.inc.php (Revision 28512) +--- egroupware/admin/inc/class.uiasyncservice.inc.php (Revision 30699) +++ egroupware/admin/inc/class.uiasyncservice.inc.php (Arbeitskopie) -@@ -96,16 +96,20 @@ +@@ -99,16 +99,20 @@ $config->save_repository(); unset($config); } @@ -40,7 +40,7 @@ Index: egroupware/admin/inc/class.uiasyncservice.inc.php echo '

    '.lang('Run Asynchronous services').''. ' \n". lang("for the times below (empty values count as '*', all empty = every minute)")."

    \n"; From db1b766dbb5e592150a2769b82567b11ffb9f58a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Lehrke?= Date: Fri, 11 Jun 2010 07:33:22 +0000 Subject: [PATCH 030/496] Fix enddate and alarm issue for series event shifting --- calendar/inc/class.calendar_uiforms.inc.php | 50 ++++++++++++++------- 1 file changed, 35 insertions(+), 15 deletions(-) diff --git a/calendar/inc/class.calendar_uiforms.inc.php b/calendar/inc/class.calendar_uiforms.inc.php index 2b63e659fb..4cef52148a 100644 --- a/calendar/inc/class.calendar_uiforms.inc.php +++ b/calendar/inc/class.calendar_uiforms.inc.php @@ -565,6 +565,7 @@ class calendar_uiforms extends calendar_ui } if ($edit_series_confirmed) { + $orig_event = $event; if (!empty($event['whole_day'])) { // Adjust start to 0:00 @@ -575,10 +576,6 @@ class calendar_uiforms extends calendar_ui $time->setTime(0, 0, 0); $next_occurrence['start'] = egw_time::to($time, 'ts'); } - $orig_event = $event; - $time = new egw_time($this->bo->now_su); - $time->setTime(0, 0, 0); - $old_event['recur_enddate'] = egw_time::to($time, 'ts'); $offset = $event['start'] - $old_event['start']; $event['start'] = $next_occurrence['start'] + $offset; $event['end'] = $next_occurrence['end'] + $offset; @@ -601,20 +598,38 @@ class calendar_uiforms extends calendar_ui { $msg = lang("Error: Can't delete original series!"); $noerror = false; + $event = $orig_event; break; } } - elseif (!$this->bo->update($old_event,true)) + else { - $msg .= ($msg ? ', ' : '') .lang('Error: the entry has been updated since you opened it for editing!').'
    '. - lang('Copy your changes to the clipboard, %1reload the entry%2 and merge them.','',''); - $noerror = false; - $event = $orig_event; - break; + $rriter = calendar_rrule::event2rrule($old_event, true); + $rriter->rewind(); + $last = $rriter->current(); + do + { + $rriter->next_no_exception(); + $occurrence = $rriter->current(); + } + while ($rriter->valid() && + egw_time::to($occurrence, 'ts') < $this->bo->now_su && + ($last = $occurrence)); + $last->setTime(0, 0, 0); + $old_event['recur_enddate'] = egw_time::to($last, 'ts'); + if (!$this->bo->update($old_event,true)) + { + $msg .= ($msg ? ', ' : '') .lang('Error: the entry has been updated since you opened it for editing!').'
    '. + lang('Copy your changes to the clipboard, %1reload the entry%2 and merge them.','',''); + $noerror = false; + $event = $orig_event; + break; + } } unset($orig_event); unset($event['uid']); @@ -667,9 +682,14 @@ class calendar_uiforms extends calendar_ui // set the alarms again foreach ($old_event['alarm'] as $alarm) { + if ($alarm['time'] > $this->bo->now_su) + { + // delete future alarm of the old series + $this->bo->delete_alarm($alarm['id']); + } $alarm['time'] += $offset; unset($alarm['id']); - if (($next_occurrence = $this->bo->read($event['id'], $this->bo->now_su + $offset, true)) && + if (($next_occurrence = $this->bo->read($event['id'], $this->bo->now_su + $alarm['offset'], true)) && $alarm['time'] < $next_occurrence['start']) { $alarm['time'] = $next_occurrence['start'] - $alarm['offset']; From a480d1075ac97dfccac2d1fd071cc79fe33f960e Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Fri, 11 Jun 2010 08:10:15 +0000 Subject: [PATCH 031/496] no default mailserver, so fmail redirects to create-mailaccount page --- doc/rpm-build/post_install.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/rpm-build/post_install.php b/doc/rpm-build/post_install.php index 3cc4de3ec9..889060933b 100755 --- a/doc/rpm-build/post_install.php +++ b/doc/rpm-build/post_install.php @@ -54,7 +54,7 @@ $config = array( 'ldap_context' => 'ou=accounts,$base', 'ldap_search_filter' => '(uid=%user)', 'ldap_group_context' => 'ou=groups,$base', - 'mailserver' => 'localhost,imap,$domain', + 'mailserver' => '', 'smtpserver' => 'localhost,25', 'postfix' => '', // see setup-cli.php --help config 'cyrus' => '', From 911bd7bd00ba503410d54528f0000ade9beb7dfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20St=C3=B6ckel?= Date: Fri, 11 Jun 2010 08:25:24 +0000 Subject: [PATCH 032/496] Fixed redirect in xajax handler --- xajax.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xajax.php b/xajax.php index b4470ca0ad..7dc0206a36 100644 --- a/xajax.php +++ b/xajax.php @@ -26,7 +26,7 @@ function xajax_redirect(&$anon_account) define('XAJAX_DEFAULT_CHAR_ENCODING',translation::charset()); $response = new xajaxResponse(); - $response->redirect($GLOBALS['egw_info']['server']['webserver_url'].'/login.php?cd=10'); + $response->script("egw_topWindow().location.href='".$GLOBALS['egw_info']['server']['webserver_url']."/login.php?cd=10';"); $response->printOutput(); common::egw_exit(); From 327324c95ec88c7c7d2f4d3c405672d0ab690cec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20St=C3=B6ckel?= Date: Fri, 11 Jun 2010 08:38:36 +0000 Subject: [PATCH 033/496] Synchronized json code from trunk with 10.1 --- phpgwapi/inc/class.egw_json.inc.php | 18 ++++--- phpgwapi/js/egw_json.js | 75 +++++++++++++++++------------ 2 files changed, 57 insertions(+), 36 deletions(-) diff --git a/phpgwapi/inc/class.egw_json.inc.php b/phpgwapi/inc/class.egw_json.inc.php index 8e8874c947..b9b564f515 100644 --- a/phpgwapi/inc/class.egw_json.inc.php +++ b/phpgwapi/inc/class.egw_json.inc.php @@ -279,14 +279,14 @@ class egw_json_response * * @param string $script the script code which should be executed upon receiving */ - public function each($selector,$method,array $parameters=array()) + public function jquery($selector,$method,array $parameters=array()) { if (is_string($selector) && is_string($method)) { - $this->addGeneric('each', array( + $this->addGeneric('jquery', array( 'select' => $selector, 'func' => $method, - 'params' => $parameters, + 'parms' => $parameters, )); } else @@ -323,10 +323,16 @@ class egw_json_response * * @param string $url */ - public function redirect($url) + public function redirect($url, $global = false) { - //self::script("location.href = '$url';"); - $this->addGeneric('redirect', $url); + if (is_string($url) && is_bool($global)) + { + //self::script("location.href = '$url';"); + $this->addGeneric('redirect', array( + 'url' => $url, + 'global' => $global, + )); + } } /** diff --git a/phpgwapi/js/egw_json.js b/phpgwapi/js/egw_json.js index f93fee4d9c..6358cc6265 100644 --- a/phpgwapi/js/egw_json.js +++ b/phpgwapi/js/egw_json.js @@ -25,7 +25,7 @@ function egw_json_encode(input) case Boolean: return input ? 'true' : 'false'; - case Array : + case Array: var buf = []; for (var i = 0; i < input.length; i++) buf.push(egw_json_encode(input[i])); @@ -143,6 +143,14 @@ egw_json_request.prototype.alertFunc = function(_message, _details) alert(_message); } +function _egw_json_debug_log(_msg) +{ + if (typeof console != "undefined" && typeof console.log != "undefined") + { + console.log(_msg); + } +} + /* Internal function which handles the response from the server */ egw_json_request.prototype.handleResponse = function(data, textStatus, XMLHttpRequest) { @@ -151,29 +159,31 @@ egw_json_request.prototype.handleResponse = function(data, textStatus, XMLHttpRe var hasResponse = false; for (var i = 0; i < data.response.length; i++) { + var res = data.response[i]; + switch (data.response[i].type) { case 'alert': //Check whether all needed parameters have been passed and call the alertHandler function - if ((typeof data.response[i].data.message != 'undefined') && - (typeof data.response[i].data.details != 'undefined')) + if ((typeof res.data.message != 'undefined') && + (typeof res.data.details != 'undefined')) { this.alertHandler( - data.response[i].data.message, - data.response[i].data.details) + res.data.message, + res.data.details) hasResponse = true; } break; case 'assign': //Check whether all needed parameters have been passed and call the alertHandler function - if ((typeof data.response[i].data.id != 'undefined') && - (typeof data.response[i].data.key != 'undefined') && - (typeof data.response[i].data.value != 'undefined')) + if ((typeof res.data.id != 'undefined') && + (typeof res.data.key != 'undefined') && + (typeof res.data.value != 'undefined')) { - var obj = document.getElementById(data.response[i].data.id); + var obj = document.getElementById(res.data.id); if (obj) { - obj[data.response[i].data.key] = data.response[i].data.value; + obj[res.data.key] = res.data.value; hasResponse = true; } } @@ -182,53 +192,58 @@ egw_json_request.prototype.handleResponse = function(data, textStatus, XMLHttpRe //Callback the caller in order to allow him to handle the data if (this.callback) { - this.callback.call(this.sender, data.response[i].data); + this.callback.call(this.sender, res.data); hasResponse = true; } break; case 'script': - if (typeof data.response[i].data == 'string') + if (typeof res.data == 'string') { try { - var func = function() {eval(data.response[i].data);}; + var func = function() {eval(res.data);}; func.call(window); } catch (e) { - if (typeof console != "undefined" && typeof console.log != "undefined") - { - e.code = data.response[i].data; - console.log(e); - } + e.code = res.data; + _egw_json_debug_log(e); } hasResponse = true; } break; - case 'each': - if (typeof data.response[i].select == 'string' && typeof data.response[i].func == 'string') + case 'jquery': + if (typeof res.data.select == 'string' && + typeof res.data.func == 'string') { try { - var func = data.response[i].func; - // todo: for N>2 - $(data.response[i].select).each(func.call(data.response[i].parms[0],data.response[i].parms[1],data.response[i].parms[2])); + var jQueryObject = $(res.data.select); + jQueryObject[res.data.func].apply(jQueryObject, res.data.parms); } catch (e) { - if (typeof console != "undefined" && typeof console.log != "undefined") - { - e.code = data.response[i]; - console.log(e); - } + _egw_json_debug_log(e); } hasResponse = true; } break; case 'redirect': - if (typeof data.response[i].data == 'string') + if (typeof res.data.url == 'string' && + typeof res.data.global == 'boolean') { - window.location.href = data.response[i].data; + //Special handling for framework reload + if (res.data.url.indexOf("?cd=10") > 0) + res.data.global = true; + + if (res.data.global) + { + egw_topWindow().location.href = res.data.url; + } + else + { + window.location.href = res.data.url; + } } break; } From 5f4791018707f4eb4983011e9b5c3eec3a2e0b50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Lehrke?= Date: Fri, 11 Jun 2010 09:05:28 +0000 Subject: [PATCH 034/496] Fix WebDAV support for Bitkinex client (EGw.org#2650) --- webdav.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/webdav.php b/webdav.php index cba7d3b693..f7e2a138f0 100644 --- a/webdav.php +++ b/webdav.php @@ -87,9 +87,10 @@ $GLOBALS['egw']->session->commit_session(); $webdav_server = new vfs_webdav_server(); $user_agent = strtolower($_SERVER['HTTP_USER_AGENT']); if (strstr($user_agent, 'microsoft-webdav') !== false || - strstr($user_agent, 'neon') !== false) + strstr($user_agent, 'neon') !== false || + strstr($user_agent, 'bitkinex') !== false) { - // neon & Windows 7 special treatment + // Windows 7 et.al. special treatment $webdav_server->cnrnd = true; } $webdav_server->ServeRequest(); From 464d08eb0dcf6faf80cbcde95f82ce2fb2446733 Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Fri, 11 Jun 2010 09:26:07 +0000 Subject: [PATCH 035/496] plain text/calendar messages, are now displayed as event.ics attachment too --- felamimail/inc/class.bofelamimail.inc.php | 17 ++++++++++++++--- felamimail/inc/class.uiwidgets.inc.php | 10 ++++++---- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/felamimail/inc/class.bofelamimail.inc.php b/felamimail/inc/class.bofelamimail.inc.php index 84708971f8..cc242f3f73 100644 --- a/felamimail/inc/class.bofelamimail.inc.php +++ b/felamimail/inc/class.bofelamimail.inc.php @@ -1783,7 +1783,7 @@ function getTextPart($_uid, $_structure, $_htmlMode = '') { $bodyPart = array(); - //_debug_array($_structure); + if (self::$debug) _debug_array(array($_structure,function_backtrace())); $partID = $_structure->partID; $mimePartBody = $this->icServer->getBodyPart($_uid, $partID, true); //_debug_array($mimePartBody); @@ -2260,7 +2260,18 @@ #return $attachments; } - + // outlook sometimes sends a TEXT/CALENDAR;REQUEST as plain ics, nothing more. + if ($structure->type == 'TEXT' && $structure->subType == 'CALENDAR' && + isset($structure->parameters['METHOD'] ) && $structure->parameters['METHOD'] == 'REQUEST') + { + $newAttachment = array(); + $newAttachment['name'] = 'event.ics'; + $newAttachment['size'] = $structure->bytes; + $newAttachment['mimeType'] = $structure->type .'/'. $structure->subType.';'.$structure->parameters['METHOD']; + $newAttachment['partID'] = $structure->partID; + $newAttachment['encoding'] = $structure->encoding; + $attachments[] = $newAttachment; + } // this kind of message can have no attachments if(($structure->type == 'TEXT' && !($structure->disposition == 'INLINE' && $structure->dparameters['FILENAME'])) || ($structure->type == 'MULTIPART' && $structure->subType == 'ALTERNATIVE' && !is_array($structure->subParts)) || @@ -2271,7 +2282,7 @@ #$attachments = array(); - foreach($structure->subParts as $subPart) { + foreach((array)$structure->subParts as $subPart) { // skip all non attachment parts if(($subPart->type == 'TEXT' && ($subPart->subType == 'PLAIN' || $subPart->subType == 'HTML') && ($subPart->disposition != 'ATTACHMENT' && !($subPart->disposition == 'INLINE' && $subPart->dparameters['FILENAME']))) || diff --git a/felamimail/inc/class.uiwidgets.inc.php b/felamimail/inc/class.uiwidgets.inc.php index 82e935355b..03980f8518 100644 --- a/felamimail/inc/class.uiwidgets.inc.php +++ b/felamimail/inc/class.uiwidgets.inc.php @@ -369,11 +369,12 @@ $this->t->set_var('header_subject', @htmlspecialchars('('. lang('no subject') .')', ENT_QUOTES, $this->displayCharset)); } - #_debug_array($header); + //_debug_array($header); if($header['mimetype'] == 'multipart/mixed' || - $header['mimetype'] == 'multipart/related' || - substr($header['mimetype'],0,11) == 'application' || - substr($header['mimetype'],0,5) == 'audio') { + $header['mimetype'] == 'multipart/related' || + $header['mimetype'] == 'text/calendar' || + substr($header['mimetype'],0,11) == 'application' || + substr($header['mimetype'],0,5) == 'audio') { $image = html::image('felamimail','attach'); $this->t->set_var('attachment_image', $image); } else { @@ -634,6 +635,7 @@ $windowName = 'displayMessage_'.$headerData['uid']; if($headerData['mimetype'] == 'multipart/mixed' || $headerData['mimetype'] == 'multipart/related' || + $headerData['mimetype'] == 'text/calendar' || substr($headerData['mimetype'],0,11) == 'application' || substr($headerData['mimetype'],0,5) == 'audio') { $image = html::image('felamimail','attach'); From 867dfd7829195cf1f1fb220403f4c59bc6e7c3ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Lehrke?= Date: Fri, 11 Jun 2010 10:00:04 +0000 Subject: [PATCH 036/496] Fix Evolution CalDAV HTTP_IF_MATCH issue (Stylite#601) --- phpgwapi/inc/class.groupdav_handler.inc.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/phpgwapi/inc/class.groupdav_handler.inc.php b/phpgwapi/inc/class.groupdav_handler.inc.php index ce280b3c86..c16e6b326c 100644 --- a/phpgwapi/inc/class.groupdav_handler.inc.php +++ b/phpgwapi/inc/class.groupdav_handler.inc.php @@ -267,13 +267,16 @@ abstract class groupdav_handler $etag = $this->get_etag($entry); // If the clients sends an "If-Match" header ($_SERVER['HTTP_IF_MATCH']) we check with the current etag // of the calendar --> on failure we return 412 Precondition failed, to not overwrite the modifications - if (isset($_SERVER['HTTP_IF_MATCH']) && ($this->http_if_match = $_SERVER['HTTP_IF_MATCH']) != $etag) + if (isset($_SERVER['HTTP_IF_MATCH']) && + ($this->http_if_match = (strstr($_SERVER['HTTP_IF_MATCH'], $etag) === false))) { if ($this->debug) error_log(__METHOD__."($method,,$id) HTTP_IF_MATCH='$_SERVER[HTTP_IF_MATCH]', etag='$etag': 412 Precondition failed"); return '412 Precondition Failed'; } // if an IF_NONE_MATCH is given, check if we need to send a new export, or the current one is still up-to-date - if ($method == 'GET' && isset($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] == $etag) + if ($method == 'GET' && + isset($_SERVER['HTTP_IF_NONE_MATCH']) && + strstr($_SERVER['HTTP_IF_MATCH'], $etag) !== false) { if ($this->debug) error_log(__METHOD__."($method,,$id) HTTP_IF_NONE_MATCH='$_SERVER[HTTP_IF_NONE_MATCH]', etag='$etag': 304 Not Modified"); return '304 Not Modified'; From d8f8a2024cd0c8ae1e68522a18454577239bd5da Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Fri, 11 Jun 2010 10:05:12 +0000 Subject: [PATCH 037/496] add static stylite_postfixmandriva and stylite_postfixsuse; adapt update script; --- emailadmin/inc/class.emailadmin_bo.inc.php | 38 ++++++++++++++++++++++ emailadmin/setup/tables_update.inc.php | 2 +- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/emailadmin/inc/class.emailadmin_bo.inc.php b/emailadmin/inc/class.emailadmin_bo.inc.php index 426189329b..0d179dc5a9 100644 --- a/emailadmin/inc/class.emailadmin_bo.inc.php +++ b/emailadmin/inc/class.emailadmin_bo.inc.php @@ -134,6 +134,44 @@ 'smtpcapabilities' => 'default|forward', 'classname' => 'postfixdbmailuser' ), + 'stylite_postfixmandriva' => array( + 'fieldNames' => array( + 'smtpServer', + 'smtpPort', + 'smtpAuth', + 'ea_smtp_auth_username', + 'ea_smtp_auth_password', + 'smtpType', + 'editforwardingaddress', + 'smtpLDAPServer', + 'smtpLDAPAdminDN', + 'smtpLDAPAdminPW', + 'smtpLDAPBaseDN', + 'smtpLDAPUseDefault' + ), + 'description' => 'Postfix (Mandriva mailAccount schema)', + 'smtpcapabilities' => 'default|forward', + 'classname' => 'stylite_postfixmandriva' + ), + 'stylite_postfixsuse' => array( + 'fieldNames' => array( + 'smtpServer', + 'smtpPort', + 'smtpAuth', + 'ea_smtp_auth_username', + 'ea_smtp_auth_password', + 'smtpType', + 'editforwardingaddress', + 'smtpLDAPServer', + 'smtpLDAPAdminDN', + 'smtpLDAPAdminPW', + 'smtpLDAPBaseDN', + 'smtpLDAPUseDefault' + ), + 'description' => 'Postfix (SuseMailServer schema)', + 'smtpcapabilities' => 'default|forward', + 'classname' => 'stylite_postfixsuse' + ), ); //var $IMAPServerType = array(); // holds a list of config options static $IMAPServerType = array( diff --git a/emailadmin/setup/tables_update.inc.php b/emailadmin/setup/tables_update.inc.php index 2fe54bc20f..7765aedadf 100644 --- a/emailadmin/setup/tables_update.inc.php +++ b/emailadmin/setup/tables_update.inc.php @@ -291,7 +291,7 @@ function emailadmin_upgrade1_7_003() 'type' => 'varchar', 'precision' => 56, )); - foreach (array('1'=>'defaultsmtp', '2'=>'postfixldap', '3'=>'postfixinetorgperson', '4'=>'smtpplesk', '5' =>'postfixdbmailuser') as $id => $newtype) + foreach (array('1'=>'defaultsmtp', '2'=>'postfixldap', '3'=>'postfixinetorgperson', '4'=>'stylite_postfixmandriva', '5' =>'stylite_postfixsuse') as $id => $newtype) { $GLOBALS['egw_setup']->oProc->query('update egw_emailadmin set ea_smtp_type=\''.$newtype.'\' where ea_smtp_type=\''.$id.'\'',__LINE__,__FILE__); } From 193b77a5df317e291bc13e6bdf55edec69887ee2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20St=C3=B6ckel?= Date: Fri, 11 Jun 2010 10:26:39 +0000 Subject: [PATCH 038/496] Fixed problem with generation of numerical indices in _egw_json_getFormValue, using the new global parameter of egw_json_response.redirect in json.php --- json.php | 2 +- phpgwapi/js/egw_json.js | 74 ++++++++++++++++++++++++++++++----------- 2 files changed, 56 insertions(+), 20 deletions(-) diff --git a/json.php b/json.php index d64867fa1f..6829791743 100644 --- a/json.php +++ b/json.php @@ -19,7 +19,7 @@ function xajax_redirect(&$anon_account) { $response = new egw_json_response(); - $response->redirect($GLOBALS['egw_info']['server']['webserver_url'].'/login.php?cd=10'); + $response->redirect($GLOBALS['egw_info']['server']['webserver_url'].'/login.php', true); $response->printOutput(); common::egw_exit(); diff --git a/phpgwapi/js/egw_json.js b/phpgwapi/js/egw_json.js index 6358cc6265..360d0ec861 100644 --- a/phpgwapi/js/egw_json.js +++ b/phpgwapi/js/egw_json.js @@ -11,13 +11,12 @@ /* The egw_json_request is the javaScript side implementation of class.egw_json.inc.php.*/ -function egw_json_encode(input) +function egw_json_encode_simple(input) { - if (!input) return 'null'; - - switch (input.constructor) { + switch (input.constructor) + { case String: - return '"' + input + '"'; + return '"' + input + '"'; case Number: return input.toString(); @@ -25,20 +24,43 @@ function egw_json_encode(input) case Boolean: return input ? 'true' : 'false'; - case Array: - var buf = []; - for (var i = 0; i < input.length; i++) - buf.push(egw_json_encode(input[i])); - return '[' + buf.join(',') + ']'; - - case Object: - var buf = []; - for (var k in input) - buf.push('"' + k + '":' + egw_json_encode(input[k])); - return '{' + buf.join(',') + '}'; - default: - return 'null'; + return null; + } +} + +function egw_json_encode(input) +{ + if (!input) return 'null'; + + var simple_res = egw_json_encode_simple(input); + if (simple_res == null) + { + switch (input.constructor) + { + case Array: + var buf = []; + for (var k in input) + { + buf.push(egw_json_encode(input[k])); + } + return '[' + buf.join(',') + ']'; + + case Object: + var buf = []; + for (var k in input) + { + buf.push(egw_json_encode_simple(k) + ':' + egw_json_encode(input[k])); + } + return '{' + buf.join(',') + '}'; + + default: + return 'null'; + } + } + else + { + return simple_res; } } @@ -322,6 +344,17 @@ function _egw_json_getFormValues(serialized, children) } } +function _egw_json_getObjectLength(_obj) +{ + var res = 0; + for (key in _obj) + { + if (_obj.hasOwnProperty(key)) + res++; + } + return res; +} + /** * used internally to serialize */ @@ -361,6 +394,7 @@ function _egw_json_getFormValue(serialized, child) var a = n.substr(n.indexOf('[')); if (typeof serialized[k] == 'undefined') serialized[k] = new Object; + var p = serialized; // pointer reset while (a.length != 0) { var sa = a.substr(0, a.indexOf(']')+1); @@ -376,11 +410,13 @@ function _egw_json_getFormValue(serialized, child) k = lk; //restore last key p = lp; } else { - k = p.length; + k = _egw_json_getObjectLength(p); } } if (typeof p[k] == 'undefined') + { p[k] = new Object; + } } p[k] = values; } else { From 8c88ef81b282ce738bff26af27681678582d78c9 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Fri, 11 Jun 2010 10:39:27 +0000 Subject: [PATCH 039/496] removed now global available array_stripslashes --- etemplate/thumbnail.php | 32 ++++++-------------------------- 1 file changed, 6 insertions(+), 26 deletions(-) diff --git a/etemplate/thumbnail.php b/etemplate/thumbnail.php index 2002129faf..daa772df49 100644 --- a/etemplate/thumbnail.php +++ b/etemplate/thumbnail.php @@ -9,12 +9,6 @@ * @version $Id$ */ -// strip slashes from _GET parameters, if someone still has magic_quotes_gpc on -if (get_magic_quotes_gpc() && $_GET) -{ - $_GET = array_stripslashes($_GET); -} - if (isset($_GET['app'])) { $app = $_GET['app']; @@ -33,6 +27,12 @@ $GLOBALS['egw_info']['flags'] = array( ); include ('../header.inc.php'); +// strip slashes from _GET parameters, if someone still has magic_quotes_gpc on +if (get_magic_quotes_gpc() && $_GET) +{ + $_GET = array_stripslashes($_GET); +} + // no need to keep the session open (it stops other parallel calls) $GLOBALS['egw']->session->commit_session(); @@ -202,23 +202,3 @@ function gdVersion($user_ver = 0) $gd_ver = $match[0]; return $match[0]; } - -/** - * applies stripslashes recursivly on each element of an array - * - * @param array &$var - * @return array - */ -function array_stripslashes($var) -{ - if (!is_array($var)) - { - return stripslashes($var); - } - foreach($var as $key => $val) - { - $var[$key] = is_array($val) ? array_stripslashes($val) : stripslashes($val); - } - return $var; -} - From 22600d0098e123bae072ea80b43cde5f6bd62607 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Fri, 11 Jun 2010 10:54:27 +0000 Subject: [PATCH 040/496] removed array_stripslashes function, which is now in common_functions.inc.php --- admin/remote.php | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/admin/remote.php b/admin/remote.php index 0ade9ee5ca..c55cff5757 100644 --- a/admin/remote.php +++ b/admin/remote.php @@ -88,31 +88,6 @@ if (get_magic_quotes_gpc()) $data = array_stripslashes($data); } -/** - * Strip all slashes from an array - * - * @param mixed $subject - * @return mixed - */ -function array_stripslashes($subject) -{ - if (is_string($subject)) - { - return stripslashes($subject); - } - if (!is_array($subject)) - { - return ($subject); - } - $ret = array(); - foreach ($subject as $key => $value) - { - $ret[$key] = array_stripslashes($value); - } - return $ret; -} - -// instanciate comand and run it $cmd = admin_cmd::instanciate($data); $cmd->check_remote_access($_REQUEST['secret'],$config_passwd); From b841f570f0d70e9a025b6508b24936288941f046 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20St=C3=B6ckel?= Date: Fri, 11 Jun 2010 11:43:54 +0000 Subject: [PATCH 041/496] Added wrapper for xajax.addScriptCall(), added ?cd=10 to json.php response again --- json.php | 2 +- phpgwapi/inc/class.egw_json.inc.php | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/json.php b/json.php index 6829791743..4cb94d984e 100644 --- a/json.php +++ b/json.php @@ -19,7 +19,7 @@ function xajax_redirect(&$anon_account) { $response = new egw_json_response(); - $response->redirect($GLOBALS['egw_info']['server']['webserver_url'].'/login.php', true); + $response->redirect($GLOBALS['egw_info']['server']['webserver_url'].'/login.php?cd=10', true); $response->printOutput(); common::egw_exit(); diff --git a/phpgwapi/inc/class.egw_json.inc.php b/phpgwapi/inc/class.egw_json.inc.php index b9b564f515..f1ae1a7f13 100644 --- a/phpgwapi/inc/class.egw_json.inc.php +++ b/phpgwapi/inc/class.egw_json.inc.php @@ -54,7 +54,7 @@ class egw_json_request //Call the supplied callback function along with the menuaction and the passed parameters $this->handleRequest($menuaction, $parameters); } - } + } return NULL; } @@ -382,6 +382,14 @@ class egw_json_response $this->redirect($url); } + public function addScriptCall($func) + { + $args = func_get_args(); + $func = array_shift($args); + + $this->script("$func(".implode(",", $args).");"); + } + public function getXML() { return ''; From 3668e1a8f44b0d7770256c7c36ddd249e575f2e3 Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Fri, 11 Jun 2010 12:34:37 +0000 Subject: [PATCH 042/496] for egw_openWindowCentered return a WindowID by default --- phpgwapi/js/jsapi/jsapi.js | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/phpgwapi/js/jsapi/jsapi.js b/phpgwapi/js/jsapi/jsapi.js index 19090de9ef..bfc3505515 100644 --- a/phpgwapi/js/jsapi/jsapi.js +++ b/phpgwapi/js/jsapi/jsapi.js @@ -100,8 +100,10 @@ function egw_set_checkbox_multiselect_enabled(_id, _enabled) } // works only correctly in Mozilla/FF and Konqueror -function egw_openWindowCentered2(_url, _windowName, _width, _height, _status) +function egw_openWindowCentered2(_url, _windowName, _width, _height, _status, _app, _returnID) { + if (typeof(_app) == 'undefined') _app = false; + if (typeof(_returnID) == 'undefined') _returnID = false; windowWidth = egw_getWindowOuterWidth(); windowHeight = egw_getWindowOuterHeight(); @@ -113,12 +115,19 @@ function egw_openWindowCentered2(_url, _windowName, _width, _height, _status) ",location=no,menubar=no,directories=no,toolbar=no,scrollbars=yes,resizable=yes,status="+_status); // returning something, replaces whole window in FF, if used in link as "javascript:egw_openWindowCentered2()" - //return windowID; + if (_returnID === false) + { + // return nothing + } + else + { + return windowID; + } } function egw_openWindowCentered(_url, _windowName, _width, _height) { - return egw_openWindowCentered2(_url, _windowName, _width, _height, 'no'); + return egw_openWindowCentered2(_url, _windowName, _width, _height, 'no', false, true); } // return the left position of the window From cfd468fe2ffb32b24516a688e9378a99a2ac73a2 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Fri, 11 Jun 2010 13:36:38 +0000 Subject: [PATCH 043/496] added a check for json extension --- setup/check_install.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/setup/check_install.php b/setup/check_install.php index 634e7e49d8..e8339b2268 100644 --- a/setup/check_install.php +++ b/setup/check_install.php @@ -209,6 +209,10 @@ $checks = array( 'func' => 'extension_check', 'warning' => lang('The mcrypt extension is used, to store eTemplate form state on the client, which is the prefered way to store it.'), ), + 'json' => array( + 'func' => 'extension_check', + 'error' => lang('The json extension is required by EGroupware for AJAX.'), + ), ); if (extension_loaded('session') && ini_get('session.save_handler') == 'files' && ($session_path = realpath(session_save_path()))) { From daf7e2d7edf2fcf5a6425c94dc97203343438d83 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Fri, 11 Jun 2010 13:40:03 +0000 Subject: [PATCH 044/496] - added json.php file to be packaged - added php(5)-json as requirement --- doc/rpm-build/egroupware-epl.spec | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/doc/rpm-build/egroupware-epl.spec b/doc/rpm-build/egroupware-epl.spec index 14b38b057f..3b7f566beb 100644 --- a/doc/rpm-build/egroupware-epl.spec +++ b/doc/rpm-build/egroupware-epl.spec @@ -1,5 +1,5 @@ Name: egroupware-epl -Version: 10.1.20100610 +Version: 10.1.20100611 Release: Summary: EGroupware is a web-based groupware suite written in php. Group: Web/Database @@ -163,7 +163,7 @@ Further contributed applications are available as separate packages. Summary: The EGroupware core Group: Web/Database Requires: %{php} >= 5.2.1 -Requires: %{php}-mbstring %{php}-gd %{php}-mcrypt %{php}-pear %{php}-posix %{extra_requires} %{cron} zip +Requires: %{php}-mbstring %{php}-gd %{php}-mcrypt %{php}-pear %{php}-posix %{extra_requires} %{cron} zip %{php}-json Provides: egw-core %{version} Provides: egw-etemplate %{version} Provides: egw-addressbook %{version} @@ -563,6 +563,7 @@ install -m 444 %{SOURCE7} $RPM_BUILD_ROOT%{egwdir}/doc/rpm-build %{egwdir}/header.inc.php %{egwdir}/header.inc.php.template %{egwdir}/index.php +%{egwdir}/json.php %{egwdir}/login.php %{egwdir}/logout.php %{egwdir}/notify.php From 74bbdc1c05f2bf07d9a8bf3184106be7655da488 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20St=C3=B6ckel?= Date: Fri, 11 Jun 2010 15:07:40 +0000 Subject: [PATCH 045/496] Added escaping for json strings --- phpgwapi/js/egw_json.js | 59 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 4 deletions(-) diff --git a/phpgwapi/js/egw_json.js b/phpgwapi/js/egw_json.js index 360d0ec861..bba5bf7808 100644 --- a/phpgwapi/js/egw_json.js +++ b/phpgwapi/js/egw_json.js @@ -11,12 +11,61 @@ /* The egw_json_request is the javaScript side implementation of class.egw_json.inc.php.*/ -function egw_json_encode_simple(input) +function _egw_json_escape_string(input) +{ + var len = input.length; + var res = ""; + + for (var i = 0; i < len; i++) + { + switch (input[i]) + { + case '"': + res += '\\"'; + break; + + case '\n': + res += '\\n'; + break; + + case '\r': + res += '\\r'; + break; + + case '\\': + res += '\\\\'; + break; + + case '\/': + res += '\\/'; + break; + + case '\b': + res += '\\b'; + break; + + case '\f': + res += '\\f'; + break; + + case '\t': + res += '\\t'; + break; + + default: + res += input[i]; + } + } + + return res; +} + +function _egw_json_encode_simple(input) { switch (input.constructor) { case String: - return '"' + input + '"'; + return '"' + _egw_json_escape_string(input) + '"'; case Number: return input.toString(); @@ -33,7 +82,7 @@ function egw_json_encode(input) { if (!input) return 'null'; - var simple_res = egw_json_encode_simple(input); + var simple_res = _egw_json_encode_simple(input); if (simple_res == null) { switch (input.constructor) @@ -50,7 +99,7 @@ function egw_json_encode(input) var buf = []; for (var k in input) { - buf.push(egw_json_encode_simple(k) + ':' + egw_json_encode(input[k])); + buf.push(_egw_json_encode_simple(k) + ':' + egw_json_encode(input[k])); } return '{' + buf.join(',') + '}'; @@ -129,6 +178,8 @@ egw_json_request.prototype.sendRequest = function(_async, _callback, _sender) }) } + console.log(request_obj); + //Send the request via the jquery AJAX interface to the server $.ajax({url: this.url + '?menuaction=' + this.menuaction, async: is_async, From 607326121b18a68383f5397e6e30915c19e2b0b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20St=C3=B6ckel?= Date: Fri, 11 Jun 2010 15:10:27 +0000 Subject: [PATCH 046/496] Removed debug message --- phpgwapi/js/egw_json.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/phpgwapi/js/egw_json.js b/phpgwapi/js/egw_json.js index bba5bf7808..647964a84a 100644 --- a/phpgwapi/js/egw_json.js +++ b/phpgwapi/js/egw_json.js @@ -178,8 +178,6 @@ egw_json_request.prototype.sendRequest = function(_async, _callback, _sender) }) } - console.log(request_obj); - //Send the request via the jquery AJAX interface to the server $.ajax({url: this.url + '?menuaction=' + this.menuaction, async: is_async, From 870ba2203bc784f82b16731fc5ece0ecfbad5348 Mon Sep 17 00:00:00 2001 From: Nathan Gray Date: Fri, 11 Jun 2010 15:46:54 +0000 Subject: [PATCH 047/496] Backport 30755 Don't try to include js, that variable isn't there anymore > - Special handling for the upload (step 30) to do a full form submit --- .../inc/class.importexport_definitions_ui.inc.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/importexport/inc/class.importexport_definitions_ui.inc.php b/importexport/inc/class.importexport_definitions_ui.inc.php index dec2db1119..ee6b6392fb 100644 --- a/importexport/inc/class.importexport_definitions_ui.inc.php +++ b/importexport/inc/class.importexport_definitions_ui.inc.php @@ -184,6 +184,10 @@ class importexport_definitions_ui $button = array_keys($content['button']); $content['button'] = array($button[0] => 'pressed'); } + // Override next button on step 30 + if($content['step'] == '30') { + $this->etpl->set_cell_attribute('button[next]', 'onclick', ''); + } // post process submitted step if($content['step']) { @@ -243,10 +247,6 @@ class importexport_definitions_ui $this->response->addAssign('exec[button][cancel]','style.display', 'none'); } $this->response->addAssign('contentbox', 'innerHTML', $html); - if (isset($GLOBALS['egw']->js) && $GLOBALS['egw']->js->body['onLoad']) - { - $this->response->addScript($GLOBALS['egw']->js->body['onLoad']); - } $this->response->addAssign('picturebox', 'style.display', 'none'); $this->response->addScript("set_style_by_class('div','popupManual','display','inline');"); From 5bbd63523ef2b3aecd75f176a399d452bc2f68ad Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Sat, 12 Jun 2010 08:05:18 +0000 Subject: [PATCH 048/496] fix for bug #2653 - editing imap-folders is without function renaming of imap folders was not working, because top_window().tree was used, instead of window.tree, as tree is in that case in the same window --- felamimail/inc/class.ajaxfelamimail.inc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/felamimail/inc/class.ajaxfelamimail.inc.php b/felamimail/inc/class.ajaxfelamimail.inc.php index 38dcecd63a..8467a6151c 100644 --- a/felamimail/inc/class.ajaxfelamimail.inc.php +++ b/felamimail/inc/class.ajaxfelamimail.inc.php @@ -950,8 +950,8 @@ #$hasChildren = false; #if ($folderStatus['attributes'][0]=="\\HasChildren") $hasChildren=true; } - $response->addScript("egw_topWindow().tree.deleteItem('$_oldFolderName',0);"); - $response->addScript("egw_topWindow().tree.insertNewItem('$_parentFolder','$newFolderName','$folderName',onNodeSelect,'folderClosed.gif',0,0,'CHILD,CHECKED,SELECT,CALL');"); + $response->addScript("window.tree.deleteItem('$_oldFolderName',0);"); + $response->addScript("window.tree.insertNewItem('$_parentFolder','$newFolderName','$folderName',onNodeSelect,'MailFolderPlain.png',0,0,'CHILD,CHECKED,SELECT,CALL');"); } } return $response->getXML(); From 7da32f0bdd17e53c4e7e2f17d7e5492874de1b07 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Sat, 12 Jun 2010 08:35:03 +0000 Subject: [PATCH 049/496] clicking on mail to show it in preview, did NOT keep resized iframe, if that was bigger then given size --- felamimail/inc/class.ajaxfelamimail.inc.php | 1 + 1 file changed, 1 insertion(+) diff --git a/felamimail/inc/class.ajaxfelamimail.inc.php b/felamimail/inc/class.ajaxfelamimail.inc.php index 8467a6151c..9db38afdeb 100644 --- a/felamimail/inc/class.ajaxfelamimail.inc.php +++ b/felamimail/inc/class.ajaxfelamimail.inc.php @@ -753,6 +753,7 @@ //$response->addScript("document.getElementById('messageCounter').innerHTML ='';"); $response->addScript("fm_previewMessageID=".$headerData['uid'].";"); $response->addAssign('spanMessagePreview', 'innerHTML', $this->uiwidgets->updateMessagePreview($headerData,$_folderType, $this->sessionData['mailbox'])); + $response->addScript('if (typeof handleResize != "undefined") handleResize();'); return $response->getXML(); } From ec91ea15c9da0aa35631b0261c2871593d045c81 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Sun, 13 Jun 2010 07:45:28 +0000 Subject: [PATCH 050/496] returning content of onXXX tag after adding code --- phpgwapi/inc/class.egw_framework.inc.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/phpgwapi/inc/class.egw_framework.inc.php b/phpgwapi/inc/class.egw_framework.inc.php index 7a55c08656..1a5b30c980 100644 --- a/phpgwapi/inc/class.egw_framework.inc.php +++ b/phpgwapi/inc/class.egw_framework.inc.php @@ -942,30 +942,33 @@ abstract class egw_framework * Sets an onLoad action for a page * * @param string javascript to be used + * @return string content of onXXX tag after adding code */ static function set_onload($code) { - self::$body_tags['onLoad'] .= $code; + return self::$body_tags['onLoad'] .= $code; } /** * Sets an onUnload action for a page * * @param string javascript to be used + * @return string content of onXXX tag after adding code */ static function set_onunload($code) { - self::$body_tags['onUnload'] .= $code; + return self::$body_tags['onUnload'] .= $code; } /** * Sets an onResize action for a page * * @param string javascript to be used + * @return string content of onXXX tag after adding code */ static function set_onresize($code) { - self::$body_tags['onResize'] .= $code; + return self::$body_tags['onResize'] .= $code; } /** From d934e4beec8d28e48f3627431a37a54ba03a6d6d Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Sun, 13 Jun 2010 07:47:29 +0000 Subject: [PATCH 051/496] fixed wrong step name and readded content of onLoad body attribute via ajax, thought this still does NOT fix all problems (javascript errors etemplate.js seems not to be loaded) --- .../inc/class.importexport_definitions_ui.inc.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/importexport/inc/class.importexport_definitions_ui.inc.php b/importexport/inc/class.importexport_definitions_ui.inc.php index ee6b6392fb..2ebefe9e8a 100644 --- a/importexport/inc/class.importexport_definitions_ui.inc.php +++ b/importexport/inc/class.importexport_definitions_ui.inc.php @@ -140,7 +140,7 @@ class importexport_definitions_ui function wizard($content = null, $msg='') { $GLOBALS['egw_info']['flags']['java_script'] .= - " tag */ + var js_str = html.substring(in_pos, out_pos+9); + + /*Remove the initial tag */ + /*js_str = js_str.substring(js_str.search(/>/) + 1);*/ + _html.js += js_str; + + + html = html.substring(0, in_pos) + html.substring(out_pos + 9); + + var in_pos = html.search(/ From 5e3947bdc6cc8d1687f63bbc22de71b323cf3a21 Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Thu, 1 Jul 2010 11:16:22 +0000 Subject: [PATCH 140/496] fix for cached titles that are empty --- phpgwapi/inc/class.egw_link.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpgwapi/inc/class.egw_link.inc.php b/phpgwapi/inc/class.egw_link.inc.php index 6abe2b5883..0369ec457b 100644 --- a/phpgwapi/inc/class.egw_link.inc.php +++ b/phpgwapi/inc/class.egw_link.inc.php @@ -632,7 +632,7 @@ class egw_link extends solink if (!$id) return ''; $title =& self::get_cache($app,$id); - if (isset($title) && !is_array($id)) + if (isset($title) && !empty($title) && !is_array($id)) { if (self::DEBUG) echo '

    '.__METHOD__."('$app','$id')='$title' (from cache)

    \n"; return $title; From edfb2d29affb5bde2525b32387fd51b46843ff5d Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 1 Jul 2010 12:24:17 +0000 Subject: [PATCH 141/496] Removed notify* files not longer in EGroupware --- doc/rpm-build/egroupware-epl.spec | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/doc/rpm-build/egroupware-epl.spec b/doc/rpm-build/egroupware-epl.spec index 3b7f566beb..191c448635 100644 --- a/doc/rpm-build/egroupware-epl.spec +++ b/doc/rpm-build/egroupware-epl.spec @@ -1,5 +1,5 @@ Name: egroupware-epl -Version: 10.1.20100611 +Version: 10.1.20100630 Release: Summary: EGroupware is a web-based groupware suite written in php. Group: Web/Database @@ -69,7 +69,7 @@ Source8: %{name}-rpmlintrc Patch0: class.uiasyncservice.inc.php.patch #Patch1: stylite-postfix-suse.patch #Patch2: mandriva_upload_tmp_dir.patch -BuildRoot: %{_tmppath}/%{name}-9.2-buildroot +BuildRoot: %{_tmppath}/%{name}-buildroot #otherwise build fails because of jar files in G2 BuildRequires: unzip sed @@ -566,9 +566,6 @@ install -m 444 %{SOURCE7} $RPM_BUILD_ROOT%{egwdir}/doc/rpm-build %{egwdir}/json.php %{egwdir}/login.php %{egwdir}/logout.php -%{egwdir}/notify.php -%{egwdir}/notify_simple.php -%{egwdir}/notifyxml.php %{egwdir}/redirect.php %{egwdir}/rpc.php %{egwdir}/set_box.php From bb07a036ca55488e2c5279d15ead322ac645c924 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 1 Jul 2010 16:08:54 +0000 Subject: [PATCH 142/496] backported Nathan r31245: - Fix purging of old events so it doesnt delete everything - Trick config into calling the hook when purging is turned off so cron job is cancelled --- calendar/inc/class.calendar_hooks.inc.php | 14 ++++++++------ calendar/inc/class.calendar_so.inc.php | 4 +++- calendar/templates/default/config.tpl | 2 +- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/calendar/inc/class.calendar_hooks.inc.php b/calendar/inc/class.calendar_hooks.inc.php index 6c7c446bba..83970b3aa1 100644 --- a/calendar/inc/class.calendar_hooks.inc.php +++ b/calendar/inc/class.calendar_hooks.inc.php @@ -578,12 +578,14 @@ function calendar_purge_old($config) { // Cancel old purge ExecMethod('phpgwapi.asyncservice.cancel_timer', $id); - $result = ExecMethod2('phpgwapi.asyncservice.set_timer', - array('month' => '*', 'day' => 1), - $id, - 'calendar.calendar_boupdate.purge', - (int)$config - ); + if((int)$config > 0) { + $result = ExecMethod2('phpgwapi.asyncservice.set_timer', + array('month' => '*', 'day' => 1), + $id, + 'calendar.calendar_boupdate.purge', + (int)$config + ); + } if(!$result) { $GLOBALS['config_error'] = 'Unable to schedule purge'; diff --git a/calendar/inc/class.calendar_so.inc.php b/calendar/inc/class.calendar_so.inc.php index 5b0fe85e32..9c91638502 100644 --- a/calendar/inc/class.calendar_so.inc.php +++ b/calendar/inc/class.calendar_so.inc.php @@ -1516,7 +1516,9 @@ ORDER BY cal_user_type, cal_usre_id $sql = "DELETE egw_cal.* FROM egw_cal LEFT JOIN egw_cal_repeats ON egw_cal_repeats.cal_id = egw_cal.cal_id - WHERE egw_cal_repeats.cal_id IS NULL || (recur_enddate < $date && recur_enddate != 0)"; + JOIN egw_cal_dates ON + egw_cal.cal_id = egw_cal_dates.cal_id + WHERE cal_end < $date AND (egw_cal_repeats.cal_id IS NULL || (recur_enddate < $date && recur_enddate != 0))"; $this->db->query($sql, __LINE__, __FILE__); // Get a list of what we just deleted for links diff --git a/calendar/templates/default/config.tpl b/calendar/templates/default/config.tpl index c38a27a316..4cc0f922d1 100644 --- a/calendar/templates/default/config.tpl +++ b/calendar/templates/default/config.tpl @@ -72,7 +72,7 @@  {lang_Automatically_purge_old_events_after} '; - - } + } $GLOBALS['egw']->common->egw_header(); echo parse_navbar(); @@ -158,7 +158,7 @@ $GLOBALS['egw']->template->set_var('lang_cancel',lang('Cancel')); $GLOBALS['egw']->template->set_var('error_message',$feedback_message); - $GLOBALS['egw']->template->pfp('out','form'); + $GLOBALS['egw']->template->pparse('out','form'); } } ?> From 7a0c9fedcf3f5ff8d2e973c6fb68cf327f7b67c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Lehrke?= Date: Mon, 5 Jul 2010 19:06:49 +0000 Subject: [PATCH 146/496] Fix vCalendar v1.0 EXDATE export --- calendar/inc/class.calendar_ical.inc.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/calendar/inc/class.calendar_ical.inc.php b/calendar/inc/class.calendar_ical.inc.php index 154b22ec52..3dcba248a3 100644 --- a/calendar/inc/class.calendar_ical.inc.php +++ b/calendar/inc/class.calendar_ical.inc.php @@ -678,7 +678,10 @@ class calendar_ical extends calendar_boupdate $attributes['EXDATE'] = ''; $values['EXDATE'] = $event['recur_exception']; - $parameters['EXDATE']['VALUE'] = $value_type; + if ($version != '1.0') + { + $parameters['EXDATE']['VALUE'] = $value_type; + } } break; From f7847a11838010276e8ab7dfb1498e8922ab03c5 Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Tue, 6 Jul 2010 08:25:13 +0000 Subject: [PATCH 147/496] rework of calendar purge function --- calendar/inc/class.calendar_so.inc.php | 46 +++++++++++--------------- 1 file changed, 19 insertions(+), 27 deletions(-) diff --git a/calendar/inc/class.calendar_so.inc.php b/calendar/inc/class.calendar_so.inc.php index d52bfa746e..570df77f38 100644 --- a/calendar/inc/class.calendar_so.inc.php +++ b/calendar/inc/class.calendar_so.inc.php @@ -1513,42 +1513,34 @@ ORDER BY cal_user_type, cal_usre_id function purge($date) { // Start with egw_cal, it's the easiest - $sql = "DELETE FROM egw_cal + $sql = "(SELECT egw_cal.cal_id FROM egw_cal LEFT JOIN egw_cal_repeats ON - egw_cal_repeats.cal_id = egw_cal.cal_id + egw_cal_repeats.cal_id = egw_cal.cal_id JOIN egw_cal_dates ON egw_cal.cal_id = egw_cal_dates.cal_id - WHERE cal_end < $date AND (egw_cal_repeats.cal_id IS NULL || (recur_enddate < $date && recur_enddate != 0))"; - $this->db->query($sql, __LINE__, __FILE__); + WHERE cal_end < $date AND (egw_cal_repeats.cal_id IS NULL OR (recur_enddate < $date AND recur_enddate != 0))) AS TOPROCESS"; - // Get a list of what we just deleted for links - $ids = array(); + // Get what we want to delete for all tables and links foreach($this->db->select( - 'egw_cal_dates', + $sql, array('cal_id'), - array('cal_id NOT IN (SELECT cal_id FROM egw_cal)'), + null, __LINE__, __FILE__, false - ) as $row) + ) as $row) { - $ids[] = $row['cal_id']; + //echo __METHOD__." About to delete".$row['cal_id']."\r\n"; + foreach($this->all_tables as $table) + { + $this->db->delete($table, array('cal_id'=>$row['cal_id']), __LINE__, __FILE__, 'calendar'); + } + // handle sync + $this->db->query('UPDATE egw_api_content_history + SET sync_deleted=NOW() + WHERE sync_appname = \'calendar\' + AND sync_contentid ='.$row['cal_id'], __LINE__, __FILE__); + // handle links + egw_link::unlink('', 'calendar', $row['cal_id']); } - - // Cascade to other tables - foreach($this->all_tables as $table) - { - if($table == 'egw_cal') continue; - $this->db->delete($table, array('cal_id NOT IN (SELECT cal_id FROM egw_cal)'), __LINE__, __FILE__, 'calendar'); - } - - // Sync - $sql = 'UPDATE egw_api_content_history - SET sync_deleted=NOW() - WHERE sync_appname = \'calendar\' - AND sync_contentid NOT IN (SELECT cal_id from egw_cal)'; - $this->db->query($sql, __LINE__, __FILE__); - - // Links - egw_link::unlink('', 'calendar', $ids); } /** From 7b8b5c51909fe552044221f3e93840ef31b5a3dd Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Tue, 6 Jul 2010 13:51:58 +0000 Subject: [PATCH 148/496] fix for bug targets (if specified with HTML Links in CKEditor) do not szrvive purify. Chr.Fueller investigated Attr.AllowedFrameTargets as cause of the issue --- phpgwapi/inc/class.html.inc.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/phpgwapi/inc/class.html.inc.php b/phpgwapi/inc/class.html.inc.php index 934faa7bad..a2da2b56fb 100644 --- a/phpgwapi/inc/class.html.inc.php +++ b/phpgwapi/inc/class.html.inc.php @@ -200,6 +200,8 @@ class html $config->set('HTML.TidyLevel', 'light'); // EnableID is needed for anchor tags $config->set('Attr.EnableID',true); + // enable target attributes + $config->set('Attr.AllowedFrameTargets','_blank,_top,_self,_parent'); // actual allowed tags and attributes $config->set('URI.AllowedSchemes', array('http'=>true, 'https'=>true, 'ftp'=>true, 'file'=>true, 'cid'=>true)); $config->set('AutoFormat.RemoveEmpty', true); @@ -241,6 +243,8 @@ class html $config->set('HTML.TidyLevel', 'light'); // EnableID is needed for anchor tags $config->set('Attr.EnableID',true); + // enable target attributes + $config->set('Attr.AllowedFrameTargets','_blank,_top,_self,_parent'); // actual allowed tags and attributes $config->set('URI.AllowedSchemes', array('http'=>true, 'https'=>true, 'ftp'=>true, 'file'=>true, 'cid'=>true)); $config->set('AutoFormat.RemoveEmpty', true); @@ -1449,6 +1453,8 @@ class html $config->set('HTML.TidyLevel', 'light'); // EnableID is needed for anchor tags $config->set('Attr.EnableID',true); + // enable target attributes + $config->set('Attr.AllowedFrameTargets','_blank,_top,_self,_parent'); // actual allowed tags and attributes $config->set('HTML.Allowed', 'br,p[align|style],b,i,u,s,em,pre,tt,strong,strike,center,div[align|style],hr[class|style],'. 'ul[type],ol[type|start],li,'. From f89eed6c9ed42b8aaa909816876ec0c4aacf9936 Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Tue, 6 Jul 2010 15:12:47 +0000 Subject: [PATCH 149/496] quitening warning if no body (array) is to displayed --- felamimail/inc/class.uidisplay.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/felamimail/inc/class.uidisplay.inc.php b/felamimail/inc/class.uidisplay.inc.php index 20fe22022d..1c5b91e92b 100644 --- a/felamimail/inc/class.uidisplay.inc.php +++ b/felamimail/inc/class.uidisplay.inc.php @@ -1186,7 +1186,7 @@ #_debug_array($bodyParts); exit; - foreach($bodyParts as $singleBodyPart) { + foreach((array)$bodyParts as $singleBodyPart) { if (!isset($singleBodyPart['body'])) { $singleBodyPart['body'] = $this->getdisplayableBody($singleBodyPart); $body .= $singleBodyPart['body']; From 0597a5014c5bb2776b7b585702341787752718e6 Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Wed, 7 Jul 2010 07:38:17 +0000 Subject: [PATCH 150/496] backbort of A.Stoeckels fix for mainscreen resizing (r31306) --- felamimail/templates/default/mainscreen.tpl | 4 ++-- felamimail/templates/jerryr/mainscreen.tpl | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/felamimail/templates/default/mainscreen.tpl b/felamimail/templates/default/mainscreen.tpl index 4a1f4e411b..ed14965dfa 100644 --- a/felamimail/templates/default/mainscreen.tpl +++ b/felamimail/templates/default/mainscreen.tpl @@ -165,11 +165,11 @@ fm_startTimerMessageListUpdate(refreshTimeOut); if the iframe stays maximized. */ if (window.parent && typeof window.parent.framework != 'undefined') { - var height = $(window).height() - felamimail_iframe_height - $(divMessageTableList).offset().top - 70; + var height = $(document).height() - felamimail_iframe_height - $(divMessageTableList).offset().top - 70; } else { - var height = $(window).height() - felamimail_iframe_height - $(divMessageTableList).offset().top - 90; + var height = $(document).height() - felamimail_iframe_height - $(divMessageTableList).offset().top - 90; } /* Tableheight specifies the rendered size of the table, diff --git a/felamimail/templates/jerryr/mainscreen.tpl b/felamimail/templates/jerryr/mainscreen.tpl index 560c17ef3a..457563d146 100644 --- a/felamimail/templates/jerryr/mainscreen.tpl +++ b/felamimail/templates/jerryr/mainscreen.tpl @@ -170,11 +170,11 @@ fm_startTimerMessageListUpdate(refreshTimeOut); if the iframe stays maximized. */ if (window.parent && typeof window.parent.framework != 'undefined') /* jdots template, does not apply here, as it is using default templates */ { - var height = $(window).height() - felamimail_iframe_height - $(divMessageTableList).offset().top - 85; + var height = $(document).height() - felamimail_iframe_height - $(divMessageTableList).offset().top - 85; } else { - var height = $(window).height() - felamimail_iframe_height - $(divMessageTableList).offset().top - 112; + var height = $(document).height() - felamimail_iframe_height - $(divMessageTableList).offset().top - 112; } /* Tableheight specifies the rendered size of the table, From 4b2b17b7518356ea115844fc40b86c8d6b5b3fa9 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 7 Jul 2010 10:10:59 +0000 Subject: [PATCH 151/496] new optional parameter "extra_args" for link widget, to add further get parameters to the link --- etemplate/inc/class.link_widget.inc.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/etemplate/inc/class.link_widget.inc.php b/etemplate/inc/class.link_widget.inc.php index 0d62b2ee80..6368dacc3e 100644 --- a/etemplate/inc/class.link_widget.inc.php +++ b/etemplate/inc/class.link_widget.inc.php @@ -19,7 +19,8 @@ * If run in a popup and the app uses no popups, a target will be set, to open a new full decorated window. * * The class contains the following widgets: - * - link: Show a link to one linked entry specified by an array with keys app, id and optional title and help-message + * - link: Show a link to one linked entry specified by an array with keys app, id and optional title, + * help-message and extra_args (array with additional get parameters) * Optionally the application can be specified as option and the value can be just the id. * - link-to: Widget to create links to an other entries of link-aware apps * If the variables $data['widget_id']['to_app'] = $app and $data['widget_id']['to_id'] = $entry_id @@ -161,6 +162,13 @@ class link_widget { $link .= '&'.$var.'='.$val; } + if (isset($value['extra_args'])) + { + foreach($value['extra_args'] as $var => $val) + { + $link .= '&'.$var.'='.$val; + } + } if (!($popup = egw_link::is_popup($value['app'],'view')) && etemplate::$request->output_mode == 2) // we are in a popup { From 90717af7a70d98d42b83014d95542a3fd2ccd623 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 7 Jul 2010 10:12:27 +0000 Subject: [PATCH 152/496] add date parameter to next and last date link, to set correct exception date for recuring events --- addressbook/inc/class.addressbook_bo.inc.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/addressbook/inc/class.addressbook_bo.inc.php b/addressbook/inc/class.addressbook_bo.inc.php index f11753404d..a91c199aa8 100755 --- a/addressbook/inc/class.addressbook_bo.inc.php +++ b/addressbook/inc/class.addressbook_bo.inc.php @@ -1312,6 +1312,9 @@ class addressbook_bo extends addressbook_so 'id' => $event['id'], 'app' => 'calendar', 'title' => $bocal->link_title($event), + 'extra_args' => array( + 'date' => date('Ymd',$event['start']), + ), ); if ($extra_title) { @@ -1330,6 +1333,9 @@ class addressbook_bo extends addressbook_so 'id' => $event['id'], 'app' => 'calendar', 'title' => $bocal->link_title($event), + 'extra_args' => array( + 'date' => date('Ymd',$event['start']), + ), ); if ($extra_title) { @@ -1341,7 +1347,6 @@ class addressbook_bo extends addressbook_so } } } - //_debug_array($calendars); return $calendars; } From 33f102ac0a984c07e43c5b7b0320295b512aaa67 Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Wed, 7 Jul 2010 11:50:49 +0000 Subject: [PATCH 153/496] fix advanced search for customfields (multiple field criteria, combined by AND) in addressbook --- etemplate/inc/class.so_sql_cf.inc.php | 28 ++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/etemplate/inc/class.so_sql_cf.inc.php b/etemplate/inc/class.so_sql_cf.inc.php index e3066ded53..d927118c75 100644 --- a/etemplate/inc/class.so_sql_cf.inc.php +++ b/etemplate/inc/class.so_sql_cf.inc.php @@ -458,19 +458,29 @@ class so_sql_cf extends so_sql } elseif (is_string($name) && $this->is_cf($name)) { - $name = substr($name, 1); - if (($negate = $criteria[$name][0] === '!')) + if ($op != 'AND') { - $val = substr($val,1); + $name = substr($name, 1); + if (($negate = $criteria[$name][0] === '!')) + { + $val = substr($val,1); + } + $cfcriteria[] = '(' . $this->extra_table.'.'.$this->extra_value . ' ' .($negate ? 'NOT ' : ''). + $this->db->capabilities[egw_db::CAPABILITY_CASE_INSENSITIV_LIKE]. ' ' . + $this->db->quote($wildcard.$val.$wildcard) . ' AND ' . + $this->extra_table.'.'.$this->extra_key . ' = ' . $this->db->quote($name) . + ')'; + unset($criteria[self::CF_PREFIX.$name]); + } + else + { + // criteria operator is AND we remap the criteria to be transformed to filters + $filter[$name] = $val; + unset($criteria[$name]); } - $criteria[] = '(' . $this->extra_table.'.'.$this->extra_value . ' ' .($negate ? 'NOT ' : ''). - $this->db->capabilities[egw_db::CAPABILITY_CASE_INSENSITIV_LIKE]. ' ' . - $this->db->quote($wildcard.$val.$wildcard) . ' AND ' . - $this->extra_table.'.'.$this->extra_key . ' = ' . $this->db->quote($name) . - ')'; - unset($criteria[self::CF_PREFIX.$name]); } } + if ($cfcriteria && $op =='OR') $criteria[] = implode(' OR ',$cfcriteria); } if($only_keys === true) { // Expand to keys here, so table_name can be prepended below From 4b4735cb80c059cbbeda0de81a67eacebc2a9e7f Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Wed, 7 Jul 2010 14:12:41 +0000 Subject: [PATCH 154/496] allow for like wildcard.val.wildcard in filtersearch for customfields (needed for advanced search, as criteria are now remapped to be filters for customfields) --- etemplate/inc/class.so_sql_cf.inc.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/etemplate/inc/class.so_sql_cf.inc.php b/etemplate/inc/class.so_sql_cf.inc.php index d927118c75..285b0ba149 100644 --- a/etemplate/inc/class.so_sql_cf.inc.php +++ b/etemplate/inc/class.so_sql_cf.inc.php @@ -553,6 +553,14 @@ class so_sql_cf extends so_sql )) ); } + elseif ($this->customfields[$this->get_cf_name($name)]['type'] == 'text') + { + $sql_filter = str_replace($this->extra_value,'extra_filter.'.$this->extra_value, + $this->db->expression($this->extra_table,array( + $this->extra_value.' '.$this->db->capabilities[egw_db::CAPABILITY_CASE_INSENSITIV_LIKE].' '.$this->db->quote($wildcard.$val.$wildcard) + )) + ); + } else { $sql_filter = str_replace($this->extra_value,'extra_filter.'. From 284f226d6ddccd060671bfa9c534ff70f4abf659 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 7 Jul 2010 17:12:34 +0000 Subject: [PATCH 155/496] adding "regular" import/export functions (import & export) to preferences: allows to use them without being admin --- ...rtexport_admin_prefs_sidebox_hooks.inc.php | 67 +------------------ importexport/setup/setup.inc.php | 8 +-- 2 files changed, 6 insertions(+), 69 deletions(-) diff --git a/importexport/inc/class.importexport_admin_prefs_sidebox_hooks.inc.php b/importexport/inc/class.importexport_admin_prefs_sidebox_hooks.inc.php index 621bc3ebd7..913d4d3542 100644 --- a/importexport/inc/class.importexport_admin_prefs_sidebox_hooks.inc.php +++ b/importexport/inc/class.importexport_admin_prefs_sidebox_hooks.inc.php @@ -16,22 +16,12 @@ if (!defined('IMPORTEXPORT_APP')) class importexport_admin_prefs_sidebox_hooks { - var $config = array(); - - function importexport_admin_prefs_sidebox_hooks() - { - $config =& CreateObject('phpgwapi.config',IMPORTEXPORT_APP); - $config->read_repository(); - $this->config =& $config->config_data; - unset($config); - } - - function all_hooks($args) + static function all_hooks($args) { $appname = IMPORTEXPORT_APP; $location = is_array($args) ? $args['location'] : $args; - if ($location == 'sidebox_menu') + if ($GLOBALS['egw_info']['user']['apps']['preferences'] && $location != 'admin') { $file = array( 'Import'=> array( @@ -47,23 +37,13 @@ class importexport_admin_prefs_sidebox_hooks 'icon' => 'export' ), ); - display_sidebox($appname,$GLOBALS['egw_info']['apps'][$appname]['title'].' '.lang('Menu'),$file); - } - - if ($GLOBALS['egw_info']['user']['apps']['preferences'] && $location != 'admin') - { - $file = array( -// 'Preferences' => $GLOBALS['egw']->link('/index.php','menuaction=preferences.uisettings.index&appname='.$appname), -// 'Grant Access' => $GLOBALS['egw']->link('/index.php','menuaction=preferences.uiaclprefs.index&acl_app='.$appname), -// 'Edit Categories' => $GLOBALS['egw']->link('/index.php','menuaction=preferences.uicategories.index&cats_app=' . $appname . '&cats_level=True&global_cats=True') - ); if ($location == 'preferences') { display_section($appname,$file); } else { - display_sidebox($appname,lang('Preferences'),$file); + display_sidebox($appname,lang($appname),$file); } } @@ -88,45 +68,4 @@ class importexport_admin_prefs_sidebox_hooks } } } - - /** - * populates $GLOBALS['settings'] for the preferences - */ - function settings() - { - $this->check_set_default_prefs(); - - return true; // otherwise prefs say it cant find the file ;-) - } - - /** - * Check if reasonable default preferences are set and set them if not - * - * It sets a flag in the app-session-data to be called only once per session - */ - function check_set_default_prefs() - { - if ($GLOBALS['egw']->session->appsession('default_prefs_set',IMPORTEXPORT_APP)) - { - return; - } - $GLOBALS['egw']->session->appsession('default_prefs_set',IMPORTEXPORT_APP,'set'); - - $default_prefs =& $GLOBALS['egw']->preferences->default[IMPORTEXPORT_APP]; - - $defaults = array( - ); - foreach($defaults as $var => $default) - { - if (!isset($default_prefs[$var]) || $default_prefs[$var] === '') - { - $GLOBALS['egw']->preferences->add(IMPORTEXPORT_APP,$var,$default,'default'); - $need_save = True; - } - } - if ($need_save) - { - $GLOBALS['egw']->preferences->save_repository(False,'default'); - } - } } diff --git a/importexport/setup/setup.inc.php b/importexport/setup/setup.inc.php index c87368e96b..13f8bcbf48 100644 --- a/importexport/setup/setup.inc.php +++ b/importexport/setup/setup.inc.php @@ -26,11 +26,9 @@ $setup_info['importexport']['note'] = ''; /* The hooks this app includes, needed for hooks registration */ -//$setup_info['importexport']['hooks']['preferences'] = 'importexport'.'.admin_prefs_sidebox_hooks.all_hooks'; -//$setup_info['importexport']['hooks']['settings'] = 'importexport'.'.admin_prefs_sidebox_hooks.settings'; -$setup_info['importexport']['hooks']['admin'] = 'importexport'.'.importexport_admin_prefs_sidebox_hooks.all_hooks'; -$setup_info['importexport']['hooks']['sidebox_menu'] = 'importexport'.'.importexport_admin_prefs_sidebox_hooks.all_hooks'; -//$setup_info['importexport']['hooks']['search_link'] = 'importexport'.'.bomyterra.search_link'; +$setup_info['importexport']['hooks']['preferences'] = +$setup_info['importexport']['hooks']['admin'] = +$setup_info['importexport']['hooks']['sidebox_menu'] = 'importexport_admin_prefs_sidebox_hooks::all_hooks'; /* Dependencies for this app to work */ $setup_info['importexport']['depends'][] = array( From b92a2ed5b64ac30cc31b11bf2730bc37b16fc97a Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 8 Jul 2010 08:13:37 +0000 Subject: [PATCH 156/496] - implemented limited support for sidebox options in preferences - opening import/export dialogs as popups, as they use egw window.close() --- ...rtexport_admin_prefs_sidebox_hooks.inc.php | 20 +- preferences/index.php | 243 +++++++++--------- 2 files changed, 133 insertions(+), 130 deletions(-) diff --git a/importexport/inc/class.importexport_admin_prefs_sidebox_hooks.inc.php b/importexport/inc/class.importexport_admin_prefs_sidebox_hooks.inc.php index 913d4d3542..1a9bd0c38e 100644 --- a/importexport/inc/class.importexport_admin_prefs_sidebox_hooks.inc.php +++ b/importexport/inc/class.importexport_admin_prefs_sidebox_hooks.inc.php @@ -24,16 +24,18 @@ class importexport_admin_prefs_sidebox_hooks if ($GLOBALS['egw_info']['user']['apps']['preferences'] && $location != 'admin') { $file = array( - 'Import'=> array( + array( 'text' => 'Import', - 'link' => $GLOBALS['egw']->link('/index.php','menuaction=importexport.importexport_import_ui.import_dialog'), - 'target' => 'new', + 'link' => "javascript:egw_openWindowCentered2('". + egw::link('/index.php','menuaction=importexport.importexport_import_ui.import_dialog',false). + "','_blank',850,440,'yes')", 'icon' => 'import' ), - 'Export'=> array( + array( 'text' => 'Export', - 'link' => $GLOBALS['egw']->link('/index.php','menuaction=importexport.importexport_export_ui.export_dialog'), - 'target' => 'new', + 'link' => "javascript:egw_openWindowCentered2('". + egw::link('/index.php','menuaction=importexport.importexport_export_ui.export_dialog',false). + "','_blank',850,440,'yes')", 'icon' => 'export' ), ); @@ -50,11 +52,11 @@ class importexport_admin_prefs_sidebox_hooks if ($GLOBALS['egw_info']['user']['apps']['admin'] && $location != 'preferences') { $file = Array( - 'Import definitions' => $GLOBALS['egw']->link('/index.php','menuaction=importexport.importexport_definitions_ui.import_definition'), - 'Define imports|exports' => $GLOBALS['egw']->link('/index.php',array( + 'Import definitions' => egw::link('/index.php','menuaction=importexport.importexport_definitions_ui.import_definition'), + 'Define imports|exports' => egw::link('/index.php',array( 'menuaction' => 'importexport.importexport_definitions_ui.index', )), - 'Schedule' => $GLOBALS['egw']->link('/index.php', array( + 'Schedule' => egw::link('/index.php', array( 'menuaction' => 'importexport.importexport_schedule_ui.index' )), ); diff --git a/preferences/index.php b/preferences/index.php index 7549fd5707..266f314c86 100755 --- a/preferences/index.php +++ b/preferences/index.php @@ -1,142 +1,143 @@ * - * -------------------------------------------- * - * 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. * - \**************************************************************************/ +/** + * EGroupware preferences + * + * @package preferences + * @link http://www.egroupware.org + * @author Joseph Engo + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ - /* $Id$ */ +$GLOBALS['egw_info'] = array( + 'flags' => array( + 'currentapp' => 'preferences', + 'disable_Template_class' => True, + ), +); +include('../header.inc.php'); - $GLOBALS['egw_info'] = array( - 'flags' => array( - 'currentapp' => 'preferences', - 'disable_Template_class' => True, - ), +$pref_tpl =& CreateObject('phpgwapi.Template',EGW_APP_TPL); +$templates = Array( + 'pref' => 'index.tpl' +); + +$pref_tpl->set_file($templates); + +$pref_tpl->set_block('pref','list'); +$pref_tpl->set_block('pref','app_row'); +$pref_tpl->set_block('pref','app_row_noicon'); +$pref_tpl->set_block('pref','link_row'); +$pref_tpl->set_block('pref','spacer_row'); + +if ($GLOBALS['egw']->acl->check('run',1,'admin')) +{ + // This is where we will keep track of our position. + // Developers won't have to pass around a variable then + $session_data = $GLOBALS['egw']->session->appsession('session_data','preferences'); + + if (! is_array($session_data)) + { + $session_data = array('type' => 'user'); + $GLOBALS['egw']->session->appsession('session_data','preferences',$session_data); + } + + if (! $_GET['type']) + { + $type = $session_data['type']; + } + else + { + $type = $_GET['type']; + $session_data = array('type' => $type); + $GLOBALS['egw']->session->appsession('session_data','preferences',$session_data); + } + + $tabs[] = array( + 'label' => lang('Your preferences'), + 'link' => egw::link('/preferences/index.php','type=user') ); - include('../header.inc.php'); - - $pref_tpl =& CreateObject('phpgwapi.Template',EGW_APP_TPL); - $templates = Array( - 'pref' => 'index.tpl' + $tabs[] = array( + 'label' => lang('Default preferences'), + 'link' => egw::link('/preferences/index.php','type=default') + ); + $tabs[] = array( + 'label' => lang('Forced preferences'), + 'link' => egw::link('/preferences/index.php','type=forced') ); - $pref_tpl->set_file($templates); - - $pref_tpl->set_block('pref','list'); - $pref_tpl->set_block('pref','app_row'); - $pref_tpl->set_block('pref','app_row_noicon'); - $pref_tpl->set_block('pref','link_row'); - $pref_tpl->set_block('pref','spacer_row'); - - if ($GLOBALS['egw']->acl->check('run',1,'admin')) + switch($type) { - // This is where we will keep track of our position. - // Developers won't have to pass around a variable then - $session_data = $GLOBALS['egw']->session->appsession('session_data','preferences'); + case 'user': $selected = 0; break; + case 'default': $selected = 1; break; + case 'forced': $selected = 2; break; + } + $pref_tpl->set_var('tabs',$GLOBALS['egw']->common->create_tabs($tabs,$selected)); +} - if (! is_array($session_data)) - { - $session_data = array('type' => 'user'); - $GLOBALS['egw']->session->appsession('session_data','preferences',$session_data); - } +// This func called by the includes to dump a row header +function section_start($appname='',$icon='') +{ + global $pref_tpl; - if (! $_GET['type']) - { - $type = $session_data['type']; - } - else - { - $type = $_GET['type']; - $session_data = array('type' => $type); - $GLOBALS['egw']->session->appsession('session_data','preferences',$session_data); - } + $pref_tpl->set_var('a_name',$appname); + $pref_tpl->set_var('app_name',$GLOBALS['egw_info']['apps'][$appname]['title']); + $pref_tpl->set_var('app_icon',$icon); + if ($icon) + { + $pref_tpl->parse('rows','app_row',True); + } + else + { + $pref_tpl->parse('rows','app_row_noicon',True); + } +} - $tabs[] = array( - 'label' => lang('Your preferences'), - 'link' => $GLOBALS['egw']->link('/preferences/index.php','type=user') - ); - $tabs[] = array( - 'label' => lang('Default preferences'), - 'link' => $GLOBALS['egw']->link('/preferences/index.php','type=default') - ); - $tabs[] = array( - 'label' => lang('Forced preferences'), - 'link' => $GLOBALS['egw']->link('/preferences/index.php','type=forced') - ); +function section_item($pref_link='',$pref_text='') +{ + global $pref_tpl; - switch($type) - { - case 'user': $selected = 0; break; - case 'default': $selected = 1; break; - case 'forced': $selected = 2; break; - } - $pref_tpl->set_var('tabs',$GLOBALS['egw']->common->create_tabs($tabs,$selected)); + $pref_tpl->set_var('pref_link',$pref_link); + + if (strtolower($pref_text) == 'grant access' && $GLOBALS['egw_info']['server']['deny_user_grants_access']) + { + return False; + } + else + { + $pref_tpl->set_var('pref_text',$pref_text); } - // This func called by the includes to dump a row header - function section_start($appname='',$icon='') + $pref_tpl->parse('rows','link_row',True); +} + +function section_end() +{ + global $pref_tpl; + + $pref_tpl->parse('rows','spacer_row',True); +} + +function display_section($appname,$file,$file2=False) +{ + if ($file2) { - global $pref_tpl; - - $pref_tpl->set_var('a_name',$appname); - $pref_tpl->set_var('app_name',$GLOBALS['egw_info']['apps'][$appname]['title']); - $pref_tpl->set_var('app_icon',$icon); - if ($icon) - { - $pref_tpl->parse('rows','app_row',True); - } - else - { - $pref_tpl->parse('rows','app_row_noicon',True); - } + $file = $file2; } + section_start($appname,$GLOBALS['egw']->common->image($appname,Array('navbar',$appname))); - function section_item($pref_link='',$pref_text='') + foreach($file as $text => $url) { - global $pref_tpl; - - $pref_tpl->set_var('pref_link',$pref_link); - - if (strtolower($pref_text) == 'grant access' && $GLOBALS['egw_info']['server']['deny_user_grants_access']) + if (is_array($url)) { - return False; + $text = $url['text']; + $url = $url['link']; } - else - { - $pref_tpl->set_var('pref_text',$pref_text); - } - - $pref_tpl->parse('rows','link_row',True); + section_item($url,lang($text)); } + section_end(); +} - function section_end() - { - global $pref_tpl; - - $pref_tpl->parse('rows','spacer_row',True); - } - - function display_section($appname,$file,$file2=False) - { - if ($file2) - { - $file = $file2; - } - section_start($appname,$GLOBALS['egw']->common->image($appname,Array('navbar',$appname))); - - while(list($text,$url) = each($file)) - { - section_item($url,lang($text)); - } - section_end(); - } - - $GLOBALS['egw']->hooks->process('preferences',array('preferences')); - $pref_tpl->pfp('out','list'); - $GLOBALS['egw']->common->egw_footer(); -?> +$GLOBALS['egw']->hooks->process('preferences',array('preferences')); +$pref_tpl->pfp('out','list'); +common::egw_footer(); From 21e83f292843e28ebf3ee2295bc3d6fa67a32a25 Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Thu, 8 Jul 2010 08:44:02 +0000 Subject: [PATCH 157/496] fix typo --- felamimail/inc/class.bofelamimail.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/felamimail/inc/class.bofelamimail.inc.php b/felamimail/inc/class.bofelamimail.inc.php index f842e57702..abff98dcff 100644 --- a/felamimail/inc/class.bofelamimail.inc.php +++ b/felamimail/inc/class.bofelamimail.inc.php @@ -1156,7 +1156,7 @@ $attachments = $this->getMessageAttachments($_uid, $_part); foreach($attachments as $attachment) { #error_log(print_r($attachment,true)); - if(strpos($attachment['cid'], $_cid) !== false || strpos($cid, $attachment['cid']) !== false) { + if(strpos($attachment['cid'], $_cid) !== false || strpos($_cid, $attachment['cid']) !== false) { $partID = $attachment['partID']; break; } From 93340c8174368799844b5e1adb792ba49ac2724a Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Thu, 8 Jul 2010 09:12:33 +0000 Subject: [PATCH 158/496] quitening warning for mb-strpos, when attachment->cid is not set --- felamimail/inc/class.bofelamimail.inc.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/felamimail/inc/class.bofelamimail.inc.php b/felamimail/inc/class.bofelamimail.inc.php index abff98dcff..6eb9f57991 100644 --- a/felamimail/inc/class.bofelamimail.inc.php +++ b/felamimail/inc/class.bofelamimail.inc.php @@ -1155,8 +1155,9 @@ #error_log("getAttachmentByCID:$_uid, $_cid, $_part"); $attachments = $this->getMessageAttachments($_uid, $_part); foreach($attachments as $attachment) { - #error_log(print_r($attachment,true)); - if(strpos($attachment['cid'], $_cid) !== false || strpos($_cid, $attachment['cid']) !== false) { + //error_log(__METHOD__.'Attachment#'.print_r($attachment,true).'#'); + //error_log(__METHOD__.'CID#'.print_r($_cid,true).'#'); + if(isset($attachment['cid']) && (strpos($attachment['cid'], $_cid) !== false || strpos($_cid, $attachment['cid']) !== false)) { $partID = $attachment['partID']; break; } From 6970e437d16d2d27b52e32be1e7f90110daf4ad3 Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Thu, 8 Jul 2010 09:34:42 +0000 Subject: [PATCH 159/496] put out Unrecogniced GroupDAV client Message only, when debug bis enabled --- phpgwapi/inc/class.groupdav_handler.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpgwapi/inc/class.groupdav_handler.inc.php b/phpgwapi/inc/class.groupdav_handler.inc.php index c79489f6c2..f2264c2575 100644 --- a/phpgwapi/inc/class.groupdav_handler.inc.php +++ b/phpgwapi/inc/class.groupdav_handler.inc.php @@ -358,7 +358,7 @@ abstract class groupdav_handler } if (!$agent) { - error_log("Unrecogniced GroupDAV client: HTTP_USER_AGENT='$_SERVER[HTTP_USER_AGENT]'!"); + if ($this->debug) error_log("Unrecogniced GroupDAV client: HTTP_USER_AGENT='$_SERVER[HTTP_USER_AGENT]'!"); } else { From 397706b2e3be45a1b933f954f8571aafbbf1ec76 Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Thu, 8 Jul 2010 09:40:35 +0000 Subject: [PATCH 160/496] put out Unrecogniced GroupDAV client Message only, when debug bis enabled -> does not work, as the function is static, commented the error_log --- phpgwapi/inc/class.groupdav_handler.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpgwapi/inc/class.groupdav_handler.inc.php b/phpgwapi/inc/class.groupdav_handler.inc.php index f2264c2575..473398e5e5 100644 --- a/phpgwapi/inc/class.groupdav_handler.inc.php +++ b/phpgwapi/inc/class.groupdav_handler.inc.php @@ -358,7 +358,7 @@ abstract class groupdav_handler } if (!$agent) { - if ($this->debug) error_log("Unrecogniced GroupDAV client: HTTP_USER_AGENT='$_SERVER[HTTP_USER_AGENT]'!"); + //error_log("Unrecogniced GroupDAV client: HTTP_USER_AGENT='$_SERVER[HTTP_USER_AGENT]'!"); } else { From 650723d7d916dea16b823597a46a0bdf4a6c69de Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Thu, 8 Jul 2010 09:48:16 +0000 Subject: [PATCH 161/496] give out messages about the failure of connection only when debug is enabled --- emailadmin/inc/class.defaultimap.inc.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/emailadmin/inc/class.defaultimap.inc.php b/emailadmin/inc/class.defaultimap.inc.php index 89e59f917e..6b0ac2ea52 100644 --- a/emailadmin/inc/class.defaultimap.inc.php +++ b/emailadmin/inc/class.defaultimap.inc.php @@ -493,20 +493,20 @@ $this->setStreamContextOptions($this->_getTransportOptions()); $this->setTimeout(20); if( PEAR::isError($status = parent::connect($this->_getTransportString(), $this->port, $this->encryption == 1)) ) { - error_log(__METHOD__."Could not connect with ".$this->_getTransportString()." on Port ".$this->port." Encryption==1?".$this->encryption); - error_log(__METHOD__."Status connect:".$status->message); + if ($this->debug) error_log(__METHOD__."Could not connect with ".$this->_getTransportString()." on Port ".$this->port." Encryption==1?".$this->encryption); + if ($this->debug) error_log(__METHOD__."Status connect:".$status->message); $this->_connectionErrorObject = $status; return false; } if(empty($username)) { - error_log(__METHOD__."No username supplied.".function_backtrace()); + if ($this->debug) error_log(__METHOD__."No username supplied.".function_backtrace()); return false; } if( PEAR::isError($status = parent::login($username, $password, TRUE, !$this->isAdminConnection)) ) { - error_log(__METHOD__."Could not log in with ->".$username.":".$password."<-"); - error_log(__METHOD__."Status login:".array2string($status->message)); - //error_log(__METHOD__.'Called from:'.function_backtrace()); + if ($this->debug) error_log(__METHOD__."Could not log in with ->".$username.":".$password."<- Domain:".$GLOBALS['egw_info']['user']['domain']); + if ($this->debug) error_log(__METHOD__."Status login:".array2string($status->message)); + if ($this->debug) error_log(__METHOD__.'Called from:'.function_backtrace()); $this->disconnect(); $this->_connectionErrorObject = $status; return false; From 03b392a0d2a352039089603ba178f2c2d0176161 Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Thu, 8 Jul 2010 09:53:54 +0000 Subject: [PATCH 162/496] quitening message regarding BestUserMethod not supported byServer (enabled if you switch on debug) --- egw-pear/Net/IMAPProtocol.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/egw-pear/Net/IMAPProtocol.php b/egw-pear/Net/IMAPProtocol.php index 0ec87289d6..fcfabf0a26 100644 --- a/egw-pear/Net/IMAPProtocol.php +++ b/egw-pear/Net/IMAPProtocol.php @@ -725,7 +725,7 @@ class Net_IMAPProtocol { { foreach ( $this->supportedAuthMethods as $method ) { if ( in_array( $method , $this->_serverAuthMethods ) ) { - error_log(__METHOD__." UserMethod $userMethod not supported by server; trying best ServerMethod $method"); + if ($this->_debug) error_log(__METHOD__." UserMethod $userMethod not supported by server; trying best ServerMethod $method"); return $method; } } From 6b34b33d230d8111638e655e2ab6b691cd6b8221 Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Thu, 8 Jul 2010 11:39:27 +0000 Subject: [PATCH 163/496] explicitly process fields to order by, as cutomfields may have names with spaces, so we examine each order by criteria, as our preg did not do the job properly --- etemplate/inc/class.so_sql_cf.inc.php | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/etemplate/inc/class.so_sql_cf.inc.php b/etemplate/inc/class.so_sql_cf.inc.php index 285b0ba149..2be41db2f4 100644 --- a/etemplate/inc/class.so_sql_cf.inc.php +++ b/etemplate/inc/class.so_sql_cf.inc.php @@ -497,15 +497,24 @@ class so_sql_cf extends so_sql } } } - // check if we order by a custom field --> join cf table for given cf and order by it's value - if (strpos($order_by,self::CF_PREFIX) !== false && - preg_match('/'.self::CF_PREFIX.'([^ ]+) (asc|desc)/i',$order_by,$matches)) + if (strpos($order_by,self::CF_PREFIX) !== false) { - $order_by = str_replace($matches[0],'extra_order.'.$this->extra_value.' IS NULL,extra_order.'.$this->extra_value.' '.$matches[2],$order_by); - $join .= $this->extra_join_order.' AND extra_order.'.$this->extra_key.'='.$this->db->quote($matches[1]); + // fields to order by, as cutomfields may have names with spaces, we examine each order by criteria + $fields2order = explode(',',$order_by); + foreach($fields2order as $k => $v) + { + if (strpos($v,self::CF_PREFIX) !== false) + { + // we found a customfield, so we split that part by space char in order to get Sorting Direction and Fieldname + $buff = explode(' ',trim($v)); + $orderDir = array_pop($buff); + $key = trim(implode(' ',$buff)); + $order_by = str_replace($v,'extra_order.'.$this->extra_value.' IS NULL,extra_order.'.$this->extra_value.' '.$orderDir,$order_by); + $join .= $this->extra_join_order.' AND extra_order.'.$this->extra_key.'='.$this->db->quote(substr($key,1)); + } + } } - // check if we filter by a custom field if (is_array($filter)) { From 502ccecfdbb8d5730b8bc37f805a287dd6aae8dd Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Thu, 8 Jul 2010 13:51:38 +0000 Subject: [PATCH 164/496] only try to fetch the bodystructure if there is a parsed response --- egw-pear/Net/IMAP.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/egw-pear/Net/IMAP.php b/egw-pear/Net/IMAP.php index ae84542172..1d72298c08 100644 --- a/egw-pear/Net/IMAP.php +++ b/egw-pear/Net/IMAP.php @@ -550,7 +550,7 @@ class Net_IMAP extends Net_IMAPProtocol { } $ret2=$ret["PARSED"][0]["EXT"]["BODYSTRUCTURE"][0]; // sometimes we get an [COMMAND] => OK with $ret["PARSED"][0] and no $ret["PARSED"][0]["EXT"]["BODYSTRUCTURE"] - if (is_array($ret) && empty($ret2)) { + if (is_array($ret) && empty($ret2) && isset($ret["PARSED"])) { foreach($ret["PARSED"] as $substruct) { if ($substruct["COMMAND"] == "FETCH") { $ret2=$substruct["EXT"]["BODYSTRUCTURE"][0]; From 55c628e61a38cc0bef8c3f531bde490e8c1853b9 Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Thu, 8 Jul 2010 15:03:00 +0000 Subject: [PATCH 165/496] check the cat filter. If you have no read rights for any cats (and with that resources) set the cat-filter to null. As cat_id is enforced for resources by UI, you should not ret any results, which is expected if you have no read rights. --- resources/inc/class.bo_resources.inc.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/resources/inc/class.bo_resources.inc.php b/resources/inc/class.bo_resources.inc.php index ab271f8a9a..cfd2db7276 100755 --- a/resources/inc/class.bo_resources.inc.php +++ b/resources/inc/class.bo_resources.inc.php @@ -90,6 +90,9 @@ class bo_resources { $filter['cat_id'] = array_keys($readcats); } + // if there is no catfilter -> this means you have no rights, so set the cat filter to null + if (!isset($filter['cat_id']) || empty($filter['cat_id'])) $filter['cat_id'] = NUll; + if ($query['show_bookable']) { $filter['bookable'] = true; From 87eedef72f80bc258d851c64767147846aacb772 Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Mon, 12 Jul 2010 15:22:33 +0000 Subject: [PATCH 166/496] feature: option/setting to be enabled to suppress ruler that separates EMailbody from signature; option/setting to be able to insert the signature at the top of a message to be composed --- felamimail/inc/class.ajaxfelamimail.inc.php | 60 +++++++++++++++++ felamimail/inc/class.bocompose.inc.php | 22 ++++++- felamimail/inc/class.bopreferences.inc.php | 4 +- felamimail/inc/class.felamimail_hooks.inc.php | 20 +++++- felamimail/inc/class.uicompose.inc.php | 66 +++++++++++++------ felamimail/js/jscode/composeMessage.js | 66 ++++++++++++++++++- felamimail/lang/egw_de.lang | 2 + felamimail/lang/egw_en.lang | 2 + felamimail/templates/default/composeForm.tpl | 1 + 9 files changed, 217 insertions(+), 26 deletions(-) diff --git a/felamimail/inc/class.ajaxfelamimail.inc.php b/felamimail/inc/class.ajaxfelamimail.inc.php index e3fc51ae03..46140d537a 100644 --- a/felamimail/inc/class.ajaxfelamimail.inc.php +++ b/felamimail/inc/class.ajaxfelamimail.inc.php @@ -1000,6 +1000,66 @@ $response = new xajaxResponse(); $response->addScript('setSignature('.$Identities->signature.');'); + + return $response->getXML(); + } + + function changeComposeSignature($_composeID,$_oldSig,$_signatureID,$_currentMode,$_content) + { + // we need a lot of encoding/decoding transforming here to get at least some acceptable result + // the changing does not work with all sigs, as the old Signature may not match the Signaturepart in Content + + if($this->_debug) error_log(__METHOD__.$_oldSig.','.$_signatureID.'#'); + $bocompose = CreateObject('felamimail.bocompose', $_composeID); + // prepare signatures, the selected sig may be used on top of the body + require_once(EGW_INCLUDE_ROOT.'/felamimail/inc/class.felamimail_bosignatures.inc.php'); + $boSignatures = new felamimail_bosignatures(); + $oldSignature = $boSignatures->getSignature($_oldSig); + $oldSigText = $oldSignature->fm_signature; + $signature = $boSignatures->getSignature($_signatureID); + $sigText = $signature->fm_signature; + + if ($_currentMode == 'plain') + { + $oldSigText = $bocompose->convertHTMLToText($oldSigText); + $sigText = $bocompose->convertHTMLToText($sigText); + $_content = utf8_decode($_content); + if($this->_debug) error_log(__METHOD__." Old signature:".$oldSigText); + } + + $oldSigText = bofelamimail::merge($oldSigText,array($GLOBALS['egw']->accounts->id2name($GLOBALS['egw_info']['user']['account_id'],'person_id'))); + $sigText = bofelamimail::merge($sigText,array($GLOBALS['egw']->accounts->id2name($GLOBALS['egw_info']['user']['account_id'],'person_id'))); + $oldSigText = str_replace(array("\r","\t","
    \n",": "),array("","","
    ",":"),($_currentMode == 'html'?html::purify($oldSigText):$oldSigText)); + $_content = str_replace(array("\r","\t","
    \n",": "),array("","","
    ",":"),($_currentMode == 'html'?html::purify($_content):$_content)); + $found = strpos($_content,trim($oldSigText)); + if ($found !== false && $_oldSig != -2 && !(empty($oldSigText) || trim($bocompose->convertHTMLToText($oldSigText)) =='')) + { + $_content = substr_replace($_content,$sigText,$found,mb_strlen($oldSigText)); + } + if ($_oldSig == -2 && (empty($oldSigText) || trim($bocompose->convertHTMLToText($oldSigText)) =='')) + { + // if there is no sig selected, there is no way to replace a signature + } + if ($found === false) + { + if($this->_debug) error_log(__METHOD__." Old Signature failed to match:".$oldSigText); + if($this->_debug) error_log(__METHOD__." Compare content:".$_content); + } + $response = new xajaxResponse(); + if ($_currentMode == 'html') $_content = utf8_decode($_content); + $escaped = utf8_encode(str_replace(array("'", "\r", "\n"), array("\\'", "\\r", "\\n"), $_content)); + //error_log(__METHOD__.$escaped); + if ($_currentMode == 'html') + $response->addScript("showHTMLEditor('$escaped');"); + else + $response->addScript("showPlainEditor('$escaped');"); + /* + if ($found===false) + { + $warning = lang("Switching of Signatures failed"); + $response->addScript('alert('.$warning.');'); + } + */ return $response->getXML(); } diff --git a/felamimail/inc/class.bocompose.inc.php b/felamimail/inc/class.bocompose.inc.php index a0749f288d..fb50e95ed6 100644 --- a/felamimail/inc/class.bocompose.inc.php +++ b/felamimail/inc/class.bocompose.inc.php @@ -777,8 +777,21 @@ $_formData['body'] = preg_replace('/=\r\n/', '', $_formData['body']); $_formData['body'] = quoted_printable_decode($_formData['body']); } + $disableRuler = false; #if ($realCharset != $this->displayCharset) error_log("Error: bocompose::createMessage found Charset ($realCharset) differs from DisplayCharset (".$this->displayCharset.")"); $signature = $_signature->fm_signature; + if ((isset($this->preferencesArray['insertSignatureAtTopOfMessage']) && $this->preferencesArray['insertSignatureAtTopOfMessage'])) + { + // note: if you use stationery ' s the insert signatures at the top does not apply here anymore, as the signature + // is already part of the body, so the signature part of the teplate will not be applied. + $signature = null; // note: no signature, no ruler!!!! + } + if ((isset($this->preferencesArray['disableRulerForSignatureSeparation']) && + $this->preferencesArray['disableRulerForSignatureSeparation']) || + empty($signature) || trim($this->convertHTMLToText($signature)) =='') + { + $disableRuler = true; + } $signature = bofelamimail::merge($signature,array($GLOBALS['egw']->accounts->id2name($GLOBALS['egw_info']['user']['account_id'],'person_id'))); if($_formData['mimeType'] =='html') { $_mailObject->IsHTML(true); @@ -788,10 +801,12 @@ $bostationery = new felamimail_bostationery(); $_mailObject->Body = $bostationery->render($this->sessionData['stationeryID'],$_formData['body'],$signature); } else { - $_mailObject->Body = $_formData['body'] .'
    '. $signature; + $_mailObject->Body = $_formData['body'] . + ($disableRuler ?'
    ':'
    '). + $signature; } $_mailObject->AltBody = $this->convertHTMLToText($_formData['body']). - "\r\n-- \r\n". + ($disableRuler ?"\r\n":"\r\n-- \r\n"). $this->convertHTMLToText($signature); #print "
    $_mailObject->AltBody
    "; #print htmlentities($_signature['signature']); @@ -809,7 +824,8 @@ $_mailObject->Body = $this->convertHTMLToText($_formData['body'],false); #$_mailObject->Body = $_formData['body']; if(!empty($signature)) { - $_mailObject->Body .= "\r\n-- \r\n". $this->convertHTMLToText($signature); + $_mailObject->Body .= ($disableRuler ?"\r\n":"\r\n-- \r\n"). + $this->convertHTMLToText($signature); } } diff --git a/felamimail/inc/class.bopreferences.inc.php b/felamimail/inc/class.bopreferences.inc.php index 9cc285e28b..d4e24fa894 100644 --- a/felamimail/inc/class.bopreferences.inc.php +++ b/felamimail/inc/class.bopreferences.inc.php @@ -202,7 +202,7 @@ return array(); } - function getPreferences() + function getPreferences($getUserDefinedProfiles=true) { if (isset($this->sessionData['profileData']) && is_a($this->sessionData['profileData'],'ea_preferences')) { $this->profileData = $this->sessionData['profileData']; @@ -214,7 +214,7 @@ if(!is_a($profileData, 'ea_preferences') || !is_a($profileData->ic_server[0], 'defaultimap')) { return false; } - if($profileData->userDefinedAccounts && $GLOBALS['egw_info']['user']['apps']['felamimail']) { + if($profileData->userDefinedAccounts && $GLOBALS['egw_info']['user']['apps']['felamimail'] && $getUserDefinedProfiles) { // get user defined accounts $accountData = $this->getAccountData($profileData); diff --git a/felamimail/inc/class.felamimail_hooks.inc.php b/felamimail/inc/class.felamimail_hooks.inc.php index 187f807d21..23d243284b 100644 --- a/felamimail/inc/class.felamimail_hooks.inc.php +++ b/felamimail/inc/class.felamimail_hooks.inc.php @@ -85,7 +85,7 @@ class felamimail_hooks ); $no_yes_copy = array_merge($no_yes,array('2'=>lang('yes, offer copy option'))); - $prefAllowManageFolders = $no_yes; + $prefAllowManageFolders = $no_yes; $forwardOptions = array( 'asmail' => lang('forward as attachment'), @@ -395,6 +395,24 @@ class felamimail_hooks 'default'=> 0, 'admin' => False, ), + 'disableRulerForSignatureSeparation' => array( + 'type' => 'select', + 'label' => 'disable Ruler for separation of mailbody and signature when adding signature to composed message (this is not according to RFC).
    If you use templates, this option is only applied to the text part of the message.', + 'name' => 'disableRulerForSignatureSeparation', + 'values' => $no_yes, + 'xmlrpc' => True, + 'default'=> 0, + 'admin' => False, + ), + 'insertSignatureAtTopOfMessage' => array( + 'type' => 'select', + 'label' => 'insert the signature at top of the new (or reply) message when opening compose dialog (you may not be able to switch signatures)', + 'name' => 'insertSignatureAtTopOfMessage', + 'values' => $no_yes, + 'xmlrpc' => True, + 'default'=> 0, + 'admin' => False, + ), 'sieveScriptName' => array( 'type' => 'input', 'label' => 'sieve script name', diff --git a/felamimail/inc/class.uicompose.inc.php b/felamimail/inc/class.uicompose.inc.php index cdec7e79fc..b588c370d0 100644 --- a/felamimail/inc/class.uicompose.inc.php +++ b/felamimail/inc/class.uicompose.inc.php @@ -272,6 +272,8 @@ $this->t->set_block('composeForm','simple_text'); $this->translate(); + // store the selected Signature + $this->t->set_var("mySigID",($presetSig ? $presetSig : $sessionData['signatureID'])); if ($GLOBALS['egw_info']['user']['apps']['addressbook']) { $this->t->set_var("link_addressbook",$GLOBALS['egw']->link('/index.php',array( @@ -408,27 +410,11 @@ $this->t->set_var('lang_no_subject',lang('No subject given!')); $this->t->pparse("out","header"); - // body - if($sessionData['mimeType'] == 'html') { - $mode = 'simple'; - #if (isset($GLOBALS['egw_info']['server']['enabled_spellcheck'])) $mode = 'egw_simple_spellcheck'; - $style="border:0px; width:100%; height:400px;"; - // dont run purify, as we already did that (getCleanHTML). - $this->t->set_var('tinymce', html::fckEditorQuick('body', $mode, $sessionData['body'],'400px','100%',false)); - $this->t->set_var('mimeType', 'html'); - $ishtml=1; - } else { - $style="border:0px; width:100%; height:400px;"; - // initalize the CKEditor Object to enable switching back and force - $editor = $editorObject->init(). html::fckEditorQuick('body', 'ascii', $sessionData['body'],'400px','99%'); - $this->t->set_var('tinymce', $editor); //html::fckEditorQuick('body', 'ascii', $sessionData['body'],'400px','99%')); - $this->t->set_var('mimeType', 'text'); - $ishtml=0; - } - + // prepare signatures, the selected sig may be used on top of the body require_once(EGW_INCLUDE_ROOT.'/felamimail/inc/class.felamimail_bosignatures.inc.php'); $boSignatures = new felamimail_bosignatures(); $signatures = $boSignatures->getListOfSignatures(); + if (empty($sessionData['signatureID'])) { if ($signatureData = $boSignatures->getDefaultSignature()) { if (is_array($signatureData)) { @@ -445,6 +431,47 @@ foreach($signatures as $signature) { $selectSignatures[$signature['fm_signatureid']] = lang('Signature').': '.$signature['fm_description']; } + $disableRuler = false; + $signature = $boSignatures->getSignature(($presetSig ? $presetSig : $sessionData['signatureID'])); + if ((isset($this->bocompose->preferencesArray['disableRulerForSignatureSeparation']) && + $this->bocompose->preferencesArray['disableRulerForSignatureSeparation']) || + empty($signature->fm_signature) || trim($this->bocompose->convertHTMLToText($signature->fm_signature)) =='') + { + $disableRuler = true; + } + $insertSigOnTop = false; + if (isset($this->bocompose->preferencesArray['insertSignatureAtTopOfMessage']) && $this->bocompose->preferencesArray['insertSignatureAtTopOfMessage']) + { + $insertSigOnTop = true; + if($sessionData['mimeType'] == 'html') { + $before = ($disableRuler ?' 
    ':' 

    '); + $inbetween = ' 
    '; + } else { + $before = ($disableRuler ?"\r\n\r\n":"\r\n\r\n-- \r\n"); + $inbetween = "\r\n"; + } + $sigText = bofelamimail::merge($signature->fm_signature,array($GLOBALS['egw']->accounts->id2name($GLOBALS['egw_info']['user']['account_id'],'person_id'))); + $sessionData['body'] = $before.($sessionData['mimeType'] == 'html'?$sigText:$this->bocompose->convertHTMLToText($sigText)).$inbetween.$sessionData['body']; + } + + // prepare body + if($sessionData['mimeType'] == 'html') { + $mode = 'simple'; + #if (isset($GLOBALS['egw_info']['server']['enabled_spellcheck'])) $mode = 'egw_simple_spellcheck'; + $style="border:0px; width:100%; height:400px;"; + // dont run purify, as we already did that (getCleanHTML). + $this->t->set_var('tinymce', html::fckEditorQuick('body', $mode, $sessionData['body'],'400px','100%',false)); + $this->t->set_var('mimeType', 'html'); + $ishtml=1; + } else { + $style="border:0px; width:100%; height:400px;"; + // initalize the CKEditor Object to enable switching back and force + $editor = html::fckEditorQuick('body', 'ascii', $sessionData['body'],'400px','99%'); + $this->t->set_var('tinymce', $editor); //html::fckEditorQuick('body', 'ascii', $sessionData['body'],'400px','99%')); + $this->t->set_var('mimeType', 'text'); + $ishtml=0; + } + $bostationery = new felamimail_bostationery(); $selectStationeries = array( @@ -457,7 +484,8 @@ $showStationaries = true; $selectStationeries += $validStationaries; } - $selectBoxSignature = html::select('signatureID', ($presetSig ? $presetSig : $sessionData['signatureID']), $selectSignatures, true, "style='width: 35%;' onchange='fm_compose_changeInputType(this)'"); + // if ID of signature Select Box is set, we allow for changing the sig onChange of the signatueSelect + $selectBoxSignature = html::select('signatureID', ($presetSig ? $presetSig : $sessionData['signatureID']), $selectSignatures, true, ($insertSigOnTop?"id='signatureID'":"")." style='width: 35%;' onchange='fm_compose_changeInputType(this)'"); $selectBoxStationery = html::select('stationeryID', ($presetStationery ? $presetStationery : 0), $selectStationeries, true, "style='width: 35%;'"); $this->t->set_var("select_signature", $selectBoxSignature); $this->t->set_var("select_stationery", ($showStationaries ? $selectBoxStationery:'')); diff --git a/felamimail/js/jscode/composeMessage.js b/felamimail/js/jscode/composeMessage.js index f4edaf18f7..b7b44e4768 100644 --- a/felamimail/js/jscode/composeMessage.js +++ b/felamimail/js/jscode/composeMessage.js @@ -515,6 +515,48 @@ function fm_compose_changeInputType(_selectBox) { } var tdElements = selectBoxRow.getElementsByTagName('td'); + if (_selectBox.name = 'signatureID') { + var sigBox = document.getElementById('signatureID'); + //alert(sigBox); + // if we find the id, signature is inserted at the top of the message on compose start. + if (sigBox == null) + { + //alert ("could not find sigBox"); + } + else + { + var currSig = document.getElementById('mySigID'); + currentSig = currSig.value; + // we try to change the signature + fm_compose_changeSignature(currentSig,_selectBox.value); + } + } +} + +function fm_compose_changeSignature(_oldSig,_signatureID) { + //alert ("found sigBox"); + var htmlFlag = document.getElementsByName('_is_html')[0]; + var currentEditor = htmlFlag.value; + var content = ''; + var currentMode =''; + if (_oldSig != _signatureID) + { + if (currentEditor == 1) + { + currentMode='html'; + var ckeditor = CKEDITOR.instances['body']; + var content = ckeditor.getData(); + } + else + { + currentMode='plain'; + var plaineditor = document.getElementsByName('body')[0]; + content = plaineditor.value; + } + + xajax_doXMLHTTP("felamimail.ajaxfelamimail.changeComposeSignature",composeID,_oldSig,_signatureID,currentMode,content); + document.getElementById('mySigID').value = _signatureID; + } } function fm_compose_setFolderSelectValue(_folderName) { @@ -794,14 +836,36 @@ function removeFCK(fieldId) function changeIdentity(SelectedId) { - //alert(SelectedId.value); + // we do the old style (just changing the id, (to be inserted after compose before sending)) + // but setSignature may try to initiate a switch of the signature within the email body if conditions match xajax_doXMLHTTP("felamimail.ajaxfelamimail.setComposeSignature", SelectedId.value); } function setSignature(SelectedId) { + //alert("IS:"+document.getElementById('mySigID').value); + var sigBox = document.getElementById('mySigID'); + currentSig = sigBox.value; + for (i = 0; i < document.doit.signatureID.length; ++i) if (document.doit.signatureID.options[i].value == SelectedId) + { document.doit.signatureID.options[i].selected = true; + document.getElementById('mySigID').value = SelectedId; + } //else // document.doit.signatureID.options[i].selected = false; + + //alert("Now:"+document.getElementById('mySigID').value); + var sigBox = document.getElementById('signatureID'); + //alert(sigBox); + // if we find the id, signature is inserted at the top of the message on compose start. + // so we try toi switch, ... + if (sigBox == null) + { + } + else + { + // we try to change the signature + if (currentSig != SelectedId) fm_compose_changeSignature(currentSig,SelectedId); + } } diff --git a/felamimail/lang/egw_de.lang b/felamimail/lang/egw_de.lang index f033ccbd11..ec2dfcfcea 100644 --- a/felamimail/lang/egw_de.lang +++ b/felamimail/lang/egw_de.lang @@ -102,6 +102,7 @@ deleted felamimail de gelöscht deleted folder successfully! felamimail de Ordner erfolgreich gelöscht deleting messages felamimail de lösche Nachrichten disable felamimail de Deaktivieren +disable Ruler for separation of mailbody and signature when adding signature to composed message (this is not according to RFC).
    If you use templates, this option is only applied to the text part of the message. felamimail de Deaktiviere den automatisch hinzugefügten Trenner zwischen EMailkörper und Signatur (Achtung: Dies ist nicht RFC konform).
    Wenn Sie Templates zur Formatierung Ihrer EMail benutzen, wird diese Option nur dann Auswirkungen haben, wenn Sie die Signatur am Anfang der EMail eifügen lassen. discard felamimail de verwerfen discard message felamimail de Nachricht verwerfen display message in new window felamimail de Nachricht in neuem Fenster anzeigen @@ -251,6 +252,7 @@ inbox felamimail de Posteingang incoming mail server(imap) felamimail de eingehender Mailserver (IMAP) index order felamimail de Spaltenanordnung info felamimail de Info +insert the signature at top of the new (or reply) message when opening compose dialog (you may not be able to switch signatures) felamimail de Einfügen der Signatur am Anfang einer neuen EMail (auch Antworten/Weiterleiten).
    Die Signatur ist dann Teil der EMail und kann möglicherweise nicht über die Funktionalität >Signatur ändern/auswählen< verändert werden. invalid user name or password felamimail de Falscher Benutzername oder Pasword javascript felamimail de JavaScript jumping to end felamimail de springe zum Ende diff --git a/felamimail/lang/egw_en.lang b/felamimail/lang/egw_en.lang index 5682793b00..abb7c42087 100644 --- a/felamimail/lang/egw_en.lang +++ b/felamimail/lang/egw_en.lang @@ -102,6 +102,7 @@ deleted felamimail en deleted deleted folder successfully! felamimail en Deleted folder successfully! deleting messages felamimail en deleting messages disable felamimail en Disable +disable Ruler for separation of mailbody and signature when adding signature to composed message (this is not according to RFC).
    If you use templates, this option is only applied to the text part of the message. felamimail en disable Ruler for separation of mailbody and signature when adding signature to composed message (this is not according to RFC).
    If you use templates, this option is only applied to the text part of the message. discard felamimail en discard discard message felamimail en discard message display message in new window felamimail en Display message in new window @@ -254,6 +255,7 @@ inbox felamimail en INBOX incoming mail server(imap) felamimail en incoming mail server(IMAP) index order felamimail en Index Order info felamimail en Info +insert the signature at top of the new (or reply) message when opening compose dialog (you may not be able to switch signatures) felamimail en insert the signature at top of the new (or reply) message when opening compose dialog (you may not be able to switch signatures) invalid user name or password felamimail en Invalid user name or password javascript felamimail en JavaScript jumping to end felamimail en jumping to end diff --git a/felamimail/templates/default/composeForm.tpl b/felamimail/templates/default/composeForm.tpl index dd0d9d02af..e8b069eef5 100644 --- a/felamimail/templates/default/composeForm.tpl +++ b/felamimail/templates/default/composeForm.tpl @@ -45,6 +45,7 @@
    + + + + + + + + diff --git a/phpgwapi/inc/class.send.inc.php b/phpgwapi/inc/class.send.inc.php index 4b83c1db19..c17ac2c9fc 100644 --- a/phpgwapi/inc/class.send.inc.php +++ b/phpgwapi/inc/class.send.inc.php @@ -56,11 +56,15 @@ } $this->SetLanguage($lang,$lang_path); $this->IsSmtp(); - - $bopreferences =& CreateObject('felamimail.bopreferences'); + $restoreSession = $getUserDefinedProfiles = true; + // if dontUseUserDefinedProfiles is set to yes/true/1 dont restore the session AND dont retrieve UserdefinedAccount settings + $notification_config = config::read('notifications'); + if ($notification_config['dontUseUserDefinedProfiles']) $restoreSession = $getUserDefinedProfiles = false; + $bopreferences =& CreateObject('felamimail.bopreferences',$restoreSession); if ($bopreferences) { if ($this->debug) error_log(__METHOD__." using felamimail preferences for mailing."); - $preferences = $bopreferences->getPreferences(); + // if dontUseUserDefinedProfiles is set to yes/true/1 dont retrieve UserdefinedAccount settings + $preferences = $bopreferences->getPreferences($getUserDefinedProfiles); if ($preferences) { $ogServer = $preferences->getOutgoingServer(0); if ($ogServer) { From 23faf12229c2d779682d1edbf0d785f7d2252a6d Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Tue, 20 Jul 2010 12:04:54 +0000 Subject: [PATCH 180/496] fix typo ; on change for address InputType (emailaddress or folder) --- felamimail/js/jscode/composeMessage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/felamimail/js/jscode/composeMessage.js b/felamimail/js/jscode/composeMessage.js index b7b44e4768..1ca1bac0cd 100644 --- a/felamimail/js/jscode/composeMessage.js +++ b/felamimail/js/jscode/composeMessage.js @@ -515,7 +515,7 @@ function fm_compose_changeInputType(_selectBox) { } var tdElements = selectBoxRow.getElementsByTagName('td'); - if (_selectBox.name = 'signatureID') { + if (_selectBox.name == 'signatureID') { var sigBox = document.getElementById('signatureID'); //alert(sigBox); // if we find the id, signature is inserted at the top of the message on compose start. From 869e22dbf263ebe49d18bf91a9b6507a5b550381 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Tue, 20 Jul 2010 14:34:53 +0000 Subject: [PATCH 181/496] using call_user_func instead of depricated call_user_method, which seems at least under PHP5.3 not to allow static calls --- etemplate/inc/class.etemplate_request.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/etemplate/inc/class.etemplate_request.inc.php b/etemplate/inc/class.etemplate_request.inc.php index 01e7ab1f46..5f57a38ed0 100644 --- a/etemplate/inc/class.etemplate_request.inc.php +++ b/etemplate/inc/class.etemplate_request.inc.php @@ -108,7 +108,7 @@ class etemplate_request } if (self::$request_class != __CLASS__) { - return call_user_method('read',self::$request_class,$id); + return call_user_func(array(self::$request_class,'read'),$id); } $request = new etemplate_request(); From a613866a374932c1d5b364d11d891c4cb29e949f Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Tue, 20 Jul 2010 16:49:06 +0000 Subject: [PATCH 182/496] replace deprecated call_user_method(_array) with call_user_func(_array) --- doc/fix_depricated.php | 7 +++++++ phpgwapi/inc/class.schema_proc.inc.php | 2 +- phpgwapi/inc/class.soap_server.inc.php | 8 ++++---- phpgwapi/inc/class.xml.inc.php | 4 ++-- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/doc/fix_depricated.php b/doc/fix_depricated.php index a33d9085ca..3be382d768 100755 --- a/doc/fix_depricated.php +++ b/doc/fix_depricated.php @@ -119,6 +119,13 @@ function fix_depricated($file,$replace_file=false) // fix call to not longer existing PDO method $result->fetchSingle() $lines = str_replace('->fetchSingle(','->fetchColumn(',$lines); + + // fix calls to deprecated call_user_method(_array)?(method,object[,args]) + if (preg_match('/call_user_method(_array)?\(/',$lines,$matches)) + { + $lines = preg_replace('/call_user_method\(([^,]+),([^,\)]+)([,)])/','call_user_func(array(\\2,\\1)\\3',$lines); + $lines = preg_replace('/call_user_method_array\(([^,]+),([^,\)]+)([,)])/','call_user_func_array(array(\\2,\\1)\\3',$lines); + } if ($lines != $orig) { diff --git a/phpgwapi/inc/class.schema_proc.inc.php b/phpgwapi/inc/class.schema_proc.inc.php index bb3614cda0..d5ec9ae0fe 100644 --- a/phpgwapi/inc/class.schema_proc.inc.php +++ b/phpgwapi/inc/class.schema_proc.inc.php @@ -858,7 +858,7 @@ class schema_proc $debug_params = func_get_args(); array_shift($debug_params); array_shift($debug_params); - call_user_method_array('debug_message',$this,$debug_params); + call_user_func_array(array($this,'debug_message'),$debug_params); if ($retval < 2 && !$this->dict->debug) { echo '

    '.$this->adodb->ErrorMsg()."

    \n"; diff --git a/phpgwapi/inc/class.soap_server.inc.php b/phpgwapi/inc/class.soap_server.inc.php index 0861ebe3db..196997a2f9 100644 --- a/phpgwapi/inc/class.soap_server.inc.php +++ b/phpgwapi/inc/class.soap_server.inc.php @@ -193,7 +193,7 @@ { if (is_object($obj)) { - $code = "\$method_response = call_user_method($method,$obj,"; + $code = "\$method_response = call_user_func(array($obj,$method),"; $this->debug("about to call object method '$class\-\>$method' with args"); } else @@ -234,7 +234,7 @@ if (is_object($obj)) { $this->debug("about to call object method '$obj\-\>$method'"); - if(!$method_response = call_user_method($method,$obj)) + if(!$method_response = call_user_func(array($obj,$method))) { $this->make_fault("Server","Method call failed for '$obj->method' with no params"); return $this->fault(); @@ -257,7 +257,7 @@ if($request_data) { /* call method with parameters */ - $code = "\$method_response = call_user_method(\$method,\$obj,"; + $code = "\$method_response = call_user_func(array(\$obj,\$method),"; while(list($x,$y) = each($request_data)) { $code .= "\$request_data[$x]" . ','; @@ -272,7 +272,7 @@ if(is_object($obj)) { $this->debug("about to call object method '$obj\-\>$method'"); - call_user_method($method,$obj); + call_user_func(array($obj,$method)); } else { diff --git a/phpgwapi/inc/class.xml.inc.php b/phpgwapi/inc/class.xml.inc.php index e67033b26a..8a62791908 100644 --- a/phpgwapi/inc/class.xml.inc.php +++ b/phpgwapi/inc/class.xml.inc.php @@ -1346,7 +1346,7 @@ class XML } // Perform an axis action. - $contexts = call_user_method($method, &$this, $axis, $context); + $contexts = call_user_func(array( &$this,$method), $axis, $context); // Check whether there are predicates. if ( count($axis["predicate"]) > 0 ) @@ -1411,7 +1411,7 @@ class XML } // Return the result of the function. - return call_user_method($method, &$this, $node, $arguments); + return call_user_func(array( &$this,$method), $node, $arguments); } /** From 11fae97d96b136b720e98693848696c5b5e0850d Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 21 Jul 2010 08:22:33 +0000 Subject: [PATCH 183/496] allow and validate needed (required) attribute for file uploads, checkboxes and radio buttons --- etemplate/inc/class.etemplate.inc.php | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/etemplate/inc/class.etemplate.inc.php b/etemplate/inc/class.etemplate.inc.php index 90693b812e..18291bed0e 100644 --- a/etemplate/inc/class.etemplate.inc.php +++ b/etemplate/inc/class.etemplate.inc.php @@ -1336,6 +1336,7 @@ class etemplate extends boetemplate self::$request->set_to_process($form_name,$cell['type'],array( 'unset_value' => $unset_val, 'multiple' => $multiple, + 'needed' => $cell['needed'], )); } self::$request->set_to_process_attribute($form_name,'values',$set_val,true); @@ -1361,7 +1362,9 @@ class etemplate extends boetemplate else { $html .= html::input($form_name,$set_val,'RADIO',$options); - self::$request->set_to_process($form_name,$cell['type']); + self::$request->set_to_process($form_name,$cell['type'],array( + 'needed' => $cell['needed'], + )); } break; case 'button': @@ -1636,7 +1639,9 @@ class etemplate extends boetemplate self::$form_options = " enctype=\"multipart/form-data\" onsubmit=\"set_element2(this,'$path_name','$form_name')\""; } $html .= html::input($form_name,'','file',$options); - self::$request->set_to_process($form_name,$cell['type']); + self::$request->set_to_process($form_name,$cell['type'],array( + 'needed' => $cell['needed'], + )); } break; case 'vbox': @@ -2243,8 +2248,12 @@ class etemplate extends boetemplate self::set_array($content,$form_name,$value); break; case 'checkbox': - if ($value === false) // get_array() returns false for not set + if (!$value) { + if ($attr['needed']) + { + self::set_validation_error($form_name,lang('Field must not be empty !!!',$value),''); + } self::set_array($content,$form_name,$attr['multiple'] ? array() : $attr['unset_value']); // need to be reported too } else @@ -2296,6 +2305,10 @@ class etemplate extends boetemplate //echo $form_name; _debug_array($value); // fall-throught default: + if ($attr['needed'] && !$value) + { + self::set_validation_error($form_name,lang('Field must not be empty !!!',$value),''); + } self::set_array($content,$form_name,$value); break; } From 0e79cf647567863a9a7f3801d7d1a87fe89cc2d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20St=C3=B6ckel?= Date: Wed, 21 Jul 2010 11:54:04 +0000 Subject: [PATCH 184/496] removed the elementspath plugin --- phpgwapi/inc/class.html.inc.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/phpgwapi/inc/class.html.inc.php b/phpgwapi/inc/class.html.inc.php index a2da2b56fb..54fb007a3f 100644 --- a/phpgwapi/inc/class.html.inc.php +++ b/phpgwapi/inc/class.html.inc.php @@ -628,6 +628,7 @@ class html //Only heights with "px" set are supported $pxheight = (strpos('px', $_height) === false) ? (empty($_height)?400:$_height) : str_replace('px', '', $_height); $oCKeditor->config['height'] = $pxheight; + $oCKeditor->config['removePlugins'] = 'elementspath'; // By default the editor start expanded if ($_options['toolbar_expanded'] == 'false') @@ -645,7 +646,7 @@ class html $oCKeditor->config['extraPlugins'] = 'aspell'; } $oCKeditor->config['scayt_autoStartup']=true; - $oCKeditor->config['scayt_sLang']=$lang.'_'.strtoupper($country); + $oCKeditor->config['scayt_sLang']=$lang.'_'.strtoupper($country); } $oCKeditor->config['disableNativeSpellChecker'] = true; From 40092896a503ca2365b386186183b0b2f560d9f2 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 21 Jul 2010 13:17:37 +0000 Subject: [PATCH 185/496] allow null as value in assign() --- phpgwapi/inc/class.egw_json.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpgwapi/inc/class.egw_json.inc.php b/phpgwapi/inc/class.egw_json.inc.php index 758653240c..d046ed2376 100644 --- a/phpgwapi/inc/class.egw_json.inc.php +++ b/phpgwapi/inc/class.egw_json.inc.php @@ -301,7 +301,7 @@ class egw_json_response */ public function assign($id, $key, $value) { - if (is_string($id) && is_string($key) && (is_string($value) || is_numeric($value))) + if (is_string($id) && is_string($key) && (is_string($value) || is_numeric($value) || is_null($value))) { $this->addGeneric('assign', array( 'id' => $id, From 474735251ed49380ce5e0204e22a49b240913004 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 21 Jul 2010 13:51:13 +0000 Subject: [PATCH 186/496] fixed caching of etemplates: - never read timestamp of last import from cache - check timestamps only once per session and app --- etemplate/inc/class.boetemplate.inc.php | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/etemplate/inc/class.boetemplate.inc.php b/etemplate/inc/class.boetemplate.inc.php index 16fe0e58c9..a2a0e13c52 100644 --- a/etemplate/inc/class.boetemplate.inc.php +++ b/etemplate/inc/class.boetemplate.inc.php @@ -845,7 +845,7 @@ class boetemplate extends soetemplate egw_cache::unsetInstance('etemplate',$this->cache_name()); } - static private $import_tested = array(); + static private $import_tested; /** * Test if new template-import necessary for app and does the import @@ -861,15 +861,20 @@ class boetemplate extends soetemplate if (is_array($app)) $app = $app['name']; list($app) = explode('.',$app); + if (is_null(self::$import_tested)) + { + self::$import_tested =& egw_cache::getSession('etemplate','import_tested'); + if (is_null(self::$import_tested)) self::$import_tested = array(); + } if (!$app || self::$import_tested[$app]) { - return ''; // ensure test is done only once per call and app + return ''; // ensure test is done only once per session and app } self::$import_tested[$app] = True; // need to be done before new ... $path = EGW_SERVER_ROOT."/$app/setup/etemplates.inc.php"; - if ($time = @filemtime($path)) + if (($time = @filemtime($path))) { $templ = new boetemplate(array('name' => '.'.$app,'lang' => '##')); if ($templ->lang != '##' || $templ->modified < $time) // need to import @@ -932,13 +937,18 @@ class boetemplate extends soetemplate // check if new import necessary, currently on every request $msg = self::test_import($name); //if ($msg) echo "

    ".__METHOD__."($name,$template,$lang,$group,$version) self::test_import($name) returning $msg

    \n"; - - $data = egw_cache::getInstance('etemplate',$cname=self::cache_name($name,$template,$lang)); + if (is_array($name)) { $version = $name['version']; + $lang = $name['lang']; + $template = $name['template']; $name = $name['name']; } + // templates starting with . (as the import timestamp) never use the cache + if ($name[0] == '.') return false; + + $data = egw_cache::getInstance('etemplate',$cname=self::cache_name($name,$template,$lang)); //echo "

    ".__METHOD__.'('.array2string($name).",$template,$lang,$group,$version) egw_cache::getInstance('etemplate','$cname')=".array2string(array('name'=>$data['name'],'version'=>$data['version'],'modified'=>$data['modified']))."

    \n"; if (!is_null($data) && (empty($version) || $data['version'] == $version)) From 1a86073296c714c68182ed0d8cbf30cf082aaf62 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 21 Jul 2010 14:21:06 +0000 Subject: [PATCH 187/496] fixed PHP warning: Illegal offset type in phpgwapi/inc/class.accounts_ldap.inc.php on line 1100 and not working update of group mail addresses --- phpgwapi/inc/class.accounts_ldap.inc.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/phpgwapi/inc/class.accounts_ldap.inc.php b/phpgwapi/inc/class.accounts_ldap.inc.php index e07a18be33..271e89b860 100644 --- a/phpgwapi/inc/class.accounts_ldap.inc.php +++ b/phpgwapi/inc/class.accounts_ldap.inc.php @@ -1093,11 +1093,14 @@ class accounts_ldap if ($this->id2name($gid,'account_email') && ($objectclass = $this->id2name($gid,'mailAllowed'))) { $forward = $this->group_mail_classes[$objectclass]; - + if (is_array($forward)) list($forward,$extra_attr) = each($forward); + $to_write[$forward] = array(); + if ($extra_attr) $to_write[$extra_attr] = array(); foreach($members as $key => $member) { if (($email = $this->id2name($member,'account_email'))) $to_write[$forward][] = $email; + if ($extra_attr && ($uid = $this->id2name($member,'account_lid'))) $to_write[$extra_attr] = $uid; } } if (!ldap_modify($this->ds,'cn='.ldap::quote($cn).','.$this->group_context,$to_write)) From 0b5483676605ed56ae07f8952efc526537fdf225 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 21 Jul 2010 14:39:37 +0000 Subject: [PATCH 188/496] fixed wrong extraction of the extra_attr, eg. uid --- phpgwapi/inc/class.accounts_ldap.inc.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/phpgwapi/inc/class.accounts_ldap.inc.php b/phpgwapi/inc/class.accounts_ldap.inc.php index 271e89b860..08fed7c1f0 100644 --- a/phpgwapi/inc/class.accounts_ldap.inc.php +++ b/phpgwapi/inc/class.accounts_ldap.inc.php @@ -272,7 +272,7 @@ class accounts_ldap ($old && in_array($objectclass,$old['objectclass']) || $data_utf8['account_email'] || $old['mail'])) { $extra_attr = false; - if (is_array($forward)) list($forward,$extra_attr) = each($forward); + if (is_array($forward)) list($forward,$extra_attr) = $forward; if ($data_utf8['account_email']) // setting an email { if (!in_array($objectclass,$old ? $old['objectclass'] : $to_write['objectclass'])) @@ -1093,14 +1093,13 @@ class accounts_ldap if ($this->id2name($gid,'account_email') && ($objectclass = $this->id2name($gid,'mailAllowed'))) { $forward = $this->group_mail_classes[$objectclass]; - if (is_array($forward)) list($forward,$extra_attr) = each($forward); + if (is_array($forward)) list($forward,$extra_attr) = $forward; + if ($extra_attr && ($uid = $this->id2name($gid))) $to_write[$extra_attr] = $uid; $to_write[$forward] = array(); - if ($extra_attr) $to_write[$extra_attr] = array(); foreach($members as $key => $member) { if (($email = $this->id2name($member,'account_email'))) $to_write[$forward][] = $email; - if ($extra_attr && ($uid = $this->id2name($member,'account_lid'))) $to_write[$extra_attr] = $uid; } } if (!ldap_modify($this->ds,'cn='.ldap::quote($cn).','.$this->group_context,$to_write)) From 5c716132419b1cfa0eb87dd7c7cb438f04907446 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 22 Jul 2010 13:13:21 +0000 Subject: [PATCH 189/496] fixed not working checkboxes after r31472 --- etemplate/inc/class.etemplate.inc.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/etemplate/inc/class.etemplate.inc.php b/etemplate/inc/class.etemplate.inc.php index 18291bed0e..9a433c7005 100644 --- a/etemplate/inc/class.etemplate.inc.php +++ b/etemplate/inc/class.etemplate.inc.php @@ -2248,12 +2248,12 @@ class etemplate extends boetemplate self::set_array($content,$form_name,$value); break; case 'checkbox': - if (!$value) + if (!$value && $attr['needed']) + { + self::set_validation_error($form_name,lang('Field must not be empty !!!',$value),''); + } + if ($value === false) { - if ($attr['needed']) - { - self::set_validation_error($form_name,lang('Field must not be empty !!!',$value),''); - } self::set_array($content,$form_name,$attr['multiple'] ? array() : $attr['unset_value']); // need to be reported too } else From 5e87b2010b6e31ab45682569c03c9ef2685e877f Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Fri, 23 Jul 2010 12:12:20 +0000 Subject: [PATCH 190/496] allow minus and underscore in validation as part of the LocalPart of the eMailaddress; even directly in front of the @ sign --- etemplate/inc/class.url_widget.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/etemplate/inc/class.url_widget.inc.php b/etemplate/inc/class.url_widget.inc.php index 9154a5b08a..e000f4ddc4 100644 --- a/etemplate/inc/class.url_widget.inc.php +++ b/etemplate/inc/class.url_widget.inc.php @@ -62,7 +62,7 @@ class url_widget * has to be used case insensitive: /i */ //const EMAIL_PREG = '([a-z0-9][a-z0-9._-]*)?[a-z0-9]@([a-z0-9](|[a-z0-9_-]*[a-z0-9])\.)+[a-z]{2,6}'; - const EMAIL_PREG = '([a-z0-9][a-z0-9._-]*)?[a-z0-9]@([a-z0-9ÄÖÜäöüß](|[a-z0-9ÄÖÜäöüß_-]*[a-z0-9ÄÖÜäöüß])\.)+[a-z]{2,6}'; + const EMAIL_PREG = '([a-z0-9][a-z0-9._-]*)?[a-z0-9_-]@([a-z0-9ÄÖÜäöüß](|[a-z0-9ÄÖÜäöüß_-]*[a-z0-9ÄÖÜäöüß])\.)+[a-z]{2,6}'; /** * pre-processing of the extension From 39596007fead394913bd8ee0c78643c9547a693d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Lehrke?= Date: Fri, 23 Jul 2010 18:05:59 +0000 Subject: [PATCH 191/496] Allow moving of existing cantacts between adressbooks --- addressbook/inc/class.addressbook_groupdav.inc.php | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/addressbook/inc/class.addressbook_groupdav.inc.php b/addressbook/inc/class.addressbook_groupdav.inc.php index 67b545af8b..443cc2a203 100644 --- a/addressbook/inc/class.addressbook_groupdav.inc.php +++ b/addressbook/inc/class.addressbook_groupdav.inc.php @@ -342,13 +342,11 @@ class addressbook_groupdav extends groupdav_handler $contact['id'] = $oldContact['id']; // dont allow the client to overwrite certain values $contact['uid'] = $oldContact['uid']; - $contact['owner'] = $oldContact['owner']; + //$contact['owner'] = $oldContact['owner']; $contact['private'] = $oldContact['private']; } - else - { - $contact['owner'] = $user; - } + + $contact['owner'] = $user; if ($this->http_if_match) $contact['etag'] = self::etag2value($this->http_if_match); From 0cd4fed0aed078a8a3f38dd12dd1ad31d555153a Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Sun, 25 Jul 2010 09:09:05 +0000 Subject: [PATCH 192/496] avoiding deprecated warning under php5.3 --- setup/config.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/setup/config.php b/setup/config.php index 76f4500b3b..19417b73b8 100644 --- a/setup/config.php +++ b/setup/config.php @@ -34,8 +34,10 @@ $setup_tpl->set_file(array( )); /* Following to ensure windows file paths are saved correctly */ -set_magic_quotes_runtime(0); - +if (function_exists('get_magic_quotes_runtime') && get_magic_quotes_runtime()) +{ + set_magic_quotes_runtime(0); +} $GLOBALS['egw_setup']->loaddb(); /* Check api version, use correct table */ From 651ea4a23097e22a225b749674ecba2b00ce4c61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Lehrke?= Date: Sun, 25 Jul 2010 18:08:31 +0000 Subject: [PATCH 193/496] Fix syncml:metinf and syncml:devinf namespace issue (#2696) --- phpgwapi/inc/horde/Horde/SyncML/State.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/phpgwapi/inc/horde/Horde/SyncML/State.php b/phpgwapi/inc/horde/Horde/SyncML/State.php index eca8b74a78..735830b9fa 100644 --- a/phpgwapi/inc/horde/Horde/SyncML/State.php +++ b/phpgwapi/inc/horde/Horde/SyncML/State.php @@ -138,12 +138,12 @@ define('RESPONSE_ATOMIC_RESPONSE_TOO_LARGE', 517); define('NAME_SPACE_URI_SYNCML_1_0', 'syncml:syncml1.0'); define('NAME_SPACE_URI_SYNCML_1_1', 'syncml:syncml1.1'); define('NAME_SPACE_URI_SYNCML_1_2', 'syncml:syncml1.2'); -define('NAME_SPACE_URI_METINF_1_0', 'syncml:metinf1.0'); -define('NAME_SPACE_URI_METINF_1_1', 'syncml:metinf1.1'); -define('NAME_SPACE_URI_METINF_1_2', 'syncml:metinf1.2'); -define('NAME_SPACE_URI_DEVINF_1_0', 'syncml:devinf1.0'); -define('NAME_SPACE_URI_DEVINF_1_1', 'syncml:devinf1.1'); -define('NAME_SPACE_URI_DEVINF_1_2', 'syncml:devinf1.2'); +define('NAME_SPACE_URI_METINF_1_0', 'syncml:metinf'); +define('NAME_SPACE_URI_METINF_1_1', 'syncml:metinf'); +define('NAME_SPACE_URI_METINF_1_2', 'syncml:metinf'); +define('NAME_SPACE_URI_DEVINF_1_0', 'syncml:devinf'); +define('NAME_SPACE_URI_DEVINF_1_1', 'syncml:devinf'); +define('NAME_SPACE_URI_DEVINF_1_2', 'syncml:devinf'); define('CLIENT_SYNC_STARTED', 1); define('CLIENT_SYNC_FINNISHED', 2); From 68eb11e4951078f5442a32922c096b8c55dc59ac Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Mon, 26 Jul 2010 08:20:48 +0000 Subject: [PATCH 194/496] - using EGW_*_ROOT instead of .., to allow running from different directories - allow running setup_cmd_admin directly via the command line with regular syntax (was already possible under special syntax) - limiting database names to 16 chars, which is the limit in mysql --- setup/inc/class.setup_cmd.inc.php | 2 +- setup/inc/class.setup_cmd_admin.inc.php | 5 +++++ setup/inc/class.setup_cmd_database.inc.php | 5 +++-- setup/inc/class.setup_detection.inc.php | 2 +- setup/setup-cli.php | 2 +- 5 files changed, 11 insertions(+), 5 deletions(-) diff --git a/setup/inc/class.setup_cmd.inc.php b/setup/inc/class.setup_cmd.inc.php index 24df36983a..dabfe411c0 100644 --- a/setup/inc/class.setup_cmd.inc.php +++ b/setup/inc/class.setup_cmd.inc.php @@ -231,7 +231,7 @@ abstract class setup_cmd extends admin_cmd if (!$versions['phpgwapi']) { - if (!include('../phpgwapi/setup/setup.inc.php')) + if (!include(EGW_INCLUDE_ROOT.'/phpgwapi/setup/setup.inc.php')) { throw new egw_exception_wrong_userinput(lang("eGroupWare sources in '%1' are not complete, file '%2' missing !!!",realpath('..'),'phpgwapi/setup/setup.inc.php'),99); // should not happen ;-) } diff --git a/setup/inc/class.setup_cmd_admin.inc.php b/setup/inc/class.setup_cmd_admin.inc.php index d16826b1b9..99ef65e997 100644 --- a/setup/inc/class.setup_cmd_admin.inc.php +++ b/setup/inc/class.setup_cmd_admin.inc.php @@ -17,6 +17,11 @@ */ class setup_cmd_admin extends setup_cmd { + /** + * Allow to run this command via setup-cli + */ + const SETUP_CLI_CALLABLE = true; + /** * Constructor * diff --git a/setup/inc/class.setup_cmd_database.inc.php b/setup/inc/class.setup_cmd_database.inc.php index 938f94503e..87f031e19e 100644 --- a/setup/inc/class.setup_cmd_database.inc.php +++ b/setup/inc/class.setup_cmd_database.inc.php @@ -5,7 +5,7 @@ * @link http://www.egroupware.org * @author Ralf Becker * @package setup - * @copyright (c) 2007 by Ralf Becker + * @copyright (c) 2007-10 by Ralf Becker * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License * @version $Id$ */ @@ -262,7 +262,8 @@ class setup_cmd_database extends setup_cmd } if (strpos($this->$name,'$domain') !== false) { - $this->set_defaults[$name] = $this->$name = str_replace(array('$domain','.','-'),array($this->domain,'_','_'),$this->$name); + // limit names to 16 chars (16 char is user-name limit in MySQL) + $this->set_defaults[$name] = $this->$name = substr(str_replace(array('$domain','.','-'),array($this->domain,'_','_'),$this->$name),0,16); } } } diff --git a/setup/inc/class.setup_detection.inc.php b/setup/inc/class.setup_detection.inc.php index 87ae54ebf6..dbf9c76072 100755 --- a/setup/inc/class.setup_detection.inc.php +++ b/setup/inc/class.setup_detection.inc.php @@ -247,7 +247,7 @@ class setup_detection */ function check_header() { - if(!file_exists('../header.inc.php')) + if(!file_exists(EGW_SERVER_ROOT.'/header.inc.php')) { $GLOBALS['egw_info']['setup']['header_msg'] = 'Stage One'; return '1'; diff --git a/setup/setup-cli.php b/setup/setup-cli.php index b26d0f21b1..b6edc9d8fb 100755 --- a/setup/setup-cli.php +++ b/setup/setup-cli.php @@ -110,7 +110,7 @@ switch($action) default: // we allow to call admin_cmd classes directly, if they define the constant SETUP_CLI_CALLABLE if (substr($action,0,2) == '--' && class_exists($class = str_replace('-','_',substr($action,2))) && - is_subclass_of($class,'admin_cmd') && constant($class.'::SETUP_CLI_CALLABLE')) + is_subclass_of($class,'admin_cmd') && @constant($class.'::SETUP_CLI_CALLABLE')) { $args = array(); $args['domain'] = array_shift($arguments); // domain must be first argument, to ensure right domain get's selected in header-include From d510c4fc2bdd1b74c056aef420453e8284248c21 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Tue, 27 Jul 2010 09:16:07 +0000 Subject: [PATCH 195/496] removing xajax and enabling egw_json xajax legacy support --- phpgwapi/inc/class.egw_framework.inc.php | 22 +- phpgwapi/inc/class.egw_json.inc.php | 4 +- phpgwapi/inc/xajax/copyright.inc.php | 54 - phpgwapi/inc/xajax/xajax_core/legacy.inc.php | 73 - .../support/xajaxCallableObject.inc.php | 228 -- .../plugin_layer/support/xajaxEvent.inc.php | 162 - .../support/xajaxUserFunction.inc.php | 233 -- .../xajaxCallableObjectPlugin.inc.php | 219 - .../xajaxDefaultIncludePlugin.inc.php | 352 -- .../plugin_layer/xajaxEventPlugin.inc.php | 229 -- .../plugin_layer/xajaxFunctionPlugin.inc.php | 231 -- .../plugin_layer/xajaxScriptPlugin.inc.php | 266 -- phpgwapi/inc/xajax/xajax_core/xajax.inc.php | 1423 ------- .../xajax_core/xajaxArgumentManager.inc.php | 466 --- .../inc/xajax/xajax_core/xajaxCall.inc.php | 389 -- .../xajax/xajax_core/xajaxCompress.inc.php | 148 - .../inc/xajax/xajax_core/xajaxControl.inc.php | 682 ---- .../xajax_core/xajaxLanguageManager.inc.php | 188 - .../inc/xajax/xajax_core/xajaxPlugin.inc.php | 191 - .../xajax_core/xajaxPluginManager.inc.php | 344 -- .../inc/xajax/xajax_core/xajaxRequest.inc.php | 359 -- .../xajax/xajax_core/xajaxResponse.inc.php | 1935 --------- .../xajax_core/xajaxResponseManager.inc.php | 231 -- .../xajax/xajax_core/xajax_lang_de.inc.php | 88 - .../xajax/xajax_core/xajax_lang_nl.inc.php | 79 - phpgwapi/inc/xajax/xajax_js/xajax_core.js | 411 -- .../xajax/xajax_js/xajax_core_uncompressed.js | 3553 ----------------- phpgwapi/inc/xajax/xajax_js/xajax_debug.js | 117 - .../xajax_js/xajax_debug_uncompressed.js | 883 ---- phpgwapi/inc/xajax/xajax_js/xajax_lang_bg.js | 10 - .../xajax_js/xajax_lang_bg_uncompressed.js | 81 - phpgwapi/inc/xajax/xajax_js/xajax_lang_de.js | 9 - .../xajax_js/xajax_lang_de_uncompressed.js | 84 - phpgwapi/inc/xajax/xajax_js/xajax_lang_es.js | 10 - .../xajax_js/xajax_lang_es_uncompressed.js | 81 - phpgwapi/inc/xajax/xajax_js/xajax_lang_fr.js | 8 - .../xajax_js/xajax_lang_fr_uncompressed.js | 65 - phpgwapi/inc/xajax/xajax_js/xajax_lang_nl.js | 9 - .../xajax_js/xajax_lang_nl_uncompressed.js | 84 - phpgwapi/inc/xajax/xajax_js/xajax_lang_tr.js | 10 - .../xajax_js/xajax_lang_tr_uncompressed.js | 82 - phpgwapi/inc/xajax/xajax_js/xajax_legacy.js | 14 - .../xajax_js/xajax_legacy_uncompressed.js | 69 - phpgwapi/inc/xajax/xajax_js/xajax_verbose.js | 18 - .../xajax_js/xajax_verbose_uncompressed.js | 176 - phpgwapi/js/egw_json.js | 4 +- xajax.php | 158 - 47 files changed, 8 insertions(+), 14524 deletions(-) delete mode 100644 phpgwapi/inc/xajax/copyright.inc.php delete mode 100644 phpgwapi/inc/xajax/xajax_core/legacy.inc.php delete mode 100644 phpgwapi/inc/xajax/xajax_core/plugin_layer/support/xajaxCallableObject.inc.php delete mode 100644 phpgwapi/inc/xajax/xajax_core/plugin_layer/support/xajaxEvent.inc.php delete mode 100644 phpgwapi/inc/xajax/xajax_core/plugin_layer/support/xajaxUserFunction.inc.php delete mode 100644 phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxCallableObjectPlugin.inc.php delete mode 100644 phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxDefaultIncludePlugin.inc.php delete mode 100644 phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxEventPlugin.inc.php delete mode 100644 phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxFunctionPlugin.inc.php delete mode 100644 phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxScriptPlugin.inc.php delete mode 100644 phpgwapi/inc/xajax/xajax_core/xajax.inc.php delete mode 100644 phpgwapi/inc/xajax/xajax_core/xajaxArgumentManager.inc.php delete mode 100644 phpgwapi/inc/xajax/xajax_core/xajaxCall.inc.php delete mode 100644 phpgwapi/inc/xajax/xajax_core/xajaxCompress.inc.php delete mode 100644 phpgwapi/inc/xajax/xajax_core/xajaxControl.inc.php delete mode 100644 phpgwapi/inc/xajax/xajax_core/xajaxLanguageManager.inc.php delete mode 100644 phpgwapi/inc/xajax/xajax_core/xajaxPlugin.inc.php delete mode 100644 phpgwapi/inc/xajax/xajax_core/xajaxPluginManager.inc.php delete mode 100644 phpgwapi/inc/xajax/xajax_core/xajaxRequest.inc.php delete mode 100644 phpgwapi/inc/xajax/xajax_core/xajaxResponse.inc.php delete mode 100644 phpgwapi/inc/xajax/xajax_core/xajaxResponseManager.inc.php delete mode 100644 phpgwapi/inc/xajax/xajax_core/xajax_lang_de.inc.php delete mode 100644 phpgwapi/inc/xajax/xajax_core/xajax_lang_nl.inc.php delete mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_core.js delete mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_core_uncompressed.js delete mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_debug.js delete mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_debug_uncompressed.js delete mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_lang_bg.js delete mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_lang_bg_uncompressed.js delete mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_lang_de.js delete mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_lang_de_uncompressed.js delete mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_lang_es.js delete mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_lang_es_uncompressed.js delete mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_lang_fr.js delete mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_lang_fr_uncompressed.js delete mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_lang_nl.js delete mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_lang_nl_uncompressed.js delete mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_lang_tr.js delete mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_lang_tr_uncompressed.js delete mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_legacy.js delete mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_legacy_uncompressed.js delete mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_verbose.js delete mode 100644 phpgwapi/inc/xajax/xajax_js/xajax_verbose_uncompressed.js delete mode 100644 xajax.php diff --git a/phpgwapi/inc/class.egw_framework.inc.php b/phpgwapi/inc/class.egw_framework.inc.php index a02403806f..afebf9c76a 100644 --- a/phpgwapi/inc/class.egw_framework.inc.php +++ b/phpgwapi/inc/class.egw_framework.inc.php @@ -738,25 +738,11 @@ abstract class egw_framework { $java_script .= "\n"; } - if ($GLOBALS['egw']->acl->check('run',1,'notifications') && !$GLOBALS['egw_info']['user']['preferences']['notifications']['disable_ajaxpopup']) - { - $GLOBALS['egw_info']['flags']['include_xajax'] = true; - } - - if ($GLOBALS['egw_info']['flags']['include_xajax']) - { - require_once(EGW_API_INC.'/xajax/xajax_core/xajax.inc.php'); - - $xajax = new xajax(); - $xajax->configure('requestURI', egw::link('/xajax.php')); - $xajax->configure('javascript URI',$GLOBALS['egw_info']['server']['webserver_url'] . '/phpgwapi/inc/xajax'); - $xajax->configure('waitCursor',false); - $xajax->register(XAJAX_FUNCTION,'doXMLHTTP'); - $xajax->register(XAJAX_FUNCTION,'doXMLHTTP',array('mode' => "'synchronous'",'alias' => 'doXMLHTTPsync')); - - $java_script .= $xajax->getJavascript(); - } + // set webserver_url for json + $java_script .= "\n"; + /* this flag is for all javascript code that has to be put before other jscode. Think of conf vars etc... (pim@lingewoud.nl) */ if (isset($GLOBALS['egw_info']['flags']['java_script_thirst'])) diff --git a/phpgwapi/inc/class.egw_json.inc.php b/phpgwapi/inc/class.egw_json.inc.php index d046ed2376..978a9bed12 100644 --- a/phpgwapi/inc/class.egw_json.inc.php +++ b/phpgwapi/inc/class.egw_json.inc.php @@ -400,7 +400,7 @@ class egw_json_response /** * Deprecated legacy xajax wrapper functions for the new egw_json interface */ -/*class xajaxResponse extends egw_json_response +class xajaxResponse extends egw_json_response { public function addScript($script) { @@ -444,4 +444,4 @@ class egw_json_response { return ''; } -}*/ +} diff --git a/phpgwapi/inc/xajax/copyright.inc.php b/phpgwapi/inc/xajax/copyright.inc.php deleted file mode 100644 index 238b294fcc..0000000000 --- a/phpgwapi/inc/xajax/copyright.inc.php +++ /dev/null @@ -1,54 +0,0 @@ -setOutputEntities(true); } - function outputEntitiesOff() { $this->setOutputEntities(false); } - function addConfirmCommands() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'confirmCommands'), $temp); } - function addAssign() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'assign'), $temp); } - function addAppend() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'append'), $temp); } - function addPrepend() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'prepend'), $temp); } - function addReplace() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'replace'), $temp); } - function addClear() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'clear'), $temp); } - function addAlert() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'alert'), $temp); } - function addRedirect() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'redirect'), $temp); } - function addScript() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'script'), $temp); } - function addScriptCall() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'call'), $temp); } - function addRemove() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'remove'), $temp); } - function addCreate() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'create'), $temp); } - function addInsert() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'insert'), $temp); } - function addInsertAfter() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'insertAfter'), $temp); } - function addCreateInput() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'createInput'), $temp); } - function addInsertInput() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'insertInput'), $temp); } - function addInsertInputAfter() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'insertInputAfter'), $temp); } - function addRemoveHandler() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'removeHandler'), $temp); } - function addIncludeScript() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'includeScript'), $temp); } - function addIncludeCSS() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'includeCSS'), $temp); } - function &getXML() { return $this; } -} - -class legacyXajax extends xajax { - function legacyXajax($sRequestURI='', $sWrapperPrefix='xajax_', $sEncoding=XAJAX_DEFAULT_CHAR_ENCODING, $bDebug=false) - { - parent::xajax(); - $this->configure('requestURI', $sRequestURI); - $this->configure('wrapperPrefix', $sWrapperPrefix); - $this->configure('characterEncoding', $sEncoding); - $this->configure('debug', $bDebug); - } - function registerExternalFunction($mFunction, $sInclude) - { - $xuf = new xajaxUserFunction($mFunction, $sInclude); - $this->register(XAJAX_FUNCTION, $xuf); - } - function registerCatchAllFunction($mFunction) - { - if (is_array($mFunction)) array_shift($mFunction); - $this->register(XAJAX_PROCESSING_EVENT, XAJAX_PROCESSING_EVENT_INVALID, $mFunction); - } - function registerPreFunction($mFunction) - { - if (is_array($mFunction)) array_shift($mFunction); - $this->register(XAJAX_PROCESSING_EVENT, XAJAX_PROCESSING_EVENT_BEFORE, $mFunction); - } - function canProcessRequests() { return $this->canProcessRequest(); } - function processRequests() { return $this->processRequest(); } - function setCallableObject(&$oObject) { return $this->register(XAJAX_CALLABLE_OBJECT, $oObject); } - function debugOn() { return $this->configure('debug',true); } - function debugOff() { return $this->configure('debug',false); } - function statusMessagesOn() { return $this->configure('statusMessages',true); } - function statusMessagesOff() { return $this->configure('statusMessages',false); } - function waitCursorOn() { return $this->configure('waitCursor',true); } - function waitCursorOff() { return $this->configure('waitCursor',false); } - function exitAllowedOn() { return $this->configure('exitAllowed',true); } - function exitAllowedOff() { return $this->configure('exitAllowed',false); } - function errorHandlerOn() { return $this->configure('errorHandler',true); } - function errorHandlerOff() { return $this->configure('errorHandler',false); } - function cleanBufferOn() { return $this->configure('cleanBuffer',true); } - function cleanBufferOff() { return $this->configure('cleanBuffer',false); } - function decodeUTF8InputOn() { return $this->configure('decodeUTF8Input',true); } - function decodeUTF8InputOff() { return $this->configure('decodeUTF8Input',false); } - function outputEntitiesOn() { return $this->configure('outputEntities',true); } - function outputEntitiesOff() { return $this->configure('outputEntities',false); } - function allowBlankResponseOn() { return $this->configure('allowBlankResponse',true); } - function allowBlankResponseOff() { return $this->configure('allowBlankResponse',false); } -} diff --git a/phpgwapi/inc/xajax/xajax_core/plugin_layer/support/xajaxCallableObject.inc.php b/phpgwapi/inc/xajax/xajax_core/plugin_layer/support/xajaxCallableObject.inc.php deleted file mode 100644 index 642e21c34a..0000000000 --- a/phpgwapi/inc/xajax/xajax_core/plugin_layer/support/xajaxCallableObject.inc.php +++ /dev/null @@ -1,228 +0,0 @@ - for a detailed description, copyright - and license information. -*/ - -/* - @package xajax - @version $Id: xajaxCallableObject.inc.php 362 2007-05-29 15:32:24Z calltoconstruct $ - @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson - @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson - @license http://www.xajaxproject.org/bsd_license.txt BSD License -*/ - -/* - Class: xajaxCallableObject - - A class that stores a reference to an object whose methods can be called from - the client via a xajax request. will call - generateClientScript> so that stub functions can be - generated and sent to the browser. -*/ -class xajaxCallableObject -{ - /* - Object: obj - - A reference to the callable object. - */ - var $obj; - - /* - Array: aConfiguration - - An associative array that will contain configuration options for zero - or more of the objects methods. These configuration options will - define the call options for each request. The call options will be - passed to the client browser when the function stubs are generated. - */ - var $aConfiguration; - - /* - Function: xajaxCallableObject - - Constructs and initializes the - - obj - (object): The object to reference. - */ - function xajaxCallableObject(&$obj) - { - $this->obj =& $obj; - $this->aConfiguration = array(); - } - - /* - Function: getName - - Returns the name of this callable object. This is typically the - class name of the object. - */ - function getName() - { - return get_class($this->obj); - } - - /* - Function: configure - - Used to set configuration options / call options for each method. - - sMethod - (string): The name of the method. - sName - (string): The name of the configuration option. - sValue - (string): The value to be set. - */ - function configure($sMethod, $sName, $sValue) - { - $sMethod = strtolower($sMethod); - - if (false == isset($this->aConfiguration[$sMethod])) - $this->aConfiguration[$sMethod] = array(); - - $this->aConfiguration[$sMethod][$sName] = $sValue; - } - - /* - Function: generateRequests - - Produces an array of objects, one for each method - exposed by this callable object. - - sXajaxPrefix - (string): The prefix to be prepended to the - javascript function names; this will correspond to the name - used for the function stubs that are generated by the - generateClientScript> call. - */ - function generateRequests($sXajaxPrefix) - { - $aRequests = array(); - - $sClass = get_class($this->obj); - - foreach (get_class_methods($this->obj) as $sMethodName) - { - $bInclude = true; - // exclude magic __call method - if ("__call" == $sMethodName) - $bInclude = false; - // exclude constructor - if ($sClass == $sMethodName) - $bInclude = false; - if ($bInclude) - $aRequests[strtolower($sMethodName)] = - new xajaxRequest("{$sXajaxPrefix}{$sClass}.{$sMethodName}"); - } - - return $aRequests; - } - - /* - Function: generateClientScript - - Called by generateClientScript> while is - generating the javascript to be sent to the browser. - - sXajaxPrefix - (string): The prefix to be prepended to the - javascript function names. - */ - function generateClientScript($sXajaxPrefix) - { - $sClass = get_class($this->obj); - - echo "{$sXajaxPrefix}{$sClass} = {};\n"; - - foreach (get_class_methods($this->obj) as $sMethodName) - { - $bInclude = true; - // exclude magic __call, __construct, __destruct methods - if (2 < strlen($sMethodName)) - if ("__" == substr($sMethodName, 0, 2)) - $bInclude = false; - // exclude constructor - if ($sClass == $sMethodName) - $bInclude = false; - if ($bInclude) - { - echo "{$sXajaxPrefix}{$sClass}.{$sMethodName} = function() { "; - echo "return xajax.request( "; - echo "{ xjxcls: '{$sClass}', xjxmthd: '{$sMethodName}' }, "; - echo "{ parameters: arguments"; - - $sSeparator = ", "; - if (isset($this->aConfiguration['*'])) - foreach ($this->aConfiguration['*'] as $sKey => $sValue) - echo "{$sSeparator}{$sKey}: {$sValue}"; - if (isset($this->aConfiguration[strtolower($sMethodName)])) - foreach ($this->aConfiguration[strtolower($sMethodName)] as $sKey => $sValue) - echo "{$sSeparator}{$sKey}: {$sValue}"; - - echo " } ); "; - echo "};\n"; - } - } - } - - /* - Function: isClass - - Determins if the specified class name matches the class name of the - object referenced by obj>. - - sClass - (string): The name of the class to check. - - Returns: - - boolean - True of the specified class name matches the class of - the object being referenced; false otherwise. - */ - function isClass($sClass) - { - if(get_class($this->obj) === $sClass) - return true; - return false; - } - - /* - Function: hasMethod - - Determines if the specified method name is one of the methods of the - object referenced by obj>. - - sMethod - (object): The name of the method to check. - - Returns: - - boolean - True of the referenced object contains the specified method, - false otherwise. - */ - function hasMethod($sMethod) - { - return method_exists($this->obj, $sMethod) || method_exists($this->obj, "__call"); - } - - /* - Function: call - - Call the specified method of the object being referenced using the specified - array of arguments. - - sMethod - (string): The name of the method to call. - aArgs - (array): The arguments to pass to the method. - */ - function call($sMethod, $aArgs) - { - $objResponseManager =& xajaxResponseManager::getInstance(); - $objResponseManager->append( - call_user_func_array( - array(&$this->obj, $sMethod), - $aArgs - ) - ); - } -} diff --git a/phpgwapi/inc/xajax/xajax_core/plugin_layer/support/xajaxEvent.inc.php b/phpgwapi/inc/xajax/xajax_core/plugin_layer/support/xajaxEvent.inc.php deleted file mode 100644 index cfe1ee06c7..0000000000 --- a/phpgwapi/inc/xajax/xajax_core/plugin_layer/support/xajaxEvent.inc.php +++ /dev/null @@ -1,162 +0,0 @@ - for a detailed description, copyright - and license information. -*/ - -/* - @package xajax - @version $Id: xajaxEvent.inc.php 362 2007-05-29 15:32:24Z calltoconstruct $ - @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson - @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson - @license http://www.xajaxproject.org/bsd_license.txt BSD License -*/ - -// require_once is necessary here as the function plugin also includes this -//SkipAIO -require_once dirname(__FILE__) . '/xajaxUserFunction.inc.php'; -//EndSkipAIO - -/* - Class: xajaxEvent - - A container class which holds a reference to handler functions and configuration - options associated with a registered event. -*/ -class xajaxEvent -{ - /* - String: sName - - The name of the event. - */ - var $sName; - - /* - Array: aConfiguration - - Configuration / call options to be used when initiating a xajax request - to trigger this event. - */ - var $aConfiguration; - - /* - Array: aHandlers - - A list of objects associated with this registered - event. Each of these functions will be called when the event is triggered. - */ - var $aHandlers; - - /* - Function: xajaxEvent - - Construct and initialize this object. - */ - function xajaxEvent($sName) - { - $this->sName = $sName; - $this->aConfiguration = array(); - $this->aHandlers = array(); - } - - /* - Function: getName - - Returns the name of the event. - - Returns: - - string - the name of the event. - */ - function getName() - { - return $this->sName; - } - - /* - Function: configure - - Sets/stores configuration options that will be used when generating - the client script that is sent to the browser. - */ - function configure($sName, $mValue) - { - $this->aConfiguration[$sName] = $mValue; - } - - /* - Function: addHandler - - Adds a object to the list of handlers that will - be fired when the event is triggered. - */ - function addHandler(&$xuf) - { - $this->aHandlers[] =& $xuf; - } - - /* - Function: generateRequest - - Generates a object that corresponds to the - event so that the client script can easily invoke this event. - - sXajaxPrefix - (string): The prefix that will be prepended to - the client script stub function associated with this event. - - sEventPrefix - (string): The prefix prepended to the client script - function stub and script. - */ - function generateRequest($sXajaxPrefix, $sEventPrefix) - { - $sEvent = $this->sName; - return new xajaxRequest("{$sXajaxPrefix}{$sEventPrefix}{$sEvent}"); - } - - /* - Function: generateClientScript - - Generates a block of javascript code that declares a stub function - that can be used to easily trigger the event from the browser. - */ - function generateClientScript($sXajaxPrefix, $sEventPrefix) - { - $sMode = ''; - $sMethod = ''; - - if (isset($this->aConfiguration['mode'])) - $sMode = $this->aConfiguration['mode']; - - if (isset($this->aConfiguration['method'])) - $sMethod = $this->aConfiguration['method']; - - if (0 < strlen($sMode)) - $sMode = ", mode: '{$sMode}'"; - - if (0 < strlen($sMethod)) - $sMethod = ", method: '{$sMethod}'"; - - $sEvent = $this->sName; - echo "{$sXajaxPrefix}{$sEventPrefix}{$sEvent} = function() { return xajax.request( { xjxevt: '{$sEvent}' }, { parameters: arguments{$sMode}{$sMethod} } ); };\n"; - } - - /* - Function: fire - - Called by the when the event has been triggered. - */ - function fire($aArgs) - { - $objResponseManager =& xajaxResponseManager::getInstance(); - - foreach (array_keys($this->aHandlers) as $sKey) - $this->aHandlers[$sKey]->call($aArgs); - } -} diff --git a/phpgwapi/inc/xajax/xajax_core/plugin_layer/support/xajaxUserFunction.inc.php b/phpgwapi/inc/xajax/xajax_core/plugin_layer/support/xajaxUserFunction.inc.php deleted file mode 100644 index 72d073e719..0000000000 --- a/phpgwapi/inc/xajax/xajax_core/plugin_layer/support/xajaxUserFunction.inc.php +++ /dev/null @@ -1,233 +0,0 @@ - for a detailed description, copyright - and license information. -*/ - -/* - @package xajax - @version $Id: xajaxUserFunction.inc.php 362 2007-05-29 15:32:24Z calltoconstruct $ - @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson - @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson - @license http://www.xajaxproject.org/bsd_license.txt BSD License -*/ - -/* - Class: xajaxUserFunction - - Construct instances of this class to define functions that will be registered - with the request processor. This class defines the parameters that - are needed for the definition of a xajax enabled function. While you can - still specify functions by name during registration, it is advised that you - convert to using this class when you wish to register external functions or - to specify call options as well. -*/ -class xajaxUserFunction -{ - /* - String: sAlias - - An alias to use for this function. This is useful when you want - to call the same xajax enabled function with a different set of - call options from what was already registered. - */ - var $sAlias; - - /* - Object: uf - - A string or array which defines the function to be registered. - */ - var $uf; - - /* - String: sInclude - - The path and file name of the include file that contains the function. - */ - var $sInclude; - - /* - Array: aConfiguration - - An associative array containing call options that will be sent to the - browser curing client script generation. - */ - var $aConfiguration; - - /* - Function: xajaxUserFunction - - Constructs and initializes the object. - - $uf - (mixed): A function specification in one of the following formats: - - - a three element array: - (string) Alternate function name: when a method of a class has the same - name as another function in the system, you can provide an alias to - help avoid collisions. - (object or class name) Class: the name of the class or an instance of - the object which contains the function to be called. - (string) Method: the name of the method that will be called. - - a two element array: - (object or class name) Class: the name of the class or an instance of - the object which contains the function to be called. - (string) Method: the name of the method that will be called. - - a string: - the name of the function that is available at global scope (not in a - class. - $sInclude - (string, optional): The path and file name of the include file - that contains the class or function to be called. - - $aConfiguration - (array, optional): An associative array of call options - that will be used when sending the request from the client. - - Examples: - - $myFunction = array('alias', 'myClass', 'myMethod'); - $myFunction = array('alias', &$myObject, 'myMethod'); - $myFunction = array('myClass', 'myMethod'); - $myFunction = array(&$myObject, 'myMethod'); - $myFunction = 'myFunction'; - - $myUserFunction = new xajaxUserFunction($myFunction, 'myFile.inc.php', array( - 'method' => 'get', - 'mode' => 'synchronous' - )); - - $xajax->register(XAJAX_FUNCTION, $myUserFunction); - */ - function xajaxUserFunction($uf, $sInclude=NULL, $aConfiguration=array()) - { - $this->sAlias = ''; - $this->uf =& $uf; - $this->sInclude = $sInclude; - $this->aConfiguration = array(); - foreach ($aConfiguration as $sKey => $sValue) - $this->configure($sKey, $sValue); - - if (is_array($this->uf) && 2 < count($this->uf)) - { - $this->sAlias = $this->uf[0]; - $this->uf = array_slice($this->uf, 1); - } - -//SkipDebug - if (is_array($this->uf) && 2 != count($this->uf)) - trigger_error( - 'Invalid function declaration for xajaxUserFunction.', - E_USER_ERROR - ); -//EndSkipDebug - } - - /* - Function: getName - - Get the name of the function being referenced. - - Returns: - - string - the name of the function contained within this object. - */ - function getName() - { - // Do not use sAlias here! - if (is_array($this->uf)) - return $this->uf[1]; - return $this->uf; - } - - /* - Function: configure - - Call this to set call options for this instance. - */ - function configure($sName, $sValue) - { - if ('alias' == $sName) - $this->sAlias = $sValue; - else - $this->aConfiguration[$sName] = $sValue; - } - - /* - Function: generateRequest - - Constructs and returns a object which is capable - of generating the javascript call to invoke this xajax enabled - function. - */ - function generateRequest($sXajaxPrefix) - { - $sAlias = $this->getName(); - if (0 < strlen($this->sAlias)) - $sAlias = $this->sAlias; - return new xajaxRequest("{$sXajaxPrefix}{$sAlias}"); - } - - /* - Function: generateClientScript - - Called by the that is referencing this function - reference during the client script generation phase. This function - will generate the javascript function stub that is sent to the - browser on initial page load. - */ - function generateClientScript($sXajaxPrefix) - { - $sFunction = $this->getName(); - $sAlias = $sFunction; - if (0 < strlen($this->sAlias)) - $sAlias = $this->sAlias; - echo "{$sXajaxPrefix}{$sAlias} = function() { "; - echo "return xajax.request( "; - echo "{ xjxfun: '{$sFunction}' }, "; - echo "{ parameters: arguments"; - - $sSeparator = ", "; - foreach ($this->aConfiguration as $sKey => $sValue) - echo "{$sSeparator}{$sKey}: {$sValue}"; - - echo " } ); "; - echo "};\n"; - } - - /* - Function: call - - Called by the that references this function during the - request processing phase. This function will call the specified - function, including an external file if needed and passing along - the specified arguments. - */ - function call($aArgs=array()) - { - $objResponseManager =& xajaxResponseManager::getInstance(); - - if (NULL != $this->sInclude) - { - ob_start(); - require_once $this->sInclude; - $sOutput = ob_get_clean(); - -//SkipDebug - if (0 < strlen($sOutput)) - { - $sOutput = 'From include file: ' . $this->sInclude . ' => ' . $sOutput; - $objResponseManager->debug($sOutput); - } -//EndSkipDebug - } - - $mFunction = $this->uf; - $objResponseManager->append(call_user_func_array($mFunction, $aArgs)); - } -} -?> diff --git a/phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxCallableObjectPlugin.inc.php b/phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxCallableObjectPlugin.inc.php deleted file mode 100644 index 1f636b86c4..0000000000 --- a/phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxCallableObjectPlugin.inc.php +++ /dev/null @@ -1,219 +0,0 @@ - for a detailed description, copyright - and license information. -*/ - -/* - @package xajax - @version $Id: xajaxCallableObjectPlugin.inc.php 362 2007-05-29 15:32:24Z calltoconstruct $ - @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson - @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson - @license http://www.xajaxproject.org/bsd_license.txt BSD License -*/ - -/* - Constant: XAJAX_CALLABLE_OBJECT - Specifies that the item being registered via the register> function is a - object who's methods will be callable from the browser. -*/ -if (!defined ('XAJAX_CALLABLE_OBJECT')) define ('XAJAX_CALLABLE_OBJECT', 'callable object'); - -//SkipAIO -require dirname(__FILE__) . '/support/xajaxCallableObject.inc.php'; -//EndSkipAIO - -/* - Class: xajaxCallableObjectPlugin -*/ -class xajaxCallableObjectPlugin extends xajaxRequestPlugin -{ - /* - Array: aCallableObjects - */ - var $aCallableObjects; - - /* - String: sXajaxPrefix - */ - var $sXajaxPrefix; - - /* - String: sDefer - */ - var $sDefer; - - var $bDeferScriptGeneration; - - /* - String: sRequestedClass - */ - var $sRequestedClass; - - /* - String: sRequestedMethod - */ - var $sRequestedMethod; - - /* - Function: xajaxCallableObjectPlugin - */ - function xajaxCallableObjectPlugin() - { - $this->aCallableObjects = array(); - - $this->sXajaxPrefix = 'xajax_'; - $this->sDefer = ''; - $this->bDeferScriptGeneration = false; - - $this->sRequestedClass = NULL; - $this->sRequestedMethod = NULL; - - if (!empty($_GET['xjxcls'])) $this->sRequestedClass = $_GET['xjxcls']; - if (!empty($_GET['xjxmthd'])) $this->sRequestedMethod = $_GET['xjxmthd']; - if (!empty($_POST['xjxcls'])) $this->sRequestedClass = $_POST['xjxcls']; - if (!empty($_POST['xjxmthd'])) $this->sRequestedMethod = $_POST['xjxmthd']; - } - - /* - Function: configure - */ - function configure($sName, $mValue) - { - if ('wrapperPrefix' == $sName) { - $this->sXajaxPrefix = $mValue; - } else if ('scriptDefferal' == $sName) { - if (true === $mValue) $this->sDefer = 'defer '; - else $this->sDefer = ''; - } else if ('deferScriptGeneration' == $sName) { - if (true === $mValue || false === $mValue) - $this->bDeferScriptGeneration = $mValue; - else if ('deferred' === $mValue) - $this->bDeferScriptGeneration = $mValue; - } - } - - /* - Function: register - */ - function register($aArgs) - { - if (1 < count($aArgs)) - { - $sType = $aArgs[0]; - - if (XAJAX_CALLABLE_OBJECT == $sType) - { - $xco =& $aArgs[1]; - -//SkipDebug - if (false === is_object($xco)) - { - trigger_error("To register a callable object, please provide an instance of the desired class.", E_USER_WARNING); - return false; - } -//EndSkipDebug - - if (false === is_a($xco, 'xajaxCallableObject')) - $xco = new xajaxCallableObject($xco); - - if (2 < count($aArgs)) - if (is_array($aArgs[2])) - foreach ($aArgs[2] as $sKey => $aValue) - foreach ($aValue as $sName => $sValue) - $xco->configure($sKey, $sName, $sValue); - - $this->aCallableObjects[] =& $xco; - - return $xco->generateRequests($this->sXajaxPrefix); - } - } - - return false; - } - - /* - Function: generateClientScript - */ - function generateClientScript() - { - if (false === $this->bDeferScriptGeneration || 'deferred' === $this->bDeferScriptGeneration) - { - if (0 < count($this->aCallableObjects)) - { - $sCrLf = "\n"; - - echo $sCrLf; - echo '<'; - echo 'script type="text/javascript" '; - echo $this->sDefer; - echo 'charset="UTF-8">'; - echo $sCrLf; - echo '/* <'; - echo '![CDATA[ */'; - echo $sCrLf; - - foreach(array_keys($this->aCallableObjects) as $sKey) - $this->aCallableObjects[$sKey]->generateClientScript($this->sXajaxPrefix); - - echo '/* ]]> */'; - echo $sCrLf; - echo '<'; - echo '/script>'; - echo $sCrLf; - } - } - } - - /* - Function: canProcessRequest - */ - function canProcessRequest() - { - if (NULL == $this->sRequestedClass) - return false; - if (NULL == $this->sRequestedMethod) - return false; - - return true; - } - - /* - Function: processRequest - */ - function processRequest() - { - if (NULL == $this->sRequestedClass) - return false; - if (NULL == $this->sRequestedMethod) - return false; - - $objArgumentManager =& xajaxArgumentManager::getInstance(); - $aArgs = $objArgumentManager->process(); - - foreach (array_keys($this->aCallableObjects) as $sKey) - { - $xco =& $this->aCallableObjects[$sKey]; - - if ($xco->isClass($this->sRequestedClass)) - { - if ($xco->hasMethod($this->sRequestedMethod)) - { - $xco->call($this->sRequestedMethod, $aArgs); - return true; - } - } - } - - return 'Invalid request for a callable object.'; - } -} - -$objPluginManager =& xajaxPluginManager::getInstance(); -$objPluginManager->registerPlugin(new xajaxCallableObjectPlugin(), 102); diff --git a/phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxDefaultIncludePlugin.inc.php b/phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxDefaultIncludePlugin.inc.php deleted file mode 100644 index 361521d5e9..0000000000 --- a/phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxDefaultIncludePlugin.inc.php +++ /dev/null @@ -1,352 +0,0 @@ - for a detailed description, copyright - and license information. -*/ - -/* - @package xajax - @version $Id: xajaxDefaultIncludePlugin.inc.php 362 2007-05-29 15:32:24Z calltoconstruct $ - @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson - @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson - @license http://www.xajaxproject.org/bsd_license.txt BSD License -*/ - -/* - Class: xajaxIncludeClientScript - - Generates the SCRIPT tags necessary to 'include' the xajax javascript - library on the browser. - - This is called when the page is first loaded. -*/ -class xajaxIncludeClientScriptPlugin extends xajaxRequestPlugin -{ - var $sJsURI; - var $aJsFiles; - var $sDefer; - var $sRequestURI; - var $sStatusMessages; - var $sWaitCursor; - var $sVersion; - var $sDefaultMode; - var $sDefaultMethod; - var $bDebug; - var $bVerboseDebug; - var $nScriptLoadTimeout; - var $bUseUncompressedScripts; - var $bDeferScriptGeneration; - var $sLanguage; - var $nResponseQueueSize; - - function xajaxIncludeClientScriptPlugin() - { - $this->sJsURI = ''; - $this->aJsFiles = array(); - $this->sDefer = ''; - $this->sRequestURI = ''; - $this->sStatusMessages = 'false'; - $this->sWaitCursor = 'true'; - $this->sVersion = 'unknown'; - $this->sDefaultMode = 'asynchronous'; - $this->sDefaultMethod = 'POST'; // W3C: Method is case sensitive - $this->bDebug = false; - $this->bVerboseDebug = false; - $this->nScriptLoadTimeout = 2000; - $this->bUseUncompressedScripts = false; - $this->bDeferScriptGeneration = false; - $this->sLanguage = null; - $this->nResponseQueueSize = null; - } - - /* - Function: configure - */ - function configure($sName, $mValue) - { - if ('javascript URI' == $sName) { - $this->sJsURI = $mValue; - } else if ("javascript files" == $sName) { - $this->aJsFiles = $mValue; - } else if ("scriptDefferal" == $sName) { - if (true === $mValue) $this->sDefer = "defer "; - else $this->sDefer = ""; - } else if ("requestURI" == $sName) { - $this->sRequestURI = $mValue; - } else if ("statusMessages" == $sName) { - if (true === $mValue) $this->sStatusMessages = "true"; - else $this->sStatusMessages = "false"; - } else if ("waitCursor" == $sName) { - if (true === $mValue) $this->sWaitCursor = "true"; - else $this->sWaitCursor = "false"; - } else if ("version" == $sName) { - $this->sVersion = $mValue; - } else if ("defaultMode" == $sName) { - if ("asynchronous" == $mValue || "synchronous" == $mValue) - $this->sDefaultMode = $mValue; - } else if ("defaultMethod" == $sName) { - if ("POST" == $mValue || "GET" == $mValue) // W3C: Method is case sensitive - $this->sDefaultMethod = $mValue; - } else if ("debug" == $sName) { - if (true === $mValue || false === $mValue) - $this->bDebug = $mValue; - } else if ("verboseDebug" == $sName) { - if (true === $mValue || false === $mValue) - $this->bVerboseDebug = $mValue; - } else if ("scriptLoadTimeout" == $sName) { - $this->nScriptLoadTimeout = $mValue; - } else if ("useUncompressedScripts" == $sName) { - if (true === $mValue || false === $mValue) - $this->bUseUncompressedScripts = $mValue; - } else if ('deferScriptGeneration' == $sName) { - if (true === $mValue || false === $mValue) - $this->bDeferScriptGeneration = $mValue; - else if ('deferred' == $mValue) - $this->bDeferScriptGeneration = $mValue; - } else if ('language' == $sName) { - $this->sLanguage = $mValue; - } else if ('responseQueueSize' == $sName) { - $this->nResponseQueueSize = $mValue; - } - } - - /* - Function: generateClientScript - */ - function generateClientScript() - { - if (false === $this->bDeferScriptGeneration) - { - $this->printJavascriptConfig(); - $this->printJavascriptInclude(); - } - else if (true === $this->bDeferScriptGeneration) - { - $this->printJavascriptInclude(); - } - else if ('deferred' == $this->bDeferScriptGeneration) - { - $this->printJavascriptConfig(); - } - } - - /* - Function: getJavascriptConfig - - Generates the xajax settings that will be used by the xajax javascript - library when making requests back to the server. - - Returns: - - string - The javascript code necessary to configure the settings on - the browser. - */ - function getJavascriptConfig() - { - ob_start(); - $this->printJavascriptConfig(); - return ob_get_clean(); - } - - /* - Function: printJavascriptConfig - - See - */ - function printJavascriptConfig() - { - $sCrLf = "\n"; - - echo $sCrLf; - echo '<'; - echo 'script type="text/javascript" '; - echo $this->sDefer; - echo 'charset="UTF-8">'; - echo $sCrLf; - echo '/* <'; - echo '![CDATA[ */'; - echo $sCrLf; - echo 'try { if (undefined == xajax.config) xajax.config = {}; } catch (e) { xajax = {}; xajax.config = {}; };'; - echo $sCrLf; - echo 'xajax.config.requestURI = "'; - echo $this->sRequestURI; - echo '";'; - echo $sCrLf; - echo 'xajax.config.statusMessages = '; - echo $this->sStatusMessages; - echo ';'; - echo $sCrLf; - echo 'xajax.config.waitCursor = '; - echo $this->sWaitCursor; - echo ';'; - echo $sCrLf; - echo 'xajax.config.version = "'; - echo $this->sVersion; - echo '";'; - echo $sCrLf; - echo 'xajax.config.legacy = false;'; - echo $sCrLf; - echo 'xajax.config.defaultMode = "'; - echo $this->sDefaultMode; - echo '";'; - echo $sCrLf; - echo 'xajax.config.defaultMethod = "'; - echo $this->sDefaultMethod; - echo '";'; - - if (false === (null === $this->nResponseQueueSize)) - { - echo $sCrLf; - echo 'xajax.config.responseQueueSize = '; - echo $this->nResponseQueueSize; - echo ';'; - } - - echo $sCrLf; - echo '/* ]]> */'; - echo $sCrLf; - echo '<'; - echo '/script>'; - echo $sCrLf; - } - - /* - Function: getJavascriptInclude - - Generates SCRIPT tags necessary to load the javascript libraries on - the browser. - - sJsURI - (string): The relative or fully qualified PATH that will be - used to compose the URI to the specified javascript files. - aJsFiles - (array): List of javascript files to include. - - Returns: - - string - The SCRIPT tags that will cause the browser to load the - specified files. - */ - function getJavascriptInclude() - { - ob_start(); - $this->printJavascriptInclude(); - return ob_get_clean(); - } - - /* - Function: printJavascriptInclude - - See - */ - function printJavascriptInclude() - { - $aJsFiles = $this->aJsFiles; - $sJsURI = $this->sJsURI; - - if (0 == count($aJsFiles)) { - $aJsFiles[] = array($this->_getScriptFilename('xajax_js/xajax_core.js'), 'xajax'); - - if (true === $this->bDebug) - $aJsFiles[] = array($this->_getScriptFilename('xajax_js/xajax_debug.js'), 'xajax.debug'); - - if (true === $this->bVerboseDebug) - $aJsFiles[] = array($this->_getScriptFilename('xajax_js/xajax_verbose.js'), 'xajax.debug.verbose'); - - if (null !== $this->sLanguage) - $aJsFiles[] = array($this->_getScriptFilename('xajax_js/xajax_lang_' . $this->sLanguage . '.js'), 'xajax'); - } - - if ($sJsURI != '' && substr($sJsURI, -1) != '/') - $sJsURI .= '/'; - - $sCrLf = "\n"; - - foreach ($aJsFiles as $aJsFile) { - echo '<'; - echo 'script type="text/javascript" src="'; - echo $sJsURI; - echo $aJsFile[0]; - echo '" '; - echo $this->sDefer; - echo 'charset="UTF-8"><'; - echo '/script>'; - echo $sCrLf; - } - - if (0 < $this->nScriptLoadTimeout) { - foreach ($aJsFiles as $aJsFile) { - echo '<'; - echo 'script type="text/javascript" '; - echo $this->sDefer; - echo 'charset="UTF-8">'; - echo $sCrLf; - echo '/* <'; - echo '![CDATA[ */'; - echo $sCrLf; - echo 'window.setTimeout('; - echo $sCrLf; - echo ' function() {'; - echo $sCrLf; - echo ' var scriptExists = false;'; - echo $sCrLf; - echo ' try { if ('; - echo $aJsFile[1]; - echo '.isLoaded) scriptExists = true; }'; - echo $sCrLf; - echo ' catch (e) {}'; - echo $sCrLf; - echo ' if (!scriptExists) {'; - echo $sCrLf; - echo ' alert("Error: the '; - echo $aJsFile[1]; - echo ' Javascript component could not be included. Perhaps the URL is incorrect?\nURL: '; - echo $sJsURI; - echo $aJsFile[0]; - echo '");'; - echo $sCrLf; - echo ' }'; - echo $sCrLf; - echo ' }, '; - echo $this->nScriptLoadTimeout; - echo ');'; - echo $sCrLf; - echo '/* ]]> */'; - echo $sCrLf; - echo '<'; - echo '/script>'; - echo $sCrLf; - } - } - } - - /* - Function: _getScriptFilename - - Returns the name of the script file, based on the current settings. - - sFilename - (string): The base filename. - - Returns: - - string - The filename as it should be specified in the script tags - on the browser. - */ - function _getScriptFilename($sFilename) - { - if ($this->bUseUncompressedScripts) { - return str_replace('.js', '_uncompressed.js', $sFilename); - } - return $sFilename; - } -} - -/* - Register the xajaxIncludeClientScriptPlugin object with the xajaxPluginManager. -*/ -$objPluginManager =& xajaxPluginManager::getInstance(); -$objPluginManager->registerPlugin(new xajaxIncludeClientScriptPlugin(), 99); diff --git a/phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxEventPlugin.inc.php b/phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxEventPlugin.inc.php deleted file mode 100644 index 95e6e1781e..0000000000 --- a/phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxEventPlugin.inc.php +++ /dev/null @@ -1,229 +0,0 @@ - for a detailed description, copyright - and license information. -*/ - -/* - @package xajax - @version $Id: xajaxEventPlugin.inc.php 362 2007-05-29 15:32:24Z calltoconstruct $ - @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson - @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson - @license http://www.xajaxproject.org/bsd_license.txt BSD License -*/ - -/* - Constant: XAJAX_EVENT - Specifies that the item being registered via the register> function - is an event. - - Constant: XAJAX_EVENT_HANDLER - Specifies that the item being registered via the register> function - is an event handler. -*/ -if (!defined ('XAJAX_EVENT')) define ('XAJAX_EVENT', 'xajax event'); -if (!defined ('XAJAX_EVENT_HANDLER')) define ('XAJAX_EVENT_HANDLER', 'xajax event handler'); - -//SkipAIO -require dirname(__FILE__) . '/support/xajaxEvent.inc.php'; -//EndSkipAIO - -/* - Class: xajaxEventPlugin - - Plugin that adds server side event handling capabilities to xajax. Events can - be registered, then event handlers attached. -*/ -class xajaxEventPlugin extends xajaxRequestPlugin -{ - /* - Array: aEvents - */ - var $aEvents; - - /* - String: sXajaxPrefix - */ - var $sXajaxPrefix; - - /* - String: sEventPrefix - */ - var $sEventPrefix; - - /* - String: sDefer - */ - var $sDefer; - - var $bDeferScriptGeneration; - - /* - String: sRequestedEvent - */ - var $sRequestedEvent; - - /* - Function: xajaxEventPlugin - */ - function xajaxEventPlugin() - { - $this->aEvents = array(); - - $this->sXajaxPrefix = 'xajax_'; - $this->sEventPrefix = 'event_'; - $this->sDefer = ''; - $this->bDeferScriptGeneration = false; - - $this->sRequestedEvent = NULL; - - if (isset($_GET['xjxevt'])) $this->sRequestedEvent = $_GET['xjxevt']; - if (isset($_POST['xjxevt'])) $this->sRequestedEvent = $_POST['xjxevt']; - } - - /* - Function: configure - */ - function configure($sName, $mValue) - { - if ('wrapperPrefix' == $sName) { - $this->sXajaxPrefix = $mValue; - } else if ('eventPrefix' == $sName) { - $this->sEventPrefix = $mValue; - } else if ('scriptDefferal' == $sName) { - if (true === $mValue) $this->sDefer = 'defer '; - else $this->sDefer = ''; - } else if ('deferScriptGeneration' == $sName) { - if (true === $mValue || false === $mValue) - $this->bDeferScriptGeneration = $mValue; - else if ('deferred' === $mValue) - $this->bDeferScriptGeneration = $mValue; - } - } - - /* - Function: register - - $sType - (string): type of item being registered - $sEvent - (string): the name of the event - $ufHandler - (function name or reference): a reference to the user function to call - $aConfiguration - (array): an array containing configuration options - */ - function register($aArgs) - { - if (1 < count($aArgs)) - { - $sType = $aArgs[0]; - - if (XAJAX_EVENT == $sType) - { - $sEvent = $aArgs[1]; - - if (false === isset($this->aEvents[$sEvent])) - { - $xe = new xajaxEvent($sEvent); - - if (2 < count($aArgs)) - if (is_array($aArgs[2])) - foreach ($aArgs[2] as $sKey => $sValue) - $xe->configure($sKey, $sValue); - - $this->aEvents[$sEvent] =& $xe; - - return $xe->generateRequest($this->sXajaxPrefix, $this->sEventPrefix); - } - } - - if (XAJAX_EVENT_HANDLER == $sType) - { - $sEvent = $aArgs[1]; - - if (isset($this->aEvents[$sEvent])) - { - if (isset($aArgs[2])) - { - $xuf =& $aArgs[2]; - - if (false === is_a($xuf, 'xajaxUserFunction')) - $xuf = new xajaxUserFunction($xuf); - - $objEvent =& $this->aEvents[$sEvent]; - $objEvent->addHandler($xuf); - - return true; - } - } - } - } - - return false; - } - - /* - Function: generateClientScript - */ - function generateClientScript() - { - if (false === $this->bDeferScriptGeneration || 'deferred' === $this->bDeferScriptGeneration) - { - if (0 < count($this->aEvents)) - { - echo "\n\n"; - } - } - } - - /* - Function: canProcessRequest - */ - function canProcessRequest() - { - if (NULL == $this->sRequestedEvent) - return false; - - return true; - } - - /* - Function: processRequest - */ - function processRequest() - { - if (NULL == $this->sRequestedEvent) - return false; - - $objArgumentManager =& xajaxArgumentManager::getInstance(); - $aArgs = $objArgumentManager->process(); - - foreach (array_keys($this->aEvents) as $sKey) - { - $objEvent =& $this->aEvents[$sKey]; - - if ($objEvent->getName() == $this->sRequestedEvent) - { - $objEvent->fire($aArgs); - return true; - } - } - - return 'Invalid event request received; no event was registered with this name.'; - } -} - -$objPluginManager =& xajaxPluginManager::getInstance(); -$objPluginManager->registerPlugin(new xajaxEventPlugin(), 103); diff --git a/phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxFunctionPlugin.inc.php b/phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxFunctionPlugin.inc.php deleted file mode 100644 index 6622520d1b..0000000000 --- a/phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxFunctionPlugin.inc.php +++ /dev/null @@ -1,231 +0,0 @@ - for a detailed description, copyright - and license information. -*/ - -/* - @package xajax - @version $Id: xajaxFunctionPlugin.inc.php 362 2007-05-29 15:32:24Z calltoconstruct $ - @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson - @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson - @license http://www.xajaxproject.org/bsd_license.txt BSD License -*/ - -/* - Constant: XAJAX_FUNCTION - Specifies that the item being registered via the register> function - is a php function available at global scope, or a specific function from - an instance of an object. -*/ -if (!defined ('XAJAX_FUNCTION')) define ('XAJAX_FUNCTION', 'function'); - -// require_once is necessary here as the xajaxEvent class will include this also -//SkipAIO -require_once dirname(__FILE__) . '/support/xajaxUserFunction.inc.php'; -//EndSkipAIO - -/* - Class: xajaxFunctionPlugin -*/ -class xajaxFunctionPlugin extends xajaxRequestPlugin -{ - /* - Array: aFunctions - - An array of object that are registered and - available via a call. - */ - var $aFunctions; - - /* - String: sXajaxPrefix - - A configuration setting that is stored locally and used during - the client script generation phase. - */ - var $sXajaxPrefix; - - /* - String: sDefer - - Configuration option that can be used to request that the - javascript file is loaded after the page has been fully loaded. - */ - var $sDefer; - - var $bDeferScriptGeneration; - - /* - String: sRequestedFunction - - This string is used to temporarily hold the name of the function - that is being requested (during the request processing phase). - - Since canProcessRequest loads this value from the get or post - data, it is unnecessary to load it again. - */ - var $sRequestedFunction; - - /* - Function: xajaxFunctionPlugin - - Constructs and initializes the . The GET and POST - data is searched for xajax function call parameters. This will later - be used to determine if the request is for a registered function in - canProcessRequest> - */ - function xajaxFunctionPlugin() - { - $this->aFunctions = array(); - - $this->sXajaxPrefix = 'xajax_'; - $this->sDefer = ''; - $this->bDeferScriptGeneration = false; - - $this->sRequestedFunction = NULL; - - if (isset($_GET['xjxfun'])) $this->sRequestedFunction = $_GET['xjxfun']; - if (isset($_POST['xjxfun'])) $this->sRequestedFunction = $_POST['xjxfun']; - } - - /* - Function: configure - - Sets/stores configuration options used by this plugin. - */ - function configure($sName, $mValue) - { - if ('wrapperPrefix' == $sName) { - $this->sXajaxPrefix = $mValue; - } else if ('scriptDefferal' == $sName) { - if (true === $mValue) $this->sDefer = 'defer '; - else $this->sDefer = ''; - } else if ('deferScriptGeneration' == $sName) { - if (true === $mValue || false === $mValue) - $this->bDeferScriptGeneration = $mValue; - else if ('deferred' === $mValue) - $this->bDeferScriptGeneration = $mValue; - } - } - - /* - Function: register - - Provides a mechanism for functions to be registered and made available to - the page via the javascript call. - */ - function register($aArgs) - { - if (1 < count($aArgs)) - { - $sType = $aArgs[0]; - - if (XAJAX_FUNCTION == $sType) - { - $xuf =& $aArgs[1]; - - if (false === is_a($xuf, 'xajaxUserFunction')) - $xuf = new xajaxUserFunction($xuf); - - if (2 < count($aArgs)) - if (is_array($aArgs[2])) - foreach ($aArgs[2] as $sName => $sValue) - $xuf->configure($sName, $sValue); - - $this->aFunctions[] =& $xuf; - - return $xuf->generateRequest($this->sXajaxPrefix); - } - } - - return false; - } - - /* - Function: generateClientScript - - Called by the during the client script generation - phase. This is used to generate a block of javascript code that will - contain function declarations that can be used on the browser through - javascript to initiate xajax requests. - */ - function generateClientScript() - { - if (false === $this->bDeferScriptGeneration || 'deferred' === $this->bDeferScriptGeneration) - { - if (0 < count($this->aFunctions)) - { - echo "\n\n"; - } - } - } - - /* - Function: canProcessRequest - - Determines whether or not the current request can be processed - by this plugin. - - Returns: - - boolean - True if the current request can be handled by this plugin; - false otherwise. - */ - function canProcessRequest() - { - if (NULL == $this->sRequestedFunction) - return false; - - return true; - } - - /* - Function: processRequest - - Called by the when a request needs to be - processed. - - Returns: - - mixed - True when the request has been processed successfully. - An error message when an error has occurred. - */ - function processRequest() - { - if (NULL == $this->sRequestedFunction) - return false; - - $objArgumentManager =& xajaxArgumentManager::getInstance(); - $aArgs = $objArgumentManager->process(); - - foreach (array_keys($this->aFunctions) as $sKey) - { - $xuf =& $this->aFunctions[$sKey]; - - if ($xuf->getName() == $this->sRequestedFunction) - { - $xuf->call($aArgs); - return true; - } - } - - return 'Invalid function request received; no request processor found with this name.'; - } -} - -$objPluginManager =& xajaxPluginManager::getInstance(); -$objPluginManager->registerPlugin(new xajaxFunctionPlugin(), 100); diff --git a/phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxScriptPlugin.inc.php b/phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxScriptPlugin.inc.php deleted file mode 100644 index 0fe5962606..0000000000 --- a/phpgwapi/inc/xajax/xajax_core/plugin_layer/xajaxScriptPlugin.inc.php +++ /dev/null @@ -1,266 +0,0 @@ - for a detailed description, copyright - and license information. -*/ - -/* - @package xajax - @version $Id: xajaxScriptPlugin.inc.php 362 2007-05-29 15:32:24Z calltoconstruct $ - @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson - @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson - @license http://www.xajaxproject.org/bsd_license.txt BSD License -*/ - -/* - Class: xajaxScriptPlugin - - Contains the code that can produce script and style data during deferred script - generation. This allows the xajax generated javascript and style sheet information - to be loaded via an external file reference instead of inlined into the page - source. -*/ -class xajaxScriptPlugin extends xajaxRequestPlugin -{ - /* - String: sRequest - */ - var $sRequest; - - /* - String: sHash - */ - var $sHash; - - /* - String: sRequestURI - */ - var $sRequestURI; - - /* - Boolean: bDeferScriptGeneration - */ - var $bDeferScriptGeneration; - - /* - Boolean: bValidateHash - */ - var $bValidateHash; - - /* - Boolean: bWorking - */ - var $bWorking; - - /* - Function: xajaxScriptPlugin - - Construct and initialize the xajax script plugin object. During - initialization, this plugin will look for hash codes in the - GET data (parameters passed on the request URI) and store them - for later use. - */ - function xajaxScriptPlugin() - { - $this->sRequestURI = ''; - $this->bDeferScriptGeneration = false; - $this->bValidateHash = true; - - $this->bWorking = false; - - $this->sRequest = ''; - $this->sHash = null; - - if (isset($_GET['xjxGenerateJavascript'])) { - $this->sRequest = 'script'; - $this->sHash = $_GET['xjxGenerateJavascript']; - } - - if (isset($_GET['xjxGenerateStyle'])) { - $this->sRequest = 'style'; - $this->sHash = $_GET['xjxGenerateStyle']; - } - } - - /* - Function: configure - - Sets/stores configuration options used by this plugin. See also: - . This plugin will watch for and store the current - setting for the following configuration options: - - - (string): The requestURI of the current script file. - - (boolean): A flag that indicates whether - script deferral is in effect or not. - - (boolean): A flag that indicates whether - or not the script hash should be validated. - */ - function configure($sName, $mValue) - { - if ('requestURI' == $sName) { - $this->sRequestURI = $mValue; - } else if ('deferScriptGeneration' == $sName) { - if (true === $mValue || false === $mValue) - $this->bDeferScriptGeneration = $mValue; - } else if ('deferScriptValidateHash' == $sName) { - if (true === $mValue || false === $mValue) - $this->bValidateHash = $mValue; - } - } - - /* - Function: generateClientScript - - Called by the when the text of the client script - (or style) declarations are needed. - - This function will only output script or style information if the - request URI contained an appropriate hash code and script deferral - is in effect. - */ - function generateClientScript() - { - if ($this->bWorking) - return; - - if (true === $this->bDeferScriptGeneration) - { - $this->bWorking = true; - - $sQueryBase = '?'; - if (0 < strpos($this->sRequestURI, '?')) - $sQueryBase = '&'; - - $aScripts = $this->_getSections('script'); - if (0 < count($aScripts)) - { -// echo ""; - - $sHash = md5(implode($aScripts)); - $sQuery = $sQueryBase . "xjxGenerateJavascript=" . $sHash; - - echo "\n\n"; - } - - $aStyles = $this->_getSections('style'); - if (0 < count($aStyles)) - { -// echo ""; - - $sHash = md5(implode($aStyles)); - $sQuery = $sQueryBase . "xjxGenerateStyle=" . $sHash; - - echo "\n\n"; - } - - $this->bWorking = false; - } - } - - /* - Function: canProcessRequest - - Called by the to determine if this plugin can - process the current request. This will return true when the - requestURI contains an appropriate hash code. - */ - function canProcessRequest() - { - return ('' != $this->sRequest); - } - - function &_getSections($sType) - { - $objPluginManager =& xajaxPluginManager::getInstance(); - - $objPluginManager->configure('deferScriptGeneration', 'deferred'); - - $aSections = array(); - - // buffer output - - ob_start(); - $objPluginManager->generateClientScript(); - $sScript = ob_get_clean(); - - // parse out blocks - - $aParts = explode('', $sScript); - foreach ($aParts as $sPart) - { - $aValues = explode('<' . $sType, $sPart, 2); - if (2 == count($aValues)) - { - list($sJunk, $sPart) = $aValues; - - $aValues = explode('>', $sPart, 2); - if (2 == count($aValues)) - { - list($sJunk, $sPart) = $aValues; - - if (0 < strlen($sPart)) - $aSections[] = $sPart; - } - } - } - - $objPluginManager->configure('deferScriptGeneration', $this->bDeferScriptGeneration); - - return $aSections; - } - - /* - Function: processRequest - - Called by the when the current request should be - processed. This plugin will generate the javascript or style sheet information - that would normally be output by the other xajax plugin objects, when script - deferral is in effect. If script deferral is disabled, this function returns - without performing any functions. - */ - function processRequest() - { - if ($this->canProcessRequest()) - { - $aSections =& $this->_getSections($this->sRequest); - -// echo ""; - - // validate the hash - $sHash = md5(implode($aSections)); - if (false == $this->bValidateHash || $sHash == $this->sHash) - { - $sType = 'text/javascript'; - if ('style' == $this->sRequest) - $sType = 'text/css'; - - $objResponse = new xajaxCustomResponse($sType); - - foreach ($aSections as $sSection) - $objResponse->append($sSection . "\n"); - - $objResponseManager =& xajaxResponseManager::getInstance(); - $objResponseManager->append($objResponse); - - header ('Expires: ' . gmdate('D, d M Y H:i:s', time() + (60*60*24)) . ' GMT'); - - return true; - } - - return 'Invalid script or style request.'; - trigger_error('Hash mismatch: ' . $this->sRequest . ': ' . $sHash . ' <==> ' . $this->sHash, E_USER_ERROR); - } - } -} - -/* - Register the plugin with the xajax plugin manager. -*/ -$objPluginManager =& xajaxPluginManager::getInstance(); -$objPluginManager->registerPlugin(new xajaxScriptPlugin(), 9999); diff --git a/phpgwapi/inc/xajax/xajax_core/xajax.inc.php b/phpgwapi/inc/xajax/xajax_core/xajax.inc.php deleted file mode 100644 index 133571fd27..0000000000 --- a/phpgwapi/inc/xajax/xajax_core/xajax.inc.php +++ /dev/null @@ -1,1423 +0,0 @@ - for a detailed description, copyright - and license information. -*/ - -/* - @package xajax - @version $Id: xajax.inc.php 362 2007-05-29 15:32:24Z calltoconstruct $ - @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson - @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson - @license http://www.xajaxproject.org/bsd_license.txt BSD License -*/ - -/* - Section: Standard Definitions -*/ - -/* - String: XAJAX_DEFAULT_CHAR_ENCODING - - Default character encoding used by both the and - classes. -*/ -if (!defined ('XAJAX_DEFAULT_CHAR_ENCODING')) define ('XAJAX_DEFAULT_CHAR_ENCODING', 'utf-8'); - -/* - String: XAJAX_PROCESSING_EVENT - String: XAJAX_PROCESSING_EVENT_BEFORE - String: XAJAX_PROCESSING_EVENT_AFTER - String: XAJAX_PROCESSING_EVENT_INVALID - - Identifiers used to register processing events. Processing events are essentially - hooks into the xajax core that can be used to add functionality into the request - processing sequence. -*/ -if (!defined ('XAJAX_PROCESSING_EVENT')) define ('XAJAX_PROCESSING_EVENT', 'xajax processing event'); -if (!defined ('XAJAX_PROCESSING_EVENT_BEFORE')) define ('XAJAX_PROCESSING_EVENT_BEFORE', 'beforeProcessing'); -if (!defined ('XAJAX_PROCESSING_EVENT_AFTER')) define ('XAJAX_PROCESSING_EVENT_AFTER', 'afterProcessing'); -if (!defined ('XAJAX_PROCESSING_EVENT_INVALID')) define ('XAJAX_PROCESSING_EVENT_INVALID', 'invalidRequest'); - -/* - Class: xajax - - The xajax class uses a modular plug-in system to facilitate the processing - of special Ajax requests made by a PHP page. It generates Javascript that - the page must include in order to make requests. It handles the output - of response commands (see ). Many flags and settings can be - adjusted to effect the behavior of the xajax class as well as the client-side - javascript. -*/ -class xajax -{ - /**#@+ - * @access protected - */ - - /* - Array: aSettings - - This array is used to store all the configuration settings that are set during - the run of the script. This provides a single data store for the settings - in case we need to return the value of a configuration option for some reason. - - It is advised that individual plugins store a local copy of the settings they - wish to track, however, settings are available via a reference to the - object using getConfiguration>. - */ - var $aSettings; - - /* - Boolean: bErrorHandler - - This is a configuration setting that the main xajax object tracks. It is used - to enable an error handler function which will trap php errors and return them - to the client as part of the response. The client can then display the errors - to the user if so desired. - */ - var $bErrorHandler; - - /* - Array: aProcessingEvents - - Stores the processing event handlers that have been assigned during this run - of the script. - */ - var $aProcessingEvents; - - /* - Boolean: bExitAllowed - - A configuration option that is tracked by the main object. Setting this - to true allows to exit immediatly after processing a xajax request. If - this is set to false, xajax will allow the remaining code and HTML to be sent - as part of the response. Typically this would result in an error, however, - a response processor on the client side could be designed to handle this condition. - */ - var $bExitAllowed; - - /* - Boolean: bCleanBuffer - - A configuration option that is tracked by the main object. Setting this - to true allows to clear out any pending output buffers so that the - is (virtually) the only output when handling a request. - */ - var $bCleanBuffer; - - /* - String: sLogFile - - A configuration setting tracked by the main object. Set the name of the - file on the server that you wish to have php error messages written to during - the processing of requests. - */ - var $sLogFile; - - /* - String: sCoreIncludeOutput - - This is populated with any errors or warnings produced while including the xajax - core components. This is useful for debugging core updates. - */ - var $sCoreIncludeOutput; - - /* - Object: objPluginManager - - This stores a reference to the global - */ - var $objPluginManager; - - /* - Object: objArgumentManager - - Stores a reference to the global - */ - var $objArgumentManager; - - /* - Object: objResponseManager - - Stores a reference to the global - */ - var $objResponseManager; - - /* - Object: objLanguageManager - - Stores a reference to the global - */ - var $objLanguageManager; - - /**#@-*/ - - /* - Constructor: xajax - - Constructs a xajax instance and initializes the plugin system. - - Parameters: - - sRequestURI - (optional): The sRequestURI> to be used - for calls back to the server. If empty, xajax fills in the current - URI that initiated this request. - */ - function xajax($sRequestURI=null, $sLanguage=null) - { - $this->bErrorHandler = false; - $this->aProcessingEvents = array(); - $this->bExitAllowed = true; - $this->bCleanBuffer = true; - $this->sLogFile = ''; - - $this->__wakeup(); - - // The default configuration settings. - $this->configureMany( - array( - 'characterEncoding' => XAJAX_DEFAULT_CHAR_ENCODING, - 'decodeUTF8Input' => false, - 'outputEntities' => false, - 'defaultMode' => 'asynchronous', - 'defaultMethod' => 'POST', // W3C: Method is case sensitive - 'wrapperPrefix' => 'xajax_', - 'debug' => false, - 'verbose' => false, - 'useUncompressedScripts' => false, - 'statusMessages' => false, - 'waitCursor' => true, - 'scriptDeferral' => false, - 'exitAllowed' => true, - 'errorHandler' => false, - 'cleanBuffer' => false, - 'allowBlankResponse' => false, - 'allowAllResponseTypes' => false, - 'generateStubs' => true, - 'logFile' => '', - 'timeout' => 6000, - 'version' => $this->getVersion() - ) - ); - - if (null !== $sRequestURI) - $this->configure('requestURI', $sRequestURI); - else - $this->configure('requestURI', $this->_detectURI()); - - if (null !== $sLanguage) - $this->configure('language', $sLanguage); - - if ('utf-8' != XAJAX_DEFAULT_CHAR_ENCODING) $this->configure("decodeUTF8Input", true); - - } - - /* - Function: __sleep - */ - function __sleep() - { - $aMembers = get_class_vars(get_class($this)); - - if (isset($aMembers['objLanguageManager'])) - unset($aMembers['objLanguageManager']); - - if (isset($aMembers['objPluginManager'])) - unset($aMembers['objPluginManager']); - - if (isset($aMembers['objArgumentManager'])) - unset($aMembers['objArgumentManager']); - - if (isset($aMembers['objResponseManager'])) - unset($aMembers['objResponseManager']); - - if (isset($aMembers['sCoreIncludeOutput'])) - unset($aMembers['sCoreIncludeOutput']); - - return array_keys($aMembers); - } - - /* - Function: __wakeup - */ - function __wakeup() - { - ob_start(); - - $sLocalFolder = dirname(__FILE__); - -//SkipAIO - require_once $sLocalFolder . '/xajaxPluginManager.inc.php'; - require_once $sLocalFolder . '/xajaxLanguageManager.inc.php'; - require_once $sLocalFolder . '/xajaxArgumentManager.inc.php'; - require_once $sLocalFolder . '/xajaxResponseManager.inc.php'; - require_once $sLocalFolder . '/xajaxRequest.inc.php'; - require_once $sLocalFolder . '/xajaxResponse.inc.php'; -//EndSkipAIO - - // this is the list of folders where xajax will look for plugins - // that will be automatically included at startup. - $aPluginFolders = array(); - $aPluginFolders[] = dirname($sLocalFolder) . '/xajax_plugins'; - -//SkipAIO - $aPluginFolders[] = $sLocalFolder . '/plugin_layer'; -//EndSkipAIO - - // Setup plugin manager - $this->objPluginManager =& xajaxPluginManager::getInstance(); - $this->objPluginManager->loadPlugins($aPluginFolders); - - $this->objLanguageManager =& xajaxLanguageManager::getInstance(); - $this->objArgumentManager =& xajaxArgumentManager::getInstance(); - $this->objResponseManager =& xajaxResponseManager::getInstance(); - - $this->sCoreIncludeOutput = ob_get_clean(); - } - - /* - Function: getGlobalResponse - - Returns the object preconfigured with the encoding - and entity settings from this instance of . This is used - for singleton-pattern response development. - - Returns: - - : A object which can be used to return - response commands. See also the class. - */ - function &getGlobalResponse() - { - static $obj; - if (!$obj) { - $obj = new xajaxResponse(); - } - return $obj; - } - - /* - Function: getVersion - - Returns: - - string : The current xajax version. - */ - function getVersion() - { - return 'xajax 0.5'; - } - - /* - Function: register - - Call this function to register request handlers, including functions, - callable objects and events. New plugins can be added that support - additional registration methods and request processors. - - - Parameters: - - $sType - (string): Type of request handler being registered; standard - options include: - XAJAX_FUNCTION: a function declared at global scope. - XAJAX_CALLABLE_OBJECT: an object who's methods are to be registered. - XAJAX_EVENT: an event which will cause zero or more event handlers - to be called. - XAJAX_EVENT_HANDLER: register an event handler function. - - $sFunction || $objObject || $sEvent - (mixed): - when registering a function, this is the name of the function - when registering a callable object, this is the object being registered - when registering an event or event handler, this is the name of the event - - $sIncludeFile || $aCallOptions || $sEventHandler - when registering a function, this is the (optional) include file. - when registering a callable object, this is an (optional) array - of call options for the functions being registered. - when registering an event handler, this is the name of the function. - */ - function register($sType, $mArg) - { - $aArgs = func_get_args(); - $nArgs = func_num_args(); - - if (2 < $nArgs) - { - if (XAJAX_PROCESSING_EVENT == $aArgs[0]) - { - $sEvent = $aArgs[1]; - $xuf =& $aArgs[2]; - - if (false == is_a($xuf, 'xajaxUserFunction')) - $xuf = new xajaxUserFunction($xuf); - - $this->aProcessingEvents[$sEvent] =& $xuf; - - return true; - } - } - - if (1 < $nArgs) - { - // for php4 - $aArgs[1] =& $mArg; - } - - return $this->objPluginManager->register($aArgs); - } - - /* - Function: configure - - Call this function to set options that will effect the processing of - xajax requests. Configuration settings can be specific to the xajax - core, request processor plugins and response plugins. - - - Parameters: - - Options include: - javascript URI - (string): The path to the folder that contains the - xajax javascript files. - errorHandler - (boolean): true to enable the xajax error handler, see - bErrorHandler> - exitAllowed - (boolean): true to allow xajax to exit after processing - a request. See bExitAllowed> for more information. - */ - function configure($sName, $mValue) - { - if ('errorHandler' == $sName) { - if (true === $mValue || false === $mValue) - $this->bErrorHandler = $mValue; - } else if ('exitAllowed' == $sName) { - if (true === $mValue || false === $mValue) - $this->bExitAllowed = $mValue; - } else if ('cleanBuffer' == $sName) { - if (true === $mValue || false === $mValue) - $this->bCleanBuffer = $mValue; - } else if ('logFile' == $sName) { - $this->sLogFile = $mValue; - } - - $this->objLanguageManager->configure($sName, $mValue); - $this->objArgumentManager->configure($sName, $mValue); - $this->objPluginManager->configure($sName, $mValue); - $this->objResponseManager->configure($sName, $mValue); - - $this->aSettings[$sName] = $mValue; - } - - /* - Function: configureMany - - Set an array of configuration options. - - Parameters: - - $aOptions - (array): Associative array of configuration settings - */ - function configureMany($aOptions) - { - foreach ($aOptions as $sName => $mValue) - $this->configure($sName, $mValue); - } - - /* - Function: getConfiguration - - Get the current value of a configuration setting that was previously set - via configure> or configureMany> - - Parameters: - - $sName - (string): The name of the configuration setting - - Returns: - - $mValue : (mixed): The value of the setting if set, null otherwise. - */ - function getConfiguration($sName) - { - if (isset($this->aSettings[$sName])) - return $this->aSettings[$sName]; - return NULL; - } - - /* - Function: canProcessRequest - - Determines if a call is a xajax request or a page load request. - - Return: - - boolean - True if this is a xajax request, false otherwise. - */ - function canProcessRequest() - { - return $this->objPluginManager->canProcessRequest(); - } - - /* - Function: processRequest - - If this is a xajax request (see canProcessRequest>), call the - requested PHP function, build the response and send it back to the - browser. - - This is the main server side engine for xajax. It handles all the - incoming requests, including the firing of events and handling of the - response. If your RequestURI is the same as your web page, then this - function should be called before ANY headers or HTML is output from - your script. - - This function may exit, if a request is processed. See bAllowExit> - */ - function processRequest() - { -//SkipDebug - // Check to see if headers have already been sent out, in which case we can't do our job - if (headers_sent($filename, $linenumber)) { - echo "Output has already been sent to the browser at {$filename}:{$linenumber}.\n"; - echo 'Please make sure the command $xajax->processRequest() is placed before this.'; - exit(); - } -//EndSkipDebug - - if ($this->canProcessRequest()) - { - // Use xajax error handler if necessary - if ($this->bErrorHandler) { - $GLOBALS['xajaxErrorHandlerText'] = ""; - set_error_handler("xajaxErrorHandler"); - } - - $mResult = true; - - // handle beforeProcessing event - if (isset($this->aProcessingEvents[XAJAX_PROCESSING_EVENT_BEFORE])) - { - $bEndRequest = false; - $this->aProcessingEvents[XAJAX_PROCESSING_EVENT_BEFORE]->call(array(&$bEndRequest)); - $mResult = (false === $bEndRequest); - } - - if (true === $mResult) - $mResult = $this->objPluginManager->processRequest(); - - if (true === $mResult) - { - if ($this->bCleanBuffer) { - $er = error_reporting(0); - while (ob_get_level() > 0) ob_end_clean(); - error_reporting($er); - } - - // handle afterProcessing event - if (isset($this->aProcessingEvents[XAJAX_PROCESSING_EVENT_AFTER])) - { - $bEndRequest = false; - $this->aProcessingEvents[XAJAX_PROCESSING_EVENT_AFTER]->call(array(&$bEndRequest)); - if (true === $bEndRequest) - { - $this->objResponseManager->clear(); - $this->objResponseManager->append($aResult[1]); - } - } - } - else if (is_string($mResult)) - { - if ($this->bCleanBuffer) { - $er = error_reporting(0); - while (ob_get_level() > 0) ob_end_clean(); - error_reporting($er); - } - - // $mResult contains an error message - // the request was missing the cooresponding handler function - // or an error occurred while attempting to execute the - // handler. replace the response, if one has been started - // and send a debug message. - - $this->objResponseManager->clear(); - $this->objResponseManager->append(new xajaxResponse()); - - // handle invalidRequest event - if (isset($this->aProcessingEvents[XAJAX_PROCESSING_EVENT_INVALID])) - $this->aProcessingEvents[XAJAX_PROCESSING_EVENT_INVALID]->call(); - else - $this->objResponseManager->debug($mResult); - } - - if ($this->bErrorHandler) { - $sErrorMessage = $GLOBALS['xajaxErrorHandlerText']; - if (!empty($sErrorMessage)) { - if (0 < strlen($this->sLogFile)) { - $fH = @fopen($this->sLogFile, "a"); - if (NULL != $fH) { - fwrite( - $fH, - $this->objLanguageManager->getText('LOGHDR:01') - . strftime("%b %e %Y %I:%M:%S %p") - . $this->objLanguageManager->getText('LOGHDR:02') - . $sErrorMessage - . $this->objLanguageManager->getText('LOGHDR:03') - ); - fclose($fH); - } else { - $this->objResponseManager->debug( - $this->objLanguageManager->getText('LOGERR:01') - . $this->sLogFile - ); - } - } - $this->objResponseManager->debug( - $this->objLanguageManager->getText('LOGMSG:01') - . $sErrorMessage - ); - } - } - - $this->objResponseManager->send(); - - if ($this->bErrorHandler) restore_error_handler(); - - if ($this->bExitAllowed) exit(); - } - } - - /* - Function: printJavascript - - Prints the xajax Javascript header and wrapper code into your page. - This should be used to print the javascript code between the HEAD - and /HEAD tags at the top of the page. - - The javascript code output by this function is dependent on the plugins - that are included and the functions that are registered. - - Parameters: - - $sJsURI - (string, optional, deprecated): the path to the xajax javascript file(s) - - This option is deprecated and will be removed in future versions; instead - please use configure> with the option name 'javascript URI' - $aJsFiles - (array, optional, deprecated): an array of xajax javascript files - that will be loaded via SCRIPT tags. This option is deprecated and will - be removed in future versions; please use configure> with the - option name 'javascript files' instead. - */ - function printJavascript($sJsURI="", $aJsFiles=array()) - { - if (0 < strlen($sJsURI)) - $this->configure("javascript URI", $sJsURI); - - if (0 < count($aJsFiles)) - $this->configure("javascript files", $aJsFiles); - - $this->objPluginManager->generateClientScript(); - } - - /* - Function: getJavascript - - See printJavascript> for more information. - */ - function getJavascript($sJsURI='', $aJsFiles=array()) - { - ob_start(); - $this->printJavascript($sJsURI, $aJsFiles); - return ob_get_clean(); - } - - /* - Function: autoCompressJavascript - - Creates a new xajax_core, xajax_debug, etc... file out of the - _uncompressed file with a similar name. This strips out the - comments and extraneous whitespace so the file is as small as - possible without modifying the function of the code. - - Parameters: - - sJsFullFilename - (string): The relative path and name of the file - to be compressed. - bAlways - (boolean): Compress the file, even if it already exists. - */ - function autoCompressJavascript($sJsFullFilename=NULL, $bAlways=false) - { - $sJsFile = 'xajax_js/xajax_core.js'; - - if ($sJsFullFilename) { - $realJsFile = $sJsFullFilename; - } - else { - $realPath = realpath(dirname(dirname(__FILE__))); - $realJsFile = $realPath . '/'. $sJsFile; - } - - // Create a compressed file if necessary - if (!file_exists($realJsFile) || true == $bAlways) { - $srcFile = str_replace('.js', '_uncompressed.js', $realJsFile); - if (!file_exists($srcFile)) { - trigger_error( - $this->objLanguageManager->getText('CMPRSJS:RDERR:01') - . dirname($realJsFile) - . $this->objLanguageManager->getText('CMPRSJS:RDERR:02') - , E_USER_ERROR - ); - } - require_once(dirname(__FILE__) . '/xajaxCompress.inc.php'); - $javaScript = implode('', file($srcFile)); - $compressedScript = xajaxCompressFile($javaScript); - $fH = @fopen($realJsFile, 'w'); - if (!$fH) { - trigger_error( - $this->objLanguageManager->getText('CMPRSJS:WTERR:01') - . dirname($realJsFile) - . $this->objLanguageManager->getText('CMPRSJS:WTERR:02') - , E_USER_ERROR - ); - } - else { - fwrite($fH, $compressedScript); - fclose($fH); - } - } - } - - function _compressSelf($sFolder=null) - { - if (null == $sFolder) - $sFolder = dirname(dirname(__FILE__)); - - require_once(dirname(__FILE__) . '/xajaxCompress.inc.php'); - - if ($handle = opendir($sFolder)) { - while (!(false === ($sName = readdir($handle)))) { - if ('.' != $sName && '..' != $sName && is_dir($sFolder . '/' . $sName)) { - $this->_compressSelf($sFolder . '/' . $sName); - } else if (8 < strlen($sName) && 0 == strpos($sName, '.compressed')) { - if ('.inc.php' == substr($sName, strlen($sName) - 8, 8)) { - $sName = substr($sName, 0, strlen($sName) - 8); - $sPath = $sFolder . '/' . $sName . '.inc.php'; - if (file_exists($sPath)) { - - $aParsed = array(); - $aFile = file($sPath); - $nSkip = 0; - foreach (array_keys($aFile) as $sKey) - if ('//SkipDebug' == $aFile[$sKey]) - ++$nSkip; - else if ('//EndSkipDebug' == $aFile[$sKey]) - --$nSkip; - else if (0 == $nSkip) - $aParsed[] = $aFile[$sKey]; - unset($aFile); - - $compressedScript = xajaxCompressFile(implode('', $aParsed)); - - $sNewPath = $sPath; - $fH = @fopen($sNewPath, 'w'); - if (!$fH) { - trigger_error( - $this->objLanguageManager->getText('CMPRSPHP:WTERR:01') - . $sNewPath - . $this->objLanguageManager->getText('CMPRSPHP:WTERR:02') - , E_USER_ERROR - ); - } - else { - fwrite($fH, $compressedScript); - fclose($fH); - } - } - } - } - } - - closedir($handle); - } - } - - function _compile($sFolder=null, $bWriteFile=true) - { - if (null == $sFolder) - $sFolder = dirname(__FILE__); - - require_once(dirname(__FILE__) . '/xajaxCompress.inc.php'); - - $aOutput = array(); - - if ($handle = opendir($sFolder)) { - while (!(false === ($sName = readdir($handle)))) { - if ('.' != $sName && '..' != $sName && is_dir($sFolder . '/' . $sName)) { - $aOutput[] = $this->_compile($sFolder . '/' . $sName, false); - } else if (8 < strlen($sName)) { - if ('.inc.php' == substr($sName, strlen($sName) - 8, 8)) { - $sName = substr($sName, 0, strlen($sName) - 8); - $sPath = $sFolder . '/' . $sName . '.inc.php'; - if ( - 'xajaxAIO' != $sName && - 'legacy' != $sName && - 'xajaxCompress' != $sName - ) { - if (file_exists($sPath)) { - - $aParsed = array(); - $aFile = file($sPath); - $nSkip = 0; - foreach (array_keys($aFile) as $sKey) - if ('//SkipDebug' == substr($aFile[$sKey], 0, 11)) - ++$nSkip; - else if ('//EndSkipDebug' == substr($aFile[$sKey], 0, 14)) - --$nSkip; - else if ('//SkipAIO' == substr($aFile[$sKey], 0, 9)) - ++$nSkip; - else if ('//EndSkipAIO' == substr($aFile[$sKey], 0, 12)) - --$nSkip; - else if ('<'.'?php' == substr($aFile[$sKey], 0, 5)) {} - else if ('?'.'>' == substr($aFile[$sKey], 0, 2)) {} - else if (0 == $nSkip) - $aParsed[] = $aFile[$sKey]; - unset($aFile); - - $aOutput[] = xajaxCompressFile(implode('', $aParsed)); - } - } - } - } - } - - closedir($handle); - } - - if ($bWriteFile) - { - $fH = @fopen($sFolder . '/xajaxAIO.inc.php', 'w'); - if (!$fH) { - trigger_error( - $this->objLanguageManager->getText('CMPRSAIO:WTERR:01') - . $sFolder - . $this->objLanguageManager->getText('CMPRSAIO:WTERR:02') - , E_USER_ERROR - ); - } - else { - fwrite($fH, '<'.'?php '); - fwrite($fH, implode('', $aOutput)); - fclose($fH); - } - } - - return implode('', $aOutput); - } - - /* - Function: _detectURI - - Returns the current requests URL based upon the SERVER vars. - - Returns: - - string : The URL of the current request. - */ - function _detectURI() { - $aURL = array(); - - // Try to get the request URL - if (!empty($_SERVER['REQUEST_URI'])) { - - $_SERVER['REQUEST_URI'] = str_replace( - array('"',"'",'<','>'), - array('%22','%27','%3C','%3E'), - $_SERVER['REQUEST_URI'] - ); - - $aURL = parse_url($_SERVER['REQUEST_URI']); - } - - // Fill in the empty values - if (empty($aURL['scheme'])) { - if (!empty($_SERVER['HTTP_SCHEME'])) { - $aURL['scheme'] = $_SERVER['HTTP_SCHEME']; - } else { - $aURL['scheme'] = - (!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) != 'off') - ? 'https' - : 'http'; - } - } - - if (empty($aURL['host'])) { - if (!empty($_SERVER['HTTP_X_FORWARDED_HOST'])) { - if (strpos($_SERVER['HTTP_X_FORWARDED_HOST'], ':') > 0) { - list($aURL['host'], $aURL['port']) = explode(':', $_SERVER['HTTP_X_FORWARDED_HOST']); - } else { - $aURL['host'] = $_SERVER['HTTP_X_FORWARDED_HOST']; - } - } else if (!empty($_SERVER['HTTP_HOST'])) { - if (strpos($_SERVER['HTTP_HOST'], ':') > 0) { - list($aURL['host'], $aURL['port']) = explode(':', $_SERVER['HTTP_HOST']); - } else { - $aURL['host'] = $_SERVER['HTTP_HOST']; - } - } else if (!empty($_SERVER['SERVER_NAME'])) { - $aURL['host'] = $_SERVER['SERVER_NAME']; - } else { - echo $this->objLanguageManager->getText('DTCTURI:01'); - echo $this->objLanguageManager->getText('DTCTURI:02'); - exit(); - } - } - - if (empty($aURL['port']) && !empty($_SERVER['SERVER_PORT'])) { - $aURL['port'] = $_SERVER['SERVER_PORT']; - } - - if (!empty($aURL['path'])) - if (0 == strlen(basename($aURL['path']))) - unset($aURL['path']); - - if (empty($aURL['path'])) { - $sPath = array(); - if (!empty($_SERVER['PATH_INFO'])) { - $sPath = parse_url($_SERVER['PATH_INFO']); - } else { - $sPath = parse_url($_SERVER['PHP_SELF']); - } - if (isset($sPath['path'])) - $aURL['path'] = str_replace(array('"',"'",'<','>'), array('%22','%27','%3C','%3E'), $sPath['path']); - unset($sPath); - } - - if (empty($aURL['query']) && !empty($_SERVER['QUERY_STRING'])) { - $aURL['query'] = $_SERVER['QUERY_STRING']; - } - - if (!empty($aURL['query'])) { - $aURL['query'] = '?'.$aURL['query']; - } - - // Build the URL: Start with scheme, user and pass - $sURL = $aURL['scheme'].'://'; - if (!empty($aURL['user'])) { - $sURL.= $aURL['user']; - if (!empty($aURL['pass'])) { - $sURL.= ':'.$aURL['pass']; - } - $sURL.= '@'; - } - - // Add the host - $sURL.= $aURL['host']; - - // Add the port if needed - if (!empty($aURL['port']) - && (($aURL['scheme'] == 'http' && $aURL['port'] != 80) - || ($aURL['scheme'] == 'https' && $aURL['port'] != 443))) { - $sURL.= ':'.$aURL['port']; - } - - // Add the path and the query string - $sURL.= $aURL['path'].@$aURL['query']; - - // Clean up - unset($aURL); - - $aURL = explode("?", $sURL); - - if (1 < count($aURL)) - { - $aQueries = explode("&", $aURL[1]); - - foreach ($aQueries as $sKey => $sQuery) - { - if ("xjxGenerate" == substr($sQuery, 0, 11)) - unset($aQueries[$sKey]); - } - - $sQueries = implode("&", $aQueries); - - $aURL[1] = $sQueries; - - $sURL = implode("?", $aURL); - } - - return $sURL; - } - - - /* - Deprecated functions - */ - - /* - Function: setCharEncoding - - Sets the character encoding that will be used for the HTTP output. - Typically, you will not need to use this method since the default - character encoding can be configured using the constant - . - - Parameters: - - sEncoding - (string): The encoding to use. - - examples include (UTF-8, ISO-8859-1) - - Note: - deprecated : This function will be removed in future versions. Please - use configure> instead. - */ - function setCharEncoding($sEncoding) - { - $this->configure('characterEncoding', $sEncoding); - } - - /* - Function: getCharEncoding - - Returns the current character encoding. See also setCharEncoding> - and - - Returns: - - string : The character encoding. - - Note: - deprecated : This function will be removed in future versions. Please - use getConfiguration> instead. - */ - function getCharEncoding() - { - return $this->getConfiguration('characterEncoding'); - } - - /* - Function: setFlags - - Sets a series of flags. See also, setFlag>. - - Parameters: - - flags - (array): An associative array containing the name of the flag - and the value to set. - - Note: - deprecated : This function will be removed in future versions. Please - use configureMany> instead. - */ - function setFlags($flags) - { - foreach ($flags as $name => $value) { - $this->configure($name, $value); - } - } - - /* - Function: setFlag - - Sets a single flag (boolean true or false). - - Available flags are as follows (flag, default value): - - debug, false - - verbose, false - - statusMessages, false - - waitCursor, true - - scriptDeferral, false - - exitAllowed, true - - errorHandler, false - - cleanBuffer, false - - decodeUTF8Input, false - - outputEntities, false - - allowBlankResponse, false - - allowAllResponseTypes, false - - generateStubs, true - - Parameters: - - name - (string): The name of the flag to set. - value - (boolean): The value to set. - - Note: - - deprecated : This function will be removed in future versions. Please - use configure> instead. - */ - function setFlag($name, $value) - { - $this->configure($name, $value); - - } - - /* - Function: getFlag - - Returns the current value of the flag. See also setFlag>. - - Parameters: - - name - (string): The name of the flag. - - Returns: - - boolean : The value currently associated with the flag. - - Note: - deprecated : This function will be removed in future versions. Instead, - use getConfiguration>. - */ - function getFlag($name) - { - return $this->getConfiguration($name); - } - - /* - Function: setRequestURI - - Sets the URI to which requests will be sent. - - Parameters: - - sRequestURI - (string): The URI - - Note: - - $xajax->setRequestURI("http://www.xajaxproject.org"); - - deprecated : This function will be removed in future versions. Please - use configure> instead. - */ - function setRequestURI($sRequestURI) - { - $this->configure('requestURI', $sRequestURI); - } - - /* - Function: getRequestURI - - Returns: - - string : The current request URI that will be configured on the client - side. This is the default URI for all requests made from the current - page. See setRequestURI>. - - Note: - deprecated : This function will be removed in future versions. Please - use getConfiguration> instead. - */ - function getRequestURI() - { - return $this->getConfiguration('requestURI'); - } - - /* - Function: setDefaultMode - - Sets the default mode for requests from the browser. - - Parameters: - - sDefaultMode - (string): The mode to set as the default. - - - 'synchronous' - - 'asynchronous' - - Note: - deprecated : This function will be removed in future versions. Please - use configure> instead. - */ - function setDefaultMode($sDefaultMode) - { - $this->configure('defaultMode', $sDefaultMode); - } - - /* - Function: getDefaultMode - - Get the default request mode that will be used by the browser - for submitting requests to the server. See also setDefaultMode> - - Returns: - - string - The default mode to be used by the browser for each - request. - - Note: - deprecated : This function will be removed in future versions. Please - use getConfiguration> instead. - */ - function getDefaultMode() - { - return $this->getConfiguration('defaultMode'); - } - - /* - Function: setDefaultMethod - - Sets the default method for making xajax requests. - - Parameters: - - sMethod - (string): The name of the method. - - - 'GET' - - 'POST' - Note: - deprecated : This function will be removed in future versions. Please - use configure> instead. - */ - function setDefaultMethod($sMethod) - { - $this->configure('defaultMethod', $sMethod); - } - - /* - Function: getDefaultMethod - - Gets the default method for making xajax requests. - - Returns: - - string - The current method configured. - - Note: - deprecated : This function will be removed in future versions. Please - use getConfiguration> instead. - */ - function getDefaultMethod() - { - return $this->getConfiguration('defaultMethod'); - } - - /* - Function: setWrapperPrefix - - Sets the prefix that will be prepended to the javascript wrapper - functions. This allows a little flexibility in setting the naming - for the wrapper functions. - - Parameters: - - sPrefix - (string): The prefix to be used. - - default is 'xajax_' - - Note: - deprecated : This function will be removed in future versions. Please - use configure> instead. - */ - function setWrapperPrefix($sPrefix) - { - $this->configure('wrapperPrefix', $sPrefix); - } - - /* - Function: getWrapperPrefix - - Gets the current javascript wrapper prefix. See also, setWrapperPrefix> - - Returns: - - string - The current wrapper prefix. - - Note: - deprecated : This function will be removed in future versions. Please - use getConfiguration> instead. - */ - function getWrapperPrefix() - { - return $this->getConfiguration('wrapperPrefix'); - } - - /* - Function: setLogFile - - Specifies a log file that will be written to by xajax during a - request. This is only used by the error handling system at this - point. If you do not invoke this method or you pass in an empty - string, then no log file will be written to. - - Parameters: - - sFilename - (string): The full or reletive path to the log file. - - Note: - deprecated : This function will be removed in future versions. Please - use configure> instead. - */ - function setLogFile($sFilename) - { - $this->configure('logFile', $sFilename); - } - - /* - Function: getLogFile - - Returns the current log file path. See also setLogFile>. - - Returns: - - string : The log file path. - - Note: - deprecated : This function will be removed in future versions. Please - use getConfiguration> instead. - */ - function getLogFile() - { - return $this->getConfiguration('logFile'); - } - - /* - Function: registerFunction - - Registers a PHP function or method with the xajax request processor. This - makes the function available to the browser via an asynchronous - (or synchronous) javascript call. - - Parameters: - - mFunction - (string or array): The string containing the function name - or an array containing the following: - - (string) The function name as it will be called from javascript. - - (object, by reference) A reference to an instance of a class - containing the specified function. - - (string) The function as it is found in the class passed in the second - parameter. - sIncludeFile - (string, optional): The server path to the PHP file to - include when calling this function. This will enable xajax to load - only the include file that is needed for this function call, thus - reducing server load. - - Note: - deprecated : This function will be removed in future versions. Please - use register> instead. - */ - function registerFunction($mFunction, $sIncludeFile=null) - { - $xuf = new xajaxUserFunction($mFunction, $sIncludeFile); - return $this->register(XAJAX_FUNCTION, $xuf); - } - - /* - Function: registerCallableObject - - Registers an object whose methods will be searched for a match to the - incoming request. If more than one callable object is registered, the - first on that contains the requested method will be used. - - Parameters: - - oObject - (object, by reference): The object whose methods will be - registered. - - Note: - deprecated : This function will be removed in future versions. Please - use register> instead. - */ - function registerCallableObject(&$oObject) - { - $mResult = false; - - if (0 > version_compare(PHP_VERSION, '5.0')) - // for PHP4; using eval because PHP5 will complain it is deprecated - eval('$mResult = $this->register(XAJAX_CALLABLE_OBJECT, &$oObject);'); - else - // for PHP5 - $mResult = $this->register(XAJAX_CALLABLE_OBJECT, $oObject); - - return $mResult; - } - - /* - Function: registerEvent - - Assigns a callback function with the specified xajax event. Events - are triggered during the processing of a request. - - List: Available events: - - beforeProcessing: triggered before the request is processed. - - afterProcessing: triggered after the request is processed. - - invalidRequest: triggered if no matching function/method is found. - - Parameters: - - mCallback - (function): The function or object callback to be assigned. - sEventName - (string): The name of the event. - - Note: - deprecated : This function will be removed in future versions. Please - use register> instead. - */ - function registerEvent($sEventName, $mCallback) - { - $this->register(XAJAX_PROCESSING_EVENT, $sEventName, $mCallback); - } - -} - -/* - Section: Global functions -*/ - -/* - Function xajaxErrorHandler - - This function is registered with PHP's set_error_handler if the xajax - error handling system is enabled. - - See bUserErrorHandler> -*/ -function xajaxErrorHandler($errno, $errstr, $errfile, $errline) -{ - $errorReporting = error_reporting(); - if (($errno & $errorReporting) == 0) return; - - if ($errno == E_NOTICE) { - $errTypeStr = 'NOTICE'; - } - else if ($errno == E_WARNING) { - $errTypeStr = 'WARNING'; - } - else if ($errno == E_USER_NOTICE) { - $errTypeStr = 'USER NOTICE'; - } - else if ($errno == E_USER_WARNING) { - $errTypeStr = 'USER WARNING'; - } - else if ($errno == E_USER_ERROR) { - $errTypeStr = 'USER FATAL ERROR'; - } - else if (defined('E_STRICT') && $errno == E_STRICT) { - return; - } - else { - $errTypeStr = 'UNKNOWN: ' . $errno; - } - - $sCrLf = "\n"; - - ob_start(); - echo $GLOBALS['xajaxErrorHandlerText']; - echo $sCrLf; - echo '----'; - echo $sCrLf; - echo '['; - echo $errTypeStr; - echo '] '; - echo $errstr; - echo $sCrLf; - echo 'Error on line '; - echo $errline; - echo ' of file '; - echo $errfile; - $GLOBALS['xajaxErrorHandlerText'] = ob_get_clean(); -} - diff --git a/phpgwapi/inc/xajax/xajax_core/xajaxArgumentManager.inc.php b/phpgwapi/inc/xajax/xajax_core/xajaxArgumentManager.inc.php deleted file mode 100644 index aa803edb2f..0000000000 --- a/phpgwapi/inc/xajax/xajax_core/xajaxArgumentManager.inc.php +++ /dev/null @@ -1,466 +0,0 @@ - for a detailed description, copyright - and license information. -*/ - -/* - @package xajax - @version $Id: xajaxArgumentManager.inc.php 362 2007-05-29 15:32:24Z calltoconstruct $ - @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson - @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson - @license http://www.xajaxproject.org/bsd_license.txt BSD License -*/ - -if (!defined('XAJAX_METHOD_UNKNOWN')) define('XAJAX_METHOD_UNKNOWN', 0); -if (!defined('XAJAX_METHOD_GET')) define('XAJAX_METHOD_GET', 1); -if (!defined('XAJAX_METHOD_POST')) define('XAJAX_METHOD_POST', 2); - -/* - Class: xajaxArgumentManager - - This class processes the input arguments from the GET or POST data of - the request. If this is a request for the initial page load, no arguments - will be processed. During a xajax request, any arguments found in the - GET or POST will be converted to a PHP array. -*/ -class xajaxArgumentManager -{ - /* - Array: aArgs - - An array of arguments received via the GET or POST parameter - xjxargs. - */ - var $aArgs; - - /* - Boolean: bDecodeUTF8Input - - A configuration option used to indicate whether input data should be - UTF8 decoded automatically. - */ - var $bDecodeUTF8Input; - - /* - String: sCharacterEncoding - - The character encoding in which the input data will be received. - */ - var $sCharacterEncoding; - - /* - Integer: nMethod - - Stores the method that was used to send the arguments from the client. Will - be one of: XAJAX_METHOD_UNKNOWN, XAJAX_METHOD_GET, XAJAX_METHOD_POST - */ - var $nMethod; - - /* - Array: aSequence - - Stores the decoding sequence table. - */ - var $aSequence; - - /* - Function: convertStringToBool - - Converts a string to a bool var. - - Parameters: - $sValue - (string): - - Returns: - (bool) : true / false - - */ - - function convertStringToBool($sValue) - { - if (0 == strcasecmp($sValue, 'true')) - return true; - if (0 == strcasecmp($sValue, 'false')) - return false; - if (is_numeric($sValue)) - { - if (0 == $sValue) - return false; - return true; - } - return false; - } - - function argumentStripSlashes(&$sArg) - { - if (false == is_string($sArg)) - return; - - $sArg = stripslashes($sArg); - } - - function argumentDecodeXML(&$sArg) - { - if (false == is_string($sArg)) - return; - - if (0 == strlen($sArg)) - return; - - $nStackDepth = 0; - $aStack = array(); - $aArg = array(); - - $nCurrent = 0; - $nLast = 0; - $aExpecting = array(); - $nFound = 0; - list($aExpecting, $nFound) = $this->aSequence['start']; - - $nLength = strlen($sArg); - - $sKey = ''; - $mValue = ''; - - while ($nCurrent < $nLength) - { - $bFound = false; - - foreach ($aExpecting as $sExpecting => $nExpectedLength) - { - if ($sArg[$nCurrent] == $sExpecting[0]) - { - if ($sExpecting == substr($sArg, $nCurrent, $nExpectedLength)) - { - list($aExpecting, $nFound) = $this->aSequence[$sExpecting]; - - switch ($nFound) - { - case 3: // k - $sKey = ''; - break; - case 4: // /k - $sKey = str_replace( - array('<'.'![CDATA[', ']]>'), - '', - substr($sArg, $nLast, $nCurrent - $nLast) - ); - break; - case 5: // v - $mValue = ''; - break; - case 6: // /v - if ($nLast < $nCurrent) - { - $mValue = str_replace( - array('<'.'![CDATA[', ']]>'), - '', - substr($sArg, $nLast, $nCurrent - $nLast) - ); - - $cType = substr($mValue, 0, 1); - $sValue = substr($mValue, 1); - switch ($cType) { - case 'S': $mValue = false === $sValue ? '' : $sValue; break; - case 'B': $mValue = $this->convertStringToBool($sValue); break; - case 'N': $mValue = floatval($sValue); break; - case '*': $mValue = null; break; - } - } - break; - case 7: // /e - $aArg[$sKey] = $mValue; - break; - case 1: // xjxobj - ++$nStackDepth; - array_push($aStack, $aArg); - $aArg = array(); - array_push($aStack, $sKey); - $sKey = ''; - break; - case 8: // /xjxobj - if (1 < $nStackDepth) { - $mValue = $aArg; - $sKey = array_pop($aStack); - $aArg = array_pop($aStack); - --$nStackDepth; - } else { - $sArg = $aArg; - return; - } - break; - } - $nCurrent += $nExpectedLength; - $nLast = $nCurrent; - $bFound = true; - break; - } - } - } - - if (false == $bFound) - { - if (0 == $nCurrent) - { - $sArg = str_replace( - array('<'.'![CDATA[', ']]>'), - '', - $sArg - ); - - $cType = substr($sArg, 0, 1); - $sValue = substr($sArg, 1); - switch ($cType) { - case 'S': $sArg = false === $sValue ? '' : $sValue; break; - case 'B': $sArg = $this->convertStringToBool($sValue); break; - case 'N': $sArg = floatval($sValue); break; - case '*': $sArg = null; break; - } - - return; - } - -// for larger arg data, performance may suffer using concatenation -// $sText .= $sArg[$nCurrent]; - $nCurrent++; - } - } - - $objLanguageManager =& xajaxLanguageManager::getInstance(); - - trigger_error( - $objLanguageManager->getText('ARGMGR:ERR:01') - . $sExpecting - . $objLanguageManager->getText('ARGMGR:ERR:02') - . $sArg - , E_USER_ERROR - ); - } - - function argumentDecodeUTF8_iconv(&$mArg) - { - if (is_array($mArg)) - { - foreach (array_keys($mArg) as $sKey) - { - $sNewKey = $sKey; - $this->argumentDecodeUTF8_iconv($sNewKey); - - if ($sNewKey != $sKey) - { - $mArg[$sNewKey] = $mArg[$sKey]; - unset($mArg[$sKey]); - $sKey = $sNewKey; - } - - $this->argumentDecodeUTF8_iconv($mArg[$sKey]); - } - } - else if (is_string($mArg)) - $mArg = iconv("UTF-8", $this->sCharacterEncoding.'//TRANSLIT', $mArg); - } - - function argumentDecodeUTF8_mb_convert_encoding(&$mArg) - { - if (is_array($mArg)) - { - foreach (array_keys($mArg) as $sKey) - { - $sNewKey = $sKey; - $this->argumentDecodeUTF8_mb_convert_encoding($sNewKey); - - if ($sNewKey != $sKey) - { - $mArg[$sNewKey] = $mArg[$sKey]; - unset($mArg[$sKey]); - $sKey = $sNewKey; - } - - $this->argumentDecodeUTF8_mb_convert_encoding($mArg[$sKey]); - } - } - else if (is_string($mArg)) - $mArg = mb_convert_encoding($mArg, $this->sCharacterEncoding, "UTF-8"); - } - - function argumentDecodeUTF8_utf8_decode(&$mArg) - { - if (is_array($mArg)) - { - foreach (array_keys($mArg) as $sKey) - { - $sNewKey = $sKey; - $this->argumentDecodeUTF8_utf8_decode($sNewKey); - - if ($sNewKey != $sKey) - { - $mArg[$sNewKey] = $mArg[$sKey]; - unset($mArg[$sKey]); - $sKey = $sNewKey; - } - - $this->argumentDecodeUTF8_utf8_decode($mArg[$sKey]); - } - } - else if (is_string($mArg)) - $mArg = utf8_decode($mArg); - } - - /* - Constructor: xajaxArgumentManager - - Initializes configuration settings to their default values and reads - the argument data from the GET or POST data. - */ - function xajaxArgumentManager() - { - $this->aArgs = array(); - - $this->bDecodeUTF8Input = false; - $this->sCharacterEncoding = 'UTF-8'; - $this->nMethod = XAJAX_METHOD_UNKNOWN; - - $this->aSequence = array( - '<'.'k'.'>' => array(array( - '<'.'/k'.'>' => 4 - ), 3), - '<'.'/k'.'>' => array(array( - '<'.'v'.'>' => 3, - '<'.'/e'.'>' => 4 - ), 4), - '<'.'v'.'>' => array(array( - '<'.'xjxobj'.'>' => 8, - '<'.'/v'.'>' => 4 - ), 5), - '<'.'/v'.'>' => array(array( - '<'.'/e'.'>' => 4, - '<'.'k'.'>' => 3 - ), 6), - '<'.'e'.'>' => array(array( - '<'.'k'.'>' => 3, - '<'.'v'.'>' => 3, - '<'.'/e'.'>' => 4 - ), 2), - '<'.'/e'.'>' => array(array( - '<'.'e'.'>' => 3, - '<'.'/xjxobj'.'>' => 9 - ), 7), - '<'.'xjxobj'.'>' => array(array( - '<'.'e'.'>' => 3, - '<'.'/xjxobj'.'>' => 9 - ), 1), - '<'.'/xjxobj'.'>' => array(array( - '<'.'/v'.'>' => 4 - ), 8), - 'start' => array(array( - '<'.'xjxobj'.'>' => 8 - ), 9) - ); - - if (isset($_POST['xjxargs'])) { - $this->nMethod = XAJAX_METHOD_POST; - $this->aArgs = $_POST['xjxargs']; - } else if (isset($_GET['xjxargs'])) { - $this->nMethod = XAJAX_METHOD_GET; - $this->aArgs = $_GET['xjxargs']; - } - - if (1 == get_magic_quotes_gpc()) - array_walk($this->aArgs, array(&$this, 'argumentStripSlashes')); - - array_walk($this->aArgs, array(&$this, 'argumentDecodeXML')); - } - - /* - Function: getInstance - - Returns: - - object - A reference to an instance of this class. This function is - used to implement the singleton pattern. - */ - function &getInstance() - { - static $obj; - if (!$obj) { - $obj = new xajaxArgumentManager(); - } - return $obj; - } - - /* - Function: configure - - Accepts configuration settings from the main object. - - Parameters: - - - The tracks the following configuration settings: - - - (boolean): See bDecodeUTF8Input> - - (string): See sCharacterEncoding> - */ - function configure($sName, $mValue) - { - if ('decodeUTF8Input' == $sName) { - if (true === $mValue || false === $mValue) - $this->bDecodeUTF8Input = $mValue; - } else if ('characterEncoding' == $sName) { - $this->sCharacterEncoding = $mValue; - } - } - - /* - Function: getRequestMethod - - Returns the method that was used to send the arguments from the client. - */ - function getRequestMethod() - { - return $this->nMethod; - } - - /* - Function: process - - Returns the array of arguments that were extracted and parsed from - the GET or POST data. - */ - function process() - { - if ($this->bDecodeUTF8Input) - { - $sFunction = ''; - - if (function_exists('iconv')) - $sFunction = "iconv"; - else if (function_exists('mb_convert_encoding')) - $sFunction = "mb_convert_encoding"; - else if ($this->sCharacterEncoding == "ISO-8859-1") - $sFunction = "utf8_decode"; - else { - $objLanguageManager =& xajaxLanguageManager::getInstance(); - trigger_error( - $objLanguageManager->getText('ARGMGR:ERR:03') - , E_USER_NOTICE - ); - } - - $mFunction = array(&$this, 'argumentDecodeUTF8_' . $sFunction); - - array_walk($this->aArgs, $mFunction); - - $this->bDecodeUTF8Input = false; - } - - return $this->aArgs; - } -} diff --git a/phpgwapi/inc/xajax/xajax_core/xajaxCall.inc.php b/phpgwapi/inc/xajax/xajax_core/xajaxCall.inc.php deleted file mode 100644 index 83243f9f43..0000000000 --- a/phpgwapi/inc/xajax/xajax_core/xajaxCall.inc.php +++ /dev/null @@ -1,389 +0,0 @@ - for a detailed description, copyright - and license information. -*/ - -/* - @package xajax - @version $Id: xajaxCall.inc.php 362 2007-05-29 15:32:24Z calltoconstruct $ - @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson - @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson - @license http://www.xajaxproject.org/bsd_license.txt BSD License -*/ - -/* - Class: xajaxCall - - Create a piece of javascript code that will invoke the - function. - - This class is deprecated and will be removed in future versions; please use - instead. -*/ -class xajaxCall { - - /**#@+ - * @access protected - */ - - /* - String: sFunction - - Required: The name of the xajax enabled function to call - */ - var $sFunction; - - /* - String: sReturnValue - - Required: The value to return once the has - returned. (for asynchronous calls, this is immediate) - */ - var $sReturnValue; - - /* - Array: aParameters - - The associative array that will be used to store the parameters for this - call. - - key: The textual representation of the parameter. - - value: A boolean value indicating whether or not to use quotes around - this parameter. - */ - var $aParameters; - - /* - String: sMode - - The mode to use for the call - - 'synchronous' - - 'asynchronous' - */ - var $sMode; - - /* - String: sRequestType - - The request type that will be used for the call - - 'GET' - - 'POST' - */ - var $sRequestType; - - /* - String: sResponseProcessor - - The name of the javascript function that will be invoked - to handle the response. - */ - var $sResponseProcessor; - - /* - String: sRequestURI - - The URI for where this request will be sent. - */ - var $sRequestURI; - - /* - String: sContentType - - The content type to use for the request. - */ - var $sContentType; - - /* - Constructor: xajaxCall - - Initializes the xajaxCall object. - - Parameters: - - sFunction - (string): The name of the xajax enabled function - that will be invoked when this javascript code is executed - on the browser. This function name should match a PHP - function from your script. - */ - function xajaxCall($sFunction = '') { - $this->sFunction = $sFunction; - $this->aParameters = array(); - $this->sMode = ''; - $this->sRequestType = ''; - $this->sResponseProcessor = ''; - $this->sRequestURI = ''; - $this->sContentType = ''; - } - - /* - Function: setFunction - - Override the function name set in the constructor. - - Parameters: - - sFunction - (string): The name of the xajax enabled function - that will be invoked when this javascript code is executed - on the browser. This function name should match a PHP - function from your script. - - Returns: - - object : The object. - */ - function setFunction($sFunction) { - $this->sFunction = $sFunction; - return $this; - } - - /* - Function: clearParameters - - Clear the list of parameters being accumulated for this - call. - - Returns: - - object : The object. - */ - function clearParameters() { - $this->aParameters = array(); - } - - /* - Function: addParameter - - Adds a parameter to the list that will be specified for the - request generated by this object. - - Parameters: - - sParameter - (string): The parameter value or name. - bUseQuotes - (boolean): Whether or not to put quotes around this value. - - If you specify the name of a javascript variable, or provide a javascript - function call as a parameter, do not use quotes around the value. - - Returns: - - object : The object. - */ - function addParameter($sParameter, $bUseQuotes = true) { - $this->aParameters[] = array($sParameter, $bUseQuotes); - return $this; - } - - /* - Function: addFormValuesParameter - - Add a parameter value that is the result of calling - for the specified form. - - Parameters: - - sFormID - (string): The id of the form for which you wish to return - the input values. - - Returns: - - object : The object. - */ - function addFormValuesParameter($sFormID) { - $this->aParameters[] = array('xajax.getFormValues("'.$sFormID.'")'); - return $this; - } - - /* - Function: setMode - - Sets the mode that will be specified for this - - Parameters: - - $sMode - (string): The mode to be set. - - 'synchronous' - - 'asynchronous' - - Returns: - - object : The object. - */ - function setMode($sMode) { - $this->sMode = $sMode; - return $this; - } - - /* - Function: setRequestType - - Sets the request type which will be specified for the - generated . - - Parameters: - - - 'GET' - - 'POST' - - Returns: - - object : The object. - */ - function setRequestType($sRequestType) { - $this->sRequestType = $sRequestType; - return $this; - } - - /* - Function: setResponseProcessor - - Sets the name of the javascript function that will be used - to process this response. This is an advanced function, use - with caution. - - Parameters: - - Returns: - - object : The object. - */ - function setResponseProcessor($sResponseProcessor) { - $this->sResponseProcessor = $sResponseProcessor; - return $this; - } - - /* - Function: setRequestURI - - Override the default URI with the specified one. - - Parameters: - - sRequestURI - (string): The URI that the generated request will be sent - to. - - Returns: - - object : The object. - */ - function setRequestURI($sRequestURI) { - $this->sRequestURI = $sRequestURI; - return $this; - } - - /* - Function: setContentType - - Sets the content type that will be used by the generated request. - - Parameters: - - Returns: - - object : The object. - */ - function setContentType($sContentType) { - $this->sContentType = $sContentType; - } - - /* - Function: setReturnValue - - Sets the value that will be returned after the generated call. - Set to an empty string if no return value is desired. - - Parameters: - - Returns: - - object : The object. - */ - function setReturnValue($sReturnValue) { - $this->sReturnValue = $sReturnValue; - } - - /* - Function: generate - - Construct a statement in javascript that can be used - to make a xajax request with the parameters and settings previously - configured for this object. - - The output from this function can be used as an event handler in your - javascript code. - - Returns: - - string - The javascript statement that will invoked the - function on the browser, causing a xajax request to be sent to - the server. - */ - function generate() { - $output = 'xajax.call("'; - $output .= $this->sFunction; - $output .= '", {'; - $separator = ''; - if (0 < count($this->aParameters)) { - $output .= 'parameters: ['; - foreach ($this->aParameters as $aParameter) { - $output .= $separator; - $bUseQuotes = $aParameter[1]; - if ($bUseQuotes) - $output .= '"'; - $output .= $aParameter[0]; - if ($bUseQuotes) - $output .= '"'; - $separator = ','; - } - $output .= ']'; - } - if (0 < strlen($this->sMode)) { - $output .= $separator; - $output .= 'mode:"'; - $output .= $this->sMode; - $output .= '"'; - $separator = ','; - } - if (0 < strlen($this->sRequestType)) { - $output .= $separator; - $output .= 'requestType:"'; - $output .= $this->sRequestType; - $output .= '"'; - $separator = ','; - } - if (0 < strlen($this->sResponseProcessor)) { - $output .= $separator; - $output .= 'responseProcessor:'; - $output .= $this->sResponseProcessor; - $separator = ','; - } - if (0 < strlen($this->sRequestURI)) { - $output .= $separator; - $output .= 'requestURI:"'; - $output .= $this->sRequestURI; - $output .= '"'; - $separator = ','; - } - if (0 < strlen($this->sContentType)) { - $output .= $separator; - $output .= 'contentType:"'; - $output .= $this->sContentType; - $output .= '"'; - $separator = ','; - } - $output .= '}); '; - if (0 < strlen($this->sReturnValue)) { - $output .= 'return '; - $output .= $this->sReturnValue; - } else { - $output .= 'return false;'; - } - - return $output; - } -} diff --git a/phpgwapi/inc/xajax/xajax_core/xajaxCompress.inc.php b/phpgwapi/inc/xajax/xajax_core/xajaxCompress.inc.php deleted file mode 100644 index 5f68cd98aa..0000000000 --- a/phpgwapi/inc/xajax/xajax_core/xajaxCompress.inc.php +++ /dev/null @@ -1,148 +0,0 @@ - will call this function internally to compress the javascript code for - more efficient delivery. - - Parameters: - - $sFile - (stirng): The file to be compressed. -*/ -function xajaxCompressFile($sFile) -{ - //remove windows cariage returns - $sFile = str_replace("\r",'',$sFile); - - //array to store replaced literal strings - $literal_strings = array(); - - //explode the string into lines - $lines = explode("\n",$sFile); - //loop through all the lines, building a new string at the same time as removing literal strings - $clean = ''; - $inComment = false; - $literal = ''; - $inQuote = false; - $escaped = false; - $quoteChar = ''; - - $iLen = count($lines); - for($i=0; $i<$iLen; ++$i) - { - $line = $lines[$i]; - $inNormalComment = false; - - //loop through line's characters and take out any literal strings, replace them with ___i___ where i is the index of this string - $jLen = strlen($line); - for($j=0; $j<$jLen; ++$j) - { - $c = substr($line,$j,1); - $d = substr($line,$j,2); - - //look for start of quote - if(!$inQuote && !$inComment) - { - //is this character a quote or a comment - if(($c=='"' || $c=="'") && !$inComment && !$inNormalComment) - { - $inQuote = true; - $inComment = false; - $escaped = false; - $quoteChar = $c; - $literal = $c; - } - else if($d=="/*" && !$inNormalComment) - { - $inQuote = false; - $inComment = true; - $escaped = false; - $quoteChar = $d; - $literal = $d; - $j++; - } - else if($d=="//") //ignore string markers that are found inside comments - { - $inNormalComment = true; - } - else - { - if (!$inNormalComment) - $clean .= $c; - } - } - else //allready in a string so find end quote - { - if($c == $quoteChar && !$escaped && !$inComment) - { - $inQuote = false; - $literal .= $c; - - //subsitute in a marker for the string - $clean .= "___" . count($literal_strings) . "___"; - - //push the string onto our array - array_push($literal_strings,$literal); - - } - else if($inComment && $d=="*/") - { - $inComment = false; - $literal .= $d; - ++$j; - } - else if($c == "\\" && !$escaped) - $escaped = true; - else - $escaped = false; - - $literal .= $c; - } - } - if($inComment) $literal .= "\n"; - $clean .= "\n"; - } - //explode the clean string into lines again - $lines = explode("\n",$clean); - - //now process each line at a time - $iLen = count($lines); - for($i=0; $i<$iLen; ++$i) - { - $line = $lines[$i]; - - //remove comments - $line = preg_replace("/\/\/(.*)/","",$line); - - //strip leading and trailing whitespace - $line = trim($line); - - //remove all whitespace with a single space - $line = preg_replace("/\s+/"," ",$line); - - //remove any whitespace that occurs after/before an operator - $line = preg_replace("/\s*([!\}\{;,&=\|\-\+\*\/\)\(:])\s*/","\\1",$line); - - $lines[$i] = $line; - } - - //implode the lines - $sFile = implode("\n",$lines); - - //make sure there is a max of 1 \n after each line - $sFile = preg_replace("/[\n]+/","\n",$sFile); - - //strip out line breaks that immediately follow a semi-colon - $sFile = preg_replace("/;\n/",";",$sFile); - - //curly brackets aren't on their own - $sFile = preg_replace("/[\n]*\{[\n]*/","{",$sFile); - - //finally loop through and replace all the literal strings: - $iLen = count($literal_strings); - for($i=0; $i<$iLen; ++$i) - $sFile = str_replace('___'.$i.'___',$literal_strings[$i],$sFile); - - return $sFile; -} diff --git a/phpgwapi/inc/xajax/xajax_core/xajaxControl.inc.php b/phpgwapi/inc/xajax/xajax_core/xajaxControl.inc.php deleted file mode 100644 index 4e413a1709..0000000000 --- a/phpgwapi/inc/xajax/xajax_core/xajaxControl.inc.php +++ /dev/null @@ -1,682 +0,0 @@ - for a detailed description, copyright - and license information. -*/ - -/* - @package xajax - @version $Id: xajaxControl.inc.php 362 2007-05-29 15:32:24Z calltoconstruct $ - @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson - @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson - @license http://www.xajaxproject.org/bsd_license.txt BSD License -*/ - -/* - Constant: XAJAX_HTML_CONTROL_DOCTYPE_FORMAT - - Defines the doctype of the current document; this will effect how the HTML is formatted - when the html control library is used to construct html documents and fragments. This can - be one of the following values: - - 'XHTML' - (default) Typical effects are that certain elements are closed with '/>' - 'HTML' - Typical differences are that closing tags for certain elements cannot be '/>' -*/ -if (false == defined('XAJAX_HTML_CONTROL_DOCTYPE_FORMAT')) define('XAJAX_HTML_CONTROL_DOCTYPE_FORMAT', 'XHTML'); - -/* - Constant: XAJAX_HTML_CONTROL_DOCTYPE_VERSION -*/ -if (false == defined('XAJAX_HTML_CONTROL_DOCTYPE_VERSION')) define('XAJAX_HTML_CONTROL_DOCTYPE_VERSION', '1.0'); - -/* - Constant: XAJAX_HTML_CONTROL_DOCTYPE_VALIDATION -*/ -if (false == defined('XAJAX_HTML_CONTROL_DOCTYPE_VALIDATION')) define('XAJAX_HTML_CONTROL_DOCTYPE_VALIDATION', 'TRANSITIONAL'); - -/* - Class: xajaxControl - - The base class for all xajax enabled controls. Derived classes will generate the - HTML and javascript code that will be sent to the browser via printHTML> - or sent to the browser in a via getHTML>. -*/ -class xajaxControl -{ - /* - String: sTag - */ - var $sTag; - - /* - Boolean: sEndTag - - 'required' - (default) Indicates the control must have a full end tag - 'optional' - The control may have an abbr. begin tag or a full end tag - 'forbidden' - The control must have an abbr. begin tag and no end tag - */ - var $sEndTag; - - /* - Array: aAttributes - - An associative array of attributes that will be used in the generation - of the HMTL code for this control. - */ - var $aAttributes; - - /* - Array: aEvents - - An associative array of events that will be assigned to this control. Each - event declaration will include a reference to a object; it's - script will be extracted using printScript> or - getScript>. - */ - var $aEvents; - - /* - String: sClass - - Contains a declaration of the class of this control. %inline controls do not - need to be indented, %block controls should be indented. - */ - var $sClass; - - /* - Function: xajaxControl - - Parameters: - - $aConfiguration - (array): An associative array that contains a variety - of configuration options for this object. - - Note: - This array may contain the following entries: - - 'attributes' - (array): An associative array containing attributes - that will be passed to the setAttribute> function. - - 'children' - (array): An array of derived objects that - will be the children of this control. - */ - function xajaxControl($sTag, $aConfiguration=array()) - { - $this->sTag = $sTag; - - $this->clearAttributes(); - - if (isset($aConfiguration['attributes'])) - if (is_array($aConfiguration['attributes'])) - foreach ($aConfiguration['attributes'] as $sKey => $sValue) - $this->setAttribute($sKey, $sValue); - - $this->clearEvents(); - - if (isset($aConfiguration['event'])) - call_user_func_array(array(&$this, 'setEvent'), $aConfiguration['event']); - - else if (isset($aConfiguration['events'])) - if (is_array($aConfiguration['events'])) - foreach ($aConfiguration['events'] as $aEvent) - call_user_func_array(array(&$this, 'setEvent'), $aEvent); - - $this->sClass = '%block'; - $this->sEndTag = 'forbidden'; - } - - /* - Function: getClass - - Returns the *adjusted* class of the element - */ - function getClass() - { - return $this->sClass; - } - - /* - Function: clearAttributes - - Removes all attributes assigned to this control. - */ - function clearAttributes() - { - $this->aAttributes = array(); - } - - /* - Function: setAttribute - - Call to set various control specific attributes to be included in the HTML - script that is returned when printHTML> or getHTML> - is called. - - Parameters: - $sName - (string): The attribute name to set the value. - $sValue - (string): The value to be set. - */ - function setAttribute($sName, $sValue) - { -//SkipDebug - if (class_exists('clsValidator')) - { - $objValidator =& clsValidator::getInstance(); - if (false == $objValidator->attributeValid($this->sTag, $sName)) { - $objLanguageManager =& xajaxLanguageManager::getInstance(); - trigger_error( - $objLanguageManager->getText('XJXCTL:IAERR:01') - . $sName - . $objLanguageManager->getText('XJXCTL:IAERR:02') - . $this->sTag - . $objLanguageManager->getText('XJXCTL:IAERR:03') - , E_USER_ERROR - ); - } - } -//EndSkipDebug - - $this->aAttributes[$sName] = $sValue; - } - - /* - Function: getAttribute - - Call to obtain the value currently associated with the specified attribute - if set. - - Parameters: - - sName - (string): The name of the attribute to be returned. - - Returns: - - mixed : The value associated with the attribute, or null. - */ - function getAttribute($sName) - { - if (false == isset($this->aAttributes[$sName])) - return null; - - return $this->aAttributes[$sName]; - } - - /* - Function: clearEvents - - Clear the events that have been associated with this object. - */ - function clearEvents() - { - $this->aEvents = array(); - } - - /* - Function: setEvent - - Call this function to assign a object as the handler for - the specific DOM event. The printScript> function will - be called to generate the javascript for this request. - - Parameters: - - sEvent - (string): A string containing the name of the event to be assigned. - objRequest - (xajaxRequest object): The object to be associated - with the specified event. - aParameters - (array, optional): An array containing parameter declarations - that will be passed to this object just before the javascript - is generated. - sBeforeRequest - (string, optional): a string containing a snippet of javascript code - to execute prior to calling the xajaxRequest function - sAfterRequest - (string, optional): a string containing a snippet of javascript code - to execute after calling the xajaxRequest function - */ - function setEvent($sEvent, &$objRequest, $aParameters=array(), $sBeforeRequest='', $sAfterRequest='; return false;') - { -//SkipDebug - if (false == is_a($objRequest, 'xajaxRequest')) { - $objLanguageManager =& xajaxLanguageManager::getInstance(); - trigger_error( - $objLanguageManager->getText('XJXCTL:IRERR:01') - . $this->backtrace() - , E_USER_ERROR - ); - } - - if (class_exists('clsValidator')) { - $objValidator =& clsValidator::getInstance(); - if (false == $objValidator->attributeValid($this->sTag, $sEvent)) { - $objLanguageManager =& xajaxLanguageManager::getInstance(); - trigger_error( - $objLanguageManager->getText('XJXCTL:IEERR:01') - . $sEvent - . $objLanguageManager->getText('XJXCTL:IEERR:02') - . $this->sTag - . $objLanguageManager->getText('XJXCTL:IEERR:03') - , E_USER_ERROR - ); - } - } -//EndSkipDebug - - $this->aEvents[$sEvent] = array( - &$objRequest, - $aParameters, - $sBeforeRequest, - $sAfterRequest - ); - } - - /* - Function: getHTML - - Generates and returns the HTML representation of this control and - it's children. - - Returns: - - string : The HTML representation of this control. - */ - function getHTML($bFormat=false) - { - ob_start(); - if ($bFormat) - $this->printHTML(); - else - $this->printHTML(false); - return ob_get_clean(); - } - - /* - Function: printHTML - - Generates and prints the HTML representation of this control and - it's children. - - Returns: - - string : The HTML representation of this control. - */ - function printHTML($sIndent='') - { -//SkipDebug - if (class_exists('clsValidator')) - { - $objValidator =& clsValidator::getInstance(); - $sMissing = ''; - if (false == $objValidator->checkRequiredAttributes($this->sTag, $this->aAttributes, $sMissing)) { - $objLanguageManager =& xajaxLanguageManager::getInstance(); - trigger_error( - $objLanguageManager->getText('XJXCTL:MAERR:01') - . $sMissing - . $objLanguageManager->getText('XJXCTL:MAERR:02') - . $this->sTag - . $objLanguageManager->getText('XJXCTL:MAERR:03') - , E_USER_ERROR - ); - } - } -//EndSkipDebug - - $sClass = $this->getClass(); - - if ('%inline' != $sClass) - // this odd syntax is necessary to detect request for no formatting - if (false === (false === $sIndent)) - echo $sIndent; - - echo '<'; - echo $this->sTag; - echo ' '; - $this->_printAttributes(); - $this->_printEvents(); - - if ('forbidden' == $this->sEndTag) - { - if ('HTML' == XAJAX_HTML_CONTROL_DOCTYPE_FORMAT) - echo '>'; - else if ('XHTML' == XAJAX_HTML_CONTROL_DOCTYPE_FORMAT) - echo '/>'; - - if ('%inline' != $sClass) - // this odd syntax is necessary to detect request for no formatting - if (false === (false === $sIndent)) - echo "\n"; - - return; - } - else if ('optional' == $this->sEndTag) - { - echo '/>'; - - if ('%inline' == $sClass) - // this odd syntax is necessary to detect request for no formatting - if (false === (false === $sIndent)) - echo "\n"; - - return; - } -//SkipDebug - else - { - $objLanguageManager =& xajaxLanguageManager::getInstance(); - trigger_error( - $objLanguageManager->getText('XJXCTL:IETERR:01') - . $this->backtrace() - , E_USER_ERROR - ); - } -//EndSkipDebug - } - - function _printAttributes() - { - // NOTE: Special case here: disabled='false' does not work in HTML; does work in javascript - foreach ($this->aAttributes as $sKey => $sValue) - if ('disabled' != $sKey || 'false' != $sValue) - echo "{$sKey}='{$sValue}' "; - } - - function _printEvents() - { - foreach (array_keys($this->aEvents) as $sKey) - { - $aEvent =& $this->aEvents[$sKey]; - $objRequest =& $aEvent[0]; - $aParameters = $aEvent[1]; - $sBeforeRequest = $aEvent[2]; - $sAfterRequest = $aEvent[3]; - - foreach ($aParameters as $aParameter) - { - $nParameter = $aParameter[0]; - $sType = $aParameter[1]; - $sValue = $aParameter[2]; - $objRequest->setParameter($nParameter, $sType, $sValue); - } - - $objRequest->useDoubleQuote(); - - echo "{$sKey}='{$sBeforeRequest}"; - - $objRequest->printScript(); - - echo "{$sAfterRequest}' "; - } - } - - function backtrace() - { - // debug_backtrace was added to php in version 4.3.0 - // version_compare was added to php in version 4.0.7 - if (0 <= version_compare(PHP_VERSION, '4.3.0')) - return '
    Backtrace:
    ' 
    -				. print_r(debug_backtrace(), true) 
    -				. '
    '; - return ''; - } -} - -/* - Class: xajaxControlContainer - - This class is used as the base class for controls that will contain - other child controls. -*/ -class xajaxControlContainer extends xajaxControl -{ - /* - Array: aChildren - - An array of child controls. - */ - var $aChildren; - - /* - Boolean: sChildClass - - Will contain '%inline' if all children are class = '%inline', '%block' if all children are '%block' or - '%flow' if both '%inline' and '%block' elements are detected. - */ - var $sChildClass; - - /* - Function: xajaxControlContainer - - Called to construct and configure this control. - - Parameters: - - aConfiguration - (array): See xajaxControl> for more - information. - */ - function xajaxControlContainer($sTag, $aConfiguration=array()) - { - xajaxControl::xajaxControl($sTag, $aConfiguration); - - $this->clearChildren(); - - if (isset($aConfiguration['child'])) - $this->addChild($aConfiguration['child']); - - else if (isset($aConfiguration['children'])) - $this->addChildren($aConfiguration['children']); - - $this->sEndTag = 'required'; - } - - /* - Function: getClass - - Returns the *adjusted* class of the element - */ - function getClass() - { - $sClass = xajaxControl::getClass(); - - if (0 < count($this->aChildren) && '%flow' == $sClass) - return $this->getContentClass(); - else if (0 == count($this->aChildren) || '%inline' == $sClass || '%block' == $sClass) - return $sClass; - - $objLanguageManager =& xajaxLanguageManager::getInstance(); - trigger_error( - $objLanguageManager->getText('XJXCTL:ICERR:01') - . $this->backtrace() - , E_USER_ERROR - ); - } - - /* - Function: getContentClass - - Returns the *adjusted* class of the content (children) of this element - */ - function getContentClass() - { - $sClass = ''; - - foreach (array_keys($this->aChildren) as $sKey) - { - if ('' == $sClass) - $sClass = $this->aChildren[$sKey]->getClass(); - else if ($sClass != $this->aChildren[$sKey]->getClass()) - return '%flow'; - } - - if ('' == $sClass) - return '%inline'; - - return $sClass; - } - - /* - Function: clearChildren - - Clears the list of child controls associated with this control. - */ - function clearChildren() - { - $this->sChildClass = '%inline'; - $this->aChildren = array(); - } - - /* - Function: addChild - - Adds a control to the array of child controls. Child controls - must be derived from . - */ - function addChild(&$objControl) - { -//SkipDebug - if (false == is_a($objControl, 'xajaxControl')) { - $objLanguageManager =& xajaxLanguageManager::getInstance(); - trigger_error( - $objLanguageManager->getText('XJXCTL:ICLERR:01') - . $this->backtrace() - , E_USER_ERROR - ); - } - - if (class_exists('clsValidator')) - { - $objValidator =& clsValidator::getInstance(); - if (false == $objValidator->childValid($this->sTag, $objControl->sTag)) { - $objLanguageManager =& xajaxLanguageManager::getInstance(); - trigger_error( - $objLanguageManager->getText('XJXCTL:ICLERR:02') - . $objControl->sTag - . $objLanguageManager->getText('XJXCTL:ICLERR:03') - . $this->sTag - . $objLanguageManager->getText('XJXCTL:ICLERR:04') - . $this->backtrace() - , E_USER_ERROR - ); - } - } -//EndSkipDebug - - $this->aChildren[] =& $objControl; - } - - function addChildren(&$aChildren) - { -//SkipDebug - if (false == is_array($aChildren)) { - $objLanguageManager =& xajaxLanguageManager::getInstance(); - trigger_error( - $objLanguageManager->getText('XJXCTL:ICHERR:01') - . $this->backtrace() - , E_USER_ERROR - ); - } -//EndSkipDebug - - foreach (array_keys($aChildren) as $sKey) - $this->addChild($aChildren[$sKey]); - } - - function printHTML($sIndent='') - { -//SkipDebug - if (class_exists('clsValidator')) - { - $objValidator =& clsValidator::getInstance(); - $sMissing = ''; - if (false == $objValidator->checkRequiredAttributes($this->sTag, $this->aAttributes, $sMissing)) { - $objLanguageManager =& xajaxLanguageManager::getInstance(); - trigger_error( - $objLanguageManager->getText('XJXCTL:MRAERR:01') - . $sMissing - . $objLanguageManager->getText('XJXCTL:MRAERR:02') - . $this->sTag - . $objLanguageManager->getText('XJXCTL:MRAERR:03') - , E_USER_ERROR - ); - } - } -//EndSkipDebug - - $sClass = $this->getClass(); - - if ('%inline' != $sClass) - // this odd syntax is necessary to detect request for no formatting - if (false === (false === $sIndent)) - echo $sIndent; - - echo '<'; - echo $this->sTag; - echo ' '; - $this->_printAttributes(); - $this->_printEvents(); - - if (0 == count($this->aChildren)) - { - if ('optional' == $this->sEndTag) - { - echo '/>'; - - if ('%inline' != $sClass) - // this odd syntax is necessary to detect request for no formatting - if (false === (false === $sIndent)) - echo "\n"; - - return; - } -//SkipDebug - else if ('required' != $this->sEndTag) - trigger_error("Invalid end tag designation; should be optional or required.\n" - . $this->backtrace(), - E_USER_ERROR - ); -//EndSkipDebug - } - - echo '>'; - - $sContentClass = $this->getContentClass(); - - if ('%inline' != $sContentClass) - // this odd syntax is necessary to detect request for no formatting - if (false === (false === $sIndent)) - echo "\n"; - - $this->_printChildren($sIndent); - - if ('%inline' != $sContentClass) - // this odd syntax is necessary to detect request for no formatting - if (false === (false === $sIndent)) - echo $sIndent; - - echo '<' . '/'; - echo $this->sTag; - echo '>'; - - if ('%inline' != $sClass) - // this odd syntax is necessary to detect request for no formatting - if (false === (false === $sIndent)) - echo "\n"; - } - - function _printChildren($sIndent='') - { - if (false == is_a($this, 'clsDocument')) - // this odd syntax is necessary to detect request for no formatting - if (false === (false === $sIndent)) - $sIndent .= "\t"; - - // children - foreach (array_keys($this->aChildren) as $sKey) - { - $objChild =& $this->aChildren[$sKey]; - $objChild->printHTML($sIndent); - } - } -} diff --git a/phpgwapi/inc/xajax/xajax_core/xajaxLanguageManager.inc.php b/phpgwapi/inc/xajax/xajax_core/xajaxLanguageManager.inc.php deleted file mode 100644 index 4e7390755d..0000000000 --- a/phpgwapi/inc/xajax/xajax_core/xajaxLanguageManager.inc.php +++ /dev/null @@ -1,188 +0,0 @@ - for a detailed description, copyright - and license information. -*/ - -/* - @package xajax - @version $Id: xajaxLanguageManager.inc.php 362 2007-05-29 15:32:24Z calltoconstruct $ - @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson - @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson - @license http://www.xajaxproject.org/bsd_license.txt BSD License -*/ - -/* - Class: xajaxLanguageManager - - This class contains the default language (english) and the code used to supply - debug and error messages upon request; as well as the code used to load alternate - language text as requested via the function. -*/ -class xajaxLanguageManager -{ - /* - Array: aMessages - - An array of the currently registered languages. - */ - var $aMessages; - - /* - String: sLanguage - - The currently configured language. - */ - var $sLanguage; - - /* - Function: xajaxLanguageManager - - Construct and initialize the one and only xajax language manager object. - */ - function xajaxLanguageManager() - { - $this->aMessages = array(); - - $this->aMessages['en'] = array( - 'LOGHDR:01' => '** xajax Error Log - ', - 'LOGHDR:02' => " **\n", - 'LOGHDR:03' => "\n\n\n", - 'LOGERR:01' => "** Logging Error **\n\nxajax was unable to write to the error log file:\n", - 'LOGMSG:01' => "** PHP Error Messages: **", - 'CMPRSJS:RDERR:01' => 'The xajax uncompressed Javascript file could not be found in the ', - 'CMPRSJS:RDERR:02' => ' folder. Error ', - 'CMPRSJS:WTERR:01' => 'The xajax compressed javascript file could not be written in the ', - 'CMPRSJS:WTERR:02' => ' folder. Error ', - 'CMPRSPHP:WTERR:01' => 'The xajax compressed file ', - 'CMPRSPHP:WTERR:02' => ' could not be written to. Error ', - 'CMPRSAIO:WTERR:01' => 'The xajax compressed file ', - 'CMPRSAIO:WTERR:02' => '/xajaxAIO.inc.php could not be written to. Error ', - 'DTCTURI:01' => 'xajax Error: xajax failed to automatically identify your Request URI.', - 'DTCTURI:02' => 'Please set the Request URI explicitly when you instantiate the xajax object.', - 'ARGMGR:ERR:01' => 'Malformed object argument received: ', - 'ARGMGR:ERR:02' => ' <==> ', - 'ARGMGR:ERR:03' => 'The incoming xajax data could not be converted from UTF-8', - 'XJXCTL:IAERR:01' => 'Invalid attribute [', - 'XJXCTL:IAERR:02' => '] for element [', - 'XJXCTL:IAERR:03' => '].', - 'XJXCTL:IRERR:01' => 'Invalid request object passed to xajaxControl::setEvent', - 'XJXCTL:IEERR:01' => 'Invalid attribute (event name) [', - 'XJXCTL:IEERR:02' => '] for element [', - 'XJXCTL:IEERR:03' => '].', - 'XJXCTL:MAERR:01' => 'Missing required attribute [', - 'XJXCTL:MAERR:02' => '] for element [', - 'XJXCTL:MAERR:03' => '].', - 'XJXCTL:IETERR:01' => "Invalid end tag designation; should be forbidden or optional.\n", - 'XJXCTL:ICERR:01' => "Invalid class specified for html control; should be %inline, %block or %flow.\n", - 'XJXCTL:ICLERR:01' => 'Invalid control passed to addChild; should be derived from xajaxControl.', - 'XJXCTL:ICLERR:02' => 'Invalid control passed to addChild [', - 'XJXCTL:ICLERR:03' => '] for element [', - 'XJXCTL:ICLERR:04' => "].\n", - 'XJXCTL:ICHERR:01' => 'Invalid parameter passed to xajaxControl::addChildren; should be array of xajaxControl objects', - 'XJXCTL:MRAERR:01' => 'Missing required attribute [', - 'XJXCTL:MRAERR:02' => '] for element [', - 'XJXCTL:MRAERR:03' => '].', - 'XJXPLG:GNERR:01' => 'Response plugin should override the getName function.', - 'XJXPLG:PERR:01' => 'Response plugin should override the process function.', - 'XJXPM:IPLGERR:01' => 'Attempt to register invalid plugin: ', - 'XJXPM:IPLGERR:02' => ' should be derived from xajaxRequestPlugin or xajaxResponsePlugin.', - 'XJXPM:MRMERR:01' => 'Failed to locate registration method for the following: ', - 'XJXRSP:EDERR:01' => 'Passing character encoding to the xajaxResponse constructor is deprecated, instead use $xajax->configure("characterEncoding", ...);', - 'XJXRSP:MPERR:01' => 'Invalid or missing plugin name detected in call to xajaxResponse::plugin', - 'XJXRSP:CPERR:01' => "The \$sType parameter of addCreate has been deprecated. Use the addCreateInput() method instead.", - 'XJXRSP:LCERR:01' => "The xajax response object could not load commands as the data provided was not a valid array.", - 'XJXRSP:AKERR:01' => 'Invalid tag name encoded in array.', - 'XJXRSP:IEAERR:01' => 'Improperly encoded array.', - 'XJXRSP:NEAERR:01' => 'Non-encoded array detected.', - 'XJXRSP:MBEERR:01' => 'The xajax response output could not be converted to HTML entities because the mb_convert_encoding function is not available', - 'XJXRSP:MXRTERR' => 'Error: Cannot mix types in a single response.', - 'XJXRSP:MXCTERR' => 'Error: Cannot mix content types in a single response.', - 'XJXRSP:MXCEERR' => 'Error: Cannot mix character encodings in a single response.', - 'XJXRSP:MXOEERR' => 'Error: Cannot mix output entities (true/false) in a single response.', - 'XJXRM:IRERR' => 'An invalid response was returned while processing this request.', - 'XJXRM:MXRTERR' => 'Error: You cannot mix response types while processing a single request: ' - ); - - $this->sLanguage = 'en'; - } - - /* - Function: getInstance - - Implements the singleton pattern: provides a single instance of the xajax - language manager object to all object which request it. - */ - function &getInstance() - { - static $obj; - if (!$obj) { - $obj = new xajaxLanguageManager(); - } - return $obj; - } - - /* - Function: configure - - Called by the main xajax object as configuration options are set. See also: - . The tracks the following configuration - options. - Parameters: - - - language (string, default 'en'): The currently selected language. - */ - function configure($sName, $mValue) - { - if ('language' == $sName) { - if ($mValue !== $this->sLanguage) { - $sFolder = dirname(__FILE__); - @include $sFolder . '/xajax_lang_' . $mValue . '.inc.php'; - // require $sFolder . '/xajax_lang_' . $mValue . '.inc.php'; - $this->sLanguage = $mValue; - } - } - } - - /* - Function: register - - Called to register an array of alternate language messages. - - Parameters: - - sLanguage - (string): the character code which represents the language being registered. - aMessages - (array): the array of translated debug and error messages - */ - function register($sLanguage, $aMessages) { - $this->aMessages[$sLanguage] = $aMessages; - } - - /* - Function: getText - - Called by the main xajax object and other objects during the initial page generation - or request processing phase to obtain language specific debug and error messages. - - sMessage - (string): A code indicating the message text being requested. - */ - function getText($sMessage) - { - if (isset($this->aMessages[$this->sLanguage])) - if (isset($this->aMessages[$this->sLanguage][$sMessage])) - return $this->aMessages[$this->sLanguage][$sMessage]; - - return '(Unknown language or message identifier)' - . $this->sLanguage - . '::' - . $sMessage; - } -} diff --git a/phpgwapi/inc/xajax/xajax_core/xajaxPlugin.inc.php b/phpgwapi/inc/xajax/xajax_core/xajaxPlugin.inc.php deleted file mode 100644 index b0209db267..0000000000 --- a/phpgwapi/inc/xajax/xajax_core/xajaxPlugin.inc.php +++ /dev/null @@ -1,191 +0,0 @@ - for a detailed description, copyright - and license information. -*/ - -/* - @package xajax - @version $Id: xajaxPlugin.inc.php 362 2007-05-29 15:32:24Z calltoconstruct $ - @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson - @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson - @license http://www.xajaxproject.org/bsd_license.txt BSD License -*/ - -/* - Class: xajaxPlugin - - The base class for all xajax plugins. -*/ -class xajaxPlugin -{ -} - -/* - Class: xajaxRequestPlugin - - The base class for all xajax request plugins. - - Request plugins handle the registration, client script generation and processing of - xajax enabled requests. Each plugin should have a unique signature for both - the registration and processing of requests. During registration, the user will - specify a type which will allow the plugin to detect and handle it. During client - script generation, the plugin will generate a stub with the - prescribed call options and request signature. During request processing, the - plugin will detect the signature generated previously and process the request - accordingly. -*/ -class xajaxRequestPlugin extends xajaxPlugin -{ - /* - Function: configure - - Called by the when a configuration setting is changing. - Plugins should store a local copy of the settings they wish to use during - registration, client script generation or request processing. - */ - function configure($sName, $mValue) - { - } - - /* - Function: register - - Called by the when a user script when a function, event - or callable object is to be registered. Additional plugins may support other - registration types. - */ - function register($aArgs) - { - return false; - } - - /* - Function: generateClientScript - - Called by when the page's HTML is being sent to the browser. - This allows each plugin to inject some script / style or other appropriate tags - into the HEAD of the document. Each block must be appropriately enclosed, meaning - javascript code must be enclosed in SCRIPT and /SCRIPT tags. - */ - function generateClientScript() - { - } - - /* - Function: canProcessRequest - - Called by the when a request has been received to determine - if the request is for a xajax enabled function or for the initial page load. - */ - function canProcessRequest() - { - return false; - } - - /* - Function: processRequest - - Called by the when a request is being processed. This - will only occur when has determined that the current request is a valid - (registered) xajax enabled function via canProcessRequest>. - - Returns: - false - */ - function processRequest() - { - return false; - } -} - -/* - Class: xajaxResponsePlugin - - Base class for all xajax response plugins. - - A response plugin provides additional services not already provided by the - class with regard to sending response commands to the - client. In addition, a response command may send javascript to the browser - at page load to aid in the processing of it's response commands. -*/ -class xajaxResponsePlugin extends xajaxPlugin -{ - /* - Object: objResponse - - A reference to the current object that is being used - to build the response that will be sent to the client browser. - */ - var $objResponse; - - /* - Function: setResponse - - Called by the object that is currently being used - to build the response that will be sent to the client browser. - - Parameters: - - objResponse - (object): A reference to the object - */ - function setResponse(&$objResponse) - { - $this->objResponse =& $objResponse; - } - - /* - Function: addCommand - - Used internally to add a command to the response command list. This - will call addPluginCommand> using the reference provided - in setResponse>. - */ - function addCommand($aAttributes, $sData) - { - $this->objResponse->addPluginCommand($this, $aAttributes, $sData); - } - - /* - Function: getName - - Called by the when the user script requests a plugin. - This name must match the plugin name requested in the called to - plugin>. - */ - function getName() - { -//SkipDebug - $objLanguageManager =& xajaxLanguageManager::getInstance(); - trigger_error( - $objLanguageManager->getText('XJXPLG:GNERR:01') - , E_USER_ERROR - ); -//EndSkipDebug - } - - /* - Function: process - - Called by when a user script requests the service of a - response plugin. The parameters provided by the user will be used to - determine which response command and parameters will be sent to the - client upon completion of the xajax request process. - */ - function process() - { -//SkipDebug - $objLanguageManager =& xajaxLanguageManager::getInstance(); - trigger_error( - $objLanguageManager->getText('XJXPLG:PERR:01') - , E_USER_ERROR - ); -//EndSkipDebug - } -} diff --git a/phpgwapi/inc/xajax/xajax_core/xajaxPluginManager.inc.php b/phpgwapi/inc/xajax/xajax_core/xajaxPluginManager.inc.php deleted file mode 100644 index b7fde478b4..0000000000 --- a/phpgwapi/inc/xajax/xajax_core/xajaxPluginManager.inc.php +++ /dev/null @@ -1,344 +0,0 @@ - for a detailed description, copyright - and license information. -*/ - -/* - @package xajax - @version $Id: xajaxPluginManager.inc.php 362 2007-05-29 15:32:24Z calltoconstruct $ - @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson - @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson - @license http://www.xajaxproject.org/bsd_license.txt BSD License -*/ - -//SkipAIO -require_once(dirname(__FILE__) . '/xajaxPlugin.inc.php'); -//EndSkipAIO - -/* - Class: xajaxPluginManager -*/ -class xajaxPluginManager -{ - /* - Array: aRequestPlugins - */ - var $aRequestPlugins; - - /* - Array: aResponsePlugins - */ - var $aResponsePlugins; - - /* - Array: aConfigurable - */ - var $aConfigurable; - - /* - Array: aRegistrars - */ - var $aRegistrars; - - /* - Array: aProcessors - */ - var $aProcessors; - - /* - Array: aClientScriptGenerators - */ - var $aClientScriptGenerators; - - /* - Function: xajaxPluginManager - - Construct and initialize the one and only xajax plugin manager. - */ - function xajaxPluginManager() - { - $this->aRequestPlugins = array(); - $this->aResponsePlugins = array(); - - $this->aConfigurable = array(); - $this->aRegistrars = array(); - $this->aProcessors = array(); - $this->aClientScriptGenerators = array(); - } - - /* - Function: getInstance - - Implementation of the singleton pattern: returns the one and only instance of the - xajax plugin manager. - - Returns: - - object : a reference to the one and only instance of the - plugin manager. - */ - function &getInstance() - { - static $obj; - if (!$obj) { - $obj = new xajaxPluginManager(); - } - return $obj; - } - - /* - Function: loadPlugins - - Loads plugins from the folders specified. - - Parameters: - $aFolders - (array): Array of folders to check for plugins - */ - function loadPlugins($aFolders) - { - foreach ($aFolders as $sFolder) { - if (is_dir($sFolder)) - if ($handle = opendir($sFolder)) { - while (!(false === ($sName = readdir($handle)))) { - $nLength = strlen($sName); - if (8 < $nLength) { - $sFileName = substr($sName, 0, $nLength - 8); - $sExtension = substr($sName, $nLength - 8, 8); - if ('.inc.php' == $sExtension) { - require_once $sFolder . '/' . $sFileName . $sExtension; - } - } - } - - closedir($handle); - } - } - } - - /* - Function: _insertIntoArray - - Inserts an entry into an array given the specified priority number. - If a plugin already exists with the given priority, the priority is - automatically incremented until a free spot is found. The plugin - is then inserted into the empty spot in the array. - - Parameters: - - $aPlugins - (array): Plugins array - $objPlugin - (object): A reference to an instance of a plugin. - $nPriority - (number): The desired priority, used to order - the plugins. - - */ - function _insertIntoArray(&$aPlugins, &$objPlugin, $nPriority) - { - while (isset($aPlugins[$nPriority])) - $nPriority++; - - $aPlugins[$nPriority] =& $objPlugin; - } - - /* - Function: registerPlugin - - Registers a plugin. - - Parameters: - - objPlugin - (object): A reference to an instance of a plugin. - - Note: - Below is a table for priorities and their description: - 0 thru 999: Plugins that are part of or extensions to the xajax core - 1000 thru 8999: User created plugins, typically, these plugins don't care about order - 9000 thru 9999: Plugins that generally need to be last or near the end of the plugin list - */ - function registerPlugin(&$objPlugin, $nPriority=1000) - { - if (is_a($objPlugin, 'xajaxRequestPlugin')) - { - $this->_insertIntoArray($this->aRequestPlugins, $objPlugin, $nPriority); - - if (method_exists($objPlugin, 'register')) - $this->_insertIntoArray($this->aRegistrars, $objPlugin, $nPriority); - - if (method_exists($objPlugin, 'canProcessRequest')) - if (method_exists($objPlugin, 'processRequest')) - $this->_insertIntoArray($this->aProcessors, $objPlugin, $nPriority); - } - else if (is_a($objPlugin, 'xajaxResponsePlugin')) - { - $this->aResponsePlugins[] =& $objPlugin; - } - else - { -//SkipDebug - $objLanguageManager =& xajaxLanguageManager::getInstance(); - trigger_error( - $objLanguageManager->getText('XJXPM:IPLGERR:01') - . get_class($objPlugin) - . $objLanguageManager->getText('XJXPM:IPLGERR:02') - , E_USER_ERROR - ); -//EndSkipDebug - } - - if (method_exists($objPlugin, 'configure')) - $this->_insertIntoArray($this->aConfigurable, $objPlugin, $nPriority); - - if (method_exists($objPlugin, 'generateClientScript')) - $this->_insertIntoArray($this->aClientScriptGenerators, $objPlugin, $nPriority); - } - - /* - Function: canProcessRequest - - Calls each of the request plugins and determines if the - current request can be processed by one of them. If no processor identifies - the current request, then the request must be for the initial page load. - - See canProcessRequest> for more information. - */ - function canProcessRequest() - { - $bHandled = false; - - $aKeys = array_keys($this->aProcessors); - sort($aKeys); - foreach ($aKeys as $sKey) { - $mResult = $this->aProcessors[$sKey]->canProcessRequest(); - if (true === $mResult) - $bHandled = true; - else if (is_string($mResult)) - return $mResult; - } - - return $bHandled; - } - - /* - Function: processRequest - - Calls each of the request plugins to request that they process the - current request. If the plugin processes the request, it will - return true. - */ - function processRequest() - { - $bHandled = false; - - $aKeys = array_keys($this->aProcessors); - sort($aKeys); - foreach ($aKeys as $sKey) { - $mResult = $this->aProcessors[$sKey]->processRequest(); - if (true === $mResult) - $bHandled = true; - else if (is_string($mResult)) - return $mResult; - } - - return $bHandled; - } - - /* - Function: configure - - Call each of the request plugins passing along the configuration - setting specified. - - Parameters: - - sName - (string): The name of the configuration setting to set. - mValue - (mixed): The value to be set. - */ - function configure($sName, $mValue) - { - $aKeys = array_keys($this->aConfigurable); - sort($aKeys); - foreach ($aKeys as $sKey) - $this->aConfigurable[$sKey]->configure($sName, $mValue); - } - - /* - Function: register - - Call each of the request plugins and give them the opportunity to - handle the registration of the specified function, event or callable object. - - Parameters: - $aArgs - (array) : - */ - function register($aArgs) - { - $aKeys = array_keys($this->aRegistrars); - sort($aKeys); - foreach ($aKeys as $sKey) - { - $objPlugin =& $this->aRegistrars[$sKey]; - $mResult =& $objPlugin->register($aArgs); - if (is_a($mResult, 'xajaxRequest')) - return $mResult; - if (is_array($mResult)) - return $mResult; - if (is_bool($mResult)) - if (true === $mResult) - return true; - } -//SkipDebug - $objLanguageManager =& xajaxLanguageManager::getInstance(); - trigger_error( - $objLanguageManager->getText('XJXPM:MRMERR:01') - . print_r($aArgs, true) - , E_USER_ERROR - ); -//EndSkipDebug - } - - /* - Function: generateClientScript - - Call each of the request and response plugins giving them the - opportunity to output some javascript to the page being generated. This - is called only when the page is being loaded initially. This is not - called when processing a request. - */ - function generateClientScript() - { - $aKeys = array_keys($this->aClientScriptGenerators); - sort($aKeys); - foreach ($aKeys as $sKey) - $this->aClientScriptGenerators[$sKey]->generateClientScript(); - } - - /* - Function: getPlugin - - Locate the specified response plugin by name and return - a reference to it if one exists. - - Parameters: - $sName - (string): Name of the plugin. - - Returns: - mixed : Returns plugin or false if not found. - */ - function &getPlugin($sName) - { - $aKeys = array_keys($this->aResponsePlugins); - sort($aKeys); - foreach ($aKeys as $sKey) - if (is_a($this->aResponsePlugins[$sKey], $sName)) - return $this->aResponsePlugins[$sKey]; - - $bFailure = false; - return $bFailure; - } -} diff --git a/phpgwapi/inc/xajax/xajax_core/xajaxRequest.inc.php b/phpgwapi/inc/xajax/xajax_core/xajaxRequest.inc.php deleted file mode 100644 index 981d7577a9..0000000000 --- a/phpgwapi/inc/xajax/xajax_core/xajaxRequest.inc.php +++ /dev/null @@ -1,359 +0,0 @@ - for a detailed description, copyright - and license information. -*/ - -/* - @package xajax - @version $Id: xajaxRequest.inc.php 362 2007-05-29 15:32:24Z calltoconstruct $ - @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson - @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson - @license http://www.xajaxproject.org/bsd_license.txt BSD License -*/ - -/* - Constant: XAJAX_FORM_VALUES - Specifies that the parameter will consist of an array of form values. -*/ -if (!defined ('XAJAX_FORM_VALUES')) define ('XAJAX_FORM_VALUES', 'get form values'); -/* - Constant: XAJAX_INPUT_VALUE - Specifies that the parameter will contain the value of an input control. -*/ -if (!defined ('XAJAX_INPUT_VALUE')) define ('XAJAX_INPUT_VALUE', 'get input value'); -/* - Constant: XAJAX_CHECKED_VALUE - Specifies that the parameter will consist of a boolean value of a checkbox. -*/ -if (!defined ('XAJAX_CHECKED_VALUE')) define ('XAJAX_CHECKED_VALUE', 'get checked value'); -/* - Constant: XAJAX_ELEMENT_INNERHTML - Specifies that the parameter value will be the innerHTML value of the element. -*/ -if (!defined ('XAJAX_ELEMENT_INNERHTML')) define ('XAJAX_ELEMENT_INNERHTML', 'get element innerHTML'); -/* - Constant: XAJAX_QUOTED_VALUE - Specifies that the parameter will be a quoted value (string). -*/ -if (!defined ('XAJAX_QUOTED_VALUE')) define ('XAJAX_QUOTED_VALUE', 'quoted value'); -/* - Constant: XAJAX_JS_VALUE - Specifies that the parameter will be a non-quoted value (evaluated by the - browsers javascript engine at run time. -*/ -if (!defined ('XAJAX_JS_VALUE')) define ('XAJAX_JS_VALUE', 'unquoted value'); - -/* - Class: xajaxRequest - - Used to store and generate the client script necessary to invoke - a xajax request from the browser to the server script. - - This object is typically generated by the register> method - and can be used to quickly generate the javascript that is used - to initiate a xajax request to the registered function, object, event - or other xajax call. -*/ -class xajaxRequest -{ - /* - String: sName - - The name of the function. - */ - var $sName; - - /* - String: sQuoteCharacter - - A string containing either a single or a double quote character - that will be used during the generation of the javascript for - this function. This can be set prior to calling printScript> - */ - var $sQuoteCharacter; - - /* - Array: aParameters - - An array of parameters that will be used to populate the argument list - for this function when the javascript is output in printScript> - */ - var $aParameters; - - /* - Function: xajaxRequest - - Construct and initialize this request. - - sName - (string): The name of this request. - */ - function xajaxRequest($sName) - { - $this->aParameters = array(); - $this->sQuoteCharacter = '"'; - $this->sName = $sName; - } - - /* - Function: useSingleQuote - - Call this to instruct the request to use single quotes when generating - the javascript. - */ - function useSingleQuote() - { - $this->sQuoteCharacter = "'"; - } - - /* - Function: useDoubleQuote - - Call this to instruct the request to use double quotes while generating - the javascript. - */ - function useDoubleQuote() - { - $this->sQuoteCharacter = '"'; - } - - /* - Function: clearParameters - - Clears the parameter list associated with this request. - */ - function clearParameters() - { - $this->aParameters = array(); - } - - /* - Function: addParameter - - Adds a parameter value to the parameter list for this request. - - sType - (string): The type of the value to be used. - sValue - (string: The value to be used. - - See Also: - See setParameter> for details. - */ - function addParameter() - { - $aArgs = func_get_args(); - - if (1 < count($aArgs)) - $this->setParameter( - count($this->aParameters), - $aArgs[0], - $aArgs[1]); - } - - /* - Function: setParameter - - Sets a specific parameter value. - - Parameters: - - nParameter - (number): The index of the parameter to set - sType - (string): The type of value - sValue - (string): The value as it relates to the specified type - - Note: - - Types should be one of the following , , - , , . - The value should be as follows: - - Use the ID of the form you want to process. - - The string data to be passed. - - A string containing valid javascript (either a javascript - variable name that will be in scope at the time of the call or a - javascript function call whose return value will become the parameter. - - */ - function setParameter() - { - $aArgs = func_get_args(); - - if (2 < count($aArgs)) - { - $nParameter = $aArgs[0]; - $sType = $aArgs[1]; - - if (XAJAX_FORM_VALUES == $sType) - { - $sFormID = $aArgs[2]; - $this->aParameters[$nParameter] = - "xajax.getFormValues(" - . $this->sQuoteCharacter - . $sFormID - . $this->sQuoteCharacter - . ")"; - } - else if (XAJAX_INPUT_VALUE == $sType) - { - $sInputID = $aArgs[2]; - $this->aParameters[$nParameter] = - "xajax.$(" - . $this->sQuoteCharacter - . $sInputID - . $this->sQuoteCharacter - . ").value"; - } - else if (XAJAX_CHECKED_VALUE == $sType) - { - $sCheckedID = $aArgs[2]; - $this->aParameters[$nParameter] = - "xajax.$(" - . $this->sQuoteCharacter - . $sCheckedID - . $this->sQuoteCharacter - . ").checked"; - } - else if (XAJAX_ELEMENT_INNERHTML == $sType) - { - $sElementID = $aArgs[2]; - $this->aParameters[$nParameter] = - "xajax.$(" - . $this->sQuoteCharacter - . $sElementID - . $this->sQuoteCharacter - . ").innerHTML"; - } - else if (XAJAX_QUOTED_VALUE == $sType) - { - $sValue = $aArgs[2]; - $this->aParameters[$nParameter] = - $this->sQuoteCharacter - . $sValue - . $this->sQuoteCharacter; - } - else if (XAJAX_JS_VALUE == $sType) - { - $sValue = $aArgs[2]; - $this->aParameters[$nParameter] = $sValue; - } - } - } - - /* - Function: getScript - - Returns a string representation of the script output (javascript) from - this request object. See also: - */ - function getScript() - { - ob_start(); - $this->printScript(); - return ob_get_clean(); - } - - /* - Function: printScript - - Generates a block of javascript code that can be used to invoke - the specified xajax request. - */ - function printScript() - { - echo $this->sName; - echo '('; - - $sSeparator = ''; - - foreach ($this->aParameters as $sParameter) - { - echo $sSeparator; - echo $sParameter; - $sSeparator = ', '; - } - - echo ')'; - } -} - -/* - Class: xajaxCustomRequest - - This class extends the class such that simple javascript - can be put in place of a xajax request to the server. The primary purpose - of this class is to provide simple scripting services to the - based objects, like , and . -*/ -class xajaxCustomRequest extends xajaxRequest -{ - /* - Array: aVariables; - */ - var $aVariables; - - /* - String: sScript; - */ - var $sScript; - - /* - Function: xajaxCustomRequest - - Constructs and initializes an instance of the object. - - Parameters: - - sScript - (string): The javascript (template) that will be printed - upon request. - aVariables - (associative array, optional): An array of variable name, - value pairs that will be passed to setVariable> - */ - function xajaxCustomRequest($sScript) - { - $this->aVariables = array(); - $this->sScript = $sScript; - } - - /* - Function: clearVariables - - Clears the array of variables that will be used to modify the script before - it is printed and sent to the client. - */ - function clearVariables() - { - $this->aVariables = array(); - } - - /* - Function: setVariable - - Sets a value that will be used to modify the script before it is sent to - the browser. The object will perform a string - replace operation on each of the values set with this function. - - Parameters: - $sName - (string): Variable name - $sValue - (string): Value - - */ - function setVariable($sName, $sValue) - { - $this->aVariables[$sName] = $sValue; - } - - /* - Function: printScript - */ - function printScript() - { - $sScript = $this->sScript; - foreach ($this->aVariables as $sKey => $sValue) - $sScript = str_replace($sKey, $sValue, $sScript); - echo $sScript; - } -} diff --git a/phpgwapi/inc/xajax/xajax_core/xajaxResponse.inc.php b/phpgwapi/inc/xajax/xajax_core/xajaxResponse.inc.php deleted file mode 100644 index 60baeadcfa..0000000000 --- a/phpgwapi/inc/xajax/xajax_core/xajaxResponse.inc.php +++ /dev/null @@ -1,1935 +0,0 @@ - for a detailed description, copyright - and license information. -*/ - -/* - @package xajax - @version $Id: xajaxResponse.inc.php 361 2007-05-24 12:48:14Z calltoconstruct $ - @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson - @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson - @license http://www.xajaxproject.org/bsd_license.txt BSD License -*/ - -/* - Class: xajaxResponse - - Collect commands to be sent back to the browser in response to a xajax - request. Commands are encoded and packaged in a format that is acceptable - to the response handler from the javascript library running on the client - side. - - Common commands include: - - assign>: Assign a value to an elements property. - - append>: Append a value on to an elements property. - - script>: Execute a portion of javascript code. - - call>: Execute an existing javascript function. - - alert>: Display an alert dialog to the user. - - Elements are identified by the value of the HTML id attribute. If you do - not see your updates occuring on the browser side, ensure that you are - using the correct id in your response. -*/ -class xajaxResponse -{ - /** - * Adding all legacy functions to ease the transition - */ - function outputEntitiesOn() { $this->setOutputEntities(true); } - function outputEntitiesOff() { $this->setOutputEntities(false); } - function addConfirmCommands() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'confirmCommands'), $temp); } - function addAssign() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'assign'), $temp); } - function addAppend() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'append'), $temp); } - function addPrepend() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'prepend'), $temp); } - function addReplace() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'replace'), $temp); } - function addClear() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'clear'), $temp); } - function addAlert() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'alert'), $temp); } - function addRedirect() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'redirect'), $temp); } - function addScript() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'script'), $temp); } - function addScriptCall() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'call'), $temp); } - function addRemove() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'remove'), $temp); } - function addCreate() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'create'), $temp); } - function addInsert() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'insert'), $temp); } - function addInsertAfter() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'insertAfter'), $temp); } - function addCreateInput() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'createInput'), $temp); } - function addInsertInput() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'insertInput'), $temp); } - function addInsertInputAfter() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'insertInputAfter'), $temp); } - function addRemoveHandler() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'removeHandler'), $temp); } - function addIncludeScript() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'includeScript'), $temp); } - function addIncludeCSS() { $temp=func_get_args(); return call_user_func_array(array(&$this, 'includeCSS'), $temp); } - function &getXML() { return $this; } - - /**#@+ - * @access protected - */ - - /* - Array: aCommands - - Stores the commands that will be sent to the browser in the response. - */ - var $aCommands; - - /* - String: sCharacterEncoding - - The name of the encoding method you wish to use when dealing with - special characters. See setEncoding> for more information. - */ - var $sCharacterEncoding; - - /* - Boolean: bOutputEntities - - Convert special characters to the HTML equivellent. See also - bOutputEntities> and setFlag>. - */ - var $bOutputEntities; - - /* - Mixed: returnValue - - A string, array or integer value to be returned to the caller when - using 'synchronous' mode requests. See setMode> for details. - */ - var $returnValue; - - /* - Object: objPluginManager - - A reference to the global plugin manager. - */ - var $objPluginManager; - - /**#@-*/ - - /* - Constructor: xajaxResponse - - Create and initialize a xajaxResponse object. - */ - function xajaxResponse() - { - //SkipDebug - if (0 < func_num_args()) { - $objLanguageManager =& xajaxLanguageManager::getInstance(); - trigger_error( - $objLanguageManager->getText('XJXRSP:EDERR:01') - , E_USER_ERROR - ); - } - //EndSkipDebug - - $this->aCommands = array(); - - $objResponseManager =& xajaxResponseManager::getInstance(); - - $this->sCharacterEncoding = $objResponseManager->getCharacterEncoding(); - $this->bOutputEntities = $objResponseManager->getOutputEntities(); - - $this->objPluginManager =& xajaxPluginManager::getInstance(); - } - - /* - Function: setCharacterEncoding - - Overrides the default character encoding (or the one specified in the - constructor) to the specified character encoding. - - Parameters: - - sCharacterEncoding - (string): The encoding method to use for this response. - - See also, xajaxResponse>() - - Returns: - - object - The xajaxResponse object. - */ - function setCharacterEncoding($sCharacterEncoding) - { - $this->sCharacterEncoding = $sCharacterEncoding; - return $this; - } - - /* - Function: setOutputEntities - - Convert special characters to their HTML equivellent automatically - (only works if the mb_string extension is available). - - Parameters: - - bOption - (boolean): Convert special characters - - Returns: - - object - The xajaxResponse object. - */ - function setOutputEntities($bOutputEntities) - { - $this->bOutputEntities = (boolean)$bOutputEntities; - return $this; - } - - /* - Function: plugin - - Provides access to registered response plugins. If you are using PHP - 4 or 5, pass the plugin name as the first argument, the plugin method - name as the second argument and subsequent arguments (if any) to be - passed along to the plugin. - - Optionally, if you use PHP 5, you can pass just the plugin name as the - first argument and the plugin object will be returned. You can then - access the methods of the plugin directly. - - Parameters: - - sName - (string): Name of the plugin. - sFunction - (string, optional): The name of the method to call. - arg1...argn - (mixed, optional): Additional arguments to pass on to - the plugin function. - - Returns: - - object - The plugin specified by sName. - */ - function &plugin() - { - $aArgs = func_get_args(); - $nArgs = func_num_args(); - - //SkipDebug - if (false == (0 < $nArgs)) { - $objLanguageManager =& xajaxLanguageManager::getInstance(); - trigger_error( - $objLanguageManager->getText('XJXRSP:MPERR:01') - , E_USER_ERROR - ); - } - //EndSkipDebug - - $sName = array_shift($aArgs); - - $objPlugin =& $this->objPluginManager->getPlugin($sName); - - if (false === $objPlugin) - { - $bReturn = false; - return $bReturn; - } - - $objPlugin->setResponse($this); - - if (0 < count($aArgs)) - { - $sMethod = array_shift($aArgs); - - $aFunction = array(&$objPlugin, $sMethod); - call_user_func_array($aFunction, $aArgs); - } - - return $objPlugin; - } - - /* - Function: __get - - Magic function for PHP 5. Used to permit plugins to be called as if they - where native members of the xajaxResponse instance. - - Parameters: - - sPluginName - (string): The name of the plugin. - - Returns: - - object - The plugin specified by sPluginName. - */ - function &__get($sPluginName) - { - $objPlugin =& $this->plugin($sPluginName); - return $objPlugin; - } - - /* - Function: confirmCommands - - Response command that prompts user with [ok] [cancel] style - message box. If the user clicks cancel, the specified - number of response commands following this one, will be - skipped. - - Parameters: - - iCmdNumber - (integer): The number of commands to skip upon cancel. - sMessage - (string): The message to display to the user. - - Returns: - - object : The xajaxResponse object. - */ - function confirmCommands($iCmdNumber, $sMessage) - { - return $this->addCommand( - array( - 'cmd'=>'cc', - 'id'=>$iCmdNumber - ), - $sMessage - ); - } - - /* - Function: assign - - Response command indicating that the specified value should be - assigned to the given element's attribute. - - Parameters: - - sTarget - (string): The id of the html element on the browser. - sAttribute - (string): The property to be assigned. - sData - (string): The value to be assigned to the property. - - Returns: - - object : The object. - - */ - function assign($sTarget,$sAttribute,$sData) - { - return $this->addCommand( - array( - 'cmd'=>'as', - 'id'=>$sTarget, - 'prop'=>$sAttribute - ), - $sData - ); - } - - /* - Function: append - - Response command that indicates the specified data should be appended - to the given element's property. - - Parameters: - - sTarget - (string): The id of the element to be updated. - sAttribute - (string): The name of the property to be appended to. - sData - (string): The data to be appended to the property. - - Returns: - - object : The object. - */ - function append($sTarget,$sAttribute,$sData) - { - return $this->addCommand( - array( - 'cmd'=>'ap', - 'id'=>$sTarget, - 'prop'=>$sAttribute - ), - $sData - ); - } - - /* - Function: prepend - - Response command to prepend the specified value onto the given - element's property. - - Parameters: - - sTarget - (string): The id of the element to be updated. - sAttribute - (string): The property to be updated. - sData - (string): The value to be prepended. - - Returns: - - object : The object. - */ - function prepend($sTarget,$sAttribute,$sData) - { - return $this->addCommand( - array( - 'cmd'=>'pp', - 'id'=>$sTarget, - 'prop'=>$sAttribute - ), - $sData - ); - } - - /* - Function: replace - - Replace a specified value with another value within the given - element's property. - - Parameters: - - sTarget - (string): The id of the element to update. - sAttribute - (string): The property to be updated. - sSearch - (string): The needle to search for. - sData - (string): The data to use in place of the needle. - */ - function replace($sTarget,$sAttribute,$sSearch,$sData) - { - return $this->addCommand( - array( - 'cmd'=>'rp', - 'id'=>$sTarget, - 'prop'=>$sAttribute - ), - array( - 's' => $sSearch, - 'r' => $sData - ) - ); - } - - /* - Function: clear - - Response command used to clear the specified property of the - given element. - - Parameters: - - sTarget - (string): The id of the element to be updated. - sAttribute - (string): The property to be clared. - - Returns: - - object - The object. - */ - function clear($sTarget,$sAttribute) - { - return $this->assign( - $sTarget, - $sAttribute, - '' - ); - } - - /* - Function: contextAssign - - Response command used to assign a value to a member of a - javascript object (or element) that is specified by the context - member of the request. The object is referenced using the 'this' keyword - in the sAttribute parameter. - - Parameters: - - sAttribute - (string): The property to be updated. - sData - (string): The value to assign. - - Returns: - - object : The object. - */ - function contextAssign($sAttribute, $sData) - { - return $this->addCommand( - array( - 'cmd'=>'c:as', - 'prop'=>$sAttribute - ), - $sData - ); - } - - /* - Function: contextAppend - - Response command used to append a value onto the specified member - of the javascript context object (or element) specified by the context - member of the request. The object is referenced using the 'this' keyword - in the sAttribute parameter. - - Parameters: - - sAttribute - (string): The member to be appended to. - sData - (string): The value to append. - - Returns: - - object : The object. - */ - function contextAppend($sAttribute, $sData) - { - return $this->addCommand( - array( - 'cmd'=>'c:ap', - 'prop'=>$sAttribute - ), - $sData - ); - } - - /* - Function: contextPrepend - - Response command used to prepend the speicified data to the given - member of the current javascript object specified by context in the - current request. The object is access via the 'this' keyword in the - sAttribute parameter. - - Parameters: - - sAttribute - (string): The member to be updated. - sData - (string): The value to be prepended. - - Returns: - - object : The object. - */ - function contextPrepend($sAttribute, $sData) - { - return $this->addCommand( - array( - 'cmd'=>'c:pp', - 'prop'=>$sAttribute - ), - $sData - ); - } - - /* - Function: contextClear - - Response command used to clear the value of the property specified - in the sAttribute parameter. The member is access via the 'this' - keyword and can be used to update a javascript object specified - by context in the request parameters. - - Parameters: - - sAttribute - (string): The member to be cleared. - - Returns: - - object : The object. - */ - function contextClear($sAttribute) - { - return $this->contextAssign( - $sAttribute, - '' - ); - } - - /* - Function: alert - - Response command that is used to display an alert message to the user. - - Parameters: - - sMsg - (string): The message to be displayed. - - Returns: - - object : The object. - */ - function alert($sMsg) - { - return $this->addCommand( - array( - 'cmd'=>'al' - ), - $sMsg - ); - } - - function debug($sMessage) - { - return $this->addCommand( - array( - 'cmd'=>'dbg' - ), - $sMessage - ); - } - - /* - Function: redirect - - Response command that causes the browser to navigate to the specified - URL. - - Parameters: - - sURL - (string): The relative or fully qualified URL. - iDelay - (integer, optional): Number of seconds to delay before - the redirect occurs. - - Returns: - - object : The object. - */ - function redirect($sURL, $iDelay=0) - { - //we need to parse the query part so that the values are rawurlencode()'ed - //can't just use parse_url() cos we could be dealing with a relative URL which - // parse_url() can't deal with. - $queryStart = strpos($sURL, '?', strrpos($sURL, '/')); - if ($queryStart !== FALSE) - { - $queryStart++; - $queryEnd = strpos($sURL, '#', $queryStart); - if ($queryEnd === FALSE) - $queryEnd = strlen($sURL); - $queryPart = substr($sURL, $queryStart, $queryEnd-$queryStart); - parse_str($queryPart, $queryParts); - $newQueryPart = ""; - if ($queryParts) - { - $first = true; - foreach($queryParts as $key => $value) - { - if ($first) - $first = false; - else - $newQueryPart .= '&'; - $newQueryPart .= rawurlencode($key).'='.rawurlencode($value); - } - } else if ($_SERVER['QUERY_STRING']) { - //couldn't break up the query, but there's one there - //possibly "http://url/page.html?query1234" type of query? - //just encode it and hope it works - $newQueryPart = rawurlencode($_SERVER['QUERY_STRING']); - } - $sURL = str_replace($queryPart, $newQueryPart, $sURL); - } - if ($iDelay) - $this->script( - 'window.setTimeout("window.location = \'' - . $sURL - . '\';",' - . ($iDelay*1000) - . ');' - ); - else - $this->script( - 'window.location = "' - . $sURL - . '";' - ); - return $this; - } - - /* - Function: script - - Response command that is used to execute a portion of javascript on - the browser. The script runs in it's own context, so variables declared - locally, using the 'var' keyword, will no longer be available after the - call. To construct a variable that will be accessable globally, even - after the script has executed, leave off the 'var' keyword. - - Parameters: - - sJS - (string): The script to execute. - - Returns: - - object : The object. - */ - function script($sJS) - { - return $this->addCommand( - array( - 'cmd'=>'js' - ), - $sJS - ); - } - - /* - Function: call - - Response command that indicates that the specified javascript - function should be called with the given (optional) parameters. - - Parameters: - - arg1 - (string): The name of the function to call. - arg2 .. argn : arguments to be passed to the function. - - Returns: - - object : The object. - */ - function call() { - $aArgs = func_get_args(); - $sFunc = array_shift($aArgs); - return $this->addCommand( - array( - 'cmd'=>'jc', - 'func'=>$sFunc - ), - $aArgs - ); - } - - /* - Function: remove - - Response command used to remove an element from the document. - - Parameters: - - sTarget - (string): The id of the element to be removed. - - Returns: - - object : The object. - */ - function remove($sTarget) - { - return $this->addCommand( - array( - 'cmd'=>'rm', - 'id'=>$sTarget), - '' - ); - } - - /* - Function: create - - Response command used to create a new element on the browser. - - Parameters: - - sParent - (string): The id of the parent element. - sTag - (string): The tag name to be used for the new element. - sId - (string): The id to assign to the new element. - sType - (string, optional): The type of tag, deprecated, use - createInput> instead. - - Returns: - - object : The object. - */ - function create($sParent, $sTag, $sId, $sType=null) - { - //SkipDebug - if (false === (null === $sType)) { - $objLanguageManager =& xajaxLanguageManager::getInstance(); - trigger_error( - $objLanguageManager->getText('XJXRSP:CPERR:01') - , E_USER_WARNING - ); - } - //EndSkipDebug - - return $this->addCommand( - array( - 'cmd'=>'ce', - 'id'=>$sParent, - 'prop'=>$sId - ), - $sTag - ); - } - - /* - Function: insert - - Response command used to insert a new element just prior to the specified - element. - - Parameters: - - sBefore - (string): The element used as a reference point for the - insertion. - sTag - (string): The tag to be used for the new element. - sId - (string): The id to be used for the new element. - - Returns: - - object : The object. - */ - function insert($sBefore, $sTag, $sId) - { - return $this->addCommand( - array( - 'cmd'=>'ie', - 'id'=>$sBefore, - 'prop'=>$sId - ), - $sTag - ); - } - - /* - Function: insertAfter - - Response command used to insert a new element after the specified - one. - - Parameters: - - sAfter - (string): The id of the element that will be used as a reference - for the insertion. - sTag - (string): The tag name to be used for the new element. - sId - (string): The id to be used for the new element. - - Returns: - - object : The object. - */ - function insertAfter($sAfter, $sTag, $sId) - { - return $this->addCommand( - array( - 'cmd'=>'ia', - 'id'=>$sAfter, - 'prop'=>$sId - ), - $sTag - ); - } - - /* - Function: createInput - - Response command used to create an input element on the browser. - - Parameters: - - sParent - (string): The id of the parent element. - sType - (string): The type of the new input element. - sName - (string): The name of the new input element. - sId - (string): The id of the new element. - - Returns: - - object : The object. - */ - function createInput($sParent, $sType, $sName, $sId) - { - return $this->addCommand( - array( - 'cmd'=>'ci', - 'id'=>$sParent, - 'prop'=>$sId, - 'type'=>$sType - ), - $sName - ); - } - - /* - Function: insertInput - - Response command used to insert a new input element preceeding the - specified element. - - Parameters: - - sBefore - (string): The id of the element to be used as the reference - point for the insertion. - sType - (string): The type of the new input element. - sName - (string): The name of the new input element. - sId - (string): The id of the new input element. - - Returns: - - object : The object. - */ - function insertInput($sBefore, $sType, $sName, $sId) - { - return $this->addCommand( - array( - 'cmd'=>'ii', - 'id'=>$sBefore, - 'prop'=>$sId, - 'type'=>$sType - ), - $sName - ); - } - - /* - Function: insertInputAfter - - Response command used to insert a new input element after the - specified element. - - Parameters: - - sAfter - (string): The id of the element that is to be used - as the insertion point for the new element. - sType - (string): The type of the new input element. - sName - (string): The name of the new input element. - sId - (string): The id of the new input element. - - Returns: - - object : The object. - */ - function insertInputAfter($sAfter, $sType, $sName, $sId) - { - return $this->addCommand( - array( - 'cmd'=>'iia', - 'id'=>$sAfter, - 'prop'=>$sId, - 'type'=>$sType - ), - $sName - ); - } - - /* - Function: setEvent - - Response command used to set an event handler on the browser. - - Parameters: - - sTarget - (string): The id of the element that contains the event. - sEvent - (string): The name of the event. - sScript - (string): The javascript to execute when the event is fired. - - Returns: - - object : The object. - */ - function setEvent($sTarget,$sEvent,$sScript) - { - return $this->addCommand( - array( - 'cmd'=>'ev', - 'id'=>$sTarget, - 'prop'=>$sEvent - ), - $sScript - ); - } - - - /* - Function: addEvent - - Response command used to set an event handler on the browser. - - Parameters: - - sTarget - (string): The id of the element that contains the event. - sEvent - (string): The name of the event. - sScript - (string): The javascript to execute when the event is fired. - - Returns: - - object : The object. - - Note: - - This function is depreciated and will be removed in a future version. - Use instead. - */ - function addEvent($sTarget,$sEvent,$sScript) - { - return $this->setEvent( - $sTarget, - $sEvent, - $sScript - ); - } - - /* - Function: addHandler - - Response command used to install an event handler on the specified element. - - Parameters: - - sTarget - (string): The id of the element. - sEvent - (string): The name of the event to add the handler to. - sHandler - (string): The javascript function to call when the event is fired. - - You can add more than one event handler to an element's event using this method. - - Returns: - - object - The object. - */ - function addHandler($sTarget,$sEvent,$sHandler) - { - return $this->addCommand( - array( - 'cmd'=>'ah', - 'id'=>$sTarget, - 'prop'=>$sEvent - ), - $sHandler - ); - } - - /* - Function: removeHandler - - Response command used to remove an event handler from an element. - - Parameters: - - sTarget - (string): The id of the element. - sEvent - (string): The name of the event. - sHandler - (string): The javascript function that is called when the - event is fired. - - Returns: - - object : The object. - */ - function removeHandler($sTarget,$sEvent,$sHandler) - { - return $this->addCommand( - array( - 'cmd'=>'rh', - 'id'=>$sTarget, - 'prop'=>$sEvent - ), - $sHandler); - } - - /* - Function: setFunction - - Response command used to construct a javascript function on the browser. - - Parameters: - - sFunction - (string): The name of the function to construct. - sArgs - (string): Comma separated list of parameter names. - sScript - (string): The javascript code that will become the body of the - function. - - Returns: - - object : The object. - */ - function setFunction($sFunction, $sArgs, $sScript) - { - return $this->addCommand( - array( - 'cmd'=>'sf', - 'func'=>$sFunction, - 'prop'=>$sArgs - ), - $sScript - ); - } - - /* - Function: wrapFunction - - Response command used to construct a wrapper function around - and existing javascript function on the browser. - - Parameters: - - sFunction - (string): The name of the existing function to wrap. - sArgs - (string): The comma separated list of parameters for the function. - aScripts - (array): An array of javascript code snippets that will - be used to build the body of the function. The first piece of code - specified in the array will occur before the call to the original - function, the second will occur after the original function is called. - sReturnValueVariable - (string): The name of the variable that will - retain the return value from the call to the original function. - - Returns: - - object : The object. - */ - function wrapFunction($sFunction, $sArgs, $aScripts, $sReturnValueVariable) - { - return $this->addCommand( - array( - 'cmd'=>'wpf', - 'func'=>$sFunction, - 'prop'=>$sArgs, - 'type'=>$sReturnValueVariable - ), - $aScripts - ); - } - - /* - Function: includeScript - - Response command used to load a javascript file on the browser. - - Parameters: - - sFileName - (string): The relative or fully qualified URI of the - javascript file. - - sType - (string): Determines the script type . Defaults to 'text/javascript'. - - - Returns: - - object : The object. - */ - function includeScript($sFileName, $sType = null, $sId = null) - { - $command = array('cmd' => 'in'); - - if (false === (null === $sType)) - $command['type'] = $sType; - - if (false === (null === $sId)) - $command['elm_id'] = $sId; - - return $this->addCommand( - $command, - $sFileName - ); - } - - /* - Function: includeScriptOnce - - Response command used to include a javascript file on the browser - if it has not already been loaded. - - Parameters: - - sFileName - (string): The relative for fully qualified URI of the - javascript file. - - sType - (string): Determines the script type . Defaults to 'text/javascript'. - - Returns: - - object : The object. - */ - function includeScriptOnce($sFileName, $sType = null, $sId = null) - { - $command = array('cmd' => 'ino'); - - if (false === (null === $sType)) - $command['type'] = $sType; - - if (false === (null === $sId)) - $command['elm_id'] = $sId; - - return $this->addCommand( - $command, - $sFileName - ); - } - - /* - Function: removeScript - - Response command used to remove a SCRIPT reference to a javascript - file on the browser. Optionally, you can call a javascript function - just prior to the file being unloaded (for cleanup). - - Parameters: - - sFileName - (string): The relative or fully qualified URI of the - javascript file. - sUnload - (string): Name of a javascript function to call prior - to unlaoding the file. - - Returns: - - object : The object. - */ - function removeScript($sFileName, $sUnload = '') { - $this->addCommand( - array( - 'cmd'=>'rjs', - 'unld'=>$sUnload - ), - $sFileName - ); - return $this; - } - - /* - Function: includeCSS - - Response command used to include a LINK reference to - the specified CSS file on the browser. This will cause the - browser to load and apply the style sheet. - - Parameters: - - sFileName - (string): The relative or fully qualified URI of - the css file. - - sMedia - (string): Determines the media type of the CSS file. Defaults to 'screen'. - - Returns: - - object : The object. - */ - function includeCSS($sFileName, $sMedia = null) - { - $command = array('cmd' => 'css'); - - if (false === (null === $sMedia)) - $command['media'] = $sMedia; - - return $this->addCommand( - $command, - $sFileName - ); - } - - /* - Function: removeCSS - - Response command used to remove a LINK reference to - a CSS file on the browser. This causes the browser to - unload the style sheet, effectively removing the style - changes it caused. - - Parameters: - - sFileName - (string): The relative or fully qualified URI - of the css file. - - Returns: - - object : The object. - */ - function removeCSS($sFileName, $sMedia = null) - { - $command = array('cmd'=>'rcss'); - - if (false === (null === $sMedia)) - $command['media'] = $sMedia; - - return $this->addCommand( - $command, - $sFileName - ); - } - - /* - Function: waitForCSS - - Response command instructing xajax to pause while the CSS - files are loaded. The browser is not typically a multi-threading - application, with regards to javascript code. Therefore, the - CSS files included or removed with includeCSS> and - removeCSS> respectively, will not be loaded or - removed until the browser regains control from the script. This - command returns control back to the browser and pauses the execution - of the response until the CSS files, included previously, are - loaded. - - Parameters: - - iTimeout - (integer): The number of 1/10ths of a second to pause - before timing out and continuing with the execution of the - response commands. - - Returns: - - object : The object. - */ - function waitForCSS($iTimeout = 600) { - $sData = ""; - $this->addCommand( - array( - 'cmd'=>'wcss', - 'prop'=>$iTimeout - ), - $sData - ); - return $this; - } - - /* - Function: waitFor - - Response command instructing xajax to delay execution of the response - commands until a specified condition is met. Note, this returns control - to the browser, so that other script operations can execute. xajax - will continue to monitor the specified condition and, when it evaulates - to true, will continue processing response commands. - - Parameters: - - script - (string): A piece of javascript code that evaulates to true - or false. - tenths - (integer): The number of 1/10ths of a second to wait before - timing out and continuing with the execution of the response - commands. - - Returns: - - object : The object. - */ - function waitFor($script, $tenths) { - return $this->addCommand( - array( - 'cmd'=>'wf', - 'prop'=>$tenths - ), - $script - ); - } - - /* - Function: sleep - - Response command which instructs xajax to pause execution - of the response commands, returning control to the browser - so it can perform other commands asynchronously. After - the specified delay, xajax will continue execution of the - response commands. - - Parameters: - - tenths - (integer): The number of 1/10ths of a second to - sleep. - - Returns: - - object : The object. - */ - function sleep($tenths) { - $this->addCommand( - array( - 'cmd'=>'s', - 'prop'=>$tenths - ), - '' - ); - return $this; - } - - /* - Function: setReturnValue - - Stores a value that will be passed back as part of the response. - When making synchronous requests, the calling javascript can - obtain this value immediately as the return value of the - function. - - Parameters: - - value - (mixed): Any value. - - Returns: - - object : The object. - */ - function setReturnValue($value) { - $this->returnValue = $this->_encodeArray($value); - return $this; - } - - /* - Function: getContentType - - Returns the current content type that will be used for the - response packet. (typically: "text/xml") - - Returns: - - string : The content type. - */ - function getContentType() - { - return 'text/xml'; - } - - /* - Function: getOutput - */ - function getOutput() - { - ob_start(); - $this->_printHeader_XML(); - $this->_printResponse_XML(); - return ob_get_clean(); - } - - /* - Function: printOutput - - Prints the output, generated from the commands added to the response, - that will be sent to the browser. - - Returns: - - string : The textual representation of the response commands. - */ - function printOutput() - { - $this->_sendHeaders(); - $this->_printHeader_XML(); - $this->_printResponse_XML(); - } - - /* - Function: _sendHeaders - - Used internally to generate the response headers. - */ - function _sendHeaders() - { - $objArgumentManager =& xajaxArgumentManager::getInstance(); - if (XAJAX_METHOD_GET == $objArgumentManager->getRequestMethod()) - { - header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); - header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); - header ("Cache-Control: no-cache, must-revalidate"); - header ("Pragma: no-cache"); - } - - $sCharacterSet = ''; - if ($this->sCharacterEncoding && 0 < strlen(trim($this->sCharacterEncoding))) { - $sCharacterSet = '; charset="' . trim($this->sCharacterEncoding) . '"'; - } - - $sContentType = $this->getContentType(); - - header('content-type: ' . $sContentType . ' ' . $sCharacterSet); - } - - /* - Function: getCommandCount - - Returns: - - integer : The number of commands in the response. - */ - function getCommandCount() - { - return count($this->aCommands); - } - - /* - Function: loadCommands - - Merges the response commands from the specified - object with the response commands in this object. - - Parameters: - - mCommands - (object): object. - bBefore - (boolean): Add the new commands to the beginning - of the list. - - */ - function loadCommands($mCommands, $bBefore=false) - { - if (is_a($mCommands, 'xajaxResponse')) { - $this->returnValue = $mCommands->returnValue; - - if ($bBefore) { - $this->aCommands = array_merge($mCommands->aCommands, $this->aCommands); - } - else { - $this->aCommands = array_merge($this->aCommands, $mCommands->aCommands); - } - } - else if (is_array($mCommands)) { - if ($bBefore) { - $this->aCommands = array_merge($mCommands, $this->aCommands); - } - else { - $this->aCommands = array_merge($this->aCommands, $mCommands); - } - } - else { - //SkipDebug - if (!empty($mCommands)) { - $objLanguageManager =& xajaxLanguageManager::getInstance(); - trigger_error( - $objLanguageManager->getText('XJXRSP:LCERR:01') - , E_USER_ERROR - ); - } - //EndSkipDebug - } - } - - function absorb($objResponse) - { - $this->loadCommands($objResponse); - } - - /* - Function: addPluginCommand - - Adds a response command that is generated by a plugin. - - Parameters: - - objPlugin - (object): A reference to a plugin object. - aAttributes - (array): Array containing the attributes for this - response command. - mData - (mixed): The data to be sent with this command. - - Returns: - - object : The object. - */ - function addPluginCommand($objPlugin, $aAttributes, $mData) - { - $aAttributes['plg'] = $objPlugin->getName(); - return $this->addCommand($aAttributes, $mData); - } - - /* - Function: addCommand - - Add a response command to the array of commands that will - be sent to the browser. - - Parameters: - - aAttributes - (array): Associative array of attributes that - will describe the command. - mData - (mixed): The data to be associated with this command. - - Returns: - - object : The command. - */ - function addCommand($aAttributes, $mData) - { - $aAttributes['data'] = $this->_encodeArray($mData); - $this->aCommands[] = $aAttributes; - return $this; - } - - /* - Function: _printHeader_XML - - Used internally to print XML start tag. - */ - function _printHeader_XML() - { - echo '<'; - echo '?'; - echo 'xml version="1.0"'; - - $sEncoding = trim($this->sCharacterEncoding); - if ($this->sCharacterEncoding && 0 < strlen($sEncoding)) { - echo ' encoding="'; - echo $sEncoding; - echo '"'; - } - - echo ' ?'; - echo '>'; - } - - /* - Function: _printResponse_XML - - Used internally to generate the command output. - */ - function _printResponse_XML() - { - echo '<'; - echo 'xjx>'; - - if (null !== $this->returnValue) - { - echo '<'; - echo 'xjxrv>'; - - $this->_printArray_XML($this->returnValue); - - echo '<'; - echo '/xjxrv>'; - } - - foreach(array_keys($this->aCommands) as $sKey) - $this->_printCommand_XML($this->aCommands[$sKey]); - - echo '<'; - echo '/xjx>'; - } - - /* - Function: _printCommand_XML - - Prints an XML representation of the command. - - Parameters: - - aAttributes - (array): Associative array of attributes for this - command. - */ - function _printCommand_XML(&$aAttributes) - { - echo '<'; - echo 'cmd'; - - $mData = ''; - - foreach (array_keys($aAttributes) as $sKey) { - if ($sKey) { - if ('data' != $sKey) { - echo ' '; - echo $sKey; - echo '="'; - echo $aAttributes[$sKey]; - echo '"'; - } else - $mData =& $aAttributes[$sKey]; - } - } - - echo '>'; - - $this->_printArray_XML($mData); - - echo '<'; - echo '/cmd>'; - } - - /* - Function: _printArray_XML - - Prints an XML representation of a php array suitable - for inclusion in the response to the browser. Arrays - sent via this method will be converted into a javascript - array on the browser. - - Parameters: - - mArray - (array): Array to be converted. - */ - function _printArray_XML(&$mArray) { - if ('object' == gettype($mArray)) - $mArray = get_object_vars($mArray); - - if (false == is_array($mArray)) { - $this->_printEscapedString_XML($mArray); - return; - } - - echo '<'; - echo 'xjxobj>'; - - foreach (array_keys($mArray) as $sKey) { - if (is_array($mArray[$sKey])) { - echo '<'; - echo 'e>'; - - foreach (array_keys($mArray[$sKey]) as $sInnerKey) { - //SkipDebug - if (htmlspecialchars($sInnerKey, ENT_COMPAT, 'UTF-8') != $sInnerKey) { - $objLanguageManager =& xajaxLanguageManager::getInstance(); - trigger_error( - $objLanguageManager->getText('XJXRSP:AKERR:01') - , E_USER_ERROR - ); - } - //EndSkipDebug - - if ('k' == $sInnerKey || 'v' == $sInnerKey) { - echo '<'; - echo $sInnerKey; - echo '>'; - $this->_printArray_XML($mArray[$sKey][$sInnerKey]); - echo '<'; - echo '/'; - echo $sInnerKey; - echo '>'; - } else { - //SkipDebug - $objLanguageManager =& xajaxLanguageManager::getInstance(); - trigger_error( - $objLanguageManager->getText('XJXRSP:IEAERR:01') - , E_USER_ERROR - ); - //EndSkipDebug - } - } - - echo '<'; - echo '/e>'; - } else { - //SkipDebug - $objLanguageManager =& xajaxLanguageManager::getInstance(); - trigger_error( - $objLanguageManager->getText('XJXRSP:NEAERR:01') - , E_USER_ERROR - ); - //EndSkipDebug - } - } - - echo '<'; - echo '/xjxobj>'; - } - - /* - Function: _printEscapedString_XML - - Escape the specified data if necessary, so special characters in the - command data does not interfere with the structure of the response. - - This could be overridden to allow for transport encodings other than - XML. - - Parameters: - - sData - (string): The data to be escaped. - - Returns: - - string : The escaped data. - */ - function _printEscapedString_XML(&$sData) - { - if (is_null($sData) || false == isset($sData)) { - echo '*'; - return; - } - - if ($this->bOutputEntities) { - //SkipDebug - if (false === function_exists('mb_convert_encoding')) { - $objLanguageManager =& xajaxLanguageManager::getInstance(); - trigger_error( - $objLanguageManager->getText('XJXRSP:MBEERR:01') - , E_USER_NOTICE - ); - } - //EndSkipDebug - - echo call_user_func_array('mb_convert_encoding', array(&$sData, 'HTML-ENTITIES', $this->sCharacterEncoding)); - return; - } - - $nCDATA = 0; - - $bNoOpenCDATA = (false === strpos($sData, '<'.'![CDATA[')); - if ($bNoOpenCDATA) { - $bNoCloseCDATA = (false === strpos($sData, ']]>')); - if ($bNoCloseCDATA) { - $bSpecialChars = (htmlspecialchars($sData, ENT_COMPAT, 'UTF-8') != $sData); - if ($bSpecialChars) - $nCDATA = 1; - } else - $nCDATA = 2; - } else - $nCDATA = 2; - - if (0 < $nCDATA) { - echo '<'; - echo '![CDATA['; - - // PHP defines numeric values as integer or float (double and real are aliases of float) - if (is_string($sData)) { - echo 'S'; - } else if (is_int($sData) || is_float($sData)) { - echo 'N'; - } else if (is_bool($sData)) { - echo 'B'; - } - - if (1 < $nCDATA) { - $aSegments = explode('<'.'![CDATA[', $sData); - $aOutput = array(); - $nOutput = 0; - foreach (array_keys($aSegments) as $keySegment) { - $aFragments = explode(']]>', $aSegments[$keySegment]); - $aStack = array(); - $nStack = 0; - foreach (array_keys($aFragments) as $keyFragment) { - if (0 < $nStack) - array_push($aStack, ']]]]><', '![CDATA[>', $aFragments[$keyFragment]); - else - $aStack[] = $aFragments[$keyFragment]; - ++$nStack; - } - if (0 < $nOutput) - array_push($aOutput, '<', '![]]><', '![CDATA[CDATA[', implode('', $aStack)); - else - $aOutput[] = implode('', $aStack); - ++$nOutput; - } - echo implode('', $aOutput); - } else - echo $sData; - - echo ']]>'; - } else { - if (is_string($sData)) { - echo 'S'; - } else if (is_int($sData) || is_float($sData)) { - echo 'N'; - } else if (is_bool($sData)) { - echo 'B'; - } - echo $sData; - } - } - - /* - Function: _encodeArray - - Recursively serializes a data structure in an array so that it can - be sent to the browser. This can be thought of as the opposite of - _parseObjXml>. - - Parameters: - - mData - (mixed): The data to be evaluated. - - Returns: - - mixed : The object constructed from the data. - */ - function _encodeArray(&$mData) { - if ('object' === gettype($mData)) - $mData = get_object_vars($mData); - - if (false === is_array($mData)) - return $mData; - - $aData = array(); - foreach (array_keys($mData) as $sKey) - $aData[] = array( - // key does not need to be encoded - 'k'=>$sKey, - 'v'=>$this->_encodeArray($mData[$sKey]) - ); - return $aData; - } - -}// end class xajaxResponse - -class xajaxCustomResponse -{ - var $sOutput; - var $sContentType; - - var $sCharacterEncoding; - var $bOutputEntities; - - function xajaxCustomResponse($sContentType) - { - $this->sOutput = ''; - $this->sContentType = $sContentType; - - $objResponseManager =& xajaxResponseManager::getInstance(); - - $this->sCharacterEncoding = $objResponseManager->getCharacterEncoding(); - $this->bOutputEntities = $objResponseManager->getOutputEntities(); - } - - function setCharacterEncoding($sCharacterEncoding) - { - $this->sCharacterEncoding = $sCharacterEncoding; - } - - function setOutputEntities($bOutputEntities) - { - $this->bOutputEntities = $bOutputEntities; - } - - function clear() - { - $this->sOutput = ''; - } - - function append($sOutput) - { - $this->sOutput .= $sOutput; - } - - function absorb($objResponse) - { - //SkipDebug - if (false == is_a($objResponse, 'xajaxCustomResponse')) { - $objLanguageManager =& xajaxLanguageManager::getInstance(); - trigger_error( - $objLanguageManager->getText('XJXRSP:MXRTERR') - , E_USER_ERROR - ); - } - - if ($objResponse->getContentType() != $this->getContentType()) { - $objLanguageManager =& xajaxLanguageManager::getInstance(); - trigger_error( - $objLanguageManager->getText('XJXRSP:MXCTERR') - , E_USER_ERROR - ); - } - - if ($objResponse->getCharacterEncoding() != $this->getCharacterEncoding()) { - $objLanguageManager =& xajaxLanguageManager::getInstance(); - trigger_error( - $objLanguageManager->getText('XJXRSP:MXCEERR') - , E_USER_ERROR - ); - } - - if ($objResponse->getOutputEntities() != $this->getOutputEntities()) { - $objLanguageManager =& xajaxLanguageManager::getInstance(); - trigger_error( - $objLanguageManager->getText('XJXRSP:MXOEERR') - , E_USER_ERROR - ); - } - //EndSkipDebug - - $this->sOutput .= $objResponse->getOutput(); - } - - function getContentType() - { - return $this->sContentType; - } - - function getCharacterEncoding() - { - return $this->sCharacterEncoding; - } - - function getOutputEntities() - { - return $this->bOutputEntities; - } - - function getOutput() - { - return $this->sOutput; - } - - function printOutput() - { - $sContentType = $this->sContentType; - $sCharacterSet = $this->sCharacterEncoding; - - header("content-type: {$sContentType}; charset={$sCharacterSet}"); - - echo $this->sOutput; - } -} diff --git a/phpgwapi/inc/xajax/xajax_core/xajaxResponseManager.inc.php b/phpgwapi/inc/xajax/xajax_core/xajaxResponseManager.inc.php deleted file mode 100644 index 795eceac58..0000000000 --- a/phpgwapi/inc/xajax/xajax_core/xajaxResponseManager.inc.php +++ /dev/null @@ -1,231 +0,0 @@ - for a detailed description, copyright - and license information. -*/ - -/* - @package xajax - @version $Id: xajaxResponseManager.inc.php 362 2007-05-29 15:32:24Z calltoconstruct $ - @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson - @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson - @license http://www.xajaxproject.org/bsd_license.txt BSD License -*/ - -/* - Class: xajaxResponseManager - - This class stores and tracks the response that will be returned after - processing a request. The response manager represents a single point - of contact for working with objects as well as - objects. -*/ -class xajaxResponseManager -{ - /* - Object: objResponse - - The current response object that will be sent back to the browser - once the request processing phase is complete. - */ - var $objResponse; - - /* - String: sCharacterEncoding - */ - var $sCharacterEncoding; - - /* - Boolean: bOutputEntities - */ - var $bOutputEntities; - - /* - Array: aDebugMessages - */ - var $aDebugMessages; - - /* - Function: xajaxResponseManager - - Construct and initialize the one and only xajaxResponseManager object. - */ - function xajaxResponseManager() - { - $this->objResponse = NULL; - $this->aDebugMessages = array(); - } - - /* - Function: getInstance - - Implementation of the singleton pattern: provide a single instance of the - to all who request it. - */ - function &getInstance() - { - static $obj; - if (!$obj) { - $obj = new xajaxResponseManager(); - } - return $obj; - } - - /* - Function: configure - - Called by the xajax object when configuration options are set in the main script. Option - values are passed to each of the main xajax components and stored locally as needed. The - will track the characterEncoding and outputEntities settings. - - Parameters: - $sName - (string): Setting name - $mValue - (mixed): Value - */ - function configure($sName, $mValue) - { - if ('characterEncoding' == $sName) - { - $this->sCharacterEncoding = $mValue; - - if (isset($this->objResponse)) - $this->objResponse->setCharacterEncoding($this->sCharacterEncoding); - } - else if ('outputEntities' == $sName) - { - if (true === $mValue || false === $mValue) - { - $this->bOutputEntities = $mValue; - - if (isset($this->objResponse)) - $this->objResponse->setOutputEntities($this->bOutputEntities); - } - } - } - - /* - Function: clear - - Clear the current response. A new response will need to be appended - before the request processing is complete. - */ - function clear() - { - $this->objResponse = NULL; - } - - /* - Function: append - - Used, primarily internally, to append one response object onto the end of another. You can - append one xajaxResponse to the end of another, or append a xajaxCustomResponse onto the end of - another xajaxCustomResponse. However, you cannot append a standard response object onto the end - of a custom response and likewise, you cannot append a custom response onto the end of a standard - response. - - Parameters: - - $mResponse - (object): The new response object to be added to the current response object. - - If no prior response has been appended, this response becomes the main response object to which other - response objects will be appended. - */ - function append($mResponse) - { - if (is_a($mResponse, 'xajaxResponse')) { - if (NULL == $this->objResponse) { - $this->objResponse = $mResponse; - } else if (is_a($this->objResponse, 'xajaxResponse')) { - if ($this->objResponse != $mResponse) - $this->objResponse->absorb($mResponse); - } else { - $objLanguageManager =& xajaxLanguageManager::getInstance(); - $this->debug( - $objLanguageManager->getText('XJXRM:MXRTERR') - . get_class($this->objResponse) - . ')' - ); - } - } else if (is_a($mResponse, 'xajaxCustomResponse')) { - if (NULL == $this->objResponse) { - $this->objResponse = $mResponse; - } else if (is_a($this->objResponse, 'xajaxCustomResponse')) { - if ($this->objResponse != $mResponse) - $this->objResponse->absorb($mResponse); - } else { - $objLanguageManager =& xajaxLanguageManager::getInstance(); - $this->debug( - $objLanguageManager->getText('XJXRM:MXRTERR') - . get_class($this->objResponse) - . ')' - ); - } - } else { - $objLanguageManager =& xajaxLanguageManager::getInstance(); - $this->debug($objLanguageManager->getText('XJXRM:IRERR')); - } - } - - /* - Function: debug - - Appends a debug message on the end of the debug message queue. Debug messages - will be sent to the client with the normal response (if the response object supports - the sending of debug messages, see: ) - - Parameters: - - $sMessage - (string): The text of the debug message to be sent. - */ - function debug($sMessage) - { - $this->aDebugMessages[] = $sMessage; - } - - /* - Function: send - - Prints the response object to the output stream, thus sending the response to the client. - */ - function send() - { - if (NULL != $this->objResponse) { - foreach ($this->aDebugMessages as $sMessage) - $this->objResponse->debug($sMessage); - $this->aDebugMessages = array(); - $this->objResponse->printOutput(); - } - } - - /* - Function: getCharacterEncoding - - Called automatically by new response objects as they are constructed to obtain the - current character encoding setting. As the character encoding is changed, the - will automatically notify the current response object since it would have been constructed - prior to the setting change, see . - */ - function getCharacterEncoding() - { - return $this->sCharacterEncoding; - } - - /* - Function: getOutputEntities - - Called automatically by new response objects as they are constructed to obtain the - current output entities setting. As the output entities setting is changed, the - will automatically notify the current response object since it would - have been constructed prior to the setting change, see . - */ - function getOutputEntities() - { - return $this->bOutputEntities; - } -} \ No newline at end of file diff --git a/phpgwapi/inc/xajax/xajax_core/xajax_lang_de.inc.php b/phpgwapi/inc/xajax/xajax_core/xajax_lang_de.inc.php deleted file mode 100644 index 63d35c9a6e..0000000000 --- a/phpgwapi/inc/xajax/xajax_core/xajax_lang_de.inc.php +++ /dev/null @@ -1,88 +0,0 @@ - for a detailed description, copyright - and license information. - - Translations provided by: (Thank you!) - - mic - - q_no -*/ - -/* - @package xajax - @version $Id: xajax_lang_de.inc.php 362 2007-05-29 15:32:24Z calltoconstruct $ - @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson - @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson - @license http://www.xajaxproject.org/bsd_license.txt BSD License -*/ - -//SkipAIO - -$objLanguageManager =& xajaxLanguageManager::getInstance(); -$objLanguageManager->register('de', array( - 'LOGHDR:01' => '** xajax Fehler Protokoll - ', - 'LOGHDR:02' => " **\n", - 'LOGHDR:03' => "\n\n\n", - 'LOGERR:01' => "** Protokolliere Fehler **\n\nxajax konnte den Fehler nicht in die Protokolldatei schreiben:\n", - 'LOGMSG:01' => "** PHP Fehlermeldungen: **", - 'CMPRSJS:RDERR:01' => 'Die unkomprimierte JavaScript-Datei konnte nicht gefunden werden im Verzeichnis: ', - 'CMPRSJS:RDERR:02' => '. Fehler ', - 'CMPRSJS:WTERR:01' => 'Die komprimierte xajax JavaScript-Datei konnte nicht in das Verzeichnis ', - 'CMPRSJS:WTERR:02' => ' geschrieben werden. Fehler ', - 'CMPRSPHP:WTERR:01' => 'Die komprimierte xajax Datei ', - 'CMPRSPHP:WTERR:02' => ' konnte nicht geschrieben werden. Fehler ', - 'CMPRSAIO:WTERR:01' => 'Die komprimierte xajax Datei ', - 'CMPRSAIO:WTERR:02' => '/xajaxAIO.inc.php konnte nicht geschrieben werden. Fehler ', - 'DTCTURI:01' => 'xajax Fehler: xajax konnte die Request URI nicht automatisch identifizieren.', - 'DTCTURI:02' => 'Bitte setzen sie die Request URI explizit wenn sie die xajax Klasse instanziieren.', - 'ARGMGR:ERR:01' => 'Fehlerhaftes Objekt erhalten: ', - 'ARGMGR:ERR:02' => ' <==> ', - 'ARGMGR:ERR:03' => 'Die erhaltenen xajax Daten konnte nicht aus UTF8 konvertiert werden.', - 'XJXCTL:IAERR:01' => 'Ungültiges Attribut [', - 'XJXCTL:IAERR:02' => '] für Element [', - 'XJXCTL:IAERR:03' => '].', - 'XJXCTL:IRERR:01' => 'Ungültiges Request-Objekt übergeben an xajaxControl::setEvent', - 'XJXCTL:IEERR:01' => 'Ungültiges Attribut (event name) [', - 'XJXCTL:IEERR:02' => '] für Element [', - 'XJXCTL:IEERR:03' => '].', - 'XJXCTL:MAERR:01' => 'Erforderliches Attribut fehlt [', - 'XJXCTL:MAERR:02' => '] für Element [', - 'XJXCTL:MAERR:03' => '].', - 'XJXCTL:IETERR:01' => "Ungültiges End-Tag; Sollte 'forbidden' oder 'optional' sein.\n", - 'XJXCTL:ICERR:01' => "Ungültige Klasse für html control angegeben.; Sollte %inline, %block oder %flow sein.\n", - 'XJXCTL:ICLERR:01' => 'Ungültige Klasse (control) an addChild übergeben; Sollte abgeleitet sein von xajaxControl.', - 'XJXCTL:ICLERR:02' => 'Ungültige Klasse (control) an addChild übergeben [', - 'XJXCTL:ICLERR:03' => '] für Element [', - 'XJXCTL:ICLERR:04' => "].\n", - 'XJXCTL:ICHERR:01' => 'Ungültiger Parameter übergeben für xajaxControl::addChildren; Array aus xajaxControl Objekten erwartet.', - 'XJXCTL:MRAERR:01' => 'Erforderliches Attribut fehlt [', - 'XJXCTL:MRAERR:02' => '] für Element [', - 'XJXCTL:MRAERR:03' => '].', - 'XJXPLG:GNERR:01' => 'Response plugin sollte die Funktion getName überschreiben.', - 'XJXPLG:PERR:01' => 'Response plugin sollte die process Funktion überschreiben.', - 'XJXPM:IPLGERR:01' => 'Versuch ungültiges Plugin zu registrieren: : ', - 'XJXPM:IPLGERR:02' => ' Ableitung von xajaxRequestPlugin oder xajaxResponsePlugin erwartet.', - 'XJXPM:MRMERR:01' => 'Konnte die Registrierungsmethode nicht finden für: : ', - 'XJXRSP:EDERR:01' => 'Die Angabe der Zeichensatzkodierung in der xajaxResponse ist veraltet. Die neue Funktion lautet: $xajax->configure("characterEncoding", ...);', - 'XJXRSP:MPERR:01' => 'Ungültiger oder fehlender Pluginname festgestellt im Aufruf von xajaxResponse::plugin', - 'XJXRSP:CPERR:01' => "Der Parameter \$sType in addCreate ist veraltet. Die neue Funktion lautet addCreateInput()", - 'XJXRSP:LCERR:01' => "Das xajax response Objeckt konnte die Befehler nich verarbeiten, da kein gültiges Array übergeben wurde.", - 'XJXRSP:AKERR:01' => 'Ungültiger Tag-Name im Array.', - 'XJXRSP:IEAERR:01' => 'Ungeeignet kodiertes Array.', - 'XJXRSP:NEAERR:01' => 'Nicht kodiertes Array festgestellt.', - 'XJXRSP:MBEERR:01' => 'Die Ausgabe vonn xajax response konnte nicht in htmlentities umgewandelt werden, da die Funktion mb_convert_encoding nicht verfügbar ist.', - 'XJXRSP:MXRTERR' => 'Fehler: Kann keine verschiedenen Typen in einer einzelnen Antwort verarbeiten.', - 'XJXRSP:MXCTERR' => 'Fehler: Kann keine verschiedenen Content-Types in einer einzelnen Antwort verarbeiten.', - 'XJXRSP:MXCEERR' => 'Fehler: Kann keine verschiedenen Zeichensatzkodierungen in einer einzelnen Antwort verarbeiten.', - 'XJXRSP:MXOEERR' => 'Fehler: Kann keine output entities (true/false) in ener einzelnen Antwort verarbeiten.', - 'XJXRM:IRERR' => 'Ungültige Antwort erhalten während der Ausführung der Anfrage.', - 'XJXRM:MXRTERR' => 'Fehler: Kann kkeine verschiedenen reponse types benutzen während der Ausführung einer Anfrage: ' - )); - -//EndSkipAIO \ No newline at end of file diff --git a/phpgwapi/inc/xajax/xajax_core/xajax_lang_nl.inc.php b/phpgwapi/inc/xajax/xajax_core/xajax_lang_nl.inc.php deleted file mode 100644 index 6e19638328..0000000000 --- a/phpgwapi/inc/xajax/xajax_core/xajax_lang_nl.inc.php +++ /dev/null @@ -1,79 +0,0 @@ - for a detailed description, copyright - and license information. - - Translations provided by: (Thank you!) - - Jeffrey -*/ - -//SkipAIO - -$objLanguageManager =& xajaxLanguageManager::getInstance(); -$objLanguageManager->register('nl', array( - 'LOGHDR:01' => '** xajax Foutmelding logboek - ', - 'LOGHDR:02' => " **\n", - 'LOGHDR:03' => "\n\n\n", - 'LOGERR:01' => "** Logboek fouten **\n\nxajax was niet in staat om te schrijven naar het logboek:\n", - 'LOGMSG:01' => "** PHP Foutmeldingen: **", - 'CMPRSJS:RDERR:01' => 'Het xajax ongecomprimeerde Javascript bestand kon niet worden gevonden in de: ', - 'CMPRSJS:RDERR:02' => '. map. ', - 'CMPRSJS:WTERR:01' => 'Het xajax gecomprimeerde Javascript bestand kon niet worden geschreven in de: ', - 'CMPRSJS:WTERR:02' => ' map. Fout ', - 'CMPRSPHP:WTERR:01' => 'Naar het xajax gecomprimeerde bestand ', - 'CMPRSPHP:WTERR:02' => ' kon niet worden geschreven. Fout ', - 'CMPRSAIO:WTERR:01' => 'Naar het xajax gecomprimeerde bestand ', - 'CMPRSAIO:WTERR:02' => '/xajaxAIO.inc.php kon niet worden geschreven. Fout ', - 'DTCTURI:01' => 'xajax Fout: xajax kon de Request URI niet automatisch identificeren.', - 'DTCTURI:02' => 'Alstublieft, specificeer de Request URI expliciet bij het initiëren van het xajax object.', - 'ARGMGR:ERR:01' => 'Misvormd object argument ontvangen: ', - 'ARGMGR:ERR:02' => ' <==> ', - 'ARGMGR:ERR:03' => 'De binnenkomende xajax data kon niet wordt geconverteerd van UTF-8.', - 'XJXCTL:IAERR:01' => 'Ongeldig attribuut [', - 'XJXCTL:IAERR:02' => '] voor element [', - 'XJXCTL:IAERR:03' => '].', - 'XJXCTL:IRERR:01' => 'Ongeldige object aanvraag doorgegeven aan xajaxControl::setEvent', - 'XJXCTL:IEERR:01' => 'Ongeldig attribuut (event name) [', - 'XJXCTL:IEERR:02' => '] voor element [', - 'XJXCTL:IEERR:03' => '].', - 'XJXCTL:MAERR:01' => 'Ontbrekend attribuut [', - 'XJXCTL:MAERR:02' => '] voor element [', - 'XJXCTL:MAERR:03' => '].', - 'XJXCTL:IETERR:01' => "Ongeldige eind-tag; zou 'forbidden' of 'optional' moeten zijn..\n", - 'XJXCTL:ICERR:01' => "Ongeldige klasse gespecificeerd voor html control.; zou %inline, %block of %flow moeten zijn.\n", - 'XJXCTL:ICLERR:01' => 'Ongeldige (control) doorgegeven aan addChild; Zou moeten worden afgeleid van xajaxControl.', - 'XJXCTL:ICLERR:02' => 'Ongeldige (control) doorgegeven aan addChild [', - 'XJXCTL:ICLERR:03' => '] voor element [', - 'XJXCTL:ICLERR:04' => "].\n", - 'XJXCTL:ICHERR:01' => 'Ongeldige parameter doorgegeven aan xajaxControl::addChildren; Array moet bestaan uit xajaxControl objecten.', - 'XJXCTL:MRAERR:01' => 'Ontbrekend attribuut [', - 'XJXCTL:MRAERR:02' => '] voor element [', - 'XJXCTL:MRAERR:03' => '].', - 'XJXPLG:GNERR:01' => 'Retourneer plugin zou de getName functie moeten overschrijven.', - 'XJXPLG:PERR:01' => 'Retourneer plugin zou de proces functie moeten overschrijven.', - 'XJXPM:IPLGERR:01' => 'Poging om ongeldige plugin te registreren: : ', - 'XJXPM:IPLGERR:02' => ' afleiding moet komen van xajaxRequestPlugin of xajaxResponsePlugin.', - 'XJXPM:MRMERR:01' => 'Localisatie van registratie methode faalde voor het volgende: : ', - 'XJXRSP:EDERR:01' => 'Doorgeven van karakter decodering naar de xajaxResponse constructie is verouderd. De nieuwe functie luidt: $xajax->configure("characterEncoding", ...);', - 'XJXRSP:MPERR:01' => 'Ongeldige of ontbrekende plugin naam gedetecteerd in een aanvraag naar xajaxResponse::plugin', - 'XJXRSP:CPERR:01' => "De parameter \$sType in addCreate is verouderd.. De nieuwe functie luidt addCreateInput()", - 'XJXRSP:LCERR:01' => "Het xajax antwoord object kon de commando's niet laden, gezien de meegegeven data geen geldige array is.", - 'XJXRSP:AKERR:01' => 'Ongeldige ge-encodeerde tag naam in array', - 'XJXRSP:IEAERR:01' => 'Ungeeignet kodiertes Array.', - 'XJXRSP:NEAERR:01' => 'Niet gecodeerde array gedetecteerd.', - 'XJXRSP:MBEERR:01' => 'De xajax output kon niet worden geconverteerd naar HTML entities, gezien mb_convert_encoding niet beschikbaar is.', - 'XJXRSP:MXRTERR' => 'Fout: Kann keine verschiedenen Typen in einer einzelnen Antwort verarbeiten.', - 'XJXRSP:MXCTERR' => 'Fout: Kan geen meerdere typen verwisselen in een enkele teruggave.', - 'XJXRSP:MXCEERR' => 'Fout: Kan geen meerdere karakter decoderingen verwerken in een enkele teruggave.', - 'XJXRSP:MXOEERR' => 'Fout: kan geen output entities (true/false) in een enkele teruggave verwerken.', - 'XJXRM:IRERR' => 'Een ongeldig antwoord is geretourneerd tijdens het verwerken van deze aanvraag.', - 'XJXRM:MXRTERR' => 'Fout: Kan geen meerdere typen verwisselen tijdens het verwerken van een enkele aanvraag: ' - )); - -//EndSkipAIO \ No newline at end of file diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_core.js b/phpgwapi/inc/xajax/xajax_js/xajax_core.js deleted file mode 100644 index 2d9299ded1..0000000000 --- a/phpgwapi/inc/xajax/xajax_js/xajax_core.js +++ /dev/null @@ -1,411 +0,0 @@ - -if('undefined'==typeof xajax) -xajax={};if('undefined'==typeof xajax.config) -xajax.config={};xajax.config.setDefault=function(option,defaultValue){if('undefined'==typeof xajax.config[option]) -xajax.config[option]=defaultValue;} -xajax.config.setDefault('commonHeaders',{'If-Modified-Since':'Sat, 1 Jan 2000 00:00:00 GMT' -});xajax.config.setDefault('postHeaders',{});xajax.config.setDefault('getHeaders',{});xajax.config.setDefault('waitCursor',false);xajax.config.setDefault('statusMessages',false);xajax.config.setDefault('baseDocument',document);xajax.config.setDefault('requestURI',xajax.config.baseDocument.URL);xajax.config.setDefault('defaultMode','asynchronous');xajax.config.setDefault('defaultHttpVersion','HTTP/1.1');xajax.config.setDefault('defaultContentType','application/x-www-form-urlencoded');xajax.config.setDefault('defaultResponseDelayTime',1000);xajax.config.setDefault('defaultExpirationTime',10000);xajax.config.setDefault('defaultMethod','POST');xajax.config.setDefault('defaultRetry',5);xajax.config.setDefault('defaultReturnValue',false);xajax.config.setDefault('maxObjectDepth',20);xajax.config.setDefault('maxObjectSize',2000);xajax.config.setDefault('responseQueueSize',1000);xajax.config.status={update:function(){return{onRequest:function(){window.status='Sending Request...';}, -onWaiting:function(){window.status='Waiting for Response...';}, -onProcessing:function(){window.status='Processing...';}, -onComplete:function(){window.status='Done.';} -} -}, -dontUpdate:function(){return{onRequest:function(){}, -onWaiting:function(){}, -onProcessing:function(){}, -onComplete:function(){} -} -} -} -xajax.config.cursor={update:function(){return{onWaiting:function(){if(xajax.config.baseDocument.body) -xajax.config.baseDocument.body.style.cursor='wait';}, -onComplete:function(){xajax.config.baseDocument.body.style.cursor='auto';} -} -}, -dontUpdate:function(){return{onWaiting:function(){}, -onComplete:function(){} -} -} -} -xajax.tools={} -xajax.tools.$=function(sId){if(!sId) -return null;var oDoc=xajax.config.baseDocument;var obj=oDoc.getElementById(sId);if(obj) -return obj;if(oDoc.all) -return oDoc.all[sId];return obj;} -xajax.tools.arrayContainsValue=function(array,valueToCheck){var i=0;var l=array.length;while(i < l){if(array[i]==valueToCheck) -return true;++i;} -return false;} -xajax.tools.doubleQuotes=function(haystack){return haystack.replace(new RegExp("'",'g'),'"');} -xajax.tools.singleQuotes=function(haystack){return haystack.replace(new RegExp('"','g'),"'");} -xajax.tools._escape=function(data){if('undefined'==typeof data) -return data;if('string'!=typeof data) -return data;var needCDATA=false;if(encodeURIComponent(data)!=data){needCDATA=true;var segments=data.split('');var fragLen=fragments.length;segment='';for(var j=0;j < fragLen;++j){if(0!=j) -segment+=']]]]>';segment+=fragments[j];} -if(0!=i) -data.push('';return data;} -xajax.tools._objectToXML=function(obj,guard){var aXml=[];aXml.push('');for(var key in obj){++guard.size;if(guard.maxSize < guard.size) -return aXml.join('');if('undefined'!=typeof obj[key]){if('constructor'==key) -continue;if('function'==typeof obj[key]) -continue;aXml.push('');var val=xajax.tools._escape(key);aXml.push(val);aXml.push('');if('object'==typeof obj[key]){++guard.depth;if(guard.maxDepth > guard.depth){try{aXml.push(xajax.tools._objectToXML(obj[key],guard));}catch(e){} -} ---guard.depth;}else{var val=xajax.tools._escape(obj[key]);if('undefined'==typeof val||null==val){aXml.push('*');}else{var sType=typeof val;if('string'==sType) -aXml.push('S');else if('boolean'==sType) -aXml.push('B');else if('number'==sType) -aXml.push('N');aXml.push(val);} -} -aXml.push('');} -} -aXml.push('');return aXml.join('');} -xajax.tools._enforceDataType=function(value){value=new String(value);var type=value.substr(0,1);value=value.substr(1);if('*'==type) -value=null;else if('N'==type) -value=value-0;else if('B'==type) -value=!!value;return value;} -xajax.tools._nodeToObject=function(node){if(null==node) -return '';if('undefined'!=typeof node.nodeName){if('#cdata-section'==node.nodeName||'#text'==node.nodeName){var data='';do if(node.data)data+=node.data;while(node=node.nextSibling);return xajax.tools._enforceDataType(data);}else if('xjxobj'==node.nodeName){var key=null;var value=null;var data=new Array;var child=node.firstChild;while(child){if('e'==child.nodeName){var grandChild=child.firstChild;while(grandChild){if('k'==grandChild.nodeName) -key=xajax.tools._enforceDataType(grandChild.firstChild.data);else('v'==grandChild.nodeName) -value=xajax.tools._nodeToObject(grandChild.firstChild);grandChild=grandChild.nextSibling;} -if(null!=key){data[key]=value;key=value=null;} -} -child=child.nextSibling;} -return data;} -} -throw{code:10001,data:node.nodeName};} -xajax.tools.getRequestObject=function(){if('undefined'!=typeof XMLHttpRequest){xajax.tools.getRequestObject=function(){return new XMLHttpRequest();} -}else if('undefined'!=typeof ActiveXObject){xajax.tools.getRequestObject=function(){try{return new ActiveXObject('Msxml2.XMLHTTP.4.0');}catch(e){xajax.tools.getRequestObject=function(){try{return new ActiveXObject('Msxml2.XMLHTTP');}catch(e2){xajax.tools.getRequestObject=function(){return new ActiveXObject('Microsoft.XMLHTTP');} -return xajax.tools.getRequestObject();} -} -return xajax.tools.getRequestObject();} -} -}else if(window.createRequest){xajax.tools.getRequestObject=function(){return window.createRequest();} -}else{xajax.tools.getRequestObject=function(){throw{code:10002};} -} -return xajax.tools.getRequestObject();} -xajax.tools.getBrowserHTML=function(sValue){var oDoc=xajax.config.baseDocument;if(!oDoc.body) -return '';var elWorkspace=xajax.$('xajax_temp_workspace');if(!elWorkspace){elWorkspace=oDoc.createElement('div');elWorkspace.setAttribute('id','xajax_temp_workspace');elWorkspace.style.display='none';elWorkspace.style.visibility='hidden';oDoc.body.appendChild(elWorkspace);} -elWorkspace.innerHTML=sValue;var browserHTML=elWorkspace.innerHTML;elWorkspace.innerHTML='';return browserHTML;} -xajax.tools.willChange=function(element,attribute,newData){if('string'==typeof element) -element=xajax.$(element);if(element){var oldData;eval('oldData=element.'+attribute);return(newData!=oldData);} -return false;} -xajax.tools.getFormValues=function(parent){var submitDisabledElements=false;if(arguments.length > 1&&arguments[1]==true) -submitDisabledElements=true;var prefix='';if(arguments.length > 2) -prefix=arguments[2];if('string'==typeof parent) -parent=xajax.$(parent);var aFormValues={};if(parent) -if(parent.childNodes) -xajax.tools._getFormValues(aFormValues,parent.childNodes,submitDisabledElements,prefix);return aFormValues;} -xajax.tools._getFormValues=function(aFormValues,children,submitDisabledElements,prefix){var iLen=children.length;for(var i=0;i < iLen;++i){var child=children[i];if('undefined'!=typeof child.childNodes) -xajax.tools._getFormValues(aFormValues,child.childNodes,submitDisabledElements,prefix);xajax.tools._getFormValue(aFormValues,child,submitDisabledElements,prefix);} -} -xajax.tools._getFormValue=function(aFormValues,child,submitDisabledElements,prefix){if(!child.name) -return;if('PARAM'==child.tagName)return;if(child.disabled) -if(true==child.disabled) -if(false==submitDisabledElements) -return;if(prefix!=child.name.substring(0,prefix.length)) -return;if(child.type) -if(child.type=='radio'||child.type=='checkbox') -if(false==child.checked) -return;var name=child.name;var values=[];if('select-multiple'==child.type){var jLen=child.length;for(var j=0;j < jLen;++j){var option=child.options[j];if(true==option.selected) -values.push(option.value);} -}else{values=child.value;} -var keyBegin=name.indexOf('[');if(0 <=keyBegin){var n=name;var k=n.substr(0,n.indexOf('['));var a=n.substr(n.indexOf('['));if(typeof aFormValues[k]=='undefined') -aFormValues[k]=[];var p=aFormValues;while(a.length!=0){var sa=a.substr(0,a.indexOf(']')+1);var lk=k;var lp=p;a=a.substr(a.indexOf(']')+1);p=p[k];k=sa.substr(1,sa.length-2);if(k==''){if('select-multiple'==child.type){k=lk;p=lp;}else{k=p.length;} -} -if(typeof p[k]=='undefined') -p[k]=[];} -p[k]=values;}else{aFormValues[name]=values;} -} -xajax.tools.stripOnPrefix=function(sEventName){sEventName=sEventName.toLowerCase();if(0==sEventName.indexOf('on')) -sEventName=sEventName.replace(/on/,'');return sEventName;} -xajax.tools.addOnPrefix=function(sEventName){sEventName=sEventName.toLowerCase();if(0!=sEventName.indexOf('on')) -sEventName='on'+sEventName;return sEventName;} -xajax.tools.xml={};xajax.tools.xml.parseAttributes=function(child,obj){var iLen=child.attributes.length;for(var i=0;i < iLen;++i){var attr=child.attributes[i];obj[attr.name]=attr.value;} -} -xajax.tools.xml.parseChildren=function(child,obj){obj.data='';if(0 < child.childNodes.length){if(1 < child.childNodes.length){var grandChild=child.firstChild;do{if('#cdata-section'==grandChild.nodeName||'#text'==grandChild.nodeName){obj.data+=grandChild.data;} -}while(grandChild=grandChild.nextSibling);}else{var grandChild=child.firstChild;if('xjxobj'==grandChild.nodeName){obj.data=xajax.tools._nodeToObject(grandChild);return;}else if('#cdata-section'==grandChild.nodeName||'#text'==grandChild.nodeName){obj.data=grandChild.data;} -} -}else if('undefined'!=typeof child.data){obj.data=child.data;} -obj.data=xajax.tools._enforceDataType(obj.data);} -xajax.tools.xml.processFragment=function(xmlNode,seq,oRet,oRequest){var xx=xajax;var xt=xx.tools;while(xmlNode){if('cmd'==xmlNode.nodeName){var obj={};obj.fullName='*unknown*';obj.sequence=seq;obj.request=oRequest;obj.context=oRequest.context;xt.xml.parseAttributes(xmlNode,obj);xt.xml.parseChildren(xmlNode,obj);xt.queue.push(xx.response,obj);}else if('xjxrv'==xmlNode.nodeName){oRet=xt._nodeToObject(xmlNode.firstChild);}else if('debugmsg'==xmlNode.nodeName){}else -throw{code:10004,data:xmlNode.nodeName} -++seq;xmlNode=xmlNode.nextSibling;} -return oRet;} -xajax.tools.queue={} -xajax.tools.queue.create=function(size){return{start:0, -size:size, -end:0, -commands:[], -timeout:null -} -} -xajax.tools.queue.retry=function(obj,count){var retries=obj.retries;if(retries){--retries;if(1 > retries) -return false;}else retries=count;obj.retries=retries;return true;} -xajax.tools.queue.rewind=function(theQ){if(0 < theQ.start) ---theQ.start;else -theQ.start=theQ.size;} -xajax.tools.queue.setWakeup=function(theQ,when){if(null!=theQ.timeout){clearTimeout(theQ.timeout);theQ.timeout=null;} -theQ.timout=setTimeout(function(){xajax.tools.queue.process(theQ);},when);} -xajax.tools.queue.process=function(theQ){if(null!=theQ.timeout){clearTimeout(theQ.timeout);theQ.timeout=null;} -var obj=xajax.tools.queue.pop(theQ);while(null!=obj){try{if(false==xajax.executeCommand(obj)) -return false;}catch(e){} -delete obj;obj=xajax.tools.queue.pop(theQ);} -return true;} -xajax.tools.queue.push=function(theQ,obj){var next=theQ.end+1;if(next > theQ.size) -next=0;if(next!=theQ.start){theQ.commands[theQ.end]=obj;theQ.end=next;}else -throw{code:10003} -} -xajax.tools.queue.pushFront=function(theQ,obj){xajax.tools.queue.rewind(theQ);theQ.commands[theQ.start]=obj;} -xajax.tools.queue.pop=function(theQ){var next=theQ.start;if(next==theQ.end) -return null;next++;if(next > theQ.size) -next=0;var obj=theQ.commands[theQ.start];delete theQ.commands[theQ.start];theQ.start=next;return obj;} -xajax.responseProcessor={};xajax.responseProcessor.xml=function(oRequest){var xx=xajax;var xt=xx.tools;var xcb=xx.callback;var gcb=xcb.global;var lcb=oRequest.callback;var oRet=oRequest.returnValue;if(xt.arrayContainsValue(xx.responseSuccessCodes,oRequest.request.status)){xcb.execute([gcb,lcb],'onSuccess',oRequest);var seq=0;if(oRequest.request.responseXML){var responseXML=oRequest.request.responseXML;if(responseXML.documentElement){oRequest.status.onProcessing();var child=responseXML.documentElement.firstChild;oRet=xt.xml.processFragment(child,seq,oRet,oRequest);} -} -var obj={};obj.fullName='Response Complete';obj.sequence=seq;obj.request=oRequest;obj.context=oRequest.context;obj.cmd='rcmplt';xt.queue.push(xx.response,obj);if(null==xx.response.timeout) -xt.queue.process(xx.response);}else if(xt.arrayContainsValue(xx.responseRedirectCodes,oRequest.request.status)){xcb.execute([gcb,lcb],'onRedirect',oRequest);window.location=oRequest.request.getResponseHeader('location');xx.completeResponse(oRequest);}else if(xt.arrayContainsValue(xx.responseErrorsForAlert,oRequest.request.status)){xcb.execute([gcb,lcb],'onFailure',oRequest);xx.completeResponse(oRequest);} -return oRet;} -xajax.js={} -xajax.js.includeScriptOnce=function(command){command.fullName='includeScriptOnce';var fileName=command.data;var oDoc=xajax.config.baseDocument;var loadedScripts=oDoc.getElementsByTagName('script');var iLen=loadedScripts.length;for(var i=0;i < iLen;++i){var script=loadedScripts[i];if(script.src){if(0 <=script.src.indexOf(fileName)) -return true;} -} -return xajax.js.includeScript(command);} -xajax.js.includeScript=function(command){command.fullName='includeScript';var oDoc=xajax.config.baseDocument;var objHead=oDoc.getElementsByTagName('head');var objScript=oDoc.createElement('script');objScript.src=command.data;if('undefined'==typeof command.type)objScript.type='text/javascript';else objScript.type=command.type;if('undefined'!=typeof command.type)objScript.setAttribute('id',command.elm_id);objHead[0].appendChild(objScript);return true;} -xajax.js.removeScript=function(command){command.fullName='removeScript';var fileName=command.data;var unload=command.unld;var oDoc=xajax.config.baseDocument;var loadedScripts=oDoc.getElementsByTagName('script');var iLen=loadedScripts.length;for(var i=0;i < iLen;++i){var script=loadedScripts[i];if(script.src){if(0 <=script.src.indexOf(fileName)){if('undefined'!=typeof unload){var args={};args.data=unload;args.context=window;xajax.js.execute(args);} -var parent=script.parentNode;parent.removeChild(script);} -} -} -return true;} -xajax.js.sleep=function(command){command.fullName='sleep';if(xajax.tools.queue.retry(command,command.prop)){xajax.tools.queue.setWakeup(xajax.response,100);return false;} -return true;} -xajax.js.confirmCommands=function(command){command.fullName='confirmCommands';var msg=command.data;var numberOfCommands=command.id;if(false==confirm(msg)){while(0 < numberOfCommands){xajax.tools.queue.pop(xajax.response);--numberOfCommands;} -} -return true;} -xajax.js.execute=function(args){args.fullName='execute Javascript';var returnValue=true;args.context.xajaxDelegateCall=function(){eval(args.data);} -args.context.xajaxDelegateCall();return returnValue;} -xajax.js.waitFor=function(args){args.fullName='waitFor';var bResult=false;var cmdToEval='bResult = (';cmdToEval+=args.data;cmdToEval+=');';try{args.context.xajaxDelegateCall=function(){eval(cmdToEval);} -args.context.xajaxDelegateCall();}catch(e){} -if(false==bResult){if(xajax.tools.queue.retry(args,args.prop)){xajax.tools.queue.setWakeup(xajax.response,100);return false;} -} -return true;} -xajax.js.call=function(args){args.fullName='call js function';var parameters=args.data;var scr=new Array();scr.push(args.func);scr.push('(');if('undefined'!=typeof parameters){if('object'==typeof parameters){var iLen=parameters.length;if(0 < iLen){scr.push('parameters[0]');for(var i=1;i < iLen;++i) -scr.push(', parameters['+i+']');} -} -} -scr.push(');');args.context.xajaxDelegateCall=function(){eval(scr.join(''));} -args.context.xajaxDelegateCall();return true;} -xajax.js.setFunction=function(args){args.fullName='setFunction';var code=new Array();code.push(args.func);code.push(' = function(');if('object'==typeof args.prop){var separator='';for(var m in args.prop){code.push(separator);code.push(args.prop[m]);separator=',';} -}else code.push(args.prop);code.push(') { ');code.push(args.data);code.push(' }');args.context.xajaxDelegateCall=function(){eval(code.join(''));} -args.context.xajaxDelegateCall();return true;} -xajax.js.wrapFunction=function(args){args.fullName='wrapFunction';var code=new Array();code.push(args.func);code.push(' = xajax.js.makeWrapper(');code.push(args.func);code.push(', args.prop, args.data, args.type, args.context);');args.context.xajaxDelegateCall=function(){eval(code.join(''));} -args.context.xajaxDelegateCall();return true;} -xajax.js.makeWrapper=function(origFun,args,codeBlocks,returnVariable,context){var originalCall='';if(0 < returnVariable.length){originalCall+=returnVariable;originalCall+=' = ';} -var originalCall='origFun(';originalCall+=args;originalCall+='); ';var code='wrapper = function(';code+=args;code+=') { ';if(0 < returnVariable.length){code+=' var ';code+=returnVariable;code+=' = null;';} -var separator='';var bLen=codeBlocks.length;for(var b=0;b < bLen;++b){code+=separator;code+=codeBlocks[b];separator=originalCall;} -if(0 < returnVariable.length){code+=' return ';code+=returnVariable;code+=';';} -code+=' } ';var wrapper=null;context.xajaxDelegateCall=function(){eval(code);} -context.xajaxDelegateCall();return wrapper;} -xajax.dom={} -xajax.dom.assign=function(element,property,data){if('string'==typeof element) -element=xajax.$(element);switch(property){case 'innerHTML': -element.innerHTML=data;break;case 'outerHTML': -if('undefined'==typeof element.outerHTML){var r=xajax.config.baseDocument.createRange();r.setStartBefore(element);var df=r.createContextualFragment(data);element.parentNode.replaceChild(df,element);}else element.outerHTML=data;break;default: -if(xajax.tools.willChange(element,property,data)) -eval('element.'+property+' = data;');break;} -return true;} -xajax.dom.append=function(element,property,data){if('string'==typeof element) -element=xajax.$(element);eval('element.'+property+' += data;');return true;} -xajax.dom.prepend=function(element,property,data){if('string'==typeof element) -element=xajax.$(element);eval('element.'+property+' = data + element.'+property);return true;} -xajax.dom.replace=function(element,sAttribute,aData){var sSearch=aData['s'];var sReplace=aData['r'];if(sAttribute=='innerHTML') -sSearch=xajax.tools.getBrowserHTML(sSearch);if('string'==typeof element) -element=xajax.$(element);eval('var txt = element.'+sAttribute);var bFunction=false;if('function'==typeof txt){txt=txt.join('');bFunction=true;} -var start=txt.indexOf(sSearch);if(start >-1){var newTxt=[];while(start >-1){var end=start+sSearch.length;newTxt.push(txt.substr(0,start));newTxt.push(sReplace);txt=txt.substr(end,txt.length-end);start=txt.indexOf(sSearch);} -newTxt.push(txt);newTxt=newTxt.join('');if(bFunction){eval('element.'+sAttribute+'=newTxt;');}else if(xajax.tools.willChange(element,sAttribute,newTxt)){eval('element.'+sAttribute+'=newTxt;');} -} -return true;} -xajax.dom.remove=function(element){if('string'==typeof element) -element=xajax.$(element);if(element&&element.parentNode&&element.parentNode.removeChild) -element.parentNode.removeChild(element);return true;} -xajax.dom.create=function(objParent,sTag,sId){if('string'==typeof objParent) -objParent=xajax.$(objParent);var target=xajax.config.baseDocument.createElement(sTag);target.setAttribute('id',sId);if(objParent) -objParent.appendChild(target);return true;} -xajax.dom.insert=function(objSibling,sTag,sId){if('string'==typeof objSibling) -objSibling=xajax.$(objSibling);var target=xajax.config.baseDocument.createElement(sTag);target.setAttribute('id',sId);objSibling.parentNode.insertBefore(target,objSibling);return true;} -xajax.dom.insertAfter=function(objSibling,sTag,sId){if('string'==typeof objSibling) -objSibling=xajax.$(objSibling);var target=xajax.config.baseDocument.createElement(sTag);target.setAttribute('id',sId);objSibling.parentNode.insertBefore(target,objSibling.nextSibling);return true;} -xajax.dom.contextAssign=function(args){args.fullName='context assign';var code=[];code.push('this.');code.push(args.prop);code.push(' = data;');code=code.join('');args.context.xajaxDelegateCall=function(data){eval(code);} -args.context.xajaxDelegateCall(args.data);return true;} -xajax.dom.contextAppend=function(args){args.fullName='context append';var code=[];code.push('this.');code.push(args.prop);code.push(' += data;');code=code.join('');args.context.xajaxDelegateCall=function(data){eval(code);} -args.context.xajaxDelegateCall(args.data);return true;} -xajax.dom.contextPrepend=function(args){args.fullName='context prepend';var code=[];code.push('this.');code.push(args.prop);code.push(' = data + this.');code.push(args.prop);code.push(';');code=code.join('');args.context.xajaxDelegateCall=function(data){eval(code);} -args.context.xajaxDelegateCall(args.data);return true;} -xajax.css={} -xajax.css.add=function(fileName,media){var oDoc=xajax.config.baseDocument;var oHeads=oDoc.getElementsByTagName('head');var oHead=oHeads[0];var oLinks=oHead.getElementsByTagName('link');var found=false;var iLen=oLinks.length;for(var i=0;i < iLen&&false==found;++i) -if(0 <=oLinks[i].href.indexOf(fileName)&&oLinks[i].media==media) -found=true;if(false==found){var oCSS=oDoc.createElement('link');oCSS.rel='stylesheet';oCSS.type='text/css';oCSS.href=fileName;oCSS.media=media;oHead.appendChild(oCSS);} -return true;} -xajax.css.remove=function(fileName,media){var oDoc=xajax.config.baseDocument;var oHeads=oDoc.getElementsByTagName('head');var oHead=oHeads[0];var oLinks=oHead.getElementsByTagName('link');var i=0;while(i < oLinks.length) -if(0 <=oLinks[i].href.indexOf(fileName)&&oLinks[i].media==media) -oHead.removeChild(oLinks[i]);else++i;return true;} -xajax.css.waitForCSS=function(args){var oDocSS=xajax.config.baseDocument.styleSheets;var ssEnabled=[];var iLen=oDocSS.length;for(var i=0;i < iLen;++i){ssEnabled[i]=0;try{ssEnabled[i]=oDocSS[i].cssRules.length;}catch(e){try{ssEnabled[i]=oDocSS[i].rules.length;}catch(e){} -} -} -var ssLoaded=true;var iLen=ssEnabled.length;for(var i=0;i < iLen;++i) -if(0==ssEnabled[i]) -ssLoaded=false;if(false==ssLoaded){if(xajax.tools.queue.retry(args,args.prop)){xajax.tools.queue.setWakeup(xajax.response,10);return false;} -} -return true;} -xajax.forms={} -xajax.forms.getInput=function(type,name,id){if('undefined'==typeof window.addEventListener){xajax.forms.getInput=function(type,name,id){return xajax.config.baseDocument.createElement('');} -}else{xajax.forms.getInput=function(type,name,id){var oDoc=xajax.config.baseDocument;var Obj=oDoc.createElement('input');Obj.setAttribute('type',type);Obj.setAttribute('name',name);Obj.setAttribute('id',id);return Obj;} -} -return xajax.forms.getInput(type,name,id);} -xajax.forms.createInput=function(command){command.fullName='createInput';var objParent=command.id;var sType=command.type;var sName=command.data;var sId=command.prop;if('string'==typeof objParent) -objParent=xajax.$(objParent);var target=xajax.forms.getInput(sType,sName,sId);if(objParent&&target){objParent.appendChild(target);} -return true;} -xajax.forms.insertInput=function(command){command.fullName='insertInput';var objSibling=command.id;var sType=command.type;var sName=command.data;var sId=command.prop;if('string'==typeof objSibling) -objSibling=xajax.$(objSibling);var target=xajax.forms.getInput(sType,sName,sId);if(target&&objSibling&&objSibling.parentNode) -objSibling.parentNode.insertBefore(target,objSibling);return true;} -xajax.forms.insertInputAfter=function(command){command.fullName='insertInputAfter';var objSibling=command.id;var sType=command.type;var sName=command.data;var sId=command.prop;if('string'==typeof objSibling) -objSibling=xajax.$(objSibling);var target=xajax.forms.getInput(sType,sName,sId);if(target&&objSibling&&objSibling.parentNode) -objSibling.parentNode.insertBefore(target,objSibling.nextSibling);return true;} -xajax.events={} -xajax.events.setEvent=function(command){command.fullName='addEvent';var element=command.id;var sEvent=command.prop;var code=command.data;if('string'==typeof element) -element=xajax.$(element);sEvent=xajax.tools.addOnPrefix(sEvent);code=xajax.tools.doubleQuotes(code);eval('element.'+sEvent+' = function() { '+code+'; }');return true;} -xajax.events.addHandler=function(element,sEvent,fun){if(window.addEventListener){xajax.events.addHandler=function(command){command.fullName='addHandler';var element=command.id;var sEvent=command.prop;var fun=command.data;if('string'==typeof element) -element=xajax.$(element);sEvent=xajax.tools.stripOnPrefix(sEvent);eval('element.addEventListener("'+sEvent+'", '+fun+', false);');return true;} -}else{xajax.events.addHandler=function(command){command.fullName='addHandler';var element=command.id;var sEvent=command.prop;var fun=command.data;if('string'==typeof element) -element=xajax.$(element);sEvent=xajax.tools.addOnPrefix(sEvent);eval('element.attachEvent("'+sEvent+'", '+fun+', false);');return true;} -} -return xajax.events.addHandler(element,sEvent,fun);} -xajax.events.removeHandler=function(element,sEvent,fun){if(window.removeEventListener){xajax.events.removeHandler=function(command){command.fullName='removeHandler';var element=command.id;var sEvent=command.prop;var fun=command.data;if('string'==typeof element) -element=xajax.$(element);sEvent=xajax.tools.stripOnPrefix(sEvent);eval('element.removeEventListener("'+sEvent+'", '+fun+', false);');return true;} -}else{xajax.events.removeHandler=function(command){command.fullName='removeHandler';var element=command.id;var sEvent=command.prop;var fun=command.data;if('string'==typeof element) -element=xajax.$(element);sEvent=xajax.tools.addOnPrefix(sEvent);eval('element.detachEvent("'+sEvent+'", '+fun+', false);');return true;} -} -return xajax.events.removeHandler(element,sEvent,fun);} -xajax.callback={} -xajax.callback.create=function(){var xx=xajax;var xc=xx.config;var xcb=xx.callback;var oCB={} -oCB.timers={};oCB.timers.onResponseDelay=xcb.setupTimer( -(arguments.length > 0) -? arguments[0] -:xc.defaultResponseDelayTime);oCB.timers.onExpiration=xcb.setupTimer( -(arguments.length > 1) -? arguments[1] -:xc.defaultExpirationTime);oCB.onRequest=null;oCB.onResponseDelay=null;oCB.onExpiration=null;oCB.beforeResponseProcessing=null;oCB.onFailure=null;oCB.onRedirect=null;oCB.onSuccess=null;oCB.onComplete=null;return oCB;} -xajax.callback.setupTimer=function(iDelay){return{timer:null,delay:iDelay};} -xajax.callback.clearTimer=function(oCallback,sFunction){if('undefined'!=typeof oCallback.timers){if('undefined'!=typeof oCallback.timers[sFunction]){clearTimeout(oCallback.timers[sFunction].timer);} -}else if('object'==typeof oCallback){var iLen=oCallback.length;for(var i=0;i < iLen;++i) -xajax.callback.clearTimer(oCallback[i],sFunction);} -} -xajax.callback.execute=function(oCallback,sFunction,args){if('undefined'!=typeof oCallback[sFunction]){var func=oCallback[sFunction];if('function'==typeof func){if('undefined'!=typeof oCallback.timers[sFunction]){oCallback.timers[sFunction].timer=setTimeout(function(){func(args);},oCallback.timers[sFunction].delay);} -else{func(args);} -} -}else if('object'==typeof oCallback){var iLen=oCallback.length;for(var i=0;i < iLen;++i) -xajax.callback.execute(oCallback[i],sFunction,args);} -} -xajax.callback.global=xajax.callback.create();xajax.response=xajax.tools.queue.create(xajax.config.responseQueueSize);xajax.responseSuccessCodes=['0','200'];xajax.responseErrorsForAlert=['400','401','402','403','404','500','501','502','503'];xajax.responseRedirectCodes=['301','302','307'];if('undefined'==typeof xajax.command) -xajax.command={};xajax.command.create=function(sequence,request,context){var newCmd={};newCmd.cmd='*';newCmd.fullName='* unknown command name *';newCmd.sequence=sequence;newCmd.request=request;newCmd.context=context;return newCmd;} -if('undefined'==typeof xajax.command.handler) -xajax.command.handler={};if('undefined'==typeof xajax.command.handler.handlers) -xajax.command.handler.handlers=[];xajax.command.handler.register=function(shortName,func){xajax.command.handler.handlers[shortName]=func;} -xajax.command.handler.unregister=function(shortName){var func=xajax.command.handler.handlers[shortName];delete xajax.command.handler.handlers[shortName];return func;} -xajax.command.handler.isRegistered=function(command){var shortName=command.cmd;if(xajax.command.handler.handlers[shortName]) -return true;return false;} -xajax.command.handler.call=function(command){var shortName=command.cmd;return xajax.command.handler.handlers[shortName](command);} -xajax.command.handler.register('rcmplt',function(args){xajax.completeResponse(args.request);return true;});xajax.command.handler.register('css',function(args){args.fullName='includeCSS';if('undefined'==typeof args.media) -args.media='screen';return xajax.css.add(args.data,args.media);});xajax.command.handler.register('rcss',function(args){args.fullName='removeCSS';if('undefined'==typeof args.media) -args.media='screen';return xajax.css.remove(args.data,args.media);});xajax.command.handler.register('wcss',function(args){args.fullName='waitForCSS';return xajax.css.waitForCSS(args);});xajax.command.handler.register('as',function(args){args.fullName='assign/clear';try{return xajax.dom.assign(args.target,args.prop,args.data);}catch(e){} -return true;});xajax.command.handler.register('ap',function(args){args.fullName='append';return xajax.dom.append(args.target,args.prop,args.data);});xajax.command.handler.register('pp',function(args){args.fullName='prepend';return xajax.dom.prepend(args.target,args.prop,args.data);});xajax.command.handler.register('rp',function(args){args.fullName='replace';return xajax.dom.replace(args.id,args.prop,args.data);});xajax.command.handler.register('rm',function(args){args.fullName='remove';return xajax.dom.remove(args.id);});xajax.command.handler.register('ce',function(args){args.fullName='create';return xajax.dom.create(args.id,args.data,args.prop);});xajax.command.handler.register('ie',function(args){args.fullName='insert';return xajax.dom.insert(args.id,args.data,args.prop);});xajax.command.handler.register('ia',function(args){args.fullName='insertAfter';return xajax.dom.insertAfter(args.id,args.data,args.prop);});xajax.command.handler.register('c:as',xajax.dom.contextAssign);xajax.command.handler.register('c:ap',xajax.dom.contextAppend);xajax.command.handler.register('c:pp',xajax.dom.contextPrepend);xajax.command.handler.register('s',xajax.js.sleep);xajax.command.handler.register('ino',xajax.js.includeScriptOnce);xajax.command.handler.register('in',xajax.js.includeScript);xajax.command.handler.register('rjs',xajax.js.removeScript);xajax.command.handler.register('wf',xajax.js.waitFor);xajax.command.handler.register('js',xajax.js.execute);xajax.command.handler.register('jc',xajax.js.call);xajax.command.handler.register('sf',xajax.js.setFunction);xajax.command.handler.register('wpf',xajax.js.wrapFunction);xajax.command.handler.register('al',function(args){args.fullName='alert';alert(args.data);return true;});xajax.command.handler.register('cc',xajax.js.confirmCommands);xajax.command.handler.register('ci',xajax.forms.createInput);xajax.command.handler.register('ii',xajax.forms.insertInput);xajax.command.handler.register('iia',xajax.forms.insertInputAfter);xajax.command.handler.register('ev',xajax.events.setEvent);xajax.command.handler.register('ah',xajax.events.addHandler);xajax.command.handler.register('rh',xajax.events.removeHandler);xajax.command.handler.register('dbg',function(args){args.fullName='debug message';return true;});xajax.initializeRequest=function(oRequest){var xx=xajax;var xc=xx.config;oRequest.append=function(opt,def){if('undefined'!=typeof this[opt]){for(var itmName in def) -if('undefined'==typeof this[opt][itmName]) -this[opt][itmName]=def[itmName];}else this[opt]=def;} -oRequest.append('commonHeaders',xc.commonHeaders);oRequest.append('postHeaders',xc.postHeaders);oRequest.append('getHeaders',xc.getHeaders);oRequest.set=function(option,defaultValue){if('undefined'==typeof this[option]) -this[option]=defaultValue;} -oRequest.set('statusMessages',xc.statusMessages);oRequest.set('waitCursor',xc.waitCursor);oRequest.set('mode',xc.defaultMode);oRequest.set('method',xc.defaultMethod);oRequest.set('URI',xc.requestURI);oRequest.set('httpVersion',xc.defaultHttpVersion);oRequest.set('contentType',xc.defaultContentType);oRequest.set('retry',xc.defaultRetry);oRequest.set('returnValue',xc.defaultReturnValue);oRequest.set('maxObjectDepth',xc.maxObjectDepth);oRequest.set('maxObjectSize',xc.maxObjectSize);oRequest.set('context',window);var xcb=xx.callback;var gcb=xcb.global;var lcb=xcb.create();lcb.take=function(frm,opt){if('undefined'!=typeof frm[opt]){lcb[opt]=frm[opt];lcb.hasEvents=true;} -delete frm[opt];} -lcb.take(oRequest,'onRequest');lcb.take(oRequest,'onResponseDelay');lcb.take(oRequest,'onExpiration');lcb.take(oRequest,'beforeResponseProcessing');lcb.take(oRequest,'onFailure');lcb.take(oRequest,'onRedirect');lcb.take(oRequest,'onSuccess');lcb.take(oRequest,'onComplete');if('undefined'!=typeof oRequest.callback){if(lcb.hasEvents) -oRequest.callback=[oRequest.callback,lcb];}else -oRequest.callback=lcb;oRequest.status=(oRequest.statusMessages) -? xc.status.update() -:xc.status.dontUpdate();oRequest.cursor=(oRequest.waitCursor) -? xc.cursor.update() -:xc.cursor.dontUpdate();oRequest.method=oRequest.method.toUpperCase();if('GET'!=oRequest.method) -oRequest.method='POST';oRequest.requestRetry=oRequest.retry;oRequest.append('postHeaders',{'content-type':oRequest.contentType -});delete oRequest['append'];delete oRequest['set'];delete oRequest['take'];if('undefined'==typeof oRequest.URI) -throw{code:10005} -} -xajax.processParameters=function(oRequest){var xx=xajax;var xt=xx.tools;var rd=[];var separator='';for(var sCommand in oRequest.functionName){if('constructor'!=sCommand){rd.push(separator);rd.push(sCommand);rd.push('=');rd.push(encodeURIComponent(oRequest.functionName[sCommand]));separator='&';} -} -var dNow=new Date();rd.push('&xjxr=');rd.push(dNow.getTime());delete dNow;if(oRequest.parameters){var i=0;var iLen=oRequest.parameters.length;while(i < iLen){var oVal=oRequest.parameters[i];if('object'==typeof oVal&&null!=oVal){try{var oGuard={};oGuard.depth=0;oGuard.maxDepth=oRequest.maxObjectDepth;oGuard.size=0;oGuard.maxSize=oRequest.maxObjectSize;oVal=xt._objectToXML(oVal,oGuard);}catch(e){oVal='';} -rd.push('&xjxargs[]=');oVal=encodeURIComponent(oVal);rd.push(oVal);++i;}else{rd.push('&xjxargs[]=');oVal=xt._escape(oVal);if('undefined'==typeof oVal||null==oVal){rd.push('*');}else{var sType=typeof oVal;if('string'==sType) -rd.push('S');else if('boolean'==sType) -rd.push('B');else if('number'==sType) -rd.push('N');oVal=encodeURIComponent(oVal);rd.push(oVal);} -++i;} -} -} -oRequest.requestURI=oRequest.URI;if('GET'==oRequest.method){oRequest.requestURI+=oRequest.requestURI.indexOf('?')==-1 ? '?':'&';oRequest.requestURI+=rd.join('');rd=[];} -oRequest.requestData=rd.join('');} -xajax.prepareRequest=function(oRequest){var xx=xajax;var xt=xx.tools;oRequest.request=xt.getRequestObject();oRequest.setRequestHeaders=function(headers){if('object'==typeof headers){for(var optionName in headers) -this.request.setRequestHeader(optionName,headers[optionName]);} -} -oRequest.setCommonRequestHeaders=function(){this.setRequestHeaders(this.commonHeaders);} -oRequest.setPostRequestHeaders=function(){this.setRequestHeaders(this.postHeaders);} -oRequest.setGetRequestHeaders=function(){this.setRequestHeaders(this.getHeaders);} -if('asynchronous'==oRequest.mode){oRequest.request.onreadystatechange=function(){if(oRequest.request.readyState!=4) -return;xajax.responseReceived(oRequest);} -oRequest.finishRequest=function(){return this.returnValue;} -}else{oRequest.finishRequest=function(){return xajax.responseReceived(oRequest);} -} -if('undefined'!=typeof oRequest.userName&&'undefined'!=typeof oRequest.password){oRequest.open=function(){this.request.open( -this.method, -this.requestURI, -'asynchronous'==this.mode, -oRequest.userName, -oRequest.password);} -}else{oRequest.open=function(){this.request.open( -this.method, -this.requestURI, -'asynchronous'==this.mode);} -} -if('POST'==oRequest.method){oRequest.applyRequestHeaders=function(){this.setCommonRequestHeaders();try{this.setPostRequestHeaders();}catch(e){this.method='GET';this.requestURI+=this.requestURI.indexOf('?')==-1 ? '?':'&';this.requestURI+=this.requestData;this.requestData='';if(0==this.requestRetry)this.requestRetry=1;throw e;} -} -}else{oRequest.applyRequestHeaders=function(){this.setCommonRequestHeaders();this.setGetRequestHeaders();} -} -} -xajax.request=function(){var numArgs=arguments.length;if(0==numArgs) -return false;var oRequest={} -if(1 < numArgs) -oRequest=arguments[1];oRequest.functionName=arguments[0];var xx=xajax;xx.initializeRequest(oRequest);xx.processParameters(oRequest);while(0 < oRequest.requestRetry){try{--oRequest.requestRetry;xx.prepareRequest(oRequest);return xx.submitRequest(oRequest);}catch(e){xajax.callback.execute( -[xajax.callback.global,oRequest.callback], -'onFailure',oRequest);if(0==oRequest.requestRetry) -throw e;} -} -} -xajax.call=function(){var numArgs=arguments.length;if(0==numArgs) -return false;var oRequest={} -if(1 < numArgs) -oRequest=arguments[1];oRequest.functionName={xjxfun:arguments[0]};var xx=xajax;xx.initializeRequest(oRequest);xx.processParameters(oRequest);while(0 < oRequest.requestRetry){try{--oRequest.requestRetry;xx.prepareRequest(oRequest);return xx.submitRequest(oRequest);}catch(e){xajax.callback.execute( -[xajax.callback.global,oRequest.callback], -'onFailure',oRequest);if(0==oRequest.requestRetry) -throw e;} -} -} -xajax.submitRequest=function(oRequest){oRequest.status.onRequest();var xcb=xajax.callback;var gcb=xcb.global;var lcb=oRequest.callback;xcb.execute([gcb,lcb],'onResponseDelay',oRequest);xcb.execute([gcb,lcb],'onExpiration',oRequest);xcb.execute([gcb,lcb],'onRequest',oRequest);oRequest.open();oRequest.applyRequestHeaders();oRequest.cursor.onWaiting();oRequest.status.onWaiting();xajax._internalSend(oRequest);return oRequest.finishRequest();} -xajax._internalSend=function(oRequest){oRequest.request.send(oRequest.requestData);} -xajax.abortRequest=function(oRequest){oRequest.aborted=true;oRequest.request.abort();xajax.completeResponse(oRequest);} -xajax.responseReceived=function(oRequest){var xx=xajax;var xcb=xx.callback;var gcb=xcb.global;var lcb=oRequest.callback;if(oRequest.aborted) -return;xcb.clearTimer([gcb,lcb],'onExpiration');xcb.clearTimer([gcb,lcb],'onResponseDelay');xcb.execute([gcb,lcb],'beforeResponseProcessing',oRequest);var fProc=xx.getResponseProcessor(oRequest);if('undefined'==typeof fProc){xcb.execute([gcb,lcb],'onFailure',oRequest);xx.completeResponse(oRequest);return;} -return fProc(oRequest);} -xajax.getResponseProcessor=function(oRequest){var fProc;if('undefined'==typeof oRequest.responseProcessor){var cTyp=oRequest.request.getResponseHeader('content-type');if(cTyp){if(0 <=cTyp.indexOf('text/xml')){fProc=xajax.responseProcessor.xml;} -} -}else fProc=oRequest.responseProcessor;return fProc;} -xajax.executeCommand=function(command){if(xajax.command.handler.isRegistered(command)){if(command.id) -command.target=xajax.$(command.id);if(false==xajax.command.handler.call(command)){xajax.tools.queue.pushFront(xajax.response,command);return false;} -} -return true;} -xajax.completeResponse=function(oRequest){xajax.callback.execute( -[xajax.callback.global,oRequest.callback], -'onComplete',oRequest);oRequest.cursor.onComplete();oRequest.status.onComplete();delete oRequest['functionName'];delete oRequest['requestURI'];delete oRequest['requestData'];delete oRequest['requestRetry'];delete oRequest['request'];delete oRequest['set'];delete oRequest['open'];delete oRequest['setRequestHeaders'];delete oRequest['setCommonRequestHeaders'];delete oRequest['setPostRequestHeaders'];delete oRequest['setGetRequestHeaders'];delete oRequest['applyRequestHeaders'];delete oRequest['finishRequest'];delete oRequest['status'];delete oRequest['cursor'];} -xajax.$=xajax.tools.$;xajax.getFormValues=xajax.tools.getFormValues;xajax.isLoaded=true;xjx={} -xjx.$=xajax.tools.$;xjx.getFormValues=xajax.tools.getFormValues;xjx.call=xajax.call;xjx.request=xajax.request; \ No newline at end of file diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_core_uncompressed.js b/phpgwapi/inc/xajax/xajax_js/xajax_core_uncompressed.js deleted file mode 100644 index 0c58ab4dfb..0000000000 --- a/phpgwapi/inc/xajax/xajax_js/xajax_core_uncompressed.js +++ /dev/null @@ -1,3553 +0,0 @@ -/* - File: xajax_core.js - - This file contains the definition of the main xajax javascript core. - - This is the client side code which runs on the web browser or similar - web enabled application. Include this in the HEAD of each page for - which you wish to use xajax. - - Title: xajax core javascript library - - Please see for a detailed description, copyright - and license information. -*/ - -/* - @package xajax - @version $Id: xajax_core_uncompressed.js 327 2007-02-28 16:55:26Z calltoconstruct $ - @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson - @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson - @license http://www.xajaxproject.org/bsd_license.txt BSD License -*/ - -/* - Class: xajax.config - - This class contains all the default configuration settings. These - are application level settings; however, they can be overridden - by including a xajax.config definition prior to including the - file, or by specifying the appropriate configuration - options on a per call basis. -*/ -if ('undefined' == typeof xajax) - xajax = {}; - -if ('undefined' == typeof xajax.config) - xajax.config = {}; - -/* - Function: xajax.config.setDefault - - This function will set a default configuration option if it is - not already set. - - Parameters: - option - (string): - The name of the option that will be set. - - defaultValue - (unknown): - The value to use if a value was not already set. -*/ -xajax.config.setDefault = function(option, defaultValue) { - if ('undefined' == typeof xajax.config[option]) - xajax.config[option] = defaultValue; -} - -/* - Object: commonHeaders - - An array of header entries where the array key is the header - option name and the associated value is the value that will - set when the request object is initialized. - - These headers will be set for both POST and GET requests. -*/ -xajax.config.setDefault('commonHeaders', { - 'If-Modified-Since': 'Sat, 1 Jan 2000 00:00:00 GMT' - }); - -/* - Object: postHeaders - - An array of header entries where the array key is the header - option name and the associated value is the value that will - set when the request object is initialized. -*/ -xajax.config.setDefault('postHeaders', {}); - -/* - Object: getHeaders - - An array of header entries where the array key is the header - option name and the associated value is the value that will - set when the request object is initialized. -*/ -xajax.config.setDefault('getHeaders', {}); - -/* - Boolean: waitCursor - - true - xajax should display a wait cursor when making a request - false - xajax should not show a wait cursor during a request -*/ -xajax.config.setDefault('waitCursor', false); - -/* - Boolean: statusMessages - - true - xajax should update the status bar during a request - false - xajax should not display the status of the request -*/ -xajax.config.setDefault('statusMessages', false); - -/* - Object: baseDocument - - The base document that will be used throughout the code for - locating elements by ID. -*/ -xajax.config.setDefault('baseDocument', document); - -/* - String: requestURI - - The URI that requests will be sent to. -*/ -xajax.config.setDefault('requestURI', xajax.config.baseDocument.URL); - -/* - String: defaultMode - - The request mode. - - 'asynchronous' - The request will immediately return, the - response will be processed when (and if) it is received. - - 'synchronous' - The request will block, waiting for the - response. This option allows the server to return - a value directly to the caller. -*/ -xajax.config.setDefault('defaultMode', 'asynchronous'); - -/* - String: defaultHttpVersion - - The Hyper Text Transport Protocol version designated in the - header of the request. -*/ -xajax.config.setDefault('defaultHttpVersion', 'HTTP/1.1'); - -/* - String: defaultContentType - - The content type designated in the header of the request. -*/ -xajax.config.setDefault('defaultContentType', 'application/x-www-form-urlencoded'); - -/* - Integer: defaultResponseDelayTime - - The delay time, in milliseconds, associated with the - event. -*/ -xajax.config.setDefault('defaultResponseDelayTime', 1000); - -/* - Integer: defaultExpirationTime - - The amount of time to wait, in milliseconds, before a request - is considered expired. This is used to trigger the - to form a URL. -*/ -xajax.config.setDefault('defaultMethod', 'POST'); // W3C: Method is case sensitive - -/* - Integer: defaultRetry - - The number of times a request should be retried - if it expires. -*/ -xajax.config.setDefault('defaultRetry', 5); - -/* - Object: defaultReturnValue - - The value returned by when in asynchronous - mode, or when a syncrhonous call does not specify the - return value. -*/ -xajax.config.setDefault('defaultReturnValue', false); - -/* - Integer: maxObjectDepth - - The maximum depth of recursion allowed when serializing - objects to be sent to the server in a request. -*/ -xajax.config.setDefault('maxObjectDepth', 20); - -/* - Integer: maxObjectSize - - The maximum number of members allowed when serializing - objects to be sent to the server in a request. -*/ -xajax.config.setDefault('maxObjectSize', 2000); - -xajax.config.setDefault('responseQueueSize', 1000); - -/* - Class: xajax.config.status - - Provides support for updating the browser's status bar during - the request process. By splitting the status bar functionality - into an object, the xajax developer has the opportunity to - customize the status bar messages prior to sending xajax requests. -*/ -xajax.config.status = { - /* - Function: update - - Constructs and returns a set of event handlers that will be - called by the xajax framework to set the status bar messages. - */ - update: function() { - return { - onRequest: function() { - window.status = 'Sending Request...'; - }, - onWaiting: function() { - window.status = 'Waiting for Response...'; - }, - onProcessing: function() { - window.status = 'Processing...'; - }, - onComplete: function() { - window.status = 'Done.'; - } - } - }, - /* - Function: dontUpdate - - Constructs and returns a set of event handlers that will be - called by the xajax framework where status bar updates - would normally occur. - */ - dontUpdate: function() { - return { - onRequest: function() {}, - onWaiting: function() {}, - onProcessing: function() {}, - onComplete: function() {} - } - } -} - -/* - Class: xajax.config.cursor - - Provides the base functionality for updating the browser's cursor - during requests. By splitting this functionalityh into an object - of it's own, xajax developers can now customize the functionality - prior to submitting requests. -*/ -xajax.config.cursor = { - /* - Function: update - - Constructs and returns a set of event handlers that will be - called by the xajax framework to effect the status of the - cursor during requests. - */ - update: function() { - return { - onWaiting: function() { - if (xajax.config.baseDocument.body) - xajax.config.baseDocument.body.style.cursor = 'wait'; - }, - onComplete: function() { - xajax.config.baseDocument.body.style.cursor = 'auto'; - } - } - }, - /* - Function: dontUpdate - - Constructs and returns a set of event handlers that will - be called by the xajax framework where cursor status changes - would typically be made during the handling of requests. - */ - dontUpdate: function() { - return { - onWaiting: function() {}, - onComplete: function() {} - } - } -} - -/* - Class: xajax.tools - - This contains utility functions which are used throughout - the xajax core. -*/ -xajax.tools = {} - -/* - Function: xajax.tools.$ - - Shorthand for finding a uniquely named element within - the document. - - Parameters: - sId - (string): - The unique name of the element (specified by the - ID attribute), not to be confused with the name - attribute on form elements. - - Returns: - - object - The element found or null. - - Note: - This function uses the - which allows to operate on the main window - document as well as documents from contained - iframes and child windows. - - See also: - and -*/ -xajax.tools.$ = function(sId) { - if (!sId) - return null; - - var oDoc = xajax.config.baseDocument; - - var obj = oDoc.getElementById(sId); - if (obj) - return obj; - - if (oDoc.all) - return oDoc.all[sId]; - - return obj; -} - -/* - Function xajax.tools.arrayContainsValue - - Looks for a value within the specified array and, if found, - returns true; otherwise it returns false. - - Parameters: - array - (object): - The array to be searched. - - valueToCheck - (object): - The value to search for. - - Returns: - - true : The value is one of the values contained in the - array. - - false : The value was not found in the specified array. -*/ -xajax.tools.arrayContainsValue = function(array, valueToCheck) { - var i = 0; - var l = array.length; - while (i < l) { - if (array[i] == valueToCheck) - return true; - ++i; - } - return false; -} - -/* - Function: xajax.tools.doubleQuotes - - Replace all occurances of the single quote character with a double - quote character. - - Parameters: - - haystack - The source string to be scanned. - - Returns: - - string - A new string with the modifications applied. -*/ -xajax.tools.doubleQuotes = function(haystack) { - return haystack.replace(new RegExp("'", 'g'), '"'); -} - -/* - Function: xajax.tools.singleQuotes - - Replace all occurances of the double quote character with a single - quote character. - - haystack - The source string to be scanned. - - Returns: - - string - A new string with the modification applied. -*/ -xajax.tools.singleQuotes = function(haystack) { - return haystack.replace(new RegExp('"', 'g'), "'"); -} - -/* - Function: xajax.tools._escape - - Determine if the specified value contains special characters and - create a CDATA section so the value can be safely transmitted. - - Parameters: - - data - (string or other): - The source string value to be evaluated or an object of unknown - type. - - Returns: - - string - The string value, escaped if necessary or the object provided - if it is not a string. - - Note: - When the specified object is NOT a string, the value is returned - as is. -*/ -xajax.tools._escape = function(data) { - if ('undefined' == typeof data) - return data; - - // 'object' is handled elsewhere, - // 'string' handled below, - // 'number' will be returned here - // 'boolean' will be returned here - if ('string' != typeof data) - return data; - - var needCDATA = false; - - if (encodeURIComponent(data) != data) { - needCDATA = true; - - var segments = data.split(''); - var fragLen = fragments.length; - segment = ''; - for (var j = 0; j < fragLen; ++j) { - if (0 != j) - segment += ']]]]>'; - segment += fragments[j]; - } - if (0 != i) - data.push(''; - - return data; -} - -/* - Function: xajax.tools._objectToXML - - Convert a javascript object or array into XML suitable for - transmission to the server. - - Parameters: - - obj - The object or array to convert. - - guard - An object used to track the level of recursion - when encoding javascript objects. When an object - contains a reference to it's parent and the parent - contains a reference to the child, an infinite - recursion will cause some browsers to crash. - - Returns: - - string - the xml representation of the object or array. - - See also: - - and -*/ -xajax.tools._objectToXML = function(obj, guard) { - var aXml = []; - aXml.push(''); - for (var key in obj) { - ++guard.size; - if (guard.maxSize < guard.size) - return aXml.join(''); - if ('undefined' != typeof obj[key]) { - if ('constructor' == key) - continue; - if ('function' == typeof obj[key]) - continue; - aXml.push(''); - var val = xajax.tools._escape(key); - aXml.push(val); - aXml.push(''); - if ('object' == typeof obj[key]) { - ++guard.depth; - if (guard.maxDepth > guard.depth) { - try { - aXml.push(xajax.tools._objectToXML(obj[key], guard)); - } catch (e) { - // do nothing, if the debug module is installed - // it will catch the exception and handle it - } - } - --guard.depth; - } else { - var val = xajax.tools._escape(obj[key]); - if ('undefined' == typeof val || null == val) { - aXml.push('*'); - } else { - var sType = typeof val; - if ('string' == sType) - aXml.push('S'); - else if ('boolean' == sType) - aXml.push('B'); - else if ('number' == sType) - aXml.push('N'); - aXml.push(val); - } - } - - aXml.push(''); - } - } - aXml.push(''); - - return aXml.join(''); -} - -/* - Function: xajax.tools._enforceDataType - - Ensure that the javascript variable created is of the correct data type. - - Parameters: - value (string) - - Returns: - - (unknown) - The value provided converted to the correct data type. -*/ -xajax.tools._enforceDataType = function(value) { - value = new String(value); - var type = value.substr(0, 1); - value = value.substr(1); - - if ('*' == type) - value = null; - else if ('N' == type) - value = value - 0; - else if ('B' == type) - value = !!value; -// else if ('S' == type) -// value = new String(value); - - return value; -} - -/* - Function: xajax.tools._nodeToObject - - Deserialize a javascript object from an XML node. - - Parameters: - - node - A node, likely from the xml returned by the server. - - Returns: - - object - The object extracted from the xml node. -*/ -xajax.tools._nodeToObject = function(node) { - if (null == node) - return ''; - - if ('undefined' != typeof node.nodeName) { - if ('#cdata-section' == node.nodeName || '#text' == node.nodeName) { - var data = ''; - do if (node.data) data += node.data; while (node = node.nextSibling); - return xajax.tools._enforceDataType(data); - } else if ('xjxobj' == node.nodeName) { - var key = null; - var value = null; - var data = new Array; - var child = node.firstChild; - while (child) { - if ('e' == child.nodeName) { - var grandChild = child.firstChild; - while (grandChild) { - if ('k' == grandChild.nodeName) - // Don't support objects here, only number, string, etc... - key = xajax.tools._enforceDataType(grandChild.firstChild.data); - else ('v' == grandChild.nodeName) - // Value might be object, string, number, boolean... even null or undefined - value = xajax.tools._nodeToObject(grandChild.firstChild); - grandChild = grandChild.nextSibling; - } - // Allow the value to be null or undefined (or a value) - if (null != key) { // && null != value) { - data[key] = value; - key = value = null; - } - } - child = child.nextSibling; - } - return data; - } - } - - throw { code: 10001, data: node.nodeName }; -} - -/* - Function: xajax.tools.getRequestObject - - Construct an XMLHttpRequest object dependent on the capabilities - of the browser. - - Returns: - - object - Javascript XHR object. -*/ -xajax.tools.getRequestObject = function() { - if ('undefined' != typeof XMLHttpRequest) { - xajax.tools.getRequestObject = function() { - return new XMLHttpRequest(); - } - } else if ('undefined' != typeof ActiveXObject) { - xajax.tools.getRequestObject = function() { - try { - return new ActiveXObject('Msxml2.XMLHTTP.4.0'); - } catch (e) { - xajax.tools.getRequestObject = function() { - try { - return new ActiveXObject('Msxml2.XMLHTTP'); - } catch (e2) { - xajax.tools.getRequestObject = function() { - return new ActiveXObject('Microsoft.XMLHTTP'); - } - return xajax.tools.getRequestObject(); - } - } - return xajax.tools.getRequestObject(); - } - } - } else if (window.createRequest) { - xajax.tools.getRequestObject = function() { - return window.createRequest(); - } - } else { - xajax.tools.getRequestObject = function() { - throw { code: 10002 }; - } - } - - // this would seem to cause an infinite loop, however, the function should - // be reassigned by now and therefore, it will not loop. - return xajax.tools.getRequestObject(); -} - -/* - Function: xajax.tools.getBrowserHTML - - Insert the specified string of HTML into the document, then - extract it. This gives the browser the ability to validate - the code and to apply any transformations it deems appropriate. - - Parameters: - - sValue - (string): - A block of html code or text to be inserted into the - browser's document. - - Returns: - - The (potentially modified) html code or text. -*/ -xajax.tools.getBrowserHTML = function(sValue) { - var oDoc = xajax.config.baseDocument; - if (!oDoc.body) - return ''; - - var elWorkspace = xajax.$('xajax_temp_workspace'); - if (!elWorkspace) - { - elWorkspace = oDoc.createElement('div'); - elWorkspace.setAttribute('id', 'xajax_temp_workspace'); - elWorkspace.style.display = 'none'; - elWorkspace.style.visibility = 'hidden'; - oDoc.body.appendChild(elWorkspace); - } - elWorkspace.innerHTML = sValue; - var browserHTML = elWorkspace.innerHTML; - elWorkspace.innerHTML = ''; - - return browserHTML; -} - -/* - Function: xajax.tools.willChange - - Tests to see if the specified data is the same as the current - value of the element's attribute. - - Parameters: - element - (string or object): - The element or it's unique name (specified by the ID attribute) - - attribute - (string): - The name of the attribute. - - newData - (string): - The value to be compared with the current value of the specified - element. - - Returns: - - true - The specified value differs from the current attribute value. - false - The specified value is the same as the current value. -*/ -xajax.tools.willChange = function(element, attribute, newData) { - if ('string' == typeof element) - element = xajax.$(element); - if (element) { - var oldData; - eval('oldData=element.'+attribute); - return (newData != oldData); - } - - return false; -} - -/* - Function: xajax.tools.getFormValues - - Build an associative array of form elements and their values from - the specified form. - - Parameters: - - element - (string): The unique name (id) of the form to be processed. - disabled - (boolean, optional): Include form elements which are currently disabled. - prefix - (string, optional): A prefix used for selecting form elements. - - Returns: - - An associative array of form element id and value. -*/ -xajax.tools.getFormValues = function(parent) { - var submitDisabledElements = false; - if (arguments.length > 1 && arguments[1] == true) - submitDisabledElements = true; - - var prefix = ''; - if(arguments.length > 2) - prefix = arguments[2]; - - if ('string' == typeof parent) - parent = xajax.$(parent); - - var aFormValues = {}; - -// JW: Removing these tests so that form values can be retrieved from a specified -// container element like a DIV, regardless of whether they exist in a form or not. -// -// if (parent.tagName) -// if ('FORM' == parent.tagName.toUpperCase()) - if (parent) - if (parent.childNodes) - xajax.tools._getFormValues(aFormValues, parent.childNodes, submitDisabledElements, prefix); - - return aFormValues; -} - -/* - Function: xajax.tools._getFormValues - - Used internally by to recursively get the value - of form elements. This function will extract all form element values - regardless of the depth of the element within the form. -*/ -xajax.tools._getFormValues = function(aFormValues, children, submitDisabledElements, prefix) -{ - var iLen = children.length; - for (var i = 0; i < iLen; ++i) { - var child = children[i]; - if ('undefined' != typeof child.childNodes) - xajax.tools._getFormValues(aFormValues, child.childNodes, submitDisabledElements, prefix); - xajax.tools._getFormValue(aFormValues, child, submitDisabledElements, prefix); - } -} - -/* - Function: xajax.tools._getFormValue - - Used internally by to extract a single form value. - This will detect the type of element (radio, checkbox, multi-select) and - add it's value(s) to the form values array. -*/ -xajax.tools._getFormValue = function(aFormValues, child, submitDisabledElements, prefix) -{ - if (!child.name) - return; - - if ('PARAM' == child.tagName) return; - - if (child.disabled) - if (true == child.disabled) - if (false == submitDisabledElements) - return; - - if (prefix != child.name.substring(0, prefix.length)) - return; - - if (child.type) - if (child.type == 'radio' || child.type == 'checkbox') - if (false == child.checked) - return; - - var name = child.name; - - var values = []; - - if ('select-multiple' == child.type) { - var jLen = child.length; - for (var j = 0; j < jLen; ++j) { - var option = child.options[j]; - if (true == option.selected) - values.push(option.value); - } - } else { - values = child.value; - } - - var keyBegin = name.indexOf('['); - if (0 <= keyBegin) { - var n = name; - var k = n.substr(0, n.indexOf('[')); - var a = n.substr(n.indexOf('[')); - if (typeof aFormValues[k] == 'undefined') - aFormValues[k] = []; - var p = aFormValues; // pointer reset - while (a.length != 0) { - var sa = a.substr(0, a.indexOf(']')+1); - - var lk = k; //save last key - var lp = p; //save last pointer - - a = a.substr(a.indexOf(']')+1); - p = p[k]; - k = sa.substr(1, sa.length-2); - if (k == '') { - if ('select-multiple' == child.type) { - k = lk; //restore last key - p = lp; - } else { - k = p.length; - } - } - if (typeof p[k] == 'undefined') - p[k] = []; - } - p[k] = values; - } else { - aFormValues[name] = values; - } -} - -/* - Function: xajax.tools.stripOnPrefix - - Detect, and if found, remove the prefix 'on' from the specified - string. This is used while working with event handlers. - - Parameters: - - sEventName - (string): The string to be modified. - - Returns: - - string - The modified string. -*/ -xajax.tools.stripOnPrefix = function(sEventName) { - sEventName = sEventName.toLowerCase(); - if (0 == sEventName.indexOf('on')) - sEventName = sEventName.replace(/on/,''); - - return sEventName; -} - -/* - Function: xajax.tools.addOnPrefix - - Detect, and add if not found, the prefix 'on' from the specified - string. This is used while working with event handlers. - - Parameters: - - sEventName - (string): The string to be modified. - - Returns: - - string - The modified string. -*/ -xajax.tools.addOnPrefix = function(sEventName) { - sEventName = sEventName.toLowerCase(); - if (0 != sEventName.indexOf('on')) - sEventName = 'on' + sEventName; - - return sEventName; -} - -/* - Class: xajax.tools.xml - - An object that contains utility function for processing - xml response packets. -*/ -xajax.tools.xml = {}; - -/* - Function: xajax.tools.xml.parseAttributes - - Take the parameters passed in the command of the XML response - and convert them to parameters of the args object. This will - serve as the command object which will be stored in the - response command queue. - - Parameters: - - child - (object): The xml child node which contains the - attributes for the current response command. - - obj - (object): The current response command that will have the - attributes applied. -*/ -xajax.tools.xml.parseAttributes = function(child, obj) { - var iLen = child.attributes.length; - for (var i = 0; i < iLen; ++i) { - var attr = child.attributes[i]; - obj[attr.name] = attr.value; - } -} - -/* - Function: xajax.tools.xml.parseChildren - - Parses the child nodes of the command of the response XML. Generally, - the child nodes contain the data element of the command; this member - may be an object, which will be deserialized by - - Parameters: - - child - (object): The xml node that contains the child (data) for - the current response command object. - - obj - (object): The response command object. -*/ -xajax.tools.xml.parseChildren = function(child, obj) { - obj.data = ''; - if (0 < child.childNodes.length) { - if (1 < child.childNodes.length) { - var grandChild = child.firstChild; - do { - if ('#cdata-section' == grandChild.nodeName || '#text' == grandChild.nodeName) { - obj.data += grandChild.data; - } - } while (grandChild = grandChild.nextSibling); - } else { - var grandChild = child.firstChild; - if ('xjxobj' == grandChild.nodeName) { - obj.data = xajax.tools._nodeToObject(grandChild); - return; - } else if ('#cdata-section' == grandChild.nodeName || '#text' == grandChild.nodeName) { - obj.data = grandChild.data; - } - } - } else if ('undefined' != typeof child.data) { - obj.data = child.data; - } - - obj.data = xajax.tools._enforceDataType(obj.data); -} - -/* - Function: xajax.tools.xml.processFragment - - Parameters: - - xmlNode - (object): The first xml node in the xml fragment. - seq - (number): A counter used to keep track of the sequence - of this command in the response. - oRet - (object): A variable that is used to return the request - "return value" for use with synchronous requests. -*/ -xajax.tools.xml.processFragment = function(xmlNode, seq, oRet, oRequest) { - var xx = xajax; - var xt = xx.tools; - while (xmlNode) { - if ('cmd' == xmlNode.nodeName) { - var obj = {}; - obj.fullName = '*unknown*'; - obj.sequence = seq; - obj.request = oRequest; - obj.context = oRequest.context; - - xt.xml.parseAttributes(xmlNode, obj); - xt.xml.parseChildren(xmlNode, obj); - - xt.queue.push(xx.response, obj); - } else if ('xjxrv' == xmlNode.nodeName) { - oRet = xt._nodeToObject(xmlNode.firstChild); - } else if ('debugmsg' == xmlNode.nodeName) { - // txt = xt._nodeToObject(xmlNode.firstChild); - } else - throw { code: 10004, data: xmlNode.nodeName } - - ++seq; - xmlNode = xmlNode.nextSibling; - } - return oRet; -} - -/* - Class: xajax.tools.queue - - This contains the code and variables for building, populating - and processing First In Last Out (FILO) buffers. -*/ -xajax.tools.queue = {} - -/* - Function: create - - Construct and return a new queue object. - - Parameters: - - size - (integer): - The number of entries the queue will be able to hold. -*/ -xajax.tools.queue.create = function(size) { - return { - start: 0, - size: size, - end: 0, - commands: [], - timeout: null - } -} - -/* - Function: xajax.tools.queue.retry - - Maintains a retry counter for the given object. - - Parameters: - - obj - (object): - The object to track the retry count for. - - count - (integer): - The number of times the operation should be attempted - before a failure is indicated. - - Returns: - - true - The object has not exhausted all the retries. - false - The object has exhausted the retry count specified. -*/ -xajax.tools.queue.retry = function(obj, count) { - var retries = obj.retries; - if (retries) { - --retries; - if (1 > retries) - return false; - } else retries = count; - obj.retries = retries; - return true; -} - -/* - Function: xajax.tools.queue.rewind - - Rewind the buffer head pointer, effectively reinserting the - last retrieved object into the buffer. - - Parameters: - - theQ - (object): - The queue to be rewound. -*/ -xajax.tools.queue.rewind = function(theQ) { - if (0 < theQ.start) - --theQ.start; - else - theQ.start = theQ.size; -} - -/* - Function: xajax.tools.queue.setWakeup - - Set or reset a timeout that is used to restart processing - of the queue. This allows the queue to asynchronously wait - for an event to occur (giving the browser time to process - pending events, like loading files) - - Parameters: - - theQ - (object): - The queue to process upon timeout. - - when - (integer): - The number of milliseconds to wait before starting/ - restarting the processing of the queue. -*/ -xajax.tools.queue.setWakeup = function(theQ, when) { - if (null != theQ.timeout) { - clearTimeout(theQ.timeout); - theQ.timeout = null; - } - theQ.timout = setTimeout(function() { xajax.tools.queue.process(theQ); }, when); -} - -/* - Function: xajax.tools.queue.process - - While entries exist in the queue, pull and entry out and - process it's command. When a command returns false, the - processing is halted. - - Parameters: - - theQ - (object): The queue object to process. This should - have been crated by calling . - - Returns: - - true - The queue was fully processed and is now empty. - false - The queue processing was halted before the - queue was fully processed. - - Note: - - - Use or call this function to - cause the queue processing to continue. - - - This will clear the associated timeout, this function is not - designed to be reentrant. - - - When an exception is caught, do nothing; if the debug module - is installed, it will catch the exception and handle it. -*/ -xajax.tools.queue.process = function(theQ) { - if (null != theQ.timeout) { - clearTimeout(theQ.timeout); - theQ.timeout = null; - } - var obj = xajax.tools.queue.pop(theQ); - while (null != obj) { - try { - if (false == xajax.executeCommand(obj)) - return false; - } catch (e) { - } - delete obj; - - obj = xajax.tools.queue.pop(theQ); - } - return true; -} - -/* - Function: xajax.tools.queue.push - - Push a new object into the tail of the buffer maintained by the - specified queue object. - - Parameters: - - theQ - (object): - The queue in which you would like the object stored. - - obj - (object): - The object you would like stored in the queue. -*/ -xajax.tools.queue.push = function(theQ, obj) { - var next = theQ.end + 1; - if (next > theQ.size) - next = 0; - if (next != theQ.start) { - theQ.commands[theQ.end] = obj; - theQ.end = next; - } else - throw { code: 10003 } -} - -/* - Function: xajax.tools.queue.pushFront - - Push a new object into the head of the buffer maintained by - the specified queue object. This effectively pushes an object - to the front of the queue... it will be processed first. - - Parameters: - - theQ - (object): - The queue in which you would like the object stored. - - obj - (object): - The object you would like stored in the queue. -*/ -xajax.tools.queue.pushFront = function(theQ, obj) { - xajax.tools.queue.rewind(theQ); - theQ.commands[theQ.start] = obj; -} - -/* - Function: xajax.tools.queue.pop - - Attempt to pop an object off the head of the queue. - - Parameters: - - theQ - (object): - The queue object you would like to modify. - - Returns: - - object - The object that was at the head of the queue or - null if the queue was empty. -*/ -xajax.tools.queue.pop = function(theQ) { - var next = theQ.start; - if (next == theQ.end) - return null; - next++; - if (next > theQ.size) - next = 0; - var obj = theQ.commands[theQ.start]; - delete theQ.commands[theQ.start]; - theQ.start = next; - return obj; -} - -/* - Class: xajax.responseProcessor -*/ -xajax.responseProcessor = {}; - -/* - Function: xajax.responseProcessor.xml - - Parse the response XML into a series of commands. The commands - are constructed by calling and - . - - Parameters: - - oRequest - (object): The request context object. -*/ -xajax.responseProcessor.xml = function(oRequest) { - var xx = xajax; - var xt = xx.tools; - var xcb = xx.callback; - var gcb = xcb.global; - var lcb = oRequest.callback; - - var oRet = oRequest.returnValue; - - if (xt.arrayContainsValue(xx.responseSuccessCodes, oRequest.request.status)) { - xcb.execute([gcb, lcb], 'onSuccess', oRequest); - var seq = 0; - if (oRequest.request.responseXML) { - var responseXML = oRequest.request.responseXML; - if (responseXML.documentElement) { - oRequest.status.onProcessing(); - - var child = responseXML.documentElement.firstChild; - oRet = xt.xml.processFragment(child, seq, oRet, oRequest); - } - } - var obj = {}; - obj.fullName = 'Response Complete'; - obj.sequence = seq; - obj.request = oRequest; - obj.context = oRequest.context; - obj.cmd = 'rcmplt'; - xt.queue.push(xx.response, obj); - - // do not re-start the queue if a timeout is set - if (null == xx.response.timeout) - xt.queue.process(xx.response); - } else if (xt.arrayContainsValue(xx.responseRedirectCodes, oRequest.request.status)) { - xcb.execute([gcb, lcb], 'onRedirect', oRequest); - window.location = oRequest.request.getResponseHeader('location'); - xx.completeResponse(oRequest); - } else if (xt.arrayContainsValue(xx.responseErrorsForAlert, oRequest.request.status)) { - xcb.execute([gcb, lcb], 'onFailure', oRequest); - xx.completeResponse(oRequest); - } - - return oRet; -} - -/* - Class: xajax.js - - Contains the functions for javascript file and function - manipulation. -*/ -xajax.js = {} - -/* - Function: xajax.js.includeScriptOnce - - Add a reference to the specified script file if one does not - already exist in the HEAD of the current document. - - This will effecitvely cause the script file to be loaded in - the browser. - - Parameters: - - fileName - (string): The URI of the file. - - Returns: - - true - The reference exists or was added. -*/ -xajax.js.includeScriptOnce = function(command) { - command.fullName = 'includeScriptOnce'; - var fileName = command.data; - // Check for existing script tag for this file. - var oDoc = xajax.config.baseDocument; - var loadedScripts = oDoc.getElementsByTagName('script'); - var iLen = loadedScripts.length; - for (var i = 0; i < iLen; ++i) { - var script = loadedScripts[i]; - if (script.src) { - if (0 <= script.src.indexOf(fileName)) - return true; - } - } - return xajax.js.includeScript(command); -} - -/* - Function: xajax.js.includeScript - - Adds a SCRIPT tag referencing the specified file. This - effectively causes the script to be loaded in the browser. - - Parameters: - - command (object) - Xajax response object - - Returns: - - true - The reference was added. -*/ -xajax.js.includeScript = function(command) { - command.fullName = 'includeScript'; - var oDoc = xajax.config.baseDocument; - var objHead = oDoc.getElementsByTagName('head'); - var objScript = oDoc.createElement('script'); - objScript.src = command.data; - if ('undefined' == typeof command.type) objScript.type = 'text/javascript'; - else objScript.type = command.type; - if ('undefined' != typeof command.type) objScript.setAttribute('id', command.elm_id); - objHead[0].appendChild(objScript); - return true; -} - -/* - Function: xajax.js.removeScript - - Locates a SCRIPT tag in the HEAD of the document which references - the specified file and removes it. - - Parameters: - - command (object) - Xajax response object - - Returns: - - true - The script was not found or was removed. -*/ -xajax.js.removeScript = function(command) { - command.fullName = 'removeScript'; - var fileName = command.data; - var unload = command.unld; - var oDoc = xajax.config.baseDocument; - var loadedScripts = oDoc.getElementsByTagName('script'); - var iLen = loadedScripts.length; - for (var i = 0; i < iLen; ++i) { - var script = loadedScripts[i]; - if (script.src) { - if (0 <= script.src.indexOf(fileName)) { - if ('undefined' != typeof unload) { - var args = {}; - args.data = unload; - args.context = window; - xajax.js.execute(args); - } - var parent = script.parentNode; - parent.removeChild(script); - } - } - } - return true; -} - -/* - Function: xajax.js.sleep - - Causes the processing of items in the queue to be delayed - for the specified amount of time. This is an asynchronous - operation, therefore, other operations will be given an - opportunity to execute during this delay. - - Parameters: - - args - (object): The response command containing the following - parameters. - - args.prop: The number of 10ths of a second to sleep. - - Returns: - - true - The sleep operation completed. - false - The sleep time has not yet expired, continue sleeping. -*/ -xajax.js.sleep = function(command) { - command.fullName = 'sleep'; - // inject a delay in the queue processing - // handle retry counter - if (xajax.tools.queue.retry(command, command.prop)) { - xajax.tools.queue.setWakeup(xajax.response, 100); - return false; - } - // wake up, continue processing queue - return true; -} - -/* - Function: xajax.js.confirmCommands - - Prompt the user with the specified text, if the user responds by clicking - cancel, then skip the specified number of commands in the response command - queue. If the user clicks Ok, the command processing resumes normal - operation. - - Parameters: - - command (object) - xajax response object - - Returns: - - true - The operation completed successfully. -*/ -xajax.js.confirmCommands = function(command) { - command.fullName = 'confirmCommands'; - var msg = command.data; - var numberOfCommands = command.id; - if (false == confirm(msg)) { - while (0 < numberOfCommands) { - xajax.tools.queue.pop(xajax.response); - --numberOfCommands; - } - } - return true; -} - -/* - Function: xajax.js.execute - - Execute the specified string of javascript code, using the current - script context. - - Parameters: - - args - The response command object containing the following: - - args.data: (string): The javascript to be evaluated. - - args.context: (object): The javascript object that to be - referenced as 'this' in the script. - - Returns: - - unknown - A value set by the script using 'returnValue = ' - true - If the script does not set a returnValue. -*/ -xajax.js.execute = function(args) { - args.fullName = 'execute Javascript'; - var returnValue = true; - args.context.xajaxDelegateCall = function() { - eval(args.data); - } - args.context.xajaxDelegateCall(); - return returnValue; -} - -/* - Function: xajax.js.waitFor - - Test for the specified condition, using the current script - context; if the result is false, sleep for 1/10th of a - second and try again. - - Parameters: - - args - The response command object containing the following: - - - args.data: (string): The javascript to evaluate. - - args.prop: (integer): The number of 1/10ths of a - second to wait before giving up. - - args.context: (object): The current script context object - which is accessable in the javascript being evaulated - via the 'this' keyword. - - Returns: - - false - The condition evaulates to false and the sleep time - has not expired. - true - The condition evaluates to true or the sleep time has - expired. -*/ -xajax.js.waitFor = function(args) { - args.fullName = 'waitFor'; - - var bResult = false; - var cmdToEval = 'bResult = ('; - cmdToEval += args.data; - cmdToEval += ');'; - try { - args.context.xajaxDelegateCall = function() { - eval(cmdToEval); - } - args.context.xajaxDelegateCall(); - } catch (e) { - } - if (false == bResult) { - // inject a delay in the queue processing - // handle retry counter - if (xajax.tools.queue.retry(args, args.prop)) { - xajax.tools.queue.setWakeup(xajax.response, 100); - return false; - } - // give up, continue processing queue - } - return true; -} - -/* - Function: xajax.js.call - - Call a javascript function with a series of parameters using - the current script context. - - Parameters: - - args - The response command object containing the following: - - args.data: (array): The parameters to pass to the function. - - args.func: (string): The name of the function to call. - - args.context: (object): The current script context object - which is accessable in the function name via the 'this' - keyword. - - Returns: - - true - The call completed successfully. -*/ -xajax.js.call = function(args) { - args.fullName = 'call js function'; - - var parameters = args.data; - - var scr = new Array(); - scr.push(args.func); - scr.push('('); - if ('undefined' != typeof parameters) { - if ('object' == typeof parameters) { - var iLen = parameters.length; - if (0 < iLen) { - scr.push('parameters[0]'); - for (var i = 1; i < iLen; ++i) - scr.push(', parameters[' + i + ']'); - } - } - } - scr.push(');'); - args.context.xajaxDelegateCall = function() { - eval(scr.join('')); - } - args.context.xajaxDelegateCall(); - return true; -} - -/* - Function: xajax.js.setFunction - - Constructs the specified function using the specified javascript - as the body of the function. - - Parameters: - - args - The response command object which contains the following: - - - args.func: (string): The name of the function to construct. - - args.data: (string): The script that will be the function body. - - args.context: (object): The current script context object - which is accessable in the script name via the 'this' keyword. - - Returns: - - true - The function was constructed successfully. -*/ -xajax.js.setFunction = function(args) { - args.fullName = 'setFunction'; - - var code = new Array(); - code.push(args.func); - code.push(' = function('); - if ('object' == typeof args.prop) { - var separator = ''; - for (var m in args.prop) { - code.push(separator); - code.push(args.prop[m]); - separator = ','; - } - } else code.push(args.prop); - code.push(') { '); - code.push(args.data); - code.push(' }'); - args.context.xajaxDelegateCall = function() { - eval(code.join('')); - } - args.context.xajaxDelegateCall(); - return true; -} - -/* - Function: xajax.js.wrapFunction - - Construct a javascript function which will call the original function with - the same name, potentially executing code before and after the call to the - original function. - - Parameters: - - args - (object): The response command object which will contain - the following: - - - args.func: (string): The name of the function to be wrapped. - - args.prop: (string): List of parameters used when calling the function. - - args.data: (array): The portions of code to be called before, after - or even between calls to the original function. - - args.context: (object): The current script context object which is - accessable in the function name and body via the 'this' keyword. - - Returns: - - true - The wrapper function was constructed successfully. -*/ -xajax.js.wrapFunction = function(args) { - args.fullName = 'wrapFunction'; - - var code = new Array(); - code.push(args.func); - code.push(' = xajax.js.makeWrapper('); - code.push(args.func); - code.push(', args.prop, args.data, args.type, args.context);'); - args.context.xajaxDelegateCall = function() { - eval(code.join('')); - } - args.context.xajaxDelegateCall(); - return true; -} - -/* - Function: xajax.js.makeWrapper - - - Helper function used in the wrapping of an existing javascript function. - - Parameters: - - origFun - (string): The name of the original function. - args - (string): The list of parameters used when calling the function. - codeBlocks - (array): Array of strings of javascript code to be executed - before, after and perhaps between calls to the original function. - returnVariable - (string): The name of the variable used to retain the - return value from the call to the original function. - context - (object): The current script context object which is accessable - in the function name and body via the 'this' keyword. - - Returns: - - object - The complete wrapper function. -*/ -xajax.js.makeWrapper = function(origFun, args, codeBlocks, returnVariable, context) { - var originalCall = ''; - if (0 < returnVariable.length) { - originalCall += returnVariable; - originalCall += ' = '; - } - var originalCall = 'origFun('; - originalCall += args; - originalCall += '); '; - - var code = 'wrapper = function('; - code += args; - code += ') { '; - - if (0 < returnVariable.length) { - code += ' var '; - code += returnVariable; - code += ' = null;'; - } - var separator = ''; - var bLen = codeBlocks.length; - for (var b = 0; b < bLen; ++b) { - code += separator; - code += codeBlocks[b]; - separator = originalCall; - } - if (0 < returnVariable.length) { - code += ' return '; - code += returnVariable; - code += ';'; - } - code += ' } '; - - var wrapper = null; - context.xajaxDelegateCall = function() { - eval(code); - } - context.xajaxDelegateCall(); - return wrapper; -} - -/* - Class: xajax.dom -*/ -xajax.dom = {} - -/* - Function: xajax.dom.assign - - Assign an element's attribute to the specified value. - - Parameters: - - element - (object): The HTML element to effect. - property - (string): The name of the attribute to set. - data - (string): The new value to be applied. - - Returns: - - true - The operation completed successfully. -*/ -xajax.dom.assign = function(element, property, data) { - if ('string' == typeof element) - element = xajax.$(element); - - switch (property) { - case 'innerHTML': - element.innerHTML = data; - break; - case 'outerHTML': - if ('undefined' == typeof element.outerHTML) { - var r = xajax.config.baseDocument.createRange(); - r.setStartBefore(element); - var df = r.createContextualFragment(data); - element.parentNode.replaceChild(df, element); - } else element.outerHTML = data; - break; - default: - if (xajax.tools.willChange(element, property, data)) - eval('element.' + property + ' = data;'); - break; - } - return true; -} - -/* - Function: xajax.dom.append - - Append the specified value to an element's attribute. - - Parameters: - - element - (object): The HTML element to effect. - property - (string): The name of the attribute to append to. - data - (string): The new value to be appended. - - Returns: - - true - The operation completed successfully. -*/ -xajax.dom.append = function(element, property, data) { - if ('string' == typeof element) - element = xajax.$(element); - - eval('element.' + property + ' += data;'); - return true; -} - -/* - Function: xajax.dom.prepend - - Prepend the specified value to an element's attribute. - - Parameters: - - element - (object): The HTML element to effect. - property - (string): The name of the attribute. - data - (string): The new value to be prepended. - - Returns: - - true - The operation completed successfully. -*/ -xajax.dom.prepend = function(element, property, data) { - if ('string' == typeof element) - element = xajax.$(element); - - eval('element.' + property + ' = data + element.' + property); - return true; -} - -/* - Function: xajax.dom.replace - - Search and replace the specified text. - - Parameters: - - element - (string or object): The name of, or the element itself which is - to be modified. - sAttribute - (string): The name of the attribute to be set. - aData - (array): The search text and replacement text. - - Returns: - - true - The operation completed successfully. -*/ -xajax.dom.replace = function(element, sAttribute, aData) { - var sSearch = aData['s']; - var sReplace = aData['r']; - - if (sAttribute == 'innerHTML') - sSearch = xajax.tools.getBrowserHTML(sSearch); - - if ('string' == typeof element) - element = xajax.$(element); - - eval('var txt = element.' + sAttribute); - - var bFunction = false; - if ('function' == typeof txt) { - txt = txt.join(''); - bFunction = true; - } - - var start = txt.indexOf(sSearch); - if (start > -1) { - var newTxt = []; - while (start > -1) { - var end = start + sSearch.length; - newTxt.push(txt.substr(0, start)); - newTxt.push(sReplace); - txt = txt.substr(end, txt.length - end); - start = txt.indexOf(sSearch); - } - newTxt.push(txt); - newTxt = newTxt.join(''); - - if (bFunction) { - eval('element.' + sAttribute + '=newTxt;'); - } else if (xajax.tools.willChange(element, sAttribute, newTxt)) { - eval('element.' + sAttribute + '=newTxt;'); - } - } - return true; -} - -/* - Function: xajax.dom.remove - - Delete an element. - - Parameters: - - element - (string or object): The name of, or the element itself which - will be deleted. - - Returns: - - true - The operation completed successfully. -*/ -xajax.dom.remove = function(element) { - if ('string' == typeof element) - element = xajax.$(element); - - if (element && element.parentNode && element.parentNode.removeChild) - element.parentNode.removeChild(element); - - return true; -} - -/* - Function: xajax.dom.create - - Create a new element and append it to the specified parent element. - - Parameters: - - objParent - (string or object): The name of, or the element itself - which will contain the new element. - sTag - (string): The tag name for the new element. - sId - (string): The value to be assigned to the id attribute of - the new element. - - Returns: - - true - The operation completed successfully. -*/ -xajax.dom.create = function(objParent, sTag, sId) { - if ('string' == typeof objParent) - objParent = xajax.$(objParent); - var target = xajax.config.baseDocument.createElement(sTag); - target.setAttribute('id', sId); - if (objParent) - objParent.appendChild(target); - return true; -} - -/* - Function: xajax.dom.insert - - Insert a new element before the specified element. - - Parameters: - - objSibling - (string or object): The name of, or the element itself - that will be used as the reference point for insertion. - sTag - (string): The tag name for the new element. - sId - (string): The value that will be assigned to the new element's - id attribute. - - Returns: - - true - The operation completed successfully. -*/ -xajax.dom.insert = function(objSibling, sTag, sId) { - if ('string' == typeof objSibling) - objSibling = xajax.$(objSibling); - var target = xajax.config.baseDocument.createElement(sTag); - target.setAttribute('id', sId); - objSibling.parentNode.insertBefore(target, objSibling); - return true; -} - -/* - Function: xajax.dom.insertAfter - - Insert a new element after the specified element. - - Parameters: - - objSibling - (string or object): The name of, or the element itself - that will be used as the reference point for insertion. - sTag - (string): The tag name for the new element. - sId - (string): The value that will be assigned to the new element's - id attribute. - - Returns: - - true - The operation completed successfully. -*/ -xajax.dom.insertAfter = function(objSibling, sTag, sId) { - if ('string' == typeof objSibling) - objSibling = xajax.$(objSibling); - var target = xajax.config.baseDocument.createElement(sTag); - target.setAttribute('id', sId); - objSibling.parentNode.insertBefore(target, objSibling.nextSibling); - return true; -} - -/* - Function: xajax.dom.contextAssign - - Assign a value to a named member of the current script context object. - - Parameters: - - args - (object): The response command object which will contain the - following: - - - args.prop: (string): The name of the member to assign. - - args.data: (string or object): The value to assign to the member. - - args.context: (object): The current script context object which - is accessable via the 'this' keyword. - - Returns: - - true - The operation completed successfully. -*/ -xajax.dom.contextAssign = function(args) { - args.fullName = 'context assign'; - - var code = []; - code.push('this.'); - code.push(args.prop); - code.push(' = data;'); - code = code.join(''); - args.context.xajaxDelegateCall = function(data) { - eval(code); - } - args.context.xajaxDelegateCall(args.data); - return true; -} - -/* - Function: xajax.dom.contextAppend - - Appends a value to a named member of the current script context object. - - Parameters: - - args - (object): The response command object which will contain the - following: - - - args.prop: (string): The name of the member to append to. - - args.data: (string or object): The value to append to the member. - - args.context: (object): The current script context object which - is accessable via the 'this' keyword. - - Returns: - - true - The operation completed successfully. -*/ -xajax.dom.contextAppend = function(args) { - args.fullName = 'context append'; - - var code = []; - code.push('this.'); - code.push(args.prop); - code.push(' += data;'); - code = code.join(''); - args.context.xajaxDelegateCall = function(data) { - eval(code); - } - args.context.xajaxDelegateCall(args.data); - return true; -} - -/* - Function: xajax.dom.contextPrepend - - Prepend a value to a named member of the current script context object. - - Parameters: - - args - (object): The response command object which will contain the - following: - - - args.prop: (string): The name of the member to prepend to. - - args.data: (string or object): The value to prepend to the member. - - args.context: (object): The current script context object which - is accessable via the 'this' keyword. - - Returns: - - true - The operation completed successfully. -*/ -xajax.dom.contextPrepend = function(args) { - args.fullName = 'context prepend'; - - var code = []; - code.push('this.'); - code.push(args.prop); - code.push(' = data + this.'); - code.push(args.prop); - code.push(';'); - code = code.join(''); - args.context.xajaxDelegateCall = function(data) { - eval(code); - } - args.context.xajaxDelegateCall(args.data); - return true; -} - - -/* - Class: xajax.css -*/ -xajax.css = {} - -/* - Function: xajax.css.add - - Add a LINK reference to the specified .css file if it does not - already exist in the HEAD of the current document. - - Parameters: - - filename - (string): The URI of the .css file to reference. - - media - (string): The media type of the css file (print/screen/handheld,..) - - Returns: - - true - The operation completed successfully. -*/ -xajax.css.add = function(fileName, media) { - var oDoc = xajax.config.baseDocument; - var oHeads = oDoc.getElementsByTagName('head'); - var oHead = oHeads[0]; - var oLinks = oHead.getElementsByTagName('link'); - - var found = false; - var iLen = oLinks.length; - for (var i = 0; i < iLen && false == found; ++i) - if (0 <= oLinks[i].href.indexOf(fileName) && oLinks[i].media == media) - found = true; - - if (false == found) { - var oCSS = oDoc.createElement('link'); - oCSS.rel = 'stylesheet'; - oCSS.type = 'text/css'; - oCSS.href = fileName; - oCSS.media = media; - oHead.appendChild(oCSS); - } - - return true; -} - -/* - Function: xajax.css.remove - - Locate and remove a LINK reference from the current document's - HEAD. - - Parameters: - - filename - (string): The URI of the .css file. - - Returns: - - true - The operation completed successfully. -*/ -xajax.css.remove = function(fileName, media) { - var oDoc = xajax.config.baseDocument; - var oHeads = oDoc.getElementsByTagName('head'); - var oHead = oHeads[0]; - var oLinks = oHead.getElementsByTagName('link'); - - var i = 0; - while (i < oLinks.length) - if (0 <= oLinks[i].href.indexOf(fileName) && oLinks[i].media == media) - oHead.removeChild(oLinks[i]); - else ++i; - - return true; -} - -/* - Function: xajax.css.waitForCSS - - Attempt to detect when all .css files have been loaded once - they are referenced by a LINK tag in the HEAD of the current - document. - - Parameters: - - args - (object): The response command object which will contain - the following: - - - args.prop - (integer): The number of 1/10ths of a second - to wait before giving up. - - Returns: - - true - The .css files appear to be loaded. - false - The .css files do not appear to be loaded and the timeout - has not expired. -*/ -xajax.css.waitForCSS = function(args) { - var oDocSS = xajax.config.baseDocument.styleSheets; - var ssEnabled = []; - var iLen = oDocSS.length; - for (var i = 0; i < iLen; ++i) { - ssEnabled[i] = 0; - try { - ssEnabled[i] = oDocSS[i].cssRules.length; - } catch (e) { - try { - ssEnabled[i] = oDocSS[i].rules.length; - } catch (e) { - } - } - } - - var ssLoaded = true; - var iLen = ssEnabled.length; - for (var i = 0; i < iLen; ++i) - if (0 == ssEnabled[i]) - ssLoaded = false; - - if (false == ssLoaded) { - // inject a delay in the queue processing - // handle retry counter - if (xajax.tools.queue.retry(args, args.prop)) { - xajax.tools.queue.setWakeup(xajax.response, 10); - return false; - } - // give up, continue processing queue - } - return true; -} - - -/* - Class: xajax.forms -*/ -xajax.forms = {} - -/* - Function: xajax.forms.getInput - - Create and return a form input element with the specified parameters. - - Parameters: - - type - (string): The type of input element desired. - name - (string): The value to be assigned to the name attribute. - id - (string): The value to be assigned to the id attribute. - - Returns: - - object - The new input element. -*/ -xajax.forms.getInput = function(type, name, id) { - if ('undefined' == typeof window.addEventListener) { - xajax.forms.getInput = function(type, name, id) { - return xajax.config.baseDocument.createElement(''); - } - } else { - xajax.forms.getInput = function(type, name, id) { - var oDoc = xajax.config.baseDocument; - var Obj = oDoc.createElement('input'); - Obj.setAttribute('type', type); - Obj.setAttribute('name', name); - Obj.setAttribute('id', id); - return Obj; - } - } - return xajax.forms.getInput(type, name, id); -} - -/* - Function: xajax.forms.createInput - - Create a new input element under the specified parent. - - Parameters: - - objParent - (string or object): The name of, or the element itself - that will be used as the reference for the insertion. - sType - (string): The value to be assigned to the type attribute. - sName - (string): The value to be assigned to the name attribute. - sId - (string): The value to be assigned to the id attribute. - - Returns: - - true - The operation completed successfully. -*/ -xajax.forms.createInput = function(command) { - command.fullName = 'createInput'; - var objParent = command.id; - - var sType = command.type; - var sName = command.data; - var sId = command.prop; - if ('string' == typeof objParent) - objParent = xajax.$(objParent); - var target = xajax.forms.getInput(sType, sName, sId); - if (objParent && target) - { - objParent.appendChild(target); - } - return true; -} - -/* - Function: xajax.forms.insertInput - - Insert a new input element before the specified element. - - Parameters: - - objSibling - (string or object): The name of, or the element itself - that will be used as the reference for the insertion. - sType - (string): The value to be assigned to the type attribute. - sName - (string): The value to be assigned to the name attribute. - sId - (string): The value to be assigned to the id attribute. - - Returns: - - true - The operation completed successfully. -*/ -xajax.forms.insertInput = function(command) { - command.fullName = 'insertInput'; - var objSibling = command.id; - var sType = command.type; - var sName = command.data; - var sId = command.prop; - if ('string' == typeof objSibling) - objSibling = xajax.$(objSibling); - var target = xajax.forms.getInput(sType, sName, sId); - if (target && objSibling && objSibling.parentNode) - objSibling.parentNode.insertBefore(target, objSibling); - return true; -} - -/* - Function: xajax.forms.insertInputAfter - - Insert a new input element after the specified element. - - Parameters: - - objSibling - (string or object): The name of, or the element itself - that will be used as the reference for the insertion. - sType - (string): The value to be assigned to the type attribute. - sName - (string): The value to be assigned to the name attribute. - sId - (string): The value to be assigned to the id attribute. - - Returns: - - true - The operation completed successfully. -*/ -xajax.forms.insertInputAfter = function(command) { - command.fullName = 'insertInputAfter'; - var objSibling = command.id; - var sType = command.type; - var sName = command.data; - var sId = command.prop; - if ('string' == typeof objSibling) - objSibling = xajax.$(objSibling); - var target = xajax.forms.getInput(sType, sName, sId); - if (target && objSibling && objSibling.parentNode) - objSibling.parentNode.insertBefore(target, objSibling.nextSibling); - return true; -} - -/* - Class: xajax.events -*/ -xajax.events = {} - -/* - Function: xajax.events.setEvent - - Set an event handler. - - Parameters: - - command - (object): Response command object. - - id: Element ID - - prop: Event - - data: Code - - Returns: - - true - The operation completed successfully. -*/ -xajax.events.setEvent = function(command) { - command.fullName = 'addEvent'; - var element = command.id; - var sEvent = command.prop; - var code = command.data; - if ('string' == typeof element) - element = xajax.$(element); - sEvent = xajax.tools.addOnPrefix(sEvent); - code = xajax.tools.doubleQuotes(code); - eval('element.' + sEvent + ' = function() { ' + code + '; }'); - return true; -} - -/* - Function: xajax.events.addHandler - - Add an event handler to the specified element. - - Parameters: - - element - (string or object): The name of, or the element itself - which will have the event handler assigned. - sEvent - (string): The name of the event. - fun - (string): The function to be called. - - Returns: - - true - The operation completed successfully. -*/ -xajax.events.addHandler = function(element, sEvent, fun) { - if (window.addEventListener) { - xajax.events.addHandler = function(command) { - command.fullName = 'addHandler'; - var element = command.id; - var sEvent = command.prop; - var fun = command.data; - if ('string' == typeof element) - element = xajax.$(element); - sEvent = xajax.tools.stripOnPrefix(sEvent); - eval('element.addEventListener("' + sEvent + '", ' + fun + ', false);'); - return true; - } - } else { - xajax.events.addHandler = function(command) { - command.fullName = 'addHandler'; - var element = command.id; - var sEvent = command.prop; - var fun = command.data; - if ('string' == typeof element) - element = xajax.$(element); - sEvent = xajax.tools.addOnPrefix(sEvent); - eval('element.attachEvent("' + sEvent + '", ' + fun + ', false);'); - return true; - } - } - return xajax.events.addHandler(element, sEvent, fun); -} - -/* - Function: xajax.events.removeHandler - - Remove an event handler from an element. - - Parameters: - - element - (string or object): The name of, or the element itself which - will have the event handler removed. - event - (string): The name of the event for which this handler is - associated. - fun - The function to be removed. - - Returns: - - true - The operation completed successfully. -*/ -xajax.events.removeHandler = function(element, sEvent, fun) { - if (window.removeEventListener) { - xajax.events.removeHandler = function(command) { - command.fullName = 'removeHandler'; - var element = command.id; - var sEvent = command.prop; - var fun = command.data; - if ('string' == typeof element) - element = xajax.$(element); - sEvent = xajax.tools.stripOnPrefix(sEvent); - eval('element.removeEventListener("' + sEvent + '", ' + fun + ', false);'); - return true; - } - } else { - xajax.events.removeHandler = function(command) { - command.fullName = 'removeHandler'; - var element = command.id; - var sEvent = command.prop; - var fun = command.data; - if ('string' == typeof element) - element = xajax.$(element); - sEvent = xajax.tools.addOnPrefix(sEvent); - eval('element.detachEvent("' + sEvent + '", ' + fun + ', false);'); - return true; - } - } - return xajax.events.removeHandler(element, sEvent, fun); -} - -/* - Class: xajax.callback -*/ -xajax.callback = {} - -/* - Function: xajax.callback.create - - Create a blank callback object. Two optional arguments let you - set the delay time for the onResponseDelay and onExpiration events. - - Returns: - - object - The callback object. -*/ -xajax.callback.create = function() { - var xx = xajax; - var xc = xx.config; - var xcb = xx.callback; - - var oCB = {} - oCB.timers = {}; - - oCB.timers.onResponseDelay = xcb.setupTimer( - (arguments.length > 0) - ? arguments[0] - : xc.defaultResponseDelayTime); - - oCB.timers.onExpiration = xcb.setupTimer( - (arguments.length > 1) - ? arguments[1] - : xc.defaultExpirationTime); - - oCB.onRequest = null; - oCB.onResponseDelay = null; - oCB.onExpiration = null; - oCB.beforeResponseProcessing = null; - oCB.onFailure = null; - oCB.onRedirect = null; - oCB.onSuccess = null; - oCB.onComplete = null; - - return oCB; -} - -/* - Function: xajax.callback.setupTimer - - Create a timer to fire an event in the future. This will - be used fire the onRequestDelay and onExpiration events. - - Parameters: - - iDelay - (integer): The amount of time in milliseconds to delay. - - Returns: - - object - A callback timer object. -*/ -xajax.callback.setupTimer = function(iDelay) -{ - return { timer: null, delay: iDelay }; -} - -/* - Function: xajax.callback.clearTimer - - Clear a callback timer for the specified function. - - Parameters: - - oCallback - (object): The callback object (or objects) that - contain the specified function timer to be cleared. - sFunction - (string): The name of the function associated - with the timer to be cleared. -*/ -xajax.callback.clearTimer = function(oCallback, sFunction) -{ - if ('undefined' != typeof oCallback.timers) { - if ('undefined' != typeof oCallback.timers[sFunction]) { - clearTimeout(oCallback.timers[sFunction].timer); - } - } else if ('object' == typeof oCallback) { - var iLen = oCallback.length; - for (var i = 0; i < iLen; ++i) - xajax.callback.clearTimer(oCallback[i], sFunction); - } -} - -/* - Function: xajax.callback.execute - - Execute a callback event. - - Parameters: - - oCallback - (object): The callback object (or objects) which - contain the event handlers to be executed. - sFunction - (string): The name of the event to be triggered. - args - (object): The request object for this request. -*/ -xajax.callback.execute = function(oCallback, sFunction, args) { - if ('undefined' != typeof oCallback[sFunction]) { - var func = oCallback[sFunction]; - if ('function' == typeof func) { - if ('undefined' != typeof oCallback.timers[sFunction]) { - oCallback.timers[sFunction].timer = setTimeout(function() { - func(args); - }, oCallback.timers[sFunction].delay); - } - else { - func(args); - } - } - } else if ('object' == typeof oCallback) { - var iLen = oCallback.length; - for (var i = 0; i < iLen; ++i) - xajax.callback.execute(oCallback[i], sFunction, args); - } -} - -/* - Class: xajax.callback.global - - The global callback object which is active for every request. -*/ -xajax.callback.global = xajax.callback.create(); - -/* - Class: xajax -*/ - -/* - Object: xajax.response - - The response queue that holds response commands, once received - from the server, until they are processed. -*/ -xajax.response = xajax.tools.queue.create(xajax.config.responseQueueSize); - -/* - Object: responseSuccessCodes - - This array contains a list of codes which will be returned from the - server upon successful completion of the server portion of the - request. - - These values should match those specified in the HTTP standard. -*/ -xajax.responseSuccessCodes = ['0', '200']; - -// 10.4.1 400 Bad Request -// 10.4.2 401 Unauthorized -// 10.4.3 402 Payment Required -// 10.4.4 403 Forbidden -// 10.4.5 404 Not Found -// 10.4.6 405 Method Not Allowed -// 10.4.7 406 Not Acceptable -// 10.4.8 407 Proxy Authentication Required -// 10.4.9 408 Request Timeout -// 10.4.10 409 Conflict -// 10.4.11 410 Gone -// 10.4.12 411 Length Required -// 10.4.13 412 Precondition Failed -// 10.4.14 413 Request Entity Too Large -// 10.4.15 414 Request-URI Too Long -// 10.4.16 415 Unsupported Media Type -// 10.4.17 416 Requested Range Not Satisfiable -// 10.4.18 417 Expectation Failed -// 10.5 Server Error 5xx -// 10.5.1 500 Internal Server Error -// 10.5.2 501 Not Implemented -// 10.5.3 502 Bad Gateway -// 10.5.4 503 Service Unavailable -// 10.5.5 504 Gateway Timeout -// 10.5.6 505 HTTP Version Not Supported - -/* - Object: responseErrorsForAlert - - This array contains a list of status codes returned by - the server to indicate that the request failed for some - reason. -*/ -xajax.responseErrorsForAlert = ['400','401','402','403','404','500','501','502','503']; - -// 10.3.1 300 Multiple Choices -// 10.3.2 301 Moved Permanently -// 10.3.3 302 Found -// 10.3.4 303 See Other -// 10.3.5 304 Not Modified -// 10.3.6 305 Use Proxy -// 10.3.7 306 (Unused) -// 10.3.8 307 Temporary Redirect - -/* - Object: responseRedirectCodes - - An array of status codes returned from the server to - indicate a request for redirect to another URL. - - Typically, this is used by the server to send the browser - to another URL. This does not typically indicate that - the xajax request should be sent to another URL. -*/ -xajax.responseRedirectCodes = ['301','302','307']; - -/* - Class: xajax.command - - The object that manages commands and command handlers. -*/ -if ('undefined' == typeof xajax.command) - xajax.command = {}; - -/* - Function: xajax.command.create - - Creates a new command (object) that will be populated with - command parameters and eventually passed to the command handler. -*/ -xajax.command.create = function(sequence, request, context) { - var newCmd = {}; - newCmd.cmd = '*'; - newCmd.fullName = '* unknown command name *'; - newCmd.sequence = sequence; - newCmd.request = request; - newCmd.context = context; - return newCmd; -} - -/* - Class: xajax.command.handler - - The object that manages command handlers. -*/ -if ('undefined' == typeof xajax.command.handler) - xajax.command.handler = {}; - -/* - Object: handlers - - An array that is used internally in the xajax.command.handler object - to keep track of command handlers that have been registered. -*/ -if ('undefined' == typeof xajax.command.handler.handlers) - xajax.command.handler.handlers = []; - -/* - Function: xajax.command.handler.register - - Registers a new command handler. -*/ -xajax.command.handler.register = function(shortName, func) { - xajax.command.handler.handlers[shortName] = func; -} - -/* - Function: xajax.command.handler.unregister - - Unregisters and returns a command handler. - - Parameters: - shortName - (string): The name of the command handler. - - Returns: - func - (function): The unregistered function. -*/ -xajax.command.handler.unregister = function(shortName) { - var func = xajax.command.handler.handlers[shortName]; - delete xajax.command.handler.handlers[shortName]; - return func; -} - -/* - Function: xajax.command.handler.isRegistered - - - Parameters: - command - (object): - - cmd: The Name of the function. - - Returns: - - boolean - (true or false): depending on whether a command handler has - been created for the specified command (object). - -*/ -xajax.command.handler.isRegistered = function(command) { - var shortName = command.cmd; - if (xajax.command.handler.handlers[shortName]) - return true; - return false; -} - -/* - Function: xajax.command.handler.call - - Calls the registered command handler for the specified command - (you should always check isRegistered before calling this function) - - Parameters: - command - (object): - - cmd: The Name of the function. - - Returns: - true - (boolean) : -*/ -xajax.command.handler.call = function(command) { - var shortName = command.cmd; - return xajax.command.handler.handlers[shortName](command); -} - -xajax.command.handler.register('rcmplt', function(args) { - xajax.completeResponse(args.request); - return true; -}); - -xajax.command.handler.register('css', function(args) { - args.fullName = 'includeCSS'; - if ('undefined' == typeof args.media) - args.media = 'screen'; - return xajax.css.add(args.data, args.media); -}); -xajax.command.handler.register('rcss', function(args) { - args.fullName = 'removeCSS'; - if ('undefined' == typeof args.media) - args.media = 'screen'; - return xajax.css.remove(args.data, args.media); -}); -xajax.command.handler.register('wcss', function(args) { - args.fullName = 'waitForCSS'; - return xajax.css.waitForCSS(args); -}); - -xajax.command.handler.register('as', function(args) { - args.fullName = 'assign/clear'; - try { - return xajax.dom.assign(args.target, args.prop, args.data); - } catch (e) { - // do nothing, if the debug module is installed it will - // catch and handle the exception - } - return true; -}); -xajax.command.handler.register('ap', function(args) { - args.fullName = 'append'; - return xajax.dom.append(args.target, args.prop, args.data); -}); -xajax.command.handler.register('pp', function(args) { - args.fullName = 'prepend'; - return xajax.dom.prepend(args.target, args.prop, args.data); -}); -xajax.command.handler.register('rp', function(args) { - args.fullName = 'replace'; - return xajax.dom.replace(args.id, args.prop, args.data); -}); -xajax.command.handler.register('rm', function(args) { - args.fullName = 'remove'; - return xajax.dom.remove(args.id); -}); -xajax.command.handler.register('ce', function(args) { - args.fullName = 'create'; - return xajax.dom.create(args.id, args.data, args.prop); -}); -xajax.command.handler.register('ie', function(args) { - args.fullName = 'insert'; - return xajax.dom.insert(args.id, args.data, args.prop); -}); -xajax.command.handler.register('ia', function(args) { - args.fullName = 'insertAfter'; - return xajax.dom.insertAfter(args.id, args.data, args.prop); -}); - -xajax.command.handler.register('c:as', xajax.dom.contextAssign); -xajax.command.handler.register('c:ap', xajax.dom.contextAppend); -xajax.command.handler.register('c:pp', xajax.dom.contextPrepend); - -xajax.command.handler.register('s', xajax.js.sleep); -xajax.command.handler.register('ino', xajax.js.includeScriptOnce); -xajax.command.handler.register('in', xajax.js.includeScript); -xajax.command.handler.register('rjs', xajax.js.removeScript); -xajax.command.handler.register('wf', xajax.js.waitFor); -xajax.command.handler.register('js', xajax.js.execute); -xajax.command.handler.register('jc', xajax.js.call); -xajax.command.handler.register('sf', xajax.js.setFunction); -xajax.command.handler.register('wpf', xajax.js.wrapFunction); -xajax.command.handler.register('al', function(args) { - args.fullName = 'alert'; - alert(args.data); - return true; -}); -xajax.command.handler.register('cc', xajax.js.confirmCommands); - -xajax.command.handler.register('ci', xajax.forms.createInput); -xajax.command.handler.register('ii', xajax.forms.insertInput); -xajax.command.handler.register('iia', xajax.forms.insertInputAfter); - -xajax.command.handler.register('ev', xajax.events.setEvent); - -xajax.command.handler.register('ah', xajax.events.addHandler); -xajax.command.handler.register('rh', xajax.events.removeHandler); - -xajax.command.handler.register('dbg', function(args) { - args.fullName = 'debug message'; - return true; -}); - -/* - Function: xajax.initializeRequest - - Initialize a request object, populating default settings, where - call specific settings are not already provided. - - Parameters: - - oRequest - (object): An object that specifies call specific settings - that will, in addition, be used to store all request related - values. This includes temporary values used internally by xajax. -*/ -xajax.initializeRequest = function(oRequest) { - var xx = xajax; - var xc = xx.config; - - oRequest.append = function(opt, def) { - if ('undefined' != typeof this[opt]) { - for (var itmName in def) - if ('undefined' == typeof this[opt][itmName]) - this[opt][itmName] = def[itmName]; - } else this[opt] = def; - } - - oRequest.append('commonHeaders', xc.commonHeaders); - oRequest.append('postHeaders', xc.postHeaders); - oRequest.append('getHeaders', xc.getHeaders); - - oRequest.set = function(option, defaultValue) { - if ('undefined' == typeof this[option]) - this[option] = defaultValue; - } - - oRequest.set('statusMessages', xc.statusMessages); - oRequest.set('waitCursor', xc.waitCursor); - oRequest.set('mode', xc.defaultMode); - oRequest.set('method', xc.defaultMethod); - oRequest.set('URI', xc.requestURI); - oRequest.set('httpVersion', xc.defaultHttpVersion); - oRequest.set('contentType', xc.defaultContentType); - oRequest.set('retry', xc.defaultRetry); - oRequest.set('returnValue', xc.defaultReturnValue); - oRequest.set('maxObjectDepth', xc.maxObjectDepth); - oRequest.set('maxObjectSize', xc.maxObjectSize); - oRequest.set('context', window); - - var xcb = xx.callback; - var gcb = xcb.global; - var lcb = xcb.create(); - - lcb.take = function(frm, opt) { - if ('undefined' != typeof frm[opt]) { - lcb[opt] = frm[opt]; - lcb.hasEvents = true; - } - delete frm[opt]; - } - - lcb.take(oRequest, 'onRequest'); - lcb.take(oRequest, 'onResponseDelay'); - lcb.take(oRequest, 'onExpiration'); - lcb.take(oRequest, 'beforeResponseProcessing'); - lcb.take(oRequest, 'onFailure'); - lcb.take(oRequest, 'onRedirect'); - lcb.take(oRequest, 'onSuccess'); - lcb.take(oRequest, 'onComplete'); - - if ('undefined' != typeof oRequest.callback) { - if (lcb.hasEvents) - oRequest.callback = [oRequest.callback, lcb]; - } else - oRequest.callback = lcb; - - oRequest.status = (oRequest.statusMessages) - ? xc.status.update() - : xc.status.dontUpdate(); - - oRequest.cursor = (oRequest.waitCursor) - ? xc.cursor.update() - : xc.cursor.dontUpdate(); - - oRequest.method = oRequest.method.toUpperCase(); - if ('GET' != oRequest.method) - oRequest.method = 'POST'; // W3C: Method is case sensitive - - oRequest.requestRetry = oRequest.retry; - - oRequest.append('postHeaders', { - 'content-type': oRequest.contentType - }); - - delete oRequest['append']; - delete oRequest['set']; - delete oRequest['take']; - - if ('undefined' == typeof oRequest.URI) - throw { code: 10005 } -} - -/* - Function: xajax.processParameters - - Processes request specific parameters and generates the temporary - variables needed by xajax to initiate and process the request. - - Parameters: - - oRequest - A request object, created initially by a call to - - - Note: - This is called once per request; upon a request failure, this - will not be called for additional retries. -*/ -xajax.processParameters = function(oRequest) { - var xx = xajax; - var xt = xx.tools; - - var rd = []; - - var separator = ''; - for (var sCommand in oRequest.functionName) { - if ('constructor' != sCommand) { - rd.push(separator); - rd.push(sCommand); - rd.push('='); - rd.push(encodeURIComponent(oRequest.functionName[sCommand])); - separator = '&'; - } - } - var dNow = new Date(); - rd.push('&xjxr='); - rd.push(dNow.getTime()); - delete dNow; - - if (oRequest.parameters) { - var i = 0; - var iLen = oRequest.parameters.length; - while (i < iLen) { - var oVal = oRequest.parameters[i]; - if ('object' == typeof oVal && null != oVal) { - try { - var oGuard = {}; - oGuard.depth = 0; - oGuard.maxDepth = oRequest.maxObjectDepth; - oGuard.size = 0; - oGuard.maxSize = oRequest.maxObjectSize; - oVal = xt._objectToXML(oVal, oGuard); - } catch (e) { - oVal = ''; - // do nothing, if the debug module is installed - // it will catch the exception and handle it - } - rd.push('&xjxargs[]='); - oVal = encodeURIComponent(oVal); - rd.push(oVal); - ++i; - } else { - rd.push('&xjxargs[]='); - oVal = xt._escape(oVal); - if ('undefined' == typeof oVal || null == oVal) { - rd.push('*'); - } else { - var sType = typeof oVal; - if ('string' == sType) - rd.push('S'); - else if ('boolean' == sType) - rd.push('B'); - else if ('number' == sType) - rd.push('N'); - oVal = encodeURIComponent(oVal); - rd.push(oVal); - } - ++i; - } - } - } - - oRequest.requestURI = oRequest.URI; - - if ('GET' == oRequest.method) { - oRequest.requestURI += oRequest.requestURI.indexOf('?')== -1 ? '?' : '&'; - oRequest.requestURI += rd.join(''); - rd = []; - } - - oRequest.requestData = rd.join(''); -} - -/* - Function: xajax.prepareRequest - - Prepares the XMLHttpRequest object for this xajax request. - - Parameters: - - oRequest - (object): An object created by a call to - which already contains the necessary parameters and temporary variables - needed to initiate and process a xajax request. - - Note: - This is called each time a request object is being prepared for a - call to the server. If the request is retried, the request must be - prepared again. -*/ -xajax.prepareRequest = function(oRequest) { - var xx = xajax; - var xt = xx.tools; - - oRequest.request = xt.getRequestObject(); - - oRequest.setRequestHeaders = function(headers) { - if ('object' == typeof headers) { - for (var optionName in headers) - this.request.setRequestHeader(optionName, headers[optionName]); - } - } - oRequest.setCommonRequestHeaders = function() { - this.setRequestHeaders(this.commonHeaders); - } - oRequest.setPostRequestHeaders = function() { - this.setRequestHeaders(this.postHeaders); - } - oRequest.setGetRequestHeaders = function() { - this.setRequestHeaders(this.getHeaders); - } - - if ('asynchronous' == oRequest.mode) { - // references inside this function should be expanded - // IOW, don't use shorthand references like xx for xajax - oRequest.request.onreadystatechange = function() { - if (oRequest.request.readyState != 4) - return; - xajax.responseReceived(oRequest); - } - oRequest.finishRequest = function() { - return this.returnValue; - } - } else { - oRequest.finishRequest = function() { - return xajax.responseReceived(oRequest); - } - } - - if ('undefined' != typeof oRequest.userName && 'undefined' != typeof oRequest.password) { - oRequest.open = function() { - this.request.open( - this.method, - this.requestURI, - 'asynchronous' == this.mode, - oRequest.userName, - oRequest.password); - } - } else { - oRequest.open = function() { - this.request.open( - this.method, - this.requestURI, - 'asynchronous' == this.mode); - } - } - - if ('POST' == oRequest.method) { // W3C: Method is case sensitive - oRequest.applyRequestHeaders = function() { - this.setCommonRequestHeaders(); - try { - this.setPostRequestHeaders(); - } catch (e) { - this.method = 'GET'; - this.requestURI += this.requestURI.indexOf('?')== -1 ? '?' : '&'; - this.requestURI += this.requestData; - this.requestData = ''; - if (0 == this.requestRetry) this.requestRetry = 1; - throw e; - } - } - } else { - oRequest.applyRequestHeaders = function() { - this.setCommonRequestHeaders(); - this.setGetRequestHeaders(); - } - } -} - -/* - Function: xajax.request - - Initiates a request to the server. - - Parameters: - - functionName - (object): An object containing the name of the function to execute - on the server. The standard request is: {xjxfun:'function_name'} - - oRequest - (object, optional): A request object which - may contain call specific parameters. This object will be - used by xajax to store all the request parameters as well - as temporary variables needed during the processing of the - request. - -*/ -xajax.request = function() { - var numArgs = arguments.length; - if (0 == numArgs) - return false; - - var oRequest = {} - if (1 < numArgs) - oRequest = arguments[1]; - - oRequest.functionName = arguments[0]; - - var xx = xajax; - - xx.initializeRequest(oRequest); - xx.processParameters(oRequest); - while (0 < oRequest.requestRetry) { - try { - --oRequest.requestRetry; - xx.prepareRequest(oRequest); - return xx.submitRequest(oRequest); - } catch (e) { - xajax.callback.execute( - [xajax.callback.global, oRequest.callback], - 'onFailure', oRequest); - if (0 == oRequest.requestRetry) - throw e; - } - } -} - -/* - Function: xajax.call - - Initiates a call to the server. - - Parameters: - - sFunctionName - (string): The name of the function to execute - on the server. - - oRequestOptions - (object, optional): A request object which - may contain call specific parameters. This object will be - used by xajax to store all the request parameters as well - as temporary variables needed during the processing of the - request. - - Returns: - - unknown - For asynchronous calls, the return value will always - be the value set for -*/ -xajax.call = function() { - var numArgs = arguments.length; - if (0 == numArgs) - return false; - - var oRequest = {} - if (1 < numArgs) - oRequest = arguments[1]; - - oRequest.functionName = { xjxfun: arguments[0] }; - - var xx = xajax; - - xx.initializeRequest(oRequest); - xx.processParameters(oRequest); - - while (0 < oRequest.requestRetry) { - try { - --oRequest.requestRetry; - xx.prepareRequest(oRequest); - return xx.submitRequest(oRequest); - } catch (e) { - xajax.callback.execute( - [xajax.callback.global, oRequest.callback], - 'onFailure', oRequest); - if (0 == oRequest.requestRetry) - throw e; - } - } -} - -/* - Function: xajax.submitRequest - - Create a request object and submit the request using the specified - request type; all request parameters should be finalized by this - point. Upon failure of a POST, this function will fall back to a - GET request. - - Parameters: - - oRequest - (object): The request context object. -*/ -xajax.submitRequest = function(oRequest) { - oRequest.status.onRequest(); - - var xcb = xajax.callback; - var gcb = xcb.global; - var lcb = oRequest.callback; - - xcb.execute([gcb, lcb], 'onResponseDelay', oRequest); - xcb.execute([gcb, lcb], 'onExpiration', oRequest); - xcb.execute([gcb, lcb], 'onRequest', oRequest); - - oRequest.open(); - oRequest.applyRequestHeaders(); - - oRequest.cursor.onWaiting(); - oRequest.status.onWaiting(); - - xajax._internalSend(oRequest); - - // synchronous mode causes response to be processed immediately here - return oRequest.finishRequest(); -} - -/* - Function: xajax._internalSend - - This function is used internally by xajax to initiate a request to the - server. - - Parameters: - - oRequest - (object): The request context object. -*/ -xajax._internalSend = function(oRequest) { - // this may block if synchronous mode is selected - oRequest.request.send(oRequest.requestData); -} - -/* - Function: xajax.abortRequest - - Abort the request. - - Parameters: - - oRequest - (object): The request context object. -*/ -xajax.abortRequest = function(oRequest) -{ - oRequest.aborted = true; - oRequest.request.abort(); - xajax.completeResponse(oRequest); -} - -/* - Function: xajax.responseReceived - - Process the response. - - Parameters: - - oRequest - (object): The request context object. -*/ -xajax.responseReceived = function(oRequest) { - var xx = xajax; - var xcb = xx.callback; - var gcb = xcb.global; - var lcb = oRequest.callback; - // sometimes the responseReceived gets called when the - // request is aborted - if (oRequest.aborted) - return; - - xcb.clearTimer([gcb, lcb], 'onExpiration'); - xcb.clearTimer([gcb, lcb], 'onResponseDelay'); - - xcb.execute([gcb, lcb], 'beforeResponseProcessing', oRequest); - - var fProc = xx.getResponseProcessor(oRequest); - if ('undefined' == typeof fProc) { - xcb.execute([gcb, lcb], 'onFailure', oRequest); - xx.completeResponse(oRequest); - return; - } - - return fProc(oRequest); -} - -/* - Function: xajax.getResponseProcessor - - This function attempts to determine, based on the content type of the - reponse, what processor should be used for handling the response data. - - The default xajax response will be text/xml which will invoke the - xajax xml response processor. Other response processors may be added - in the future. The user can specify their own response processor on - a call by call basis. - - Parameters: - - oRequest - (object): The request context object. -*/ -xajax.getResponseProcessor = function(oRequest) { - var fProc; - - if ('undefined' == typeof oRequest.responseProcessor) { - var cTyp = oRequest.request.getResponseHeader('content-type'); - if (cTyp) { - if (0 <= cTyp.indexOf('text/xml')) { - fProc = xajax.responseProcessor.xml; - // } else if (0 <= cTyp.indexOf('application/json')) { - // fProc = xajax.responseProcessor.json; - } - } - } else fProc = oRequest.responseProcessor; - - return fProc; -} - -/* - Function: xajax.executeCommand - - Perform a lookup on the command specified by the response command - object passed in the first parameter. If the command exists, the - function checks to see if the command references a DOM object by - ID; if so, the object is located within the DOM and added to the - command data. The command handler is then called. - - If the command handler returns true, it is assumed that the command - completed successfully. If the command handler returns false, then the - command is considered pending; xajax enters a wait state. It is up - to the command handler to set an interval, timeout or event handler - which will restart the xajax response processing. - - Parameters: - - obj - (object): The response command to be executed. - - Returns: - - true - The command completed successfully. - false - The command signalled that it needs to pause processing. -*/ -xajax.executeCommand = function(command) { - if (xajax.command.handler.isRegistered(command)) { - // it is important to grab the element here as the previous command - // might have just created the element - if (command.id) - command.target = xajax.$(command.id); - // process the command - if (false == xajax.command.handler.call(command)) { - xajax.tools.queue.pushFront(xajax.response, command); - return false; - } - } - return true; -} - -/* - Function: xajax.completeResponse - - Called by the response command queue processor when all commands have - been processed. - - Parameters: - - oRequest - (object): The request context object. -*/ -xajax.completeResponse = function(oRequest) { - xajax.callback.execute( - [xajax.callback.global, oRequest.callback], - 'onComplete', oRequest); - oRequest.cursor.onComplete(); - oRequest.status.onComplete(); - // clean up -- these items are restored when the request is initiated - delete oRequest['functionName']; - delete oRequest['requestURI']; - delete oRequest['requestData']; - delete oRequest['requestRetry']; - delete oRequest['request']; - delete oRequest['set']; - delete oRequest['open']; - delete oRequest['setRequestHeaders']; - delete oRequest['setCommonRequestHeaders']; - delete oRequest['setPostRequestHeaders']; - delete oRequest['setGetRequestHeaders']; - delete oRequest['applyRequestHeaders']; - delete oRequest['finishRequest']; - delete oRequest['status']; - delete oRequest['cursor']; -} - -/* - Function: xajax.$ - - Shortcut to . -*/ -xajax.$ = xajax.tools.$; - -/* - Function: xajax.getFormValues - - Shortcut to . -*/ -xajax.getFormValues = xajax.tools.getFormValues; - -/* - Boolean: xajax.isLoaded - - true - xajax module is loaded. -*/ -xajax.isLoaded = true; - - -/* - Class: xjx - - Contains shortcut's to frequently used functions. -*/ -xjx = {} - -/* - Function: xjx.$ - - Shortcut to . -*/ -xjx.$ = xajax.tools.$; - -/* - Function: xjx.getFormValues - - Shortcut to . -*/ -xjx.getFormValues = xajax.tools.getFormValues; - -/* - Function: xjx.call - - Shortcut to . -*/ -xjx.call = xajax.call; - -xjx.request = xajax.request; diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_debug.js b/phpgwapi/inc/xajax/xajax_js/xajax_debug.js deleted file mode 100644 index 1b58e74c0e..0000000000 --- a/phpgwapi/inc/xajax/xajax_js/xajax_debug.js +++ /dev/null @@ -1,117 +0,0 @@ - -try{if('undefined'==typeof xajax) -throw{name:'SequenceError',message:'Error: xajax core was not detected, debug module disabled.'} -if('undefined'==typeof xajax.debug) -xajax.debug={} -xajax.debug.workId='xajaxWork'+new Date().getTime();xajax.debug.windowSource='about:blank';xajax.debug.windowID='xajax_debug_'+xajax.debug.workId;if('undefined'==typeof xajax.debug.windowStyle) -xajax.debug.windowStyle= -'width=800,'+ -'height=600,'+ -'scrollbars=yes,'+ -'resizable=yes,'+ -'status=yes';if('undefined'==typeof xajax.debug.windowTemplate) -xajax.debug.windowTemplate= -''+ -''+ -'xajax debug output'+ -''+ -''+ -'

    xajax debug output

    '+ -'
    '+ -'';xajax.debug.text=[];xajax.debug.text[100]='WARNING: ';xajax.debug.text[101]='ERROR: ';xajax.debug.text[102]='XAJAX DEBUG MESSAGE:\n';xajax.debug.text[103]='...\n[LONG RESPONSE]\n...';xajax.debug.text[104]='SENDING REQUEST';xajax.debug.text[105]='SENT [';xajax.debug.text[106]=' bytes]';xajax.debug.text[107]='CALLING: ';xajax.debug.text[108]='URI: ';xajax.debug.text[109]='INITIALIZING REQUEST';xajax.debug.text[110]='PROCESSING PARAMETERS [';xajax.debug.text[111]=']';xajax.debug.text[112]='NO PARAMETERS TO PROCESS';xajax.debug.text[113]='PREPARING REQUEST';xajax.debug.text[114]='STARTING XAJAX CALL (deprecated: use xajax.request instead)';xajax.debug.text[115]='STARTING XAJAX REQUEST';xajax.debug.text[116]='No response processor is available to process the response from the server.\n';xajax.debug.text[117]='.\nCheck for error messages from the server.';xajax.debug.text[118]='RECEIVED [status: ';xajax.debug.text[119]=', size: ';xajax.debug.text[120]=' bytes, time: ';xajax.debug.text[121]='ms]:\n';xajax.debug.text[122]='The server returned the following HTTP status: ';xajax.debug.text[123]='\nRECEIVED:\n';xajax.debug.text[124]='The server returned a redirect to:
    ';xajax.debug.text[125]='DONE [';xajax.debug.text[126]='ms]';xajax.debug.text[127]='INITIALIZING REQUEST OBJECT';xajax.debug.exceptions=[];xajax.debug.exceptions[10001]='Invalid response XML: The response contains an unknown tag: {data}.';xajax.debug.exceptions[10002]='GetRequestObject: XMLHttpRequest is not available, xajax is disabled.';xajax.debug.exceptions[10003]='Queue overflow: Cannot push object onto queue because it is full.';xajax.debug.exceptions[10004]='Invalid response XML: The response contains an unexpected tag or text: {data}.';xajax.debug.exceptions[10005]='Invalid request URI: Invalid or missing URI; autodetection failed; please specify a one explicitly.';xajax.debug.exceptions[10006]='Invalid response command: Malformed response command received.';xajax.debug.exceptions[10007]='Invalid response command: Command [{data}] is not a known command.';xajax.debug.exceptions[10008]='Element with ID [{data}] not found in the document.';xajax.debug.exceptions[10009]='Invalid request: Missing function name parameter.';xajax.debug.exceptions[10010]='Invalid request: Missing function object parameter.';xajax.debug.getExceptionText=function(e){if('undefined'!=typeof e.code){if('undefined'!=typeof xajax.debug.exceptions[e.code]){var msg=xajax.debug.exceptions[e.code];if('undefined'!=typeof e.data){msg.replace('{data}',e.data);} -return msg;} -}else if('undefined'!=typeof e.name){var msg=e.name;if('undefined'!=typeof e.message){msg+=': ';msg+=e.message;} -return msg;} -return 'An unknown error has occurred.';} -xajax.debug.writeMessage=function(text,prefix,cls){try{var xd=xajax.debug;if('undefined'==typeof xd.window||true==xd.window.closed){xd.window=window.open(xd.windowSource,xd.windowID,xd.windowStyle);if("about:blank"==xd.windowSource) -xd.window.document.write(xd.windowTemplate);} -var xdw=xd.window;var xdwd=xdw.document;if('undefined'==typeof prefix) -prefix='';if('undefined'==typeof cls) -cls='debugText';text=xajax.debug.prepareDebugText(text);var debugTag=xdwd.getElementById('debugTag');var debugEntry=xdwd.createElement('div');var debugDate=xdwd.createElement('span');var debugText=xdwd.createElement('pre');debugDate.innerHTML=new Date().toString();debugText.innerHTML=prefix+text;debugEntry.appendChild(debugDate);debugEntry.appendChild(debugText);debugTag.insertBefore(debugEntry,debugTag.firstChild);try{debugEntry.className='debugEntry';debugDate.className='debugDate';debugText.className=cls;}catch(e){} -}catch(e){if(text.length > 1000)text=text.substr(0,1000)+xajax.debug.text[102];alert(xajax.debug.text[102]+text);} -} -xajax.debug.prepareDebugText=function(text){try{text=text.replace(/&/g,'&') -.replace(//g,'>') -.replace(/\n/g,'
    ');return text;}catch(e){xajax.debug.stringReplace=function(haystack,needle,newNeedle){var segments=haystack.split(needle);haystack='';for(var i=0;i < segments.length;++i){if(0!=i) -haystack+=newNeedle;haystack+=segments[i];} -return haystack;} -xajax.debug.prepareDebugText=function(text){text=xajax.debug.stringReplace(text,'&','&');text=xajax.debug.stringReplace(text,'<','<');text=xajax.debug.stringReplace(text,'>','>');text=xajax.debug.stringReplace(text,'\n','
    ');return text;} -xajax.debug.prepareDebugText(text);} -} -xajax.debug.executeCommand=xajax.executeCommand;xajax.executeCommand=function(args){try{if('undefined'==typeof args.cmd) -throw{code:10006};if(false==xajax.command.handler.isRegistered(args)) -throw{code:10007,data:args.cmd};return xajax.debug.executeCommand(args);}catch(e){var msg='ExecuteCommand (';if('undefined'!=typeof args.sequence){msg+='#';msg+=args.sequence;msg+=', ';} -if('undefined'!=typeof args.cmdFullName){msg+='"';msg+=args.cmdFullName;msg+='"';} -msg+='):\n';msg+=xajax.debug.getExceptionText(e);msg+='\n';xajax.debug.writeMessage(msg,xajax.debug.text[101],'errorText');} -return true;} -xajax.debug.parseAttributes=xajax.parseAttributes;xajax.parseAttributes=function(child,obj){try{xajax.debug.parseAttributes(child,obj);}catch(e){var msg='ParseAttributes:\n';msg+=xajax.debug.getExceptionText(e);msg+='\n';xajax.debug.writeMessage(msg,xajax.debug.text[101],'errorText');} -} -xajax.debug.commandHandler=xajax.command.handler.unregister('dbg');xajax.command.handler.register('dbg',function(args){args.cmdFullName='debug message';xajax.debug.writeMessage(args.data,xajax.debug.text[100],'warningText');return xajax.debug.commandHandler(args);});xajax.debug.$=xajax.tools.$;xajax.tools.$=function(sId){try{var returnValue=xajax.debug.$(sId);if('object'!=typeof returnValue) -throw{code:10008};} -catch(e){var msg='$:';msg+=xajax.debug.getExceptionText(e);msg+='\n';xajax.debug.writeMessage(msg,xajax.debug.text[100],'warningText');} -return returnValue;} -xajax.debug._objectToXML=xajax.tools._objectToXML;xajax.tools._objectToXML=function(obj,guard){try{if(0==guard.size){var msg='OBJECT TO XML: maxDepth = ';msg+=guard.maxDepth;msg+=', maxSize = ';msg+=guard.maxSize;xajax.debug.writeMessage(msg);} -var r=xajax.debug._objectToXML(obj,guard);if(0==guard.depth){var msg='OBJECT TO XML: size = ';msg+=guard.size;xajax.debug.writeMessage(msg);} -return r;}catch(e){var msg='ObjectToXML: ';msg+=xajax.debug.getExceptionText(e);msg+='\n';xajax.debug.writeMessage(msg,xajax.debug.text[101],'errorText');} -return '';} -xajax.debug._internalSend=xajax._internalSend;xajax._internalSend=function(oRequest){try{xajax.debug.writeMessage(xajax.debug.text[104]);xajax.debug.writeMessage( -xajax.debug.text[105]+ -oRequest.requestData.length+ -xajax.debug.text[106] -);oRequest.beginDate=new Date();xajax.debug._internalSend(oRequest);}catch(e){var msg='InternalSend: ';msg+=xajax.debug.getExceptionText(e);msg+='\n';xajax.debug.writeMessage(msg,xajax.debug.text[101],'errorText');throw e;} -} -xajax.debug.submitRequest=xajax.submitRequest;xajax.submitRequest=function(oRequest){var msg=oRequest.method;msg+=': ';text=decodeURIComponent(oRequest.requestData);text=text.replace(new RegExp('&xjx','g'),'\n&xjx');text=text.replace(new RegExp('','g'),'\n');text=text.replace(new RegExp('','g'),'\n');text=text.replace(new RegExp('','g'),'\n\n');msg+=text;xajax.debug.writeMessage(msg);msg=xajax.debug.text[107];var separator='\n';for(var mbr in oRequest.functionName){msg+=separator;msg+=mbr;msg+=': ';msg+=oRequest.functionName[mbr];separator='\n';} -msg+=separator;msg+=xajax.debug.text[108];msg+=separator;msg+=oRequest.URI;xajax.debug.writeMessage(msg);try{return xajax.debug.submitRequest(oRequest);}catch(e){xajax.debug.writeMessage(e.message);if(0 < oRequest.retry) -throw e;} -} -xajax.debug.initializeRequest=xajax.initializeRequest;xajax.initializeRequest=function(oRequest){try{var msg=xajax.debug.text[109];xajax.debug.writeMessage(msg);return xajax.debug.initializeRequest(oRequest);}catch(e){var msg='InitializeRequest: ';msg+=xajax.debug.getExceptionText(e);msg+='\n';xajax.debug.writeMessage(msg,xajax.debug.text[101],'errorText');throw e;} -} -xajax.debug.processParameters=xajax.processParameters;xajax.processParameters=function(oRequest){try{if('undefined'!=typeof oRequest.parameters){var msg=xajax.debug.text[110];msg+=oRequest.parameters.length;msg+=xajax.debug.text[111];xajax.debug.writeMessage(msg);}else{var msg=xajax.debug.text[112];xajax.debug.writeMessage(msg);} -return xajax.debug.processParameters(oRequest);}catch(e){var msg='ProcessParameters: ';msg+=xajax.debug.getExceptionText(e);msg+='\n';xajax.debug.writeMessage(msg,xajax.debug.text[101],'errorText');throw e;} -} -xajax.debug.prepareRequest=xajax.prepareRequest;xajax.prepareRequest=function(oRequest){try{var msg=xajax.debug.text[113];xajax.debug.writeMessage(msg);return xajax.debug.prepareRequest(oRequest);}catch(e){var msg='PrepareRequest: ';msg+=xajax.debug.getExceptionText(e);msg+='\n';xajax.debug.writeMessage(msg,xajax.debug.text[101],'errorText');throw e;} -} -xajax.debug.call=xajax.call;xajax.call=function(){try{xajax.debug.writeMessage(xajax.debug.text[114]);var numArgs=arguments.length;if(0==numArgs) -throw{code:10009};var functionName=arguments[0];var oOptions={} -if(1 < numArgs) -oOptions=arguments[1];oOptions.debugging=true;return xajax.debug.call(functionName,oOptions);}catch(e){var msg='Call: ';msg+=xajax.debug.getExceptionText(e);msg+='\n';xajax.debug.writeMessage(msg,xajax.debug.text[101],'errorText');throw e;} -} -xajax.debug.request=xajax.request;xajax.request=function(){try{xajax.debug.writeMessage(xajax.debug.text[115]);var numArgs=arguments.length;if(0==numArgs) -throw{code:10010};var oFunction=arguments[0];var oOptions={} -if(1 < numArgs) -oOptions=arguments[1];oOptions.debugging=true;return xajax.debug.request(oFunction,oOptions);}catch(e){var msg='Request: ';msg+=xajax.debug.getExceptionText(e);msg+='\n';xajax.debug.writeMessage(msg,xajax.debug.text[101],'errorText');throw e;} -} -xajax.debug.getResponseProcessor=xajax.getResponseProcessor;xajax.getResponseProcessor=function(oRequest){try{var fProc=xajax.debug.getResponseProcessor(oRequest);if('undefined'==typeof fProc){var msg=xajax.debug.text[116];try{var contentType=oRequest.request.getResponseHeader('content-type');msg+="Content-Type: ";msg+=contentType;if('text/html'==contentType){msg+=xajax.debug.text[117];} -}catch(e){} -xajax.debug.writeMessage(msg,xajax.debug.text[101],'errorText');} -return fProc;}catch(e){var msg='GetResponseProcessor: ';msg+=xajax.debug.getExceptionText(e);msg+='\n';xajax.debug.writeMessage(msg,xajax.debug.text[101],'errorText');throw e;} -} -xajax.debug.responseReceived=xajax.responseReceived;xajax.responseReceived=function(oRequest){var xx=xajax;var xt=xx.tools;var xd=xx.debug;var oRet;try{var status=oRequest.request.status;if(xt.arrayContainsValue(xx.responseSuccessCodes,status)){var packet=oRequest.request.responseText;packet=packet.replace(new RegExp('','g'),'\n');packet=packet.replace(new RegExp('','g'),'\n');packet=packet.replace(new RegExp('','g'),'\n');packet=packet.replace(new RegExp('','g'),'\n\n');packet=packet.replace(new RegExp('','g'),'\n');oRequest.midDate=new Date();var msg=xajax.debug.text[118];msg+=oRequest.request.status;msg+=xajax.debug.text[119];msg+=packet.length;msg+=xajax.debug.text[120];msg+=(oRequest.midDate-oRequest.beginDate);msg+=xajax.debug.text[121];msg+=packet;xd.writeMessage(msg);}else if(xt.arrayContainsValue(xx.responseErrorsForAlert,status)){var msg=xajax.debug.text[122];msg+=status;msg+=xajax.debug.text[123];msg+=oRequest.request.responseText;xd.writeMessage(msg,xajax.debug.text[101],'errorText');}else if(xt.arrayContainsValue(xx.responseRedirectCodes,status)){var msg=xajax.debug.text[124];msg+=oRequest.request.getResponseHeader('location');xd.writeMessage(msg);} -oRet=xd.responseReceived(oRequest);}catch(e){var msg='ResponseReceived: ';msg+=xajax.debug.getExceptionText(e);msg+='\n';xd.writeMessage(msg,xajax.debug.text[101],'errorText');} -return oRet;} -xajax.debug.completeResponse=xajax.completeResponse;xajax.completeResponse=function(oRequest){try{var returnValue=xajax.debug.completeResponse(oRequest);oRequest.endDate=new Date();var msg=xajax.debug.text[125];msg+=(oRequest.endDate-oRequest.beginDate);msg+=xajax.debug.text[126];xajax.debug.writeMessage(msg);return returnValue;}catch(e){var msg='CompleteResponse: ';msg+=xajax.debug.getExceptionText(e);msg+='\n';xajax.debug.writeMessage(msg,xajax.debug.text[101],'errorText');throw e;} -} -xajax.debug.getRequestObject=xajax.tools.getRequestObject;xajax.tools.getRequestObject=function(){try{xajax.debug.writeMessage(xajax.debug.text[127]);return xajax.debug.getRequestObject();}catch(e){var msg='GetRequestObject: ';msg+=xajax.debug.getExceptionText(e);msg+='\n';xajax.debug.writeMessage(msg,xajax.debug.text[101],'errorText');throw e;} -} -if(xajax.dom.assign){xajax.debug.assign=xajax.dom.assign;xajax.dom.assign=function(element,property,data){try{return xajax.debug.assign(element,property,data);}catch(e){var msg='xajax.dom.assign: ';msg+=xajax.debug.getExceptionText(e);msg+='\n';msg+='Eval: element.';msg+=property;msg+=' = data;\n';xajax.debug.writeMessage(msg,xajax.debug.text[101],'errorText');} -return true;} -} -if(xajax.tools){if(xajax.tools.queue){if(xajax.tools.queue.retry){if('undefined'==typeof xajax.debug.tools) -xajax.debug.tools={};if('undefined'==typeof xajax.debug.tools.queue) -xajax.debug.tools.queue={};xajax.debug.tools.queue.retry=xajax.tools.queue.retry;xajax.tools.queue.retry=function(obj,count){if(xajax.debug.tools.queue.retry(obj,count)) -return true;if(obj.cmd&&'s'==obj.cmd) -return false;xajax.debug.writeMessage('Retry count exceeded.');return false;} -} -} -} -xajax.debug.isLoaded=true;xjx={} -xjx.$=xajax.tools.$;xjx.getFormValues=xajax.tools.getFormValues;xjx.call=xajax.call;xjx.request=xajax.request;xajax.$=xajax.tools.$;xajax.getFormValues=xajax.tools.getFormValues;}catch(e){alert(e.name+': '+e.message);} diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_debug_uncompressed.js b/phpgwapi/inc/xajax/xajax_js/xajax_debug_uncompressed.js deleted file mode 100644 index 1317182f2e..0000000000 --- a/phpgwapi/inc/xajax/xajax_js/xajax_debug_uncompressed.js +++ /dev/null @@ -1,883 +0,0 @@ -/* - File: xajax_debug.js - - This optional file contains the debugging module for use with xajax. If - you include this module after the standard module, you - will receive debugging messages, including errors, that occur during - the processing of your xajax requests. - - Title: xajax debugging module - - Please see for a detailed description, copyright - and license information. -*/ - -/* - @package xajax - @version $Id: xajax_debug_uncompressed.js 327 2007-02-28 16:55:26Z calltoconstruct $ - @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson - @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson - @license http://www.xajaxproject.org/bsd_license.txt BSD License -*/ - -try -{ - /* - Class: xajax.debug - - This object contains the variables and functions used to display process state - messages and to trap error conditions and report them to the user via - a secondary browser window or alert messages as necessary. - */ - if ('undefined' == typeof xajax) - throw { name: 'SequenceError', message: 'Error: xajax core was not detected, debug module disabled.' } - - if ('undefined' == typeof xajax.debug) - xajax.debug = {} - - /* - String: xajax.debug.workId - - Stores a 'unique' identifier for this session so that an existing debugging - window can be detected, else one will be created. - */ - xajax.debug.workId = 'xajaxWork'+ new Date().getTime(); - - /* - String: xajax.debug.windowSource - - The default URL that is given to the debugging window upon creation. - */ - xajax.debug.windowSource = 'about:blank'; - - /* - String: xajax.debug.windowID - - A 'unique' name used to identify the debugging window that is attached - to this xajax session. - */ - xajax.debug.windowID = 'xajax_debug_'+xajax.debug.workId; - - /* - String: windowStyle - - The parameters that will be used to create the debugging window. - */ - if ('undefined' == typeof xajax.debug.windowStyle) - xajax.debug.windowStyle = - 'width=800,' + - 'height=600,' + - 'scrollbars=yes,' + - 'resizable=yes,' + - 'status=yes'; - - /* - String: windowTemplate - - The HTML template and CSS style information used to populate the - debugging window upon creation. - */ - if ('undefined' == typeof xajax.debug.windowTemplate) - xajax.debug.windowTemplate = - '' + - '' + - 'xajax debug output' + - '' + - '' + - '

    xajax debug output

    ' + - '
    ' + - ''; - - /* - Object: window - - A reference to the debugging window, once constructed, where messages will - be displayed throughout the request process. This is constructed internally - as needed. - */ - - /* - Array: xajax.debug.text - */ - xajax.debug.text = []; - xajax.debug.text[100] = 'WARNING: '; - xajax.debug.text[101] = 'ERROR: '; - xajax.debug.text[102] = 'XAJAX DEBUG MESSAGE:\n'; - xajax.debug.text[103] = '...\n[LONG RESPONSE]\n...'; - xajax.debug.text[104] = 'SENDING REQUEST'; - xajax.debug.text[105] = 'SENT ['; - xajax.debug.text[106] = ' bytes]'; - xajax.debug.text[107] = 'CALLING: '; - xajax.debug.text[108] = 'URI: '; - xajax.debug.text[109] = 'INITIALIZING REQUEST'; - xajax.debug.text[110] = 'PROCESSING PARAMETERS ['; - xajax.debug.text[111] = ']'; - xajax.debug.text[112] = 'NO PARAMETERS TO PROCESS'; - xajax.debug.text[113] = 'PREPARING REQUEST'; - xajax.debug.text[114] = 'STARTING XAJAX CALL (deprecated: use xajax.request instead)'; - xajax.debug.text[115] = 'STARTING XAJAX REQUEST'; - xajax.debug.text[116] = 'No response processor is available to process the response from the server.\n'; - xajax.debug.text[117] = '.\nCheck for error messages from the server.'; - xajax.debug.text[118] = 'RECEIVED [status: '; - xajax.debug.text[119] = ', size: '; - xajax.debug.text[120] = ' bytes, time: '; - xajax.debug.text[121] = 'ms]:\n'; - xajax.debug.text[122] = 'The server returned the following HTTP status: '; - xajax.debug.text[123] = '\nRECEIVED:\n'; - xajax.debug.text[124] = 'The server returned a redirect to:
    '; - xajax.debug.text[125] = 'DONE ['; - xajax.debug.text[126] = 'ms]'; - xajax.debug.text[127] = 'INITIALIZING REQUEST OBJECT'; - - /* - Array: xajax.debug.exceptions - */ - xajax.debug.exceptions = []; - xajax.debug.exceptions[10001] = 'Invalid response XML: The response contains an unknown tag: {data}.'; - xajax.debug.exceptions[10002] = 'GetRequestObject: XMLHttpRequest is not available, xajax is disabled.'; - xajax.debug.exceptions[10003] = 'Queue overflow: Cannot push object onto queue because it is full.'; - xajax.debug.exceptions[10004] = 'Invalid response XML: The response contains an unexpected tag or text: {data}.'; - xajax.debug.exceptions[10005] = 'Invalid request URI: Invalid or missing URI; autodetection failed; please specify a one explicitly.'; - xajax.debug.exceptions[10006] = 'Invalid response command: Malformed response command received.'; - xajax.debug.exceptions[10007] = 'Invalid response command: Command [{data}] is not a known command.'; - xajax.debug.exceptions[10008] = 'Element with ID [{data}] not found in the document.'; - xajax.debug.exceptions[10009] = 'Invalid request: Missing function name parameter.'; - xajax.debug.exceptions[10010] = 'Invalid request: Missing function object parameter.'; - - /* - Function: xajax.debug.getExceptionText - - Parameters: - e - (object): Exception - */ - xajax.debug.getExceptionText = function(e) { - if ('undefined' != typeof e.code) { - if ('undefined' != typeof xajax.debug.exceptions[e.code]) { - var msg = xajax.debug.exceptions[e.code]; - if ('undefined' != typeof e.data) { - msg.replace('{data}', e.data); - } - return msg; - } - } else if ('undefined' != typeof e.name) { - var msg = e.name; - if ('undefined' != typeof e.message) { - msg += ': '; - msg += e.message; - } - return msg; - } - return 'An unknown error has occurred.'; - } - - /* - Function: xajax.debug.writeMessage - - Output a debug message to the debug window if available or send to an - alert box. If the debug window has not been created, attempt to - create it. - - Parameters: - - text - (string): The text to output. - - prefix - (string): The prefix to use; this is prepended onto the - message; it should indicate the type of message (warning, error) - - cls - (stirng): The className that will be applied to the message; - invoking a style from the CSS provided in - . Should be one of the following: - - warningText - - errorText - */ - xajax.debug.writeMessage = function(text, prefix, cls) { - try { - var xd = xajax.debug; - if ('undefined' == typeof xd.window || true == xd.window.closed) { - xd.window = window.open(xd.windowSource, xd.windowID, xd.windowStyle); - if ("about:blank" == xd.windowSource) - xd.window.document.write(xd.windowTemplate); - } - var xdw = xd.window; - var xdwd = xdw.document; - if ('undefined' == typeof prefix) - prefix = ''; - if ('undefined' == typeof cls) - cls = 'debugText'; - - text = xajax.debug.prepareDebugText(text); - - var debugTag = xdwd.getElementById('debugTag'); - var debugEntry = xdwd.createElement('div'); - var debugDate = xdwd.createElement('span'); - var debugText = xdwd.createElement('pre'); - - debugDate.innerHTML = new Date().toString(); - debugText.innerHTML = prefix + text; - - debugEntry.appendChild(debugDate); - debugEntry.appendChild(debugText); - debugTag.insertBefore(debugEntry, debugTag.firstChild); - // don't allow 'style' issues to hinder the debug output - try { - debugEntry.className = 'debugEntry'; - debugDate.className = 'debugDate'; - debugText.className = cls; - } catch (e) { - } - } catch (e) { - if (text.length > 1000) text = text.substr(0,1000) + xajax.debug.text[102]; - alert(xajax.debug.text[102] + text); - } - } - - /* - Function: xajax.debug.prepareDebugText - - Convert special characters to their HTML equivellents so they - will show up in the . - - Parameters: - text - (string): Debug text - */ - xajax.debug.prepareDebugText = function(text) { - try { - text = text.replace(/&/g, '&') - .replace(//g, '>') - .replace(/\n/g, '
    '); - return text; - } catch (e) { - xajax.debug.stringReplace = function(haystack, needle, newNeedle) { - var segments = haystack.split(needle); - haystack = ''; - for (var i = 0; i < segments.length; ++i) { - if (0 != i) - haystack += newNeedle; - haystack += segments[i]; - } - return haystack; - } - xajax.debug.prepareDebugText = function(text) { - text = xajax.debug.stringReplace(text, '&', '&'); - text = xajax.debug.stringReplace(text, '<', '<'); - text = xajax.debug.stringReplace(text, '>', '>'); - text = xajax.debug.stringReplace(text, '\n', '
    '); - return text; - } - xajax.debug.prepareDebugText(text); - } - } - - /* - Function: xajax.debug.executeCommand - - Catch any exceptions that are thrown by a response command handler - and display a message in the debugger. - - This is a wrapper function which surrounds the standard - function. - */ - xajax.debug.executeCommand = xajax.executeCommand; - xajax.executeCommand = function(args) { - try { - if ('undefined' == typeof args.cmd) - throw { code: 10006 }; - if (false == xajax.command.handler.isRegistered(args)) - throw { code: 10007, data: args.cmd }; - return xajax.debug.executeCommand(args); - } catch(e) { - var msg = 'ExecuteCommand ('; - if ('undefined' != typeof args.sequence) { - msg += '#'; - msg += args.sequence; - msg += ', '; - } - if ('undefined' != typeof args.cmdFullName) { - msg += '"'; - msg += args.cmdFullName; - msg += '"'; - } - msg += '):\n'; - msg += xajax.debug.getExceptionText(e); - msg += '\n'; - xajax.debug.writeMessage(msg, xajax.debug.text[101], 'errorText'); - } - return true; - } - - /* - Function: xajax.parseAttributes - - Catch any exception thrown during the parsing of response - command attributes and display an appropriate debug message. - - This is a wrapper around the standard - function. - - Parameters: - child - (object): Childnode - obj - (object): Object - - */ - xajax.debug.parseAttributes = xajax.parseAttributes; - xajax.parseAttributes = function(child, obj) { - try { - xajax.debug.parseAttributes(child, obj); - } catch(e) { - var msg = 'ParseAttributes:\n'; - msg += xajax.debug.getExceptionText(e); - msg += '\n'; - xajax.debug.writeMessage(msg, xajax.debug.text[101], 'errorText'); - } - } - - xajax.debug.commandHandler = xajax.command.handler.unregister('dbg'); - xajax.command.handler.register('dbg', function(args) { - args.cmdFullName = 'debug message'; - xajax.debug.writeMessage(args.data, xajax.debug.text[100], 'warningText'); - return xajax.debug.commandHandler(args); - }); - - - /* - Function: xajax.tools.$ - - Catch any exceptions thrown while attempting to locate an - HTML element by it's unique name. - - This is a wrapper around the standard function. - - Parameters: - sId - (string): Element ID or name - - */ - xajax.debug.$ = xajax.tools.$; - xajax.tools.$ = function(sId) { - try { - var returnValue = xajax.debug.$(sId); - if ('object' != typeof returnValue) - throw { code: 10008 }; - } - catch (e) { - var msg = '$:'; - msg += xajax.debug.getExceptionText(e); - msg += '\n'; - xajax.debug.writeMessage(msg, xajax.debug.text[100], 'warningText'); - } - return returnValue; - } - - /* - Function: xajax.tools._objectToXML - - Generate a message indicating that a javascript object is - being converted to xml. Indicate the max depth and size. Then - display the size of the object upon completion. Catch any - exceptions thrown during the conversion process. - - This is a wrapper around the standard - function. - - Parameters: - obj - (object): - guard - (object): - - */ - xajax.debug._objectToXML = xajax.tools._objectToXML; - xajax.tools._objectToXML = function(obj, guard) { - try { - if (0 == guard.size) { - var msg = 'OBJECT TO XML: maxDepth = '; - msg += guard.maxDepth; - msg += ', maxSize = '; - msg += guard.maxSize; - xajax.debug.writeMessage(msg); - } - var r = xajax.debug._objectToXML(obj, guard); - if (0 == guard.depth) { - var msg = 'OBJECT TO XML: size = '; - msg += guard.size; - xajax.debug.writeMessage(msg); - } - return r; - } catch(e) { - var msg = 'ObjectToXML: '; - msg += xajax.debug.getExceptionText(e); - msg += '\n'; - xajax.debug.writeMessage(msg, xajax.debug.text[101], 'errorText'); - } - return ''; - } - - /* - Function: xajax._internalSend - - Generate a message indicating that the xajax request is - about the be sent to the server. - - This is a wrapper around the standard - function. - */ - xajax.debug._internalSend = xajax._internalSend; - xajax._internalSend = function(oRequest) { - try { - xajax.debug.writeMessage(xajax.debug.text[104]); - xajax.debug.writeMessage( - xajax.debug.text[105] + - oRequest.requestData.length + - xajax.debug.text[106] - ); - oRequest.beginDate = new Date(); - xajax.debug._internalSend(oRequest); - } catch (e) { - var msg = 'InternalSend: '; - msg += xajax.debug.getExceptionText(e); - msg += '\n'; - xajax.debug.writeMessage(msg, xajax.debug.text[101], 'errorText'); - throw e; - } - } - - /* - Function: xajax.submitRequest - - Generate a message indicating that a request is ready to be - submitted; providing the URL and the function being invoked. - - Catch any exceptions thrown and display a message. - - This is a wrapper around the standard - function. - */ - xajax.debug.submitRequest = xajax.submitRequest; - xajax.submitRequest = function(oRequest) { - var msg = oRequest.method; - msg += ': '; - text = decodeURIComponent(oRequest.requestData); - text = text.replace(new RegExp('&xjx', 'g'), '\n&xjx'); - text = text.replace(new RegExp('', 'g'), '\n'); - text = text.replace(new RegExp('', 'g'), '\n'); - text = text.replace(new RegExp('', 'g'), '\n\n'); - msg += text; - xajax.debug.writeMessage(msg); - msg = xajax.debug.text[107]; - var separator = '\n'; - for (var mbr in oRequest.functionName) { - msg += separator; - msg += mbr; - msg += ': '; - msg += oRequest.functionName[mbr]; - separator = '\n'; - } - msg += separator; - msg += xajax.debug.text[108]; - msg += separator; - msg += oRequest.URI; - xajax.debug.writeMessage(msg); - - try { - return xajax.debug.submitRequest(oRequest); - } catch (e) { - xajax.debug.writeMessage(e.message); - if (0 < oRequest.retry) - throw e; - } - } - - /* - Function: xajax.initializeRequest - - Generate a message indicating that the request object is - being initialized. - - This is a wrapper around the standard - function. - */ - xajax.debug.initializeRequest = xajax.initializeRequest; - xajax.initializeRequest = function(oRequest) { - try { - var msg = xajax.debug.text[109]; - xajax.debug.writeMessage(msg); - return xajax.debug.initializeRequest(oRequest); - } catch (e) { - var msg = 'InitializeRequest: '; - msg += xajax.debug.getExceptionText(e); - msg += '\n'; - xajax.debug.writeMessage(msg, xajax.debug.text[101], 'errorText'); - throw e; - } - } - - /* - Function: xajax.processParameters - - Generate a message indicating that the request object is - being populated with the parameters provided. - - This is a wrapper around the standard - function. - */ - xajax.debug.processParameters = xajax.processParameters; - xajax.processParameters = function(oRequest) { - try { - if ('undefined' != typeof oRequest.parameters) { - var msg = xajax.debug.text[110]; - msg += oRequest.parameters.length; - msg += xajax.debug.text[111]; - xajax.debug.writeMessage(msg); - } else { - var msg = xajax.debug.text[112]; - xajax.debug.writeMessage(msg); - } - return xajax.debug.processParameters(oRequest); - } catch (e) { - var msg = 'ProcessParameters: '; - msg += xajax.debug.getExceptionText(e); - msg += '\n'; - xajax.debug.writeMessage(msg, xajax.debug.text[101], 'errorText'); - throw e; - } - } - - /* - Function: xajax.prepareRequest - - Generate a message indicating that the request is being - prepared. This may occur more than once for a request - if it errors and a retry is attempted. - - This is a wrapper around the standard - */ - xajax.debug.prepareRequest = xajax.prepareRequest; - xajax.prepareRequest = function(oRequest) { - try { - var msg = xajax.debug.text[113]; - xajax.debug.writeMessage(msg); - return xajax.debug.prepareRequest(oRequest); - } catch (e) { - var msg = 'PrepareRequest: '; - msg += xajax.debug.getExceptionText(e); - msg += '\n'; - xajax.debug.writeMessage(msg, xajax.debug.text[101], 'errorText'); - throw e; - } - } - - /* - Function: xajax.call - - Validates that a function name was provided, generates a message - indicating that a xajax call is starting and sets a flag in the - request object indicating that debugging is enabled for this call. - - This is a wrapper around the standard function. - */ - xajax.debug.call = xajax.call; - xajax.call = function() { - try { - xajax.debug.writeMessage(xajax.debug.text[114]); - - var numArgs = arguments.length; - - if (0 == numArgs) - throw { code: 10009 }; - - var functionName = arguments[0]; - var oOptions = {} - if (1 < numArgs) - oOptions = arguments[1]; - - oOptions.debugging = true; - - return xajax.debug.call(functionName, oOptions); - } catch (e) { - var msg = 'Call: '; - msg += xajax.debug.getExceptionText(e); - msg += '\n'; - xajax.debug.writeMessage(msg, xajax.debug.text[101], 'errorText'); - throw e; - } - } - - /* - Function: xajax.request - - Validates that a function name was provided, generates a message - indicating that a xajax request is starting and sets a flag in the - request object indicating that debugging is enabled for this request. - - This is a wrapper around the standard function. - */ - xajax.debug.request = xajax.request; - xajax.request = function() { - try { - xajax.debug.writeMessage(xajax.debug.text[115]); - - var numArgs = arguments.length; - - if (0 == numArgs) - throw { code: 10010 }; - - var oFunction = arguments[0]; - var oOptions = {} - if (1 < numArgs) - oOptions = arguments[1]; - - oOptions.debugging = true; - - return xajax.debug.request(oFunction, oOptions); - } catch (e) { - var msg = 'Request: '; - msg += xajax.debug.getExceptionText(e); - msg += '\n'; - xajax.debug.writeMessage(msg, xajax.debug.text[101], 'errorText'); - throw e; - } - } - - /* - Function: xajax.getResponseProcessor - - Generate an error message when no reponse processor is available - to process the type of response returned from the server. - - This is a wrapper around the standard - function. - */ - xajax.debug.getResponseProcessor = xajax.getResponseProcessor; - xajax.getResponseProcessor = function(oRequest) { - try { - var fProc = xajax.debug.getResponseProcessor(oRequest); - - if ('undefined' == typeof fProc) { - var msg = xajax.debug.text[116]; - try { - var contentType = oRequest.request.getResponseHeader('content-type'); - msg += "Content-Type: "; - msg += contentType; - if ('text/html' == contentType) { - msg += xajax.debug.text[117]; - } - } catch (e) { - } - xajax.debug.writeMessage(msg, xajax.debug.text[101], 'errorText'); - } - - return fProc; - } catch (e) { - var msg = 'GetResponseProcessor: '; - msg += xajax.debug.getExceptionText(e); - msg += '\n'; - xajax.debug.writeMessage(msg, xajax.debug.text[101], 'errorText'); - throw e; - } - } - - /* - Function: xajax.responseReceived - - Generate a message indicating that a response has been received - from the server; provide some statistical data regarding the - response and the response time. - - Catch any exceptions that are thrown during the processing of - the response and generate a message. - - This is a wrapper around the standard - function. - */ - xajax.debug.responseReceived = xajax.responseReceived; - xajax.responseReceived = function(oRequest) { - var xx = xajax; - var xt = xx.tools; - var xd = xx.debug; - - var oRet; - - try { - var status = oRequest.request.status; - if (xt.arrayContainsValue(xx.responseSuccessCodes, status)) { - var packet = oRequest.request.responseText; - packet = packet.replace(new RegExp('', 'g'), '\n'); - packet = packet.replace(new RegExp('', 'g'), '\n'); - packet = packet.replace(new RegExp('', 'g'), '\n'); - packet = packet.replace(new RegExp('', 'g'), '\n\n'); - packet = packet.replace(new RegExp('', 'g'), '\n'); - oRequest.midDate = new Date(); - var msg = xajax.debug.text[118]; - msg += oRequest.request.status; - msg += xajax.debug.text[119]; - msg += packet.length; - msg += xajax.debug.text[120]; - msg += (oRequest.midDate - oRequest.beginDate); - msg += xajax.debug.text[121]; - msg += packet; - xd.writeMessage(msg); - } else if (xt.arrayContainsValue(xx.responseErrorsForAlert, status)) { - var msg = xajax.debug.text[122]; - msg += status; - msg += xajax.debug.text[123]; - msg += oRequest.request.responseText; - xd.writeMessage(msg, xajax.debug.text[101], 'errorText'); - } else if (xt.arrayContainsValue(xx.responseRedirectCodes, status)) { - var msg = xajax.debug.text[124]; - msg += oRequest.request.getResponseHeader('location'); - xd.writeMessage(msg); - } - oRet = xd.responseReceived(oRequest); - } catch (e) { - var msg = 'ResponseReceived: '; - msg += xajax.debug.getExceptionText(e); - msg += '\n'; - xd.writeMessage(msg, xajax.debug.text[101], 'errorText'); - } - - return oRet; - } - - /* - Function: xajax.completeResponse - - Generate a message indicating that the request has completed - and provide some statistics regarding the request and response. - - This is a wrapper around the standard - function. - */ - xajax.debug.completeResponse = xajax.completeResponse; - xajax.completeResponse = function(oRequest) { - try { - var returnValue = xajax.debug.completeResponse(oRequest); - oRequest.endDate = new Date(); - var msg = xajax.debug.text[125]; - msg += (oRequest.endDate - oRequest.beginDate); - msg += xajax.debug.text[126]; - xajax.debug.writeMessage(msg); - return returnValue; - } catch (e) { - var msg = 'CompleteResponse: '; - msg += xajax.debug.getExceptionText(e); - msg += '\n'; - xajax.debug.writeMessage(msg, xajax.debug.text[101], 'errorText'); - throw e; - } - } - - /* - Function: xajax.tools.getRequestObject - - Generate a message indicating that the request object is - being initialized. - - Catch any exceptions that are thrown during the process or - initializing a new request object. - - This is a wrapper around the standard - function. - */ - xajax.debug.getRequestObject = xajax.tools.getRequestObject; - xajax.tools.getRequestObject = function() { - try { - xajax.debug.writeMessage(xajax.debug.text[127]); - return xajax.debug.getRequestObject(); - } catch (e) { - var msg = 'GetRequestObject: '; - msg += xajax.debug.getExceptionText(e); - msg += '\n'; - xajax.debug.writeMessage(msg, xajax.debug.text[101], 'errorText'); - throw e; - } - } - - /* - Function: xajax.dom.assign - - Catch any exceptions thrown during the assignment and - display an error message. - - This is a wrapper around the standard - function. - */ - if (xajax.dom.assign) { - xajax.debug.assign = xajax.dom.assign; - xajax.dom.assign = function(element, property, data) { - try { - return xajax.debug.assign(element, property, data); - } catch (e) { - var msg = 'xajax.dom.assign: '; - msg += xajax.debug.getExceptionText(e); - msg += '\n'; - msg += 'Eval: element.'; - msg += property; - msg += ' = data;\n'; - xajax.debug.writeMessage(msg, xajax.debug.text[101], 'errorText'); - } - return true; - } - } - - /* - Function: xajax.tools.queue.retry - */ - if (xajax.tools) { - if (xajax.tools.queue) { - if (xajax.tools.queue.retry) { - if ('undefined' == typeof xajax.debug.tools) - xajax.debug.tools = {}; - if ('undefined' == typeof xajax.debug.tools.queue) - xajax.debug.tools.queue = {}; - xajax.debug.tools.queue.retry = xajax.tools.queue.retry; - xajax.tools.queue.retry = function(obj, count) { - if (xajax.debug.tools.queue.retry(obj, count)) - return true; - // no 'exceeded' message for sleep command - if (obj.cmd && 's' == obj.cmd) - return false; - xajax.debug.writeMessage('Retry count exceeded.'); - return false; - } - } - } - } - - /* - Boolean: xajax.debug.isLoaded - - true - indicates that the debugging module is loaded - */ - xajax.debug.isLoaded = true; - - /* - Section: Redefine shortcuts. - - Must redefine these shortcuts so they point to the new debug (wrapper) versions: - - - - - - - - Must redefine these shortcuts as well: - - - - - */ - xjx = {} - - xjx.$ = xajax.tools.$; - xjx.getFormValues = xajax.tools.getFormValues; - xjx.call = xajax.call; - xjx.request = xajax.request; - - xajax.$ = xajax.tools.$; - xajax.getFormValues = xajax.tools.getFormValues; -} catch (e) { - alert(e.name + ': ' + e.message); -} diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_lang_bg.js b/phpgwapi/inc/xajax/xajax_js/xajax_lang_bg.js deleted file mode 100644 index abb957c252..0000000000 --- a/phpgwapi/inc/xajax/xajax_js/xajax_lang_bg.js +++ /dev/null @@ -1,10 +0,0 @@ - -if('undefined'!=typeof xajax.debug){xajax.debug.text=[];xajax.debug.text[100]='ПРЕДУПРЕЖДЕНИЕ: ';xajax.debug.text[101]='ГРЕШКА: ';xajax.debug.text[102]='XAJAX ДЕБЪГ СЪОБЩЕНИЕ:\n';xajax.debug.text[103]='...\n[ДЪЛЪГ ОТГОВОР]\n...';xajax.debug.text[104]='ИЗПРАЩАНЕ НА ЗАЯВКИ';xajax.debug.text[105]='ИЗПРАТЕНИ [';xajax.debug.text[106]=' байта]';xajax.debug.text[107]='ИЗВИКВАНЕ: ';xajax.debug.text[108]='Адрес: ';xajax.debug.text[109]='ИНИЦИАЛИЗИРАНЕ НА ЗАЯВКАТА';xajax.debug.text[110]='ОБРАБОТВАНЕ НА ПАРАМЕТРИТЕ [';xajax.debug.text[111]=']';xajax.debug.text[112]='НЯМА ПАРАМЕТРИ ЗА ОБРАБОТВАНЕ';xajax.debug.text[113]='ПОДГОТВЯВАНЕ НА ЗАЯВКАТА';xajax.debug.text[114]='СТАРТИРАНЕ НА XAJAX ПОВИКВАНЕТО (остаряло: вместо това използвай xajax.request)';xajax.debug.text[115]='СТАРТИРАНЕ НА XAJAX ЗАЯВКАТА';xajax.debug.text[116]='Няма регистрирани функции, които да обработят заявката ви на сървъра!\n';xajax.debug.text[117]='.\nПровери за съобщения за грешки на сървъра.';xajax.debug.text[118]='ПОЛУЧЕНИ [статус: ';xajax.debug.text[119]=', размер: ';xajax.debug.text[120]=' байта, време: ';xajax.debug.text[121]='мсек]:\n';xajax.debug.text[122]='Сървъра върна следния HTTP статус: ';xajax.debug.text[123]='\nПОЛУЧЕНИ:\n';xajax.debug.text[124]='Сървъра върна пренасочване към:
    ';xajax.debug.text[125]='ГОТОВО [';xajax.debug.text[126]='мсек]';xajax.debug.text[127]='ИНИЦИАЛИЗИРАНЕ НА ОБЕКТА НА ЗАЯВКАТА';xajax.debug.exceptions=[];xajax.debug.exceptions[10001]='Невалиден XML отговор: Отговора съдържа непознат таг: {data}.';xajax.debug.exceptions[10002]='GetRequestObject: Няма XMLHttpRequest, xajax е изключен.';xajax.debug.exceptions[10003]='Препълване на опашката: Обекта не може да бъде сложен на опашката, защото тя е пълна.';xajax.debug.exceptions[10004]='Невалиден XML отговор: Отговора съдържа неочакван таг или текст: {data}.';xajax.debug.exceptions[10005]='Невалиден адрес: Невалиден или липсващ адрес; автоматичното откриване неуспешнп; please specify a one explicitly.';xajax.debug.exceptions[10006]='Невалидна команда в отговора: Получена беше невалидна команда като отговор.';xajax.debug.exceptions[10007]='Невалидна команда в отговора: Командата [{data}] е непозната.';xajax.debug.exceptions[10008]='Елемент с ID [{data}] не беше намерен в документа.';xajax.debug.exceptions[10009]='Невалидна заявка: Параметъра с името на функцията липсва.';xajax.debug.exceptions[10010]='Невалидна заявка: Липсва обекта на функцията.';} -if('undefined'!=typeof xajax.config){if('undefined'!=typeof xajax.config.status){xajax.config.status.update=function(){return{onRequest:function(){window.status='Изпращане на заявка...';}, -onWaiting:function(){window.status='Изчакване на отговор...';}, -onProcessing:function(){window.status='Изпълнение...';}, -onComplete:function(){window.status='Готово.';} -} -} -} -} diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_lang_bg_uncompressed.js b/phpgwapi/inc/xajax/xajax_js/xajax_lang_bg_uncompressed.js deleted file mode 100644 index 9adefd34ed..0000000000 --- a/phpgwapi/inc/xajax/xajax_js/xajax_lang_bg_uncompressed.js +++ /dev/null @@ -1,81 +0,0 @@ -/** - * translation for: xajax v.x.x - * @version: 1.0.0 - * @author: mic - * @copyright xajax project - * @license GNU/GPL - * @package xajax x.x.x - * @since v.x.x.x - * save as UTF-8 - */ - -if ('undefined' != typeof xajax.debug) { - /* - Array: text - */ - xajax.debug.text = []; - xajax.debug.text[100] = 'ПРЕДУПРЕЖДЕНИЕ: '; - xajax.debug.text[101] = 'ГРЕШКА: '; - xajax.debug.text[102] = 'XAJAX ДЕБЪГ СЪОБЩЕНИЕ:\n'; - xajax.debug.text[103] = '...\n[ДЪЛЪГ ОТГОВОР]\n...'; - xajax.debug.text[104] = 'ИЗПРАЩАНЕ НА ЗАЯВКИ'; - xajax.debug.text[105] = 'ИЗПРАТЕНИ ['; - xajax.debug.text[106] = ' байта]'; - xajax.debug.text[107] = 'ИЗВИКВАНЕ: '; - xajax.debug.text[108] = 'Адрес: '; - xajax.debug.text[109] = 'ИНИЦИАЛИЗИРАНЕ НА ЗАЯВКАТА'; - xajax.debug.text[110] = 'ОБРАБОТВАНЕ НА ПАРАМЕТРИТЕ ['; - xajax.debug.text[111] = ']'; - xajax.debug.text[112] = 'НЯМА ПАРАМЕТРИ ЗА ОБРАБОТВАНЕ'; - xajax.debug.text[113] = 'ПОДГОТВЯВАНЕ НА ЗАЯВКАТА'; - xajax.debug.text[114] = 'СТАРТИРАНЕ НА XAJAX ПОВИКВАНЕТО (остаряло: вместо това използвай xajax.request)'; - xajax.debug.text[115] = 'СТАРТИРАНЕ НА XAJAX ЗАЯВКАТА'; - xajax.debug.text[116] = 'Няма регистрирани функции, които да обработят заявката ви на сървъра!\n'; - xajax.debug.text[117] = '.\nПровери за съобщения за грешки на сървъра.'; - xajax.debug.text[118] = 'ПОЛУЧЕНИ [статус: '; - xajax.debug.text[119] = ', размер: '; - xajax.debug.text[120] = ' байта, време: '; - xajax.debug.text[121] = 'мсек]:\n'; - xajax.debug.text[122] = 'Сървъра върна следния HTTP статус: '; - xajax.debug.text[123] = '\nПОЛУЧЕНИ:\n'; - xajax.debug.text[124] = 'Сървъра върна пренасочване към:
    '; - xajax.debug.text[125] = 'ГОТОВО ['; - xajax.debug.text[126] = 'мсек]'; - xajax.debug.text[127] = 'ИНИЦИАЛИЗИРАНЕ НА ОБЕКТА НА ЗАЯВКАТА'; - - xajax.debug.exceptions = []; - xajax.debug.exceptions[10001] = 'Невалиден XML отговор: Отговора съдържа непознат таг: {data}.'; - xajax.debug.exceptions[10002] = 'GetRequestObject: Няма XMLHttpRequest, xajax е изключен.'; - xajax.debug.exceptions[10003] = 'Препълване на опашката: Обекта не може да бъде сложен на опашката, защото тя е пълна.'; - xajax.debug.exceptions[10004] = 'Невалиден XML отговор: Отговора съдържа неочакван таг или текст: {data}.'; - xajax.debug.exceptions[10005] = 'Невалиден адрес: Невалиден или липсващ адрес; автоматичното откриване неуспешнп; please specify a one explicitly.'; - xajax.debug.exceptions[10006] = 'Невалидна команда в отговора: Получена беше невалидна команда като отговор.'; - xajax.debug.exceptions[10007] = 'Невалидна команда в отговора: Командата [{data}] е непозната.'; - xajax.debug.exceptions[10008] = 'Елемент с ID [{data}] не беше намерен в документа.'; - xajax.debug.exceptions[10009] = 'Невалидна заявка: Параметъра с името на функцията липсва.'; - xajax.debug.exceptions[10010] = 'Невалидна заявка: Липсва обекта на функцията.'; -} - -if ('undefined' != typeof xajax.config) { - if ('undefined' != typeof xajax.config.status) { - /* - Object: update - */ - xajax.config.status.update = function() { - return { - onRequest: function() { - window.status = 'Изпращане на заявка...'; - }, - onWaiting: function() { - window.status = 'Изчакване на отговор...'; - }, - onProcessing: function() { - window.status = 'Изпълнение...'; - }, - onComplete: function() { - window.status = 'Готово.'; - } - } - } - } -} \ No newline at end of file diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_lang_de.js b/phpgwapi/inc/xajax/xajax_js/xajax_lang_de.js deleted file mode 100644 index c2253269a4..0000000000 --- a/phpgwapi/inc/xajax/xajax_js/xajax_lang_de.js +++ /dev/null @@ -1,9 +0,0 @@ -if('undefined'!=typeof xajax.debug){xajax.debug.text=[];xajax.debug.text[100]='WARNUNG: ';xajax.debug.text[101]='FEHLER: ';xajax.debug.text[102]='XAJAX FEHLERSUCHE NACHRICHT:\n';xajax.debug.text[103]='...\n[UMGFANGREICHE ANTWORT]\n...';xajax.debug.text[104]='SENDE ANFRAGE';xajax.debug.text[105]='GESENDET [';xajax.debug.text[106]=' bytes]';xajax.debug.text[107]='STARTE AUFRUF: ';xajax.debug.text[108]='URI: ';xajax.debug.text[109]='BEGINNE ANFRAGE';xajax.debug.text[110]='PARAMETER IN BEARBEITUNG [';xajax.debug.text[111]=']';xajax.debug.text[112]='KEINE PARAMETER ZU VERARBEITEN';xajax.debug.text[113]='BEREITE REQUEST VOR';xajax.debug.text[114]='BEGINNE XAJAX CALL (veraltet: verwendet stattdessen xajax.request)';xajax.debug.text[115]='BEGINNE XAJAX ANFRAGE';xajax.debug.text[116]='Die vom Server erhaltenen Daten konnten nicht verarbeitet werden.\n';xajax.debug.text[117]='.\nPrüfe auf Fehlermeldungen des Servers.';xajax.debug.text[118]='ERHALTEN [status: ';xajax.debug.text[119]=', Größe: ';xajax.debug.text[120]=' bytes, Zeit: ';xajax.debug.text[121]='ms]:\n';xajax.debug.text[122]='Der Server hat folgenden HTTP-Status zurück gesendet: ';xajax.debug.text[123]='\nERHALTEN:\n';xajax.debug.text[124]='Der Server lieferte einen Redirect nach:
    ';xajax.debug.text[125]='ABGESCHLOSSEN [';xajax.debug.text[126]='ms]';xajax.debug.text[127]='INITIALISIERE REQUEST OBJEKT';xajax.debug.exceptions=[];xajax.debug.exceptions[10001]='Ungültige XML-Antwort: die Antwort enthält ein ungültiges Tag: {data}.';xajax.debug.exceptions[10002]='GetRequestObject: XMLHttpRequest ist nicht verfügbar, XajaX ist nicht verfügbar.';xajax.debug.exceptions[10003]='Warteschleife-Überlauf: kann Objekt nicht an Warteschleife übergeben da diese voll ist.';xajax.debug.exceptions[10004]='Ungültige XML-Antwort: die Antwort enthält einen unerwarteten Tag oder Text: {data}.';xajax.debug.exceptions[10005]='Ungültige Request-URI: Ungültige oder Fehlende URI; Autoerkennung fehlgeschlagen; bitte nur eine einzige URI angeben.';xajax.debug.exceptions[10006]='Ungültiges Antwort-Befehl: Unvollständiges Objekt zurück erhalten.';xajax.debug.exceptions[10007]='Ungültiges Antwort-Befehl: Befehl [{data}] ist nicht bekannt.';xajax.debug.exceptions[10008]='Es konnte kein Element mit der ID [{data}] konnte im Dokument gefunden werden.';xajax.debug.exceptions[10009]='Ungültige Anfrage: Fehlender Funktionsparameter - name.';xajax.debug.exceptions[10010]='Ungültige Anfrage: Fehlender Funktionsparameter - object.';} -if('undefined'!=typeof xajax.config){if('undefined'!=typeof xajax.config.status){xajax.config.status.update=function(){return{onRequest:function(){window.status='Sende Anfrage...';}, -onWaiting:function(){window.status='Warten auf Antwort...';}, -onProcessing:function(){window.status='Verarbeitung...';}, -onComplete:function(){window.status='Fertig.';} -} -} -} -} diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_lang_de_uncompressed.js b/phpgwapi/inc/xajax/xajax_js/xajax_lang_de_uncompressed.js deleted file mode 100644 index c396c379ef..0000000000 --- a/phpgwapi/inc/xajax/xajax_js/xajax_lang_de_uncompressed.js +++ /dev/null @@ -1,84 +0,0 @@ -/** - * translation for: xajax v.x.x - * @version: 1.0.0 - * @author: mic - * @copyright xajax project - * @license GNU/GPL - * @package xajax x.x.x - * @since v.x.x.x - * save as UTF-8 - */ - -if ('undefined' != typeof xajax.debug) { - /* - Array: text - */ - xajax.debug.text = []; - xajax.debug.text[100] = 'WARNUNG: '; - xajax.debug.text[101] = 'FEHLER: '; - xajax.debug.text[102] = 'XAJAX FEHLERSUCHE NACHRICHT:\n'; - xajax.debug.text[103] = '...\n[UMGFANGREICHE ANTWORT]\n...'; - xajax.debug.text[104] = 'SENDE ANFRAGE'; - xajax.debug.text[105] = 'GESENDET ['; - xajax.debug.text[106] = ' bytes]'; - xajax.debug.text[107] = 'STARTE AUFRUF: '; - xajax.debug.text[108] = 'URI: '; - xajax.debug.text[109] = 'BEGINNE ANFRAGE'; - xajax.debug.text[110] = 'PARAMETER IN BEARBEITUNG ['; - xajax.debug.text[111] = ']'; - xajax.debug.text[112] = 'KEINE PARAMETER ZU VERARBEITEN'; - xajax.debug.text[113] = 'BEREITE REQUEST VOR'; - xajax.debug.text[114] = 'BEGINNE XAJAX CALL (veraltet: verwendet stattdessen xajax.request)'; - xajax.debug.text[115] = 'BEGINNE XAJAX ANFRAGE'; - xajax.debug.text[116] = 'Die vom Server erhaltenen Daten konnten nicht verarbeitet werden.\n'; - xajax.debug.text[117] = '.\nPrüfe auf Fehlermeldungen des Servers.'; - xajax.debug.text[118] = 'ERHALTEN [status: '; - xajax.debug.text[119] = ', Größe: '; - xajax.debug.text[120] = ' bytes, Zeit: '; - xajax.debug.text[121] = 'ms]:\n'; - xajax.debug.text[122] = 'Der Server hat folgenden HTTP-Status zurück gesendet: '; - xajax.debug.text[123] = '\nERHALTEN:\n'; - xajax.debug.text[124] = 'Der Server lieferte einen Redirect nach:
    '; - xajax.debug.text[125] = 'ABGESCHLOSSEN ['; - xajax.debug.text[126] = 'ms]'; - xajax.debug.text[127] = 'INITIALISIERE REQUEST OBJEKT'; - - /* - Array: exceptions - */ - xajax.debug.exceptions = []; - xajax.debug.exceptions[10001] = 'Ungültige XML-Antwort: die Antwort enthält ein ungültiges Tag: {data}.'; - xajax.debug.exceptions[10002] = 'GetRequestObject: XMLHttpRequest ist nicht verfügbar, XajaX ist nicht verfügbar.'; - xajax.debug.exceptions[10003] = 'Warteschleife-Überlauf: kann Objekt nicht an Warteschleife übergeben da diese voll ist.'; - xajax.debug.exceptions[10004] = 'Ungültige XML-Antwort: die Antwort enthält einen unerwarteten Tag oder Text: {data}.'; - xajax.debug.exceptions[10005] = 'Ungültige Request-URI: Ungültige oder Fehlende URI; Autoerkennung fehlgeschlagen; bitte nur eine einzige URI angeben.'; - xajax.debug.exceptions[10006] = 'Ungültiges Antwort-Befehl: Unvollständiges Objekt zurück erhalten.'; - xajax.debug.exceptions[10007] = 'Ungültiges Antwort-Befehl: Befehl [{data}] ist nicht bekannt.'; - xajax.debug.exceptions[10008] = 'Es konnte kein Element mit der ID [{data}] konnte im Dokument gefunden werden.'; - xajax.debug.exceptions[10009] = 'Ungültige Anfrage: Fehlender Funktionsparameter - name.'; - xajax.debug.exceptions[10010] = 'Ungültige Anfrage: Fehlender Funktionsparameter - object.'; -} - -if ('undefined' != typeof xajax.config) { - if ('undefined' != typeof xajax.config.status) { - /* - Object: update - */ - xajax.config.status.update = function() { - return { - onRequest: function() { - window.status = 'Sende Anfrage...'; - }, - onWaiting: function() { - window.status = 'Warten auf Antwort...'; - }, - onProcessing: function() { - window.status = 'Verarbeitung...'; - }, - onComplete: function() { - window.status = 'Fertig.'; - } - } - } - } -} diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_lang_es.js b/phpgwapi/inc/xajax/xajax_js/xajax_lang_es.js deleted file mode 100644 index ed1862a79a..0000000000 --- a/phpgwapi/inc/xajax/xajax_js/xajax_lang_es.js +++ /dev/null @@ -1,10 +0,0 @@ - -if('undefined'!=typeof xajax.debug){xajax.debug.text=[];xajax.debug.text[100]='ALERTA: ';xajax.debug.text[101]='ERROR: ';xajax.debug.text[102]='MENSAJE XAJAX DEBUG:\n';xajax.debug.text[103]='...\n[RESPUESTA LARGA]\n...';xajax.debug.text[104]='ENVIANDO PETICION';xajax.debug.text[105]='ENVIADO [';xajax.debug.text[106]=' bytes]';xajax.debug.text[107]='LLAMADA: ';xajax.debug.text[108]='URI: ';xajax.debug.text[109]='INICIALIZANDO PETICION';xajax.debug.text[110]='PROCESANDO PARAMETROS [';xajax.debug.text[111]=']';xajax.debug.text[112]='NO HAY PARAMETROS A PROCESAR';xajax.debug.text[113]='PREPARANDO PETICION';xajax.debug.text[114]='INICIANDO XAJAX CALL (En desuso: use xajax.request)';xajax.debug.text[115]='INICIANDO XAJAX REQUEST';xajax.debug.text[116]='Ningn procesador de respuesta esta disponible para tratar la respuesta del servidor.\n';xajax.debug.text[117]='.\nRevisa mensajes de error del servidor.';xajax.debug.text[118]='RECIBIDO [status: ';xajax.debug.text[119]=', size: ';xajax.debug.text[120]=' bytes, time: ';xajax.debug.text[121]='ms]:\n';xajax.debug.text[122]='El servidor retorno el siguiente estado HTTP: ';xajax.debug.text[123]='\nRECIBIDO:\n';xajax.debug.text[124]='El servidor retorno una redireccion a:
    ';xajax.debug.text[125]='HECHO [';xajax.debug.text[126]='ms]';xajax.debug.text[127]='INICIALIZANDO PETICION OBJETO';xajax.debug.exceptions=[];xajax.debug.exceptions[10001]='Invalid response XML: La respuesta contiene una etiqueta desconocida: {data}.';xajax.debug.exceptions[10002]='GetRequestObject: XMLHttpRequest no disponible, xajax esta deshabilitado.';xajax.debug.exceptions[10003]='Queue overflow: No se puede colocar objeto en cola porque esta llena.';xajax.debug.exceptions[10004]='Invalid response XML: La respuesta contiene una etiqueta o texto inesperado: {data}.';xajax.debug.exceptions[10005]='Invalid request URI: URI invalida o perdida; autodeteccion fallida; por favor especifica una explicitamente.';xajax.debug.exceptions[10006]='Invalid response command: Orden de respuesta mal formado recibido.';xajax.debug.exceptions[10007]='Invalid response command: Comando [{data}] no es un comando conocido.';xajax.debug.exceptions[10008]='Elemento con ID [{data}] no encontrado en el documento.';xajax.debug.exceptions[10009]='Invalid request: Nombre parametro de funcion perdido.';xajax.debug.exceptions[10010]='Invalid request: Objeto parametro de funcion perdido.';} -if('undefined'!=typeof xajax.config){if('undefined'!=typeof xajax.config.status){xajax.config.status.update=function(){return{onRequest:function(){window.status='Enviando Peticion...';}, -onWaiting:function(){window.status='Esperando Respuesta...';}, -onProcessing:function(){window.status='Procesando...';}, -onComplete:function(){window.status='Hecho.';} -} -} -} -} diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_lang_es_uncompressed.js b/phpgwapi/inc/xajax/xajax_js/xajax_lang_es_uncompressed.js deleted file mode 100644 index c35aeda753..0000000000 --- a/phpgwapi/inc/xajax/xajax_js/xajax_lang_es_uncompressed.js +++ /dev/null @@ -1,81 +0,0 @@ -/** - * translation for: xajax v.x.x - * @version: 1.0.0 - * @author: mic - * @copyright xajax project - * @license GNU/GPL - * @package xajax x.x.x - * @since v.x.x.x - * save as UTF-8 - */ - -if ('undefined' != typeof xajax.debug) { - /* - Array: text - */ - xajax.debug.text = []; - xajax.debug.text[100] = 'ALERTA: '; - xajax.debug.text[101] = 'ERROR: '; - xajax.debug.text[102] = 'MENSAJE XAJAX DEBUG:\n'; - xajax.debug.text[103] = '...\n[RESPUESTA LARGA]\n...'; - xajax.debug.text[104] = 'ENVIANDO PETICION'; - xajax.debug.text[105] = 'ENVIADO ['; - xajax.debug.text[106] = ' bytes]'; - xajax.debug.text[107] = 'LLAMADA: '; - xajax.debug.text[108] = 'URI: '; - xajax.debug.text[109] = 'INICIALIZANDO PETICION'; - xajax.debug.text[110] = 'PROCESANDO PARAMETROS ['; - xajax.debug.text[111] = ']'; - xajax.debug.text[112] = 'NO HAY PARAMETROS A PROCESAR'; - xajax.debug.text[113] = 'PREPARANDO PETICION'; - xajax.debug.text[114] = 'INICIANDO XAJAX CALL (En desuso: use xajax.request)'; - xajax.debug.text[115] = 'INICIANDO XAJAX REQUEST'; - xajax.debug.text[116] = 'Ning�n procesador de respuesta esta disponible para tratar la respuesta del servidor.\n'; - xajax.debug.text[117] = '.\nRevisa mensajes de error del servidor.'; - xajax.debug.text[118] = 'RECIBIDO [status: '; - xajax.debug.text[119] = ', size: '; - xajax.debug.text[120] = ' bytes, time: '; - xajax.debug.text[121] = 'ms]:\n'; - xajax.debug.text[122] = 'El servidor retorno el siguiente estado HTTP: '; - xajax.debug.text[123] = '\nRECIBIDO:\n'; - xajax.debug.text[124] = 'El servidor retorno una redireccion a:
    '; - xajax.debug.text[125] = 'HECHO ['; - xajax.debug.text[126] = 'ms]'; - xajax.debug.text[127] = 'INICIALIZANDO PETICION OBJETO'; - - xajax.debug.exceptions = []; - xajax.debug.exceptions[10001] = 'Invalid response XML: La respuesta contiene una etiqueta desconocida: {data}.'; - xajax.debug.exceptions[10002] = 'GetRequestObject: XMLHttpRequest no disponible, xajax esta deshabilitado.'; - xajax.debug.exceptions[10003] = 'Queue overflow: No se puede colocar objeto en cola porque esta llena.'; - xajax.debug.exceptions[10004] = 'Invalid response XML: La respuesta contiene una etiqueta o texto inesperado: {data}.'; - xajax.debug.exceptions[10005] = 'Invalid request URI: URI invalida o perdida; autodeteccion fallida; por favor especifica una explicitamente.'; - xajax.debug.exceptions[10006] = 'Invalid response command: Orden de respuesta mal formado recibido.'; - xajax.debug.exceptions[10007] = 'Invalid response command: Comando [{data}] no es un comando conocido.'; - xajax.debug.exceptions[10008] = 'Elemento con ID [{data}] no encontrado en el documento.'; - xajax.debug.exceptions[10009] = 'Invalid request: Nombre parametro de funcion perdido.'; - xajax.debug.exceptions[10010] = 'Invalid request: Objeto parametro de funcion perdido.'; -} - -if ('undefined' != typeof xajax.config) { - if ('undefined' != typeof xajax.config.status) { - /* - Object: update - */ - xajax.config.status.update = function() { - return { - onRequest: function() { - window.status = 'Enviando Peticion...'; - }, - onWaiting: function() { - window.status = 'Esperando Respuesta...'; - }, - onProcessing: function() { - window.status = 'Procesando...'; - }, - onComplete: function() { - window.status = 'Hecho.'; - } - } - } - } -} \ No newline at end of file diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_lang_fr.js b/phpgwapi/inc/xajax/xajax_js/xajax_lang_fr.js deleted file mode 100644 index a246abef97..0000000000 --- a/phpgwapi/inc/xajax/xajax_js/xajax_lang_fr.js +++ /dev/null @@ -1,8 +0,0 @@ -xajax.debug.text=[];xajax.debug.text[100]='ATTENTION : ';xajax.debug.text[101]='ERREUR : ';xajax.debug.text[102]='MESSAGE DE DEBUG XAJAX :\n';xajax.debug.text[103]='...\n[RPONSE LONGUE]\n...';xajax.debug.text[104]='ENVOI DE LA REQUTE';xajax.debug.text[105]='ENVOY [';xajax.debug.text[106]=' octets]';xajax.debug.text[107]='APPEL : ';xajax.debug.text[108]='URI : ';xajax.debug.text[109]='INITIALISATION DE LA REQUTE';xajax.debug.text[110]='TRAITEMENT DES PARAMTRES [';xajax.debug.text[111]=']';xajax.debug.text[112]='AUCUN PARAMTRE TRAITER';xajax.debug.text[113]='PRPARATION DE LA REQUTE';xajax.debug.text[114]='DBUT DE L\'APPEL XAJAX (dprci: utilisez plutt xajax.request)';xajax.debug.text[115]='DBUT DE LA REQUTE';xajax.debug.text[116]='Aucun traitement disponible pour traiter la rponse du serveur.\n';xajax.debug.text[117]='.\nVrifie s\'il existe des messages d\'erreur du serveur.';xajax.debug.text[118]='REUS [statut : ';xajax.debug.text[119]=', taille: ';xajax.debug.text[120]=' octets, temps: ';xajax.debug.text[121]='ms] :\n';xajax.debug.text[122]='Le serveur a retourn la statut HTTP suivant : ';xajax.debug.text[123]='\nREUS :\n';xajax.debug.text[124]='Le serveur a indiqu une redirection vers :
    ';xajax.debug.text[125]='FAIT [';xajax.debug.text[126]='ms]';xajax.debug.text[127]='INITIALISATION DE L\'OBJET REQUTE';xajax.debug.exceptions=[];xajax.debug.exceptions[10001]='Rponse XML non valide : La rponse contient une balise inconnue : {data}.';xajax.debug.exceptions[10002]='GetRequestObject : XMLHttpRequest n\'est pas disponible, xajax est dsactiv.';xajax.debug.exceptions[10003]='File pleine : Ne peut ajouter un objet la file car elle est pleine.';xajax.debug.exceptions[10004]='Rponse XML non valide : La rponse contient une balise ou un texte inattendu : {data}.';xajax.debug.exceptions[10005]='URI de la requte non valide : URI non valide ou manquante; auto-dtection choue; veuillez en spcifier une explicitement.';xajax.debug.exceptions[10006]='Rponse de commande invalide : Commande de rponse reue mal forme.';xajax.debug.exceptions[10007]='Rponse de commande invalide : Commande [{data}] est inconnue.';xajax.debug.exceptions[10008]='L\'lment d\'ID [{data}] est introuvable dans le document.';xajax.debug.exceptions[10009]='Requte invalide : Aucun nom de fonction indiqu en paramtre.';xajax.debug.exceptions[10010]='Requte invalide : Aucun objet indiqu en paramtre pour la fonction.';if('undefined'!=typeof xajax.config){if('undefined'!=typeof xajax.config.status){xajax.config.status.update=function(){return{onRequest:function(){window.status='Envoi de la requte...';}, -onWaiting:function(){window.status='Attente de la rponse...';}, -onProcessing:function(){window.status='En cours de traitement...';}, -onComplete:function(){window.status='Fait.';} -} -} -} -} diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_lang_fr_uncompressed.js b/phpgwapi/inc/xajax/xajax_js/xajax_lang_fr_uncompressed.js deleted file mode 100644 index a9d488bdf8..0000000000 --- a/phpgwapi/inc/xajax/xajax_js/xajax_lang_fr_uncompressed.js +++ /dev/null @@ -1,65 +0,0 @@ - xajax.debug.text = []; - xajax.debug.text[100] = 'ATTENTION : '; - xajax.debug.text[101] = 'ERREUR : '; - xajax.debug.text[102] = 'MESSAGE DE DEBUG XAJAX :\n'; - xajax.debug.text[103] = '...\n[R�PONSE LONGUE]\n...'; - xajax.debug.text[104] = 'ENVOI DE LA REQU�TE'; - xajax.debug.text[105] = 'ENVOY� ['; - xajax.debug.text[106] = ' octets]'; - xajax.debug.text[107] = 'APPEL : '; - xajax.debug.text[108] = 'URI : '; - xajax.debug.text[109] = 'INITIALISATION DE LA REQU�TE'; - xajax.debug.text[110] = 'TRAITEMENT DES PARAM�TRES ['; - xajax.debug.text[111] = ']'; - xajax.debug.text[112] = 'AUCUN PARAM�TRE � TRAITER'; - xajax.debug.text[113] = 'PR�PARATION DE LA REQU�TE'; - xajax.debug.text[114] = 'D�BUT DE L\'APPEL XAJAX (d�pr�ci�: utilisez plut�t xajax.request)'; - xajax.debug.text[115] = 'D�BUT DE LA REQU�TE'; - xajax.debug.text[116] = 'Aucun traitement disponible pour traiter la r�ponse du serveur.\n'; - xajax.debug.text[117] = '.\nV�rifie s\'il existe des messages d\'erreur du serveur.'; - xajax.debug.text[118] = 'RE�US [statut : '; - xajax.debug.text[119] = ', taille: '; - xajax.debug.text[120] = ' octets, temps: '; - xajax.debug.text[121] = 'ms] :\n'; - xajax.debug.text[122] = 'Le serveur a retourn� la statut HTTP suivant : '; - xajax.debug.text[123] = '\nRE�US :\n'; - xajax.debug.text[124] = 'Le serveur a indiqu� une redirection vers :
    '; - xajax.debug.text[125] = 'FAIT ['; - xajax.debug.text[126] = 'ms]'; - xajax.debug.text[127] = 'INITIALISATION DE L\'OBJET REQU�TE'; - - xajax.debug.exceptions = []; - xajax.debug.exceptions[10001] = 'R�ponse XML non valide : La r�ponse contient une balise inconnue : {data}.'; - xajax.debug.exceptions[10002] = 'GetRequestObject : XMLHttpRequest n\'est pas disponible, xajax est d�sactiv�.'; - xajax.debug.exceptions[10003] = 'File pleine : Ne peut ajouter un objet � la file car elle est pleine.'; - xajax.debug.exceptions[10004] = 'R�ponse XML non valide : La r�ponse contient une balise ou un texte inattendu : {data}.'; - xajax.debug.exceptions[10005] = 'URI de la requ�te non valide : URI non valide ou manquante; auto-d�tection �chou�e; veuillez en sp�cifier une explicitement.'; - xajax.debug.exceptions[10006] = 'R�ponse de commande invalide : Commande de r�ponse re�ue mal form�e.'; - xajax.debug.exceptions[10007] = 'R�ponse de commande invalide : Commande [{data}] est inconnue.'; - xajax.debug.exceptions[10008] = 'L\'�l�ment d\'ID [{data}] est introuvable dans le document.'; - xajax.debug.exceptions[10009] = 'Requ�te invalide : Aucun nom de fonction indiqu� en param�tre.'; - xajax.debug.exceptions[10010] = 'Requ�te invalide : Aucun objet indiqu� en param�tre pour la fonction.'; - - if ('undefined' != typeof xajax.config) { - if ('undefined' != typeof xajax.config.status) { - /* - Object: mise � jour - */ - xajax.config.status.update = function() { - return { - onRequest: function() { - window.status = 'Envoi de la requ�te...'; - }, - onWaiting: function() { - window.status = 'Attente de la r�ponse...'; - }, - onProcessing: function() { - window.status = 'En cours de traitement...'; - }, - onComplete: function() { - window.status = 'Fait.'; - } - } - } - } - } \ No newline at end of file diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_lang_nl.js b/phpgwapi/inc/xajax/xajax_js/xajax_lang_nl.js deleted file mode 100644 index 9b529cf1cb..0000000000 --- a/phpgwapi/inc/xajax/xajax_js/xajax_lang_nl.js +++ /dev/null @@ -1,9 +0,0 @@ -if('undefined'!=typeof xajax.debug){xajax.debug.text=[];xajax.debug.text[100]='FOUTMELDING: ';xajax.debug.text[101]='FOUT: ';xajax.debug.text[102]='XAJAX FOUTMELDINGS BERICHT:\n';xajax.debug.text[103]='...\n[LANG ANTWOORD]\n...';xajax.debug.text[104]='VERZENDING AANVRAAG';xajax.debug.text[105]='VERZONDEN [';xajax.debug.text[106]=' bytes]';xajax.debug.text[107]='AANROEPING: ';xajax.debug.text[108]='URI: ';xajax.debug.text[109]='INITIALISATIE AANVRAAG';xajax.debug.text[110]='VERWERKING PARAMETERS [';xajax.debug.text[111]=']';xajax.debug.text[112]='GEEN PARAMETERS OM TE VERWERKEN';xajax.debug.text[113]='VOORBEREIDING AANVRAAG';xajax.debug.text[114]='BEGIN XAJAX AANVRAAG (verouderd: gebruik xajax.request)';xajax.debug.text[115]='BEGIN XAJAX AANVRAAG';xajax.debug.text[116]='Er is geen verwerkingsbestand gespecificeerd om de aanvraag te verwerken.\n';xajax.debug.text[117]='.\nBekijk foutmeldingen van de server.';xajax.debug.text[118]='ONTVANGEN [status: ';xajax.debug.text[119]=', omvang: ';xajax.debug.text[120]=' bytes, Zeit: ';xajax.debug.text[121]='ms]:\n';xajax.debug.text[122]='De server retourneert de volgende HTTP-status: ';xajax.debug.text[123]='\nONTVANGEN:\n';xajax.debug.text[124]='De server retourneert een doorverwijzing naar:
    ';xajax.debug.text[125]='KLAAR [';xajax.debug.text[126]='ms]';xajax.debug.text[127]='INITIALISATIE OBJECT AANVRAAG';xajax.debug.exceptions=[];xajax.debug.exceptions[10001]='Ongeldig XML-antwoord: het antwoord bevat een onbekende tag: {data}.';xajax.debug.exceptions[10002]='GetRequestObject: XMLHttpRequest is niet beschikbaar, XajaX is uitgeschakeld.';xajax.debug.exceptions[10003]='Wachtrij limiet overschreden: kan het object niet in de wachtrij plaatsen, omdat die vol is.';xajax.debug.exceptions[10004]='Ongeldig XML-antwoord: het antwoord bevat een onverwachte tag of tekst: {data}.';xajax.debug.exceptions[10005]='Ongeldige Request-URI: Ongeldige of ontbrekende URI; automatische detectie faalt; specificeer een URI expliciet.';xajax.debug.exceptions[10006]='Ongeldig antwoord bevel: misvormd antwoord bevel ontvangen.';xajax.debug.exceptions[10007]='Ongeldig antwoord bevel: Bevel [{data}] is niet bekend.';xajax.debug.exceptions[10008]='Element met het ID [{data}] kon niet in het document worden gevonden.';xajax.debug.exceptions[10009]='Ongeldige aanvraag: Missende functie parameter - naam.';xajax.debug.exceptions[10010]='Ongeldige aanvraag: Missende functie parameter - object.';} -if('undefined'!=typeof xajax.config){if('undefined'!=typeof xajax.config.status){xajax.config.status.update=function(){return{onRequest:function(){window.status="Verzenden aanvraag...";}, -onWaiting:function(){window.status="Wachten op antwoord...";}, -onProcessing:function(){window.status="Verwerking...";}, -onComplete:function(){window.status="Afgesloten.";} -} -} -} -} diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_lang_nl_uncompressed.js b/phpgwapi/inc/xajax/xajax_js/xajax_lang_nl_uncompressed.js deleted file mode 100644 index 22fc154a4b..0000000000 --- a/phpgwapi/inc/xajax/xajax_js/xajax_lang_nl_uncompressed.js +++ /dev/null @@ -1,84 +0,0 @@ -/** - * translation for: xajax v.x.x - * @version: 1.0.0 - * @author: jeffrey - * @copyright xajax project - * @license GNU/GPL - * @package xajax x.x.x - * @since v.x.x.x - * save as UTF-8 - */ - -if ('undefined' != typeof xajax.debug) { - /* - Array: text - */ - xajax.debug.text = []; - xajax.debug.text[100] = 'FOUTMELDING: '; - xajax.debug.text[101] = 'FOUT: '; - xajax.debug.text[102] = 'XAJAX FOUTMELDINGS BERICHT:\n'; - xajax.debug.text[103] = '...\n[LANG ANTWOORD]\n...'; - xajax.debug.text[104] = 'VERZENDING AANVRAAG'; - xajax.debug.text[105] = 'VERZONDEN ['; - xajax.debug.text[106] = ' bytes]'; - xajax.debug.text[107] = 'AANROEPING: '; - xajax.debug.text[108] = 'URI: '; - xajax.debug.text[109] = 'INITIALISATIE AANVRAAG'; - xajax.debug.text[110] = 'VERWERKING PARAMETERS ['; - xajax.debug.text[111] = ']'; - xajax.debug.text[112] = 'GEEN PARAMETERS OM TE VERWERKEN'; - xajax.debug.text[113] = 'VOORBEREIDING AANVRAAG'; - xajax.debug.text[114] = 'BEGIN XAJAX AANVRAAG (verouderd: gebruik xajax.request)'; - xajax.debug.text[115] = 'BEGIN XAJAX AANVRAAG'; - xajax.debug.text[116] = 'Er is geen verwerkingsbestand gespecificeerd om de aanvraag te verwerken.\n'; - xajax.debug.text[117] = '.\nBekijk foutmeldingen van de server.'; - xajax.debug.text[118] = 'ONTVANGEN [status: '; - xajax.debug.text[119] = ', omvang: '; - xajax.debug.text[120] = ' bytes, Zeit: '; - xajax.debug.text[121] = 'ms]:\n'; - xajax.debug.text[122] = 'De server retourneert de volgende HTTP-status: '; - xajax.debug.text[123] = '\nONTVANGEN:\n'; - xajax.debug.text[124] = 'De server retourneert een doorverwijzing naar:
    '; - xajax.debug.text[125] = 'KLAAR ['; - xajax.debug.text[126] = 'ms]'; - xajax.debug.text[127] = 'INITIALISATIE OBJECT AANVRAAG'; - - /* - Array: exceptions - */ - xajax.debug.exceptions = []; - xajax.debug.exceptions[10001] = 'Ongeldig XML-antwoord: het antwoord bevat een onbekende tag: {data}.'; - xajax.debug.exceptions[10002] = 'GetRequestObject: XMLHttpRequest is niet beschikbaar, XajaX is uitgeschakeld.'; - xajax.debug.exceptions[10003] = 'Wachtrij limiet overschreden: kan het object niet in de wachtrij plaatsen, omdat die vol is.'; - xajax.debug.exceptions[10004] = 'Ongeldig XML-antwoord: het antwoord bevat een onverwachte tag of tekst: {data}.'; - xajax.debug.exceptions[10005] = 'Ongeldige Request-URI: Ongeldige of ontbrekende URI; automatische detectie faalt; specificeer een URI expliciet.'; - xajax.debug.exceptions[10006] = 'Ongeldig antwoord bevel: misvormd antwoord bevel ontvangen.'; - xajax.debug.exceptions[10007] = 'Ongeldig antwoord bevel: Bevel [{data}] is niet bekend.'; - xajax.debug.exceptions[10008] = 'Element met het ID [{data}] kon niet in het document worden gevonden.'; - xajax.debug.exceptions[10009] = 'Ongeldige aanvraag: Missende functie parameter - naam.'; - xajax.debug.exceptions[10010] = 'Ongeldige aanvraag: Missende functie parameter - object.'; -} - -if ('undefined' != typeof xajax.config) { - if ('undefined' != typeof xajax.config.status) { - /* - Object: update - */ - xajax.config.status.update = function() { - return { - onRequest: function() { - window.status = "Verzenden aanvraag..."; - }, - onWaiting: function() { - window.status = "Wachten op antwoord..."; - }, - onProcessing: function() { - window.status = "Verwerking..."; - }, - onComplete: function() { - window.status = "Afgesloten."; - } - } - } - } -} diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_lang_tr.js b/phpgwapi/inc/xajax/xajax_js/xajax_lang_tr.js deleted file mode 100644 index ed22aa0156..0000000000 --- a/phpgwapi/inc/xajax/xajax_js/xajax_lang_tr.js +++ /dev/null @@ -1,10 +0,0 @@ - -if('undefined'!=typeof xajax.debug){xajax.debug.text=[];xajax.debug.text[100]='IKAZ: ';xajax.debug.text[101]='HATA: ';xajax.debug.text[102]='XAJAX DEBUG (HATA AYIKLAMASI) MESAJI:\n';xajax.debug.text[103]='...\n[UZUN YANIT]\n...';xajax.debug.text[104]='ISTEK GÖNDERILIYOR';xajax.debug.text[105]='GÖNDERILDI [';xajax.debug.text[106]=' byte]';xajax.debug.text[107]='ÇAGIRILIYOR: ';xajax.debug.text[108]='URI: ';xajax.debug.text[109]='ISTEK BASLATILIYOR';xajax.debug.text[110]='PARAMETRELER ISLENIYOR [';xajax.debug.text[111]=']';xajax.debug.text[112]='ISLENECEK PARAMETRE YOK';xajax.debug.text[113]='ISTEK HAZIRLANIYOR';xajax.debug.text[114]='XAJAX ÇAGRISI BASLATILIYOR (kullanimi tavsiye edilmiyor: yerine xajax.request kullanin)';xajax.debug.text[115]='XAJAX ISTEGI BASLATILIYOR';xajax.debug.text[116]='Sunucudan gelen cevabi isleyecek cevap islemcisi yok.\n';xajax.debug.text[117]='.\nSunucudan gelen hata mesajlarini kontrol edin.';xajax.debug.text[118]='ALINDI [durum: ';xajax.debug.text[119]=', boyut: ';xajax.debug.text[120]=' byte, süre: ';xajax.debug.text[121]='ms]:\n';xajax.debug.text[122]='Sunucu asagidaki HTTP durumunu gönderdi: ';xajax.debug.text[123]='\nALINDI:\n';xajax.debug.text[124]='Sunucu su adrese yönlendirme istegi gönderdi :
    ';xajax.debug.text[125]='TAMAMLANDI [';xajax.debug.text[126]='ms]';xajax.debug.text[127]='ISTEK NESNESI BASLATILIYOR';xajax.debug.exceptions=[];xajax.debug.exceptions[10001]='Geçersiz XML cevabi: Cevap bilinmeyen bir etiket tasiyor: {data}.';xajax.debug.exceptions[10002]='GetRequestObject: XMLHttpRequest hazir degil, xajax nesnesi etkisizlestirildi.';xajax.debug.exceptions[10003]='Islem kuyrugu fazla yüklendi: Kuyruk dolu oldugu için nesne kuyruga eklenemiyor.';xajax.debug.exceptions[10004]='Geçersiz XML cevabi: Cevap bilinmeyen bir etiket veya metin tasiyor: {data}.';xajax.debug.exceptions[10005]='Geçersiz istek URI: Geçersiz veya kayip URI; otomatik tespit yapilamadi; lütfen açikça bir tane belirleyiniz.';xajax.debug.exceptions[10006]='Geçersiz cevap komutu: Bozulmus cevap komutu alindi.';xajax.debug.exceptions[10007]='Geçersiz cevap komutu: [{data}] komutu bilinmiyor.';xajax.debug.exceptions[10008]='[{data}] ID li element dosya içinde bulunamadi.';xajax.debug.exceptions[10009]='Geçersiz istek: Fonksiyon isim parametresi eksik.';xajax.debug.exceptions[10010]='Geçersiz istek: Fonksiyon nesne parametresi eksik.';} -if('undefined'!=typeof xajax.config){if('undefined'!=typeof xajax.config.status){xajax.config.status.update=function(){return{onRequest:function(){window.status='İstek Gönderiliyor...';}, -onWaiting:function(){window.status='Cevap Bekleniyor...';}, -onProcessing:function(){window.status='İşlem Devam Ediyor...';}, -onComplete:function(){window.status='Tamamlandı.';} -} -} -} -} diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_lang_tr_uncompressed.js b/phpgwapi/inc/xajax/xajax_js/xajax_lang_tr_uncompressed.js deleted file mode 100644 index 1bcc0263e7..0000000000 --- a/phpgwapi/inc/xajax/xajax_js/xajax_lang_tr_uncompressed.js +++ /dev/null @@ -1,82 +0,0 @@ -/** - * translation for: xajax v.x.x - * @version: 1.0.0 - * @author: mic - * @copyright xajax project - * @license GNU/GPL - * @package xajax x.x.x - * @since v.x.x.x - * save as UTF-8 - */ - -if ('undefined' != typeof xajax.debug) { - - xajax.debug.text = []; - xajax.debug.text[100] = 'IKAZ: '; - xajax.debug.text[101] = 'HATA: '; - xajax.debug.text[102] = 'XAJAX DEBUG (HATA AYIKLAMASI) MESAJI:\n'; - xajax.debug.text[103] = '...\n[UZUN YANIT]\n...'; - xajax.debug.text[104] = 'ISTEK GÖNDERILIYOR'; - xajax.debug.text[105] = 'GÖNDERILDI ['; - xajax.debug.text[106] = ' byte]'; - xajax.debug.text[107] = 'ÇAGIRILIYOR: '; - xajax.debug.text[108] = 'URI: '; - xajax.debug.text[109] = 'ISTEK BASLATILIYOR'; - xajax.debug.text[110] = 'PARAMETRELER ISLENIYOR ['; - xajax.debug.text[111] = ']'; - xajax.debug.text[112] = 'ISLENECEK PARAMETRE YOK'; - xajax.debug.text[113] = 'ISTEK HAZIRLANIYOR'; - xajax.debug.text[114] = 'XAJAX ÇAGRISI BASLATILIYOR (kullanimi tavsiye edilmiyor: yerine xajax.request kullanin)'; - xajax.debug.text[115] = 'XAJAX ISTEGI BASLATILIYOR'; - xajax.debug.text[116] = 'Sunucudan gelen cevabi isleyecek cevap islemcisi yok.\n'; - xajax.debug.text[117] = '.\nSunucudan gelen hata mesajlarini kontrol edin.'; - xajax.debug.text[118] = 'ALINDI [durum: '; - xajax.debug.text[119] = ', boyut: '; - xajax.debug.text[120] = ' byte, süre: '; - xajax.debug.text[121] = 'ms]:\n'; - xajax.debug.text[122] = 'Sunucu asagidaki HTTP durumunu gönderdi: '; - xajax.debug.text[123] = '\nALINDI:\n'; - xajax.debug.text[124] = 'Sunucu su adrese yönlendirme istegi gönderdi :
    '; - xajax.debug.text[125] = 'TAMAMLANDI ['; - xajax.debug.text[126] = 'ms]'; - xajax.debug.text[127] = 'ISTEK NESNESI BASLATILIYOR'; - - /* - Array: exceptions - */ - xajax.debug.exceptions = []; - xajax.debug.exceptions[10001] = 'Geçersiz XML cevabi: Cevap bilinmeyen bir etiket tasiyor: {data}.'; - xajax.debug.exceptions[10002] = 'GetRequestObject: XMLHttpRequest hazir degil, xajax nesnesi etkisizlestirildi.'; - xajax.debug.exceptions[10003] = 'Islem kuyrugu fazla yüklendi: Kuyruk dolu oldugu için nesne kuyruga eklenemiyor.'; - xajax.debug.exceptions[10004] = 'Geçersiz XML cevabi: Cevap bilinmeyen bir etiket veya metin tasiyor: {data}.'; - xajax.debug.exceptions[10005] = 'Geçersiz istek URI: Geçersiz veya kayip URI; otomatik tespit yapilamadi; lütfen açikça bir tane belirleyiniz.'; - xajax.debug.exceptions[10006] = 'Geçersiz cevap komutu: Bozulmus cevap komutu alindi.'; - xajax.debug.exceptions[10007] = 'Geçersiz cevap komutu: [{data}] komutu bilinmiyor.'; - xajax.debug.exceptions[10008] = '[{data}] ID li element dosya içinde bulunamadi.'; - xajax.debug.exceptions[10009] = 'Geçersiz istek: Fonksiyon isim parametresi eksik.'; - xajax.debug.exceptions[10010] = 'Geçersiz istek: Fonksiyon nesne parametresi eksik.'; -} - -if ('undefined' != typeof xajax.config) { - if ('undefined' != typeof xajax.config.status) { - /* - Object: update - */ - xajax.config.status.update = function() { - return { - onRequest: function() { - window.status = 'İstek Gönderiliyor...'; - }, - onWaiting: function() { - window.status = 'Cevap Bekleniyor...'; - }, - onProcessing: function() { - window.status = 'İşlem Devam Ediyor...'; - }, - onComplete: function() { - window.status = 'Tamamlandı.'; - } - } - } - } -} diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_legacy.js b/phpgwapi/inc/xajax/xajax_js/xajax_legacy.js deleted file mode 100644 index 84e933e5fa..0000000000 --- a/phpgwapi/inc/xajax/xajax_js/xajax_legacy.js +++ /dev/null @@ -1,14 +0,0 @@ - -try{if('undefined'==typeof xajax) -throw{name:'SequenceError',message:'Error: xajax core was not detected, legacy module disabled.'} -if('undefined'==typeof xajax.legacy) -xajax.legacy={} -xajax.legacy.call=xajax.call;xajax.call=function(sFunction,objParameters){var oOpt={} -oOpt.parameters=objParameters;if(undefined!=xajax.loadingFunction){if(undefined==oOpt.callback) -oOpt.callback={} -oOpt.callback.onResponseDelay=xajax.loadingFunction;} -if(undefined!=xajax.doneLoadingFunction){if(undefined==oOpt.callback) -oOpt.callback={} -oOpt.callback.onComplete=xajax.doneLoadingFunction;} -return xajax.legacy.call(sFunction,oOpt);} -xajax.legacy.isLoaded=true;}catch(e){alert(e.name+': '+e.message);} diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_legacy_uncompressed.js b/phpgwapi/inc/xajax/xajax_js/xajax_legacy_uncompressed.js deleted file mode 100644 index 62ea1b8ad2..0000000000 --- a/phpgwapi/inc/xajax/xajax_js/xajax_legacy_uncompressed.js +++ /dev/null @@ -1,69 +0,0 @@ -/* - File: xajax_legacy.js - - Provides support for legacy scripts that have not been updated to the - latest syntax. - - Title: xajax legacy support module - - Please see for a detailed description, copyright - and license information. -*/ - -/* - @package xajax - @version $Id: xajax_legacy_uncompressed.php 327 2007-02-28 16:55:26Z calltoconstruct $ - @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson - @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson - @license http://www.xajaxproject.org/bsd_license.txt BSD License -*/ - -try -{ - /* - Class: xajax.legacy - */ - if ('undefined' == typeof xajax) - throw { name: 'SequenceError', message: 'Error: xajax core was not detected, legacy module disabled.' } - - if ('undefined' == typeof xajax.legacy) - xajax.legacy = {} - - /* - Function: xajax.legacy.call - - Convert call parameters from the 0.2.x syntax to the new *improved* - call format. - - Parameters: - sFunction - (string): Registered PHP Functionname to be called - objParametes - (object): Paramter object for the request. - - This is a wrapper function around the standard function. - */ - xajax.legacy.call = xajax.call; - xajax.call = function(sFunction, objParameters) { - var oOpt = {} - oOpt.parameters = objParameters; - if (undefined != xajax.loadingFunction) { - if (undefined == oOpt.callback) - oOpt.callback = {} - oOpt.callback.onResponseDelay = xajax.loadingFunction; - } - if (undefined != xajax.doneLoadingFunction) { - if (undefined == oOpt.callback) - oOpt.callback = {} - oOpt.callback.onComplete = xajax.doneLoadingFunction; - } - return xajax.legacy.call(sFunction, oOpt); - } - - /* - Boolean: isLoaded - - true - Indicates that the module is loaded. - */ - xajax.legacy.isLoaded = true; -} catch (e) { - alert(e.name + ': ' + e.message); -} diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_verbose.js b/phpgwapi/inc/xajax/xajax_js/xajax_verbose.js deleted file mode 100644 index d3c457a382..0000000000 --- a/phpgwapi/inc/xajax/xajax_js/xajax_verbose.js +++ /dev/null @@ -1,18 +0,0 @@ - -try{if('undefined'==typeof xajax) -throw{name:'SequenceError',message:'Error: xajax core was not detected, verbose module disabled.'} -if('undefined'==typeof xajax.debug) -throw{name:'SequenceError',message:'Error: xajax debugger was not detected, verbose module disabled.'} -xajax.debug.verbose={} -xajax.debug.verbose.expandObject=function(obj){var rec=true;if(1 < arguments.length) -rec=arguments[1];if('function'==typeof(obj)){return '[Function]';}else if('object'==typeof(obj)){if(true==rec){var t=' { ';var separator='';for(var m in obj){t+=separator;t+=m;t+=': ';try{t+=xajax.debug.verbose.expandObject(obj[m],false);}catch(e){t+='[n/a]';} -separator=', ';} -t+=' } ';return t;}else return '[Object]';}else return '"'+obj+'"';} -xajax.debug.verbose.makeFunction=function(obj,name){return function(){var fun=name;fun+='(';var separator='';var pLen=arguments.length;for(var p=0;p < pLen;++p){fun+=separator;fun+=xajax.debug.verbose.expandObject(arguments[p]);separator=',';} -fun+=');';var msg='--> ';msg+=fun;xajax.debug.writeMessage(msg);var returnValue=true;var code='returnValue = obj(';separator='';for(var p=0;p < pLen;++p){code+=separator;code+='arguments['+p+']';separator=',';} -code+=');';eval(code);msg='<-- ';msg+=fun;msg+=' returns ';msg+=xajax.debug.verbose.expandObject(returnValue);xajax.debug.writeMessage(msg);return returnValue;} -} -xajax.debug.verbose.hook=function(x,base){for(var m in x){if('function'==typeof(x[m])){x[m]=xajax.debug.verbose.makeFunction(x[m],base+m);} -} -} -xajax.debug.verbose.hook(xajax,'xajax.');xajax.debug.verbose.hook(xajax.callback,'xajax.callback.');xajax.debug.verbose.hook(xajax.css,'xajax.css.');xajax.debug.verbose.hook(xajax.dom,'xajax.dom.');xajax.debug.verbose.hook(xajax.events,'xajax.events.');xajax.debug.verbose.hook(xajax.forms,'xajax.forms.');xajax.debug.verbose.hook(xajax.js,'xajax.js.');xajax.debug.verbose.hook(xajax.tools,'xajax.tools.');xajax.debug.verbose.hook(xajax.tools.queue,'xajax.tools.queue.');xajax.debug.verbose.hook(xajax.command,'xajax.command.');xajax.debug.verbose.hook(xajax.command.handler,'xajax.command.handler.');xajax.debug.verbose.isLoaded=true;}catch(e){alert(e.name+': '+e.message);} diff --git a/phpgwapi/inc/xajax/xajax_js/xajax_verbose_uncompressed.js b/phpgwapi/inc/xajax/xajax_js/xajax_verbose_uncompressed.js deleted file mode 100644 index a3d82ad9cd..0000000000 --- a/phpgwapi/inc/xajax/xajax_js/xajax_verbose_uncompressed.js +++ /dev/null @@ -1,176 +0,0 @@ -/* - File: xajax_verbose.js - - The xajax verbose debugging module. This is an optional module, include in - your project with care. :) - - Title: xajax verbose debugging module - - Please see for a detailed description, copyright - and license information. -*/ - -/* - @package xajax - @version $Id: xajax_verbose_uncompressed 327 2007-02-28 16:55:26Z calltoconstruct $ - @copyright Copyright (c) 2005-2007 by Jared White & J. Max Wilson - @copyright Copyright (c) 2008-2009 by Joseph Woolley, Steffen Konerow, Jared White & J. Max Wilson - @license http://www.xajaxproject.org/bsd_license.txt BSD License -*/ - -try { - if ('undefined' == typeof xajax) - throw { name: 'SequenceError', message: 'Error: xajax core was not detected, verbose module disabled.' } - if ('undefined' == typeof xajax.debug) - throw { name: 'SequenceError', message: 'Error: xajax debugger was not detected, verbose module disabled.' } - - /* - Class: xajax.debug.verbose - - Provide a high level of detail which can be used to debug hard to find - problems. - */ - xajax.debug.verbose = {} - - /* - Function: xajax.debug.verbose.expandObject - - Generate a debug message expanding all the first level - members found therein. - - - Parameters: - - obj - (object): The object to be enumerated. - - Returns: - - string - The textual representation of all the first - level members. - */ - xajax.debug.verbose.expandObject = function(obj) { - var rec = true; - if (1 < arguments.length) - rec = arguments[1]; - if ('function' == typeof (obj)) { - return '[Function]'; - } else if ('object' == typeof (obj)) { - if (true == rec) { - var t = ' { '; - var separator = ''; - for (var m in obj) { - t += separator; - t += m; - t += ': '; - try { - t += xajax.debug.verbose.expandObject(obj[m], false); - } catch (e) { - t += '[n/a]'; - } - separator = ', '; - } - t += ' } '; - return t; - } else return '[Object]'; - } else return '"' + obj + '"'; - } - - /* - Function: xajax.debug.verbose.makeFunction - - Generate a wrapper function around the specified function. - - Parameters: - - obj - (object): The object that contains the function to be - wrapped. - name - (string): The name of the function to be wrapped. - - Returns: - - function - The wrapper function. - */ - xajax.debug.verbose.makeFunction = function(obj, name) { - return function() { - var fun = name; - fun += '('; - - var separator = ''; - var pLen = arguments.length; - for (var p = 0; p < pLen; ++p) { - fun += separator; - fun += xajax.debug.verbose.expandObject(arguments[p]); - separator = ','; - } - - fun += ');'; - - var msg = '--> '; - msg += fun; - - xajax.debug.writeMessage(msg); - - var returnValue = true; - var code = 'returnValue = obj('; - separator = ''; - for (var p = 0; p < pLen; ++p) { - code += separator; - code += 'arguments[' + p + ']'; - separator = ','; - } - code += ');'; - - eval(code); - - msg = '<-- '; - msg += fun; - msg += ' returns '; - msg += xajax.debug.verbose.expandObject(returnValue); - - xajax.debug.writeMessage(msg); - - return returnValue; - } - } - - /* - Function: xajax.debug.verbose.hook - - Generate a wrapper function around each of the functions - contained within the specified object. - - Parameters: - - x - (object): The object to be scanned. - base - (string): The base reference to be prepended to the - generated wrapper functions. - */ - xajax.debug.verbose.hook = function(x, base) { - for (var m in x) { - if ('function' == typeof (x[m])) { - x[m] = xajax.debug.verbose.makeFunction(x[m], base + m); - } - } - } - - xajax.debug.verbose.hook(xajax, 'xajax.'); - xajax.debug.verbose.hook(xajax.callback, 'xajax.callback.'); - xajax.debug.verbose.hook(xajax.css, 'xajax.css.'); - xajax.debug.verbose.hook(xajax.dom, 'xajax.dom.'); - xajax.debug.verbose.hook(xajax.events, 'xajax.events.'); - xajax.debug.verbose.hook(xajax.forms, 'xajax.forms.'); - xajax.debug.verbose.hook(xajax.js, 'xajax.js.'); - xajax.debug.verbose.hook(xajax.tools, 'xajax.tools.'); - xajax.debug.verbose.hook(xajax.tools.queue, 'xajax.tools.queue.'); - xajax.debug.verbose.hook(xajax.command, 'xajax.command.'); - xajax.debug.verbose.hook(xajax.command.handler, 'xajax.command.handler.'); - - /* - Boolean: isLoaded - - true - indicates that the verbose debugging module is loaded. - */ - xajax.debug.verbose.isLoaded = true; -} catch (e) { - alert(e.name + ': ' + e.message); -} diff --git a/phpgwapi/js/egw_json.js b/phpgwapi/js/egw_json.js index a479dabf64..b8df167b53 100644 --- a/phpgwapi/js/egw_json.js +++ b/phpgwapi/js/egw_json.js @@ -434,7 +434,7 @@ _xajax_doXMLHTTP = function(_async, _menuaction, _arguments) return request; } -/*xajax_doXMLHTTP = function(_menuaction) +xajax_doXMLHTTP = function(_menuaction) { return _xajax_doXMLHTTP(true, _menuaction, arguments); } @@ -449,7 +449,7 @@ window.xajax = { { return egw_json_getFormValues(_form); } -};*/ +}; /* The following code is adapted from the xajax project which is licensed under diff --git a/xajax.php b/xajax.php deleted file mode 100644 index 7dc0206a36..0000000000 --- a/xajax.php +++ /dev/null @@ -1,158 +0,0 @@ - - * @version $Id$ - */ - -require_once('./phpgwapi/inc/xajax/xajax_core/xajax.inc.php'); - -/** - * callback if the session-check fails, redirects via xajax to login.php - * - * @param array &$anon_account anon account_info with keys 'login', 'passwd' and optional 'passwd_type' - * @return boolean/string true if we allow anon access and anon_account is set, a sessionid or false otherwise - */ -function xajax_redirect(&$anon_account) -{ - // now the header is included, we can set the charset - $GLOBALS['xajax']->configure('characterEncoding',translation::charset()); - define('XAJAX_DEFAULT_CHAR_ENCODING',translation::charset()); - - $response = new xajaxResponse(); - $response->script("egw_topWindow().location.href='".$GLOBALS['egw_info']['server']['webserver_url']."/login.php?cd=10';"); - $response->printOutput(); - - common::egw_exit(); -} - -/** - * Exception handler for xajax, return the message (and trace, if enabled) as alert() to the user - * - * Does NOT return! - * - * @param Exception $e - */ -function ajax_exception_handler(Exception $e) -{ - // logging all exceptions to the error_log - if (function_exists('_egw_log_exception')) - { - _egw_log_exception($e,$message); - } - $response = new xajaxResponse(); - $message .= ($message ? "\n\n" : '').$e->getMessage(); - - // only show trace (incl. function arguments) if explicitly enabled, eg. on a development system - if ($GLOBALS['egw_info']['server']['exception_show_trace']) - { - $message .= "\n\n".$e->getTraceAsString(); - } - $response->addAlert($message); - $response->printOutput(); - - if (is_object($GLOBALS['egw'])) - { - common::egw_exit(); - } - exit; -} - -// set our own exception handler, to not get the html from eGW's default one -set_exception_handler('ajax_exception_handler'); - -/** - * Callback called from xajax - * - * Includs the header and set's up the eGW enviroment. - * - * @return xajaxResponse object - */ -function doXMLHTTP() -{ - $numargs = func_num_args(); - if($numargs < 1) - return false; - - $argList = func_get_args(); - $arg0 = array_shift($argList); - - //error_log("xajax_doXMLHTTP('$arg0',...)"); - - if (strpos($arg0,'::') !== false && strpos($arg0,'.') === false) // static method name app_something::method - { - @list($className,$functionName,$handler) = explode('::',$arg0); - list($appName) = explode('_',$className); - } - else - { - @list($appName, $className, $functionName, $handler) = explode('.',$arg0); - } - //error_log("xajax.php: appName=$appName, className=$className, functionName=$functionName, handler=$handler"); - - $GLOBALS['egw_info'] = array( - 'flags' => array( - 'currentapp' => $appName, - 'noheader' => True, - 'disable_Template_class' => True, - 'autocreate_session_callback' => 'xajax_redirect', - 'no_exception_handler' => true, // we already installed our own - 'no_dla_update' => $appName == 'notifications', // otherwise session never time out - ) - ); - include('./header.inc.php'); - - if(get_magic_quotes_gpc()) { - $argList = array_stripslashes($argList); - } - - // now the header is included, we can set the charset - $GLOBALS['xajax']->configure('characterEncoding',translation::charset()); - define('XAJAX_DEFAULT_CHAR_ENCODING',translation::charset()); - - switch($handler) - { - case '/etemplate/process_exec': - $_GET['menuaction'] = $appName.'.'.$className.'.'.$functionName; - $appName = $className = 'etemplate'; - $functionName = 'process_exec'; - $arg0 = 'etemplate.etemplate.process_exec'; - - $argList = array( - $argList[0]['etemplate_exec_id'], - $argList[0]['submit_button'], - $argList[0], - 'xajaxResponse', - ); - //error_log("xajax_doXMLHTTP() /etemplate/process_exec handler: arg0='$arg0', menuaction='$_GET[menuaction]'"); - break; - case 'etemplate': // eg. ajax code in an eTemplate widget - $arg0 = ($appName = 'etemplate').'.'.$className.'.'.$functionName; - break; - } - if(substr($className,0,4) != 'ajax' && substr($className,-4) != 'ajax' && - $arg0 != 'etemplate.etemplate.process_exec' && substr($functionName,0,4) != 'ajax' || - !preg_match('/^[A-Za-z0-9_]+(\.[A-Za-z0-9_]+\.|::)[A-Za-z0-9_]+$/',$arg0)) - { - // stopped for security reasons - error_log($_SERVER['PHP_SELF']. ' stopped for security reason. '.$arg0.' is not valid. class- or function-name must start with ajax!!!'); - // send message also to the user - throw new Exception($_SERVER['PHP_SELF']. ' stopped for security reason. '.$arg0.' is not valid. class- or function-name must start with ajax!!!'); - exit; - } - $ajaxClass =& CreateObject($appName.'.'.$className); - $argList = translation::convert($argList, 'utf-8'); - - return call_user_func_array(array(&$ajaxClass, $functionName), (array)$argList ); -} -$xajax = new xajax(); -//$xajax->configure('requestURI',$_SERVER['PHP_SELF']); -$xajax->register(XAJAX_FUNCTION,'doXMLHTTP'); -$xajax->register(XAJAX_FUNCTION,'doXMLHTTP',array('mode' => "'synchronous'",'alias' => 'doXMLHTTPsync')); -$xajax->processRequest(); From 396c6b4074402d61204b04b3aa65d73e474caa95 Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Tue, 27 Jul 2010 12:12:10 +0000 Subject: [PATCH 196/496] fix for bug MyStylite Tracker#773; Menu links: superfluous Scrollbar --- phpgwapi/templates/default/navbar.tpl | 2 +- phpgwapi/templates/jerryr/navbar.tpl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/phpgwapi/templates/default/navbar.tpl b/phpgwapi/templates/default/navbar.tpl index 5fa6b37cb4..79d58e9933 100644 --- a/phpgwapi/templates/default/navbar.tpl +++ b/phpgwapi/templates/default/navbar.tpl @@ -128,7 +128,7 @@
    {lang_title}
    -
     {lang_Mail_backend}
    {lang_choose_from_mailsettings_used_for_notification} + +
    +
    diff --git a/phpgwapi/templates/jerryr/navbar.tpl b/phpgwapi/templates/jerryr/navbar.tpl index 03a1211919..aafbb7fd7d 100644 --- a/phpgwapi/templates/jerryr/navbar.tpl +++ b/phpgwapi/templates/jerryr/navbar.tpl @@ -149,7 +149,7 @@
    - +
    From 955c3bbc5b856f9227210c7dab3dbc2b8f9f07a0 Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Tue, 27 Jul 2010 12:59:50 +0000 Subject: [PATCH 197/496] fix a bug introduced with rev.31401 (was disabling the ability to switch to HTML Mode from plain/text mode, if starting with plain/text) --- felamimail/inc/class.uicompose.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/felamimail/inc/class.uicompose.inc.php b/felamimail/inc/class.uicompose.inc.php index b588c370d0..ec9c5f7482 100644 --- a/felamimail/inc/class.uicompose.inc.php +++ b/felamimail/inc/class.uicompose.inc.php @@ -466,7 +466,7 @@ } else { $style="border:0px; width:100%; height:400px;"; // initalize the CKEditor Object to enable switching back and force - $editor = html::fckEditorQuick('body', 'ascii', $sessionData['body'],'400px','99%'); + $editor = $editorObject->init().html::fckEditorQuick('body', 'ascii', $sessionData['body'],'400px','99%'); $this->t->set_var('tinymce', $editor); //html::fckEditorQuick('body', 'ascii', $sessionData['body'],'400px','99%')); $this->t->set_var('mimeType', 'text'); $ishtml=0; From a07579f56f037537762f19294c0cc6365c0da619 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Lehrke?= Date: Tue, 27 Jul 2010 19:37:41 +0000 Subject: [PATCH 198/496] Fix unknown qualifier issue for contact fields --- addressbook/inc/class.addressbook_vcal.inc.php | 1 + 1 file changed, 1 insertion(+) diff --git a/addressbook/inc/class.addressbook_vcal.inc.php b/addressbook/inc/class.addressbook_vcal.inc.php index 24eb931972..0850b97bb4 100644 --- a/addressbook/inc/class.addressbook_vcal.inc.php +++ b/addressbook/inc/class.addressbook_vcal.inc.php @@ -696,6 +696,7 @@ class addressbook_vcal extends addressbook_bo case 'VOICE': case 'OTHER': case 'CELL': + if ($rowName != 'TEL') break; case 'WORK': case 'HOME': $rowName .= ';' . $pname; From 6f8bc7339ebea5de6030fba69a16cdbd5e986f2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Lehrke?= Date: Tue, 27 Jul 2010 19:39:18 +0000 Subject: [PATCH 199/496] Improve CalDAV PUT handler --- calendar/inc/class.calendar_groupdav.inc.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/calendar/inc/class.calendar_groupdav.inc.php b/calendar/inc/class.calendar_groupdav.inc.php index b462dd3d49..8dfa25a479 100644 --- a/calendar/inc/class.calendar_groupdav.inc.php +++ b/calendar/inc/class.calendar_groupdav.inc.php @@ -477,7 +477,9 @@ error_log(__METHOD__."($path,,".array2string($start).") filter=".array2string($f function put(&$options,$id,$user=null) { if ($this->debug) error_log(__METHOD__."($id, $user)".print_r($options,true)); - + + if (!preg_match('/^METHOD:(PUBLISH|REQUEST)(\r\n|\r|\n)(.*)^BEGIN:VEVENT/ism', $options['content'])) return true; + $return_no_access = true; // as handled by importVCal anyway and allows it to set the status for participants $oldEvent = $this->_common_get_put_delete('PUT',$options,$id,$return_no_access); if (!is_null($oldEvent) && !is_array($oldEvent)) From 407a2fb2a7c14edba4874cb72ec8ed4126ac86bd Mon Sep 17 00:00:00 2001 From: Nathan Gray Date: Wed, 28 Jul 2010 14:18:30 +0000 Subject: [PATCH 200/496] Backport 31538 - Keep CSV fields in definition, so editing definition doesn't require uploading a file each time --- .../inc/class.addressbook_wizard_import_contacts_csv.inc.php | 1 - 1 file changed, 1 deletion(-) diff --git a/addressbook/inc/class.addressbook_wizard_import_contacts_csv.inc.php b/addressbook/inc/class.addressbook_wizard_import_contacts_csv.inc.php index 7cbb35ab03..4349eab699 100644 --- a/addressbook/inc/class.addressbook_wizard_import_contacts_csv.inc.php +++ b/addressbook/inc/class.addressbook_wizard_import_contacts_csv.inc.php @@ -63,7 +63,6 @@ class addressbook_wizard_import_contacts_csv extends importexport_wizard_basic_i switch (array_search('pressed', $content['button'])) { case 'next': - unset($content['csv_fields']); return $GLOBALS['egw']->importexport_definitions_ui->get_step($content['step'],1); case 'previous' : return $GLOBALS['egw']->importexport_definitions_ui->get_step($content['step'],-1); From bc8345d06da20ea1af7267cdaeb1c7ad0c7d01ca Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 29 Jul 2010 07:50:17 +0000 Subject: [PATCH 201/496] fixed typo --- setup/inc/class.setup_translation.inc.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/setup/inc/class.setup_translation.inc.php b/setup/inc/class.setup_translation.inc.php index dd1d6ba3ef..1e407be57d 100644 --- a/setup/inc/class.setup_translation.inc.php +++ b/setup/inc/class.setup_translation.inc.php @@ -103,17 +103,17 @@ class setup_translation function get_langs($DEBUG=False) { - return translaton::get_langs($DEBUG); + return translation::get_langs($DEBUG); } function drop_langs($appname,$DEBUG=False) { - return translaton::drop_langs($appname,$DEBUG); + return translation::drop_langs($appname,$DEBUG); } function add_langs($appname,$DEBUG=False,$force_langs=False) { - return translaton::add_langs($appname,$DEBUG,$force_langs); + return translation::add_langs($appname,$DEBUG,$force_langs); } function drop_add_all_langs($langs=False) From d9c3ac4c4a2c07dcffef7a632739b57cec2c9d3a Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 29 Jul 2010 08:14:51 +0000 Subject: [PATCH 202/496] marking all static methods static and moving method to query supported languages into setup_translation class --- setup/inc/class.setup_translation.inc.php | 57 +++++++++++++++++++++-- setup/lang.php | 3 +- 2 files changed, 53 insertions(+), 7 deletions(-) diff --git a/setup/inc/class.setup_translation.inc.php b/setup/inc/class.setup_translation.inc.php index 1e407be57d..8bf02b0135 100644 --- a/setup/inc/class.setup_translation.inc.php +++ b/setup/inc/class.setup_translation.inc.php @@ -101,22 +101,22 @@ class setup_translation return $ret; } - function get_langs($DEBUG=False) + static function get_langs($DEBUG=False) { return translation::get_langs($DEBUG); } - function drop_langs($appname,$DEBUG=False) + static function drop_langs($appname,$DEBUG=False) { return translation::drop_langs($appname,$DEBUG); } - function add_langs($appname,$DEBUG=False,$force_langs=False) + static function add_langs($appname,$DEBUG=False,$force_langs=False) { return translation::add_langs($appname,$DEBUG,$force_langs); } - function drop_add_all_langs($langs=False) + static function drop_add_all_langs($langs=False) { if (!$langs && !count($langs = translation::get_langs())) { @@ -125,13 +125,60 @@ class setup_translation return translation::install_langs($langs,'dumpold'); } + /** + * Languages we support (alphabetically sorted) + * + * @param boolean $array_values=true true: values are an array, false values are just the descriptiong + * @return array + */ + static function get_supported_langs($array_values=true) + { + $f = fopen(EGW_SERVER_ROOT.'/setup/lang/languages','rb'); + while(($line = fgets($f))) + { + list($lang,$descr) = explode("\t",$line,2); + $lang = trim($lang); + if ($array_values) + { + $languages[$lang]['lang'] = $lang; + $languages[$lang]['descr'] = trim($descr); + $languages[$lang]['available'] = False; + } + else + { + $languages[$lang] = trim($descr); + } + } + fclose($f); + + if ($array_values) + { + $d = dir(EGW_SERVER_ROOT.'/setup/lang'); + while(($file = $d->read())) + { + if(preg_match('/^(php|e)gw_([-a-z]+).lang$/i',$file,$matches)) + { + $languages[$matches[2]]['available'] = True; + } + } + $d->close(); + uasort($languages,create_function('$a,$b','return strcmp(@$a[\'descr\'],@$b[\'descr\']);')); + } + else + { + asort($languages); + } + //_debug_array($languages); + return $languages; + } + /** * List availible charsets and it's supported languages * @param boolean/string $name=false name for selectbox or false to return an array * @param string $selected selected charset * @return string/array html for a selectbox or array with charset / languages pairs */ - function get_charsets($name=false,$selected='') + static function get_charsets($name=false,$selected='') { $charsets = array( 'utf-8' => 'utf-8: '.lang('all languages (incl. not listed ones)'), diff --git a/setup/lang.php b/setup/lang.php index 67a3dfc328..d021d40dfd 100644 --- a/setup/lang.php +++ b/setup/lang.php @@ -55,8 +55,7 @@ if (!@$newinstall && !isset($GLOBALS['egw_info']['setup']['installed_langs'])) } $select_box_desc = lang('Select which languages you would like to use'); $select_box = ''; -$languages = get_langs(); -uasort($languages,create_function('$a,$b','return strcmp(@$a[\'descr\'],@$b[\'descr\']);')); +$languages = setup_translation::get_supported_langs(); foreach($languages as $id => $data) { $select_box_langs = From f74364c07da11aa2c818dc3d92fa7d3c5087a3f3 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 29 Jul 2010 08:30:23 +0000 Subject: [PATCH 203/496] using functions moved to setup_translation class and modernising setup_html --- setup/inc/class.setup_html.inc.php | 574 +++++++++++++++-------------- setup/inc/functions.inc.php | 59 --- setup/index.php | 2 +- 3 files changed, 302 insertions(+), 333 deletions(-) diff --git a/setup/inc/class.setup_html.inc.php b/setup/inc/class.setup_html.inc.php index fc714df20f..6fd00707fe 100644 --- a/setup/inc/class.setup_html.inc.php +++ b/setup/inc/class.setup_html.inc.php @@ -1,322 +1,350 @@ * - * and Miles Lott * - * -------------------------------------------- * - * 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. * - \**************************************************************************/ +/** + * eGroupWare Setup + * + * @link http://www.egroupware.org + * @package setup + * @author Tony Puglisi (Angles) + * @author Miles Lott + * @author Ralf Becker + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ - /* $Id$ */ - - class setup_html +/** + * Some static helper functions to generate html stuff in setup + */ +class setup_html +{ + /** + * generate header.inc.php file output - NOT a generic html header function + * + */ + static function generate_header() { - /** - * generate header.inc.php file output - NOT a generic html header function - * - */ - function generate_header() + // PHP will automatically replace any dots in incoming + // variable names with underscores. + + $GLOBALS['header_template']->set_file(array('header' => 'header.inc.php.template')); + $GLOBALS['header_template']->set_block('header','domain','domain'); + $var = Array(); + + $deletedomain = get_var('deletedomain',Array('POST')); + $domains = get_var('domains',Array('POST')); + + foreach($domains as $k => $v) { - // PHP will automatically replace any dots in incoming - // variable names with underscores. - - $GLOBALS['header_template']->set_file(array('header' => 'header.inc.php.template')); - $GLOBALS['header_template']->set_block('header','domain','domain'); - $var = Array(); - - $deletedomain = get_var('deletedomain',Array('POST')); - $domains = get_var('domains',Array('POST')); - - foreach($domains as $k => $v) + if(is_array($deletedomain) && isset($deletedomain[$k])) { - if(is_array($deletedomain) && isset($deletedomain[$k])) - { - continue; - } - $variableName = str_replace('.','_',$k); - $dom = get_var('setting_'.$variableName,Array('POST')); - $GLOBALS['header_template']->set_var('DB_DOMAIN',$v); - foreach($dom as $x => $y) - { - if(strtoupper($x) == 'CONFIG_PASS') - { - $GLOBALS['header_template']->set_var(strtoupper($x),md5($y)); - } - else - { - $GLOBALS['header_template']->set_var(strtoupper($x),$y); - } - } - /* Admin did not type a new password, so use the old one from the hidden field, - * which is already md5 encoded. - */ - if($dom['config_password'] && !$dom['config_pass']) - { - /* Real == hidden */ - $GLOBALS['header_template']->set_var('CONFIG_PASS',$dom['config_password']); - } - /* If the admin didn't select a db_port, set to the default */ - if(!$dom['db_port']) - { - $GLOBALS['header_template']->set_var('DB_PORT',$GLOBALS['default_db_ports'][$dom['db_type']]); - } - $GLOBALS['header_template']->parse('domains','domain',True); + continue; } - - $GLOBALS['header_template']->set_var('domain',''); - - $setting = get_var('setting',Array('POST')); - while($setting && list($k,$v) = @each($setting)) + $variableName = str_replace('.','_',$k); + $dom = get_var('setting_'.$variableName,Array('POST')); + $GLOBALS['header_template']->set_var('DB_DOMAIN',$v); + foreach($dom as $x => $y) { - if(strtoupper($k) == 'HEADER_ADMIN_PASSWORD') + if(strtoupper($x) == 'CONFIG_PASS') { - $var[strtoupper($k)] = md5($v); + $GLOBALS['header_template']->set_var(strtoupper($x),md5($y)); } else { - $var[strtoupper($k)] = $v; + $GLOBALS['header_template']->set_var(strtoupper($x),$y); } } - /* Admin did not type a new header password, so use the old one from the hidden field, + /* Admin did not type a new password, so use the old one from the hidden field, * which is already md5 encoded. */ - if($var['HEADER_ADMIN_PASS'] && empty($setting['HEADER_ADMIN_PASSWORD'])) + if($dom['config_password'] && !$dom['config_pass']) { /* Real == hidden */ - $var['HEADER_ADMIN_PASSWORD'] = $var['HEADER_ADMIN_PASS']; + $GLOBALS['header_template']->set_var('CONFIG_PASS',$dom['config_password']); } - $GLOBALS['header_template']->set_var($var); - return $GLOBALS['header_template']->parse('out','header'); + /* If the admin didn't select a db_port, set to the default */ + if(!$dom['db_port']) + { + $GLOBALS['header_template']->set_var('DB_PORT',$GLOBALS['default_db_ports'][$dom['db_type']]); + } + $GLOBALS['header_template']->parse('domains','domain',True); } - function setup_tpl_dir($app_name='setup') + $GLOBALS['header_template']->set_var('domain',''); + + $setting = get_var('setting',Array('POST')); + while($setting && list($k,$v) = @each($setting)) { - /* hack to get tpl dir */ - if (is_dir(EGW_SERVER_ROOT)) + if(strtoupper($k) == 'HEADER_ADMIN_PASSWORD') { - $srv_root = EGW_SERVER_ROOT . SEP . "$app_name" . SEP; + $var[strtoupper($k)] = md5($v); } else { - $srv_root = ''; + $var[strtoupper($k)] = $v; } + } + /* Admin did not type a new header password, so use the old one from the hidden field, + * which is already md5 encoded. + */ + if($var['HEADER_ADMIN_PASS'] && empty($setting['HEADER_ADMIN_PASSWORD'])) + { + /* Real == hidden */ + $var['HEADER_ADMIN_PASSWORD'] = $var['HEADER_ADMIN_PASS']; + } + $GLOBALS['header_template']->set_var($var); + return $GLOBALS['header_template']->parse('out','header'); + } - $tpl_typical = 'templates' . SEP . 'default'; - $tpl_root = "$srv_root" ."$tpl_typical"; - return $tpl_root; + static function setup_tpl_dir($app_name='setup') + { + /* hack to get tpl dir */ + if (is_dir(EGW_SERVER_ROOT)) + { + $srv_root = EGW_SERVER_ROOT . SEP . "$app_name" . SEP; + } + else + { + $srv_root = ''; } - function show_header($title='',$nologoutbutton=False, $logoutfrom='config', $configdomain='') + $tpl_typical = 'templates' . SEP . 'default'; + $tpl_root = "$srv_root" ."$tpl_typical"; + return $tpl_root; + } + + static function show_header($title='',$nologoutbutton=False, $logoutfrom='config', $configdomain='') + { + // add a content-type header to overwrite an existing default charset in apache (AddDefaultCharset directiv) + header('Content-type: text/html; charset='.$GLOBALS['egw_setup']->system_charset); + + $GLOBALS['setup_tpl']->set_var('charset',$GLOBALS['egw_setup']->system_charset); + $style = array( + 'th_bg' => '#486591', + 'th_text' => '#FFFFFF', + 'row_on' => '#DDDDDD', + 'row_off' => '#EEEEEE', + 'banner_bg' => '#4865F1', + 'msg' => '#FF0000', + ); + $GLOBALS['setup_tpl']->set_var($style); + if ($nologoutbutton) { - // add a content-type header to overwrite an existing default charset in apache (AddDefaultCharset directiv) - header('Content-type: text/html; charset='.$GLOBALS['egw_setup']->system_charset); - - $GLOBALS['setup_tpl']->set_var('charset',$GLOBALS['egw_setup']->system_charset); - $style = array( - 'th_bg' => '#486591', - 'th_text' => '#FFFFFF', - 'row_on' => '#DDDDDD', - 'row_off' => '#EEEEEE', - 'banner_bg' => '#4865F1', - 'msg' => '#FF0000', - ); - $GLOBALS['setup_tpl']->set_var($style); - if ($nologoutbutton) - { - $GLOBALS['setup_tpl']->set_block('T_head','loged_in'); - $GLOBALS['setup_tpl']->set_var('loged_in',''); - } - else - { - $btn_logout = '' . lang('Logout').''; - $check_install = ''.lang('Check installation').''; - } - - $GLOBALS['setup_tpl']->set_var('lang_setup', lang('setup')); - $GLOBALS['setup_tpl']->set_var('page_title',$title); - if ($configdomain == '') - { - $GLOBALS['setup_tpl']->set_var('configdomain',''); - } - else - { - $GLOBALS['setup_tpl']->set_var('configdomain',' - ' . lang('Domain') . ': ' . $configdomain); - } - - if(basename($_SERVER['SCRIPT_FILENAME']) != 'index.php') - { - $index_btn = '' . lang('Setup Main Menu') . ''; - $index_img = 'ball'; - } - - $GLOBALS['setup_tpl']->set_var('lang_version',lang('version')); - $GLOBALS['setup_tpl']->set_var('pgw_ver',@$GLOBALS['egw_info']['server']['versions']['phpgwapi']); - $GLOBALS['setup_tpl']->set_var(array( - 'logoutbutton' => $btn_logout, - 'indexbutton' => $index_btn, - 'indeximg' => $index_img, - 'check_install' => $check_install, - 'main_menu' => lang('Setup Main Menu'), - 'user_login' => lang('Back to user login') - )); - - // manual / help link to the install manual on egroupware.org - $manual_remote_egw_url = 'http://manual.egroupware.org/egroupware'; - $url_parts = explode('/',$_SERVER['PHP_SELF']); - $script = array_pop($url_parts); - $lang = setup::get_lang(); - $url = $manual_remote_egw_url.'/manual/index.php?referer='.urlencode($manual_remote_egw_url.'/setup/'.$script). - ($lang ? '&lang='.urlencode($lang) : ''); - $GLOBALS['setup_tpl']->set_var('manual',''. - htmlspecialchars(lang('Manual / help')).''); - - $GLOBALS['setup_tpl']->pparse('out','T_head'); - /* $setup_tpl->set_var('T_head',''); */ + $GLOBALS['setup_tpl']->set_block('T_head','loged_in'); + $GLOBALS['setup_tpl']->set_var('loged_in',''); + } + else + { + $btn_logout = '' . lang('Logout').''; + $check_install = ''.lang('Check installation').''; } - function show_footer() + $GLOBALS['setup_tpl']->set_var('lang_setup', lang('setup')); + $GLOBALS['setup_tpl']->set_var('page_title',$title); + if ($configdomain == '') { - $GLOBALS['setup_tpl']->pparse('out','T_footer'); - unset($GLOBALS['setup_tpl']); + $GLOBALS['setup_tpl']->set_var('configdomain',''); + } + else + { + $GLOBALS['setup_tpl']->set_var('configdomain',' - ' . lang('Domain') . ': ' . $configdomain); } - function show_alert_msg($alert_word='Setup alert',$alert_msg='setup alert (generic)') + if(basename($_SERVER['SCRIPT_FILENAME']) != 'index.php') { - $GLOBALS['setup_tpl']->set_var('V_alert_word',$alert_word); - $GLOBALS['setup_tpl']->set_var('V_alert_msg',$alert_msg); - $GLOBALS['setup_tpl']->pparse('out','T_alert_msg'); + $index_btn = '' . lang('Setup Main Menu') . ''; + $index_img = 'ball'; } - function make_frm_btn_simple($pre_frm_blurb='',$frm_method='post',$frm_action='',$input_type='submit',$input_value='',$post_frm_blurb='') + $GLOBALS['setup_tpl']->set_var('lang_version',lang('version')); + $GLOBALS['setup_tpl']->set_var('pgw_ver',@$GLOBALS['egw_info']['server']['versions']['phpgwapi']); + $GLOBALS['setup_tpl']->set_var(array( + 'logoutbutton' => $btn_logout, + 'indexbutton' => $index_btn, + 'indeximg' => $index_img, + 'check_install' => $check_install, + 'main_menu' => lang('Setup Main Menu'), + 'user_login' => lang('Back to user login') + )); + + // manual / help link to the install manual on egroupware.org + $manual_remote_egw_url = 'http://manual.egroupware.org/egroupware'; + $url_parts = explode('/',$_SERVER['PHP_SELF']); + $script = array_pop($url_parts); + $lang = setup::get_lang(); + $url = $manual_remote_egw_url.'/manual/index.php?referer='.urlencode($manual_remote_egw_url.'/setup/'.$script). + ($lang ? '&lang='.urlencode($lang) : ''); + $GLOBALS['setup_tpl']->set_var('manual',''. + htmlspecialchars(lang('Manual / help')).''); + + $GLOBALS['setup_tpl']->pparse('out','T_head'); + /* $setup_tpl->set_var('T_head',''); */ + } + + static function show_footer() + { + $GLOBALS['setup_tpl']->pparse('out','T_footer'); + unset($GLOBALS['setup_tpl']); + } + + static function show_alert_msg($alert_word='Setup alert',$alert_msg='setup alert (generic)') + { + $GLOBALS['setup_tpl']->set_var('V_alert_word',$alert_word); + $GLOBALS['setup_tpl']->set_var('V_alert_msg',$alert_msg); + $GLOBALS['setup_tpl']->pparse('out','T_alert_msg'); + } + + static function make_frm_btn_simple($pre_frm_blurb='',$frm_method='post',$frm_action='',$input_type='submit',$input_value='',$post_frm_blurb='') + { + /* a simple form has simple components */ + $simple_form = $pre_frm_blurb ."\n" + . '' . "\n" + . '' . "\n" + . '' . "\n" + . $post_frm_blurb . "\n"; + return $simple_form; + } + + static function make_href_link_simple($pre_link_blurb='',$href_link='',$href_text='default text',$post_link_blurb='') + { + /* a simple href link has simple components */ + $simple_link = $pre_link_blurb + . '' . $href_text . ' ' + . $post_link_blurb . "\n"; + return $simple_link; + } + + static function login_form() + { + /* begin use TEMPLATE login_main.tpl */ + $GLOBALS['setup_tpl']->set_var('ConfigLoginMSG',@$GLOBALS['egw_info']['setup']['ConfigLoginMSG']); + $GLOBALS['setup_tpl']->set_var('HeaderLoginMSG',@$GLOBALS['egw_info']['setup']['HeaderLoginMSG']); + $GLOBALS['setup_tpl']->set_var('lang_header_username',lang('Header Username')); + $GLOBALS['setup_tpl']->set_var('lang_header_password',lang('Header Password')); + $GLOBALS['setup_tpl']->set_var('lang_header_login',lang('Header Admin Login')); + $GLOBALS['setup_tpl']->set_var('lang_config_login',lang('Setup/Config Admin Login')); + $GLOBALS['setup_tpl']->set_var('lang_config_username',lang('Config Username')); + $GLOBALS['setup_tpl']->set_var('lang_config_password',lang('Config Password')); + $GLOBALS['setup_tpl']->set_var('lang_domain',lang('Domain')); + + $GLOBALS['setup_tpl']->set_var('lang_select',self::lang_select()); + + if ($GLOBALS['egw_info']['setup']['stage']['header'] == '10') { - /* a simple form has simple components */ - $simple_form = $pre_frm_blurb ."\n" - . '
    ' . "\n" - . '' . "\n" - . '' . "\n" - . $post_frm_blurb . "\n"; - return $simple_form; - } - - function make_href_link_simple($pre_link_blurb='',$href_link='',$href_text='default text',$post_link_blurb='') - { - /* a simple href link has simple components */ - $simple_link = $pre_link_blurb - . '' . $href_text . ' ' - . $post_link_blurb . "\n"; - return $simple_link; - } - - function login_form() - { - /* begin use TEMPLATE login_main.tpl */ - $GLOBALS['setup_tpl']->set_var('ConfigLoginMSG',@$GLOBALS['egw_info']['setup']['ConfigLoginMSG']); - $GLOBALS['setup_tpl']->set_var('HeaderLoginMSG',@$GLOBALS['egw_info']['setup']['HeaderLoginMSG']); - $GLOBALS['setup_tpl']->set_var('lang_header_username',lang('Header Username')); - $GLOBALS['setup_tpl']->set_var('lang_header_password',lang('Header Password')); - $GLOBALS['setup_tpl']->set_var('lang_header_login',lang('Header Admin Login')); - $GLOBALS['setup_tpl']->set_var('lang_config_login',lang('Setup/Config Admin Login')); - $GLOBALS['setup_tpl']->set_var('lang_config_username',lang('Config Username')); - $GLOBALS['setup_tpl']->set_var('lang_config_password',lang('Config Password')); - $GLOBALS['setup_tpl']->set_var('lang_domain',lang('Domain')); - - $GLOBALS['setup_tpl']->set_var('lang_select',lang_select()); - - if ($GLOBALS['egw_info']['setup']['stage']['header'] == '10') + /* + Begin use SUB-TEMPLATE login_stage_header, + fills V_login_stage_header used inside of login_main.tpl + */ + if (count($GLOBALS['egw_domain']) > 1) { - /* - Begin use SUB-TEMPLATE login_stage_header, - fills V_login_stage_header used inside of login_main.tpl - */ - if (count($GLOBALS['egw_domain']) > 1) + foreach($GLOBALS['egw_domain'] as $domain => $data) { - foreach($GLOBALS['egw_domain'] as $domain => $data) - { - $domains .= "\n"; - } - $GLOBALS['setup_tpl']->set_var('domains',$domains); + $domains .= "\n"; + } + $GLOBALS['setup_tpl']->set_var('domains',$domains); - // use BLOCK B_multi_domain inside of login_stage_header - $GLOBALS['setup_tpl']->parse('V_multi_domain','B_multi_domain'); - // in this case, the single domain block needs to be nothing - $GLOBALS['setup_tpl']->set_var('V_single_domain',''); + // use BLOCK B_multi_domain inside of login_stage_header + $GLOBALS['setup_tpl']->parse('V_multi_domain','B_multi_domain'); + // in this case, the single domain block needs to be nothing + $GLOBALS['setup_tpl']->set_var('V_single_domain',''); + } + else + { + reset($GLOBALS['egw_domain']); + $default_domain = each($GLOBALS['egw_domain']); + $GLOBALS['setup_tpl']->set_var('default_domain_zero',$default_domain[0]); + + /* Use BLOCK B_single_domain inside of login_stage_header */ + $GLOBALS['setup_tpl']->parse('V_single_domain','B_single_domain'); + /* in this case, the multi domain block needs to be nothing */ + $GLOBALS['setup_tpl']->set_var('V_multi_domain',''); + } + /* + End use SUB-TEMPLATE login_stage_header + put all this into V_login_stage_header for use inside login_main + */ + $GLOBALS['setup_tpl']->parse('V_login_stage_header','T_login_stage_header'); + } + else + { + /* begin SKIP SUB-TEMPLATE login_stage_header */ + $GLOBALS['setup_tpl']->set_var('V_multi_domain',''); + $GLOBALS['setup_tpl']->set_var('V_single_domain',''); + $GLOBALS['setup_tpl']->set_var('V_login_stage_header',''); + } + /* + end use TEMPLATE login_main.tpl + now out the login_main template + */ + $GLOBALS['setup_tpl']->pparse('out','T_login_main'); + } + + static function lang_select($onChange=False,$ConfigLang='') + { + if (!$ConfigLang) + { + $ConfigLang = setup::get_lang(); + } + $select = '' . "\n"; + + return $select; } -?> + + static function get_template_list() + { + $d = dir(EGW_SERVER_ROOT . '/phpgwapi/templates'); + + while($entry = $d->read()) + { + if ($entry != 'CVS' && $entry != '.' && $entry != '..') + { + $list[$entry]['name'] = $entry; + $f = EGW_SERVER_ROOT . '/phpgwapi/templates/' . $entry . '/details.inc.php'; + if (file_exists ($f)) + { + include($f); + $list[$entry]['title'] = 'Use ' . $GLOBALS['egw_info']['template'][$entry]['title'] . 'interface'; + } + else + { + $list[$entry]['title'] = $entry; + } + } + } + $d->close(); + reset ($list); + return $list; + } + + static function list_themes() + { + $dh = dir(EGW_SERVER_ROOT . '/phpgwapi/themes'); + while ($file = $dh->read()) + { + if (preg_match('/'."\.theme$".'/i', $file)) + { + $list[] = substr($file,0,strpos($file,'.')); + } + } + $dh->close(); + reset ($list); + return $list; + } +} diff --git a/setup/inc/functions.inc.php b/setup/inc/functions.inc.php index d398c0ac8c..62aad93fa8 100644 --- a/setup/inc/functions.inc.php +++ b/setup/inc/functions.inc.php @@ -75,65 +75,6 @@ function lang($key,$vars=null) return $GLOBALS['egw_setup']->translation->translate("$key", $vars); } -/** - * returns array of languages we support, with enabled set to True if the lang file exists - */ -function get_langs() -{ - $f = fopen('./lang/languages','rb'); - while($line = fgets($f,200)) - { - list($x,$y) = explode("\t",$line); - $languages[$x]['lang'] = trim($x); - $languages[$x]['descr'] = trim($y); - $languages[$x]['available'] = False; - } - fclose($f); - - $d = dir('./lang'); - while($file=$d->read()) - { - if(preg_match('/^(php|e)gw_([-a-z]+).lang$/i',$file,$matches)) - { - $languages[$matches[2]]['available'] = True; - } - } - $d->close(); - - //print_r($languages); - return $languages; -} - -function lang_select($onChange=False,$ConfigLang='') -{ - if (!$ConfigLang) - { - $ConfigLang = setup::get_lang(); - } - $select = '' . "\n"; - - return $select; -} - if(file_exists(EGW_SERVER_ROOT.'/phpgwapi/setup/setup.inc.php')) { include(EGW_SERVER_ROOT.'/phpgwapi/setup/setup.inc.php'); /* To set the current core version */ diff --git a/setup/index.php b/setup/index.php index cb68b723a5..de0d9e5bcb 100644 --- a/setup/index.php +++ b/setup/index.php @@ -480,7 +480,7 @@ switch($GLOBALS['egw_info']['setup']['stage']['lang']) break; case 10: $langs_list = array(); - $languages = get_langs(); + $languages = setup_translation::get_supported_langs(); foreach ($GLOBALS['egw_info']['setup']['installed_langs'] as $key => $value) { $langs_list[] = isset($languages[$key]) ? $languages[$key]['descr'] : $value; From ba2c8a92b99ec001c6122ac2420c63bf1340b23e Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 29 Jul 2010 12:50:57 +0000 Subject: [PATCH 204/496] commiting the session, before redirecting might fix racecondition in session creation --- login.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/login.php b/login.php index 5cb49b05db..97a7aad5e2 100755 --- a/login.php +++ b/login.php @@ -359,6 +359,8 @@ else } else { + // commiting the session, before redirecting might fix racecondition in session creation + $GLOBALS['egw']->session->commit_session(); egw::redirect_link($forward,$extra_vars); } } From b4a359fc7c7cad2bb5c4266c6637f784823bf751 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 29 Jul 2010 17:03:06 +0000 Subject: [PATCH 205/496] modernising uiconfig a little bit and fixed mulitiple levels for framework for framed templates --- admin/inc/class.uiasyncservice.inc.php | 8 +- admin/inc/class.uiconfig.inc.php | 472 ++++++++++++------------- 2 files changed, 228 insertions(+), 252 deletions(-) diff --git a/admin/inc/class.uiasyncservice.inc.php b/admin/inc/class.uiasyncservice.inc.php index 40a206fd8e..bf600bec94 100644 --- a/admin/inc/class.uiasyncservice.inc.php +++ b/admin/inc/class.uiasyncservice.inc.php @@ -99,16 +99,20 @@ class uiasyncservice $config->save_repository(); unset($config); } +/* if (!$async->only_fallback) { $installed = $async->installed(); if (is_array($installed) && isset($installed['cronline'])) { +*/ $async_use['cron'] = lang('crontab only (recomended)'); +/* } } $async_use[''] = lang('fallback (after each pageview)'); $async_use['off'] = lang('disabled (not recomended)'); +*/ echo '

    '.lang('Run Asynchronous services').''. ' \n". lang("for the times below (empty values count as '*', all empty = every minute)")."

    \n"; +*/ } echo "
    \n"; diff --git a/admin/inc/class.uiconfig.inc.php b/admin/inc/class.uiconfig.inc.php index 9e958182e8..423dd866e5 100644 --- a/admin/inc/class.uiconfig.inc.php +++ b/admin/inc/class.uiconfig.inc.php @@ -1,270 +1,240 @@ * - * http://www.egroupware.org * - * -------------------------------------------- * - * 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. * - \**************************************************************************/ +/** + * eGgroupWare admin - site configuration + * + * @link http://www.egroupware.org + * @author Miles Lott + * @package admin + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ - /* $Id$ */ +/** + * Site configuration for all apps using an $app/templates/default/config.tpl + */ +class uiconfig +{ + var $public_functions = array('index' => True); - class uiconfig + function index() { - var $public_functions = array('index' => True); - - function index() + if ($GLOBALS['egw']->acl->check('site_config_access',1,'admin')) { - if ($GLOBALS['egw']->acl->check('site_config_access',1,'admin')) - { - $GLOBALS['egw']->redirect_link('/index.php'); - } - $referer = $_POST['submit'] || $_POST['cancel'] ? $_POST['referer'] : $_SERVER['HTTP_REFERER']; - if (!$referer) $referer = $GLOBALS['egw']->link('/admin/index.php'); - if ($GLOBALS['egw_info']['server']['webserver_url']) - { - list(,$show_app) = explode($GLOBALS['egw_info']['server']['webserver_url'],$referer); - } - else - { - $parts = parse_url($referer); - $show_app = $parts['path']; - unset($parts); - } - list(,$show_app) = explode('/',$show_app); - if (!$show_app) $show_app = 'admin'; + egw::redirect_link('/index.php'); + } + $referer = $_POST['submit'] || $_POST['cancel'] ? $_POST['referer'] : + common::get_referer('/admin/index.php',$_POST['referer']); + list(,$show_app) = explode('/',$referer); + if (!$show_app) $show_app = 'admin'; - // load the translations of the app we show too, so they dont need to be in admin! - if ($_GET['appname'] != 'admin') + // load the translations of the app we show too, so they dont need to be in admin! + if ($_GET['appname'] != 'admin') + { + translation::add_app($_GET['appname']); + } + + if(get_magic_quotes_gpc() && is_array($_POST['newsettings'])) + { + $_POST['newsettings'] = array_stripslashes($_POST['newsettings']); + } + + switch($_GET['appname']) + { + case 'admin': + case 'addressbook': + case 'calendar': + case 'email': + case 'nntp': + /* + Other special apps can go here for now, e.g.: + case 'bogusappname': + */ + $appname = $_GET['appname']; + $config_appname = 'phpgwapi'; + break; + case 'phpgwapi': + case '': + /* This keeps the admin from getting into what is a setup-only config */ + egw::redirect_link('/admin/index.php'); + break; + default: + $appname = $_GET['appname']; + $config_appname = $appname; + break; + } + $t =& CreateObject('phpgwapi.Template',$GLOBALS['egw']->common->get_tpl_dir($appname)); + $t->set_unknowns('keep'); + $t->set_file(array('config' => 'config.tpl')); + $t->set_block('config','header','header'); + $t->set_block('config','body','body'); + $t->set_block('config','footer','footer'); + + $c =& CreateObject('phpgwapi.config',$config_appname); + $c->read_repository(); + + if ($_POST['cancel'] || $_POST['submit'] && $GLOBALS['egw']->acl->check('site_config_access',2,'admin')) + { + egw::redirect_link($referer); + } + + if ($_POST['submit']) + { + /* Load hook file with functions to validate each config (one/none/all) */ + $GLOBALS['egw']->hooks->single('config_validate',$appname); + + foreach($_POST['newsettings'] as $key => $config) { - $GLOBALS['egw']->translation->add_app($_GET['appname']); + if ($config) + { + $c->config_data[$key] = $config; + if($GLOBALS['egw_info']['server']['found_validation_hook'] && function_exists($key)) + { + call_user_func($key,$config); + if($GLOBALS['config_error']) + { + $errors .= lang($GLOBALS['config_error']) . ' '; + $GLOBALS['config_error'] = False; + } + } + } + /* don't erase passwords, since we also don't print them */ + elseif(strpos($key,'passwd') === false && strpos($key,'password') === false && strpos($key,'root_pw') === false) + { + unset($c->config_data[$key]); + } + } + if($GLOBALS['egw_info']['server']['found_validation_hook'] && function_exists('final_validation')) + { + final_validation($_POST['newsettings']); + if($GLOBALS['config_error']) + { + $errors .= lang($GLOBALS['config_error']) . ' '; + $GLOBALS['config_error'] = False; + } + unset($GLOBALS['egw_info']['server']['found_validation_hook']); } - if(get_magic_quotes_gpc() && is_array($_POST['newsettings'])) - { - $_POST['newsettings'] = $this->array_stripslashes($_POST['newsettings']); - } + $c->save_repository(); - switch($_GET['appname']) + if(!$errors) { - case 'admin': - case 'addressbook': - case 'calendar': - case 'email': - case 'nntp': - /* - Other special apps can go here for now, e.g.: - case 'bogusappname': - */ - $appname = $_GET['appname']; - $config_appname = 'phpgwapi'; + egw::redirect_link($referer); + } + } + + if($errors) + { + $t->set_var('error',lang('Error') . ': ' . $errors); + $t->set_var('th_err','#FF8888'); + unset($errors); + unset($GLOBALS['config_error']); + } + else + { + $t->set_var('error',''); + $t->set_var('th_err',$GLOBALS['egw_info']['theme']['th_bg']); + } + // set currentapp to our calling app, to show the right sidebox-menu + $GLOBALS['egw_info']['flags']['currentapp'] = $show_app; + $GLOBALS['egw']->common->egw_header(); + echo parse_navbar(); + + $t->set_var('title',lang('Site Configuration')); + $t->set_var('action_url',$GLOBALS['egw']->link('/index.php','menuaction=admin.uiconfig.index&appname=' . $appname)); + $t->set_var('th_bg', $GLOBALS['egw_info']['theme']['th_bg']); + $t->set_var('th_text', $GLOBALS['egw_info']['theme']['th_text']); + $t->set_var('row_on', $GLOBALS['egw_info']['theme']['row_on']); + $t->set_var('row_off', $GLOBALS['egw_info']['theme']['row_off']); + $t->set_var('hidden_vars',''); + $t->pparse('out','header'); + + $vars = $t->get_undefined('body'); + + if ($GLOBALS['egw']->hooks->single('config',$appname)) // reload the config-values, they might have changed + { + $c->read_repository(); + } + foreach($vars as $value) + { + $valarray = explode('_',$value); + $type = array_shift($valarray); + $newval = implode(' ',$valarray); + + switch ($type) + { + case 'lang': + $t->set_var($value,lang($newval)); break; - case 'phpgwapi': - case '': - /* This keeps the admin from getting into what is a setup-only config */ - $GLOBALS['egw']->redirect_link('/admin/index.php'); + case 'value': + $newval = str_replace(' ','_',$newval); + /* Don't show passwords in the form */ + if(strpos($value,'passwd') !== false || strpos($value,'password') !== false || strpos($value,'root_pw') !== false) + { + $t->set_var($value,''); + } + else + { + $t->set_var($value,$c->config_data[$newval]); + } + break; + /* + case 'checked': + $newval = str_replace(' ','_',$newval); + if ($c->config_data[$newval]) + { + $t->set_var($value,' checked'); + } + else + { + $t->set_var($value,''); + } + break; + */ + case 'selected': + $configs = array(); + $config = ''; + $newvals = explode(' ',$newval); + $setting = end($newvals); + for ($i=0;$i<(count($newvals) - 1); $i++) + { + $configs[] = $newvals[$i]; + } + $config = implode('_',$configs); + /* echo $config . '=' . $c->config_data[$config]; */ + if ($c->config_data[$config] == $setting) + { + $t->set_var($value,' selected'); + } + else + { + $t->set_var($value,''); + } + break; + case 'hook': + $newval = str_replace(' ','_',$newval); + if(function_exists($newval)) + { + $t->set_var($value,$newval($c->config_data)); + } + else + { + $t->set_var($value,''); + } + break; + case 'call': // eg. call_class::method or call_app.class.method + $newval = str_replace(' ','_',$newval); + $t->set_var($value,ExecMethod($newval,$c->config_data)); break; default: - $appname = $_GET['appname']; - $config_appname = $appname; + $t->set_var($value,''); break; } - $t =& CreateObject('phpgwapi.Template',$GLOBALS['egw']->common->get_tpl_dir($appname)); - $t->set_unknowns('keep'); - $t->set_file(array('config' => 'config.tpl')); - $t->set_block('config','header','header'); - $t->set_block('config','body','body'); - $t->set_block('config','footer','footer'); - - $c =& CreateObject('phpgwapi.config',$config_appname); - $c->read_repository(); - - if ($_POST['cancel'] || $_POST['submit'] && $GLOBALS['egw']->acl->check('site_config_access',2,'admin')) - { - $GLOBALS['egw']->redirect($referer); - } - - if ($_POST['submit']) - { - /* Load hook file with functions to validate each config (one/none/all) */ - $GLOBALS['egw']->hooks->single('config_validate',$appname); - - foreach($_POST['newsettings'] as $key => $config) - { - if ($config) - { - $c->config_data[$key] = $config; - if($GLOBALS['egw_info']['server']['found_validation_hook'] && function_exists($key)) - { - call_user_func($key,$config); - if($GLOBALS['config_error']) - { - $errors .= lang($GLOBALS['config_error']) . ' '; - $GLOBALS['config_error'] = False; - } - } - } - /* don't erase passwords, since we also don't print them */ - elseif(strpos($key,'passwd') === false && strpos($key,'password') === false && strpos($key,'root_pw') === false) - { - unset($c->config_data[$key]); - } - } - if($GLOBALS['egw_info']['server']['found_validation_hook'] && function_exists('final_validation')) - { - final_validation($_POST['newsettings']); - if($GLOBALS['config_error']) - { - $errors .= lang($GLOBALS['config_error']) . ' '; - $GLOBALS['config_error'] = False; - } - unset($GLOBALS['egw_info']['server']['found_validation_hook']); - } - - $c->save_repository(); - - if(!$errors) - { - $GLOBALS['egw']->redirect($referer); - } - } - - if($errors) - { - $t->set_var('error',lang('Error') . ': ' . $errors); - $t->set_var('th_err','#FF8888'); - unset($errors); - unset($GLOBALS['config_error']); - } - else - { - $t->set_var('error',''); - $t->set_var('th_err',$GLOBALS['egw_info']['theme']['th_bg']); - } - // set currentapp to our calling app, to show the right sidebox-menu - $GLOBALS['egw_info']['flags']['currentapp'] = $show_app; - $GLOBALS['egw']->common->egw_header(); - echo parse_navbar(); - - $t->set_var('title',lang('Site Configuration')); - $t->set_var('action_url',$GLOBALS['egw']->link('/index.php','menuaction=admin.uiconfig.index&appname=' . $appname)); - $t->set_var('th_bg', $GLOBALS['egw_info']['theme']['th_bg']); - $t->set_var('th_text', $GLOBALS['egw_info']['theme']['th_text']); - $t->set_var('row_on', $GLOBALS['egw_info']['theme']['row_on']); - $t->set_var('row_off', $GLOBALS['egw_info']['theme']['row_off']); - $t->set_var('hidden_vars',''); - $t->pparse('out','header'); - - $vars = $t->get_undefined('body'); - - if ($GLOBALS['egw']->hooks->single('config',$appname)) // reload the config-values, they might have changed - { - $c->read_repository(); - } - foreach($vars as $value) - { - $valarray = explode('_',$value); - $type = array_shift($valarray); - $newval = implode(' ',$valarray); - - switch ($type) - { - case 'lang': - $t->set_var($value,lang($newval)); - break; - case 'value': - $newval = str_replace(' ','_',$newval); - /* Don't show passwords in the form */ - if(strpos($value,'passwd') !== false || strpos($value,'password') !== false || strpos($value,'root_pw') !== false) - { - $t->set_var($value,''); - } - else - { - $t->set_var($value,$c->config_data[$newval]); - } - break; - /* - case 'checked': - $newval = str_replace(' ','_',$newval); - if ($c->config_data[$newval]) - { - $t->set_var($value,' checked'); - } - else - { - $t->set_var($value,''); - } - break; - */ - case 'selected': - $configs = array(); - $config = ''; - $newvals = explode(' ',$newval); - $setting = end($newvals); - for ($i=0;$i<(count($newvals) - 1); $i++) - { - $configs[] = $newvals[$i]; - } - $config = implode('_',$configs); - /* echo $config . '=' . $c->config_data[$config]; */ - if ($c->config_data[$config] == $setting) - { - $t->set_var($value,' selected'); - } - else - { - $t->set_var($value,''); - } - break; - case 'hook': - $newval = str_replace(' ','_',$newval); - if(function_exists($newval)) - { - $t->set_var($value,$newval($c->config_data)); - } - else - { - $t->set_var($value,''); - } - break; - case 'call': // eg. call_class::method or call_app.class.method - $newval = str_replace(' ','_',$newval); - $t->set_var($value,ExecMethod($newval,$c->config_data)); - break; - default: - $t->set_var($value,''); - break; - } - } - - $t->pfp('out','body'); - - $t->set_var('lang_submit', $GLOBALS['egw']->acl->check('site_config_access',2,'admin') ? lang('Cancel') : lang('Save')); - $t->set_var('lang_cancel', lang('Cancel')); - $t->pfp('out','footer'); } - /** - * applies stripslashes recursivly on each element of an array - * - * @param array &$var - * @return array - */ - function array_stripslashes($var) - { - if (!is_array($var)) - { - return stripslashes($var); - } - foreach($var as $key => $val) - { - $var[$key] = is_array($val) ? $this->array_stripslashes($val) : stripslashes($val); - } - return $var; - } + $t->pfp('out','body'); + + $t->set_var('lang_submit', $GLOBALS['egw']->acl->check('site_config_access',2,'admin') ? lang('Cancel') : lang('Save')); + $t->set_var('lang_cancel', lang('Cancel')); + $t->pfp('out','footer'); } -?> +} From d74197bb3ab5a11ee58d739aa577827de64b99c0 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 29 Jul 2010 19:10:35 +0000 Subject: [PATCH 206/496] fixed not working link_query call to static callback eg. "someclass::somemethod" --- phpgwapi/inc/class.egw_link.inc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/phpgwapi/inc/class.egw_link.inc.php b/phpgwapi/inc/class.egw_link.inc.php index 0369ec457b..973fda4373 100644 --- a/phpgwapi/inc/class.egw_link.inc.php +++ b/phpgwapi/inc/class.egw_link.inc.php @@ -595,7 +595,7 @@ class egw_link extends solink } if(is_callable($method)) // php5.3+ call { - $result = $method($pattern,$options); + $result = call_user_func($method,$pattern,$options); } elseif(is_object($obj) && method_exists($obj,$method)) { @@ -910,7 +910,7 @@ class egw_link extends solink } else { - error_log(__METHOD__."($app,$id,$file,$comment) Can't mkdir $entry_dir!"); + error_log(__METHOD__."($app,$id,".array2string($file).",$comment) Can't mkdir $entry_dir!"); } return $Ok ? -$stat['ino'] : false; } From 52ee0ed07aab1fb784411214900abb04700d67df Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Fri, 30 Jul 2010 08:37:55 +0000 Subject: [PATCH 207/496] displaying label of link-entry widget as blur text --- etemplate/inc/class.link_widget.inc.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/etemplate/inc/class.link_widget.inc.php b/etemplate/inc/class.link_widget.inc.php index 6368dacc3e..32cb5f30ce 100644 --- a/etemplate/inc/class.link_widget.inc.php +++ b/etemplate/inc/class.link_widget.inc.php @@ -420,9 +420,11 @@ class link_widget 'no_app_sel' => !!$extension_data['app'], 'id' => is_array($value) ? $value['current'] : $id, 'query' => is_array($value) ? $value['query'] : '', - 'blur' => count($options) == 1 ? lang($app) : lang('Search'), + 'blur' => $cell['label'] ? $cell['label'] : + (count($options) == 1 ? lang($app) : lang('Search')), 'extra' => $cell['onchange'] ? ','.self::AJAX_NEED_ONCHANGE : null, // store flang for ajax_search, to display extra_line required by onchange ); + $cell['label'] = ''; // displayed as blur text if ($options) // limit the app-selectbox to the given apps { From 701109fef9002d90bafbaaefb4797bafaf419fee Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Fri, 30 Jul 2010 10:20:48 +0000 Subject: [PATCH 208/496] improve the handling of overlong words, fix a bug regarding the check of infolog_status existing in known status for the type selected --- infolog/inc/class.infolog_ui.inc.php | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/infolog/inc/class.infolog_ui.inc.php b/infolog/inc/class.infolog_ui.inc.php index d9f081c740..6fcf638514 100644 --- a/infolog/inc/class.infolog_ui.inc.php +++ b/infolog/inc/class.infolog_ui.inc.php @@ -1013,7 +1013,7 @@ class infolog_ui if ($content['js']) $content['js'] = ''; } // on a type-change, set the status to the default status of that type, if the actual status is not supported by the new type - if (!in_array($content['info_status'],$this->bo->status[$content['info_type']])) + if (!array_key_exists($content['info_status'],$this->bo->status[$content['info_type']])) { $content['info_status'] = $this->bo->status['defaults'][$content['info_type']]; if ($content['info_status'] != 'done') $content['info_datecompleted'] = ''; @@ -1041,14 +1041,21 @@ class infolog_ui { continue; } - foreach(array(',' => ', ', '.' => '. ') as $pattern => $replace) // set blank behind all , and . + $cont = split(' ', $content[$key]); + $ckarray = array(); + foreach($cont as &$word) { - if(strpos($content[$key], $replace) === false) + // set blank behind all , and . if words are too long, apply wordwrap afterwards to make sure we get + if (strlen($word)>75) { - $content[$key] = str_replace($pattern, $replace, $content[$key]); + if (!(strpos($word,',')===false) && strpos($word,', ')===false) $word = str_replace(',',', ',$word); + if (!(strpos($word,'.')===false) && strpos($word,'. ')===false) $word = str_replace('.','. ',$word); + $word = wordwrap($word, 75, ' ', true); } + $ckarray[] =$word; } - $content[$key] = wordwrap($content[$key], 75, ' ', true); + $content[$key] = join(' ',$ckarray); + unset($ckarray); } if (is_numeric($_REQUEST['cat_id'])) { From 9432e8b73af47ef248c8089855f893517fb6146e Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Fri, 30 Jul 2010 14:02:42 +0000 Subject: [PATCH 209/496] forgot to translate the label --- etemplate/inc/class.link_widget.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/etemplate/inc/class.link_widget.inc.php b/etemplate/inc/class.link_widget.inc.php index 32cb5f30ce..726040b406 100644 --- a/etemplate/inc/class.link_widget.inc.php +++ b/etemplate/inc/class.link_widget.inc.php @@ -420,7 +420,7 @@ class link_widget 'no_app_sel' => !!$extension_data['app'], 'id' => is_array($value) ? $value['current'] : $id, 'query' => is_array($value) ? $value['query'] : '', - 'blur' => $cell['label'] ? $cell['label'] : + 'blur' => $cell['label'] ? lang($cell['label']) : (count($options) == 1 ? lang($app) : lang('Search')), 'extra' => $cell['onchange'] ? ','.self::AJAX_NEED_ONCHANGE : null, // store flang for ajax_search, to display extra_line required by onchange ); From 39d1c6351705ebfebe7af2f1596e02d1b82ac7ed Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Fri, 30 Jul 2010 15:28:17 +0000 Subject: [PATCH 210/496] display readonly link-entry widgets as links to the linked entry --- etemplate/inc/class.link_widget.inc.php | 56 ++++++++++++++++++------- 1 file changed, 40 insertions(+), 16 deletions(-) diff --git a/etemplate/inc/class.link_widget.inc.php b/etemplate/inc/class.link_widget.inc.php index 726040b406..7d46c2d415 100644 --- a/etemplate/inc/class.link_widget.inc.php +++ b/etemplate/inc/class.link_widget.inc.php @@ -219,22 +219,7 @@ class link_widget { foreach ($value as $link) { - $options .= " onMouseOver=\"self.status='".addslashes(html::htmlspecialchars($help))."'; return true;\""; - $options .= " onMouseOut=\"self.status=''; return true;\""; - - if (($popup = egw_link::is_popup($link['app'],'view'))) - { - list($w,$h) = explode('x',$popup); - $options = ' onclick="window.open(this,this.target,\'width='.(int)$w.',height='.(int)$h.',location=no,menubar=no,toolbar=no,scrollbars=yes,status=yes\'); return false;"'; - } - elseif (etemplate::$request->output_mode == 2 || // we are in a popup - $link['app'] == egw_link::VFS_APPNAME) // or it's a link to an attachment - { - $options = ' target="_blank"'; - } - $str .= ($str !== '' ? ', ' : '') . html::a_href( - html::htmlspecialchars(egw_link::title($link['app'],$link['id'])), - egw_link::view($link['app'],$link['id'],$link),'',$options); + $str .= ($str !== '' ? ', ' : '') . self::link2a_href($link,$help); } } $cell['type'] = 'html'; @@ -341,6 +326,15 @@ class link_widget break; case 'link-entry': + if ($cell['readonly'] || $readonlys) + { + if(!is_array($value)) $value = array('app' => $cell['size'],'id' => $value); + $value = self::link2a_href($value,$help); + $cell['type'] = 'html'; + $cell['readonly'] = true; + $extension_data = null; + return true; + } $GLOBALS['egw_info']['flags']['include_xajax'] = true; $tpl = new etemplate('etemplate.link_widget.entry'); $options = $cell['size'] ? explode(',',$cell['size']) : array(); @@ -470,6 +464,36 @@ class link_widget return True; // extra Label is ok } + /** + * return a_href to view a linked entry + * + * @param array $link array with values for keys 'id' and 'app' + * @param string $help='' + * @return string + */ + static function link2a_href(array $link,$help='') + { + if (($popup = egw_link::is_popup($link['app'],'view'))) + { + list($w,$h) = explode('x',$popup); + $options = ' onclick="window.open(this,this.target,\'width='.(int)$w.',height='.(int)$h.',location=no,menubar=no,toolbar=no,scrollbars=yes,status=yes\'); return false;"'; + } + elseif (etemplate::$request->output_mode == 2 || // we are in a popup + $link['app'] == egw_link::VFS_APPNAME || // or it's a link to an attachment + ($target = egw_link::get_registry($link['app'],'view_target'))) // or explicit target set + { + $options = ' target="'.($target ? $target : '_blank').'"'; + } + if ($help) + { + $options .= " onMouseOver=\"self.status='".addslashes(html::htmlspecialchars($help))."'; return true;\""; + $options .= " onMouseOut=\"self.status=''; return true;\""; + } + return html::a_href( + html::htmlspecialchars(egw_link::title($link['app'],$link['id'])), + egw_link::view($link['app'],$link['id'],$link),'',$options); + } + /** * postprocessing method, called after the submission of the form * From b01231a5cf6e8427c3d1f574539f29cf1516015f Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Fri, 30 Jul 2010 15:32:48 +0000 Subject: [PATCH 211/496] allow to optional specify a database object (to access addressbooks in other databases) --- addressbook/inc/class.addressbook_bo.inc.php | 13 ++++++++++--- addressbook/inc/class.addressbook_so.inc.php | 16 +++++++++++----- addressbook/inc/class.addressbook_sql.inc.php | 12 +++++++++--- 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/addressbook/inc/class.addressbook_bo.inc.php b/addressbook/inc/class.addressbook_bo.inc.php index a91c199aa8..7be00f21d6 100755 --- a/addressbook/inc/class.addressbook_bo.inc.php +++ b/addressbook/inc/class.addressbook_bo.inc.php @@ -7,7 +7,7 @@ * @author Ralf Becker * @author Joerg Lehrke * @package addressbook - * @copyright (c) 2005-8 by Ralf Becker + * @copyright (c) 2005-10 by Ralf Becker * @copyright (c) 2005/6 by Cornelius Weiss * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License * @version $Id$ @@ -144,9 +144,15 @@ class addressbook_bo extends addressbook_so */ protected $delete_history = ''; - function __construct($contact_app='addressbook') + /** + * Constructor + * + * @param string $contact_app='addressbook' used for acl->get_grants() + * @param egw_db $db=null + */ + function __construct($contact_app='addressbook',egw_db $db=null) { - parent::__construct($contact_app); + parent::__construct($contact_app,$db); if ($this->log) { $this->logfile = $GLOBALS['egw_info']['server']['temp_dir'].'/log-addressbook_bo'; @@ -1207,6 +1213,7 @@ class addressbook_bo extends addressbook_so if($options['start'] || $options['num_rows']) { $limit = array($options['start'], $options['num_rows']); } + $filter = (array)$options['filter']; if ($GLOBALS['egw_info']['user']['preferences']['addressbook']['hide_accounts']) $filter['account_id'] = null; if (($contacts = parent::search($criteria,false,'org_name,n_family,n_given,cat_id','','%',false,'OR', $limit, $filter))) { diff --git a/addressbook/inc/class.addressbook_so.inc.php b/addressbook/inc/class.addressbook_so.inc.php index d76d1fff02..60223ea617 100755 --- a/addressbook/inc/class.addressbook_so.inc.php +++ b/addressbook/inc/class.addressbook_so.inc.php @@ -6,7 +6,7 @@ * @author Cornelius Weiss * @author Ralf Becker * @package addressbook - * @copyright (c) 2005-8 by Ralf Becker + * @copyright (c) 2005-10 by Ralf Becker * @copyright (c) 2005/6 by Cornelius Weiss * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License * @version $Id$ @@ -205,9 +205,15 @@ class addressbook_so var $sodistrib_list; var $backend; - function __construct($contact_app='addressbook') + /** + * Constructor + * + * @param string $contact_app='addressbook' used for acl->get_grants() + * @param egw_db $db=null + */ + function __construct($contact_app='addressbook',egw_db $db=null) { - $this->db = $GLOBALS['egw']->db; + $this->db = is_null($db) ? $GLOBALS['egw']->db : $db; $this->user = $GLOBALS['egw_info']['user']['account_id']; $this->memberships = $GLOBALS['egw']->accounts->memberships($this->user,true); @@ -244,7 +250,7 @@ class addressbook_so { $this->contact_repository = 'sql-ldap'; } - $this->somain = new addressbook_sql(); + $this->somain = new addressbook_sql($db); if ($this->user) // not set eg. in setup { @@ -303,7 +309,7 @@ class addressbook_so } else { - $this->soextra = new addressbook_sql(); + $this->soextra = new addressbook_sql($db); } $this->customfields = config::get_customfields('addressbook'); diff --git a/addressbook/inc/class.addressbook_sql.inc.php b/addressbook/inc/class.addressbook_sql.inc.php index 56d8840235..4a8cb91622 100644 --- a/addressbook/inc/class.addressbook_sql.inc.php +++ b/addressbook/inc/class.addressbook_sql.inc.php @@ -5,7 +5,7 @@ * @link http://www.egroupware.org * @author Ralf Becker * @package addressbook - * @copyright (c) 2006-8 by Ralf Becker + * @copyright (c) 2006-10 by Ralf Becker * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License * @version $Id$ */ @@ -54,9 +54,15 @@ class addressbook_sql extends so_sql_cf */ var $ab2list_table = 'egw_addressbook2list'; - function __construct() + /** + * Constructor + * + * @param egw_db $db=null + */ + function __construct(egw_db $db=null) { - parent::__construct('phpgwapi','egw_addressbook','egw_addressbook_extra','contact_'); + parent::__construct('phpgwapi','egw_addressbook','egw_addressbook_extra','contact_', + $extra_key='_name',$extra_value='_value',$extra_id='_id',$db); // Get custom fields from addressbook instead of phpgwapi $this->customfields = config::get_customfields('addressbook'); From 316858bab380ad5d503e251babb07bb4ba546469 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Sat, 31 Jul 2010 09:24:13 +0000 Subject: [PATCH 212/496] new parameter $make_db_name_unique to append a decrementing numeric postfix to db_name and db_user, if db already exists --- setup/inc/class.setup_cmd_database.inc.php | 54 ++++++++++++++++++++-- 1 file changed, 49 insertions(+), 5 deletions(-) diff --git a/setup/inc/class.setup_cmd_database.inc.php b/setup/inc/class.setup_cmd_database.inc.php index 87f031e19e..cb580b57c2 100644 --- a/setup/inc/class.setup_cmd_database.inc.php +++ b/setup/inc/class.setup_cmd_database.inc.php @@ -19,6 +19,13 @@ class setup_cmd_database extends setup_cmd * Allow to run this command via setup-cli */ const SETUP_CLI_CALLABLE = true; + + /** + * Maximum length of database name (at least for MySQL this is the limit) + * + * @var int + */ + const MAX_DB_NAME_LEN = 16; /** * Instance of egw_db to connect or create the db @@ -41,9 +48,11 @@ class setup_cmd_database extends setup_cmd * @param string $db_root_pw=null * @param string $sub_command='create_db' 'create_db', 'test_db', 'test_db_root' * @param string $db_grant_host='localhost' host/ip of webserver for grant + * @param boolean $make_db_name_unique=false true: if create fails because db exists, + * try creating a unique name by shortening the name and adding a number to it */ function __construct($domain,$db_type=null,$db_host=null,$db_port=null,$db_name=null,$db_user=null,$db_pass=null, - $db_root=null,$db_root_pw=null,$sub_command='create_db',$db_grant_host='localhost') + $db_root=null,$db_root_pw=null,$sub_command='create_db',$db_grant_host='localhost',$make_db_name_unique=false) { if (!is_array($domain)) { @@ -59,9 +68,10 @@ class setup_cmd_database extends setup_cmd 'db_root_pw' => $db_root_pw, 'sub_command' => $sub_command, 'db_grant_host' => $db_grant_host, + 'make_db_name_unique' => $make_db_name_unique, ); } - //echo __CLASS__.'::__construct()'; _debug_array($domain); + //error_log(__METHOD__.'('.array2string($domain).") make_db_name_unique=".array2string($domain['make_db_name_unique'])); admin_cmd::__construct($domain); } @@ -153,12 +163,17 @@ class setup_cmd_database extends setup_cmd * Check and if does not yet exist create the new database and user * * The check will fail if the database exists, but already contains tables + * + * if $this->make_db_name_unique is set, a decrementing nummeric prefix gets + * added to $this->db_name AND $this->db_user, if db already exists. * * @return string with success message * @throws egw_exception_wrong_userinput */ private function create() { + static $try_make_unique = 0; // to limit trials to create a unique name + try { $msg = $this->connect(); } @@ -168,9 +183,36 @@ class setup_cmd_database extends setup_cmd $this->test_db->create_database($this->db_root,$this->db_root_pw,$this->db_charset,$this->db_grant_host); $this->connect(); } - catch(egw_exception_wrong_userinput $e) { - // try connect as root to check if that's the problem + catch(egw_exception_db $e) { // catches failed to create database + // try connect as root to check if wrong root/root_pw is the problem $this->connect($this->db_root,$this->db_root_pw,$this->db_meta); + + // if we should create a db with a unique name (try it only N times, not endless!) + if ($this->make_db_name_unique && $try_make_unique++ < 20) + { + // check if we can connect as root to the db to create --> db exists already + try { + $this->connect($this->db_root,$this->db_root_pw); + // create new db_name by incrementing an existing numeric postfix + if (preg_match('/([0-9]+)$/',$this->db_name,$matches)) + { + $num = (string)(++$matches[1]); + } + else // or adding one starting with 2 + { + $num = '2'; + } + $this->set_defaults['db_name'] = $this->db_name = + $this->set_defaults['db_user'] = $this->db_user = // change user too (otherwise existing user/db could not connect any more!) + substr($this->db_name,0,self::MAX_DB_NAME_LEN-strlen($num)).$num; + + return $this->create(); + } + catch (egw_exception_wrong_userinput $e2) + { + // we can NOT connect to db as root --> ignore exception to give general error + } + } // if not give general error throw new egw_exception_wrong_userinput(lang('Can not create %1 database %2 on %3 for user %4!', $this->db_type,$this->db_name,$this->db_host.($this->db_port?':'.$this->db_port:''),$this->db_user)); @@ -263,7 +305,9 @@ class setup_cmd_database extends setup_cmd if (strpos($this->$name,'$domain') !== false) { // limit names to 16 chars (16 char is user-name limit in MySQL) - $this->set_defaults[$name] = $this->$name = substr(str_replace(array('$domain','.','-'),array($this->domain,'_','_'),$this->$name),0,16); + $this->set_defaults[$name] = $this->$name = + substr(str_replace(array('$domain','.','-'),array($this->domain,'_','_'),$this->$name), + 0,self::MAX_DB_NAME_LEN); } } } From 8740eab224631802c4ab1ae69b616807d3a60534 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Sun, 1 Aug 2010 21:04:04 +0000 Subject: [PATCH 213/496] some improvments for easier extention of the contact form --- .../inc/class.addressbook_contactform.inc.php | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/addressbook/inc/class.addressbook_contactform.inc.php b/addressbook/inc/class.addressbook_contactform.inc.php index 09d7ea4440..36106b7f00 100644 --- a/addressbook/inc/class.addressbook_contactform.inc.php +++ b/addressbook/inc/class.addressbook_contactform.inc.php @@ -16,6 +16,13 @@ */ class addressbook_contactform { + /** + * Callback as variable for easier extending + * + * @var string + */ + var $callback = 'addressbook.addressbook_contactform.display'; + /** * Shows the contactform and stores the submitted data * @@ -29,7 +36,7 @@ class addressbook_contactform * @param string $copytoreceiver=false send a copy of notification to receiver * @return string html content */ - function display($content=null,$addressbook=null,$fields=null,$msg=null,$email=null,$tpl_name=null,$subject=null,$copytoreceiver=false) + function display(array &$content=null,$addressbook=null,$fields=null,$msg=null,$email=null,$tpl_name=null,$subject=null,$copytoreceiver=false,$sel_options=array()) { #error_log( "

    addressbook_contactform::display(".print_r($content,true).",$addressbook,".print_r($fields,true).",$msg,$tpl_name)

    \n"); if (empty($tpl_name) && !empty($content['tpl_form_name'])) $tpl_name =$content['tpl_form_name']; @@ -53,6 +60,7 @@ class addressbook_contactform $contact = new addressbook_bo(); if ($content['owner']) // save the contact in the addressbook { + $content['private'] = 0; // in case default_private is set if (($id = $contact->save($content))) { // check for fileuploads and attach the found files @@ -70,7 +78,7 @@ class addressbook_contactform } } - return '

    '.$content['msg'].'

    '; + return '

    '.($msg ? $msg : $content['msg']).'

    '; } else { @@ -110,7 +118,7 @@ class addressbook_contactform $custom = 1; foreach($fields as $name) { - if ($name{0} == '#') // custom field + if ($name[0] == '#') // custom field { static $contact; if (is_null($contact)) @@ -135,15 +143,17 @@ class addressbook_contactform } } $preserv['start_time'] = time(); + $content['lang'] = $GLOBALS['egw_info']['user']['preferences']['common']['lang']; } - if (is_array($content) && $submitted == 'truebutfalse') { + elseif ($submitted == 'truebutfalse') + { $preserv['tpl_form_name'] = $tpl_name; unset($content['submitit']); $custom = 1; // fieldnames are "defined" by the commit attempt, that way, we do not have to remember them foreach($content as $name => $value) { $preserv[$name]=$value; - if ($name{0} == '#') // custom field + if ($name[0] == '#') // custom field { static $contact; if (is_null($contact)) $contact = new addressbook_bo(); @@ -184,6 +194,6 @@ class addressbook_contactform $content['captcha_task'] = sprintf('%d - %d =',$num1,$num2); $preserv['captcha_result'] = $num1-$num2; } - return $tpl->exec('addressbook.addressbook_contactform.display',$content,$sel_options,$readonlys,$preserv); + return $tpl->exec($this->callback,$content,$sel_options,$readonlys,$preserv); } } From e871666adf5c812a8b6e8b4f176d77d3ea8ac7de Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Mon, 2 Aug 2010 14:15:46 +0000 Subject: [PATCH 214/496] fixed not working notifications for types: - responses: on participant responses too (everytime) - modifications: on all modification, but responses --- calendar/inc/class.calendar_boupdate.inc.php | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/calendar/inc/class.calendar_boupdate.inc.php b/calendar/inc/class.calendar_boupdate.inc.php index a6525236b1..15b6901709 100644 --- a/calendar/inc/class.calendar_boupdate.inc.php +++ b/calendar/inc/class.calendar_boupdate.inc.php @@ -364,7 +364,6 @@ class calendar_boupdate extends calendar_bo else // update existing event { $this->check4update($event,$old_event); - } // notify the link-class about the update, as other apps may be subscribt to it egw_link::notify_update('calendar',$cal_id,$event); @@ -434,9 +433,11 @@ class calendar_boupdate extends calendar_bo * * @param array $new_event the updated event * @param array $old_event the event before the update + * @todo check if there is a real change, not assume every save is a change */ function check4update($new_event,$old_event) { + //error_log(__METHOD__."($new_event[title])"); $modified = $added = $deleted = array(); //echo "

    calendar_boupdate::check4update() new participants = ".print_r($new_event['participants'],true).", old participants =".print_r($old_event['participants'],true)."

    \n"; @@ -504,12 +505,9 @@ class calendar_boupdate extends calendar_bo switch($ru = $part_prefs['calendar']['receive_updates']) { case 'responses': - if ($msg_is_response) - { - ++$want_update; - } + ++$want_update; case 'modifications': - if ($msg_type == MSG_MODIFIED) + if (!$msg_is_response) { ++$want_update; } @@ -532,7 +530,7 @@ class calendar_boupdate extends calendar_bo case 'no': break; } - //echo "

    calendar_boupdate::update_requested(user=$userid,pref=".$part_prefs['calendar']['receive_updates'] .",msg_type=$msg_type,".($old_event?$old_event['title']:'False').",".($old_event?$old_event['title']:'False').") = $want_update

    \n"; + //error_log(__METHOD__."(userid=$userid,,msg_type=$msg_type,...) msg_is_response=$msg_is_response, want_update=$want_update"); return $want_update > 0; } @@ -548,7 +546,7 @@ class calendar_boupdate extends calendar_bo */ function send_update($msg_type,$to_notify,$old_event,$new_event=null,$user=0) { - //echo "

    ".__METHOD__."($msg_type,".array2string($to_notify).",,$new_event[title],$user)

    \n"; + //error_log(__METHOD__."($msg_type,".array2string($to_notify).",...)"); if (!is_array($to_notify)) { $to_notify = array(); From 42093a106e47e501b437be821d6e13725053fbc2 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 5 Aug 2010 09:11:08 +0000 Subject: [PATCH 215/496] fixed wrong english translation: E-Mail --> Email --- phpgwapi/lang/egw_en.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/phpgwapi/lang/egw_en.lang b/phpgwapi/lang/egw_en.lang index 743e16804d..f96f32ce61 100644 --- a/phpgwapi/lang/egw_en.lang +++ b/phpgwapi/lang/egw_en.lang @@ -227,7 +227,7 @@ egroupware api version common en eGroupWare API version egroupware: login blocked for user '%1', ip %2 common en eGroupWare: login blocked for user '%1', IP %2 egypt common en EGYPT el salvador common en EL SALVADOR -email common en E-Mail +email common en Email email-address of the user, eg. "%1" common en email-address of the user, eg. "%1" enabled common en Enabled end date common en End date From ab443621be63b311f7a8ac8f8b25f424890995bd Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 5 Aug 2010 15:36:49 +0000 Subject: [PATCH 216/496] set span & class from original cell for single fields --- etemplate/inc/class.customfields_widget.inc.php | 1 + 1 file changed, 1 insertion(+) diff --git a/etemplate/inc/class.customfields_widget.inc.php b/etemplate/inc/class.customfields_widget.inc.php index 5a034d0ddc..996f89600a 100644 --- a/etemplate/inc/class.customfields_widget.inc.php +++ b/etemplate/inc/class.customfields_widget.inc.php @@ -436,6 +436,7 @@ class customfields_widget } if ($singlefield) // a single field, can & need to be returned instead of the cell (no grid) { + $input['span'] = $cell['span']; // set span & class from original cell $cell = $input; if ($type == 'customfields') $cell['label'] = $field['label']; $value = $value[$this->prefix.$lname]; From 9a0d77469fb544e6a859c0137b115ef7c2435e75 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 5 Aug 2010 17:39:03 +0000 Subject: [PATCH 217/496] improved performance by not checking exceptions for referencing a master which mentions them as exceptions --- calendar/inc/class.calendar_groupdav.inc.php | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/calendar/inc/class.calendar_groupdav.inc.php b/calendar/inc/class.calendar_groupdav.inc.php index 8dfa25a479..4ef0a37bfc 100644 --- a/calendar/inc/class.calendar_groupdav.inc.php +++ b/calendar/inc/class.calendar_groupdav.inc.php @@ -164,8 +164,9 @@ class calendar_groupdav extends groupdav_handler /* disabling not working iterator function propfind_callback($path,array $filter,$start=false) { - if ($this->debug) $starttime = microtime(true); */ + if ($this->debug) $starttime = microtime(true); + $calendar_data = $filter['calendar_data']; unset($filter['calendar_data']); /* disabling not working iterator @@ -184,10 +185,7 @@ error_log(__METHOD__."($path,,".array2string($start).") filter=".array2string($f // get all max user modified times at once foreach($events as $k => $event) { - if ($this->client_shared_uid_exceptions && - $event['reference'] && - ($master = $this->bo->read($event['reference'], 0, false, 'server')) && - array_search($event['recurrence'], $master['recur_exception']) !== false) + if ($this->client_shared_uid_exceptions && $event['reference']) { // this exception will be handled with the series master unset($events[$k]); @@ -232,7 +230,7 @@ error_log(__METHOD__."($path,,".array2string($start).") filter=".array2string($f if ($this->debug) { error_log(__METHOD__."($path) took ".(microtime(true) - $starttime). - ' to return '.count($files).' items'); + ' to return '.count($files['files']).' items'); } /* disabling not working iterator return $files; From e7c292d683b73d986e8a247b9dd57bab1de3d50d Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 5 Aug 2010 17:58:25 +0000 Subject: [PATCH 218/496] using created and modified timestamps from calendar, and not reading them separate from egw_content_history table --- calendar/inc/class.calendar_ical.inc.php | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/calendar/inc/class.calendar_ical.inc.php b/calendar/inc/class.calendar_ical.inc.php index 3dcba248a3..61930733f4 100644 --- a/calendar/inc/class.calendar_ical.inc.php +++ b/calendar/inc/class.calendar_ical.inc.php @@ -846,17 +846,13 @@ class calendar_ical extends calendar_boupdate } } - $modified = $GLOBALS['egw']->contenthistory->getTSforAction('calendar',$event['id'],'modify'); - $created = $GLOBALS['egw']->contenthistory->getTSforAction('calendar',$event['id'],'add'); - if (!$created && !$modified) $created = $event['modified']; - if ($created) + if ($event['created'] || $event['modified']) { - $attributes['CREATED'] = $created; + $attributes['CREATED'] = $event['created'] ? $event['created'] : $event['modified']; } - if (!$modified) $modified = $event['modified']; - if ($modified) + if ($event['modified']) { - $attributes['LAST-MODIFIED'] = $modified; + $attributes['LAST-MODIFIED'] = $event['modified']; } $attributes['DTSTAMP'] = time(); foreach ((array)$event['alarm'] as $alarmID => $alarmData) From 68cf0235e293f6807102244a14882e5f8fdd67f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Lehrke?= Date: Fri, 6 Aug 2010 18:13:44 +0000 Subject: [PATCH 219/496] Improve support of BB Funambol Client --- phpgwapi/inc/horde/Horde/SyncML/State.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/phpgwapi/inc/horde/Horde/SyncML/State.php b/phpgwapi/inc/horde/Horde/SyncML/State.php index 735830b9fa..865265d37e 100644 --- a/phpgwapi/inc/horde/Horde/SyncML/State.php +++ b/phpgwapi/inc/horde/Horde/SyncML/State.php @@ -885,17 +885,21 @@ class Horde_SyncML_State { $_type = str_replace('./','',$type); switch (strtolower($_type)) { case 'contacts': + case 'contact': case 'card': return 'text/vcard'; break; case 'notes': + case 'note': return 'text/x-vnote'; break; case 'calendar': case 'events': + case 'event': case 'tasks': + case 'task': case 'jobs': case 'caltasks': return 'text/calendar'; @@ -933,17 +937,21 @@ class Horde_SyncML_State { switch(strtolower($_type)) { case 'contacts': + case 'contact': case 'card': return 'contacts'; case 'notes': + case 'note': return 'notes'; case 'tasks': + case 'task': case 'jobs': return 'tasks'; case 'events': + case 'event': case 'calendar': return 'calendar'; From ed79fca4362d0b895d4947b01bcdd0b7d4fcf268 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Lehrke?= Date: Fri, 6 Aug 2010 20:50:56 +0000 Subject: [PATCH 220/496] Fix old format vCard/vCalendar quoting issue --- phpgwapi/inc/horde/Horde/iCalendar.php | 455 +++++++++++++------------ 1 file changed, 230 insertions(+), 225 deletions(-) diff --git a/phpgwapi/inc/horde/Horde/iCalendar.php b/phpgwapi/inc/horde/Horde/iCalendar.php index f21648aa9e..73e3dea5ad 100644 --- a/phpgwapi/inc/horde/Horde/iCalendar.php +++ b/phpgwapi/inc/horde/Horde/iCalendar.php @@ -650,233 +650,238 @@ class Horde_iCalendar { } // Charset and encoding handling. - if (isset($params['QUOTED-PRINTABLE'])) { - $params['ENCODING'] = 'QUOTED-PRINTABLE'; - } - if (isset($params['BASE64'])) { - $params['ENCODING'] = 'BASE64'; - } - if (isset($params['ENCODING'])) { - switch (String::upper($params['ENCODING'])) { - case 'Q': - case 'QUOTED-PRINTABLE': - $value = quoted_printable_decode($value); - if (isset($params['CHARSET'])) { - $value = $GLOBALS['egw']->translation->convert($value, $params['CHARSET']); - } else { - $value = $GLOBALS['egw']->translation->convert($value, - empty($charset) ? ($this->isOldFormat() ? 'iso-8859-1' : 'utf-8') : $charset); - } - // Funambol hack :-( - $value = str_replace('\\\\n', "\n", $value); - break; - case 'B': - case 'BASE64': - $value = base64_decode($value); - break; - } - } elseif (isset($params['CHARSET'])) { - $value = $GLOBALS['egw']->translation->convert($value, $params['CHARSET']); - } else { - // As per RFC 2279, assume UTF8 if we don't have an - // explicit charset parameter. - $value = $GLOBALS['egw']->translation->convert($value, - empty($charset) ? ($this->isOldFormat() ? 'iso-8859-1' : 'utf-8') : $charset); - } - - // Get timezone info for date fields from $params. - $tzid = isset($params['TZID']) ? trim($params['TZID'], '\"') : false; - - switch ($tag) { - case 'VERSION': // already processed - break; - // Date fields. - case 'COMPLETED': - case 'CREATED': - case 'LAST-MODIFIED': - $this->setAttribute($tag, $this->_parseDateTime($value, $tzid), $params); - break; - - case 'BDAY': - case 'X-SYNCJE-ANNIVERSARY': - $this->setAttribute($tag, $value, $params, true, $this->_parseDate($value)); - break; - - case 'DTEND': - case 'DTSTART': - case 'DTSTAMP': - case 'DUE': - case 'AALARM': - case 'DALARM': - case 'RECURRENCE-ID': - case 'X-RECURRENCE-ID': - // types like AALARM may contain additional data after a ; - // ignore these. - $ts = explode(';', $value); - if (isset($params['VALUE']) && $params['VALUE'] == 'DATE') { - $isDate = true; - $this->setAttribute($tag, $this->_parseDateTime($ts[0], $tzid), $params, true, $this->_parseDate($ts[0])); - } else { - $this->setAttribute($tag, $this->_parseDateTime($ts[0], $tzid), $params); - } - break; - - case 'TRIGGER': - if (isset($params['VALUE'])) { - if ($params['VALUE'] == 'DATE-TIME') { - $this->setAttribute($tag, $this->_parseDateTime($value, $tzid), $params); - } else { - $this->setAttribute($tag, $this->_parseDuration($value), $params); - } - } else { - $this->setAttribute($tag, $this->_parseDuration($value), $params); - } - break; - - // Comma or semicolon seperated dates. - case 'EXDATE': - case 'RDATE': - $dates = array(); - preg_match_all('/[;,]([^;,]*)/', ';' . $value, $values); - - foreach ($values[1] as $value) { - if ((isset($params['VALUE']) - && $params['VALUE'] == 'DATE') || (!isset($params['VALUE']) && $isDate)) { - $dates[] = $this->_parseDate(trim($value)); - } else { - $dates[] = $this->_parseDateTime(trim($value), $tzid); - } - } - $this->setAttribute($tag, isset($dates[0]) ? $dates[0] : null, $params, true, $dates); - break; - - // Duration fields. - case 'DURATION': - $this->setAttribute($tag, $this->_parseDuration($value), $params); - break; - - // Period of time fields. - case 'FREEBUSY': - $periods = array(); - preg_match_all('/,([^,]*)/', ',' . $value, $values); - foreach ($values[1] as $value) { - $periods[] = $this->_parsePeriod($value); - } - - $this->setAttribute($tag, isset($periods[0]) ? $periods[0] : null, $params, true, $periods); - break; - - // UTC offset fields. - case 'TZOFFSETFROM': - case 'TZOFFSETTO': - $this->setAttribute($tag, $this->_parseUtcOffset($value), $params); - break; - - // Integer fields. - case 'PERCENT-COMPLETE': - case 'PRIORITY': - case 'REPEAT': - case 'SEQUENCE': - $this->setAttribute($tag, intval($value), $params); - break; - - // Geo fields. - case 'GEO': - if ($this->isOldFormat()) { - $floats = explode(',', $value); - $value = array('latitude' => floatval($floats[1]), - 'longitude' => floatval($floats[0])); - } else { - $floats = explode(';', $value); - $value = array('latitude' => floatval($floats[0]), - 'longitude' => floatval($floats[1])); - } - $this->setAttribute($tag, $value, $params); - break; - - // Recursion fields. # add more flexibility - #case 'EXRULE': - #case 'RRULE': - # $this->setAttribute($tag, trim($value), $params); - # break; - - // Binary fields. - case 'PHOTO': - $this->setAttribute($tag, $value, $params); - break; - - // ADR, ORG and N are lists seperated by unescaped semicolons - // with a specific number of slots. - case 'ADR': - case 'N': - case 'ORG': - $value = trim($value); - // As of rfc 2426 2.4.2 semicolon, comma, and colon must - // be escaped (comma is unescaped after splitting below). - $value = str_replace(array('\\n', '\\N', '\\;', '\\:'), - array("\n", "\n", ';', ':'), - $value); - - // Split by unescaped semicolons: - $values = preg_split('/(?setAttribute($tag, trim($value), $params, true, $values); - break; - - // CATEGORIES is a lists seperated by unescaped commas - // with a unspecific number of slots. - case 'CATEGORIES': - $value = trim($value); - // As of rfc 2426 2.4.2 semicolon, comma, and colon must - // be escaped (semicolon is unescaped after splitting below). - $value = str_replace(array('\\n', '\\N', '\\,', '\\:'), - array("\n", "\n", ',', ':'), - $value); - - // Split by unescaped commas: - $values = preg_split('/(?setAttribute($tag, trim($value), $params, true, $values); - break; - - // String fields. - default: - if ($this->isOldFormat()) { - // vCalendar 1.0 and vCard 2.1 only escape semicolons - // and use unescaped semicolons to create lists. - $value = trim($value); - // Split by unescaped semicolons: - $values = preg_split('/(?setAttribute($tag, trim($value), $params, true, $values); - } else { - $value = trim($value); - // As of rfc 2426 2.4.2 semicolon, comma, and colon - // must be escaped (comma is unescaped after splitting - // below). - $value = str_replace(array('\\n', '\\N', '\\;', '\\:', '\\\\'), - array("\n", "\n", ';', ':', '\\'), - $value); - - // Split by unescaped commas. - $values = preg_split('/(?setAttribute($tag, trim($value), $params, true, $values); - } - break; - } + if (isset($params['QUOTED-PRINTABLE'])) { + $params['ENCODING'] = 'QUOTED-PRINTABLE'; + } + if (isset($params['BASE64'])) { + $params['ENCODING'] = 'BASE64'; + } + if (isset($params['ENCODING'])) { + switch (String::upper($params['ENCODING'])) { + case 'Q': + case 'QUOTED-PRINTABLE': + $value = quoted_printable_decode($value); + if (isset($params['CHARSET'])) { + $value = $GLOBALS['egw']->translation->convert($value, $params['CHARSET']); + } else { + $value = $GLOBALS['egw']->translation->convert($value, + empty($charset) ? ($this->isOldFormat() ? 'iso-8859-1' : 'utf-8') : $charset); + } + // Funambol hack :-( + $value = str_replace('\\\\n', "\n", $value); + break; + case 'B': + case 'BASE64': + $value = base64_decode($value); + break; + } + } elseif (isset($params['CHARSET'])) { + $value = $GLOBALS['egw']->translation->convert($value, $params['CHARSET']); + } else { + // As per RFC 2279, assume UTF8 if we don't have an + // explicit charset parameter. + $value = $GLOBALS['egw']->translation->convert($value, + empty($charset) ? ($this->isOldFormat() ? 'iso-8859-1' : 'utf-8') : $charset); + } + + // Get timezone info for date fields from $params. + $tzid = isset($params['TZID']) ? trim($params['TZID'], '\"') : false; + + switch ($tag) { + case 'VERSION': // already processed + break; + // Date fields. + case 'COMPLETED': + case 'CREATED': + case 'LAST-MODIFIED': + $this->setAttribute($tag, $this->_parseDateTime($value, $tzid), $params); + break; + + case 'BDAY': + case 'X-SYNCJE-ANNIVERSARY': + $this->setAttribute($tag, $value, $params, true, $this->_parseDate($value)); + break; + + case 'DTEND': + case 'DTSTART': + case 'DTSTAMP': + case 'DUE': + case 'AALARM': + case 'DALARM': + case 'RECURRENCE-ID': + case 'X-RECURRENCE-ID': + // types like AALARM may contain additional data after a ; + // ignore these. + $ts = explode(';', $value); + if (isset($params['VALUE']) && $params['VALUE'] == 'DATE') { + $isDate = true; + $this->setAttribute($tag, $this->_parseDateTime($ts[0], $tzid), $params, true, $this->_parseDate($ts[0])); + } else { + $this->setAttribute($tag, $this->_parseDateTime($ts[0], $tzid), $params); + } + break; + + case 'TRIGGER': + if (isset($params['VALUE'])) { + if ($params['VALUE'] == 'DATE-TIME') { + $this->setAttribute($tag, $this->_parseDateTime($value, $tzid), $params); + } else { + $this->setAttribute($tag, $this->_parseDuration($value), $params); + } + } else { + $this->setAttribute($tag, $this->_parseDuration($value), $params); + } + break; + + // Comma or semicolon seperated dates. + case 'EXDATE': + case 'RDATE': + $dates = array(); + preg_match_all('/[;,]([^;,]*)/', ';' . $value, $values); + + foreach ($values[1] as $value) { + if ((isset($params['VALUE']) + && $params['VALUE'] == 'DATE') || (!isset($params['VALUE']) && $isDate)) { + $dates[] = $this->_parseDate(trim($value)); + } else { + $dates[] = $this->_parseDateTime(trim($value), $tzid); + } + } + $this->setAttribute($tag, isset($dates[0]) ? $dates[0] : null, $params, true, $dates); + break; + + // Duration fields. + case 'DURATION': + $this->setAttribute($tag, $this->_parseDuration($value), $params); + break; + + // Period of time fields. + case 'FREEBUSY': + $periods = array(); + preg_match_all('/,([^,]*)/', ',' . $value, $values); + foreach ($values[1] as $value) { + $periods[] = $this->_parsePeriod($value); + } + + $this->setAttribute($tag, isset($periods[0]) ? $periods[0] : null, $params, true, $periods); + break; + + // UTC offset fields. + case 'TZOFFSETFROM': + case 'TZOFFSETTO': + $this->setAttribute($tag, $this->_parseUtcOffset($value), $params); + break; + + // Integer fields. + case 'PERCENT-COMPLETE': + case 'PRIORITY': + case 'REPEAT': + case 'SEQUENCE': + $this->setAttribute($tag, intval($value), $params); + break; + + // Geo fields. + case 'GEO': + if ($this->isOldFormat()) { + $floats = explode(',', $value); + $value = array('latitude' => floatval($floats[1]), + 'longitude' => floatval($floats[0])); + } else { + $floats = explode(';', $value); + $value = array('latitude' => floatval($floats[0]), + 'longitude' => floatval($floats[1])); + } + $this->setAttribute($tag, $value, $params); + break; + + // Recursion fields. # add more flexibility + #case 'EXRULE': + #case 'RRULE': + # $this->setAttribute($tag, trim($value), $params); + # break; + + // Binary fields. + case 'PHOTO': + $this->setAttribute($tag, $value, $params); + break; + + // ADR, ORG and N are lists seperated by unescaped semicolons + // with a specific number of slots. + case 'ADR': + case 'N': + case 'ORG': + $value = trim($value); + // As of rfc 2426 2.4.2 semicolon, comma, and colon must + // be escaped (comma is unescaped after splitting below). + $value = str_replace(array('\\n', '\\N', '\\;', '\\:'), + array("\n", "\n", ';', ':'), + $value); + + // Split by unescaped semicolons: + $values = preg_split('/(?setAttribute($tag, trim($value), $params, true, $values); + break; + + // CATEGORIES is a lists seperated by unescaped commas + // with a unspecific number of slots. + case 'CATEGORIES': + $value = trim($value); + // As of rfc 2426 2.4.2 semicolon, comma, and colon must + // be escaped (semicolon is unescaped after splitting below). + $value = str_replace(array('\\n', '\\N', '\\,', '\\:'), + array("\n", "\n", ',', ':'), + $value); + + // Split by unescaped commas: + $values = preg_split('/(?setAttribute($tag, trim($value), $params, true, $values); + break; + + // String fields. + default: + if ($this->isOldFormat()) { + $value = trim($value); + // vCalendar 1.0 and vCard 2.1 only escape semicolons + // and use unescaped semicolons to create lists. + $value = str_replace(array('\\n', '\\N', '\\;', '\\:'), + array("\n", "\n", ';', ':'), + $value); + + // Split by unescaped semicolons: + $values = preg_split('/(?setAttribute($tag, trim($value), $params, true, $values); + } else { + $value = trim($value); + // As of rfc 2426 2.4.2 semicolon, comma, and colon + // must be escaped (comma is unescaped after splitting + // below). + $value = str_replace(array('\\n', '\\N', '\\;', '\\:', '\\\\'), + array("\n", "\n", ';', ':', '\\'), + $value); + + // Split by unescaped commas. + $values = preg_split('/(?setAttribute($tag, trim($value), $params, true, $values); + } + break; + } } } - + return true; } From f0edcf06dac240fe05dc707596d8c5a057b56ef1 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Sun, 8 Aug 2010 13:10:34 +0000 Subject: [PATCH 221/496] generate package changelog automatic from svn log messages since the last svn tag --- doc/rpm-build/checkout-build-archives.php | 185 +++++++++++++++++++++- 1 file changed, 178 insertions(+), 7 deletions(-) diff --git a/doc/rpm-build/checkout-build-archives.php b/doc/rpm-build/checkout-build-archives.php index 218aef4666..ca6dc18cd9 100755 --- a/doc/rpm-build/checkout-build-archives.php +++ b/doc/rpm-build/checkout-build-archives.php @@ -39,6 +39,8 @@ $config = array( 'obs' => false, 'changelog' => false, // eg. '* 1. Zeile\n* 2. Zeile' for debian.changes 'changelog_packager' => 'Ralf Becker ', + 'editsvnchangelog' => '* ', + 'editor' => '/usr/bin/vi', 'svntag' => 'tags/Stylite-EPL-$version.$packaging', // eg. '$version.$packaging' 'skip' => array(), 'run' => array('svntag','checkout','copy','virusscan','create','sign') @@ -85,6 +87,14 @@ while(($arg = array_shift($argv))) $config[$name] = $value; array_unshift($config['run'],'svntag'); break; + + case 'editsvnchangelog': + $config[$name] = $value ? $value : true; + if (!in_array('editsvnchangelog',$config['run'])) + { + array_unshift($config['run'],'editsvnchanglog'); + } + break; case 'obs': if (!is_dir($value)) @@ -112,8 +122,152 @@ $svn = $config['svn']; foreach(array_diff($config['run'],$config['skip']) as $func) { - $func = 'do_'.$func; - $func(); + call_user_func('do_'.$func); +} + +/** + * Query changelog from svn and let user edit it + */ +function do_editsvnchangelog() +{ + global $config,$svn,$verbose; + + echo "Querying changelog from SVN\n"; + if (!isset($config['modules'])) + { + get_modules_per_repro(); + } + // query changelog per repo + $changelog = ''; + foreach($config['modules'] as $repo => $modules) + { + $branch_url = ''; + $revision = null; + foreach($modules as $path => $url) + { + $module = basename($path); + $burl = substr($url,0,-strlen($module)-1); + if (empty($branch_url) || $burl != $branch_url) + { + if (empty($branch_url)) $url = $branch_url = $burl; + //if (count($config['modules']) > 1) $changelog .= $url."\n"; + $changelog .= get_changelog_from_svn($url,$config['editsvnchangelog'],$revision); + } + } + } + $logfile = tempnam('/tmp','checkout-build-archives'); + file_put_contents($logfile,$changelog); + $cmd = $config['editor'].' '.escapeshellarg($logfile); + passthru($cmd); + $config['changlog'] = file_get_contents($logfile); + // allow user to abort, by deleting the changelog + if (strlen($config['changlog']) <= 2) + { + die("\nChangelog must not be empty --> aborting\n\n"); + } +} + +/** + * Read changelog for given branch from (last) tag or given revision from svn + * + * @param string $branch_url='svn+ssh://svn@svn.stylite.de/egroupware/branches/Stylite-EPL-10.1' + * @param string $log_pattern=null a preg regular expression or start of line a log message must match, to be returned + * if regular perl regular expression given only first expression in brackets \\1 is used, + * for a start of line match, only the first line is used, otherwise whole message is used + * @param string $revision=null from which to HEAD the log should be retrieved, default search revision of latest tag in ^/tags + * @param string $prefix='* ' prefix, which if not presend should be added to all log messages + */ +function get_changelog_from_svn($branch_url,$log_pattern=null,&$revision,$prefix='* ') +{ + //echo __FUNCTION__."('$branch_url','$log_pattern','$revision','$prefix')\n"; + global $config,$verbose,$svn; + + if (is_null($revision)) + { + list($tags_url,$branch) = explode('/branches/',$branch_url); + $tags_url .= '/tags'; + $pattern=str_replace('Stylite-EPL-10\.1',preg_quote($branch),'/tags\/(Stylite-EPL-10\.1\.\d{8})/'); + $revision = get_last_svn_tag($tags_url,$pattern,$matches); + $tag = $matches[1]; + } + elseif(!is_numeric($revision)) + { + $revision = get_last_svn_tag($tags_url,$tag=$revision); + } + $cmd = $svn.' log --xml -r '.escapeshellarg($revision.':HEAD').' '.escapeshellarg($branch_url); + if (($v = $verbose)) + { + echo "Querying SVN for log from r$revision".($tag ? " ($tag)" : '').":\n$cmd\n"; + $verbose = false; // otherwise no $output! + } + $output = array(); + run_cmd($cmd,$output); + $verbose = $v; + array_shift($output); // remove the command + + $xml = simplexml_load_string($output=implode("\n",$output)); + $message = ''; + $pattern_len = strlen($log_pattern); + $prefix_len = strlen($prefix); + foreach($xml as $log) + { + $msg = $log->msg; + if ($log_pattern[0] == '/' && preg_match($log_pattern,$msg,$matches)) + { + $msg = $matches[1]; + } + elseif($log_pattern && $log_pattern[0] != '/' && substr($msg,0,$pattern_len) == $log_pattern) + { + list($msg) = explode("\n",$msg); + } + elseif($log_pattern) + { + continue; // no match --> ignore + } + if ($prefix_len && substr($msg,0,$prefix_len) != $prefix) $msg = $prefix.$msg; + $message .= $msg."\n"; + } + if ($verbose) echo $message; + + return $message; +} + +/** + * Get revision of last svn tag matching a given pattern in the log message + * + * @param string $tags_url + * @param string $pattern which has to be contained in the log message (NOT the tag itself) + * or (perl) regular expression against which log message is matched + * @param array &$matches=null on return matches of preg_match + * @return int revision of last svn tag matching pattern + */ +function get_last_svn_tag($tags_url,$pattern,&$matches=null) +{ + global $config,$verbose,$svn; + + $cmd = $svn.' log --xml --limit 10 '.escapeshellarg($tags_url); + if (($v = $verbose)) + { + echo "Querying SVN for last tags\n$cmd\n"; + $verbose = false; // otherwise no $output! + } + $output = array(); + run_cmd($cmd,$output); + $verbose = $v; + array_shift($output); // remove the command + + $xml = simplexml_load_string($output=implode("\n",$output)); + foreach($xml as $log) + { + //print_r($log); + if ($pattern[0] != '/' && strpos($log->msg,$pattern) !== false || + $pattern[0] == '/' && preg_match($pattern,$log->msg,$matches)) + { + if ($verbose) echo "Revision {$log['revision']} matches".($matches?': '.$matches[1] : '')."\n"; + return (int)$log['revision']; + } + } + return null; } /** @@ -436,9 +590,11 @@ function do_checkout() } /** - * Create svn tag or branch + * Get module name per svn repro + * + * @return array with $repro_url => array(module1, ..., moduleN) pairs */ -function do_svntag() +function get_modules_per_repro() { global $config,$svn,$verbose; @@ -449,7 +605,6 @@ function do_svntag() { $config['svntag'] = strtr($config['svntag'],$translate); } - echo "Creating SVN tag $config[svntag]\n"; // process alias/externals $svnbranch = $config['svnbase'].'/'.$config['svnbranch']; @@ -465,6 +620,7 @@ function do_svntag() list($path,$url) = preg_split('/[ \t\r\n]+/',$line); if (!preg_match('/([a-z+]+:\/\/[a-z@.]+\/[a-z]+)\/(branches|tags|trunk)/',$url,$matches)) die("Invalid SVN URL: $url\n"); $repo = $matches[1]; + if ($repo == 'http://svn.egroupware.org/egroupware') $repo = 'svn+ssh://svn@dev.egroupware.org/egroupware'; $config['modules'][$repo][$path] = $url; } // process extra modules @@ -479,12 +635,27 @@ function do_svntag() if (strpos($module,'://') !== false) $module = basename($module); if (!preg_match('/([a-z+]+:\/\/[a-z@.]+\/[a-z]+)\/(branches|tags|trunk)/',$url,$matches)) die("Invalid SVN URL: $url\n"); $repo = $matches[1]; + if ($repo == 'http://svn.egroupware.org/egroupware') $repo = 'svn+ssh://svn@dev.egroupware.org/egroupware'; $config['modules'][$repo][$config['aliasdir'].'/'.$module] = $url; } + return $config['modules']; +} + +/** + * Create svn tag or branch + */ +function do_svntag() +{ + global $config,$svn,$verbose; + + echo "Creating SVN tag $config[svntag]\n"; + if (!isset($config['modules'])) + { + get_modules_per_repro(); + } // create tags (per repo) foreach($config['modules'] as $repo => $modules) { - if ($repo == 'http://svn.egroupware.org/egroupware') $repo = 'svn+ssh://svn@dev.egroupware.org/egroupware'; $cmd = $svn.' cp --parents -m '.escapeshellarg('Creating '.$config['svntag']).' '.implode(' ',$modules).' '.$repo.'/'.$config['svntag'].'/'; run_cmd($cmd); } @@ -494,7 +665,7 @@ function do_svntag() * Runs given shell command, exists with error-code after echoing the output of the failed command (if not already running verbose) * * @param string $cmd - * @param array &$output=null $output of command + * @param array &$output=null $output of command, only if !$verbose !!! * @param int|array $no_bailout=null exit code(s) to NOT bail out * @return int exit code of $cmd */ From 1198c44821eb460dd0d012672479a6b0ae297a82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Lehrke?= Date: Sun, 8 Aug 2010 21:48:26 +0000 Subject: [PATCH 222/496] Fix CalDAV PUT issue --- calendar/inc/class.calendar_groupdav.inc.php | 2 -- calendar/inc/class.calendar_ical.inc.php | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/calendar/inc/class.calendar_groupdav.inc.php b/calendar/inc/class.calendar_groupdav.inc.php index 4ef0a37bfc..f2658e6acd 100644 --- a/calendar/inc/class.calendar_groupdav.inc.php +++ b/calendar/inc/class.calendar_groupdav.inc.php @@ -476,8 +476,6 @@ error_log(__METHOD__."($path,,".array2string($start).") filter=".array2string($f { if ($this->debug) error_log(__METHOD__."($id, $user)".print_r($options,true)); - if (!preg_match('/^METHOD:(PUBLISH|REQUEST)(\r\n|\r|\n)(.*)^BEGIN:VEVENT/ism', $options['content'])) return true; - $return_no_access = true; // as handled by importVCal anyway and allows it to set the status for participants $oldEvent = $this->_common_get_put_delete('PUT',$options,$id,$return_no_access); if (!is_null($oldEvent) && !is_array($oldEvent)) diff --git a/calendar/inc/class.calendar_ical.inc.php b/calendar/inc/class.calendar_ical.inc.php index 61930733f4..aeb1be0785 100644 --- a/calendar/inc/class.calendar_ical.inc.php +++ b/calendar/inc/class.calendar_ical.inc.php @@ -2207,6 +2207,7 @@ class calendar_ical extends calendar_boupdate return false; } + /* $mozillaACK = $component->getAttribute('X-MOZ-LASTACK'); if ($this->productName == 'lightning' && !is_a($mozillaACK, 'PEAR_Error')) { @@ -2217,6 +2218,7 @@ class calendar_ical extends calendar_boupdate } return false; } + */ if (!empty($GLOBALS['egw_info']['user']['preferences']['syncml']['minimum_uid_length'])) { From 2bd6696fcdc1d3a7d5593e50dad550c3bdb69a51 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Mon, 9 Aug 2010 11:40:58 +0000 Subject: [PATCH 223/496] fixed typo in editsvnchang_e_log and not replaced message about created svntag --- doc/rpm-build/checkout-build-archives.php | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/doc/rpm-build/checkout-build-archives.php b/doc/rpm-build/checkout-build-archives.php index ca6dc18cd9..d166bb802e 100755 --- a/doc/rpm-build/checkout-build-archives.php +++ b/doc/rpm-build/checkout-build-archives.php @@ -92,7 +92,7 @@ while(($arg = array_shift($argv))) $config[$name] = $value ? $value : true; if (!in_array('editsvnchangelog',$config['run'])) { - array_unshift($config['run'],'editsvnchanglog'); + array_unshift($config['run'],'editsvnchangelog'); } break; @@ -601,11 +601,6 @@ function get_modules_per_repro() $translate = array(); foreach($config as $name => $value) $translate['$'.$name] = $value; - if (strpos($config['svntag'],'$') !== false) // allow to use config vars like $version in tag - { - $config['svntag'] = strtr($config['svntag'],$translate); - } - // process alias/externals $svnbranch = $config['svnbase'].'/'.$config['svnbranch']; $url = $svnbranch.'/'.$config['svnalias']; @@ -648,6 +643,13 @@ function do_svntag() { global $config,$svn,$verbose; + $translate = array(); + foreach($config as $name => $value) $translate['$'.$name] = $value; + + if (strpos($config['svntag'],'$') !== false) // allow to use config vars like $version in tag + { + $config['svntag'] = strtr($config['svntag'],$translate); + } echo "Creating SVN tag $config[svntag]\n"; if (!isset($config['modules'])) { From bf123c985ecb4d770a15a6ff1d1611d82ae9f0dd Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Mon, 9 Aug 2010 12:12:42 +0000 Subject: [PATCH 224/496] fixed an other typo chang_e_log --- doc/rpm-build/checkout-build-archives.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/rpm-build/checkout-build-archives.php b/doc/rpm-build/checkout-build-archives.php index d166bb802e..63edd57f9e 100755 --- a/doc/rpm-build/checkout-build-archives.php +++ b/doc/rpm-build/checkout-build-archives.php @@ -159,7 +159,7 @@ function do_editsvnchangelog() file_put_contents($logfile,$changelog); $cmd = $config['editor'].' '.escapeshellarg($logfile); passthru($cmd); - $config['changlog'] = file_get_contents($logfile); + $config['changelog'] = file_get_contents($logfile); // allow user to abort, by deleting the changelog if (strlen($config['changlog']) <= 2) { From e7a384d0171dcfc2c3f9858aab2c6ed032ddd96e Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Mon, 9 Aug 2010 12:14:47 +0000 Subject: [PATCH 225/496] fixed an other typo chang_e_log --- doc/rpm-build/checkout-build-archives.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/rpm-build/checkout-build-archives.php b/doc/rpm-build/checkout-build-archives.php index 63edd57f9e..3f9f006af8 100755 --- a/doc/rpm-build/checkout-build-archives.php +++ b/doc/rpm-build/checkout-build-archives.php @@ -161,7 +161,7 @@ function do_editsvnchangelog() passthru($cmd); $config['changelog'] = file_get_contents($logfile); // allow user to abort, by deleting the changelog - if (strlen($config['changlog']) <= 2) + if (strlen($config['changelog']) <= 2) { die("\nChangelog must not be empty --> aborting\n\n"); } From 3cef21d5017b74d53b270aa332805b9316222345 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Mon, 9 Aug 2010 14:34:26 +0000 Subject: [PATCH 226/496] removed accedentily commited rpm patch again --- admin/inc/class.uiasyncservice.inc.php | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/admin/inc/class.uiasyncservice.inc.php b/admin/inc/class.uiasyncservice.inc.php index bf600bec94..40a206fd8e 100644 --- a/admin/inc/class.uiasyncservice.inc.php +++ b/admin/inc/class.uiasyncservice.inc.php @@ -99,20 +99,16 @@ class uiasyncservice $config->save_repository(); unset($config); } -/* if (!$async->only_fallback) { $installed = $async->installed(); if (is_array($installed) && isset($installed['cronline'])) { -*/ $async_use['cron'] = lang('crontab only (recomended)'); -/* } } $async_use[''] = lang('fallback (after each pageview)'); $async_use['off'] = lang('disabled (not recomended)'); -*/ echo '

    '.lang('Run Asynchronous services').''. ' \n". lang("for the times below (empty values count as '*', all empty = every minute)")."

    \n"; -*/ } echo "
    \n"; From 7ee9859babb831c8043616e61e874b4c2f4597a5 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Tue, 10 Aug 2010 07:40:12 +0000 Subject: [PATCH 227/496] remove trailing newlines --- doc/rpm-build/checkout-build-archives.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/rpm-build/checkout-build-archives.php b/doc/rpm-build/checkout-build-archives.php index 3f9f006af8..ca2a0647b6 100755 --- a/doc/rpm-build/checkout-build-archives.php +++ b/doc/rpm-build/checkout-build-archives.php @@ -160,6 +160,11 @@ function do_editsvnchangelog() $cmd = $config['editor'].' '.escapeshellarg($logfile); passthru($cmd); $config['changelog'] = file_get_contents($logfile); + // remove trailing newlines + while (substr($config['changelog'],-1) == "\n") + { + $config['changelog'] = substr($config['changelog'],0,-1); + } // allow user to abort, by deleting the changelog if (strlen($config['changelog']) <= 2) { From 346a5bf5a6e143341788bb57bc1b4449f4e8e1cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Lehrke?= Date: Tue, 10 Aug 2010 21:21:05 +0000 Subject: [PATCH 228/496] Fix alarm handling for recurring events starting in the past --- calendar/inc/class.calendar_so.inc.php | 27 ++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/calendar/inc/class.calendar_so.inc.php b/calendar/inc/class.calendar_so.inc.php index 570df77f38..ef62f0b17c 100644 --- a/calendar/inc/class.calendar_so.inc.php +++ b/calendar/inc/class.calendar_so.inc.php @@ -1089,21 +1089,23 @@ ORDER BY cal_user_type, cal_usre_id { $alarm['time'] = $event['cal_start'] - $alarm['offset']; } - - //pgoerzen: don't add an alarm in the past - if ($event['recur_type'] != MCAL_RECUR_NONE) + + $start = (int)time() + $alarm['offset']; + if ($alarm['time'] < $start) { - $where = array('cal_id' => $cal_id); - $where[] = 'cal_start >= ' . (int)(time() + $alarm['offset']); - if (($next_occurrence = (int) $this->db->select($this->dates_table,'MIN(cal_start)',$where,__LINE__,__FILE__,false,'','calendar')->fetchColumn()) - && ($time = $next_occurrence - $alarm['offset']) > $alarm['time']) + //pgoerzen: don't add an alarm in the past + if ($event['recur_type'] == MCAL_RECUR_NONE) continue; + $event['start'] = $event['cal_start']; + $event['end'] = $event['cal_end']; + $event['tzid'] = $event['cal_tzid']; + $rrule = calendar_rrule::event2rrule($event, false); + foreach ($rrule as $time) { - $alarm['time'] = $time; - } - elseif (!$next_occurrence) - { - continue; + if ($start< ($ts = egw_time::to($time,'server'))) break; + $ts = 0; } + if (!$ts) continue; + $alarm['time'] = $ts - $alarm['offset']; } $this->save_alarm($cal_id,$alarm); } @@ -1601,6 +1603,7 @@ ORDER BY cal_user_type, cal_usre_id function save_alarm($cal_id, $alarm, $now=0) { //echo "

    save_alarm(cal_id=$cal_id, alarm="; print_r($alarm); echo ")

    \n"; + //error_log(__METHOD__."(.$cal_id,$now,".array2string($alarm).')'); if (!($id = $alarm['id'])) { $alarms = $this->read_alarms($cal_id); // find a free alarm# From 80e1f39e140c22d9eae0d1b6c1b434d763e76dd1 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 12 Aug 2010 18:04:02 +0000 Subject: [PATCH 229/496] fixed wrongly display blur text for value "0" --- etemplate/inc/class.etemplate.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/etemplate/inc/class.etemplate.inc.php b/etemplate/inc/class.etemplate.inc.php index 9a433c7005..99fdeecccb 100644 --- a/etemplate/inc/class.etemplate.inc.php +++ b/etemplate/inc/class.etemplate.inc.php @@ -1133,7 +1133,7 @@ class etemplate extends boetemplate { if ($blur) { - if (empty($value)) + if ((string)$value === '') { $value = $blur; } From 2fb60eb30dbe4ab69366c7253f719f7497bee5f3 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 12 Aug 2010 18:16:19 +0000 Subject: [PATCH 230/496] allow to return a limited result set and arbitrary columns --- phpgwapi/inc/class.asyncservice.inc.php | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/phpgwapi/inc/class.asyncservice.inc.php b/phpgwapi/inc/class.asyncservice.inc.php index fcfc8e824b..760a25f826 100644 --- a/phpgwapi/inc/class.asyncservice.inc.php +++ b/phpgwapi/inc/class.asyncservice.inc.php @@ -62,12 +62,13 @@ class asyncservice * @param mixed $data This data is passed back when the method is called. It might simply be an * integer id, but it can also be a complete array. * @param int $account_id account_id, under which the methode should be called or False for the actual user + * @param boolean $debug=false * @return boolean False if $id already exists, else True */ - function set_timer($times,$id,$method,$data,$account_id=False) + function set_timer($times,$id,$method,$data,$account_id=False,$debug=false) { if (empty($id) || empty($method) || $this->read($id) || - !($next = $this->next_run($times))) + !($next = $this->next_run($times,$debug))) { return False; } @@ -447,9 +448,13 @@ class asyncservice * * @param string $id =0 reads all expired rows / jobs ready to run\ * != 0 reads all rows/jobs matching $id (sql-wildcards '%' and '_' can be used) + * @param array|string $cols='*' string or array of column-names / select-expressions + * @param int|bool $offset=False offset for a limited query or False (default) + * @param string $append string to append to the end of the query, eg. ORDER BY ... + * @param int $num_rows=0 number of rows to return if offset set, default 0 = use default in user prefs * @return array/boolean db-rows / jobs as array or False if no matches */ - function read($id=0) + function read($id=0,$cols='*',$offset=False,$append='',$num_rows=0) { if (!is_array($id) && (strpos($id,'%') !== False || strpos($id,'_') !== False)) { @@ -465,7 +470,7 @@ class asyncservice $where = array('async_id' => $id); } $jobs = array(); - foreach($this->db->select($this->db_table,'*',$where,__LINE__,__FILE__) as $row) + foreach($this->db->select($this->db_table,$cols,$where,__LINE__,__FILE__,$offset,'',False,$num_rows) as $row) { $row['async_times'] = unserialize($row['async_times']); $row['async_data'] = unserialize($row['async_data']); From e43f290d11aa1301da39dea38927fab67a3ba32d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Lehrke?= Date: Sun, 15 Aug 2010 06:35:10 +0000 Subject: [PATCH 231/496] Fix recurrence enddate issue --- calendar/inc/class.calendar_ical.inc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/calendar/inc/class.calendar_ical.inc.php b/calendar/inc/class.calendar_ical.inc.php index aeb1be0785..968a818c12 100644 --- a/calendar/inc/class.calendar_ical.inc.php +++ b/calendar/inc/class.calendar_ical.inc.php @@ -2938,8 +2938,8 @@ class calendar_ical extends calendar_boupdate $last = clone $rriter->current; $rriter->next_no_exception(); } - $delta = $event['end'] - $event['start']; - $last->modify('+' . $delta . ' seconds'); + //$delta = $event['end'] - $event['start']; + //$last->modify('+' . $delta . ' seconds'); $last->setTime(0, 0, 0); $event['recur_enddate'] = egw_time::to($last, 'server'); } From c8b9bf7e68308af7f23daae660efeaa5f9dfe90b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Lehrke?= Date: Sun, 15 Aug 2010 06:37:34 +0000 Subject: [PATCH 232/496] Improve iPhone iCal support --- calendar/inc/class.calendar_groupdav.inc.php | 13 +++++++++++-- calendar/inc/class.calendar_hooks.inc.php | 10 ++++++++++ calendar/inc/class.calendar_ical.inc.php | 15 +++++++++++++-- phpgwapi/inc/class.groupdav_handler.inc.php | 4 ++++ 4 files changed, 38 insertions(+), 4 deletions(-) diff --git a/calendar/inc/class.calendar_groupdav.inc.php b/calendar/inc/class.calendar_groupdav.inc.php index f2658e6acd..e4da86a4ff 100644 --- a/calendar/inc/class.calendar_groupdav.inc.php +++ b/calendar/inc/class.calendar_groupdav.inc.php @@ -867,6 +867,15 @@ error_log(__METHOD__."($path,,".array2string($start).") filter=".array2string($f */ static function extra_properties(array $props=array(), $displayname, $base_uri=null) { + if (strlen($GLOBALS['egw_info']['user']['preferences']['calendar']['display_color']) == 9 && + $GLOBALS['egw_info']['user']['preferences']['calendar']['display_color'][0] == '#') + { + $display_color = $GLOBALS['egw_info']['user']['preferences']['calendar']['display_color']; + } + else + { + $display_color = '#0040A0FF'; + } // calendar description $props[] = HTTP_WebDAV_Server::mkprop(groupdav::CALDAV,'calendar-description',$displayname); /* @@ -903,7 +912,7 @@ error_log(__METHOD__."($path,,".array2string($start).") filter=".array2string($f $props[] = HTTP_WebDAV_Server::mkprop(groupdav::CALDAV,'supported-calendar-data',array( HTTP_WebDAV_Server::mkprop(groupdav::CALDAV,'calendar-data', array('content-type' => 'text/calendar', 'version'=> '2.0')), HTTP_WebDAV_Server::mkprop(groupdav::CALDAV,'calendar-data', array('content-type' => 'text/x-calendar', 'version'=> '1.0')))); - $props[] = HTTP_WebDAV_Server::mkprop(groupdav::ICAL,'calendar-color','#0040A0FF'); // TODO: make it configurable + $props[] = HTTP_WebDAV_Server::mkprop(groupdav::ICAL,'calendar-color',$display_color); //$props[] = HTTP_WebDAV_Server::mkprop(groupdav::CALENDARSERVER,'publish-url',array( // HTTP_WebDAV_Server::mkprop('href',$base_uri.'/calendar/'))); @@ -920,7 +929,7 @@ error_log(__METHOD__."($path,,".array2string($start).") filter=".array2string($f { $handler = new calendar_ical(); $handler->setSupportedFields('GroupDAV',$this->agent); - if ($this->debug > 1) error_log("ical Handler called:" . $this->agent); + if ($this->debug > 1) error_log("ical Handler called: " . $this->agent); return $handler; } } diff --git a/calendar/inc/class.calendar_hooks.inc.php b/calendar/inc/class.calendar_hooks.inc.php index 83970b3aa1..3b43983f11 100644 --- a/calendar/inc/class.calendar_hooks.inc.php +++ b/calendar/inc/class.calendar_hooks.inc.php @@ -409,6 +409,16 @@ class calendar_hooks 'xmlrpc' => True, 'admin' => False ), + 'display_color' => array( + 'type' => 'input', + 'size' => 9, + 'label' => 'Select a color for this calendar', + 'name' => 'display_color', + 'help' => 'The Apple iCal Apps use this color to display events from this calendar.', + 'forced' => '#0040A0FF', + 'xmlrpc' => True, + 'admin' => False + ), 'default_private' => array( 'type' => 'check', 'label' => 'Set new events to private', diff --git a/calendar/inc/class.calendar_ical.inc.php b/calendar/inc/class.calendar_ical.inc.php index 968a818c12..2cbc9b9e6c 100644 --- a/calendar/inc/class.calendar_ical.inc.php +++ b/calendar/inc/class.calendar_ical.inc.php @@ -619,8 +619,19 @@ class calendar_ical extends calendar_boupdate $rrule = $rriter->generate_rrule($version); if ($event['recur_enddate']) { - $length = ($event['end'] - $event['start']) / 2; - $rrule['UNTIL']->modify($length . ' second'); + if ($this->productManufacturer == 'groupdav' && $this->productName == 'iphone') + { + // Fix iPhone issue + $length = ($event['end'] - $event['start']); + $rrule['UNTIL']->modify($length . ' second'); + $rrule['UNTIL']->setTime(23, 59, 59); + } + else + { + $length = ($event['end'] - $event['start']) / 2; + $rrule['UNTIL']->modify($length . ' second'); + } + if (!$tzid || $version != '1.0') { if (!isset(self::$tz_cache['UTC'])) diff --git a/phpgwapi/inc/class.groupdav_handler.inc.php b/phpgwapi/inc/class.groupdav_handler.inc.php index 473398e5e5..b797699ab2 100644 --- a/phpgwapi/inc/class.groupdav_handler.inc.php +++ b/phpgwapi/inc/class.groupdav_handler.inc.php @@ -341,6 +341,7 @@ abstract class groupdav_handler // identify the agent (GroupDAV client) from the HTTP_USER_AGENT header $user_agent = strtolower($_SERVER['HTTP_USER_AGENT']); foreach(array( + 'iphone' => 'iphone', // Apple iPhone iCal 'davkit' => 'davkit', // Apple iCal 'cfnetwork' => 'cfnetwork', // Apple Addressbook 'bionicmessage.net' => 'funambol', // funambol GroupDAV connector from bionicmessage.net @@ -372,6 +373,9 @@ abstract class groupdav_handler } } } + + if ($debug) error_log(__METHOD__."GroupDAV client: $agent"); + return $agent; } } From d5662f3a881523a5e711839bdf22320d4793d9a1 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Sun, 15 Aug 2010 15:47:44 +0000 Subject: [PATCH 233/496] * not overwriting system configuration (eg. pathes) on restore, which break a running system and if called from within EGroupware update the restored backup, in case it is an older version --- phpgwapi/inc/class.db_backup.inc.php | 61 +++++++++++++++++++++++----- setup/db_backup.php | 20 +++++++-- 2 files changed, 67 insertions(+), 14 deletions(-) diff --git a/phpgwapi/inc/class.db_backup.inc.php b/phpgwapi/inc/class.db_backup.inc.php index 0843f228cf..94443aca32 100644 --- a/phpgwapi/inc/class.db_backup.inc.php +++ b/phpgwapi/inc/class.db_backup.inc.php @@ -7,7 +7,7 @@ * @package api * @subpackage db * @author Ralf Becker - * @copyright (c) 2003-8 by Ralf Becker + * @copyright (c) 2003-10 by Ralf Becker * @version $Id$ */ @@ -328,8 +328,26 @@ class db_backup $this->backup_mincount = $minCount; $this->backup_files = (bool)$backupFiles; // Update session cache - $GLOBALS['egw']->invalidate_session_cache(); + if (is_a($GLOBALS['egw'],'egw')) $GLOBALS['egw']->invalidate_session_cache(); } + + /** + * Certain config settings NOT to restore (because they break a working system) + * + * @var array + */ + static $system_config = array( + 'files_dir', + 'temp_dir', + 'backup_dir', + 'webserver_url', + 'aspell_path', + 'hostname', + 'httpproxy_server', + 'httpproxy_port', + 'httpproxy_server_username', + 'httpproxy_server_password', + ); /** * Backup all data in the form of a (compressed) csv file @@ -337,14 +355,26 @@ class db_backup * @param resource $f file opened with fopen for reading * @param boolean $convert_to_system_charset=false convert the restored data to the selected system-charset * @param string $filename='' gives the file name which is used in case of a zip archive. + * @param boolean $protect_system_config=true should above system_config values be protected (NOT overwritten) * * @returns An empty string or an error message in case of failure. */ - function restore($f,$convert_to_system_charset=false,$filename='') + function restore($f,$convert_to_system_charset=false,$filename='',$protect_system_config=true) { @set_time_limit(0); ini_set('auto_detect_line_endings',true); - + + if ($protect_system_config) + { + $system_config = array(); + foreach($this->db->select(self::TABLE,'*',array( + 'config_app' => 'phpgwapi', + 'config_name' => self::$system_config, + ),__LINE__,__FILE__) as $row) + { + $system_config[] = $row; + } + } $this->db->transaction_begin(); // drop all existing tables @@ -468,8 +498,8 @@ class db_backup $import = true; $data = self::csv_split($line,$cols); if ($table == 'egw_async' && in_array('##last-check-run##',$data)) { - echo '

    '.lang("Line %1: '%2'
    csv data does contain ##last-check-run## of table %3 ==> ignored",$n,$line,$table)."

    \n"; - echo 'data=
    '.print_r($data,true)."
    \n"; + //echo '

    '.lang("Line %1: '%2'
    csv data does contain ##last-check-run## of table %3 ==> ignored",$n,$line,$table)."

    \n"; + //echo 'data=
    '.print_r($data,true)."
    \n"; $import = false; } if (in_array($table,$this->exclude_tables)) @@ -477,7 +507,8 @@ class db_backup echo '

    '.lang("Table %1 is excluded from backup and restore. Data will not be restored.",$table)."

    \n"; $import = false; // dont restore data of excluded tables } - if ($import) { + if ($import) + { if (count($data) == count($cols)) { if ($convert_to_system_charset && !$this->db->capabilities['client_encoding']) @@ -524,6 +555,16 @@ class db_backup unlink($name); rmdir($dir.'/database_backup'); } + if ($protect_system_config) + { + foreach($system_config as $row) + { + $this->db->insert(self::TABLE,array('config_value'=>$row['config_value']),array( + 'config_name' => $row['config_name'], + 'config_app' => $row['config_app'], + ),__LINE__,__FILE__); + } + } if (!$this->db->transaction_commit()) { return lang('Restore failed'); @@ -738,12 +779,12 @@ class db_backup * gets a list of all files on $f * * @param string file $f - * [@param int $cnt] - * [@param string $path_name] + * @param int $cnt=0 + * @param string $path_name='' * * @return array (list of files) */ - function get_file_list($f, $cnt = 0, $path_name = "") + function get_file_list($f, $cnt = 0, $path_name = '') { //chdir($f); //echo "Processing $f
    "; diff --git a/setup/db_backup.php b/setup/db_backup.php index 942876241d..d79194e6ad 100644 --- a/setup/db_backup.php +++ b/setup/db_backup.php @@ -37,8 +37,7 @@ if ($_POST['download']) list($file) = each($_POST['download']); $file = $db_backup->backup_dir.'/'.basename($file); // basename to now allow to change the dir ob_end_clean(); - $browser = CreateObject('phpgwapi.browser'); - $browser->content_header(basename($file)); + html::content_header(basename($file)); $f = fopen($file,'rb'); fpassthru($f); fclose($f); @@ -68,8 +67,9 @@ else $setup_tpl->set_block('T_db_backup','setup_header'); $setup_tpl->set_var('setup_header',''); $GLOBALS['egw_info']['flags']['app_header'] = $stage_title; - $GLOBALS['egw']->common->phpgw_header(); + common::egw_header(); parse_navbar(); + $run_in_egw = true; } // save backup housekeeping settings if ($_POST['save_backup_settings']) @@ -178,6 +178,14 @@ if ($_POST['restore']) echo '

    '.lang('restore started, this might take a few minutes ...')."

    \n".str_repeat(' ',4096); $db_backup->restore($f, FALSE, $file); $setup_tpl->set_var('error_msg',lang("backup '%1' restored",$file)); + if ($run_in_egw) + { + // updating the backup + $cmd = new setup_cmd_update($GLOBALS['egw']->session->account_domain, + $GLOBALS['egw_info']['server']['header_admin_user']='admin', + $GLOBALS['egw_info']['server']['header_admin_password']=uniqid('pw',true),false,true); + echo $cmd->run()."\n"; + } } else { @@ -271,7 +279,11 @@ $setup_tpl->set_var(array( $setup_tpl->set_var('self',$self); $setup_tpl->pparse('out','T_db_backup'); -if (is_object($GLOBALS['egw_setup']->html)) +if ($run_in_egw) +{ + common::egw_footer(); +} +else { $GLOBALS['egw_setup']->html->show_footer(); } From 2a594f51eb3a7a9957ad29563daf369446c63a7f Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Sun, 15 Aug 2010 20:06:19 +0000 Subject: [PATCH 234/496] fixed halfway implemented $append parameter and app-detection for static methods --- phpgwapi/inc/class.asyncservice.inc.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/phpgwapi/inc/class.asyncservice.inc.php b/phpgwapi/inc/class.asyncservice.inc.php index 760a25f826..a65a92ddad 100644 --- a/phpgwapi/inc/class.asyncservice.inc.php +++ b/phpgwapi/inc/class.asyncservice.inc.php @@ -409,7 +409,7 @@ class asyncservice if ($lang != $GLOBALS['egw_info']['user']['preferences']['common']['lang']) { unset($GLOBALS['lang']); - $GLOBALS['egw']->translation->add_app('common'); + translation::add_app('common'); } } else @@ -417,8 +417,9 @@ class asyncservice $GLOBALS['egw_info']['user']['domain'] = $domain; } } - list($app) = explode('.',$job['method']); - $GLOBALS['egw']->translation->add_app($app); + list($app) = strpos($job['method'],'::') !== false ? explode('_',$job['method']) : + explode('.',$job['method']); + translation::add_app($app); ExecMethod($job['method'],$job['data']); // re-read job, in case it had been updated or even deleted in the method @@ -470,7 +471,7 @@ class asyncservice $where = array('async_id' => $id); } $jobs = array(); - foreach($this->db->select($this->db_table,$cols,$where,__LINE__,__FILE__,$offset,'',False,$num_rows) as $row) + foreach($this->db->select($this->db_table,$cols,$where,__LINE__,__FILE__,$offset,$append,False,$num_rows) as $row) { $row['async_times'] = unserialize($row['async_times']); $row['async_data'] = unserialize($row['async_data']); From 7f9fa777be9bdaaa448c1ecc4fd4cd0dccd7bc49 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Mon, 16 Aug 2010 07:14:47 +0000 Subject: [PATCH 235/496] fixed not disabled custom field tab, if no cfs exist (problem was added history tab, which changed name of tabs widget, now using "tabs=general|...") --- calendar/inc/class.calendar_uiforms.inc.php | 17 +++++------------ calendar/setup/etemplates.inc.php | 4 ++-- calendar/templates/default/edit.xet | 2 +- 3 files changed, 8 insertions(+), 15 deletions(-) diff --git a/calendar/inc/class.calendar_uiforms.inc.php b/calendar/inc/class.calendar_uiforms.inc.php index 9429140615..73febc4968 100644 --- a/calendar/inc/class.calendar_uiforms.inc.php +++ b/calendar/inc/class.calendar_uiforms.inc.php @@ -40,13 +40,6 @@ class calendar_uiforms extends calendar_ui */ var $durations = array(); - /** - * Name of the tabs used in edit - * - * @var string - */ - var $tabs = 'general|description|participants|recurrence|custom|links|alarms|history'; - /** * default locking time for entries, that are opened by another user * @@ -424,7 +417,7 @@ class calendar_uiforms extends calendar_ui 'recurrence' => $content['recurrence'], 'actual_date' => $content['actual_date'], 'no_popup' => $content['no_popup'], - $this->tabs => $content[$this->tabs], + 'tabs' => $content['tabs'], 'template' => $content['template'], ); $noerror=true; @@ -1188,7 +1181,7 @@ function replace_eTemplate_onsubmit() 'to_app' => 'calendar', ), 'edit_single' => $preserv['edit_single'], // need to be in content too, as it is used in the template - $this->tabs => $preserv[$this->tabs], + 'tabs' => $preserv['tabs'], 'view' => $view, 'msg' => $msg, )); @@ -1327,7 +1320,7 @@ function replace_eTemplate_onsubmit() else { // hide the alarm tab for newly created exceptions - $readonlys[$this->tabs]['alarms'] = true; + $readonlys['tabs']['alarms'] = true; // disable the alarm tab functionality $readonlys['button[add_alarm]'] = true; @@ -1354,7 +1347,7 @@ function replace_eTemplate_onsubmit() if ($key != 'alarm') $readonlys[$key] = true; } // we need to unset the tab itself, as this would make all content (incl. the change-status selects) readonly - unset($readonlys[$this->tabs]); + unset($readonlys['tabs']); // participants are handled individual unset($readonlys['participants']); @@ -1402,7 +1395,7 @@ function replace_eTemplate_onsubmit() } } // disabling the custom fields tab, if there are none - $readonlys[$this->tabs] = array( + $readonlys['tabs'] = array( 'custom' => !count($this->bo->config['customfields']), 'participants' => $this->accountsel->account_selection == 'none', ); diff --git a/calendar/setup/etemplates.inc.php b/calendar/setup/etemplates.inc.php index 6b8daae838..b192dd8900 100644 --- a/calendar/setup/etemplates.inc.php +++ b/calendar/setup/etemplates.inc.php @@ -2,7 +2,7 @@ /** * eGroupWare - eTemplates for Application calendar * http://www.egroupware.org - * generated by soetemplate::dump4setup() 2010-06-28 15:43 + * generated by soetemplate::dump4setup() 2010-08-16 09:15 * * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License * @package calendar @@ -20,7 +20,7 @@ $templ_data[] = array('name' => 'calendar.conflicts','template' => '','lang' => $templ_data[] = array('name' => 'calendar.delete_series','template' => '','lang' => '','group' => '0','version' => '1.7.003','data' => 'a:1:{i:0;a:8:{s:4:"type";s:4:"vbox";s:4:"data";a:2:{i:0;a:0:{}i:1;a:1:{s:1:"A";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:1;s:4:"cols";i:1;s:4:"size";s:1:"2";i:1;a:5:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"1";i:1;a:2:{s:4:"type";s:5:"label";s:5:"label";s:30:"This event is part of a series";}s:4:"name";s:14:"#dialog-header";s:4:"span";s:13:",promptheader";}i:2;a:6:{s:4:"type";s:4:"vbox";s:4:"size";s:1:"2";i:1;a:2:{s:4:"type";s:5:"label";s:5:"label";s:59:"Do you want to keep the series exceptions in your calendar?";}s:4:"span";s:7:",prompt";s:4:"name";s:14:"dialog-content";i:2;a:6:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"3";i:1;a:4:{s:4:"type";s:6:"button";s:5:"label";s:15:"Keep exceptions";s:4:"help";s:48:"All exceptions are converted into single events.";s:4:"name";s:30:"button[delete_keep_exceptions]";}i:2;a:4:{s:4:"type";s:6:"button";s:5:"label";s:17:"Delete exceptions";s:4:"help";s:52:"The exceptions are deleted together with the series.";s:4:"name";s:25:"button[delete_exceptions]";}i:3;a:3:{s:4:"type";s:10:"buttononly";s:5:"label";s:6:"Cancel";s:7:"onclick";s:64:"document.getElementById(\'delete_series\').style.display = \'none\';";}s:5:"align";s:6:"center";}}s:4:"name";s:14:"#delete_series";}}','size' => '','style' => '','modified' => '1273136129',); -$templ_data[] = array('name' => 'calendar.edit','template' => '','lang' => '','group' => '0','version' => '1.7.003','data' => 'a:1:{i:0;a:5:{s:4:"type";s:4:"grid";s:4:"data";a:7:{i:0;a:7:{s:1:"A";s:3:"100";s:1:"B";s:3:"300";s:2:"h1";s:6:",!@msg";s:2:"c2";s:2:"th";s:2:"h2";s:2:"28";s:2:"h4";s:8:",!@owner";s:2:"h6";s:13:",!@recur_type";}i:1;a:4:{s:1:"A";a:5:{s:4:"span";s:13:"all,redItalic";s:7:"no_lang";s:1:"1";s:5:"align";s:6:"center";s:4:"name";s:3:"msg";s:4:"type";s:4:"html";}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}}i:2;a:4:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:5:"Title";}s:1:"B";a:5:{s:4:"size";s:6:"80,255";s:4:"span";s:3:"all";s:6:"needed";s:1:"1";s:4:"name";s:5:"title";s:4:"type";s:4:"text";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}}i:3;a:4:{s:1:"A";a:5:{s:4:"span";s:3:"all";s:4:"name";s:183:"calendar.edit.general|calendar.edit.description|calendar.edit.participants|calendar.edit.recurrence|calendar.edit.custom|calendar.edit.links|calendar.edit.alarms|calendar.edit.history";s:4:"type";s:3:"tab";s:5:"label";s:71:"General|Description|Participants|Recurrence|Custom|Links|Alarms|History";s:4:"help";s:173:"Location, Start- and Endtimes, ...|Full description|Participants, Resources, ...|Repeating Event Information|Custom fields|Links, Attachments|Alarm management|Change history";}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}}i:4;a:4:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:5:"Owner";}s:1:"B";a:3:{s:4:"type";s:14:"select-account";s:8:"readonly";s:4:"true";s:4:"name";s:5:"owner";}s:1:"C";a:7:{s:5:"label";s:7:"Updated";s:8:"readonly";s:4:"true";s:7:"no_lang";s:1:"1";s:5:"align";s:5:"right";s:4:"name";s:8:"modified";s:4:"type";s:9:"date-time";s:4:"span";s:8:",noBreak";}s:1:"D";a:6:{s:5:"class";s:7:"noBreak";s:4:"type";s:14:"select-account";s:5:"label";s:2:"by";s:8:"readonly";s:4:"true";s:5:"align";s:5:"right";s:4:"name";s:8:"modifier";}}i:5;a:4:{s:1:"A";a:7:{s:4:"span";s:1:"3";s:4:"type";s:4:"hbox";s:4:"size";s:1:"4";i:1;a:4:{s:5:"label";s:4:"Save";s:4:"name";s:12:"button[save]";s:4:"type";s:6:"button";s:4:"help";s:22:"saves the changes made";}i:2;a:4:{s:5:"label";s:5:"Apply";s:4:"name";s:13:"button[apply]";s:4:"type";s:6:"button";s:4:"help";s:17:"apply the changes";}i:3;a:5:{s:5:"label";s:6:"Cancel";s:7:"onclick";s:15:"window.close();";s:4:"name";s:14:"button[cancel]";s:4:"type";s:6:"button";s:4:"help";s:16:"Close the window";}i:4;a:5:{s:8:"onchange";s:34:"this.form.submit(); this.value=\'\';";s:4:"name";s:6:"action";s:4:"size";s:10:"Actions...";s:4:"type";s:6:"select";s:4:"help";s:39:"Execute a further action for this entry";}}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:6:{s:5:"label";s:6:"Delete";s:7:"onclick";s:137:"if ($cont[recur_type]) { getElementById(\'delete_series\').style.display=\'block\'; return false; } else return confirm(\'Delete this event\');";s:5:"align";s:5:"right";s:4:"name";s:14:"button[delete]";s:4:"type";s:6:"button";s:4:"help";s:17:"Delete this event";}}i:6;a:4:{s:1:"A";a:3:{s:4:"type";s:8:"template";s:4:"span";s:3:"all";s:4:"name";s:22:"calendar.delete_series";}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}}}s:4:"cols";i:4;s:4:"rows";i:6;s:4:"size";s:4:"100%";}}','size' => '100%','style' => '.end_hide { display: block; white-space: nowrap; margin-left: 10px; } +$templ_data[] = array('name' => 'calendar.edit','template' => '','lang' => '','group' => '0','version' => '1.7.003','data' => 'a:1:{i:0;a:5:{s:4:"type";s:4:"grid";s:4:"data";a:7:{i:0;a:7:{s:1:"A";s:3:"100";s:1:"B";s:3:"300";s:2:"h1";s:6:",!@msg";s:2:"c2";s:2:"th";s:2:"h2";s:2:"28";s:2:"h4";s:8:",!@owner";s:2:"h6";s:13:",!@recur_type";}i:1;a:4:{s:1:"A";a:5:{s:4:"span";s:13:"all,redItalic";s:7:"no_lang";s:1:"1";s:5:"align";s:6:"center";s:4:"name";s:3:"msg";s:4:"type";s:4:"html";}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}}i:2;a:4:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:5:"Title";}s:1:"B";a:5:{s:4:"size";s:6:"80,255";s:4:"span";s:3:"all";s:6:"needed";s:1:"1";s:4:"name";s:5:"title";s:4:"type";s:4:"text";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}}i:3;a:4:{s:1:"A";a:5:{s:4:"span";s:3:"all";s:4:"name";s:76:"tabs=general|description|participants|recurrence|custom|links|alarms|history";s:4:"type";s:3:"tab";s:5:"label";s:71:"General|Description|Participants|Recurrence|Custom|Links|Alarms|History";s:4:"help";s:173:"Location, Start- and Endtimes, ...|Full description|Participants, Resources, ...|Repeating Event Information|Custom fields|Links, Attachments|Alarm management|Change history";}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}}i:4;a:4:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:5:"Owner";}s:1:"B";a:3:{s:4:"type";s:14:"select-account";s:8:"readonly";s:4:"true";s:4:"name";s:5:"owner";}s:1:"C";a:7:{s:5:"label";s:7:"Updated";s:8:"readonly";s:4:"true";s:7:"no_lang";s:1:"1";s:5:"align";s:5:"right";s:4:"name";s:8:"modified";s:4:"type";s:9:"date-time";s:4:"span";s:8:",noBreak";}s:1:"D";a:6:{s:5:"class";s:7:"noBreak";s:4:"type";s:14:"select-account";s:5:"label";s:2:"by";s:8:"readonly";s:4:"true";s:5:"align";s:5:"right";s:4:"name";s:8:"modifier";}}i:5;a:4:{s:1:"A";a:7:{s:4:"span";s:1:"3";s:4:"type";s:4:"hbox";s:4:"size";s:1:"4";i:1;a:4:{s:5:"label";s:4:"Save";s:4:"name";s:12:"button[save]";s:4:"type";s:6:"button";s:4:"help";s:22:"saves the changes made";}i:2;a:4:{s:5:"label";s:5:"Apply";s:4:"name";s:13:"button[apply]";s:4:"type";s:6:"button";s:4:"help";s:17:"apply the changes";}i:3;a:5:{s:5:"label";s:6:"Cancel";s:7:"onclick";s:15:"window.close();";s:4:"name";s:14:"button[cancel]";s:4:"type";s:6:"button";s:4:"help";s:16:"Close the window";}i:4;a:5:{s:8:"onchange";s:34:"this.form.submit(); this.value=\'\';";s:4:"name";s:6:"action";s:4:"size";s:10:"Actions...";s:4:"type";s:6:"select";s:4:"help";s:39:"Execute a further action for this entry";}}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:6:{s:5:"label";s:6:"Delete";s:7:"onclick";s:137:"if ($cont[recur_type]) { getElementById(\'delete_series\').style.display=\'block\'; return false; } else return confirm(\'Delete this event\');";s:5:"align";s:5:"right";s:4:"name";s:14:"button[delete]";s:4:"type";s:6:"button";s:4:"help";s:17:"Delete this event";}}i:6;a:4:{s:1:"A";a:3:{s:4:"type";s:8:"template";s:4:"span";s:3:"all";s:4:"name";s:22:"calendar.delete_series";}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}}}s:4:"cols";i:4;s:4:"rows";i:6;s:4:"size";s:4:"100%";}}','size' => '100%','style' => '.end_hide { display: block; white-space: nowrap; margin-left: 10px; } .noBreak { white-space: nowrap; }','modified' => '1274342574',); $templ_data[] = array('name' => 'calendar.edit.alarms','template' => '','lang' => '','group' => '0','version' => '1.0.1.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:3:{i:0;a:5:{s:2:"c1";s:3:"row";s:1:"A";s:2:"95";s:2:"h1";s:16:"20,@no_add_alarm";s:2:"c2";s:4:",top";s:2:"h2";s:8:",!@alarm";}i:1;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:16:"before the event";}s:1:"B";a:10:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"8";i:1;a:4:{s:4:"type";s:13:"select-number";s:4:"size";s:4:",0,7";s:4:"name";s:15:"new_alarm[days]";s:4:"help";s:4:"days";}i:2;a:3:{s:4:"type";s:5:"label";s:4:"size";s:18:",,,new_alarm[days]";s:5:"label";s:4:"days";}i:3;a:4:{s:4:"type";s:13:"select-number";s:4:"name";s:16:"new_alarm[hours]";s:4:"size";s:5:",0,23";s:4:"help";s:5:"hours";}i:4;a:3:{s:4:"type";s:5:"label";s:4:"size";s:19:",,,new_alarm[hours]";s:5:"label";s:5:"hours";}i:5;a:4:{s:4:"type";s:13:"select-number";s:4:"name";s:15:"new_alarm[mins]";s:4:"size";s:7:",0,55,5";s:4:"help";s:7:"Minutes";}i:6;a:3:{s:4:"type";s:5:"label";s:4:"size";s:18:",,,new_alarm[mins]";s:5:"label";s:7:"Minutes";}i:7;a:5:{s:4:"type";s:6:"select";s:4:"name";s:16:"new_alarm[owner]";s:7:"no_lang";s:1:"1";s:5:"label";s:3:"for";s:4:"help";s:31:"Select who should get the alarm";}i:8;a:3:{s:4:"type";s:6:"button";s:4:"name";s:17:"button[add_alarm]";s:5:"label";s:9:"Add alarm";}}}i:2;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:6:"Alarms";}s:1:"B";a:6:{s:4:"type";s:4:"grid";s:4:"data";a:3:{i:0;a:2:{s:2:"c1";s:2:"th";s:2:"c2";s:3:"row";}i:1;a:5:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:4:"Time";}s:1:"B";a:2:{s:4:"type";s:5:"label";s:5:"label";s:16:"before the event";}s:1:"C";a:2:{s:4:"type";s:5:"label";s:5:"label";s:16:"All participants";}s:1:"D";a:2:{s:4:"type";s:5:"label";s:5:"label";s:5:"Owner";}s:1:"E";a:2:{s:4:"type";s:5:"label";s:5:"label";s:6:"Action";}}i:2;a:5:{s:1:"A";a:3:{s:4:"type";s:9:"date-time";s:4:"name";s:12:"${row}[time]";s:8:"readonly";s:1:"1";}s:1:"B";a:3:{s:4:"type";s:5:"label";s:4:"name";s:14:"${row}[offset]";s:7:"no_lang";s:1:"1";}s:1:"C";a:4:{s:4:"type";s:8:"checkbox";s:5:"align";s:6:"center";s:4:"name";s:11:"${row}[all]";s:8:"readonly";s:1:"1";}s:1:"D";a:3:{s:4:"type";s:14:"select-account";s:4:"name";s:13:"${row}[owner]";s:8:"readonly";s:1:"1";}s:1:"E";a:7:{s:4:"type";s:6:"button";s:4:"size";s:6:"delete";s:5:"label";s:6:"Delete";s:5:"align";s:6:"center";s:4:"name";s:27:"delete_alarm[$row_cont[id]]";s:4:"help";s:17:"Delete this alarm";s:7:"onclick";s:36:"return confirm(\'Delete this alarm\');";}}}s:4:"rows";i:2;s:4:"cols";i:5;s:4:"name";s:5:"alarm";s:7:"options";a:0:{}}}}s:4:"rows";i:2;s:4:"cols";i:2;s:4:"size";s:17:"100%,210,,,,,auto";s:7:"options";a:3:{i:0;s:4:"100%";i:1;s:3:"210";i:6;s:4:"auto";}}}','size' => '100%,210,,,,,auto','style' => '','modified' => '1118780740',); diff --git a/calendar/templates/default/edit.xet b/calendar/templates/default/edit.xet index aacc908900..9b48846d69 100644 --- a/calendar/templates/default/edit.xet +++ b/calendar/templates/default/edit.xet @@ -323,7 +323,7 @@ - + From f9347fbf4cb6676d1b75222e769d458892bf2e8d Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Mon, 16 Aug 2010 07:29:57 +0000 Subject: [PATCH 236/496] reverted r31570/7: using label as blur text, as label is already used (as label), using blur text field now, no idea why I didnt used it in the first place ;-) --- etemplate/inc/class.link_widget.inc.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/etemplate/inc/class.link_widget.inc.php b/etemplate/inc/class.link_widget.inc.php index 7d46c2d415..2e224843a7 100644 --- a/etemplate/inc/class.link_widget.inc.php +++ b/etemplate/inc/class.link_widget.inc.php @@ -7,7 +7,7 @@ * @subpackage extensions * @link http://www.egroupware.org * @author Ralf Becker - * @copyright 2002-9 by RalfBecker@outdoor-training.de + * @copyright 2002-10 by RalfBecker@outdoor-training.de * @version $Id$ */ @@ -414,11 +414,10 @@ class link_widget 'no_app_sel' => !!$extension_data['app'], 'id' => is_array($value) ? $value['current'] : $id, 'query' => is_array($value) ? $value['query'] : '', - 'blur' => $cell['label'] ? lang($cell['label']) : + 'blur' => $cell['blur'] ? lang($cell['blur']) : (count($options) == 1 ? lang($app) : lang('Search')), 'extra' => $cell['onchange'] ? ','.self::AJAX_NEED_ONCHANGE : null, // store flang for ajax_search, to display extra_line required by onchange ); - $cell['label'] = ''; // displayed as blur text if ($options) // limit the app-selectbox to the given apps { From da0059c38ad9698951cfccbd8790acaed0291734 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Mon, 16 Aug 2010 14:56:47 +0000 Subject: [PATCH 237/496] quitent debug output if dry-run is set --- addressbook/inc/class.addressbook_import_contacts_csv.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addressbook/inc/class.addressbook_import_contacts_csv.inc.php b/addressbook/inc/class.addressbook_import_contacts_csv.inc.php index 9efa5632b0..ee13a3d3f2 100644 --- a/addressbook/inc/class.addressbook_import_contacts_csv.inc.php +++ b/addressbook/inc/class.addressbook_import_contacts_csv.inc.php @@ -232,7 +232,7 @@ class addressbook_import_contacts_csv implements importexport_iface_import_plugi unset($_data['id']); } if ( $this->dry_run ) { - print_r($_data); + //print_r($_data); $this->results[$_action]++; return true; } else { From 099d340fec0c3ec2b7c42104f3f16de03a213b1a Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Mon, 16 Aug 2010 14:58:23 +0000 Subject: [PATCH 238/496] fixed fatal error: unsupported operand typ --- importexport/inc/class.importexport_import_ui.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/importexport/inc/class.importexport_import_ui.inc.php b/importexport/inc/class.importexport_import_ui.inc.php index b76181a301..70dda8dd88 100644 --- a/importexport/inc/class.importexport_import_ui.inc.php +++ b/importexport/inc/class.importexport_import_ui.inc.php @@ -48,7 +48,7 @@ try { $definition_obj = new importexport_definition($content['definition']); if($content['dry-run']) { - $definition_obj->plugin_options = $definition_obj->plugin_options + array('dry_run' => true); + $definition_obj->plugin_options = (array)$definition_obj->plugin_options + array('dry_run' => true); } $plugin = new $definition_obj->plugin; $file = fopen($content['file']['tmp_name'], 'r'); From b5c73dd734254eb941c0546a62c21b1b9b65791c Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 18 Aug 2010 09:13:27 +0000 Subject: [PATCH 239/496] using organizationalRole instead of namedObject which seems to be suse specific --- setup/inc/class.setup_cmd_ldap.inc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup/inc/class.setup_cmd_ldap.inc.php b/setup/inc/class.setup_cmd_ldap.inc.php index 6294805930..97abe8ad36 100644 --- a/setup/inc/class.setup_cmd_ldap.inc.php +++ b/setup/inc/class.setup_cmd_ldap.inc.php @@ -5,7 +5,7 @@ * @link http://www.egroupware.org * @author Ralf Becker * @package setup - * @copyright (c) 2007 by Ralf Becker + * @copyright (c) 2007-10 by Ralf Becker * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License * @version $Id$ */ @@ -173,7 +173,7 @@ class setup_cmd_ldap extends setup_cmd static $requiredObjectclasses = array( 'o' => 'organization', 'ou' => 'organizationalUnit', - 'cn' => array('namedObject','simpleSecurityObject'), + 'cn' => array('organizationalRole','simpleSecurityObject'), 'dc' => array('organization','dcObject'), ); From ec1d39a7a9bf075ef1c68fcae50a54b3bb204988 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 18 Aug 2010 10:03:46 +0000 Subject: [PATCH 240/496] fixed fatal error: Cannot use object of type PEAR_Error as array, happening eg. if no or wrong credentials --- egw-pear/Net/IMAPProtocol.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/egw-pear/Net/IMAPProtocol.php b/egw-pear/Net/IMAPProtocol.php index fcfabf0a26..352cddbc54 100644 --- a/egw-pear/Net/IMAPProtocol.php +++ b/egw-pear/Net/IMAPProtocol.php @@ -1539,7 +1539,7 @@ class Net_IMAPProtocol { } $mailbox_name=sprintf("%s",$this->utf_7_encode($mailbox_name) ); $ret = $this->_genericCommand('GETQUOTA', $mailbox_name ); - if(isset( $ret["PARSED"] ) ){ + if(!is_object($ret) && isset( $ret["PARSED"] ) ){ // remove the array index because the quota response returns only 1 line of output $ret['PARSED']=$ret["PARSED"][0]; } @@ -1566,7 +1566,7 @@ class Net_IMAPProtocol { $mailbox_name=sprintf("%s",$this->utf_7_encode($mailbox_name) ); $ret = $this->_genericCommand('GETQUOTAROOT', $mailbox_name ); - if(isset( $ret["PARSED"] ) ){ + if(!is_object($ret) && isset( $ret["PARSED"] ) ){ // remove the array index because the quota response returns only 1 line of output $ret['PARSED']=$ret["PARSED"][1]; } From 92eb3da8495775e0aafaf4867683db9113a208a8 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 18 Aug 2010 11:48:51 +0000 Subject: [PATCH 241/496] * fixed fatal error deleting users (using new so_sql provided method) --- emailadmin/inc/class.emailadmin_hooks.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emailadmin/inc/class.emailadmin_hooks.inc.php b/emailadmin/inc/class.emailadmin_hooks.inc.php index 93ae97c1f2..a107a156da 100644 --- a/emailadmin/inc/class.emailadmin_hooks.inc.php +++ b/emailadmin/inc/class.emailadmin_hooks.inc.php @@ -89,7 +89,7 @@ class emailadmin_hooks $profileList = $boemailadmin->getProfileList($profileID,$appName,$groupID,(int) $data['account_id']); if (is_array($profileList)) { foreach ($profileList as $key => $value) { - $boemailadmin->deleteProfile($value['profileID']); + $boemailadmin->delete($value['profileID']); } } } From 18ccc808cf0665c4fc7dfaaff6ab1220da8012c1 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Wed, 18 Aug 2010 14:06:18 +0000 Subject: [PATCH 242/496] allow others apps to register classes als smtp or imap plugins --- emailadmin/inc/class.emailadmin_bo.inc.php | 69 ++++++++++++++++------ 1 file changed, 50 insertions(+), 19 deletions(-) diff --git a/emailadmin/inc/class.emailadmin_bo.inc.php b/emailadmin/inc/class.emailadmin_bo.inc.php index 0d179dc5a9..8467cc5308 100644 --- a/emailadmin/inc/class.emailadmin_bo.inc.php +++ b/emailadmin/inc/class.emailadmin_bo.inc.php @@ -376,23 +376,6 @@ } } - function getIMAPServerTypes($extended=true) - { - foreach(self::$IMAPServerType as $key => $value) { - if ($extended) - { - $retData[$key]['description'] = $value['description']; - $retData[$key]['protocol'] = $value['protocol']; - } - else - { - $retData[$key] = $value['description']; - } - } - - return $retData; - } - function getLDAPStorageData($_serverid) { $storageData = $this->soemailadmin->getLDAPStorageData($_serverid); @@ -506,12 +489,57 @@ } } - function getSMTPServerTypes() + /** + * Get a list of supported SMTP servers + * + * Calls hook "smtp_server_types" to allow applications to supply own server-types + * + * @return array classname => label pairs + */ + static public function getSMTPServerTypes() { + $retData = array(); foreach(self::$SMTPServerType as $key => $value) { $retData[$key] = $value['description']; } + foreach($GLOBALS['egw']->hooks->process('smtp_server_types') as $app => $data) + { + if ($data) $retData += $data; + } + return $retData; + } + + /** + * Get a list of supported SMTP servers + * + * Calls hook "imap_server_types" to allow applications to supply own server-types + * + * @param boolean $extended=true + * @return array classname => label pairs + */ + static public function getIMAPServerTypes($extended=true) + { + $retData = array(); + foreach(self::$IMAPServerType as $key => $value) + { + if ($extended) + { + $retData[$key]['description'] = $value['description']; + $retData[$key]['protocol'] = $value['protocol']; + } + else + { + $retData[$key] = $value['description']; + } + } + foreach($GLOBALS['egw']->hooks->process(array( + 'location' => 'imap_server_types', + 'extended' => $extended, + )) as $app => $data) + { + if ($data) $retData += $data; + } return $retData; } @@ -833,7 +861,10 @@ function saveSessionData() { // serializing the session data, for the sake of objects - $GLOBALS['egw']->session->appsession('session_data','emailadmin',serialize(self::$sessionData)); + if (is_object($GLOBALS['egw']->session)) // otherwise setup(-cli) fails + { + $GLOBALS['egw']->session->appsession('session_data','emailadmin',serialize(self::$sessionData)); + } #$GLOBALS['egw']->session->appsession('user_session_data','',$this->userSessionData); } From 467302e1e0bcd329d86ca1b450b827c1cc2d53c9 Mon Sep 17 00:00:00 2001 From: Nathan Gray Date: Wed, 18 Aug 2010 14:58:55 +0000 Subject: [PATCH 243/496] Backport 31721 - If deleted addresses are kept, delete links on final purge, not initial delete (#8157) --- addressbook/inc/class.addressbook_bo.inc.php | 1 - 1 file changed, 1 deletion(-) diff --git a/addressbook/inc/class.addressbook_bo.inc.php b/addressbook/inc/class.addressbook_bo.inc.php index 7be00f21d6..50fa34c496 100755 --- a/addressbook/inc/class.addressbook_bo.inc.php +++ b/addressbook/inc/class.addressbook_bo.inc.php @@ -724,7 +724,6 @@ class addressbook_bo extends addressbook_so $delete = $old; $delete['tid'] = addressbook_so::DELETED_TYPE; $ok = $this->save($delete); - egw_link::unlink(0,'addressbook',$id,'','!file'); } elseif (($ok = parent::delete($id,$check_etag))) { From 1bcbeb51ed7b40361ff0dd4e775d21ada2661a44 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 19 Aug 2010 08:08:39 +0000 Subject: [PATCH 244/496] * restore to current system charset, to force all restores to utf-8, and do NOT halt on sql errors in restore --- phpgwapi/inc/class.db_backup.inc.php | 35 ++++++++++++++++++++-------- setup/db_backup.php | 7 +++--- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/phpgwapi/inc/class.db_backup.inc.php b/phpgwapi/inc/class.db_backup.inc.php index 94443aca32..4ed0cf58c1 100644 --- a/phpgwapi/inc/class.db_backup.inc.php +++ b/phpgwapi/inc/class.db_backup.inc.php @@ -347,23 +347,26 @@ class db_backup 'httpproxy_port', 'httpproxy_server_username', 'httpproxy_server_password', + 'system_charset', ); /** * Backup all data in the form of a (compressed) csv file * * @param resource $f file opened with fopen for reading - * @param boolean $convert_to_system_charset=false convert the restored data to the selected system-charset + * @param boolean $convert_to_system_charset=true convert the restored data to the selected system-charset * @param string $filename='' gives the file name which is used in case of a zip archive. * @param boolean $protect_system_config=true should above system_config values be protected (NOT overwritten) * * @returns An empty string or an error message in case of failure. */ - function restore($f,$convert_to_system_charset=false,$filename='',$protect_system_config=true) + function restore($f,$convert_to_system_charset=true,$filename='',$protect_system_config=true) { @set_time_limit(0); ini_set('auto_detect_line_endings',true); + $convert_to_system_charset = true; // enforce now utf-8 as system charset restores of old backups + if ($protect_system_config) { $system_config = array(); @@ -419,6 +422,12 @@ class db_backup return lang("Cant open '%1' for %2", $filename, lang("reading"))."
    \n"; } } + // do not stop if for whatever reason some sql statement fails + if ($this->db->Halt_On_Error != 'no') + { + $backup_db_halt_on_error = $this->db->Halt_On_Error; + $this->db->Halt_On_Error = 'no'; + } $table = False; $n = 0; while(!feof($f)) @@ -547,14 +556,7 @@ class db_backup 'config_name' => 'system_charset', ),__LINE__,__FILE__); } - // zip? - if($type == 'zip') - { - fclose($f); - $f = $save_f; - unlink($name); - rmdir($dir.'/database_backup'); - } + // restore protected system config if ($protect_system_config) { foreach($system_config as $row) @@ -565,6 +567,19 @@ class db_backup ),__LINE__,__FILE__); } } + // restore original Halt_On_Error state (if changed) + if ($backup_db_halt_on_error) + { + $this->db->Halt_On_Error = $backup_db_halt_on_error; + } + // zip? + if($type == 'zip') + { + fclose($f); + $f = $save_f; + unlink($name); + rmdir($dir.'/database_backup'); + } if (!$this->db->transaction_commit()) { return lang('Restore failed'); diff --git a/setup/db_backup.php b/setup/db_backup.php index d79194e6ad..da4a019172 100644 --- a/setup/db_backup.php +++ b/setup/db_backup.php @@ -28,8 +28,8 @@ if (!is_object(@$GLOBALS['egw'])) // called from outside eGW ==> setup $tpl_root = $GLOBALS['egw_setup']->html->setup_tpl_dir('setup'); $self = 'db_backup.php'; } -$db_backup = CreateObject('phpgwapi.db_backup'); -$asyncservice = CreateObject('phpgwapi.asyncservice'); +$db_backup = new db_backup(); +$asyncservice = new asyncservice(); // download a backup, has to be before any output !!! if ($_POST['download']) @@ -176,7 +176,7 @@ if ($_POST['restore']) if (is_resource($f = $db_backup->fopen_backup($file,true))) { echo '

    '.lang('restore started, this might take a few minutes ...')."

    \n".str_repeat(' ',4096); - $db_backup->restore($f, FALSE, $file); + $db_backup->restore($f, true, $file); // allways convert to current system charset on restore $setup_tpl->set_var('error_msg',lang("backup '%1' restored",$file)); if ($run_in_egw) { @@ -185,6 +185,7 @@ if ($_POST['restore']) $GLOBALS['egw_info']['server']['header_admin_user']='admin', $GLOBALS['egw_info']['server']['header_admin_password']=uniqid('pw',true),false,true); echo $cmd->run()."\n"; + echo '

    '.lang('You should %1log out%2 and in again, to update your current session!','','')."

    \n"; } } else From 80fff2e714f881f1827ae8bb0d37e0bd7c4b58a9 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 19 Aug 2010 09:17:59 +0000 Subject: [PATCH 245/496] check smtp/imap plugins from all apps, not only the ones user has permissions for --- emailadmin/inc/class.emailadmin_bo.inc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/emailadmin/inc/class.emailadmin_bo.inc.php b/emailadmin/inc/class.emailadmin_bo.inc.php index 8467cc5308..35b464ec0c 100644 --- a/emailadmin/inc/class.emailadmin_bo.inc.php +++ b/emailadmin/inc/class.emailadmin_bo.inc.php @@ -503,7 +503,7 @@ { $retData[$key] = $value['description']; } - foreach($GLOBALS['egw']->hooks->process('smtp_server_types') as $app => $data) + foreach($GLOBALS['egw']->hooks->process('smtp_server_types',array(),true) as $app => $data) { if ($data) $retData += $data; } @@ -536,7 +536,7 @@ foreach($GLOBALS['egw']->hooks->process(array( 'location' => 'imap_server_types', 'extended' => $extended, - )) as $app => $data) + ),array(),true) as $app => $data) { if ($data) $retData += $data; } From a805a849dd0e89bf4b9ca3b1db819bf2c7f8e7dc Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 19 Aug 2010 09:50:59 +0000 Subject: [PATCH 246/496] use autoloading to be able to load smpt and imap plugins from other apps --- emailadmin/inc/class.emailadmin_bo.inc.php | 34 ++++++++++++++++------ 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/emailadmin/inc/class.emailadmin_bo.inc.php b/emailadmin/inc/class.emailadmin_bo.inc.php index 35b464ec0c..a9db5f0427 100644 --- a/emailadmin/inc/class.emailadmin_bo.inc.php +++ b/emailadmin/inc/class.emailadmin_bo.inc.php @@ -543,6 +543,13 @@ return $retData; } + /** + * Get EMailAdmin profile for a user + * + * @param string $_appName='' + * @param int|array $_groups='' + * @return ea_preferences + */ function getUserProfile($_appName='', $_groups='') { if (!(is_array(self::$sessionData) && (count(self::$sessionData)>0))) $this->restoreSessionData(); @@ -565,14 +572,20 @@ $groups = $_groups; } - if($data = $this->soemailadmin->getUserProfile($appName, $groups,$GLOBALS['egw_info']['user']['account_id'])) { - + if($data = $this->soemailadmin->getUserProfile($appName, $groups,$GLOBALS['egw_info']['user']['account_id'])) + { $eaPreferences = CreateObject('emailadmin.ea_preferences'); // fetch the IMAP / incomming server data - $icClass = isset(self::$IMAPServerType[$data['imapType']]) ? self::$IMAPServerType[$data['imapType']]['classname'] : 'defaultimap'; - - $icServer = CreateObject('emailadmin.'.$icClass); + if (!class_exists($icClass=$data['imapType'])) + { + if (!file_exists($file=EGW_INCLUDE_ROOT.'/emailadmin/inc/class.'.$icClass.'.inc.php')) + { + $file = EGW_INCLUDE_ROOT.'/emailadmin/inc/class.'.($icClass='defaultimap').'.inc.php'; + } + include_once($file); + } + $icServer = new $icClass; $icServer->encryption = ($data['imapTLSEncryption'] == 'yes' ? 1 : (int)$data['imapTLSEncryption']); $icServer->host = $data['imapServer']; $icServer->port = $data['imapPort']; @@ -599,10 +612,13 @@ $eaPreferences->setIncomingServer($icServer); // fetch the SMTP / outgoing server data - $ogClass = isset(self::$SMTPServerType[$data['smtpType']]) ? self::$SMTPServerType[$data['smtpType']]['classname'] : 'defaultsmtp'; - if (!class_exists($ogClass)) + if (!class_exists($ogClass=$data['smtpType'])) { - include_once(EGW_INCLUDE_ROOT.'/emailadmin/inc/class.'.$ogClass.'.inc.php'); + if (!file_exists($file=EGW_INCLUDE_ROOT.'/emailadmin/inc/class.'.$ogClass.'.inc.php')) + { + $file = EGW_INCLUDE_ROOT.'/emailadmin/inc/class.'.($ogClass='defaultsmtp').'.inc.php'; + } + include_once($file); } $ogServer = new $ogClass($icServer->domainName); $ogServer->host = $data['smtpServer']; @@ -672,7 +688,7 @@ $ogUserData = $ogServer->getUserData($_accountID); } - return $icUserData + $ogUserData; + return (array)$icUserData + (array)$ogUserData; } From 83503f467a02b92d7591985d968e27b177d0b192 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 19 Aug 2010 15:51:55 +0000 Subject: [PATCH 247/496] moved sieve support from fmail to emailadmin cyrusimap plugin, to use emailadmin imap plugin for that purpose too --- emailadmin/inc/class.cyrusimap.inc.php | 362 ++++++++++-------- emailadmin/inc/class.emailadmin_bo.inc.php | 3 +- .../inc/class.emailadmin_script.inc.php | 20 +- emailadmin/inc/class.emailadmin_sieve.inc.php | 197 ++++++++++ {felamimail => emailadmin}/smartsieve-NOTICE | 0 felamimail/inc/class.bosieve.inc.php | 226 ++--------- felamimail/inc/class.uifelamimail.inc.php | 5 +- felamimail/inc/class.uisieve.inc.php | 4 +- 8 files changed, 449 insertions(+), 368 deletions(-) rename felamimail/inc/class.Script.inc.php => emailadmin/inc/class.emailadmin_script.inc.php (97%) create mode 100644 emailadmin/inc/class.emailadmin_sieve.inc.php rename {felamimail => emailadmin}/smartsieve-NOTICE (100%) diff --git a/emailadmin/inc/class.cyrusimap.inc.php b/emailadmin/inc/class.cyrusimap.inc.php index d59d85e47e..0ad7e89a86 100644 --- a/emailadmin/inc/class.cyrusimap.inc.php +++ b/emailadmin/inc/class.cyrusimap.inc.php @@ -1,180 +1,216 @@ + * @author Klaus Leithoff + * @author Lars Kneschke + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ - include_once(EGW_SERVER_ROOT."/emailadmin/inc/class.defaultimap.inc.php"); +include_once(EGW_SERVER_ROOT."/emailadmin/inc/class.defaultimap.inc.php"); + +/** + * Manages connection to Cyrus IMAP server + * + * Also proxies Sieve calls to emailadmin_sieve (eg. it behaves like the former felamimail bosieve), + * to allow IMAP plugins to also manage Sieve connection. + */ +class cyrusimap extends defaultimap +{ + // mailbox delimiter + var $mailboxDelimiter = '.'; + + // mailbox prefix + var $mailboxPrefix = ''; + + var $enableCyrusAdmin = false; - class cyrusimap extends defaultimap + var $cyrusAdminUsername; + + var $cyrusAdminPassword; + + var $enableSieve = false; + + var $sieveHost; + + var $sievePort; + + function addAccount($_hookValues) { - // mailbox delimiter - var $mailboxDelimiter = '.'; - - // mailbox prefix - var $mailboxPrefix = ''; - - var $enableCyrusAdmin = false; - - var $cyrusAdminUsername; - - var $cyrusAdminPassword; - - var $enableSieve = false; - - var $sieveHost; - - var $sievePort; - - function addAccount($_hookValues) - { - return $this->updateAccount($_hookValues); + return $this->updateAccount($_hookValues); + } + + function deleteAccount($_hookValues) + { + if(!$this->enableCyrusAdmin) { + return false; } - - function deleteAccount($_hookValues) - { - if(!$this->enableCyrusAdmin) { - return false; - } - if($this->_connected === true) { - $this->disconnect(); - } - - // we need a admin connection - if(!$this->openConnection(true)) { - return false; - } - - $username = $_hookValues['account_lid']; - - $mailboxName = $this->getUserMailboxString($username); - - // give the admin account the rights to delete this mailbox - if(PEAR::isError($this->setACL($mailboxName, $this->adminUsername, 'lrswipcda'))) { - $this->disconnect(); - return false; - } - - if(PEAR::isError($this->deleteMailbox($mailboxName))) { - $this->disconnect(); - return false; - } - + if($this->_connected === true) { $this->disconnect(); - - return true; } - - /** - * Create mailbox string from given mailbox-name and user-name - * @param string $_username - * @param string $_folderName='' - * @return string utf-7 encoded (done in getMailboxName) - */ - function getUserMailboxString($_username, $_folderName='') - { - $nameSpaces = $this->getNameSpaces(); - - if(!isset($nameSpaces['others'])) { - return false; - } - $_username = $this->getMailBoxUserName($_username); - $mailboxString = $nameSpaces['others'][0]['name'] . strtolower($_username) . (!empty($_folderName) ? $nameSpaces['others'][0]['delimiter'] . $_folderName : ''); - - if($this->loginType == 'vmailmgr' || $this->loginType == 'email') { - $mailboxString .= '@'.$this->domainName; - } - - return $mailboxString; - } - - function setUserData($_username, $_quota) - { - if(!$this->enableCyrusAdmin) { - return false; - } - - if($this->_connected === true) { - $this->disconnect(); - } - // create a admin connection - if(!$this->openConnection(true)) { - return false; - } - - $mailboxName = $this->getUserMailboxString($_username); - - if((int)$_quota > 0) { - // enable quota - $quota_value = $this->setStorageQuota($mailboxName, (int)$_quota*1024); - } else { - // disable quota - $quota_value = $this->setStorageQuota($mailboxName, -1); - } - - $this->disconnect(); - - return true; - + // we need a admin connection + if(!$this->openConnection(true)) { + return false; } - function updateAccount($_hookValues) - { - if(!$this->enableCyrusAdmin) { - return false; - } - #_debug_array($_hookValues); - $username = $_hookValues['account_lid']; - if(isset($_hookValues['new_passwd'])) { - $userPassword = $_hookValues['new_passwd']; - } + $username = $_hookValues['account_lid']; + + $mailboxName = $this->getUserMailboxString($username); - if($this->_connected === true) { - $this->disconnect(); - } - - // we need a admin connection - if(!$this->openConnection(true)) { - return false; - } + // give the admin account the rights to delete this mailbox + if(PEAR::isError($this->setACL($mailboxName, $this->adminUsername, 'lrswipcda'))) { + $this->disconnect(); + return false; + } - // create the mailbox, with the account_lid, as it is passed from the hook values (gets transformed there if needed) - $mailboxName = $this->getUserMailboxString($username, $mailboxName); - // make sure we use the correct username here. - $username = $this->getMailBoxUserName($username); - $folderInfo = $this->getMailboxes('', $mailboxName, true); - if(empty($folderInfo)) { - if(!PEAR::isError($this->createMailbox($mailboxName))) { - if(PEAR::isError($this->setACL($mailboxName, $username, "lrswipcda"))) { - # log error message - } + if(PEAR::isError($this->deleteMailbox($mailboxName))) { + $this->disconnect(); + return false; + } + + $this->disconnect(); + + return true; + } + + /** + * Create mailbox string from given mailbox-name and user-name + * @param string $_username + * @param string $_folderName='' + * @return string utf-7 encoded (done in getMailboxName) + */ + function getUserMailboxString($_username, $_folderName='') + { + $nameSpaces = $this->getNameSpaces(); + + if(!isset($nameSpaces['others'])) { + return false; + } + $_username = $this->getMailBoxUserName($_username); + $mailboxString = $nameSpaces['others'][0]['name'] . strtolower($_username) . (!empty($_folderName) ? $nameSpaces['others'][0]['delimiter'] . $_folderName : ''); + + if($this->loginType == 'vmailmgr' || $this->loginType == 'email') { + $mailboxString .= '@'.$this->domainName; + } + + return $mailboxString; + } + + function setUserData($_username, $_quota) + { + if(!$this->enableCyrusAdmin) { + return false; + } + + if($this->_connected === true) { + $this->disconnect(); + } + + // create a admin connection + if(!$this->openConnection(true)) { + return false; + } + + $mailboxName = $this->getUserMailboxString($_username); + + if((int)$_quota > 0) { + // enable quota + $quota_value = $this->setStorageQuota($mailboxName, (int)$_quota*1024); + } else { + // disable quota + $quota_value = $this->setStorageQuota($mailboxName, -1); + } + + $this->disconnect(); + + return true; + + } + + function updateAccount($_hookValues) + { + if(!$this->enableCyrusAdmin) { + return false; + } + #_debug_array($_hookValues); + $username = $_hookValues['account_lid']; + if(isset($_hookValues['new_passwd'])) { + $userPassword = $_hookValues['new_passwd']; + } + + if($this->_connected === true) { + $this->disconnect(); + } + + // we need a admin connection + if(!$this->openConnection(true)) { + return false; + } + + // create the mailbox, with the account_lid, as it is passed from the hook values (gets transformed there if needed) + $mailboxName = $this->getUserMailboxString($username, $mailboxName); + // make sure we use the correct username here. + $username = $this->getMailBoxUserName($username); + $folderInfo = $this->getMailboxes('', $mailboxName, true); + if(empty($folderInfo)) { + if(!PEAR::isError($this->createMailbox($mailboxName))) { + if(PEAR::isError($this->setACL($mailboxName, $username, "lrswipcda"))) { + # log error message } } - $this->disconnect(); - - # this part got moved to FeLaMiMail - #// we can only subscribe to the folders, if we have the users password - #if(isset($_hookValues['new_passwd'])) { - # // subscribe to the folders - # if($mbox = @imap_open($this->getMailboxString(), $username, $userPassword)) { - # foreach($this->createMailboxes as $mailboxName) { - # $mailboxName = 'INBOX' . ($mailboxName ? $this->getDelimiter() .$mailboxName : ''); - # imap_subscribe($mbox,$this->getMailboxString($mailboxName)); - # } - # imap_close($mbox); - # } else { - # # log error message - # } - #} } + $this->disconnect(); } -?> + + /** + * Instance of emailadmin_sieve + * + * @var emailadmin_sieve + */ + private $sieve; + + public $scriptName; + public $error; + + //public $error; + + /** + * Proxy former felamimail bosieve methods to internal emailadmin_sieve instance + * + * @param string $name + * @param array $params + */ + public function __call($name,array $params=null) + { + switch($name) + { + case 'installScript': + case 'getScript': + case 'setActive': + case 'setEmailNotification': + case 'getEmailNotification': + case 'setRules': + case 'getRules': + case 'retrieveRules': + case 'getVacation': + case 'setVacation': + case 'setVacationUser': + if (is_null($this->sieve)) + { + $this->sieve = new emailadmin_sieve($this); + $this->scriptName =& $this->sieve->scriptName; + $this->error =& $this->sieve->error; + } + $ret = call_user_func_array(array($this->sieve,$name),$params); + error_log(__CLASS__.'->'.$name.'('.array2string($params).') returns '.array2string($ret)); + return $ret; + } + throw new egw_exception_wrong_parameter("No method '$name' implemented!"); + } +} diff --git a/emailadmin/inc/class.emailadmin_bo.inc.php b/emailadmin/inc/class.emailadmin_bo.inc.php index a9db5f0427..7d9d4cd14d 100644 --- a/emailadmin/inc/class.emailadmin_bo.inc.php +++ b/emailadmin/inc/class.emailadmin_bo.inc.php @@ -609,6 +609,7 @@ if ($imapAuthType == 'email' || $icServer->loginType == 'email') { $icServer->username = $icServer->loginName = $GLOBALS['egw_info']['user']['account_email']; } + if (method_exists($icServer,'init')) $icServer->init(); $eaPreferences->setIncomingServer($icServer); // fetch the SMTP / outgoing server data @@ -644,7 +645,7 @@ $ogServer->password = $GLOBALS['egw_info']['user']['passwd']; } } - + if (method_exists($ogServer,'init')) $ogServer->init(); $eaPreferences->setOutgoingServer($ogServer); foreach($ogServer->getAccountEmailAddress($GLOBALS['egw_info']['user']['account_lid']) as $emailAddresses) diff --git a/felamimail/inc/class.Script.inc.php b/emailadmin/inc/class.emailadmin_script.inc.php similarity index 97% rename from felamimail/inc/class.Script.inc.php rename to emailadmin/inc/class.emailadmin_script.inc.php index aa217f7ee1..8479ba59aa 100644 --- a/felamimail/inc/class.Script.inc.php +++ b/emailadmin/inc/class.emailadmin_script.inc.php @@ -1,13 +1,21 @@ +/** + * EGroupware EMailAdmin: Support for Sieve scripts * * See the inclosed smartsieve-NOTICE file for conditions of use and distribution. + * + * @link http://www.egroupware.org + * @package emailadmin + * @author Stephen Grier + * @copyright 2002 by Stephen Grier + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ */ -class Script { +/** + * Support for Sieve scripts + */ +class emailadmin_script { var $name; /* filename of script. */ var $script; /* full ascii text of script from server. */ @@ -28,7 +36,7 @@ class Script { var $debug=false; // class constructor - function Script ($scriptname) { + function __construct ($scriptname) { $this->name = $scriptname; $this->script = ''; $this->size = 0; diff --git a/emailadmin/inc/class.emailadmin_sieve.inc.php b/emailadmin/inc/class.emailadmin_sieve.inc.php new file mode 100644 index 0000000000..c7fb85ffe5 --- /dev/null +++ b/emailadmin/inc/class.emailadmin_sieve.inc.php @@ -0,0 +1,197 @@ + + * @author Klaus Leithoff + * @author Lars Kneschke + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ + +include_once('Net/Sieve.php'); + +/** + * Support for Sieve scripts + */ +class emailadmin_sieve extends Net_Sieve +{ + /** + * @var object $icServer object containing the information about the imapserver + */ + var $icServer; + + /** + * @var object $icServer object containing the information about the imapserver + */ + var $scriptName; + + /** + * @var object $error the last PEAR error object + */ + var $error; + + /** + * Switch on some error_log debug messages + * + * @var boolean + */ + var $debug = false; + + /** + * Constructor + * + * @param defaultimap $_icServer + */ + function __construct(defaultimap $_icServer=null) + { + parent::Net_Sieve(); + + $this->scriptName = !empty($GLOBALS['egw_info']['user']['preferences']['felamimail']['sieveScriptName']) ? $GLOBALS['egw_info']['user']['preferences']['felamimail']['sieveScriptName'] : 'felamimail'; + + $this->displayCharset = $GLOBALS['egw']->translation->charset(); + + if (!is_null($_icServer) && $this->_connect($_icServer) === 'die') { + die('Sieve not activated'); + } + } + + /** + * Open connection to the sieve server + * + * @param defaultimap $_icServer + * @param string $euser='' effictive user, if given the Cyrus admin account is used to login on behalf of $euser + * @return mixed 'die' = sieve not enabled, false=connect or login failure, true=success + */ + function _connect($_icServer,$euser='') + { + if(is_a($_icServer,'defaultimap') && $_icServer->enableSieve) { + $sieveHost = $_icServer->host; + $sievePort = $_icServer->sievePort; + $useTLS = $_icServer->encryption > 0; + if ($euser) { + $username = $_icServer->adminUsername; + $password = $_icServer->adminPassword; + } else { + $username = $_icServer->loginName; + $password = $_icServer->password; + } + $this->icServer = $_icServer; + } else { + return 'die'; + } + + if(PEAR::isError($this->error = $this->connect($sieveHost , $sievePort, null, $useTLS) ) ){ + if ($this->debug) error_log(__CLASS__.'::'.__METHOD__.": error in connect($sieveHost,$sievePort): ".$this->error->getMessage()); + return false; + } + if(PEAR::isError($this->error = $this->login($username, $password, null, $euser) ) ){ + if ($this->debug) error_log(__CLASS__.'::'.__METHOD__.": error in login($username,$password,null,$euser): ".$this->error->getMessage()); + return false; + } + return true; + } + + function getRules($_scriptName) { + return $this->rules; + } + + function getVacation($_scriptName) { + return $this->vacation; + } + + function getEmailNotification($_scriptName) { + return $this->emailNotification; + } + + function setRules($_scriptName, $_rules) + { + $script = new emailadmin_script($_scriptName); + $script->debug = $this->debug; + + if($script->retrieveRules($this)) { + $script->rules = $_rules; + $script->updateScript($this); + + return true; + } + + return false; + } + + function setVacation($_scriptName, $_vacation) + { + if ($this->debug) error_log(__CLASS__.'::'.__METHOD__."($_scriptName,".print_r($_vacation,true).')'); + $script = new emailadmin_script($_scriptName); + $script->debug = $this->debug; + + if($script->retrieveRules($this)) { + $script->vacation = $_vacation; + $script->updateScript($this); + + // setting up an async job to enable/disable the vacation message + $async = new asyncservice(); + $user = $GLOBALS['egw_info']['user']['account_id']; + $async->delete($async_id ="felamimail-vacation-$user"); + $end_date = $_vacation['end_date'] + 24*3600; // end-date is inclusive, so we have to add 24h + if ($_vacation['status'] == 'by_date' && time() < $end_date) + { + $time = time() < $_vacation['start_date'] ? $_vacation['start_date'] : $end_date; + $async->set_timer($time,$async_id,'felamimail.bosieve.async_vacation',$_vacation+array('scriptName'=>$_scriptName),$user); + } + return true; + } + if ($this->debug) error_log(__CLASS__.'::'.__METHOD__."($_scriptName,".print_r($_vacation,true).') could not retrieve rules!'); + + return false; + } + + /** + * Set vacation with admin right for an other user, used to async enable/disable vacation + * + * @param string $_euser + * @param string $_scriptName + * @param string $_vaction + * @return boolean true on success false otherwise + */ + function setVactionUser($_euser, $_scriptName, $_vaction) + { + if ($this->_connect($this->icServer,$_euser) === true) { + $this->setVacation($_scriptName,$_vacation); + // we need to logout, so further vacation's get processed + $error = $this->_cmdLogout(); + if ($this->debug) error_log(__CLASS__.'::'.__METHOD__.' logout '.(PEAR::isError($error) ? 'failed: '.$ret->getMessage() : 'successful')); + return true; + } + return false; + } + + function setEmailNotification($_scriptName, $_emailNotification) { + if ($_emailNotification['externalEmail'] == '' || !preg_match("/\@/",$_emailNotification['externalEmail'])) { + $_emailNotification['status'] = 'off'; + $_emailNotification['externalEmail'] = ''; + } + + $script = new emailadmin_script($_scriptName); + if ($script->retrieveRules($this)) { + $script->emailNotification = $_emailNotification; + return $script->updateScript($this); + } + return false; + } + + function retrieveRules($_scriptName) { + $script = new emailadmin_script($_scriptName); + + if($script->retrieveRules($this)) { + $this->rules = $script->rules; + $this->vacation = $script->vacation; + $this->emailNotification = $script->emailNotification; // Added email notifications + return true; + } + + return false; + } +} diff --git a/felamimail/smartsieve-NOTICE b/emailadmin/smartsieve-NOTICE similarity index 100% rename from felamimail/smartsieve-NOTICE rename to emailadmin/smartsieve-NOTICE diff --git a/felamimail/inc/class.bosieve.inc.php b/felamimail/inc/class.bosieve.inc.php index c13900df1e..8386823cfa 100644 --- a/felamimail/inc/class.bosieve.inc.php +++ b/felamimail/inc/class.bosieve.inc.php @@ -1,197 +1,37 @@ + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ - #include_once(EGW_SERVER_ROOT. '/felamimail/inc/Sieve.php'); - include_once('Net/Sieve.php'); +/** + * Class containing callback to set/reset vacation notice in future (timed vacation) + * + * Rest of class is moved to emailadmin_sieve and accessible via incomming server object (IMAP). + */ +class bosieve +{ + /** + * Callback for the async job to enable/disable the vacation message + * + * @param array $_vacation + */ + function async_vacation($_vacation) + { + if ($this->debug) error_log(__CLASS__.'::'.__METHOD__.'('.print_r($_vacation,true).')'); + // unset the fm_preferences session object, to force the reload/rebuild + $GLOBALS['egw']->session->appsession('fm_preferences','felamimail',serialize(array())); + $GLOBALS['egw']->session->appsession('session_data','emailadmin',serialize(array())); - class bosieve extends Net_Sieve { - /** - * @var object $icServer object containing the information about the imapserver - */ - var $icServer; - - /** - * @var object $icServer object containing the information about the imapserver - */ - var $scriptName; - - /** - * @var object $error the last PEAR error object - */ - var $error; - - /** - * Switch on some error_log debug messages - * - * @var boolean - */ - var $debug = false; - - function bosieve($_icServer=null) - { - parent::Net_Sieve(); - - $this->scriptName = (!empty($GLOBALS['egw_info']['user']['preferences']['felamimail']['sieveScriptName']) ? $GLOBALS['egw_info']['user']['preferences']['felamimail']['sieveScriptName'] : 'felamimail'); - - $this->displayCharset = $GLOBALS['egw']->translation->charset(); - - if (!is_null($_icServer) && $this->_connect($_icServer) === 'die') { - die('Sieve not activated'); - } - } - - /** - * Open connection to the sieve server - * - * @param defaultimap $_icServer - * @param string $euser='' effictive user, if given the Cyrus admin account is used to login on behalf of $euser - * @return mixed 'die' = sieve not enabled, false=connect or login failure, true=success - */ - function _connect($_icServer,$euser='') - { - if(is_a($_icServer,'defaultimap') && $_icServer->enableSieve) { - $sieveHost = $_icServer->host; - $sievePort = $_icServer->sievePort; - $useTLS = $_icServer->encryption > 0; - if ($euser) { - $username = $_icServer->adminUsername; - $password = $_icServer->adminPassword; - } else { - $username = $_icServer->loginName; - $password = $_icServer->password; - } - $this->icServer = $_icServer; - } else { - return 'die'; - } - - if(PEAR::isError($this->error = $this->connect($sieveHost , $sievePort, null, $useTLS) ) ){ - if ($this->debug) error_log(__CLASS__.'::'.__METHOD__.": error in connect($sieveHost,$sievePort): ".$this->error->getMessage()); - return false; - } - if(PEAR::isError($this->error = $this->login($username, $password, null, $euser) ) ){ - if ($this->debug) error_log(__CLASS__.'::'.__METHOD__.": error in login($username,$password,null,$euser): ".$this->error->getMessage()); - return false; - } - return true; - } - - function getRules($_scriptName) { - return $this->rules; - } - - function getVacation($_scriptName) { - return $this->vacation; - } - - function getEmailNotification($_scriptName) { - return $this->emailNotification; - } - - function setRules($_scriptName, $_rules) - { - $script =& CreateObject('felamimail.Script',$_scriptName); - $script->debug = $this->debug; - - if($script->retrieveRules($this)) { - $script->rules = $_rules; - $script->updateScript($this); - - return true; - } - - return false; - } - - function setVacation($_scriptName, $_vacation) - { - if ($this->debug) error_log(__CLASS__.'::'.__METHOD__."($_scriptName,".print_r($_vacation,true).')'); - $script =& CreateObject('felamimail.Script',$_scriptName); - $script->debug = $this->debug; - - if($script->retrieveRules($this)) { - $script->vacation = $_vacation; - $script->updateScript($this); - - // setting up an async job to enable/disable the vacation message - include_once(EGW_API_INC.'/class.asyncservice.inc.php'); - $async = new asyncservice(); - $user = $GLOBALS['egw_info']['user']['account_id']; - $async->delete($async_id ="felamimail-vacation-$user"); - $end_date = $_vacation['end_date'] + 24*3600; // end-date is inclusive, so we have to add 24h - if ($_vacation['status'] == 'by_date' && time() < $end_date) - { - $time = time() < $_vacation['start_date'] ? $_vacation['start_date'] : $end_date; - $async->set_timer($time,$async_id,'felamimail.bosieve.async_vacation',$_vacation+array('scriptName'=>$_scriptName),$user); - } - return true; - } - if ($this->debug) error_log(__CLASS__.'::'.__METHOD__."($_scriptName,".print_r($_vacation,true).') could not retrieve rules!'); - - return false; - } - - /** - * Callback for the async job to enable/disable the vacation message - * - * @param array $_vacation - */ - function async_vacation($_vacation) - { - if ($this->debug) error_log(__CLASS__.'::'.__METHOD__.'('.print_r($_vacation,true).')'); - // unset the fm_preferences session object, to force the reload/rebuild - $GLOBALS['egw']->session->appsession('fm_preferences','felamimail',serialize(array())); - $GLOBALS['egw']->session->appsession('session_data','emailadmin',serialize(array())); - - $_restoreSession = false; // as in async, each call may be for a different user - $bopreferences = CreateObject('felamimail.bopreferences',$_restoreSession); - $mailPreferences = $bopreferences->getPreferences(); - $icServer = $mailPreferences->getIncomingServer(0); - //error_log(__METHOD__.$icServer->loginName); - if ($this->_connect($icServer,$icServer->loginName) === true) { - $this->setVacation($_vacation['scriptName'],$_vacation); - // we need to logout, so further vacation's get processed - $error = $this->_cmdLogout(); - if ($this->debug) error_log(__CLASS__.'::'.__METHOD__.' logout '.(PEAR::isError($error) ? 'failed: '.$ret->getMessage() : 'successful')); - } - } - - function setEmailNotification($_scriptName, $_emailNotification) { - if ($_emailNotification['externalEmail'] == '' || !preg_match("/\@/",$_emailNotification['externalEmail'])) { - $_emailNotification['status'] = 'off'; - $_emailNotification['externalEmail'] = ''; - } - - $script =& CreateObject('felamimail.Script',$_scriptName); - if ($script->retrieveRules($this)) { - $script->emailNotification = $_emailNotification; - return $script->updateScript($this); - } - return false; - } - - function retrieveRules($_scriptName) { - $script =& CreateObject('felamimail.Script',$_scriptName); - - if($script->retrieveRules($this)) { - $this->rules = $script->rules; - $this->vacation = $script->vacation; - $this->emailNotification = $script->emailNotification; // Added email notifications - return true; - } - - return false; - } + $_restoreSession = false; // as in async, each call may be for a different user + $bopreferences = CreateObject('felamimail.bopreferences',$_restoreSession); + $mailPreferences = $bopreferences->getPreferences(); + $icServer = $mailPreferences->getIncomingServer(0); + $icServer->setVacationUser($icServer->loginName,$_vacation['scriptName'],$_vacation); } -?> +} diff --git a/felamimail/inc/class.uifelamimail.inc.php b/felamimail/inc/class.uifelamimail.inc.php index dc7d4809fe..7b0bd0efb6 100644 --- a/felamimail/inc/class.uifelamimail.inc.php +++ b/felamimail/inc/class.uifelamimail.inc.php @@ -528,9 +528,8 @@ $this->t->set_var('reloadView',$refreshURL); // display a warning if vacation notice is active if(is_a($imapServer,'defaultimap') && $imapServer->enableSieve) { - $this->bosieve = CreateObject('felamimail.bosieve',$imapServer); - $this->bosieve->retrieveRules($this->bosieve->scriptName); - $vacation = $this->bosieve->getVacation($this->bosieve->scriptName); + $imapServer->retrieveRules($imapServer->scriptName); + $vacation = $imapServer->getVacation($imapServer->scriptName); //_debug_array($vacation); // [status] => can be: on, off, by_date // [end_date] => 1247522400 (timestamp, use showdate for visualisation) diff --git a/felamimail/inc/class.uisieve.inc.php b/felamimail/inc/class.uisieve.inc.php index e416aa7f5c..68e484d847 100644 --- a/felamimail/inc/class.uisieve.inc.php +++ b/felamimail/inc/class.uisieve.inc.php @@ -44,7 +44,7 @@ //var $scriptName = 'felamimail'; /** - * @var bosieve + * @var emailadmin_sieve */ var $bosieve; @@ -73,7 +73,7 @@ $icServer = $this->mailPreferences->getIncomingServer(0); if(is_a($icServer,'defaultimap') && $icServer->enableSieve) { - $this->bosieve =& CreateObject('felamimail.bosieve',$icServer); + $this->bosieve = $icServer; $this->timed_vacation = is_a($icServer,'cyrusimap') && $icServer->enableCyrusAdmin && $icServer->adminUsername && $icServer->adminPassword; } else { From f2913cce548035303902bbd1bf9189d2cd53d374 Mon Sep 17 00:00:00 2001 From: Nathan Gray Date: Thu, 19 Aug 2010 16:18:41 +0000 Subject: [PATCH 248/496] Backport 31732 - Fix incorrect address count when searching organisations (#8117) --- addressbook/inc/class.addressbook_sql.inc.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addressbook/inc/class.addressbook_sql.inc.php b/addressbook/inc/class.addressbook_sql.inc.php index 4a8cb91622..7356122db8 100644 --- a/addressbook/inc/class.addressbook_sql.inc.php +++ b/addressbook/inc/class.addressbook_sql.inc.php @@ -146,7 +146,7 @@ class addressbook_sql extends so_sql_cf if (!$by) { $extra = array( - 'COUNT(org_name) AS org_count', + 'COUNT(DISTINCT egw_addressbook.contact_id) AS org_count', "COUNT(DISTINCT CASE WHEN org_unit IS NULL THEN '' ELSE org_unit END) AS org_unit_count", "COUNT(DISTINCT CASE WHEN adr_one_locality IS NULL THEN '' ELSE adr_one_locality END) AS adr_one_locality_count", ); @@ -161,7 +161,7 @@ class addressbook_sql extends so_sql_cf parent::search($param['search'],array('org_name'),$append,array( "NULL AS $by", '1 AS is_main', - 'COUNT(org_name) AS org_count', + 'COUNT(DISTINCT egw_addressbook.contact_id) AS org_count', "COUNT(DISTINCT CASE WHEN org_unit IS NULL THEN '' ELSE org_unit END) AS org_unit_count", "COUNT(DISTINCT CASE WHEN adr_one_locality IS NULL THEN '' ELSE adr_one_locality END) AS adr_one_locality_count", ),'%',false,'OR','UNION',$filter); @@ -170,7 +170,7 @@ class addressbook_sql extends so_sql_cf parent::search($param['search'],array('org_name'),$append,array( "CASE WHEN $by IS NULL THEN '' ELSE $by END AS $by", '0 AS is_main', - 'COUNT(org_name) AS org_count', + 'COUNT(DISTINCT egw_addressbook.contact_id) AS org_count', "COUNT(DISTINCT CASE WHEN org_unit IS NULL THEN '' ELSE org_unit END) AS org_unit_count", "COUNT(DISTINCT CASE WHEN adr_one_locality IS NULL THEN '' ELSE adr_one_locality END) AS adr_one_locality_count", ),'%',false,'OR','UNION',$filter); From fd5489d4587a047cef29a1c501451261c14463a1 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Thu, 19 Aug 2010 18:13:53 +0000 Subject: [PATCH 249/496] - moved plugin capabilities from emailadmin_bo to plugins - moved sieve support and configuration from cyrusimap to defaultimap, as there are other imap server supporting Sieve --- emailadmin/inc/class.cyrusimap.inc.php | 62 +- emailadmin/inc/class.dbmaildbmailuser.inc.php | 308 +-- emailadmin/inc/class.dbmailqmailuser.inc.php | 263 +-- emailadmin/inc/class.defaultimap.inc.php | 1165 ++++++----- emailadmin/inc/class.defaultsmtp.inc.php | 5 + emailadmin/inc/class.emailadmin_bo.inc.php | 1791 ++++++++--------- emailadmin/inc/class.emailadmin_ui.inc.php | 1309 ++++-------- .../inc/class.postfixdbmailuser.inc.php | 5 + emailadmin/inc/class.postfixldap.inc.php | 5 + emailadmin/inc/class.smtpplesk.inc.php | 5 + 10 files changed, 2205 insertions(+), 2713 deletions(-) diff --git a/emailadmin/inc/class.cyrusimap.inc.php b/emailadmin/inc/class.cyrusimap.inc.php index 0ad7e89a86..5a4d8cd215 100644 --- a/emailadmin/inc/class.cyrusimap.inc.php +++ b/emailadmin/inc/class.cyrusimap.inc.php @@ -1,6 +1,6 @@ updateAccount($_hookValues); @@ -167,50 +163,4 @@ class cyrusimap extends defaultimap } $this->disconnect(); } - - /** - * Instance of emailadmin_sieve - * - * @var emailadmin_sieve - */ - private $sieve; - - public $scriptName; - public $error; - - //public $error; - - /** - * Proxy former felamimail bosieve methods to internal emailadmin_sieve instance - * - * @param string $name - * @param array $params - */ - public function __call($name,array $params=null) - { - switch($name) - { - case 'installScript': - case 'getScript': - case 'setActive': - case 'setEmailNotification': - case 'getEmailNotification': - case 'setRules': - case 'getRules': - case 'retrieveRules': - case 'getVacation': - case 'setVacation': - case 'setVacationUser': - if (is_null($this->sieve)) - { - $this->sieve = new emailadmin_sieve($this); - $this->scriptName =& $this->sieve->scriptName; - $this->error =& $this->sieve->error; - } - $ret = call_user_func_array(array($this->sieve,$name),$params); - error_log(__CLASS__.'->'.$name.'('.array2string($params).') returns '.array2string($ret)); - return $ret; - } - throw new egw_exception_wrong_parameter("No method '$name' implemented!"); - } } diff --git a/emailadmin/inc/class.dbmaildbmailuser.inc.php b/emailadmin/inc/class.dbmaildbmailuser.inc.php index 68333d8c77..fcb80143d3 100755 --- a/emailadmin/inc/class.dbmaildbmailuser.inc.php +++ b/emailadmin/inc/class.dbmaildbmailuser.inc.php @@ -1,180 +1,182 @@ + * @author Klaus Leithoff + * @author Lars Kneschke + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ - include_once(EGW_SERVER_ROOT."/emailadmin/inc/class.defaultimap.inc.php"); +include_once(EGW_SERVER_ROOT."/emailadmin/inc/class.defaultimap.inc.php"); + +/** + * Support for DBMail IMAP with qmailUser LDAP schema + * + * @todo base this class on dbmailqmailuser or the other way around + */ +class dbmaildbmailuser extends defaultimap +{ + /** + * Capabilities of this class (pipe-separated): default, sieve, admin, logintypeemail + */ + const CAPABILITIES = 'default|sieve'; - class dbmaildbmailuser extends defaultimap { - var $enableSieve = false; + function addAccount($_hookValues) { + return $this->updateAccount($_hookValues); + } + + #function deleteAccount($_hookValues) { + #} + function getUserData($_username) { + $userData = array(); - var $sieveHost; + $ds = $GLOBALS['egw']->ldap->ldapConnect( + $GLOBALS['egw_info']['server']['ldap_host'], + $GLOBALS['egw_info']['server']['ldap_root_dn'], + $GLOBALS['egw_info']['server']['ldap_root_pw'] + ); - var $sievePort; - - function addAccount($_hookValues) { - return $this->updateAccount($_hookValues); - } - - #function deleteAccount($_hookValues) { - #} - function getUserData($_username) { - $userData = array(); - - $ds = $GLOBALS['egw']->ldap->ldapConnect( - $GLOBALS['egw_info']['server']['ldap_host'], - $GLOBALS['egw_info']['server']['ldap_root_dn'], - $GLOBALS['egw_info']['server']['ldap_root_pw'] - ); - - if(!is_resource($ds)) { - return false; - } - - $filter = '(&(objectclass=posixaccount)(uid='. $_username .')(dbmailGID='. sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])) .'))'; - $justthese = array('dn', 'objectclass', 'mailQuota'); - if($sri = ldap_search($ds, $GLOBALS['egw_info']['server']['ldap_context'], $filter, $justthese)) { - - if($info = ldap_get_entries($ds, $sri)) { - if(isset($info[0]['mailquota'][0])) { - $userData['quotaLimit'] = $info[0]['mailquota'][0] / 1048576; - } - } - } - return $userData; + if(!is_resource($ds)) { + return false; } - function updateAccount($_hookValues) { - if(!$uidnumber = (int)$_hookValues['account_id']) { - return false; - } - - $ds = $GLOBALS['egw']->ldap->ldapConnect( - $GLOBALS['egw_info']['server']['ldap_host'], - $GLOBALS['egw_info']['server']['ldap_root_dn'], - $GLOBALS['egw_info']['server']['ldap_root_pw'] - ); - - if(!is_resource($ds)) { - return false; - } - - $filter = '(&(objectclass=posixaccount)(uidnumber='. $uidnumber .'))'; - $justthese = array('dn', 'objectclass', 'dbmailUID', 'dbmailGID', 'mail'); - $sri = ldap_search($ds, $GLOBALS['egw_info']['server']['ldap_context'], $filter, $justthese); + $filter = '(&(objectclass=posixaccount)(uid='. $_username .')(dbmailGID='. sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])) .'))'; + $justthese = array('dn', 'objectclass', 'mailQuota'); + if($sri = ldap_search($ds, $GLOBALS['egw_info']['server']['ldap_context'], $filter, $justthese)) { if($info = ldap_get_entries($ds, $sri)) { - if((!in_array('dbmailuser',$info[0]['objectclass']) && !in_array('dbmailUser',$info[0]['objectclass'])) && $info[0]['mail']) { - $newData['objectclass'] = $info[0]['objectclass']; - unset($newData['objectclass']['count']); - $newData['objectclass'][] = 'dbmailuser'; - sort($newData['objectclass']); - $newData['dbmailGID'] = sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])); - $newData['dbmailUID'] = (!empty($this->domainName)) ? $_hookValues['account_lid'] .'@'. $this->domainName : $_hookValues['account_lid']; + if(isset($info[0]['mailquota'][0])) { + $userData['quotaLimit'] = $info[0]['mailquota'][0] / 1048576; + } + } + } + return $userData; + } + + function updateAccount($_hookValues) { + if(!$uidnumber = (int)$_hookValues['account_id']) { + return false; + } + + $ds = $GLOBALS['egw']->ldap->ldapConnect( + $GLOBALS['egw_info']['server']['ldap_host'], + $GLOBALS['egw_info']['server']['ldap_root_dn'], + $GLOBALS['egw_info']['server']['ldap_root_pw'] + ); + + if(!is_resource($ds)) { + return false; + } + + $filter = '(&(objectclass=posixaccount)(uidnumber='. $uidnumber .'))'; + $justthese = array('dn', 'objectclass', 'dbmailUID', 'dbmailGID', 'mail'); + $sri = ldap_search($ds, $GLOBALS['egw_info']['server']['ldap_context'], $filter, $justthese); + + if($info = ldap_get_entries($ds, $sri)) { + if((!in_array('dbmailuser',$info[0]['objectclass']) && !in_array('dbmailUser',$info[0]['objectclass'])) && $info[0]['mail']) { + $newData['objectclass'] = $info[0]['objectclass']; + unset($newData['objectclass']['count']); + $newData['objectclass'][] = 'dbmailuser'; + sort($newData['objectclass']); + $newData['dbmailGID'] = sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])); + $newData['dbmailUID'] = (!empty($this->domainName)) ? $_hookValues['account_lid'] .'@'. $this->domainName : $_hookValues['account_lid']; + + if(!ldap_modify($ds, $info[0]['dn'], $newData)) { + #print ldap_error($ds); + } + + return true; + } else { + $newData = array(); + $newData['dbmailUID'] = (!empty($this->domainName)) ? $_hookValues['account_lid'] .'@'. $this->domainName : $_hookValues['account_lid']; + $newData['dbmailGID'] = sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])); + if(!ldap_modify($ds, $info[0]['dn'], $newData)) { + print ldap_error($ds); + _debug_array($newData); + exit; + #return false; + } + } + } + + return false; + } + + function setUserData($_username, $_quota) { + $ds = $GLOBALS['egw']->ldap->ldapConnect( + $GLOBALS['egw_info']['server']['ldap_host'], + $GLOBALS['egw_info']['server']['ldap_root_dn'], + $GLOBALS['egw_info']['server']['ldap_root_pw'] + ); + + if(!is_resource($ds)) { + return false; + } + + $filter = '(&(objectclass=posixaccount)(uid='. $_username .'))'; + $justthese = array('dn', 'objectclass', 'dbmailGID', 'dbmailUID', 'mail'); + $sri = ldap_search($ds, $GLOBALS['egw_info']['server']['ldap_context'], $filter, $justthese); + + if($info = ldap_get_entries($ds, $sri)) { + $validLDAPConfig = false; + if(in_array('dbmailuser',$info[0]['objectclass']) || in_array('dbmailUser',$info[0]['objectclass'])) { + $validLDAPConfig = true; + } + + if(!in_array('dbmailuser',$info[0]['objectclass']) && !in_array('dbmailUser',$info[0]['objectclass']) && $info[0]['mail']) { + $newData['objectclass'] = $info[0]['objectclass']; + unset($newData['objectclass']['count']); + $newData['objectclass'][] = 'dbmailUser'; + sort($newData['objectclass']); + $newData['dbmailGID'] = sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])); + $newData['dbmailUID'] = (!empty($this->domainName)) ? $_username .'@'. $this->domainName : $_username; + + if(ldap_modify($ds, $info[0]['dn'], $newData)) { + $validLDAPConfig = true; + } + } else { + if ((in_array('dbmailuser',$info[0]['objectclass']) || in_array('dbmailUser',$info[0]['objectclass'])) && !$info[0]['dbmailuid']) { + $newData = array(); + $newData['dbmailUID'] = (!empty($this->domainName)) ? $_username .'@'. $this->domainName : $_username; + if(!ldap_modify($ds, $info[0]['dn'], $newData)) { #print ldap_error($ds); + #return false; } - - return true; - } else { + } + + if ((in_array('dbmailuser',$info[0]['objectclass']) || in_array('dbmailUser',$info[0]['objectclass'])) && !$info[0]['dbmailgid']) { $newData = array(); - $newData['dbmailUID'] = (!empty($this->domainName)) ? $_hookValues['account_lid'] .'@'. $this->domainName : $_hookValues['account_lid']; $newData['dbmailGID'] = sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])); - + if(!ldap_modify($ds, $info[0]['dn'], $newData)) { - print ldap_error($ds); - _debug_array($newData); - exit; + #print ldap_error($ds); #return false; } } } - - return false; - } - - function setUserData($_username, $_quota) { - $ds = $GLOBALS['egw']->ldap->ldapConnect( - $GLOBALS['egw_info']['server']['ldap_host'], - $GLOBALS['egw_info']['server']['ldap_root_dn'], - $GLOBALS['egw_info']['server']['ldap_root_pw'] - ); + + if($validLDAPConfig) { + $newData = array(); - if(!is_resource($ds)) { - return false; - } - - $filter = '(&(objectclass=posixaccount)(uid='. $_username .'))'; - $justthese = array('dn', 'objectclass', 'dbmailGID', 'dbmailUID', 'mail'); - $sri = ldap_search($ds, $GLOBALS['egw_info']['server']['ldap_context'], $filter, $justthese); - - if($info = ldap_get_entries($ds, $sri)) { - $validLDAPConfig = false; - if(in_array('dbmailuser',$info[0]['objectclass']) || in_array('dbmailUser',$info[0]['objectclass'])) { - $validLDAPConfig = true; - } - - if(!in_array('dbmailuser',$info[0]['objectclass']) && !in_array('dbmailUser',$info[0]['objectclass']) && $info[0]['mail']) { - $newData['objectclass'] = $info[0]['objectclass']; - unset($newData['objectclass']['count']); - $newData['objectclass'][] = 'dbmailUser'; - sort($newData['objectclass']); - $newData['dbmailGID'] = sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])); - $newData['dbmailUID'] = (!empty($this->domainName)) ? $_username .'@'. $this->domainName : $_username; - - if(ldap_modify($ds, $info[0]['dn'], $newData)) { - $validLDAPConfig = true; - } + if((int)$_quota >= 0) { + $newData['mailQuota'] = (int)$_quota * 1048576; } else { - if ((in_array('dbmailuser',$info[0]['objectclass']) || in_array('dbmailUser',$info[0]['objectclass'])) && !$info[0]['dbmailuid']) { - $newData = array(); - $newData['dbmailUID'] = (!empty($this->domainName)) ? $_username .'@'. $this->domainName : $_username; - - if(!ldap_modify($ds, $info[0]['dn'], $newData)) { - #print ldap_error($ds); - #return false; - } - } - - if ((in_array('dbmailuser',$info[0]['objectclass']) || in_array('dbmailUser',$info[0]['objectclass'])) && !$info[0]['dbmailgid']) { - $newData = array(); - $newData['dbmailGID'] = sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])); - - if(!ldap_modify($ds, $info[0]['dn'], $newData)) { - #print ldap_error($ds); - #return false; - } - } + $newData['mailQuota'] = array(); } - - if($validLDAPConfig) { - $newData = array(); - - if((int)$_quota >= 0) { - $newData['mailQuota'] = (int)$_quota * 1048576; - } else { - $newData['mailQuota'] = array(); - } - - if(!ldap_modify($ds, $info[0]['dn'], $newData)) { - #print ldap_error($ds); - return false; - } + + if(!ldap_modify($ds, $info[0]['dn'], $newData)) { + #print ldap_error($ds); + return false; } - return true; } - - return false; + return true; } - + return false; } -?> +} diff --git a/emailadmin/inc/class.dbmailqmailuser.inc.php b/emailadmin/inc/class.dbmailqmailuser.inc.php index e2150ad13d..1933778a2a 100644 --- a/emailadmin/inc/class.dbmailqmailuser.inc.php +++ b/emailadmin/inc/class.dbmailqmailuser.inc.php @@ -1,92 +1,137 @@ + * @author Klaus Leithoff + * @author Lars Kneschke + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ - include_once(EGW_SERVER_ROOT."/emailadmin/inc/class.defaultimap.inc.php"); +include_once(EGW_SERVER_ROOT."/emailadmin/inc/class.defaultimap.inc.php"); + +/** + * Support for DBMail IMAP with qmailUser LDAP schema + * + * @todo base this class on dbmaildbmailuser or the other way around + */ +class dbmailqmailuser extends defaultimap +{ + /** + * Capabilities of this class (pipe-separated): default, sieve, admin, logintypeemail + */ + const CAPABILITIES = 'default|sieve'; - class dbmailqmailuser extends defaultimap { - var $enableSieve = false; + function addAccount($_hookValues) { + return $this->updateAccount($_hookValues); + } + + #function deleteAccount($_hookValues) { + #} + function getUserData($_username) { + $userData = array(); - var $sieveHost; + $ds = $GLOBALS['egw']->ldap->ldapConnect( + $GLOBALS['egw_info']['server']['ldap_host'], + $GLOBALS['egw_info']['server']['ldap_root_dn'], + $GLOBALS['egw_info']['server']['ldap_root_pw'] + ); - var $sievePort; - - function addAccount($_hookValues) { - return $this->updateAccount($_hookValues); + if(!is_resource($ds)) { + return false; } - - #function deleteAccount($_hookValues) { - #} - function getUserData($_username) { - $userData = array(); - - $ds = $GLOBALS['egw']->ldap->ldapConnect( - $GLOBALS['egw_info']['server']['ldap_host'], - $GLOBALS['egw_info']['server']['ldap_root_dn'], - $GLOBALS['egw_info']['server']['ldap_root_pw'] - ); - - if(!is_resource($ds)) { - return false; - } - $filter = '(&(objectclass=posixaccount)(uid='. $_username .')(qmailGID='. sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])) .'))'; - $justthese = array('dn', 'objectclass', 'mailQuota'); - if($sri = ldap_search($ds, $GLOBALS['egw_info']['server']['ldap_context'], $filter, $justthese)) { + $filter = '(&(objectclass=posixaccount)(uid='. $_username .')(qmailGID='. sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])) .'))'; + $justthese = array('dn', 'objectclass', 'mailQuota'); + if($sri = ldap_search($ds, $GLOBALS['egw_info']['server']['ldap_context'], $filter, $justthese)) { - if($info = ldap_get_entries($ds, $sri)) { - if(isset($info[0]['mailquota'][0])) { - $userData['quotaLimit'] = $info[0]['mailquota'][0] / 1048576; - } + if($info = ldap_get_entries($ds, $sri)) { + if(isset($info[0]['mailquota'][0])) { + $userData['quotaLimit'] = $info[0]['mailquota'][0] / 1048576; } } - return $userData; + } + return $userData; + } + + function updateAccount($_hookValues) { + if(!$uidnumber = (int)$_hookValues['account_id']) { + return false; + } + + $ds = $GLOBALS['egw']->ldap->ldapConnect( + $GLOBALS['egw_info']['server']['ldap_host'], + $GLOBALS['egw_info']['server']['ldap_root_dn'], + $GLOBALS['egw_info']['server']['ldap_root_pw'] + ); + + if(!is_resource($ds)) { + return false; } - function updateAccount($_hookValues) { - if(!$uidnumber = (int)$_hookValues['account_id']) { - return false; - } - - $ds = $GLOBALS['egw']->ldap->ldapConnect( - $GLOBALS['egw_info']['server']['ldap_host'], - $GLOBALS['egw_info']['server']['ldap_root_dn'], - $GLOBALS['egw_info']['server']['ldap_root_pw'] - ); - - if(!is_resource($ds)) { - return false; - } + $filter = '(&(objectclass=posixaccount)(uidnumber='. $uidnumber .'))'; + $justthese = array('dn', 'objectclass', 'qmailUID', 'qmailGID', 'mail'); + $sri = ldap_search($ds, $GLOBALS['egw_info']['server']['ldap_context'], $filter, $justthese); + + if($info = ldap_get_entries($ds, $sri)) { + if(!in_array('qmailuser',$info[0]['objectclass']) && $info[0]['email']) { + $newData['objectclass'] = $info[0]['objectclass']; + unset($newData['objectclass']['count']); + $newData['objectclass'][] = 'qmailuser'; + sort($newData['objectclass']); + $newData['qmailGID'] = sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])); + #$newData['qmailUID'] = (!empty($this->domainName)) ? $_username .'@'. $this->domainName : $_username; + + ldap_modify($ds, $info[0]['dn'], $newData); + + return true; + } else { + $newData = array(); + $newData['qmailGID'] = sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])); + #$newData['qmailUID'] = (!empty($this->domainName)) ? $_username .'@'. $this->domainName : $_username; - $filter = '(&(objectclass=posixaccount)(uidnumber='. $uidnumber .'))'; - $justthese = array('dn', 'objectclass', 'qmailUID', 'qmailGID', 'mail'); - $sri = ldap_search($ds, $GLOBALS['egw_info']['server']['ldap_context'], $filter, $justthese); - - if($info = ldap_get_entries($ds, $sri)) { - if(!in_array('qmailuser',$info[0]['objectclass']) && $info[0]['email']) { - $newData['objectclass'] = $info[0]['objectclass']; - unset($newData['objectclass']['count']); - $newData['objectclass'][] = 'qmailuser'; - sort($newData['objectclass']); - $newData['qmailGID'] = sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])); - #$newData['qmailUID'] = (!empty($this->domainName)) ? $_username .'@'. $this->domainName : $_username; - - ldap_modify($ds, $info[0]['dn'], $newData); - - return true; - } else { + if(!ldap_modify($ds, $info[0]['dn'], $newData)) { + #print ldap_error($ds); + #return false; + } + } + } + + return false; + } + + function setUserData($_username, $_quota) { + $ds = $GLOBALS['egw']->ldap->ldapConnect( + $GLOBALS['egw_info']['server']['ldap_host'], + $GLOBALS['egw_info']['server']['ldap_root_dn'], + $GLOBALS['egw_info']['server']['ldap_root_pw'] + ); + + if(!is_resource($ds)) { + return false; + } + + $filter = '(&(objectclass=posixaccount)(uid='. $_username .'))'; + $justthese = array('dn', 'objectclass', 'qmailGID', 'mail'); + $sri = ldap_search($ds, $GLOBALS['egw_info']['server']['ldap_context'], $filter, $justthese); + + if($info = ldap_get_entries($ds, $sri)) { + #_debug_array($info); + if(!in_array('qmailuser',$info[0]['objectclass']) && $info[0]['email']) { + $newData['objectclass'] = $info[0]['objectclass']; + unset($newData['objectclass']['count']); + $newData['objectclass'][] = 'qmailuser'; + sort($newData['objectclass']); + $newData['qmailGID'] = sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])); + + ldap_modify($ds, $info[0]['dn'], $newData); + } else { + if (in_array('qmailuser',$info[0]['objectclass']) && !$info[0]['qmailgid']) { $newData = array(); $newData['qmailGID'] = sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])); - #$newData['qmailUID'] = (!empty($this->domainName)) ? $_username .'@'. $this->domainName : $_username; if(!ldap_modify($ds, $info[0]['dn'], $newData)) { #print ldap_error($ds); @@ -94,65 +139,23 @@ } } } - - return false; - } - - function setUserData($_username, $_quota) { - $ds = $GLOBALS['egw']->ldap->ldapConnect( - $GLOBALS['egw_info']['server']['ldap_host'], - $GLOBALS['egw_info']['server']['ldap_root_dn'], - $GLOBALS['egw_info']['server']['ldap_root_pw'] - ); + + $newData = array(); - if(!is_resource($ds)) { + if((int)$_quota >= 0) { + $newData['mailQuota'] = (int)$_quota * 1048576; + } else { + $newData['mailQuota'] = array(); + } + + if(!ldap_modify($ds, $info[0]['dn'], $newData)) { + #print ldap_error($ds); return false; } - - $filter = '(&(objectclass=posixaccount)(uid='. $_username .'))'; - $justthese = array('dn', 'objectclass', 'qmailGID', 'mail'); - $sri = ldap_search($ds, $GLOBALS['egw_info']['server']['ldap_context'], $filter, $justthese); - - if($info = ldap_get_entries($ds, $sri)) { - #_debug_array($info); - if(!in_array('qmailuser',$info[0]['objectclass']) && $info[0]['email']) { - $newData['objectclass'] = $info[0]['objectclass']; - unset($newData['objectclass']['count']); - $newData['objectclass'][] = 'qmailuser'; - sort($newData['objectclass']); - $newData['qmailGID'] = sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])); - - ldap_modify($ds, $info[0]['dn'], $newData); - } else { - if (in_array('qmailuser',$info[0]['objectclass']) && !$info[0]['qmailgid']) { - $newData = array(); - $newData['qmailGID'] = sprintf("%u", crc32($GLOBALS['egw_info']['server']['install_id'])); - - if(!ldap_modify($ds, $info[0]['dn'], $newData)) { - #print ldap_error($ds); - #return false; - } - } - } - - $newData = array(); - - if((int)$_quota >= 0) { - $newData['mailQuota'] = (int)$_quota * 1048576; - } else { - $newData['mailQuota'] = array(); - } - - if(!ldap_modify($ds, $info[0]['dn'], $newData)) { - #print ldap_error($ds); - return false; - } - - return true; - } - - return false; + + return true; } + return false; } -?> +} diff --git a/emailadmin/inc/class.defaultimap.inc.php b/emailadmin/inc/class.defaultimap.inc.php index 6b0ac2ea52..7cbbe44371 100644 --- a/emailadmin/inc/class.defaultimap.inc.php +++ b/emailadmin/inc/class.defaultimap.inc.php @@ -1,559 +1,632 @@ + * @author Klaus Leithoff + * @author Lars Kneschke + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ - require_once 'Net/IMAP.php'; +require_once 'Net/IMAP.php'; - define('IMAP_NAMESPACE_PERSONAL', 'personal'); - define('IMAP_NAMESPACE_OTHERS' , 'others'); - define('IMAP_NAMESPACE_SHARED' , 'shared'); - define('IMAP_NAMESPACE_ALL' , 'all'); +define('IMAP_NAMESPACE_PERSONAL', 'personal'); +define('IMAP_NAMESPACE_OTHERS' , 'others'); +define('IMAP_NAMESPACE_SHARED' , 'shared'); +define('IMAP_NAMESPACE_ALL' , 'all'); + +/** + * This class holds all information about the imap connection. + * This is the base class for all other imap classes. + * + * Also proxies Sieve calls to emailadmin_sieve (eg. it behaves like the former felamimail bosieve), + * to allow IMAP plugins to also manage Sieve connection. + */ +class defaultimap extends Net_IMAP +{ + /** + * Capabilities of this class (pipe-separated): default, sieve, admin, logintypeemail + */ + const CAPABILITIES = 'default|sieve'; /** - * This class holds all information about the imap connection. - * This is the base class for all other imap classes. + * the password to be used for admin connections * + * @var string */ - class defaultimap extends Net_IMAP - { - /** - * the password to be used for admin connections - * - * @var string - */ - var $adminPassword; - - /** - * the username to be used for admin connections - * - * @var string - */ - var $adminUsername; - - /** - * enable encryption - * - * @var bool - */ - var $encryption; - - /** - * the hostname/ip address of the imap server - * - * @var string - */ - var $host; - - /** - * the password for the user - * - * @var string - */ - var $password; - - /** - * the port of the imap server - * - * @var integer - */ - var $port = 143; - - /** - * the username - * - * @var string - */ - var $username; - - /** - * the domainname to be used for vmailmgr logins - * - * @var string - */ - var $domainName = false; - - /** - * validate ssl certificate - * - * @var bool - */ - var $validatecert; - - /** - * the mailbox delimiter - * - * @var string - */ - var $mailboxDelimiter = '/'; - - /** - * the mailbox prefix. maybe used by uw-imap only? - * - * @var string - */ - var $mailboxPrefix = '~/mail'; - - /** - * is the mbstring extension available - * - * @var unknown_type - */ - var $mbAvailable; - - /** - * Mailboxes which get automatic created for new accounts (INBOX == '') - * - * @var array - */ - var $imapLoginType; - var $defaultDomain; - - - /** - * disable internal conversion from/to ut7 - * get's used by Net_IMAP - * - * @var array - */ - var $_useUTF_7 = false; - - /** - * a debug switch - */ - var $debug = false; - - /** - * the construtor - * - * @return void - */ - function defaultimap() - { - if (function_exists('mb_convert_encoding')) { - $this->mbAvailable = TRUE; - } - - $this->restoreSessionData(); - - // construtor for Net_IMAP stuff - $this->Net_IMAPProtocol(); - } - - /** - * Magic method to re-connect with the imapserver, if the object get's restored from the session - */ - function __wakeup() - { - #$this->openConnection($this->isAdminConnection); // we need to re-connect - } - - /** - * adds a account on the imap server - * - * @param array $_hookValues - * @return bool true on success, false on failure - */ - function addAccount($_hookValues) - { - return true; - } - - /** - * updates a account on the imap server - * - * @param array $_hookValues - * @return bool true on success, false on failure - */ - function updateAccount($_hookValues) - { - return true; - } - - /** - * deletes a account on the imap server - * - * @param array $_hookValues - * @return bool true on success, false on failure - */ - function deleteAccount($_hookValues) - { - return true; - } - - function disconnect() - { - //error_log(__METHOD__.function_backtrace()); - $retval = parent::disconnect(); - if( PEAR::isError($retval)) error_log(__METHOD__.$retval->message); - $this->_connected = false; - } - - /** - * converts a foldername from current system charset to UTF7 - * - * @param string $_folderName - * @return string the encoded foldername - */ - function encodeFolderName($_folderName) - { - if($this->mbAvailable) { - return mb_convert_encoding($_folderName, "UTF7-IMAP", $GLOBALS['egw']->translation->charset()); - } - - // if not - // we can encode only from ISO 8859-1 - return imap_utf7_encode($_folderName); - } - - /** - * returns the supported capabilities of the imap server - * return false if the imap server does not support capabilities - * - * @return array the supported capabilites - */ - function getCapabilities() - { - if(!is_array($this->sessionData['capabilities'][$this->host])) { - return false; - } - - return $this->sessionData['capabilities'][$this->host]; - } - - /** - * return the delimiter used by the current imap server - * - * @return string the delimimiter - */ - function getDelimiter() - { - return isset($this->sessionData['delimiter'][$this->host]) ? $this->sessionData['delimiter'][$this->host] : $this->mailboxDelimiter; - } - - /** - * Create transport string - * - * @return string the transportstring - */ - function _getTransportString() - { - if($this->encryption == 2) { - $connectionString = "tls://". $this->host; - } elseif($this->encryption == 3) { - $connectionString = "ssl://". $this->host; - } else { - // no tls - $connectionString = $this->host; - } - - return $connectionString; - } - - /** - * Create the options array for SSL/TLS connections - * - * @return string the transportstring - */ - function _getTransportOptions() - { - if($this->validatecert === false) { - if($this->encryption == 2) { - return array( - 'tls' => array( - 'verify_peer' => false, - 'allow_self_signed' => true, - ) - ); - } elseif($this->encryption == 3) { - return array( - 'ssl' => array( - 'verify_peer' => false, - 'allow_self_signed' => true, - ) - ); - } - } else { - if($this->encryption == 2) { - return array( - 'tls' => array( - 'verify_peer' => true, - 'allow_self_signed' => false, - ) - ); - } elseif($this->encryption == 3) { - return array( - 'ssl' => array( - 'verify_peer' => true, - 'allow_self_signed' => false, - ) - ); - } - } - - return null; - } - - /** - * get the effective Username for the Mailbox, as it is depending on the loginType - * @param string $_username - * @return string the effective username to be used to access the Mailbox - */ - function getMailBoxUserName($_username) - { - if ($this->loginType == 'email') - { - $_username = $_username; - $accountID = $GLOBALS['egw']->accounts->name2id($_username); - $accountemail = $GLOBALS['egw']->accounts->id2name($accountID,'account_email'); - //$accountemail = $GLOBALS['egw']->accounts->read($GLOBALS['egw']->accounts->name2id($_username,'account_email')); - if (!empty($accountemail)) - { - list($lusername,$domain) = explode('@',$accountemail,2); - if (strtolower($domain) == strtolower($this->domainName) && !empty($lusername)) - { - $_username = $lusername; - } - } - } - return $_username; - } - - /** - * Create mailbox string from given mailbox-name and user-name - * - * @param string $_folderName='' - * @return string utf-7 encoded (done in getMailboxName) - */ - function getUserMailboxString($_username, $_folderName='') - { - $nameSpaces = $this->getNameSpaces(); - - if(!isset($nameSpaces['others'])) { - return false; - } - - $_username = $this->getMailBoxUserName($_username); - if($this->loginType == 'vmailmgr' || $this->loginType == 'email') { - $_username .= '@'. $this->domainName; - } - - $mailboxString = $nameSpaces['others'][0]['name'] . $_username . (!empty($_folderName) ? $nameSpaces['others'][0]['delimiter'] . $_folderName : ''); - - return $mailboxString; - } - /** - * get list of namespaces - * - * @return array array containing information about namespace - */ - function getNameSpaces() - { - if(!$this->_connected) { - return false; - } - $retrieveDefault = false; - if($this->hasCapability('NAMESPACE')) { - $nameSpace = $this->getNamespace(); - if( PEAR::isError($nameSpace)) { - if ($this->debug) error_log("emailadmin::defaultimap->getNameSpaces:".print_r($nameSpace,true)); - $retrieveDefault = true; - } else { - $result = array(); - - $result['personal'] = $nameSpace['personal']; - - if(is_array($nameSpace['others'])) { - $result['others'] = $nameSpace['others']; - } - - if(is_array($nameSpace['shared'])) { - $result['shared'] = $nameSpace['shared']; - } - } - } - if (!$this->hasCapability('NAMESPACE') || $retrieveDefault) { - $delimiter = $this->getHierarchyDelimiter(); - if( PEAR::isError($delimiter)) $delimiter = '/'; + var $adminPassword; - $result['personal'] = array( - 0 => array( - 'name' => '', - 'delimiter' => $delimiter - ) - ); - } - - return $result; - } - - /** - * returns the quota for given foldername - * gets quota for the current user only - * - * @param string $_folderName - * @return string the current quota for this folder - */ - # function getQuota($_folderName) - # { - # if(!is_resource($this->mbox)) { - # $this->openConnection(); - # } - # - # if(function_exists('imap_get_quotaroot') && $this->supportsCapability('QUOTA')) { - # $quota = @imap_get_quotaroot($this->mbox, $this->encodeFolderName($_folderName)); - # if(is_array($quota) && isset($quota['STORAGE'])) { - # return $quota['STORAGE']; - # } - # } - # - # return false; - # } - - /** - * return the quota for another user - * used by admin connections only - * - * @param string $_username - * @return string the quota for specified user - */ - function getQuotaByUser($_username) - { - $mailboxName = $this->getUserMailboxString($_username); - //error_log(__METHOD__.$mailboxName); - $storageQuota = $this->getStorageQuota($mailboxName); - //error_log(__METHOD__.$_username); - //error_log(__METHOD__.$mailboxName); - if ( PEAR::isError($storageQuota)) error_log(__METHOD__.$storageQuota->message); - if(is_array($storageQuota) && isset($storageQuota['QMAX'])) { - return (int)$storageQuota['QMAX']; - } + /** + * the username to be used for admin connections + * + * @var string + */ + var $adminUsername; + + /** + * enable encryption + * + * @var bool + */ + var $encryption; + + /** + * the hostname/ip address of the imap server + * + * @var string + */ + var $host; + + /** + * the password for the user + * + * @var string + */ + var $password; + + /** + * the port of the imap server + * + * @var integer + */ + var $port = 143; + /** + * the username + * + * @var string + */ + var $username; + + /** + * the domainname to be used for vmailmgr logins + * + * @var string + */ + var $domainName = false; + + /** + * validate ssl certificate + * + * @var bool + */ + var $validatecert; + + /** + * the mailbox delimiter + * + * @var string + */ + var $mailboxDelimiter = '/'; + + /** + * the mailbox prefix. maybe used by uw-imap only? + * + * @var string + */ + var $mailboxPrefix = '~/mail'; + + /** + * is the mbstring extension available + * + * @var unknown_type + */ + var $mbAvailable; + + /** + * Mailboxes which get automatic created for new accounts (INBOX == '') + * + * @var array + */ + var $imapLoginType; + var $defaultDomain; + + + /** + * disable internal conversion from/to ut7 + * get's used by Net_IMAP + * + * @var array + */ + var $_useUTF_7 = false; + + /** + * a debug switch + */ + var $debug = false; + + /** + * Sieve available + * + * @var boolean + */ + var $enableSieve = false; + + /** + * Hostname / IP of sieve host + * + * @var string + */ + var $sieveHost; + + /** + * Port of Sieve service + * + * @var int + */ + var $sievePort = 2000; + + /** + * the construtor + * + * @return void + */ + function __construct() + { + if (function_exists('mb_convert_encoding')) { + $this->mbAvailable = TRUE; + } + + $this->restoreSessionData(); + + // construtor for Net_IMAP stuff + $this->Net_IMAPProtocol(); + } + + /** + * Magic method to re-connect with the imapserver, if the object get's restored from the session + */ + function __wakeup() + { + #$this->openConnection($this->isAdminConnection); // we need to re-connect + } + + /** + * adds a account on the imap server + * + * @param array $_hookValues + * @return bool true on success, false on failure + */ + function addAccount($_hookValues) + { + return true; + } + + /** + * updates a account on the imap server + * + * @param array $_hookValues + * @return bool true on success, false on failure + */ + function updateAccount($_hookValues) + { + return true; + } + + /** + * deletes a account on the imap server + * + * @param array $_hookValues + * @return bool true on success, false on failure + */ + function deleteAccount($_hookValues) + { + return true; + } + + function disconnect() + { + //error_log(__METHOD__.function_backtrace()); + $retval = parent::disconnect(); + if( PEAR::isError($retval)) error_log(__METHOD__.$retval->message); + $this->_connected = false; + } + + /** + * converts a foldername from current system charset to UTF7 + * + * @param string $_folderName + * @return string the encoded foldername + */ + function encodeFolderName($_folderName) + { + if($this->mbAvailable) { + return mb_convert_encoding($_folderName, "UTF7-IMAP", $GLOBALS['egw']->translation->charset()); + } + + // if not + // we can encode only from ISO 8859-1 + return imap_utf7_encode($_folderName); + } + + /** + * returns the supported capabilities of the imap server + * return false if the imap server does not support capabilities + * + * @return array the supported capabilites + */ + function getCapabilities() + { + if(!is_array($this->sessionData['capabilities'][$this->host])) { return false; } - /** - * returns information about a user - * currently only supported information is the current quota - * - * @param string $_username - * @return array userdata - */ - function getUserData($_username) - { - if($this->_connected === true) { - //error_log(__METHOD__."try to disconnect"); - $this->disconnect(); - } - - $this->openConnection(true); - $userData = array(); - - if($quota = $this->getQuotaByUser($_username)) { - $userData['quotaLimit'] = $quota / 1024; - } - - $this->disconnect(); - - return $userData; - } - - /** - * opens a connection to a imap server - * - * @param bool $_adminConnection create admin connection if true - * - * @return resource the imap connection - */ - function openConnection($_adminConnection=false) - { - //error_log(__METHOD__.function_backtrace()); - unset($this->_connectionErrorObject); - - if($_adminConnection) { - $username = $this->adminUsername; - $password = $this->adminPassword; - $options = ''; - $this->isAdminConnection = true; - } else { - $username = $this->loginName; - $password = $this->password; - $options = $_options; - $this->isAdminConnection = false; - } - - $this->setStreamContextOptions($this->_getTransportOptions()); - $this->setTimeout(20); - if( PEAR::isError($status = parent::connect($this->_getTransportString(), $this->port, $this->encryption == 1)) ) { - if ($this->debug) error_log(__METHOD__."Could not connect with ".$this->_getTransportString()." on Port ".$this->port." Encryption==1?".$this->encryption); - if ($this->debug) error_log(__METHOD__."Status connect:".$status->message); - $this->_connectionErrorObject = $status; - return false; - } - if(empty($username)) - { - if ($this->debug) error_log(__METHOD__."No username supplied.".function_backtrace()); - return false; - } - if( PEAR::isError($status = parent::login($username, $password, TRUE, !$this->isAdminConnection)) ) { - if ($this->debug) error_log(__METHOD__."Could not log in with ->".$username.":".$password."<- Domain:".$GLOBALS['egw_info']['user']['domain']); - if ($this->debug) error_log(__METHOD__."Status login:".array2string($status->message)); - if ($this->debug) error_log(__METHOD__.'Called from:'.function_backtrace()); - $this->disconnect(); - $this->_connectionErrorObject = $status; - return false; - } - - return true; - } - - /** - * restore session variable - * - */ - function restoreSessionData() - { - $this->sessionData = $GLOBALS['egw']->session->appsession('imap_session_data'); - } - - /** - * save session variable - * - */ - function saveSessionData() - { - $GLOBALS['egw']->session->appsession('imap_session_data','',$this->sessionData); - } - - /** - * set userdata - * - * @param string $_username username of the user - * @param int $_quota quota in bytes - * @return bool true on success, false on failure - */ - function setUserData($_username, $_quota) - { - return true; - } - - /** - * check if imap server supports given capability - * - * @param string $_capability the capability to check for - * @return bool true if capability is supported, false if not - */ - function supportsCapability($_capability) - { - return $this->hasCapability($_capability); - } + return $this->sessionData['capabilities'][$this->host]; } -?> + + /** + * return the delimiter used by the current imap server + * + * @return string the delimimiter + */ + function getDelimiter() + { + return isset($this->sessionData['delimiter'][$this->host]) ? $this->sessionData['delimiter'][$this->host] : $this->mailboxDelimiter; + } + + /** + * Create transport string + * + * @return string the transportstring + */ + function _getTransportString() + { + if($this->encryption == 2) { + $connectionString = "tls://". $this->host; + } elseif($this->encryption == 3) { + $connectionString = "ssl://". $this->host; + } else { + // no tls + $connectionString = $this->host; + } + + return $connectionString; + } + + /** + * Create the options array for SSL/TLS connections + * + * @return string the transportstring + */ + function _getTransportOptions() + { + if($this->validatecert === false) { + if($this->encryption == 2) { + return array( + 'tls' => array( + 'verify_peer' => false, + 'allow_self_signed' => true, + ) + ); + } elseif($this->encryption == 3) { + return array( + 'ssl' => array( + 'verify_peer' => false, + 'allow_self_signed' => true, + ) + ); + } + } else { + if($this->encryption == 2) { + return array( + 'tls' => array( + 'verify_peer' => true, + 'allow_self_signed' => false, + ) + ); + } elseif($this->encryption == 3) { + return array( + 'ssl' => array( + 'verify_peer' => true, + 'allow_self_signed' => false, + ) + ); + } + } + + return null; + } + + /** + * get the effective Username for the Mailbox, as it is depending on the loginType + * @param string $_username + * @return string the effective username to be used to access the Mailbox + */ + function getMailBoxUserName($_username) + { + if ($this->loginType == 'email') + { + $_username = $_username; + $accountID = $GLOBALS['egw']->accounts->name2id($_username); + $accountemail = $GLOBALS['egw']->accounts->id2name($accountID,'account_email'); + //$accountemail = $GLOBALS['egw']->accounts->read($GLOBALS['egw']->accounts->name2id($_username,'account_email')); + if (!empty($accountemail)) + { + list($lusername,$domain) = explode('@',$accountemail,2); + if (strtolower($domain) == strtolower($this->domainName) && !empty($lusername)) + { + $_username = $lusername; + } + } + } + return $_username; + } + + /** + * Create mailbox string from given mailbox-name and user-name + * + * @param string $_folderName='' + * @return string utf-7 encoded (done in getMailboxName) + */ + function getUserMailboxString($_username, $_folderName='') + { + $nameSpaces = $this->getNameSpaces(); + + if(!isset($nameSpaces['others'])) { + return false; + } + + $_username = $this->getMailBoxUserName($_username); + if($this->loginType == 'vmailmgr' || $this->loginType == 'email') { + $_username .= '@'. $this->domainName; + } + + $mailboxString = $nameSpaces['others'][0]['name'] . $_username . (!empty($_folderName) ? $nameSpaces['others'][0]['delimiter'] . $_folderName : ''); + + return $mailboxString; + } + /** + * get list of namespaces + * + * @return array array containing information about namespace + */ + function getNameSpaces() + { + if(!$this->_connected) { + return false; + } + $retrieveDefault = false; + if($this->hasCapability('NAMESPACE')) { + $nameSpace = $this->getNamespace(); + if( PEAR::isError($nameSpace)) { + if ($this->debug) error_log("emailadmin::defaultimap->getNameSpaces:".print_r($nameSpace,true)); + $retrieveDefault = true; + } else { + $result = array(); + + $result['personal'] = $nameSpace['personal']; + + if(is_array($nameSpace['others'])) { + $result['others'] = $nameSpace['others']; + } + + if(is_array($nameSpace['shared'])) { + $result['shared'] = $nameSpace['shared']; + } + } + } + if (!$this->hasCapability('NAMESPACE') || $retrieveDefault) { + $delimiter = $this->getHierarchyDelimiter(); + if( PEAR::isError($delimiter)) $delimiter = '/'; + + $result['personal'] = array( + 0 => array( + 'name' => '', + 'delimiter' => $delimiter + ) + ); + } + + return $result; + } + + /** + * returns the quota for given foldername + * gets quota for the current user only + * + * @param string $_folderName + * @return string the current quota for this folder + */ +# function getQuota($_folderName) +# { +# if(!is_resource($this->mbox)) { +# $this->openConnection(); +# } +# +# if(function_exists('imap_get_quotaroot') && $this->supportsCapability('QUOTA')) { +# $quota = @imap_get_quotaroot($this->mbox, $this->encodeFolderName($_folderName)); +# if(is_array($quota) && isset($quota['STORAGE'])) { +# return $quota['STORAGE']; +# } +# } +# +# return false; +# } + + /** + * return the quota for another user + * used by admin connections only + * + * @param string $_username + * @return string the quota for specified user + */ + function getQuotaByUser($_username) + { + $mailboxName = $this->getUserMailboxString($_username); + //error_log(__METHOD__.$mailboxName); + $storageQuota = $this->getStorageQuota($mailboxName); + //error_log(__METHOD__.$_username); + //error_log(__METHOD__.$mailboxName); + if ( PEAR::isError($storageQuota)) error_log(__METHOD__.$storageQuota->message); + if(is_array($storageQuota) && isset($storageQuota['QMAX'])) { + return (int)$storageQuota['QMAX']; + } + + return false; + } + + /** + * returns information about a user + * currently only supported information is the current quota + * + * @param string $_username + * @return array userdata + */ + function getUserData($_username) + { + if($this->_connected === true) { + //error_log(__METHOD__."try to disconnect"); + $this->disconnect(); + } + + $this->openConnection(true); + $userData = array(); + + if($quota = $this->getQuotaByUser($_username)) { + $userData['quotaLimit'] = $quota / 1024; + } + + $this->disconnect(); + + return $userData; + } + + /** + * opens a connection to a imap server + * + * @param bool $_adminConnection create admin connection if true + * + * @return resource the imap connection + */ + function openConnection($_adminConnection=false) + { + //error_log(__METHOD__.function_backtrace()); + unset($this->_connectionErrorObject); + + if($_adminConnection) { + $username = $this->adminUsername; + $password = $this->adminPassword; + $options = ''; + $this->isAdminConnection = true; + } else { + $username = $this->loginName; + $password = $this->password; + $options = $_options; + $this->isAdminConnection = false; + } + + $this->setStreamContextOptions($this->_getTransportOptions()); + $this->setTimeout(20); + if( PEAR::isError($status = parent::connect($this->_getTransportString(), $this->port, $this->encryption == 1)) ) { + if ($this->debug) error_log(__METHOD__."Could not connect with ".$this->_getTransportString()." on Port ".$this->port." Encryption==1?".$this->encryption); + if ($this->debug) error_log(__METHOD__."Status connect:".$status->message); + $this->_connectionErrorObject = $status; + return false; + } + if(empty($username)) + { + if ($this->debug) error_log(__METHOD__."No username supplied.".function_backtrace()); + return false; + } + if( PEAR::isError($status = parent::login($username, $password, TRUE, !$this->isAdminConnection)) ) { + if ($this->debug) error_log(__METHOD__."Could not log in with ->".$username.":".$password."<-"); + if ($this->debug) error_log(__METHOD__."Status login:".array2string($status->message)); + //error_log(__METHOD__.'Called from:'.function_backtrace()); + $this->disconnect(); + $this->_connectionErrorObject = $status; + return false; + } + + return true; + } + + /** + * restore session variable + * + */ + function restoreSessionData() + { + $this->sessionData = $GLOBALS['egw']->session->appsession('imap_session_data'); + } + + /** + * save session variable + * + */ + function saveSessionData() + { + $GLOBALS['egw']->session->appsession('imap_session_data','',$this->sessionData); + } + + /** + * set userdata + * + * @param string $_username username of the user + * @param int $_quota quota in bytes + * @return bool true on success, false on failure + */ + function setUserData($_username, $_quota) + { + return true; + } + + /** + * check if imap server supports given capability + * + * @param string $_capability the capability to check for + * @return bool true if capability is supported, false if not + */ + function supportsCapability($_capability) + { + return $this->hasCapability($_capability); + } + + /** + * Instance of emailadmin_sieve + * + * @var emailadmin_sieve + */ + private $sieve; + + public $scriptName; + public $error; + + //public $error; + + /** + * Proxy former felamimail bosieve methods to internal emailadmin_sieve instance + * + * @param string $name + * @param array $params + */ + public function __call($name,array $params=null) + { + switch($name) + { + case 'installScript': + case 'getScript': + case 'setActive': + case 'setEmailNotification': + case 'getEmailNotification': + case 'setRules': + case 'getRules': + case 'retrieveRules': + case 'getVacation': + case 'setVacation': + case 'setVacationUser': + if (is_null($this->sieve)) + { + $this->sieve = new emailadmin_sieve($this); + $this->scriptName =& $this->sieve->scriptName; + $this->error =& $this->sieve->error; + } + $ret = call_user_func_array(array($this->sieve,$name),$params); + error_log(__CLASS__.'->'.$name.'('.array2string($params).') returns '.array2string($ret)); + return $ret; + } + throw new egw_exception_wrong_parameter("No method '$name' implemented!"); + } +} diff --git a/emailadmin/inc/class.defaultsmtp.inc.php b/emailadmin/inc/class.defaultsmtp.inc.php index 11973d0270..522e4be6cb 100644 --- a/emailadmin/inc/class.defaultsmtp.inc.php +++ b/emailadmin/inc/class.defaultsmtp.inc.php @@ -13,6 +13,11 @@ class defaultsmtp { + /** + * Capabilities of this class (pipe-separated): default, forward + */ + const CAPABILITIES = 'default'; + var $smtpAuth = false; var $editForwardingAddress = false; diff --git a/emailadmin/inc/class.emailadmin_bo.inc.php b/emailadmin/inc/class.emailadmin_bo.inc.php index 7d9d4cd14d..2d5db879c2 100644 --- a/emailadmin/inc/class.emailadmin_bo.inc.php +++ b/emailadmin/inc/class.emailadmin_bo.inc.php @@ -1,941 +1,930 @@ + * @author Klaus Leithoff + * @author Lars Kneschke + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ - class emailadmin_bo extends so_sql - { - /** - * Name of our table - */ - const TABLE = 'egw_emailadmin'; - /** - * Name of app the table is registered - */ - const APP = 'emailadmin'; - /** - * Fields that are numeric - */ - static $numericfields = array( - 'ea_profile_id', - 'ea_smtp_type', - 'ea_smtp_port', - 'ea_smtp_auth', - 'ea_editforwardingaddress', - 'ea_smtp_ldap_use_default', - 'ea_imap_type', - 'ea_imap_port', - 'ea_imap_login_type', - 'ea_imap_tsl_auth', - 'ea_imap_tsl_encryption', - 'ea_imap_enable_cyrus', - 'ea_imap_enable_sieve', - 'ea_imap_sieve_port', - 'ea_user_defined_identities', - 'ea_user_defined_accounts', - 'ea_order', - 'ea_active', - 'ea_group', - 'ea_user', - 'ea_appname', - 'ea_user_defined_signatures', - ); - - static $sessionData = array(); - #var $userSessionData; - var $LDAPData; - - //var $SMTPServerType = array(); // holds a list of config options - static $SMTPServerType = array( - 'defaultsmtp' => array( - 'fieldNames' => array( - 'smtpServer', - 'smtpPort', - 'smtpAuth', - 'ea_smtp_auth_username', - 'ea_smtp_auth_password', - 'smtpType' - ), - 'description' => 'standard SMTP-Server', - 'smtpcapabilities' => 'default', - 'classname' => 'defaultsmtp' - ), - 'postfixldap' => array( - 'fieldNames' => array( - 'smtpServer', - 'smtpPort', - 'smtpAuth', - 'ea_smtp_auth_username', - 'ea_smtp_auth_password', - 'smtpType', - 'editforwardingaddress', - 'smtpLDAPServer', - 'smtpLDAPAdminDN', - 'smtpLDAPAdminPW', - 'smtpLDAPBaseDN', - 'smtpLDAPUseDefault' - ), - 'description' => 'Postfix (qmail Schema)', - 'smtpcapabilities' => 'default|forward', - 'classname' => 'postfixldap' - ), - 'postfixinetorgperson' => array( - 'fieldNames' => array( - 'smtpServer', - 'smtpPort', - 'smtpAuth', - 'ea_smtp_auth_username', - 'ea_smtp_auth_password', - 'smtpType', - ), - 'description' => 'Postfix (inetOrgPerson Schema)', - 'smtpcapabilities' => 'default', - 'classname' => 'postfixinetorgperson' - ), - 'smtpplesk' => array( - 'fieldNames' => array( - 'smtpServer', - 'smtpPort', - 'smtpAuth', - 'ea_smtp_auth_username', - 'ea_smtp_auth_password', - 'smtpType', - 'editforwardingaddress', - ), - 'description' => 'Plesk SMTP-Server (Qmail)', - 'smtpcapabilities' => 'default|forward', - 'classname' => 'smtpplesk' - ), - 'postfixdbmailuser' => array( - 'fieldNames' => array( - 'smtpServer', - 'smtpPort', - 'smtpAuth', - 'ea_smtp_auth_username', - 'ea_smtp_auth_password', - 'smtpType', - 'editforwardingaddress', - 'smtpLDAPServer', - 'smtpLDAPAdminDN', - 'smtpLDAPAdminPW', - 'smtpLDAPBaseDN', - 'smtpLDAPUseDefault' - ), - 'description' => 'Postfix (dbmail Schema)', - 'smtpcapabilities' => 'default|forward', - 'classname' => 'postfixdbmailuser' - ), - 'stylite_postfixmandriva' => array( - 'fieldNames' => array( - 'smtpServer', - 'smtpPort', - 'smtpAuth', - 'ea_smtp_auth_username', - 'ea_smtp_auth_password', - 'smtpType', - 'editforwardingaddress', - 'smtpLDAPServer', - 'smtpLDAPAdminDN', - 'smtpLDAPAdminPW', - 'smtpLDAPBaseDN', - 'smtpLDAPUseDefault' - ), - 'description' => 'Postfix (Mandriva mailAccount schema)', - 'smtpcapabilities' => 'default|forward', - 'classname' => 'stylite_postfixmandriva' - ), - 'stylite_postfixsuse' => array( - 'fieldNames' => array( - 'smtpServer', - 'smtpPort', - 'smtpAuth', - 'ea_smtp_auth_username', - 'ea_smtp_auth_password', - 'smtpType', - 'editforwardingaddress', - 'smtpLDAPServer', - 'smtpLDAPAdminDN', - 'smtpLDAPAdminPW', - 'smtpLDAPBaseDN', - 'smtpLDAPUseDefault' - ), - 'description' => 'Postfix (SuseMailServer schema)', - 'smtpcapabilities' => 'default|forward', - 'classname' => 'stylite_postfixsuse' - ), +/** + * Business logic + */ +class emailadmin_bo extends so_sql +{ + /** + * Name of our table + */ + const TABLE = 'egw_emailadmin'; + /** + * Name of app the table is registered + */ + const APP = 'emailadmin'; + /** + * Fields that are numeric + */ + static $numericfields = array( + 'ea_profile_id', + 'ea_smtp_type', + 'ea_smtp_port', + 'ea_smtp_auth', + 'ea_editforwardingaddress', + 'ea_smtp_ldap_use_default', + 'ea_imap_type', + 'ea_imap_port', + 'ea_imap_login_type', + 'ea_imap_tsl_auth', + 'ea_imap_tsl_encryption', + 'ea_imap_enable_cyrus', + 'ea_imap_enable_sieve', + 'ea_imap_sieve_port', + 'ea_user_defined_identities', + 'ea_user_defined_accounts', + 'ea_order', + 'ea_active', + 'ea_group', + 'ea_user', + 'ea_appname', + 'ea_user_defined_signatures', ); - //var $IMAPServerType = array(); // holds a list of config options - static $IMAPServerType = array( - 'defaultimap' => array( - 'fieldNames' => array( - 'imapServer', - 'imapPort', - 'imapType', - 'imapLoginType', - 'imapTLSEncryption', - 'imapTLSAuthentication', - 'imapAuthUsername', - 'imapAuthPassword' - ), - 'description' => 'standard IMAP server', - 'protocol' => 'imap', - 'imapcapabilities' => 'default', - 'classname' => 'defaultimap' - ), - 'cyrusimap' => array( - 'fieldNames' => array( - 'imapServer', - 'imapPort', - 'imapType', - 'imapLoginType', - 'imapTLSEncryption', - 'imapTLSAuthentication', - 'imapEnableCyrusAdmin', - 'imapAdminUsername', - 'imapAdminPW', - 'imapEnableSieve', - 'imapSieveServer', - 'imapSievePort', - 'imapAuthUsername', - 'imapAuthPassword' - ), - 'description' => 'Cyrus IMAP Server', - 'protocol' => 'imap', - 'imapcapabilities' => 'default|sieve|admin|logintypeemail', - 'classname' => 'cyrusimap' - ), - 'dbmailqmailuser' => array( - 'fieldNames' => array( - 'imapServer', - 'imapPort', - 'imapType', - 'imapLoginType', - 'imapTLSEncryption', - 'imapTLSAuthentication', - 'imapEnableSieve', - 'imapSieveServer', - 'imapSievePort', - 'imapAuthUsername', - 'imapAuthPassword', - ), - 'description' => 'DBMail (qmailUser schema)', - 'protocol' => 'imap', - 'imapcapabilities' => 'default|sieve', - 'classname' => 'dbmailqmailuser' - ), - 'pleskimap' => array( - 'fieldNames' => array( - 'imapServer', - 'imapPort', - 'imapType', - 'imapLoginType', - 'imapTLSEncryption', - 'imapTLSAuthentication', - 'imapAuthUsername', - 'imapAuthPassword' - ), - 'description' => 'Plesk IMAP Server (Courier)', - 'protocol' => 'imap', - 'imapcapabilities' => 'default', - 'classname' => 'pleskimap' - ), - 'dbmaildbmailuser' => array( - 'fieldNames' => array( - 'imapServer', - 'imapPort', - 'imapType', - 'imapLoginType', - 'imapTLSEncryption', - 'imapTLSAuthentication', - 'imapEnableSieve', - 'imapSieveServer', - 'imapSievePort', - 'imapAuthUsername', - 'imapAuthPassword' - ), - 'description' => 'DBMail (dbmailUser schema)', - 'protocol' => 'imap', - 'imapcapabilities' => 'default|sieve', - 'classname' => 'dbmaildbmailuser' - ), - ); - var $imapClass; // holds the imap/pop3 class - var $smtpClass; // holds the smtp class + static $sessionData = array(); + #var $userSessionData; + var $LDAPData; + + //var $SMTPServerType = array(); // holds a list of config options + static $SMTPServerType = array( + 'defaultsmtp' => array( + 'fieldNames' => array( + 'smtpServer', + 'smtpPort', + 'smtpAuth', + 'ea_smtp_auth_username', + 'ea_smtp_auth_password', + 'smtpType' + ), + 'description' => 'standard SMTP-Server', + 'classname' => 'defaultsmtp' + ), + 'postfixldap' => array( + 'fieldNames' => array( + 'smtpServer', + 'smtpPort', + 'smtpAuth', + 'ea_smtp_auth_username', + 'ea_smtp_auth_password', + 'smtpType', + 'editforwardingaddress', + 'smtpLDAPServer', + 'smtpLDAPAdminDN', + 'smtpLDAPAdminPW', + 'smtpLDAPBaseDN', + 'smtpLDAPUseDefault' + ), + 'description' => 'Postfix (qmail Schema)', + 'classname' => 'postfixldap' + ), + 'postfixinetorgperson' => array( + 'fieldNames' => array( + 'smtpServer', + 'smtpPort', + 'smtpAuth', + 'ea_smtp_auth_username', + 'ea_smtp_auth_password', + 'smtpType', + ), + 'description' => 'Postfix (inetOrgPerson Schema)', + 'classname' => 'postfixinetorgperson' + ), + 'smtpplesk' => array( + 'fieldNames' => array( + 'smtpServer', + 'smtpPort', + 'smtpAuth', + 'ea_smtp_auth_username', + 'ea_smtp_auth_password', + 'smtpType', + 'editforwardingaddress', + ), + 'description' => 'Plesk SMTP-Server (Qmail)', + 'classname' => 'smtpplesk' + ), + 'postfixdbmailuser' => array( + 'fieldNames' => array( + 'smtpServer', + 'smtpPort', + 'smtpAuth', + 'ea_smtp_auth_username', + 'ea_smtp_auth_password', + 'smtpType', + 'editforwardingaddress', + 'smtpLDAPServer', + 'smtpLDAPAdminDN', + 'smtpLDAPAdminPW', + 'smtpLDAPBaseDN', + 'smtpLDAPUseDefault' + ), + 'description' => 'Postfix (dbmail Schema)', + 'classname' => 'postfixdbmailuser' + ), + 'stylite_postfixmandriva' => array( + 'fieldNames' => array( + 'smtpServer', + 'smtpPort', + 'smtpAuth', + 'ea_smtp_auth_username', + 'ea_smtp_auth_password', + 'smtpType', + 'editforwardingaddress', + 'smtpLDAPServer', + 'smtpLDAPAdminDN', + 'smtpLDAPAdminPW', + 'smtpLDAPBaseDN', + 'smtpLDAPUseDefault' + ), + 'description' => 'Postfix (Mandriva mailAccount schema)', + 'classname' => 'stylite_postfixmandriva' + ), + 'stylite_postfixsuse' => array( + 'fieldNames' => array( + 'smtpServer', + 'smtpPort', + 'smtpAuth', + 'ea_smtp_auth_username', + 'ea_smtp_auth_password', + 'smtpType', + 'editforwardingaddress', + 'smtpLDAPServer', + 'smtpLDAPAdminDN', + 'smtpLDAPAdminPW', + 'smtpLDAPBaseDN', + 'smtpLDAPUseDefault' + ), + 'description' => 'Postfix (SuseMailServer schema)', + 'classname' => 'stylite_postfixsuse' + ), + ); + //var $IMAPServerType = array(); // holds a list of config options + static $IMAPServerType = array( + 'defaultimap' => array( + 'fieldNames' => array( + 'imapServer', + 'imapPort', + 'imapType', + 'imapLoginType', + 'imapTLSEncryption', + 'imapTLSAuthentication', + 'imapAuthUsername', + 'imapAuthPassword' + ), + 'description' => 'standard IMAP server', + 'protocol' => 'imap', + 'classname' => 'defaultimap' + ), + 'cyrusimap' => array( + 'fieldNames' => array( + 'imapServer', + 'imapPort', + 'imapType', + 'imapLoginType', + 'imapTLSEncryption', + 'imapTLSAuthentication', + 'imapEnableCyrusAdmin', + 'imapAdminUsername', + 'imapAdminPW', + 'imapEnableSieve', + 'imapSieveServer', + 'imapSievePort', + 'imapAuthUsername', + 'imapAuthPassword' + ), + 'description' => 'Cyrus IMAP Server', + 'protocol' => 'imap', + 'classname' => 'cyrusimap' + ), + 'dbmailqmailuser' => array( + 'fieldNames' => array( + 'imapServer', + 'imapPort', + 'imapType', + 'imapLoginType', + 'imapTLSEncryption', + 'imapTLSAuthentication', + 'imapEnableSieve', + 'imapSieveServer', + 'imapSievePort', + 'imapAuthUsername', + 'imapAuthPassword', + ), + 'description' => 'DBMail (qmailUser schema)', + 'protocol' => 'imap', + 'classname' => 'dbmailqmailuser' + ), + 'pleskimap' => array( + 'fieldNames' => array( + 'imapServer', + 'imapPort', + 'imapType', + 'imapLoginType', + 'imapTLSEncryption', + 'imapTLSAuthentication', + 'imapAuthUsername', + 'imapAuthPassword' + ), + 'description' => 'Plesk IMAP Server (Courier)', + 'protocol' => 'imap', + 'classname' => 'pleskimap' + ), + 'dbmaildbmailuser' => array( + 'fieldNames' => array( + 'imapServer', + 'imapPort', + 'imapType', + 'imapLoginType', + 'imapTLSEncryption', + 'imapTLSAuthentication', + 'imapEnableSieve', + 'imapSieveServer', + 'imapSievePort', + 'imapAuthUsername', + 'imapAuthPassword' + ), + 'description' => 'DBMail (dbmailUser schema)', + 'protocol' => 'imap', + 'classname' => 'dbmaildbmailuser' + ), + ); + + var $imapClass; // holds the imap/pop3 class + var $smtpClass; // holds the smtp class - function __construct($_profileID=-1,$_restoreSesssion=true) + function __construct($_profileID=-1,$_restoreSesssion=true) + { + parent::__construct(self::APP,self::TABLE,null,'',true); + + if (!is_object($GLOBALS['emailadmin_bo'])) { - - parent::__construct(self::APP,self::TABLE,null,'',true); - - if (!is_object($GLOBALS['emailadmin_bo'])) - { - $GLOBALS['emailadmin_bo'] = $this; - } - $this->soemailadmin = new emailadmin_so(); - //translate the standard entry description - self::$SMTPServerType['defaultsmtp']['description'] = lang('standard SMTP-Server'); - self::$IMAPServerType['defaultimap']['description'] = lang('standard IMAP Server'); - if ($_restoreSesssion) // && !(is_array(self::$sessionData) && (count(self::$sessionData)>0)) ) - { - $this->restoreSessionData(); - } - if ($_restoreSesssion===false) // && (is_array(self::$sessionData) && (count(self::$sessionData)>0)) ) - { - // make sure session data will be created new - self::$sessionData = array(); - self::saveSessionData(); - } - #_debug_array(self::$sessionData); - if($_profileID >= 0) - { - $this->profileID = $_profileID; - - $this->profileData = $this->getProfile($_profileID); - - // try autoloading class, if that fails include it from emailadmin - if (!class_exists($class = self::$IMAPServerType[$this->profileData['imapType']]['classname'])) - { - include_once(EGW_INCLUDE_ROOT.'/emailadmin/inc/class.'.$class.'.inc.php'); - } - $this->imapClass = new $class; - - if (!class_exists($class = self::$SMTPServerType[$this->profileData['smtpType']]['classname'])) - { - include_once(EGW_INCLUDE_ROOT.'/emailadmin/inc/class.'.$class.'.inc.php'); - } - $this->smtpClass = new $class; - } + $GLOBALS['emailadmin_bo'] = $this; } - - function addAccount($_hookValues) + $this->soemailadmin = new emailadmin_so(); + //translate the standard entry description + self::$SMTPServerType['defaultsmtp']['description'] = lang('standard SMTP-Server'); + self::$IMAPServerType['defaultimap']['description'] = lang('standard IMAP Server'); + if ($_restoreSesssion) // && !(is_array(self::$sessionData) && (count(self::$sessionData)>0)) ) { - if (is_object($this->imapClass)) - { - #ExecMethod("emailadmin.".$this->imapClass.".addAccount",$_hookValues,3,$this->profileData); - $this->imapClass->addAccount($_hookValues); - } - - if (is_object($this->smtpClass)) - { - #ExecMethod("emailadmin.".$this->smtpClass.".addAccount",$_hookValues,3,$this->profileData); - $this->smtpClass->addAccount($_hookValues); - } - self::$sessionData =array(); - $this->saveSessionData(); + $this->restoreSessionData(); } - - function deleteAccount($_hookValues) + if ($_restoreSesssion===false) // && (is_array(self::$sessionData) && (count(self::$sessionData)>0)) ) { - if (is_object($this->imapClass)) - { - #ExecMethod("emailadmin.".$this->imapClass.".deleteAccount",$_hookValues,3,$this->profileData); - $this->imapClass->deleteAccount($_hookValues); - } - - if (is_object($this->smtpClass)) - { - #ExecMethod("emailadmin.".$this->smtpClass.".deleteAccount",$_hookValues,3,$this->profileData); - $this->smtpClass->deleteAccount($_hookValues); - } + // make sure session data will be created new self::$sessionData = array(); - $this->saveSessionData(); + self::saveSessionData(); } - - function getAccountEmailAddress($_accountName, $_profileID) + #_debug_array(self::$sessionData); + if($_profileID >= 0) { - $profileData = $this->getProfile($_profileID); + $this->profileID = $_profileID; - #$smtpClass = self::$SMTPServerType[$profileData['smtpType']]['classname']; - $smtpClass = CreateObject('emailadmin.'.self::$SMTPServerType[$profileData['smtpType']]['classname']); + $this->profileData = $this->getProfile($_profileID); - #return empty($smtpClass) ? False : ExecMethod("emailadmin.$smtpClass.getAccountEmailAddress",$_accountName,3,$profileData); - return is_object($smtpClass) ? $smtpClass->getAccountEmailAddress($_accountName) : False; - } - - function getFieldNames($_serverTypeID, $_class) - { - switch($_class) + // try autoloading class, if that fails include it from emailadmin + if (!class_exists($class = self::$IMAPServerType[$this->profileData['imapType']]['classname'])) { - case 'imap': - return self::$IMAPServerType[$_serverTypeID]['fieldNames']; - break; - case 'smtp': - return self::$SMTPServerType[$_serverTypeID]['fieldNames']; + include_once(EGW_INCLUDE_ROOT.'/emailadmin/inc/class.'.$class.'.inc.php'); + } + $this->imapClass = new $class; + + if (!class_exists($class = self::$SMTPServerType[$this->profileData['smtpType']]['classname'])) + { + include_once(EGW_INCLUDE_ROOT.'/emailadmin/inc/class.'.$class.'.inc.php'); + } + $this->smtpClass = new $class; + } + } + + function addAccount($_hookValues) + { + if (is_object($this->imapClass)) + { + #ExecMethod("emailadmin.".$this->imapClass.".addAccount",$_hookValues,3,$this->profileData); + $this->imapClass->addAccount($_hookValues); + } + + if (is_object($this->smtpClass)) + { + #ExecMethod("emailadmin.".$this->smtpClass.".addAccount",$_hookValues,3,$this->profileData); + $this->smtpClass->addAccount($_hookValues); + } + self::$sessionData =array(); + $this->saveSessionData(); + } + + function deleteAccount($_hookValues) + { + if (is_object($this->imapClass)) + { + #ExecMethod("emailadmin.".$this->imapClass.".deleteAccount",$_hookValues,3,$this->profileData); + $this->imapClass->deleteAccount($_hookValues); + } + + if (is_object($this->smtpClass)) + { + #ExecMethod("emailadmin.".$this->smtpClass.".deleteAccount",$_hookValues,3,$this->profileData); + $this->smtpClass->deleteAccount($_hookValues); + } + self::$sessionData = array(); + $this->saveSessionData(); + } + + function getAccountEmailAddress($_accountName, $_profileID) + { + $profileData = $this->getProfile($_profileID); + + #$smtpClass = self::$SMTPServerType[$profileData['smtpType']]['classname']; + $smtpClass = CreateObject('emailadmin.'.self::$SMTPServerType[$profileData['smtpType']]['classname']); + + #return empty($smtpClass) ? False : ExecMethod("emailadmin.$smtpClass.getAccountEmailAddress",$_accountName,3,$profileData); + return is_object($smtpClass) ? $smtpClass->getAccountEmailAddress($_accountName) : False; + } + + function getFieldNames($_serverTypeID, $_class) + { + switch($_class) + { + case 'imap': + return self::$IMAPServerType[$_serverTypeID]['fieldNames']; + break; + case 'smtp': + return self::$SMTPServerType[$_serverTypeID]['fieldNames']; + break; + } + } + + function getLDAPStorageData($_serverid) + { + $storageData = $this->soemailadmin->getLDAPStorageData($_serverid); + return $storageData; + } + + function getMailboxString($_folderName) + { + if (is_object($this->imapClass)) + { + return ExecMethod("emailadmin.".$this->imapClass.".getMailboxString",$_folderName,3,$this->profileData); + return $this->imapClass->getMailboxString($_folderName); + } + else + { + return false; + } + } + + function getProfile($_profileID) + { + if (!(is_array(self::$sessionData) && (count(self::$sessionData)>0))) $this->restoreSessionData(); + if (is_array(self::$sessionData) && (count(self::$sessionData)>0) && self::$sessionData['profile'][$_profileID]) { + #error_log("sessionData Restored for Profile $_profileID
    "); + return self::$sessionData['profile'][$_profileID]; + } + $profileData = $this->soemailadmin->getProfileList($_profileID); + $found = false; + if (is_array($profileData) && count($profileData)) + { + foreach($profileData as $n => $data) + { + if ($data['ProfileID'] == $_profileID) + { + $found = $n; break; + } } } - - function getLDAPStorageData($_serverid) + if ($found === false) // no existing profile selected { - $storageData = $this->soemailadmin->getLDAPStorageData($_serverid); - return $storageData; + if (is_array($profileData) && count($profileData)) { // if we have a profile use that + reset($profileData); + list($found,$data) = each($profileData); + $this->profileID = $_profileID = $data['profileID']; + } elseif ($GLOBALS['egw_info']['server']['smtp_server']) { // create a default profile, from the data in the api config + $this->profileID = $_profileID = $this->soemailadmin->addProfile(array( + 'description' => $GLOBALS['egw_info']['server']['smtp_server'], + 'defaultDomain' => $GLOBALS['egw_info']['server']['mail_suffix'], + 'organisationName' => '', + 'userDefinedAccounts' => '', + 'userDefinedIdentities' => '', + ),array( + 'smtpServer' => $GLOBALS['egw_info']['server']['smtp_server'], + 'smtpPort' => $GLOBALS['egw_info']['server']['smtp_port'], + 'smtpAuth' => '', + 'smtpType' => 'defaultsmtp', + ),array( + 'imapServer' => $GLOBALS['egw_info']['server']['mail_server'] ? + $GLOBALS['egw_info']['server']['mail_server'] : $GLOBALS['egw_info']['server']['smtp_server'], + 'imapPort' => '143', + 'imapType' => 'defaultimap', // imap + 'imapLoginType' => $GLOBALS['egw_info']['server']['mail_login_type'] ? + $GLOBALS['egw_info']['server']['mail_login_type'] : 'standard', + 'imapTLSEncryption' => '0', + 'imapTLSAuthentication' => '', + )); + $profileData[$found = 0] = array( + 'smtpType' => 'defaultsmtp', + 'imapType' => 'defaultimap', + ); + } } - - function getMailboxString($_folderName) + $fieldNames = array(); + if (isset($profileData[$found])) { - if (is_object($this->imapClass)) + $fieldNames = array_merge(self::$SMTPServerType[$profileData[$found]['smtpType']]['fieldNames'], + self::$IMAPServerType[$profileData[$found]['imapType']]['fieldNames']); + } + $fieldNames[] = 'description'; + $fieldNames[] = 'defaultDomain'; + $fieldNames[] = 'profileID'; + $fieldNames[] = 'organisationName'; + $fieldNames[] = 'userDefinedAccounts'; + $fieldNames[] = 'userDefinedIdentities'; + $fieldNames[] = 'ea_appname'; + $fieldNames[] = 'ea_group'; + $fieldNames[] = 'ea_user'; + $fieldNames[] = 'ea_active'; + $fieldNames[] = 'ea_user_defined_signatures'; + $fieldNames[] = 'ea_default_signature'; + $fieldNames[] = 'ea_stationery_active_templates'; + + $profileData = $this->soemailadmin->getProfile($_profileID, $fieldNames); + $profileData['imapTLSEncryption'] = ($profileData['imapTLSEncryption'] == 'yes' ? 1 : (int)$profileData['imapTLSEncryption']); + if(strlen($profileData['ea_stationery_active_templates']) > 0) + { + $profileData['ea_stationery_active_templates'] = unserialize($profileData['ea_stationery_active_templates']); + } + self::$sessionData['profile'][$_profileID] = $profileData; + $this->saveSessionData(); + return $profileData; + } + + function getProfileList($_profileID='',$_appName=false,$_groupID=false,$_accountID=false) + { + if ($_appName!==false ||$_groupID!==false ||$_accountID!==false) { + return $this->soemailadmin->getProfileList($_profileID,false,$_appName,$_groupID,$_accountID); + } else { + return $this->soemailadmin->getProfileList($_profileID); + } + } + + /** + * Get a list of supported SMTP servers + * + * Calls hook "smtp_server_types" to allow applications to supply own server-types + * + * @return array classname => label pairs + */ + static public function getSMTPServerTypes() + { + $retData = array(); + foreach(self::$SMTPServerType as $key => $value) + { + $retData[$key] = $value['description']; + } + foreach($GLOBALS['egw']->hooks->process('smtp_server_types',array(),true) as $app => $data) + { + if ($data) $retData += $data; + } + return $retData; + } + + /** + * Get a list of supported SMTP servers + * + * Calls hook "imap_server_types" to allow applications to supply own server-types + * + * @param boolean $extended=true + * @return array classname => label pairs + */ + static public function getIMAPServerTypes($extended=true) + { + $retData = array(); + foreach(self::$IMAPServerType as $key => $value) + { + if ($extended) { - return ExecMethod("emailadmin.".$this->imapClass.".getMailboxString",$_folderName,3,$this->profileData); - return $this->imapClass->getMailboxString($_folderName); + $retData[$key]['description'] = $value['description']; + $retData[$key]['protocol'] = $value['protocol']; } else { - return false; + $retData[$key] = $value['description']; } } - - function getProfile($_profileID) + foreach($GLOBALS['egw']->hooks->process(array( + 'location' => 'imap_server_types', + 'extended' => $extended, + ),array(),true) as $app => $data) { - if (!(is_array(self::$sessionData) && (count(self::$sessionData)>0))) $this->restoreSessionData(); - if (is_array(self::$sessionData) && (count(self::$sessionData)>0) && self::$sessionData['profile'][$_profileID]) { - #error_log("sessionData Restored for Profile $_profileID
    "); - return self::$sessionData['profile'][$_profileID]; - } - $profileData = $this->soemailadmin->getProfileList($_profileID); - $found = false; - if (is_array($profileData) && count($profileData)) + if ($data) $retData += $data; + } + return $retData; + } + + /** + * Get EMailAdmin profile for a user + * + * @param string $_appName='' + * @param int|array $_groups='' + * @return ea_preferences + */ + function getUserProfile($_appName='', $_groups='') + { + if (!(is_array(self::$sessionData) && (count(self::$sessionData)>0))) $this->restoreSessionData(); + if (is_array(self::$sessionData) && count(self::$sessionData)>0 && self::$sessionData['ea_preferences']) + { + //error_log("sessionData Restored for UserProfile
    "); + return self::$sessionData['ea_preferences']; + } + $appName = ($_appName != '' ? $_appName : $GLOBALS['egw_info']['flags']['currentapp']); + if(!is_array($_groups)) { + // initialize with 0 => means no group id + $groups = array(0); + // set the second entry to the users primary group + $groups[] = $GLOBALS['egw_info']['user']['account_primary_group']; + $userGroups = $GLOBALS['egw']->accounts->membership($GLOBALS['egw_info']['user']['account_id']); + foreach((array)$userGroups as $groupInfo) { + $groups[] = $groupInfo['account_id']; + } + } else { + $groups = $_groups; + } + + if($data = $this->soemailadmin->getUserProfile($appName, $groups,$GLOBALS['egw_info']['user']['account_id'])) + { + $eaPreferences = CreateObject('emailadmin.ea_preferences'); + + // fetch the IMAP / incomming server data + if (!class_exists($icClass=$data['imapType'])) { - foreach($profileData as $n => $data) + if (!file_exists($file=EGW_INCLUDE_ROOT.'/emailadmin/inc/class.'.$icClass.'.inc.php')) { - if ($data['ProfileID'] == $_profileID) + $file = EGW_INCLUDE_ROOT.'/emailadmin/inc/class.'.($icClass='defaultimap').'.inc.php'; + } + include_once($file); + } + $icServer = new $icClass; + $icServer->encryption = ($data['imapTLSEncryption'] == 'yes' ? 1 : (int)$data['imapTLSEncryption']); + $icServer->host = $data['imapServer']; + $icServer->port = $data['imapPort']; + $icServer->validatecert = $data['imapTLSAuthentication'] == 'yes'; + $icServer->username = $GLOBALS['egw_info']['user']['account_lid']; + $icServer->password = $GLOBALS['egw_info']['user']['passwd']; + // restore the default loginType and check if there are forced/predefined user access Data ($imapAuthType may be set to admin) + list($data['imapLoginType'],$imapAuthType) = explode('#',$data['imapLoginType'],2); + $icServer->loginType = $data['imapLoginType']; + $icServer->domainName = $data['defaultDomain']; + $icServer->loginName = $data['imapLoginType'] == 'standard' ? $GLOBALS['egw_info']['user']['account_lid'] : $GLOBALS['egw_info']['user']['account_lid'].'@'.$data['defaultDomain']; + $icServer->enableCyrusAdmin = ($data['imapEnableCyrusAdmin'] == 'yes'); + $icServer->adminUsername = $data['imapAdminUsername']; + $icServer->adminPassword = $data['imapAdminPW']; + $icServer->enableSieve = ($data['imapEnableSieve'] == 'yes'); + $icServer->sievePort = $data['imapSievePort']; + if ($imapAuthType == 'admin') { + if (!empty($data['imapAuthUsername'])) $icServer->username = $icServer->loginName = $data['imapAuthUsername']; + if (!empty($data['imapAuthPassword'])) $icServer->password = $data['imapAuthPassword']; + } + if ($imapAuthType == 'email' || $icServer->loginType == 'email') { + $icServer->username = $icServer->loginName = $GLOBALS['egw_info']['user']['account_email']; + } + if (method_exists($icServer,'init')) $icServer->init(); + $eaPreferences->setIncomingServer($icServer); + + // fetch the SMTP / outgoing server data + if (!class_exists($ogClass=$data['smtpType'])) + { + if (!file_exists($file=EGW_INCLUDE_ROOT.'/emailadmin/inc/class.'.$ogClass.'.inc.php')) + { + $file = EGW_INCLUDE_ROOT.'/emailadmin/inc/class.'.($ogClass='defaultsmtp').'.inc.php'; + } + include_once($file); + } + $ogServer = new $ogClass($icServer->domainName); + $ogServer->host = $data['smtpServer']; + $ogServer->port = $data['smtpPort']; + $ogServer->editForwardingAddress = ($data['editforwardingaddress'] == 'yes'); + $ogServer->smtpAuth = $data['smtpAuth'] == 'yes'; + if($ogServer->smtpAuth) { + if(!empty($data['ea_smtp_auth_username'])) { + $ogServer->username = $data['ea_smtp_auth_username']; + } else { + // if we use special logintypes for IMAP, we assume this to be used for SMTP too + if ($imapAuthType == 'email' || $icServer->loginType == 'email') { + $ogServer->username = $GLOBALS['egw_info']['user']['account_email']; + } elseif ($icServer->loginType == 'vmailmgr') { + $ogServer->username = $GLOBALS['egw_info']['user']['account_lid'].'@'.$icServer->domainName; + } else { + $ogServer->username = $GLOBALS['egw_info']['user']['account_lid']; + } + } + if(!empty($data['ea_smtp_auth_password'])) { + $ogServer->password = $data['ea_smtp_auth_password']; + } else { + $ogServer->password = $GLOBALS['egw_info']['user']['passwd']; + } + } + if (method_exists($ogServer,'init')) $ogServer->init(); + $eaPreferences->setOutgoingServer($ogServer); + + foreach($ogServer->getAccountEmailAddress($GLOBALS['egw_info']['user']['account_lid']) as $emailAddresses) + { + $identity = CreateObject('emailadmin.ea_identity'); + $identity->emailAddress = $emailAddresses['address']; + $identity->realName = $emailAddresses['name']; + $identity->default = ($emailAddresses['type'] == 'default'); + $identity->organization = $data['organisationName']; + + $eaPreferences->setIdentity($identity); + } + + $eaPreferences->userDefinedAccounts = ($data['userDefinedAccounts'] == 'yes'); + $eaPreferences->userDefinedIdentities = ($data['userDefinedIdentities'] == 'yes'); + $eaPreferences->ea_user_defined_signatures = ($data['ea_user_defined_signatures'] == 'yes'); + $eaPreferences->ea_default_signature = $data['ea_default_signature']; + if(strlen($data['ea_stationery_active_templates']) > 0) + { + $eaPreferences->ea_stationery_active_templates = unserialize($data['ea_stationery_active_templates']); + } + self::$sessionData['ea_preferences'] = $eaPreferences; + $this->saveSessionData(); + return $eaPreferences; + } + + return false; + } + + function getUserData($_accountID) + { + + if($userProfile = $this->getUserProfile('felamimail')) { + $icServer = $userProfile->getIncomingServer(0); + if(is_a($icServer, 'defaultimap') && $username = $GLOBALS['egw']->accounts->id2name($_accountID)) { + $icUserData = $icServer->getUserData($username); + } + + $ogServer = $userProfile->getOutgoingServer(0); + if(is_a($ogServer, 'defaultsmtp')) { + $ogUserData = $ogServer->getUserData($_accountID); + } + + return (array)$icUserData + (array)$ogUserData; + + } + + return false; + } + + function restoreSessionData() + { + $GLOBALS['egw_info']['flags']['autoload'] = array(__CLASS__,'autoload'); + + //echo function_backtrace()."
    "; + //unserializing the sessiondata, since they are serialized for objects sake + self::$sessionData = (array) unserialize($GLOBALS['egw']->session->appsession('session_data','emailadmin')); + } + + /** + * Autoload classes from emailadmin, 'til they get autoloading conform names + * + * @param string $class + */ + static function autoload($class) + { + if (file_exists($file=EGW_INCLUDE_ROOT.'/emailadmin/inc/class.'.$class.'.inc.php')) + { + include_once($file); + } + } + + function saveSMTPForwarding($_accountID, $_forwardingAddress, $_keepLocalCopy) + { + if (is_object($this->smtpClass)) + { + #$smtpClass = CreateObject('emailadmin.'.$this->smtpClass,$this->profileID); + #$smtpClass->saveSMTPForwarding($_accountID, $_forwardingAddress, $_keepLocalCopy); + $this->smtpClass->saveSMTPForwarding($_accountID, $_forwardingAddress, $_keepLocalCopy); + } + + } + + /** + * called by the validation hook in setup + * + * @param array $settings following keys: mail_server, mail_server_type {IMAP|IMAPS|POP-3|POP-3S}, + * mail_login_type {standard|vmailmgr}, mail_suffix (domain), smtp_server, smpt_port, smtp_auth_user, smtp_auth_passwd + */ + function setDefaultProfile($settings) + { + if (($profiles = $this->soemailadmin->getProfileList(0,true))) + { + $profile = array_shift($profiles); + } + else + { + $profile = array( + 'smtpType' => 'defaultsmtp', + 'description' => 'default profile (created by setup)', + 'ea_appname' => '', + 'ea_group' => 0, + 'ea_user' => 0, + 'ea_active' => 1, + ); + + if (empty($settings['mail_server'])) $profile['userDefinedAccounts'] = 'yes'; + if (empty($settings['mail_server'])) $profile['userDefinedIdentities'] == 'yes'; + if (empty($settings['mail_server'])) $profile['ea_user_defined_signatures'] == 'yes'; + + } + foreach($to_parse = array( + 'mail_server' => 'imapServer', + 'mail_server_type' => array( + 'imap' => array( + 'imapType' => 'defaultimap', + 'imapPort' => 143, + 'imapTLSEncryption' => 0, + ), + 'imaps' => array( + 'imapType' => 'defaultimap', + 'imapPort' => 993, + 'imapTLSEncryption' => '3', + ), + ), + 'mail_login_type' => 'imapLoginType', + 'mail_suffix' => 'defaultDomain', + 'smtp_server' => 'smtpServer', + 'smpt_port' => 'smtpPort', + 'smtp_auth_user' => 'ea_smtp_auth_username', + 'smtp_auth_passwd' => 'ea_smtp_auth_password', + ) as $setup_name => $ea_name_data) + { + if (!is_array($ea_name_data)) + { + $profile[$ea_name_data] = $settings[$setup_name]; + if ($setup_name == 'smtp_auth_user') $profile['stmpAuth'] = !empty($settings['smtp_auth_user']); + } + else + { + foreach($ea_name_data as $setup_val => $ea_data) + { + if ($setup_val == $settings[$setup_name]) { - $found = $n; + foreach($ea_data as $var => $val) + { + if ($var != 'imapType' || $val != 'defaultimap') // old code: || $profile[$var] < 3) // dont kill special imap server types + { + $profile[$var] = $val; + } + } break; } } } - if ($found === false) // no existing profile selected - { - if (is_array($profileData) && count($profileData)) { // if we have a profile use that - reset($profileData); - list($found,$data) = each($profileData); - $this->profileID = $_profileID = $data['profileID']; - } elseif ($GLOBALS['egw_info']['server']['smtp_server']) { // create a default profile, from the data in the api config - $this->profileID = $_profileID = $this->soemailadmin->addProfile(array( - 'description' => $GLOBALS['egw_info']['server']['smtp_server'], - 'defaultDomain' => $GLOBALS['egw_info']['server']['mail_suffix'], - 'organisationName' => '', - 'userDefinedAccounts' => '', - 'userDefinedIdentities' => '', - ),array( - 'smtpServer' => $GLOBALS['egw_info']['server']['smtp_server'], - 'smtpPort' => $GLOBALS['egw_info']['server']['smtp_port'], - 'smtpAuth' => '', - 'smtpType' => 'defaultsmtp', - ),array( - 'imapServer' => $GLOBALS['egw_info']['server']['mail_server'] ? - $GLOBALS['egw_info']['server']['mail_server'] : $GLOBALS['egw_info']['server']['smtp_server'], - 'imapPort' => '143', - 'imapType' => 'defaultimap', // imap - 'imapLoginType' => $GLOBALS['egw_info']['server']['mail_login_type'] ? - $GLOBALS['egw_info']['server']['mail_login_type'] : 'standard', - 'imapTLSEncryption' => '0', - 'imapTLSAuthentication' => '', - )); - $profileData[$found = 0] = array( - 'smtpType' => 'defaultsmtp', - 'imapType' => 'defaultimap', - ); - } - } - $fieldNames = array(); - if (isset($profileData[$found])) - { - $fieldNames = array_merge(self::$SMTPServerType[$profileData[$found]['smtpType']]['fieldNames'], - self::$IMAPServerType[$profileData[$found]['imapType']]['fieldNames']); - } - $fieldNames[] = 'description'; - $fieldNames[] = 'defaultDomain'; - $fieldNames[] = 'profileID'; - $fieldNames[] = 'organisationName'; - $fieldNames[] = 'userDefinedAccounts'; - $fieldNames[] = 'userDefinedIdentities'; - $fieldNames[] = 'ea_appname'; - $fieldNames[] = 'ea_group'; - $fieldNames[] = 'ea_user'; - $fieldNames[] = 'ea_active'; - $fieldNames[] = 'ea_user_defined_signatures'; - $fieldNames[] = 'ea_default_signature'; - $fieldNames[] = 'ea_stationery_active_templates'; - - $profileData = $this->soemailadmin->getProfile($_profileID, $fieldNames); - $profileData['imapTLSEncryption'] = ($profileData['imapTLSEncryption'] == 'yes' ? 1 : (int)$profileData['imapTLSEncryption']); - if(strlen($profileData['ea_stationery_active_templates']) > 0) - { - $profileData['ea_stationery_active_templates'] = unserialize($profileData['ea_stationery_active_templates']); - } - self::$sessionData['profile'][$_profileID] = $profileData; - $this->saveSessionData(); - return $profileData; } + // merge the other not processed values unchanged + $profile = array_merge($profile,array_diff_assoc($settings,$to_parse)); - function getProfileList($_profileID='',$_appName=false,$_groupID=false,$_accountID=false) - { - if ($_appName!==false ||$_groupID!==false ||$_accountID!==false) { - return $this->soemailadmin->getProfileList($_profileID,false,$_appName,$_groupID,$_accountID); - } else { - return $this->soemailadmin->getProfileList($_profileID); - } - } - - /** - * Get a list of supported SMTP servers - * - * Calls hook "smtp_server_types" to allow applications to supply own server-types - * - * @return array classname => label pairs - */ - static public function getSMTPServerTypes() - { - $retData = array(); - foreach(self::$SMTPServerType as $key => $value) - { - $retData[$key] = $value['description']; - } - foreach($GLOBALS['egw']->hooks->process('smtp_server_types',array(),true) as $app => $data) - { - if ($data) $retData += $data; - } - return $retData; - } - - /** - * Get a list of supported SMTP servers - * - * Calls hook "imap_server_types" to allow applications to supply own server-types - * - * @param boolean $extended=true - * @return array classname => label pairs - */ - static public function getIMAPServerTypes($extended=true) - { - $retData = array(); - foreach(self::$IMAPServerType as $key => $value) - { - if ($extended) - { - $retData[$key]['description'] = $value['description']; - $retData[$key]['protocol'] = $value['protocol']; - } - else - { - $retData[$key] = $value['description']; - } - } - foreach($GLOBALS['egw']->hooks->process(array( - 'location' => 'imap_server_types', - 'extended' => $extended, - ),array(),true) as $app => $data) - { - if ($data) $retData += $data; - } - return $retData; - } - - /** - * Get EMailAdmin profile for a user - * - * @param string $_appName='' - * @param int|array $_groups='' - * @return ea_preferences - */ - function getUserProfile($_appName='', $_groups='') - { - if (!(is_array(self::$sessionData) && (count(self::$sessionData)>0))) $this->restoreSessionData(); - if (is_array(self::$sessionData) && count(self::$sessionData)>0 && self::$sessionData['ea_preferences']) - { - //error_log("sessionData Restored for UserProfile
    "); - return self::$sessionData['ea_preferences']; - } - $appName = ($_appName != '' ? $_appName : $GLOBALS['egw_info']['flags']['currentapp']); - if(!is_array($_groups)) { - // initialize with 0 => means no group id - $groups = array(0); - // set the second entry to the users primary group - $groups[] = $GLOBALS['egw_info']['user']['account_primary_group']; - $userGroups = $GLOBALS['egw']->accounts->membership($GLOBALS['egw_info']['user']['account_id']); - foreach((array)$userGroups as $groupInfo) { - $groups[] = $groupInfo['account_id']; - } - } else { - $groups = $_groups; - } - - if($data = $this->soemailadmin->getUserProfile($appName, $groups,$GLOBALS['egw_info']['user']['account_id'])) - { - $eaPreferences = CreateObject('emailadmin.ea_preferences'); - - // fetch the IMAP / incomming server data - if (!class_exists($icClass=$data['imapType'])) - { - if (!file_exists($file=EGW_INCLUDE_ROOT.'/emailadmin/inc/class.'.$icClass.'.inc.php')) - { - $file = EGW_INCLUDE_ROOT.'/emailadmin/inc/class.'.($icClass='defaultimap').'.inc.php'; - } - include_once($file); - } - $icServer = new $icClass; - $icServer->encryption = ($data['imapTLSEncryption'] == 'yes' ? 1 : (int)$data['imapTLSEncryption']); - $icServer->host = $data['imapServer']; - $icServer->port = $data['imapPort']; - $icServer->validatecert = $data['imapTLSAuthentication'] == 'yes'; - $icServer->username = $GLOBALS['egw_info']['user']['account_lid']; - $icServer->password = $GLOBALS['egw_info']['user']['passwd']; - // restore the default loginType and check if there are forced/predefined user access Data ($imapAuthType may be set to admin) - list($data['imapLoginType'],$imapAuthType) = explode('#',$data['imapLoginType'],2); - $icServer->loginType = $data['imapLoginType']; - $icServer->domainName = $data['defaultDomain']; - $icServer->loginName = $data['imapLoginType'] == 'standard' ? $GLOBALS['egw_info']['user']['account_lid'] : $GLOBALS['egw_info']['user']['account_lid'].'@'.$data['defaultDomain']; - $icServer->enableCyrusAdmin = ($data['imapEnableCyrusAdmin'] == 'yes'); - $icServer->adminUsername = $data['imapAdminUsername']; - $icServer->adminPassword = $data['imapAdminPW']; - $icServer->enableSieve = ($data['imapEnableSieve'] == 'yes'); - $icServer->sievePort = $data['imapSievePort']; - if ($imapAuthType == 'admin') { - if (!empty($data['imapAuthUsername'])) $icServer->username = $icServer->loginName = $data['imapAuthUsername']; - if (!empty($data['imapAuthPassword'])) $icServer->password = $data['imapAuthPassword']; - } - if ($imapAuthType == 'email' || $icServer->loginType == 'email') { - $icServer->username = $icServer->loginName = $GLOBALS['egw_info']['user']['account_email']; - } - if (method_exists($icServer,'init')) $icServer->init(); - $eaPreferences->setIncomingServer($icServer); - - // fetch the SMTP / outgoing server data - if (!class_exists($ogClass=$data['smtpType'])) - { - if (!file_exists($file=EGW_INCLUDE_ROOT.'/emailadmin/inc/class.'.$ogClass.'.inc.php')) - { - $file = EGW_INCLUDE_ROOT.'/emailadmin/inc/class.'.($ogClass='defaultsmtp').'.inc.php'; - } - include_once($file); - } - $ogServer = new $ogClass($icServer->domainName); - $ogServer->host = $data['smtpServer']; - $ogServer->port = $data['smtpPort']; - $ogServer->editForwardingAddress = ($data['editforwardingaddress'] == 'yes'); - $ogServer->smtpAuth = $data['smtpAuth'] == 'yes'; - if($ogServer->smtpAuth) { - if(!empty($data['ea_smtp_auth_username'])) { - $ogServer->username = $data['ea_smtp_auth_username']; - } else { - // if we use special logintypes for IMAP, we assume this to be used for SMTP too - if ($imapAuthType == 'email' || $icServer->loginType == 'email') { - $ogServer->username = $GLOBALS['egw_info']['user']['account_email']; - } elseif ($icServer->loginType == 'vmailmgr') { - $ogServer->username = $GLOBALS['egw_info']['user']['account_lid'].'@'.$icServer->domainName; - } else { - $ogServer->username = $GLOBALS['egw_info']['user']['account_lid']; - } - } - if(!empty($data['ea_smtp_auth_password'])) { - $ogServer->password = $data['ea_smtp_auth_password']; - } else { - $ogServer->password = $GLOBALS['egw_info']['user']['passwd']; - } - } - if (method_exists($ogServer,'init')) $ogServer->init(); - $eaPreferences->setOutgoingServer($ogServer); - - foreach($ogServer->getAccountEmailAddress($GLOBALS['egw_info']['user']['account_lid']) as $emailAddresses) - { - $identity = CreateObject('emailadmin.ea_identity'); - $identity->emailAddress = $emailAddresses['address']; - $identity->realName = $emailAddresses['name']; - $identity->default = ($emailAddresses['type'] == 'default'); - $identity->organization = $data['organisationName']; - - $eaPreferences->setIdentity($identity); - } - - $eaPreferences->userDefinedAccounts = ($data['userDefinedAccounts'] == 'yes'); - $eaPreferences->userDefinedIdentities = ($data['userDefinedIdentities'] == 'yes'); - $eaPreferences->ea_user_defined_signatures = ($data['ea_user_defined_signatures'] == 'yes'); - $eaPreferences->ea_default_signature = $data['ea_default_signature']; - if(strlen($data['ea_stationery_active_templates']) > 0) - { - $eaPreferences->ea_stationery_active_templates = unserialize($data['ea_stationery_active_templates']); - } - self::$sessionData['ea_preferences'] = $eaPreferences; - $this->saveSessionData(); - return $eaPreferences; - } - - return false; - } - - function getUserData($_accountID) - { - - if($userProfile = $this->getUserProfile('felamimail')) { - $icServer = $userProfile->getIncomingServer(0); - if(is_a($icServer, 'defaultimap') && $username = $GLOBALS['egw']->accounts->id2name($_accountID)) { - $icUserData = $icServer->getUserData($username); - } - - $ogServer = $userProfile->getOutgoingServer(0); - if(is_a($ogServer, 'defaultsmtp')) { - $ogUserData = $ogServer->getUserData($_accountID); - } - - return (array)$icUserData + (array)$ogUserData; - - } - - return false; - } - - function restoreSessionData() - { - $GLOBALS['egw_info']['flags']['autoload'] = array(__CLASS__,'autoload'); - - //echo function_backtrace()."
    "; - //unserializing the sessiondata, since they are serialized for objects sake - self::$sessionData = (array) unserialize($GLOBALS['egw']->session->appsession('session_data','emailadmin')); - } - - /** - * Autoload classes from emailadmin, 'til they get autoloading conform names - * - * @param string $class - */ - static function autoload($class) - { - if (file_exists($file=EGW_INCLUDE_ROOT.'/emailadmin/inc/class.'.$class.'.inc.php')) - { - include_once($file); - } - } - - function saveSMTPForwarding($_accountID, $_forwardingAddress, $_keepLocalCopy) - { - if (is_object($this->smtpClass)) - { - #$smtpClass = CreateObject('emailadmin.'.$this->smtpClass,$this->profileID); - #$smtpClass->saveSMTPForwarding($_accountID, $_forwardingAddress, $_keepLocalCopy); - $this->smtpClass->saveSMTPForwarding($_accountID, $_forwardingAddress, $_keepLocalCopy); - } - - } - - /** - * called by the validation hook in setup - * - * @param array $settings following keys: mail_server, mail_server_type {IMAP|IMAPS|POP-3|POP-3S}, - * mail_login_type {standard|vmailmgr}, mail_suffix (domain), smtp_server, smpt_port, smtp_auth_user, smtp_auth_passwd - */ - function setDefaultProfile($settings) - { - if (($profiles = $this->soemailadmin->getProfileList(0,true))) - { - $profile = array_shift($profiles); - } - else - { - $profile = array( - 'smtpType' => 'defaultsmtp', - 'description' => 'default profile (created by setup)', - 'ea_appname' => '', - 'ea_group' => 0, - 'ea_user' => 0, - 'ea_active' => 1, - ); - - if (empty($settings['mail_server'])) $profile['userDefinedAccounts'] = 'yes'; - if (empty($settings['mail_server'])) $profile['userDefinedIdentities'] == 'yes'; - if (empty($settings['mail_server'])) $profile['ea_user_defined_signatures'] == 'yes'; - - } - foreach($to_parse = array( - 'mail_server' => 'imapServer', - 'mail_server_type' => array( - 'imap' => array( - 'imapType' => 'defaultimap', - 'imapPort' => 143, - 'imapTLSEncryption' => 0, - ), - 'imaps' => array( - 'imapType' => 'defaultimap', - 'imapPort' => 993, - 'imapTLSEncryption' => '3', - ), - ), - 'mail_login_type' => 'imapLoginType', - 'mail_suffix' => 'defaultDomain', - 'smtp_server' => 'smtpServer', - 'smpt_port' => 'smtpPort', - 'smtp_auth_user' => 'ea_smtp_auth_username', - 'smtp_auth_passwd' => 'ea_smtp_auth_password', - ) as $setup_name => $ea_name_data) - { - if (!is_array($ea_name_data)) - { - $profile[$ea_name_data] = $settings[$setup_name]; - if ($setup_name == 'smtp_auth_user') $profile['stmpAuth'] = !empty($settings['smtp_auth_user']); - } - else - { - foreach($ea_name_data as $setup_val => $ea_data) - { - if ($setup_val == $settings[$setup_name]) - { - foreach($ea_data as $var => $val) - { - if ($var != 'imapType' || $val != 'defaultimap') // old code: || $profile[$var] < 3) // dont kill special imap server types - { - $profile[$var] = $val; - } - } - break; - } - } - } - } - // merge the other not processed values unchanged - $profile = array_merge($profile,array_diff_assoc($settings,$to_parse)); - - $this->soemailadmin->updateProfile($profile); - self::$sessionData['profile'] = array(); - $this->saveSessionData(); - //echo "

    EMailAdmin profile update: ".print_r($profile,true)."

    \n"; exit; - } - - function saveProfile($_globalSettings, $_smtpSettings, $_imapSettings) - { - if(!isset($_imapSettings['imapTLSAuthentication'])) { - $_imapSettings['imapTLSAuthentication'] = true; - } - - if(is_array($_globalSettings['ea_stationery_active_templates']) && count($_globalSettings['ea_stationery_active_templates']) > 0) - { - $_globalSettings['ea_stationery_active_templates'] = serialize($_globalSettings['ea_stationery_active_templates']); - } - else - { - $_globalSettings['ea_stationery_active_templates'] = null; - } - - if(!isset($_globalSettings['profileID'])) { - $_globalSettings['ea_order'] = count($this->getProfileList()) + 1; - $this->soemailadmin->addProfile($_globalSettings, $_smtpSettings, $_imapSettings); - } else { - $this->soemailadmin->updateProfile($_globalSettings, $_smtpSettings, $_imapSettings); - } - $all = $_globalSettings+$_smtpSettings+$_imapSettings; - if (!$all['ea_user'] && !$all['ea_group'] && !$all['ea_application']) // standard profile update eGW config - { - $new_config = array(); - foreach(array( - 'imapServer' => 'mail_server', - 'imapType' => 'mail_server_type', - 'imapLoginType' => 'mail_login_type', - 'defaultDomain' => 'mail_suffix', - 'smtpServer' => 'smtp_server', - 'smtpPort' => 'smpt_port', - )+($all['smtpAuth'] ? array( - 'ea_smtp_auth_username' => 'smtp_auth_user', - 'ea_smtp_auth_password' => 'smtp_auth_passwd', - ) : array()) as $ea_name => $config_name) - { - if (isset($all[$ea_name])) - { - if ($ea_name != 'imapType') - { - $new_config[$config_name] = $all[$ea_name]; - } - else // imap type, no pop3 code anymore - { - $new_config[$config_name] = 'imap'.($all['imapTLSEncryption'] ? 's' : ''); - } - } - } - if (count($new_config)) - { - $config = CreateObject('phpgwapi.config','phpgwapi'); - - foreach($new_config as $name => $value) - { - $config->save_value($name,$value,'phpgwapi'); - } - //echo "

    eGW configuration update: ".print_r($new_config,true)."

    \n"; - } - } - self::$sessionData = array(); - $this->saveSessionData(); - } - - function saveSessionData() - { - // serializing the session data, for the sake of objects - if (is_object($GLOBALS['egw']->session)) // otherwise setup(-cli) fails - { - $GLOBALS['egw']->session->appsession('session_data','emailadmin',serialize(self::$sessionData)); - } - #$GLOBALS['egw']->session->appsession('user_session_data','',$this->userSessionData); - } - - function saveUserData($_accountID, $_formData) { - - if($userProfile = $this->getUserProfile('felamimail')) { - $ogServer = $userProfile->getOutgoingServer(0); - if(is_a($ogServer, 'defaultsmtp')) { - $ogServer->setUserData($_accountID, - (array)$_formData['mailAlternateAddress'], - (array)$_formData['mailForwardingAddress'], - $_formData['deliveryMode'], - $_formData['accountStatus'], - $_formData['mailLocalAddress'] - ); - } - - $icServer = $userProfile->getIncomingServer(0); - if(is_a($icServer, 'defaultimap') && $username = $GLOBALS['egw']->accounts->id2name($_accountID)) { - $icServer->setUserData($username, $_formData['quotaLimit']); - } - - // calling a hook to allow other apps to monitor the changes - $_formData['account_id'] = $_accountID; - $_formData['location'] = 'editaccountemail'; - $GLOBALS['egw']->hooks->process($_formData); - - return true; - self::$sessionData = array(); - $this->saveSessionData(); - } - - return false; - } - - function setOrder($_order) { - if(is_array($_order)) { - $this->soemailadmin->setOrder($_order); - } - self::$sessionData = array(); - $this->saveSessionData(); - } - - function updateAccount($_hookValues) { - if (is_object($this->imapClass)) { - #ExecMethod("emailadmin.".$this->imapClass.".updateAccount",$_hookValues,3,$this->profileData); - $this->imapClass->updateAccount($_hookValues); - } - - if (is_object($this->smtpClass)) { - #ExecMethod("emailadmin.".$this->smtpClass.".updateAccount",$_hookValues,3,$this->profileData); - $this->smtpClass->updateAccount($_hookValues); - } - self::$sessionData = array(); - $this->saveSessionData(); - } + $this->soemailadmin->updateProfile($profile); + self::$sessionData['profile'] = array(); + $this->saveSessionData(); + //echo "

    EMailAdmin profile update: ".print_r($profile,true)."

    \n"; exit; } + + function saveProfile($_globalSettings, $_smtpSettings, $_imapSettings) + { + if(!isset($_imapSettings['imapTLSAuthentication'])) { + $_imapSettings['imapTLSAuthentication'] = true; + } + + if(is_array($_globalSettings['ea_stationery_active_templates']) && count($_globalSettings['ea_stationery_active_templates']) > 0) + { + $_globalSettings['ea_stationery_active_templates'] = serialize($_globalSettings['ea_stationery_active_templates']); + } + else + { + $_globalSettings['ea_stationery_active_templates'] = null; + } + + if(!isset($_globalSettings['profileID'])) { + $_globalSettings['ea_order'] = count($this->getProfileList()) + 1; + $this->soemailadmin->addProfile($_globalSettings, $_smtpSettings, $_imapSettings); + } else { + $this->soemailadmin->updateProfile($_globalSettings, $_smtpSettings, $_imapSettings); + } + $all = $_globalSettings+$_smtpSettings+$_imapSettings; + if (!$all['ea_user'] && !$all['ea_group'] && !$all['ea_application']) // standard profile update eGW config + { + $new_config = array(); + foreach(array( + 'imapServer' => 'mail_server', + 'imapType' => 'mail_server_type', + 'imapLoginType' => 'mail_login_type', + 'defaultDomain' => 'mail_suffix', + 'smtpServer' => 'smtp_server', + 'smtpPort' => 'smpt_port', + )+($all['smtpAuth'] ? array( + 'ea_smtp_auth_username' => 'smtp_auth_user', + 'ea_smtp_auth_password' => 'smtp_auth_passwd', + ) : array()) as $ea_name => $config_name) + { + if (isset($all[$ea_name])) + { + if ($ea_name != 'imapType') + { + $new_config[$config_name] = $all[$ea_name]; + } + else // imap type, no pop3 code anymore + { + $new_config[$config_name] = 'imap'.($all['imapTLSEncryption'] ? 's' : ''); + } + } + } + if (count($new_config)) + { + $config = CreateObject('phpgwapi.config','phpgwapi'); + + foreach($new_config as $name => $value) + { + $config->save_value($name,$value,'phpgwapi'); + } + //echo "

    eGW configuration update: ".print_r($new_config,true)."

    \n"; + } + } + self::$sessionData = array(); + $this->saveSessionData(); + } + + function saveSessionData() + { + // serializing the session data, for the sake of objects + if (is_object($GLOBALS['egw']->session)) // otherwise setup(-cli) fails + { + $GLOBALS['egw']->session->appsession('session_data','emailadmin',serialize(self::$sessionData)); + } + #$GLOBALS['egw']->session->appsession('user_session_data','',$this->userSessionData); + } + + function saveUserData($_accountID, $_formData) { + + if($userProfile = $this->getUserProfile('felamimail')) { + $ogServer = $userProfile->getOutgoingServer(0); + if(is_a($ogServer, 'defaultsmtp')) { + $ogServer->setUserData($_accountID, + (array)$_formData['mailAlternateAddress'], + (array)$_formData['mailForwardingAddress'], + $_formData['deliveryMode'], + $_formData['accountStatus'], + $_formData['mailLocalAddress'] + ); + } + + $icServer = $userProfile->getIncomingServer(0); + if(is_a($icServer, 'defaultimap') && $username = $GLOBALS['egw']->accounts->id2name($_accountID)) { + $icServer->setUserData($username, $_formData['quotaLimit']); + } + + // calling a hook to allow other apps to monitor the changes + $_formData['account_id'] = $_accountID; + $_formData['location'] = 'editaccountemail'; + $GLOBALS['egw']->hooks->process($_formData); + + return true; + self::$sessionData = array(); + $this->saveSessionData(); + } + + return false; + } + + function setOrder($_order) { + if(is_array($_order)) { + $this->soemailadmin->setOrder($_order); + } + self::$sessionData = array(); + $this->saveSessionData(); + } + + function updateAccount($_hookValues) { + if (is_object($this->imapClass)) { + #ExecMethod("emailadmin.".$this->imapClass.".updateAccount",$_hookValues,3,$this->profileData); + $this->imapClass->updateAccount($_hookValues); + } + + if (is_object($this->smtpClass)) { + #ExecMethod("emailadmin.".$this->smtpClass.".updateAccount",$_hookValues,3,$this->profileData); + $this->smtpClass->updateAccount($_hookValues); + } + self::$sessionData = array(); + $this->saveSessionData(); + } +} diff --git a/emailadmin/inc/class.emailadmin_ui.inc.php b/emailadmin/inc/class.emailadmin_ui.inc.php index b100ea5989..137cccf425 100644 --- a/emailadmin/inc/class.emailadmin_ui.inc.php +++ b/emailadmin/inc/class.emailadmin_ui.inc.php @@ -1,962 +1,417 @@ - * @copyright (c) 2009-10 by Klaus Leithoff - * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License - \***************************************************************************/ - /* $Id$ */ +/** + * EGroupware EMailAdmin: User interface + * + * @link http://www.stylite.de + * @package emailadmin + * @author Klaus Leithoff + * @copyright (c) 2009-10 by Klaus Leithoff + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ - class emailadmin_ui extends emailadmin_bo - { - var $public_functions = array - ( - 'index' => True, - 'add' => True, - 'delete' => True, - 'edit' => True, - 'save' => True, - 'listProfiles' => True, - ); - - function __construct() - { - parent::__construct(); - } +/** + * User interface + */ +class emailadmin_ui extends emailadmin_bo +{ + var $public_functions = array + ( + 'index' => True, + 'add' => True, + 'delete' => True, + 'edit' => True, + 'save' => True, + 'listProfiles' => True, + ); + + function __construct() + { + parent::__construct(); + } - /** - * Main emailadmin page - * - * @param array $content=null - * @param string $msg=null - */ - function index(array $content=null,$msg=null) + /** + * Main emailadmin page + * + * @param array $content=null + * @param string $msg=null + */ + function index(array $content=null,$msg=null) + { + $accountID = false; + $groupID = false; + $filter = ''; + $rowsfound = 0; + if(is_int(intval($_GET['account_id'])) && !empty($_GET['account_id'])) { - $accountID = false; - $groupID = false; - $filter = ''; - $rowsfound = 0; - if(is_int(intval($_GET['account_id'])) && !empty($_GET['account_id'])) - { - if ( intval($_GET['account_id']) < 0 ) { - $groupID = intval($_GET['account_id']); - $filter['ea_group'] = intval($_GET['account_id']); - } else { - $accountID = intval($_GET['account_id']); - $filter['ea_user'] = intval($_GET['account_id']); - } - $r = parent::search($filter); - $rowsfound = count($r); - } - if ($rowsfound) - { - if (($accountID || !empty($groupID)) && $rowsfound == 1) - { - $linkData = array - ( - 'menuaction' => 'emailadmin.emailadmin_ui.edit', - 'profileid' => $r[0]['ea_profile_id'] - ); - $addJavaScript = "'; - } + if ( intval($_GET['account_id']) < 0 ) { + $groupID = intval($_GET['account_id']); + $filter['ea_group'] = intval($_GET['account_id']); } else { - if ($accountID || !empty($groupID)) { - $linkData = array - ( - 'menuaction' => 'emailadmin.emailadmin_ui.edit', - 'account_id' => ($accountID ? $accountID : $groupID) - ); - $addJavaScript = "'; - } + $accountID = intval($_GET['account_id']); + $filter['ea_user'] = intval($_GET['account_id']); } + $r = parent::search($filter); + $rowsfound = count($r); + } + if ($rowsfound) + { + if (($accountID || !empty($groupID)) && $rowsfound == 1) + { + $linkData = array + ( + 'menuaction' => 'emailadmin.emailadmin_ui.edit', + 'profileid' => $r[0]['ea_profile_id'] + ); + $addJavaScript = "'; + } + } else { if ($accountID || !empty($groupID)) { $linkData = array ( - 'menuaction' => 'emailadmin.emailadmin_ui.index', + 'menuaction' => 'emailadmin.emailadmin_ui.edit', + 'account_id' => ($accountID ? $accountID : $groupID) ); - $listLink = ''. - lang('reset filter').''; - - if ($GLOBALS['egw_info']['user']['apps']['admin']) { - $linkData = array - ( - 'menuaction' => 'admin.uiaccounts.list_'.($accountID ? 'users' : 'groups'), - ); - $listLink2 = ''.($accountID ? lang('Back to Admin/Userlist'): lang('Back to Admin/Grouplist')).''; - } - unset($r); - $subtitle = ($accountID || !empty($groupID) ? ' '.($accountID ? lang('filtered by Account') : lang('filtered by Group')).' ['.$listLink.']'.' ['.$listLink2.']': ''); + $addJavaScript = "'; } - //_debug_array($content); - $tpl = new etemplate('emailadmin.index'); - if (!is_array($content)) - { - $content = array( - 'nm' => $GLOBALS['egw']->session->appsession('index',parent::APP), - ); - if (!is_array($content['nm'])) - { - $content['nm'] = array( - 'get_rows' => 'emailadmin.emailadmin_ui.get_rows', // I method/callback to request the data for the rows - 'no_filter' => True, // nofilter - 'no_filter2' => True, // I disable the 2. filter (params are the same as for filter) - 'no_cat' => True, // I disable the cat-selectbox - 'lettersearch' => True, // I show a lettersearch - 'searchletter' => false, // I0 active letter of the lettersearch or false for [all] - 'start' => 0, // IO position in list - 'order' => 'ea_order, ea_profile_id', // IO name of the column to sort after (optional for the sortheaders) - 'sort' => 'ASC', // IO direction of the sort: 'ASC' or 'DESC' - //'default_cols' => '!comment,ctime', // I columns to use if there's no user or default pref (! as first char uses all but the columns listed) - 'csv_fields' => false, // I false=disable csv export, true or unset=enable it with auto-detected fieldnames, - //or array with name=>label or name=>array('label'=>label,'type'=>type) pairs (type is a eT widget-type) - ); - } - } - elseif(isset($content['nm']['rows']['delete'])) - { - list($profileids) = each($content['nm']['rows']['delete']); - unset($content['nm']['rows']['delete']); - if ($profileids && self::delete($profileids)) - { - $content['msg'] = lang('%1 entries deleted.',1); - } - else - { - $content['msg'] = lang('Error deleting entry!'); - } - } - elseif(isset($content['delete'])) - { - unset($content['delete']); - if (($deleted = self::delete($content['nm']['rows']['selected']))) - { - $content['msg'] = lang('%1 entries deleted.',$deleted); - } - else - { - $content['msg'] = lang('Error deleting entry!'); - } - } - - if (isset($_GET['msg'])) $msg = $_GET['msg']; - $content['msg'] .= $msg; - /* - if ($content['action'] || $content['nm']['rows']) - { - if ($content['action']) - { - // SOME ACTION AS EDIT, DELETE, ... - $content['msg'] = self::action($content['action'],$content['nm']['rows']['checked']); - unset($content['action']); - } - elseif($content['nm']['rows']['delete']) - { - $content['msg'] = self::action('delete',array_keys($content['nm']['rows']['delete'])); - } - unset($content['nm']['rows']); - } - */ - if ($content['AddProfile']) - { - unset($content['AddProfile']); - } - if ($content['button']) - { - if ($content['button']) - { - list($button) = each($content['button']); - unset($content['button']); - } - switch($button) - { - default: - break; - } - } - $sel_options['ea_smtp_type']=parent::getSMTPServerTypes(); - $sel_options['ea_imap_type']=parent::getIMAPServerTypes(false); - $sel_options['ea_appname'] =self::getAllowedApps(); - // setting for the top of the app, etc. - $content['addJavaScript'] = $addJavaScript; - $content['subtitle'] = $subtitle; - if (!empty($filter)) foreach ($filter as $fk => $fv) $content['nm']['col_filter'][$fk] = $fv; - // seTting the Title of the app - $GLOBALS['egw_info']['flags']['app_header'] = lang('emailadmin'); - $tpl->exec('emailadmin.emailadmin_ui.index',$content,$sel_options,$readonlys,array('nm' => $content['nm'])); } - - /** - * query the table - * - * reimplemented from so_sql to disable action-buttons based on the acl and make some modification on the data - * - * @param array &$query - * @param array &$rows returned rows/cups - * @param array &$readonlys eg. to disable buttons based on acl - * @param boolean $id_only=false if true only return (via $rows) an array of ids, dont save state to session - * @return int total number of rows matching the selection - */ - function get_rows(&$query_in,&$rows,&$readonlys,$id_only=false) - { - $query = $query_in; - $filteredby = ''; - if ($query['searchletter']) // only show rows if the order-criteria starts with the given letter - { - $query['col_filter'][] = (in_array($query['order'],parent::$numericfields) || (is_string($query['order']) && !(strpos($query['order'],',')===false)) ? 'ea_description' : $query['order']).' '. - $GLOBALS['egw']->db->capabilities['case_insensitive_like'].' '.$GLOBALS['egw']->db->quote($query['searchletter'].'%'); - if (in_array($query['order'],parent::$numericfields)) $query_in['order'] = $query['order'] = 'ea_description'; - $filteredby = $query['order'].' '.lang('starts with').' '.$query['searchletter']; - } - $GLOBALS['egw_info']['flags']['app_header'] = lang('emailadmin').($filteredby? ' - '.$filteredby:''); - $total = parent::get_rows($query,$rows,$readonlys); - return $total; - } - - static function getAllowedApps() - { - $applications = array( - 'calendar' => $GLOBALS['egw_info']['apps']['calendar']['title'], - 'felamimail' => $GLOBALS['egw_info']['apps']['felamimail']['title'], - ); - asort($applications); - return $applications = array_merge(array('' => lang('any application')),$applications); - } - - static function getIMAPLoginTypes($serverclass='defaultimap') - { - //error_log(__METHOD__.' called with:'.$serverclass." with capabilities:".parent::$IMAPServerType[$serverclass]['imapcapabilities']); - $returnval = array( - 'standard' =>lang('username (standard)'), - 'vmailmgr' =>lang('username@domainname (Virtual MAIL ManaGeR)'), - 'admin' =>lang('Username/Password defined by admin'), - ); - if (!(stripos(parent::$IMAPServerType[$serverclass]['imapcapabilities'],'logintypeemail') === false)) $returnval['email'] = lang('use Users eMail-Address (as seen in Useraccount)'); - return $returnval; - } - - function edit($content=null) - { - //$this->editProfile($profileid); - $etpl = new etemplate(parent::APP.'.edit'); - if(!is_array($content)) - { - $rowfound = false; - $filter = array(); - if(is_int(intval($_GET['account_id'])) && !empty($_GET['account_id'])) - { - if ( intval($_GET['account_id']) < 0 ) { - $groupID = intval($_GET['account_id']); - $content['ea_group'] = $filter['ea_group'] = $groupID; - - } else { - $accountID = intval($_GET['account_id']); - $content['ea_user'] = $filter['ea_user'] = $accountID; - } - } - if (!empty($_GET['profileid'])) - { - $profileID = intval($_GET['profileid']); - $filter['ea_profile_id'] = $profileID; - $rowfound = parent::read($filter); - } - else - { - $content['ea_user_defined_accounts'] = "yes"; - } - } - else - { - $rowfound = true; - // handle action/submit buttons - if (isset($content['delete'])) - { - unset($content['delete']); - $button = 'delete'; - } - if (isset($content['cancel'])) - { - unset($content['cancel']); - $button = 'cancel'; - } - if (isset($content['apply'])) - { - unset($content['apply']); - $button = 'apply'; - } - if (isset($content['save'])) - { - unset($content['save']); - $button = 'save'; - } - unset($content['manage_stationery_templates']); - //unset($content['tabs']); - if (!empty($content['smtp_senders_email'])) - { - $content['ea_smtp_auth_username'] = $content['ea_smtp_auth_username'].';'.$content['smtp_senders_email']; - unset($content['smtp_senders_email']); - } - $this->data = $content; - switch ($button) - { - case 'delete': - if (($deleted = self::delete($content['ea_profile_id']))) - { - $msg = lang('%1 entries deleted.',$deleted); - } - else - { - $msg = lang('Error deleting entry!'); - } - $js = "opener.location.href='".$GLOBALS['egw']->link('/index.php',array( - 'menuaction' => parent::APP.'.emailadmin_ui.index', - 'msg' => $msg, - ))."';"; - $js .= 'window.close();'; - echo "\n\n\n\n\n"; - $GLOBALS['egw']->common->egw_exit(); - break; - case 'cancel': - $js .= 'window.close();'; - echo "\n\n\n\n\n"; - $GLOBALS['egw']->common->egw_exit(); - break; - case 'apply': - case 'save': - if ($etpl->validation_errors()) break; // the user need to fix the error, before we can save the entry - //_debug_array($this->data); - if (parent::save() != 0) - { - $msg = lang('Error saving the entry!!!'); - $button = ''; - } - else - { - $msg = lang('Entry saved'); - } - $js = "opener.location.href='".$GLOBALS['egw']->link('/index.php',array( - 'menuaction' => parent::APP.'.emailadmin_ui.index', - 'msg' => $msg, - ))."';"; - if ($button == 'save') - { - $js .= 'window.close();'; - echo "\n\n\n\n\n"; - $GLOBALS['egw']->common->egw_exit(); - break; - } - $row; - } - } - if ($rowfound) $content = array_merge($this->data,array()); - $content['smtpcapabilities'] = parent::$SMTPServerType[(!empty($content['ea_smtp_type'])?$content['ea_smtp_type']:'defaultsmtp')]['smtpcapabilities']; - $content['imapcapabilities'] = parent::$IMAPServerType[(!empty($content['ea_imap_type'])?$content['ea_imap_type']:'defaultimap')]['imapcapabilities']; - if (!empty($msg)) $content['msg'] = $msg; - list($content['ea_smtp_auth_username'],$content['smtp_senders_email']) = explode(';',$content['ea_smtp_auth_username']); - $preserv['ea_profile_id'] = $content['ea_profile_id']; - $preserv['smtpcapabilities'] = $content['smtpcapabilities']; - $preserv['imapcapabilities'] = $content['imappcapabilities']; - //$preserv['ea_stationery_active_templates'] = $content['ea_stationery_active_templates']; - $sel_options['ea_smtp_type']=parent::getSMTPServerTypes(); - $sel_options['ea_imap_type']=parent::getIMAPServerTypes(false); - $sel_options['ea_appname'] =self::getAllowedApps(); - $sel_options['ea_imap_login_type'] = self::getIMAPLoginTypes($content['ea_imap_type']); - // Stationery settings - $bostationery = new felamimail_bostationery(); - $sel_options['ea_stationery_active_templates'] = $bostationery->get_stored_templates(); - /* - $content['stored_templates'] = html::checkbox_multiselect( - 'ea_stationery_active_templates',$content['ea_stationery_active_templates'] - ,$bostationery->get_stored_templates(),true,'',3,true,'width: 100%;'); - - $content['manage_stationery_templates'] = - html::a_href( - lang('manage stationery templates'), - '/index.php?menuaction=etemplate.editor.edit', - array('name' => 'felamimail.stationery'), - 'target="_blank"' - ); - */ - //_debug_array($this->data); - return $etpl->exec(parent::APP.'.emailadmin_ui.edit',$content,$sel_options,$readonlys,$preserv,2); - } - - function add() - { - $this->edit(); - } - - function delete($profileid=null) - { - $_profileID = ($profileid ? $profileid : (int)$_GET['profileid']); - if (empty($_profileID)) return 0; - $deleted = parent::delete(array('ea_profile_id' => $_profileID)); - if (!is_array($_profileID)) $_profileID = (array)$_profileID; - foreach ($_profileID as $tk => $pid) - { - parent::$sessionData['profile'][$pid] = array(); - } - parent::saveSessionData(); - return $deleted; - } - - function listProfiles() - { - $GLOBALS['egw']->hooks->register_all_hooks(); - self::index(); - } - -/* - function deleteProfile() - { - $deleted = self::delete((int)$_GET['profileid']); - $this->listProfiles(); - } - - function display_app_header() - { - $GLOBALS['egw']->js->validate_file('tabs','tabs'); - $GLOBALS['egw_info']['flags']['include_xajax'] = True; - - switch($_GET['menuaction']) - { - case 'emailadmin.emailadmin_ui.add': - case 'emailadmin.emailadmin_ui.edit': - case 'emailadmin.emailadmin_ui.AddOrEdit': - case 'emailadmin.emailadmin_ui.addProfile': - case 'emailadmin.emailadmin_ui.editProfile': - $GLOBALS['egw_info']['nofooter'] = true; - $GLOBALS['egw']->js->validate_file('jscode','editProfile','emailadmin'); - $GLOBALS['egw']->js->set_onload('javascript:initAll();'); - #$GLOBALS['egw']->js->set_onload('smtp.init();'); - - break; - - case 'emailadmin.emailadmin_ui.listProfiles': - $GLOBALS['egw']->js->validate_file('jscode','listProfile','emailadmin'); - - break; - } - $GLOBALS['egw']->common->egw_header(); - - if($_GET['menuaction'] == 'emailadmin.emailadmin_ui.listProfiles' || $_GET['menuaction'] == 'emailadmin.emailadmin_ui.deleteProfile') - echo parse_navbar(); - } - - function editProfile($_profileID='') { - $allGroups = self:: getAllGroups(); - $allUsers = self::getAllUsers(); - $applications = self::getAllApps(); - - if($_profileID != '') - { - $profileID = $_profileID; - } - elseif(is_int(intval($_GET['profileid'])) && !empty($_GET['profileid'])) - { - $profileID = intval($_GET['profileid']); - } - else - { - return false; - } - - $profileList = parent::getProfileList($profileID); - $profileData = parent::getProfile($profileID); - $this->display_app_header(); - - $this->t->set_file(array("body" => "editprofile.tpl")); - $this->t->set_block('body','main'); - - $this->translate(); - - foreach((array)$profileData as $key => $value) { - #print "$key $value
    "; - switch($key) { - case 'ea_default_signature': - // nothing to do here - break; - case 'ea_stationery_active_templates': - $activeTemplates = $value; - case 'imapTLSEncryption': - $this->t->set_var('checked_'. $key .'_'. $value,'checked="1"'); - break; - case 'imapTLSAuthentication': - if(!$value) { - $this->t->set_var('selected_'.$key,'checked="1"'); - } - break; - case 'imapEnableCyrusAdmin': - case 'imapEnableSieve': - case 'smtpAuth': - case 'smtpLDAPUseDefault': - case 'userDefinedAccounts': - case 'userDefinedIdentities': - case 'ea_user_defined_signatures': - case 'ea_active': - case 'editforwardingaddress': - if($value == 'yes' || $value == 1) { - $this->t->set_var('selected_'.$key,'checked="1"'); - } - break; - case 'imapType': - case 'smtpType': - case 'imapLoginType': - $this->t->set_var('selected_'.$key.'_'.$value,'selected="1"'); - break; - case 'ea_appname': - $this->t->set_var('application_select_box', html::select('globalsettings[ea_appname]',$value,$applications, true, "style='width: 250px;'")); - break; - case 'ea_group': - $this->t->set_var('group_select_box', html::select('globalsettings[ea_group]',$value,$allGroups, true, "style='width: 250px;'")); - break; - case 'ea_user': - $this->t->set_var('user_select_box', html::select('globalsettings[ea_user]',$value,$allUsers, true, "style='width: 250px;'")); - break; - case 'ea_smtp_auth_username': - #echo "
    value_$key,$value"; - list($username,$senderadress) = explode(';',$value,2); - if (!empty($senderadress)) $this->t->set_var('value_smtp_senderadress',$senderadress); - $this->t->set_var('value_'.$key,$username); - break; - default: - $this->t->set_var('value_'.$key,$value); - break; - } - } - + if ($accountID || !empty($groupID)) { $linkData = array ( - 'menuaction' => 'emailadmin.emailadmin_ui.saveProfile', - 'profileID' => $profileID + 'menuaction' => 'emailadmin.emailadmin_ui.index', ); - $this->t->set_var('action_url',$GLOBALS['egw']->link('/index.php',$linkData)); - - $linkData = array - ( - 'menuaction' => 'emailadmin.emailadmin_ui.listProfiles' - ); - $this->t->set_var('back_url',$GLOBALS['egw']->link('/index.php',$linkData)); + $listLink = ''. + lang('reset filter').''; - $this->t->set_var('smtptype',html::select( - 'smtpsettings[smtpType]', - $profileData['smtpType'], - parent::getSMTPServerTypes(), - true, - 'style="width: 250px;" id="smtpselector" onchange="smtp.display(this.value);"' - )); - $selectFrom = html::select( - 'imapsettings[imapType]', - $profileData['imapType'], - parent::getIMAPServerTypes(false), - true, - // stupid tabs javascript assumes value=position in selectbox, here's a littel workaround ;-) - "style='width: 250px;' id='imapselector' onchange='var v = this.value; imap.display(this.value); this.value=v;'" - ); - $this->t->set_var('imaptype', $selectFrom); - - $style="width:100%; border:0px; height:150px;"; - $this->t->set_var('signature', html::fckEditorQuick( - 'globalsettings[ea_default_signature]', 'simple', - $profileData['ea_default_signature'], '150px') - ); - - // Stationery settings - $bostationery = new felamimail_bostationery(); - $activeTemplates = is_array($activeTemplates) ? $activeTemplates : array(); - $this->t->set_var('stored_templates', html::checkbox_multiselect( - 'globalsettings[ea_stationery_active_templates]',$activeTemplates - ,$bostationery->get_stored_templates(),true,'',3,true,'width: 100%;')); - $this->t->set_var( - 'link_manage_templates', - html::a_href( - lang('manage stationery templates'), - '/index.php?menuaction=etemplate.editor.edit', - array('name' => 'felamimail.stationery'), - 'target="_blank"' - ) - ); - - $this->t->parse("out","main"); - print $this->t->get('out','main'); - } - - function listProfiles() - { - $accountID = false; - $groupID = false; - $appName = ''; - $profileID = ''; - if(is_int(intval($_GET['account_id'])) && !empty($_GET['account_id'])) - { - if ( intval($_GET['account_id']) < 0 ) { - $groupID = intval($_GET['account_id']); - } else { - $accountID = intval($_GET['account_id']); - } - } - - $this->display_app_header(); - - $this->t->set_file(array("body" => "listprofiles.tpl")); - $this->t->set_block('body','main'); - - $this->translate(); - - $profileList = parent::getProfileList($profileID,$appName,$groupID,$accountID); - - // create the data array - if ($profileList) - { - for ($i=0; $i < count($profileList); $i++) - { - $linkData = array - ( - 'menuaction' => 'emailadmin.emailadmin_ui.editProfile', - 'nocache' => '1', - 'tabpage' => '3', - 'profileid' => $profileList[$i]['profileID'] - ); - $imapServerLink = ''.$profileList[$i]['imapServer'].''; - - $linkData = array - ( - 'menuaction' => 'emailadmin.emailadmin_ui.editProfile', - 'nocache' => '1', - 'tabpage' => '1', - 'profileid' => $profileList[$i]['profileID'] - ); - $descriptionLink = ''.$profileList[$i]['description'].''; - - $linkData = array - ( - 'menuaction' => 'emailadmin.emailadmin_ui.editProfile', - 'nocache' => '1', - 'tabpage' => '2', - 'profileid' => $profileList[$i]['profileID'] - ); - $smtpServerLink = ''.$profileList[$i]['smtpServer'].''; - - $linkData = array - ( - 'menuaction' => 'emailadmin.emailadmin_ui.deleteProfile', - 'profileid' => $profileList[$i]['profileID'] - ); - $deleteLink = ''. - lang('delete').''; - - $application = (empty($profileList[$i]['ea_appname']) ? lang('any application') : $GLOBALS['egw_info']['apps'][$profileList[$i]['ea_appname']]['title']); - $linkData = array - ( - 'menuaction' => 'emailadmin.emailadmin_ui.editProfile', - 'nocache' => '1', - 'tabpage' => '1', - 'profileid' => $profileList[$i]['profileID'] - ); - $applicationLink = ''.$application.''; - - $group = (empty($profileList[$i]['ea_group']) ? lang('any group') : $GLOBALS['egw']->accounts->id2name($profileList[$i]['ea_group'])); - $user = (empty($profileList[$i]['ea_user']) ? lang('any user') : $GLOBALS['egw']->accounts->id2name($profileList[$i]['ea_user'])); - $isactive = (empty($profileList[$i]['ea_active']) ? lang('inactive') : ($profileList[$i]['ea_active']>0 ? lang('active') : lang('inactive'))); - $linkData = array - ( - 'menuaction' => 'emailadmin.emailadmin_ui.editProfile', - 'nocache' => '1', - 'tabpage' => '1', - 'profileid' => $profileList[$i]['profileID'] - ); - $groupLink = ''.$group.''; - $userLink = ''.$user.''; - $activeLink = ''.$isactive.''; - $moveButtons = ' '. - ''; - - $data['profile_'.$profileList[$i]['profileID']] = array( - $descriptionLink, - $smtpServerLink, - $imapServerLink, - $applicationLink, - $groupLink, - $userLink, - $activeLink, - $deleteLink, - $moveButtons, - - ); - } - if (($accountID || !empty($groupID)) && count($profileList)==1) - { - $linkData = array - ( - 'menuaction' => 'emailadmin.emailadmin_ui.editProfile', - 'nocache' => '1', - 'tabpage' => '1', - 'profileid' => $profileList[0]['profileID'] - ); - print "'; - } - } else { - if ($accountID || !empty($groupID)) { - $linkData = array - ( - 'menuaction' => 'emailadmin.emailadmin_ui.addProfile', - 'nocache' => '1', - 'tabpage' => '1', - 'account_id' => ($accountID ? $accountID : $groupID) - ); - print "'; - - } - } - - // create the array containing the table header - $rows = array( - lang('description'), - lang('smtp server name'), - lang('imap server name'), - lang('application'), - lang('group'), - lang('user'), - lang('active'), - lang('delete'), - lang('order'), - ); - if ($accountID || !empty($groupID)) { + if ($GLOBALS['egw_info']['user']['apps']['admin']) { $linkData = array ( - 'menuaction' => 'emailadmin.emailadmin_ui.listProfiles', + 'menuaction' => 'admin.uiaccounts.list_'.($accountID ? 'users' : 'groups'), ); - $listLink = ''. - lang('reset filter').''; - - if ($GLOBALS['egw_info']['user']['apps']['admin']) { - $linkData = array - ( - 'menuaction' => 'admin.uiaccounts.list_'.($accountID ? 'users' : 'groups'), - ); - $listLink2 = ''.($accountID ? lang('Back to Admin/Userlist'): lang('Back to Admin/Grouplist')).''; - } + $listLink2 = ''.($accountID ? lang('Back to Admin/Userlist'): lang('Back to Admin/Grouplist')).''; } - - // create the table html code - $this->t->set_var('server_next_match',$this->nextMatchTable( - $rows, - $data, - lang('profile list').($accountID || !empty($groupID) ? ' '.($accountID ? lang('filtered by Account') : lang('filtered by Group')).' ['.$listLink.']'.' ['.$listLink2.']': ''), - $_start, - $_total, - $_menuAction) - ); - - $linkData = array - ( - 'menuaction' => 'emailadmin.emailadmin_ui.addProfile' - ); - $this->t->set_var('add_link',$GLOBALS['egw']->link('/index.php',$linkData)); - - $this->t->parse("out","main"); - - print $this->t->get('out','main'); - + unset($r); + $subtitle = ($accountID || !empty($groupID) ? ' '.($accountID ? lang('filtered by Account') : lang('filtered by Group')).' ['.$listLink.']'.' ['.$listLink2.']': ''); } - - function nextMatchTable($_rows, $_data, $_description, $_start, $_total, $_menuAction) + //_debug_array($content); + $tpl = new etemplate('emailadmin.index'); + if (!is_array($content)) { - $template =& CreateObject('phpgwapi.Template',EGW_APP_TPL); - $template->set_file(array("body" => "nextMatch.tpl")); - $template->set_block('body','row_list','rowList'); - $template->set_block('body','header_row','headerRow'); - - $var = Array( - 'th_bg' => $GLOBALS['egw_info']['theme']['th_bg'], - 'left_next_matchs' => $this->nextmatchs->left('/index.php',$start,$total,'menuaction=emailadmin.emailadmin_ui.listServers'), - 'right_next_matchs' => $this->nextmatchs->right('/admin/groups.php',$start,$total,'menuaction=emailadmin.emailadmin_ui.listServers'), - 'lang_groups' => lang('user groups'), - 'sort_name' => $this->nextmatchs->show_sort_order($sort,'account_lid',$order,'/index.php',lang('name'),'menuaction=emailadmin.emailadmin_ui.listServers'), - 'description' => $_description, - 'header_edit' => lang('Edit'), - 'header_delete' => lang('Delete') + $content = array( + 'nm' => $GLOBALS['egw']->session->appsession('index',parent::APP), ); - $template->set_var($var); - - $data = ''; - if(is_array($_rows)) + if (!is_array($content['nm'])) { - foreach($_rows as $value) - { - $data .= "
    "; - } - $template->set_var('header_row_data', $data); - $template->fp('headerRow','header_row',True); - #$template->fp('header_row','header_row',True); + $content['nm'] = array( + 'get_rows' => 'emailadmin.emailadmin_ui.get_rows', // I method/callback to request the data for the rows + 'no_filter' => True, // nofilter + 'no_filter2' => True, // I disable the 2. filter (params are the same as for filter) + 'no_cat' => True, // I disable the cat-selectbox + 'lettersearch' => True, // I show a lettersearch + 'searchletter' => false, // I0 active letter of the lettersearch or false for [all] + 'start' => 0, // IO position in list + 'order' => 'ea_order, ea_profile_id', // IO name of the column to sort after (optional for the sortheaders) + 'sort' => 'ASC', // IO direction of the sort: 'ASC' or 'DESC' + //'default_cols' => '!comment,ctime', // I columns to use if there's no user or default pref (! as first char uses all but the columns listed) + 'csv_fields' => false, // I false=disable csv export, true or unset=enable it with auto-detected fieldnames, + //or array with name=>label or name=>array('label'=>label,'type'=>type) pairs (type is a eT widget-type) + ); } - - if(is_array($_data)) + } + elseif(isset($content['nm']['rows']['delete'])) + { + list($profileids) = each($content['nm']['rows']['delete']); + unset($content['nm']['rows']['delete']); + if ($profileids && self::delete($profileids)) { - foreach($_data as $rowID => $value) - { - $data = ''; - foreach($value as $rowData) - { - $data .= ""; - } - $template->set_var('row_data', $data); - $template->set_var('row_id', $rowID); - $template->fp('rowList','row_list',True); - } + $content['msg'] = lang('%1 entries deleted.',1); + } + else + { + $content['msg'] = lang('Error deleting entry!'); + } + } + elseif(isset($content['delete'])) + { + unset($content['delete']); + if (($deleted = self::delete($content['nm']['rows']['selected']))) + { + $content['msg'] = lang('%1 entries deleted.',$deleted); + } + else + { + $content['msg'] = lang('Error deleting entry!'); } - - return $template->fp('out','body'); - } - function saveProfile() + if (isset($_GET['msg'])) $msg = $_GET['msg']; + $content['msg'] .= $msg; + /* + if ($content['action'] || $content['nm']['rows']) { - $globalSettings = array(); - $smtpSettings = array(); - $imapSettings = array(); - - // try to get the profileID - if(is_int(intval($_GET['profileID'])) && !empty($_GET['profileID'])) { - $globalSettings['profileID'] = intval($_GET['profileID']); + if ($content['action']) + { + // SOME ACTION AS EDIT, DELETE, ... + $content['msg'] = self::action($content['action'],$content['nm']['rows']['checked']); + unset($content['action']); } - - $globalSettings['description'] = $_POST['globalsettings']['description']; - $globalSettings['defaultDomain'] = $_POST['globalsettings']['defaultDomain']; - $globalSettings['organisationName'] = $_POST['globalsettings']['organisationName']; - $globalSettings['userDefinedAccounts'] = ($_POST['globalsettings']['userDefinedAccounts'] == 'yes' ? 'yes' : 'no' ); - $globalSettings['userDefinedIdentities'] = ($_POST['globalsettings']['userDefinedIdentities'] == 'yes' ? 'yes' : 'no' ); - $globalSettings['ea_active'] = ($_POST['globalsettings']['ea_active'] == 'yes' ? 1 : 0 ); - $globalSettings['ea_user_defined_signatures'] = ($_POST['globalsettings']['ea_user_defined_signatures'] == 'yes' ? 'yes' : 'no' ); - $globalSettings['ea_default_signature'] = $_POST['globalsettings']['ea_default_signature']; - $globalSettings['ea_appname'] = ($_POST['globalsettings']['ea_appname'] == 'any' ? '' : $_POST['globalsettings']['ea_appname']); - $globalSettings['ea_group'] = ($_POST['globalsettings']['ea_group'] == 'any' ? '' : (int)$_POST['globalsettings']['ea_group']); - $globalSettings['ea_user'] = ($_POST['globalsettings']['ea_user'] == 'any' ? '' : (int)$_POST['globalsettings']['ea_user']); - $globalSettings['ea_stationery_active_templates'] = $_POST['globalsettings']['ea_stationery_active_templates']; - - // get the settings for the smtp server - $smtpType = $_POST['smtpsettings']['smtpType']; - foreach(parent::getFieldNames($smtpType,'smtp') as $key) { - $smtpSettings[$key] = $_POST['smtpsettings'][$smtpType][$key]; + elseif($content['nm']['rows']['delete']) + { + $content['msg'] = self::action('delete',array_keys($content['nm']['rows']['delete'])); } - // append the email to be used as sender adress(, if set) - if (!empty($smtpSettings['ea_smtp_auth_username']) && isset($_POST['smtpsettings'][$smtpType]['smtp_senderadress']) && !empty($_POST['smtpsettings'][$smtpType]['smtp_senderadress'])) { - $smtpSettings['ea_smtp_auth_username'] .= ";".$_POST['smtpsettings'][$smtpType]['smtp_senderadress']; - } - $smtpSettings['smtpType'] = $smtpType; - - #_debug_array($smtpSettings); exit; - - // get the settings for the imap/pop3 server - $imapType = $_POST['imapsettings']['imapType']; - foreach(parent::getFieldNames($imapType,'imap') as $key) { - switch($key) { - case 'imapTLSAuthentication': - $imapSettings[$key] = !isset($_POST['imapsettings'][$imapType][$key]); - break; - default: - $imapSettings[$key] = $_POST['imapsettings'][$imapType][$key]; - break; - } - } - $imapSettings['imapType'] = $imapType; - - #_debug_array($imapSettings); - - parent::saveProfile($globalSettings, $smtpSettings, $imapSettings); - - print ""; - $GLOBALS['egw']->common->egw_exit(); - exit; - } - - function translate() - { - # skeleton - # $this->t->set_var('',lang('')); - $this->t->set_var('lang_server_name',lang('server name')); - $this->t->set_var('lang_server_description',lang('description')); - $this->t->set_var('lang_edit',lang('edit')); - $this->t->set_var('lang_save',lang('save')); - $this->t->set_var('lang_delete',lang('delete')); - $this->t->set_var('lang_back',lang('back')); - $this->t->set_var('lang_remove',lang('remove')); - $this->t->set_var('lang_ldap_server',lang('LDAP server')); - $this->t->set_var('lang_ldap_basedn',lang('LDAP basedn')); - $this->t->set_var('lang_ldap_server_admin',lang('admin dn')); - $this->t->set_var('lang_ldap_server_password',lang('admin password')); - $this->t->set_var('lang_add_profile',lang('add profile')); - $this->t->set_var('lang_domain_name',lang('domainname')); - $this->t->set_var('lang_SMTP_server_hostname_or_IP_address',lang('SMTP-Server hostname or IP address')); - $this->t->set_var('lang_SMTP_server_port',lang('SMTP-Server port')); - $this->t->set_var('lang_Use_SMTP_auth',lang('Use SMTP auth')); - $this->t->set_var('lang_Select_type_of_SMTP_Server',lang('Select type of SMTP Server')); - $this->t->set_var('lang_profile_name',lang('Profile Name')); - $this->t->set_var('lang_default_domain',lang('enter your default mail domain (from: user@domain)')); - $this->t->set_var('lang_organisation_name',lang('name of organisation')); - $this->t->set_var('lang_user_defined_accounts',lang('users can define their own emailaccounts')); - $this->t->set_var('lang_user_defined_identities',lang('users can define their own identities')); - $this->t->set_var('lang_user_defined_signatures',lang('users can define their own signatures')); - $this->t->set_var('lang_LDAP_server_hostname_or_IP_address',lang('LDAP server hostname or ip address')); - $this->t->set_var('lang_LDAP_server_admin_dn',lang('LDAP server admin DN')); - $this->t->set_var('lang_LDAP_server_admin_pw',lang('LDAP server admin password')); - $this->t->set_var('lang_LDAP_server_base_dn',lang('LDAP server accounts DN')); - $this->t->set_var('lang_use_LDAP_defaults',lang('use LDAP defaults')); - $this->t->set_var('lang_LDAP_settings',lang('LDAP settings')); - $this->t->set_var('lang_select_type_of_imap/pop3_server',lang('select type of IMAP server')); - $this->t->set_var('lang_pop3_server_hostname_or_IP_address',lang('POP3 server hostname or ip address')); - $this->t->set_var('lang_pop3_server_port',lang('POP3 server port')); - $this->t->set_var('lang_imap_server_hostname_or_IP_address',lang('IMAP server hostname or ip address')); - $this->t->set_var('lang_imap_server_port',lang('IMAP server port')); - $this->t->set_var('lang_use_tls_encryption',lang('use tls encryption')); - $this->t->set_var('lang_use_tls_authentication',lang('use tls authentication')); - $this->t->set_var('lang_sieve_settings',lang('Sieve settings')); - $this->t->set_var('lang_enable_sieve',lang('enable Sieve')); - $this->t->set_var('lang_sieve_server_hostname_or_ip_address',lang('Sieve server hostname or ip address')); - $this->t->set_var('lang_sieve_server_port',lang('Sieve server port')); - $this->t->set_var('lang_enable_cyrus_imap_administration',lang('enable Cyrus IMAP server administration')); - $this->t->set_var('lang_cyrus_imap_administration',lang('Cyrus IMAP server administration')); - $this->t->set_var('lang_admin_username',lang('admin username')); - $this->t->set_var('lang_admin_password',lang('admin password')); - $this->t->set_var('lang_imap_server_logintyp',lang('imap server logintyp')); - $this->t->set_var('lang_standard',lang('username (standard)')); - $this->t->set_var('lang_vmailmgr',lang('username@domainname (Virtual MAIL ManaGeR)')); - $this->t->set_var('lang_pre_2001_c_client',lang('IMAP C-Client Version < 2001')); - $this->t->set_var('lang_user_can_edit_forwarding_address',lang('user can edit forwarding address')); - $this->t->set_var('lang_can_be_used_by_application',lang('can be used by application')); - $this->t->set_var('lang_can_be_used_by_group',lang('can be used by group')); - $this->t->set_var('lang_smtp_auth',lang('smtp authentication')); - $this->t->set_var('lang_sender',lang('send using this eMail-Address')); - $this->t->set_var('lang_username',lang('username')); - $this->t->set_var('lang_password',lang('password')); - $this->t->set_var('lang_smtp_settings',lang('smtp settings')); - $this->t->set_var('lang_smtp_options',lang('smtp options')); - $this->t->set_var('lang_profile_access_rights',lang('profile access rights')); - $this->t->set_var('lang_global_settings',lang('')); - $this->t->set_var('lang_organisation',lang('organisation')); - $this->t->set_var('lang_global_options',lang('global options')); - $this->t->set_var('lang_server_settings',lang('server settings')); - $this->t->set_var('lang_encryption_settings',lang('encryption settings')); - $this->t->set_var('lang_no_encryption',lang('no encryption')); - $this->t->set_var('lang_encrypted_connection',lang('encrypted connection')); - $this->t->set_var('lang_do_not_validate_certificate',lang('do not validate certificate')); - $this->t->set_var('lang_vacation_requires_admin',lang('Vaction messages with start- and end-date require an admin account to be set!')); - $this->t->set_var('lang_can_be_used_by_user',lang('can be used by user')); - $this->t->set_var('lang_profile_isactive',lang('profile is active')); - $this->t->set_var('lang_defined_by_admin',lang('Username/Password defined by admin')); - $this->t->set_var('lang_Use_IMAP_auth', lang('Use predefined username and password defined below')); - $this->t->set_var('lang_stationery', lang('stationery')); - $this->t->set_var('lang_active_templates', lang('active templates')); - $this->t->set_var('lang_active_templates_description', lang('users can utilize these stationery templates')); - $this->t->set_var('lang_email',lang('use Users eMail-Address (as seen in Useraccount)')); - $this->t->set_var('',lang('')); - # $this->t->set_var('',lang('')); - + unset($content['nm']['rows']); } */ + if ($content['AddProfile']) + { + unset($content['AddProfile']); + } + if ($content['button']) + { + if ($content['button']) + { + list($button) = each($content['button']); + unset($content['button']); + } + switch($button) + { + default: + break; + } + } + $sel_options['ea_smtp_type']=parent::getSMTPServerTypes(); + $sel_options['ea_imap_type']=parent::getIMAPServerTypes(false); + $sel_options['ea_appname'] =self::getAllowedApps(); + // setting for the top of the app, etc. + $content['addJavaScript'] = $addJavaScript; + $content['subtitle'] = $subtitle; + if (!empty($filter)) foreach ($filter as $fk => $fv) $content['nm']['col_filter'][$fk] = $fv; + // seTting the Title of the app + $GLOBALS['egw_info']['flags']['app_header'] = lang('emailadmin'); + $tpl->exec('emailadmin.emailadmin_ui.index',$content,$sel_options,$readonlys,array('nm' => $content['nm'])); } -?> + + /** + * query the table + * + * reimplemented from so_sql to disable action-buttons based on the acl and make some modification on the data + * + * @param array &$query + * @param array &$rows returned rows/cups + * @param array &$readonlys eg. to disable buttons based on acl + * @param boolean $id_only=false if true only return (via $rows) an array of ids, dont save state to session + * @return int total number of rows matching the selection + */ + function get_rows(&$query_in,&$rows,&$readonlys,$id_only=false) + { + $query = $query_in; + $filteredby = ''; + if ($query['searchletter']) // only show rows if the order-criteria starts with the given letter + { + $query['col_filter'][] = (in_array($query['order'],parent::$numericfields) || (is_string($query['order']) && !(strpos($query['order'],',')===false)) ? 'ea_description' : $query['order']).' '. + $GLOBALS['egw']->db->capabilities['case_insensitive_like'].' '.$GLOBALS['egw']->db->quote($query['searchletter'].'%'); + if (in_array($query['order'],parent::$numericfields)) $query_in['order'] = $query['order'] = 'ea_description'; + $filteredby = $query['order'].' '.lang('starts with').' '.$query['searchletter']; + } + $GLOBALS['egw_info']['flags']['app_header'] = lang('emailadmin').($filteredby? ' - '.$filteredby:''); + $total = parent::get_rows($query,$rows,$readonlys); + return $total; + } + + static function getAllowedApps() + { + $applications = array( + 'calendar' => $GLOBALS['egw_info']['apps']['calendar']['title'], + 'felamimail' => $GLOBALS['egw_info']['apps']['felamimail']['title'], + ); + asort($applications); + return $applications = array_merge(array('' => lang('any application')),$applications); + } + + static function getIMAPLoginTypes($serverclass='defaultimap') + { + //error_log(__METHOD__.' called with:'.$serverclass." with capabilities:".parent::$IMAPServerType[$serverclass]['imapcapabilities']); + $returnval = array( + 'standard' =>lang('username (standard)'), + 'vmailmgr' =>lang('username@domainname (Virtual MAIL ManaGeR)'), + 'admin' =>lang('Username/Password defined by admin'), + ); + if (!empty($serverclass) && stripos(constant($serverclass.'::CAPABILITIES'),'logintypeemail') !== false) + { + $returnval['email'] = lang('use Users eMail-Address (as seen in Useraccount)'); + } + return $returnval; + } + + function edit($content=null) + { + //$this->editProfile($profileid); + $etpl = new etemplate(parent::APP.'.edit'); + if(!is_array($content)) + { + $rowfound = false; + $filter = array(); + if(is_int(intval($_GET['account_id'])) && !empty($_GET['account_id'])) + { + if ( intval($_GET['account_id']) < 0 ) { + $groupID = intval($_GET['account_id']); + $content['ea_group'] = $filter['ea_group'] = $groupID; + + } else { + $accountID = intval($_GET['account_id']); + $content['ea_user'] = $filter['ea_user'] = $accountID; + } + } + if (!empty($_GET['profileid'])) + { + $profileID = intval($_GET['profileid']); + $filter['ea_profile_id'] = $profileID; + $rowfound = parent::read($filter); + } + else + { + $content['ea_user_defined_accounts'] = "yes"; + } + } + else + { + $rowfound = true; + // handle action/submit buttons + if (isset($content['delete'])) + { + unset($content['delete']); + $button = 'delete'; + } + if (isset($content['cancel'])) + { + unset($content['cancel']); + $button = 'cancel'; + } + if (isset($content['apply'])) + { + unset($content['apply']); + $button = 'apply'; + } + if (isset($content['save'])) + { + unset($content['save']); + $button = 'save'; + } + unset($content['manage_stationery_templates']); + //unset($content['tabs']); + if (!empty($content['smtp_senders_email'])) + { + $content['ea_smtp_auth_username'] = $content['ea_smtp_auth_username'].';'.$content['smtp_senders_email']; + unset($content['smtp_senders_email']); + } + $this->data = $content; + switch ($button) + { + case 'delete': + if (($deleted = self::delete($content['ea_profile_id']))) + { + $msg = lang('%1 entries deleted.',$deleted); + } + else + { + $msg = lang('Error deleting entry!'); + } + $js = "opener.location.href='".$GLOBALS['egw']->link('/index.php',array( + 'menuaction' => parent::APP.'.emailadmin_ui.index', + 'msg' => $msg, + ))."';"; + $js .= 'window.close();'; + echo "\n\n\n\n\n"; + $GLOBALS['egw']->common->egw_exit(); + break; + case 'cancel': + $js .= 'window.close();'; + echo "\n\n\n\n\n"; + $GLOBALS['egw']->common->egw_exit(); + break; + case 'apply': + case 'save': + if ($etpl->validation_errors()) break; // the user need to fix the error, before we can save the entry + //_debug_array($this->data); + if (parent::save() != 0) + { + $msg = lang('Error saving the entry!!!'); + $button = ''; + } + else + { + $msg = lang('Entry saved'); + } + $js = "opener.location.href='".$GLOBALS['egw']->link('/index.php',array( + 'menuaction' => parent::APP.'.emailadmin_ui.index', + 'msg' => $msg, + ))."';"; + if ($button == 'save') + { + $js .= 'window.close();'; + echo "\n\n\n\n\n"; + $GLOBALS['egw']->common->egw_exit(); + break; + } + $row; + } + } + if ($rowfound) $content = array_merge($this->data,array()); + $preserv['smtpcapabilities'] = $content['smtpcapabilities'] = + constant((!empty($content['ea_smtp_type'])?$content['ea_smtp_type']:'defaultsmtp').'::CAPABILITIES'); + $preserv['imapcapabilities'] = $content['imapcapabilities'] = + constant((!empty($content['ea_imap_type'])?$content['ea_imap_type']:'defaultimap').'::CAPABILITIES'); + if (!empty($msg)) $content['msg'] = $msg; + list($content['ea_smtp_auth_username'],$content['smtp_senders_email']) = explode(';',$content['ea_smtp_auth_username']); + $preserv['ea_profile_id'] = $content['ea_profile_id']; + //$preserv['ea_stationery_active_templates'] = $content['ea_stationery_active_templates']; + $sel_options['ea_smtp_type']=parent::getSMTPServerTypes(); + $sel_options['ea_imap_type']=parent::getIMAPServerTypes(false); + $sel_options['ea_appname'] =self::getAllowedApps(); + $sel_options['ea_imap_login_type'] = self::getIMAPLoginTypes($content['ea_imap_type']); + // Stationery settings + $bostationery = new felamimail_bostationery(); + $sel_options['ea_stationery_active_templates'] = $bostationery->get_stored_templates(); + /* + $content['stored_templates'] = html::checkbox_multiselect( + 'ea_stationery_active_templates',$content['ea_stationery_active_templates'] + ,$bostationery->get_stored_templates(),true,'',3,true,'width: 100%;'); + + $content['manage_stationery_templates'] = + html::a_href( + lang('manage stationery templates'), + '/index.php?menuaction=etemplate.editor.edit', + array('name' => 'felamimail.stationery'), + 'target="_blank"' + ); + */ + //_debug_array($this->data); + return $etpl->exec(parent::APP.'.emailadmin_ui.edit',$content,$sel_options,$readonlys,$preserv,2); + } + + function add() + { + $this->edit(); + } + + function delete($profileid=null) + { + $_profileID = ($profileid ? $profileid : (int)$_GET['profileid']); + if (empty($_profileID)) return 0; + $deleted = parent::delete(array('ea_profile_id' => $_profileID)); + if (!is_array($_profileID)) $_profileID = (array)$_profileID; + foreach ($_profileID as $tk => $pid) + { + parent::$sessionData['profile'][$pid] = array(); + } + parent::saveSessionData(); + return $deleted; + } + + function listProfiles() + { + $GLOBALS['egw']->hooks->register_all_hooks(); + self::index(); + } +} diff --git a/emailadmin/inc/class.postfixdbmailuser.inc.php b/emailadmin/inc/class.postfixdbmailuser.inc.php index df75f21471..96b32a7e3e 100755 --- a/emailadmin/inc/class.postfixdbmailuser.inc.php +++ b/emailadmin/inc/class.postfixdbmailuser.inc.php @@ -16,6 +16,11 @@ class postfixdbmailuser extends emailadmin_smtp_ldap //class emailadmin_smtp_dbmailuser extends emailadmin_smtp_ldap { + /** + * Capabilities of this class (pipe-separated): default, forward + */ + const CAPABILITIES = 'default|forward'; + /** * Name of schema, has to be the correct case! */ diff --git a/emailadmin/inc/class.postfixldap.inc.php b/emailadmin/inc/class.postfixldap.inc.php index 67ad589eef..62f85ad007 100644 --- a/emailadmin/inc/class.postfixldap.inc.php +++ b/emailadmin/inc/class.postfixldap.inc.php @@ -16,6 +16,11 @@ class postfixldap extends emailadmin_smtp_ldap //class emailadmin_smtp_qmailuser extends emailadmin_smtp_ldap { + /** + * Capabilities of this class (pipe-separated): default, forward + */ + const CAPABILITIES = 'default|forward'; + /** * Name of schema, has to be in the right case! */ diff --git a/emailadmin/inc/class.smtpplesk.inc.php b/emailadmin/inc/class.smtpplesk.inc.php index 50c07525a5..da4dcbcd91 100644 --- a/emailadmin/inc/class.smtpplesk.inc.php +++ b/emailadmin/inc/class.smtpplesk.inc.php @@ -25,6 +25,11 @@ include_once(EGW_SERVER_ROOT."/emailadmin/inc/class.pleskimap.inc.php"); class smtpplesk extends defaultsmtp { + /** + * Capabilities of this class (pipe-separated): default, forward + */ + const CAPABILITIES = 'default|forward'; + /** * @var string/boolean $error string with last error-message or false */ From bd88221059019a279ec96edeaa35cda258c434ac Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Fri, 20 Aug 2010 07:57:15 +0000 Subject: [PATCH 250/496] disabling permanent error_log of sieve requests --- emailadmin/inc/class.defaultimap.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emailadmin/inc/class.defaultimap.inc.php b/emailadmin/inc/class.defaultimap.inc.php index 7cbbe44371..31f9f7ba67 100644 --- a/emailadmin/inc/class.defaultimap.inc.php +++ b/emailadmin/inc/class.defaultimap.inc.php @@ -624,7 +624,7 @@ class defaultimap extends Net_IMAP $this->error =& $this->sieve->error; } $ret = call_user_func_array(array($this->sieve,$name),$params); - error_log(__CLASS__.'->'.$name.'('.array2string($params).') returns '.array2string($ret)); + //error_log(__CLASS__.'->'.$name.'('.array2string($params).') returns '.array2string($ret)); return $ret; } throw new egw_exception_wrong_parameter("No method '$name' implemented!"); From b04394bad5d058198f37e45926c586ac5c94f979 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Fri, 20 Aug 2010 09:11:16 +0000 Subject: [PATCH 251/496] moved getUserData from defaultimap to cyrusimap, as it requires and admin conneciton, which we only support for Cyrus, also some docu update --- emailadmin/inc/class.cyrusimap.inc.php | 50 ++- emailadmin/inc/class.defaultimap.inc.php | 19 +- emailadmin/inc/class.uiuserdata.inc.php | 402 ++++++++++++----------- 3 files changed, 259 insertions(+), 212 deletions(-) diff --git a/emailadmin/inc/class.cyrusimap.inc.php b/emailadmin/inc/class.cyrusimap.inc.php index 5a4d8cd215..0cc686f33d 100644 --- a/emailadmin/inc/class.cyrusimap.inc.php +++ b/emailadmin/inc/class.cyrusimap.inc.php @@ -35,11 +35,21 @@ class cyrusimap extends defaultimap var $cyrusAdminPassword; + /** + * Updates an account + * + * @param array $_hookValues only value for key 'account_lid' and 'new_passwd' is used + */ function addAccount($_hookValues) { return $this->updateAccount($_hookValues); } + /** + * Delete an account + * + * @param array $_hookValues only value for key 'account_lid' is used + */ function deleteAccount($_hookValues) { if(!$this->enableCyrusAdmin) { @@ -77,6 +87,7 @@ class cyrusimap extends defaultimap /** * Create mailbox string from given mailbox-name and user-name + * * @param string $_username * @param string $_folderName='' * @return string utf-7 encoded (done in getMailboxName) @@ -98,6 +109,39 @@ class cyrusimap extends defaultimap return $mailboxString; } + /** + * returns information about a user + * currently only supported information is the current quota + * + * @param string $_username + * @return array userdata + */ + function getUserData($_username) + { + if($this->_connected === true) { + //error_log(__METHOD__."try to disconnect"); + $this->disconnect(); + } + + $this->openConnection(true); + $userData = array(); + + if($quota = $this->getQuotaByUser($_username)) { + $userData['quotaLimit'] = $quota / 1024; + } + + $this->disconnect(); + + return $userData; + } + + /** + * Set information about a user + * currently only supported information is the current quota + * + * @param string $_username + * @param int $_quota + */ function setUserData($_username, $_quota) { if(!$this->enableCyrusAdmin) { @@ -126,9 +170,13 @@ class cyrusimap extends defaultimap $this->disconnect(); return true; - } + /** + * Updates an account + * + * @param array $_hookValues only value for key 'account_lid' and 'new_passwd' is used + */ function updateAccount($_hookValues) { if(!$this->enableCyrusAdmin) { diff --git a/emailadmin/inc/class.defaultimap.inc.php b/emailadmin/inc/class.defaultimap.inc.php index 31f9f7ba67..3a8adc662d 100644 --- a/emailadmin/inc/class.defaultimap.inc.php +++ b/emailadmin/inc/class.defaultimap.inc.php @@ -470,28 +470,15 @@ class defaultimap extends Net_IMAP /** * returns information about a user - * currently only supported information is the current quota + * + * Only a stub, as admin connection requires, which is only supported for Cyrus * * @param string $_username * @return array userdata */ function getUserData($_username) { - if($this->_connected === true) { - //error_log(__METHOD__."try to disconnect"); - $this->disconnect(); - } - - $this->openConnection(true); - $userData = array(); - - if($quota = $this->getQuotaByUser($_username)) { - $userData['quotaLimit'] = $quota / 1024; - } - - $this->disconnect(); - - return $userData; + return array(); } /** diff --git a/emailadmin/inc/class.uiuserdata.inc.php b/emailadmin/inc/class.uiuserdata.inc.php index 4370657457..f609bd51d2 100644 --- a/emailadmin/inc/class.uiuserdata.inc.php +++ b/emailadmin/inc/class.uiuserdata.inc.php @@ -1,207 +1,219 @@ + * @author Lars Kneschke + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ - class uiuserdata +/** + * Edit user account + */ +class uiuserdata +{ + var $public_functions = array + ( + 'editUserData' => True, + 'saveUserData' => True + ); + + /** + * @var Template + */ + var $t; + + /** + * @var emailadmin_bo + */ + var $boemailadmin; + + /** + * Constructor + */ + function __construct() { + $this->t = new Template(EGW_APP_TPL); + $this->boemailadmin = new emailadmin_bo(); + } - var $public_functions = array + function display_app_header() + { + $GLOBALS['egw']->js->validate_file('jscode','editUserdata','emailadmin'); + $GLOBALS['egw_info']['flags']['include_xajax'] = True; + + $GLOBALS['egw']->common->egw_header(); + echo parse_navbar(); + } + + function editUserData($_useCache='0') + { + $accountID = $_GET['account_id']; + $GLOBALS['account_id'] = $accountID; + + $this->display_app_header(); + + $this->translate(); + + $this->t->set_file(array("editUserData" => "edituserdata.tpl")); + $this->t->set_block('editUserData','form','form'); + $this->t->set_block('editUserData','link_row','link_row'); + $this->t->set_var("th_bg",$GLOBALS['egw_info']["theme"]["th_bg"]); + $this->t->set_var("tr_color1",$GLOBALS['egw_info']["theme"]["row_on"]); + $this->t->set_var("tr_color2",$GLOBALS['egw_info']["theme"]["row_off"]); + + $this->t->set_var("lang_email_config",lang("edit email settings")); + $this->t->set_var("lang_emailAddress",lang("email address")); + $this->t->set_var("lang_emailaccount_active",lang("email account active")); + $this->t->set_var("lang_mailAlternateAddress",lang("alternate email address")); + $this->t->set_var("lang_mailRoutingAddress",lang("forward email's to")); + $this->t->set_var("lang_forward_also_to",lang("forward also to")); + $this->t->set_var("lang_button",lang("save")); + $this->t->set_var("lang_deliver_extern",lang("deliver extern")); + $this->t->set_var("lang_deliver_extern",lang("deliver extern")); + $this->t->set_var("lang_edit_email_settings",lang("edit email settings")); + $this->t->set_var("lang_ready",lang("Done")); + $this->t->set_var("link_back",$GLOBALS['egw']->link('/admin/accounts.php')); + + $linkData = array ( - 'editUserData' => True, - 'saveUserData' => True + 'menuaction' => 'emailadmin.uiuserdata.saveUserData', + 'account_id' => $accountID ); + $this->t->set_var("form_action", $GLOBALS['egw']->link('/index.php',$linkData)); - function uiuserdata() - { - $this->t =& CreateObject('phpgwapi.Template',EGW_APP_TPL); - $this->boemailadmin = new emailadmin_bo(); + $this->t->set_var('url_image_add',$GLOBALS['egw']->common->image('phpgwapi','new')); + $this->t->set_var('url_image_edit',$GLOBALS['egw']->common->image('phpgwapi','edit')); + $this->t->set_var('url_image_delete',$GLOBALS['egw']->common->image('phpgwapi','delete')); + + // only when we show a existing user + if($userData = $this->boemailadmin->getUserData($accountID)) { + $addresses = array(); + foreach((array)$userData['mailAlternateAddress'] as $data) { + $addresses[$data] = $data; + } + $this->t->set_var('selectbox_mailAlternateAddress', html::select( + 'mailAlternateAddress', + '', + $addresses, + true, + "style='width: 100%;' id='mailAlternateAddress'", + 5) + ); + + $addresses = array(); + foreach((array)$userData['mailForwardingAddress'] as $data) { + $addresses[$data] = $data; + } + $this->t->set_var('selectbox_mailRoutingAddress', html::select( + 'mailForwardingAddress', + '', + $addresses, + true, + "style='width: 100%;' id='mailRoutingAddress'", + 5) + ); + + $this->t->set_var("quotaLimit",$userData["quotaLimit"]); + + $this->t->set_var("mailLocalAddress",$userData["mailLocalAddress"]); + $this->t->set_var("mailAlternateAddress",''); + $this->t->set_var("mailRoutingAddress",''); + $this->t->set_var("selected_".$userData["qmailDotMode"],'selected'); + $this->t->set_var("deliveryProgramPath",$userData["deliveryProgramPath"]); + + $this->t->set_var("uid",rawurlencode($_accountData["dn"])); + if ($userData["accountStatus"] == "active") + $this->t->set_var("account_checked","checked"); + if ($userData["deliveryMode"] == "forwardOnly") + $this->t->set_var("forwardOnly_checked","checked"); + if ($_accountData["deliverExtern"] == "active") + $this->t->set_var("deliver_checked","checked"); + } else { + $this->t->set_var("mailLocalAddress",''); + $this->t->set_var("mailAlternateAddress",''); + $this->t->set_var("mailRoutingAddress",''); + $this->t->set_var("options_mailAlternateAddress",lang('no alternate email address')); + $this->t->set_var("options_mailRoutingAddress",lang('no forwarding email address')); + $this->t->set_var("account_checked",''); + $this->t->set_var("forwardOnly_checked",''); + + $this->t->set_var('selectbox_mailAlternateAddress', html::select( + 'mailAlternateAddress', + '', + array(), + true, + "style='width: 100%;' id='mailAlternateAddress'", + 5) + ); + + $this->t->set_var('selectbox_mailRoutingAddress', html::select( + 'mailForwardingAddress', + '', + array(), + true, + "style='width: 100%;' id='mailRoutingAddress'", + 5) + ); + + $this->t->set_var('quotaLimit',''); } - function display_app_header() - { - $GLOBALS['egw']->js->validate_file('jscode','editUserdata','emailadmin'); - $GLOBALS['egw_info']['flags']['include_xajax'] = True; + // create the menu on the left, if needed + $menuClass =& CreateObject('admin.uimenuclass'); + $this->t->set_var('rows',$menuClass->createHTMLCode('edit_user')); - $GLOBALS['egw']->common->egw_header(); - echo parse_navbar(); - } + $this->t->pparse("out","form"); - function editUserData($_useCache='0') - { - $accountID = $_GET['account_id']; - $GLOBALS['account_id'] = $accountID; - - $this->display_app_header(); - - $this->translate(); - - $this->t->set_file(array("editUserData" => "edituserdata.tpl")); - $this->t->set_block('editUserData','form','form'); - $this->t->set_block('editUserData','link_row','link_row'); - $this->t->set_var("th_bg",$GLOBALS['egw_info']["theme"]["th_bg"]); - $this->t->set_var("tr_color1",$GLOBALS['egw_info']["theme"]["row_on"]); - $this->t->set_var("tr_color2",$GLOBALS['egw_info']["theme"]["row_off"]); - - $this->t->set_var("lang_email_config",lang("edit email settings")); - $this->t->set_var("lang_emailAddress",lang("email address")); - $this->t->set_var("lang_emailaccount_active",lang("email account active")); - $this->t->set_var("lang_mailAlternateAddress",lang("alternate email address")); - $this->t->set_var("lang_mailRoutingAddress",lang("forward email's to")); - $this->t->set_var("lang_forward_also_to",lang("forward also to")); - $this->t->set_var("lang_button",lang("save")); - $this->t->set_var("lang_deliver_extern",lang("deliver extern")); - $this->t->set_var("lang_deliver_extern",lang("deliver extern")); - $this->t->set_var("lang_edit_email_settings",lang("edit email settings")); - $this->t->set_var("lang_ready",lang("Done")); - $this->t->set_var("link_back",$GLOBALS['egw']->link('/admin/accounts.php')); - - $linkData = array - ( - 'menuaction' => 'emailadmin.uiuserdata.saveUserData', - 'account_id' => $accountID - ); - $this->t->set_var("form_action", $GLOBALS['egw']->link('/index.php',$linkData)); - - $this->t->set_var('url_image_add',$GLOBALS['egw']->common->image('phpgwapi','new')); - $this->t->set_var('url_image_edit',$GLOBALS['egw']->common->image('phpgwapi','edit')); - $this->t->set_var('url_image_delete',$GLOBALS['egw']->common->image('phpgwapi','delete')); - - // only when we show a existing user - if($userData = $this->boemailadmin->getUserData($accountID)) { - $addresses = array(); - foreach((array)$userData['mailAlternateAddress'] as $data) { - $addresses[$data] = $data; - } - $this->t->set_var('selectbox_mailAlternateAddress', html::select( - 'mailAlternateAddress', - '', - $addresses, - true, - "style='width: 100%;' id='mailAlternateAddress'", - 5) - ); - - $addresses = array(); - foreach((array)$userData['mailForwardingAddress'] as $data) { - $addresses[$data] = $data; - } - $this->t->set_var('selectbox_mailRoutingAddress', html::select( - 'mailForwardingAddress', - '', - $addresses, - true, - "style='width: 100%;' id='mailRoutingAddress'", - 5) - ); - - $this->t->set_var("quotaLimit",$userData["quotaLimit"]); - - $this->t->set_var("mailLocalAddress",$userData["mailLocalAddress"]); - $this->t->set_var("mailAlternateAddress",''); - $this->t->set_var("mailRoutingAddress",''); - $this->t->set_var("selected_".$userData["qmailDotMode"],'selected'); - $this->t->set_var("deliveryProgramPath",$userData["deliveryProgramPath"]); - - $this->t->set_var("uid",rawurlencode($_accountData["dn"])); - if ($userData["accountStatus"] == "active") - $this->t->set_var("account_checked","checked"); - if ($userData["deliveryMode"] == "forwardOnly") - $this->t->set_var("forwardOnly_checked","checked"); - if ($_accountData["deliverExtern"] == "active") - $this->t->set_var("deliver_checked","checked"); - } else { - $this->t->set_var("mailLocalAddress",''); - $this->t->set_var("mailAlternateAddress",''); - $this->t->set_var("mailRoutingAddress",''); - $this->t->set_var("options_mailAlternateAddress",lang('no alternate email address')); - $this->t->set_var("options_mailRoutingAddress",lang('no forwarding email address')); - $this->t->set_var("account_checked",''); - $this->t->set_var("forwardOnly_checked",''); - - $this->t->set_var('selectbox_mailAlternateAddress', html::select( - 'mailAlternateAddress', - '', - array(), - true, - "style='width: 100%;' id='mailAlternateAddress'", - 5) - ); - - $this->t->set_var('selectbox_mailRoutingAddress', html::select( - 'mailForwardingAddress', - '', - array(), - true, - "style='width: 100%;' id='mailRoutingAddress'", - 5) - ); - - $this->t->set_var('quotaLimit',''); - } - - // create the menu on the left, if needed - $menuClass =& CreateObject('admin.uimenuclass'); - $this->t->set_var('rows',$menuClass->createHTMLCode('edit_user')); - - $this->t->pparse("out","form"); - - } - - function saveUserData() - { - if($_POST["accountStatus"] == "on") { - $accountStatus = "active"; - } - - if($_POST["forwardOnly"] == "on") { - $deliveryMode = "forwardOnly"; - } - - $formData = array ( - 'mailLocalAddress' => $_POST["mailLocalAddress"], - 'mailAlternateAddress' => $_POST["mailAlternateAddress"], - 'mailForwardingAddress' => $_POST["mailForwardingAddress"], - 'quotaLimit' => $_POST["quotaLimit"], - 'qmailDotMode' => $_POST["qmailDotMode"], - 'deliveryProgramPath' => $_POST["deliveryProgramPath"], - 'accountStatus' => $accountStatus, - 'deliveryMode' => $deliveryMode - ); - - $this->boemailadmin->saveUserData($_GET['account_id'], $formData); - - // read date fresh from ldap storage - $this->editUserData(); - } - - function translate() - { - $this->t->set_var('th_bg',$GLOBALS['egw_info']['theme']['th_bg']); - - $this->t->set_var('lang_add',lang('add')); - $this->t->set_var('lang_done',lang('Done')); - $this->t->set_var('lang_remove',lang('remove')); - $this->t->set_var('lang_remove',lang('remove')); - $this->t->set_var('lang_advanced_options',lang('advanced options')); - $this->t->set_var('lang_qmaildotmode',lang('qmaildotmode')); - $this->t->set_var('lang_default',lang('default')); - $this->t->set_var('lang_quota_settings',lang('quota settings')); - $this->t->set_var('lang_qoutainmbyte',lang('qouta size in MByte')); - $this->t->set_var('lang_inmbyte',lang('in MByte')); - $this->t->set_var('lang_0forunlimited',lang('leave empty for no quota')); - $this->t->set_var('lang_forward_only',lang('forward only')); - $this->t->set_var('lang_enter_new_address',lang('Add new email address:')); - $this->t->set_var('lang_update_current_address',lang('Update current email address:')); - } } -?> + + function saveUserData() + { + if($_POST["accountStatus"] == "on") { + $accountStatus = "active"; + } + + if($_POST["forwardOnly"] == "on") { + $deliveryMode = "forwardOnly"; + } + + $formData = array ( + 'mailLocalAddress' => $_POST["mailLocalAddress"], + 'mailAlternateAddress' => $_POST["mailAlternateAddress"], + 'mailForwardingAddress' => $_POST["mailForwardingAddress"], + 'quotaLimit' => $_POST["quotaLimit"], + 'qmailDotMode' => $_POST["qmailDotMode"], + 'deliveryProgramPath' => $_POST["deliveryProgramPath"], + 'accountStatus' => $accountStatus, + 'deliveryMode' => $deliveryMode + ); + + $this->boemailadmin->saveUserData($_GET['account_id'], $formData); + + // read date fresh from ldap storage + $this->editUserData(); + } + + function translate() + { + $this->t->set_var('th_bg',$GLOBALS['egw_info']['theme']['th_bg']); + + $this->t->set_var('lang_add',lang('add')); + $this->t->set_var('lang_done',lang('Done')); + $this->t->set_var('lang_remove',lang('remove')); + $this->t->set_var('lang_remove',lang('remove')); + $this->t->set_var('lang_advanced_options',lang('advanced options')); + $this->t->set_var('lang_qmaildotmode',lang('qmaildotmode')); + $this->t->set_var('lang_default',lang('default')); + $this->t->set_var('lang_quota_settings',lang('quota settings')); + $this->t->set_var('lang_qoutainmbyte',lang('qouta size in MByte')); + $this->t->set_var('lang_inmbyte',lang('in MByte')); + $this->t->set_var('lang_0forunlimited',lang('leave empty for no quota')); + $this->t->set_var('lang_forward_only',lang('forward only')); + $this->t->set_var('lang_enter_new_address',lang('Add new email address:')); + $this->t->set_var('lang_update_current_address',lang('Update current email address:')); + } +} From 7889c066cf7911933cd97f05b7d6d167a7a5a457 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Fri, 20 Aug 2010 10:19:08 +0000 Subject: [PATCH 252/496] updated mail config to match current emailadmin --- setup/inc/class.setup_cmd_config.inc.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/setup/inc/class.setup_cmd_config.inc.php b/setup/inc/class.setup_cmd_config.inc.php index 29e559f2da..9ff6da5f28 100644 --- a/setup/inc/class.setup_cmd_config.inc.php +++ b/setup/inc/class.setup_cmd_config.inc.php @@ -5,7 +5,7 @@ * @link http://www.egroupware.org * @author Ralf Becker * @package setup - * @copyright (c) 2007 by Ralf Becker + * @copyright (c) 2007-10 by Ralf Becker * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License * @version $Id$ */ @@ -140,13 +140,14 @@ class setup_cmd_config extends setup_cmd array('name' => 'mail_login_type','allowed' => array( 'username (standard)' => 'standard', 'username@domain (virtual mail manager)' => 'vmailmgr', + 'Username/Password defined by admin' => 'admin', 'email (Standard Maildomain should be set)' => 'email', ),'default'=>'standard'), ), '--cyrus' => array( 'imapAdminUsername', 'imapAdminPW', - array('name' => 'imapType','default' => 3), + array('name' => 'imapType','default' => 'cyrusimap'), array('name' => 'imapEnableCyrusAdmin','default' => 'yes'), ), '--sieve' => array( @@ -156,7 +157,7 @@ class setup_cmd_config extends setup_cmd ), '--postfix' => array( array('name' => 'editforwardingaddress','allowed' => array('yes',null)), - array('name' => 'smtpType','default' => 2), + array('name' => 'smtpType','default' => 'postfixldap'), ), '--smtpserver' => array( //smtp server,[smtp port],[smtp user],[smtp password] 'smtp_server',array('name' => 'smtp_port','default' => 25),'smtp_auth_user','smtp_auth_passwd','' From 9063e6691b6a24ac6ccc7a6dd73cf1ffb19257a9 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Fri, 20 Aug 2010 11:14:00 +0000 Subject: [PATCH 253/496] some more adapting to current emailadmin: sieve host is not yet used, but defaulting to NULL is what emailadmin does too --- setup/inc/class.setup_cmd_config.inc.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/setup/inc/class.setup_cmd_config.inc.php b/setup/inc/class.setup_cmd_config.inc.php index 9ff6da5f28..8e96c8df47 100644 --- a/setup/inc/class.setup_cmd_config.inc.php +++ b/setup/inc/class.setup_cmd_config.inc.php @@ -151,7 +151,7 @@ class setup_cmd_config extends setup_cmd array('name' => 'imapEnableCyrusAdmin','default' => 'yes'), ), '--sieve' => array( - array('name' => 'imapSieveServer','default' => 'localhost'), + array('name' => 'imapSieveServer'), array('name' => 'imapSievePort','default' => 2000), array('name' => 'imapEnableSieve','default' => 'yes'), // null or yes ), @@ -365,8 +365,8 @@ class setup_cmd_config extends setup_cmd $defaults['mail_suffix'] = '$domain'; $defaults['imapAdminUsername'] = 'cyrus@$domain'; $defaults['imapAdminPW'] = self::randomstring(); - $defaults['imapType'] = 2; // standard IMAP - $defaults['smtpType'] = 1; // standard SMTP + $defaults['imapType'] = 'defaultimap'; // standard IMAP + $defaults['smtpType'] = 'defaultsmtp'; // standard SMTP return $defaults; } From 318db85091c120425c2e4b4dc631b98b0104e3bd Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Fri, 20 Aug 2010 13:28:12 +0000 Subject: [PATCH 254/496] new sub-command to delete ldap tree --- setup/inc/class.setup_cmd_ldap.inc.php | 60 +++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/setup/inc/class.setup_cmd_ldap.inc.php b/setup/inc/class.setup_cmd_ldap.inc.php index 97abe8ad36..4ca25cc587 100644 --- a/setup/inc/class.setup_cmd_ldap.inc.php +++ b/setup/inc/class.setup_cmd_ldap.inc.php @@ -95,6 +95,9 @@ class setup_cmd_ldap extends setup_cmd case 'test_ldap': $msg = $this->connect(); break; + case 'delete_ldap': + $msg = $this->delete(); + break; case 'create_ldap': default: $msg = $this->create(); @@ -139,8 +142,6 @@ class setup_cmd_ldap extends setup_cmd /** * Check and if does not yet exist create the new database and user * - * The check will fail if the database exists, but already contains tables - * * @return string with success message * @throws egw_exception_wrong_userinput */ @@ -165,6 +166,61 @@ class setup_cmd_ldap extends setup_cmd $this->ldap_host,$this->ldap_base); } + /** + * Delete whole LDAP tree of an instance dn=$this->ldap_base using $this->ldap_admin/_pw + * + * @return string with success message + * @throws egw_exception if dn not found, not listable or delete fails + */ + private function delete() + { + $this->connect($this->ldap_admin,$this->ldap_admin_pw); + + // if base not set, use context minus one hierarchy, eg. ou=accounts,(o=domain,dc=local) + if (empty($this->ldap_base) && $this->ldap_context) + { + list(,$this->ldap_base) = explode(',',$this->ldap_context,2); + } + // some precausion to not delete whole ldap tree! + if (count(explode(',',$this->ldap_base)) < 2) + { + throw new egw_exception_assertion_failed('Refusing to delete dn "%1"!',$this->ldap_base); + } + // check if base does exist + if (!@ldap_read($this->test_ldap->ds,$this->ldap_base,'objectClass=*')) + { + throw new egw_exception_wrong_userinput('Base dn "%1" NOT found!',$this->ldap_base); + } + return lang('LDAP dn="%1" with %2 entries deleted.', + $this->ldap_base,$this->rdelete($this->ldap_base)); + } + + /** + * Recursive delete a dn + * + * @param string $dn + * @return int integer number of deleted entries + * @throws egw_exception if dn not listable or delete fails + */ + private function rdelete($dn) + { + $sr = ldap_list($this->test_ldap->ds,$dn,'ObjectClass=*',array('')); + if (!($entries = ldap_get_entries($this->test_ldap->ds, $sr))) + { + throw new egw_exception('Error listing "dn=%1"!',$dn); + } + foreach($entries as $n => $entry) + { + if ($n == 'count') continue; + $this->rdelete($this->test_ldap->ds,$entry['dn']); + } + if (!ldap_delete($this->test_ldap->ds,$dn)) + { + throw new egw_exception('Error deleting "dn=%1"!',$dn); + } + return 1 + $entries['count']; + } + /** * array with objectclasses for the objects we can create * From d7f1dc32b3a5bbdef0b70167c4ea45d0c51095d7 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Fri, 20 Aug 2010 14:18:58 +0000 Subject: [PATCH 255/496] some fixes for base deletion and counting of active users --- setup/inc/class.setup_cmd_ldap.inc.php | 54 ++++++++++++++++++++------ 1 file changed, 43 insertions(+), 11 deletions(-) diff --git a/setup/inc/class.setup_cmd_ldap.inc.php b/setup/inc/class.setup_cmd_ldap.inc.php index 4ca25cc587..9fbaf313f0 100644 --- a/setup/inc/class.setup_cmd_ldap.inc.php +++ b/setup/inc/class.setup_cmd_ldap.inc.php @@ -96,7 +96,10 @@ class setup_cmd_ldap extends setup_cmd $msg = $this->connect(); break; case 'delete_ldap': - $msg = $this->delete(); + $msg = $this->delete_base(); + break; + case 'users_ldap': + $msg = $this->users(); break; case 'create_ldap': default: @@ -138,7 +141,32 @@ class setup_cmd_ldap extends setup_cmd } return lang('Successful connected to LDAP server on %1 using DN %2.',$this->ldap_host,$dn); } - + + /** + * Count active (not expired) users + * + * @return int number of active users + * @throws egw_exception_wrong_userinput + */ + private function users() + { + $this->connect(); + + $sr = ldap_list($this->test_ldap->ds,$this->ldap_context,'ObjectClass=posixAccount',array('dn','shadowExpire')); + if (!($entries = ldap_get_entries($this->test_ldap->ds, $sr))) + { + throw new egw_exception('Error listing "dn=%1"!',$this->ldap_context); + } + $num = 0; + foreach($entries as $n => $entry) + { + if ($n === 'count') continue; + if (isset($entry['shadowexpire']) && $entry['shadowexpire'][0]*24*3600 < time()) continue; + ++$num; + } + return $num; + } + /** * Check and if does not yet exist create the new database and user * @@ -172,7 +200,7 @@ class setup_cmd_ldap extends setup_cmd * @return string with success message * @throws egw_exception if dn not found, not listable or delete fails */ - private function delete() + private function delete_base() { $this->connect($this->ldap_admin,$this->ldap_admin_pw); @@ -184,12 +212,12 @@ class setup_cmd_ldap extends setup_cmd // some precausion to not delete whole ldap tree! if (count(explode(',',$this->ldap_base)) < 2) { - throw new egw_exception_assertion_failed('Refusing to delete dn "%1"!',$this->ldap_base); + throw new egw_exception_assertion_failed(lang('Refusing to delete dn "%1"!',$this->ldap_base)); } // check if base does exist if (!@ldap_read($this->test_ldap->ds,$this->ldap_base,'objectClass=*')) { - throw new egw_exception_wrong_userinput('Base dn "%1" NOT found!',$this->ldap_base); + throw new egw_exception_wrong_userinput(lang('Base dn "%1" NOT found!',$this->ldap_base)); } return lang('LDAP dn="%1" with %2 entries deleted.', $this->ldap_base,$this->rdelete($this->ldap_base)); @@ -204,19 +232,19 @@ class setup_cmd_ldap extends setup_cmd */ private function rdelete($dn) { - $sr = ldap_list($this->test_ldap->ds,$dn,'ObjectClass=*',array('')); - if (!($entries = ldap_get_entries($this->test_ldap->ds, $sr))) + if (!($sr = ldap_list($this->test_ldap->ds,$dn,'ObjectClass=*',array(''))) || + !($entries = ldap_get_entries($this->test_ldap->ds, $sr))) { - throw new egw_exception('Error listing "dn=%1"!',$dn); + throw new egw_exception(lang('Error listing "dn=%1"!',$dn)); } foreach($entries as $n => $entry) { - if ($n == 'count') continue; - $this->rdelete($this->test_ldap->ds,$entry['dn']); + if ($n === 'count') continue; + $this->rdelete($entry['dn']); } if (!ldap_delete($this->test_ldap->ds,$dn)) { - throw new egw_exception('Error deleting "dn=%1"!',$dn); + throw new egw_exception(lang('Error deleting "dn=%1"!',$dn)); } return 1 + $entries['count']; } @@ -304,6 +332,10 @@ class setup_cmd_ldap extends setup_cmd { foreach(self::defaults() as $name => $default) { + if ($this->sub_command == 'delete_ldap' && in_array($name,array('ldap_base','ldap_context'))) + { + continue; // no default on what to delete! + } if (!$this->$name) { //echo "

    setting $name='{$this->$name}' to it's default='$default'

    \n"; From ba1b0762bd45f70dde77385d9f3efe05cdbdc154 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Fri, 20 Aug 2010 19:28:49 +0000 Subject: [PATCH 256/496] setup_cmd_admin execs "admin/admin-cli.php --edit-user" to run all hooks, which can NOT run in setup --- setup/inc/class.setup.inc.php | 16 +++++++++++++++- setup/inc/class.setup_cmd_admin.inc.php | 22 +++++++++++++++++++--- setup/inc/functions.inc.php | 7 +++++++ 3 files changed, 41 insertions(+), 4 deletions(-) diff --git a/setup/inc/class.setup.inc.php b/setup/inc/class.setup.inc.php index adbb41c5d8..cc5765fc3c 100644 --- a/setup/inc/class.setup.inc.php +++ b/setup/inc/class.setup.inc.php @@ -1053,14 +1053,28 @@ class setup error_log("setup::add_account('$username','$first','$last',\$passwd,'$primary_group',$changepw,'$email') failed! accountid=$accountid"); return false; } - // call add{account|group} hook to create the vfs-home-dirs + // call vfs_home_hooks::add{account|group} hook to create the vfs-home-dirs + // calling general add{account|group} hook fails, as we are only in setup + // --> setup_cmd_admin execs "admin/admin-cli.php --edit-user" to run them if ($primary_group) { vfs_home_hooks::addAccount($account); +/* + $GLOBALS['hook_values'] = $account + array('new_passwd' => $account['account_passwd']); + $GLOBALS['egw']->hooks->process($GLOBALS['hook_values']+array( + 'location' => 'addaccount' + ),False,True); // called for every app now, not only enabled ones +*/ } else { vfs_home_hooks::addGroup($account+array('account_name' => $account['account_lid'])); +/* + $GLOBALS['hook_values'] = $account+(array('account_name' => $account['account_lid'])); + $GLOBALS['egw']->hooks->process($GLOBALS['hook_values']+array( + 'location' => 'addgroup' + ),False,True); // called for every app now, not only enabled ones) +*/ } } if ($primary_group) // only for users, NOT groups diff --git a/setup/inc/class.setup_cmd_admin.inc.php b/setup/inc/class.setup_cmd_admin.inc.php index 99ef65e997..620c05c2f2 100644 --- a/setup/inc/class.setup_cmd_admin.inc.php +++ b/setup/inc/class.setup_cmd_admin.inc.php @@ -5,7 +5,7 @@ * @link http://www.egroupware.org * @author Ralf Becker * @package setup - * @copyright (c) 2007 by Ralf Becker + * @copyright (c) 2007-10 by Ralf Becker * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License * @version $Id$ */ @@ -76,7 +76,12 @@ class setup_cmd_admin extends setup_cmd if (!$this->admin_firstname) $this->set_defaults['admin_firstname'] = $this->admin_firstname = lang('Admin'); if (!$this->admin_lastname) $this->set_defaults['admin_lastname'] = $this->admin_lastname = lang('User'); - + if (strpos($this->admin_email,'$') !== false) + { + $this->set_defaults['email'] = $this->admin_email = str_replace( + array('$domain','$uid','$account_lid'), + array($this->domain,$this->admin_user,$this->admin_user),$this->admin_email); + } $_POST['username'] = $this->admin_user; $_POST['passwd2'] = $_POST['passwd'] = $this->admin_password; $_POST['fname'] = $this->admin_firstname; @@ -97,7 +102,18 @@ class setup_cmd_admin extends setup_cmd throw new egw_exception_wrong_userinput(lang('Error in group-creation !!!'),42); } $this->restore_db(); - + + // run admin/admin-cli.php --edit-user to store the new accounts once in EGroupware + // to run all hooks (some of them can NOT run inside setup) + $cmd = EGW_SERVER_ROOT.'/admin/admin-cli.php --edit-user '. + escapeshellarg($this->admin_user.'@'.$this->domain.','.$this->admin_password.','.$this->admin_user); + exec($cmd,$output,$ret); + $output = implode("\n",$output); + //echo "ret=$ret\n".$output; + if ($ret) + { + throw new egw_exception ($output,$ret); + } return lang('Admin account successful created.'); } } diff --git a/setup/inc/functions.inc.php b/setup/inc/functions.inc.php index 62aad93fa8..91f06e3040 100644 --- a/setup/inc/functions.inc.php +++ b/setup/inc/functions.inc.php @@ -59,6 +59,13 @@ if(!defined('EGW_SERVER_ROOT') && !defined('EGW_INCLUDE_ROOT')) require_once(EGW_INCLUDE_ROOT . '/phpgwapi/inc/common_functions.inc.php'); +// check if eGW's pear repository is installed and prefer it over the regular one +if (is_dir(EGW_SERVER_ROOT.'/egw-pear')) +{ + set_include_path(EGW_SERVER_ROOT.'/egw-pear'.PATH_SEPARATOR.get_include_path()); + //echo "

    include_path='".get_include_path()."'

    \n"; +} + define('SEP',filesystem_separator()); /** From 1cd6ff968f39f72046a97ef026b5809a719f76ff Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Fri, 20 Aug 2010 20:30:30 +0000 Subject: [PATCH 257/496] - new admin-cli command --add-user like --edit-user, but runs addaccount hook for existing accounts too - using --add-user instead of --edit-user in setup_cmd_admin --- admin/admin-cli.php | 14 ++++++++------ admin/inc/class.admin_cmd_edit_user.inc.php | 8 +++++--- setup/inc/class.setup_cmd_admin.inc.php | 4 ++-- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/admin/admin-cli.php b/admin/admin-cli.php index 1e3a74061b..e2da0c7e7d 100755 --- a/admin/admin-cli.php +++ b/admin/admin-cli.php @@ -6,7 +6,7 @@ * @link http://www.egroupware.org * @package admin * @author Ralf Becker - * @copyright (c) 2006/7 by Ralf Becker + * @copyright (c) 2006-10 by Ralf Becker * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License * @version $Id$ */ @@ -54,6 +54,9 @@ switch($action) case '--edit-user': return do_edit_user($arg0s); + case '--add-user': // like --edit-account, but always runs addaccount hook + return do_edit_user($arg0s,true); + case '--change-pw': return do_change_pw($arg0s); @@ -280,8 +283,9 @@ function do_change_pw($args) * Edit or add a user to eGroupWare. If you specify groups, they *replace* the exiting memberships! * 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12 * @param array $args admin-account[@domain],admin-password,account[=new-account-name],first-name,last-name,password,email,expires{never(default)|YYYY-MM-DD|already},can-change-pw{true(default)|false},anon-user{true|false(default)},primary-group{Default(default)|...}[,groups,...][,homedirectory,loginshell] + * @param boolean $run_addaccount_hook=null default run hook depending on account existence, true=allways run addaccount hook */ -function do_edit_user($args) +function do_edit_user($args,$run_addaccount_hook=null) { array_shift($args); // admin-account array_shift($args); // admin-pw @@ -321,7 +325,7 @@ function do_edit_user($args) $data['account_lid'] = $account; $account = false; }; - run_command(new admin_cmd_edit_user($account,$data)); + run_command(new admin_cmd_edit_user($account,$data,null,$run_addaccount_hook)); } /** @@ -412,9 +416,7 @@ function do_subscribe_other($account_lid,$pw=null) 'account_lid' => $account_lid, 'passwd' => $pw, ); - include_once(EGW_INCLUDE_ROOT.'/emailadmin/inc/class.bo.inc.php'); - - $emailadmin = new bo(); + $emailadmin = new emailadmin_bo(); $user_profile = $emailadmin->getUserProfile('felamimail'); unset($emailadmin); diff --git a/admin/inc/class.admin_cmd_edit_user.inc.php b/admin/inc/class.admin_cmd_edit_user.inc.php index 9ab3d00c37..9fb4a0f941 100644 --- a/admin/inc/class.admin_cmd_edit_user.inc.php +++ b/admin/inc/class.admin_cmd_edit_user.inc.php @@ -5,7 +5,7 @@ * @link http://www.egroupware.org * @author Ralf Becker * @package admin - * @copyright (c) 2007 by Ralf Becker + * @copyright (c) 2007-10 by Ralf Becker * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License * @version $Id$ */ @@ -21,8 +21,9 @@ class admin_cmd_edit_user extends admin_cmd_change_pw * @param string/int/array $account account name or id (!$account to add a new account), or array with all parameters * @param array $set=null array with all data to change * @param string $password=null password + * @param boolean $run_addaccount_hook=null default run addaccount for new accounts and editaccount for existing ones */ - function __construct($account,$set=null,$password=null) + function __construct($account,$set=null,$password=null,$run_addaccount_hook=null) { if (!is_array($account)) { @@ -30,6 +31,7 @@ class admin_cmd_edit_user extends admin_cmd_change_pw 'account' => $account, 'set' => $set, 'password' => is_null($password) ? $set['account_passwd'] : $password, + 'run_addaccount_hook' => $run_addaccount_hook, ); } admin_cmd::__construct($account); @@ -167,7 +169,7 @@ class admin_cmd_edit_user extends admin_cmd_change_pw $data['account_passwd'] = $this->password; $GLOBALS['hook_values'] =& $data; $GLOBALS['egw']->hooks->process($GLOBALS['hook_values']+array( - 'location' => $this->account ? 'editaccount' : 'addaccount' + 'location' => $this->account && $this->run_addaccount_hook !== true ? 'editaccount' : 'addaccount' ),False,True); // called for every app now, not only enabled ones) return lang("Account %1 %2",$this->account ? $this->account : $data['account_lid'], diff --git a/setup/inc/class.setup_cmd_admin.inc.php b/setup/inc/class.setup_cmd_admin.inc.php index 620c05c2f2..06d2664cc9 100644 --- a/setup/inc/class.setup_cmd_admin.inc.php +++ b/setup/inc/class.setup_cmd_admin.inc.php @@ -103,9 +103,9 @@ class setup_cmd_admin extends setup_cmd } $this->restore_db(); - // run admin/admin-cli.php --edit-user to store the new accounts once in EGroupware + // run admin/admin-cli.php --add-user to store the new accounts once in EGroupware // to run all hooks (some of them can NOT run inside setup) - $cmd = EGW_SERVER_ROOT.'/admin/admin-cli.php --edit-user '. + $cmd = EGW_SERVER_ROOT.'/admin/admin-cli.php --add-user '. escapeshellarg($this->admin_user.'@'.$this->domain.','.$this->admin_password.','.$this->admin_user); exec($cmd,$output,$ret); $output = implode("\n",$output); From c37862f6f4ac18307bb5205867cc671a8075a5d7 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Sat, 21 Aug 2010 20:21:39 +0000 Subject: [PATCH 258/496] new method deleteUsers(='%') allowing to delete multiple (user-)mailboxes via wildcards, eg. a whole domain --- emailadmin/inc/class.cyrusimap.inc.php | 63 +++++++++++++++++--------- 1 file changed, 41 insertions(+), 22 deletions(-) diff --git a/emailadmin/inc/class.cyrusimap.inc.php b/emailadmin/inc/class.cyrusimap.inc.php index 0cc686f33d..04032f11b7 100644 --- a/emailadmin/inc/class.cyrusimap.inc.php +++ b/emailadmin/inc/class.cyrusimap.inc.php @@ -52,37 +52,56 @@ class cyrusimap extends defaultimap */ function deleteAccount($_hookValues) { - if(!$this->enableCyrusAdmin) { + // some precausion to really delete just _one_ account + if (strpos($_hookValues['account_lid'],'%') !== false || + strpos($_hookValues['account_lid'],'*') !== false) + { + return false; + } + return !!$this->deleteUsers($_hookValues['account_lid']); + } + + /** + * Delete multiple (user-)mailboxes via a wildcard, eg. '%' for whole domain + * + * Domain is the configured domain and it uses the Cyrus admin user + * + * @return string $username='%' username containing wildcards, default '%' for all users of a domain + * @return int|boolean number of deleted mailboxes on success or false on error + */ + function deleteUsers($username='%') + { + if(!$this->enableCyrusAdmin || empty($username)) { return false; } - if($this->_connected === true) { - $this->disconnect(); - } - // we need a admin connection - if(!$this->openConnection(true)) { - return false; + if($this->_connected === true && !$this->isAdminConnection) { + $this->disconnect(); + if(!$this->openConnection(true)) { + return false; + } } - - $username = $_hookValues['account_lid']; - $mailboxName = $this->getUserMailboxString($username); - - // give the admin account the rights to delete this mailbox - if(PEAR::isError($this->setACL($mailboxName, $this->adminUsername, 'lrswipcda'))) { - $this->disconnect(); - return false; - } - - if(PEAR::isError($this->deleteMailbox($mailboxName))) { - $this->disconnect(); - return false; - } + list($reference,$restriction) = explode($username,$mailboxName,2); + $mboxes = $this->getMailboxes($reference,$username.$restriction); + //error_log(__METHOD__."('$username') getMailboxes('$reference','$username$restriction') = ".array2string($mboxes)); + foreach($mboxes as $mbox) { + // give the admin account the rights to delete this mailbox + if(PEAR::isError($this->setACL($mbox, $this->adminUsername, 'lrswipcda'))) { + $this->disconnect(); + return false; + } + + if(PEAR::isError($this->deleteMailbox($mbox))) { + $this->disconnect(); + return false; + } + } $this->disconnect(); - return true; + return count($mboxes); } /** From b2a0d2999db5da73149a5fc93197aac52585d4b9 Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Mon, 23 Aug 2010 11:46:33 +0000 Subject: [PATCH 259/496] show infolog id in linktitle too (,if show_id is switched on) --- infolog/inc/class.infolog_bo.inc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/infolog/inc/class.infolog_bo.inc.php b/infolog/inc/class.infolog_bo.inc.php index 09fb4cb195..fe40af292f 100644 --- a/infolog/inc/class.infolog_bo.inc.php +++ b/infolog/inc/class.infolog_bo.inc.php @@ -1094,8 +1094,8 @@ class infolog_bo { return $info; } - return !empty($info['info_subject']) ? $info['info_subject'] : - self::subject_from_des($info['info_descr']); + $title = !empty($info['info_subject']) ? $info['info_subject'] :self::subject_from_des($info['info_descr']); + return $title.($GLOBALS['egw_info']['user']['preferences']['infolog']['show_id']?' (#'.$info['info_id'].')':''); } /** From f37e74d560253c6b064895cec0e94c7a719c62b6 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Mon, 23 Aug 2010 12:04:03 +0000 Subject: [PATCH 260/496] using utf-8 encoding for html merge-print --- etemplate/inc/class.bo_merge.inc.php | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/etemplate/inc/class.bo_merge.inc.php b/etemplate/inc/class.bo_merge.inc.php index 5d712df993..b85961cd8b 100644 --- a/etemplate/inc/class.bo_merge.inc.php +++ b/etemplate/inc/class.bo_merge.inc.php @@ -472,22 +472,20 @@ abstract class bo_merge case 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': case 'application/xml': case 'text/xml': + case 'text/html': $is_xml = true; $charset = 'utf-8'; // xml files --> always use utf-8 break; - case 'text/html': - $is_xml = true; - // fall through default: // div. text files --> use our export-charset, defined in addressbook prefs $charset = $this->contacts->prefs['csv_charset']; break; } - //error_log(__METHOD__."('$document', ... ,$mimetype) --> $charset (egw=".$GLOBALS['egw']->translation->charset().', export='.$this->contacts->prefs['csv_charset'].')'); + //error_log(__METHOD__."('$document', ... ,$mimetype) --> $charset (egw=".translation::charset().', export='.$this->contacts->prefs['csv_charset'].')'); // do we need to convert charset - if ($charset && $charset != $GLOBALS['egw']->translation->charset()) + if ($charset && $charset != translation::charset()) { - $replacements = $GLOBALS['egw']->translation->convert($replacements,$GLOBALS['egw']->translation->charset(),$charset); + $replacements = translation::convert($replacements,translation::charset(),$charset); } if ($is_xml) // zip'ed xml document (eg. OO) { From cf760a790bb8d334fda1c8e344a26036d0c49d8e Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Mon, 23 Aug 2010 15:59:35 +0000 Subject: [PATCH 261/496] * fixed printing in calendar (only first page of list was printed and some UI not disabled) --> fix for egw.stylite.de bug #8142: calendar list view printed on three pages --- calendar/setup/etemplates.inc.php | 6 +++--- calendar/templates/default/list.xet | 28 +++++++++++++++++----------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/calendar/setup/etemplates.inc.php b/calendar/setup/etemplates.inc.php index b192dd8900..76d2a190ab 100644 --- a/calendar/setup/etemplates.inc.php +++ b/calendar/setup/etemplates.inc.php @@ -2,7 +2,7 @@ /** * eGroupWare - eTemplates for Application calendar * http://www.egroupware.org - * generated by soetemplate::dump4setup() 2010-08-16 09:15 + * generated by soetemplate::dump4setup() 2010-08-23 17:52 * * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License * @package calendar @@ -53,7 +53,7 @@ $templ_data[] = array('name' => 'calendar.freetimesearch.rows','template' => '', $templ_data[] = array('name' => 'calendar.import','template' => '','lang' => '','group' => '0','version' => '1.0.1.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:5:{i:0;a:0:{}i:1;a:2:{s:1:"A";a:5:{s:4:"type";s:5:"label";s:4:"span";s:13:"all,redItalic";s:4:"name";s:3:"msg";s:7:"no_lang";s:1:"1";s:5:"align";s:6:"center";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:2;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:9:"iCal file";}s:1:"B";a:3:{s:4:"type";s:4:"file";s:4:"name";s:9:"ical_file";s:6:"needed";s:1:"1";}}i:3;a:2:{s:1:"A";a:1:{s:4:"type";s:5:"label";}s:1:"B";a:3:{s:4:"type";s:6:"button";s:5:"label";s:6:"Import";s:4:"name";s:6:"import";}}i:4;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:4:"span";s:3:"all";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:4;s:4:"cols";i:2;s:5:"align";s:6:"center";s:7:"options";a:0:{}}}','size' => '','style' => '','modified' => '1131469789',); -$templ_data[] = array('name' => 'calendar.list','template' => '','lang' => '','group' => '0','version' => '1.7.003','data' => 'a:1:{i:0;a:5:{s:4:"type";s:4:"grid";s:4:"data";a:5:{i:0;a:2:{s:2:"h2";s:6:",!@msg";s:2:"h1";s:6:",!@css";}i:1;a:1:{s:1:"A";a:3:{s:4:"type";s:4:"html";s:4:"span";s:3:"all";s:4:"name";s:3:"css";}}i:2;a:1:{s:1:"A";a:5:{s:5:"align";s:6:"center";s:7:"no_lang";s:1:"1";s:4:"name";s:3:"msg";s:4:"type";s:5:"label";s:4:"span";s:10:",redItalic";}}i:3;a:1:{s:1:"A";a:3:{s:4:"name";s:2:"nm";s:4:"size";s:18:"calendar.list.rows";s:4:"type";s:9:"nextmatch";}}i:4;a:1:{s:1:"A";a:6:{s:5:"align";s:5:"right";s:4:"type";s:4:"hbox";s:4:"size";s:1:"3";i:1;a:5:{s:5:"label";s:11:"whole query";s:8:"onchange";s:121:"if (this.checked==true && !confirm(\'Apply the action on the whole query, NOT only the shown events\')) this.checked=false;";s:4:"name";s:7:"use_all";s:4:"type";s:8:"checkbox";s:4:"help";s:62:"Apply the action on the whole query, NOT only the shown events";}i:2;a:6:{s:8:"onchange";s:16:"do_action(this);";s:7:"no_lang";s:1:"1";s:4:"name";s:6:"action";s:4:"size";s:19:"Select an action...";s:4:"type";s:6:"select";s:4:"help";s:16:"Select an action";}i:3;a:8:{s:5:"label";s:9:"Check all";s:7:"onclick";s:70:"toggle_all(this.form,form::name(\'nm[rows][checked][]\')); return false;";s:6:"needed";s:1:"1";s:4:"name";s:9:"check_all";s:4:"type";s:6:"button";s:4:"size";s:9:"arrow_ltr";s:4:"help";s:9:"Check all";s:4:"span";s:14:",checkAllArrow";}}}}s:4:"cols";i:1;s:4:"rows";i:4;s:4:"size";s:4:"100%";}}','size' => '100%','style' => '.noWrap { white-space: nowrap; } +$templ_data[] = array('name' => 'calendar.list','template' => '','lang' => '','group' => '0','version' => '1.7.003','data' => 'a:1:{i:0;a:5:{s:4:"type";s:4:"grid";s:4:"data";a:5:{i:0;a:3:{s:2:"h2";s:6:",!@msg";s:2:"h1";s:6:",!@css";s:2:"c4";s:7:"noPrint";}i:1;a:1:{s:1:"A";a:3:{s:4:"type";s:4:"html";s:4:"span";s:3:"all";s:4:"name";s:3:"css";}}i:2;a:1:{s:1:"A";a:5:{s:5:"align";s:6:"center";s:7:"no_lang";s:1:"1";s:4:"name";s:3:"msg";s:4:"type";s:5:"label";s:4:"span";s:10:",redItalic";}}i:3;a:1:{s:1:"A";a:3:{s:4:"name";s:2:"nm";s:4:"size";s:18:"calendar.list.rows";s:4:"type";s:9:"nextmatch";}}i:4;a:1:{s:1:"A";a:6:{s:5:"align";s:5:"right";s:4:"type";s:4:"hbox";s:4:"size";s:1:"3";i:1;a:5:{s:5:"label";s:11:"whole query";s:8:"onchange";s:121:"if (this.checked==true && !confirm(\'Apply the action on the whole query, NOT only the shown events\')) this.checked=false;";s:4:"name";s:7:"use_all";s:4:"type";s:8:"checkbox";s:4:"help";s:62:"Apply the action on the whole query, NOT only the shown events";}i:2;a:6:{s:8:"onchange";s:16:"do_action(this);";s:7:"no_lang";s:1:"1";s:4:"name";s:6:"action";s:4:"size";s:19:"Select an action...";s:4:"type";s:6:"select";s:4:"help";s:16:"Select an action";}i:3;a:8:{s:5:"label";s:9:"Check all";s:7:"onclick";s:70:"toggle_all(this.form,form::name(\'nm[rows][checked][]\')); return false;";s:6:"needed";s:1:"1";s:4:"name";s:9:"check_all";s:4:"type";s:6:"button";s:4:"size";s:9:"arrow_ltr";s:4:"help";s:9:"Check all";s:4:"span";s:14:",checkAllArrow";}}}}s:4:"cols";i:1;s:4:"rows";i:4;s:4:"size";s:4:"100%";}}','size' => '100%','style' => '.noWrap { white-space: nowrap; } .image16 img { height: 16px; @@ -61,7 +61,7 @@ $templ_data[] = array('name' => 'calendar.list','template' => '','lang' => '','g $templ_data[] = array('name' => 'calendar.list.dates','template' => '','lang' => '','group' => '0','version' => '1.3.001','data' => 'a:1:{i:0;a:10:{s:4:"type";s:4:"hbox";s:4:"data";a:2:{i:0;a:0:{}i:1;a:1:{s:1:"A";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:1;s:4:"cols";i:1;s:4:"size";s:1:"4";i:1;a:2:{s:4:"type";s:5:"label";s:5:"label";s:5:"Start";}i:2;a:2:{s:4:"type";s:4:"date";s:4:"name";s:9:"startdate";}i:3;a:2:{s:4:"type";s:5:"label";s:5:"label";s:3:"End";}i:4;a:2:{s:4:"type";s:4:"date";s:4:"name";s:7:"enddate";}s:4:"span";s:12:",custom_hide";}}','size' => '','style' => '.custom_hide { visibility: hidden; }','modified' => '1173420675',); -$templ_data[] = array('name' => 'calendar.list.rows','template' => '','lang' => '','group' => '0','version' => '1.7.003','data' => 'a:1:{i:0;a:5:{s:4:"type";s:4:"grid";s:4:"data";a:3:{i:0;a:3:{s:1:"B";s:3:"40%";s:2:"c1";s:2:"th";s:2:"c2";s:7:"row,top";}i:1;a:13:{s:1:"A";a:4:{s:4:"type";s:4:"vbox";s:4:"size";s:1:"2";i:1;a:3:{s:5:"label";s:5:"Start";s:4:"name";s:9:"cal_start";s:4:"type";s:20:"nextmatch-sortheader";}i:2;a:3:{s:5:"label";s:3:"End";s:4:"name";s:7:"cal_end";s:4:"type";s:20:"nextmatch-sortheader";}}s:1:"B";a:4:{s:4:"type";s:4:"vbox";s:4:"size";s:1:"2";i:1;a:3:{s:5:"label";s:5:"Title";s:4:"name";s:9:"cal_title";s:4:"type";s:20:"nextmatch-sortheader";}i:2;a:3:{s:5:"label";s:11:"Description";s:4:"name";s:15:"cal_description";s:4:"type";s:20:"nextmatch-sortheader";}}s:1:"C";a:3:{s:5:"label";s:5:"Title";s:4:"name";s:9:"cal_title";s:4:"type";s:20:"nextmatch-sortheader";}s:1:"D";a:3:{s:5:"label";s:11:"Description";s:4:"name";s:15:"cal_description";s:4:"type";s:20:"nextmatch-sortheader";}s:1:"E";a:3:{s:5:"label";s:10:"Recurrence";s:4:"name";s:6:"recure";s:4:"type";s:20:"nextmatch-sortheader";}s:1:"F";a:3:{s:5:"label";s:7:"Project";s:4:"name";s:5:"pm_id";s:4:"type";s:16:"nextmatch-header";}s:1:"G";a:3:{s:5:"label";s:8:"Category";s:4:"name";s:6:"cat_id";s:4:"type";s:16:"nextmatch-header";}s:1:"H";a:4:{s:4:"type";s:4:"vbox";s:4:"size";s:1:"2";i:1;a:4:{s:5:"label";s:5:"Owner";s:8:"readonly";s:4:"true";s:4:"name";s:9:"cal_owner";s:4:"type";s:20:"nextmatch-sortheader";}i:2;a:3:{s:5:"label";s:8:"Location";s:4:"name";s:12:"cal_location";s:4:"type";s:20:"nextmatch-sortheader";}}s:1:"I";a:4:{s:5:"label";s:5:"Owner";s:8:"readonly";s:4:"true";s:4:"name";s:9:"cal_owner";s:4:"type";s:20:"nextmatch-sortheader";}s:1:"J";a:3:{s:5:"label";s:8:"Location";s:4:"name";s:12:"cal_location";s:4:"type";s:20:"nextmatch-sortheader";}s:1:"K";a:4:{s:5:"label";s:12:"Participants";s:4:"name";s:11:"participant";s:4:"size";s:3:"All";s:4:"type";s:23:"nextmatch-accountfilter";}s:1:"L";a:4:{s:5:"label";s:13:"Custom fields";s:8:"readonly";s:4:"true";s:4:"name";s:3:"cfs";s:4:"type";s:22:"nextmatch-customfields";}s:1:"M";a:6:{s:5:"label";s:7:"Actions";s:5:"class";s:7:"noPrint";s:4:"type";s:4:"hbox";s:4:"size";s:1:"2";i:1;a:4:{s:4:"type";s:5:"label";s:5:"label";s:7:"Actions";s:4:"help";s:9:"Check all";s:4:"span";s:8:",noPrint";}i:2;a:8:{s:5:"label";s:9:"Check all";s:7:"onclick";s:60:"toggle_all(this.form,form::name(\'checked[]\')); return false;";s:6:"needed";s:1:"1";s:5:"align";s:5:"right";s:4:"name";s:9:"check_all";s:4:"type";s:6:"button";s:4:"size";s:5:"check";s:4:"help";s:9:"Check all";}}}i:2;a:13:{s:1:"A";a:5:{s:4:"name";s:5:"start";s:4:"type";s:4:"vbox";s:4:"size";s:1:"2";i:1;a:5:{s:8:"readonly";s:4:"true";s:4:"name";s:13:"${row}[start]";s:4:"size";s:14:",$cont[format]";s:4:"type";s:9:"date-time";s:4:"span";s:7:",noWrap";}i:2;a:5:{s:8:"readonly";s:4:"true";s:4:"name";s:11:"${row}[end]";s:4:"size";s:14:",$cont[format]";s:4:"type";s:9:"date-time";s:4:"span";s:7:",noWrap";}}s:1:"B";a:5:{s:4:"type";s:4:"vbox";s:4:"size";s:1:"3";i:1;a:5:{s:8:"readonly";s:4:"true";s:7:"no_lang";s:1:"1";s:4:"name";s:13:"${row}[title]";s:4:"size";s:1:"b";s:4:"type";s:5:"label";}i:2;a:5:{s:7:"no_lang";s:1:"1";s:4:"type";s:3:"box";s:4:"size";s:1:"1";i:1;a:3:{s:7:"no_lang";s:1:"1";s:4:"name";s:19:"${row}[description]";s:4:"type";s:5:"label";}s:4:"span";s:16:",listDescription";}i:3;a:3:{s:7:"no_lang";s:1:"1";s:4:"name";s:14:"${row}[recure]";s:4:"type";s:5:"label";}}s:1:"C";a:2:{s:4:"name";s:13:"${row}[title]";s:4:"type";s:5:"label";}s:1:"D";a:3:{s:7:"no_lang";s:1:"1";s:4:"name";s:19:"${row}[description]";s:4:"type";s:5:"label";}s:1:"E";a:2:{s:4:"name";s:14:"${row}[recure]";s:4:"type";s:5:"label";}s:1:"F";a:3:{s:4:"name";s:10:"${row}[id]";s:4:"size";s:23:"calendar,projectmanager";s:4:"type";s:11:"link-string";}s:1:"G";a:3:{s:4:"type";s:10:"select-cat";s:8:"readonly";s:4:"true";s:4:"name";s:16:"${row}[category]";}s:1:"H";a:4:{s:4:"type";s:4:"vbox";s:4:"size";s:1:"2";i:1;a:4:{s:4:"type";s:14:"select-account";s:5:"class";s:6:"noWrap";s:8:"readonly";s:4:"true";s:4:"name";s:13:"${row}[owner]";}i:2;a:3:{s:7:"no_lang";s:1:"1";s:4:"name";s:16:"${row}[location]";s:4:"type";s:5:"label";}}s:1:"I";a:4:{s:4:"type";s:14:"select-account";s:5:"class";s:6:"noWrap";s:8:"readonly";s:4:"true";s:4:"name";s:13:"${row}[owner]";}s:1:"J";a:3:{s:7:"no_lang";s:1:"1";s:4:"name";s:16:"${row}[location]";s:4:"type";s:5:"label";}s:1:"K";a:4:{s:8:"readonly";s:4:"true";s:7:"no_lang";s:1:"1";s:4:"name";s:13:"${row}[parts]";s:4:"type";s:4:"html";}s:1:"L";a:2:{s:4:"name";s:4:"$row";s:4:"type";s:17:"customfields-list";}s:1:"M";a:4:{s:4:"size";s:6:"2,,0,0";s:4:"type";s:4:"vbox";i:1;a:8:{s:5:"class";s:7:"noPrint";s:4:"type";s:4:"hbox";s:4:"size";s:1:"5";i:1;a:6:{s:5:"label";s:4:"View";s:7:"onclick";s:206:"window.open(egw::link(\'/index.php\',\'menuaction=calendar.calendar_uiforms.edit&cal_id=$row_cont[id]&date=$row_cont[date]\'),\'425\',\'dependent=yes,width=750,height=450,scrollbars=yes,status=yes\'); return false;";s:4:"name";s:19:"view[$row_cont[id]]";s:4:"type";s:6:"button";s:4:"size";s:4:"view";s:4:"help";s:15:"View this event";}i:2;a:6:{s:4:"type";s:6:"button";s:4:"size";s:9:"timesheet";s:5:"label";s:19:"Add timesheet entry";s:4:"name";s:29:"timesheet[$row_cont[info_id]]";s:7:"onclick";s:267:"window.open(egw::link(\'/index.php\',\'menuaction=timesheet.timesheet_ui.edit&link_app[]=$row_cont[app]&cat_id=$row_cont[category]&link_id[]=$row_cont[app_id]$row_cont[extra_links]\'),\'_blank\',\'dependent=yes,width=600,height=400,scrollbars=yes,status=yes\'); return false;";s:5:"align";s:6:"center";}i:3;a:6:{s:5:"label";s:4:"Edit";s:7:"onclick";s:20:"$row_cont[edit_link]";s:4:"name";s:19:"edit[$row_cont[id]]";s:4:"type";s:6:"button";s:4:"size";s:4:"edit";s:4:"help";s:15:"Edit this event";}i:4;a:6:{s:5:"label";s:6:"Delete";s:7:"onclick";s:36:"return confirm(\'Delete this event\');";s:4:"name";s:21:"delete[$row_cont[id]]";s:4:"type";s:6:"button";s:4:"size";s:6:"delete";s:4:"help";s:17:"Delete this event";}i:5;a:5:{s:5:"align";s:5:"right";s:4:"name";s:9:"checked[]";s:4:"size";s:35:"$row_cont[id]:$row_cont[recur_date]";s:4:"type";s:8:"checkbox";s:4:"help";s:45:"Select multiple contacts for a further action";}}i:2;a:3:{s:4:"size";s:6:"1,,0,0";s:4:"type";s:4:"hbox";i:1;a:6:{s:5:"label";s:11:"Filemanager";s:4:"size";s:18:"filemanager/navbar";s:4:"type";s:6:"button";s:4:"name";s:26:"filemanager[$row_cont[id]]";s:4:"span";s:8:",image16";s:7:"onclick";s:139:"window.location.href=egw::link(\'/index.php\',\'menuaction=filemanager.filemanager_ui.index&path=/apps/calendar/$row_cont[id]\'); return false;";}}}}}s:4:"cols";i:13;s:4:"rows";i:2;s:4:"size";s:14:"100%,,,,,,auto";}}','size' => '100%,,,,,,auto','style' => '','modified' => '1272389089',); +$templ_data[] = array('name' => 'calendar.list.rows','template' => '','lang' => '','group' => '0','version' => '1.7.003','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:3:{i:0;a:3:{s:1:"B";s:3:"40%";s:2:"c1";s:2:"th";s:2:"c2";s:7:"row,top";}i:1;a:13:{s:1:"A";a:4:{s:4:"type";s:4:"vbox";s:4:"size";s:1:"2";i:1;a:3:{s:5:"label";s:5:"Start";s:4:"name";s:9:"cal_start";s:4:"type";s:20:"nextmatch-sortheader";}i:2;a:3:{s:5:"label";s:3:"End";s:4:"name";s:7:"cal_end";s:4:"type";s:20:"nextmatch-sortheader";}}s:1:"B";a:4:{s:4:"type";s:4:"vbox";s:4:"size";s:1:"2";i:1;a:3:{s:5:"label";s:5:"Title";s:4:"name";s:9:"cal_title";s:4:"type";s:20:"nextmatch-sortheader";}i:2;a:3:{s:5:"label";s:11:"Description";s:4:"name";s:15:"cal_description";s:4:"type";s:20:"nextmatch-sortheader";}}s:1:"C";a:3:{s:5:"label";s:5:"Title";s:4:"name";s:9:"cal_title";s:4:"type";s:20:"nextmatch-sortheader";}s:1:"D";a:3:{s:5:"label";s:11:"Description";s:4:"name";s:15:"cal_description";s:4:"type";s:20:"nextmatch-sortheader";}s:1:"E";a:3:{s:5:"label";s:10:"Recurrence";s:4:"name";s:6:"recure";s:4:"type";s:20:"nextmatch-sortheader";}s:1:"F";a:3:{s:5:"label";s:7:"Project";s:4:"name";s:5:"pm_id";s:4:"type";s:16:"nextmatch-header";}s:1:"G";a:3:{s:5:"label";s:8:"Category";s:4:"name";s:6:"cat_id";s:4:"type";s:16:"nextmatch-header";}s:1:"H";a:4:{s:4:"type";s:4:"vbox";s:4:"size";s:1:"2";i:1;a:4:{s:5:"label";s:5:"Owner";s:8:"readonly";s:4:"true";s:4:"name";s:9:"cal_owner";s:4:"type";s:20:"nextmatch-sortheader";}i:2;a:3:{s:5:"label";s:8:"Location";s:4:"name";s:12:"cal_location";s:4:"type";s:20:"nextmatch-sortheader";}}s:1:"I";a:4:{s:5:"label";s:5:"Owner";s:8:"readonly";s:4:"true";s:4:"name";s:9:"cal_owner";s:4:"type";s:20:"nextmatch-sortheader";}s:1:"J";a:3:{s:5:"label";s:8:"Location";s:4:"name";s:12:"cal_location";s:4:"type";s:20:"nextmatch-sortheader";}s:1:"K";a:4:{s:5:"label";s:12:"Participants";s:4:"name";s:11:"participant";s:4:"size";s:3:"All";s:4:"type";s:23:"nextmatch-accountfilter";}s:1:"L";a:4:{s:5:"label";s:13:"Custom fields";s:8:"readonly";s:4:"true";s:4:"name";s:3:"cfs";s:4:"type";s:22:"nextmatch-customfields";}s:1:"M";a:7:{s:5:"label";s:7:"Actions";s:5:"class";s:7:"noPrint";s:4:"type";s:4:"hbox";s:4:"size";s:1:"2";i:1;a:4:{s:4:"type";s:5:"label";s:5:"label";s:7:"Actions";s:4:"help";s:9:"Check all";s:4:"span";s:8:",noPrint";}i:2;a:8:{s:5:"label";s:9:"Check all";s:7:"onclick";s:60:"toggle_all(this.form,form::name(\'checked[]\')); return false;";s:6:"needed";s:1:"1";s:5:"align";s:5:"right";s:4:"name";s:9:"check_all";s:4:"type";s:6:"button";s:4:"size";s:5:"check";s:4:"help";s:9:"Check all";}s:4:"span";s:8:",noPrint";}}i:2;a:13:{s:1:"A";a:5:{s:4:"name";s:5:"start";s:4:"type";s:4:"vbox";s:4:"size";s:1:"2";i:1;a:5:{s:8:"readonly";s:4:"true";s:4:"name";s:13:"${row}[start]";s:4:"size";s:14:",$cont[format]";s:4:"type";s:9:"date-time";s:4:"span";s:7:",noWrap";}i:2;a:5:{s:8:"readonly";s:4:"true";s:4:"name";s:11:"${row}[end]";s:4:"size";s:14:",$cont[format]";s:4:"type";s:9:"date-time";s:4:"span";s:7:",noWrap";}}s:1:"B";a:5:{s:4:"type";s:4:"vbox";s:4:"size";s:1:"3";i:1;a:5:{s:8:"readonly";s:4:"true";s:7:"no_lang";s:1:"1";s:4:"name";s:13:"${row}[title]";s:4:"size";s:1:"b";s:4:"type";s:5:"label";}i:2;a:5:{s:7:"no_lang";s:1:"1";s:4:"type";s:3:"box";s:4:"size";s:1:"1";i:1;a:3:{s:7:"no_lang";s:1:"1";s:4:"name";s:19:"${row}[description]";s:4:"type";s:5:"label";}s:4:"span";s:16:",listDescription";}i:3;a:3:{s:7:"no_lang";s:1:"1";s:4:"name";s:14:"${row}[recure]";s:4:"type";s:5:"label";}}s:1:"C";a:2:{s:4:"name";s:13:"${row}[title]";s:4:"type";s:5:"label";}s:1:"D";a:3:{s:7:"no_lang";s:1:"1";s:4:"name";s:19:"${row}[description]";s:4:"type";s:5:"label";}s:1:"E";a:2:{s:4:"name";s:14:"${row}[recure]";s:4:"type";s:5:"label";}s:1:"F";a:3:{s:4:"name";s:10:"${row}[id]";s:4:"size";s:23:"calendar,projectmanager";s:4:"type";s:11:"link-string";}s:1:"G";a:3:{s:4:"type";s:10:"select-cat";s:8:"readonly";s:4:"true";s:4:"name";s:16:"${row}[category]";}s:1:"H";a:4:{s:4:"type";s:4:"vbox";s:4:"size";s:1:"2";i:1;a:4:{s:4:"type";s:14:"select-account";s:5:"class";s:6:"noWrap";s:8:"readonly";s:4:"true";s:4:"name";s:13:"${row}[owner]";}i:2;a:3:{s:7:"no_lang";s:1:"1";s:4:"name";s:16:"${row}[location]";s:4:"type";s:5:"label";}}s:1:"I";a:4:{s:4:"type";s:14:"select-account";s:5:"class";s:6:"noWrap";s:8:"readonly";s:4:"true";s:4:"name";s:13:"${row}[owner]";}s:1:"J";a:3:{s:7:"no_lang";s:1:"1";s:4:"name";s:16:"${row}[location]";s:4:"type";s:5:"label";}s:1:"K";a:4:{s:8:"readonly";s:4:"true";s:7:"no_lang";s:1:"1";s:4:"name";s:13:"${row}[parts]";s:4:"type";s:4:"html";}s:1:"L";a:2:{s:4:"name";s:4:"$row";s:4:"type";s:17:"customfields-list";}s:1:"M";a:5:{s:4:"size";s:6:"2,,0,0";s:4:"type";s:4:"vbox";i:1;a:8:{s:5:"class";s:7:"noPrint";s:4:"type";s:4:"hbox";s:4:"size";s:1:"5";i:1;a:6:{s:5:"label";s:4:"View";s:7:"onclick";s:206:"window.open(egw::link(\'/index.php\',\'menuaction=calendar.calendar_uiforms.edit&cal_id=$row_cont[id]&date=$row_cont[date]\'),\'425\',\'dependent=yes,width=750,height=450,scrollbars=yes,status=yes\'); return false;";s:4:"name";s:19:"view[$row_cont[id]]";s:4:"type";s:6:"button";s:4:"size";s:4:"view";s:4:"help";s:15:"View this event";}i:2;a:6:{s:4:"type";s:6:"button";s:4:"size";s:9:"timesheet";s:5:"label";s:19:"Add timesheet entry";s:4:"name";s:29:"timesheet[$row_cont[info_id]]";s:7:"onclick";s:267:"window.open(egw::link(\'/index.php\',\'menuaction=timesheet.timesheet_ui.edit&link_app[]=$row_cont[app]&cat_id=$row_cont[category]&link_id[]=$row_cont[app_id]$row_cont[extra_links]\'),\'_blank\',\'dependent=yes,width=600,height=400,scrollbars=yes,status=yes\'); return false;";s:5:"align";s:6:"center";}i:3;a:6:{s:5:"label";s:4:"Edit";s:7:"onclick";s:20:"$row_cont[edit_link]";s:4:"name";s:19:"edit[$row_cont[id]]";s:4:"type";s:6:"button";s:4:"size";s:4:"edit";s:4:"help";s:15:"Edit this event";}i:4;a:6:{s:5:"label";s:6:"Delete";s:7:"onclick";s:36:"return confirm(\'Delete this event\');";s:4:"name";s:21:"delete[$row_cont[id]]";s:4:"type";s:6:"button";s:4:"size";s:6:"delete";s:4:"help";s:17:"Delete this event";}i:5;a:5:{s:5:"align";s:5:"right";s:4:"name";s:9:"checked[]";s:4:"size";s:35:"$row_cont[id]:$row_cont[recur_date]";s:4:"type";s:8:"checkbox";s:4:"help";s:45:"Select multiple contacts for a further action";}}i:2;a:3:{s:4:"size";s:6:"1,,0,0";s:4:"type";s:4:"hbox";i:1;a:6:{s:5:"label";s:11:"Filemanager";s:4:"size";s:18:"filemanager/navbar";s:4:"type";s:6:"button";s:4:"name";s:26:"filemanager[$row_cont[id]]";s:4:"span";s:8:",image16";s:7:"onclick";s:139:"window.location.href=egw::link(\'/index.php\',\'menuaction=filemanager.filemanager_ui.index&path=/apps/calendar/$row_cont[id]\'); return false;";}}s:4:"span";s:8:",noPrint";}}}s:4:"cols";i:13;s:4:"rows";i:2;s:4:"size";s:4:"100%";s:7:"options";a:1:{i:0;s:4:"100%";}}}','size' => '100%','style' => '','modified' => '1272389089',); $templ_data[] = array('name' => 'calendar.print','template' => '','lang' => '','group' => '0','version' => '1.6.001','data' => 'a:1:{i:0;a:3:{s:4:"size";s:6:"1,,0,0";s:4:"type";s:4:"hbox";i:1;a:5:{s:4:"type";s:4:"grid";s:4:"data";a:15:{i:0;a:13:{s:1:"A";s:2:"95";s:2:"c2";s:2:"th";s:2:"c5";s:3:"row";s:2:"c6";s:7:"row_off";s:2:"c7";s:3:"row";s:2:"c3";s:3:"row";s:2:"c4";s:3:"row";s:2:"c8";s:3:"row";s:2:"c9";s:3:"row";s:2:"h2";s:2:"28";s:2:"c1";s:2:"th";s:3:"c10";s:4:",top";s:3:"c11";s:2:"th";}i:1;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"image";s:4:"name";s:5:"print";s:7:"onclick";s:15:"window.print();";}s:1:"B";a:4:{s:4:"type";s:5:"label";s:4:"span";s:5:",bold";s:5:"label";s:8:"Calendar";s:4:"size";s:4:"bold";}}i:2;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:5:"Title";}s:1:"B";a:5:{s:4:"type";s:4:"text";s:4:"name";s:5:"title";s:4:"size";s:6:"80,255";s:8:"readonly";s:1:"1";s:4:"span";s:3:"all";}}i:3;a:2:{s:1:"A";a:4:{s:5:"width";s:2:"95";s:4:"size";s:8:",,,start";s:4:"type";s:5:"label";s:5:"label";s:5:"Start";}s:1:"B";a:4:{s:4:"type";s:4:"hbox";s:4:"size";s:6:"2,,0,0";i:1;a:3:{s:4:"name";s:5:"start";s:4:"type";s:9:"date-time";s:8:"readonly";s:1:"1";}i:2;a:7:{s:5:"label";s:9:"whole day";s:4:"name";s:9:"whole_day";s:4:"size";s:11:",, ,disable";s:4:"type";s:8:"checkbox";s:4:"help";s:31:"Event will occupy the whole day";s:5:"align";s:6:"center";s:8:"readonly";s:1:"1";}}}i:4;a:2:{s:1:"A";a:4:{s:5:"width";s:1:"0";s:4:"size";s:11:",,,duration";s:4:"type";s:5:"label";s:5:"label";s:8:"Duration";}s:1:"B";a:4:{s:4:"size";s:6:"2,,0,0";s:4:"type";s:4:"hbox";i:1;a:7:{s:7:"no_lang";s:1:"1";s:8:"onchange";s:227:"set_style_by_class(\'table\',\'end_hide\',\'visibility\',this.value == \'\' ? \'visible\' : \'hidden\'); if (this.value == \'\') document.getElementById(form::name(\'end[str]\')).value = document.getElementById(form::name(\'start[str]\')).value;";s:4:"name";s:8:"duration";s:4:"size";s:12:"Use end date";s:4:"type";s:6:"select";s:4:"help";s:23:"Duration of the meeting";s:8:"readonly";s:1:"1";}i:2;a:4:{s:4:"name";s:3:"end";s:4:"type";s:9:"date-time";s:4:"span";s:9:",end_hide";s:8:"readonly";s:1:"1";}}}i:5;a:2:{s:1:"A";a:4:{s:4:"size";s:11:",,,location";s:4:"type";s:5:"label";s:5:"label";s:8:"Location";s:5:"width";s:1:"0";}s:1:"B";a:5:{s:4:"size";s:4:",255";s:4:"name";s:8:"location";s:4:"type";s:4:"text";s:4:"span";s:15:",inputFullWidth";s:8:"readonly";s:1:"1";}}i:6;a:2:{s:1:"A";a:4:{s:4:"size";s:11:",,,priority";s:4:"type";s:5:"label";s:5:"label";s:8:"Priority";s:5:"width";s:1:"0";}s:1:"B";a:3:{s:4:"type";s:15:"select-priority";s:4:"name";s:8:"priority";s:8:"readonly";s:1:"1";}}i:7;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:5:"label";s:7:"Options";s:5:"width";s:1:"0";}s:1:"B";a:6:{s:4:"name";s:12:"non_blocking";s:4:"size";s:11:",, ,disable";s:4:"type";s:8:"checkbox";s:4:"help";s:56:"A non blocking event will not conflict with other events";s:5:"label";s:12:"non blocking";s:8:"readonly";s:1:"1";}}i:8;a:2:{s:1:"A";a:1:{s:4:"type";s:5:"label";}s:1:"B";a:5:{s:4:"name";s:6:"public";s:4:"size";s:3:"0,1";s:4:"type";s:8:"checkbox";s:5:"label";s:7:"Private";s:8:"readonly";s:1:"1";}}i:9;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:10:"Categories";}s:1:"B";a:3:{s:4:"type";s:10:"select-cat";s:4:"name";s:8:"category";s:8:"readonly";s:1:"1";}}i:10;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:11:"Description";}s:1:"B";a:3:{s:4:"type";s:8:"textarea";s:4:"name";s:11:"description";s:8:"readonly";s:1:"1";}}i:11;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:5:"label";s:13:"custom fields";s:4:"span";s:3:"all";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:12;a:2:{s:1:"A";a:3:{s:4:"type";s:12:"customfields";s:4:"span";s:3:"all";s:8:"readonly";s:1:"1";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:13;a:2:{s:1:"A";a:3:{s:4:"type";s:8:"template";s:4:"name";s:27:"calendar.print.participants";s:4:"span";s:3:"all";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:14;a:2:{s:1:"A";a:3:{s:4:"type";s:8:"template";s:4:"span";s:3:"all";s:4:"name";s:20:"calendar.print.links";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}}s:4:"cols";i:2;s:4:"rows";i:14;s:4:"size";s:8:"100%,200";}}}','size' => '','style' => '','modified' => '1229596125',); diff --git a/calendar/templates/default/list.xet b/calendar/templates/default/list.xet index 3c7a7dddc3..64c95ad2cf 100644 --- a/calendar/templates/default/list.xet +++ b/calendar/templates/default/list.xet @@ -1,8 +1,8 @@ -
    $value$rowData