From a63a33f8b83fc84e1e820fe2031d4bf784447a92 Mon Sep 17 00:00:00 2001 From: wunschtacho Date: Sun, 8 Apr 2012 19:27:36 +0000 Subject: [PATCH] Cleaning Update git-svn-id: https://svn.typo3.org/TYPO3v4/Extensions/powermail/trunk@60503 735d13b6-9817-0410-8766-e36946ffe9aa --- .idea/.name | 1 + .idea/codeStyleSettings.xml | 13 + .idea/dictionaries/einpraegsam.xml | 3 + .idea/encodings.xml | 5 + .idea/misc.xml | 44 + .idea/modules.xml | 9 + .idea/powermail@powermail.in2code.de.iml | 9 + .idea/scopes/scope_settings.xml | 5 + .idea/vcs.xml | 7 + Classes/Controller/FormsController.php | 461 +++++ Classes/Controller/ModuleController.php | 220 +++ Classes/Controller/OutputController.php | 324 ++++ Classes/Domain/Model/Answers.php | 134 ++ Classes/Domain/Model/Fields.php | 444 +++++ Classes/Domain/Model/Forms.php | 134 ++ Classes/Domain/Model/Mails.php | 570 ++++++ Classes/Domain/Model/Pages.php | 195 ++ Classes/Domain/Model/User.php | 45 + Classes/Domain/Model/UserGroup.php | 36 + .../Domain/Repository/AnswersRepository.php | 60 + .../Domain/Repository/FieldsRepository.php | 37 + Classes/Domain/Repository/FormsRepository.php | 89 + Classes/Domain/Repository/MailsRepository.php | 325 ++++ Classes/Domain/Repository/PagesRepository.php | 57 + Classes/Domain/Repository/UserRepository.php | 58 + Classes/Domain/Validator/CaptchaValidator.php | 119 ++ .../Domain/Validator/MandatoryValidator.php | 75 + Classes/Domain/Validator/StringValidator.php | 84 + Classes/Domain/Validator/UploadValidator.php | 151 ++ Classes/Utility/CalculatingCaptcha.php | 164 ++ Classes/Utility/Div.php | 961 +++++++++ Classes/Utility/EvaluateEmail.php | 93 + Classes/Utility/FieldSelectorUserFunc.php | 121 ++ Classes/Utility/InitialMarker.php | 70 + Classes/Utility/Marker.php | 80 + Classes/Utility/Marketing.php | 162 ++ Classes/Utility/PluginInfo.php | 143 ++ Classes/Utility/SaveToTable.php | 262 +++ Classes/Utility/WizIcon.php | 84 + .../BeCheck/ExtMngConfigViewHelper.php | 27 + .../ViewHelpers/BeCheck/SessionViewHelper.php | 44 + .../BeCheck/T3VersionViewHelper.php | 32 + .../BeCheck/UploadsFolderViewHelper.php | 28 + .../Condition/IsAllowedToEditViewHelper.php | 42 + .../Condition/IsArrayViewHelper.php | 22 + ...IsDateTimeVariableInVariableViewHelper.php | 26 + .../Condition/IsNumberViewHelper.php | 22 + .../Condition/IsStringInStringViewHelper.php | 23 + ...ThereAMailWithStartingLetterViewHelper.php | 34 + .../ViewHelpers/Condition/OrViewHelper.php | 25 + .../Form/AdvancedSelectViewHelper.php | 44 + .../Form/SelectFieldViewHelper.php | 62 + .../Getter/GetFieldLabelFromUidViewHelper.php | 43 + .../GetFieldMarkerFromUidViewHelper.php | 43 + .../Getter/GetPageNameFromUidViewHelper.php | 39 + .../Getter/GetPiVarAnswerFieldViewHelper.php | 25 + .../ViewHelpers/Misc/CaptchaViewHelper.php | 37 + .../Misc/ContentElementViewHelper.php | 49 + .../ViewHelpers/Misc/ErrorClassViewHelper.php | 40 + .../Misc/MorestepClassViewHelper.php | 27 + .../Misc/PrefillFieldViewHelper.php | 176 ++ .../Misc/ValidationClassViewHelper.php | 65 + .../Misc/VariableInVariableViewHelper.php | 29 + .../ViewHelpers/Misc/VariablesViewHelper.php | 78 + .../GetLabelsGoogleChartsViewHelper.php | 38 + .../GetValuesGoogleChartsViewHelper.php | 35 + .../ViewHelpers/String/EncodeViewHelper.php | 23 + .../ViewHelpers/String/ExplodeViewHelper.php | 24 + .../String/ImplodeFieldViewHelper.php | 31 + .../String/RemoveQuoteViewHelper.php | 23 + Classes/ViewHelpers/String/TrimViewHelper.php | 27 + .../UnderscoredToLowerCamelCaseViewHelper.php | 22 + .../ViewHelpers/String/UpperViewHelper.php | 25 + .../String/Utf8DecodeViewHelper.php | 21 + Configuration/ExtensionBuilder/settings.yaml | 95 + Configuration/FlexForms/flexform_pi1.xml | 258 +++ Configuration/FlexForms/flexform_pi2.xml | 391 ++++ Configuration/TCA/Answers.php | 131 ++ Configuration/TCA/Fields.php | 459 +++++ Configuration/TCA/Forms.php | 137 ++ Configuration/TCA/Mails.php | 290 +++ Configuration/TCA/Pages.php | 148 ++ .../TypoScript/CssFancy/constants.txt | 5 + Configuration/TypoScript/CssFancy/setup.txt | 1 + Configuration/TypoScript/Main/constants.txt | 16 + Configuration/TypoScript/Main/setup.txt | 485 +++++ Configuration/TypoScript/Marketing/setup.txt | 8 + .../Powermail_Frontend/constants.txt | 0 .../TypoScript/Powermail_Frontend/setup.txt | 110 ++ ExtensionBuilder.json | 1 + Resources/Private/.htaccess | 1 + Resources/Private/Fonts/ARCADE.TTF | Bin 0 -> 27700 bytes Resources/Private/Image/captcha_bg.png | Bin 0 -> 6990 bytes Resources/Private/Language/locallang.xml | 325 ++++ ..._csh_tx_powermail_domain_model_answers.xml | 20 + ...g_csh_tx_powermail_domain_model_fields.xml | 46 + ...ng_csh_tx_powermail_domain_model_forms.xml | 20 + ...ng_csh_tx_powermail_domain_model_mails.xml | 13 + ...ng_csh_tx_powermail_domain_model_pages.xml | 20 + Resources/Private/Language/locallang_db.xml | 319 +++ Resources/Private/Language/locallang_mod.xml | 39 + Resources/Private/Layouts/Backend.html | 41 + Resources/Private/Layouts/Default.html | 3 + Resources/Private/Layouts/Export.html | 1 + Resources/Private/Layouts/Mail.html | 1 + Resources/Private/Layouts/PowermailAll.html | 1 + Resources/Private/Partials/FormError.html | 14 + Resources/Private/Partials/Forms/Captcha.html | 12 + Resources/Private/Partials/Forms/Check.html | 18 + Resources/Private/Partials/Forms/Content.html | 5 + Resources/Private/Partials/Forms/Date.html | 31 + Resources/Private/Partials/Forms/File.html | 11 + Resources/Private/Partials/Forms/Hidden.html | 2 + Resources/Private/Partials/Forms/Html.html | 13 + Resources/Private/Partials/Forms/Input.html | 16 + .../Private/Partials/Forms/Password.html | 17 + Resources/Private/Partials/Forms/Radio.html | 18 + Resources/Private/Partials/Forms/Reset.html | 4 + Resources/Private/Partials/Forms/Select.html | 8 + Resources/Private/Partials/Forms/Submit.html | 4 + Resources/Private/Partials/Forms/Text.html | 4 + .../Private/Partials/Forms/Textarea.html | 8 + .../Private/Partials/Forms/Typoscript.html | 4 + .../Partials/GoogleAdwordsConversion.html | 19 + .../Partials/MarketingInformation.html | 33 + .../Private/Partials/Module/ExportBe.html | 105 + .../Private/Partials/Module/FilterBe.html | 18 + .../Private/Partials/Module/SearchBe.html | 143 ++ Resources/Private/Partials/Output/Abc.html | 21 + Resources/Private/Partials/Output/Export.html | 43 + .../Private/Partials/Output/Field/Check.html | 18 + .../Private/Partials/Output/Field/Input.html | 16 + .../Private/Partials/Output/Field/Radio.html | 18 + .../Private/Partials/Output/Field/Select.html | 8 + .../Partials/Output/Field/Textarea.html | 8 + Resources/Private/Partials/Output/Search.html | 36 + .../Private/Templates/Forms/Confirmation.html | 57 + Resources/Private/Templates/Forms/Create.html | 58 + Resources/Private/Templates/Forms/Form.html | 34 + .../Private/Templates/Forms/OptinConfirm.html | 10 + .../Private/Templates/Forms/PowermailAll.html | 60 + .../Private/Templates/Mails/OptinMail.html | 16 + .../Private/Templates/Mails/ReceiverMail.html | 45 + .../Private/Templates/Mails/SenderMail.html | 43 + .../Private/Templates/Module/CheckBe.html | 208 ++ .../Private/Templates/Module/ExportCsvBe.html | 80 + .../Private/Templates/Module/ExportXlsBe.html | 90 + .../Private/Templates/Module/ListBe.html | 338 ++++ .../Private/Templates/Module/ReportingBe.html | 29 + .../Templates/Module/ReportingFormBe.html | 70 + .../Module/ReportingMarketingBe.html | 228 +++ Resources/Private/Templates/Output/Edit.html | 40 + .../Private/Templates/Output/ExportCsv.html | 51 + .../Private/Templates/Output/ExportXls.html | 61 + Resources/Private/Templates/Output/List.html | 84 + Resources/Private/Templates/Output/Rss.html | 37 + Resources/Private/Templates/Output/Show.html | 40 + .../ViewHelpers/Widget/Paginate/Index.html | 55 + Resources/Public/Css/Backend.css | 376 ++++ Resources/Public/Css/CssFancy.css | 680 +++++++ Resources/Public/Css/jquery.ui.datepicker.css | 68 + Resources/Public/Css/jquery.ui.theme.css | 247 +++ Resources/Public/Icons/ce_wiz.gif | Bin 0 -> 529 bytes Resources/Public/Icons/relation.gif | Bin 0 -> 233 bytes .../tx_powermail_domain_model_answers.gif | Bin 0 -> 131 bytes .../tx_powermail_domain_model_fields.gif | Bin 0 -> 127 bytes .../tx_powermail_domain_model_fields__h.gif | Bin 0 -> 353 bytes .../tx_powermail_domain_model_fields__ht.gif | Bin 0 -> 360 bytes .../tx_powermail_domain_model_fields__t.gif | Bin 0 -> 360 bytes .../Icons/tx_powermail_domain_model_forms.gif | Bin 0 -> 131 bytes .../tx_powermail_domain_model_forms__h.gif | Bin 0 -> 357 bytes .../tx_powermail_domain_model_forms__ht.gif | Bin 0 -> 364 bytes .../tx_powermail_domain_model_forms__t.gif | Bin 0 -> 364 bytes .../Icons/tx_powermail_domain_model_mails.gif | Bin 0 -> 138 bytes ...tx_powermail_domain_model_mails.gif__h.gif | Bin 0 -> 360 bytes ...tx_powermail_domain_model_mails.gif__t.gif | Bin 0 -> 360 bytes .../Icons/tx_powermail_domain_model_pages.gif | Bin 0 -> 130 bytes .../tx_powermail_domain_model_pages__h.gif | Bin 0 -> 355 bytes .../tx_powermail_domain_model_pages__ht.gif | Bin 0 -> 362 bytes .../tx_powermail_domain_model_pages__t.gif | Bin 0 -> 362 bytes Resources/Public/Image/captcha.png | Bin 0 -> 10273 bytes Resources/Public/Image/chart_form.png | Bin 0 -> 16118 bytes Resources/Public/Image/chart_marketing.png | Bin 0 -> 13122 bytes Resources/Public/Image/icon-check.png | Bin 0 -> 722 bytes Resources/Public/Image/icon-notchecked.png | Bin 0 -> 320 bytes Resources/Public/Image/icon_calendar.png | Bin 0 -> 608 bytes Resources/Public/Image/icon_csv.gif | Bin 0 -> 228 bytes Resources/Public/Image/icon_error.png | Bin 0 -> 3090 bytes Resources/Public/Image/icon_ok.png | Bin 0 -> 3146 bytes Resources/Public/Image/icon_rss.gif | Bin 0 -> 652 bytes Resources/Public/Image/icon_sorting_asc.png | Bin 0 -> 164 bytes Resources/Public/Image/icon_sorting_desc.png | Bin 0 -> 166 bytes Resources/Public/Image/icon_xls.gif | Bin 0 -> 1021 bytes Resources/Public/Image/reportingGraphics.bmml | 52 + Resources/Public/Image/upload_bg.png | Bin 0 -> 1497 bytes Resources/Public/Js/be_effects.js | 229 +++ Resources/Public/Js/form.js | 65 + .../Public/Js/jquery.ui.datepicker.min.js | 13 + .../Public/Js/jquery.validationEngine-en.js | 188 ++ .../Public/Js/jquery.validationEngine.js | 1721 +++++++++++++++++ Resources/Public/Js/powermail_frontend.js | 6 + Resources/Public/Js/tabs.js | 62 + Tests/Unit/Controller/FormsControllerTest.php | 61 + Tests/Unit/Domain/Model/FieldsTest.php | 177 ++ Tests/Unit/Domain/Model/FormsTest.php | 117 ++ Tests/Unit/Domain/Model/PagesTest.php | 152 ++ Thumbs.db | Bin 0 -> 16384 bytes doc/Thumbs.db | Bin 0 -> 9728 bytes doc/manual.sxw | Bin 0 -> 93632 bytes ext_conf_template.txt | 14 + ext_emconf.php | 45 + ext_icon.gif | Bin 0 -> 423 bytes ext_localconf.php | 60 + ext_tables.php | 227 +++ ext_tables.sql | 233 +++ todos.txt | 71 + 216 files changed, 17863 insertions(+) create mode 100644 .idea/.name create mode 100644 .idea/codeStyleSettings.xml create mode 100644 .idea/dictionaries/einpraegsam.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/powermail@powermail.in2code.de.iml create mode 100644 .idea/scopes/scope_settings.xml create mode 100644 .idea/vcs.xml create mode 100644 Classes/Controller/FormsController.php create mode 100644 Classes/Controller/ModuleController.php create mode 100644 Classes/Controller/OutputController.php create mode 100644 Classes/Domain/Model/Answers.php create mode 100644 Classes/Domain/Model/Fields.php create mode 100644 Classes/Domain/Model/Forms.php create mode 100644 Classes/Domain/Model/Mails.php create mode 100644 Classes/Domain/Model/Pages.php create mode 100644 Classes/Domain/Model/User.php create mode 100644 Classes/Domain/Model/UserGroup.php create mode 100644 Classes/Domain/Repository/AnswersRepository.php create mode 100644 Classes/Domain/Repository/FieldsRepository.php create mode 100644 Classes/Domain/Repository/FormsRepository.php create mode 100644 Classes/Domain/Repository/MailsRepository.php create mode 100644 Classes/Domain/Repository/PagesRepository.php create mode 100644 Classes/Domain/Repository/UserRepository.php create mode 100644 Classes/Domain/Validator/CaptchaValidator.php create mode 100644 Classes/Domain/Validator/MandatoryValidator.php create mode 100644 Classes/Domain/Validator/StringValidator.php create mode 100644 Classes/Domain/Validator/UploadValidator.php create mode 100644 Classes/Utility/CalculatingCaptcha.php create mode 100644 Classes/Utility/Div.php create mode 100644 Classes/Utility/EvaluateEmail.php create mode 100644 Classes/Utility/FieldSelectorUserFunc.php create mode 100644 Classes/Utility/InitialMarker.php create mode 100644 Classes/Utility/Marker.php create mode 100644 Classes/Utility/Marketing.php create mode 100644 Classes/Utility/PluginInfo.php create mode 100644 Classes/Utility/SaveToTable.php create mode 100644 Classes/Utility/WizIcon.php create mode 100644 Classes/ViewHelpers/BeCheck/ExtMngConfigViewHelper.php create mode 100644 Classes/ViewHelpers/BeCheck/SessionViewHelper.php create mode 100644 Classes/ViewHelpers/BeCheck/T3VersionViewHelper.php create mode 100644 Classes/ViewHelpers/BeCheck/UploadsFolderViewHelper.php create mode 100644 Classes/ViewHelpers/Condition/IsAllowedToEditViewHelper.php create mode 100644 Classes/ViewHelpers/Condition/IsArrayViewHelper.php create mode 100644 Classes/ViewHelpers/Condition/IsDateTimeVariableInVariableViewHelper.php create mode 100644 Classes/ViewHelpers/Condition/IsNumberViewHelper.php create mode 100644 Classes/ViewHelpers/Condition/IsStringInStringViewHelper.php create mode 100644 Classes/ViewHelpers/Condition/IsThereAMailWithStartingLetterViewHelper.php create mode 100644 Classes/ViewHelpers/Condition/OrViewHelper.php create mode 100644 Classes/ViewHelpers/Form/AdvancedSelectViewHelper.php create mode 100644 Classes/ViewHelpers/Form/SelectFieldViewHelper.php create mode 100644 Classes/ViewHelpers/Getter/GetFieldLabelFromUidViewHelper.php create mode 100644 Classes/ViewHelpers/Getter/GetFieldMarkerFromUidViewHelper.php create mode 100644 Classes/ViewHelpers/Getter/GetPageNameFromUidViewHelper.php create mode 100644 Classes/ViewHelpers/Getter/GetPiVarAnswerFieldViewHelper.php create mode 100644 Classes/ViewHelpers/Misc/CaptchaViewHelper.php create mode 100644 Classes/ViewHelpers/Misc/ContentElementViewHelper.php create mode 100644 Classes/ViewHelpers/Misc/ErrorClassViewHelper.php create mode 100644 Classes/ViewHelpers/Misc/MorestepClassViewHelper.php create mode 100644 Classes/ViewHelpers/Misc/PrefillFieldViewHelper.php create mode 100644 Classes/ViewHelpers/Misc/ValidationClassViewHelper.php create mode 100644 Classes/ViewHelpers/Misc/VariableInVariableViewHelper.php create mode 100644 Classes/ViewHelpers/Misc/VariablesViewHelper.php create mode 100644 Classes/ViewHelpers/Reporting/GetLabelsGoogleChartsViewHelper.php create mode 100644 Classes/ViewHelpers/Reporting/GetValuesGoogleChartsViewHelper.php create mode 100644 Classes/ViewHelpers/String/EncodeViewHelper.php create mode 100644 Classes/ViewHelpers/String/ExplodeViewHelper.php create mode 100644 Classes/ViewHelpers/String/ImplodeFieldViewHelper.php create mode 100644 Classes/ViewHelpers/String/RemoveQuoteViewHelper.php create mode 100644 Classes/ViewHelpers/String/TrimViewHelper.php create mode 100644 Classes/ViewHelpers/String/UnderscoredToLowerCamelCaseViewHelper.php create mode 100644 Classes/ViewHelpers/String/UpperViewHelper.php create mode 100644 Classes/ViewHelpers/String/Utf8DecodeViewHelper.php create mode 100644 Configuration/ExtensionBuilder/settings.yaml create mode 100644 Configuration/FlexForms/flexform_pi1.xml create mode 100644 Configuration/FlexForms/flexform_pi2.xml create mode 100644 Configuration/TCA/Answers.php create mode 100644 Configuration/TCA/Fields.php create mode 100644 Configuration/TCA/Forms.php create mode 100644 Configuration/TCA/Mails.php create mode 100644 Configuration/TCA/Pages.php create mode 100644 Configuration/TypoScript/CssFancy/constants.txt create mode 100644 Configuration/TypoScript/CssFancy/setup.txt create mode 100644 Configuration/TypoScript/Main/constants.txt create mode 100644 Configuration/TypoScript/Main/setup.txt create mode 100644 Configuration/TypoScript/Marketing/setup.txt create mode 100644 Configuration/TypoScript/Powermail_Frontend/constants.txt create mode 100644 Configuration/TypoScript/Powermail_Frontend/setup.txt create mode 100644 ExtensionBuilder.json create mode 100644 Resources/Private/.htaccess create mode 100644 Resources/Private/Fonts/ARCADE.TTF create mode 100644 Resources/Private/Image/captcha_bg.png create mode 100644 Resources/Private/Language/locallang.xml create mode 100644 Resources/Private/Language/locallang_csh_tx_powermail_domain_model_answers.xml create mode 100644 Resources/Private/Language/locallang_csh_tx_powermail_domain_model_fields.xml create mode 100644 Resources/Private/Language/locallang_csh_tx_powermail_domain_model_forms.xml create mode 100644 Resources/Private/Language/locallang_csh_tx_powermail_domain_model_mails.xml create mode 100644 Resources/Private/Language/locallang_csh_tx_powermail_domain_model_pages.xml create mode 100644 Resources/Private/Language/locallang_db.xml create mode 100644 Resources/Private/Language/locallang_mod.xml create mode 100644 Resources/Private/Layouts/Backend.html create mode 100644 Resources/Private/Layouts/Default.html create mode 100644 Resources/Private/Layouts/Export.html create mode 100644 Resources/Private/Layouts/Mail.html create mode 100644 Resources/Private/Layouts/PowermailAll.html create mode 100644 Resources/Private/Partials/FormError.html create mode 100644 Resources/Private/Partials/Forms/Captcha.html create mode 100644 Resources/Private/Partials/Forms/Check.html create mode 100644 Resources/Private/Partials/Forms/Content.html create mode 100644 Resources/Private/Partials/Forms/Date.html create mode 100644 Resources/Private/Partials/Forms/File.html create mode 100644 Resources/Private/Partials/Forms/Hidden.html create mode 100644 Resources/Private/Partials/Forms/Html.html create mode 100644 Resources/Private/Partials/Forms/Input.html create mode 100644 Resources/Private/Partials/Forms/Password.html create mode 100644 Resources/Private/Partials/Forms/Radio.html create mode 100644 Resources/Private/Partials/Forms/Reset.html create mode 100644 Resources/Private/Partials/Forms/Select.html create mode 100644 Resources/Private/Partials/Forms/Submit.html create mode 100644 Resources/Private/Partials/Forms/Text.html create mode 100644 Resources/Private/Partials/Forms/Textarea.html create mode 100644 Resources/Private/Partials/Forms/Typoscript.html create mode 100644 Resources/Private/Partials/GoogleAdwordsConversion.html create mode 100644 Resources/Private/Partials/MarketingInformation.html create mode 100644 Resources/Private/Partials/Module/ExportBe.html create mode 100644 Resources/Private/Partials/Module/FilterBe.html create mode 100644 Resources/Private/Partials/Module/SearchBe.html create mode 100644 Resources/Private/Partials/Output/Abc.html create mode 100644 Resources/Private/Partials/Output/Export.html create mode 100644 Resources/Private/Partials/Output/Field/Check.html create mode 100644 Resources/Private/Partials/Output/Field/Input.html create mode 100644 Resources/Private/Partials/Output/Field/Radio.html create mode 100644 Resources/Private/Partials/Output/Field/Select.html create mode 100644 Resources/Private/Partials/Output/Field/Textarea.html create mode 100644 Resources/Private/Partials/Output/Search.html create mode 100644 Resources/Private/Templates/Forms/Confirmation.html create mode 100644 Resources/Private/Templates/Forms/Create.html create mode 100644 Resources/Private/Templates/Forms/Form.html create mode 100644 Resources/Private/Templates/Forms/OptinConfirm.html create mode 100644 Resources/Private/Templates/Forms/PowermailAll.html create mode 100644 Resources/Private/Templates/Mails/OptinMail.html create mode 100644 Resources/Private/Templates/Mails/ReceiverMail.html create mode 100644 Resources/Private/Templates/Mails/SenderMail.html create mode 100644 Resources/Private/Templates/Module/CheckBe.html create mode 100644 Resources/Private/Templates/Module/ExportCsvBe.html create mode 100644 Resources/Private/Templates/Module/ExportXlsBe.html create mode 100644 Resources/Private/Templates/Module/ListBe.html create mode 100644 Resources/Private/Templates/Module/ReportingBe.html create mode 100644 Resources/Private/Templates/Module/ReportingFormBe.html create mode 100644 Resources/Private/Templates/Module/ReportingMarketingBe.html create mode 100644 Resources/Private/Templates/Output/Edit.html create mode 100644 Resources/Private/Templates/Output/ExportCsv.html create mode 100644 Resources/Private/Templates/Output/ExportXls.html create mode 100644 Resources/Private/Templates/Output/List.html create mode 100644 Resources/Private/Templates/Output/Rss.html create mode 100644 Resources/Private/Templates/Output/Show.html create mode 100644 Resources/Private/Templates/ViewHelpers/Widget/Paginate/Index.html create mode 100644 Resources/Public/Css/Backend.css create mode 100644 Resources/Public/Css/CssFancy.css create mode 100644 Resources/Public/Css/jquery.ui.datepicker.css create mode 100644 Resources/Public/Css/jquery.ui.theme.css create mode 100644 Resources/Public/Icons/ce_wiz.gif create mode 100644 Resources/Public/Icons/relation.gif create mode 100644 Resources/Public/Icons/tx_powermail_domain_model_answers.gif create mode 100644 Resources/Public/Icons/tx_powermail_domain_model_fields.gif create mode 100644 Resources/Public/Icons/tx_powermail_domain_model_fields__h.gif create mode 100644 Resources/Public/Icons/tx_powermail_domain_model_fields__ht.gif create mode 100644 Resources/Public/Icons/tx_powermail_domain_model_fields__t.gif create mode 100644 Resources/Public/Icons/tx_powermail_domain_model_forms.gif create mode 100644 Resources/Public/Icons/tx_powermail_domain_model_forms__h.gif create mode 100644 Resources/Public/Icons/tx_powermail_domain_model_forms__ht.gif create mode 100644 Resources/Public/Icons/tx_powermail_domain_model_forms__t.gif create mode 100644 Resources/Public/Icons/tx_powermail_domain_model_mails.gif create mode 100644 Resources/Public/Icons/tx_powermail_domain_model_mails.gif__h.gif create mode 100644 Resources/Public/Icons/tx_powermail_domain_model_mails.gif__t.gif create mode 100644 Resources/Public/Icons/tx_powermail_domain_model_pages.gif create mode 100644 Resources/Public/Icons/tx_powermail_domain_model_pages__h.gif create mode 100644 Resources/Public/Icons/tx_powermail_domain_model_pages__ht.gif create mode 100644 Resources/Public/Icons/tx_powermail_domain_model_pages__t.gif create mode 100644 Resources/Public/Image/captcha.png create mode 100644 Resources/Public/Image/chart_form.png create mode 100644 Resources/Public/Image/chart_marketing.png create mode 100644 Resources/Public/Image/icon-check.png create mode 100644 Resources/Public/Image/icon-notchecked.png create mode 100644 Resources/Public/Image/icon_calendar.png create mode 100644 Resources/Public/Image/icon_csv.gif create mode 100644 Resources/Public/Image/icon_error.png create mode 100644 Resources/Public/Image/icon_ok.png create mode 100644 Resources/Public/Image/icon_rss.gif create mode 100644 Resources/Public/Image/icon_sorting_asc.png create mode 100644 Resources/Public/Image/icon_sorting_desc.png create mode 100644 Resources/Public/Image/icon_xls.gif create mode 100644 Resources/Public/Image/reportingGraphics.bmml create mode 100644 Resources/Public/Image/upload_bg.png create mode 100644 Resources/Public/Js/be_effects.js create mode 100644 Resources/Public/Js/form.js create mode 100644 Resources/Public/Js/jquery.ui.datepicker.min.js create mode 100644 Resources/Public/Js/jquery.validationEngine-en.js create mode 100644 Resources/Public/Js/jquery.validationEngine.js create mode 100644 Resources/Public/Js/powermail_frontend.js create mode 100644 Resources/Public/Js/tabs.js create mode 100644 Tests/Unit/Controller/FormsControllerTest.php create mode 100644 Tests/Unit/Domain/Model/FieldsTest.php create mode 100644 Tests/Unit/Domain/Model/FormsTest.php create mode 100644 Tests/Unit/Domain/Model/PagesTest.php create mode 100644 Thumbs.db create mode 100644 doc/Thumbs.db create mode 100644 doc/manual.sxw create mode 100644 ext_conf_template.txt create mode 100644 ext_emconf.php create mode 100644 ext_icon.gif create mode 100644 ext_localconf.php create mode 100644 ext_tables.php create mode 100644 ext_tables.sql create mode 100644 todos.txt diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 00000000..5a36893a --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +powermail@powermail.in2code.de \ No newline at end of file diff --git a/.idea/codeStyleSettings.xml b/.idea/codeStyleSettings.xml new file mode 100644 index 00000000..d63a15e7 --- /dev/null +++ b/.idea/codeStyleSettings.xml @@ -0,0 +1,13 @@ + + + + + + + diff --git a/.idea/dictionaries/einpraegsam.xml b/.idea/dictionaries/einpraegsam.xml new file mode 100644 index 00000000..19ec1dbb --- /dev/null +++ b/.idea/dictionaries/einpraegsam.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 00000000..7c62b52a --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 00000000..ba706825 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + CSS + + + + + + + http://www.w3.org/1999/xhtml + + + + + + + diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 00000000..8bd20789 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/.idea/powermail@powermail.in2code.de.iml b/.idea/powermail@powermail.in2code.de.iml new file mode 100644 index 00000000..3b09ca33 --- /dev/null +++ b/.idea/powermail@powermail.in2code.de.iml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/.idea/scopes/scope_settings.xml b/.idea/scopes/scope_settings.xml new file mode 100644 index 00000000..0d5175ca --- /dev/null +++ b/.idea/scopes/scope_settings.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 00000000..cce6fd90 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Classes/Controller/FormsController.php b/Classes/Controller/FormsController.php new file mode 100644 index 00000000..b2b7d62e --- /dev/null +++ b/Classes/Controller/FormsController.php @@ -0,0 +1,461 @@ +, in2code.de + * + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + + +/** + * Controller for powermail forms + * + * @package powermail + * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later + * + */ +class Tx_Powermail_Controller_FormsController extends Tx_Extbase_MVC_Controller_ActionController { + + /** + * formsRepository + * + * @var Tx_Powermail_Domain_Repository_FormsRepository + */ + protected $formsRepository; + + /** + * mailsRepository + * + * @var Tx_Powermail_Domain_Repository_MailsRepository + */ + protected $mailsRepository; + + /** + * answersRepository + * + * @var Tx_Powermail_Domain_Repository_AnswersRepository + */ + protected $answersRepository; + + /** + * cObj + * + * @var Content Object + */ + protected $cObj; + + /** + * TypoScript configuration + * + * @var configuration + */ + protected $conf; + + /** + * Instance for Misc Functions + * + * @var object + */ + protected $div; + + /** + * meesage Classe + * + * @var string + */ + protected $messageClass = 'error'; + + /** + * action show form for creating new mails + * + * @return void + */ + public function formAction() { + if (!isset($this->settings['main']['form']) || !$this->settings['main']['form']) { + return; + } + + // get forms + $forms = $this->formsRepository->findByUids($this->settings['main']['form']); + $this->view->assign('forms', $forms); + $this->view->assign('messageClass', $this->messageClass); + $this->view->assign('action', ($this->settings['main']['confirmation'] ? 'confirmation' : 'create')); + + // open session + $this->div->saveFormStartInSession($forms->getFirst()->getUid()); + } + + /** + * Show Confirmation message after submit (if view is activated) + * + * @param array Field values + * @param integer Form UID + * @validate $field Tx_Powermail_Domain_Validator_UploadValidator + * @validate $field Tx_Powermail_Domain_Validator_MandatoryValidator + * @validate $field Tx_Powermail_Domain_Validator_StringValidator + * @validate $field Tx_Powermail_Domain_Validator_CaptchaValidator + * @return void + */ + public function confirmationAction(array $field = array(), $form = NULL) { + $this->div->addUploadsToFields($field); // add upload fields + $this->view->assign('field', $field); + $this->view->assign('form', $form); + + // markers + $variablesWithMarkers = $this->div->getVariablesWithMarkers($field); + $this->view->assignMultiple($variablesWithMarkers); + + // powermail_all + $variables = $this->div->getVariablesWithLabels($field); + $content = $this->div->powermailAll($variables, $this->configurationManager, $this->objectManager); + $this->view->assign('powermail_all', $content); + } + + /** + * Action create entry + * + * @param array Field Values + * @param integer Form UID + * @param object Mail object (normally empty, filled when mail already exists via double-optin) + * @validate $field Tx_Powermail_Domain_Validator_UploadValidator + * @validate $field Tx_Powermail_Domain_Validator_MandatoryValidator + * @validate $field Tx_Powermail_Domain_Validator_StringValidator + * @validate $field Tx_Powermail_Domain_Validator_CaptchaValidator + * @validate $form notEmpty + * @dontvalidate $newMail + * @return void + */ + public function createAction(array $field = array(), $form = NULL, $newMail = NULL) { + // add uploaded files to $field + $this->div->addUploadsToFields($field); + + // Debug Output + if ($this->settings['debug']['variables']) { + t3lib_utility_Debug::debug($field, 'powermail debug: Show Variables'); + } + + // Save Mail to DB + if ($this->settings['db']['enable'] && !$newMail) { + $dbField = $this->div->rewriteDateInFields($field, $this->settings); + $newMail = $this->saveMail($dbField, $form); + } + + if (!$this->settings['main']['optin'] || ($this->settings['main']['optin'] && $newMail)) { + // Send Mail to receivers + $this->sendMail($field); + + // Save to other tables + $saveToTable = t3lib_div::makeInstance('Tx_Powermail_Utility_SaveToTable'); + $saveToTable->main($this->div->getVariablesWithMarkers($field), $this->conf, $this->cObj); + + // Powermail sendpost + $this->div->sendPost($field, $this->conf, $this->configurationManager); + + // Some output stuff + $this->showThx($field); + } else { + $this->sendConfirmationMail($field, $newMail); + } + } + + /** + * Send Mails + * + * @param $field + * @return void + */ + private function sendMail($field) { + if ($this->settings['receiver']['enable']) { + $receivers = $this->div->getReceiverEmails($this->settings['receiver']['email'], $this->settings['receiver']['fe_group']); + if ($this->cObj->cObjGetSingle($this->conf['receiver.']['overwrite.']['email'], $this->conf['receiver.']['overwrite.']['email.'])) { // overwrite from typoscript + $receivers = t3lib_div::trimExplode(',', $this->cObj->cObjGetSingle($this->conf['receiver.']['overwrite.']['email'], $this->conf['receiver.']['overwrite.']['email.']), 1); + } + foreach ($receivers as $receiver) { + $mail = array(); + $mail['receiverName'] = $this->settings['receiver']['name'] ? $this->settings['receiver']['name'] : 'Powermail'; + $mail['receiverEmail'] = $receiver; + $mail['senderName'] = $this->div->getSenderNameFromArguments($field); + $mail['senderEmail'] = $this->div->getSenderMailFromArguments($field); + $mail['subject'] = $this->settings['receiver']['subject']; + $mail['template'] = 'Mails/ReceiverMail'; + $mail['rteBody'] = $this->settings['receiver']['body']; + $mail['format'] = $this->settings['receiver']['mailformat']; + if ($this->cObj->cObjGetSingle($this->conf['receiver.']['overwrite.']['name'], $this->conf['receiver.']['overwrite.']['name.'])) { // overwrite from typoscript + $mail['receiverName'] = $this->cObj->cObjGetSingle($this->conf['receiver.']['overwrite.']['name'], $this->conf['receiver.']['overwrite.']['name.']); + } + if ($this->cObj->cObjGetSingle($this->conf['receiver.']['overwrite.']['senderName'], $this->conf['receiver.']['overwrite.']['senderName.'])) { // overwrite from typoscript + $mail['senderName'] = $this->cObj->cObjGetSingle($this->conf['receiver.']['overwrite.']['senderName'], $this->conf['receiver.']['overwrite.']['senderName.']); + } + if ($this->cObj->cObjGetSingle($this->conf['receiver.']['overwrite.']['senderEmail'], $this->conf['receiver.']['overwrite.']['senderEmail.'])) { // overwrite from typoscript + $mail['senderEmail'] = $this->cObj->cObjGetSingle($this->conf['receiver.']['overwrite.']['senderEmail'], $this->conf['receiver.']['overwrite.']['senderEmail.']); + } + $sent = $this->div->sendTemplateEmail($mail, $field, $this->settings, 'receiver', $this->objectManager, $this->configurationManager); + + if (!$sent) { + $this->flashMessageContainer->add(Tx_Extbase_Utility_Localization::translate('error_mail_not_created', 'powermail')); + $this->messageClass = 'error'; + } + } + } + + // Send Mail to sender + if ($this->settings['sender']['enable'] && $this->div->getSenderMailFromArguments($field)) { + $mail = array(); + $mail['receiverName'] = $this->div->getSenderNameFromArguments($field) ? $this->div->getSenderNameFromArguments($field) : 'Powermail'; + $mail['receiverEmail'] = $this->div->getSenderMailFromArguments($field); + $mail['senderName'] = $this->settings['sender']['name']; + $mail['senderEmail'] = $this->settings['sender']['email']; + $mail['subject'] = $this->settings['sender']['subject']; + $mail['template'] = 'Mails/ReceiverMail'; + $mail['rteBody'] = $this->settings['sender']['body']; + $mail['format'] = $this->settings['sender']['mailformat']; + if ($this->cObj->cObjGetSingle($this->conf['sender.']['overwrite.']['email'], $this->conf['sender.']['overwrite.']['email.'])) { // overwrite from typoscript + $mail['receiverEmail'] = $this->cObj->cObjGetSingle($this->conf['sender.']['overwrite.']['email'], $this->conf['sender.']['overwrite.']['email.']); + } + if ($this->cObj->cObjGetSingle($this->conf['sender.']['overwrite.']['name'], $this->conf['sender.']['overwrite.']['name.'])) { // overwrite from typoscript + $mail['receiverName'] = $this->cObj->cObjGetSingle($this->conf['sender.']['overwrite.']['name'], $this->conf['sender.']['overwrite.']['name.']); + } + if ($this->cObj->cObjGetSingle($this->conf['sender.']['overwrite.']['senderName'], $this->conf['sender.']['overwrite.']['senderName.'])) { // overwrite from typoscript + $mail['senderName'] = $this->cObj->cObjGetSingle($this->conf['sender.']['overwrite.']['senderName'], $this->conf['sender.']['overwrite.']['senderName.']); + } + if ($this->cObj->cObjGetSingle($this->conf['sender.']['overwrite.']['senderEmail'], $this->conf['sender.']['overwrite.']['senderEmail.'])) { // overwrite from typoscript + $mail['senderEmail'] = $this->cObj->cObjGetSingle($this->conf['sender.']['overwrite.']['senderEmail'], $this->conf['sender.']['overwrite.']['senderEmail.']); + } + $this->div->sendTemplateEmail($mail, $field, $this->settings, 'sender', $this->objectManager, $this->configurationManager); + } + } + + /** + * Send Optin Confirmation Mail + * + * @param $field array with field values + * @param $newMail new mail object from db + * @return void + */ + private function sendConfirmationMail($field, $newMail) { + // Send Mail to sender + $mail = array(); + $mail['receiverName'] = 'Powermail'; + if ($this->div->getSenderNameFromArguments($field)) { + $mail['receiverName'] = $this->div->getSenderNameFromArguments($field); + } + if ($this->cObj->cObjGetSingle($this->conf['optin.']['overwrite.']['name'], $this->conf['optin.']['overwrite.']['name.'])) { // overwrite from typoscript + $mail['receiverName'] = $this->cObj->cObjGetSingle($this->conf['optin.']['overwrite.']['name'], $this->conf['optin.']['overwrite.']['name.']); + } + $mail['receiverEmail'] = $this->div->getSenderMailFromArguments($field); + if ($this->cObj->cObjGetSingle($this->conf['optin.']['overwrite.']['email'], $this->conf['optin.']['overwrite.']['email.'])) { // overwrite from typoscript + $mail['receiverEmail'] = $this->cObj->cObjGetSingle($this->conf['optin.']['overwrite.']['email'], $this->conf['optin.']['overwrite.']['email.']); + } + $mail['senderName'] = $this->settings['sender']['name']; + if ($this->cObj->cObjGetSingle($this->conf['optin.']['overwrite.']['senderName'], $this->conf['optin.']['overwrite.']['senderName.'])) { // overwrite from typoscript + $mail['senderName'] = $this->cObj->cObjGetSingle($this->conf['optin.']['overwrite.']['senderName'], $this->conf['optin.']['overwrite.']['senderName.']); + } + $mail['senderEmail'] = $this->settings['sender']['email']; + if ($this->cObj->cObjGetSingle($this->conf['optin.']['overwrite.']['senderEmail'], $this->conf['optin.']['overwrite.']['senderEmail.'])) { // overwrite from typoscript + $mail['senderEmail'] = $this->cObj->cObjGetSingle($this->conf['optin.']['overwrite.']['senderEmail'], $this->conf['optin.']['overwrite.']['senderEmail.']); + } + $mail['subject'] = $this->cObj->cObjGetSingle($this->conf['optin.']['subject'], $this->conf['optin.']['subject.']); + $mail['template'] = 'Mails/OptinMail'; + $mail['rteBody'] = ''; + $mail['format'] = $this->settings['sender']['mailformat']; + $mail['variables'] = array( + 'optinHash' => $this->div->createOptinHash($newMail->getUid() . $newMail->getPid() . $newMail->getForm()), + 'mail' => $newMail->getUid() + ); + $this->div->sendTemplateEmail($mail, $field, $this->settings, 'optin', $this->objectManager, $this->configurationManager); + } + + /** + * Show THX message after submit + * + * @param array + * @return void + */ + private function showThx($field) { + // redirect if activated + if (!empty($this->settings['thx']['redirect'])) { + $url = $this->cObj->typolink('', array('parameter' => $this->settings['thx']['redirect'], 'returnLast' => 'url')); + $this->redirectToUri($url); + return; + } + + // assign + $this->view->assign('marketingInfos', $this->div->getMarketingInfos()); + $this->view->assign('messageClass', $this->messageClass); + $this->view->assign('powermail_rte', $this->settings['thx']['body']); + + // get variable array + $variablesWithMarkers = $this->div->getVariablesWithMarkers($field); + $this->view->assign('variablesWithMarkers', $this->div->htmlspecialcharsOnArray($variablesWithMarkers)); + $this->view->assignMultiple($variablesWithMarkers); + $variablesWithLabels = $this->div->getVariablesWithLabels($field); + $this->view->assign('variablesWithLabels', $variablesWithLabels); + + // powermail_all + $variables = $this->div->getVariablesWithLabels($field); + $content = $this->div->powermailAll($variables, $this->configurationManager, $this->objectManager); + $this->view->assign('powermail_all', $content); + } + + /** + * Save mail on submit + * + * @param array Field values + * @param integer Form uid + * @return object Mail object + */ + private function saveMail($field, $form) { + // tx_powermail_domain_model_mails + $marketingInfos = $this->div->getMarketingInfos(); + $newMail = t3lib_div::makeInstance('Tx_Powermail_Domain_Model_Mails'); + $newMail->setPid($this->div->getStoragePage($this->settings['main']['pid'])); + $newMail->setForm($form); + $newMail->setSenderMail($this->div->getSenderMailFromArguments($field)); + $newMail->setSenderName($this->div->getSenderNameFromArguments($field)); + $newMail->setSubject($this->settings['receiver']['subject']); + $newMail->setBody(t3lib_div::view_array($this->div->getVariablesWithLabels($field))); + $newMail->setReceiverMail($this->settings['receiver']['email']); + if (intval($GLOBALS['TSFE']->fe_user->user['uid']) > 0) { + $newMail->setFeuser($GLOBALS['TSFE']->fe_user->user['uid']); + } + $newMail->setTime((time() - $this->div->getFormStartFromSession($form))); + if (isset($this->settings['global']['disableIpLog']) && $this->settings['global']['disableIpLog'] == 0) { + $newMail->setSenderIp(t3lib_div::getIndpEnv('REMOTE_ADDR')); + } + $newMail->setUserAgent(t3lib_div::getIndpEnv('HTTP_USER_AGENT')); + $newMail->setMarketingSearchterm($marketingInfos['marketingSearchterm']); + $newMail->setMarketingReferer($marketingInfos['marketingReferer']); + $newMail->setMarketingPayedSearchResult($marketingInfos['marketingPayedSearchResult']); + $newMail->setMarketingLanguage($marketingInfos['marketingLanguage']); + $newMail->setMarketingBrowserLanguage($marketingInfos['marketingBrowserLanguage']); + $newMail->setMarketingFunnel($marketingInfos['marketingFunnel']); + if ($this->settings['main']['optin'] || $this->settings['db']['hidden']) { + $newMail->setHidden(1); + } + $this->mailsRepository->add($newMail); + $persistenceManager = t3lib_div::makeInstance('Tx_Extbase_Persistence_Manager'); + $persistenceManager->persistAll(); + + // tx_powermail_domain_model_answers + foreach ((array) $field as $uid => $value) { // one loop for every received field + $newAnswer = t3lib_div::makeInstance('Tx_Powermail_Domain_Model_Answers'); + $newAnswer->setPid($this->div->getStoragePage($this->settings['main']['pid'])); + $newAnswer->setValue($value); + $newAnswer->setField($uid); + $newAnswer->setMail($newMail->getUid()); + + $this->answersRepository->add($newAnswer); + } + + return $newMail; + } + + /** + * Confirm Double Optin + * + * @param $mail Mail Uid + * @param $hash Given Hash String + * @dontvalidate $mail + * @dontvalidate $hash + * return void + */ + public function optinConfirmAction($mail = null, $hash = null) { + $mail = $this->mailsRepository->findByUid($mail); + + if (!empty($hash) && $hash == $this->div->createOptinHash($mail->getUid() . $mail->getPid() . $mail->getForm())) { + // only if hidden = 0 + if ($mail->getHidden() == 1) { + $mail->setHidden(0); + + // call create action + $fields = array(); + foreach ($mail->getAnswers() as $answer) { + $fields[$answer->getField()] = $answer->getValue(); + } + $this->forward('create', null, null, array('field' => $fields, 'form' => $mail->getForm(), 'newMail' => $mail)); + } + } + } + + /** + * Deactivate errormessages in flashmessages + * + * @return bool + */ + protected function getErrorFlashMessage() { + return false; + } + + /** + * Initializes the current action + * + * @return void + */ + protected function initializeAction() { + $this->cObj = $this->configurationManager->getContentObject(); + $typoScriptSetup = $this->configurationManager->getConfiguration(Tx_Extbase_Configuration_ConfigurationManagerInterface::CONFIGURATION_TYPE_FULL_TYPOSCRIPT); + $this->conf = $typoScriptSetup['plugin.']['tx_powermail.']['settings.']['setup.']; + $this->div = t3lib_div::makeInstance('Tx_Powermail_Utility_Div'); + $this->div->mergeTypoScript2FlexForm($this->settings); // merge typoscript to flexform + + // check if ts is included + if (!isset($this->settings['staticTemplate'])) { + $this->flashMessageContainer->add(Tx_Extbase_Utility_Localization::translate('error_no_typoscript', 'powermail')); + } + + // Debug Output + if ($this->settings['debug']['settings']) { + t3lib_utility_Debug::debug($this->settings, 'powermail debug: Show Settings'); + } + } + + /** + * injectFormsRepository + * + * @param Tx_Powermail_Domain_Repository_FormsRepository $formsRepository + * @return void + */ + public function injectFormsRepository(Tx_Powermail_Domain_Repository_FormsRepository $formsRepository) { + $this->formsRepository = $formsRepository; + } + + /** + * injectMailsRepository + * + * @param Tx_Powermail_Domain_Repository_MailsRepository $mailsRepository + * @return void + */ + public function injectMailsRepository(Tx_Powermail_Domain_Repository_MailsRepository $mailsRepository) { + $this->mailsRepository = $mailsRepository; + } + + /** + * injectAnswersRepository + * + * @param Tx_Powermail_Domain_Repository_AnswersRepository $answersRepository + * @return void + */ + public function injectAnswersRepository(Tx_Powermail_Domain_Repository_AnswersRepository $answersRepository) { + $this->answersRepository = $answersRepository; + } + +} +?> \ No newline at end of file diff --git a/Classes/Controller/ModuleController.php b/Classes/Controller/ModuleController.php new file mode 100644 index 00000000..f53d327b --- /dev/null +++ b/Classes/Controller/ModuleController.php @@ -0,0 +1,220 @@ +, in2code.de + * + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + +/** + * Controller for powermail list views (BE and FE) + * + * @package powermail + * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later + * + */ +class Tx_Powermail_Controller_ModuleController extends Tx_Extbase_MVC_Controller_ActionController { + + /** + * mailsRepository + * + * @var Tx_Powermail_Domain_Repository_MailsRepository + */ + protected $mailsRepository; + + /** + * piVars + * + * @var array + */ + protected $piVars; + + /** + * div + * + * @var object + */ + protected $div; + + /** + * List View Backend + * + * @return void + */ + public function listBeAction() { + $mails = $this->mailsRepository->findAllInPid(t3lib_div::_GP('id'), $this->settings, $this->piVars); + $firstMail = $this->mailsRepository->findFirstInPid(t3lib_div::_GP('id')); + + $this->view->assign('mails', $mails); + $this->view->assign('firstMail', $firstMail); + $this->view->assign('piVars', $this->piVars); + $this->view->assign('pid', t3lib_div::_GP('id')); + $this->view->assign('token', t3lib_BEfunc::getUrlToken('tceAction')); + $this->view->assign('perPage', ($this->settings['perPage'] ? $this->settings['perPage'] : 10)); + } + + /** + * Check View Backend + * + * @param string email address + * @return void + */ + public function checkBeAction($email = NULL) { + $this->view->assign('pid', t3lib_div::_GP('id')); + + if ($email) { + if (t3lib_div::validEmail($email)) { + $body = 'New Test Email from User ' . $GLOBALS['BE_USER']->user['username'] . ' (' . t3lib_div::getIndpEnv('HTTP_HOST') . ')'; + + $message = t3lib_div::makeInstance('t3lib_mail_Message'); + $message + ->setTo(array($email => 'Receiver')) + ->setFrom(array('powermail@domain.net' => 'powermail')) + ->setSubject('New Powermail Test Email') + ->setBody($body, 'text/html') + ->send(); + + $this->view->assign('issent', $message->isSent()); + $this->view->assign('email', $email); + } + } + } + + /** + * Reporting + * + * @param string 'form' or 'marketing' + * @return void + */ + public function reportingBeAction($subaction = NULL) { + if ($subaction == 'form') { + $this->forward('reportingFormBe'); + } + if ($subaction == 'marketing') { + $this->forward('reportingMarketingBe'); + } + } + + /** + * Reporting Form + * + * @return void + */ + public function reportingFormBeAction() { + $mails = $this->mailsRepository->findAllInPid(t3lib_div::_GP('id'), $this->settings, $this->piVars); + $firstMail = $this->mailsRepository->findFirstInPid(t3lib_div::_GP('id')); + $groupedAnswers = $this->div->getGroupedMailAnswers($mails); + + $this->view->assign('groupedAnswers', $groupedAnswers); + $this->view->assign('mails', $mails); + $this->view->assign('firstMail', $firstMail); + $this->view->assign('piVars', $this->piVars); + $this->view->assign('pid', t3lib_div::_GP('id')); + $this->view->assign('token', t3lib_BEfunc::getUrlToken('tceAction')); + $this->view->assign('perPage', ($this->settings['perPage'] ? $this->settings['perPage'] : 10)); + } + + /** + * Reporting Marketing + * + * @return void + */ + public function reportingMarketingBeAction() { + $mails = $this->mailsRepository->findAllInPid(t3lib_div::_GP('id'), $this->settings, $this->piVars); + $firstMail = $this->mailsRepository->findFirstInPid(t3lib_div::_GP('id')); + $groupedMarketingStuff = $this->div->getGroupedMarketingStuff($mails); + + $this->view->assign('groupedMarketingStuff', $groupedMarketingStuff); + $this->view->assign('mails', $mails); + $this->view->assign('firstMail', $firstMail); + $this->view->assign('piVars', $this->piVars); + $this->view->assign('pid', t3lib_div::_GP('id')); + $this->view->assign('token', t3lib_BEfunc::getUrlToken('tceAction')); + $this->view->assign('perPage', ($this->settings['perPage'] ? $this->settings['perPage'] : 10)); + } + + /** + * Export Action + * + * @param array export settings + * @return void + */ + public function exportBeAction(array $export = array()) { + if ($export['format'] == 'xls') { + $this->forward('exportXlsBe', NULL, NULL, array('export' => $export)); + } + $this->forward('exportCsvBe', NULL, NULL, array('export' => $export)); + } + + /** + * Export Action for XLS Files + * + * @param array export settings + * @return void + */ + public function exportXlsBeAction(array $export = array()) { + $mails = $this->mailsRepository->findByUidList($export['mails'], $export['sorting']); + $this->view->assign('mails', $mails); + $this->view->assign('fields', t3lib_div::trimExplode(',', $export['fields'], 1)); + + header('Content-Type: application/vnd.ms-excel'); + header('Content-Disposition: inline; filename="' . ($this->settings['export']['filenameXls'] ? $this->settings['export']['filenameXls'] : 'export.xls') . '"'); + header('Pragma: no-cache'); + } + + /** + * Export Action for CSV Files + * + * @param array export settings + * @return void + */ + public function exportCsvBeAction(array $export = array()) { + $mails = $this->mailsRepository->findByUidList($export['mails'], $export['sorting']); + $this->view->assign('mails', $mails); + $this->view->assign('fields', t3lib_div::trimExplode(',', $export['fields'], 1)); + + header('Content-Type: text/x-csv'); + header('Content-Disposition: attachment; filename="' . ($this->settings['export']['filenameCsv'] ? $this->settings['export']['filenameCsv'] : 'export.csv') . '"'); + header('Pragma: no-cache'); + } + + /** + * Initializes the current action + * + * @return void + */ + protected function initializeAction() { + $this->div = t3lib_div::makeInstance('Tx_Powermail_Utility_Div'); + $this->piVars = $this->request->getArguments(); + } + + /** + * injectMailsRepository + * + * @param Tx_Powermail_Domain_Repository_MailsRepository $mailsRepository + * @return void + */ + public function injectMailsRepository(Tx_Powermail_Domain_Repository_MailsRepository $mailsRepository) { + $this->mailsRepository = $mailsRepository; + } +} + +?> \ No newline at end of file diff --git a/Classes/Controller/OutputController.php b/Classes/Controller/OutputController.php new file mode 100644 index 00000000..01990c4d --- /dev/null +++ b/Classes/Controller/OutputController.php @@ -0,0 +1,324 @@ +, in2code.de + * + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + + +/** + * Controller for powermail frontend output (former part of the powermail_frontend extension) + * + * @package powermail + * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later + * + */ +class Tx_Powermail_Controller_OutputController extends Tx_Extbase_MVC_Controller_ActionController { + + /** + * mailsRepository + * + * @var Tx_Powermail_Domain_Repository_MailsRepository + */ + protected $mailsRepository; + + /** + * formsRepository + * + * @var Tx_Powermail_Domain_Repository_FormsRepository + */ + protected $formsRepository; + + /** + * fieldsRepository + * + * @var Tx_Powermail_Domain_Repository_FieldsRepository + */ + protected $fieldsRepository; + + /** + * answersRepository + * + * @var Tx_Powermail_Domain_Repository_AnswersRepository + */ + protected $answersRepository; + + /** + * piVars + * + * @var array + */ + protected $piVars; + + /** + * Show mails in a list + * + * @return void + */ + public function listAction() { + // get all mails + $mails = $this->mailsRepository->findListBySettings($this->settings, $this->piVars); + $this->view->assign('mails', $mails); + + // get field array for output + $fields = t3lib_div::trimExplode(',', $this->settings['list']['fields'], 1); + if (!$fields) { + $fields = $this->div->getFieldsFromForm($this->settings['main']['form']); + } + $this->view->assign('fields', $fields); + + // get piVars + $this->view->assign('piVars', $this->piVars); + $this->view->assign('abc', $this->div->getAbcArray()); + + // single pid + if (empty($this->settings['single']['pid'])) { + $this->settings['single']['pid'] = $GLOBALS['TSFE']->id; + } + $this->view->assign('singlePid', $this->settings['single']['pid']); + + // edit pid + if (empty($this->settings['edit']['pid'])) { + $this->settings['edit']['pid'] = $GLOBALS['TSFE']->id; + } + $this->view->assign('editPid', $this->settings['edit']['pid']); + } + + /** + * Show mails in a list + * + * @param Tx_Powermail_Domain_Model_Mails $mail + * @return void + */ + public function showAction(Tx_Powermail_Domain_Model_Mails $mail) { + $this->view->assign('mail', $mail); + + // get field array for output + $fields = t3lib_div::trimExplode(',', $this->settings['detail']['fields'], 1); + if (!$fields) { + $fields = $this->div->getFieldsFromForm($this->settings['main']['form']); + } + $this->view->assign('fields', $fields); + + // list pid + if (empty($this->settings['list']['pid'])) { + $this->settings['list']['pid'] = $GLOBALS['TSFE']->id; + } + $this->view->assign('listPid', $this->settings['list']['pid']); + + // edit pid + if (empty($this->settings['edit']['pid'])) { + $this->settings['edit']['pid'] = $GLOBALS['TSFE']->id; + } + $this->view->assign('editPid', $this->settings['edit']['pid']); + } + + /** + * Edit mail + * + * @param Tx_Powermail_Domain_Model_Mails $mail + * @return void + */ + public function editAction(Tx_Powermail_Domain_Model_Mails $mail) { + $this->view->assign('mail', $mail); + + // get field array for output + $fields = t3lib_div::trimExplode(',', $this->settings['edit']['fields'], 1); + if (!$fields) { + $fields = $this->div->getFieldsFromForm($this->settings['main']['form']); + } + foreach ((array) $fields as $key => $field) { + $fields[$key] = $this->fieldsRepository->findByUid($field); + } + $this->view->assign('fields', $fields); + + // list pid + if (empty($this->settings['list']['pid'])) { + $this->settings['list']['pid'] = $GLOBALS['TSFE']->id; + } + $this->view->assign('listPid', $this->settings['list']['pid']); + + // single pid + if (empty($this->settings['single']['pid'])) { + $this->settings['single']['pid'] = $GLOBALS['TSFE']->id; + } + $this->view->assign('singlePid', $this->settings['single']['pid']); + } + + /** + * Update mail + * + * @param Tx_Powermail_Domain_Model_Mails $mail + * @param $field Field Array with changes + * @dontvalidate $mail + * @dontvalidate $field + * @return void + */ + public function updateAction(Tx_Powermail_Domain_Model_Mails $mail, $field = array()) { + if ($this->div->isAllowedToEdit($this->settings, $mail)) { + foreach ((array) $field as $fieldUid => $value) { // one loop for every received field + $answer = $this->answersRepository->findByFieldAndMail($fieldUid, $mail); + $answer->setValue($value); + $this->answersRepository->update($answer); + } + $this->flashMessageContainer->add(Tx_Extbase_Utility_Localization::translate('PowermailFrontendEditConfirm', 'powermail')); + } else { + $this->flashMessageContainer->add(Tx_Extbase_Utility_Localization::translate('PowermailFrontendEditFailed', 'powermail')); + } + + $this->redirect('edit', null, null, array('mail' => $mail)); + } + + /** + * Export mails + * + * @param $export Field Array with mails and format + * @dontvalidate $export + * @return void + */ + public function exportAction($export = array()) { + if (!$this->settings['list']['export']) { + return; + } + $mails = $this->mailsRepository->findByUidList($export['fields']); + + // get field array for output + $fields = t3lib_div::trimExplode(',', $this->settings['list']['fields'], 1); + if (!$fields) { + $fields = $this->div->getFieldsFromForm($this->settings['main']['form']); + } + + if ($export['format'] == 'xls') { + $this->forward('exportXls', NULL, NULL, array('mails' => $mails, 'fields' => $fields)); + } + $this->forward('exportCsv', NULL, NULL, array('mails' => $mails, 'fields' => $fields)); + } + + /** + * Export mails XLS + * + * @param array $mails mails objects + * @param array $fields uid field list + * @dontvalidate $mails + * @dontvalidate $fields + * @return void + */ + public function exportXlsAction($mails = array(), $fields = array()) { + $this->view->assign('mails', $mails); + $this->view->assign('fields', $fields); + } + + /** + * Export mails CSV + * + * @param array $mails mails objects + * @param array $fields uid field list + * @dontvalidate $mails + * @dontvalidate $fields + * @return void + */ + public function exportCsvAction($mails = array(), $fields = array()) { + $this->view->assign('mails', $mails); + $this->view->assign('fields', $fields); + } + + /** + * RSS Action List + */ + public function rssAction() { + $mails = $this->mailsRepository->findListBySettings($this->settings, $this->piVars); + $this->view->assign('mails', $mails); + + // single pid + if (empty($this->settings['single']['pid'])) { + $this->settings['single']['pid'] = $GLOBALS['TSFE']->id; + } + $this->view->assign('singlePid', $this->settings['single']['pid']); + } + + /** + * Deactivate errormessages in flashmessages + * + * @return bool + */ + protected function getErrorFlashMessage() { + return false; + } + + /** + * Initializes the current action + * + * @return void + */ + protected function initializeAction() { + $this->div = t3lib_div::makeInstance('Tx_Powermail_Utility_Div'); + $this->div->mergeTypoScript2FlexForm($this->settings, 'Pi2'); // merge typoscript to flexform + $this->piVars = $this->request->getArguments(); + + // check if ts is included + if (!isset($this->settings['staticTemplate'])) { + $this->flashMessageContainer->add(Tx_Extbase_Utility_Localization::translate('error_no_typoscript_pi2', 'powermail')); + } + } + + /** + * injectMailsRepository + * + * @param Tx_Powermail_Domain_Repository_MailsRepository $mailsRepository + * @return void + */ + public function injectMailsRepository(Tx_Powermail_Domain_Repository_MailsRepository $mailsRepository) { + $this->mailsRepository = $mailsRepository; + } + + /** + * injectFormsRepository + * + * @param Tx_Powermail_Domain_Repository_FormsRepository $formsRepository + * @return void + */ + public function injectFormsRepository(Tx_Powermail_Domain_Repository_FormsRepository $formsRepository) { + $this->formsRepository = $formsRepository; + } + + /** + * injectFieldsRepository + * + * @param Tx_Powermail_Domain_Repository_FieldsRepository $fieldsRepository + * @return void + */ + public function injectFieldsRepository(Tx_Powermail_Domain_Repository_FieldsRepository $fieldsRepository) { + $this->fieldsRepository = $fieldsRepository; + } + + /** + * injectAnswersRepository + * + * @param Tx_Powermail_Domain_Repository_AnswersRepository $answersRepository + * @return void + */ + public function injectAnswersRepository(Tx_Powermail_Domain_Repository_AnswersRepository $answersRepository) { + $this->answersRepository = $answersRepository; + } +} + +?> \ No newline at end of file diff --git a/Classes/Domain/Model/Answers.php b/Classes/Domain/Model/Answers.php new file mode 100644 index 00000000..ea6b7028 --- /dev/null +++ b/Classes/Domain/Model/Answers.php @@ -0,0 +1,134 @@ +, in2code.de + * + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + + +/** + * + * + * @package powermail + * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later + * + */ +class Tx_Powermail_Domain_Model_Answers extends Tx_Extbase_DomainObject_AbstractEntity { + + /** + * value + * + * @var string + */ + protected $value; + + /** + * mail + * + * @var integer + */ + protected $mail; + + /** + * field + * + * @var integer + */ + protected $field; + + /** + * __construct + * + * @return void + */ + public function __construct() { + } + + /** + * Returns the value + * + * @return string $value + */ + public function getValue() { + // workarround to get array from database (checkbox values) + $div = t3lib_div::makeInstance('Tx_Powermail_Utility_Div'); + if ($div->is_serialized($this->value)) { + return unserialize($this->value); + } + return $this->value; + } + + /** + * Sets the value + * + * @param string $value + * @dontvalidate $value + * @return void + */ + public function setValue($value) { + // workarround to store array in database (checkbox values) + if (is_array($value)) { + $value = serialize($value); + } + $this->value = $value; + } + + /** + * Returns the field + * + * @return integer $field + */ + public function getField() { + return $this->field; + } + + /** + * Sets the field + * + * @param integer $field + * @return void + */ + public function setField($field) { + $this->field = $field; + } + + /** + * Returns the mail + * + * @return integer $mail + */ + public function getMail() { + return $this->mail; + } + + /** + * Sets the mail + * + * @param integer $mail + * @return void + */ + public function setMail($mail) { + $this->mail = $mail; + } + +} +?> \ No newline at end of file diff --git a/Classes/Domain/Model/Fields.php b/Classes/Domain/Model/Fields.php new file mode 100644 index 00000000..b008e3f0 --- /dev/null +++ b/Classes/Domain/Model/Fields.php @@ -0,0 +1,444 @@ +, in2code.de + * + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + + +/** + * + * + * @package powermail + * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later + * + */ +class Tx_Powermail_Domain_Model_Fields extends Tx_Extbase_DomainObject_AbstractEntity { + + /** + * title + * + * @var string + * @validate NotEmpty + */ + protected $title; + + /** + * type + * + * @var string + * @validate NotEmpty + */ + protected $type; + + /** + * settings + * + * @var string + */ + protected $settings; + + /** + * path + * + * @var string + */ + protected $path; + + /** + * contentElement + * + * @var string + */ + protected $contentElement; + + /** + * text + * + * @var string + */ + protected $text; + + /** + * prefillValue + * + * @var string + */ + protected $prefillValue; + + /** + * validation + * + * @var integer + */ + protected $validation; + + /** + * css + * + * @var integer + */ + protected $css; + + /** + * feuserValue + * + * @var string + */ + protected $feuserValue; + + /** + * senderName + * + * @var string + */ + protected $senderName; + + /** + * senderEmail + * + * @var string + */ + protected $senderEmail; + + /** + * mandatory + * + * @var boolean + */ + protected $mandatory; + + /** + * marker + * + * @var string + */ + protected $marker; + + /** + * sorting + * + * @var integer + */ + protected $sorting; + + /** + * __construct + * + * @return void + */ + public function __construct() { + + } + + /** + * Returns the title + * + * @return string $title + */ + public function getTitle() { + return $this->title; + } + + /** + * Sets the title + * + * @param string $title + * @return void + */ + public function setTitle($title) { + $this->title = $title; + } + + /** + * Returns the type + * + * @return string $type + */ + public function getType() { + return $this->type; + } + + /** + * Sets the type + * + * @param string $type + * @return void + */ + public function setType($type) { + $this->type = $type; + } + + /** + * Returns the settings + * option1 => + * label => Red Shoes + * value => red + * selected => 1 + * + * @return string $settings + */ + public function getSettings() { + $div = t3lib_div::makeInstance('Tx_Powermail_Utility_Div'); + return $div->optionArray($this->settings); + } + + /** + * Sets the settings + * + * @param string $settings + * @return void + */ + public function setSettings($settings) { + $this->settings = $settings; + } + + /** + * Returns the path + * + * @return string $path + */ + public function getPath() { + return $this->path; + } + + /** + * Sets the path + * + * @param string $path + * @return void + */ + public function setPath($path) { + $this->path = $path; + } + + /** + * Returns the contentElement + * + * @return string $contentElement + */ + public function getContentElement() { + return $this->contentElement; + } + + /** + * Sets the contentElement + * + * @param string $contentElement + * @return void + */ + public function setContentElement($contentElement) { + $this->contentElement = $contentElement; + } + + /** + * Returns the text + * + * @return string $text + */ + public function getText() { + return $this->text; + } + + /** + * Sets the text + * + * @param string $text + * @return void + */ + public function setText($text) { + $this->text = $text; + } + + /** + * Returns the prefillValue + * + * @return string $prefillValue + */ + public function getPrefillValue() { + return $this->prefillValue; + } + + /** + * Sets the prefillValue + * + * @param string $prefillValue + * @return void + */ + public function setPrefillValue($prefillValue) { + $this->prefillValue = $prefillValue; + } + + /** + * Returns the validation + * + * @return integer $validation + */ + public function getValidation() { + return $this->validation; + } + + /** + * Sets the validation + * + * @param integer $validation + * @return void + */ + public function setValidation($validation) { + $this->validation = $validation; + } + + /** + * Returns the css + * + * @return integer $css + */ + public function getCss() { + return $this->css; + } + + /** + * Sets the css + * + * @param integer $css + * @return void + */ + public function setCss($css) { + $this->css = $css; + } + + /** + * Returns the feuserValue + * + * @return string $feuserValue + */ + public function getFeuserValue() { + return $this->feuserValue; + } + + /** + * Sets the feuserValue + * + * @param string $feuserValue + * @return void + */ + public function setFeuserValue($feuserValue) { + $this->feuserValue = $feuserValue; + } + + /** + * Returns the senderEmail + * + * @return string $senderEmail + */ + public function getSenderEmail() { + return $this->senderEmail; + } + + /** + * Sets the senderEmail + * + * @param string $senderEmail + * @return void + */ + public function setSenderEmail($senderEmail) { + $this->senderEmail = $senderEmail; + } + + /** + * Returns the senderName + * + * @return string $senderName + */ + public function getSenderName() { + return $this->senderName; + } + + /** + * Sets the senderName + * + * @param string $senderName + * @return void + */ + public function setSenderName($senderName) { + $this->senderName = $senderName; + } + + /** + * Returns the mandatory + * + * @return boolean $mandatory + */ + public function getMandatory() { + return $this->mandatory; + } + + /** + * Sets the mandatory + * + * @param boolean $mandatory + * @return void + */ + public function setMandatory($mandatory) { + $this->mandatory = $mandatory; + } + + /** + * Returns the marker + * + * @return string $marker + */ + public function getMarker() { + return $this->marker; + } + + /** + * Sets the marker + * + * @param string $marker + * @return void + */ + public function setMarker($marker) { + $this->marker = $marker; + } + + /** + * Returns the sorting + * + * @return integer $sorting + */ + public function getSorting() { + return $this->sorting; + } + + /** + * Sets the sorting + * + * @param integer $sorting + * @return void + */ + public function setSorting($sorting) { + $this->sorting = $sorting; + } + +} +?> \ No newline at end of file diff --git a/Classes/Domain/Model/Forms.php b/Classes/Domain/Model/Forms.php new file mode 100644 index 00000000..50292215 --- /dev/null +++ b/Classes/Domain/Model/Forms.php @@ -0,0 +1,134 @@ +, in2code.de + * + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + + +/** + * + * + * @package powermail + * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later + * + */ +class Tx_Powermail_Domain_Model_Forms extends Tx_Extbase_DomainObject_AbstractEntity { + + /** + * title + * + * @var string + * @validate NotEmpty + */ + protected $title; + + /** + * css + * + * @var integer + */ + protected $css; + + /** + * pages + * + * @var Tx_Extbase_Persistence_ObjectStorage + */ + protected $pages; + + /** + * __construct + * + * @return void + */ + public function __construct() { + + } + + /** + * Returns the title + * + * @return string $title + */ + public function getTitle() { + return $this->title; + } + + /** + * Sets the title + * + * @param string $title + * @return void + */ + public function setTitle($title) { + $this->title = $title; + } + + /** + * Returns the css + * + * @return integer $css + */ + public function getCss() { + return $this->css; + } + + /** + * Sets the css + * + * @param integer $css + * @return void + */ + public function setCss($css) { + $this->css = $css; + } + + /** + * Returns the pages + * + * @return Tx_Extbase_Persistence_ObjectStorage $pages + */ + public function getPages() { +// return $this->pages; + + // Workarround to get the pages sorted + $pageArray = array(); + foreach ($this->pages as $page) { + $pageArray[$page->getSorting()] = $page; + } + ksort($pageArray); + return $pageArray; + } + + /** + * Sets the pages + * + * @param Tx_Extbase_Persistence_ObjectStorage $pages + * @return void + */ + public function setPages(Tx_Extbase_Persistence_ObjectStorage $pages) { + $this->pages = $pages; + } + +} +?> \ No newline at end of file diff --git a/Classes/Domain/Model/Mails.php b/Classes/Domain/Model/Mails.php new file mode 100644 index 00000000..245049c2 --- /dev/null +++ b/Classes/Domain/Model/Mails.php @@ -0,0 +1,570 @@ +, in2code.de + * + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + + +/** + * + * + * @package powermail + * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later + * + */ +class Tx_Powermail_Domain_Model_Mails extends Tx_Extbase_DomainObject_AbstractEntity { + + /** + * senderName + * + * @var string + */ + protected $senderName; + + /** + * senderMail + * + * @var string + */ + protected $senderMail; + + /** + * subject + * + * @var string + */ + protected $subject; + + /** + * receiverMail + * + * @var string + */ + protected $receiverMail; + + /** + * body + * + * @var string + */ + protected $body; + + /** + * feuser + * + * @var string + */ + protected $feuser; + + /** + * senderIp + * + * @var string + */ + protected $senderIp; + + /** + * userAgent + * + * @var string + */ + protected $userAgent; + + /** + * time + * + * @var DateTime + */ + protected $time; + + /** + * form + * + * @var int + */ + protected $form; + + /** + * Powermail Fields + * + * @var Tx_Extbase_Persistence_ObjectStorage + */ + protected $answers; + + /** + * crdate + * + * @var DateTime + */ + protected $crdate; + + /** + * hidden + * + * @var bool + */ + protected $hidden; + + /** + * marketingSearchterm + * + * @var string + */ + protected $marketingSearchterm; + + /** + * marketingReferer + * + * @var string + */ + protected $marketingReferer; + + /** + * marketingPayedSearchResult + * + * @var string + */ + protected $marketingPayedSearchResult; + + /** + * marketingLanguage + * + * @var string + */ + protected $marketingLanguage; + + /** + * marketingBrowserLanguage + * + * @var string + */ + protected $marketingBrowserLanguage; + + /** + * marketingFunnel + * + * @var string + */ + protected $marketingFunnel; + + /** + * __construct + * + * @return void + */ + public function __construct() { + $this->initStorageObjects(); + } + + /** + * Initializes all Tx_Extbase_Persistence_ObjectStorage properties. + * + * @return void + */ + protected function initStorageObjects() { + $this->answer = new Tx_Extbase_Persistence_ObjectStorage(); + } + + /** + * Returns the senderName + * + * @return string $senderName + */ + public function getSenderName() { + return $this->senderName; + } + + /** + * Sets the senderName + * + * @param string $senderName + * @return void + */ + public function setSenderName($senderName) { + $this->senderName = $senderName; + } + + /** + * Returns the senderMail + * + * @return string $senderMail + */ + public function getSenderMail() { + return $this->senderMail; + } + + /** + * Sets the senderMail + * + * @param string $senderMail + * @return void + */ + public function setSenderMail($senderMail) { + $this->senderMail = $senderMail; + } + + /** + * Returns the subject + * + * @return string $subject + */ + public function getSubject() { + return $this->subject; + } + + /** + * Sets the subject + * + * @param string $subject + * @return void + */ + public function setSubject($subject) { + $this->subject = $subject; + } + + /** + * Returns the receiverMail + * + * @return string $receiverMail + */ + public function getReceiverMail() { + return $this->receiverMail; + } + + /** + * Sets the receiverMail + * + * @param string $receiverMail + * @return void + */ + public function setReceiverMail($receiverMail) { + $this->receiverMail = $receiverMail; + } + + /** + * Returns the body + * + * @return string $body + */ + public function getBody() { + return $this->body; + } + + /** + * Sets the body + * + * @param string $body + * @return void + */ + public function setBody($body) { + $this->body = $body; + } + + /** + * Returns the feuser + * + * @return string $feuser + */ + public function getFeuser() { + return $this->feuser; + } + + /** + * Sets the feuser + * + * @param string $feuser + * @return void + */ + public function setFeuser($feuser) { + $this->feuser = $feuser; + } + + /** + * Returns the time + * + * @return datetime $time + */ + public function getTime() { + return $this->time; + } + + /** + * Sets the time + * + * @param datetime time + * @return void + */ + public function setTime($time) { + $this->time = $time; + } + + /** + * Returns the senderIp + * + * @return string $senderIp + */ + public function getSenderIp() { + return $this->senderIp; + } + + /** + * Sets the senderIp + * + * @param string $senderIp + * @return void + */ + public function setSenderIp($senderIp) { + $this->senderIp = $senderIp; + } + + /** + * Returns the userAgent + * + * @return string $userAgent + */ + public function getUserAgent() { + return $this->userAgent; + } + + /** + * Sets the userAgent + * + * @param string $userAgent + * @return void + */ + public function setUserAgent($userAgent) { + $this->userAgent = $userAgent; + } + + /** + * Returns the form + * + * @return int $form + */ + public function getForm() { + return $this->form; + } + + /** + * Sets the form + * + * @param int $form + * @return void + */ + public function setForm($form) { + $this->form = $form; + } + + /** + * Returns the Answer + * + * @return Tx_Extbase_Persistence_ObjectStorage $answers + */ + public function getAnswers() { + return $this->answers; + } + + /** + * Sets the Answer + * + * @param Tx_Extbase_Persistence_ObjectStorage $answers + * @return void + */ + public function setAnswers(Tx_Extbase_Persistence_ObjectStorage $answers) { + $this->answers = $answers; + } + + /** + * Adds an Answer + * + * @param Tx_Powermail_Domain_Model_Answers $answer + * @return void + */ + public function addAnswer(Tx_Powermail_Domain_Model_Answers $answer) { + $this->answer->attach($answer); + } + + /** + * Removes an Answer + * + * @param Tx_Powermail_Domain_Model_Answers $answerToRemove The Fields to be removed + * @return void + */ + public function removeAnswer(Tx_Powermail_Domain_Model_Answers $answerToRemove) { + $this->answer->detach($answerToRemove); + } + + /** + * Returns the crdate + * + * @return DateTime $crdate + */ + public function getCrdate() { + return $this->crdate; + } + + /** + * Sets the crdate + * + * @param DateTime $crdate + * @return void + */ + public function setCrdate($crdate) { + $this->crdate = $crdate; + } + + /** + * Returns the hidden + * + * @return bool $hidden + */ + public function getHidden() { + return $this->hidden; + } + + /** + * Sets the hidden + * + * @param bool $hidden + * @return void + */ + public function setHidden($hidden) { + $this->hidden = $hidden; + } + + /** + * Returns the marketingSearchterm + * + * @return string $marketingSearchterm + */ + public function getMarketingSearchterm() { + return $this->marketingSearchterm; + } + + /** + * Sets the marketingSearchterm + * + * @param string $marketingSearchterm + * @return void + */ + public function setMarketingSearchterm($marketingSearchterm) { + $this->marketingSearchterm = $marketingSearchterm; + } + + /** + * Returns the marketingReferer + * + * @return string $marketingReferer + */ + public function getMarketingReferer() { + return $this->marketingReferer; + } + + /** + * Sets the marketingReferer + * + * @param string $marketingReferer + * @return void + */ + public function setMarketingReferer($marketingReferer) { + $this->marketingReferer = $marketingReferer; + } + + /** + * Returns the marketingPayedSearchResult + * + * @return string $marketingPayedSearchResult + */ + public function getMarketingPayedSearchResult() { + return $this->marketingPayedSearchResult; + } + + /** + * Sets the marketingPayedSearchResult + * + * @param string $marketingPayedSearchResult + * @return void + */ + public function setMarketingPayedSearchResult($marketingPayedSearchResult) { + $this->marketingPayedSearchResult = $marketingPayedSearchResult; + } + + /** + * Returns the marketingLanguage + * + * @return string $marketingLanguage + */ + public function getMarketingLanguage() { + return $this->marketingLanguage; + } + + /** + * Sets the marketingLanguage + * + * @param string $marketingLanguage + * @return void + */ + public function setMarketingLanguage($marketingLanguage) { + $this->marketingLanguage = $marketingLanguage; + } + + /** + * Returns the marketingBrowserLanguage + * + * @return string $marketingBrowserLanguage + */ + public function getMarketingBrowserLanguage() { + return $this->marketingBrowserLanguage; + } + + /** + * Sets the marketingBrowserLanguage + * + * @param string $marketingBrowserLanguage + * @return void + */ + public function setMarketingBrowserLanguage($marketingBrowserLanguage) { + $this->marketingBrowserLanguage = $marketingBrowserLanguage; + } + + /** + * Returns the marketingFunnel + * + * @return string $marketingFunnel + */ + public function getMarketingFunnel() { + return unserialize($this->marketingFunnel); + } + + /** + * Sets the marketingFunnel + * + * @param string $marketingFunnel + * @return void + */ + public function setMarketingFunnel($marketingFunnel) { + $this->marketingFunnel = serialize($marketingFunnel); + } + +} +?> \ No newline at end of file diff --git a/Classes/Domain/Model/Pages.php b/Classes/Domain/Model/Pages.php new file mode 100644 index 00000000..66289ded --- /dev/null +++ b/Classes/Domain/Model/Pages.php @@ -0,0 +1,195 @@ +, in2code.de + * + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + + +/** + * + * + * @package powermail + * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later + * + */ +class Tx_Powermail_Domain_Model_Pages extends Tx_Extbase_DomainObject_AbstractEntity { + + /** + * title + * + * @var string + * @validate NotEmpty + */ + protected $title; + + /** + * css + * + * @var integer + */ + protected $css; + + /** + * Powermail Fields + * + * @var Tx_Extbase_Persistence_ObjectStorage + */ + protected $fields; + + /** + * sorting + * + * @var integer + */ + protected $sorting; + + /** + * __construct + * + * @return void + */ + public function __construct() { + //Do not remove the next line: It would break the functionality + $this->initStorageObjects(); + } + + /** + * Initializes all Tx_Extbase_Persistence_ObjectStorage properties. + * + * @return void + */ + protected function initStorageObjects() { + /** + * Do not modify this method! + * It will be rewritten on each save in the extension builder + * You may modify the constructor of this class instead + */ + $this->fields = new Tx_Extbase_Persistence_ObjectStorage(); + } + + /** + * Returns the title + * + * @return string $title + */ + public function getTitle() { + return $this->title; + } + + /** + * Sets the title + * + * @param string $title + * @return void + */ + public function setTitle($title) { + $this->title = $title; + } + + /** + * Returns the css + * + * @return integer $css + */ + public function getCss() { + return $this->css; + } + + /** + * Sets the css + * + * @param integer $css + * @return void + */ + public function setCss($css) { + $this->css = $css; + } + + /** + * Adds a Fields + * + * @param Tx_Powermail_Domain_Model_Fields $field + * @return void + */ + public function addField(Tx_Powermail_Domain_Model_Fields $field) { + $this->fields->attach($field); + } + + /** + * Removes a Fields + * + * @param Tx_Powermail_Domain_Model_Fields $fieldToRemove The Fields to be removed + * @return void + */ + public function removeField(Tx_Powermail_Domain_Model_Fields $fieldToRemove) { + $this->fields->detach($fieldToRemove); + } + + /** + * Returns the fields + * + * @return Tx_Extbase_Persistence_ObjectStorage $fields + */ + public function getFields() { +// return $this->fields; + + // Workarround to get the fields sorted + $fieldArray = array(); + foreach ($this->fields as $field) { + $fieldArray[$field->getSorting()] = $field; + } + ksort($fieldArray); + return $fieldArray; + } + + /** + * Sets the fields + * + * @param Tx_Extbase_Persistence_ObjectStorage $fields + * @return void + */ + public function setFields(Tx_Extbase_Persistence_ObjectStorage $fields) { + $this->fields = $fields; + } + + /** + * Returns the sorting + * + * @return integer $sorting + */ + public function getSorting() { + return $this->sorting; + } + + /** + * Sets the sorting + * + * @param integer $sorting + * @return void + */ + public function setSorting($sorting) { + $this->sorting = $sorting; + } + +} +?> \ No newline at end of file diff --git a/Classes/Domain/Model/User.php b/Classes/Domain/Model/User.php new file mode 100644 index 00000000..210d7db5 --- /dev/null +++ b/Classes/Domain/Model/User.php @@ -0,0 +1,45 @@ +, in2code.de + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + + +/** + * Maps FE_Users Table + * + * @package powermail + * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later + * + */ + +class Tx_Powermail_Domain_Model_User extends Tx_Extbase_Domain_Model_FrontendUser { + + /** + * __construct + * + * @return void + */ + public function __construct() { + parent::__construct(); + } +} \ No newline at end of file diff --git a/Classes/Domain/Model/UserGroup.php b/Classes/Domain/Model/UserGroup.php new file mode 100644 index 00000000..8682d334 --- /dev/null +++ b/Classes/Domain/Model/UserGroup.php @@ -0,0 +1,36 @@ +, in2code.de + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + + +/** + * Maps FE_Users Table + * + * @package powermail + * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later + * + */ + +class Tx_Powermail_Domain_Model_UserGroup extends Tx_Extbase_Domain_Model_FrontendUserGroup { +} \ No newline at end of file diff --git a/Classes/Domain/Repository/AnswersRepository.php b/Classes/Domain/Repository/AnswersRepository.php new file mode 100644 index 00000000..96ee3c81 --- /dev/null +++ b/Classes/Domain/Repository/AnswersRepository.php @@ -0,0 +1,60 @@ + + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + + +/** + * + * + * @package powermail + * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later + * + */ +class Tx_Powermail_Domain_Repository_AnswersRepository extends Tx_Extbase_Persistence_Repository { + + /** + * Find single Answer by field uid and mail uid + * + * @param int Field Uid + * @param int Mail Uid + * @return Query Object + */ + public function findByFieldAndMail($fieldUid, $mailUid) { + $query = $this->createQuery(); // initialize query + $query->getQuerySettings()->setRespectStoragePage(FALSE); // disable storage pid + + $and = array( + $query->equals('mail', $mailUid), + $query->equals('field', $fieldUid) + ); + + $constraint = $query->logicalAnd($and); + $query->matching($constraint); + $query->setLimit(1); + return $query->execute()->getFirst(); + } + +} + +?> \ No newline at end of file diff --git a/Classes/Domain/Repository/FieldsRepository.php b/Classes/Domain/Repository/FieldsRepository.php new file mode 100644 index 00000000..b773806e --- /dev/null +++ b/Classes/Domain/Repository/FieldsRepository.php @@ -0,0 +1,37 @@ + + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + + +/** + * + * + * @package powermail + * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later + * + */ +class Tx_Powermail_Domain_Repository_FieldsRepository extends Tx_Extbase_Persistence_Repository { +} + +?> \ No newline at end of file diff --git a/Classes/Domain/Repository/FormsRepository.php b/Classes/Domain/Repository/FormsRepository.php new file mode 100644 index 00000000..148c41cf --- /dev/null +++ b/Classes/Domain/Repository/FormsRepository.php @@ -0,0 +1,89 @@ + + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + + +/** + * + * + * @package powermail + * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later + * + */ +class Tx_Powermail_Domain_Repository_FormsRepository extends Tx_Extbase_Persistence_Repository { + + /** + * Find Form objects by its given uids + * + * @param $uids string commaseparated list of uids + * @return void + */ + public function findByUids($uids) { + $query = $this->createQuery(); + $query->getQuerySettings()->setRespectStoragePage(FALSE); // disable storage pid + + $and = array( + $query->greaterThan('uid', 0), // always true like 1=1 + $query->in('uid', t3lib_div::trimExplode(',', $uids, 1)) + ); + + $constraint = $query->logicalAnd($and); // create where object with AND + $query->matching($constraint); // use constraint + + // set sorting + // $query->setOrderings( + // array( + // 'date_start' => Tx_Extbase_Persistence_QueryInterface::ORDER_DESCENDING, + // 'languages.titel' => Tx_Extbase_Persistence_QueryInterface::ORDER_DESCENDING, + // ) + // ); + + $result = $query->execute(); + return $result; + } + + /** + * Returns form with captcha from given UID + * + * @param $uid int Form Uid + * @return Query Object + */ + public function hasCaptcha($uid) { + $query = $this->createQuery(); + $query->getQuerySettings()->setRespectStoragePage(FALSE); // disable storage pid + + $and = array( + $query->equals('uid', $uid), + $query->equals('pages.fields.type', 'captcha') + ); + + $constraint = $query->logicalAnd($and); // create where object with AND + $query->matching($constraint); // use constraint + + $result = $query->execute(); + return $result; + } +} + +?> \ No newline at end of file diff --git a/Classes/Domain/Repository/MailsRepository.php b/Classes/Domain/Repository/MailsRepository.php new file mode 100644 index 00000000..5b5b4291 --- /dev/null +++ b/Classes/Domain/Repository/MailsRepository.php @@ -0,0 +1,325 @@ + + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + + +/** + * + * + * @package powermail + * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later + * + */ +class Tx_Powermail_Domain_Repository_MailsRepository extends Tx_Extbase_Persistence_Repository { + + /** + * Find all mails in given PID (BE List) + * + * @param int Page Id + * @param array TypoScript Config Array + * @param array Plugin Variables + * @return Query Object + */ + public function findAllInPid($pid = 0, $settings = array(), $piVars = array()) { + // settings + $query = $this->createQuery(); // initialize query + $query->getQuerySettings()->setRespectStoragePage(FALSE); // disable storage pid + $query->getQuerySettings()->setRespectEnableFields(FALSE); // show also hidden + + // initial filter + $and = array( + $query->equals('deleted', 0), + $query->equals('pid', $pid) + ); + + // filter + if (isset($piVars['filter'])) { + foreach ((array) $piVars['filter'] as $field => $value) { + + // Standard Fields + if (!is_array($value)) { + // Fulltext Search + if ($field == 'all' && !empty($value)) { + $or = array( + $query->like('sender_name', '%' . $value . '%'), + $query->like('sender_mail', '%' . $value . '%'), + $query->like('subject', '%' . $value . '%'), + $query->like('receiver_mail', '%' . $value . '%'), + $query->like('sender_ip', '%' . $value . '%'), + $query->like('answers.value', '%' . $value . '%') + ); + $and[] = $query->logicalOr($or); + } + + // Time Filter Start + elseif ($field == 'start' && !empty($value)) { + $and[] = $query->greaterThan('crdate', strtotime($value)); + } + + // Time Filter Stop + elseif ($field == 'stop' && !empty($value)) { + $and[] = $query->lessThan('crdate', strtotime($value)); + } + + // Hidden Filter + elseif ($field == 'hidden' && !empty($value)) { + $and[] = $query->equals($field, ($value-1)); + } + + // Other Fields + elseif (!empty($value)) { + $and[] = $query->like($field, '%' . $value . '%'); + } + } + + + // Answer Fields + if (is_array($value)) { + foreach ((array) $value as $answerField => $answerValue) { + if (empty($answerValue)) { + continue; + } + $and[] = $query->equals('answers.field', $answerField); + $and[] = $query->like('answers.value', '%' . $answerValue . '%'); + } + } + } + } + + // create constraint + $constraint = $query->logicalAnd($and); + $query->matching($constraint); + + // set sorting + $sortby = ($settings['sortby'] ? $settings['sortby'] : 'crdate'); + $order = ($settings['order'] == 'asc' ? Tx_Extbase_Persistence_QueryInterface::ORDER_ASCENDING : Tx_Extbase_Persistence_QueryInterface::ORDER_DESCENDING); + if (isset($piVars['sorting'])) { + foreach ((array) $piVars['sorting'] as $key => $value) { + $sortby = $key; + $order = ($value == 'asc' ? Tx_Extbase_Persistence_QueryInterface::ORDER_ASCENDING : Tx_Extbase_Persistence_QueryInterface::ORDER_DESCENDING); + break; + } + } + $query->setOrderings( + array( + $sortby => $order + ) + ); + + // go for it + $mails = $query->execute(); + return $mails; + } + + /** + * Find first mail in given PID + * + * @param int Page Id + * @return Query Object + */ + public function findFirstInPid($pid = 0) { + // settings + $query = $this->createQuery(); // initialize query + $query->getQuerySettings()->setRespectStoragePage(FALSE); // disable storage pid + $query->getQuerySettings()->setRespectEnableFields(FALSE); // show also hidden + + // initial filter + $and = array( + $query->equals('deleted', 0), + $query->equals('pid', $pid) + ); + + // create constraint + $constraint = $query->logicalAnd($and); + $query->matching($constraint); + + // sorting + $query->setOrderings( + array( + 'crdate' => Tx_Extbase_Persistence_QueryInterface::ORDER_DESCENDING + ) + ); + + // set limit + $query->setLimit(1); + + // go for it + $mails = $query->execute(); + return $mails->getFirst(); + } + + /** + * Find mails by given UID (also hidden and don't care about starting page) + * + * @param integer Mail uid + * @return Query Object + */ + public function findByUid($uid) { + $query = $this->createQuery(); // initialize query + $query->getQuerySettings()->setRespectStoragePage(FALSE); // disable storage pid + $query->getQuerySettings()->setRespectEnableFields(FALSE); // show also hidden + return $query->matching($query->equals('uid', $uid))->execute()->getFirst(); + } + + /** + * Find mails in UID List + * + * @param string Commaseparated UID List of mails + * @param array Sorting array('field' => 'asc') + * @return Query Object + */ + public function findByUidList($uidList, $sorting = array()) { + // settings + $uids = t3lib_div::trimExplode(',', $uidList, 1); + $query = $this->createQuery(); // initialize query + $query->getQuerySettings()->setRespectStoragePage(FALSE); // disable storage pid + $query->getQuerySettings()->setRespectEnableFields(FALSE); // show also hidden + + // initial filter + $and = array( + $query->equals('deleted', 0), + $query->in('uid', $uids) + ); + + // create constraint + $constraint = $query->logicalAnd($and); + $query->matching($constraint); + + // sorting + $query->setOrderings( + array( + 'crdate' => Tx_Extbase_Persistence_QueryInterface::ORDER_DESCENDING + ) + ); + foreach ((array) $sorting as $field => $order) { + $query->setOrderings( + array( + $field => ($order == 'asc' ? Tx_Extbase_Persistence_QueryInterface::ORDER_ASCENDING : Tx_Extbase_Persistence_QueryInterface::ORDER_DESCENDING) + ) + ); + } + + // go for it + $mails = $query->execute(); + return $mails; + } + + /** + * Query for Pi2 + * + * @param array $settings TypoScript Settings + * @param array $piVars Plugin Variables + * @return void + */ + public function findListBySettings($settings, $piVars) { + $query = $this->createQuery(); // initialize query + $query->getQuerySettings()->setRespectStoragePage(FALSE); // disable storage pid + + + /** + * FILTER start + */ + $and = array( + $query->greaterThan('uid', 0) + ); + + // FILTER: form + if (intval($settings['main']['form']) > 0) { + $and[] = $query->equals('form', $settings['main']['form']); + } + + // FILTER: pid + if (intval($settings['main']['pid']) > 0) { + $and[] = $query->equals('pid', $settings['main']['pid']); + } + + // FILTER: delta + if (intval($settings['list']['delta']) > 0) { + $and[] = $query->greaterThan('crdate', (time() - $settings['list']['delta'])); + } + + // FILTER: showownonly + if ($settings['list']['showownonly']) { + $and[] = $query->equals('feuser', $GLOBALS['TSFE']->fe_user->user['uid']); + } + + // FILTER: abc + if (isset($piVars['filter']['abc'])) { + $and[] = $query->equals('answers.field', $settings['search']['abc']); + $and[] = $query->like('answers.value', $piVars['filter']['abc'] . '%'); + } + + // FILTER: field + if (isset($piVars['filter'])) { + if (isset($piVars['filter']['_all'])) { // fulltext + + $and[] = $query->like('answers.value', '%' . $piVars['filter']['_all'] . '%'); + + } else { // or single field search + + $filter = array(); + foreach ((array) $piVars['filter'] as $field => $value) { + if (is_numeric($field) && !empty($value)) { + $filterAnd = array( + $query->equals('answers.field', $field), + $query->like('answers.value', '%' . $value . '%') + ); + $filter[] = $query->logicalAnd($filterAnd); + } + } + + if (count($filter) > 0) { + $and[] = $query->logicalOr($filter); // TODO AND + } + + } + + } + + // FILTER: create constraint + $constraint = $query->logicalAnd($and); + $query->matching($constraint); + + + // sorting + $query->setOrderings( + array( + 'crdate' => Tx_Extbase_Persistence_QueryInterface::ORDER_DESCENDING + ) + ); + + // set limit + if (intval($settings['list']['limit']) > 0) { + $query->setLimit(intval($settings['list']['limit'])); + } + + /** + * FINISH + */ + $mails = $query->execute(); + return $mails; + } +} + +?> \ No newline at end of file diff --git a/Classes/Domain/Repository/PagesRepository.php b/Classes/Domain/Repository/PagesRepository.php new file mode 100644 index 00000000..2bad9a6c --- /dev/null +++ b/Classes/Domain/Repository/PagesRepository.php @@ -0,0 +1,57 @@ +, in2code.de + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + + +/** + * + * + * @package powermail + * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later + * + */ +class Tx_Powermail_Domain_Repository_PagesRepository extends Tx_Extbase_Persistence_Repository { + + /** + * Get title from table "pages" in TYPO3 + * + * @param $uid + */ + public function getPageNameFromUid($uid) { + $query = $this->createQuery(); + + // create sql statement + $sql = 'select title'; + $sql .= ' from pages'; + $sql .= ' where uid = ' . intval($uid); + $sql .= ' limit 1'; + + $query->getQuerySettings()->setReturnRawQueryResult(true); //this generates an array and makes it much slower + $result = $query->statement($sql)->execute(); + + return $result[0]['title']; + } +} + +?> \ No newline at end of file diff --git a/Classes/Domain/Repository/UserRepository.php b/Classes/Domain/Repository/UserRepository.php new file mode 100644 index 00000000..1b7f47cc --- /dev/null +++ b/Classes/Domain/Repository/UserRepository.php @@ -0,0 +1,58 @@ +, in2code.de + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + + +/** + * FE_User Repository + * + * @package powermail + * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later + */ +class Tx_Powermail_Domain_Repository_UserRepository extends Tx_Extbase_Persistence_Repository { + + /** + * Find FE_Users by their group + * + * @param $uid int fe_groups UID + * @return query result + */ + public function findByUsergroup($uid) { + $query = $this->createQuery(); + $query->getQuerySettings()->setRespectStoragePage(FALSE); // disable storage pid + + $and = array( + $query->greaterThan('uid', 0), // always true like 1=1 + $query->contains('usergroup', $uid) + ); + + $constraint = $query->logicalAnd($and); // create where object with AND + $query->matching($constraint); // use constraint + + $result = $query->execute(); + return $result; + } +} + +?> \ No newline at end of file diff --git a/Classes/Domain/Validator/CaptchaValidator.php b/Classes/Domain/Validator/CaptchaValidator.php new file mode 100644 index 00000000..4e81889a --- /dev/null +++ b/Classes/Domain/Validator/CaptchaValidator.php @@ -0,0 +1,119 @@ +formHasCaptcha()) { + return $this->isValid; + } + + foreach ((array) $params as $uid => $value) { + // get current field values + $field = $this->fieldsRepository->findByUid($uid); + + // if not a captcha field + if ($field->getType() != 'captcha') { + continue; + } + + // if field wrong code given - set error + $captcha = t3lib_div::makeInstance('Tx_Powermail_Utility_CalculatingCaptcha'); + if (!$captcha->validCode($value, $this->clearSession)) { + $this->addError('captcha', $uid); + $this->isValid = false; + } + + // Captcha field found + $this->captchaFound = true; + } + + if ($this->captchaFound) { + return $this->isValid; + } else { + // if no captcha vars given + $this->addError('captcha', 0); + return false; + } + } + + /** + * Checks if given form has a captcha + */ + private function formHasCaptcha() { + $gp = t3lib_div::_GP('tx_powermail_pi1'); + $formUid = $gp['form']; + $form = $this->formsRepository->hasCaptcha($formUid); + return count($form); + } + + /** + * Constructor + * + * @return void + */ + public function __construct() { + $piVars = t3lib_div::_GP('tx_powermail_pi1'); + $this->clearSession = ($piVars['__referrer']['actionName'] == 'confirmation' ? true : false); + } + + /** + * injectFieldsRepository + * + * @param Tx_Powermail_Domain_Repository_FieldsRepository $fieldsRepository + * @return void + */ + public function injectFieldsRepository(Tx_Powermail_Domain_Repository_FieldsRepository $fieldsRepository) { + $this->fieldsRepository = $fieldsRepository; + } + + /** + * injectFormsRepository + * + * @param Tx_Powermail_Domain_Repository_FormsRepository $formsRepository + * @return void + */ + public function injectFormsRepository(Tx_Powermail_Domain_Repository_FormsRepository $formsRepository) { + $this->formsRepository = $formsRepository; + } +} +?> \ No newline at end of file diff --git a/Classes/Domain/Validator/MandatoryValidator.php b/Classes/Domain/Validator/MandatoryValidator.php new file mode 100644 index 00000000..e97f9446 --- /dev/null +++ b/Classes/Domain/Validator/MandatoryValidator.php @@ -0,0 +1,75 @@ +formsRepository->findByUid($formUid); + if (!method_exists($form, 'getPages')) { + return $this->isValid; + } + + foreach ($form->getPages() as $page) { // every page in current form + foreach ($page->getFields() as $field) { // every field in current page + + // if not a mandatory field + if (!$field->getMandatory()) { + continue; + } + + // set error + if (is_array($params[$field->getUid()])) { + $empty = 1; + foreach ($params[$field->getUid()] as $value) { + if (!empty($value)) { + $empty = 0; + break; + } + } + if ($empty) { + $this->addError('mandatory', $field->getUid()); + $this->isValid = false; + } + } else { + if (empty($params[$field->getUid()])) { + $this->addError('mandatory', $field->getUid()); + $this->isValid = false; + } + } + } + } + + return $this->isValid; + } + + /** + * injectFormsRepository + * + * @param Tx_Powermail_Domain_Repository_FormsRepository $formsRepository + * @return void + */ + public function injectFormsRepository(Tx_Powermail_Domain_Repository_FormsRepository $formsRepository) { + $this->formsRepository = $formsRepository; + } +} +?> \ No newline at end of file diff --git a/Classes/Domain/Validator/StringValidator.php b/Classes/Domain/Validator/StringValidator.php new file mode 100644 index 00000000..00884823 --- /dev/null +++ b/Classes/Domain/Validator/StringValidator.php @@ -0,0 +1,84 @@ + FILTER_VALIDATE_EMAIL, // email + 2 => FILTER_VALIDATE_URL, // url + 3 => '/[^0-9+ .]/', // phone + 4 => FILTER_SANITIZE_NUMBER_INT, // numbers + 5 => '/[^a-zA-Z]/', // letters + ); + + /** + * Return variable + * + * @var bool + */ + private $isValid = true; + + /** + * Validation of given Params + * + * @param $params + * @return bool + */ + public function isValid($params) { + + foreach ((array) $params as $uid => $value) { + // get current field values + $field = $this->fieldsRepository->findByUid($uid); + + // if mandatory field not activated + if (!$field->getValidation()) { + continue; + } + + // if regex or filter found + if (isset($this->regEx[$field->getValidation()])) { + + if (is_numeric($this->regEx[$field->getValidation()])) { // filter + + if (!filter_var($value, $this->regEx[$field->getValidation()])) { // check failed + $this->addError('validation', $uid); + $this->isValid = false; + } + + } else { // regex + + if (preg_replace($this->regEx[$field->getValidation()], '', $value) != $value) { // check failed + $this->addError('validation', $uid); + $this->isValid = false; + } + + } + } + + } + + return $this->isValid; + } + + /** + * injectFieldsRepository + * + * @param Tx_Powermail_Domain_Repository_FieldsRepository $fieldsRepository + * @return void + */ + public function injectFieldsRepository(Tx_Powermail_Domain_Repository_FieldsRepository $fieldsRepository) { + $this->fieldsRepository = $fieldsRepository; + } +} +?> \ No newline at end of file diff --git a/Classes/Domain/Validator/UploadValidator.php b/Classes/Domain/Validator/UploadValidator.php new file mode 100644 index 00000000..7d792519 --- /dev/null +++ b/Classes/Domain/Validator/UploadValidator.php @@ -0,0 +1,151 @@ +, in2code.de + * + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + + +/** + * Class for uploading files and check if they are valide + * + * @package powermail + * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later + * + */ +class Tx_Powermail_Domain_Validator_UploadValidator extends Tx_Extbase_Validation_Validator_AbstractValidator { + + /** + * BasicFileFunctions + */ + public $basicFileFunctions; + + /** + * TS + */ + public $settings; + + /** + * configurationManager + */ + public $configurationManager; + + /** + * Return variable + * + * @var bool + */ + private $isValid = true; + + /** + * Validation of given Params + * + * @param $params + * @return bool + */ + public function isValid($field) { + if (isset($_FILES['tx_powermail_pi1']['name']['field'])) { + foreach ($_FILES['tx_powermail_pi1']['name']['field'] as $uid => $filename) { + + // if no file given + if (empty($filename)) { + continue; + } + + // Check extension + if (!$this->checkExtension($filename, $uid)) { + continue; + } + + // Check filesize + if (!$this->checkFilesize($uid)) { + continue; + } + + // create new filename with absolute path + $newFile = $this->basicFileFunctions->getUniqueName($filename, t3lib_div::getFileAbsFileName($this->settings['misc.']['file.']['folder'])); +// $GLOBALS['powermail']['file'][$uid] = array( +// 'filename' => $filename, +// 'newFilename' => basename($newFile) +// ); + $_FILES['tx_powermail_pi1']['name']['field'][$uid] = basename($newFile); + if (!t3lib_div::upload_copy_move($_FILES['tx_powermail_pi1']['tmp_name']['field'][$uid], $newFile)) { + $this->addError('upload_error', $uid); + $this->isValid = false; + } + } + } + return $this->isValid; + } + + /** + * Check filesize of given file + * + * @param int Field uid + * @return bool If file is not larger than allowed + */ + private function checkFilesize($uid) { + if (filesize($_FILES['tx_powermail_pi1']['tmp_name']['field'][$uid]) > $this->settings['misc.']['file.']['size']) { + $this->addError('upload_size', $uid); + $this->isValid = false; + return false; + } + return true; + } + + /** + * Check extension of given filename + * + * @param string Filename like (upload.txt) + * @param int Field uid + * @return bool If Extension is allowed via ts + */ + private function checkExtension($filename, $uid) { + $fileInfo = pathinfo($filename); + if (!isset($fileInfo['extension']) || !t3lib_div::inList($this->settings['misc.']['file.']['extension'], $fileInfo['extension'])) { + $this->addError('upload_extension', $uid); + $this->isValid = false; + return false; + } + return true; + } + + /** + * @param Tx_Extbase_Configuration_ConfigurationManagerInterface $configurationManager + * @return void + */ + public function injectConfigurationManager(Tx_Extbase_Configuration_ConfigurationManagerInterface $configurationManager) { + $this->configurationManager = $configurationManager; + $typoScriptSetup = $this->configurationManager->getConfiguration(Tx_Extbase_Configuration_ConfigurationManagerInterface::CONFIGURATION_TYPE_FULL_TYPOSCRIPT); + $this->settings = $typoScriptSetup['plugin.']['tx_powermail.']['settings.']['setup.']; + } + + /** + * Constructor + * + * @return void + */ + public function __construct() { + $this->basicFileFunctions = t3lib_div::makeInstance('t3lib_basicFileFunctions'); + } +} + +?> \ No newline at end of file diff --git a/Classes/Utility/CalculatingCaptcha.php b/Classes/Utility/CalculatingCaptcha.php new file mode 100644 index 00000000..30d5a1e7 --- /dev/null +++ b/Classes/Utility/CalculatingCaptcha.php @@ -0,0 +1,164 @@ +, in2code.de + * + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + + +/** + * Div is a class for a collection of misc functions + * + * @package powermail + * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later + * + */ +class Tx_Powermail_Utility_CalculatingCaptcha { + + /** + * @var array TypoScript + */ + private $conf; + + /** + * @var string New Image Path + */ + public $captchaImage = 'EXT:powermail/Resources/Public/Image/captcha.png'; // Path to captcha image + + /** + * Render Link to Captcha Image + */ + public function render($conf) { + $this->conf = $conf; + $string = $this->getString(); // get random string for captcha + $content = $this->createImage($string); // create image + return $content; + } + + /** + * Check if given code is correct + * + * @param string $code String to compare + * @param boolean $clearSession Flag if session should be cleared or not + * @return boolean + */ + public function validCode($code, $clearSession = 1) { + $valid = 0; + if (intval($code) == $GLOBALS['TSFE']->fe_user->sesData['powermail_captcha_value'] && !empty($code)) { // if code is set and equal to session value + + // clear session + if ($clearSession) { + $GLOBALS['TSFE']->fe_user->setKey('ses', 'powermail_captcha_value', ''); + $GLOBALS['TSFE']->storeSessionData(); + } + + // Set error code + $valid = 1; + } + return $valid; + } + + /** + * Create Image File + * + * @param $content + * @return string Image HTML Code + */ + private function createImage($content) { + $subfolder = ''; + if (t3lib_div::getIndpEnv('TYPO3_REQUEST_HOST') . '/' != t3lib_div::getIndpEnv('TYPO3_SITE_URL')) { // if request_host is different to site_url (TYPO3 runs in a subfolder) + $subfolder = str_replace(t3lib_div::getIndpEnv('TYPO3_REQUEST_HOST') . '/', '', t3lib_div::getIndpEnv('TYPO3_SITE_URL')); // get the folder (like "subfolder/") + } + $startimage = t3lib_div::getIndpEnv('TYPO3_DOCUMENT_ROOT') . '/' . $subfolder . $GLOBALS['TSFE']->tmpl->getFileName($this->conf['captcha.']['default.']['image']); // background image + + if (!is_file($startimage)) { // if file is correct + return 'Error: No Image found'; + } + + $img = ImageCreateFromPNG($startimage); // Backgroundimage + $config = array(); + $config['color_rgb'] = sscanf($this->conf['captcha.']['default.']['textColor'], '#%2x%2x%2x'); // change HEX color to RGB + $config['color'] = ImageColorAllocate($img, $config['color_rgb'][0], $config['color_rgb'][1], $config['color_rgb'][2]); // Font color + $config['font'] = t3lib_div::getIndpEnv('TYPO3_DOCUMENT_ROOT') . '/' . $subfolder . $GLOBALS['TSFE']->tmpl->getFileName($this->conf['captcha.']['default.']['font']); // fontfile + $config['fontsize'] = $this->conf['captcha.']['default.']['textSize']; // Fontsize + $config['angle'] = t3lib_div::trimExplode(',', $this->conf['captcha.']['default.']['textAngle'], 1); // give me the angles for the font + $config['fontangle'] = mt_rand($config['angle'][0], $config['angle'][1]); // random angle + $config['distance_hor'] = t3lib_div::trimExplode(',', $this->conf['captcha.']['default.']['distanceHor'], 1); // give me the horizontal distances + $config['fontdistance_hor'] = mt_rand($config['distance_hor'][0], $config['distance_hor'][1]); // random distance + $config['distance_vert'] = t3lib_div::trimExplode(',', $this->conf['captcha.']['default.']['distanceVer'], 1); // give me the vertical distances + $config['fontdistance_vert'] = mt_rand($config['distance_vert'][0], $config['distance_vert'][1]); // random distance + imagettftext($img, $config['fontsize'], $config['fontangle'], $config['fontdistance_hor'], $config['fontdistance_vert'], $config['color'], $config['font'], $content); // add text to image + imagepng($img, t3lib_div::getIndpEnv('TYPO3_DOCUMENT_ROOT') . '/' . $subfolder . $GLOBALS['TSFE']->tmpl->getFileName($this->captchaImage)); // save image file + imagedestroy($img); // delete temp image + + return $GLOBALS['TSFE']->tmpl->getFileName($this->captchaImage) . '?hash=' . time(); // path to new image + } + + /** + * Create Random String for Captcha Image + * + * @return string + */ + private function getString() { + // config + // 1. Get random numbers + $op = mt_rand(0, 1); // operator +/- + for ($i = 0; $i < 100; $i++) { // loop max. 100 times + $number1 = mt_rand(0, 15); // random number 1 + $number2 = mt_rand(0, 15); // random number 2 + + // don't want negative numbers + if ($op != 1 || $number1 > $number2) { + break; + } + } + switch ($op) { // give me the operator + case 0: + $operator = '+'; // operator + $result = $number1 + $number2; // result + break; + + case 1: + $operator = '-'; + $result = $number1 - $number2; // result + break; + + case 2: + $operator = 'x'; + $result = $number1 * $number2; // result + break; + + case 3: + $operator = ':'; + $result = $number1 / $number2; // result + break; + } + + // Save result to session + $GLOBALS['TSFE']->fe_user->setKey('ses', 'powermail_captcha_value', $result); // Generate Session with result + $GLOBALS['TSFE']->storeSessionData(); // Save session + + return $number1 . ' ' . $operator . ' ' . $number2; + } + +} +?> \ No newline at end of file diff --git a/Classes/Utility/Div.php b/Classes/Utility/Div.php new file mode 100644 index 00000000..0b6868f6 --- /dev/null +++ b/Classes/Utility/Div.php @@ -0,0 +1,961 @@ +, in2code.de + * + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + + +/** + * Div is a class for a collection of misc functions + * + * @package powermail + * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later + * + */ +class Tx_Powermail_Utility_Div { + + /** + * Get Field Uid List from given Form Uid + * + * @param integer Form Uid + * return array Fieldlist + */ + public function getFieldsFromForm($formUid) { + $formsRepository = t3lib_div::makeInstance('Tx_Powermail_Domain_Repository_FormsRepository'); + $fields = array(); + $form = $formsRepository->findByUid($formUid); + foreach ($form->getPages() as $page) { + foreach ($page->getFields() as $field) { + $fields[] = $field->getUid(); + } + } + + return $fields; + } + + /** + * Returns sendername from a couple of arguments + * + * @param array Given Params + * @return string Sender Name + */ + public function getSenderNameFromArguments($fields) { + if (!is_array($fields)) { + return ''; + } + + $name = ''; + $fieldsRepository = t3lib_div::makeInstance('Tx_Powermail_Domain_Repository_FieldsRepository'); + foreach ($fields as $uid => $value) { + $field = $fieldsRepository->findByUid($uid); // get field + if ($field->getSenderName()) { + $name .= $value . ' '; + } + } + + if (!$name) { + $name = Tx_Extbase_Utility_Localization::translate('error_no_sender_name', 'powermail'); + } + return trim($name); + } + + /** + * Returns senderemail from a couple of arguments + * + * @param array Given Params + * @return string Sender Email + */ + public function getSenderMailFromArguments($fields) { + if (!is_array($fields)) { + return ''; + } + + $email = ''; + $fieldsRepository = t3lib_div::makeInstance('Tx_Powermail_Domain_Repository_FieldsRepository'); + foreach ($fields as $uid => $value) { + $field = $fieldsRepository->findByUid($uid); // get field + if (method_exists($field, 'getSenderEmail') && $field->getSenderEmail() && t3lib_div::validEmail($value)) { + $email = $value; + break; + } + } + + if (!$email) { + $email = Tx_Extbase_Utility_Localization::translate('error_no_sender_email', 'powermail'); + } + return $email; + } + + /** + * Save current timestamp to session + * + * @param integer Form uid + * @return void + */ + public function saveFormStartInSession($formUid) { + if (intval($formUid) === 0) { + return; + } + + $GLOBALS['TSFE']->fe_user->setKey('ses', 'powermailFormstart' . $formUid, time()); + $GLOBALS['TSFE']->storeSessionData(); + } + + /** + * Read FormStart + * + * @param integer Form UID + * return integer Timestamp + */ + public function getFormStartFromSession($formUid) { + $timestamp = $GLOBALS['TSFE']->fe_user->getKey('ses', 'powermailFormstart' . $formUid); + return $timestamp; + } + + /** + * Returns given number or the current PID + * + * @param int Storage PID or nothing + * @return int Storage PID or current PID + */ + public function getStoragePage($pid = '') { + if (!$pid) { + $pid = $GLOBALS['TSFE']->id; + } + return $pid; + } + + /** + * This functions renders the powermail_all Template to use in Mails and Other views + * + * @param array Arguments from form POST + * @param object Configuration Manager + * @param object Object Manager + * @param string Choose a section (web or mail) + * @return string content parsed from powermailAll HTML Template + */ + public function powermailAll($variables, $configurationManager, $objectManager, $section = 'web') { + $powermailAll = $objectManager->create('Tx_Fluid_View_StandaloneView'); + $extbaseFrameworkConfiguration = $configurationManager->getConfiguration(Tx_Extbase_Configuration_ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK); + $templatePathAndFilename = t3lib_div::getFileAbsFileName($extbaseFrameworkConfiguration['view']['templateRootPath']) . 'Forms/PowermailAll.html'; + $powermailAll->setLayoutRootPath(t3lib_div::getFileAbsFileName($extbaseFrameworkConfiguration['view']['layoutRootPath'])); + $powermailAll->setTemplatePathAndFilename($templatePathAndFilename); + $powermailAll->assign('variables', $this->htmlspecialcharsOnArray($variables)); + $powermailAll->assign('section', $section); + $content = $powermailAll->render(); + + return $content; + } + + /** + * Generate a new array from POST array with markers + * before: 123 => value + * after: firstname => value + * + * @param array piVars from Form Submit + * @return array new array + */ + public function getVariablesWithMarkers($fields) { + $variables = array(); + foreach ((array) $fields as $uid => $value) { // one loop for every received field + $variables[$this->getMarkerFromField($uid)] = $value; + } + return $variables; + } + + /** + * Generate a new array from POST array with their labels and respect FE language + * before: 123 => value + * after: Your Firstname: => value + * + * @param array piVars from Form Submit + * @return array new array + */ + public function getVariablesWithLabels($fields) { + $variables = array(); + foreach ((array) $fields as $uid => $value) { // one loop for every received field + $variables[$this->getLabelFromField($uid)] = $value; + } + return $variables; + } + + /** + * Get label of a field (and respect FE language) + * + * @param integer Field UID + * @return string Label + */ + public function getLabelFromField($uid) { + $fieldsRepository = t3lib_div::makeInstance('Tx_Powermail_Domain_Repository_FieldsRepository'); + $field = $fieldsRepository->findByUid($uid); // get field + if (method_exists($field, 'getTitle')) { + $title = $field->getTitle(); + } + if ($title === NULL || empty($title)) { + $title = 'Error, could not get Title'; + } + return $title; + } + + /** + * Read marker from given field uid + * + * @param integer Field UID + * @return string Marker name + */ + public function getMarkerFromField($uid) { + $fieldsRepository = t3lib_div::makeInstance('Tx_Powermail_Domain_Repository_FieldsRepository'); + $field = $fieldsRepository->findByUid($uid); // get field + if (method_exists($field, 'getMarker')) { + $marker = $field->getMarker(); + } + if ($marker === NULL || empty($marker)) { + $marker = 'Error, could not get Marker'; + } + + return $marker; + } + + /** + * Add uploads fields and rewrite date fields + * + * @param array Field array + * @return void + */ + public function addUploadsToFields(&$fields) { + // add filenames to variable + if (isset($_FILES['tx_powermail_pi1']['name']['field'])) { + foreach ((array) $_FILES['tx_powermail_pi1']['name']['field'] as $uid => $value) { + if (!empty($value)) { + $fields[$uid] = $value; + } + } + } + } + + /** + * Add uploaded files to field array in controller + * + * @param array Field array + * @return void + */ +// public function addUploadsToFields(&$fields) { +// if (isset($_FILES['tx_powermail_pi1']['name']['field'])) { +// foreach ((array) $_FILES['tx_powermail_pi1']['name']['field'] as $uid => $filename) { +// if (!empty($filename)) { +// $fields[$uid] = $GLOBALS['powermail']['file'][$uid]['newFilename']; +// } +// } +// } +// } + + /** + * Add uploads fields and rewrite date fields + * + * @param array Field array + * @param array TypoScript Settings + * @return void + */ + public function rewriteDateInFields($fields, $settings) { + // rewrite datetime + $fieldsRepository = t3lib_div::makeInstance('Tx_Powermail_Domain_Repository_FieldsRepository'); + foreach ((array) $fields as $uid => $value) { + $field = $fieldsRepository->findByUid($uid); + if (method_exists($field, 'getType') && $field->getType() == 'date') { + $fields[$uid] = strtotime($value); + } + } + return $fields; + } + + /** + * This is the main-function for sending Mails + * + * @param array Array with all needed mail information + * $mail['receiverName'] = 'Name'; + * $mail['receiverEmail'] = 'receiver@mail.com'; + * $mail['senderName'] = 'Name'; + * $mail['senderEmail'] = 'sender@mail.com'; + * $mail['subject'] = 'Subject line'; + * $mail['template'] = 'PathToTemplate/'; + * $mail['rteBody'] = 'This is the content of the RTE'; + * $mail['format'] = 'both'; // or plain or html + * @param array All arguments from POST or GET + * @param array TypoScript Settings + * @param string Email to "sender" or "receiver" + * @param object $objectManager + * @param object $configurationManager + * @return boolean TRUE on success, otherwise false + */ + public function sendTemplateEmail($mail, $fields, $settings, $type, $objectManager, $configurationManager) { + /***************** + * Settings + ****************/ + $cObj = $configurationManager->getContentObject(); + $conf = Tx_Extbase_Utility_TypoScript::convertPlainArrayToTypoScriptArray($settings); + + // parsing variables with fluid engine to allow viewhelpers and variables in some flexform fields + $parse = array( + 'receiverName', + 'receiverEmail', + 'senderName', + 'senderEmail', + 'subject' + ); + foreach ($parse as $value) { + $mail[$value] = $this->fluidParseString($mail[$value], $objectManager, $this->getVariablesWithMarkers($fields)); + } + + // stop mail process if subject is empty + if (empty($mail['subject'])) { + return false; + } + + // Debug Output + if ($settings['debug']['mail']) { + t3lib_utility_Debug::debug($mail, 'powermail debug: Show Mail'); + } + + // generate mail body + $extbaseFrameworkConfiguration = $configurationManager->getConfiguration(Tx_Extbase_Configuration_ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK); + $templatePathAndFilename = t3lib_div::getFileAbsFileName($extbaseFrameworkConfiguration['view']['templateRootPath']) . $mail['template'] . '.html'; + $emailView = $objectManager->create('Tx_Fluid_View_StandaloneView'); + $emailView->getRequest()->setControllerExtensionName('powermail'); + $emailView->getRequest()->setPluginName('Pi1'); + $emailView->getRequest()->setControllerName('Forms'); + $emailView->setFormat('html'); + $emailView->setTemplatePathAndFilename($templatePathAndFilename); + $emailView->setPartialRootPath(t3lib_div::getFileAbsFileName($extbaseFrameworkConfiguration['view']['partialRootPath'])); + $emailView->setLayoutRootPath(t3lib_div::getFileAbsFileName($extbaseFrameworkConfiguration['view']['layoutRootPath'])); + $emailView->getRequest()->setControllerExtensionName('Powermail'); // extension name for translate viewhelper + + // get variables + // additional variables + if (isset($mail['variables']) && is_array($mail['variables'])) { + $emailView->assignMultiple($mail['variables']); + } + // markers in HTML Template + $variablesWithMarkers = $this->getVariablesWithMarkers($fields); + $emailView->assign('variablesWithMarkers', $this->htmlspecialcharsOnArray($variablesWithMarkers)); + $emailView->assignMultiple($variablesWithMarkers); + // powermail_all + $variables = $this->getVariablesWithLabels($fields); + $content = $this->powermailAll($variables, $configurationManager, $objectManager, 'mail'); + $emailView->assign('powermail_all', $content); + // from rte + $emailView->assign('powermail_rte', $mail['rteBody']); + $variablesWithLabels = $this->getVariablesWithLabels($fields); + $emailView->assign('variablesWithLabels', $variablesWithLabels); + $emailView->assign('marketingInfos', $this->getMarketingInfos()); + $emailBody = $emailView->render(); + + + /***************** + * generate mail + ****************/ + $message = t3lib_div::makeInstance('t3lib_mail_Message'); + $message + ->setTo(array($mail['receiverEmail'] => $mail['receiverName'])) + ->setFrom(array($mail['senderEmail'] => $mail['senderName'])) + ->setSubject($mail['subject']) + ->setCharset($GLOBALS['TSFE']->metaCharset); + + // add cc receivers + if ($cObj->cObjGetSingle($conf[$type . '.']['overwrite.']['cc'], $conf[$type . '.']['overwrite.']['cc.'])) { + $ccArray = t3lib_div::trimExplode(',', $cObj->cObjGetSingle($conf[$type . '.']['overwrite.']['cc'], $conf[$type . '.']['overwrite.']['cc.']), 1); + $message->setCc($ccArray); + } + + // add bcc receivers + if ($cObj->cObjGetSingle($conf[$type . '.']['overwrite.']['bcc'], $conf[$type . '.']['overwrite.']['bcc.'])) { + $bccArray = t3lib_div::trimExplode(',', $cObj->cObjGetSingle($conf[$type . '.']['overwrite.']['bcc'], $conf[$type . '.']['overwrite.']['bcc.']), 1); + $message->setBcc($bccArray); + } + + // add Return Path + if ($cObj->cObjGetSingle($conf[$type . '.']['overwrite.']['returnPath'], $conf[$type . '.']['overwrite.']['returnPath.'])) { + $message->setReturnPath($cObj->cObjGetSingle($conf[$type . '.']['overwrite.']['returnPath'], $conf[$type . '.']['overwrite.']['returnPath.'])); + } + + // add Reply Addresses + if ( + $cObj->cObjGetSingle($conf[$type . '.']['overwrite.']['replyToEmail'], $conf[$type . '.']['overwrite.']['replyToEmail.']) + && + $cObj->cObjGetSingle($conf[$type . '.']['overwrite.']['replyToName'], $conf[$type . '.']['overwrite.']['replyToName.']) + ) { + $replyArray = array( + $cObj->cObjGetSingle($conf[$type . '.']['overwrite.']['replyToEmail'], $conf[$type . '.']['overwrite.']['replyToEmail.']) => + $cObj->cObjGetSingle($conf[$type . '.']['overwrite.']['replyToName'], $conf[$type . '.']['overwrite.']['replyToName.']) + ); + $message->setReplyTo($replyArray); + } + + // add priority + if ($settings[$type]['overwrite']['priority']) { + $message->setPriority(intval($settings[$type]['overwrite']['priority'])); + } + + // add attachments from upload fields + if ($settings[$type]['attachment']) { + foreach ((array) $GLOBALS['powermail']['file'] as $uid => $upload) { + $message->attach(Swift_Attachment::fromPath($settings['misc']['file']['folder'] . $GLOBALS['powermail']['file'][$uid]['newFilename'])); + } + } + + // add attachments from typoscript + if ($cObj->cObjGetSingle($conf[$type . '.']['addAttachment'], $conf[$type . '.']['addAttachment.'])) { + $files = t3lib_div::trimExplode(',', $cObj->cObjGetSingle($conf[$type . '.']['addAttachment'], $conf[$type . '.']['addAttachment.']), 1); + foreach ($files as $file) { + $message->attach(Swift_Attachment::fromPath($file)); + } + } + if ($mail['format'] != 'plain') { + $message->setBody($emailBody, 'text/html'); + } + if ($mail['format'] != 'html') { + $message->addPart($this->makePlain($emailBody), 'text/plain'); + } + $message->send(); + + return $message->isSent(); + } + + /** + * Parse String with Fluid View + * + * @param string Any string + * @param object $objectManager + * @param array Variables + * @return string Parsed string + */ + private function fluidParseString($string, $objectManager, $variables = array()) { + if (!$string) { + return ''; + } + $parseObject = $objectManager->create('Tx_Fluid_View_StandaloneView'); + $parseObject->setTemplateSource($string); + $parseObject->assignMultiple($variables); + $string = $parseObject->render(); + + return $string; + } + + /** + * Function makePlain() removes html tags and add linebreaks + * Easy generate a plain email bodytext from a html bodytext + * + * @param string $content: HTML Mail bodytext + * @return string $content: Plain Mail bodytext + */ + private function makePlain($content) { + // config + $htmltagarray = array ( // This tags will be added with linebreaks + '

', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '' + ); + $notallowed = array ( // This array contains not allowed signs which will be removed + ' ', + 'ß', + 'Ü', + 'ü', + 'Ö', + 'ö', + 'Ä', + 'ä', + ); + + // let's go + $content = str_replace($htmltagarray, $htmltagarray[0].'
', $content); // 1. add linebreaks on some parts (

=>


) + $content = strip_tags($content, '
'); // 2. remove all tags but not linebreaks and address (bla
=> bla
) + $content = preg_replace('/\s+/', ' ', $content); // 3. removes tabs and whitespaces + $content = $this->br2nl($content); // 4.
to \n + $content = implode("\n", t3lib_div::trimExplode("\n", $content)); // 5. explode and trim each line and implode again (" bla \n blabla " => "bla\nbla") + $content = str_replace($notallowed, '', $content); // 6. remove not allowed signs + + return $content; + } + + /** + * Function br2nl is the opposite of nl2br + * + * @param string $content: Anystring + * @return string $content: Manipulated string + */ + private function br2nl($content) { + $array = array( + '
', + '
', + '
', + '
' + ); + $content = str_replace($array, "\n", $content); // replacer + + return $content; + } + + /** + * Use htmlspecialchars on array (key and value) (any depth - recursive call) + * + * @param array Any array + * @return array Cleaned array + */ + public function htmlspecialcharsOnArray($array) { + $newArray = array(); + foreach ((array) $array as $key => $value) { + if (is_array($value)) { + $newArray[htmlspecialchars($key)] = $this->htmlspecialcharsOnArray($value); + } else { + $newArray[htmlspecialchars($key)] = htmlspecialchars($value); + } + } + unset($array); + return $newArray; + } + + /** + * Get all receiver emails in an array + * + * @param string String with some emails + * @param int fe_groups Uid + */ + public function getReceiverEmails($receiverString, $feGroup) { + $array = $this->getEmailsFromString($receiverString); + if ($feGroup) { + $array = array_merge($array, $this->getEmailsFromFeGroup($feGroup)); + } + return $array; + } + + /** + * Read E-Mails from String + * + * @param int fe_groups Uid + * @return array Array with emails + */ + public function getEmailsFromFeGroup($uid) { + $userRepository = t3lib_div::makeInstance('Tx_Powermail_Domain_Repository_UserRepository'); + $users = $userRepository->findByUsergroup($uid); + $array = array(); + foreach ($users as $user) { + if (t3lib_div::validEmail($user->getEmail())) { + $array[] = $user->getEmail(); + } + } + return $array; + } + + /** + * Read E-Mails from String + * + * @param string Any given string from a textarea with some emails + * @return array Array with emails + */ + public function getEmailsFromString($string) { + $array = array(); + $string = str_replace(array("\n", ';', '|'), ',', $string); + $arr = t3lib_div::trimExplode(',', $string, 1); + foreach ($arr as $email) { + if (t3lib_div::validEmail($email)) { + $array[] = $email; + } + } + return $array; + } + + /** + * Create an options array (Needed for fieldsettings: select, radio, check) + * option1 => + * label => Red Shoes + * value => red + * selected => 1 + * + * @param string Options from the Textarea + * @return array Options Array + */ + public function optionArray($string) { + $options = array(); + $settingsField = t3lib_div::trimExplode("\n", $string, 1); + foreach ($settingsField as $line) { + $settings = t3lib_div::trimExplode('|', $line, 0); + $options[] = array( + 'label' => $settings[0], + 'value' => isset($settings[1]) ? $settings[1] : $settings[0], + 'selected' => isset($settings[2]) ? 1 : 0 + ); + } + + return $options; + } + + /** + * Change Timestamp to String + * + * @param array Field array with uids and strings + * @param array TypoScript settings + * @return void + */ + public function changeDateFieldsToString(&$fields, $settings) { + $fieldsRepository = t3lib_div::makeInstance('Tx_Powermail_Domain_Repository_FieldsRepository'); + foreach ((array) $fields as $uid => $value) { + $field = $fieldsRepository->findByUid($uid); + if (method_exists($field, 'getType') && $field->getType() == 'date') { + $fields[$uid] = strftime($settings['misc']['dateFormat'], $value); + } + } + } + + /** + * Get grouped mail answers for reporting + * + * @param array Mail array + * @param int Max Labels + * @param string Label for "Max Labels" - could be "all others" + * @return array + */ + public function getGroupedMailAnswers($mails, $max = 5, $maxLabel = 'All others') { + $arr = array(); + foreach ($mails as $mail) { + foreach ($mail->getAnswers() as $answer) { + $value = $answer->getValue(); + if (is_array($answer->getValue())) { + $value = implode(', ', $value); + } + if (!isset($arr[$answer->getField()][$value])) { + $arr[$answer->getField()][$value] = 1; + } else { + $arr[$answer->getField()][$value]++; + } + } + } + + // sort desc + foreach ($arr as $key => $value) { + arsort($arr[$key]); + } + + // if too much values + foreach ((array) $arr as $key => $array) { + if (count($arr[$key]) >= $max) { + $i = 0; + foreach ($arr[$key] as $value => $amount) { + $i++; + if ($i >= $max) { + unset($arr[$key][$value]); + if (!isset($arr[$key][$maxLabel])) { + $arr[$key][$maxLabel] = $amount; + } else { + $arr[$key][$maxLabel] += $amount; + } + } else { + $arr[$key][$value] = $amount; + } + } + } + } + + return $arr; + } + + /** + * Get grouped marketing stuff for reporting + * + * @param object Mails + * @param int Max Labels + * @param string Label for "Max Labels" - could be "all others" + * @return array + */ + public function getGroupedMarketingStuff($mails, $max = 10, $maxLabel = 'All others') { + $arr = array( + 'marketingSearchterm' => array(), + 'marketingReferer' => array(), + 'marketingPayedSearchResult' => array(), + 'marketingLanguage' => array(), + 'marketingBrowserLanguage' => array(), + 'marketingFunnel' => array(), + ); + foreach ($mails as $mail) { + foreach ($arr as $key => $v) { + $value = $mail->{'get' . ucfirst($key)}(); + if (is_array($value)) { + $value = implode(',', $value); + } + if (!$value) { + $value = '-'; + } + if (!isset($arr[$key][$value])) { + $arr[$key][$value] = 1; + } else { + $arr[$key][$value]++; + } + } + } + + // sort desc + foreach ($arr as $key => $value) { + arsort($arr[$key]); + } + + // if too much values + foreach ($arr as $key => $array) { + if (count($arr[$key]) >= $max) { + $i = 0; + foreach ($arr[$key] as $value => $amount) { + $i++; + if ($i >= $max) { + unset($arr[$key][$value]); + if (!isset($arr[$key][$maxLabel])) { + $arr[$key][$maxLabel] = $amount; + } else { + $arr[$key][$maxLabel] += $amount; + } + } else { + $arr[$key][$value] = $amount; + } + } + } + } + + return $arr; + } + + /** + * Read MarketingInfos from Session + * + * return array + */ + public function getMarketingInfos() { + $info = $GLOBALS['TSFE']->fe_user->getKey('ses', 'powermail_marketing'); + return $info; + } + + /** + * Powermail SendPost - Send values via curl to target + * + * @param $fields array Params from User + * @param $settings array TypoScript Settings + * @param object Configuration Manager + * @return void + */ + public function sendPost($fields, $conf, $configurationManager) { + if (!$conf['marketing.']['sendPost.']['_enable']) { + return; + } + $fields = $this->getVariablesWithMarkers($fields); + $cObj = $configurationManager->getContentObject(); + $cObj->start($fields); + $curl = array( + 'url' => $conf['marketing.']['sendPost.']['targetUrl'], + 'params' => $cObj->cObjGetSingle($conf['marketing.']['sendPost.']['values'], $conf['marketing.']['sendPost.']['values.']) + ); + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $curl['url']); + curl_setopt($ch, CURLOPT_POST, 1); + curl_setopt($ch, CURLOPT_POSTFIELDS, $curl['params']); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_exec($ch); + curl_close($ch); + + // Debug Output + if ($conf['marketing.']['sendPost.']['debug']) { + t3lib_utility_Debug::debug($curl, 'powermail debug: Show SendPost Values'); + } + } + + /** + * Returns array with alphabetical letters + * + * @return array + */ + public function getAbcArray() { + $arr = array(); + for ($a=A; $a != AA; $a++) { // ABC loop + $arr[] = $a; + } + return $arr; + } + + /** + * Check of value is serialized + * + * @param $val Any String + * @return bool + */ + public function is_serialized($val) { + if (!is_string($val) || trim($val) == '') { + return false; + } + if (preg_match('/^(i|s|a|o|d):(.*);/si', $val)) { + return true; + } + return false; + } + + /** + * Check if logged in user is allowed to make changes in Pi2 + * + * @param array $settings TypoScript and Flexform Settings + * @param object $mail Mail Object + * @return bool + */ + public function isAllowedToEdit($settings, $mail) { + // settings + if (!$GLOBALS['TSFE']->fe_user->user['uid']) { + return false; + } + $usergroups = t3lib_div::trimExplode(',', $GLOBALS['TSFE']->fe_user->user['usergroup'], 1); // array with usergroups of current logged in user + $usersSettings = t3lib_div::trimExplode(',', $settings['edit']['feuser'], 1); // array with all allowed users + $usergroupsSettings = t3lib_div::trimExplode(',', $settings['edit']['fegroup'], 1); // array with all allowed groups + + // replace "_owner" with uid of owner in array with users + if (method_exists($mail, 'getFeuser') && is_numeric(array_search('_owner', $usersSettings))) { + $usersSettings[array_search('_owner', $usersSettings)] = $mail->getFeuser(); + } + + // add owner groups to allowed groups (if "_owner") + if (method_exists($mail, 'getFeuser') && is_numeric(array_search('_owner', $usergroupsSettings))) { // if one entry is "_ownergroup" + $usergroupsFromOwner = $this->getUserGroupsFromUser($mail->getFeuser()); // get usergroups of owner user + $usergroupsSettings = array_merge((array) $usergroupsSettings, (array) $usergroupsFromOwner); // add owner usergroups to allowed usergroups array + } + + // 1. check user + if (in_array($GLOBALS['TSFE']->fe_user->user['uid'], $usersSettings)) { + return true; + } + + // 2. check usergroup + if (count(array_intersect($usergroups, $usergroupsSettings))) { // if there is one of the groups allowed + return true; + } + + return false; + } + + /** + * Return usergroups uid of a given fe_user + * + * @param string $uid FE_user UID + * @param string $table Table name ('fe_users' or 'fe_groups') + * @return array Usergroups + */ + private function getUserGroupsFromUser($uid) { + $groups = array(); + $select = 'fe_groups.uid'; + $from = 'fe_users, fe_groups, sys_refindex'; + $where = 'sys_refindex.tablename = "fe_users" AND sys_refindex.ref_table = "fe_groups" AND fe_users.uid = sys_refindex.recuid AND fe_groups.uid = sys_refindex.ref_uid AND fe_users.uid = ' . intval($uid); + $groupBy = ''; + $orderBy = ''; + $limit = 1000; + $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery($select, $from, $where, $groupBy, $orderBy, $limit); + if ($res) { + while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { // One loop for every entry + $groups[] = $row['uid']; + } + } + + return $groups; + } + + /** + * Create Hash from String and TYPO3 Encryption Key + * + * @param $string Any String + * @return string Hashed String + */ + public function createOptinHash($string) { + return t3lib_div::shortMD5($string . $GLOBALS['TYPO3_CONF_VARS']['SYS']['encryptionKey']); + } + + /** + * Merges Flexform and TypoScript Settings (up to 2 levels) and add Global Config from ext_conf_template.txt + * + * @param array All settings + * @return array Merged settings + */ + public function mergeTypoScript2FlexForm(&$settings, $typoScriptLevel = 'setup') { + // config + $tmp_settings = array(); + $confArr = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['powermail']); + + if (isset($settings[$typoScriptLevel]) && is_array($settings[$typoScriptLevel])) { + $tmp_settings = $settings[$typoScriptLevel]; // copy typoscript part to conf part + } + + if (isset($settings['flexform']) && is_array($settings['flexform'])) { + $tmp_settings = array_merge((array) $tmp_settings, (array) $settings['flexform']); // copy flexform part to conf part + } + + // merge ts and ff (loop every flexform) + foreach ($tmp_settings as $key1 => $value1) { + if (!is_array($value1)) { // 1. level + if (isset($settings[$typoScriptLevel][$key1]) && isset($settings['flexform'][$key1])) { // only if this key exists in ff and ts + if ($settings[$typoScriptLevel][$key1] && !$settings['flexform'][$key1]) { // only if ff is empty and ts not + $tmp_settings[$key1] = $settings[$typoScriptLevel][$key1]; // overwrite with typoscript settings + } + } + } else { + foreach ($value1 as $key2 => $value2) { // 2. level + if (isset($settings[$typoScriptLevel][$key1][$key2]) && isset($settings['flexform'][$key1][$key2])) { // only if this key exists in ff and ts + if ($settings[$typoScriptLevel][$key1][$key2] && !$settings['flexform'][$key1][$key2]) { // only if ff is empty and ts not + $tmp_settings[$key1][$key2] = $settings[$typoScriptLevel][$key1][$key2]; // overwrite with typoscript settings + } + } + } + } + } + + // merge ts and ff (loop every typoscript) + foreach ((array) $settings[$typoScriptLevel] as $key1 => $value1) { + if (!is_array($value1)) { // 1. level + if (isset($settings[$typoScriptLevel][$key1]) && !isset($settings['flexform'][$key1])) { // only if this key exists in ts and not in ff + $tmp_settings[$key1] = $value1; // set value from ts + } + } else { + foreach ($value1 as $key2 => $value2) { // 2. level + if (isset($settings[$typoScriptLevel][$key1][$key2]) && !isset($settings['flexform'][$key1][$key2])) { // only if this key exists in ts and not in ff + $tmp_settings[$key1][$key2] = $value2; // set value from ts + } + } + } + } + + // add global config + $tmp_settings['global'] = $confArr; + + $settings = $tmp_settings; + unset($tmp_settings); + } +} +?> \ No newline at end of file diff --git a/Classes/Utility/EvaluateEmail.php b/Classes/Utility/EvaluateEmail.php new file mode 100644 index 00000000..e7246d44 --- /dev/null +++ b/Classes/Utility/EvaluateEmail.php @@ -0,0 +1,93 @@ +, in2code.de + * + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + +/** + * Adds a new eval possibility to TCA of TYPO3 + * + * @package powermail + * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later + * + */ +class Tx_Powermail_Utility_EvaluateEmail { + + /** + * Adds new JavaScript function for evaluation of the TCA fields in backend + * + * @return string JavaScript + */ + public function returnFieldJS() { + $content = ' + if (validEmail(value)) { + return value; + } else { + return "errorinemail@tryagain.com" + } + + /** + * Check if given String is a valid Email address + * + * @param string An email address + * @return boolean + */ + function validEmail(s) { + var a = false; + var res = false; + if(typeof(RegExp) == "function") { + var b = new RegExp("abc"); + if(b.test("abc") == true){a = true;} + } + if (a == true) { + reg = new RegExp("^([a-zA-Z0-9\\-\\.\\_]+)" + "(\\@)([a-zA-Z0-9\\-\\.]+)" + "(\\.)([a-zA-Z]{2,4})$"); + res = (reg.test(s)); + } else { + res = (s.search("@") >= 1 && s.lastIndexOf(".") > s.search("@") && s.lastIndexOf(".") >= s.length-5); + } + return(res); + } + '; + + return $content; + } + + /** + * Server valuation + * + * @param $value The field value to be evaluated. + * @param $is_in The "is_in" value of the field configuration from TCA + * @param $set Boolean defining if the value is written to the database or not. Must be passed by reference and changed if needed. + * @return string Value + */ + public function evaluateFieldValue($value, $is_in, &$set) { + if (t3lib_div::validEmail($value)) { + $set = 1; + } else { + $set = 0; + $value = 'errorinemail@tryagain.com'; + } + return $value; + } + +} +?> \ No newline at end of file diff --git a/Classes/Utility/FieldSelectorUserFunc.php b/Classes/Utility/FieldSelectorUserFunc.php new file mode 100644 index 00000000..6618db11 --- /dev/null +++ b/Classes/Utility/FieldSelectorUserFunc.php @@ -0,0 +1,121 @@ +, in2code.de + * + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + + +/** + * Powermail Field Selector for Pi2 (powermail_frontend) + * + * @package powermail + * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later + * + */ +class Tx_Powermail_Utility_FieldSelectorUserFunc { + + /** + * Crazy Query Limit + * + * @var int + */ + private $limit = 10000; + + /** + * Cretae Array for Field Selector + * + * @param array Config Array + * @param object Parent Object + * @return void + */ + public function getFieldSelection(&$params, $pObj) { + $formUid = $this->getFormFromFlexform($params); + if (!$formUid) { + $params['items'] = array( + array( + 'Please select a form (Main Settings)', + '' + ) + ); + return; + } + + $this->getFieldsFromForm($formUid); + + foreach ((array) $this->getFieldsFromForm($formUid) as $field) { + $params['items'][] = array( + $field['title'] . ' {' . $field['marker'] . '}', + $field['uid'] + ); + } + } + + /** + * Return Form Uid from Flexform settings + * + * @param array Config Array + * @return int Form Uid + */ + private function getFormFromFlexform($params) { + $xml = $params['row']['pi_flexform']; + $flexform = t3lib_div::xml2array($xml); + if (is_array($flexform) && isset($flexform['data']['main']['lDEF']['settings.flexform.main.form']['vDEF'])) { + return $flexform['data']['main']['lDEF']['settings.flexform.main.form']['vDEF']; + } + return 0; + } + + /** + * Get Fieldlist from Form UID + * + * @param integer $formUid Form UID + */ + private function getFieldsFromForm($formUid) { + $select = 'tx_powermail_domain_model_fields.uid, tx_powermail_domain_model_fields.title, tx_powermail_domain_model_fields.marker'; + $from = ' + tx_powermail_domain_model_fields + left join tx_powermail_domain_model_pages on tx_powermail_domain_model_fields.pages = tx_powermail_domain_model_pages.uid + left join tx_powermail_domain_model_forms on tx_powermail_domain_model_pages.forms = tx_powermail_domain_model_forms.uid + '; + $where = ' + tx_powermail_domain_model_fields.deleted = 0 and + tx_powermail_domain_model_fields.hidden = 0 and + tx_powermail_domain_model_fields.type != "submit" and + tx_powermail_domain_model_fields.sys_language_uid IN (-1,0) and + tx_powermail_domain_model_forms.uid = ' . intval($formUid); + $groupBy = ''; + $orderBy = 'tx_powermail_domain_model_fields.sorting ASC'; + $limit = $this->limit; + $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery($select, $from, $where, $groupBy, $orderBy, $limit); + + $array = array(); + if ($res) { + while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { + $array[] = $row; + } + } + + return $array; + } +} +?> \ No newline at end of file diff --git a/Classes/Utility/InitialMarker.php b/Classes/Utility/InitialMarker.php new file mode 100644 index 00000000..4112d3eb --- /dev/null +++ b/Classes/Utility/InitialMarker.php @@ -0,0 +1,70 @@ +, in2code.de + * + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + + +/** + * Class to extend Pi1 field marker e.g. {firstname} + * + * @package powermail + * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later + * + */ +class Tx_Powermail_Utility_InitialMarker { + + /** + * Initialy filling of marker field + * + * @param string $status mode of change + * @param string $table the table which gets changed + * @param string $id uid of the record + * @param array $fieldArray the updateArray + * @param array $this obj + * @return an updated fieldArray() + */ + public function processDatamap_postProcessFieldArray($status, $table, $id, &$fieldArray, $pObj) { + if ($table != 'tx_powermail_domain_model_fields') { // stop if not powermail field table + return $fieldArray; + } + if (!empty($fieldArray['marker'])) { // stop if marker field is already filled + return $fieldArray; + } + $fieldArray['marker'] = $this->cleanString($fieldArray['title']); + } + + /** + * Clean Marker String ("My Field" => "my_field") + * + * @param string $string Any String + * @return string + */ + private function cleanString($string) { + $string = preg_replace('/[^a-zA-Z0-9_-]/', '', $string); + $string = str_replace(array('-'), '_', $string); + $string = strtolower($string); + return $string; + } +} +?> \ No newline at end of file diff --git a/Classes/Utility/Marker.php b/Classes/Utility/Marker.php new file mode 100644 index 00000000..46779bda --- /dev/null +++ b/Classes/Utility/Marker.php @@ -0,0 +1,80 @@ +, in2code.de + * + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + + +/** + * Class to extend Pi1 field marker e.g. {firstname} + * + * @package powermail + * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later + * + */ +class Tx_Powermail_Utility_Marker { + + /** + * Create individual marker for powermail field + * + * @param array Config Array + * @param object Parent Object + * @return string String to render + */ + public function createMarker($PA, $fobj) { + $content = ''; + if (isset($PA['row']['marker']) && !empty($PA['row']['marker'])) { // if entry in db + $marker = $PA['row']['marker']; + } else { // no entry + $marker = $PA['row']['title']; + } + $marker = preg_replace('/[^a-zA-Z0-9_-]/', '', $marker); + $marker = str_replace(array('-'), '_', $marker); + $marker = strtolower($marker); + + if (stristr($PA['row']['uid'], 'NEW')) { // field just generated + $content .= '
'; + $content .= 'Please save before...'; + $content .= '
'; + } else { // was saved before + $content .= '
'; + $content .= '{' . strtolower($marker) . '}'; + $content .= '
'; + $content .= ''; + } + + return $content; + } + + /** + * Workarround to only show a label and no field in TCA + * + * @param array Config Array + * @param object Parent Object + * @return empty string + */ + public function doNothing($PA, $fobj) { + return ''; + } +} +?> \ No newline at end of file diff --git a/Classes/Utility/Marketing.php b/Classes/Utility/Marketing.php new file mode 100644 index 00000000..f13b9ac3 --- /dev/null +++ b/Classes/Utility/Marketing.php @@ -0,0 +1,162 @@ +, in2code +* All rights reserved +* +* This script is part of the TYPO3 project. The TYPO3 project is +* free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* The GNU General Public License can be found at +* http://www.gnu.org/copyleft/gpl.html. +* +* This script is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* This copyright notice MUST APPEAR in all copies of the script! +***************************************************************/ + +class Tx_Powermail_Utility_Marketing { + + /** + * Session Prefix + * + * @var string + */ + public $sessionPrefix = 'powermail_marketing'; + + /** + * Main function for additional google information + * + * @param string Given content (normally empty) + * @param array TypoScript configuration for this userFunc + * @return void + */ + public function store($content = '', $conf = array()) { + $info = array( + 'marketingSearchterm' => $this->getSearchTerm(), + 'marketingReferer' => $this->getExternalReferer(), + 'marketingPayedSearchResult' => $this->fromAdwords(), + 'marketingLanguage' => ($GLOBALS['TSFE']->tmpl->setup['config.']['sys_language_uid'] ? $GLOBALS['TSFE']->tmpl->setup['config.']['sys_language_uid'] : 0), + 'marketingBrowserLanguage' => $_SERVER['HTTP_ACCEPT_LANGUAGE'], + 'marketingFunnel' => array( + $GLOBALS['TSFE']->id + ) + ); + + $this->storeInSession($info); + } + + /* + * Store info array into session + * + * @param array Info Array + * @return void + */ + private function storeInSession($newInfo) { + // 1. get old values + $oldInfo = $GLOBALS['TSFE']->fe_user->getKey('ses', $this->sessionPrefix); + + // 2. create array to store + $info = $newInfo; + if (is_array($oldInfo)) { + if (!$newInfo['marketingReferer']) { + $info['marketingReferer'] = $oldInfo['marketingReferer']; + } + if (!$newInfo['marketingSearchterm']) { + $info['marketingSearchterm'] = $oldInfo['marketingSearchterm']; + } + if (!$newInfo['marketingPayedSearchResult']) { + $info['marketingPayedSearchResult'] = $oldInfo['marketingPayedSearchResult']; + } + if (is_array($oldInfo['marketingFunnel'])) { + $info['marketingFunnel'] = $oldInfo['marketingFunnel']; + $info['marketingFunnel'][] = $newInfo['marketingFunnel'][0]; + } + } + + // 3. store in session + $GLOBALS['TSFE']->fe_user->setKey( + 'ses', + $this->sessionPrefix, + $info + ); + $GLOBALS['TSFE']->storeSessionData(); + } + + /** + * Checks if last page was an external page + * + * return string URL of the last page (if different domain) + */ + private function getExternalReferer() { + $url = parse_url(htmlentities(t3lib_div::getIndpEnv('HTTP_REFERER'))); // every part of the referer in an own array + + // if this domain is different to referer domain + if (t3lib_div::getIndpEnv('HTTP_HOST') != $url['host']) { + return t3lib_div::getIndpEnv('HTTP_REFERER'); + } + return false; + } + + /** + * Checks searchterm from last page + * + * return string Searchterm + */ + private function getSearchTerm() { + $url = parse_url(htmlentities(t3lib_div::getIndpEnv('HTTP_REFERER'))); // every part of the referer in an own array + + if (!isset($url['query'])) { // if GET params is set + return false; + } + + preg_match('/q=([^&]+)(&)?/', $url['query'], $output); // give me only the &q="searchword" part + + if ($output[1]) { // only if GET param &q= was set + return urldecode($output[1]); + } + + return false; + } + + /** + * Checks if last external page was a google adwords link + * + * return bool + */ + private function fromAdwords() { + $url = parse_url(htmlentities(t3lib_div::getIndpEnv('HTTP_REFERER'))); // every part of the referer in an own array + + preg_match('/adurl=([^&]+)(&)?/', $url['query'], $output); // give me only the &q="searchword" part + if ($output[1]) { + return 1; + } + return 0; + } + + /** + * Function to read values from session + * + * @param string Given content (normally empty) + * @param array TypoScript configuration for this userFunc + * return sting Session values + */ + public function readSession($content = '', $conf = array()) { + $info = $GLOBALS['TSFE']->fe_user->getKey('ses', $this->sessionPrefix); + $string = 'Powermail Marketing:
'; + if (is_array($info)) { + $string .= t3lib_div::view_array($info); + } else { + $string .= 'Empty Session!'; + } + + return $string; + } +} \ No newline at end of file diff --git a/Classes/Utility/PluginInfo.php b/Classes/Utility/PluginInfo.php new file mode 100644 index 00000000..116bbbc8 --- /dev/null +++ b/Classes/Utility/PluginInfo.php @@ -0,0 +1,143 @@ +, in2code.de + * + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + +/** + * Show Plugin Info below Plugin + * + * @package powermail + * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later + * + */ +class Tx_Powermail_Utility_PluginInfo { + + /** + * Params + */ + public $params; + + /** + * showTable + */ + public $showTable = 1; + + /** + * Path to locallang file + */ + private $locallangPath = 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:pluginInfo.'; + + /** + * Main Function + * + * @param array $params + * @param $pObj + * @return string + */ + public function getInfo($params = array(), $pObj) { + // settings + $confArr = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['powermail']); + if ($confArr['disablePluginInformation']) { + return; + } + $this->params = $params; + + // let's go + $array = array( + $GLOBALS['LANG']->sL($this->locallangPath . 'receiverEmail') => $this->getFieldFromFlexform('receiver', 'settings.flexform.receiver.email'), + $GLOBALS['LANG']->sL($this->locallangPath . 'receiverName') => $this->getFieldFromFlexform('receiver', 'settings.flexform.receiver.name'), + $GLOBALS['LANG']->sL($this->locallangPath . 'subject') => $this->getFieldFromFlexform('receiver', 'settings.flexform.receiver.subject'), + $GLOBALS['LANG']->sL($this->locallangPath . 'form') => $this->getFormTitle($this->getFieldFromFlexform('main', 'settings.flexform.main.form')), +// $GLOBALS['LANG']->sL($this->locallangPath . 'savePid') => $this->getFieldFromFlexform('main', 'settings.flexform.main.form'), + $GLOBALS['LANG']->sL($this->locallangPath . 'confirmationPage') => $this->getFieldFromFlexform('main', 'settings.flexform.main.confirmation') ? + '1' : + '0', + $GLOBALS['LANG']->sL($this->locallangPath . 'optin') => $this->getFieldFromFlexform('main', 'settings.flexform.main.optin') ? + '1' : + '0', + ); + if ($this->showTable) { + return $this->createOutput($array); + } + return false; + } + + /** + * Get form title from uid + * + * @param integer Form uid + * @return string Form Title + */ + private function getFormTitle($uid) { + $row = $GLOBALS['TYPO3_DB']->exec_SELECTgetSingleRow('title', 'tx_powermail_domain_model_forms', 'uid=' . intval($uid)); + return $row['title']; + } + + /** + * Create HTML Output + * + * @param $array Values to show + */ + private function createOutput($array) { + $i = 0; + $content = ''; + $content .= ''; + $content .= 'Settings'; + $content .= 'Value'; + $content .= ''; + foreach ($array as $key => $value) { + $content .= ''; + $content .= '' . $key . ''; + $content .= '' . $value . ''; + $content .= ''; + $i++; + } + return '' . $content . '
'; + } + + /** + * Get field value from flexform configuration + * + * @param string $sheet name of the sheet + * @param string $key name of the key + * @return string value if found + */ + private function getFieldFromFlexform($sheet, $key) { + $flexform = t3lib_div::xml2array($this->params['row']['pi_flexform']); + + if ( + is_array($flexform) + && is_array($flexform['data'][$sheet]) + && is_array($flexform['data'][$sheet]['lDEF']) + && is_array($flexform['data'][$sheet]['lDEF'][$key]) + && isset($flexform['data'][$sheet]['lDEF'][$key]['vDEF']) + ) { + return $flexform['data'][$sheet]['lDEF'][$key]['vDEF']; + } + + $this->showTable = 0; + return false; + } +} +?> \ No newline at end of file diff --git a/Classes/Utility/SaveToTable.php b/Classes/Utility/SaveToTable.php new file mode 100644 index 00000000..a1bba388 --- /dev/null +++ b/Classes/Utility/SaveToTable.php @@ -0,0 +1,262 @@ +, in2code.de + * + * All rights reserved + * + * This script is part of the TYPO3 project. The TYPO3 project is + * free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * The GNU General Public License can be found at + * http://www.gnu.org/copyleft/gpl.html. + * + * This script is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * This copyright notice MUST APPEAR in all copies of the script! + ***************************************************************/ + + +/** + * This class allows you to save values to any table + * + * @package powermail + * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License, version 3 or later + */ +class Tx_Powermail_Utility_SaveToTable { + + /** + * cObj + * + * @var Content Object + */ + protected $cObj; + + /** + * TypoScript configuration + * + * @var configuration + */ + protected $conf; + + /** + * All Plugin Params + * + * @var array + */ + protected $allArguments; + + /** + * Debug Array + * + * @var array + */ + protected $debug_array; + + /** + * Values to store + * + * @var array + */ + protected $db_values; + + /** + * Stop db insert for testing + * + * @var boolean + */ + protected $dbInsert = 1; + + /** + * Preflight method to store values to any db table + */ + public function main($allArguments, $conf, $cObj, $ok = 1) { + $this->cObj = $cObj; // cObject + $this->conf = $conf; // conf + $this->allArguments = $allArguments; // sessionvalues + + if (!$ok || !isset($this->conf['dbEntry.']) || !is_array($this->conf['dbEntry.'])) { + return; + } + + // One loop for every table to insert + foreach ($this->conf['dbEntry.'] as $table => $value) { + + if ($this->cObj->cObjGetSingle($this->conf['dbEntry.'][$table]['_enable'], $this->conf['dbEntry.'][$table]['_enable.']) != 1) { + continue; + } + + // 1. Array for first db entry + foreach ((array) $this->conf['dbEntry.'][$table] as $field => $value2) { // One loop for every field to insert in current table + if ($field[0] == '_' || substr($field, -1) == '.') { // if fieldname is _enable or _mm and not with . at the end + continue; // go to next loop + } + + if ($this->fieldExists($field, $this->removeDot($table))) { // if db table and field exists + $this->cObj->start($allArguments); // push to ts + $this->db_values[$table][$field] = $this->cObj->cObjGetSingle($this->conf['dbEntry.'][$table][$field], $this->conf['dbEntry.'][$table][$field . '.']); // write current TS value to array + } + } + + // 2. DB insert + $this->dbUpdate($this->removeDot($table), $this->db_values[$table]); // Main DB entry for every table + + // 2.1 db entry for mm tables if set + if (count($this->conf['dbEntry.'][$table]['_mm.']) > 0) { // if mm entry enabled + foreach ($this->conf['dbEntry.'][$table]['_mm.'] as $key_mm => $value_mm) { // One loop for every mm db insert + if (substr($key_mm, -1) == '.') { // We want the array + if ( + $this->fieldExists('uid_local', $this->cObj->cObjGetSingle($this->conf['dbEntry.'][$table]['_mm.'][$key_mm]['1'], $this->conf['dbEntry.'][$table]['_mm.'][$key_mm]['1.'])) + && + $this->fieldExists('uid', $this->cObj->cObjGetSingle($this->conf['dbEntry.'][$table]['_mm.'][$key_mm]['2'], $this->conf['dbEntry.'][$table]['_mm.'][$key_mm]['2.'])) + && + is_numeric($this->cObj->cObjGetSingle($this->conf['dbEntry.'][$table]['_mm.'][$key_mm]['3'], $this->conf['dbEntry.'][$table]['_mm.'][$key_mm]['3.'])) + ) { // 1. is db table && 2. is db table && 3. is a number + if ($this->uid[str_replace('.', '', $table)] > 0) { // if uid_local exists + $this->db_values_mm[$table] = array ( + 'uid_local' => $this->uid[str_replace('.', '', $table)], + 'uid_foreign' => $this->cObj->cObjGetSingle($this->conf['dbEntry.'][$table]['_mm.'][$key_mm]['3'], $this->conf['dbEntry.'][$table]['_mm.'][$key_mm]['3.']) + ); + } + if (count($this->db_values_mm[$table]) > 0) { // DB entry for every table + $this->dbUpdate($this->cObj->cObjGetSingle($this->conf['dbEntry.'][$table]['_mm.'][$key_mm]['1'], $this->conf['dbEntry.'][$table]['_mm.'][$key_mm]['1.']), $this->db_values_mm[$table]); + } + } + } + } + } + } + + $this->debug(); + } + + /** + * Function dbUpdate() inserts or updates database + * + * @param string Table + * @param array values + * @return void + */ + private function dbUpdate($table, $values) { + if (count($values) == 0) { // if there are values + return; + } + if (!isset($this->conf['dbEntry.'][$table . '.']['_ifUnique.']) || $this->conf['dbEntry.'][$table . '.']['_ifUnique.'] == 'disable') { // no unique values + if ($this->dbInsert) { // if allowed + $GLOBALS['TYPO3_DB']->exec_INSERTquery($table, $values); // DB entry for every table + $this->uid[$table] = $GLOBALS['TYPO3_DB']->sql_insert_id(); // Get uid of current db entry + } + + } else { // unique values + + $uniqueField = key($this->conf['dbEntry.'][$table . '.']['_ifUnique.']); // get first entry of this array + $mode = $this->conf['dbEntry.'][$table . '.']['_ifUnique.'][$uniqueField]; // mode could be "none" or "update" + if ($this->fieldExists('uid', $table)) { // check if field uid exists in table + // get uid of existing value + $select = 'uid'; + $from = $table; + $where = $uniqueField; + $where .= ' = "' . $this->cObj->cObjGetSingle($this->conf['dbEntry.'][$table . '.'][$uniqueField], $this->conf['dbEntry.'][$table . '.'][$uniqueField . '.']) . '"'; + $where .= ($this->fieldExists('deleted', $table) ? ' AND deleted = 0' : ''); + $groupBy = ''; + $orderBy = ''; + $limit = 1; + $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery($select, $from, $where, $groupBy, $orderBy, $limit); + if ($res) { + $row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res); + } + } + + if ($row['uid'] > 0) { // there is already an entry in the database + switch ($mode) { + case 'update': // mode is update + $GLOBALS['TYPO3_DB']->exec_UPDATEquery($table, 'uid = ' . intval($row['uid']), $values); // update old entry with new values + // Make row uid global + $this->uid[$table] = $row['uid']; + break; + + case 'none': // mode is none + default: + // do nothing + $this->db_values = 'Entry already exists, won\'t be overwritten'; + break; + } + + } else { // there is no entry in the database + + $GLOBALS['TYPO3_DB']->exec_INSERTquery($table, $values); // New DB entry + $this->uid[$table] = $GLOBALS['TYPO3_DB']->sql_insert_id(); // Get uid of current db entry + + } + + } + } + + /** + * Function fieldExists() checks if a table and field exist in mysql db + * + * @param string field + * @param string table + * @return void + */ + private function fieldExists($field = '', $table = '') { + if (empty($field) || empty($table) || stristr($field, '.')) { + return 0; + } + + // check if table and field exits in db + $row1 = $GLOBALS['TYPO3_DB']->sql_fetch_assoc(mysql_query('SHOW TABLES LIKE "' . $table . '"')); // check if table exist + if ($row1) { + $row2 = $GLOBALS['TYPO3_DB']->sql_fetch_assoc(mysql_query('DESCRIBE ' . $table . ' ' . $field)); // check if field exist (if table is wront - errormessage) + } + + // debug values + if (!$row1) { + $this->debug_array['ERROR'][] = 'Table "' . $table . '" don\'t exists in db'; // errormessage if table don't exits + } + if (!$row2 && $row1) { + $this->debug_array['ERROR'][] = 'Field "' . $field . '" don\'t exists in db table "' . $table . '"'; // errormessage if field don't exits + } + + // return true or false + if ($row1 && $row2) { + return 1; // table and field exist + } else { + return 0; // table or field don't exist + } + } + + /** + * Remove . from string + * + * @param string string with a . + * @return string string without any . + */ + private function removeDot($string) { + return str_replace('.', '', $string); + } + + /** + * Pushes out some debug messages + * + * @return void + */ + private function debug() { + // Debug Output + $this->debug_array['Main Table'] = $this->db_values; // array for debug view + $this->debug_array['MM Table'] = (count($this->db_values_mm) > 0 ? $this->db_values_mm : 'no values or entry already exists'); // array for debug view + if ($this->conf['debug.']['saveToTable']) { + t3lib_utility_Debug::debug($this->debug_array, 'powermail debug: Show Values from "SaveToTable" Function'); + } + } +} + +?> \ No newline at end of file diff --git a/Classes/Utility/WizIcon.php b/Classes/Utility/WizIcon.php new file mode 100644 index 00000000..345aa0e5 --- /dev/null +++ b/Classes/Utility/WizIcon.php @@ -0,0 +1,84 @@ + +* All rights reserved +* +* This script is part of the TYPO3 project. The TYPO3 project is +* free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* The GNU General Public License can be found at +* http://www.gnu.org/copyleft/gpl.html. +* +* This script is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* This copyright notice MUST APPEAR in all copies of the script! +***************************************************************/ + +/** + * Plugin 'Powermail' for the 'powermail' extension. + * + * @author 2010 powermail development team (details on http://forge.typo3.org/projects/show/extension-powermail) + * @package TYPO3 + * @subpackage tx_powermail + */ + +/** + * [CLASS/FUNCTION INDEX of SCRIPT] + * + * + * + * 49: class tx_powermail_pi1_wizicon + * 57: function proc($wizardItems) + * 80: function includeLocalLang() + * + * TOTAL FUNCTIONS: 2 + * (This index is automatically created/updated by the extension "extdeveval") + * + */ +class tx_powermail_pi1_wizicon { + + /** + * Processing the wizard items array + * + * @param array $wizardItems: The wizard items + * @return array array with wizard items + */ + function proc($wizardItems) { + global $LANG; + + $LL = $this->includeLocalLang(); + + $wizardItems['plugins_tx_powermail_pi1'] = array( + 'icon' => t3lib_extMgm::extRelPath('powermail') . 'Resources/Public/Icons/ce_wiz.gif', + 'title' => $LANG->getLLL('pi1_title', $LL), + 'description' => $LANG->getLLL('pi1_plus_wiz_description', $LL), + 'params' => '&defVals[tt_content][CType]=list&defVals[tt_content][list_type]=powermail_pi1', + 'tt_content_defValues' => array( + 'CType' => 'list', + ), + ); + + return $wizardItems; + } + + /** + * Reads the [extDir]/locallang.xml and returns the \$LOCAL_LANG array found in that file. + * + * @return The array with language labels + */ + function includeLocalLang() { + $llFile = t3lib_extMgm::extPath(powermail) . 'Resources/Private/Language/locallang.xml'; + $LOCAL_LANG = t3lib_div::readLLXMLfile($llFile, $GLOBALS['LANG']->lang); + + return $LOCAL_LANG; + } +} +?> \ No newline at end of file diff --git a/Classes/ViewHelpers/BeCheck/ExtMngConfigViewHelper.php b/Classes/ViewHelpers/BeCheck/ExtMngConfigViewHelper.php new file mode 100644 index 00000000..9111f268 --- /dev/null +++ b/Classes/ViewHelpers/BeCheck/ExtMngConfigViewHelper.php @@ -0,0 +1,27 @@ + 2) { + return true; + } + return false; + } +} + +?> \ No newline at end of file diff --git a/Classes/ViewHelpers/BeCheck/SessionViewHelper.php b/Classes/ViewHelpers/BeCheck/SessionViewHelper.php new file mode 100644 index 00000000..71fc56da --- /dev/null +++ b/Classes/ViewHelpers/BeCheck/SessionViewHelper.php @@ -0,0 +1,44 @@ +fe_user = $userObj; + + // random value for session storing + $value = md5(time()); + + // store in session + $GLOBALS['TSFE']->fe_user->setKey('ses', $this->sessionKey, $value); + $GLOBALS['TSFE']->storeSessionData(); + + if ($GLOBALS['TSFE']->fe_user->getKey('ses', $this->sessionKey) == $value) { + return true; + } + return false; + } +} + +?> \ No newline at end of file diff --git a/Classes/ViewHelpers/BeCheck/T3VersionViewHelper.php b/Classes/ViewHelpers/BeCheck/T3VersionViewHelper.php new file mode 100644 index 00000000..6dc6a472 --- /dev/null +++ b/Classes/ViewHelpers/BeCheck/T3VersionViewHelper.php @@ -0,0 +1,32 @@ + t3lib_div::int_from_ver($versions[0]) && t3lib_div::int_from_ver(TYPO3_version) < t3lib_div::int_from_ver($versions[1])) { + return true; + } + return false; + } +} + +?> \ No newline at end of file diff --git a/Classes/ViewHelpers/BeCheck/UploadsFolderViewHelper.php b/Classes/ViewHelpers/BeCheck/UploadsFolderViewHelper.php new file mode 100644 index 00000000..5400faa7 --- /dev/null +++ b/Classes/ViewHelpers/BeCheck/UploadsFolderViewHelper.php @@ -0,0 +1,28 @@ +folder)); + } +} + +?> \ No newline at end of file diff --git a/Classes/ViewHelpers/Condition/IsAllowedToEditViewHelper.php b/Classes/ViewHelpers/Condition/IsAllowedToEditViewHelper.php new file mode 100644 index 00000000..1f96b736 --- /dev/null +++ b/Classes/ViewHelpers/Condition/IsAllowedToEditViewHelper.php @@ -0,0 +1,42 @@ +div->isAllowedToEdit($settings, $mail)) { + return true; + } + return false; + } + + /** + * Constructor + * + * @return void + */ + public function __construct() { + $this->div = t3lib_div::makeInstance('Tx_Powermail_Utility_Div'); + } +} + +?> \ No newline at end of file diff --git a/Classes/ViewHelpers/Condition/IsArrayViewHelper.php b/Classes/ViewHelpers/Condition/IsArrayViewHelper.php new file mode 100644 index 00000000..71c23bb6 --- /dev/null +++ b/Classes/ViewHelpers/Condition/IsArrayViewHelper.php @@ -0,0 +1,22 @@ + \ No newline at end of file diff --git a/Classes/ViewHelpers/Condition/IsDateTimeVariableInVariableViewHelper.php b/Classes/ViewHelpers/Condition/IsDateTimeVariableInVariableViewHelper.php new file mode 100644 index 00000000..111daf25 --- /dev/null +++ b/Classes/ViewHelpers/Condition/IsDateTimeVariableInVariableViewHelper.php @@ -0,0 +1,26 @@ +{'get' . t3lib_div::underscoredToUpperCamelCase($prop)}(); + } + return method_exists($mixed, 'getTimestamp'); + } +} + +?> \ No newline at end of file diff --git a/Classes/ViewHelpers/Condition/IsNumberViewHelper.php b/Classes/ViewHelpers/Condition/IsNumberViewHelper.php new file mode 100644 index 00000000..8b2de190 --- /dev/null +++ b/Classes/ViewHelpers/Condition/IsNumberViewHelper.php @@ -0,0 +1,22 @@ + \ No newline at end of file diff --git a/Classes/ViewHelpers/Condition/IsStringInStringViewHelper.php b/Classes/ViewHelpers/Condition/IsStringInStringViewHelper.php new file mode 100644 index 00000000..004295c9 --- /dev/null +++ b/Classes/ViewHelpers/Condition/IsStringInStringViewHelper.php @@ -0,0 +1,23 @@ + \ No newline at end of file diff --git a/Classes/ViewHelpers/Condition/IsThereAMailWithStartingLetterViewHelper.php b/Classes/ViewHelpers/Condition/IsThereAMailWithStartingLetterViewHelper.php new file mode 100644 index 00000000..080f20b7 --- /dev/null +++ b/Classes/ViewHelpers/Condition/IsThereAMailWithStartingLetterViewHelper.php @@ -0,0 +1,34 @@ +getAnswers() as $answer) { + if ($answer->getField() == $answerField) { + $value = $answer->getValue(); + if (strtolower($value[0]) == strtolower($letter)) { + return true; + } + } + } + } + return false; + } +} + +?> \ No newline at end of file diff --git a/Classes/ViewHelpers/Condition/OrViewHelper.php b/Classes/ViewHelpers/Condition/OrViewHelper.php new file mode 100644 index 00000000..61477cf8 --- /dev/null +++ b/Classes/ViewHelpers/Condition/OrViewHelper.php @@ -0,0 +1,25 @@ + \ No newline at end of file diff --git a/Classes/ViewHelpers/Form/AdvancedSelectViewHelper.php b/Classes/ViewHelpers/Form/AdvancedSelectViewHelper.php new file mode 100644 index 00000000..63454e9b --- /dev/null +++ b/Classes/ViewHelpers/Form/AdvancedSelectViewHelper.php @@ -0,0 +1,44 @@ +registerArgument('defaultOption', 'string', 'value to prepend', FALSE); + } + + /** + * Options + * + * @return array + */ + protected function getOptions() { + return array("" => $this->arguments['defaultOption']) + parent::getOptions(); + } +} + +?> \ No newline at end of file diff --git a/Classes/ViewHelpers/Form/SelectFieldViewHelper.php b/Classes/ViewHelpers/Form/SelectFieldViewHelper.php new file mode 100644 index 00000000..e32f7cbd --- /dev/null +++ b/Classes/ViewHelpers/Form/SelectFieldViewHelper.php @@ -0,0 +1,62 @@ + + * label => Red Shoes + * value => red + * selected => 1 + * @param string Class + * @param string ID + * @return string Select field + */ + public function render($options, $class = '', $id = '') { + // config +// $this->registerFieldNameForFormTokenGeneration($this->prefixFieldName($this->getName())); + $this->registerFieldNameForFormTokenGeneration($this->getName()); + $string = ''; + + // select + $string .= 'getName()) { +// $string .= ' name="' . $this->prefixFieldName($this->getName()) . '"'; + $string .= ' name="' . $this->getName() . '"'; + } + if ($class) { + $string .= ' class="' . $class . '"'; + } + if ($id) { + $string .= ' id="' . $id . '"'; + } + $string .= '>'; + + // option + foreach ($options as $option) { + $string .= ''; + } + $string .= ''; + + return $string; + } +} + +?> \ No newline at end of file diff --git a/Classes/ViewHelpers/Getter/GetFieldLabelFromUidViewHelper.php b/Classes/ViewHelpers/Getter/GetFieldLabelFromUidViewHelper.php new file mode 100644 index 00000000..5847ce6e --- /dev/null +++ b/Classes/ViewHelpers/Getter/GetFieldLabelFromUidViewHelper.php @@ -0,0 +1,43 @@ +fieldsRepository->findByUid($uid); + if (method_exists($field, 'getTitle')) { + return $field->getTitle(); + } + } + + /** + * injectFieldsRepository + * + * @param Tx_Powermail_Domain_Repository_FieldsRepository $fieldsRepository + * @return void + */ + public function injectFieldsRepository(Tx_Powermail_Domain_Repository_FieldsRepository $fieldsRepository) { + $this->fieldsRepository = $fieldsRepository; + } +} + +?> \ No newline at end of file diff --git a/Classes/ViewHelpers/Getter/GetFieldMarkerFromUidViewHelper.php b/Classes/ViewHelpers/Getter/GetFieldMarkerFromUidViewHelper.php new file mode 100644 index 00000000..e7298314 --- /dev/null +++ b/Classes/ViewHelpers/Getter/GetFieldMarkerFromUidViewHelper.php @@ -0,0 +1,43 @@ +fieldsRepository->findByUid($uid); + if (method_exists($field, 'getMarker')) { + return $field->getMarker(); + } + } + + /** + * injectFieldsRepository + * + * @param Tx_Powermail_Domain_Repository_FieldsRepository $fieldsRepository + * @return void + */ + public function injectFieldsRepository(Tx_Powermail_Domain_Repository_FieldsRepository $fieldsRepository) { + $this->fieldsRepository = $fieldsRepository; + } +} + +?> \ No newline at end of file diff --git a/Classes/ViewHelpers/Getter/GetPageNameFromUidViewHelper.php b/Classes/ViewHelpers/Getter/GetPageNameFromUidViewHelper.php new file mode 100644 index 00000000..a0945146 --- /dev/null +++ b/Classes/ViewHelpers/Getter/GetPageNameFromUidViewHelper.php @@ -0,0 +1,39 @@ +pagesRepository->getPageNameFromUid($uid); + } + + /** + * injectPagesRepository + * + * @param Tx_Powermail_Domain_Repository_PagesRepository $pagesRepository + * @return void + */ + public function injectPagesRepository(Tx_Powermail_Domain_Repository_PagesRepository $pagesRepository) { + $this->pagesRepository = $pagesRepository; + } +} + +?> \ No newline at end of file diff --git a/Classes/ViewHelpers/Getter/GetPiVarAnswerFieldViewHelper.php b/Classes/ViewHelpers/Getter/GetPiVarAnswerFieldViewHelper.php new file mode 100644 index 00000000..2474c1da --- /dev/null +++ b/Classes/ViewHelpers/Getter/GetPiVarAnswerFieldViewHelper.php @@ -0,0 +1,25 @@ + \ No newline at end of file diff --git a/Classes/ViewHelpers/Misc/CaptchaViewHelper.php b/Classes/ViewHelpers/Misc/CaptchaViewHelper.php new file mode 100644 index 00000000..01487c6a --- /dev/null +++ b/Classes/ViewHelpers/Misc/CaptchaViewHelper.php @@ -0,0 +1,37 @@ +render($this->settings); + } + + /** + * @param Tx_Extbase_Configuration_ConfigurationManagerInterface $configurationManager + * @return void + */ + public function injectConfigurationManager(Tx_Extbase_Configuration_ConfigurationManagerInterface $configurationManager) { + $this->configurationManager = $configurationManager; + $this->typoScriptSetup = $this->configurationManager->getConfiguration(Tx_Extbase_Configuration_ConfigurationManagerInterface::CONFIGURATION_TYPE_FULL_TYPOSCRIPT); + $this->settings = $this->typoScriptSetup['plugin.']['tx_powermail.']['settings.']['setup.']; + } +} + +?> \ No newline at end of file diff --git a/Classes/ViewHelpers/Misc/ContentElementViewHelper.php b/Classes/ViewHelpers/Misc/ContentElementViewHelper.php new file mode 100644 index 00000000..eeb14273 --- /dev/null +++ b/Classes/ViewHelpers/Misc/ContentElementViewHelper.php @@ -0,0 +1,49 @@ + 'tt_content', + 'source' => $uid, + 'dontCheckPid' => 1 + ); + return $this->cObj->RECORDS($conf); + } + + /** + * Injects the Configuration Manager + * + * @param Tx_Extbase_Configuration_ConfigurationManagerInterface $configurationManager + * @return void + */ + public function injectConfigurationManager(Tx_Extbase_Configuration_ConfigurationManagerInterface $configurationManager) { + $this->configurationManager = $configurationManager; + $this->cObj = $this->configurationManager->getContentObject(); + } + +} + +?> \ No newline at end of file diff --git a/Classes/ViewHelpers/Misc/ErrorClassViewHelper.php b/Classes/ViewHelpers/Misc/ErrorClassViewHelper.php new file mode 100644 index 00000000..28cd4522 --- /dev/null +++ b/Classes/ViewHelpers/Misc/ErrorClassViewHelper.php @@ -0,0 +1,40 @@ +controllerContext->getRequest()->getErrors(); + foreach ($errors as $key => $error) { + if ($key != 'field') { + continue; + } + + // we want the field errors + $fieldErrors = $error->getErrors(); + foreach ($fieldErrors as $fieldError) { + if ($field->getUid() == $fieldError->getCode()) { + return $class; + } + } + } + + } +} + +?> \ No newline at end of file diff --git a/Classes/ViewHelpers/Misc/MorestepClassViewHelper.php b/Classes/ViewHelpers/Misc/MorestepClassViewHelper.php new file mode 100644 index 00000000..6faec3dc --- /dev/null +++ b/Classes/ViewHelpers/Misc/MorestepClassViewHelper.php @@ -0,0 +1,27 @@ + \ No newline at end of file diff --git a/Classes/ViewHelpers/Misc/PrefillFieldViewHelper.php b/Classes/ViewHelpers/Misc/PrefillFieldViewHelper.php new file mode 100644 index 00000000..39dcfee2 --- /dev/null +++ b/Classes/ViewHelpers/Misc/PrefillFieldViewHelper.php @@ -0,0 +1,176 @@ +getMarker(); + $uid = $field->getUid(); + + // Default fieldtypes (input, textarea, hidden, select) + if ($cycle == 0) { + + // if GET/POST with marker (&tx_powermail_pi1[marker]=value) + if (isset($this->piVars[$marker])) { + $value = $this->piVars[$marker]; + } + + // if GET/POST with new uid (&tx_powermail_pi1[field][123]=value) + elseif (isset($this->piVars['field'][$uid])) { + $value = $this->piVars['field'][$uid]; + } + + // if GET/POST with old uid (&tx_powermail_pi1[uid123]=value (downgrade to powermail < 2) + elseif (isset($this->piVars['uid' . $uid])) { + $value = $this->piVars['uid' . $uid]; + } + + // if field should be filled with FE_User values + elseif ($field->getFeuserValue()) { + if (intval($GLOBALS['TSFE']->fe_user->user['uid']) !== 0) { // if fe_user is logged in + $value = $GLOBALS['TSFE']->fe_user->user[$field->getFeuserValue()]; + } + } + + // if prefill value (from flexform) + elseif ($field->getPrefillValue()) { + $value = $field->getPrefillValue(); + } + + // if prefill value (from typoscript) + elseif ($this->settings['prefill.'][$marker]) { + if (isset($this->settings['prefill.'][$marker . '.']) && is_array($this->settings['prefill.'][$marker . '.'])) { // Parse cObject + $data = Tx_Extbase_Reflection_ObjectAccess::getGettableProperties($field); // make array from object + $this->cObj->start($data); // push to ts + $value = $this->cObj->cObjGetSingle($this->settings['prefill.'][$marker], $this->settings['prefill.'][$marker . '.']); // parse + } else { // Use String only + $value = $this->settings['prefill.'][$marker]; + } + + } + + return $value; + + + + // Check, Radio + } else { + $selected = 0; + $index = $cycle - 1; + $options = $field->getSettings(); + + // if GET/POST with marker (&tx_powermail_pi1[marker]=value) + if (isset($this->piVars[$marker])) { + if ($this->piVars[$marker] == $options[$index]['value'] || $this->piVars[$marker] == $options[$index]['label']) { + $selected = 1; + } + } + + // if GET/POST with new uid (&tx_powermail_pi1[field][123]=value) + elseif (isset($this->piVars['field'][$uid])) { + if (is_array($this->piVars['field'][$uid])) { + foreach ($this->piVars['field'][$uid] as $key => $value) { + if ($this->piVars['field'][$uid][$key] == $options[$index]['value'] || $this->piVars['field'][$uid][$key] == $options[$index]['label']) { + $selected = 1; + } + } + } else { + if ($this->piVars['field'][$uid] == $options[$index]['value'] || $this->piVars['field'][$uid] == $options[$index]['label']) { + $selected = 1; + } + } + } + + // if GET/POST with old uid (&tx_powermail_pi1[uid123]=value (downgrade to powermail < 2) + elseif (isset($this->piVars['uid' . $uid])) { + if ($this->piVars['uid' . $uid] == $options[$index]['value'] || $this->piVars['uid' . $uid] == $options[$index]['label']) { + $selected = 1; + } + } + + // if field should be filled with FE_User values + elseif ($field->getFeuserValue() && intval($GLOBALS['TSFE']->fe_user->user['uid']) !== 0) { + if ($GLOBALS['TSFE']->fe_user->user[$field->getFeuserValue()] == $options[$index]['value'] || $GLOBALS['TSFE']->fe_user->user[$field->getFeuserValue()] == $options[$index]['label']) { // if fe_user is logged in + $selected = 1; + } + } + + // if prefill value (from flexform) + elseif ($options[$index]['selected']) { + $selected = 1; + } + + // if prefill value (from typoscript) + elseif ($this->settings['prefill.'][$marker]) { + if (isset($this->settings['prefill.'][$marker . '.']) && is_array($this->settings['prefill.'][$marker . '.'])) { // Parse cObject + $data = Tx_Extbase_Reflection_ObjectAccess::getGettableProperties($field); // make array from object + $this->cObj->start($data); // push to ts + if ( + $this->cObj->cObjGetSingle($this->settings['prefill.'][$marker], $this->settings['prefill.'][$marker . '.']) == $options[$index]['value'] || + $this->cObj->cObjGetSingle($this->settings['prefill.'][$marker], $this->settings['prefill.'][$marker . '.']) == $options[$index]['label'] + ) { + $selected = 1; + } + } else { // Use String only + if ($this->settings['prefill.'][$marker] == $options[$index]['value'] || $this->settings['prefill.'][$marker] == $options[$index]['label']) { + $selected = 1; + } + } + + } + + return $selected; + } + + } + + /** + * @param Tx_Extbase_Configuration_ConfigurationManagerInterface $configurationManager + * @return void + */ + public function injectConfigurationManager(Tx_Extbase_Configuration_ConfigurationManagerInterface $configurationManager) { + $this->configurationManager = $configurationManager; + $this->cObj = $this->configurationManager->getContentObject(); + $this->typoScriptSetup = $this->configurationManager->getConfiguration(Tx_Extbase_Configuration_ConfigurationManagerInterface::CONFIGURATION_TYPE_FULL_TYPOSCRIPT); + $this->settings = $this->typoScriptSetup['plugin.']['tx_powermail.']['settings.']['setup.']; + $this->piVars = t3lib_div::_GP('tx_powermail_pi1'); + } +} + +?> \ No newline at end of file diff --git a/Classes/ViewHelpers/Misc/ValidationClassViewHelper.php b/Classes/ViewHelpers/Misc/ValidationClassViewHelper.php new file mode 100644 index 00000000..d330de2b --- /dev/null +++ b/Classes/ViewHelpers/Misc/ValidationClassViewHelper.php @@ -0,0 +1,65 @@ + 'email', // email + 2 => 'url', // url + 3 => 'phone', // phone + 4 => 'integer', // numbers + 5 => 'onlyLetterSp', // letters + ); + + /** + * Returns CSS Class for JS validation + * e.g. validate[required,custom[email]] + * http://www.position-relative.net/creation/formValidator/demos/demoValidators.html + * http://www.position-absolute.com/articles/jquery-form-validator-because-form-validation-is-a-mess/ + * + * @param object Current field + * @return string CSS Class + */ + public function render($field) { + if (!$field->getMandatory() && !$field->getValidation()) { + return ''; + } + + $cssString = ''; + + $cssString .= 'validate['; + + if ($field->getMandatory()) { + if ($field->getType() != 'check') { // normal fields + $cssString .= 'required'; + if ($field->getValidation()) { + $cssString .= ','; + } + } else { // checkbox +// $cssString .= 'minCheckbox[1]'; + $cssString .= 'funcCall[checkCheckboxes]'; + } + } + + if ($field->getValidation()) { + $cssString .= 'custom['. $this->validationArray[$field->getValidation()] . ']'; + } + + $cssString .= ']'; + + return $cssString; + } + +} +?> \ No newline at end of file diff --git a/Classes/ViewHelpers/Misc/VariableInVariableViewHelper.php b/Classes/ViewHelpers/Misc/VariableInVariableViewHelper.php new file mode 100644 index 00000000..f3e1e635 --- /dev/null +++ b/Classes/ViewHelpers/Misc/VariableInVariableViewHelper.php @@ -0,0 +1,29 @@ +{'get' . t3lib_div::underscoredToUpperCamelCase($prop)}(); + } elseif (is_array($obj)) { + if (array_key_exists($prop, $obj)) { + return $obj[$prop]; + } + } + return NULL; + } +} + +?> \ No newline at end of file diff --git a/Classes/ViewHelpers/Misc/VariablesViewHelper.php b/Classes/ViewHelpers/Misc/VariablesViewHelper.php new file mode 100644 index 00000000..98e20ea5 --- /dev/null +++ b/Classes/ViewHelpers/Misc/VariablesViewHelper.php @@ -0,0 +1,78 @@ +objectManager->create('Tx_Fluid_View_StandaloneView'); + $parseObject->setTemplateSource($this->renderChildren()); + $parseObject->assignMultiple($this->div->htmlspecialcharsOnArray($variablesMarkers)); + + $powermailAll = $this->div->powermailAll($variablesLabels, $this->configurationManager, $this->objectManager, $type); + $parseObject->assign('powermail_all', $powermailAll); + + return html_entity_decode($parseObject->render()); + } + + /** + * Injects the Configuration Manager + * + * @param Tx_Extbase_Configuration_ConfigurationManagerInterface $configurationManager + * @return void + */ + public function injectConfigurationManager(Tx_Extbase_Configuration_ConfigurationManagerInterface $configurationManager) { + $this->configurationManager = $configurationManager; + } + + /** + * Injects the Object Manager + * + * @param Tx_Extbase_Object_ObjectManagerInterface $objectManager + * @return void + */ + public function injectObjectManager(Tx_Extbase_Object_ObjectManagerInterface $objectManager) { + $this->objectManager = $objectManager; + } + + /** + * Constructor + * + * @return void + */ + public function __construct() { + $this->div = t3lib_div::makeInstance('Tx_Powermail_Utility_Div'); + } + +} + +?> \ No newline at end of file diff --git a/Classes/ViewHelpers/Reporting/GetLabelsGoogleChartsViewHelper.php b/Classes/ViewHelpers/Reporting/GetLabelsGoogleChartsViewHelper.php new file mode 100644 index 00000000..600ee5d0 --- /dev/null +++ b/Classes/ViewHelpers/Reporting/GetLabelsGoogleChartsViewHelper.php @@ -0,0 +1,38 @@ + $amount) { + if (strlen($value) > $crop) { + $value = substr($value, 0, $crop) . '...'; + } + $string .= $value; + $string .= '|'; + } + + return urlencode(substr($string, 0, -1)); + } +} + +?> \ No newline at end of file diff --git a/Classes/ViewHelpers/Reporting/GetValuesGoogleChartsViewHelper.php b/Classes/ViewHelpers/Reporting/GetValuesGoogleChartsViewHelper.php new file mode 100644 index 00000000..2a8bb9b8 --- /dev/null +++ b/Classes/ViewHelpers/Reporting/GetValuesGoogleChartsViewHelper.php @@ -0,0 +1,35 @@ + $amount) { + $string .= $amount; + $string .= $separator; + } + + return urlencode(substr($string, 0, -1)); + } +} + +?> \ No newline at end of file diff --git a/Classes/ViewHelpers/String/EncodeViewHelper.php b/Classes/ViewHelpers/String/EncodeViewHelper.php new file mode 100644 index 00000000..687683d7 --- /dev/null +++ b/Classes/ViewHelpers/String/EncodeViewHelper.php @@ -0,0 +1,23 @@ +renderChildren()); + return $string; + } +} + +?> \ No newline at end of file diff --git a/Classes/ViewHelpers/String/ExplodeViewHelper.php b/Classes/ViewHelpers/String/ExplodeViewHelper.php new file mode 100644 index 00000000..3a019b34 --- /dev/null +++ b/Classes/ViewHelpers/String/ExplodeViewHelper.php @@ -0,0 +1,24 @@ + \ No newline at end of file diff --git a/Classes/ViewHelpers/String/ImplodeFieldViewHelper.php b/Classes/ViewHelpers/String/ImplodeFieldViewHelper.php new file mode 100644 index 00000000..375873a8 --- /dev/null +++ b/Classes/ViewHelpers/String/ImplodeFieldViewHelper.php @@ -0,0 +1,31 @@ +{'get' . ucfirst($field)}(); + $string .= $separator; + } + } + return substr($string, 0, (-1 * strlen($separator))); + } +} + +?> \ No newline at end of file diff --git a/Classes/ViewHelpers/String/RemoveQuoteViewHelper.php b/Classes/ViewHelpers/String/RemoveQuoteViewHelper.php new file mode 100644 index 00000000..20e53cd0 --- /dev/null +++ b/Classes/ViewHelpers/String/RemoveQuoteViewHelper.php @@ -0,0 +1,23 @@ +renderChildren()); + + return $string; + } +} + +?> \ No newline at end of file diff --git a/Classes/ViewHelpers/String/TrimViewHelper.php b/Classes/ViewHelpers/String/TrimViewHelper.php new file mode 100644 index 00000000..b03b290f --- /dev/null +++ b/Classes/ViewHelpers/String/TrimViewHelper.php @@ -0,0 +1,27 @@ +renderChildren()); + $string = preg_replace('/\\s\\s+/', ' ', $string); + $string = str_replace(array('"; "', '" ; "', '" ;"'), '";"', $string); + $string = str_replace(array('
', '
', '
'), "\n", $string); + $string = str_replace(array(" \n ", "\n ", " \n"), "\n", $string); + + return $string; + } +} + +?> \ No newline at end of file diff --git a/Classes/ViewHelpers/String/UnderscoredToLowerCamelCaseViewHelper.php b/Classes/ViewHelpers/String/UnderscoredToLowerCamelCaseViewHelper.php new file mode 100644 index 00000000..b57acf80 --- /dev/null +++ b/Classes/ViewHelpers/String/UnderscoredToLowerCamelCaseViewHelper.php @@ -0,0 +1,22 @@ + niceField) + * + * @param string String + * @return string + */ + public function render($val = '') { + return t3lib_div::underscoredToLowerCamelCase($val); + } +} + +?> \ No newline at end of file diff --git a/Classes/ViewHelpers/String/UpperViewHelper.php b/Classes/ViewHelpers/String/UpperViewHelper.php new file mode 100644 index 00000000..ce4fa590 --- /dev/null +++ b/Classes/ViewHelpers/String/UpperViewHelper.php @@ -0,0 +1,25 @@ + \ No newline at end of file diff --git a/Classes/ViewHelpers/String/Utf8DecodeViewHelper.php b/Classes/ViewHelpers/String/Utf8DecodeViewHelper.php new file mode 100644 index 00000000..d7587668 --- /dev/null +++ b/Classes/ViewHelpers/String/Utf8DecodeViewHelper.php @@ -0,0 +1,21 @@ +renderChildren()); + } +} + +?> \ No newline at end of file diff --git a/Configuration/ExtensionBuilder/settings.yaml b/Configuration/ExtensionBuilder/settings.yaml new file mode 100644 index 00000000..9a155f79 --- /dev/null +++ b/Configuration/ExtensionBuilder/settings.yaml @@ -0,0 +1,95 @@ +# +# Extension Builder settings for extension powermail +# generated 2012-02-12 +# +# See http://www.yaml.org/spec/1.2/spec.html +# + +--- + +########### Overwrite settings ########### +# +# These settings only apply, if the roundtrip feature of the extension builder +# is enabled in the extension manager +# +# Usage: +# nesting reflects the file structure +# a setting applies to a file or recursive to all files and subfolders +# +# merge: +# means for classes: All properties ,methods and method bodies +# of the existing class will be modified according to the new settings +# but not overwritten +# +# for locallang xml files: Existing keys and labels are always +# preserved (renaming in the GUI has only influence on the property and method names) +# +# for other files: You will find a Split token at the end of the file +# After this token you can write whatever you want and it will be appended +# everytime the code is generated +# +# keep: +# files are never overwritten +# These settings may break the functionality of the extension builder! +# Handle with care! +# +# + +############ extension settings ############## + +emConf: + dependencies: cms,extbase,fluid + +overwriteSettings: + Classes: + Controller: merge + Domain: + Model: merge + Repository: merge + + Configuration: + #TCA: merge + #TypoScript: keep + + Resources: + Private: + Language: + #locallang.xml: merge + #Templates: keep + + ext_icon.gif: keep + +# ext_localconf.php: merge + +# ext_tables.php: merge + +# ext_tables.sql: merge + +## ext_autoload.php is only needed in special cases ## +createAutoloadRegistry: false + +######### settings for classBuilder ############################# +# +# here you may define default parent classes for your classes +# these settings only apply for new generated classes +# you may also just change the parent class in the generated class file. +# It will be kept on next code generation, if the overwrite settings +# are configured to merge it +# +# Experimental!! +################################################################# + +classBuilder: + + Controller: + parentClass: Tx_Extbase_MVC_Controller_ActionController + + Model: + AbstractEntity: + parentClass: Tx_Extbase_DomainObject_AbstractEntity + + AbstractValueObject: + parentClass: Tx_Extbase_DomainObject_AbstractValueObject + + Repository: + parentClass: Tx_Extbase_Persistence_Repository \ No newline at end of file diff --git a/Configuration/FlexForms/flexform_pi1.xml b/Configuration/FlexForms/flexform_pi1.xml new file mode 100644 index 00000000..e9f5802d --- /dev/null +++ b/Configuration/FlexForms/flexform_pi1.xml @@ -0,0 +1,258 @@ + + + 1 + + +
+ + + LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:flexform.main + + array + + + + + + select + + + + 100 + 4 + 10 + 1 + tx_powermail_domain_model_forms + AND tx_powermail_domain_model_forms.deleted = 0 AND tx_powermail_domain_model_forms.hidden = 0 order by tx_powermail_domain_model_forms.title + 1 + + <_PADDING>16 + <_VERTICAL> + + script + Add Form + add.gif + + tx_powermail_domain_model_forms
+ ###CURRENT_PID###, + set +
+ +
+ + + + + + + + + + Add Form + suggest + +
+
+
+
+ + + + + group + db + pages + 1 + 1 + 0 + 1 + + + + + + + + check + 0 + + + + + + + + check + 0 + + + + + + + + check + 0 + + + +
+
+
+ + + + LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:flexform.receiver + + array + + + + + + input + trim + + + + + + + + text + 32 + 2 + + + + + + + + select + + + LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:pleaseChoose + + + + 1 + 1 + 0 + width:300px; + width:300px; + fe_groups + AND fe_groups.deleted = 0 AND fe_groups.hidden = 0 order by fe_groups.title + + + + + + + + input + trim + + + + + + + + text + {powermail_all} + + richtext[cut|copy|paste|formatblock|bold|italic|underline|left|center|right|orderedlist|unorderedlist|outdent|indent|link|image|line|chMode]:rte_transform[mode=css] + + + + + + + + + LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:flexform.sender + + array + + + + + + input + trim + + + + + + + + input + trim,Tx_Powermail_Utility_EvaluateEmail + + + + + + + + input + trim + + + + + + + + text + {powermail_all} + + richtext[cut|copy|paste|formatblock|bold|italic|underline|left|center|right|orderedlist|unorderedlist|outdent|indent|link|image|line|chMode]:rte_transform[mode=css] + + + + + + + + + LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:flexform.thx + + array + + + + + + text + {powermail_all} + + richtext[cut|copy|paste|formatblock|bold|italic|underline|left|center|right|orderedlist|unorderedlist|outdent|indent|link|image|line|chMode]:rte_transform[mode=css] + + + + + + + input + trim + + <_PADDING type="integer">2 + + popup + Link + link_popup.gif + + height=300,width=500,status=0,menubar=0,scrollbars=1 + + + + + + + + +
+
\ No newline at end of file diff --git a/Configuration/FlexForms/flexform_pi2.xml b/Configuration/FlexForms/flexform_pi2.xml new file mode 100644 index 00000000..d691c3eb --- /dev/null +++ b/Configuration/FlexForms/flexform_pi2.xml @@ -0,0 +1,391 @@ + + + 1 + + +
+ + + LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:flexform_pi2.main + + array + + + + + + select + + + LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:flexform_pi2.main.switchableControllerActions.0 + Output->list;Output->show;Output->export;Output->rss; + + + LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:flexform_pi2.main.switchableControllerActions.1 + Output->list;Output->show;Output->export;Output->rss; + + + LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:flexform_pi2.main.switchableControllerActions.2 + Output->edit;Output->update; + + + 1 + 1 + + + + + + + + select + + + LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:pleaseChoose + 0 + + + 1 + 1 + 1 + 1 + tx_powermail_domain_model_forms + AND tx_powermail_domain_model_forms.deleted = 0 AND tx_powermail_domain_model_forms.hidden = 0 order by tx_powermail_domain_model_forms.title + + <_PADDING>0 + + suggest + + + + reload + + + + + + + group + db + pages + 1 + 1 + 0 + 1 + + + + + +
+ + + + LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:flexform_pi2.list + + array + + + + + + select + + + + 100 + 5 + 10 + 0 + width:350px + width:350px + Tx_Powermail_Utility_FieldSelectorUserFunc->getFieldSelection + + + + + + + + select + + + LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:flexform_pi2.list.export.0 + xls + + + LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:flexform_pi2.list.export.1 + csv + + + LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:flexform_pi2.list.export.2 + rss + + + 10 + 4 + 10 + 0 + width:350px + width:350px + 1 + + + + + + 1 + + + input + 10 + + + + + + 1 + + + input + 10 + + + + + + 1 + + + group + db + pages + 1 + 1 + 0 + 1 + + + + + + + + check + + + LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:flexform_pi2.list.showownonly.0 + 1 + + + 0 + + + + + + + + + + LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:flexform_pi2.single + + array + + + + + + select + + + + 100 + 5 + 10 + 0 + width:350px + width:350px + Tx_Powermail_Utility_FieldSelectorUserFunc->getFieldSelection + + + + + + 1 + + + group + db + pages + 1 + 1 + 0 + 1 + + + + + + + + + + LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:flexform_pi2.search + + array + + + + + + select + + + LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:flexform_pi2.search.fields.all + _all + + + 100 + 3 + 10 + 0 + width:350px + width:350px + Tx_Powermail_Utility_FieldSelectorUserFunc->getFieldSelection + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + select + + + LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:flexform_pi2.search.abc.off + + + + 1 + 1 + 1 + Tx_Powermail_Utility_FieldSelectorUserFunc->getFieldSelection + + + + + + + + + + LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:flexform_pi2.edit + + array + + + + + + select + + + + 100 + 5 + 10 + 0 + width:350px + width:350px + Tx_Powermail_Utility_FieldSelectorUserFunc->getFieldSelection + + + + + + + + select + + + LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:flexform_pi2.edit.feuser.owner + _owner + + + 100 + 5 + 10 + 0 + width:350px + width:350px + fe_users + AND fe_users.disable = 0 AND fe_users.deleted = 0 order by fe_users.username + 1 + + + + + + + + select + + + LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:flexform_pi2.edit.feuser.owner + _owner + + + 100 + 5 + 10 + 0 + width:350px + width:350px + fe_groups + AND fe_groups.hidden = 0 AND fe_groups.deleted = 0 order by fe_groups.title + 1 + + + + + + 1 + + + group + db + pages + 1 + 1 + 0 + 1 + + + + + + +
+
\ No newline at end of file diff --git a/Configuration/TCA/Answers.php b/Configuration/TCA/Answers.php new file mode 100644 index 00000000..1f81bac5 --- /dev/null +++ b/Configuration/TCA/Answers.php @@ -0,0 +1,131 @@ + $TCA['tx_powermail_domain_model_answers']['ctrl'], + 'interface' => array( + 'showRecordFieldList' => 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, value, field, mail', + ), + 'types' => array( + '1' => array('showitem' => 'value, field, mail'), + ), + 'palettes' => array( + '1' => array(), + ), + 'columns' => array( + 'sys_language_uid' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.language', + 'config' => array( + 'type' => 'select', + 'foreign_table' => 'sys_language', + 'foreign_table_where' => 'ORDER BY sys_language.title', + 'items' => array( + array('LLL:EXT:lang/locallang_general.xml:LGL.allLanguages', -1), + array('LLL:EXT:lang/locallang_general.xml:LGL.default_value', 0) + ), + ), + ), + 'l10n_parent' => array( + 'displayCond' => 'FIELD:sys_language_uid:>:0', + 'exclude' => 1, + 'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.l18n_parent', + 'config' => array( + 'type' => 'select', + 'items' => array( + array('', 0), + ), + 'foreign_table' => 'tx_powermail_domain_model_answers', + 'foreign_table_where' => 'AND tx_powermail_domain_model_answers.pid=###CURRENT_PID### AND tx_powermail_domain_model_answers.sys_language_uid IN (-1,0)', + ), + ), + 'l10n_diffsource' => array( + 'config' => array( + 'type' => 'passthrough', + ), + ), + 't3ver_label' => array( + 'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.versionLabel', + 'config' => array( + 'type' => 'input', + 'size' => 30, + 'max' => 255, + ) + ), + 'hidden' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.hidden', + 'config' => array( + 'type' => 'check', + ), + ), + 'starttime' => array( + 'exclude' => 1, + 'l10n_mode' => 'mergeIfNotBlank', + 'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.starttime', + 'config' => array( + 'type' => 'input', + 'size' => 13, + 'max' => 20, + 'eval' => 'datetime', + 'checkbox' => 0, + 'default' => 0, + 'range' => array( + 'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y')) + ), + ), + ), + 'endtime' => array( + 'exclude' => 1, + 'l10n_mode' => 'mergeIfNotBlank', + 'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.endtime', + 'config' => array( + 'type' => 'input', + 'size' => 13, + 'max' => 20, + 'eval' => 'datetime', + 'checkbox' => 0, + 'default' => 0, + 'range' => array( + 'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y')) + ), + ), + ), + 'value' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_answers.value', + 'config' => array( + 'type' => 'input', + 'size' => 30, + 'eval' => '' + ), + ), + 'field' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_answers.field', + 'config' => array( + 'type' => 'group', + 'internal_type' => 'db', + 'allowed' => 'tx_powermail_domain_model_fields', + 'size' => 1, + 'maxitems' => 1, + 'multiple' => 0 + ), + ), + 'mail' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_answers.mail', + 'config' => array( + 'type' => 'group', + 'internal_type' => 'db', + 'allowed' => 'tx_powermail_domain_model_mails', + 'size' => 1, + 'maxitems' => 1, + 'multiple' => 0 + ), + ), + ), +); +?> \ No newline at end of file diff --git a/Configuration/TCA/Fields.php b/Configuration/TCA/Fields.php new file mode 100644 index 00000000..79809a22 --- /dev/null +++ b/Configuration/TCA/Fields.php @@ -0,0 +1,459 @@ + $TCA['tx_powermail_domain_model_fields']['ctrl'], + 'interface' => array( + 'showRecordFieldList' => 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, title, type, settings, path, content_element, text, prefill_value, mandatory, validation, css, feuser_value, sender_email, sender_name, own_marker_select, auto_marker, marker', + ), + 'types' => array( + '1' => array('showitem' => 'title, type, settings, path, content_element, text, --palette--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.palette1;1, --div--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.sheet1, validation_title, --palette--;Own marker;2, prefill_title, --palette--;Own marker;3, css, marker_title, --palette--;Own marker;4,--div--;LLL:EXT:cms/locallang_ttc.xml:tabs.access, sys_language_uid;;;;1-1-1, l10n_parent, l10n_diffsource, hidden;;1,starttime, endtime'), + ), + 'palettes' => array( + '1' => array('showitem' => 'sender_email, sender_name'), + '2' => array('showitem' => 'mandatory, validation'), + '3' => array('showitem' => 'prefill_value, feuser_value'), + '4' => array('showitem' => 'auto_marker, marker, own_marker_select'), + 'canNotCollapse' => '1' + ), + 'columns' => array( + 'sys_language_uid' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.language', + 'config' => array( + 'type' => 'select', + 'foreign_table' => 'sys_language', + 'foreign_table_where' => 'ORDER BY sys_language.title', + 'items' => array( + array('LLL:EXT:lang/locallang_general.xml:LGL.allLanguages', -1), + array('LLL:EXT:lang/locallang_general.xml:LGL.default_value', 0) + ), + ), + ), + 'l10n_parent' => array( + 'displayCond' => 'FIELD:sys_language_uid:>:0', + 'exclude' => 1, + 'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.l18n_parent', + 'config' => array( + 'type' => 'select', + 'items' => array( + array('', 0), + ), + 'foreign_table' => 'tx_powermail_domain_model_fields', + 'foreign_table_where' => 'AND tx_powermail_domain_model_fields.pid=###CURRENT_PID### AND tx_powermail_domain_model_fields.sys_language_uid IN (-1,0)', + ), + ), + 'l10n_diffsource' => array( + 'config' => array( + 'type' => 'passthrough', + ), + ), + 't3ver_label' => array( + 'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.versionLabel', + 'config' => array( + 'type' => 'input', + 'size' => 30, + 'max' => 255, + ) + ), + 'hidden' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.hidden', + 'config' => array( + 'type' => 'check', + ), + ), + 'starttime' => array( + 'exclude' => 1, + 'l10n_mode' => 'mergeIfNotBlank', + 'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.starttime', + 'config' => array( + 'type' => 'input', + 'size' => 13, + 'max' => 20, + 'eval' => 'datetime', + 'checkbox' => 0, + 'default' => 0, + 'range' => array( + 'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y')) + ), + ), + ), + 'endtime' => array( + 'exclude' => 1, + 'l10n_mode' => 'mergeIfNotBlank', + 'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.endtime', + 'config' => array( + 'type' => 'input', + 'size' => 13, + 'max' => 20, + 'eval' => 'datetime', + 'checkbox' => 0, + 'default' => 0, + 'range' => array( + 'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y')) + ), + ), + ), + 'title' => array( + 'exclude' => 0, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.title', + 'config' => array( + 'type' => 'input', + 'size' => 30, + 'eval' => 'trim,required' + ), + ), + 'type' => array( + 'exclude' => 0, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.type', + 'config' => array( + 'type' => 'select', + 'items' => array( + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.type.spacer1', + '--div--' + ), + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.type.0', + 'input' + ), + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.type.1', + 'textarea' + ), + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.type.2', + 'select' + ), + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.type.3', + 'check' + ), + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.type.4', + 'radio' + ), + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.type.5', + 'submit' + ), + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.type.spacer2', + '--div--' + ), + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.type.6', + 'captcha' + ), + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.type.7', + 'reset' + ), + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.type.8', + 'text' + ), + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.type.9', + 'content' + ), + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.type.10', + 'html' + ), + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.type.11', + 'password' + ), + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.type.12', + 'file' + ), + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.type.13', + 'hidden' + ), + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.type.14', + 'date' + ), + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.type.15', + 'typoscript' + ), + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.type.spacer3', + '--div--' + ), + ), + 'size' => 1, + 'maxitems' => 1, + 'eval' => 'required' + ), + ), + 'settings' => array( + 'exclude' => 0, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.settings', + 'config' => array( + 'type' => 'text', + 'cols' => '32', + 'rows' => '5' + ), + 'displayCond' => 'FIELD:type:IN:select,check,radio' + ), + 'path' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.path', + 'config' => array( + 'type' => 'input', + 'size' => 30, + 'eval' => 'trim' + ), + 'displayCond' => 'FIELD:type:IN:typoscript' + ), + 'content_element' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.content_element', + 'config' => array( + 'type' => 'group', + 'internal_type' => 'db', + 'allowed' => 'tt_content', + 'size' => 1, + 'maxitems' => 1, + 'minitems' => 0 + ), + 'displayCond' => 'FIELD:type:IN:content' + ), + 'text' => array( + 'exclude' => 0, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.text', + 'config' => array( + 'type' => 'text', + 'cols' => '32', + 'rows' => '5' + ), + 'displayCond' => 'FIELD:type:IN:text,html' + ), + 'sender_email' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.sender_email', + 'config' => array( + 'type' => 'check' + ), + 'displayCond' => 'FIELD:type:IN:input,textarea,select,check,radio,hidden' + ), + 'sender_name' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.sender_name', + 'config' => array( + 'type' => 'check' + ), + 'displayCond' => 'FIELD:type:IN:input,textarea,select,check,radio,hidden' + ), + 'validation_title' => array( + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.validation_title', + 'config' => array( + 'type' => 'user', + 'userFunc' => 'Tx_Powermail_Utility_Marker->doNothing' + ), + 'displayCond' => 'FIELD:type:IN:input,textarea,select,check,radio' + ), + 'mandatory' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.mandatory', + 'config' => array( + 'type' => 'check' + ), + 'displayCond' => 'FIELD:type:IN:input,textarea,select,check,radio,date' + ), + 'validation' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.validation', + 'config' => array( + 'type' => 'select', + 'items' => array( + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:pleaseChoose', + '' + ), + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.validation.1', + 1 + ), + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.validation.2', + 2 + ), + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.validation.3', + 3 + ), + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.validation.4', + 4 + ), + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.validation.5', + 5 + ), + ), + 'size' => 1, + 'maxitems' => 1, + 'eval' => '' + ), + 'displayCond' => 'FIELD:type:IN:input,textarea' + ), + 'prefill_title' => array( + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.prefill_title', + 'config' => array( + 'type' => 'user', + 'userFunc' => 'Tx_Powermail_Utility_Marker->doNothing' + ), + 'displayCond' => 'FIELD:type:IN:input,textarea,hidden' + ), + 'prefill_value' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.prefill_value', + 'config' => array( + 'type' => 'input', + 'size' => 30, + 'eval' => 'trim' + ), + 'displayCond' => 'FIELD:type:IN:input,textarea,hidden' + ), + 'feuser_value' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.feuser_value', + 'config' => array( + 'type' => 'select', + 'items' => array( + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:pleaseChoose', + '' + ), + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.feuser_value.name', + 'name' + ), + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.feuser_value.address', + 'address' + ), + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.feuser_value.phone', + 'phone' + ), + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.feuser_value.fax', + 'fax' + ), + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.feuser_value.email', + 'email' + ), + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.feuser_value.zip', + 'zip' + ), + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.feuser_value.city', + 'city' + ), + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.feuser_value.country', + 'country' + ), + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.feuser_value.www', + 'www' + ), + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.feuser_value.company', + 'company' + ), + ), + 'size' => 1, + 'maxitems' => 1, + 'eval' => '' + ), + 'displayCond' => 'FIELD:type:IN:input,textarea,hidden' + ), + 'css' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.css', + 'config' => array( + 'type' => 'select', + 'items' => array( + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:pleaseChoose', + '' + ), + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.css.0', + 1 + ), + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.css.1', + 2 + ), + array( + 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.css.2', + 3 + ), + ), + 'size' => 1, + 'maxitems' => 1, + 'eval' => '' + ), + 'displayCond' => 'FIELD:type:IN:input,textarea,select,check,radio,submit' + ), + 'marker_title' => array( + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.marker_title', + 'config' => array( + 'type' => 'user', + 'userFunc' => 'Tx_Powermail_Utility_Marker->doNothing' + ), + ), + 'auto_marker' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.auto_marker', + 'config' => array( + 'type' => 'user', + 'userFunc' => 'Tx_Powermail_Utility_Marker->createMarker' + ), + 'displayCond' => 'FIELD:own_marker_select:REQ:false' + ), + 'marker' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.own_marker', + 'config' => array( + 'type' => 'input', + 'size' => 30, + 'eval' => 'trim,alphanum_x,lower,nospace' + ), + 'displayCond' => 'FIELD:own_marker_select:REQ:true' + ), + 'own_marker_select' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.own_marker_select', + 'config' => array( + 'type' => 'check', + 'default' => 0 + ) + ), + 'pages' => array( + 'config' => array( + 'type' => 'passthrough', + ), + ), + 'sorting' => array( + 'config' => array( + 'type' => 'none', + ), + ), + ), +); +?> \ No newline at end of file diff --git a/Configuration/TCA/Forms.php b/Configuration/TCA/Forms.php new file mode 100644 index 00000000..f9f01310 --- /dev/null +++ b/Configuration/TCA/Forms.php @@ -0,0 +1,137 @@ + $TCA['tx_powermail_domain_model_forms']['ctrl'], + 'interface' => array( + 'showRecordFieldList' => 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, title, css, pages', + ), + 'types' => array( + '1' => array('showitem' => 'title, pages, --div--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.sheet1, css, --div--;LLL:EXT:cms/locallang_ttc.xml:tabs.access, sys_language_uid;;;;1-1-1, l10n_parent, l10n_diffsource, hidden;;1, starttime, endtime'), + ), + 'palettes' => array( + '1' => array('showitem' => ''), + ), + 'columns' => array( + 'sys_language_uid' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.language', + 'config' => array( + 'type' => 'select', + 'foreign_table' => 'sys_language', + 'foreign_table_where' => 'ORDER BY sys_language.title', + 'items' => array( + array('LLL:EXT:lang/locallang_general.xml:LGL.allLanguages', -1), + array('LLL:EXT:lang/locallang_general.xml:LGL.default_value', 0) + ), + ), + ), + 'l10n_parent' => array( + 'displayCond' => 'FIELD:sys_language_uid:>:0', + 'exclude' => 1, + 'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.l18n_parent', + 'config' => array( + 'type' => 'select', + 'items' => array( + array('', 0), + ), + 'foreign_table' => 'tx_powermail_domain_model_forms', + 'foreign_table_where' => 'AND tx_powermail_domain_model_forms.pid=###CURRENT_PID### AND tx_powermail_domain_model_forms.sys_language_uid IN (-1,0)', + ), + ), + 'l10n_diffsource' => array( + 'config' => array( + 'type' => 'passthrough', + ), + ), + 't3ver_label' => array( + 'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.versionLabel', + 'config' => array( + 'type' => 'input', + 'size' => 30, + 'max' => 255, + ) + ), + 'hidden' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.hidden', + 'config' => array( + 'type' => 'check', + ), + ), + 'starttime' => array( + 'exclude' => 1, + 'l10n_mode' => 'mergeIfNotBlank', + 'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.starttime', + 'config' => array( + 'type' => 'input', + 'size' => 13, + 'max' => 20, + 'eval' => 'datetime', + 'checkbox' => 0, + 'default' => 0, + 'range' => array( + 'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y')) + ), + ), + ), + 'endtime' => array( + 'exclude' => 1, + 'l10n_mode' => 'mergeIfNotBlank', + 'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.endtime', + 'config' => array( + 'type' => 'input', + 'size' => 13, + 'max' => 20, + 'eval' => 'datetime', + 'checkbox' => 0, + 'default' => 0, + 'range' => array( + 'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y')) + ), + ), + ), + 'title' => array( + 'exclude' => 0, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_forms.title', + 'config' => array( + 'type' => 'input', + 'size' => 30, + 'eval' => 'trim,required' + ), + ), + 'css' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_forms.css', + 'config' => array( + 'type' => 'select', + 'items' => array( + array('-- Label --', 0), + ), + 'size' => 1, + 'maxitems' => 1, + 'eval' => '' + ), + ), + 'pages' => array( + 'exclude' => 0, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_forms.pages', + 'config' => array( + 'type' => 'inline', + 'foreign_table' => 'tx_powermail_domain_model_pages', + 'foreign_field' => 'forms', + 'maxitems' => 1000, + 'appearance' => array( + 'collapse' => 1, + 'levelLinksPosition' => 'top', + 'showSynchronizationLink' => 1, + 'showPossibleLocalizationRecords' => 1, + 'showAllLocalizationLink' => 1 + ), + ), + ), + ), +); +?> \ No newline at end of file diff --git a/Configuration/TCA/Mails.php b/Configuration/TCA/Mails.php new file mode 100644 index 00000000..ba58b66e --- /dev/null +++ b/Configuration/TCA/Mails.php @@ -0,0 +1,290 @@ + $TCA['tx_powermail_domain_model_mails']['ctrl'], + 'interface' => array( + 'showRecordFieldList' => 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, crdate, sender_mail, sender_name, subject, receiver_mail, form, answers, body, feuser, time, sender_ip, user_agent, marketing_searchterm, marketing_referer, marketing_payed_search_result, marketing_language, marketing_browser_language, marketing_funnel', + ), + 'types' => array( + '1' => array('showitem' => 'crdate, sender_mail, sender_name, subject, body;;;richtext[], --div--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.sheet1, receiver_mail, form, answers, feuser, time, sender_ip, user_agent, --div--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.sheet2, marketing_searchterm, marketing_referer, marketing_payed_search_result, marketing_language, marketing_browser_language, marketing_funnel, --div--;LLL:EXT:cms/locallang_ttc.xml:tabs.access, hidden;;1, starttime, endtime'), + ), + 'palettes' => array( + '1' => array(), + ), + 'columns' => array( + 'sys_language_uid' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.language', + 'config' => array( + 'type' => 'select', + 'foreign_table' => 'sys_language', + 'foreign_table_where' => 'ORDER BY sys_language.title', + 'items' => array( + array('LLL:EXT:lang/locallang_general.xml:LGL.allLanguages', -1), + array('LLL:EXT:lang/locallang_general.xml:LGL.default_value', 0) + ), + ), + ), + 'l10n_parent' => array( + 'displayCond' => 'FIELD:sys_language_uid:>:0', + 'exclude' => 1, + 'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.l18n_parent', + 'config' => array( + 'type' => 'select', + 'items' => array( + array('', 0), + ), + 'foreign_table' => 'tx_powermail_domain_model_mails', + 'foreign_table_where' => 'AND tx_powermail_domain_model_mails.pid=###CURRENT_PID### AND tx_powermail_domain_model_mails.sys_language_uid IN (-1,0)', + ), + ), + 'l10n_diffsource' => array( + 'config' => array( + 'type' => 'passthrough', + ), + ), + 't3ver_label' => array( + 'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.versionLabel', + 'config' => array( + 'type' => 'input', + 'size' => 30, + 'max' => 255, + ) + ), + 'hidden' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.hidden', + 'config' => array( + 'type' => 'check', + ), + ), + 'starttime' => array( + 'exclude' => 1, + 'l10n_mode' => 'mergeIfNotBlank', + 'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.starttime', + 'config' => array( + 'type' => 'input', + 'size' => 13, + 'max' => 20, + 'eval' => 'datetime', + 'checkbox' => 0, + 'default' => 0, + 'range' => array( + 'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y')) + ), + ), + ), + 'endtime' => array( + 'exclude' => 1, + 'l10n_mode' => 'mergeIfNotBlank', + 'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.endtime', + 'config' => array( + 'type' => 'input', + 'size' => 13, + 'max' => 20, + 'eval' => 'datetime', + 'checkbox' => 0, + 'default' => 0, + 'range' => array( + 'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y')) + ), + ), + ), + 'crdate' => array( + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_mails.crdate', + 'config' => array( + 'type' => 'input', + 'size' => 30, + 'eval' => 'datetime', + 'readOnly' => 1 + ), + ), + 'sender_mail' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_mails.sender_mail', + 'config' => array( + 'type' => 'input', + 'size' => 30, + 'eval' => 'trim' + ), + ), + 'sender_name' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_mails.sender_name', + 'config' => array( + 'type' => 'input', + 'size' => 30, + 'eval' => 'trim' + ), + ), + 'subject' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_mails.subject', + 'config' => array( + 'type' => 'input', + 'size' => 30, + 'eval' => 'trim' + ), + ), + 'body' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_mails.body', + 'config' => array( + 'type' => 'text', + 'cols' => '30', + 'rows' => '5', + 'wizards' => array ( + '_PADDING' => 2, + 'RTE' => array( + 'notNewRecords' => 1, + 'RTEonly' => 1, + 'type' => 'script', + 'title' => 'RTE', + 'icon' => 'wizard_rte2.gif', + 'script' => 'wizard_rte.php', + ), + ), + ), + ), + 'receiver_mail' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_mails.receiver_mail', + 'config' => array( + 'type' => 'input', + 'size' => 30, + 'eval' => 'trim' + ), + ), + 'form' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_mails.form', + 'config' => array( + 'type' => 'select', + 'foreign_table' => 'tx_powermail_domain_model_forms', + 'foreign_table_where' => 'AND tx_powermail_domain_model_forms.deleted = 0 AND tx_powermail_domain_model_forms.hidden = 0 order by tx_powermail_domain_model_forms.title', + ), + ), + 'answers' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_mails.answers', + 'config' => array( + 'type' => 'inline', + 'foreign_table' => 'tx_powermail_domain_model_answers', + 'foreign_field' => 'mail', + 'maxitems' => 1000, + 'appearance' => array( + 'collapse' => 1, + 'levelLinksPosition' => 'top', + 'showSynchronizationLink' => 1, + 'showPossibleLocalizationRecords' => 1, + 'showAllLocalizationLink' => 1 + ), + ), + ), + 'feuser' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_mails.feuser', + 'config' => array ( + 'type' => 'group', + 'internal_type' => 'db', + 'allowed' => 'fe_users', + 'size' => 1, + 'minitems' => 0, + 'maxitems' => 1 + ) + ), + 'time' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_mails.time', + 'config' => array( + 'type' => 'input', + 'size' => 13, + 'max' => 20, + 'eval' => 'timesec', + 'checkbox' => 0, + 'default' => 0, + 'readOnly' => 1 + ), + ), + 'sender_ip' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_mails.sender_ip', + 'config' => array( + 'type' => 'input', + 'size' => 30, + 'eval' => 'trim', + 'readOnly' => 1 + ), + ), + 'user_agent' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_mails.user_agent', + 'config' => array( + 'type' => 'input', + 'size' => 30, + 'eval' => 'trim', + 'readOnly' => 1 + ), + ), + 'marketing_searchterm' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_mails.marketing_searchterm', + 'config' => array( + 'type' => 'input', + 'size' => 30, + 'readOnly' => 1 + ), + ), + 'marketing_referer' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_mails.marketing_referer', + 'config' => array( + 'type' => 'text', + 'cols' => '30', + 'rows' => '5', + 'readOnly' => 1 + ), + ), + 'marketing_payed_search_result' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_mails.marketing_payed_search_result', + 'config' => array( + 'type' => 'check', + 'readOnly' => 1 + ), + ), + 'marketing_language' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_mails.marketing_language', + 'config' => array( + 'type' => 'input', + 'size' => 2, + 'eval' => 'int', + 'readOnly' => 1 + ), + ), + 'marketing_browser_language' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_mails.marketing_browser_language', + 'config' => array( + 'type' => 'input', + 'size' => 30, + 'readOnly' => 1 + ), + ), + 'marketing_funnel' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_mails.marketing_funnel', + 'config' => array( + 'type' => 'text', + 'cols' => '30', + 'rows' => '5', + 'readOnly' => 1 + ), + ), + ), +); +?> \ No newline at end of file diff --git a/Configuration/TCA/Pages.php b/Configuration/TCA/Pages.php new file mode 100644 index 00000000..f4d3709a --- /dev/null +++ b/Configuration/TCA/Pages.php @@ -0,0 +1,148 @@ + $TCA['tx_powermail_domain_model_pages']['ctrl'], + 'interface' => array( + 'showRecordFieldList' => 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, title, css, fields', + ), + 'types' => array( + '1' => array('showitem' => 'title, fields, --div--;LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_fields.sheet1, css, --div--;LLL:EXT:cms/locallang_ttc.xml:tabs.access,sys_language_uid;;;;1-1-1, l10n_parent, l10n_diffsource, hidden;;1, starttime, endtime'), + ), + 'palettes' => array( + '1' => array(), + ), + 'columns' => array( + 'sys_language_uid' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.language', + 'config' => array( + 'type' => 'select', + 'foreign_table' => 'sys_language', + 'foreign_table_where' => 'ORDER BY sys_language.title', + 'items' => array( + array('LLL:EXT:lang/locallang_general.xml:LGL.allLanguages', -1), + array('LLL:EXT:lang/locallang_general.xml:LGL.default_value', 0) + ), + ), + ), + 'l10n_parent' => array( + 'displayCond' => 'FIELD:sys_language_uid:>:0', + 'exclude' => 1, + 'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.l18n_parent', + 'config' => array( + 'type' => 'select', + 'items' => array( + array('', 0), + ), + 'foreign_table' => 'tx_powermail_domain_model_pages', + 'foreign_table_where' => 'AND tx_powermail_domain_model_pages.pid=###CURRENT_PID### AND tx_powermail_domain_model_pages.sys_language_uid IN (-1,0)', + ), + ), + 'l10n_diffsource' => array( + 'config' => array( + 'type' => 'passthrough', + ), + ), + 't3ver_label' => array( + 'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.versionLabel', + 'config' => array( + 'type' => 'input', + 'size' => 30, + 'max' => 255, + ) + ), + 'hidden' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.hidden', + 'config' => array( + 'type' => 'check', + ), + ), + 'starttime' => array( + 'exclude' => 1, + 'l10n_mode' => 'mergeIfNotBlank', + 'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.starttime', + 'config' => array( + 'type' => 'input', + 'size' => 13, + 'max' => 20, + 'eval' => 'datetime', + 'checkbox' => 0, + 'default' => 0, + 'range' => array( + 'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y')) + ), + ), + ), + 'endtime' => array( + 'exclude' => 1, + 'l10n_mode' => 'mergeIfNotBlank', + 'label' => 'LLL:EXT:lang/locallang_general.xml:LGL.endtime', + 'config' => array( + 'type' => 'input', + 'size' => 13, + 'max' => 20, + 'eval' => 'datetime', + 'checkbox' => 0, + 'default' => 0, + 'range' => array( + 'lower' => mktime(0, 0, 0, date('m'), date('d'), date('Y')) + ), + ), + ), + 'title' => array( + 'exclude' => 0, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_pages.title', + 'config' => array( + 'type' => 'input', + 'size' => 30, + 'eval' => 'trim,required' + ), + ), + 'css' => array( + 'exclude' => 1, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_pages.css', + 'config' => array( + 'type' => 'select', + 'items' => array( + array('-- Label --', 0), + ), + 'size' => 1, + 'maxitems' => 1, + 'eval' => '' + ), + ), + 'fields' => array( + 'exclude' => 0, + 'label' => 'LLL:EXT:powermail/Resources/Private/Language/locallang_db.xml:tx_powermail_domain_model_pages.fields', + 'config' => array( + 'type' => 'inline', + 'foreign_table' => 'tx_powermail_domain_model_fields', + 'foreign_field' => 'pages', + 'maxitems' => 1000, + 'appearance' => array( + 'collapse' => 1, + 'levelLinksPosition' => 'top', + 'showSynchronizationLink' => 1, + 'showPossibleLocalizationRecords' => 1, + 'showAllLocalizationLink' => 1 + ), + ), + ), + 'forms' => array( + 'config' => array( + 'type' => 'passthrough', + ), + ), + 'sorting' => array( + 'label' => 'Sorting', + 'config' => array( + 'type' => 'none', + ), + ), + ), +); +?> \ No newline at end of file diff --git a/Configuration/TypoScript/CssFancy/constants.txt b/Configuration/TypoScript/CssFancy/constants.txt new file mode 100644 index 00000000..c59e2b2c --- /dev/null +++ b/Configuration/TypoScript/CssFancy/constants.txt @@ -0,0 +1,5 @@ +plugin.tx_powermail { + settings { + CssFancy = EXT:powermail/Resources/Public/Css/CssFancy.css + } +} \ No newline at end of file diff --git a/Configuration/TypoScript/CssFancy/setup.txt b/Configuration/TypoScript/CssFancy/setup.txt new file mode 100644 index 00000000..da4ed527 --- /dev/null +++ b/Configuration/TypoScript/CssFancy/setup.txt @@ -0,0 +1 @@ +page.includeCSS.powermailCssFancy = {$plugin.tx_powermail.settings.CssFancy} \ No newline at end of file diff --git a/Configuration/TypoScript/Main/constants.txt b/Configuration/TypoScript/Main/constants.txt new file mode 100644 index 00000000..d76ae2e2 --- /dev/null +++ b/Configuration/TypoScript/Main/constants.txt @@ -0,0 +1,16 @@ +plugin.tx_powermail { + view { + # cat=plugin.tx_powermail/file; type=string; label=Path to template root (FE) + templateRootPath = EXT:powermail/Resources/Private/Templates/ + + # cat=plugin.tx_powermail/file; type=string; label=Path to template partials (FE) + partialRootPath = EXT:powermail/Resources/Private/Partials/ + + # cat=plugin.tx_powermail/file; type=string; label=Path to template layouts (FE) + layoutRootPath = EXT:powermail/Resources/Private/Layouts/ + } + persistence { + # cat=plugin.tx_powermail//a; type=int+; label=Default storage PID + storagePid = + } +} \ No newline at end of file diff --git a/Configuration/TypoScript/Main/setup.txt b/Configuration/TypoScript/Main/setup.txt new file mode 100644 index 00000000..1510e4cf --- /dev/null +++ b/Configuration/TypoScript/Main/setup.txt @@ -0,0 +1,485 @@ +################## +# Frontend Plugin +################## +plugin.tx_powermail { + view { + templateRootPath = {$plugin.tx_powermail.view.templateRootPath} + partialRootPath = {$plugin.tx_powermail.view.partialRootPath} + layoutRootPath = {$plugin.tx_powermail.view.layoutRootPath} + } + persistence { + storagePid = {$plugin.tx_powermail.persistence.storagePid} + } + settings { + setup { + + main { + pid = 19 + confirmation = + moresteps = + } + + receiver { + enable = 1 + email = + subject = + body = + + # add file attachments from upload fields + attachment = 1 + + # html, plain, both + mailformat = both + + # Normally you do not need to overwrite a flexform setting, but this allows you to use cObject functions + overwrite { +# email = TEXT +# email.value = receiver1@mail.com, receiver1@mail.com + +# name = TEXT +# name.value = Receivers Name + +# senderName = TEXT +# senderName.value = Sender Name + +# senderEmail = TEXT +# senderEmail.value = sender@mail.com + +# subject = TEXT +# subject.value = The new subject + + # Add further CC Receivers (split them via comma) +# cc = TEXT +# cc.value = rec2@mail.com, rec3@mail.com + + # Add further BCC Receivers (split them via comma) +# bcc = TEXT +# bcc.value = rec2@mail.com, rec3@mail.com + + # Add return path +# returnPath = TEXT +# returnPath.value = return@mail.com + + # Reply address +# replyToEmail = TEXT +# replyToEmail.value = reply@mail.com +# replyToName = TEXT +# replyToName.value = Mr. Reply + + # Set mail priority from 1 to 5 +# priority = 3 + } + + # Add additional attachments to the mail (separate each with comma) +# addAttachment = TEXT +# addAttachment.value = fileadmin/file.jpg +# addAttachment.wrap = |, + } + + sender { + enable = 1 + name = + email = + subject = + body = + + # add file attachments from upload fields + attachment = 0 + + # html, plain, both + mailformat = both + + # Normally you do not need to overwrite a flexform settings, but this allows you to use cObject functions + overwrite { +# email = TEXT +# email.value = receiver@mail.com + +# name = TEXT +# name.value = Receivers Name + +# senderName = TEXT +# senderName.value = Sender Name + +# senderEmail = TEXT +# senderEmail.value = sender@mail.com + +# subject = TEXT +# subject.value = The new subject + + # Add further CC Receivers (split them via comma) +# cc = TEXT +# cc.value = rec2@mail.com, rec3@mail.com + + # Add further BCC Receivers (split them via comma) +# bcc = TEXT +# bcc.value = rec2@mail.com, rec3@mail.com + + # Add return path +# returnPath = TEXT +# returnPath.value = return@mail.com + + # Reply address +# replyToEmail = TEXT +# replyToEmail.value = reply@mail.com +# replyToName = TEXT +# replyToName.value = Mr. Reply + + # Set mail priority from 1 to 5 +# priority = 3 + } + + # Add additional attachments to the mail (separate each with comma) +# addAttachment = TEXT +# addAttachment.value = fileadmin/file.jpg +# addAttachment.wrap = |, + } + + thx { + body = + redirect = + } + + db { + # Enable mail storage + enable = 1 + + # Add new mails with hidden=1 + hidden = 0 + } + + optin { + subject = TEXT + subject.data = LLL:EXT:powermail/Resources/Private/Language/locallang.xml:optin_subject + + overwrite { +# email = TEXT +# email.value = alexander.kellner@in2code.de + +# name = TEXT +# name.value = Receivers Name + +# senderName = TEXT +# senderName.value = Sender Name + +# senderEmail = TEXT +# senderEmail.value = sender@mail.com + } + } + + + + + # Captcha Settings + captcha { + use = default + + default { + image = EXT:powermail/Resources/Private/Image/captcha_bg.png + font = EXT:powermail/Resources/Private/Fonts/ARCADE.TTF + textColor = #444444 + textSize = 32 + textAngle = -5,5 + distanceHor = 20,80 + distanceVer = 30,60 + } + } + + + + # Misc Settings + misc { + # Date format + dateFormat = %d.%m.%Y + + # HTML Output allowed + htmlField = 0 + + # File upload settings + file { + folder = uploads/tx_powermail/ + # size in bytes (10000000 default -> 10 MByte) + size = 10000000 + extension = jpg,jpeg,gif,png,tif,txt,doc,docx,xls,xlsx,ppt,pptx,pdf,flv,mpg,mpeg,avi,mp3,zip,rar,ace + } + } + + + + # Prefill some fields + prefill { + # example: fill with string +# firstname = Alex + + # example: fill with TypoScript +# email = TEXT +# email.value = alex@in2code.de +# eamil.wrap = | + + # example: fill with value from Flexform + # available: css, feuserValue, mandatory, marker, pid, prefillValue, senderEmail, senderName, sorting, title, type, uid, validation +# comment = TEXT +# comment.field = type + } + + + + marketing { + + # Use Google Adwords Conversion JavaScript on form submit + googleAdwords { + _enable = 1 + google_conversion_id = 1234567890 + google_conversion_label = abcdefghijklmnopqrs + google_conversion_language = en + google_conversion_format = 3 + } + + # Send Form values to CRM like salesforce or eloqua + sendPost { + # Activate sendPost (0/1) + _enable = 0 + + # Target URL for POST values (like http://www.target.com/target.php) + targetUrl = http://eloqua.com/e/f.aspx + + # build your post values like ¶m1=value1¶m2=value2 + values = COA + values { + 10 = TEXT + 10 { + # value from field {firstname} + field = vorname + wrap = &firstname=| + } + + 20 = TEXT + 20 { + # value from field {e_mail} + field = e_mail + wrap = &email=| + } + + 30 = TEXT + 30 { + # value from field {comment} + field = comment + wrap = &text=| + } + } + + # activate debug mode - shows all configuration from curl settings + debug = 0 + } + } + + + + + # Save values to any table (example for tt_adress) + dbEntry { + + # enable or disable db entry for tt_address +# tt_address._enable = TEXT +# tt_address._enable.value = 1 + + # write only if field email is not yet filled with current value + # (update: update values of existing entry) + # (none: no entry if field is filled) + # (disable: always add values don't care about existing values) +# tt_address._ifUnique.email = update + + # add mm relation to uid 2 of tt_address_group (via mm table) +# tt_address._mm = COA +# tt_address._mm.10 = COA + # 1 is always the mm table +# tt_address._mm.10.1 = TEXT +# tt_address._mm.10.1.value = tt_address_group_mm + # 2 is always the second table (e.g. categories table) +# tt_address._mm.10.2 = TEXT +# tt_address._mm.10.2.value = tt_address_group + # 3 is always the uid of a data record of the second table to get a relation to this (in this case uid 1 of tt_address_group) +# tt_address._mm.10.3 = TEXT +# tt_address._mm.10.3.value = 1 + + # table "tt_address" with field "email" is a static value => alexander.kellner@einpraegsam.net +# tt_address.email = TEXT +# tt_address.email.value = alexander.kellner@einpraegsam.net + + # table "tt_address" with field "pid" is the current pid (e.g. 12) +# tt_address.pid = TEXT +# tt_address.pid.data = TSFE:id + + # table "tt_address" with field "tstamp" is the current time as timestamp (like 123456789) +# tt_address.tstamp = TEXT +# tt_address.tstamp.data = date:U + + # table "tt_address" with field "address" is the current formatted time (like "Date: 20.01.2009") +# tt_address.address = TEXT +# tt_address.address.data = date:U +# tt_address.address.strftime = Date: %d.%m.%Y + + # table "tt_address" with field "name" is the value from powermail (tt_content uid 88) field uid18 (###uid18###) +# tt_address.name = TEXT +# tt_address.name.field = nachname + + # table "tt_address" with field "last_name" is the value from powermail (tt_content uid 88) field uid18 (###uid18###) +# tt_address.last_name = TEXT +# tt_address.last_name.field = vorname + + # table "tt_address" with field "company" is the value from powermail (tt_content uid 88) field uid21_1 (###uid21_1###) (e.g. a checkbox value) +# tt_address.company = TEXT +# tt_address.company.data = TSFE:fe_user|sesData|powermail_88|uid21|1 + } + + + + + # Switch on or off Debug mode + debug { + # All views: Show Settings from TypoScript, Flexform and Extension Manager + settings = 0 + + # Create view: Show submitted variables + variables = 0 + + # Create view: Show mail arrays + mail = 0 + + # Create view: Show saveToTable array + saveToTable = 0 + } + + + + # Don't touch this (this is just to let the extension know, that there is TypoScript included) + staticTemplate = 1 + } + } +} + +config.tx_extbase.persistence.classes { + Tx_Powermail_Domain_Model_User { + mapping { + tableName = fe_users + } + } + Tx_Powermail_Domain_Model_UserGroup { + mapping { + tableName = fe_groups + } + } +} + + + +############################ +# JavaScript and CSS section +############################ +page { + # Inlude JavaScript files + includeJSFooterlibs { + jQuery = https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js + jQuery.external = 1 + jQueryUi = https://ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.min.js + jQueryUi.external = 1 + jQueryUiDatepicker = EXT:powermail/Resources/Public/Js/jquery.ui.datepicker.min.js + jQueryFormValidationLanguage = EXT:powermail/Resources/Public/Js/jquery.validationEngine-en.js + jQueryFormValidation = EXT:powermail/Resources/Public/Js/jquery.validationEngine.js + jQueryTabs = EXT:powermail/Resources/Public/Js/tabs.js + } + includeJSFooter { + powermail_form = EXT:powermail/Resources/Public/Js/form.js + } + + # Include CSS files + includeCSS { + jQueryUiTheme = EXT:powermail/Resources/Public/Css/jquery.ui.theme.css + jQueryUiDatepicker = EXT:powermail/Resources/Public/Css/jquery.ui.datepicker.css + } +} + +page.1000 = COA +page.1000 { + wrap = + + 10 = TEXT + 10 { + wrap = var JsValidationCheckCheckboxes = '|'; + data = LLL:EXT:powermail/Resources/Private/Language/locallang.xml:JsValidationCheckCheckboxes + } + + 20 = TEXT + 20 { + wrap = var JsValidationCheckInteger = '|'; + data = LLL:EXT:powermail/Resources/Private/Language/locallang.xml:JsValidationCheckInteger + } + + 30 = TEXT + 30 { + wrap = var JsValidationCheckRequired = '|'; + data = LLL:EXT:powermail/Resources/Private/Language/locallang.xml:JsValidationCheckRequired + } + + 40 = TEXT + 40 { + wrap = var JsValidationCheckRequiredOption = '|'; + data = LLL:EXT:powermail/Resources/Private/Language/locallang.xml:JsValidationCheckRequiredOption + } + + 50 = TEXT + 50 { + wrap = var JsValidationCheckEmail = '|'; + data = LLL:EXT:powermail/Resources/Private/Language/locallang.xml:JsValidationCheckEmail + } + + 60 = TEXT + 60 { + wrap = var JsValidationCheckUrl = '|'; + data = LLL:EXT:powermail/Resources/Private/Language/locallang.xml:JsValidationCheckUrl + } + + 70 = TEXT + 70 { + wrap = var JsValidationCheckPhone = '|'; + data = LLL:EXT:powermail/Resources/Private/Language/locallang.xml:JsValidationCheckPhone + } + + 80 = TEXT + 80 { + wrap = var JsValidationCheckLetters = '|'; + data = LLL:EXT:powermail/Resources/Private/Language/locallang.xml:JsValidationCheckLetters + } +} + + + + + +################# +# Backend Module +################# +module.tx_powermail { + view { + templateRootPath = {$plugin.tx_powermail.view.templateRootPath} + partialRootPath = {$plugin.tx_powermail.view.partialRootPath} + layoutRootPath = {$plugin.tx_powermail.view.layoutRootPath} + widget.Tx_Fluid_ViewHelpers_Widget_PaginateViewHelper.templateRootPath = EXT:powermail/Resources/Private/Templates/ + } + persistence { + storagePid = {$plugin.tx_powermail.persistence.storagePid} + } + settings { + + # crdate, sender_name, sender_email, subject, receiver_mail, feuser, time + sortby = crdate + order = desc + perPage = 10 + export { + filenameXls = powermail.xls + filenameCsv = powermail.csv + } + + # Don't touch this (this is just to let the extension know, that there is TypoScript included) + staticTemplate = 1 + } +} \ No newline at end of file diff --git a/Configuration/TypoScript/Marketing/setup.txt b/Configuration/TypoScript/Marketing/setup.txt new file mode 100644 index 00000000..8dc5f2dc --- /dev/null +++ b/Configuration/TypoScript/Marketing/setup.txt @@ -0,0 +1,8 @@ +##################################### +# Adding Powermail Marketing Function +##################################### +page.3131 = USER_INT +page.3131 { + # storing misc user informations in session (last page, google keyword, page funnel) + userFunc = Tx_Powermail_Utility_Marketing->store +} \ No newline at end of file diff --git a/Configuration/TypoScript/Powermail_Frontend/constants.txt b/Configuration/TypoScript/Powermail_Frontend/constants.txt new file mode 100644 index 00000000..e69de29b diff --git a/Configuration/TypoScript/Powermail_Frontend/setup.txt b/Configuration/TypoScript/Powermail_Frontend/setup.txt new file mode 100644 index 00000000..9eb57360 --- /dev/null +++ b/Configuration/TypoScript/Powermail_Frontend/setup.txt @@ -0,0 +1,110 @@ +############################ +# POWERMAIL_FRONTEND +############################ +plugin.tx_powermail { + settings { + Pi2 { + + rss { + title = Powermail 2.0 RSS Feed + link = http://www.in2code.de + description = Powermail_Frontend RSS Feed + language = en + copyright = in2code.de + updatePeriod = hourly + updateFrequency = 1 + } + + # Don't touch this (this is just to let the extension know, that there is TypoScript included) + staticTemplate = 1 + } + } +} + + + +############################ +# Export section +############################ + +powermail_frontend_xls = PAGE +powermail_frontend_xls { + typeNum = 31311 + + config { + disableAllHeaderCode = 1 + disablePrefixComment = 1 + xhtml_cleaning = 0 + admPanel = 0 + additionalHeaders = Content-type:application/xls | Content-Disposition: inline; filename=export.xls | Cache-control: | Pragma: + } + + 10 = TEXT + 10 { + value = + } + + 20 < styles.content.get + + 30 = TEXT + 30 { + value = + } +} +powermail_frontend_csv = PAGE +powermail_frontend_csv { + typeNum = 31312 + + config { + disableAllHeaderCode = 1 + disablePrefixComment = 1 + xhtml_cleaning = 0 + admPanel = 0 + additionalHeaders = Content-type:text/x-csv | Content-Disposition: inline; filename=export.csv | Cache-control: | Pragma: + } + + 10 < styles.content.get +} + + + +############################ +# RSS section +############################ + +powermail_frontend_rss = PAGE +powermail_frontend_rss { + typeNum = 31319 + + config { + disableAllHeaderCode = 1 + disablePrefixComment = 1 + xhtml_cleaning = 0 + admPanel = 0 + #additionalHeaders = Content-type:application/xml + } + + 10 < styles.content.get +} +[globalVar = GP:type = 31311] || [globalVar = GP:type = 31312] || [globalVar = GP:type = 31319] + # we don't want the wrapper div in our export files + tt_content.stdWrap.innerWrap > +[end] + + + + +############################ +# JavaScript and CSS section +############################ + +page { + # Inlude JavaScript files + includeJSFooterlibs { + jQuery = https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js + jQuery.external = 1 + } + includeJSFooter { + powermail_frontend = EXT:powermail/Resources/Public/Js/powermail_frontend.js + } +} \ No newline at end of file diff --git a/ExtensionBuilder.json b/ExtensionBuilder.json new file mode 100644 index 00000000..3bbcddf7 --- /dev/null +++ b/ExtensionBuilder.json @@ -0,0 +1 @@ +{"modules":[{"config":{"position":[408,25]},"name":"New Model Object","value":{"actionGroup":{"actions":[]},"name":"Pages","objectsettings":{"aggregateRoot":false,"description":"Powermail Fieldsets","type":"Entity","uid":"1200795514506"},"propertyGroup":{"properties":[{"propertyDescription":"","propertyIsExcludeField":false,"propertyIsRequired":true,"propertyName":"title","propertyType":"String","uid":"230032436274"},{"propertyDescription":"","propertyIsExcludeField":true,"propertyIsRequired":false,"propertyName":"css","propertyType":"Select","uid":"295629003340"}]},"relationGroup":{"relations":[{"lazyLoading":false,"propertyIsExcludeField":false,"relationDescription":"Powermail Fields","relationName":"fields","relationType":"zeroToMany","relationWire":"[wired]","uid":"334976452380"}]}}},{"config":{"position":[775,23]},"name":"New Model Object","value":{"actionGroup":{"actions":[]},"name":"Fields","objectsettings":{"aggregateRoot":false,"description":"Powermail Fields","type":"Entity","uid":"466549761073"},"propertyGroup":{"properties":[{"propertyDescription":"","propertyIsExcludeField":false,"propertyIsRequired":true,"propertyName":"title","propertyType":"String","uid":"510110006849"},{"propertyDescription":"","propertyIsExcludeField":false,"propertyIsRequired":true,"propertyName":"type","propertyType":"Select","uid":"1081612474658"},{"propertyDescription":"","propertyIsExcludeField":true,"propertyIsRequired":false,"propertyName":"prefillValue","propertyType":"String","uid":"616161953522"},{"propertyDescription":"","propertyIsExcludeField":true,"propertyIsRequired":false,"propertyName":"validation","propertyType":"Select","uid":"1045729367552"},{"propertyDescription":"","propertyIsExcludeField":true,"propertyIsRequired":false,"propertyName":"css","propertyType":"Select","uid":"103912208143"},{"propertyDescription":"","propertyIsExcludeField":true,"propertyIsRequired":false,"propertyName":"feuserValue","propertyType":"Select","uid":"668753594237"}]},"relationGroup":{"relations":[]}}},{"config":{"position":[35,44]},"name":"New Model Object","value":{"actionGroup":{"actions":["show"]},"name":"Forms","objectsettings":{"aggregateRoot":false,"description":"Show FOrm","type":"Entity","uid":"1124817224459"},"propertyGroup":{"properties":[{"propertyDescription":"","propertyIsExcludeField":false,"propertyIsRequired":true,"propertyName":"title","propertyType":"String","uid":"778372983752"},{"propertyDescription":"","propertyIsExcludeField":true,"propertyIsRequired":false,"propertyName":"css","propertyType":"Select","uid":"350953609309"}]},"relationGroup":{"relations":[{"lazyLoading":false,"propertyIsExcludeField":false,"relationDescription":"","relationName":"pages","relationType":"zeroToOne","relationWire":"[wired]","uid":"687323224174"}]}}}],"properties":{"backendModules":[],"description":"powermail","emConf":{"category":"plugin","custom_category":"","priority":"","shy":false,"state":"alpha","version":"2.0.0"},"extensionKey":"powermail","name":"powermail","originalExtensionKey":"powermail","persons":[{"company":"in2code.de","email":"alexander.kellner@in2code.de","name":"Alex Kellner","role":"Developer"}],"plugins":[{"key":"Pi1","name":"Pi1"}]},"wires":[{"src":{"moduleId":0,"terminal":"relationWire_0","uid":"334976452380"},"tgt":{"moduleId":1,"terminal":"SOURCES","uid":"466549761073"}},{"src":{"moduleId":2,"terminal":"relationWire_0","uid":"687323224174"},"tgt":{"moduleId":0,"terminal":"SOURCES","uid":"1200795514506"}}],"log":{"last_modified":"2012-02-12 02:51","extension_builder_version":"2.0.5","be_user":" (1)"}} \ No newline at end of file diff --git a/Resources/Private/.htaccess b/Resources/Private/.htaccess new file mode 100644 index 00000000..dfc02725 --- /dev/null +++ b/Resources/Private/.htaccess @@ -0,0 +1 @@ +deny from all \ No newline at end of file diff --git a/Resources/Private/Fonts/ARCADE.TTF b/Resources/Private/Fonts/ARCADE.TTF new file mode 100644 index 0000000000000000000000000000000000000000..7c169d4eae90b38aa51acf52d584f95f9ef145c5 GIT binary patch literal 27700 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 literal 0 HcmV?d00001 diff --git a/Resources/Private/Image/captcha_bg.png b/Resources/Private/Image/captcha_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..b06a0877f6a1e641ec07cf93d9b95c70398deaef GIT binary patch literal 6990 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 Rc={kiQIb=at&uhl`ya<9o1Opw literal 0 HcmV?d00001 diff --git a/Resources/Private/Language/locallang.xml b/Resources/Private/Language/locallang.xml new file mode 100644 index 00000000..66c2de15 --- /dev/null +++ b/Resources/Private/Language/locallang.xml @@ -0,0 +1,325 @@ + + + + module + Language labels for the powermail extension in the FRONTEND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Resources/Private/Language/locallang_csh_tx_powermail_domain_model_answers.xml b/Resources/Private/Language/locallang_csh_tx_powermail_domain_model_answers.xml new file mode 100644 index 00000000..a63be8b1 --- /dev/null +++ b/Resources/Private/Language/locallang_csh_tx_powermail_domain_model_answers.xml @@ -0,0 +1,20 @@ + + + + Context Sensitive Help (CSH) for table tx_powermail_domain_model_answers + CSH + tx_powermail_domain_model_answers + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Resources/Private/Language/locallang_csh_tx_powermail_domain_model_fields.xml b/Resources/Private/Language/locallang_csh_tx_powermail_domain_model_fields.xml new file mode 100644 index 00000000..e5cb70e4 --- /dev/null +++ b/Resources/Private/Language/locallang_csh_tx_powermail_domain_model_fields.xml @@ -0,0 +1,46 @@ + + + + Context Sensitive Help (CSH) for table tx_powermail_domain_model_fields + CSH + tx_powermail_domain_model_fields + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Resources/Private/Language/locallang_csh_tx_powermail_domain_model_forms.xml b/Resources/Private/Language/locallang_csh_tx_powermail_domain_model_forms.xml new file mode 100644 index 00000000..830b9119 --- /dev/null +++ b/Resources/Private/Language/locallang_csh_tx_powermail_domain_model_forms.xml @@ -0,0 +1,20 @@ + + + + Context Sensitive Help (CSH) for table tx_powermail_domain_model_forms + CSH + tx_powermail_domain_model_forms + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Resources/Private/Language/locallang_csh_tx_powermail_domain_model_mails.xml b/Resources/Private/Language/locallang_csh_tx_powermail_domain_model_mails.xml new file mode 100644 index 00000000..97f4893d --- /dev/null +++ b/Resources/Private/Language/locallang_csh_tx_powermail_domain_model_mails.xml @@ -0,0 +1,13 @@ + + + + Context Sensitive Help (CSH) for table tx_powermail_domain_model_mails + CSH + tx_powermail_domain_model_mails + + + + + + + \ No newline at end of file diff --git a/Resources/Private/Language/locallang_csh_tx_powermail_domain_model_pages.xml b/Resources/Private/Language/locallang_csh_tx_powermail_domain_model_pages.xml new file mode 100644 index 00000000..4b6f9530 --- /dev/null +++ b/Resources/Private/Language/locallang_csh_tx_powermail_domain_model_pages.xml @@ -0,0 +1,20 @@ + + + + Context Sensitive Help (CSH) for table tx_powermail_domain_model_pages + CSH + tx_powermail_domain_model_pages + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Resources/Private/Language/locallang_db.xml b/Resources/Private/Language/locallang_db.xml new file mode 100644 index 00000000..ad0851f0 --- /dev/null +++ b/Resources/Private/Language/locallang_db.xml @@ -0,0 +1,319 @@ + + + + database + Language labels for database tables/fields belonging to extension 'powermail' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Resources/Private/Language/locallang_mod.xml b/Resources/Private/Language/locallang_mod.xml new file mode 100644 index 00000000..75623b1c --- /dev/null +++ b/Resources/Private/Language/locallang_mod.xml @@ -0,0 +1,39 @@ + + + + module + Language labels for backend module powermail + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Resources/Private/Layouts/Backend.html b/Resources/Private/Layouts/Backend.html new file mode 100644 index 00000000..6c28b08d --- /dev/null +++ b/Resources/Private/Layouts/Backend.html @@ -0,0 +1,41 @@ + + +
+ +
+
+
+
+   +
+
+ +
+
+
+
+ + + + + +
+
+ +
+
+
+
+
+ + +
+
+
+ + + + + + +
\ No newline at end of file diff --git a/Resources/Private/Layouts/Default.html b/Resources/Private/Layouts/Default.html new file mode 100644 index 00000000..c79deb0c --- /dev/null +++ b/Resources/Private/Layouts/Default.html @@ -0,0 +1,3 @@ +
+ +
\ No newline at end of file diff --git a/Resources/Private/Layouts/Export.html b/Resources/Private/Layouts/Export.html new file mode 100644 index 00000000..54d9aa0b --- /dev/null +++ b/Resources/Private/Layouts/Export.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Resources/Private/Layouts/Mail.html b/Resources/Private/Layouts/Mail.html new file mode 100644 index 00000000..54d9aa0b --- /dev/null +++ b/Resources/Private/Layouts/Mail.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Resources/Private/Layouts/PowermailAll.html b/Resources/Private/Layouts/PowermailAll.html new file mode 100644 index 00000000..6a2abd23 --- /dev/null +++ b/Resources/Private/Layouts/PowermailAll.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Resources/Private/Partials/FormError.html b/Resources/Private/Partials/FormError.html new file mode 100644 index 00000000..7afd580b --- /dev/null +++ b/Resources/Private/Partials/FormError.html @@ -0,0 +1,14 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + + +
    + +
  • + + : + + +
  • +
    +
+
\ No newline at end of file diff --git a/Resources/Private/Partials/Forms/Captcha.html b/Resources/Private/Partials/Forms/Captcha.html new file mode 100644 index 00000000..ba7f83f4 --- /dev/null +++ b/Resources/Private/Partials/Forms/Captcha.html @@ -0,0 +1,12 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + +
+ + +
+ + captcha +
+
\ No newline at end of file diff --git a/Resources/Private/Partials/Forms/Check.html b/Resources/Private/Partials/Forms/Check.html new file mode 100644 index 00000000..90eb308c --- /dev/null +++ b/Resources/Private/Partials/Forms/Check.html @@ -0,0 +1,18 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + +
+
+ + {field.title}* + + +
+ +
+ + +
+
+
+
+
diff --git a/Resources/Private/Partials/Forms/Content.html b/Resources/Private/Partials/Forms/Content.html new file mode 100644 index 00000000..887208de --- /dev/null +++ b/Resources/Private/Partials/Forms/Content.html @@ -0,0 +1,5 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + +
+ +
\ No newline at end of file diff --git a/Resources/Private/Partials/Forms/Date.html b/Resources/Private/Partials/Forms/Date.html new file mode 100644 index 00000000..6b97cd02 --- /dev/null +++ b/Resources/Private/Partials/Forms/Date.html @@ -0,0 +1,31 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/Resources/Private/Partials/Forms/File.html b/Resources/Private/Partials/Forms/File.html new file mode 100644 index 00000000..d9a360be --- /dev/null +++ b/Resources/Private/Partials/Forms/File.html @@ -0,0 +1,11 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + +
+ + +
+ +
+
\ No newline at end of file diff --git a/Resources/Private/Partials/Forms/Hidden.html b/Resources/Private/Partials/Forms/Hidden.html new file mode 100644 index 00000000..0b828c31 --- /dev/null +++ b/Resources/Private/Partials/Forms/Hidden.html @@ -0,0 +1,2 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + diff --git a/Resources/Private/Partials/Forms/Html.html b/Resources/Private/Partials/Forms/Html.html new file mode 100644 index 00000000..1b730483 --- /dev/null +++ b/Resources/Private/Partials/Forms/Html.html @@ -0,0 +1,13 @@ + +
+ + + {field.text} + + +
+ +
+
+
+
\ No newline at end of file diff --git a/Resources/Private/Partials/Forms/Input.html b/Resources/Private/Partials/Forms/Input.html new file mode 100644 index 00000000..c385ab78 --- /dev/null +++ b/Resources/Private/Partials/Forms/Input.html @@ -0,0 +1,16 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + +
+ + + + + + + + + + +
\ No newline at end of file diff --git a/Resources/Private/Partials/Forms/Password.html b/Resources/Private/Partials/Forms/Password.html new file mode 100644 index 00000000..85bbb5b3 --- /dev/null +++ b/Resources/Private/Partials/Forms/Password.html @@ -0,0 +1,17 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + +
+ + + +
+ +
+ + + +
\ No newline at end of file diff --git a/Resources/Private/Partials/Forms/Radio.html b/Resources/Private/Partials/Forms/Radio.html new file mode 100644 index 00000000..425e296b --- /dev/null +++ b/Resources/Private/Partials/Forms/Radio.html @@ -0,0 +1,18 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + +
+
+ + {field.title}* + + +
+ +
+ + +
+
+
+
+
diff --git a/Resources/Private/Partials/Forms/Reset.html b/Resources/Private/Partials/Forms/Reset.html new file mode 100644 index 00000000..89fd742b --- /dev/null +++ b/Resources/Private/Partials/Forms/Reset.html @@ -0,0 +1,4 @@ + +
+ +
diff --git a/Resources/Private/Partials/Forms/Select.html b/Resources/Private/Partials/Forms/Select.html new file mode 100644 index 00000000..dcdc171a --- /dev/null +++ b/Resources/Private/Partials/Forms/Select.html @@ -0,0 +1,8 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + +
+ + +
\ No newline at end of file diff --git a/Resources/Private/Partials/Forms/Submit.html b/Resources/Private/Partials/Forms/Submit.html new file mode 100644 index 00000000..b55663be --- /dev/null +++ b/Resources/Private/Partials/Forms/Submit.html @@ -0,0 +1,4 @@ + +
+ +
diff --git a/Resources/Private/Partials/Forms/Text.html b/Resources/Private/Partials/Forms/Text.html new file mode 100644 index 00000000..587d6771 --- /dev/null +++ b/Resources/Private/Partials/Forms/Text.html @@ -0,0 +1,4 @@ + +
+ {field.text} +
\ No newline at end of file diff --git a/Resources/Private/Partials/Forms/Textarea.html b/Resources/Private/Partials/Forms/Textarea.html new file mode 100644 index 00000000..3ade063d --- /dev/null +++ b/Resources/Private/Partials/Forms/Textarea.html @@ -0,0 +1,8 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + +
+ + +
diff --git a/Resources/Private/Partials/Forms/Typoscript.html b/Resources/Private/Partials/Forms/Typoscript.html new file mode 100644 index 00000000..557850bf --- /dev/null +++ b/Resources/Private/Partials/Forms/Typoscript.html @@ -0,0 +1,4 @@ + +
+ +
\ No newline at end of file diff --git a/Resources/Private/Partials/GoogleAdwordsConversion.html b/Resources/Private/Partials/GoogleAdwordsConversion.html new file mode 100644 index 00000000..00bced5a --- /dev/null +++ b/Resources/Private/Partials/GoogleAdwordsConversion.html @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/Resources/Private/Partials/MarketingInformation.html b/Resources/Private/Partials/MarketingInformation.html new file mode 100644 index 00000000..d8fa4672 --- /dev/null +++ b/Resources/Private/Partials/MarketingInformation.html @@ -0,0 +1,33 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + +

 

+ + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + > + + {value}
+
\ No newline at end of file diff --git a/Resources/Private/Partials/Module/ExportBe.html b/Resources/Private/Partials/Module/ExportBe.html new file mode 100644 index 00000000..eca1100c --- /dev/null +++ b/Resources/Private/Partials/Module/ExportBe.html @@ -0,0 +1,105 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + + + + +
+ + +
+ +

+   + +

+ + +
+ +
+
+ +
    + +
  • + () +
  • +
    +
+
+
+ +
    +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
+
+
+ + + + + + + + + + + + + + + +
+ +
\ No newline at end of file diff --git a/Resources/Private/Partials/Module/FilterBe.html b/Resources/Private/Partials/Module/FilterBe.html new file mode 100644 index 00000000..fd0bc431 --- /dev/null +++ b/Resources/Private/Partials/Module/FilterBe.html @@ -0,0 +1,18 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + \ No newline at end of file diff --git a/Resources/Private/Partials/Module/SearchBe.html b/Resources/Private/Partials/Module/SearchBe.html new file mode 100644 index 00000000..0bd41e69 --- /dev/null +++ b/Resources/Private/Partials/Module/SearchBe.html @@ -0,0 +1,143 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + + + +
+ + + + + + +
+ + + + + + +

+   + +

+ + + + + + + + + +
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/Resources/Private/Partials/Output/Abc.html b/Resources/Private/Partials/Output/Abc.html new file mode 100644 index 00000000..8ebb1cb7 --- /dev/null +++ b/Resources/Private/Partials/Output/Abc.html @@ -0,0 +1,21 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + +
+
+ + + + + {letter} + + + {letter} + + + + + + + +
+
\ No newline at end of file diff --git a/Resources/Private/Partials/Output/Export.html b/Resources/Private/Partials/Output/Export.html new file mode 100644 index 00000000..ec8b6397 --- /dev/null +++ b/Resources/Private/Partials/Output/Export.html @@ -0,0 +1,43 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + + + +
+
+ + +
+ + + + + + +
+
+ + +
+ + + + + + +
+
+ + + +
+ + + +
+
+ +
+
+
+ +
diff --git a/Resources/Private/Partials/Output/Field/Check.html b/Resources/Private/Partials/Output/Field/Check.html new file mode 100644 index 00000000..9d127592 --- /dev/null +++ b/Resources/Private/Partials/Output/Field/Check.html @@ -0,0 +1,18 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + +
+
+ + {field.title}* + + +
+ +
+ + +
+
+
+
+
diff --git a/Resources/Private/Partials/Output/Field/Input.html b/Resources/Private/Partials/Output/Field/Input.html new file mode 100644 index 00000000..237a1932 --- /dev/null +++ b/Resources/Private/Partials/Output/Field/Input.html @@ -0,0 +1,16 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + +
+ + + + + + + + + + +
\ No newline at end of file diff --git a/Resources/Private/Partials/Output/Field/Radio.html b/Resources/Private/Partials/Output/Field/Radio.html new file mode 100644 index 00000000..56deb06a --- /dev/null +++ b/Resources/Private/Partials/Output/Field/Radio.html @@ -0,0 +1,18 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + +
+
+ + {field.title}* + + +
+ +
+ + +
+
+
+
+
diff --git a/Resources/Private/Partials/Output/Field/Select.html b/Resources/Private/Partials/Output/Field/Select.html new file mode 100644 index 00000000..271b7f63 --- /dev/null +++ b/Resources/Private/Partials/Output/Field/Select.html @@ -0,0 +1,8 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + +
+ + +
\ No newline at end of file diff --git a/Resources/Private/Partials/Output/Field/Textarea.html b/Resources/Private/Partials/Output/Field/Textarea.html new file mode 100644 index 00000000..26af1d87 --- /dev/null +++ b/Resources/Private/Partials/Output/Field/Textarea.html @@ -0,0 +1,8 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + +
+ + +
diff --git a/Resources/Private/Partials/Output/Search.html b/Resources/Private/Partials/Output/Search.html new file mode 100644 index 00000000..3cb0ad76 --- /dev/null +++ b/Resources/Private/Partials/Output/Search.html @@ -0,0 +1,36 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + + + + +
+ + + +
+ + +
+
+ +
+ + +
+
+
+
+ + + +
+
+
+ + + + \ No newline at end of file diff --git a/Resources/Private/Templates/Forms/Confirmation.html b/Resources/Private/Templates/Forms/Confirmation.html new file mode 100644 index 00000000..854f8c04 --- /dev/null +++ b/Resources/Private/Templates/Forms/Confirmation.html @@ -0,0 +1,57 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + + +Show Confirmation Page +{field} All Field values with their uids +{powermail_all} All Field values with their markers + + + + +
+

+ + + {powermail_all} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ +
\ No newline at end of file diff --git a/Resources/Private/Templates/Forms/Create.html b/Resources/Private/Templates/Forms/Create.html new file mode 100644 index 00000000..88287a60 --- /dev/null +++ b/Resources/Private/Templates/Forms/Create.html @@ -0,0 +1,58 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + + +Render Powermail Thx Page +{powermail_rte} Variable is filled with values from RTE in backend +{powermail_all} Outputs all fields +{marker1}, {firstname}, etc.. Outputs a field +NOTE: See example section after main section + + + + +
+ + + + + {powermail_rte} + + + + + + + + + +
+
+ + + + + + + +THIS IS ONLY AN EXAMPLE SECTION + + + + + 1. Get values from RTE from Backend: + + + {powermail_rte} + + + + + 2. Get all Values by using powermail_all + + {powermail_all} + + + 3. Get some lonely fields + Hi {firstname} {lastname}, this is a test... + + \ No newline at end of file diff --git a/Resources/Private/Templates/Forms/Form.html b/Resources/Private/Templates/Forms/Form.html new file mode 100644 index 00000000..6efb5be7 --- /dev/null +++ b/Resources/Private/Templates/Forms/Form.html @@ -0,0 +1,34 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + + +Render Powermail Form +{forms} All Forms with their Pages and their Fields + + + + + + + + + +

{form.title}

+ + + + +
+ {page.title} + + + + + +
+
+ +
+ +
+ +
\ No newline at end of file diff --git a/Resources/Private/Templates/Forms/OptinConfirm.html b/Resources/Private/Templates/Forms/OptinConfirm.html new file mode 100644 index 00000000..6d7e6b60 --- /dev/null +++ b/Resources/Private/Templates/Forms/OptinConfirm.html @@ -0,0 +1,10 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + + +Render Powermail Confirm Failed Page + + +
+ +
+
\ No newline at end of file diff --git a/Resources/Private/Templates/Forms/PowermailAll.html b/Resources/Private/Templates/Forms/PowermailAll.html new file mode 100644 index 00000000..2cf9aee4 --- /dev/null +++ b/Resources/Private/Templates/Forms/PowermailAll.html @@ -0,0 +1,60 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + + +Render Powermail All Part +{variables} Contains all given Plugins variables +{section} Contains "web" or "mail" + + +Section for Web view + + + +
+
{label}
+
+ + + + + {variable2}, + + + + + {variable} + + +
+
+
+
+
+ + + +Section for Mails + + + + + + + + + +
{label} + + + + + {variable2}, + + + + + {variable} + + +
+
\ No newline at end of file diff --git a/Resources/Private/Templates/Mails/OptinMail.html b/Resources/Private/Templates/Mails/OptinMail.html new file mode 100644 index 00000000..4055d9d9 --- /dev/null +++ b/Resources/Private/Templates/Mails/OptinMail.html @@ -0,0 +1,16 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + + +Render Powermail Optin Mail + + + + + +


+ + + + {powermail_all} + +
\ No newline at end of file diff --git a/Resources/Private/Templates/Mails/ReceiverMail.html b/Resources/Private/Templates/Mails/ReceiverMail.html new file mode 100644 index 00000000..cb9bb46e --- /dev/null +++ b/Resources/Private/Templates/Mails/ReceiverMail.html @@ -0,0 +1,45 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + + +Render Powermail Mail to Receiver +{powermail_rte} Variable is filled with values from RTE in backend +{powermail_all} Outputs all fields +{marker1}, {firstname}, etc.. Outputs a field +NOTE: See example section after main section + + + + + {powermail_rte} + + + + + + + + + + + +THIS IS ONLY AN EXAMPLE SECTION + + + + 1. Get values from RTE from Backend: + + + {powermail_rte} + + + + + 2. Get all Values by using powermail_all + + {powermail_all} + + + 3. Get some lonely fields + Hi {firstname} {lastname}, this is a test... + + \ No newline at end of file diff --git a/Resources/Private/Templates/Mails/SenderMail.html b/Resources/Private/Templates/Mails/SenderMail.html new file mode 100644 index 00000000..faef86cc --- /dev/null +++ b/Resources/Private/Templates/Mails/SenderMail.html @@ -0,0 +1,43 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + + +Render Powermail Mail to Sender +{powermail_rte} Variable is filled with values from RTE in backend +{powermail_all} Outputs all fields +{marker1}, {firstname}, etc.. Outputs a field +NOTE: See example section after main section + + + + + {powermail_rte} + + + + + + + + + +THIS IS ONLY AN EXAMPLE SECTION + + + + 1. Get values from RTE from Backend: + + + {powermail_rte} + + + + + 2. Get all Values by using powermail_all + + {powermail_all} + + + 3. Get some lonely fields + Hi {firstname} {lastname}, this is a test... + + \ No newline at end of file diff --git a/Resources/Private/Templates/Module/CheckBe.html b/Resources/Private/Templates/Module/CheckBe.html new file mode 100644 index 00000000..e103cdaa --- /dev/null +++ b/Resources/Private/Templates/Module/CheckBe.html @@ -0,0 +1,208 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + + + +Show Backend Module: Powermail List + + + +

+ + + +
+
+
+ +
+
+
+

+ + ({pid}) +

+
+
+
+ +
+
+ +
+
+

+ + ({pid}) +

+
+
+
+
+ + + +
+
+
+ +
+
+
+

+ +

+
+
+
+ +
+
+ +
+
+

+ +

+
+
+
+
+ + + +
+
+
+ +
+
+
+

+ +

+
+
+
+ +
+
+ +
+
+

+ +

+
+
+
+
+ + + +
+
+
+ +
+
+
+

+ +

+
+
+
+ +
+
+ +
+
+

+ +

+
+
+
+
+ + + +
+
+
+ +
+
+
+

+ +

+
+
+
+ +
+
+ +
+
+

+ +

+
+
+
+
+ + + + + + +

+ + + + +
+
+
+ +
+
+
+

+ +

+
+
+
+ +
+
+ +
+
+

+ +

+
+
+
+
+
+
+
+ +
+
+ + + + + +
+
+ +
\ No newline at end of file diff --git a/Resources/Private/Templates/Module/ExportCsvBe.html b/Resources/Private/Templates/Module/ExportCsvBe.html new file mode 100644 index 00000000..ebee1558 --- /dev/null +++ b/Resources/Private/Templates/Module/ExportCsvBe.html @@ -0,0 +1,80 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + + +Render Powermail CSV Export +{mails} All Mails for exporting +{fields} Fields to export (drag'n drop settings in module) + + + + + + + + + ""; + + + ""; + + + +
+
+ + + + + + + + + + " + + + {singleValue}, + + + "; + + + "{answer.value}"; + + + + + + + + + + + " + "; + + + ""; + + + + + + + + " > " + + + + ""; + + + + + + + +
+
+ +
\ No newline at end of file diff --git a/Resources/Private/Templates/Module/ExportXlsBe.html b/Resources/Private/Templates/Module/ExportXlsBe.html new file mode 100644 index 00000000..3e496776 --- /dev/null +++ b/Resources/Private/Templates/Module/ExportXlsBe.html @@ -0,0 +1,90 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + + +Render Powermail XLS Export +{mails} All Mails for exporting +{fields} Fields to export (drag'n drop settings in module) + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +
+ + + + + + + + + {singleValue}, + + + + + {answer.value} + + + + + + + + + + + + + + + + + + + + + + + + > + + + + + + + + + + + +
+
+ +
\ No newline at end of file diff --git a/Resources/Private/Templates/Module/ListBe.html b/Resources/Private/Templates/Module/ListBe.html new file mode 100644 index 00000000..d4e92df3 --- /dev/null +++ b/Resources/Private/Templates/Module/ListBe.html @@ -0,0 +1,338 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + + + +Show Backend Module: Powermail List + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  + + + + () +  
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +   + + +   + + + + {mail.crdate} + + {mail.crdate} + + + {mail.senderName} + + + + {mail.senderMail} + + + + {mail.subject} + + +   + + +   + + +   + + + +   + + +   + + + + + + + +
+
+ + +
+
+ + + : + + + No Label: + + +
+
+ + + + + {value2}, + + + + + {answer.value} + + +
+
+
+
+ + +
+
+ +
+
+ {mail.marketingSearchterm} +
+
+
+ +
+
+ +
+
+ {mail.marketingReferer} +
+
+
+ +
+
+ +
+
+ {mail.marketingPayedSearchResult} +
+
+
+ +
+
+ +
+
+ {mail.marketingLanguage} +
+
+
+ +
+
+ +
+
+ {mail.marketingBrowserLanguage} +
+
+
+ +
+
+ +
+
+ + (PID {page}) > + +
+
+
+
+
+
+
+ +

+

+
+
+ +
\ No newline at end of file diff --git a/Resources/Private/Templates/Module/ReportingBe.html b/Resources/Private/Templates/Module/ReportingBe.html new file mode 100644 index 00000000..e32170a6 --- /dev/null +++ b/Resources/Private/Templates/Module/ReportingBe.html @@ -0,0 +1,29 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + + + +Show Backend Module: Powermail Reporting + + + +

+ + + +
+ +
+
+

+ +
+
+

+ +
+
+
+ +
+ +
\ No newline at end of file diff --git a/Resources/Private/Templates/Module/ReportingFormBe.html b/Resources/Private/Templates/Module/ReportingFormBe.html new file mode 100644 index 00000000..5f5ac14a --- /dev/null +++ b/Resources/Private/Templates/Module/ReportingFormBe.html @@ -0,0 +1,70 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + + + +Show Backend Module: Powermail Reporting Form + + + +

+ + + +
+ + + + + +

:

+ +
+
+ + + +
+

{vh:Getter.GetFieldLabelFromUid(uid: '{answer.field}')}

+ + Error, no graphic available + + + + + + + + + + + + +
{value}{amount}
+
+ +
+
+
+
+
+ +

+

+
+
+
+
\ No newline at end of file diff --git a/Resources/Private/Templates/Module/ReportingMarketingBe.html b/Resources/Private/Templates/Module/ReportingMarketingBe.html new file mode 100644 index 00000000..8423be0e --- /dev/null +++ b/Resources/Private/Templates/Module/ReportingMarketingBe.html @@ -0,0 +1,228 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + + + +Show Backend Module: Powermail Reporting Marketing + + + +

+ + + +
+ + + + + +

:

+ +
+
+ +
+

+ + Error, no graphic available + + + + + + + + + + + + +
{value}{amount}
+
+ +
+

+ + Error, no graphic available + + + + + + + + + + + + +
{value}{amount}
+
+ +
+ +
+

+ + Error, no graphic available + + + + + + + + + + + + +
{value}{amount}
+
+ +
+

+ + Error, no graphic available + + + + + + + + + + + + +
{value}{amount}
+
+ +
+ +
+

+ + Error, no graphic available + + + + + + + + + + + + +
{value}{amount}
+
+ +
+

+ + Error, no graphic available + + + + + + + + + + + + +
+ + + {value} + + + + > + + + + {amount}
+
+ +
+ +
+
+
+ +

+

+
+
+
+
\ No newline at end of file diff --git a/Resources/Private/Templates/Output/Edit.html b/Resources/Private/Templates/Output/Edit.html new file mode 100644 index 00000000..80157043 --- /dev/null +++ b/Resources/Private/Templates/Output/Edit.html @@ -0,0 +1,40 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + + +Render Powermail_Frontend Edit View +{mail} Mail Object + + + + + +
+ + + + + + + + + + + + + + + + + + + + +

+
+
+ + + + +
+
diff --git a/Resources/Private/Templates/Output/ExportCsv.html b/Resources/Private/Templates/Output/ExportCsv.html new file mode 100644 index 00000000..cf987586 --- /dev/null +++ b/Resources/Private/Templates/Output/ExportCsv.html @@ -0,0 +1,51 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + + +Render Powermail CSV Export +{mails} All Mails for exporting +{fields} Fields to export (drag'n drop settings in module) + + + + + + + + + ""; + + + ""; + + + +
+
+ + + + + + + + + " + + + {singleValue}, + + + "; + + + "{answer.value}"; + + + + + + +
+
+ +
\ No newline at end of file diff --git a/Resources/Private/Templates/Output/ExportXls.html b/Resources/Private/Templates/Output/ExportXls.html new file mode 100644 index 00000000..30bcb801 --- /dev/null +++ b/Resources/Private/Templates/Output/ExportXls.html @@ -0,0 +1,61 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + + +Render Powermail XLS Export +{mails} All Mails for exporting +{fields} Fields to export (drag'n drop settings in module) + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + +
+ + + + + + + + + {singleValue}, + + + + + {answer.value} + + + + + + +
+
+ +
\ No newline at end of file diff --git a/Resources/Private/Templates/Output/List.html b/Resources/Private/Templates/Output/List.html new file mode 100644 index 00000000..e57a10bf --- /dev/null +++ b/Resources/Private/Templates/Output/List.html @@ -0,0 +1,84 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + + +Render Powermail_Frontend List View +{mails} Mail Objects + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ () + + +
{index.cycle}. + + + + + + + {value2}, + + + + + {answer.value} + + + + + + + + + + + + + + +
+
+ +

+
+ +

+
+
+ +
+
\ No newline at end of file diff --git a/Resources/Private/Templates/Output/Rss.html b/Resources/Private/Templates/Output/Rss.html new file mode 100644 index 00000000..c2b410a3 --- /dev/null +++ b/Resources/Private/Templates/Output/Rss.html @@ -0,0 +1,37 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + + +RSS Feed for Powermail_Frontend + + + + + + + {settings.rss.title} + {settings.rss.link} + {settings.rss.description} + {settings.rss.language} + {settings.rss.copyright} + {settings.rss.updatePeriod} + {settings.rss.updateFrequency} + + + + {mail.senderName} + + + + + : {answer.value}; + + + + + + {mail.crdate} + + + + + diff --git a/Resources/Private/Templates/Output/Show.html b/Resources/Private/Templates/Output/Show.html new file mode 100644 index 00000000..676eeb34 --- /dev/null +++ b/Resources/Private/Templates/Output/Show.html @@ -0,0 +1,40 @@ +{namespace vh=Tx_Powermail_ViewHelpers} + + +Render Powermail_Frontend Show View +{mail} Mail Object + + + + + +
+ +
+ + +
+ + + +
+ + + {value2}, + + +
+
+ +
{answer.value}
+
+
+ +
+
+
+
+ + +
+
\ No newline at end of file diff --git a/Resources/Private/Templates/ViewHelpers/Widget/Paginate/Index.html b/Resources/Private/Templates/ViewHelpers/Widget/Paginate/Index.html new file mode 100644 index 00000000..70a84ba7 --- /dev/null +++ b/Resources/Private/Templates/ViewHelpers/Widget/Paginate/Index.html @@ -0,0 +1,55 @@ + + + + + + + + + + + +
    + + + + + +
  • + {page.number} +
  • +
    + +
  • + {page.number} +
  • +
    +
    +
    +
+
diff --git a/Resources/Public/Css/Backend.css b/Resources/Public/Css/Backend.css new file mode 100644 index 00000000..cf95920c --- /dev/null +++ b/Resources/Public/Css/Backend.css @@ -0,0 +1,376 @@ +/** + * Misc Settings + */ +.powermail-message { + margin: 20px 0; +} +.powermail-padding-bottom { + padding-bottom: 10px; +} +.powermail-padding-top { + padding-top: 30px; +} +.transparent { + filter: alpha(opacity=33); + -moz-opacity: 0.33; + opacity: 0.33; +} +.clear { + clear: both; +} + + +/** + * Check View + */ +.powermail_email label { + font-weight: bold; +} +.powermail_email input { + margin-left: 20px; +} +input.powermail_email_input { + padding: 4px; + width: 250px; +} + + +/** + * List View + */ +.powermail_listbe_details_container { + margin-bottom: 15px; +} +.powermail_listbe_details_dl { + margin-left: 23px; + clear: both; + padding: 3px 0; + border-top: 1px dashed #F8F8F8; + width: 80%; +} +.powermail_listbe_details_dl:first-child { + border: 0; +} +.powermail_listbe_details_dl dt { + display: block; + float: left; + width: 180px; + margin-right: 10px; +} +.powermail_listbe_details_dl dd { + margin-left: 190px; +} +.powermail_listbe_details_dl_additional { + color: #aaa; +} +.powermail_listbe_details_dl_additional:first-child { + border-top: 1px solid #aaa; +} +.hideMail, +.unhideMail, +.deleteMail, +.openPowermailDetails { + cursor: pointer; +} +ul.f3-widget-paginator { + border: 1px solid #A2AAB8; + height: 26px; + width: 98%; + margin-top: 20px; +} +ul.f3-widget-paginator li { + float: left; + display: block; + padding: 2px 6px; + margin: 3px; + background-color: #DADADA; + border: 1px solid #585858; + color: #999; +} +ul.f3-widget-paginator li a { + color: #444; +} +ul.f3-widget-paginator li.next { + margin-right: 15px; +} +a.sorting { + padding-right: 10px; + background-repeat: no-repeat; + background-position: 100% 4px; +} +a.sorting_desc { + background-image: url('/typo3conf/ext/powermail/Resources/Public/Image/icon_sorting_desc.png'); +} + +a.sorting_asc { + background-image: url('/typo3conf/ext/powermail/Resources/Public/Image/icon_sorting_asc.png'); +} + + +/** + * List View: Search + */ +.extended_search_title, +.searchall_mails, +.extended_search, +typo3-dblist { + clear: both; +} +.powermail_module_search { + margin: 15px 0; + background-color: #DDDDDD; + border: 1px solid #A2AAB8; + width: 98%; +} +.powermail_module_search_inner { + margin: 15px 15px; +} +.powermail_module_search_field { + float: left; + width: 50%; + padding: 5px 0; +} +.powermail_module_search_field label { + font-weight: bold; + width: 150px; + float: left; + display: block; + padding-top: 5px; +} +.powermail_module_search_field input, +.powermail_module_search_field select { + padding: 3px; + width: 220px; + border-top: 1px solid #A2AAB8; + border-left: 1px solid #ddd; + border-right: 1px solid #ddd; + border-bottom: 1px solid #ddd; +} +.powermail_module_search_field select { + width: 227px; +} +.powermail_module_search_field select.addField { + width: 205px; + display: none; +} +input.powermail_date { + background-position: 98% 1px; + background-repeat: no-repeat; + background-image: url('/typo3conf/ext/powermail/Resources/Public/Image/icon_calendar.png'); +} +.searchall_mails { + width: auto; +} +.searchall_mails label { + width: 172px; +} +.searchall_mails input { + padding: 5px; + width: 508px; +} +input.searchall_submit { + padding: 4px 15px; + margin-left: 20px; + width: 100px; + border: 1px solid #A2AAB8; +} +h4.extended_search_title { + padding-top: 20px; + width: 300px; +} +.extended_search { + padding: 15px 22px; + border: 1px solid #A2AAB8; +} +.cleanLink { + padding-top: 5px; + display: block; +} +.cleanLink a { + text-decoration: underline; +} +.extended_search_title { + cursor: pointer; +} +fieldset.close { + display: none; +} +fieldset.close .powermail_module_search_field_container1 .powermail_module_search_field { + opacity: 0; + -moz-opacity: 0; + -webkit-opacity: 0; + filter: alpha(opacity=0); +} +div.searchAddField label { + cursor: pointer; +} +.addSearchField { + cursor: pointer; + margin-top: 3px; +} +fieldset.extended_search .close { + display: none; +} +fieldset.extended_search .powermail_module_search_field_container2 { + clear: both; + padding-top: 10px; + margin-top: 140px; + border-top: 1px dashed #A2AAB8; +} + + +/** + * List View: Export + */ +.export_icons { + width: 100px; + float: right; + margin-right: 60px; +} +.export_icon { + float: right; + margin-left: 10px; + cursor: pointer; +} +h4.extended_export_title { + margin-top: 20px; + cursor: pointer; + width: 300px; +} +.extended_export { + padding: 15px 22px; + border: 1px solid #A2AAB8; +} +.extended_export_inner_left, +.extended_export_inner_right { + padding: 10px; + width: 47%; + background-color: white; + min-height: 100px; + border: 1px dashed #A2AAB8; + + opacity: 0; + -moz-opacity: 0; + -webkit-opacity: 0; + filter: alpha(opacity=0); +} +.extended_export_inner_left { + float: left; +} +.extended_export_inner_right { + float: right; +} +.extended_export_inner label { + font-weight: bold; +} +.extended_export_field, +.extended_export_field_container { + margin-top: 15px; +} +.extended_export_field li, +.extended_export_field_container li { + cursor: pointer; + margin: 2px 0; + padding: 3px 20px 3px 0; + color: #444; + border: 1px solid #d3d3d3; + background-image: url('/typo3conf/ext/powermail/Resources/Public/Image/icon-check.png'); + background-position: 100% 0; + background-repeat: no-repeat; + font-weight: bold; + background-color: #eee; +} +.extended_export_field_container li { + background-image: url('/typo3conf/ext/powermail/Resources/Public/Image/icon-notchecked.png'); + color: #999; + background-color: #efefef; + font-weight: normal; +} +span.info { + color: #999; + font-weight: normal; +} + + +/** + * Reporting View: Selection + */ +.powermail_reporting_selection { + background-color: #DDDDDD; + border: 1px solid #A2AAB8; + padding: 20px; +} +.powermail_reporting_selection_left { + float: left; + margin-right: 80px; + background-color: #F8F8F8; + padding: 15px; + border: 1px solid #A2AAB8; +} +.powermail_reporting_selection_right { + float: left; + background-color: #F8F8F8; + padding: 15px; + border: 1px solid #A2AAB8; +} +.powermail_reporting_selection_left img, +.powermail_reporting_selection_right img { + padding-top: 15px; +} + + +/** + * Reporting View: Form + */ +.powermail_reporting_form h3, +.powermail_reporting_marketing h3 { + margin-top: 40px; +} +.powermail_reporting_form_fields, +.powermail_reporting_marketing_fields { + background-color: #DDDDDD; + border: 1px solid #A2AAB8; + margin: 15px 0; + width: 98%; +} +.powermail_reporting_form_fields_inner, +.powermail_reporting_marketing_fields_inner { + padding: 20px; +} +.powermail_reporting_form_fields_item, +.powermail_reporting_marketing_fields_item { + background-color: #F8F8F8; + float: left; + border: 1px solid #A2AAB8; + padding: 20px; + width: 40%; + margin-right: 30px; + margin-bottom: 20px; +} +table.powermail_reporting_form_fields_table { + border: 1px solid #A2AAB8; +} +table.powermail_reporting_form_fields_table tr.even { + background-color: #DDDDDD; +} +table.powermail_reporting_form_fields_table th { + border-bottom: 1px dashed #A2AAB8; + padding: 2px; + cursor: pointer; +} +table.powermail_reporting_form_fields_table td { + padding: 2px; + padding-left: 10px; +} +table.powermail_reporting_form_fields_table th.open { + padding-left: 10px; + background-repeat: no-repeat; + background-position: 0 6px; + background-image: url('/typo3conf/ext/powermail/Resources/Public/Image/icon_sorting_desc.png'); +} +table.powermail_reporting_form_fields_table th.close { + padding-left: 10px; + background-repeat: no-repeat; + background-position: 0 6px; + background-image: url('/typo3conf/ext/powermail/Resources/Public/Image/icon_sorting_asc.png'); +} \ No newline at end of file diff --git a/Resources/Public/Css/CssFancy.css b/Resources/Public/Css/CssFancy.css new file mode 100644 index 00000000..fa63518a --- /dev/null +++ b/Resources/Public/Css/CssFancy.css @@ -0,0 +1,680 @@ +/** + * Main Settings + */ +div.tx-powermail h3 { + display: none; +} +div.tx-powermail { + font-family: Calibri, Arial, sans-serif; + font-size: 14px; + width: 640px; + margin: 0 !important; + padding: 0 !important; +} +.powermail_message { + padding-left: 20px; + min-height: 65px; + background: rgb(255,255,255); /* Old browsers */ + background: -moz-linear-gradient(top, rgba(255,255,255,1) 0%, rgba(229,229,229,1) 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,1)), color-stop(100%,rgba(229,229,229,1))); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, rgba(255,255,255,1) 0%,rgba(229,229,229,1) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(255,255,255,1) 0%,rgba(229,229,229,1) 100%); /* Opera11.10+ */ + background: -ms-linear-gradient(top, rgba(255,255,255,1) 0%,rgba(229,229,229,1) 100%); /* IE10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#e5e5e5',GradientType=0 ); /* IE6-9 */ + background: linear-gradient(top, rgba(255,255,255,1) 0%,rgba(229,229,229,1) 100%); /* W3C */ + + -webkit-box-shadow: 0px 0px 8px 0px; + -moz-box-shadow: 0px 0px 8px 0px; + box-shadow: 0px 0px 8px 0px; + + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + -khtml-border-radius: 3px; + border-radius: 3px; + + background-position: 98% 10px; + background-repeat: no-repeat; +} +.powermail_message_ok { + background-image: url("/typo3conf/ext/powermail/Resources/Public/Image/icon_ok.png"); +} +.powermail_message_error { + background-image: url("/typo3conf/ext/powermail/Resources/Public/Image/icon_error.png"); +} +.powermail_message li { + padding: 10px 50px 10px 0; + font-weight: bold; + color: #1E5799; +} +.clear { + clear: both; +} + +/** + * Form + */ +.powermail_fieldset { + clear: left; + border: 0; + padding: 10px; + margin-bottom: 20px; + + background: rgb(255,255,255); /* Old browsers */ + background: -moz-linear-gradient(top, rgba(255,255,255,1) 0%, rgba(229,229,229,1) 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,1)), color-stop(100%,rgba(229,229,229,1))); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, rgba(255,255,255,1) 0%,rgba(229,229,229,1) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(255,255,255,1) 0%,rgba(229,229,229,1) 100%); /* Opera11.10+ */ + background: -ms-linear-gradient(top, rgba(255,255,255,1) 0%,rgba(229,229,229,1) 100%); /* IE10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#e5e5e5',GradientType=0 ); /* IE6-9 */ + background: linear-gradient(top, rgba(255,255,255,1) 0%,rgba(229,229,229,1) 100%); /* W3C */ + + -webkit-box-shadow: 0px 0px 8px 0px; + -moz-box-shadow: 0px 0px 8px 0px; + box-shadow: 0px 0px 8px 0px; + + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + -khtml-border-radius: 3px; + border-radius: 3px; +} +.powermail_legend { + font-weight: bold; + color: #EAEAEA; + float: right; + margin: 3px 10px 10px 0; + font-size: 30px; + white-space:normal; +} +.powermail_label { + /* label */ + display: block; + width: 200px; + float: left; + clear: left; + font-weight: bold; + color: #1E5799; +} +div.powermail_fieldwrap { + margin: 0 0 0.5em 0; + clear: both; +} +.powermail_field { + font-family: Calibri, Arial, sans-serif; + font-size: 14px; + width: 400px; + padding: 3px; + border: 1px solid #ccc; + color: #444; + + -webkit-box-shadow: 3px 3px 5px #eee; + -moz-box-shadow: 3px 3px 5px #eee; + box-shadow: 3px 3px 5px #eee; + + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + -khtml-border-radius: 2px; + border-radius: 2px; +} +.powermail_captcha { + width: 392px; +} +.powermail_textarea { + height: 80px; +} +input.powermail_field:focus { + background-color: #E5E5E5; + border: 1px solid white; + outline: none; +} +.powermail_submit { + margin: 10px 16px 10px 0; + float: right; + border: 0; + padding: 5px 20px; + color: white; + font-weight: bold; + cursor: pointer; + + background: rgb(30,87,153); /* Old browsers */ + background: -moz-linear-gradient(top, rgba(30,87,153,1) 0%, rgba(41,137,216,1) 50%, rgba(32,124,202,1) 51%, rgba(125,185,232,1) 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(30,87,153,1)), color-stop(50%,rgba(41,137,216,1)), color-stop(51%,rgba(32,124,202,1)), color-stop(100%,rgba(125,185,232,1))); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, rgba(30,87,153,1) 0%,rgba(41,137,216,1) 50%,rgba(32,124,202,1) 51%,rgba(125,185,232,1) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(30,87,153,1) 0%,rgba(41,137,216,1) 50%,rgba(32,124,202,1) 51%,rgba(125,185,232,1) 100%); /* Opera11.10+ */ + background: -ms-linear-gradient(top, rgba(30,87,153,1) 0%,rgba(41,137,216,1) 50%,rgba(32,124,202,1) 51%,rgba(125,185,232,1) 100%); /* IE10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#1e5799', endColorstr='#7db9e8',GradientType=0 ); /* IE6-9 */ + background: linear-gradient(top, rgba(30,87,153,1) 0%,rgba(41,137,216,1) 50%,rgba(32,124,202,1) 51%,rgba(125,185,232,1) 100%); /* W3C */ + + -webkit-box-shadow: 3px 3px 5px #aaa; + -moz-box-shadow: 3px 3px 5px #aaa; + box-shadow: 3px 3px 5px #aaa; + + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + -khtml-border-radius: 2px; + border-radius: 2px; +} +.powermail_fieldwrap_radio fieldset, +.powermail_fieldwrap_check fieldset { + padding: 0; + margin: 0; + border: 0; +} +.powermail_fieldwrap_radio fieldset legend, +.powermail_fieldwrap_check fieldset legend { + padding: 0; +} +.powermail_radio_outer, +.powermail_captcha_outer, +.powermail_check_outer { + background-color: white; + border: 1px solid #ccc; + float: left; + padding: 3px; + width: 392px; +} +.powermail_radio_outer label, +.powermail_captcha_outer label, +.powermail_check_outer label { + color: #444; +} +.powermail_captchaimage { + width: 392px; + margin-top: 10px; +} +div.error { + background-color: #FFCA4B; + border: 1px solid #FF8100; +} +.powermail_field_error { + background-color: #FFCA4B; + border: 1px solid #FF8100; +} +div.powermail_fieldwrap_file_inner { + overflow: hidden; + height: 26px; + padding: 3px; + width: 392px; + color: white; + font-weight: bold; + cursor: pointer; + background-image: url('/typo3conf/ext/powermail/Resources/Public/Image/upload_bg.png'); +} +input.powermail_file { + position: relative; + height: 100%; + width: auto; + opacity: 0; + -moz-opacity: 0; + -webkit-opacity: 0; + filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0); +} +ul#powermail_tabmenu { + list-style-type: none; + width: 99.5%; + height: 16px; + padding: 10px 0; + margin-left: 2px; + + background: rgb(255,255,255); /* Old browsers */ + background: -moz-linear-gradient(top, rgba(255,255,255,1) 0%, rgba(229,229,229,1) 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,1)), color-stop(100%,rgba(229,229,229,1))); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, rgba(255,255,255,1) 0%,rgba(229,229,229,1) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(255,255,255,1) 0%,rgba(229,229,229,1) 100%); /* Opera11.10+ */ + background: -ms-linear-gradient(top, rgba(255,255,255,1) 0%,rgba(229,229,229,1) 100%); /* IE10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#e5e5e5',GradientType=0 ); /* IE6-9 */ + background: linear-gradient(top, rgba(255,255,255,1) 0%,rgba(229,229,229,1) 100%); /* W3C */ + + -webkit-box-shadow: 0px 0px 8px 0px; + -moz-box-shadow: 0px 0px 8px 0px; + box-shadow: 0px 0px 8px 0px; + + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + -khtml-border-radius: 3px; + border-radius: 3px; +} +ul#powermail_tabmenu li { + float: left; + margin-left: 10px; + cursor: pointer; + font-weight: bold; + color: #1E5799; +} +ul#powermail_tabmenu li.act { + text-shadow: 0px 0px 10px #888888; + filter: dropshadow(color=#888888, offx=0, offy=0); +} + +/** + * Confirmation + */ +.powermail_confirmation { + clear: left; + border: 0; + padding: 10px; + margin-bottom: 20px; + + background: rgb(255,255,255); /* Old browsers */ + background: -moz-linear-gradient(top, rgba(255,255,255,1) 0%, rgba(229,229,229,1) 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,1)), color-stop(100%,rgba(229,229,229,1))); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, rgba(255,255,255,1) 0%,rgba(229,229,229,1) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(255,255,255,1) 0%,rgba(229,229,229,1) 100%); /* Opera11.10+ */ + background: -ms-linear-gradient(top, rgba(255,255,255,1) 0%,rgba(229,229,229,1) 100%); /* IE10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#e5e5e5',GradientType=0 ); /* IE6-9 */ + background: linear-gradient(top, rgba(255,255,255,1) 0%,rgba(229,229,229,1) 100%); /* W3C */ + + -webkit-box-shadow: 0px 0px 8px 0px; + -moz-box-shadow: 0px 0px 8px 0px; + box-shadow: 0px 0px 8px 0px; + + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + -khtml-border-radius: 3px; + border-radius: 3px; +} +input.powermail_confirmation_form { + float: left; + margin-top: 20px; + padding: 5px 20px; + color: white; + font-weight: bold; + cursor: pointer; + + background: rgb(30,87,153); /* Old browsers */ + background: -moz-linear-gradient(top, rgba(30,87,153,1) 0%, rgba(41,137,216,1) 50%, rgba(32,124,202,1) 51%, rgba(125,185,232,1) 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(30,87,153,1)), color-stop(50%,rgba(41,137,216,1)), color-stop(51%,rgba(32,124,202,1)), color-stop(100%,rgba(125,185,232,1))); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, rgba(30,87,153,1) 0%,rgba(41,137,216,1) 50%,rgba(32,124,202,1) 51%,rgba(125,185,232,1) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(30,87,153,1) 0%,rgba(41,137,216,1) 50%,rgba(32,124,202,1) 51%,rgba(125,185,232,1) 100%); /* Opera11.10+ */ + background: -ms-linear-gradient(top, rgba(30,87,153,1) 0%,rgba(41,137,216,1) 50%,rgba(32,124,202,1) 51%,rgba(125,185,232,1) 100%); /* IE10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#1e5799', endColorstr='#7db9e8',GradientType=0 ); /* IE6-9 */ + background: linear-gradient(top, rgba(30,87,153,1) 0%,rgba(41,137,216,1) 50%,rgba(32,124,202,1) 51%,rgba(125,185,232,1) 100%); /* W3C */ + + -webkit-box-shadow: 3px 3px 5px #aaa; + -moz-box-shadow: 3px 3px 5px #aaa; + box-shadow: 3px 3px 5px #aaa; + + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + -khtml-border-radius: 2px; + border-radius: 2px; +} +input.powermail_confirmation_submit { + float: right; + margin-top: 20px; + padding: 5px 20px; + color: white; + font-weight: bold; + cursor: pointer; + + background: rgb(30,87,153); /* Old browsers */ + background: -moz-linear-gradient(top, rgba(30,87,153,1) 0%, rgba(41,137,216,1) 50%, rgba(32,124,202,1) 51%, rgba(125,185,232,1) 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(30,87,153,1)), color-stop(50%,rgba(41,137,216,1)), color-stop(51%,rgba(32,124,202,1)), color-stop(100%,rgba(125,185,232,1))); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, rgba(30,87,153,1) 0%,rgba(41,137,216,1) 50%,rgba(32,124,202,1) 51%,rgba(125,185,232,1) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(30,87,153,1) 0%,rgba(41,137,216,1) 50%,rgba(32,124,202,1) 51%,rgba(125,185,232,1) 100%); /* Opera11.10+ */ + background: -ms-linear-gradient(top, rgba(30,87,153,1) 0%,rgba(41,137,216,1) 50%,rgba(32,124,202,1) 51%,rgba(125,185,232,1) 100%); /* IE10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#1e5799', endColorstr='#7db9e8',GradientType=0 ); /* IE6-9 */ + background: linear-gradient(top, rgba(30,87,153,1) 0%,rgba(41,137,216,1) 50%,rgba(32,124,202,1) 51%,rgba(125,185,232,1) 100%); /* W3C */ + + -webkit-box-shadow: 3px 3px 5px #aaa; + -moz-box-shadow: 3px 3px 5px #aaa; + box-shadow: 3px 3px 5px #aaa; + + -webkit-border-radius: 2px; + -moz-border-radius: 2px; + -khtml-border-radius: 2px; + border-radius: 2px; +} + +/** + * Powermail All + */ +dl.powermail_all { + padding: 5px 0; +} +dl.powermail_all dt { + font-weight: bold; + float: left; + width: 150px; + clear: left; +} +dl.powermail_all dd { + float: left; + width: 420px; +} + +/** + * Create + */ +.powermail_create { + border: 0; + padding: 10px; + margin-bottom: 20px; + + background: rgb(255,255,255); /* Old browsers */ + background: -moz-linear-gradient(top, rgba(255,255,255,1) 0%, rgba(229,229,229,1) 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,1)), color-stop(100%,rgba(229,229,229,1))); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, rgba(255,255,255,1) 0%,rgba(229,229,229,1) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(255,255,255,1) 0%,rgba(229,229,229,1) 100%); /* Opera11.10+ */ + background: -ms-linear-gradient(top, rgba(255,255,255,1) 0%,rgba(229,229,229,1) 100%); /* IE10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#e5e5e5',GradientType=0 ); /* IE6-9 */ + background: linear-gradient(top, rgba(255,255,255,1) 0%,rgba(229,229,229,1) 100%); /* W3C */ + + -webkit-box-shadow: 0px 0px 8px 0px; + -moz-box-shadow: 0px 0px 8px 0px; + box-shadow: 0px 0px 8px 0px; + + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + -khtml-border-radius: 3px; + border-radius: 3px; +} + +/** + * JS Form Validation + */ + + + + +/* Z-INDEX */ +.formError { z-index: 990; } +.formError .formErrorContent { z-index: 991; } +.formError .formErrorArrow { z-index: 996; } +.formErrorInsideDialog.formError { z-index: 5000; } +.formErrorInsideDialog.formError .formErrorContent { z-index: 5001; } +.formErrorInsideDialog.formError .formErrorArrow { z-index: 5006; } +.inputContainer { + position: relative; + float: left; +} +.formError { + font-family: Calibri, Arial, sans-serif; + position: absolute; + top: 300px; + left: 300px; + display: block; + cursor: pointer; +} +.ajaxSubmit { + padding: 20px; + background: #55ea55; + border: 1px solid #999; + display: none +} +.formError .formErrorContent { + width: 100%; + position:relative; + color: #fff; + width: 150px; + font-size: 11px; + border: 2px solid #ddd; + box-shadow: 0 0 6px #000; + -moz-box-shadow: 0 0 6px #000; + -webkit-box-shadow: 0 0 6px #000; + padding: 4px 10px 4px 10px; + border-radius: 6px; + -moz-border-radius: 6px; + -webkit-border-radius: 6px; + + background: rgb(30,87,153); /* Old browsers */ + background: -moz-linear-gradient(top, rgba(30,87,153,1) 0%, rgba(41,137,216,1) 50%, rgba(32,124,202,1) 51%, rgba(125,185,232,1) 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(30,87,153,1)), color-stop(50%,rgba(41,137,216,1)), color-stop(51%,rgba(32,124,202,1)), color-stop(100%,rgba(125,185,232,1))); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, rgba(30,87,153,1) 0%,rgba(41,137,216,1) 50%,rgba(32,124,202,1) 51%,rgba(125,185,232,1) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(30,87,153,1) 0%,rgba(41,137,216,1) 50%,rgba(32,124,202,1) 51%,rgba(125,185,232,1) 100%); /* Opera11.10+ */ + background: -ms-linear-gradient(top, rgba(30,87,153,1) 0%,rgba(41,137,216,1) 50%,rgba(32,124,202,1) 51%,rgba(125,185,232,1) 100%); /* IE10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#1e5799', endColorstr='#7db9e8',GradientType=0 ); /* IE6-9 */ + background: linear-gradient(top, rgba(30,87,153,1) 0%,rgba(41,137,216,1) 50%,rgba(32,124,202,1) 51%,rgba(125,185,232,1) 100%); /* W3C */ +} +.greenPopup .formErrorContent { + background: #33be40; +} +.blackPopup .formErrorContent { + background: #393939; + color: #FFF; +} +.formError .formErrorArrow { + width: 15px; + margin: -2px 0 0 13px; + position:relative; +} +body[dir='rtl'] .formError .formErrorArrow, +body.rtl .formError .formErrorArrow { + margin: -2px 13px 0 0; +} +.formError .formErrorArrowBottom { + box-shadow: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; + margin: 0px 0 0 12px; + top:2px; +} +.formError .formErrorArrow div { + border-left: 2px solid #ddd; + border-right: 2px solid #ddd; + box-shadow: 0 2px 3px #444; + -moz-box-shadow: 0 2px 3px #444; + -webkit-box-shadow: 0 2px 3px #444; + font-size: 0px; + height: 1px; + margin: 0 auto; + line-height: 0; + font-size: 0; + display: block; + + background: rgb(30,87,153); /* Old browsers */ + background: -moz-linear-gradient(top, rgba(30,87,153,1) 0%, rgba(41,137,216,1) 50%, rgba(32,124,202,1) 51%, rgba(125,185,232,1) 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(30,87,153,1)), color-stop(50%,rgba(41,137,216,1)), color-stop(51%,rgba(32,124,202,1)), color-stop(100%,rgba(125,185,232,1))); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, rgba(30,87,153,1) 0%,rgba(41,137,216,1) 50%,rgba(32,124,202,1) 51%,rgba(125,185,232,1) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(30,87,153,1) 0%,rgba(41,137,216,1) 50%,rgba(32,124,202,1) 51%,rgba(125,185,232,1) 100%); /* Opera11.10+ */ + background: -ms-linear-gradient(top, rgba(30,87,153,1) 0%,rgba(41,137,216,1) 50%,rgba(32,124,202,1) 51%,rgba(125,185,232,1) 100%); /* IE10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#1e5799', endColorstr='#7db9e8',GradientType=0 ); /* IE6-9 */ + background: linear-gradient(top, rgba(30,87,153,1) 0%,rgba(41,137,216,1) 50%,rgba(32,124,202,1) 51%,rgba(125,185,232,1) 100%); /* W3C */ +} +.formError .formErrorArrowBottom div { + box-shadow: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; +} +.greenPopup .formErrorArrow div { + background: #33be40; +} +.blackPopup .formErrorArrow div { + background: #393939; + color: #FFF; +} +.formError .formErrorArrow .line10 { + width: 15px; + border: none; +} +.formError .formErrorArrow .line9 { + width: 13px; + border: none; +} +.formError .formErrorArrow .line8 { + width: 11px; +} +.formError .formErrorArrow .line7 { + width: 9px; +} +.formError .formErrorArrow .line6 { + width: 7px; +} +.formError .formErrorArrow .line5 { + width: 5px; +} +.formError .formErrorArrow .line4 { + width: 3px; +} +.formError .formErrorArrow .line3 { + width: 1px; + border-left: 2px solid #ddd; + border-right: 2px solid #ddd; + border-bottom: 0 solid #ddd; +} +.formError .formErrorArrow .line2 { + width: 3px; + border: none; + background: #ddd; +} +.formError .formErrorArrow .line1 { + width: 1px; + border: none; + background: #ddd; +} + +/** + * Powermail_Frontend + */ +#powermail_frontend_search { + margin: 0; +} +.powermail_frontend { + clear: left; + border: 0; + padding: 10px; + margin-bottom: 20px; + overflow: auto; + + background: rgb(255,255,255); /* Old browsers */ + background: -moz-linear-gradient(top, rgba(255,255,255,1) 0%, rgba(229,229,229,1) 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,1)), color-stop(100%,rgba(229,229,229,1))); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, rgba(255,255,255,1) 0%,rgba(229,229,229,1) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(255,255,255,1) 0%,rgba(229,229,229,1) 100%); /* Opera11.10+ */ + background: -ms-linear-gradient(top, rgba(255,255,255,1) 0%,rgba(229,229,229,1) 100%); /* IE10+ */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#e5e5e5',GradientType=0 ); /* IE6-9 */ + background: linear-gradient(top, rgba(255,255,255,1) 0%,rgba(229,229,229,1) 100%); /* W3C */ + + -webkit-box-shadow: 0px 0px 8px 0px; + -moz-box-shadow: 0px 0px 8px 0px; + box-shadow: 0px 0px 8px 0px; + + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + -khtml-border-radius: 3px; + border-radius: 3px; +} +.powermail_frontend_list { + width: 100%; + font-size: 0.9em; + border: 1px solid #070708; + margin-top: 15px; +} +.powermail_frontend_list th { + color: white; + font-weight: bold; + padding: 3px; + text-align: left; + + background: rgb(69,72,77); /* Old browsers */ + background: -moz-linear-gradient(top, rgba(69,72,77,1) 0%, rgba(0,0,0,1) 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(69,72,77,1)), color-stop(100%,rgba(0,0,0,1))); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, rgba(69,72,77,1) 0%,rgba(0,0,0,1) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(69,72,77,1) 0%,rgba(0,0,0,1) 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, rgba(69,72,77,1) 0%,rgba(0,0,0,1) 100%); /* IE10+ */ + background: linear-gradient(top, rgba(69,72,77,1) 0%,rgba(0,0,0,1) 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#45484d', endColorstr='#000000',GradientType=0 ); /* IE6-9 */ +} +.powermail_frontend_list td { + border-top: 1px solid #ccc; + padding: 3px; +} +.powermail_frontend_filter { + background: rgb(252,255,244); /* Old browsers */ + background: -moz-linear-gradient(top, rgba(252,255,244,1) 0%, rgba(223,229,215,1) 40%, rgba(179,190,173,1) 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(252,255,244,1)), color-stop(40%,rgba(223,229,215,1)), color-stop(100%,rgba(179,190,173,1))); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, rgba(252,255,244,1) 0%,rgba(223,229,215,1) 40%,rgba(179,190,173,1) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(252,255,244,1) 0%,rgba(223,229,215,1) 40%,rgba(179,190,173,1) 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, rgba(252,255,244,1) 0%,rgba(223,229,215,1) 40%,rgba(179,190,173,1) 100%); /* IE10+ */ + background: linear-gradient(top, rgba(252,255,244,1) 0%,rgba(223,229,215,1) 40%,rgba(179,190,173,1) 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fcfff4', endColorstr='#b3bead',GradientType=0 ); /* IE6-9 */ + border: 1px solid #ccc; + padding: 10px 0; +} +.powermail_frontend_search_container { + padding: 5px 10px; +} +.powermail_frontend_search_container label { + float: left; + display: block; + width: 150px; + font-weight: bold; + margin-right: 10px; + padding-top: 3px; +} +.powermail_frontend_search_container input { + width: 430px; + padding: 3px; +} +.powermail_frontend_search_submit { + width: 430px; + padding: 3px; + margin: 5px 0 0 170px; + color: white; + font-weight: bold; + cursor: pointer; + + background: rgb(69,72,77); /* Old browsers */ + background: -moz-linear-gradient(top, rgba(69,72,77,1) 0%, rgba(0,0,0,1) 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(69,72,77,1)), color-stop(100%,rgba(0,0,0,1))); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, rgba(69,72,77,1) 0%,rgba(0,0,0,1) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(69,72,77,1) 0%,rgba(0,0,0,1) 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, rgba(69,72,77,1) 0%,rgba(0,0,0,1) 100%); /* IE10+ */ + background: linear-gradient(top, rgba(69,72,77,1) 0%,rgba(0,0,0,1) 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#45484d', endColorstr='#000000',GradientType=0 ); /* IE6-9 */ +} +.powermail_frontend_abc, +.powermail_frontend_export { + background: rgb(252,255,244); /* Old browsers */ + background: -moz-linear-gradient(top, rgba(252,255,244,1) 0%, rgba(223,229,215,1) 40%, rgba(179,190,173,1) 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(252,255,244,1)), color-stop(40%,rgba(223,229,215,1)), color-stop(100%,rgba(179,190,173,1))); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(top, rgba(252,255,244,1) 0%,rgba(223,229,215,1) 40%,rgba(179,190,173,1) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(top, rgba(252,255,244,1) 0%,rgba(223,229,215,1) 40%,rgba(179,190,173,1) 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(top, rgba(252,255,244,1) 0%,rgba(223,229,215,1) 40%,rgba(179,190,173,1) 100%); /* IE10+ */ + background: linear-gradient(top, rgba(252,255,244,1) 0%,rgba(223,229,215,1) 40%,rgba(179,190,173,1) 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fcfff4', endColorstr='#b3bead',GradientType=0 ); /* IE6-9 */ + border: 1px solid #ccc; + padding: 10px 0; +} +.powermail_frontend_abc_inner, +.powermail_frontend_export_inner { + margin: 0 10px; +} +span.abc, +span.abc a { + font-weight: bold; + text-decoration: none; +} +.powermail_frontend dl { + clear: both; + padding: 5px 0; +} +.powermail_frontend dt { + float: left; + width: 150px; + font-weight: bold; + clear: left; + margin-right: 10px; +} +.powermail_frontend dd { + float: left; +} +.powermail_frontend_export_icon { + float: right; + margin: 0 8px; + padding-top: 5px; + height: 19px; +} +.powermail_frontend_export input { + width: 17px; + height: 16px; + padding-top: 2px; + cursor: pointer; + text-indent: -99999px; + border: 0; + background: none; + background-repeat: no-repeat; + background-image: url('/typo3conf/ext/powermail/Resources/Public/Image/icon_csv.gif'); +} +.powermail_frontend_export input.export_icon_xls { + background-image: url('/typo3conf/ext/powermail/Resources/Public/Image/icon_xls.gif'); +} \ No newline at end of file diff --git a/Resources/Public/Css/jquery.ui.datepicker.css b/Resources/Public/Css/jquery.ui.datepicker.css new file mode 100644 index 00000000..bf614590 --- /dev/null +++ b/Resources/Public/Css/jquery.ui.datepicker.css @@ -0,0 +1,68 @@ +/* + * jQuery UI Datepicker 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Datepicker#theming + */ +.ui-datepicker { width: 17em; padding: .2em .2em 0; display: none; } +.ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; } +.ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; } +.ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; } +.ui-datepicker .ui-datepicker-prev { left:2px; } +.ui-datepicker .ui-datepicker-next { right:2px; } +.ui-datepicker .ui-datepicker-prev-hover { left:1px; } +.ui-datepicker .ui-datepicker-next-hover { right:1px; } +.ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; } +.ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; } +.ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; } +.ui-datepicker select.ui-datepicker-month-year {width: 100%;} +.ui-datepicker select.ui-datepicker-month, +.ui-datepicker select.ui-datepicker-year { width: 49%;} +.ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; } +.ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; } +.ui-datepicker td { border: 0; padding: 1px; } +.ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; } +.ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; } +.ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; } +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; } + +/* with multiple calendars */ +.ui-datepicker.ui-datepicker-multi { width:auto; } +.ui-datepicker-multi .ui-datepicker-group { float:left; } +.ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; } +.ui-datepicker-multi-2 .ui-datepicker-group { width:50%; } +.ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; } +.ui-datepicker-multi-4 .ui-datepicker-group { width:25%; } +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; } +.ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; } +.ui-datepicker-row-break { clear:both; width:100%; font-size:0em; } + +/* RTL support */ +.ui-datepicker-rtl { direction: rtl; } +.ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; } +.ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; } +.ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; } +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; } +.ui-datepicker-rtl .ui-datepicker-group { float:right; } +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; } +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; } + +/* IE6 IFRAME FIX (taken from datepicker 1.5.3 */ +.ui-datepicker-cover { + display: none; /*sorry for IE5*/ + display/**/: block; /*sorry for IE5*/ + position: absolute; /*must have*/ + z-index: -1; /*must have*/ + filter: mask(); /*must have*/ + top: -4px; /*must have*/ + left: -4px; /*must have*/ + width: 200px; /*must have*/ + height: 200px; /*must have*/ +} \ No newline at end of file diff --git a/Resources/Public/Css/jquery.ui.theme.css b/Resources/Public/Css/jquery.ui.theme.css new file mode 100644 index 00000000..064f1fc2 --- /dev/null +++ b/Resources/Public/Css/jquery.ui.theme.css @@ -0,0 +1,247 @@ +/* + * jQuery UI CSS Framework 1.8.18 + * + * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Theming/API + * + * To view and modify this theme, visit http://jqueryui.com/themeroller/ + */ + + +/* Component containers +----------------------------------*/ +.ui-widget { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1.1em/*{fsDefault}*/; } +.ui-widget .ui-widget { font-size: 1em; } +.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif/*{ffDefault}*/; font-size: 1em; } +.ui-widget-content { border: 1px solid #aaaaaa/*{borderColorContent}*/; background: #ffffff/*{bgColorContent}*/ url(../../../../../Desktop/development-bundle/themes/base/images/ui-bg_flat_75_ffffff_40x100.png)/*{bgImgUrlContent}*/ 50%/*{bgContentXPos}*/ 50%/*{bgContentYPos}*/ repeat-x/*{bgContentRepeat}*/; color: #222222/*{fcContent}*/; } +.ui-widget-content a { color: #222222/*{fcContent}*/; } +.ui-widget-header { border: 1px solid #aaaaaa/*{borderColorHeader}*/; background: #cccccc/*{bgColorHeader}*/ url(../../../../../Desktop/development-bundle/themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png)/*{bgImgUrlHeader}*/ 50%/*{bgHeaderXPos}*/ 50%/*{bgHeaderYPos}*/ repeat-x/*{bgHeaderRepeat}*/; color: #222222/*{fcHeader}*/; font-weight: bold; } +.ui-widget-header a { color: #222222/*{fcHeader}*/; } + +/* Interaction states +----------------------------------*/ +.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3/*{borderColorDefault}*/; background: #e6e6e6/*{bgColorDefault}*/ url(../../../../../Desktop/development-bundle/themes/base/images/ui-bg_glass_75_e6e6e6_1x400.png)/*{bgImgUrlDefault}*/ 50%/*{bgDefaultXPos}*/ 50%/*{bgDefaultYPos}*/ repeat-x/*{bgDefaultRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #555555/*{fcDefault}*/; } +.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555/*{fcDefault}*/; text-decoration: none; } +.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999/*{borderColorHover}*/; background: #dadada/*{bgColorHover}*/ url(../../../../../Desktop/development-bundle/themes/base/images/ui-bg_glass_75_dadada_1x400.png)/*{bgImgUrlHover}*/ 50%/*{bgHoverXPos}*/ 50%/*{bgHoverYPos}*/ repeat-x/*{bgHoverRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcHover}*/; } +.ui-state-hover a, .ui-state-hover a:hover { color: #212121/*{fcHover}*/; text-decoration: none; } +.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa/*{borderColorActive}*/; background: #ffffff/*{bgColorActive}*/ url(../../../../../Desktop/development-bundle/themes/base/images/ui-bg_glass_65_ffffff_1x400.png)/*{bgImgUrlActive}*/ 50%/*{bgActiveXPos}*/ 50%/*{bgActiveYPos}*/ repeat-x/*{bgActiveRepeat}*/; font-weight: normal/*{fwDefault}*/; color: #212121/*{fcActive}*/; } +.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121/*{fcActive}*/; text-decoration: none; } +.ui-widget :active { outline: none; } + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #fcefa1/*{borderColorHighlight}*/; background: #fbf9ee/*{bgColorHighlight}*/ url(../../../../../Desktop/development-bundle/themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png)/*{bgImgUrlHighlight}*/ 50%/*{bgHighlightXPos}*/ 50%/*{bgHighlightYPos}*/ repeat-x/*{bgHighlightRepeat}*/; color: #363636/*{fcHighlight}*/; } +.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636/*{fcHighlight}*/; } +.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a/*{borderColorError}*/; background: #fef1ec/*{bgColorError}*/ url(../../../../../Desktop/development-bundle/themes/base/images/ui-bg_glass_95_fef1ec_1x400.png)/*{bgImgUrlError}*/ 50%/*{bgErrorXPos}*/ 50%/*{bgErrorYPos}*/ repeat-x/*{bgErrorRepeat}*/; color: #cd0a0a/*{fcError}*/; } +.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a/*{fcError}*/; } +.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a/*{fcError}*/; } +.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; } +.ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } +.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { width: 16px; height: 16px; background-image: url(../../../../../Desktop/development-bundle/themes/base/images/ui-icons_222222_256x240.png)/*{iconsContent}*/; } +.ui-widget-content .ui-icon {background-image: url(../../../../../Desktop/development-bundle/themes/base/images/ui-icons_222222_256x240.png)/*{iconsContent}*/; } +.ui-widget-header .ui-icon {background-image: url(../../../../../Desktop/development-bundle/themes/base/images/ui-icons_222222_256x240.png)/*{iconsHeader}*/; } +.ui-state-default .ui-icon { background-image: url(../../../../../Desktop/development-bundle/themes/base/images/ui-icons_888888_256x240.png)/*{iconsDefault}*/; } +.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(../../../../../Desktop/development-bundle/themes/base/images/ui-icons_454545_256x240.png)/*{iconsHover}*/; } +.ui-state-active .ui-icon {background-image: url(../../../../../Desktop/development-bundle/themes/base/images/ui-icons_454545_256x240.png)/*{iconsActive}*/; } +.ui-state-highlight .ui-icon {background-image: url(../../../../../Desktop/development-bundle/themes/base/images/ui-icons_2e83ff_256x240.png)/*{iconsHighlight}*/; } +.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(../../../../../Desktop/development-bundle/themes/base/images/ui-icons_cd0a0a_256x240.png)/*{iconsError}*/; } + +/* positioning */ +.ui-icon-carat-1-n { background-position: 0 0; } +.ui-icon-carat-1-ne { background-position: -16px 0; } +.ui-icon-carat-1-e { background-position: -32px 0; } +.ui-icon-carat-1-se { background-position: -48px 0; } +.ui-icon-carat-1-s { background-position: -64px 0; } +.ui-icon-carat-1-sw { background-position: -80px 0; } +.ui-icon-carat-1-w { background-position: -96px 0; } +.ui-icon-carat-1-nw { background-position: -112px 0; } +.ui-icon-carat-2-n-s { background-position: -128px 0; } +.ui-icon-carat-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -64px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -64px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 0 -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-off { background-position: -96px -144px; } +.ui-icon-radio-on { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-all, .ui-corner-top, .ui-corner-left, .ui-corner-tl { -moz-border-radius-topleft: 4px/*{cornerRadius}*/; -webkit-border-top-left-radius: 4px/*{cornerRadius}*/; -khtml-border-top-left-radius: 4px/*{cornerRadius}*/; border-top-left-radius: 4px/*{cornerRadius}*/; } +.ui-corner-all, .ui-corner-top, .ui-corner-right, .ui-corner-tr { -moz-border-radius-topright: 4px/*{cornerRadius}*/; -webkit-border-top-right-radius: 4px/*{cornerRadius}*/; -khtml-border-top-right-radius: 4px/*{cornerRadius}*/; border-top-right-radius: 4px/*{cornerRadius}*/; } +.ui-corner-all, .ui-corner-bottom, .ui-corner-left, .ui-corner-bl { -moz-border-radius-bottomleft: 4px/*{cornerRadius}*/; -webkit-border-bottom-left-radius: 4px/*{cornerRadius}*/; -khtml-border-bottom-left-radius: 4px/*{cornerRadius}*/; border-bottom-left-radius: 4px/*{cornerRadius}*/; } +.ui-corner-all, .ui-corner-bottom, .ui-corner-right, .ui-corner-br { -moz-border-radius-bottomright: 4px/*{cornerRadius}*/; -webkit-border-bottom-right-radius: 4px/*{cornerRadius}*/; -khtml-border-bottom-right-radius: 4px/*{cornerRadius}*/; border-bottom-right-radius: 4px/*{cornerRadius}*/; } + +/* Overlays */ +.ui-widget-overlay { background: #aaaaaa/*{bgColorOverlay}*/ url(../../../../../Desktop/development-bundle/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlOverlay}*/ 50%/*{bgOverlayXPos}*/ 50%/*{bgOverlayYPos}*/ repeat-x/*{bgOverlayRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityOverlay}*/; } +.ui-widget-shadow { margin: -8px/*{offsetTopShadow}*/ 0 0 -8px/*{offsetLeftShadow}*/; padding: 8px/*{thicknessShadow}*/; background: #aaaaaa/*{bgColorShadow}*/ url(../../../../../Desktop/development-bundle/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlShadow}*/ 50%/*{bgShadowXPos}*/ 50%/*{bgShadowYPos}*/ repeat-x/*{bgShadowRepeat}*/; opacity: .3;filter:Alpha(Opacity=30)/*{opacityShadow}*/; -moz-border-radius: 8px/*{cornerRadiusShadow}*/; -khtml-border-radius: 8px/*{cornerRadiusShadow}*/; -webkit-border-radius: 8px/*{cornerRadiusShadow}*/; border-radius: 8px/*{cornerRadiusShadow}*/; } \ No newline at end of file diff --git a/Resources/Public/Icons/ce_wiz.gif b/Resources/Public/Icons/ce_wiz.gif new file mode 100644 index 0000000000000000000000000000000000000000..529e6240f18ec4de507ecd55f58776f1437d055c GIT binary patch literal 529 zcmZ?wbhEHblwgoxxXQp_Y;62(tKX+748_I8*REaLvSo|2vvW^R&zB{tKhO32zPIti zhYt}E5i@7b{Bg9TrKRP}nKRFxJ^TCaT2N5X=Q%=OR+%hWvgFs*Isd*sKXT-VwY7D1 zb@jb__tMhRzVD9td8XCN%j@r(i$LwaZY}@1-eK+9wR`sN|1_QL+cM3c7bpFBy!Zdl z_usY$|2S6hb*=U9yX*gcy8n5u=+Dd3zVA!<|NlP&A)xq^g^``Xgh25K^?7+j5-6VQrIHi+bV4jb&!D4^H`Y;gXWVE5+AOWLC)LRvj{PHfd;Go8RF~25+dWQ!=%nMnMu!?nL*5%pCQ#*W3r}@{A4bt4rZqehEj=1 ze9jz9x~mv?oOl_8U9=_(Ig2uFNZ;ke!yxUlM8rjeiL-l~6B`4&3*$s>C*{eCJ5D%N zT-!KVPD0C&iP1Sz?buvrgUJV{XxuWHqu{)AyOaJ+agPZ<44&{Za5#rqF1qN%z@))^ zi9zFGOR$!d9?J%aLrYJ!@c3Ht0rq*dZdN*YJIrh*vPOQr?Q zoOE(r3O%I7*)XTt@?Oi`_Hfon2M4;h%5r5s8UHf?=#O@YB0 E0Hd|gxc~qF literal 0 HcmV?d00001 diff --git a/Resources/Public/Icons/relation.gif b/Resources/Public/Icons/relation.gif new file mode 100644 index 0000000000000000000000000000000000000000..db61d7e18817e2969b740ccc62838a1447cd3c3c GIT binary patch literal 233 zcmZ?wbh9u|6krfwIKsfd$jB%yEgcvb*xK4Ud-m+*V6c9}`t4wF3=FP=!D}%14h9TB zki(G3kjIe9P{N?kkO3r981fmC8H$0t6rgAskS<}UWKjIc!pOiN#GnJx0zsgJEBshvI<>Lne0l)en}fzWvHFt6ysaM@@~DQbVIgvycNT2L~5d538f;Z;{3V4Trl`yQB*< arYPq69SFMd#B+J*1LN#~%KiIU7_0#~DlfhO literal 0 HcmV?d00001 diff --git a/Resources/Public/Icons/tx_powermail_domain_model_fields__h.gif b/Resources/Public/Icons/tx_powermail_domain_model_fields__h.gif new file mode 100644 index 0000000000000000000000000000000000000000..ccd1198cdc79a58d7ca414a5010e5c705da817b7 GIT binary patch literal 353 zcmZ?wbhEHb6k-ryxT?tT|NsBy=H`Zm1_lO(IdkSL=45$i!}p~%vKS^+eiMnLf=3nK%AB7+Xde2||Q*y;`hBzWkw^_@s&IFMr` z+o)1>QYB)3!-^?f3MDg}KP24#QZ@In%GD~@$@|ZxRY{dgy(_nJIPl(Cq@h8;tCT^G zm!q?jSIWt!wnmV3@)TCVzEXY#&N*|$_-9OD65^JY;at3Aevg&3&wLwaRt!{&Q(n zQsr{*%B>s@ymuDk=2GGo@G50c;b39m?B-B(@~N$n5MmMLlx2|=omeW*#Ud!f$;qWU sZ!!}?$av7J2W?#N&b04d~k!2kdN literal 0 HcmV?d00001 diff --git a/Resources/Public/Icons/tx_powermail_domain_model_fields__t.gif b/Resources/Public/Icons/tx_powermail_domain_model_fields__t.gif new file mode 100644 index 0000000000000000000000000000000000000000..c75ebf5b667c8e7743b55d1d7c39f8053f383824 GIT binary patch literal 360 zcmZ?wbhEHb6k-ryxT?nR|NsA%rj~|=1_lO(kDtGOn!>P{gZZ5epQVjsSyk<^^H<*N zUHj+9x9^Yd9y@&OfDHQ!3*OayEZ20ne*gY+T7~oD*@J)o{{8dk?}sx7e*ONlRg~?4 zG0*G0Yfme4{`>oP9t-nUQPykPT=$K5R`as_{qgPh@83Whfp$>~DE?$&WMEKZ&;c0; z@)HAFt3z;tht90N6Uht*a*SjfRf=`P9}Zin7RYh_OfrO)Qn=WD%F=;NTRQ sH<^i_mqk)om4%moEIJb(iE#_nfS^+eiMnLf=3nK%AB7+Xde2||Q*qROmBzWkw^_@s&IFMr` z->6b_QYB)3!-^?f3MDg}KP24#QZ@In%GD~@$@|ZxRY{ery({09a9-Sir=fwzi-D<7 zmXD*Wi%;CCwY5fob;?v$f&Ml>K{>8@^CSdkPOKK@mJ#D##VtIumPt~Gee-4^`TkM{ W5m8ZTUS1LRq{B%HQd8X>8LR=mtYDM? literal 0 HcmV?d00001 diff --git a/Resources/Public/Icons/tx_powermail_domain_model_forms__ht.gif b/Resources/Public/Icons/tx_powermail_domain_model_forms__ht.gif new file mode 100644 index 0000000000000000000000000000000000000000..ec23e4d06ace74838f78cc9b259972be3da477ea GIT binary patch literal 364 zcmZ?wbhEHb6k-ryxT?nR|NsBy=H`Zm1_lO(kDtHJnKNfG2lG1{zGLUFSlT$2Rn@-P zyY|nIZ{Hu^J#ys80U7oe7QBD{{QY?L;J?3rSM#!5)8Sgp$FfzF^_n)t3Aevg&3&wLwaRt!{&Q(n zQsr{*%6BE47k3cj=2GGo@M2&pRN-J@;q2j1bZT#}kq}}L=9FcT6rI%JC(p$qD8tFg wr8<8~H9s$lf}9i!FaP{nCh6{;e(_1A3}QUWTs%A??n$ST*v_7HcVw^z00MS)p8x;= literal 0 HcmV?d00001 diff --git a/Resources/Public/Icons/tx_powermail_domain_model_forms__t.gif b/Resources/Public/Icons/tx_powermail_domain_model_forms__t.gif new file mode 100644 index 0000000000000000000000000000000000000000..c0f6db6c444d085f266382960dc3aa02380c7b69 GIT binary patch literal 364 zcmZ?wbhEHb6k-ryxT?nR|NsA%rj~|=1_lO(kDtGOn!>P{gZZ5epQVjsSyk<^^H<*N zUHj+9x9^Yd9y@&OfDHQ!3*OayEZ20ne*gY+T7~oD*@J)o{{8dk?}sx7e*ONlRg~?4 zG0*G0Yfme4{`>oP9t-nUQPykPT=$K5R`as_{qgPh@83Whfp$>~DE?$&WMEKZ&;c0; z@)HAFr$capht90N6Uht*a*SjfRf)N^`NWaP)8~IkmUfD2lSkafq=<2u$4zrv(a20+|z`)L+1C(U| zsbygHuh@L&`v+bJZByk#o}K$0mK8Dt202RgOwEkSK2j-vW?q#sMgb2lkW%{VZ|NgzR z;k#id@ZL-AOK0vi9qt3N9H&({Us&+I57k}G&wAv@k@sHm*9`^k8}V!vWq)AIvsH|3 z5hu$HBZ0-7%sVAH-+RjMlHvr~0C5;4DF#S|`ul9^2#5^jH~n)_JgYL)Bc{pZrEq{{W)mH$dOFYh7L&>-Z+ zz|7_+#mCXz%_rg1%Fyn^&pK^7EB^#$AGUddid>5p$qUXd6yT8+=UK}mFuRsnQkZ?) dHeu-rr3@lsVhX&xBJN4YlH_EjyE`&i0|2CjVJrXu literal 0 HcmV?d00001 diff --git a/Resources/Public/Icons/tx_powermail_domain_model_mails.gif__t.gif b/Resources/Public/Icons/tx_powermail_domain_model_mails.gif__t.gif new file mode 100644 index 0000000000000000000000000000000000000000..bbe1a9feadc9a6e9765cb476beba987f24ffd37a GIT binary patch literal 360 zcmZ?wbhEHb6k-ryxT?hP|NsBy=4J*4hKh=cIdkSL=45GTX!z2a@y%{VZ|NgzR z;k#id@ZL-AOK0vi9qt3N9H&({Us&+I57k}G&wAv@k@sHm*9`^k8}V!vWq)AIvsH|3 z5hu$HBZ0-7%sVAH-+RjMlHvr~0C5;4DF#S|`ul9^2#5^jH~n)_JgYL)Bc{pZrEq{{W)mH$dOFYh7L&>-Z+ zz|7_+#mCXz%_rg1%Fyn^&pK^7EB^#$AGUddid>5p$qUXd6yT8+=UK}mFuRsnQkZ?) dHeu-rr3@lsVhX&xBJN4YlH_EjyE`&i0|2CjVJrXu literal 0 HcmV?d00001 diff --git a/Resources/Public/Icons/tx_powermail_domain_model_pages.gif b/Resources/Public/Icons/tx_powermail_domain_model_pages.gif new file mode 100644 index 0000000000000000000000000000000000000000..f67a0299c82b3e0c9924066fda54534b486264dd GIT binary patch literal 130 zcmZ?wbhEHb6k-rySj5Kg|Nnmm28M=)hL)z5Pg59<9XZ-&MK3zk132jf0j e2x`ndlfr+h$gek4Nl-iZmeQ&XKc+JJT_vKS^+eiMnLf=3nK%AB7+Xde2||Q*cuK5BzWkw^_@s&IFMr` z->6b_QYB)3!-^?f3MDg}KP24#QZ@In%GD~@$@|ZxRY{dAy({09a9-R&tf4``i-D<7 ziifSMi$}t#wNQ|C@)TCV{x&~e1pF literal 0 HcmV?d00001 diff --git a/Resources/Public/Icons/tx_powermail_domain_model_pages__ht.gif b/Resources/Public/Icons/tx_powermail_domain_model_pages__ht.gif new file mode 100644 index 0000000000000000000000000000000000000000..044b9d9b31dcefcba5066120ad33e298021ef9ee GIT binary patch literal 362 zcmZ?wbhEHb6k-ryxT?nR|NsBy=4J*4hK7cQkDtHJnKNfG2lG1{zGLUFSlT$2Rn@-P zyY|nIZ{Hu^J#ys80U7oe7QBD{{5`G0Igf>Tt0?O=ZLZaPEUS50e*gaS>-V4gMm!IU zdHw>yk8iK{uDzzi_3!WB-@ku*W3C(yFA& z<=&P5N;og?AjZul$1UK+z+5QJ!NS7X!y)C=UMQ->qQEJ`q9Q-3!%vxuMNpWNlS^n` sAwMsRq=X_1FaNw+X4USVevwI~3}QU8Ts%DD?nx(-*iN5zcVw^z0Dlg3ZU6uP literal 0 HcmV?d00001 diff --git a/Resources/Public/Icons/tx_powermail_domain_model_pages__t.gif b/Resources/Public/Icons/tx_powermail_domain_model_pages__t.gif new file mode 100644 index 0000000000000000000000000000000000000000..eb454443b15c958bd71c67f1c6e6613dd699afff GIT binary patch literal 362 zcmZ?wbhEHb6k-ryxT?nR|NsA%rWOVUhK7cQkDtGOn!>P{gZZ5epQVjsSyk<^^H<*N zUHj+9x9^Yd9y@&OfDHQ!3*OayEZ20ne*gZnRg~?tGUq%N=GD9`*R;7loH=k>h4b%^ zZ?Az`{`~!T_Tb;Ye}93LvHtt}_r4L&17n`wzkdU51X@Qep!k!8k%2*tK?h_Y$WIJx z?GC{S9y+u7P9!rN$T5;_R4F>C6EVMG#S|`$l9^2#5^jH~n)_JgYL)Bc{pZrEq{`*q zmH$dOFYh46%_+kz;KjgPsKUj;eJkp#zJmT(2Cz9AspLTa-um%9%A$1@C literal 0 HcmV?d00001 diff --git a/Resources/Public/Image/captcha.png b/Resources/Public/Image/captcha.png new file mode 100644 index 0000000000000000000000000000000000000000..eb656b55085d0162f15584615063bb5242e5bde5 GIT binary patch literal 10273 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 literal 0 HcmV?d00001 diff --git a/Resources/Public/Image/chart_form.png b/Resources/Public/Image/chart_form.png new file mode 100644 index 0000000000000000000000000000000000000000..801cc53d2efa62fd12f5293f4e66f3eb30c4836f GIT binary patch literal 16118 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 literal 0 HcmV?d00001 diff --git a/Resources/Public/Image/icon_ok.png b/Resources/Public/Image/icon_ok.png new file mode 100644 index 0000000000000000000000000000000000000000..dd37dd47b084b066431608f2e4eecc9ca65a00e2 GIT binary patch literal 3146 zcmV-Q47Kx#P)z^P`)@NC0RR91AY({UO#lFFn*acEZvX)Ht^fdqg8%?- z_W%IsK>z?TbN~PsY@xO-n*aa{z)3_wRCwBA{Qv(y12({dF3_H0_1^*cs z7#KR@_AxSsmn-%fnOYY8`16f{;s1Yz`pAup3=9kmjIJrdeC!t7#5Y>VPs^4 zIEvx_|NjhDVVr+pu7d#p00030|AIRg7iM5!VCdf*|G##*+kd>?U|?WiXjSFxBS2tgH%L;rE}P8EV7UK|JA?C)ulEs9A(*(|?9< zzrHX`%{aq|EDE>5K9=u~l$Ibf0|Ntt06!1I^sK886B$v|Lo_flGO{x;FbFU(FbFX) zFvu}5FfcMOFg#{pV0g#C!0>^Af#Ew$0{{R3|Nn$jF-yZ>5PhH0KtNYrEEJ_6HcQta z*uT&v;2#hix)k~Yy6KcfB)U3AaSslH)F5KofMlqOXa`#=G%+#B7lNNl8jOZ|<8klq z-o1A-N$17fe+9BC@x2#~5kf!+nGKLtkzX&@{HLLT>;Bnn9h$1hZT z0mkDIiYu!K>1T37g8Q!7Q}>^%)5h~*sl$BgB8n*rTmgRQA&M!y(1CSp_0Hu%^^b5n z2OBI5qYRH>-?p^l_e!qP0I+*lVYcG|0N$+0CMFCQAIn?|;ZlNYq|P zd{j(4u%daK~^G$%z$P+WgDL`b|&Cf#LhF z&kWLnY784rOk`+{-or?d1x2f^I7R+TebZI4X888|3x>RukQ&35&8Z(lw>wcxZBRtu8ajYQ{Fo_mdwKN@w|K1qoD)K)cRfMqCX z;Q^<={`|mj>-zOmbE__yV~vBT8ueZiQ>!9YW;TX5h;w7nVsSH-=8>x>-XQE z47aY_yRf16ks&TMEDQ_`3_reo&wusdKEwB)KZ%M5R#p~mrR`# z1^=j;NHKr@@(rtEULG!n+ozx1*}LGqD%=24EPw&KD4svMb_&dI-+p3XU|?Vn7UpBP zeDMCAL(9LaVi-V*1&oZ0EYPBWiGhKE$<&Yi)BpefAD-F#%Mf0BL5hLDQ2HMO1H&JZ zeLzhB;JsQynhL}4<2h&Eays!6t3ete3ED*?b!nMt-XIFZl@Y0F_9N&=5P_vDBa#ZS z`cpro3#BxQq|lHgFJ%P@5-R0oU2sj?-093+Jll?^ADyAGP28*wd_T@P@Ao|K_kDcN z^S=L_fLL~hfBV%{Q$~peklh57DK7&(DnVtEmN3skvn)!@L3LNLayWx)7%jGZ6 z`%G~1W=2Q8yewzhq;dI25)|g#E?%(E8ThuVy@IQR#(veoIm&3`Xs5i4I+b?w;pdYFZ{~nxz4ETj}Qq_4r3v^kjspVaVW7 z><*q=$8SnV17p$s>0G2g?3~SG=3l?4!P3?URl|hAqgEB4iQy9yl3}#Ci{XV`o_`#i z9UNzeeo_y5+8o_}eNwlm80J?+6-C8_tEeCXbKKk#+=I30uTToXk&q>EbC|(AD4{v z073zXh0Z2Oh!HKt)1B=#B}@twMlgUtih|VP040#yg!YIL+HEU@C5N6UEXSXBu7YR? zG@bgjX@!gH(GzG1)^ial+Ua)gIDF7^3@JGVRhLlgD8=yfKe*oC2}48RoA)j?Jyrx- zf>qq4z;*J@qQjNmV-V#y1SS694NIF)f%KlQ| zDmwC#_f@2n1VlN$;v9yVBQiSEkDk8EP&FfP?xWwEwv~WCSjCYD-Jb6*Jo=)yZdJfD z`P3HHhVH*QkP=dVYzqN@u!>X0^^5s@VeJdvqY&lfvfK=v7K4H8>m`H;?vDHoMbxep z%y2bWe8Sxsfl{j5}y;xq=seb7?cHBBLP-+$2)+tM@8 z7_4B!gQj+uldpYl?<pcWnO+iwUYu*$=jv*Af11YI=3+9}fwhX{mMd00l zre5h|ZYm7+r6)^LcOW^E?k#Rqg}NAdqZgkyHUA;bDjg<%Vvy)U*X|ïv$*s2 z=ewJ8@>suT&ojv7?1&3fX^A|jbJoluk8|PPL@%6HH%v4OS(CCxLRn4^WKF_YCPudu(BL}Lg!!V2u?>J4jG}Em@zw+Ky+N_H51j>aXt~*3Q1-xzV{ss z0BJ2ObufHE9#W!|F&nnouWK8CuiFi4_5RvwE{k(m^GZCNx zFqnJgGN)@c-8QG&^L@6Y+*D_EQK!Sb>X%|1(e!+Rxu+a0ZED(-w5f~g#Wp|QAZv_} k9{;q*!)`nL&&z)U0JV5ks70uVNdN!<07*qoM6N<$f?^i*JOBUy literal 0 HcmV?d00001 diff --git a/Resources/Public/Image/icon_rss.gif b/Resources/Public/Image/icon_rss.gif new file mode 100644 index 0000000000000000000000000000000000000000..7b221f330dd38b239f42881e5b132c8fa14acb9a GIT binary patch literal 652 zcmZ?wbhEHb6krfwc*el+Wun>ZdZXWSt$xk1{4vw=S-tW9pPxT;ntYpL{;AjWU8~8n z68)F0rY|ZDzuY_guGRQ)p5DJ7pI)?@KCLyno2P##QTt(q;j3E1$CZX}y3FpS>O9EO z{W;h1MYG9^CX@Sx2KVyypI7Mr`~K0^Set71e$7g?@nEiWY(4zvg ze;=Q{?{$1PE9Lk4xM$r7zs@cHHrwUL{=R?D&ONDd|Fk&mRj232?bE+64EVJs?m?;R zmu2ZMIzxXga{G0-|L1(yAM;#Z)>;18Qu=vG`n!offA1fBx4QHDm3?0i%=mM2>(`YT z-=|yroMriSlKIDO(`QSI{{R2aKr~SN$pTiZ10q3j!odErfv-SJLR*;CK$gc)Q&Ov- zDM?3BT!WvTlYt{AmszG+C)_eKY{slP%uFmo5{fQ`8w5RrR;>$j+1|*LJg}1{rUgjo>}ie%bChgk4#s2P4E+_`}61O{|zT* z{8x}tJH~Q3FeZd0jAv1znn6>@A(aV^`SJ2DLerZiKJFA#IKXgZjqzN8((Y=Yi42~u KelF{r5}E)<@i{;M literal 0 HcmV?d00001 diff --git a/Resources/Public/Image/icon_sorting_desc.png b/Resources/Public/Image/icon_sorting_desc.png new file mode 100644 index 0000000000000000000000000000000000000000..035de54c9b69dbfa061fbef38a446b64ededaf42 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^>>$j+1|*LJg}1{rUgjo>}j}rzc0V=WNnZShQmWhx4NC>-!r$ z-JGTf9&wn?&}rQ8hUMY$^YMTAyL*1}FG@@*@SMSvVyA3(ory()f#st0ide0>I-r>h Mp00i_>zopr0HpRgIRF3v literal 0 HcmV?d00001 diff --git a/Resources/Public/Image/icon_xls.gif b/Resources/Public/Image/icon_xls.gif new file mode 100644 index 0000000000000000000000000000000000000000..829c8e47bd09efe6dbdda7a3ffb1e3a48b67cebb GIT binary patch literal 1021 zcmZ?wbhEHb6krfw_|Cwl8TfCBcf|BPXC$Ejlo)VP3HaUB1a`Bv~ z;-$&OK*rYW>ZRG$dy8Av7PlO$?pfQ?v$cB4)}ASQTjm^_vh>=Vt=HDxdw%cU`+Lvd zKY#xH`TOthzXQSl@Bc@^Xb8|H1ayE|0GJa57#KJnG5AjrU}SP(=abY4S;26yk(rgt zYem3BCDyKPHI^;~4y8q15=KskBsd?po)niA=?G9{R^gFUPM(u9G025WQmV*LLvmqy zip8<9p@<+%g&t M3wAU#FfdpH0P8#dvH$=8 literal 0 HcmV?d00001 diff --git a/Resources/Public/Image/reportingGraphics.bmml b/Resources/Public/Image/reportingGraphics.bmml new file mode 100644 index 00000000..aae4221e --- /dev/null +++ b/Resources/Public/Image/reportingGraphics.bmml @@ -0,0 +1,52 @@ + + + + + + Form + + + + + 2012/08/23 + + + + + %5B%20%5D%20red%0A%5Bx%5D%20blue%0A%5B%5D%20yellow + + + + + Please%20Choose... + + + + + Submit + + + + + Name + + + + + + + + + + Marketing + + + + + 15658734 + 16 + Google%20Keyword%0ALast%20Page%0AAdwords%0ALanguage + + + + \ No newline at end of file diff --git a/Resources/Public/Image/upload_bg.png b/Resources/Public/Image/upload_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..520c0f7abb44cd719b5106aca24c15ff3b1966ac GIT binary patch literal 1497 zcmV;~1t$85P)K+dFhLS&qF?x;5;gIOD1H{v=m!Y|KcEpK^6~?;z&R8nCho(Md^yp4_VmxD~(EZD#5%g32JN8i?Vgno9C#k(b&H#Wx z5v)G1wq}J2X(>!J&x)v>^IT3&^?qd*Cq0!*sWp#$yOO)o88?lpUa@zwc=54+4RyBJ zhsMuPjS)FC;XeA~XY2Mt&Kk!@>kn#I0D#O2R`8l#VduG8)TeId zNcmi9-J0ALlRM5qtzz)d&NryH)94wIOSe@TmmHV*>MT>jT0(CX&(N7hi#Gs3W+E)_ zf@O-Z!UHKxG|!5Njq_ZIu&xu9(}a=729V=HolJ>=Xh-dNyV?j!&p<0+wI)g}>IAbFCg z7oHO3aU5Z(lrUm8s)&|sx7%DjuQD%pSEFyGtWnZ9wb#MmuO^WgHpm_$4t0B7n%SQH zpWa6kAExqobYvs-U$xu~KHD7X-U`dp$&mp7sR>qp;<&)2Y7MT0O(It@?eKRy7+g4}8rg-^-7bx?X#Uvpo!I;8M6j|(OA@M=%*+v%&0*}} zX+I(?0Ip+7m|BF@mpms5MGH?}QbHSN4^Z=ZIeT#xj6NS2p6y^zSgIO5?P|2*Y1OlI zr^RyOBXsnexCqN{-*zlR1OQ}Kuv}{An_sY8<`+|KeKZpJmKs*1yqaEz8kuKVlrLi` zp}FXOEIXk(XxnJHefSm@_b_tHi{n*b-Q%j5@Fd^ zoG?r6b^s|M02z<4Jpass=GPjubV@co9ZI3*e@u06Qr{KI&ZkFLs?pvqOAU*{uJyHK zHYaw-BRm$_Me9Vf^p~o}&!9PPNr9X>{gawoHrH*>Wlum!`2!WdnTSrBA)6B)(iW2 zD4kDpe09{ig(?;~3^jg2e;zcPE5S;

'))}$.extend($.ui,{datepicker:{version:"1.8.18"}});var PROP_NAME="datepicker",dpuuid=(new Date).getTime(),instActive;$.extend(Datepicker.prototype,{markerClassName:"hasDatepicker",maxRows:4,log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){extendRemove(this._defaults,a||{});return this},_attachDatepicker:function(target,settings){var inlineSettings=null;for(var attrName in this._defaults){var attrValue=target.getAttribute("date:"+attrName);if(attrValue){inlineSettings=inlineSettings||{};try{inlineSettings[attrName]=eval(attrValue)}catch(err){inlineSettings[attrName]=attrValue}}}var nodeName=target.nodeName.toLowerCase(),inline=nodeName=="div"||nodeName=="span";target.id||(this.uuid+=1,target.id="dp"+this.uuid);var inst=this._newInst($(target),inline);inst.settings=$.extend({},settings||{},inlineSettings||{}),nodeName=="input"?this._connectDatepicker(target,inst):inline&&this._inlineDatepicker(target,inst)},_newInst:function(a,b){var c=a[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1");return{id:c,input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:b?bindHover($('
')):this.dpDiv}},_connectDatepicker:function(a,b){var c=$(a);b.append=$([]),b.trigger=$([]);c.hasClass(this.markerClassName)||(this._attachments(c,b),c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(a,c,d){b.settings[c]=d}).bind("getData.datepicker",function(a,c){return this._get(b,c)}),this._autoSize(b),$.data(a,PROP_NAME,b),b.settings.disabled&&this._disableDatepicker(a))},_attachments:function(a,b){var c=this._get(b,"appendText"),d=this._get(b,"isRTL");b.append&&b.append.remove(),c&&(b.append=$(''+c+""),a[d?"before":"after"](b.append)),a.unbind("focus",this._showDatepicker),b.trigger&&b.trigger.remove();var e=this._get(b,"showOn");(e=="focus"||e=="both")&&a.focus(this._showDatepicker);if(e=="button"||e=="both"){var f=this._get(b,"buttonText"),g=this._get(b,"buttonImage");b.trigger=$(this._get(b,"buttonImageOnly")?$("").addClass(this._triggerClass).attr({src:g,alt:f,title:f}):$('').addClass(this._triggerClass).html(g==""?f:$("").attr({src:g,alt:f,title:f}))),a[d?"before":"after"](b.trigger),b.trigger.click(function(){$.datepicker._datepickerShowing&&$.datepicker._lastInput==a[0]?$.datepicker._hideDatepicker():$.datepicker._datepickerShowing&&$.datepicker._lastInput!=a[0]?($.datepicker._hideDatepicker(),$.datepicker._showDatepicker(a[0])):$.datepicker._showDatepicker(a[0]);return!1})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var d=function(a){var b=0,c=0;for(var d=0;db&&(b=a[d].length,c=d);return c};b.setMonth(d(this._get(a,c.match(/MM/)?"monthNames":"monthNamesShort"))),b.setDate(d(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=$(a);c.hasClass(this.markerClassName)||(c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(a,c,d){b.settings[c]=d}).bind("getData.datepicker",function(a,c){return this._get(b,c)}),$.data(a,PROP_NAME,b),this._setDate(b,this._getDefaultDate(b),!0),this._updateDatepicker(b),this._updateAlternate(b),b.settings.disabled&&this._disableDatepicker(a),b.dpDiv.css("display","block"))},_dialogDatepicker:function(a,b,c,d,e){var f=this._dialogInst;if(!f){this.uuid+=1;var g="dp"+this.uuid;this._dialogInput=$(''),this._dialogInput.keydown(this._doKeyDown),$("body").append(this._dialogInput),f=this._dialogInst=this._newInst(this._dialogInput,!1),f.settings={},$.data(this._dialogInput[0],PROP_NAME,f)}extendRemove(f.settings,d||{}),b=b&&b.constructor==Date?this._formatDate(f,b):b,this._dialogInput.val(b),this._pos=e?e.length?e:[e.pageX,e.pageY]:null;if(!this._pos){var h=document.documentElement.clientWidth,i=document.documentElement.clientHeight,j=document.documentElement.scrollLeft||document.body.scrollLeft,k=document.documentElement.scrollTop||document.body.scrollTop;this._pos=[h/2-100+j,i/2-150+k]}this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),f.settings.onSelect=c,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),$.blockUI&&$.blockUI(this.dpDiv),$.data(this._dialogInput[0],PROP_NAME,f);return this},_destroyDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!!b.hasClass(this.markerClassName)){var d=a.nodeName.toLowerCase();$.removeData(a,PROP_NAME),d=="input"?(c.append.remove(),c.trigger.remove(),b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)):(d=="div"||d=="span")&&b.removeClass(this.markerClassName).empty()}},_enableDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!!b.hasClass(this.markerClassName)){var d=a.nodeName.toLowerCase();if(d=="input")a.disabled=!1,c.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""});else if(d=="div"||d=="span"){var e=b.children("."+this._inlineClass);e.children().removeClass("ui-state-disabled"),e.find("select.ui-datepicker-month, select.ui-datepicker-year").removeAttr("disabled")}this._disabledInputs=$.map(this._disabledInputs,function(b){return b==a?null:b})}},_disableDatepicker:function(a){var b=$(a),c=$.data(a,PROP_NAME);if(!!b.hasClass(this.markerClassName)){var d=a.nodeName.toLowerCase();if(d=="input")a.disabled=!0,c.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"});else if(d=="div"||d=="span"){var e=b.children("."+this._inlineClass);e.children().addClass("ui-state-disabled"),e.find("select.ui-datepicker-month, select.ui-datepicker-year").attr("disabled","disabled")}this._disabledInputs=$.map(this._disabledInputs,function(b){return b==a?null:b}),this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return!1;for(var b=0;b-1}},_doKeyUp:function(a){var b=$.datepicker._getInst(a.target);if(b.input.val()!=b.lastVal)try{var c=$.datepicker.parseDate($.datepicker._get(b,"dateFormat"),b.input?b.input.val():null,$.datepicker._getFormatConfig(b));c&&($.datepicker._setDateFromField(b),$.datepicker._updateAlternate(b),$.datepicker._updateDatepicker(b))}catch(a){$.datepicker.log(a)}return!0},_showDatepicker:function(a){a=a.target||a,a.nodeName.toLowerCase()!="input"&&(a=$("input",a.parentNode)[0]);if(!$.datepicker._isDisabledDatepicker(a)&&$.datepicker._lastInput!=a){var b=$.datepicker._getInst(a);$.datepicker._curInst&&$.datepicker._curInst!=b&&($.datepicker._curInst.dpDiv.stop(!0,!0),b&&$.datepicker._datepickerShowing&&$.datepicker._hideDatepicker($.datepicker._curInst.input[0]));var c=$.datepicker._get(b,"beforeShow"),d=c?c.apply(a,[a,b]):{};if(d===!1)return;extendRemove(b.settings,d),b.lastVal=null,$.datepicker._lastInput=a,$.datepicker._setDateFromField(b),$.datepicker._inDialog&&(a.value=""),$.datepicker._pos||($.datepicker._pos=$.datepicker._findPos(a),$.datepicker._pos[1]+=a.offsetHeight);var e=!1;$(a).parents().each(function(){e|=$(this).css("position")=="fixed";return!e}),e&&$.browser.opera&&($.datepicker._pos[0]-=document.documentElement.scrollLeft,$.datepicker._pos[1]-=document.documentElement.scrollTop);var f={left:$.datepicker._pos[0],top:$.datepicker._pos[1]};$.datepicker._pos=null,b.dpDiv.empty(),b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),$.datepicker._updateDatepicker(b),f=$.datepicker._checkOffset(b,f,e),b.dpDiv.css({position:$.datepicker._inDialog&&$.blockUI?"static":e?"fixed":"absolute",display:"none",left:f.left+"px",top:f.top+"px"});if(!b.inline){var g=$.datepicker._get(b,"showAnim"),h=$.datepicker._get(b,"duration"),i=function(){var a=b.dpDiv.find("iframe.ui-datepicker-cover");if(!!a.length){var c=$.datepicker._getBorders(b.dpDiv);a.css({left:-c[0],top:-c[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})}};b.dpDiv.zIndex($(a).zIndex()+1),$.datepicker._datepickerShowing=!0,$.effects&&$.effects[g]?b.dpDiv.show(g,$.datepicker._get(b,"showOptions"),h,i):b.dpDiv[g||"show"](g?h:null,i),(!g||!h)&&i(),b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus(),$.datepicker._curInst=b}}},_updateDatepicker:function(a){var b=this;b.maxRows=4;var c=$.datepicker._getBorders(a.dpDiv);instActive=a,a.dpDiv.empty().append(this._generateHTML(a));var d=a.dpDiv.find("iframe.ui-datepicker-cover");!d.length||d.css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()}),a.dpDiv.find("."+this._dayOverClass+" a").mouseover();var e=this._getNumberOfMonths(a),f=e[1],g=17;a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),f>1&&a.dpDiv.addClass("ui-datepicker-multi-"+f).css("width",g*f+"em"),a.dpDiv[(e[0]!=1||e[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi"),a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),a==$.datepicker._curInst&&$.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var h=a.yearshtml;setTimeout(function(){h===a.yearshtml&&a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml),h=a.yearshtml=null},0)}},_getBorders:function(a){var b=function(a){return{thin:1,medium:2,thick:3}[a]||a};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var d=a.dpDiv.outerWidth(),e=a.dpDiv.outerHeight(),f=a.input?a.input.outerWidth():0,g=a.input?a.input.outerHeight():0,h=document.documentElement.clientWidth+$(document).scrollLeft(),i=document.documentElement.clientHeight+$(document).scrollTop();b.left-=this._get(a,"isRTL")?d-f:0,b.left-=c&&b.left==a.input.offset().left?$(document).scrollLeft():0,b.top-=c&&b.top==a.input.offset().top+g?$(document).scrollTop():0,b.left-=Math.min(b.left,b.left+d>h&&h>d?Math.abs(b.left+d-h):0),b.top-=Math.min(b.top,b.top+e>i&&i>e?Math.abs(e+g):0);return b},_findPos:function(a){var b=this._getInst(a),c=this._get(b,"isRTL");while(a&&(a.type=="hidden"||a.nodeType!=1||$.expr.filters.hidden(a)))a=a[c?"previousSibling":"nextSibling"];var d=$(a).offset();return[d.left,d.top]},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=$.data(a,PROP_NAME))&&this._datepickerShowing){var c=this._get(b,"showAnim"),d=this._get(b,"duration"),e=this,f=function(){$.datepicker._tidyDialog(b),e._curInst=null};$.effects&&$.effects[c]?b.dpDiv.hide(c,$.datepicker._get(b,"showOptions"),d,f):b.dpDiv[c=="slideDown"?"slideUp":c=="fadeIn"?"fadeOut":"hide"](c?d:null,f),c||f(),this._datepickerShowing=!1;var g=this._get(b,"onClose");g&&g.apply(b.input?b.input[0]:null,[b.input?b.input.val():"",b]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),$.blockUI&&($.unblockUI(),$("body").append(this.dpDiv))),this._inDialog=!1}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(a){if(!!$.datepicker._curInst){var b=$(a.target),c=$.datepicker._getInst(b[0]);(b[0].id!=$.datepicker._mainDivId&&b.parents("#"+$.datepicker._mainDivId).length==0&&!b.hasClass($.datepicker.markerClassName)&&!b.closest("."+$.datepicker._triggerClass).length&&$.datepicker._datepickerShowing&&(!$.datepicker._inDialog||!$.blockUI)||b.hasClass($.datepicker.markerClassName)&&$.datepicker._curInst!=c)&&$.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){var d=$(a),e=this._getInst(d[0]);this._isDisabledDatepicker(d[0])||(this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):0),c),this._updateDatepicker(e))},_gotoToday:function(a){var b=$(a),c=this._getInst(b[0]);if(this._get(c,"gotoCurrent")&&c.currentDay)c.selectedDay=c.currentDay,c.drawMonth=c.selectedMonth=c.currentMonth,c.drawYear=c.selectedYear=c.currentYear;else{var d=new Date;c.selectedDay=d.getDate(),c.drawMonth=c.selectedMonth=d.getMonth(),c.drawYear=c.selectedYear=d.getFullYear()}this._notifyChange(c),this._adjustDate(b)},_selectMonthYear:function(a,b,c){var d=$(a),e=this._getInst(d[0]);e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10),this._notifyChange(e),this._adjustDate(d)},_selectDay:function(a,b,c,d){var e=$(a);if(!$(d).hasClass(this._unselectableClass)&&!this._isDisabledDatepicker(e[0])){var f=this._getInst(e[0]);f.selectedDay=f.currentDay=$("a",d).html(),f.selectedMonth=f.currentMonth=b,f.selectedYear=f.currentYear=c,this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){var b=$(a),c=this._getInst(b[0]);this._selectDate(b,"")},_selectDate:function(a,b){var c=$(a),d=this._getInst(c[0]);b=b!=null?b:this._formatDate(d),d.input&&d.input.val(b),this._updateAlternate(d);var e=this._get(d,"onSelect");e?e.apply(d.input?d.input[0]:null,[b,d]):d.input&&d.input.trigger("change"),d.inline?this._updateDatepicker(d):(this._hideDatepicker(),this._lastInput=d.input[0],typeof d.input[0]!="object"&&d.input.focus(),this._lastInput=null)},_updateAlternate:function(a){var b=this._get(a,"altField");if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),d=this._getDate(a),e=this.formatDate(c,d,this._getFormatConfig(a));$(b).each(function(){$(this).val(e)})}},noWeekends:function(a){var b=a.getDay();return[b>0&&b<6,""]},iso8601Week:function(a){var b=new Date(a.getTime());b.setDate(b.getDate()+4-(b.getDay()||7));var c=b.getTime();b.setMonth(0),b.setDate(1);return Math.floor(Math.round((c-b)/864e5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b=="object"?b.toString():b+"";if(b=="")return null;var d=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;d=typeof d!="string"?d:(new Date).getFullYear()%100+parseInt(d,10);var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,g=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,h=(c?c.monthNames:null)||this._defaults.monthNames,i=-1,j=-1,k=-1,l=-1,m=!1,n=function(b){var c=s+1-1){j=1,k=l;for(;;){var u=this._getDaysInMonth(i,j-1);if(k<=u)break;j++,k-=u}}var t=this._daylightSavingAdjust(new Date(i,j-1,k));if(t.getFullYear()!=i||t.getMonth()+1!=j||t.getDate()!=k)throw"Invalid date";return t},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1e7,formatDate:function(a,b,c){if(!b)return"";var d=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,e=(c?c.dayNames:null)||this._defaults.dayNames,f=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,h=function(b){var c=m+112?a.getHours()+2:0);return a},_setDate:function(a,b,c){var d=!b,e=a.selectedMonth,f=a.selectedYear,g=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=g.getDate(),a.drawMonth=a.selectedMonth=a.currentMonth=g.getMonth(),a.drawYear=a.selectedYear=a.currentYear=g.getFullYear(),(e!=a.selectedMonth||f!=a.selectedYear)&&!c&&this._notifyChange(a),this._adjustInstDate(a),a.input&&a.input.val(d?"":this._formatDate(a))},_getDate:function(a){var b=!a.currentYear||a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return b},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),d=this._get(a,"showButtonPanel"),e=this._get(a,"hideIfNoPrevNext"),f=this._get(a,"navigationAsDateFormat"),g=this._getNumberOfMonths(a),h=this._get(a,"showCurrentAtPos"),i=this._get(a,"stepMonths"),j=g[0]!=1||g[1]!=1,k=this._daylightSavingAdjust(a.currentDay?new Date(a.currentYear,a.currentMonth,a.currentDay):new Date(9999,9,9)),l=this._getMinMaxDate(a,"min"),m=this._getMinMaxDate(a,"max"),n=a.drawMonth-h,o=a.drawYear;n<0&&(n+=12,o--);if(m){var p=this._daylightSavingAdjust(new Date(m.getFullYear(),m.getMonth()-g[0]*g[1]+1,m.getDate()));p=l&&pp)n--,n<0&&(n=11,o--)}a.drawMonth=n,a.drawYear=o;var q=this._get(a,"prevText");q=f?this.formatDate(q,this._daylightSavingAdjust(new Date(o,n-i,1)),this._getFormatConfig(a)):q;var r=this._canAdjustMonth(a,-1,o,n)?'
'+q+"":e?"":''+q+"",s=this._get(a,"nextText");s=f?this.formatDate(s,this._daylightSavingAdjust(new Date(o,n+i,1)),this._getFormatConfig(a)):s;var t=this._canAdjustMonth(a,1,o,n)?''+s+"":e?"":''+s+"",u=this._get(a,"currentText"),v=this._get(a,"gotoCurrent")&&a.currentDay?k:b;u=f?this.formatDate(u,v,this._getFormatConfig(a)):u;var w=a.inline?"":'",x=d?'
'+(c?w:"")+(this._isInRange(a,v)?'":"")+(c?"":w)+"
":"",y=parseInt(this._get(a,"firstDay"),10);y=isNaN(y)?0:y;var z=this._get(a,"showWeek"),A=this._get(a,"dayNames"),B=this._get(a,"dayNamesShort"),C=this._get(a,"dayNamesMin"),D=this._get(a,"monthNames"),E=this._get(a,"monthNamesShort"),F=this._get(a,"beforeShowDay"),G=this._get(a,"showOtherMonths"),H=this._get(a,"selectOtherMonths"),I=this._get(a,"calculateWeek")||this.iso8601Week,J=this._getDefaultDate(a),K="";for(var L=0;L1)switch(N){case 0:Q+=" ui-datepicker-group-first",P=" ui-corner-"+(c?"right":"left");break;case g[1]-1:Q+=" ui-datepicker-group-last",P=" ui-corner-"+(c?"left":"right");break;default:Q+=" ui-datepicker-group-middle",P=""}Q+='">'}Q+='
'+(/all|left/.test(P)&&L==0?c?t:r:"")+(/all|right/.test(P)&&L==0?c?r:t:"")+this._generateMonthYearHeader(a,n,o,l,m,L>0||N>0,D,E)+'
'+"";var R=z?'":"";for(var S=0;S<7;S++){var T=(S+y)%7;R+="=5?' class="ui-datepicker-week-end"':"")+">"+''+C[T]+""}Q+=R+"";var U=this._getDaysInMonth(o,n);o==a.selectedYear&&n==a.selectedMonth&&(a.selectedDay=Math.min(a.selectedDay,U));var V=(this._getFirstDayOfMonth(o,n)-y+7)%7,W=Math.ceil((V+U)/7),X=j?this.maxRows>W?this.maxRows:W:W;this.maxRows=X;var Y=this._daylightSavingAdjust(new Date(o,n,1-V));for(var Z=0;Z";var _=z?'":"";for(var S=0;S<7;S++){var ba=F?F.apply(a.input?a.input[0]:null,[Y]):[!0,""],bb=Y.getMonth()!=n,bc=bb&&!H||!ba[0]||l&&Ym;_+='",Y.setDate(Y.getDate()+1),Y=this._daylightSavingAdjust(Y)}Q+=_+""}n++,n>11&&(n=0,o++),Q+="
'+this._get(a,"weekHeader")+"
'+this._get(a,"calculateWeek")(Y)+""+(bb&&!G?" ":bc?''+Y.getDate()+"":''+Y.getDate()+"")+"
"+(j?""+(g[0]>0&&N==g[1]-1?'
':""):""),M+=Q}K+=M}K+=x+($.browser.msie&&parseInt($.browser.version,10)<7&&!a.inline?'':""), +a._keyEvent=!1;return K},_generateMonthYearHeader:function(a,b,c,d,e,f,g,h){var i=this._get(a,"changeMonth"),j=this._get(a,"changeYear"),k=this._get(a,"showMonthAfterYear"),l='
',m="";if(f||!i)m+=''+g[b]+"";else{var n=d&&d.getFullYear()==c,o=e&&e.getFullYear()==c;m+='"}k||(l+=m+(f||!i||!j?" ":""));if(!a.yearshtml){a.yearshtml="";if(f||!j)l+=''+c+"";else{var q=this._get(a,"yearRange").split(":"),r=(new Date).getFullYear(),s=function(a){var b=a.match(/c[+-].*/)?c+parseInt(a.substring(1),10):a.match(/[+-].*/)?r+parseInt(a,10):parseInt(a,10);return isNaN(b)?r:b},t=s(q[0]),u=Math.max(t,s(q[1]||""));t=d?Math.max(t,d.getFullYear()):t,u=e?Math.min(u,e.getFullYear()):u,a.yearshtml+='",l+=a.yearshtml,a.yearshtml=null}}l+=this._get(a,"yearSuffix"),k&&(l+=(f||!i||!j?" ":"")+m),l+="
";return l},_adjustInstDate:function(a,b,c){var d=a.drawYear+(c=="Y"?b:0),e=a.drawMonth+(c=="M"?b:0),f=Math.min(a.selectedDay,this._getDaysInMonth(d,e))+(c=="D"?b:0),g=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(d,e,f)));a.selectedDay=g.getDate(),a.drawMonth=a.selectedMonth=g.getMonth(),a.drawYear=a.selectedYear=g.getFullYear(),(c=="M"||c=="Y")&&this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min"),d=this._getMinMaxDate(a,"max"),e=c&&bd?d:e;return e},_notifyChange:function(a){var b=this._get(a,"onChangeMonthYear");b&&b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){var b=this._get(a,"numberOfMonths");return b==null?[1,1]:typeof b=="number"?[1,b]:b},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-this._daylightSavingAdjust(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,d){var e=this._getNumberOfMonths(a),f=this._daylightSavingAdjust(new Date(c,d+(b<0?b:e[0]*e[1]),1));b<0&&f.setDate(this._getDaysInMonth(f.getFullYear(),f.getMonth()));return this._isInRange(a,f)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min"),d=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!d||b.getTime()<=d.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a,"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,d){b||(a.currentDay=a.selectedDay,a.currentMonth=a.selectedMonth,a.currentYear=a.selectedYear);var e=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(d,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),e,this._getFormatConfig(a))}}),$.fn.datepicker=function(a){if(!this.length)return this;$.datepicker.initialized||($(document).mousedown($.datepicker._checkExternalClick).find("body").append($.datepicker.dpDiv),$.datepicker.initialized=!0);var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return $.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return $.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this[0]].concat(b));return this.each(function(){typeof a=="string"?$.datepicker["_"+a+"Datepicker"].apply($.datepicker,[this].concat(b)):$.datepicker._attachDatepicker(this,a)})},$.datepicker=new Datepicker,$.datepicker.initialized=!1,$.datepicker.uuid=(new Date).getTime(),$.datepicker.version="1.8.18",window["DP_jQuery_"+dpuuid]=$})(jQuery) \ No newline at end of file diff --git a/Resources/Public/Js/jquery.validationEngine-en.js b/Resources/Public/Js/jquery.validationEngine-en.js new file mode 100644 index 00000000..86858648 --- /dev/null +++ b/Resources/Public/Js/jquery.validationEngine-en.js @@ -0,0 +1,188 @@ +/** + * This file is modified for powermail localization + */ +(function($){ + $.fn.validationEngineLanguage = function(){ + }; + $.validationEngineLanguage = { + newLang: function(){ + $.validationEngineLanguage.allRules = { + "required": { // Add your regex rules here, you can take telephone as an example + "regex": "none", +// "alertText": "* This field is required", + "alertText": JsValidationCheckRequired, +// "alertTextCheckboxMultiple": "* Please select an option", + "alertTextCheckboxMultiple": JsValidationCheckRequiredOption, + "alertTextCheckboxe": "* This checkbox is required", + "alertTextDateRange": "* Both date range fields are required" + }, + "dateRange": { + "regex": "none", + "alertText": "* Invalid ", + "alertText2": "Date Range" + }, + "dateTimeRange": { + "regex": "none", + "alertText": "* Invalid ", + "alertText2": "Date Time Range" + }, + "minSize": { + "regex": "none", + "alertText": "* Minimum ", + "alertText2": " characters allowed" + }, + "maxSize": { + "regex": "none", + "alertText": "* Maximum ", + "alertText2": " characters allowed" + }, + "groupRequired": { + "regex": "none", + "alertText": "* You must fill one of the following fields" + }, + "min": { + "regex": "none", + "alertText": "* Minimum value is " + }, + "max": { + "regex": "none", + "alertText": "* Maximum value is " + }, + "past": { + "regex": "none", + "alertText": "* Date prior to " + }, + "future": { + "regex": "none", + "alertText": "* Date past " + }, + "maxCheckbox": { + "regex": "none", + "alertText": "* Maximum ", + "alertText2": " options allowed" + }, + "minCheckbox": { + "regex": "none", + "alertText": "* Please select ", + "alertText2": " options" + }, + "equals": { + "regex": "none", + "alertText": "* Fields do not match" + }, + "creditCard": { + "regex": "none", + "alertText": "* Invalid credit card number" + }, + "phone": { + // credit: jquery.h5validate.js / orefalo + "regex": /^([\+][0-9]{1,3}[ \.\-])?([\(]{1}[0-9]{2,6}[\)])?([0-9 \.\-\/]{3,20})((x|ext|extension)[ ]?[0-9]{1,4})?$/, +// "alertText": "* Invalid phone number" + "alertText": JsValidationCheckPhone + }, + "email": { + // Shamelessly lifted from Scott Gonzalez via the Bassistance Validation plugin http://projects.scottsplayground.com/email_address_validation/ + "regex": /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i, +// "alertText": "* Invalid email address" + "alertText": JsValidationCheckEmail + }, + "integer": { + "regex": /^[\-\+]?\d+$/, +// "alertText": "* Not a valid integer" + "alertText": JsValidationCheckInteger + }, + "number": { + // Number, including positive, negative, and floating decimal. credit: orefalo + "regex": /^[\-\+]?(([0-9]+)([\.,]([0-9]+))?|([\.,]([0-9]+))?)$/, + "alertText": "* Invalid floating decimal number" + }, + "date": { + "regex": /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/, + "alertText": "* Invalid date, must be in YYYY-MM-DD format" + }, + "ipv4": { + "regex": /^((([01]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))[.]){3}(([0-1]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))$/, + "alertText": "* Invalid IP address" + }, + "url": { + "regex": /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i, +// "alertText": "* Invalid URL" + "alertText": JsValidationCheckUrl + }, + "onlyNumberSp": { + "regex": /^[0-9\ ]+$/, + "alertText": "* Numbers only" + }, + "onlyLetterSp": { + "regex": /^[a-zA-Z\ \']+$/, +// "alertText": "* Letters only" + "alertText": JsValidationCheckLetters + }, + "onlyLetterNumber": { + "regex": /^[0-9a-zA-Z]+$/, + "alertText": "* No special characters allowed" + }, + // --- CUSTOM RULES -- Those are specific to the demos, they can be removed or changed to your likings + "ajaxUserCall": { + "url": "ajaxValidateFieldUser", + // you may want to pass extra data on the ajax call + "extraData": "name=eric", + "alertText": "* This user is already taken", + "alertTextLoad": "* Validating, please wait" + }, + "ajaxUserCallPhp": { + "url": "phpajax/ajaxValidateFieldUser.php", + // you may want to pass extra data on the ajax call + "extraData": "name=eric", + // if you provide an "alertTextOk", it will show as a green prompt when the field validates + "alertTextOk": "* This username is available", + "alertText": "* This user is already taken", + "alertTextLoad": "* Validating, please wait" + }, + "ajaxNameCall": { + // remote json service location + "url": "ajaxValidateFieldName", + // error + "alertText": "* This name is already taken", + // if you provide an "alertTextOk", it will show as a green prompt when the field validates + "alertTextOk": "* This name is available", + // speaks by itself + "alertTextLoad": "* Validating, please wait" + }, + "ajaxNameCallPhp": { + // remote json service location + "url": "phpajax/ajaxValidateFieldName.php", + // error + "alertText": "* This name is already taken", + // speaks by itself + "alertTextLoad": "* Validating, please wait" + }, + "validate2fields": { + "alertText": "* Please input HELLO" + }, + //tls warning:homegrown not fielded + "dateFormat":{ + "regex": /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$|^(?:(?:(?:0?[13578]|1[02])(\/|-)31)|(?:(?:0?[1,3-9]|1[0-2])(\/|-)(?:29|30)))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^(?:(?:0?[1-9]|1[0-2])(\/|-)(?:0?[1-9]|1\d|2[0-8]))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^(0?2(\/|-)29)(\/|-)(?:(?:0[48]00|[13579][26]00|[2468][048]00)|(?:\d\d)?(?:0[48]|[2468][048]|[13579][26]))$/, + "alertText": "* Invalid Date" + }, + //tls warning:homegrown not fielded + "dateTimeFormat": { + "regex": /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])\s+(1[012]|0?[1-9]){1}:(0?[1-5]|[0-6][0-9]){1}:(0?[0-6]|[0-6][0-9]){1}\s+(am|pm|AM|PM){1}$|^(?:(?:(?:0?[13578]|1[02])(\/|-)31)|(?:(?:0?[1,3-9]|1[0-2])(\/|-)(?:29|30)))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^((1[012]|0?[1-9]){1}\/(0?[1-9]|[12][0-9]|3[01]){1}\/\d{2,4}\s+(1[012]|0?[1-9]){1}:(0?[1-5]|[0-6][0-9]){1}:(0?[0-6]|[0-6][0-9]){1}\s+(am|pm|AM|PM){1})$/, + "alertText": "* Invalid Date or Date Format", + "alertText2": "Expected Format: ", + "alertText3": "mm/dd/yyyy hh:mm:ss AM|PM or ", + "alertText4": "yyyy-mm-dd hh:mm:ss AM|PM" + }, + /* powermail new */ + "checkCheckboxes": { + "alertText": JsValidationCheckCheckboxes + } + /* powermail new end */ + }; + + } + }; + + $.validationEngineLanguage.newLang(); + +})(jQuery); \ No newline at end of file diff --git a/Resources/Public/Js/jquery.validationEngine.js b/Resources/Public/Js/jquery.validationEngine.js new file mode 100644 index 00000000..9ba9f838 --- /dev/null +++ b/Resources/Public/Js/jquery.validationEngine.js @@ -0,0 +1,1721 @@ +/* + * Inline Form Validation Engine 2.5.1, jQuery plugin + * + * Copyright(c) 2010, Cedric Dugas + * http://www.position-absolute.com + * + * 2.0 Rewrite by Olivier Refalo + * http://www.crionics.com + * + * Form validation engine allowing custom regex rules to be added. + * Licensed under the MIT License + */ + (function($) { + + "use strict"; + + var methods = { + + /** + * Kind of the constructor, called before any action + * @param {Map} user options + */ + init: function(options) { + var form = this; + if (!form.data('jqv') || form.data('jqv') == null ) { + options = methods._saveOptions(form, options); + // bind all formError elements to close on click + $(".formError").live("click", function() { + $(this).fadeOut(150, function() { + // remove prompt once invisible + $(this).parent('.formErrorOuter').remove(); + $(this).remove(); + }); + }); + + } + return this; + }, + /** + * Attachs jQuery.validationEngine to form.submit and field.blur events + * Takes an optional params: a list of options + * ie. jQuery("#formID1").validationEngine('attach', {promptPosition : "centerRight"}); + */ + attach: function(userOptions) { + + var form = this; + var options; + + if(userOptions) + options = methods._saveOptions(form, userOptions); + else + options = form.data('jqv'); + + options.validateAttribute = (form.find("[data-validation-engine*=validate]").length) ? "data-validation-engine" : "class"; + if (options.binded) { + + // bind fields + form.find("["+options.validateAttribute+"*=validate]").not("[type=checkbox]").not("[type=radio]").not(".datepicker").bind(options.validationEventTrigger, methods._onFieldEvent); + form.find("["+options.validateAttribute+"*=validate][type=checkbox],["+options.validateAttribute+"*=validate][type=radio]").bind("click", methods._onFieldEvent); + form.find("["+options.validateAttribute+"*=validate][class*=datepicker]").bind(options.validationEventTrigger,{"delay": 300}, methods._onFieldEvent); + } + if (options.autoPositionUpdate) { + $(window).bind("resize", { + "noAnimation": true, + "formElem": form + }, methods.updatePromptsPosition); + } + // bind form.submit + form.bind("submit", methods._onSubmitEvent); + return this; + }, + /** + * Unregisters any bindings that may point to jQuery.validaitonEngine + */ + detach: function() { + var form = this; + var options = form.data('jqv'); + + // unbind fields + form.find("["+options.validateAttribute+"*=validate]").not("[type=checkbox]").unbind(options.validationEventTrigger, methods._onFieldEvent); + form.find("["+options.validateAttribute+"*=validate][type=checkbox],[class*=validate][type=radio]").unbind("click", methods._onFieldEvent); + + // unbind form.submit + form.unbind("submit", methods.onAjaxFormComplete); + + // unbind live fields (kill) + form.find("["+options.validateAttribute+"*=validate]").not("[type=checkbox]").die(options.validationEventTrigger, methods._onFieldEvent); + form.find("["+options.validateAttribute+"*=validate][type=checkbox]").die("click", methods._onFieldEvent); + + // unbind form.submit + form.die("submit", methods.onAjaxFormComplete); + form.removeData('jqv'); + + if (options.autoPositionUpdate) { + $(window).unbind("resize", methods.updatePromptsPosition) + } + + return this; + }, + /** + * Validates the form fields, shows prompts accordingly. + * Note: There is no ajax form validation with this method, only field ajax validation are evaluated + * + * @return true if the form validates, false if it fails + */ + validate: function() { + return methods._validateFields(this); + }, + /** + * Validates one field, shows prompt accordingly. + * Note: There is no ajax form validation with this method, only field ajax validation are evaluated + * + * @return true if the form validates, false if it fails + */ + validateField: function(el) { + var options = $(this).data('jqv'); + var r = methods._validateField($(el), options); + + if (options.onSuccess && options.InvalidFields.length == 0) + options.onSuccess(); + else if (options.onFailure && options.InvalidFields.length > 0) + options.onFailure(); + + return r; + }, + /** + * Validates the form fields, shows prompts accordingly. + * Note: this methods performs fields and form ajax validations(if setup) + * + * @return true if the form validates, false if it fails, undefined if ajax is used for form validation + */ + validateform: function() { + return methods._onSubmitEvent.call(this); + }, + /** + * Redraw prompts position, useful when you change the DOM state when validating + */ + updatePromptsPosition: function(event) { + + if (event && this == window) { + var form = event.data.formElem; + var noAnimation = event.data.noAnimation; + } + else + var form = $(this.closest('form')); + + var options = form.data('jqv'); + // No option, take default one + form.find('['+options.validateAttribute+'*=validate]').not(':hidden').not(":disabled").each(function(){ + var field = $(this); + var prompt = methods._getPrompt(field); + var promptText = $(prompt).find(".formErrorContent").html(); + + if(prompt) + methods._updatePrompt(field, $(prompt), promptText, undefined, false, options, noAnimation); + }); + return this; + }, + /** + * Displays a prompt on a element. + * Note that the element needs an id! + * + * @param {String} promptText html text to display type + * @param {String} type the type of bubble: 'pass' (green), 'load' (black) anything else (red) + * @param {String} possible values topLeft, topRight, bottomLeft, centerRight, bottomRight + */ + showPrompt: function(promptText, type, promptPosition, showArrow) { + + var form = this.closest('form'); + var options = form.data('jqv'); + // No option, take default one + if(!options) options = methods._saveOptions(this, options); + if(promptPosition) + options.promptPosition=promptPosition; + options.showArrow = showArrow==true; + + methods._showPrompt(this, promptText, type, false, options); + return this; + }, + /** + * Closes all error prompts on the page + */ + hidePrompt: function() { + var form = this; + var options = form.data('jqv'); + var promptClass = "."+ methods._getClassName($(this).attr("id")) + "formError"; + $(promptClass).fadeTo(options.fadeDuration, 0.3, function() { + $(this).parent('.formErrorOuter').remove(); + $(this).remove(); + }); + return this; + }, + /** + * Closes form error prompts, CAN be invidual + */ + hide: function() { + var form = this; + var options = form.data('jqv'); + var closingtag; + if($(this).is("form")){ + closingtag = "parentForm"+methods._getClassName($(this).attr("id")); + }else{ + closingtag = methods._getClassName($(this).attr("id")) +"formError"; + } + $('.'+closingtag).fadeTo(options.fadeDuration, 0.3, function() { + $(this).parent('.formErrorOuter').remove(); + $(this).remove(); + }); + return this; + }, + /** + * Closes all error prompts on the page + */ + hideAll: function() { + var form = this; + var options = form.data('jqv'); + $('.formError').fadeTo(options.fadeDuration, 0.3, function() { + $(this).parent('.formErrorOuter').remove(); + $(this).remove(); + }); + return this; + }, + /** + * Typically called when user exists a field using tab or a mouse click, triggers a field + * validation + */ + _onFieldEvent: function(event) { + var field = $(this); + var form = field.closest('form'); + var options = form.data('jqv'); + // validate the current field + window.setTimeout(function() { + methods._validateField(field, options); + if (options.InvalidFields.length == 0 && options.onSuccess) { + options.onSuccess(); + } else if (options.InvalidFields.length > 0 && options.onFailure) { + options.onFailure(); + } + }, (event.data) ? event.data.delay : 0); + + }, + /** + * Called when the form is submited, shows prompts accordingly + * + * @param {jqObject} + * form + * @return false if form submission needs to be cancelled + */ + _onSubmitEvent: function() { + var form = $(this); + var options = form.data('jqv'); + + // validate each field + // (- skip field ajax validation, not necessary IF we will perform an ajax form validation) + var r=methods._validateFields(form, options.ajaxFormValidation); + + if (r && options.ajaxFormValidation) { + methods._validateFormWithAjax(form, options); + return false; + } + + if(options.onValidationComplete) { + options.onValidationComplete(form, r); + return false; + } + return r; + }, + /** + * Return true if the ajax field validations passed so far + * @param {Object} options + * @return true, is all ajax validation passed so far (remember ajax is async) + */ + _checkAjaxStatus: function(options) { + var status = true; + $.each(options.ajaxValidCache, function(key, value) { + if (!value) { + status = false; + // break the each + return false; + } + }); + return status; + }, + /** + * Validates form fields, shows prompts accordingly + * + * @param {jqObject} + * form + * @param {skipAjaxFieldValidation} + * boolean - when set to true, ajax field validation is skipped, typically used when the submit button is clicked + * + * @return true if form is valid, false if not, undefined if ajax form validation is done + */ + _validateFields: function(form, skipAjaxValidation) { + var options = form.data('jqv'); + + // this variable is set to true if an error is found + var errorFound = false; + + // Trigger hook, start validation + form.trigger("jqv.form.validating"); + // first, evaluate status of non ajax fields + var first_err=null; + form.find('['+options.validateAttribute+'*=validate]').not(':hidden').not(":disabled").each( function() { + var field = $(this); + var names = []; + if ($.inArray(field.attr('name'), names) < 0) { + errorFound |= methods._validateField(field, options, skipAjaxValidation); + if (options.doNotShowAllErrosOnSubmit) + return false; + if (errorFound && first_err==null) { + first_err=field; + } + names.push(field.attr('name')); + } + }); + + // second, check to see if all ajax calls completed ok + // errorFound |= !methods._checkAjaxStatus(options); + + // third, check status and scroll the container accordingly + form.trigger("jqv.form.result", [errorFound]); + + if (errorFound) { + if (options.scroll) { + var destination=first_err.offset().top; + var fixleft = first_err.offset().left; + + //prompt positioning adjustment support. Usage: positionType:Xshift,Yshift (for ex.: bottomLeft:+20 or bottomLeft:-20,+10) + var positionType=options.promptPosition; + if (typeof(positionType)=='string' && positionType.indexOf(":")!=-1) + positionType=positionType.substring(0,positionType.indexOf(":")); + + if (positionType!="bottomRight" && positionType!="bottomLeft") { + var prompt_err= methods._getPrompt(first_err); + destination=prompt_err.offset().top; + } + + // get the position of the first error, there should be at least one, no need to check this + //var destination = form.find(".formError:not('.greenPopup'):first").offset().top; + if (options.isOverflown) { + var overflowDIV = $(options.overflownDIV); + if(!overflowDIV.length) return false; + var scrollContainerScroll = overflowDIV.scrollTop(); + var scrollContainerPos = -parseInt(overflowDIV.offset().top); + + destination += scrollContainerScroll + scrollContainerPos - 5; + var scrollContainer = $(options.overflownDIV + ":not(:animated)"); + + scrollContainer.animate({ scrollTop: destination }, 1100, function(){ + if(options.focusFirstField) first_err.focus(); + }); + } else { + $("html:not(:animated),body:not(:animated)").animate({ + scrollTop: destination, + scrollLeft: fixleft + }, 1100, function(){ + if(options.focusFirstField) first_err.focus(); + }); + } + + } else if(options.focusFirstField) + first_err.focus(); + return false; + } + return true; + }, + /** + * This method is called to perform an ajax form validation. + * During this process all the (field, value) pairs are sent to the server which returns a list of invalid fields or true + * + * @param {jqObject} form + * @param {Map} options + */ + _validateFormWithAjax: function(form, options) { + + var data = form.serialize(); + var url = (options.ajaxFormValidationURL) ? options.ajaxFormValidationURL : form.attr("action"); + $.ajax({ + type: "GET", + url: url, + cache: false, + dataType: "json", + data: data, + form: form, + methods: methods, + options: options, + beforeSend: function() { + return options.onBeforeAjaxFormValidation(form, options); + }, + error: function(data, transport) { + methods._ajaxError(data, transport); + }, + success: function(json) { + if (json !== true) { + // getting to this case doesn't necessary means that the form is invalid + // the server may return green or closing prompt actions + // this flag helps figuring it out + var errorInForm=false; + for (var i = 0; i < json.length; i++) { + var value = json[i]; + + var errorFieldId = value[0]; + var errorField = $($("#" + errorFieldId)[0]); + + // make sure we found the element + if (errorField.length == 1) { + + // promptText or selector + var msg = value[2]; + // if the field is valid + if (value[1] == true) { + + if (msg == "" || !msg){ + // if for some reason, status==true and error="", just close the prompt + methods._closePrompt(errorField); + } else { + // the field is valid, but we are displaying a green prompt + if (options.allrules[msg]) { + var txt = options.allrules[msg].alertTextOk; + if (txt) + msg = txt; + } + methods._showPrompt(errorField, msg, "pass", false, options, true); + } + } else { + // the field is invalid, show the red error prompt + errorInForm|=true; + if (options.allrules[msg]) { + var txt = options.allrules[msg].alertText; + if (txt) + msg = txt; + } + methods._showPrompt(errorField, msg, "", false, options, true); + } + } + } + options.onAjaxFormComplete(!errorInForm, form, json, options); + } else + options.onAjaxFormComplete(true, form, "", options); + } + }); + + }, + /** + * Validates field, shows prompts accordingly + * + * @param {jqObject} + * field + * @param {Array[String]} + * field's validation rules + * @param {Map} + * user options + * @return true if field is valid + */ + _validateField: function(field, options, skipAjaxValidation) { + if (!field.attr("id")) + $.error("jQueryValidate: an ID attribute is required for this field: " + field.attr("name") + " class:" + + field.attr("class")); + + var rulesParsing = field.attr(options.validateAttribute); + var getRules = /validate\[(.*)\]/.exec(rulesParsing); + + if (!getRules) + return false; + var str = getRules[1]; + var rules = str.split(/\[|,|\]/); + + // true if we ran the ajax validation, tells the logic to stop messing with prompts + var isAjaxValidator = false; + var fieldName = field.attr("name"); + var promptText = ""; + var required = false; + options.isError = false; + options.showArrow = true; + + var form = $(field.closest("form")); + + for (var i = 0; i < rules.length; i++) { + // Fix for adding spaces in the rules + rules[i] = rules[i].replace(" ", "") + var errorMsg = undefined; + switch (rules[i]) { + + case "required": + required = true; + errorMsg = methods._required(field, rules, i, options); + break; + case "custom": + errorMsg = methods._customRegex(field, rules, i, options); + break; + case "groupRequired": + // Check is its the first of group, if not, reload validation with first field + // AND continue normal validation on present field + var classGroup = "["+options.validateAttribute+"*=" +rules[i + 1] +"]"; + var firstOfGroup = form.find(classGroup).eq(0); + if(firstOfGroup[0] != field[0]){ + methods._validateField(firstOfGroup, options, skipAjaxValidation) + options.showArrow = true; + continue; + }; + errorMsg = methods._groupRequired(field, rules, i, options); + if(errorMsg) required = true; + options.showArrow = false; + break; + case "ajax": + // ajax has its own prompts handling technique + if(!skipAjaxValidation){ + methods._ajax(field, rules, i, options); + isAjaxValidator = true; + } + break; + case "minSize": + errorMsg = methods._minSize(field, rules, i, options); + break; + case "maxSize": + errorMsg = methods._maxSize(field, rules, i, options); + break; + case "min": + errorMsg = methods._min(field, rules, i, options); + break; + case "max": + errorMsg = methods._max(field, rules, i, options); + break; + case "past": + errorMsg = methods._past(field, rules, i, options); + break; + case "future": + errorMsg = methods._future(field, rules, i, options); + break; + case "dateRange": + var classGroup = "["+options.validateAttribute+"*=" + rules[i + 1] + "]"; + var firstOfGroup = form.find(classGroup).eq(0); + var secondOfGroup = form.find(classGroup).eq(1); + + //if one entry out of the pair has value then proceed to run through validation + if (firstOfGroup[0].value || secondOfGroup[0].value) { + errorMsg = methods._dateRange(firstOfGroup, secondOfGroup, rules, i, options); + } + if (errorMsg) required = true; + options.showArrow = false; + break; + + case "dateTimeRange": + var classGroup = "["+options.validateAttribute+"*=" + rules[i + 1] + "]"; + var firstOfGroup = form.find(classGroup).eq(0); + var secondOfGroup = form.find(classGroup).eq(1); + + //if one entry out of the pair has value then proceed to run through validation + if (firstOfGroup[0].value || secondOfGroup[0].value) { + errorMsg = methods._dateTimeRange(firstOfGroup, secondOfGroup, rules, i, options); + } + if (errorMsg) required = true; + options.showArrow = false; + break; + case "maxCheckbox": + errorMsg = methods._maxCheckbox(form, field, rules, i, options); + field = $(form.find("input[name='" + fieldName + "']")); + break; + case "minCheckbox": + errorMsg = methods._minCheckbox(form, field, rules, i, options); + field = $(form.find("input[name='" + fieldName + "']")); + break; + case "equals": + errorMsg = methods._equals(field, rules, i, options); + break; + case "funcCall": + errorMsg = methods._funcCall(field, rules, i, options); + break; + case "creditCard": + errorMsg = methods._creditCard(field, rules, i, options); + break; + + default: + //$.error("jQueryValidator rule not found"+rules[i]); + } + if (errorMsg !== undefined) { + promptText += errorMsg + "
"; + options.isError = true; + } + } + // If the rules required is not added, an empty field is not validated + if(!required && field.val() == "") options.isError = false; + + // Hack for radio/checkbox group button, the validation go into the + // first radio/checkbox of the group + var fieldType = field.prop("type"); + + if ((fieldType == "radio" || fieldType == "checkbox") && form.find("input[name='" + fieldName + "']").size() > 1) { + field = $(form.find("input[name='" + fieldName + "'][type!=hidden]:first")); + options.showArrow = false; + } + + if (fieldType == "text" && form.find("input[name='" + fieldName + "']").size() > 1) { + field = $(form.find("input[name='" + fieldName + "'][type!=hidden]:first")); + options.showArrow = false; + } + + if (options.isError){ + methods._showPrompt(field, promptText, "", false, options); + }else{ + if (!isAjaxValidator) methods._closePrompt(field); + } + + if (!isAjaxValidator) { + field.trigger("jqv.field.result", [field, options.isError, promptText]); + } + + /* Record error */ + var errindex = $.inArray(field[0], options.InvalidFields); + if (errindex == -1) { + if (options.isError) + options.InvalidFields.push(field[0]); + } else if (!options.isError) { + options.InvalidFields.splice(errindex, 1); + } + + return options.isError; + }, + /** + * Required validation + * + * @param {jqObject} field + * @param {Array[String]} rules + * @param {int} i rules index + * @param {Map} + * user options + * @return an error string if validation failed + */ + _required: function(field, rules, i, options) { + switch (field.prop("type")) { + case "text": + case "password": + case "textarea": + case "file": + default: + if (!($.trim(field.val()))) + return options.allrules[rules[i]].alertText; + break; + case "radio": + case "checkbox": + var form = field.closest("form"); + var name = field.attr("name"); + if (form.find("input[name='" + name + "']:checked").size() == 0) { + if (form.find("input[name='" + name + "']").size() == 1) + return options.allrules[rules[i]].alertTextCheckboxe; + else + return options.allrules[rules[i]].alertTextCheckboxMultiple; + } + break; + // required for