Added feature #13868: Integrate TYPO3 donate notice in the backend
authorOliver Hader <oliver.hader@typo3.org>
Sat, 22 May 2010 16:03:00 +0000 (16:03 +0000)
committerOliver Hader <oliver.hader@typo3.org>
Sat, 22 May 2010 16:03:00 +0000 (16:03 +0000)
git-svn-id: https://svn.typo3.org/TYPO3v4/Core/trunk@7661 709f56b5-9817-0410-a4d7-c38de5d9e867

ChangeLog
NEWS.txt
t3lib/class.t3lib_beuserauth.php
t3lib/config_default.php
typo3/backend.php
typo3/classes/class.donatewindow.php [new file with mode: 0644]
typo3/js/donate.js [new file with mode: 0644]
typo3/sysext/lang/locallang_core.xml
typo3/sysext/t3skin/extjs/xtheme-t3skin.css
typo3/sysext/t3skin/images/general/donate_teaser.png [new file with mode: 0644]

index d4c1263..f8a9f73 100755 (executable)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2010-05-22  Oliver Hader  <oliver@typo3.org>
+
+       * Added feature #13868: Integrate TYPO3 donate notice in the backend
+
 2010-05-21  Benjamin Mack  <benni@typo3.org>
 
        * Fixed bug #12923: Javascript error in tmenu_layers.php & gmenu_layers.php (Thanks to Klaus Goessl)
 2010-05-21  Benjamin Mack  <benni@typo3.org>
 
        * Fixed bug #12923: Javascript error in tmenu_layers.php & gmenu_layers.php (Thanks to Klaus Goessl)
index fbd78e1..4da2a3b 100644 (file)
--- a/NEWS.txt
+++ b/NEWS.txt
@@ -45,6 +45,9 @@ Backend
 
        * The t3editor code completion DB was updated to reflect the latest additions. Also the syntax highlighting engine was now extracted from the system extension so it can be used in other places of the TYPO3 Core as well.
 
 
        * The t3editor code completion DB was updated to reflect the latest additions. Also the syntax highlighting engine was now extracted from the system extension so it can be used in other places of the TYPO3 Core as well.
 
+       * A donate notice will be shown to admins in the TYPO3 backend after using it for more than three months.
+         This behaviour can be disabled completely - see $TYPO3_CONF_VARS[BE][allowDonateWindow].
+
 
 Frontend
 ========
 
 Frontend
 ========
index 4a693f1..f8d271b 100644 (file)
@@ -281,6 +281,11 @@ class t3lib_beUserAuth extends t3lib_userAuthGroup {
                        $this->uc['lang']=$this->user['lang'];
                        $U=1;
                }
                        $this->uc['lang']=$this->user['lang'];
                        $U=1;
                }
