2013-02-12 18:48:04 +01:00
/ * *
* mail - static javaScript functions
*
* @ link http : //www.egroupware.org
* @ author klaus leithoff < kl at stylite . de >
* @ package mail
* @ license http : //opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @ version $Id$
* /
2013-04-13 12:30:07 +02:00
app . mail = AppJS . extend (
2013-02-19 17:30:59 +01:00
{
2013-04-13 12:30:07 +02:00
appname : 'mail' ,
2013-08-21 12:47:20 +02:00
2013-06-12 13:50:30 +02:00
/ * *
* et2 widget container
* /
et2 : null ,
2013-04-13 12:30:07 +02:00
doStatus : null ,
mail _doTimedRefresh : false ,
2013-07-25 17:35:44 +02:00
2013-04-13 12:30:07 +02:00
mail _refreshTimeOut : 1000 * 60 * 3 , // initial call
mail _queuedFolders : [ ] ,
mail _queuedFoldersIndex : 0 ,
2013-05-21 10:46:54 +02:00
mail _selectedMails : [ ] ,
mail _currentlyFocussed : '' ,
2013-05-29 14:34:33 +02:00
mail _previewAreaActive : true , // we start with the area active
2013-07-25 17:35:44 +02:00
2013-08-21 12:47:20 +02:00
nm _index : 'nm' , // nm nome of index
2013-09-23 10:33:30 +02:00
mail _fileSelectorWindow : null ,
2013-08-21 12:47:20 +02:00
2013-04-13 12:30:07 +02:00
/ * *
* Initialize javascript for this application
2013-07-25 17:35:44 +02:00
*
2013-04-13 12:30:07 +02:00
* @ memberOf app . mail
* /
init : function ( ) {
this . _super . apply ( this , arguments ) ;
window . register _app _refresh ( "mail" , this . app _refresh ) ;
2013-07-25 17:35:44 +02:00
2013-04-13 12:30:07 +02:00
this . mail _startTimerFolderStatusUpdate ( this . mail _refreshTimeOut ) ;
//inital call of refresh folderstatus
var self = this ;
window . setTimeout ( function ( ) { self . mail _refreshFolderStatus . apply ( self ) ; } , 1000 ) ;
} ,
2013-07-25 17:35:44 +02:00
2013-06-12 13:50:30 +02:00
/ * *
* Destructor
* /
destroy : function ( )
{
delete this . et2 ;
// call parent
this . _super . apply ( this , arguments ) ;
} ,
2013-07-25 17:35:44 +02:00
2013-06-12 13:50:30 +02:00
/ * *
* This function is called when the etemplate2 object is loaded
* and ready . If you must store a reference to the et2 object ,
* make sure to clean it up in destroy ( ) .
*
* @ param et2 etemplate2 Newly ready object
* /
et2 _ready : function ( et2 )
{
2013-09-02 17:15:35 +02:00
// call parent; somehow this function is called more often. (twice on a display and compose) why?
2013-06-12 13:50:30 +02:00
this . _super . apply ( this , arguments ) ;
2013-08-09 19:47:53 +02:00
this . et2 _obj = et2 ;
2013-06-12 13:50:30 +02:00
this . et2 = et2 . widgetContainer ;
var isMainView = false ;
2013-06-17 16:25:20 +02:00
var isDisplay = false ;
for ( var t in et2 . templates )
{
2013-09-02 17:15:35 +02:00
//alert(t); // as we iterate through this more than once, ... we separate trigger and action
switch ( t ) {
case 'mail.index' :
isMainView = true ;
break ;
case 'mail.display' :
isDisplay = true ;
break ;
}
2013-06-17 16:25:20 +02:00
}
2013-09-02 17:15:35 +02:00
//alert('action about to go down');
2013-06-12 13:50:30 +02:00
if ( isMainView ) this . mail _disablePreviewArea ( true ) ;
2013-09-02 17:15:35 +02:00
if ( isDisplay )
{
var subject = etemplate2 . getByApplication ( 'mail' ) [ 0 ] . widgetContainer . getWidgetById ( 'mail_displaysubject' ) ;
var body = etemplate2 . getByApplication ( 'mail' ) [ 0 ] . widgetContainer . getWidgetById ( 'mail_displaybody' ) ;
body . node . parentNode . style . top = subject . node . offsetTop + 40 + 'px' ;
2013-09-05 16:52:11 +02:00
var app _registry = egw . link _get _registry ( this . appname ) ;
//console.log(app_registry);
w = 850 ;
if ( typeof app _registry [ 'view' ] != 'undefined' && typeof app _registry [ 'view_popup' ] != 'undefined' )
{
var w _h = app _registry [ 'view_popup' ] . split ( 'x' ) ;
if ( w _h [ 1 ] == 'egw_getWindowOuterHeight()' ) w _h [ 1 ] = ( screen . availHeight > egw _getWindowOuterHeight ( ) ? screen . availHeight : egw _getWindowOuterHeight ( ) ) ;
}
//alert('resizing to'+(w_h[0]?w_h[0]:850)+','+(w_h[1]?w_h[1]:egw_getWindowOuterHeight()));
window . resizeTo ( ( w _h [ 0 ] ? w _h [ 0 ] : 850 ) , ( w _h [ 1 ] ? w _h [ 1 ] : ( screen . availHeight > egw _getWindowOuterHeight ( ) ? screen . availHeight : egw _getWindowOuterHeight ( ) ) ) ) ;
2013-09-02 17:15:35 +02:00
}
2013-06-12 13:50:30 +02:00
} ,
2013-05-21 10:46:54 +02:00
/ * *
* mail _fetchCurrentlyFocussed - implementation to decide wich mail of all the selected ones is the current
2013-07-25 17:35:44 +02:00
*
2013-05-21 10:46:54 +02:00
* @ param _selected array of the selected mails
* @ param _reset bool - tell the function to reset the global vars used
* /
mail _fetchCurrentlyFocussed : function ( _selected , _reset ) {
//console.log("mail_fetchCurrentlyFocussed",_selected, _reset);
// reinitialize the buffer-info on selected mails
if ( _reset == true || typeof _selected == 'undefined' )
{
2013-05-21 14:02:58 +02:00
if ( _reset == true )
{
2013-08-21 12:47:20 +02:00
//var nm = etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById(nm_index);
2013-06-04 17:29:53 +02:00
//if (this.mail_currentlyFocussed!='') nm.refresh([this.mail_currentlyFocussed],'delete');//egw.dataDeleteUID(this.mail_currentlyFocussed);
2013-05-21 14:02:58 +02:00
if ( this . mail _currentlyFocussed != '' ) egw . dataDeleteUID ( this . mail _currentlyFocussed ) ;
for ( var k = 0 ; k < this . mail _selectedMails . length ; k ++ ) egw . dataDeleteUID ( this . mail _selectedMails [ k ] ) ;
2013-06-04 17:29:53 +02:00
//nm.refresh(this.mail_selectedMails,'delete');
2013-05-21 14:02:58 +02:00
}
2013-05-21 10:46:54 +02:00
this . mail _selectedMails = [ ] ;
this . mail _currentlyFocussed = '' ;
return '' ;
}
for ( var k = 0 ; k < _selected . length ; k ++ )
{
if ( jQuery . inArray ( _selected [ k ] , this . mail _selectedMails ) == - 1 )
{
this . mail _currentlyFocussed = _selected [ k ] ;
break ;
}
}
this . mail _selectedMails = _selected ;
return this . mail _currentlyFocussed ;
} ,
2013-04-13 12:30:07 +02:00
/ * *
* mail _open - implementation of the open action
2013-07-25 17:35:44 +02:00
*
2013-04-13 12:30:07 +02:00
* @ param _action
* @ param _senders - the representation of the elements ( s ) the action is to be performed on
2013-07-20 09:23:55 +02:00
* @ param _mode - you may pass the mode . if not given view is used ( tryastext | tryashtml are supported )
2013-04-13 12:30:07 +02:00
* /
2013-07-20 09:23:55 +02:00
mail _open : function ( _action , _senders , _mode ) {
2013-07-17 14:01:01 +02:00
//console.log("mail_open",_action, _senders);
2013-04-13 12:30:07 +02:00
var _id = _senders [ 0 ] . id ;
2013-05-21 10:46:54 +02:00
// reinitialize the buffer-info on selected mails
2013-07-20 09:23:55 +02:00
if ( ! ( _mode == 'tryastext' || _mode == 'tryashtml' || _mode == 'view' ) ) _mode = 'view' ;
2013-05-21 10:46:54 +02:00
this . mail _selectedMails = [ ] ;
this . mail _selectedMails . push ( _id ) ;
this . mail _currentlyFocussed = _id ;
2013-04-13 12:30:07 +02:00
var dataElem = egw . dataGetUIDdata ( _id ) ;
var subject = dataElem . data . subject ;
2013-06-05 16:24:56 +02:00
//alert('Open Message:'+_id+' '+subject);
2013-07-20 09:23:55 +02:00
var h = egw ( ) . open ( _id , 'mail' , 'view' , _mode + '=' + _id . replace ( /=/g , "_" ) ) ;
2013-07-17 14:01:01 +02:00
egw ( h ) . ready ( function ( ) {
h . document . title = subject ;
} ) ;
2013-04-13 12:30:07 +02:00
} ,
2013-07-25 17:35:44 +02:00
2013-05-13 16:42:42 +02:00
/ * *
* Open a single message in html mode
2013-07-25 17:35:44 +02:00
*
2013-05-13 16:42:42 +02:00
* @ param _action
* @ param _elems _elems [ 0 ] . id is the row - id
* /
mail _openAsHtml : function ( _action , _elems )
{
2013-07-20 09:23:55 +02:00
this . mail _open ( _action , _elems , 'tryashtml' ) ;
2013-05-13 16:42:42 +02:00
} ,
/ * *
* Open a single message in plain text mode
2013-07-25 17:35:44 +02:00
*
2013-05-13 16:42:42 +02:00
* @ param _action
* @ param _elems _elems [ 0 ] . id is the row - id
* /
mail _openAsText : function ( _action , _elems )
{
2013-07-20 09:23:55 +02:00
this . mail _open ( _action , _elems , 'tryastext' ) ;
} ,
/ * *
* Compose , reply or forward a message
2013-07-25 17:35:44 +02:00
*
2013-07-20 09:23:55 +02:00
* @ param _action _action . id is 'compose' , 'composeasnew' , 'reply' , 'reply_all' or 'forward' ( forward can be multiple messages )
* @ param _elems _elems [ 0 ] . id is the row - id
* /
mail _compose : function ( _action , _elems )
{
var idsToProcess = '' ;
var multipleIds = false ;
var url = window . egw _webserverUrl + '/index.php?' ;
if ( typeof _elems == 'undefined' )
2013-05-13 16:42:42 +02:00
{
2013-07-20 09:23:55 +02:00
var h = egw ( ) . open ( '' , 'mail' , 'add' ) ;
return true ;
2013-05-13 16:42:42 +02:00
}
2013-07-20 09:23:55 +02:00
if ( _elems . length > 1 ) multipleIds = true ;
//for (var i=0; i<_elems.length; i++)
//{
// if (i>0) idsToProcess += ',';
// idsToProcess += _elems[i].id;
//}
//alert('mail_'+_action.id+'('+idsToProcess+')');
if ( _action . id == 'compose' )
{
if ( multipleIds == false )
{
if ( _elems . length == 1 ) mail _parentRefreshListRowStyle ( _elems [ 0 ] . id , _elems [ 0 ] . id ) ;
url += 'menuaction=mail.mail_compose.compose' ;
this . mail _openComposeWindow ( url )
}
else
{
this . mail _compose ( 'forward' , _elems ) ;
}
}
if ( _action . id == 'composefromdraft' )
{
url += 'menuaction=mail.mail_compose.composeFromDraft' ;
url += '&id=' + _elems [ 0 ] . id ;
egw _openWindowCentered ( url , 'composeasnew_' + _elems [ 0 ] . id , 700 , egw _getWindowOuterHeight ( ) ) ;
}
if ( _action . id == 'composeasnew' )
{
url += 'menuaction=mail.mail_compose.composeAsNew' ;
url += '&reply_id=' + _elems [ 0 ] . id ;
egw _openWindowCentered ( url , 'composeasnew_' + _elems [ 0 ] . id , 700 , egw _getWindowOuterHeight ( ) ) ;
}
if ( _action . id == 'reply' )
{
url += 'menuaction=mail.mail_compose.reply' ;
url += '&reply_id=' + _elems [ 0 ] . id ;
egw _openWindowCentered ( url , 'reply_' + _elems [ 0 ] . id , 700 , egw _getWindowOuterHeight ( ) ) ;
}
if ( _action . id == 'reply_all' )
{
url += 'menuaction=mail.mail_compose.replyAll' ;
url += '&reply_id=' + _elems [ 0 ] . id ;
egw _openWindowCentered ( url , 'replyAll_' + _elems [ 0 ] . id , 700 , egw _getWindowOuterHeight ( ) ) ;
}
if ( _action . id == 'forward' || _action . id == 'forwardinline' || _action . id == 'forwardasattach' )
2013-05-13 16:42:42 +02:00
{
2013-07-20 09:23:55 +02:00
if ( multipleIds || _action . id == 'forwardasattach' )
{
url += 'menuaction=mail.mail_compose.compose' ;
mail _openComposeWindow ( url , _action . id == 'forwardasattach' ) ;
}
else
{
url += 'menuaction=mail.mail_compose.forward' ;
url += '&reply_id=' + _elems [ 0 ] . id ;
url += '&mode=forwardinline' ;
egw _openWindowCentered ( url , 'forward_' + _elems [ 0 ] . id , 700 , egw _getWindowOuterHeight ( ) ) ;
}
}
} ,
2013-05-13 16:42:42 +02:00
2013-08-21 12:47:20 +02:00
/ * *
* Compose , reply or forward a message
*
* @ param _action _action . id is 'compose' , 'composeasnew' , 'reply' , 'reply_all' or 'forward' ( forward can be multiple messages )
* @ param _elems _elems [ 0 ] . id is the row - id
* /
mail _testhtmlarea : function ( _action , _elems )
{
var url = window . egw _webserverUrl + '/index.php?' ;
url += 'menuaction=mail.mail_compose.testhtmlarea' ;
egw _openWindowCentered ( url ) ;
} ,
2013-07-20 09:23:55 +02:00
/ * *
* Compose , reply or forward a message
2013-07-25 17:35:44 +02:00
*
2013-07-20 09:23:55 +02:00
* @ param _url url to open
* @ param forwardByCompose boolean to decide about the method
* /
mail _openComposeWindow : function ( _url , forwardByCompose , _elems ) {
var Check = true ;
var alreadyAsked = false ;
var _messageList ;
var sMessageList = '' ;
//var cbAllMessages = document.getElementById('selectAllMessagesCheckBox').checked;
// check if mailgrid exists, before accessing it
var cbAllVisibleMessages ;
if ( typeof forwardByCompose == 'undefined' ) forwardByCompose = true ;
if ( forwardByCompose == false )
{
cbAllMessages = cbAllVisibleMessages = Check = false ;
}
if ( typeof prefAskForMultipleForward == 'undefined' ) prefAskForMultipleForward = egw . preference ( 'prefaskformultipleforward' , 'mail' ) ;
if ( cbAllMessages == true || cbAllVisibleMessages == true )
{
Check = confirm ( egw . lang ( 'multiple forward of all mesages' ) ) ;
alreadyAsked = true ;
}
if ( ( cbAllMessages == true || cbAllVisibleMessages == true ) && Check == true )
{
//_messageList = 'all'; // all is not supported by now, only visibly selected messages are chosen
_messageList = this . mail _getFormData ( _elems ) ;
}
else
{
if ( Check == true ) _messageList = this . mail _getFormData ( _elems ) ;
}
if ( typeof _messageList != 'undefined' )
{
for ( var i in _messageList [ 'msg' ] ) {
//alert('eigenschaft:'+_messageList['msg'][i]);
sMessageList = sMessageList + _messageList [ 'msg' ] [ i ] + ',' ;
//sMessageList.concat(',');
}
}
if ( prefAskForMultipleForward == 1 && Check == true && alreadyAsked == false && sMessageList . length > 0 && _messageList [ 'msg' ] . length > 1 )
{
askme = egw . lang ( 'multipleforward' ) ;
//if (cbAllMessages == true || cbAllVisibleMessages == true) askme = egw_appWindow('felamimail').lang_confirm_all_messages; // not supported
Check = confirm ( askme ) ;
}
//alert("Check:"+Check+" MessageList:"+sMessageList+"#");
if ( Check != true ) sMessageList = '' ; // deny the appending off selected messages to new compose -> reset the sMessageList
if ( Check == true || sMessageList == '' )
{
if ( sMessageList . length > 0 ) {
sMessageList = 'AsForward&forwardmails=1&folder=' + activeFolderB64 + '&reply_id=' + sMessageList . substring ( 0 , sMessageList . length - 1 ) ;
}
//alert(sMessageList);
egw _openWindowCentered ( _url + sMessageList , 'compose' , 700 , egw _getWindowOuterHeight ( ) ) ;
2013-05-13 16:42:42 +02:00
}
2013-07-20 09:23:55 +02:00
//ToDo: reset message selection
2013-05-13 16:42:42 +02:00
} ,
2013-05-27 15:48:55 +02:00
/ * *
* mail _disablePreviewArea - implementation of the disablePreviewArea action
2013-07-25 17:35:44 +02:00
*
2013-05-27 15:48:55 +02:00
* @ param _value
* /
mail _disablePreviewArea : function ( _value ) {
var splitter = etemplate2 . getByApplication ( 'mail' ) [ 0 ] . widgetContainer . getWidgetById ( 'mailSplitter' ) ;
2013-06-12 13:50:30 +02:00
if ( typeof splitter == 'undefined' || splitter == null ) return ;
2013-05-29 14:34:33 +02:00
var splitterDN = splitter . getDOMNode ( ) ;
// check if DOM Node has class that contains docked; then we assume the bar docked, whatever our class var states
for ( var i = 0 ; i < splitterDN . childNodes [ 1 ] . classList . length ; i ++ ) if ( splitterDN . childNodes [ 1 ] . classList [ i ] . search ( /docked/ ) >= 0 ) this . mail _previewAreaActive = false ;
2013-05-29 16:19:49 +02:00
//if this.mail_previewAreaActive but clientHeight of childNode is 0, assume this.mail_previewAreaActive incorrect
2013-06-12 13:50:30 +02:00
if ( this . mail _previewAreaActive && splitterDN . childNodes . length > 2 && splitterDN . childNodes [ 2 ] . clientHeight < 15 ) this . mail _previewAreaActive = false ;
2013-05-27 15:48:55 +02:00
//etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('mailPreviewHeadersFrom').set_disabled(_value);
//etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('mailPreviewHeadersTo').set_disabled(_value);
//etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('mailPreviewHeadersDate').set_disabled(_value);
//etemplate2.getByApplication('mail')[0].widgetContainer.getWidgetById('mailPreviewHeadersSubject').set_disabled(_value);
etemplate2 . getByApplication ( 'mail' ) [ 0 ] . widgetContainer . getWidgetById ( 'mailPreview' ) . set _disabled ( _value ) ;
if ( _value == true )
{
2013-05-29 14:34:33 +02:00
if ( this . mail _previewAreaActive ) splitter . dock ( ) ;
this . mail _previewAreaActive = false ;
2013-07-25 17:35:44 +02:00
}
2013-05-27 15:48:55 +02:00
else
{
2013-05-29 14:34:33 +02:00
if ( ! this . mail _previewAreaActive ) splitter . undock ( ) ;
this . mail _previewAreaActive = true ;
2013-05-27 15:48:55 +02:00
}
} ,
2013-04-13 12:30:07 +02:00
/ * *
* mail _preview - implementation of the preview action
2013-07-25 17:35:44 +02:00
*
2013-04-13 12:30:07 +02:00
* @ param nextmatch et2 _nextmatch The widget whose row was selected
* @ param selected Array Selected row IDs . May be empty if user unselected all rows .
* /
mail _preview : function ( nextmatch , selected ) {
2013-07-17 14:01:01 +02:00
//console.log("mail_preview",nextmatch, selected);
2013-04-13 12:30:07 +02:00
// Empty values, just in case selected is empty (user cleared selection)
var dataElem = { data : { subject : "" , fromaddress : "" , toaddress : "" , date : "" , subject : "" } } ;
2013-06-04 17:29:53 +02:00
if ( typeof selected != 'undefined' && selected . length == 1 )
2013-02-19 17:30:59 +01:00
{
2013-05-21 10:46:54 +02:00
var _id = this . mail _fetchCurrentlyFocussed ( selected ) ;
2013-04-13 12:30:07 +02:00
dataElem = egw . dataGetUIDdata ( _id ) ;
2013-02-19 17:30:59 +01:00
}
2013-05-21 14:02:58 +02:00
if ( typeof selected == 'undefined' || selected . length == 0 || selected . length > 1 || typeof dataElem == 'undefined' )
2013-04-13 12:30:07 +02:00
{
2013-05-21 10:46:54 +02:00
this . mail _fetchCurrentlyFocussed ( ) ;
2013-04-30 16:16:52 +02:00
var subject = "" ;
etemplate2 . getByApplication ( 'mail' ) [ 0 ] . widgetContainer . getWidgetById ( 'previewFromAddress' ) . set _value ( "" ) ;
etemplate2 . getByApplication ( 'mail' ) [ 0 ] . widgetContainer . getWidgetById ( 'previewToAddress' ) . set _value ( "" ) ;
etemplate2 . getByApplication ( 'mail' ) [ 0 ] . widgetContainer . getWidgetById ( 'previewDate' ) . set _value ( "" ) ;
etemplate2 . getByApplication ( 'mail' ) [ 0 ] . widgetContainer . getWidgetById ( 'previewSubject' ) . set _value ( "" ) ;
var IframeHandle = etemplate2 . getByApplication ( 'mail' ) [ 0 ] . widgetContainer . getWidgetById ( 'messageIFRAME' ) ;
IframeHandle . set _src ( egw . link ( '/index.php' , { menuaction : 'mail.mail_ui.loadEmailBody' , _messageID : "" } ) ) ;
2013-05-27 15:48:55 +02:00
this . mail _disablePreviewArea ( true ) ;
2013-04-13 12:30:07 +02:00
return ;
}
2013-04-30 16:16:52 +02:00
//console.log("mail_preview",dataElem);
2013-05-21 10:46:54 +02:00
this . mail _selectedMails . push ( _id ) ;
2013-04-13 12:30:07 +02:00
var subject = dataElem . data . subject ;
2013-05-27 15:48:55 +02:00
this . mail _disablePreviewArea ( false ) ;
2013-04-13 12:30:07 +02:00
etemplate2 . getByApplication ( 'mail' ) [ 0 ] . widgetContainer . getWidgetById ( 'previewFromAddress' ) . set _value ( dataElem . data . fromaddress ) ;
etemplate2 . getByApplication ( 'mail' ) [ 0 ] . widgetContainer . getWidgetById ( 'previewToAddress' ) . set _value ( dataElem . data . toaddress ) ;
etemplate2 . getByApplication ( 'mail' ) [ 0 ] . widgetContainer . getWidgetById ( 'previewDate' ) . set _value ( dataElem . data . date ) ;
etemplate2 . getByApplication ( 'mail' ) [ 0 ] . widgetContainer . getWidgetById ( 'previewSubject' ) . set _value ( subject ) ;
var IframeHandle = etemplate2 . getByApplication ( 'mail' ) [ 0 ] . widgetContainer . getWidgetById ( 'messageIFRAME' ) ;
IframeHandle . set _src ( egw . link ( '/index.php' , { menuaction : 'mail.mail_ui.loadEmailBody' , _messageID : _id } ) ) ;
2013-06-05 12:41:38 +02:00
var messages = { } ;
messages [ 'msg' ] = [ _id ] ;
this . mail _removeRowClass ( messages , 'unseen' ) ;
2013-04-13 12:30:07 +02:00
// var request = new egw_json_request('mail.mail_ui.ajax_loadEmailBody',[_id]);
// request.sendRequest(false);
} ,
2013-05-27 15:48:55 +02:00
2013-04-13 12:30:07 +02:00
mail _setMailBody : function ( content ) {
2013-07-17 14:01:01 +02:00
//console.log('mail_setMailBody',content);
2013-04-13 12:30:07 +02:00
var IframeHandle = etemplate2 . getByApplication ( 'mail' ) [ 0 ] . widgetContainer . getWidgetById ( 'messageIFRAME' ) ;
IframeHandle . set _value ( '' ) ;
} ,
2013-07-25 17:35:44 +02:00
2013-04-13 12:30:07 +02:00
/ * *
* mail _startTimerFolderStatusUpdate , timer functions , if the counter changes for the current folder
* refresh the message list
* @ param timeout
* /
mail _startTimerFolderStatusUpdate : function ( _refreshTimeOut ) {
if ( typeof _refreshTimeOut == 'undefined' )
{
var minutes = egw . preference ( 'refreshTime' , 'mail' ) ;
this . mail _refreshTimeOut = _refreshTimeOut = 1000 * 60 * ( minutes ? minutes : 3 ) ; // either the prefs or 3 Minutes
}
if ( this . mail _refreshTimeOut > _refreshTimeOut ) _refreshTimeOut = this . mail _refreshTimeOut ;
if ( this . mail _doTimedRefresh ) {
window . clearTimeout ( this . mail _doTimedRefresh ) ;
}
if ( _refreshTimeOut > 9999 ) { //we do not set _refreshTimeOut's less than 10 seconds
var self = this ;
this . mail _doTimedRefresh = window . setInterval ( function ( ) {
self . mail _refreshFolderStatus . apply ( self ) ;
} , _refreshTimeOut ) ;
}
} ,
2013-07-25 17:35:44 +02:00
2013-04-13 12:30:07 +02:00
/ * *
* mail _refreshFolderStatus , function to call to read the counters of a folder and apply them
2013-07-25 17:35:44 +02:00
*
2013-04-13 12:30:07 +02:00
* @ param _nodeID
* @ param mode
* /
mail _refreshFolderStatus : function ( _nodeID , mode ) {
var nodeToRefresh = 0 ;
var mode2use = "none" ;
if ( _nodeID ) nodeToRefresh = _nodeID ;
if ( mode ) {
if ( mode == "forced" ) { mode2use = mode ; }
}
try
{
2013-08-21 12:47:20 +02:00
var tree _wdg = etemplate2 . getByApplication ( 'mail' ) [ 0 ] . widgetContainer . getWidgetById ( this . nm _index + '[foldertree]' ) ;
2013-07-25 17:35:44 +02:00
2013-04-13 12:30:07 +02:00
var activeFolders = tree _wdg . getTreeNodeOpenItems ( nodeToRefresh , mode2use ) ;
//alert(activeFolders.join('#,#'));
this . mail _queueRefreshFolderList ( activeFolders ) ;
2013-06-04 17:29:53 +02:00
// maybe to use the mode forced as trigger for grid reload and using the grids own autorefresh
// would solve the refresh issue more accurately
//if (mode == "forced") this.mail_refreshMessageGrid();
2013-04-13 12:30:07 +02:00
this . mail _refreshMessageGrid ( ) ;
} catch ( e ) { } // ignore the error; maybe the template is not loaded yet
} ,
2013-07-25 17:35:44 +02:00
2013-04-13 12:30:07 +02:00
/ * *
* Queues a refreshFolderList request for 1 ms . Actually this will just execute the
* code after the calling script has finished .
* /
mail _queueRefreshFolderList : function ( _folders )
2013-02-13 15:02:02 +01:00
{
2013-04-13 12:30:07 +02:00
this . mail _queuedFolders . push ( _folders ) ;
this . mail _queuedFoldersIndex ++ ;
2013-07-25 17:35:44 +02:00
2013-04-13 12:30:07 +02:00
// Copy idx onto the anonymous function scope
var idx = this . mail _queuedFoldersIndex ;
var self = this ;
window . setTimeout ( function ( ) {
if ( idx == self . mail _queuedFoldersIndex )
{
//var folders = mail_queuedFolders.join(",");
self . mail _queuedFoldersIndex = 0 ;
self . mail _queuedFolders = [ ] ;
2013-07-25 17:35:44 +02:00
2013-09-10 22:41:18 +02:00
egw . json ( 'mail.mail_ui.ajax_setFolderStatus' , [ _folders ] )
. sendRequest ( true ) ;
2013-04-13 12:30:07 +02:00
}
} , 10 ) ;
} ,
2013-07-25 17:35:44 +02:00
2013-04-13 12:30:07 +02:00
/ * *
* mail _setFolderStatus , function to set the status for the visible folders
* /
mail _setFolderStatus : function ( _status ) {
2013-08-21 12:47:20 +02:00
var ftree = etemplate2 . getByApplication ( 'mail' ) [ 0 ] . widgetContainer . getWidgetById ( this . nm _index + '[foldertree]' ) ;
2013-04-13 12:30:07 +02:00
for ( var i in _status ) ftree . setLabel ( i , _status [ i ] ) ; //alert(i +'->'+_status[i]);
} ,
2013-07-25 17:35:44 +02:00
2013-04-29 16:56:33 +02:00
/ * *
* mail _setLeaf , function to set the id and description for the folder given by status key
2013-05-07 10:26:17 +02:00
* @ param array _status status array with the required data ( new id , desc , old desc )
* key is the original id of the leaf to change
* multiple sets can be passed to mail _setLeaf
2013-04-29 16:56:33 +02:00
* /
mail _setLeaf : function ( _status ) {
//console.log('mail_setLeaf',_status);
2013-08-21 12:47:20 +02:00
var ftree = etemplate2 . getByApplication ( 'mail' ) [ 0 ] . widgetContainer . getWidgetById ( this . nm _index + '[foldertree]' ) ;
2013-05-07 10:26:17 +02:00
var selectedNode = ftree . getSelectedNode ( ) ;
2013-04-29 16:56:33 +02:00
for ( var i in _status )
{
2013-05-10 09:24:27 +02:00
// if olddesc is undefined or #skip# then skip the message, as we process subfolders
if ( typeof _status [ i ] [ 'olddesc' ] !== 'undefined' && _status [ i ] [ 'olddesc' ] !== '#skip-user-interaction-message#' ) app . mail . app _refresh ( egw . lang ( "Renamed Folder %1 to %2" , _status [ i ] [ 'olddesc' ] , _status [ i ] [ 'desc' ] , 'mail' ) ) ;
2013-04-29 16:56:33 +02:00
ftree . renameItem ( i , _status [ i ] [ 'id' ] , _status [ i ] [ 'desc' ] ) ;
//alert(i +'->'+_status[i]['id']+'+'+_status[i]['desc']);
2013-05-07 10:26:17 +02:00
if ( _status [ i ] [ 'id' ] == selectedNode . id )
{
2013-08-21 12:47:20 +02:00
var nm = etemplate2 . getByApplication ( 'mail' ) [ 0 ] . widgetContainer . getWidgetById ( this . nm _index ) ;
2013-05-07 10:26:17 +02:00
nm . activeFilters [ "selectedFolder" ] = _status [ i ] [ 'id' ] ;
nm . applyFilters ( ) ;
}
2013-04-29 16:56:33 +02:00
}
} ,
2013-05-13 16:42:42 +02:00
/ * *
* mail _removeLeaf , function to remove the leaf represented by the given ID
* @ param array _status status array with the required data ( KEY id , VALUE desc )
* key is the id of the leaf to delete
* multiple sets can be passed to mail _deleteLeaf
* /
2013-05-21 10:46:54 +02:00
mail _removeLeaf : function ( _status ) {
2013-07-17 14:01:01 +02:00
//console.log('mail_removeLeaf',_status);
2013-08-21 12:47:20 +02:00
var ftree = etemplate2 . getByApplication ( 'mail' ) [ 0 ] . widgetContainer . getWidgetById ( this . nm _index + '[foldertree]' ) ;
2013-05-13 16:42:42 +02:00
var selectedNode = ftree . getSelectedNode ( ) ;
for ( var i in _status )
{
// if olddesc is undefined or #skip# then skip the message, as we process subfolders
if ( typeof _status [ i ] !== 'undefined' && _status [ i ] !== '#skip-user-interaction-message#' ) app . mail . app _refresh ( egw . lang ( "Removed Folder %1 " , _status [ i ] , 'mail' ) ) ;
ftree . deleteItem ( i , ( selectedNode . id == i ) ) ;
var selectedNodeAfter = ftree . getSelectedNode ( ) ;
//alert(i +'->'+_status[i]['id']+'+'+_status[i]['desc']);
if ( selectedNodeAfter . id != selectedNode . id && selectedNode . id == i )
{
2013-08-21 12:47:20 +02:00
var nm = etemplate2 . getByApplication ( 'mail' ) [ 0 ] . widgetContainer . getWidgetById ( this . nm _index ) ;
2013-05-13 16:42:42 +02:00
nm . activeFilters [ "selectedFolder" ] = selectedNodeAfter . id ;
nm . applyFilters ( ) ;
}
}
} ,
2013-05-21 10:46:54 +02:00
/ * *
* mail _reloadNode , function to reload the leaf represented by the given ID
* @ param array _status status array with the required data ( KEY id , VALUE desc )
* key is the id of the leaf to delete
* multiple sets can be passed to mail _deleteLeaf
* /
mail _reloadNode : function ( _status ) {
2013-07-17 14:01:01 +02:00
//console.log('mail_reloadNode',_status);
2013-08-21 12:47:20 +02:00
var ftree = etemplate2 . getByApplication ( 'mail' ) [ 0 ] . widgetContainer . getWidgetById ( this . nm _index + '[foldertree]' ) ;
2013-05-21 10:46:54 +02:00
var selectedNode = ftree . getSelectedNode ( ) ;
for ( var i in _status )
{
// if olddesc is undefined or #skip# then skip the message, as we process subfolders
if ( typeof _status [ i ] !== 'undefined' && _status [ i ] !== '#skip-user-interaction-message#' ) app . mail . app _refresh ( egw . lang ( "Reloaded Folder %1 " , _status [ i ] , 'mail' ) ) ;
ftree . refreshItem ( i ) ;
var selectedNodeAfter = ftree . getSelectedNode ( ) ;
//alert(i +'->'+_status[i]['id']+'+'+_status[i]['desc']);
if ( selectedNodeAfter . id != selectedNode . id && selectedNode . id == i )
{
2013-08-21 12:47:20 +02:00
var nm = etemplate2 . getByApplication ( 'mail' ) [ 0 ] . widgetContainer . getWidgetById ( this . nm _index ) ;
2013-05-21 10:46:54 +02:00
nm . activeFilters [ "selectedFolder" ] = selectedNodeAfter . id ;
nm . applyFilters ( ) ;
}
}
} ,
2013-04-13 12:30:07 +02:00
/ * *
* mail _refreshMessageGrid , function to call to reread ofthe current folder
* /
mail _refreshMessageGrid : function ( ) {
2013-08-21 12:47:20 +02:00
var nm = etemplate2 . getByApplication ( 'mail' ) [ 0 ] . widgetContainer . getWidgetById ( this . nm _index ) ;
2013-04-13 12:30:07 +02:00
nm . applyFilters ( ) ; // this should refresh the active folder
} ,
2013-07-25 17:35:44 +02:00
2013-04-13 12:30:07 +02:00
/ * *
* Refresh given application _targetapp display of entry _app _id , incl . outputting _msg
2013-07-25 17:35:44 +02:00
*
2013-04-13 12:30:07 +02:00
* Default implementation here only reloads window with it ' s current url with an added msg = _msg attached
2013-07-25 17:35:44 +02:00
*
2013-04-13 12:30:07 +02:00
* @ param string _msg message ( already translated ) to show , eg . 'Entry deleted'
* @ param string _app application name
* @ param string | int _id = null id of entry to refresh
* @ param string _type = null either 'edit' , 'delete' , 'add' or null
* /
app _refresh : function ( _msg , _app , _id , _type )
2013-04-09 10:53:25 +02:00
{
2013-04-13 12:30:07 +02:00
var bufferExists = false ;
window . clearInterval ( app . mail . doStatus ) ; // whatever message was up to be activated
//alert("app_refresh(\'"+_msg+"\',\'"+_app+"\',\'"+_id+"\',\'"+_type+"\')");
//myCurrentMsg = mail_getMsg();
//if (myCurrentMsg.length) {
// clear message after some time
myMessageBuffer = "" ; //myCurrentMsg;
bufferExists = true ;
//}
app . mail . mail _setMsg ( '<span style="font-weight: bold;">' + _msg + '</span>' ) ;
if ( _app == 'mail' )
{
//we may want to trigger some actions, like modifying the grid, disable preview and stuff
2013-07-25 17:35:44 +02:00
2013-04-13 12:30:07 +02:00
// TODO: more actions
}
if ( bufferExists )
{
this . doStatus = window . setInterval ( "app.mail.mail_setMsg(myMessageBuffer);" , 10000 ) ;
}
} ,
2013-07-25 17:35:44 +02:00
2013-04-13 12:30:07 +02:00
/ * *
* mail _getMsg - gets the current Message
* @ return string
* /
mail _getMsg : function ( )
2013-02-13 15:02:02 +01:00
{
2013-04-13 12:30:07 +02:00
var msg _wdg = etemplate2 . getByApplication ( 'mail' ) [ 0 ] . widgetContainer . getWidgetById ( 'msg' ) ;
if ( msg _wdg )
{
return msg _wdg . valueOf ( ) . htmlNode [ 0 ] . innerHTML ;
}
return "" ;
} ,
2013-07-25 17:35:44 +02:00
2013-04-13 12:30:07 +02:00
/ * *
* mail _setMsg - sets a Message , with the msg container , and controls if the container is enabled / disabled
* @ param string myMsg - the message
* /
mail _setMsg : function ( myMsg )
2013-02-13 15:02:02 +01:00
{
2013-04-13 12:30:07 +02:00
var msg _wdg = etemplate2 . getByApplication ( 'mail' ) [ 0 ] . widgetContainer . getWidgetById ( 'msg' ) ;
if ( msg _wdg )
{
msg _wdg . set _value ( myMsg ) ;
msg _wdg . set _disabled ( myMsg . trim ( ) . length == 0 ) ;
2013-02-28 10:28:08 +01:00
}
2013-04-13 12:30:07 +02:00
} ,
2013-07-25 17:35:44 +02:00
2013-04-13 12:30:07 +02:00
/ * *
* Delete mails
* takes in all arguments
* @ param _action
* @ param _elems
* /
mail _delete : function ( _action , _elems )
2013-02-13 15:02:02 +01:00
{
2013-04-13 12:30:07 +02:00
var msg = this . mail _getFormData ( _elems ) ;
//alert(_action.id+','+ msg);
app . mail . app _refresh ( egw . lang ( 'delete messages' ) , 'mail' ) ;
this . mail _setRowClass ( _elems , 'deleted' ) ;
2013-05-27 15:48:55 +02:00
this . mail _deleteMessages ( msg ) ;
} ,
/ * *
* Delete mails - actually calls the backend function for deletion
* takes in all arguments
* @ param _msg - message list
* @ param _action - optional action
* /
mail _deleteMessages : function ( _msg , _action )
{
app . mail . app _refresh ( egw . lang ( 'delete messages' ) , 'mail' ) ;
2013-09-10 22:41:18 +02:00
egw . json ( 'mail.mail_ui.ajax_deleteMessages' , [ _msg , ( typeof _action == 'undefined' ? 'no' : _action ) ] )
. sendRequest ( ) ;
2013-05-27 15:48:55 +02:00
for ( var i = 0 ; i < _msg [ 'msg' ] . length ; i ++ ) egw . dataDeleteUID ( _msg [ 'msg' ] [ i ] ) ;
2013-04-13 12:30:07 +02:00
this . mail _refreshMessageGrid ( ) ;
2013-05-21 10:46:54 +02:00
this . mail _preview ( ) ;
2013-04-13 12:30:07 +02:00
} ,
2013-05-27 15:48:55 +02:00
/ * *
* retry to Delete mails
* @ param responseObject - >
* reason - reason to report
* messageList
* /
mail _retryForcedDelete : function ( responseObject )
{
var reason = responseObject [ 'response' ] ;
var messageList = responseObject [ 'messageList' ] ;
Check = confirm ( reason ) ;
if ( Check == true )
{
this . mail _deleteMessages ( messageList , 'remove_immediately' ) ;
}
else
{
app . mail . app _refresh ( egw . lang ( 'canceled deletion due to userinteraction' ) , 'mail' ) ;
this . mail _removeRowClass ( messageList , 'deleted' ) ;
}
this . mail _refreshMessageGrid ( ) ;
this . mail _preview ( ) ;
} ,
2013-04-13 12:30:07 +02:00
/ * *
* UnDelete mailMessages
2013-07-25 17:35:44 +02:00
*
2013-04-13 12:30:07 +02:00
* @ param _messageList
* /
mail _undeleteMessages : function ( _messageList ) {
// setting class of row, the old style
/ *
for ( var i = 0 ; i < _messageList [ 'msg' ] . length ; i ++ ) {
_id = _messageList [ 'msg' ] [ i ] ;
var dataElem = egw _appWindow ( 'felamimail' ) . mailGrid . dataRoot . getElementById ( _id ) ;
if ( dataElem )
{
//dataElem.clearData();
//dataElem.addClass('deleted');
dataElem . removeClass ( 'deleted' ) ;
}
}
* /
} ,
2013-07-25 17:35:44 +02:00
2013-04-13 12:30:07 +02:00
/ * *
* mail _emptyTrash
* /
mail _emptyTrash : function ( ) {
app . mail . app _refresh ( egw . lang ( 'empty trash' ) , 'mail' ) ;
2013-09-10 22:41:18 +02:00
egw . json ( 'mail.mail_ui.ajax_emptyTrash' )
. sendRequest ( true ) ;
2013-04-13 12:30:07 +02:00
} ,
2013-07-25 17:35:44 +02:00
2013-04-13 12:30:07 +02:00
/ * *
* mail _compressFolder
* /
mail _compressFolder : function ( ) {
app . mail . app _refresh ( egw . lang ( 'compress folder' ) , 'mail' ) ;
2013-09-10 22:41:18 +02:00
egw . json ( 'mail.mail_ui.ajax_compressFolder' )
. sendRequest ( true ) ;
2013-04-13 12:30:07 +02:00
} ,
2013-07-25 17:35:44 +02:00
2013-04-13 12:30:07 +02:00
/ * *
* mail _changeProfile
* @ param folder , the ID of the selected Node - > should be an integer
* @ param _widget , handle to the tree widget
* /
mail _changeProfile : function ( folder , _widget ) {
// alert(folder);
2013-09-10 22:41:18 +02:00
egw . json ( 'mail.mail_ui.ajax_changeProfile' , [ folder ] )
. sendRequest ( ) ;
2013-04-13 12:30:07 +02:00
this . mail _refreshMessageGrid ( ) ;
2013-07-25 17:35:44 +02:00
2013-04-13 12:30:07 +02:00
return true ;
} ,
2013-07-25 17:35:44 +02:00
2013-04-13 12:30:07 +02:00
/ * *
* mail _changeFolder
* @ param folder , the ID of the selected Node
* @ param _widget , handle to the tree widget
* /
mail _changeFolder : function ( folder , _widget ) {
//alert('change Folder called:'+folder);
app . mail . app _refresh ( egw . lang ( 'change folder' ) + '...' , 'mail' ) ;
var img = _widget . getSelectedNode ( ) . images [ 0 ] ; // fetch first image
if ( ! ( img . search ( eval ( '/' + 'NoSelect' + '/' ) ) < 0 ) || ! ( img . search ( eval ( '/' + 'thunderbird' + '/' ) ) < 0 ) )
2013-02-20 12:31:57 +01:00
{
2013-04-13 12:30:07 +02:00
if ( ! ( img . search ( eval ( '/' + 'thunderbird' + '/' ) ) < 0 ) )
{
rv = this . mail _changeProfile ( folder , _widget ) ;
if ( rv )
{
return rv ;
}
}
if ( _widget . event _args . length == 2 )
2013-02-20 12:31:57 +01:00
{
2013-04-13 12:30:07 +02:00
folder = _widget . event _args [ 1 ] ;
_widget . set _value ( folder ) ;
2013-02-20 12:31:57 +01:00
}
2013-04-13 12:30:07 +02:00
else
{
_widget . set _value ( '' ) ;
2013-07-25 17:35:44 +02:00
}
2013-02-20 12:31:57 +01:00
}
2013-08-21 12:47:20 +02:00
var nm = _widget . getRoot ( ) . getWidgetById ( this . nm _index ) ;
2013-04-13 12:30:07 +02:00
nm . activeFilters [ "selectedFolder" ] = folder ;
2013-05-28 16:10:17 +02:00
//nm.applyFilters();// its done in refrefreshMessageGrid
2013-04-13 12:30:07 +02:00
var msg = _widget . getRoot ( ) . getWidgetById ( 'msg' ) ;
if ( msg )
2013-02-13 15:02:02 +01:00
{
2013-04-13 12:30:07 +02:00
window . clearInterval ( this . doStatus ) ;
displayname = _widget . getSelectedLabel ( ) ;
inBraket = displayname . search ( /\(/ ) ;
if ( inBraket != - 1 )
{
outBraket = displayname . search ( /\)/ ) ;
if ( outBraket != - 1 ) displayname = displayname . replace ( /\((.*?)\)/ , "" ) ;
}
myMsg = ( displayname ? displayname : folder ) + ' ' + egw . lang ( 'selected' ) ;
app . mail . app _refresh ( myMsg , 'mail' ) ;
2013-02-13 15:02:02 +01:00
}
2013-05-28 16:10:17 +02:00
//mail_refreshMessageGrid();// its done in refreshFolderStatus already
2013-04-13 12:30:07 +02:00
this . mail _refreshFolderStatus ( folder , 'forced' ) ;
this . mail _startTimerFolderStatusUpdate ( this . mail _refreshTimeOut ) ;
2013-05-21 14:02:58 +02:00
this . mail _fetchCurrentlyFocussed ( null , true ) ;
2013-05-21 10:46:54 +02:00
this . mail _preview ( ) ;
2013-04-13 12:30:07 +02:00
} ,
2013-07-25 17:35:44 +02:00
2013-04-13 12:30:07 +02:00
/ * *
* Flag mail as 'read' , 'unread' , 'flagged' or 'unflagged'
2013-07-25 17:35:44 +02:00
*
2013-04-13 12:30:07 +02:00
* @ param _action _action . id is 'read' , 'unread' , 'flagged' or 'unflagged'
* @ param _elems
* /
mail _flag : function ( _action , _elems )
2013-02-13 15:02:02 +01:00
{
2013-04-13 12:30:07 +02:00
//alert(_action.id+' - '+_elems[0].id);
var msg = this . mail _getFormData ( _elems ) ;
//
this . mail _flagMessages ( _action . id , msg ) ;
} ,
2013-07-25 17:35:44 +02:00
2013-04-13 12:30:07 +02:00
/ * *
* Flag mail as 'read' , 'unread' , 'flagged' or 'unflagged'
2013-07-25 17:35:44 +02:00
*
2013-04-13 12:30:07 +02:00
* @ param _action _action . id is 'read' , 'unread' , 'flagged' or 'unflagged'
* @ param _elems
* /
mail _flagMessages : function ( _flag , _elems )
2013-02-19 17:30:59 +01:00
{
2013-04-13 12:30:07 +02:00
app . mail . app _refresh ( egw . lang ( 'flag messages' ) , 'mail' ) ;
2013-09-10 22:41:18 +02:00
egw . json ( 'mail.mail_ui.ajax_flagMessages' , [ _flag , _elems ] )
. sendRequest ( ) ;
2013-04-13 12:30:07 +02:00
this . mail _refreshMessageGrid ( ) ;
} ,
2013-07-25 17:35:44 +02:00
2013-04-13 12:30:07 +02:00
/ * *
* display header lines , or source of mail , depending on the url given
2013-07-25 17:35:44 +02:00
*
2013-04-13 12:30:07 +02:00
* @ param _url
* /
mail _displayHeaderLines : function ( _url ) {
// only used by right clickaction
egw _openWindowCentered ( _url , 'mail_display_headerLines' , '700' , '600' , window . outerWidth / 2 , window . outerHeight / 2 ) ;
} ,
2013-07-25 17:35:44 +02:00
2013-04-13 12:30:07 +02:00
/ * *
* View header of a message
2013-07-25 17:35:44 +02:00
*
2013-04-13 12:30:07 +02:00
* @ param _action
* @ param _elems _elems [ 0 ] . id is the row - id
* /
mail _header : function ( _action , _elems )
{
//alert('mail_header('+_elems[0].id+')');
var url = window . egw _webserverUrl + '/index.php?' ;
url += 'menuaction=mail.mail_ui.displayHeader' ; // todo compose for Draft folder
url += '&id=' + _elems [ 0 ] . id ;
this . mail _displayHeaderLines ( url ) ;
} ,
2013-07-25 17:35:44 +02:00
2013-04-13 12:30:07 +02:00
/ * *
* View message source
2013-07-25 17:35:44 +02:00
*
2013-04-13 12:30:07 +02:00
* @ param _action
* @ param _elems _elems [ 0 ] . id is the row - id
* /
mail _mailsource : function ( _action , _elems )
{
//alert('mail_mailsource('+_elems[0].id+')');
var url = window . egw _webserverUrl + '/index.php?' ;
url += 'menuaction=mail.mail_ui.saveMessage' ; // todo compose for Draft folder
url += '&id=' + _elems [ 0 ] . id ;
url += '&location=display' ;
this . mail _displayHeaderLines ( url ) ;
} ,
2013-07-25 17:35:44 +02:00
2013-04-13 12:30:07 +02:00
/ * *
* Save a message
2013-07-25 17:35:44 +02:00
*
2013-04-13 12:30:07 +02:00
* @ param _action
* @ param _elems _elems [ 0 ] . id is the row - id
* /
mail _save : function ( _action , _elems )
{
//alert('mail_save('+_elems[0].id+')');
var url = window . egw _webserverUrl + '/index.php?' ;
url += 'menuaction=mail.mail_ui.saveMessage' ; // todo compose for Draft folder
url += '&id=' + _elems [ 0 ] . id ;
//window.open(url,'_blank','dependent=yes,width=100,height=100,scrollbars=yes,status=yes');
document . location = url ;
} ,
2013-07-25 17:35:44 +02:00
2013-07-19 17:13:01 +02:00
/ * *
* User clicked an address ( FROM , TO , etc )
* /
address _click : function ( DOMNode , tag _info , widget )
{
console . log ( this , arguments ) ;
} ,
2013-07-25 17:35:44 +02:00
2013-04-13 12:30:07 +02:00
/ * *
* Save a message to filemanager
2013-07-25 17:35:44 +02:00
*
2013-04-13 12:30:07 +02:00
* @ param _action
* @ param _elems _elems [ 0 ] . id is the row - id
* /
mail _save2fm : function ( _action , _elems )
{
var _id = _elems [ 0 ] . id ;
var dataElem = egw . dataGetUIDdata ( _id ) ;
var url = window . egw _webserverUrl + '/index.php?' ;
url += 'menuaction=filemanager.filemanager_select.select' ; // todo compose for Draft folder
url += '&mode=saveas' ;
var filename = dataElem . data . subject . replace ( /[\f\n\t\v/\\:*#?<>\|]/g , "_" ) ;
url += '&name=' + encodeURIComponent ( filename + '.eml' ) ;
url += '&mime=message' + encodeURIComponent ( '/' ) + 'rfc822' ;
url += '&method=mail.mail_ui.vfsSaveMessage'
url += '&id=' + _elems [ 0 ] . id ;
url += '&label=Save' ;
//window.open(url,'_blank','dependent=yes,width=100,height=100,scrollbars=yes,status=yes')
//document.location = url;
egw _openWindowCentered ( url , 'vfs_save_message_' + _elems [ 0 ] . id , '640' , '570' , window . outerWidth / 2 , window . outerHeight / 2 ) ;
2013-07-25 17:35:44 +02:00
2013-04-13 12:30:07 +02:00
} ,
2013-07-25 17:35:44 +02:00
2013-04-13 12:30:07 +02:00
/ * *
* Save message as InfoLog
2013-07-25 17:35:44 +02:00
*
2013-04-13 12:30:07 +02:00
* @ param _action
* @ param _elems _elems [ 0 ] . id is the row - id
* /
mail _infolog : function ( _action , _elems )
2013-02-19 17:30:59 +01:00
{
2013-04-13 12:30:07 +02:00
//alert('mail_infolog('+_elems[0].id+')');return;
var url = window . egw _webserverUrl + '/index.php?' ;
url += 'menuaction=infolog.infolog_ui.import_mail' ; // todo compose for Draft folder
url += '&rowid=' + _elems [ 0 ] . id ;
egw _openWindowCentered ( url , 'import_mail_' + _elems [ 0 ] . id , _action . data . width , _action . data . height ) ;
} ,
2013-07-25 17:35:44 +02:00
2013-04-13 12:30:07 +02:00
/ * *
* Save message as ticket
2013-07-25 17:35:44 +02:00
*
2013-04-13 12:30:07 +02:00
* @ param _action _action . id is 'read' , 'unread' , 'flagged' or 'unflagged'
* @ param _elems
* /
mail _tracker : function ( _action , _elems )
{
//alert('mail_tracker('+_elems[0].id+')');
var url = window . egw _webserverUrl + '/index.php?' ;
url += 'menuaction=tracker.tracker_ui.import_mail' ; // todo compose for Draft folder
url += '&rowid=' + _elems [ 0 ] . id ;
egw _openWindowCentered ( url , 'import_tracker_' + _elems [ 0 ] . id , _action . data . width , _action . data . height ) ;
} ,
2013-07-25 17:35:44 +02:00
2013-04-13 12:30:07 +02:00
/ * *
* mail _getFormData
2013-07-25 17:35:44 +02:00
*
2013-04-13 12:30:07 +02:00
* @ param _actionObjects , the senders
* @ return structured array of message ids : array ( msg => message - ids )
* /
mail _getFormData : function ( _actionObjects ) {
var messages = { } ;
if ( _actionObjects . length > 0 )
2013-02-19 17:30:59 +01:00
{
2013-04-13 12:30:07 +02:00
messages [ 'msg' ] = [ ] ;
2013-02-19 17:30:59 +01:00
}
2013-07-25 17:35:44 +02:00
2013-04-30 16:16:52 +02:00
for ( var i = 0 ; i < _actionObjects . length ; i ++ )
2013-02-28 10:28:08 +01:00
{
2013-04-13 12:30:07 +02:00
if ( _actionObjects [ i ] . id . length > 0 )
{
messages [ 'msg' ] [ i ] = _actionObjects [ i ] . id ;
}
2013-02-28 10:28:08 +01:00
}
2013-07-25 17:35:44 +02:00
2013-04-13 12:30:07 +02:00
return messages ;
} ,
2013-07-25 17:35:44 +02:00
2013-04-13 12:30:07 +02:00
/ * *
* mail _setRowClass
2013-07-25 17:35:44 +02:00
*
2013-04-13 12:30:07 +02:00
* @ param _actionObjects , the senders
* /
mail _setRowClass : function ( _actionObjects , _class ) {
if ( typeof _class == 'undefined' ) return false ;
2013-07-25 17:35:44 +02:00
for ( var i = 0 ; i < _actionObjects . length ; i ++ )
2013-04-13 12:30:07 +02:00
{
if ( _actionObjects [ i ] . id . length > 0 )
{
var dataElem = $j ( _actionObjects [ i ] . iface . getDOMNode ( ) ) ;
dataElem . addClass ( _class ) ;
2013-07-25 17:35:44 +02:00
2013-04-13 12:30:07 +02:00
}
}
} ,
2013-07-25 17:35:44 +02:00
2013-05-27 15:48:55 +02:00
/ * *
* mail _removeRowClass
2013-07-25 17:35:44 +02:00
*
2013-05-27 15:48:55 +02:00
* @ param _actionObjects , the senders , or a messages object
* @ param _class , the class to be removed
* /
mail _removeRowClass : function ( _actionObjects , _class ) {
if ( typeof _class == 'undefined' ) return false ;
if ( typeof _actionObjects [ 'msg' ] == 'undefined' )
{
2013-07-25 17:35:44 +02:00
for ( var i = 0 ; i < _actionObjects . length ; i ++ )
2013-05-27 15:48:55 +02:00
{
if ( _actionObjects [ i ] . id . length > 0 )
{
var dataElem = $j ( _actionObjects [ i ] . iface . getDOMNode ( ) ) ;
dataElem . removeClass ( _class ) ;
2013-07-25 17:35:44 +02:00
2013-05-27 15:48:55 +02:00
}
}
}
else
{
2013-08-21 12:47:20 +02:00
var nm = etemplate2 . getByApplication ( 'mail' ) [ 0 ] . widgetContainer . getWidgetById ( this . nm _index ) ;
2013-05-27 15:48:55 +02:00
var aO = nm . controller . _objectManager . selectedChildren ;
2013-07-25 17:35:44 +02:00
for ( var i = 0 ; i < _actionObjects [ 'msg' ] . length ; i ++ )
2013-05-27 15:48:55 +02:00
{
2013-07-25 17:35:44 +02:00
for ( var i = 0 ; i < aO . length ; i ++ )
2013-05-27 15:48:55 +02:00
{
if ( aO [ i ] . id == _actionObjects [ 'msg' ] [ i ] )
{
var dataElem = $j ( aO [ i ] . iface . getDOMNode ( ) ) ;
dataElem . removeClass ( _class ) ;
2013-07-25 17:35:44 +02:00
2013-05-27 15:48:55 +02:00
}
2013-07-25 17:35:44 +02:00
}
2013-05-27 15:48:55 +02:00
}
}
} ,
2013-04-13 12:30:07 +02:00
// Tree widget stubs
/ * *
* mail _dragStart - displays information while dragging
2013-07-25 17:35:44 +02:00
*
2013-04-13 12:30:07 +02:00
* @ param action
* @ param _senders - the representation of the elements dragged
* @ return the ddhelper
* /
mail _dragStart : function ( action , _senders ) {
//console.log(action,_senders);
return $j ( "<div class=\"ddhelper\">" + _senders . length + " Mails selected </div>" ) ;
} ,
/ * *
* mail _move - implementation of the move action from drag n drop
2013-07-25 17:35:44 +02:00
*
2013-04-13 12:30:07 +02:00
* @ param _action
* @ param _senders - the representation of the elements dragged
* @ param _target - the representation of the target
* /
mail _move : function ( _action , _senders , _target ) {
//console.log(_action,_senders,_target);
var target = _action . id == 'drop_move_mail' ? _target . iface . id : _action . id . substr ( 5 ) ;
var messages = this . mail _getFormData ( _senders ) ;
//alert('mail_move('+messages.msg.join(',')+' --> '+target+')');
// TODO: Write move/copy function which cares about doing the same stuff
// as the "onNodeSelect" function!
2013-09-10 22:41:18 +02:00
egw . json ( 'mail.mail_ui.ajax_moveMessages' , [ target , messages ] )
. sendRequest ( ) ;
2013-08-21 12:47:20 +02:00
var nm = etemplate2 . getByApplication ( 'mail' ) [ 0 ] . widgetContainer . getWidgetById ( this . nm _index ) ;
2013-06-04 17:29:53 +02:00
this . mail _setRowClass ( _senders , 'deleted' ) ;
nm . refresh ( messages [ 'msg' ] , 'delete' )
//for (var i = 0; i < messages['msg'].length; i++) egw.dataDeleteUID(messages['msg'][i]);
2013-04-13 12:30:07 +02:00
this . mail _refreshMessageGrid ( ) ;
} ,
/ * *
* mail _copy - implementation of the copy action from drag n drop
2013-07-25 17:35:44 +02:00
*
2013-04-13 12:30:07 +02:00
* @ param _action
* @ param _senders - the representation of the elements dragged
* @ param _target - the representation of the target
* /
mail _copy : function ( _action , _senders , _target ) {
//console.log(_action,_senders,_target);
2013-04-29 16:56:33 +02:00
var target = _action . id == 'drop_copy_mail' ? _target . iface . id : _action . id . substr ( 5 ) ;
2013-04-13 12:30:07 +02:00
var messages = this . mail _getFormData ( _senders ) ;
//alert('mail_copy('+messages.msg.join(',')+' --> '+target+')');
// TODO: Write move/copy function which cares about doing the same stuff
// as the "onNodeSelect" function!
2013-09-10 22:41:18 +02:00
egw . json ( 'mail.mail_ui.ajax_copyMessages' , [ target , messages ] )
. sendRequest ( ) ;
2013-04-13 12:30:07 +02:00
this . mail _refreshMessageGrid ( ) ;
} ,
2013-05-21 10:46:54 +02:00
/ * *
* mail _AddFolder - implementation of the AddFolder action of right click options on the tree
2013-07-25 17:35:44 +02:00
*
2013-05-21 10:46:54 +02:00
* @ param _action
* @ param _senders - the representation of the tree leaf to be manipulated
* /
mail _AddFolder : function ( action , _senders ) {
//console.log(action,_senders);
//action.id == 'add'
//_senders.iface.id == target leaf / leaf to edit
2013-08-21 12:47:20 +02:00
var ftree = etemplate2 . getByApplication ( 'mail' ) [ 0 ] . widgetContainer . getWidgetById ( this . nm _index + '[foldertree]' ) ;
2013-05-21 10:46:54 +02:00
OldFolderName = ftree . getLabel ( _senders [ 0 ] . iface . id ) ;
if ( jQuery ( OldFolderName ) . text ( ) . length > 0 ) OldFolderName = jQuery ( OldFolderName ) . text ( ) ;
OldFolderName = OldFolderName . trim ( ) ;
OldFolderName = OldFolderName . replace ( /\([0-9]*\)/g , '' ) . trim ( ) ;
//console.log(OldFolderName);
NewFolderName = prompt ( egw . lang ( "Add a new Folder to %1:" , OldFolderName ) ) ;
if ( jQuery ( NewFolderName ) . text ( ) . length > 0 ) NewFolderName = jQuery ( NewFolderName ) . text ( ) ;
//alert(NewFolderName);
if ( NewFolderName && NewFolderName . length > 0 )
{
app . mail . app _refresh ( egw . lang ( "Adding Folder %1 to %2" , NewFolderName , OldFolderName , 'mail' ) ) ;
2013-09-10 22:41:18 +02:00
egw . json ( 'mail.mail_ui.ajax_addFolder' , [ _senders [ 0 ] . iface . id , NewFolderName ] )
. sendRequest ( true ) ;
2013-05-21 10:46:54 +02:00
}
} ,
2013-04-13 12:30:07 +02:00
/ * *
* mail _RenameFolder - implementation of the RenameFolder action of right click options on the tree
2013-07-25 17:35:44 +02:00
*
2013-04-13 12:30:07 +02:00
* @ param _action
* @ param _senders - the representation of the tree leaf to be manipulated
* /
mail _RenameFolder : function ( action , _senders ) {
//console.log(action,_senders);
//action.id == 'rename'
//_senders.iface.id == target leaf / leaf to edit
2013-08-21 12:47:20 +02:00
var ftree = etemplate2 . getByApplication ( 'mail' ) [ 0 ] . widgetContainer . getWidgetById ( this . nm _index + '[foldertree]' ) ;
2013-04-13 12:30:07 +02:00
OldFolderName = ftree . getLabel ( _senders [ 0 ] . iface . id ) ;
if ( jQuery ( OldFolderName ) . text ( ) . length > 0 ) OldFolderName = jQuery ( OldFolderName ) . text ( ) ;
OldFolderName = OldFolderName . trim ( ) ;
OldFolderName = OldFolderName . replace ( /\([0-9]*\)/g , '' ) . trim ( ) ;
//console.log(OldFolderName);
NewFolderName = prompt ( egw . lang ( "Rename Folder %1 to:" , OldFolderName ) ) ;
if ( jQuery ( NewFolderName ) . text ( ) . length > 0 ) NewFolderName = jQuery ( NewFolderName ) . text ( ) ;
//alert(NewFolderName);
if ( NewFolderName && NewFolderName . length > 0 )
{
2013-05-07 10:26:17 +02:00
app . mail . app _refresh ( egw . lang ( "Renaming Folder %1 to %2" , OldFolderName , NewFolderName , 'mail' ) ) ;
2013-09-10 22:41:18 +02:00
egw . json ( 'mail.mail_ui.ajax_renameFolder' , [ _senders [ 0 ] . iface . id , NewFolderName ] )
. sendRequest ( true ) ;
2013-04-13 12:30:07 +02:00
}
2013-05-13 16:42:42 +02:00
} ,
/ * *
* mail _DeleteFolder - implementation of the DeleteFolder action of right click options on the tree
2013-07-25 17:35:44 +02:00
*
2013-05-13 16:42:42 +02:00
* @ param _action
* @ param _senders - the representation of the tree leaf to be manipulated
* /
mail _DeleteFolder : function ( action , _senders ) {
//console.log(action,_senders);
//action.id == 'delete'
//_senders.iface.id == target leaf / leaf to edit
2013-08-21 12:47:20 +02:00
var ftree = etemplate2 . getByApplication ( 'mail' ) [ 0 ] . widgetContainer . getWidgetById ( this . nm _index + '[foldertree]' ) ;
2013-05-13 16:42:42 +02:00
OldFolderName = ftree . getLabel ( _senders [ 0 ] . iface . id ) ;
if ( jQuery ( OldFolderName ) . text ( ) . length > 0 ) OldFolderName = jQuery ( OldFolderName ) . text ( ) ;
OldFolderName = OldFolderName . trim ( ) ;
OldFolderName = OldFolderName . replace ( /\([0-9]*\)/g , '' ) . trim ( ) ;
//console.log(OldFolderName);
reallyDelete = confirm ( egw . lang ( "Do you really want to DELETE Folder %1 ? \r\nAll messages in the folder will be lost" , OldFolderName ) ) ;
if ( reallyDelete )
{
app . mail . app _refresh ( egw . lang ( "Deleting Folder %1" , OldFolderName , 'mail' ) ) ;
2013-09-10 22:41:18 +02:00
egw . json ( 'mail.mail_ui.ajax_deleteFolder' , [ _senders [ 0 ] . iface . id ] )
. sendRequest ( true ) ;
2013-05-13 16:42:42 +02:00
}
2013-07-25 17:35:44 +02:00
} ,
2013-09-23 10:33:30 +02:00
import _displayVfsSelector : function ( _ref ) {
var ref = this . et2 . getWidgetById ( _ref ) ;
//console.log(ref);
this . mail _fileSelectorWindow = egw ( ) . open _link ( egw . link ( '/index.php' , {
menuaction : 'filemanager.filemanager_select.select' ,
mode : 'open' ,
method : 'mail.mail_ui.setImportMessageFromVFS' ,
id : ref . value [ 0 ] , //represents the target where to import to
} ) , 'mail_import_vfsSelector' , '640x580' ) ;
} ,
import _closeVfsSelector : function ( _ref ) {
// names used here to access the popupwindows must be available, else it fails
// names used here are assigned in app.mail.import_displayVfsSelector and class.mail_hooks.inc.php
this . mail _fileSelectorWindow = window . open ( '' , 'mail_import_vfsSelector' ) ;
importMessageDialog = window . open ( '' , 'importMessageDialog' ) ;
this . mail _fileSelectorWindow . close ( ) ;
var vfsfile = importMessageDialog . app . mail . et2 . getWidgetById ( 'vfsfile' ) ;
//console.log(vfsfile);
vfsfile . input [ 0 ] . value = _ref ;
var folder = importMessageDialog . app . mail . et2 . getWidgetById ( 'FOLDER' ) ;
//console.log(vfsfile.input[0].value,folder.value[0]);
importMessageDialog . close ( ) ;
egw ( ) . open _link ( egw . link ( '/index.php' , {
menuaction : 'mail.mail_ui.importMessage' ,
content : { fi : vfsfile . input [ 0 ] . value , fo : folder . value [ 0 ] } , //represents the target where to import to
} ) , 'mail_display' , '640x580' ) ;
//vfsfile._parent._parent._parent.parentNode.et2_obj.submit();
} ,
2013-09-02 17:15:35 +02:00
/ * *
* Send names of uploaded files ( again ) to server , to process them : either copy to vfs or ask overwrite / rename
*
* @ param _event
* @ param _file _count
* @ param { string } [ _path = current directory ] Where the file is uploaded to .
* /
uploadForImport : function ( _event , _file _count , _path )
{
2013-09-05 16:52:11 +02:00
//console.log(_event,_file_count,_path);
// path is probably not needed when uploading for file; maybe it is when from vfs
2013-09-02 17:15:35 +02:00
if ( typeof _path == 'undefined' )
{
//_path = this.get_path();
}
if ( _file _count && ! jQuery . isEmptyObject ( _event . data . getValue ( ) ) )
{
2013-09-05 16:52:11 +02:00
var widget = _event . data ;
//console.log(widget.getValue());
// var request = new egw_json_request('mail_ui::ajax_importMessage', ['upload', widget.getValue(), _path], this);
2013-09-02 17:15:35 +02:00
// widget.set_value('');
2013-09-05 16:52:11 +02:00
// request.sendRequest();//false, this._upload_callback, this);
2013-09-10 15:39:44 +02:00
this . et2 _obj . submit ( ) ;
}
} ,
/ * *
* Send names of uploaded files ( again ) to server , to process them : either copy to vfs or ask overwrite / rename
*
* @ param _event
* @ param _file _count
* @ param { string } [ _path = current directory ] Where the file is uploaded to .
* /
uploadForCompose : function ( _event , _file _count , _path )
{
//console.log(_event,_file_count,_path);
// path is probably not needed when uploading for file; maybe it is when from vfs
if ( typeof _path == 'undefined' )
{
//_path = this.get_path();
}
if ( _file _count && ! jQuery . isEmptyObject ( _event . data . getValue ( ) ) )
{
var widget = _event . data ;
//console.log(widget.getValue());
// var request = new egw_json_request('mail_ui::ajax_importMessage', ['upload', widget.getValue(), _path], this);
// widget.set_value('');
// request.sendRequest();//false, this._upload_callback, this);
2013-09-11 15:46:00 +02:00
this . et2 _obj . submit ( ) ;
2013-09-02 17:15:35 +02:00
}
} ,
2013-08-09 19:47:53 +02:00
sieve _editRules _radiobtn : function ( )
{
console . log ( "hi i am radiobtn" ) ;
} ,
/ * *
*
* /
sieve _vac _all _aliases : function ( )
{
var addr = this . et2 . getWidgetById ( 'addresses' ) ;
console . log ( 'say something' ) ;
addr . select _all ( ) ;
//addr.set_autocomplete_url('mail.mail_compose.ajax_searchAddress');
} ,
2013-07-25 17:35:44 +02:00
/ * *
* action - handling actions on sieve rules
*
* @ param _type - action name
* @ param _selected - selected row from the sieve rule list
* @ param _msg - messages
* /
action : function ( _type , _selected )
{
var actionData ;
var that = this ;
var typeId = _type . id ;
var ruleID = ( ( _selected [ 0 ] . id . split ( "_" ) . pop ( ) ) - 1 ) ; // subtract the row id from 1 because the first row id is reserved by grid header
if ( _type )
{
switch ( _type . id )
{
case 'delete' :
var callbackDeleteDialog = function ( button _id )
{
if ( button _id == et2 _dialog . YES _BUTTON )
{
actionData = _type . parent . data . widget . getArrayMgr ( 'content' ) ;
that . _do _action ( typeId , actionData [ 'data' ] , ruleID ) ;
}
}
var confirmDeleteDialog = et2 _dialog . show _dialog ( callbackDeleteDialog , egw . lang ( "Do you really want to DELETE this Rule" ) , egw . lang ( "Delete" ) , { } , et2 _dialog . BUTTONS _YES _NO _CANCEL , et2 _dialog . WARNING _MESSAGE ) ;
break ;
case 'add' :
$linkData = "mail.mail_sieve.edit" ;
egw . open _link ( $linkData , '' , "600x480" ) ;
break ;
case 'edit' :
$linkData = "mail.mail_sieve.edit&ruleID=" + ruleID ;
egw . open _link ( $linkData , '' , "600x480" ) ;
break ;
case 'enable' :
actionData = _type . parent . data . widget . getArrayMgr ( 'content' ) ;
this . _do _action ( typeId , actionData [ 'data' ] , ruleID ) ;
//window.egw_refresh('refreshed',this.appname);
break ;
case 'disable' :
actionData = _type . parent . data . widget . getArrayMgr ( 'content' ) ;
this . _do _action ( typeId , actionData [ 'data' ] , ruleID ) ;
break ;
}
}
} ,
2013-08-09 19:47:53 +02:00
_do _action : function ( _typeID , _data , _selectedID , _msg )
2013-07-25 17:35:44 +02:00
{
if ( _typeID && _data )
{
2013-08-09 19:47:53 +02:00
var request = egw ( ) . json ( 'mail.mail_sieve.ajax_action' , [ _typeID , _selectedID , _msg ] , null , null , true ) ;
2013-07-25 17:35:44 +02:00
console . log ( request ) ;
2013-08-09 19:47:53 +02:00
request . sendRequest ( ) ;
2013-07-25 17:35:44 +02:00
}
} ,
2013-08-09 19:47:53 +02:00
sieve _egw _refresh : function ( _execid , _msg )
2013-07-25 17:35:44 +02:00
{
2013-08-09 19:47:53 +02:00
var request = egw ( ) . json ( 'mail.mail_sieve.ajax_sieve_egw_refresh' , [ this . et2 _obj . etemplate _exec _id , _msg ] , null , this . et2 _obj , true ) ;
console . log ( request ) ;
request . sendRequest ( ) ;
2013-07-25 17:35:44 +02:00
} ,
2013-08-09 19:47:53 +02:00
2013-04-09 10:53:25 +02:00
} ) ;