2013-02-08 20:11:44 +01:00
< ? php
/**
* EGroupware - Mail - interface class
*
* @ link http :// www . egroupware . org
* @ package mail
* @ author Klaus Leithoff [ kl @ stylite . de ]
* @ copyright ( c ) 2013 by Klaus Leithoff < kl - AT - stylite . de >
* @ license http :// opensource . org / licenses / gpl - license . php GPL - GNU General Public License
* @ version $Id $
*/
/**
* Mail Interface class
*/
class mail_ui
{
/**
* Methods callable via menuaction
*
* @ var array
*/
var $public_functions = array
(
'index' => True ,
2013-02-28 10:28:08 +01:00
'displayHeader' => True ,
'saveMessage' => True ,
2013-03-05 15:09:35 +01:00
'vfsSaveMessage' => True ,
2013-02-08 20:11:44 +01:00
'TestConnection' => True ,
);
2013-02-20 17:27:10 +01:00
/**
* current icServerID
*
* @ var int
*/
static $icServerID ;
/**
* delimiter - used to separate profileID from foldertreestructure , and separate keyinformation in rowids
*
* @ var string
*/
static $delimiter = '::' ;
2013-02-08 20:11:44 +01:00
/**
* instance of mail_bo
*
* @ var object
*/
var $mail_bo ;
/**
* Constructor
*
*/
function __construct ()
{
// no autohide of the sidebox, as we use it for folderlist now.
unset ( $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'common' ][ 'auto_hide_sidebox' ]);
if ( ! empty ( $_GET [ " resetConnection " ])) $connectionReset = html :: purify ( $_GET [ " resetConnection " ]);
unset ( $_GET [ " resetConnection " ]);
2013-02-20 12:31:57 +01:00
//$icServerID =& egw_cache::getSession('mail','activeProfileID');
if ( isset ( $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'mail' ][ 'ActiveProfileID' ]) && ! empty ( $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'mail' ][ 'ActiveProfileID' ]))
{
2013-02-20 17:27:10 +01:00
self :: $icServerID = ( int ) $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'mail' ][ 'ActiveProfileID' ];
2013-02-20 12:31:57 +01:00
}
2013-02-08 20:11:44 +01:00
if ( $connectionReset )
{
2013-02-28 10:28:08 +01:00
if ( mail_bo :: $debug ) error_log ( __METHOD__ . __LINE__ . ' Connection Reset triggered:' . $connectionReset . ' for Profile with ID:' . self :: $icServerID );
2013-02-20 17:27:10 +01:00
emailadmin_bo :: unsetCachedObjects ( self :: $icServerID );
2013-02-08 20:11:44 +01:00
}
$this -> mail_bo = mail_bo :: getInstance ( false , $icServerID );
2013-02-28 10:28:08 +01:00
if ( mail_bo :: $debug ) error_log ( __METHOD__ . __LINE__ . ' Fetched IC Server:' . self :: $icServerID . '/' . $this -> mail_bo -> profileID . ':' . function_backtrace ());
2013-02-08 20:11:44 +01:00
// no icServer Object: something failed big time
if ( ! isset ( $this -> mail_bo -> icServer )) exit ; // ToDo: Exception or the dialog for setting up a server config
2013-02-20 17:27:10 +01:00
if ( ! ( $this -> mail_bo -> icServer -> _connected == 1 )) $this -> mail_bo -> openConnection ( self :: $icServerID );
2013-02-08 20:11:44 +01:00
}
2013-02-20 12:31:57 +01:00
/**
* changeProfile
*
* @ param int $icServerID
*/
2013-02-20 17:27:10 +01:00
function changeProfile ( $_icServerID )
2013-02-20 12:31:57 +01:00
{
2013-02-20 17:27:10 +01:00
self :: $icServerID = $_icServerID ;
2013-02-28 10:28:08 +01:00
if ( mail_bo :: $debug ) error_log ( __METHOD__ . __LINE__ . '->' . self :: $icServerID );
2013-02-20 17:27:10 +01:00
emailadmin_bo :: unsetCachedObjects ( self :: $icServerID );
$this -> mail_bo = mail_bo :: getInstance ( false , self :: $icServerID );
2013-02-28 10:28:08 +01:00
if ( mail_bo :: $debug ) error_log ( __METHOD__ . __LINE__ . ' Fetched IC Server:' . self :: $icServerID . '/' . $this -> mail_bo -> profileID . ':' . function_backtrace ());
2013-02-20 12:31:57 +01:00
// no icServer Object: something failed big time
if ( ! isset ( $this -> mail_bo -> icServer )) exit ; // ToDo: Exception or the dialog for setting up a server config
2013-02-20 17:27:10 +01:00
/*if (!($this->mail_bo->icServer->_connected == 1))*/ $this -> mail_bo -> openConnection ( self :: $icServerID );
2013-02-20 12:31:57 +01:00
// save session varchar
2013-02-20 13:04:29 +01:00
$oldicServerID =& egw_cache :: getSession ( 'mail' , 'activeProfileID' );
2013-02-20 17:27:10 +01:00
$oldicServerID = self :: $icServerID ;
2013-02-20 12:31:57 +01:00
// save pref
2013-02-20 17:27:10 +01:00
$GLOBALS [ 'egw' ] -> preferences -> add ( 'mail' , 'ActiveProfileID' , self :: $icServerID , 'user' );
2013-02-20 12:31:57 +01:00
$GLOBALS [ 'egw' ] -> preferences -> save_repository ( true );
2013-02-20 17:27:10 +01:00
$GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'mail' ][ 'ActiveProfileID' ] = self :: $icServerID ;
2013-02-20 12:31:57 +01:00
}
2013-02-08 20:11:44 +01:00
/**
* Main mail page
*
* @ param array $content = null
* @ param string $msg = null
*/
function index ( array $content = null , $msg = null )
{
2013-02-11 18:05:29 +01:00
//_debug_array($content);
2013-02-08 20:11:44 +01:00
if ( ! is_array ( $content ))
{
$content = array (
'nm' => egw_session :: appsession ( 'index' , 'mail' ),
);
if ( ! is_array ( $content [ 'nm' ]))
{
$content [ 'nm' ] = array (
'get_rows' => 'mail.mail_ui.get_rows' , // I method/callback to request the data for the rows eg. 'notes.bo.get_rows'
2013-02-11 12:46:35 +01:00
'filter' => 'INBOX' , // filter is used to choose the mailbox
'no_filter2' => false , // I disable the 2. filter (params are the same as for filter)
2013-02-11 14:04:49 +01:00
'no_cat' => true , // I disable the cat-selectbox
2013-02-11 12:46:35 +01:00
//'cat_is_select' => 'no_lang', // true or no_lang
2013-02-08 20:11:44 +01:00
'lettersearch' => false , // I show a lettersearch
'searchletter' => false , // I0 active letter of the lettersearch or false for [all]
'start' => 0 , // IO position in list
'order' => 'date' , // IO name of the column to sort after (optional for the sortheaders)
'sort' => 'ASC' , // IO direction of the sort: 'ASC' or 'DESC'
2013-02-19 17:30:59 +01:00
'default_cols' => 'status,attachments,subject,fromaddress,date,size' , // I columns to use if there's no user or default pref (! as first char uses all but the named columns), default all columns
2013-02-08 20:11:44 +01:00
'csv_fields' => false , // I false=disable csv export, true or unset=enable it with auto-detected fieldnames,
//or array with name=>label or name=>array('label'=>label,'type'=>type) pairs (type is a eT widget-type)
'actions' => self :: get_actions (),
'row_id' => 'row_id' , // is a concatenation of trim($GLOBALS['egw_info']['user']['account_id']):profileID:base64_encode(FOLDERNAME):uid
);
//$content['nm']['path'] = self::get_home_dir();
}
}
2013-02-12 18:48:04 +01:00
if ( $msg )
{
$content [ 'msg' ] = $msg ;
}
else
{
unset ( $msg );
unset ( $content [ 'msg' ]);
}
2013-02-22 17:05:43 +01:00
$content [ 'preview' ] = " <html><body style='background-color: pink;'/></html> " ;
2013-02-12 18:48:04 +01:00
$this -> mail_bo -> restoreSessionData ();
2013-02-20 13:04:29 +01:00
2013-02-11 12:46:35 +01:00
// filter is used to choose the mailbox
2013-02-11 14:04:49 +01:00
//if (!isset($content['nm']['foldertree'])) // maybe we fetch the folder here
2013-02-12 14:59:39 +01:00
/*
$sel_options [ 'nm' ][ 'foldertree' ] = array ( 'id' => 0 , 'item' => array (
array ( 'id' => '/INBOX' , 'text' => 'INBOX' , 'im0' => 'kfm_home.png' , 'child' => '1' , 'item' => array (
array ( 'id' => '/INBOX/sub' , 'text' => 'sub' ),
array ( 'id' => '/INBOX/sub2' , 'text' => 'sub2' ),
)),
array ( 'id' => '/user' , 'text' => 'user' , 'child' => '1' , 'item' => array (
array ( 'id' => '/user/birgit' , 'text' => 'birgit' ),
)),
));
$content [ 'nm' ][ 'foldertree' ] = '/INBOX/sub' ;
*/
2013-02-19 17:30:59 +01:00
$sel_options [ 'nm' ][ 'foldertree' ] = $this -> getFolderTree ( false );
$sessionFolder = $this -> mail_bo -> sessionData [ 'maibox' ];
if ( $this -> mail_bo -> folderExists ( $sessionFolder ))
2013-02-12 18:48:04 +01:00
{
2013-02-20 17:27:10 +01:00
$content [ 'nm' ][ 'selectedFolder' ] = $this -> mail_bo -> profileID . self :: $delimiter . $this -> mail_bo -> sessionData [ 'maibox' ];
2013-02-12 18:48:04 +01:00
}
2013-02-20 17:27:10 +01:00
if ( ! isset ( $content [ 'nm' ][ 'foldertree' ])) $content [ 'nm' ][ 'foldertree' ] = $this -> mail_bo -> profileID . self :: $delimiter . 'INBOX' ;
if ( ! isset ( $content [ 'nm' ][ 'selectedFolder' ])) $content [ 'nm' ][ 'selectedFolder' ] = $this -> mail_bo -> profileID . self :: $delimiter . 'INBOX' ;
2013-02-12 18:48:04 +01:00
$content [ 'nm' ][ 'foldertree' ] = $content [ 'nm' ][ 'selectedFolder' ];
2013-02-11 14:04:49 +01:00
$sel_options [ 'cat_id' ] = array ( 1 => 'none' );
2013-02-11 12:46:35 +01:00
if ( ! isset ( $content [ 'nm' ][ 'cat_id' ])) $content [ 'nm' ][ 'cat_id' ] = 'All' ;
2013-02-12 18:48:04 +01:00
2013-02-08 20:11:44 +01:00
$etpl = new etemplate ( 'mail.index' );
2013-02-15 16:53:18 +01:00
// Set tree actions
$etpl -> set_cell_attribute ( 'nm[foldertree]' , 'actions' , array (
2013-02-20 13:04:29 +01:00
2013-02-15 16:53:18 +01:00
'drop_move_mail' => array (
'type' => 'drop' ,
'acceptedTypes' => 'mail' ,
'icon' => 'move' ,
'caption' => 'Move to' ,
'onExecute' => 'javaScript:mail_move'
),
'drop_copy_mail' => array (
'type' => 'drop' ,
'acceptedTypes' => 'mail' ,
'icon' => 'copy' ,
'caption' => 'Copy to' ,
'onExecute' => 'javaScript:mail_copy'
),
'drop_cancel' => array (
'caption' => 'Cancel' ,
'acceptedTypes' => 'mail' ,
'type' => 'drop' ,
),
// Tree doesn't support this one - yet
'rename' => array (
'caption' => 'Rename' ,
'type' => 'popup'
)
));
2013-02-08 20:11:44 +01:00
return $etpl -> exec ( 'mail.mail_ui.index' , $content , $sel_options , $readonlys , $preserv );
}
/**
* Test Connection
* Simple Test , resets the active connections cachedObjects / ImapServer
*/
function TestConnection ()
{
2013-02-11 14:04:49 +01:00
// load translations
translation :: add_app ( 'mail' );
2013-02-11 14:40:58 +01:00
2013-02-11 14:04:49 +01:00
common :: egw_header ();
parse_navbar ();
//$GLOBALS['egw']->framework->sidebox();
2013-02-11 18:05:29 +01:00
$preferences =& $this -> mail_bo -> mailPreferences ;
2013-02-08 20:11:44 +01:00
if ( $preferences -> preferences [ 'prefcontroltestconnection' ] == 'none' ) die ( 'You should not be here!' );
if ( isset ( $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'mail' ][ 'ActiveProfileID' ]))
$icServerID = ( int ) $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'mail' ][ 'ActiveProfileID' ];
2013-02-11 12:46:35 +01:00
//_debug_array($this->mail_bo->mailPreferences);
if ( is_object ( $preferences )) $imapServer = $preferences -> getIncomingServer ( $icServerID );
2013-02-08 20:11:44 +01:00
if ( isset ( $imapServer -> ImapServerId ) && ! empty ( $imapServer -> ImapServerId ))
{
$icServerID = $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'mail' ][ 'ActiveProfileID' ] = $imapServer -> ImapServerId ;
}
echo " <h2> " . lang ( 'Test Connection and display basic information about the selected profile' ) . " </h2> " ;
_debug_array ( 'Connection Reset triggered:' . $connectionReset . ' for Profile with ID:' . $icServerID );
emailadmin_bo :: unsetCachedObjects ( $icServerID );
if ( mail_bo :: $idna2 )
{
_debug_array ( 'Umlautdomains supported (see Example below)' );
$dom = 'füßler.com' ;
$encDom = mail_bo :: $idna2 -> encode ( $dom );
_debug_array ( array ( 'source' => $dom , 'result' => array ( 'encoded' => $encDom , 'decoded' => mail_bo :: $idna2 -> decode ( $encDom ))));
}
if ( $preferences -> preferences [ 'prefcontroltestconnection' ] == 'reset' ) exit ;
echo " <hr /><h3 style='color:red'> " . lang ( 'IMAP Server' ) . " </h3> " ;
if ( $imapServer -> _connectionErrorObject ) $eO = $imapServer -> _connectionErrorObject ;
unset ( $imapServer -> _connectionErrorObject );
$sieveServer = clone $imapServer ;
if ( ! empty ( $imapServer -> adminPassword )) $imapServer -> adminPassword = '**********************' ;
if ( $preferences -> preferences [ 'prefcontroltestconnection' ] == 'nopasswords' || $preferences -> preferences [ 'prefcontroltestconnection' ] == 'nocredentials' )
{
if ( ! empty ( $imapServer -> password )) $imapServer -> password = '**********************' ;
}
if ( $preferences -> preferences [ 'prefcontroltestconnection' ] == 'nocredentials' )
{
if ( ! empty ( $imapServer -> adminUsername )) $imapServer -> adminUsername = '++++++++++++++++++++++' ;
if ( ! empty ( $imapServer -> username )) $imapServer -> username = '++++++++++++++++++++++' ;
if ( ! empty ( $imapServer -> loginName )) $imapServer -> loginName = '++++++++++++++++++++++' ;
}
if ( $preferences -> preferences [ 'prefcontroltestconnection' ] <> 'basic' )
{
_debug_array ( $imapServer );
}
else
{
_debug_array ( array ( 'ImapServerId' => $imapServer -> ImapServerId ,
'host' => $imapServer -> host ,
'port' => $imapServer -> port ,
'validatecert' => $imapServer -> validatecert ));
}
echo " <h4 style='color:red'> " . lang ( 'Connection Status' ) . " </h4> " ;
$lE = false ;
if ( $eO && $eO -> message )
{
_debug_array ( $eO -> message );
$lE = true ;
}
$isError = egw_cache :: getCache ( egw_cache :: INSTANCE , 'email' , 'icServerIMAP_connectionError' . trim ( $GLOBALS [ 'egw_info' ][ 'user' ][ 'account_id' ]), null , array (), $expiration = 60 * 5 );
if ( $isError [ $icServerID ]) {
_debug_array ( $isError [ $icServerID ]);
$lE = true ;
}
_debug_array (( $lE ? '' : lang ( 'Successfully connected' )));
$suF = $this -> mail_bo -> getSpecialUseFolders ();
if ( is_array ( $suF ) && ! empty ( $suF )) _debug_array ( array ( lang ( 'Server supports Special-Use Folders' ) => $suF ));
if (( $sieveServer instanceof defaultimap ) && $sieveServer -> enableSieve ) {
$scriptName = ( ! empty ( $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'mail' ][ 'sieveScriptName' ])) ? $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'mail' ][ 'sieveScriptName' ] : 'mail' ;
$sieveServer -> getScript ( $scriptName );
$rules = $sieveServer -> retrieveRules ( $sieveServer -> scriptName , true );
$vacation = $sieveServer -> getVacation ( $sieveServer -> scriptName );
echo " <h4 style='color:red'> " . lang ( 'Sieve Connection Status' ) . " </h4> " ;
$isSieveError = egw_cache :: getCache ( egw_cache :: INSTANCE , 'email' , 'icServerSIEVE_connectionError' . trim ( $GLOBALS [ 'egw_info' ][ 'user' ][ 'account_id' ]), $callback = null , $callback_params = array (), $expiration = 60 * 15 );
if ( $isSieveError [ $icServerID ])
{
_debug_array ( $isSieveError [ $icServerID ]);
}
else
{
_debug_array ( array ( lang ( 'Successfully connected' ), $rules ));
}
}
echo " <hr /><h3 style='color:red'> " . lang ( 'Preferences' ) . " </h3> " ;
_debug_array ( $preferences -> preferences );
//error_log(__METHOD__.__LINE__.' ImapServerId:'.$imapServer->ImapServerId.' Prefs:'.array2string($preferences->preferences));
//error_log(__METHOD__.__LINE__.' ImapServerObject:'.array2string($imapServer));
if ( is_object ( $preferences )) $activeIdentity =& $preferences -> getIdentity ( $icServerID , true );
//_debug_array($activeIdentity);
$maxMessages = 50 ;
$userPreferences =& $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'mail' ];
// retrieve data for/from user defined accounts
$selectedID = 0 ;
2013-02-21 09:27:46 +01:00
if ( count ( $preferences -> ic_server )) {
foreach ( $preferences -> ic_server as $tmpkey => $accountData )
2013-02-08 20:11:44 +01:00
{
2013-02-21 18:08:06 +01:00
if ( $tmpkey == 0 ) continue ;
2013-02-21 09:27:46 +01:00
$identity =& $preferences -> identities [ $tmpkey ];
$icServer =& $accountData ;
2013-02-08 20:11:44 +01:00
//_debug_array($identity);
//_debug_array($icServer);
//error_log(__METHOD__.__LINE__.' Userdefined Profiles ImapServerId:'.$icServer->ImapServerId);
if ( empty ( $icServer -> host )) continue ;
2013-02-19 17:30:59 +01:00
$identities [ $identity -> id ] = $identity -> realName . ' ' . $identity -> organization . ' <' . $identity -> emailAddress . '>' ;
2013-02-08 20:11:44 +01:00
if ( ! empty ( $identity -> default )) $identities [ $identity -> id ] = $identities [ $identity -> id ] . '<b>(' . lang ( 'selected' ) . ')</b>' ;
}
}
if ( count ( $identities ) > 0 )
{
echo " <hr /><h3 style='color:red'> " . lang ( 'available personal EMail-Accounts/Profiles' ) . " </h3> " ;
_debug_array ( $identities );
}
2013-02-19 17:30:59 +01:00
if ( empty ( $imapServer -> host ) && count ( $identities ) == 0 && $preferences -> userDefinedAccounts )
2013-02-08 20:11:44 +01:00
{
// redirect to new personal account
egw :: redirect_link ( '/index.php' , array ( 'menuaction' => 'mail.uipreferences.editAccountData' ,
'accountID' => " new " ,
'msg' => lang ( " There is no IMAP Server configured. " ) . " - " . lang ( " Please configure access to an existing individual IMAP account. " ),
));
}
2013-02-11 14:04:49 +01:00
common :: egw_footer ();
2013-02-08 20:11:44 +01:00
}
2013-02-20 13:04:29 +01:00
/**
* Ajax callback to fetch folders for given profile
*
* We currently load all folders of a given profile , tree can also load parts of a tree .
*
2013-02-20 17:27:10 +01:00
* @ param string $_GET [ id ] if of node whos children are requested
2013-02-20 13:04:29 +01:00
*/
public function ajax_foldertree ()
{
2013-02-20 17:27:10 +01:00
$nodeID = $_GET [ 'id' ];
//error_log(__METHOD__.__LINE__.'->'.array2string($_REQUEST));
//error_log(__METHOD__.__LINE__.'->'.array2string($_GET));
$data = $this -> getFolderTree ( false , $nodeID );
2013-02-20 13:04:29 +01:00
header ( 'Content-Type: application/json; charset=utf-8' );
echo json_encode ( $data );
common :: egw_exit ();
}
2013-02-11 18:05:29 +01:00
/**
* getFolderTree , get folders from server and prepare the folder tree
2013-02-12 09:28:04 +01:00
* @ param bool $_fetchCounters , wether to fetch extended information on folders
2013-02-20 17:27:10 +01:00
* @ param string $_nodeID , nodeID to fetch and return
2013-02-12 15:30:58 +01:00
* @ return array something like that : array ( 'id' => 0 ,
* 'item' => array (
* 'text' => 'INBOX' ,
* 'tooltip' => 'INBOX' . ' ' . lang ( '(not connected)' ),
* 'im0' => 'kfm_home.png'
* 'item' => array ( $MORE_ITEMS )
* )
2013-02-11 18:05:29 +01:00
* );
*/
2013-02-20 17:27:10 +01:00
function getFolderTree ( $_fetchCounters = false , $_nodeID = null )
2013-02-11 18:05:29 +01:00
{
2013-02-20 17:27:10 +01:00
if ( $_nodeID )
2013-02-20 12:31:57 +01:00
{
2013-02-20 17:27:10 +01:00
list ( $_profileID , $_folderName ) = explode ( self :: $delimiter , $_nodeID , 2 );
if ( is_numeric ( $_profileID ))
{
if ( $_profileID && $_profileID != $this -> mail_bo -> profileID )
{
2013-02-28 10:28:08 +01:00
//error_log(__METHOD__.__LINE__.' change Profile to ->'.$_profileID);
2013-02-20 17:27:10 +01:00
$this -> changeProfile ( $_profileID );
}
}
2013-02-20 12:31:57 +01:00
}
2013-02-12 18:53:38 +01:00
$folderObjects = $this -> mail_bo -> getFolderObjects ( true , false , true );
2013-02-11 18:05:29 +01:00
$trashFolder = $this -> mail_bo -> getTrashFolder ();
$templateFolder = $this -> mail_bo -> getTemplateFolder ();
$draftFolder = $this -> mail_bo -> getDraftFolder ();
$sentFolder = $this -> mail_bo -> getSentFolder ();
$userDefinedFunctionFolders = array ();
if ( isset ( $trashFolder ) && $trashFolder != 'none' ) $userDefinedFunctionFolders [ 'Trash' ] = $trashFolder ;
if ( isset ( $sentFolder ) && $sentFolder != 'none' ) $userDefinedFunctionFolders [ 'Sent' ] = $sentFolder ;
if ( isset ( $draftFolder ) && $draftFolder != 'none' ) $userDefinedFunctionFolders [ 'Drafts' ] = $draftFolder ;
if ( isset ( $templateFolder ) && $templateFolder != 'none' ) $userDefinedFunctionFolders [ 'Templates' ] = $templateFolder ;
2013-02-12 14:59:39 +01:00
$out = array ( 'id' => 0 );
2013-02-21 09:27:46 +01:00
//_debug_array($this->mail_bo->mailPreferences);
//if($this->mail_bo->mailPreferences->userDefinedAccounts) $allAccountData = $this->mail_bo->bopreferences->getAllAccountData($this->mail_bo->mailPreferences);
if ( count ( $this -> mail_bo -> mailPreferences -> ic_server )) {
foreach ( $this -> mail_bo -> mailPreferences -> ic_server as $tmpkey => $accountData )
2013-02-19 17:30:59 +01:00
{
2013-02-21 18:08:06 +01:00
if ( $tmpkey == 0 ) continue ;
2013-02-21 09:27:46 +01:00
$identity =& $this -> mail_bo -> mailPreferences -> identities [ $tmpkey ];
$icServer =& $accountData ;
2013-02-19 17:30:59 +01:00
//_debug_array($identity);
//_debug_array($icServer);
2013-02-20 17:27:10 +01:00
if ( $_profileID && $icServer -> ImapServerId <> $_profileID ) continue ;
2013-02-19 17:30:59 +01:00
//error_log(__METHOD__.__LINE__.' Userdefined Profiles ImapServerId:'.$icServer->ImapServerId);
if ( empty ( $icServer -> host )) continue ;
$identities [ $icServer -> ImapServerId ] = $identity -> realName . ' ' . $identity -> organization . ' <' . $identity -> emailAddress . '>' ;
$oA = array ( 'id' => $icServer -> ImapServerId ,
'text' => $identities [ $icServer -> ImapServerId ], //$this->mail_bo->profileID,
'tooltip' => '(' . $icServer -> ImapServerId . ') ' . htmlspecialchars_decode ( $identities [ $icServer -> ImapServerId ]),
'im0' => 'thunderbird.png' ,
'im1' => 'thunderbird.png' ,
'im2' => 'thunderbird.png' ,
'path' => array ( $icServer -> ImapServerId ),
2013-02-28 10:28:08 +01:00
'child' => 1 , // dynamic loading on unfold
2013-02-19 17:30:59 +01:00
'parent' => ''
);
2013-02-20 17:27:10 +01:00
$this -> setOutStructure ( $oA , $out , self :: $delimiter );
2013-02-19 17:30:59 +01:00
}
}
//_debug_array($folderObjects);
2013-02-12 15:30:58 +01:00
$c = 0 ;
2013-02-11 18:05:29 +01:00
foreach ( $folderObjects as $key => $obj )
{
2013-02-12 14:01:43 +01:00
$fS = $this -> mail_bo -> getFolderStatus ( $key , false ,( $_fetchCounters ? false : true ));
2013-02-11 18:05:29 +01:00
//_debug_array($fS);
2013-02-12 14:01:43 +01:00
$fFP = $folderParts = explode ( $obj -> delimiter , $key );
//get rightmost folderpart
$shortName = array_pop ( $folderParts );
// the rest of the array is the name of the parent
$parentName = implode (( array ) $folderParts , $obj -> delimiter );
2013-02-20 17:27:10 +01:00
$parentName = $this -> mail_bo -> profileID . self :: $delimiter . $parentName ;
2013-02-12 14:01:43 +01:00
$oA = array ( 'text' => $obj -> shortDisplayName , 'tooltip' => $obj -> displayName );
2013-02-19 17:30:59 +01:00
array_unshift ( $fFP , $this -> mail_bo -> profileID );
2013-02-12 14:01:43 +01:00
$oA [ 'path' ] = $fFP ;
2013-02-19 17:30:59 +01:00
$path = $key ; //$obj->folderName; //$obj->delimiter
2013-02-12 14:01:43 +01:00
if ( $fS [ 'unseen' ]) $oA [ 'text' ] = '<b>' . $oA [ 'text' ] . ' (' . $fS [ 'unseen' ] . ')</b>' ;
2013-02-11 18:05:29 +01:00
if ( $path == 'INBOX' )
{
2013-02-12 15:30:58 +01:00
$oA [ 'im0' ] = $oA [ 'im1' ] = $oA [ 'im2' ] = " kfm_home.png " ;
2013-02-11 18:05:29 +01:00
}
elseif ( in_array ( $obj -> shortFolderName , mail_bo :: $autoFolders ))
{
//echo $obj->shortFolderName.'<br>';
2013-02-12 15:30:58 +01:00
$oA [ 'im0' ] = $oA [ 'im1' ] = $oA [ 'im2' ] = " MailFolder " . $obj -> shortFolderName . " .png " ;
2013-02-11 18:05:29 +01:00
//$image2 = "'MailFolderPlain.png'";
//$image3 = "'MailFolderPlain.png'";
}
elseif ( in_array ( $key , $userDefinedFunctionFolders ))
{
$_key = array_search ( $key , $userDefinedFunctionFolders );
2013-02-12 15:30:58 +01:00
$oA [ 'im0' ] = $oA [ 'im1' ] = $oA [ 'im2' ] = " MailFolder " . $_key . " .png " ;
2013-02-11 18:05:29 +01:00
}
else
{
2013-02-12 09:28:04 +01:00
$oA [ 'im0' ] = " MailFolderPlain.png " ; // one Level
$oA [ 'im1' ] = " folderOpen.gif " ;
$oA [ 'im2' ] = " MailFolderClosed.png " ; // has Children
2013-02-11 18:05:29 +01:00
}
2013-02-20 17:27:10 +01:00
$path = $this -> mail_bo -> profileID . self :: $delimiter . $key ; //$obj->folderName; //$obj->delimiter
2013-02-12 14:01:43 +01:00
$oA [ 'id' ] = $path ; // ID holds the PATH
2013-02-28 10:28:08 +01:00
if ( ! empty ( $fS [ 'attributes' ]) && stripos ( array2string ( $fS [ 'attributes' ]), '\noselect' ) !== false )
2013-02-13 15:02:02 +01:00
{
$oA [ 'im0' ] = " folderNoSelectClosed.gif " ; // one Level
$oA [ 'im1' ] = " folderNoSelectOpen.gif " ;
$oA [ 'im2' ] = " folderNoSelectClosed.gif " ; // has Children
}
2013-02-28 10:28:08 +01:00
if ( ! empty ( $fS [ 'attributes' ]) && stripos ( array2string ( $fS [ 'attributes' ]), '\hasnochildren' ) === false )
2013-02-12 14:01:43 +01:00
{
$oA [ 'child' ] = 1 ; // translates to: hasChildren -> dynamicLoading
}
$oA [ 'parent' ] = $parentName ;
2013-02-19 17:30:59 +01:00
//_debug_array($oA);
2013-02-12 14:59:39 +01:00
$this -> setOutStructure ( $oA , $out , $obj -> delimiter );
2013-02-12 15:30:58 +01:00
$c ++ ;
2013-02-12 14:01:43 +01:00
}
2013-02-20 17:27:10 +01:00
if ( $_nodeID )
{
$node = self :: findNode ( $out , $_nodeID );
2013-03-05 15:09:35 +01:00
//error_log(__METHOD__.__LINE__.array2string($node));
2013-02-20 17:27:10 +01:00
return $node ;
}
2013-02-12 15:30:58 +01:00
return ( $c ? $out : array ( 'id' => 0 , 'item' => array ( 'text' => 'INBOX' , 'tooltip' => 'INBOX' . ' ' . lang ( '(not connected)' ), 'im0' => 'kfm_home.png' )));
2013-02-12 14:01:43 +01:00
}
2013-02-11 18:05:29 +01:00
2013-02-20 17:27:10 +01:00
/**
* findNode - helper function to return only a branch of the tree
*
* @ param array & $out , out array ( to be processed )
* @ param string $_nodeID , node to search for
* @ param boolean $childElements = true return node itself , or only its child items
* @ return array structured subtree
*/
static function findNode ( $_out , $_nodeID , $childElements = false )
{
foreach ( $_out [ 'item' ] as $node )
{
if ( $node [ 'id' ] == $_nodeID )
{
return ( $childElements ? $node [ 'item' ] : $node );
}
}
}
2013-02-12 15:30:58 +01:00
/**
* setOutStructure - helper function to transform the folderObjectList to dhtmlXTreeObject requirements
*
* @ param array $data , data to be processed
* @ param array & $out , out array
* @ param string $del = '.' , needed as glue for parent / child operation / comparsion
2013-02-12 16:10:50 +01:00
* @ param boolean $createMissingParents = true create a missing parent , instead of throwing an exception
2013-02-12 15:30:58 +01:00
* @ return void
*/
2013-02-12 16:10:50 +01:00
function setOutStructure ( $data , & $out , $del = '.' , $createMissingParents = true )
2013-02-12 14:01:43 +01:00
{
2013-02-12 15:30:58 +01:00
//error_log(__METHOD__."(".array2string($data).', '.array2string($out).", '$del')");
2013-02-12 14:59:39 +01:00
$components = $data [ 'path' ];
array_pop ( $components ); // remove own name
$insert = & $out ;
$parents = array ();
foreach ( $components as $component )
2013-02-12 14:01:43 +01:00
{
2013-02-20 17:27:10 +01:00
if ( count ( $parents ) > 1 )
{
$helper = array_slice ( $parents , 1 , null , true );
$parent = $parents [ 0 ] . self :: $delimiter . implode ( $del , $helper );
if ( $parent ) $parent .= $del ;
}
else
{
$parent = implode ( self :: $delimiter , $parents );
if ( $parent ) $parent .= self :: $delimiter ;
}
2013-02-19 17:30:59 +01:00
if ( ! is_array ( $insert ) || ! isset ( $insert [ 'item' ]))
{
2013-02-20 17:27:10 +01:00
//break;
2013-02-19 17:30:59 +01:00
throw new egw_exception_assertion_failed ( __METHOD__ . ':' . __LINE__ . " id= $data[id] : Parent ' $parent ' ' $component ' not found! out= " . array2string ( $out ));
}
2013-02-12 15:30:58 +01:00
foreach ( $insert [ 'item' ] as & $item )
2013-02-12 14:01:43 +01:00
{
2013-02-12 14:59:39 +01:00
if ( $item [ 'id' ] == $parent . $component )
2013-02-12 14:01:43 +01:00
{
2013-02-12 15:30:58 +01:00
$insert =& $item ;
2013-02-12 14:59:39 +01:00
break ;
2013-02-12 14:01:43 +01:00
}
}
2013-02-12 16:10:50 +01:00
if ( $item [ 'id' ] != $parent . $component )
{
if ( $createMissingParents )
{
unset ( $item );
2013-02-13 15:02:02 +01:00
$item = array ( 'id' => $parent . $component , 'text' => $component , 'im0' => " folderNoSelectClosed.gif " , 'im1' => " folderNoSelectOpen.gif " , 'im2' => " folderNoSelectClosed.gif " , 'tooltip' => '**missing**' );
2013-02-12 16:10:50 +01:00
$insert [ 'item' ][] =& $item ;
$insert =& $item ;
}
else
{
throw new egw_exception_assertion_failed ( __METHOD__ . ':' . __LINE__ . " : id= $data[id] : Parent ' $parent ' ' $component ' not found! " );
}
}
2013-02-12 14:59:39 +01:00
$parents [] = $component ;
2013-02-11 18:05:29 +01:00
}
2013-02-12 14:59:39 +01:00
unset ( $data [ 'path' ]);
$insert [ 'item' ][] = $data ;
2013-02-12 15:30:58 +01:00
//error_log(__METHOD__."() leaving with out=".array2string($out));
2013-02-11 18:05:29 +01:00
}
2013-02-08 20:11:44 +01:00
/**
* Get actions / context menu for index
*
* Changes here , require to log out , as $content [ 'nm' ] get stored in session !
* @ var & $action_links
*
* @ return array see nextmatch_widget :: egw_actions ()
*/
private function get_actions ( array & $action_links = array ())
{
// duplicated from mail_hooks
static $deleteOptions = array (
'move_to_trash' => 'move to trash' ,
'mark_as_deleted' => 'mark as deleted' ,
'remove_immediately' => 'remove immediately' ,
);
// todo: real hierarchical folder list
$folders = array (
'INBOX' => 'INBOX' ,
'Drafts' => 'Drafts' ,
'Sent' => 'Sent' ,
);
$lastFolderUsedForMove = null ;
$moveaction = 'move_' ;
$lastFolderUsedForMoveCont = egw_cache :: getCache ( egw_cache :: INSTANCE , 'email' , 'lastFolderUsedForMove' . trim ( $GLOBALS [ 'egw_info' ][ 'user' ][ 'account_id' ]), null , array (), $expiration = 60 * 60 * 1 );
if ( isset ( $lastFolderUsedForMoveCont [ $this -> mail_bo -> profileID ]))
{
$_folder = $this -> mail_bo -> icServer -> getCurrentMailbox ();
//error_log(__METHOD__.__LINE__.' '.$_folder."<->".$lastFolderUsedForMoveCont[$this->mail_bo->profileID].function_backtrace());
//if ($_folder!=$lastFolderUsedForMoveCont[$this->mail_bo->profileID]) $this->mail_bo->icServer->selectMailbox($lastFolderUsedForMoveCont[$this->mail_bo->profileID]);
if ( $_folder != $lastFolderUsedForMoveCont [ $this -> mail_bo -> profileID ])
{
$lastFolderUsedForMove = $this -> mail_bo -> getFolderStatus ( $lastFolderUsedForMoveCont [ $this -> mail_bo -> profileID ]);
//error_log(array2string($lastFolderUsedForMove));
$moveaction .= $lastFolderUsedForMoveCont [ $this -> mail_bo -> profileID ];
}
//if ($_folder!=$lastFolderUsedForMoveCont[$this->profileID]) $this->mail_bo->icServer->selectMailbox($_folder);
}
$actions = array (
'open' => array (
'caption' => lang ( 'Open' ),
'group' => ++ $group ,
2013-04-09 10:53:25 +02:00
'onExecute' => 'javaScript:app.mail.open' ,
2013-02-08 20:11:44 +01:00
'allowOnMultiple' => false ,
'default' => true ,
),
'reply' => array (
'caption' => 'Reply' ,
'icon' => 'mail_reply' ,
'group' => ++ $group ,
'onExecute' => 'javaScript:mail_compose' ,
'allowOnMultiple' => false ,
),
'reply_all' => array (
'caption' => 'Reply All' ,
'icon' => 'mail_replyall' ,
'group' => $group ,
'onExecute' => 'javaScript:mail_compose' ,
'allowOnMultiple' => false ,
),
'forward' => array (
'caption' => 'Forward' ,
'icon' => 'mail_forward' ,
'group' => $group ,
'children' => array (
'forwardinline' => array (
'caption' => 'forward inline' ,
'icon' => 'mail_forward' ,
'group' => $group ,
'onExecute' => 'javaScript:mail_compose' ,
'allowOnMultiple' => false ,
),
'forwardasattach' => array (
'caption' => 'forward as attachment' ,
'icon' => 'mail_forward' ,
'group' => $group ,
'onExecute' => 'javaScript:mail_compose' ,
),
),
),
'composeasnew' => array (
'caption' => 'Compose as new' ,
'icon' => 'new' ,
'group' => $group ,
'onExecute' => 'javaScript:mail_compose' ,
'allowOnMultiple' => false ,
),
$moveaction => array (
'caption' => lang ( 'Move selected to' ) . ': ' . ( isset ( $lastFolderUsedForMove [ 'shortDisplayName' ]) ? $lastFolderUsedForMove [ 'shortDisplayName' ] : '' ),
'icon' => 'move' ,
'group' => ++ $group ,
'onExecute' => 'javaScript:mail_move2folder' ,
'allowOnMultiple' => true ,
),
'infolog' => array (
'caption' => 'InfoLog' ,
'hint' => 'Save as InfoLog' ,
'icon' => 'infolog/navbar' ,
'group' => ++ $group ,
'onExecute' => 'javaScript:mail_infolog' ,
'url' => 'menuaction=infolog.infolog_ui.import_mail' ,
'popup' => egw_link :: get_registry ( 'infolog' , 'add_popup' ),
'allowOnMultiple' => false ,
),
'tracker' => array (
'caption' => 'Tracker' ,
'hint' => 'Save as ticket' ,
'group' => $group ,
'icon' => 'tracker/navbar' ,
'onExecute' => 'javaScript:mail_tracker' ,
'url' => 'menuaction=tracker.tracker_ui.import_mail' ,
'popup' => egw_link :: get_registry ( 'tracker' , 'add_popup' ),
'allowOnMultiple' => false ,
),
'print' => array (
'caption' => 'Print' ,
'group' => ++ $group ,
'onExecute' => 'javaScript:mail_print' ,
'allowOnMultiple' => false ,
),
'save' => array (
'caption' => 'Save' ,
'group' => $group ,
'icon' => 'fileexport' ,
'children' => array (
'save2disk' => array (
'caption' => 'Save message to disk' ,
'hint' => 'Save message to disk' ,
'group' => $group ,
'icon' => 'fileexport' ,
'onExecute' => 'javaScript:mail_save' ,
'allowOnMultiple' => false ,
),
'save2filemanager' => array (
'caption' => 'Save to filemanager' ,
'hint' => 'Save message to filemanager' ,
'group' => $group ,
'icon' => 'filemanager/navbar' ,
'onExecute' => 'javaScript:mail_save2fm' ,
'allowOnMultiple' => false ,
),
),
),
'view' => array (
'caption' => 'View' ,
'group' => $group ,
'icon' => 'kmmsgread' ,
'children' => array (
'header' => array (
'caption' => 'Header lines' ,
'hint' => 'View header lines' ,
'group' => $group ,
'icon' => 'kmmsgread' ,
'onExecute' => 'javaScript:mail_header' ,
'allowOnMultiple' => false ,
),
'mailsource' => array (
'caption' => 'Mail Source' ,
'hint' => 'View full Mail Source' ,
'group' => $group ,
'icon' => 'fileexport' ,
'onExecute' => 'javaScript:mail_mailsource' ,
'allowOnMultiple' => false ,
),
),
),
'mark' => array (
'caption' => 'Mark as' ,
'icon' => 'read_small' ,
'group' => ++ $group ,
'children' => array (
// icons used from http://creativecommons.org/licenses/by-sa/3.0/
// Artist: Led24
// Iconset Homepage: http://led24.de/iconset
// License: CC Attribution 3.0
'setLabel' => array (
'caption' => 'Set Label' ,
'icon' => 'tag_message' ,
'group' => ++ $group ,
'children' => array (
'label1' => array (
'caption' => " <font color='#ff0000'> " . lang ( 'urgent' ) . " </font> " ,
'icon' => 'mail_label1' ,
'onExecute' => 'javaScript:mail_flag' ,
),
'label2' => array (
'caption' => " <font color='#ff8000'> " . lang ( 'job' ) . " </font> " ,
'icon' => 'mail_label2' ,
'onExecute' => 'javaScript:mail_flag' ,
),
'label3' => array (
'caption' => " <font color='#008000'> " . lang ( 'personal' ) . " </font> " ,
'icon' => 'mail_label3' ,
'onExecute' => 'javaScript:mail_flag' ,
),
'label4' => array (
'caption' => " <font color='#0000ff'> " . lang ( 'to do' ) . " </font> " ,
'icon' => 'mail_label4' ,
'onExecute' => 'javaScript:mail_flag' ,
),
'label5' => array (
'caption' => " <font color='#8000ff'> " . lang ( 'later' ) . " </font> " ,
'icon' => 'mail_label5' ,
'onExecute' => 'javaScript:mail_flag' ,
),
),
),
// modified icons from http://creativecommons.org/licenses/by-sa/3.0/
'unsetLabel' => array (
'caption' => 'Remove Label' ,
'icon' => 'untag_message' ,
'group' => ++ $group ,
'children' => array (
'unlabel1' => array (
'caption' => " <font color='#ff0000'> " . lang ( 'urgent' ) . " </font> " ,
'icon' => 'mail_unlabel1' ,
'onExecute' => 'javaScript:mail_flag' ,
),
'unlabel2' => array (
'caption' => " <font color='#ff8000'> " . lang ( 'job' ) . " </font> " ,
'icon' => 'mail_unlabel2' ,
'onExecute' => 'javaScript:mail_flag' ,
),
'unlabel3' => array (
'caption' => " <font color='#008000'> " . lang ( 'personal' ) . " </font> " ,
'icon' => 'mail_unlabel3' ,
'onExecute' => 'javaScript:mail_flag' ,
),
'unlabel4' => array (
'caption' => " <font color='#0000ff'> " . lang ( 'to do' ) . " </font> " ,
'icon' => 'mail_unlabel4' ,
'onExecute' => 'javaScript:mail_flag' ,
),
'unlabel5' => array (
'caption' => " <font color='#8000ff'> " . lang ( 'later' ) . " </font> " ,
'icon' => 'mail_unlabel5' ,
'onExecute' => 'javaScript:mail_flag' ,
),
),
),
'flagged' => array (
'group' => ++ $group ,
'caption' => 'Flagged' ,
'icon' => 'unread_flagged_small' ,
'onExecute' => 'javaScript:mail_flag' ,
//'disableClass' => 'flagged',
//'enabled' => "javaScript:mail_disabledByClass",
'shortcut' => egw_keymanager :: shortcut ( egw_keymanager :: F , true , true ),
),
'unflagged' => array (
'group' => $group ,
'caption' => 'Unflagged' ,
'icon' => 'read_flagged_small' ,
'onExecute' => 'javaScript:mail_flag' ,
//'enableClass' => 'flagged',
//'enabled' => "javaScript:mail_enabledByClass",
'shortcut' => egw_keymanager :: shortcut ( egw_keymanager :: U , true , true ),
),
'read' => array (
'group' => $group ,
'caption' => 'Read' ,
'icon' => 'read_small' ,
'onExecute' => 'javaScript:mail_flag' ,
//'enableClass' => 'unseen',
//'enabled' => "javaScript:mail_enabledByClass",
),
'unread' => array (
'group' => $group ,
'caption' => 'Unread' ,
'icon' => 'unread_small' ,
'onExecute' => 'javaScript:mail_flag' ,
//'disableClass' => 'unseen',
//'enabled' => "javaScript:mail_disabledByClass",
),
'undelete' => array (
'group' => $group ,
'caption' => 'Undelete' ,
'icon' => 'revert' ,
'onExecute' => 'javaScript:mail_flag' ,
'enableClass' => 'deleted' ,
'enabled' => " javaScript:mail_enabledByClass " ,
),
),
),
'delete' => array (
'caption' => 'Delete' ,
'hint' => $deleteOptions [ $this -> mail_bo -> mailPreferences -> preferences [ 'deleteOptions' ]],
'group' => ++ $group ,
'onExecute' => 'javaScript:mail_delete' ,
),
'drag_mail' => array (
'dragType' => 'mail' ,
'type' => 'drag' ,
'onExecute' => 'javaScript:mail_dragStart' ,
),
);
// save as tracker, save as infolog, as this are actions that are either available for all, or not, we do that for all and not via css-class disabling
if ( ! isset ( $GLOBALS [ 'egw_info' ][ 'user' ][ 'apps' ][ 'infolog' ]))
{
unset ( $actions [ 'infolog' ]);
}
if ( ! isset ( $GLOBALS [ 'egw_info' ][ 'user' ][ 'apps' ][ 'tracker' ]))
{
unset ( $actions [ 'tracker' ]);
}
if ( empty ( $lastFolderUsedForMove ))
{
unset ( $actions [ $moveaction ]);
}
// note this one is NOT a real CAPABILITY reported by the server, but added by selectMailbox
if ( ! $this -> mail_bo -> icServer -> hasCapability ( 'SUPPORTS_KEYWORDS' ))
{
unset ( $actions [ 'mark' ][ 'children' ][ 'setLabel' ]);
unset ( $actions [ 'mark' ][ 'children' ][ 'unsetLabel' ]);
}
2013-02-14 18:10:20 +01:00
return $actions ;
2013-02-08 20:11:44 +01:00
}
/**
* Callback to fetch the rows for the nextmatch widget
*
* @ param array $query
* @ param array & $rows
* @ param array & $readonlys
*/
function get_rows ( $query , & $rows , & $readonlys )
{
unset ( $query [ 'actions' ]);
2013-02-12 18:48:04 +01:00
//error_log(__METHOD__.__LINE__.array2string($query));
2013-02-19 17:30:59 +01:00
//error_log(__METHOD__.__LINE__.' SelectedFolder:'.$query['selectedFolder'].' Start:'.$query['start'].' NumRows:'.$query['num_rows']);
2013-02-28 10:28:08 +01:00
//$starttime = microtime(true);
2013-02-12 18:48:04 +01:00
//error_log(__METHOD__.__LINE__.array2string($query['search']));
//$query['search'] is the phrase in the searchbox
2013-02-08 20:11:44 +01:00
//error_log(__METHOD__.__LINE__.' Folder:'.array2string($_folderName).' FolderType:'.$folderType.' RowsFetched:'.array2string($rowsFetched)." these Uids:".array2string($uidOnly).' Headers passed:'.array2string($headers));
$this -> mail_bo -> restoreSessionData ();
$maxMessages = 50 ; // match the hardcoded setting for data retrieval as inital value
2013-02-12 18:48:04 +01:00
$previewMessage = $this -> mail_bo -> sessionData [ 'previewMessage' ];
if ( isset ( $query [ 'selectedFolder' ])) $this -> mail_bo -> sessionData [ 'maibox' ] = $query [ 'selectedFolder' ];
$this -> mail_bo -> saveSessionData ();
2013-02-08 20:11:44 +01:00
$sRToFetch = null ;
2013-02-12 18:48:04 +01:00
$_folderName = $query [ 'selectedFolder' ];
2013-02-20 17:27:10 +01:00
list ( $_profileID , $folderName ) = explode ( self :: $delimiter , $_folderName , 2 );
if ( is_numeric ( $_profileID ))
2013-02-19 17:30:59 +01:00
{
2013-02-20 17:27:10 +01:00
if ( $_profileID && $_profileID != $this -> mail_bo -> profileID )
{
2013-02-28 10:28:08 +01:00
//error_log(__METHOD__.__LINE__.' change Profile to ->'.$_profileID);
2013-02-20 17:27:10 +01:00
$this -> changeProfile ( $_profileID );
}
$_folderName = $folderName ;
2013-02-19 17:30:59 +01:00
}
//save selected Folder to sessionData (mailbox)->currentFolder
if ( isset ( $query [ 'selectedFolder' ])) $this -> mail_bo -> sessionData [ 'maibox' ] = $_folderName ;
$this -> mail_bo -> saveSessionData ();
2013-02-08 20:11:44 +01:00
$rowsFetched [ 'messages' ] = null ;
$offset = $query [ 'start' ] + 1 ; // we always start with 1
$maxMessages = $query [ 'num_rows' ];
$sort = $query [ 'order' ];
$filter = array ();
$reverse = ( $query [ 'order' ] == 'ASC' ? false : true );
//error_log(__METHOD__.__LINE__.' maxMessages:'.$maxMessages.' Offset:'.$offset.' Filter:'.array2string($this->sessionData['messageFilter']));
if ( $maxMessages > 75 )
{
$sR = $this -> mail_bo -> getSortedList (
$_folderName ,
$sort ,
$reverse ,
$filter ,
$rByUid = true
);
$rowsFetched [ 'messages' ] = count ( $sR );
// if $sR is false, something failed fundamentally
if ( $reverse === true ) $sR = ( $sR === false ? array () : array_reverse (( array ) $sR ));
$sR = array_slice (( array ) $sR ,( $offset == 0 ? 0 : $offset - 1 ), $maxMessages ); // we need only $maxMessages of uids
$sRToFetch = $sR ; //array_slice($sR,0,50); // we fetch only the headers of a subset of the fetched uids
//error_log(__METHOD__.__LINE__.' Rows fetched (UID only):'.count($sR).' Data:'.array2string($sR));
$maxMessages = 75 ;
$sortResultwH [ 'header' ] = array ();
if ( count ( $sRToFetch ) > 0 )
{
//error_log(__METHOD__.__LINE__.' Headers to fetch with UIDs:'.count($sRToFetch).' Data:'.array2string($sRToFetch));
$sortResult = array ();
// fetch headers
$sortResultwH = $this -> mail_bo -> getHeaders (
$_folderName ,
$offset ,
$maxMessages ,
$sort ,
$reverse ,
$filter ,
$sRToFetch
);
}
}
else
{
$sortResult = array ();
// fetch headers
$sortResultwH = $this -> mail_bo -> getHeaders (
$_folderName ,
$offset ,
$maxMessages ,
$sort ,
$reverse ,
$filter
);
$rowsFetched [ 'messages' ] = $sortResultwH [ 'info' ][ 'total' ];
}
if ( is_array ( $sR ) && count ( $sR ) > 0 )
{
foreach (( array ) $sR as $key => $v )
{
if ( array_key_exists ( $key ,( array ) $sortResultwH [ 'header' ]) == true )
{
$sortResult [ 'header' ][] = $sortResultwH [ 'header' ][ $key ];
}
else
{
if ( ! empty ( $v )) $sortResult [ 'header' ][] = array ( 'uid' => $v );
}
}
}
else
{
$sortResult = $sortResultwH ;
}
$rowsFetched [ 'rowsFetched' ] = count ( $sortResult [ 'header' ]);
if ( empty ( $rowsFetched [ 'messages' ])) $rowsFetched [ 'messages' ] = $rowsFetched [ 'rowsFetched' ];
//error_log(__METHOD__.__LINE__.' Rows fetched:'.$rowsFetched.' Data:'.array2string($sortResult));
2013-02-19 17:30:59 +01:00
$cols = array ( 'row_id' , 'uid' , 'status' , 'attachments' , 'subject' , 'toaddress' , 'fromaddress' , 'date' , 'size' , 'modified' );
2013-02-08 20:11:44 +01:00
if ( $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'common' ][ 'select_mode' ] == 'EGW_SELECTMODE_TOGGLE' ) unset ( $cols [ 0 ]);
$rows = $this -> header2gridelements ( $sortResult [ 'header' ], $cols , $_folderName , $folderType , $previewMessage );
//error_log(__METHOD__.__LINE__.array2string($rows));
2013-02-28 10:28:08 +01:00
//$endtime = microtime(true) - $starttime;
//error_log(__METHOD__.__LINE__.' SelectedFolder:'.$query['selectedFolder'].' Start:'.$query['start'].' NumRows:'.$query['num_rows'].' Took:'.$endtime);
2013-02-12 18:48:04 +01:00
2013-02-08 20:11:44 +01:00
return $rowsFetched [ 'messages' ];
}
2013-02-19 17:30:59 +01:00
/**
* function createRowID - create a unique rowID for the grid
*
* @ param string $_folderName , used to ensure the uniqueness of the uid over all folders
* @ param string $message_uid , the message_Uid to be used for creating the rowID
* @ return string - a colon separated string in the form accountID : profileID : folder : message_uid
*/
function createRowID ( $_folderName , $message_uid )
{
2013-02-20 17:27:10 +01:00
return trim ( $GLOBALS [ 'egw_info' ][ 'user' ][ 'account_id' ]) . self :: $delimiter . $this -> mail_bo -> profileID . self :: $delimiter . base64_encode ( $_folderName ) . self :: $delimiter . $message_uid ;
2013-02-19 17:30:59 +01:00
}
/**
* function splitRowID - split the rowID into its parts
*
* @ param string $_rowID , string - a colon separated string in the form accountID : profileID : folder : message_uid
* @ return array populated named result array ( accountID , profileID , folder , msgUID )
*/
2013-03-05 15:09:35 +01:00
static function splitRowID ( $_rowID )
2013-02-19 17:30:59 +01:00
{
2013-02-20 17:27:10 +01:00
$res = explode ( self :: $delimiter , $_rowID );
2013-03-05 15:09:35 +01:00
// as a rowID is perceeded by app::, should be mail!
return array ( 'app' => $res [ 0 ], 'accountID' => $res [ 1 ], 'profileID' => $res [ 2 ], 'folder' => base64_decode ( $res [ 3 ]), 'msgUID' => $res [ 4 ]);
2013-02-19 17:30:59 +01:00
}
2013-02-08 20:11:44 +01:00
/**
* function header2gridelements - to populate the grid elements with the collected Data
*
* @ param array $_headers , headerdata to process
* @ param array $cols , cols to populate
* @ param array $_folderName , used to ensure the uniqueness of the uid over all folders
* @ param array $_folderType = 0 , foldertype , used to determine if we need to populate from / to
* @ param array $previewMessage = 0 , the message previewed
* @ return array populated result array
*/
public function header2gridelements ( $_headers , $cols , $_folderName , $_folderType = 0 , $previewMessage = 0 )
{
$timestamp7DaysAgo =
mktime ( date ( " H " ), date ( " i " ), date ( " s " ), date ( " m " ), date ( " d " ) - 7 , date ( " Y " ));
$timestampNow =
mktime ( date ( " H " ), date ( " i " ), date ( " s " ), date ( " m " ), date ( " d " ), date ( " Y " ));
$dateToday = date ( " Y-m-d " );
$rv = array ();
$i = 0 ;
$firstuid = null ;
foreach (( array ) $_headers as $header )
{
$i ++ ;
$data = array ();
//error_log(__METHOD__.array2string($header));
$result = array (
" id " => $header [ 'uid' ],
" group " => " mail " , // activate the action links for mail objects
);
$message_uid = $header [ 'uid' ];
$data [ 'uid' ] = $message_uid ;
2013-02-19 17:30:59 +01:00
$data [ 'row_id' ] = $this -> createRowID ( $_folderName , $message_uid );
2013-02-08 20:11:44 +01:00
//_debug_array($header);
#if($i<10) {$i++;continue;}
#if($i>20) {continue;} $i++;
// create the listing of subjects
$maxSubjectLength = 60 ;
$maxAddressLength = 20 ;
$maxSubjectLengthBold = 50 ;
$maxAddressLengthBold = 14 ;
$flags = " " ;
if ( ! empty ( $header [ 'recent' ])) $flags .= " R " ;
if ( ! empty ( $header [ 'flagged' ])) $flags .= " F " ;
if ( ! empty ( $header [ 'answered' ])) $flags .= " A " ;
if ( ! empty ( $header [ 'forwarded' ])) $flags .= " W " ;
if ( ! empty ( $header [ 'deleted' ])) $flags .= " D " ;
if ( ! empty ( $header [ 'seen' ])) $flags .= " S " ;
if ( ! empty ( $header [ 'label1' ])) $flags .= " 1 " ;
if ( ! empty ( $header [ 'label2' ])) $flags .= " 2 " ;
if ( ! empty ( $header [ 'label3' ])) $flags .= " 3 " ;
if ( ! empty ( $header [ 'label4' ])) $flags .= " 4 " ;
if ( ! empty ( $header [ 'label5' ])) $flags .= " 5 " ;
$data [ " status " ] = " <span class= \" status_img \" ></span> " ;
//error_log(__METHOD__.array2string($header).' Flags:'.$flags);
// the css for this row
$is_recent = false ;
$css_styles = array ( " mail " );
if ( $header [ 'deleted' ]) {
$css_styles [] = 'deleted' ;
}
if ( $header [ 'recent' ] && ! ( $header [ 'deleted' ] || $header [ 'seen' ] || $header [ 'answered' ] || $header [ 'forwarded' ])) {
$css_styles [] = 'recent' ;
$is_recent = true ;
}
if ( $header [ 'priority' ] < 3 ) {
$css_styles [] = 'prio_high' ;
}
if ( $header [ 'flagged' ]) {
$css_styles [] = 'flagged' ;
/*
if ( ! $header [ 'seen' ])
{
$css_styles [] = 'flagged_unseen' ;
}
else
{
$css_styles [] = 'flagged_seen' ;
}
*/
}
if ( ! $header [ 'seen' ]) {
$css_styles [] = 'unseen' ; // different status image for recent // solved via css !important
}
if ( $header [ 'answered' ]) {
$css_styles [] = 'replied' ;
}
if ( $header [ 'forwarded' ]) {
$css_styles [] = 'forwarded' ;
}
if ( $header [ 'label1' ]) {
2013-02-19 17:30:59 +01:00
$css_styles [] = 'labelone' ;
2013-02-08 20:11:44 +01:00
}
if ( $header [ 'label2' ]) {
2013-02-19 17:30:59 +01:00
$css_styles [] = 'labeltwo' ;
2013-02-08 20:11:44 +01:00
}
if ( $header [ 'label3' ]) {
2013-02-19 17:30:59 +01:00
$css_styles [] = 'labelthree' ;
2013-02-08 20:11:44 +01:00
}
if ( $header [ 'label4' ]) {
2013-02-19 17:30:59 +01:00
$css_styles [] = 'labelfour' ;
2013-02-08 20:11:44 +01:00
}
if ( $header [ 'label5' ]) {
2013-02-19 17:30:59 +01:00
$css_styles [] = 'labelfive' ;
2013-02-08 20:11:44 +01:00
}
//error_log(__METHOD__.array2string($css_styles));
//if (in_array("check", $cols))
// don't overwrite check with "false" as this forces the grid to
// deselect the row - sending "0" doesn't do that
2013-02-14 18:10:20 +01:00
//if (in_array("check", $cols)) $data["check"] = $previewMessage == $header['uid'] ? true : 0;// $row_selected; //TODO:checkbox true or false
2013-02-08 20:11:44 +01:00
//$data["check"] ='<input style="width:12px; height:12px; border: none; margin: 1px;" class="{row_css_class}" type="checkbox" id="msgSelectInput" name="msg[]" value="'.$message_uid.'"
// onclick="toggleFolderRadio(this, refreshTimeOut)">';
if ( in_array ( " subject " , $cols ))
{
// filter out undisplayable characters
$search = array ( '[\016]' , '[\017]' ,
'[\020]' , '[\021]' , '[\022]' , '[\023]' , '[\024]' , '[\025]' , '[\026]' , '[\027]' ,
'[\030]' , '[\031]' , '[\032]' , '[\033]' , '[\034]' , '[\035]' , '[\036]' , '[\037]' );
$replace = '' ;
$header [ 'subject' ] = preg_replace ( $search , $replace , $header [ 'subject' ]);
$headerSubject = $header [ 'subject' ]; //mail_bo::htmlentities($header['subject'],$this->charset);
$header [ 'subject' ] = $headerSubject ;
// curly brackets get messed up by the template!
$header [ 'subject' ] = str_replace ( array ( '{' , '}' ), array ( '{' , '}' ), $header [ 'subject' ]);
if ( ! empty ( $header [ 'subject' ])) {
// make the subject shorter if it is to long
$fullSubject = $header [ 'subject' ];
$subject = $header [ 'subject' ];
#$this->t->set_var('attachments', $header['attachment']);
} else {
$subject = @ htmlspecialchars ( '(' . lang ( 'no subject' ) . ')' , ENT_QUOTES , $this -> charset );
}
2013-02-19 17:30:59 +01:00
$data [ " subject " ] = $subject ; // the mailsubject
2013-02-08 20:11:44 +01:00
}
//_debug_array($header);
if ( in_array ( " attachments " , $cols ))
{
if ( $header [ 'mimetype' ] == 'multipart/mixed' ||
$header [ 'mimetype' ] == 'multipart/signed' ||
$header [ 'mimetype' ] == 'multipart/related' ||
$header [ 'mimetype' ] == 'multipart/report' ||
$header [ 'mimetype' ] == 'text/calendar' ||
$header [ 'mimetype' ] == 'text/html' ||
substr ( $header [ 'mimetype' ], 0 , 11 ) == 'application' ||
substr ( $header [ 'mimetype' ], 0 , 5 ) == 'audio' ||
substr ( $header [ 'mimetype' ], 0 , 5 ) == 'video' ||
$header [ 'mimetype' ] == 'multipart/alternative' )
{
$linkDataAttachments = array (
'menuaction' => 'mail.uidisplay.displayAttachments' ,
'showHeader' => 'false' ,
'mailbox' => base64_encode ( $_folderName ),
'uid' => $header [ 'uid' ],
'id' => $header [ 'id' ],
);
$windowName = 'displayMessage_' . $header [ 'uid' ];
$image = html :: image ( 'mail' , 'attach' );
if ( //$header['mimetype'] != 'multipart/mixed' &&
$header [ 'mimetype' ] != 'multipart/signed'
)
{
if ( $this -> mail_bo -> icServer -> _connected != 1 )
{
$this -> mail_bo -> openConnection ( $this -> profileID ); // connect to the current server
$this -> mail_bo -> reopen ( $_folderName );
}
2013-02-19 17:30:59 +01:00
$attachments = $this -> mail_bo -> getMessageAttachments ( $header [ 'uid' ], $_partID = '' , $_structure = '' , $fetchEmbeddedImages = true , $fetchTextCalendar = false , $resolveTNEF = false );
2013-02-08 20:11:44 +01:00
if ( count ( $attachments ) < 1 ) $image = ' ' ;
}
if ( count ( $attachments ) > 0 ) $image = " <a name= \" subject_url \" href= \" # \"
onclick = \ " fm_handleAttachmentClick(false,' " . $GLOBALS [ 'egw' ] -> link ( '/index.php' , $linkDataAttachments ) . " ', ' " . $windowName . " ', this); return false; \"
title = \ " " . $header [ 'subject' ] . " \" > " . $image . " </a> " ;
$attachmentFlag = $image ;
} else {
$attachmentFlag = ' ' ;
}
// show priority flag
if ( $header [ 'priority' ] < 3 ) {
$image = html :: image ( 'mail' , 'prio_high' );
} elseif ( $header [ 'priority' ] > 3 ) {
$image = html :: image ( 'mail' , 'prio_low' );
} else {
$image = '' ;
}
// show a flag for flagged messages
$imageflagged = '' ;
if ( $header [ 'flagged' ])
{
$imageflagged = html :: image ( 'mail' , 'unread_flagged_small' );
}
$data [ " attachments " ] = $image . $attachmentFlag . $imageflagged ; // icon for attachments available
}
// sent or draft or template folder -> to address
if ( in_array ( " toaddress " , $cols ))
{
if ( ! empty ( $header [ 'to_name' ])) {
list ( $mailbox , $host ) = explode ( '@' , $header [ 'to_address' ]);
$senderAddress = imap_rfc822_write_address ( $mailbox ,
$host ,
$header [ 'to_name' ]);
} else {
$senderAddress = $header [ 'to_address' ];
}
$linkData = array
(
'menuaction' => 'mail.uicompose.compose' ,
'send_to' => base64_encode ( $senderAddress )
);
$windowName = 'compose_' . $header [ 'uid' ];
// sent or drafts or template folder means foldertype > 0, use to address instead of from
$header2add = $header [ 'to_address' ]; //mail_bo::htmlentities($header['to_address'],$this->charset);
$header [ 'to_address' ] = $header2add ;
if ( ! empty ( $header [ 'to_name' ])) {
$header2name = $header [ 'to_name' ]; //mail_bo::htmlentities($header['to_name'],$this->charset);
$header [ 'to_name' ] = $header2name ;
$sender_name = $header [ 'to_name' ];
$full_address = $header [ 'to_name' ] . ' <' . $header [ 'to_address' ] . '>' ;
} else {
$sender_name = $header [ 'to_address' ];
$full_address = $header [ 'to_address' ];
}
//$data["toaddress"] = "<nobr><a href=\"#\" onclick=\"fm_handleComposeClick(false,'".$GLOBALS['egw']->link('/index.php',$linkData)."', '".$windowName."', this); return false;\" title=\"".@htmlspecialchars($full_address, ENT_QUOTES | ENT_IGNORE, $this->charset,false)."\">".@htmlspecialchars($sender_name, ENT_QUOTES | ENT_IGNORE, $this->charset,false)."</a></nobr>";
$data [ " toaddress " ] = $full_address ;
}
//fromaddress
if ( in_array ( " fromaddress " , $cols ))
{
$header2add = $header [ 'sender_address' ]; //mail_bo::htmlentities($header['sender_address'],$this->charset);
$header [ 'sender_address' ] = $header2add ;
if ( ! empty ( $header [ 'sender_name' ])) {
$header2name = $header [ 'sender_name' ]; //mail_bo::htmlentities($header['sender_name'],$this->charset);
$header [ 'sender_name' ] = $header2name ;
$sender_name = $header [ 'sender_name' ];
$full_address = $header [ 'sender_name' ] . ' <' . $header [ 'sender_address' ] . '>' ;
} else {
$sender_name = $header [ 'sender_address' ];
$full_address = $header [ 'sender_address' ];
}
if ( ! empty ( $header [ 'sender_name' ])) {
list ( $mailbox , $host ) = explode ( '@' , $header [ 'sender_address' ]);
$senderAddress = imap_rfc822_write_address ( $mailbox ,
$host ,
$header [ 'sender_name' ]);
} else {
$senderAddress = $header [ 'sender_address' ];
}
/*
$linkData = array
(
'menuaction' => 'mail.uicompose.compose' ,
'send_to' => base64_encode ( $senderAddress )
);
$windowName = 'compose_' . $header [ 'uid' ];
$data [ " fromaddress " ] = " <nobr><a href= \" # \" onclick= \" fm_handleComposeClick(false,' " . $GLOBALS [ 'egw' ] -> link ( '/index.php' , $linkData ) . " ', ' " . $windowName . " ', this); return false; \" title= \" " .@ htmlspecialchars ( $full_address , ENT_QUOTES | ENT_IGNORE , $this -> charset , false ) . " \" > " .@ htmlspecialchars ( $sender_name , ENT_QUOTES | ENT_IGNORE , $this -> charset , false ) . " </a></nobr> " ;
*/
$data [ " fromaddress " ] = $full_address ;
}
if ( in_array ( " date " , $cols ))
{
/*
if ( $dateToday == mail_bo :: _strtotime ( $header [ 'date' ], 'Y-m-d' )) {
$dateShort = mail_bo :: _strtotime ( $header [ 'date' ],( $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'common' ][ 'timeformat' ] == 12 ? 'h:i:s a' : 'H:i:s' ));
} else {
$dateShort = mail_bo :: _strtotime ( $header [ 'date' ], str_replace ( 'Y' , 'y' , $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'common' ][ 'dateformat' ]) . ' ' .
( $GLOBALS [ 'egw_info' ][ 'user' ][ 'preferences' ][ 'common' ][ 'timeformat' ] == 12 ? 'h:i a' : 'H:i' ));
}
*/
$data [ " date " ] = $header [ 'date' ]; //$dateShort;//'<nobr><span style="font-size:10px" title="'.$dateLong.'">'.$dateShort.'</span></nobr>';
}
2013-02-11 14:04:49 +01:00
if ( in_array ( " modified " , $cols ))
{
$data [ " modified " ] = $header [ 'internaldate' ];
}
2013-02-08 20:11:44 +01:00
if ( in_array ( " size " , $cols ))
2013-02-12 15:30:58 +01:00
$data [ " size " ] = $header [ 'size' ]; /// size
2013-02-08 20:11:44 +01:00
/*
//TODO: url_add_to_addressbook isn't in any of the templates.
//If you want to use it, you need to adopt syntax to the new addressbook (popup)
$this -> t -> set_var ( 'url_add_to_addressbook' , $GLOBALS [ 'egw' ] -> link ( '/index.php' , $linkData ));
*/
//$this->t->set_var('msg_icon_sm',$msg_icon_sm);
//$this->t->set_var('phpgw_images',EGW_IMAGES);
//$result["data"] = $data;
2013-02-14 18:10:20 +01:00
$data [ " class " ] = implode ( ' ' , $css_styles );
2013-02-08 20:11:44 +01:00
$rv [] = $data ;
//error_log(__METHOD__.__LINE__.array2string($result));
}
return $rv ;
}
2013-02-28 10:28:08 +01:00
/**
* display messages header lines
*
* all params are passed as GET Parameters
*/
function displayHeader ()
{
if ( isset ( $_GET [ 'id' ])) $rowID = $_GET [ 'id' ];
if ( isset ( $_GET [ 'part' ])) $partID = $_GET [ 'part' ];
2013-03-05 15:09:35 +01:00
$hA = self :: splitRowID ( $rowID );
2013-02-28 10:28:08 +01:00
$uid = $hA [ 'msgUID' ];
$mailbox = $hA [ 'folder' ];
//$transformdate =& CreateObject('felamimail.transformdate');
//$htmlFilter =& CreateObject('felamimail.htmlfilter');
//$uiWidgets =& CreateObject('felamimail.uiwidgets');
$this -> mail_bo -> reopen ( $mailbox );
$rawheaders = $this -> mail_bo -> getMessageRawHeader ( $uid , $partID );
$webserverURL = $GLOBALS [ 'egw_info' ][ 'server' ][ 'webserver_url' ];
#$nonDisplayAbleCharacters = array('[\016]','[\017]',
# '[\020]','[\021]','[\022]','[\023]','[\024]','[\025]','[\026]','[\027]',
# '[\030]','[\031]','[\032]','[\033]','[\034]','[\035]','[\036]','[\037]');
#print "<pre>";print_r($rawheaders);print"</pre>";exit;
// add line breaks to $rawheaders
$newRawHeaders = explode ( " \n " , $rawheaders );
reset ( $newRawHeaders );
// reset $rawheaders
$rawheaders = " " ;
// create it new, with good line breaks
reset ( $newRawHeaders );
while ( list ( $key , $value ) = @ each ( $newRawHeaders )) {
$rawheaders .= wordwrap ( $value , 90 , " \n " );
}
$this -> mail_bo -> closeConnection ();
header ( 'Content-type: text/html; charset=iso-8859-1' );
print '<pre>' . htmlspecialchars ( $rawheaders , ENT_NOQUOTES , 'iso-8859-1' ) . '</pre>' ;
}
/**
* save messages on disk or filemanager , or display it in popup
*
* all params are passed as GET Parameters
*/
function saveMessage ()
{
$display = false ;
if ( isset ( $_GET [ 'id' ])) $rowID = $_GET [ 'id' ];
if ( isset ( $_GET [ 'part' ])) $partID = $_GET [ 'part' ];
if ( isset ( $_GET [ 'location' ]) && ( $_GET [ 'location' ] == 'display' || $_GET [ 'location' ] == 'filemanager' )) $display = $_GET [ 'location' ];
2013-03-05 15:09:35 +01:00
$hA = self :: splitRowID ( $rowID );
2013-02-28 10:28:08 +01:00
$uid = $hA [ 'msgUID' ];
$mailbox = $hA [ 'folder' ];
$this -> mail_bo -> reopen ( $mailbox );
$message = $this -> mail_bo -> getMessageRawBody ( $uid , $partID );
$headers = $this -> mail_bo -> getMessageHeader ( $uid , $partID );
$this -> mail_bo -> closeConnection ();
$GLOBALS [ 'egw' ] -> session -> commit_session ();
if ( $display == false )
{
$subject = str_replace ( '$$' , '__' , mail_bo :: decode_header ( $headers [ 'SUBJECT' ]));
header ( " Content-Type: message/rfc822; name= \" " . $subject . " .eml \" " );
header ( " Content-Disposition: attachment; filename= \" " . $subject . " .eml \" " );
header ( " Expires: 0 " );
// the next headers are for IE and SSL
header ( " Cache-Control: must-revalidate, post-check=0, pre-check=0 " );
header ( " Pragma: public " );
echo $message ;
$GLOBALS [ 'egw' ] -> common -> egw_exit ();
exit ;
}
//elseif ($display=='filemanager') // done in vfsSaveMessage
//{
//}
else
{
header ( 'Content-type: text/html; charset=iso-8859-1' );
print '<pre>' . htmlspecialchars ( $message , ENT_NOQUOTES , 'iso-8859-1' ) . '</pre>' ;
}
}
2013-03-05 15:09:35 +01:00
/**
* Save an Message in the vfs
*
* @ param string | array $ids use splitRowID , to separate values
* @ param string $path path in vfs ( no egw_vfs :: PREFIX ! ), only directory for multiple id ' s ( $ids is an array )
* @ return string javascript eg . to close the selector window
*/
function vfsSaveMessage ( $ids , $path )
{
return " alert(' " . __METHOD__ . '("' . array2string ( $id ) . '","' . $path . " \" )'); window.close(); " ;
/*
if ( is_array ( $ids ) && ! egw_vfs :: is_writable ( $path ) || ! is_array ( $ids ) && ! egw_vfs :: is_writable ( dirname ( $path )))
{
return 'alert("' . addslashes ( lang ( '%1 is NOT writable by you!' , $path )) . '"); window.close();' ;
}
foreach (( array ) $ids as $id )
{
$hA = self :: splitRowID ( $id );
$uid = $hA [ 'msgUID' ];
$mailbox = $hA [ 'folder' ];
if ( $mb != $this -> mail_bo -> mailbox ) $this -> mail_bo -> reopen ( $mb = $mailbox );
$message = $this -> mail_bo -> getMessageRawBody ( $uid , $partID = '' );
if ( ! ( $fp = egw_vfs :: fopen ( $file = $path . ( $name ? '/' . $name : '' ), 'wb' )) ||
! fwrite ( $fp , $message ))
{
$err .= 'alert("' . addslashes ( lang ( 'Error saving %1!' , $file )) . '");' ;
}
if ( $fp ) fclose ( $fp );
}
$this -> mail_bo -> closeConnection ();
return $err . 'window.close();' ;
*/
}
2013-02-19 17:30:59 +01:00
/**
* getFolderStatus - its called via json , so the function must start with ajax ( or the class - name must contain ajax )
* gets the counters and sets the text of a treenode if needed ( unread Messages found )
* @ return nothing
*/
function ajax_setFolderStatus ( $_folder )
{
//error_log(__METHOD__.__LINE__.array2string($_folder));
if ( $_folder )
{
$del = $this -> mail_bo -> getHierarchyDelimiter ( false );
$oA = array ();
foreach ( $_folder as $_folderName )
{
2013-02-20 17:27:10 +01:00
list ( $profileID , $folderName ) = explode ( self :: $delimiter , $_folderName , 2 );
if ( is_numeric ( $profileID ))
2013-02-19 17:30:59 +01:00
{
2013-02-20 17:27:10 +01:00
if ( $profileID != $this -> mail_bo -> profileID ) continue ; // only current connection
2013-02-19 17:30:59 +01:00
if ( $folderName )
{
$fS = $this -> mail_bo -> getFolderStatus ( $folderName , false );
//error_log(__METHOD__.__LINE__.array2string($fS));
if ( $fS [ 'unseen' ])
{
$oA [ $_folderName ] = '<b>' . $fS [ 'shortDisplayName' ] . ' (' . $fS [ 'unseen' ] . ')</b>' ;
}
}
}
}
//error_log(__METHOD__.__LINE__.array2string($oA));
if ( $oA )
{
$response = egw_json_response :: get ();
$response -> call ( 'mail_setFolderStatus' , $oA , 'mail' );
}
}
}
2013-02-20 12:31:57 +01:00
/**
* empty changeProfile - its called via json , so the function must start with ajax ( or the class - name must contain ajax )
*
* @ return nothing
*/
function ajax_changeProfile ( $icServerID )
{
2013-02-20 17:27:10 +01:00
if ( $icServerID && $icServerID != $this -> mail_bo -> profileID )
2013-02-28 10:28:08 +01:00
//error_log(__METHOD__.__LINE__.' change Profile to ->'.$icServerID);
2013-02-20 12:31:57 +01:00
$this -> changeProfile ( $icServerID );
$response = egw_json_response :: get ();
$response -> call ( 'egw_refresh' , lang ( 'changed profile' ), 'mail' );
}
2013-02-12 18:48:04 +01:00
/**
* empty trash folder - its called via json , so the function must start with ajax ( or the class - name must contain ajax )
*
* @ return nothing
*/
function ajax_emptyTrash ()
{
$trashFolder = $this -> mail_bo -> getTrashFolder ();
if ( ! empty ( $trashFolder )) {
$this -> mail_bo -> compressFolder ( $trashFolder );
}
$response = egw_json_response :: get ();
2013-02-13 15:02:02 +01:00
$response -> call ( 'egw_refresh' , lang ( 'empty trash' ), 'mail' );
2013-02-12 18:48:04 +01:00
}
2013-02-13 16:35:12 +01:00
/**
* compress folder - its called via json , so the function must start with ajax ( or the class - name must contain ajax )
* fetches the current folder from session and compresses it
* @ return nothing
*/
function ajax_compressFolder ()
{
$this -> mail_bo -> restoreSessionData ();
$folder = $this -> mail_bo -> sessionData [ 'maibox' ];
if ( $this -> mail_bo -> folderExists ( $folder ))
{
if ( ! empty ( $folder )) {
$this -> mail_bo -> compressFolder ( $folder );
}
$response = egw_json_response :: get ();
$response -> call ( 'egw_refresh' , lang ( 'compress folder' ) . ': ' . $folder , 'mail' );
}
}
2013-02-19 17:30:59 +01:00
/**
* flag messages as read , unread , flagged , ...
*
* @ param string _flag name of the flag
* @ param array _messageList list of UID ' s
*
* @ return xajax response
*/
function ajax_flagMessages ( $_flag , $_messageList )
{
2013-02-28 10:28:08 +01:00
if ( mail_bo :: $debug ) error_log ( __METHOD__ . " -> " . $_flag . ':' . print_r ( $_messageList , true ));
2013-02-19 17:30:59 +01:00
if ( $_messageList == 'all' || ! empty ( $_messageList [ 'msg' ]))
{
if ( $_messageList == 'all' )
{
// we have no folder information
$folder = null ;
}
else
{
2013-03-05 15:09:35 +01:00
$uidA = self :: splitRowID ( $_messageList [ 'msg' ][ 0 ]);
2013-02-19 17:30:59 +01:00
$folder = $uidA [ 'folder' ]; // all messages in one set are supposed to be within the same folder
}
foreach ( $_messageList [ 'msg' ] as $rowID )
{
2013-03-05 15:09:35 +01:00
$hA = self :: splitRowID ( $rowID );
2013-02-19 17:30:59 +01:00
$messageList [] = $hA [ 'msgUID' ];
}
$this -> mail_bo -> flagMessages ( $_flag , ( $_messageList == 'all' ? 'all' : $messageList ), $folder );
}
else
{
2013-02-28 10:28:08 +01:00
if ( mail_bo :: $debug ) error_log ( __METHOD__ . " -> No messages selected. " );
2013-02-19 17:30:59 +01:00
}
// unset preview, as refresh would mark message again read
/*
if ( $_flag == 'unread' && in_array ( $this -> sessionData [ 'previewMessage' ], $_messageList [ 'msg' ]))
{
unset ( $this -> sessionData [ 'previewMessage' ]);
$this -> saveSessionData ();
}
*/
$response = egw_json_response :: get ();
$response -> call ( 'egw_refresh' , lang ( 'flagged %1 messages as %2 in %3' , count ( $_messageList [ 'msg' ]), $_flag , $folder ), 'mail' );
}
2013-02-28 10:28:08 +01:00
/**
* delete messages
*
* @ param array _messageList list of UID ' s
*
* @ return xajax response
*/
function ajax_deleteMessages ( $_messageList )
{
if ( mail_bo :: $debug ) error_log ( __METHOD__ . " -> " . $_flag . ':' . print_r ( $_messageList , true ));
if ( $_messageList == 'all' || ! empty ( $_messageList [ 'msg' ]))
{
if ( $_messageList == 'all' )
{
// we have no folder information
$folder = null ;
}
else
{
2013-03-05 15:09:35 +01:00
$uidA = self :: splitRowID ( $_messageList [ 'msg' ][ 0 ]);
2013-02-28 10:28:08 +01:00
$folder = $uidA [ 'folder' ]; // all messages in one set are supposed to be within the same folder
}
foreach ( $_messageList [ 'msg' ] as $rowID )
{
2013-03-05 15:09:35 +01:00
$hA = self :: splitRowID ( $rowID );
2013-02-28 10:28:08 +01:00
$messageList [] = $hA [ 'msgUID' ];
}
$this -> mail_bo -> deleteMessages (( $_messageList == 'all' ? 'all' : $messageList ), $folder );
}
else
{
if ( mail_bo :: $debug ) error_log ( __METHOD__ . " -> No messages selected. " );
}
$response = egw_json_response :: get ();
$response -> call ( 'egw_refresh' , lang ( 'deleted %1 messages in %2' , count ( $_messageList [ 'msg' ]), $folder ), 'mail' );
}
2013-02-08 20:11:44 +01:00
}