+                       // Setting the time of the first login:
+               if (!isset($this->uc['firstLoginTimeStamp'])) {
+                       $this->uc['firstLoginTimeStamp'] = $GLOBALS['EXEC_TIME'];
+                       $U = TRUE;
+               }
 
                        // Saving if updated.
                if ($U) {
 
                        // Saving if updated.
                if ($U) {
index ee4f37b..43f59ec 100644 (file)
@@ -260,6 +260,7 @@ $TYPO3_CONF_VARS = array(
                'elementVersioningOnly' => FALSE,               // If true, only element versioning is allowed in the backend. This is recommended for new installations of TYPO3 4.2+ since "page" and "branch" versioning types are known for the drawbacks of loosing ids and "element" type versions supports moving now.
                'versionNumberInFilename' => FALSE, // Boolean. If true, included CSS and JS files will have the timestamp embedded in the filename, ie. filename.1269312081.js. This will make browsers and proxies reload the files if they change (thus avoiding caching issues). IMPORTANT: this feature requires this .htaccess rule to work: RewriteCond %{REQUEST_FILENAME} !-f - RewriteCond %{REQUEST_FILENAME} !-d - RewriteRule ^(.+)\.(\d+)\.(php|js|css|png|jpg|gif|gzip)$ $1.$3 [L]. If false the filemtime will be appended as a query-string.
                'spriteIconGenerator_handler' => '', // String: Used to register own/other spriteGenerating Handler, they have to implement the interface t3lib_spriteManager_spriteIconGenerator
                'elementVersioningOnly' => FALSE,               // If true, only element versioning is allowed in the backend. This is recommended for new installations of TYPO3 4.2+ since "page" and "branch" versioning types are known for the drawbacks of loosing ids and "element" type versions supports moving now.
                'versionNumberInFilename' => FALSE, // Boolean. If true, included CSS and JS files will have the timestamp embedded in the filename, ie. filename.1269312081.js. This will make browsers and proxies reload the files if they change (thus avoiding caching issues). IMPORTANT: this feature requires this .htaccess rule to work: RewriteCond %{REQUEST_FILENAME} !-f - RewriteCond %{REQUEST_FILENAME} !-d - RewriteRule ^(.+)\.(\d+)\.(php|js|css|png|jpg|gif|gzip)$ $1.$3 [L]. If false the filemtime will be appended as a query-string.
                'spriteIconGenerator_handler' => '', // String: Used to register own/other spriteGenerating Handler, they have to implement the interface t3lib_spriteManager_spriteIconGenerator
+               'allowDonateWindow' => TRUE,                    // Boolean. Defines whether to display a TYPO3 donate window to admin users that have been working with the system for more than three months.
                'AJAX' => array(                                // array of key-value pairs for a unified use of AJAX calls in the TYPO3 backend. Keys are the unique ajaxIDs where the value will be resolved to call a method in an object. See ajax.php and the classes/class.typo3ajax.php for more information.
                        'SC_alt_db_navframe::expandCollapse'                => 'typo3/alt_db_navframe.php:SC_alt_db_navframe->ajaxExpandCollapse',
                        'SC_alt_file_navframe::expandCollapse'              => 'typo3/alt_file_navframe.php:SC_alt_file_navframe->ajaxExpandCollapse',
                'AJAX' => array(                                // array of key-value pairs for a unified use of AJAX calls in the TYPO3 backend. Keys are the unique ajaxIDs where the value will be resolved to call a method in an object. See ajax.php and the classes/class.typo3ajax.php for more information.
                        'SC_alt_db_navframe::expandCollapse'                => 'typo3/alt_db_navframe.php:SC_alt_db_navframe->ajaxExpandCollapse',
                        'SC_alt_file_navframe::expandCollapse'              => 'typo3/alt_file_navframe.php:SC_alt_file_navframe->ajaxExpandCollapse',
@@ -282,6 +283,8 @@ $TYPO3_CONF_VARS = array(
                        'BackendLogin::refreshLogin'            => 'typo3/classes/class.ajaxlogin.php:AjaxLogin->refreshLogin',
                        'BackendLogin::isTimedOut'                      => 'typo3/classes/class.ajaxlogin.php:AjaxLogin->isTimedOut',
                        'BackendLogin::getChallenge'            => 'typo3/classes/class.ajaxlogin.php:AjaxLogin->getChallenge',
                        'BackendLogin::refreshLogin'            => 'typo3/classes/class.ajaxlogin.php:AjaxLogin->refreshLogin',
                        'BackendLogin::isTimedOut'                      => 'typo3/classes/class.ajaxlogin.php:AjaxLogin->isTimedOut',
                        'BackendLogin::getChallenge'            => 'typo3/classes/class.ajaxlogin.php:AjaxLogin->getChallenge',
+                       'DonateWindow::disable'                         => 'typo3/classes/class.donatewindow.php:DonateWindow->disable',
+                       'DonateWindow::postpone'                        => 'typo3/classes/class.donatewindow.php:DonateWindow->postpone',
                        'WorkspaceMenu::toggleWorkspacePreview' => 'typo3/classes/class.workspaceselector.php:WorkspaceSelector->toggleWorkspacePreview',
                        'WorkspaceMenu::setWorkspace'           => 'typo3/classes/class.workspaceselector.php:WorkspaceSelector->setWorkspace',
                        'ExtDirect::getAPI' => 't3lib/extjs/class.t3lib_extjs_extdirectapi.php:t3lib_extjs_ExtDirectApi->getAPI',
                        'WorkspaceMenu::toggleWorkspacePreview' => 'typo3/classes/class.workspaceselector.php:WorkspaceSelector->toggleWorkspacePreview',
                        'WorkspaceMenu::setWorkspace'           => 'typo3/classes/class.workspaceselector.php:WorkspaceSelector->setWorkspace',
                        'ExtDirect::getAPI' => 't3lib/extjs/class.t3lib_extjs_extdirectapi.php:t3lib_extjs_ExtDirectApi->getAPI',
index 5bb5334..331ee73 100644 (file)
@@ -31,6 +31,7 @@ require_once('interfaces/interface.backend_toolbaritem.php');
 
 require('classes/class.typo3logo.php');
 require('classes/class.modulemenu.php');
 
 require('classes/class.typo3logo.php');
 require('classes/class.modulemenu.php');
+require_once('classes/class.donatewindow.php');
 
        // core toolbar items
 require('classes/class.workspaceselector.php');
 
        // core toolbar items
 require('classes/class.workspaceselector.php');
@@ -78,7 +79,7 @@ class TYPO3backend {
        /**
         * Pagerenderer
         *
        /**
         * Pagerenderer
         *
-        * @var $pageRenderer t3lib_PageRenderer
+        * @var t3lib_PageRenderer
         */
        protected $pageRenderer;
 
         */
        protected $pageRenderer;
 
@@ -185,6 +186,10 @@ class TYPO3backend {
         */
        public function render()        {
 
         */
        public function render()        {
 
+               if (t3lib_div::makeInstance('DonateWindow')->isDonateWindowAllowed()) {
+                       $this->pageRenderer->addJsFile('js/donate.js');
+               }
+
                        // prepare the scaffolding, at this point extension may still add javascript and css
                $logo         = t3lib_div::makeInstance('TYPO3Logo');
                $logo->setLogo('gfx/typo3logo_mini.png');
                        // prepare the scaffolding, at this point extension may still add javascript and css
                $logo         = t3lib_div::makeInstance('TYPO3Logo');
                $logo->setLogo('gfx/typo3logo_mini.png');
@@ -393,6 +398,11 @@ class TYPO3backend {
                        'tabs_closeAll' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:tabs.closeAll'),
                        'tabs_closeOther' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:tabs.closeOther'),
                        'tabs_close' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:tabs.close'),
                        'tabs_closeAll' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:tabs.closeAll'),
                        'tabs_closeOther' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:tabs.closeOther'),
                        'tabs_close' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:tabs.close'),
+                       'donateWindow_title' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:donateWindow.title'),
+                       'donateWindow_message' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:donateWindow.message'),
+                       'donateWindow_button_donate' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:donateWindow.button_donate'),
+                       'donateWindow_button_disable' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:donateWindow.button_disable'),
+                       'donateWindow_button_postpone' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:donateWindow.button_postpone'),
                );
                $t3LLLfileUpload = array(
                        'windowTitle' => $GLOBALS['LANG']->getLL('fileUpload_windowTitle'),
                );
                $t3LLLfileUpload = array(
                        'windowTitle' => $GLOBALS['LANG']->getLL('fileUpload_windowTitle'),
diff --git a/typo3/classes/class.donatewindow.php b/typo3/classes/class.donatewindow.php
new file mode 100644 (file)
index 0000000..6715c98
--- /dev/null
@@ -0,0 +1,122 @@
+<?php
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2010 Oliver Hader <oliver@typo3.org>
+*  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.
+*  A copy is found in the textfile GPL.txt and important notices to the license
+*  from the author is found in LICENSE.txt distributed with these scripts.
+*
+*
+*  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!
+***************************************************************/
+/**
+ * AJAX handler for the donate window shown in the TYPO3 backend.
+ *
+ * @author Oliver Hader <oliver@typo3.org>
+ */
+class DonateWindow implements t3lib_Singleton {
+       const FLAG_DonateWindowDisabled = 'DonateWindowDisabled';
+       const FLAG_DonateWindowPostponed = 'DonateWindowPostponed';
+       const VALUE_DonateWindowAppearsAfterDays = 90;
+       const VALUE_DonateWindowPostponeDays = 14;
+
+       /**
+        * @var t3lib_beUserAuth
+        */
+       protected $backendUser;
+
+       /**
+        * Constructs this object.
+        */
+       public function __construct() {
+               $this->setBackendUser($GLOBALS['BE_USER']);
+       }
+
+       /**
+        * Sets the backend user.
+        *
+        * @param t3lib_beUserAuth $backendUser
+        * @return void
+        */
+       public function setBackendUser(t3lib_beUserAuth $backendUser) {
+               $this->backendUser = $backendUser;
+       }
+
+       /**
+        * Disables the donate window - thus it won't be shown again for this user.
+        *
+        * @param       array           $parameters: Parameters (not used)
+        * @param       TYPO3AJAX       $ajaxObj: The calling parent AJAX object
+        * @return      void
+        */
+       public function disable(array $parameters, TYPO3AJAX $ajaxObj) {
+               $this->backendUser->uc[self::FLAG_DonateWindowDisabled] = TYPO3_version;
+               $this->backendUser->writeUC();
+       }
+
+       /**
+        * Postpones the donate window - thus it will be shown again at a later time.
+        *
+        * @param       array           $parameters: Parameters (not used)
+        * @param       TYPO3AJAX       $ajaxObj: The calling parent AJAX object
+        * @return      void
+        */
+       public function postpone(array $parameters, TYPO3AJAX $ajaxObj) {
+               $this->backendUser->uc[self::FLAG_DonateWindowPostponed] = $GLOBALS['EXEC_TIME'];
+               $this->backendUser->writeUC();
+       }
+
+
+       /**
+        * Determines whether the donate window is allowed to be displayed.
+        *
+        * @return boolean Whether the donate window is allowed to be displayed.
+        */
+       public function isDonateWindowAllowed() {
+               $uc = $this->backendUser->uc;
+               $isAdmin = $this->backendUser->isAdmin();
+               $firstLogin = $this->getFirstLoginTimeStamp();
+               $isTriggered = ($firstLogin && $GLOBALS['EXEC_TIME'] - $firstLogin > self::VALUE_DonateWindowAppearsAfterDays * 86400);
+               $isAllowed = (bool) $GLOBALS['TYPO3_CONF_VARS']['BE']['allowDonateWindow'];
+               $isCancelled = (isset($uc[self::FLAG_DonateWindowDisabled]) && !empty($uc[self::FLAG_DonateWindowDisabled]));
+               $isPostponed = (isset($uc[self::FLAG_DonateWindowPostponed]) && $uc[self::FLAG_DonateWindowPostponed] > $GLOBALS['EXEC_TIME'] - self::VALUE_DonateWindowPostponeDays * 86400);
+
+               return ($isAdmin && $isAllowed && !$isCancelled && !$isPostponed);
+       }
+
+       /**
+        * Gets the timestamp of the first login of the current backend user.
+        *
+        * @return integer Timestamp of the first login
+        */
+       public function getFirstLoginTimeStamp() {
+               $firstLogin = NULL;
+
+               if (isset($this->backendUser->uc['firstLoginTimeStamp'])) {
+                       $firstLogin = $this->backendUser->uc['firstLoginTimeStamp'];
+               }
+
+               return $firstLogin;
+       }
+}
+
+if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/classes/class.donatewindow.php']) {
+       include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/classes/class.donatewindow.php']);
+}
+
+?>
\ No newline at end of file
diff --git a/typo3/js/donate.js b/typo3/js/donate.js
new file mode 100644 (file)
index 0000000..e6787d4
--- /dev/null
@@ -0,0 +1,162 @@
+/***************************************************************
+*  Copyright notice
+*
+*  (c) 2010 Oliver Hader <oliver@typo3.org>
+*  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.
+*  A copy is found in the textfile GPL.txt and important notices to the license
+*  from the author is found in LICENSE.txt distributed with these scripts.
+*
+*
+*  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!
+***************************************************************/
+
+/**
+ * Donate window appearing in the backend
+ */
+Ext.namespace('Ext.ux.TYPO3');
+
+Ext.ux.TYPO3.donate = Ext.extend(Ext.util.Observable, {
+       isUnloading: false,
+       logoutButton: null,
+       ajaxRequestDefault: null,
+       donateUrl: 'http://typo3.org/donate/',
+
+       constructor: function(config) {
+               this.ajaxRequestDefault = {
+                       url: TYPO3.configuration.PATH_typo3 + 'ajax.php',
+                       success: function() {},
+                       failure: function() {}
+               };
+
+               config = config || {};
+               Ext.apply(this, config);
+
+               this.initComponents();
+               this.execute.defer(3000, this);
+               this.logoutButton = Ext.DomQuery.selectNode('#logout-button input');
+
+               Ext.ux.TYPO3.donate.superclass.constructor.call(this, config);
+       },
+
+       execute: function() {
+               this.donateWindow.show();
+       },
+
+       initComponents: function() {
+               this.donateWindow = new Ext.Window({
+                       width: 450,
+                       autoHeight: true,
+                       closable: false,
+                       resizable: false,
+                       plain: true,
+                       border: false,
+                       modal: true,
+                       draggable: false,
+                       closeAction: 'hide',
+                       id: 'donateWindow',
+                       cls: 't3-window',
+                       title: TYPO3.LLL.core.donateWindow_title,
+                       html: TYPO3.LLL.core.donateWindow_message,
+                       buttons: [{
+                               scope: this,
+                               icon: this.getDonateIcon(),
+                               text: TYPO3.LLL.core.donateWindow_button_donate,
+                               handler: this.donateAction
+                       }, {
+                               scope: this,
+                               text: TYPO3.LLL.core.donateWindow_button_disable,
+                               handler: this.disableAction
+                       }, {
+                               scope: this,
+                               text: TYPO3.LLL.core.donateWindow_button_postpone,
+                               handler: this.postponeAction
+                       }]
+               });
+       },
+
+       unloadEventHandler: function(event) {
+               event.stopEvent();
+               this.isUnloading = true;
+               this.donateWindow.show();
+               this.removeUnloadEventListener();
+       },
+
+       donateAction: function() {
+               this.submitDisableAction();
+               this.donateWindow.hide();
+               window.open(this.donateUrl).focus();
+               this.continueUnloading();
+       },
+
+       disableAction: function() {
+               this.submitDisableAction();
+               this.donateWindow.hide();
+               this.continueUnloading();
+       },
+
+       postponeAction: function() {
+               this.submitPostponeAction();
+               this.donateWindow.hide();
+               this.addUnloadEventListener();
+               this.continueUnloading();
+       },
+
+       submitDisableAction: function() {
+               Ext.Ajax.request(Ext.apply(
+                       this.ajaxRequestDefault, {
+                               params: { 'ajaxID': 'DonateWindow::disable' }
+                       }
+               ));
+       },
+
+       submitPostponeAction: function() {
+               Ext.Ajax.request(Ext.apply(
+                       this.ajaxRequestDefault, {
+                               params: { 'ajaxID': 'DonateWindow::postpone' }
+                       }
+               ));
+       },
+
+       getDonateIcon: function() {
+               return TYPO3.configuration.PATH_typo3 + 'sysext/t3skin/images/icons/status/dialog-ok.png';
+       },
+
+       addUnloadEventListener: function() {
+               if (!this.isUnloading) {
+                       Ext.EventManager.addListener(this.logoutButton, 'click', this.unloadEventHandler, this);
+               }
+       },
+
+       removeUnloadEventListener: function() {
+               Ext.EventManager.removeListener(this.logoutButton, 'click', this.unloadEventHandler, this);
+       },
+
+       continueUnloading: function() {
+               if (this.isUnloading && this.logoutButton) {
+                       this.logoutButton.click();
+               }
+       }
+});
+
+
+
+/**
+ * Initialize the donate widget
+ */
+Ext.onReady(function() {
+       TYPO3.donate = new Ext.ux.TYPO3.donate();
+});
index 74f4bd3..3f20026 100755 (executable)
@@ -266,6 +266,11 @@ Would you like to save now in order to refresh the display?</label>
                        <label index="tabs.closeAll">Close All Tabs</label>
                        <label index="tabs.closeOther">Close Other Tabs</label>
                        <label index="tabs.close">Close Tab</label>
                        <label index="tabs.closeAll">Close All Tabs</label>
                        <label index="tabs.closeOther">Close Other Tabs</label>
                        <label index="tabs.close">Close Tab</label>
+                       <label index="donateWindow.title">TYPO3 donation notice</label>
+                       <label index="donateWindow.message">&lt;b&gt;You have now used TYPO3 for more than three months.&lt;/b&gt; It would be great if you could donate. TYPO3 is Open Source and relies heavily on donations from its users and supporters.&lt;br/&gt; &lt;b&gt;Thank you&lt;/b&gt; for making this great Content Management System even better with your help!</label>
+                       <label index="donateWindow.button_donate">Donate now</label>
+                       <label index="donateWindow.button_disable">Never show again</label>
+                       <label index="donateWindow.button_postpone">Remind me later</label>
                </languageKey>
        </data>
 </T3locallang>
                </languageKey>
        </data>
 </T3locallang>
index 68a9479..47fa74c 100644 (file)
@@ -2205,7 +2205,8 @@ body.x-body-masked .x-window-plain .x-window-mc {
 
 #loginRefreshWindow .x-panel-body.x-panel-body-noheader.x-panel-body-noborder,
 #loginRefreshWindow .x-panel-header.x-unselectable,
 
 #loginRefreshWindow .x-panel-body.x-panel-body-noheader.x-panel-body-noborder,
 #loginRefreshWindow .x-panel-header.x-unselectable,
-#loginformWindow .x-panel-header.x-unselectable {
+#loginformWindow .x-panel-header.x-unselectable,
+.t3-window .x-panel-body.x-panel-body-noheader.x-panel-body-noborder {
        background-image: none;
        background-color: transparent;
        color: #000;
        background-image: none;
        background-color: transparent;
        color: #000;
@@ -2228,3 +2229,17 @@ body.x-body-masked .x-window-plain .x-window-mc {
 #loginformWindow .x-window-ml {
        background-color: #E4E4E4;
 }
 #loginformWindow .x-window-ml {
        background-color: #E4E4E4;
 }
+
+.t3-window .x-window-body.x-window-body-noborder {
+       padding: 10px;
+}
+
+.t3-window .x-btn button {
+       padding-left: 3px;
+       padding-right: 3px;
+}
+
+#donateWindow.t3-window .x-window-body.x-window-body-noborder {
+       padding-left: 100px;
+       background: url(../images/general/donate_teaser.png) no-repeat 25px 10px !important;
+}
diff --git a/typo3/sysext/t3skin/images/general/donate_teaser.png b/typo3/sysext/t3skin/images/general/donate_teaser.png
new file mode 100644 (file)
index 0000000..42ea68c
Binary files /dev/null and b/typo3/sysext/t3skin/images/general/donate_teaser.png differ