2013-02-12 18:48:04 +01:00
/ * *
* mail - static javaScript functions
*
* @ link http : //www.egroupware.org
2013-10-24 09:15:48 +02:00
* @ author Stylite AG [ info @ stylite . de ]
2014-01-13 14:06:29 +01:00
* @ copyright ( c ) 2013 - 2014 by Stylite AG < info - AT - stylite . de >
2013-02-12 18:48:04 +01:00
* @ package mail
* @ license http : //opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @ version $Id$
* /
2014-02-12 11:56:44 +01:00
/ * e g w : u s e s
phpgwapi . jquery . jquery . base64 ;
* /
2013-10-07 18:53:13 +02:00
/ * *
* UI for mail
2013-10-09 18:44:03 +02:00
*
2013-10-07 18:53:13 +02:00
* @ augments AppJS
* /
2013-11-04 21:54:23 +01:00
app . classes . 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 ,
2013-07-25 17:35:44 +02:00
2013-04-13 12:30:07 +02:00
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-10-05 18:36:20 +02:00
mail _isMainWindow : true ,
2013-08-21 12:47:20 +02:00
2014-01-18 18:01:29 +01:00
// Some state variables to track preview pre-loading
preview _preload : {
timeout : null ,
request : null
} ,
2014-01-21 11:21:59 +01:00
2013-12-09 12:17:32 +01:00
/ * *
* abbrevations for common access rights
* @ array
*
* /
2014-02-28 16:39:46 +01:00
aclCommonRights : [ 'lrs' , 'lprs' , 'ilprs' , 'ilprsw' , 'aeiklprstwx' , 'custom' ] ,
2013-12-09 12:17:32 +01:00
/ * *
* Demonstrates ACL rights
* @ array
*
* /
aclRights : [ 'l' , 'r' , 's' , 'w' , 'i' , 'p' , 'c' , 'd' , 'a' ] ,
2013-04-13 12:30:07 +02:00
/ * *
* Initialize javascript for this application
2013-07-25 17:35:44 +02:00
*
2013-10-09 16:35:03 +02:00
* @ memberOf mail
2013-04-13 12:30:07 +02:00
* /
init : function ( ) {
this . _super . apply ( this , arguments ) ;
} ,
2013-07-25 17:35:44 +02:00
2013-06-12 13:50:30 +02:00
/ * *
* Destructor
* /
destroy : function ( )
{
2014-01-11 15:16:36 +01:00
// Unbind from nm refresh
2014-02-03 17:41:10 +01:00
if ( this . et2 != null )
2014-01-11 15:16:36 +01:00
{
2014-02-03 17:41:10 +01:00
var nm = this . et2 . getWidgetById ( 'nm' ) ;
if ( nm != null )
{
$j ( nm ) . off ( 'refresh' ) ;
}
2014-01-11 15:16:36 +01:00
}
2013-10-09 18:44:03 +02:00
delete this . et2 _obj ;
2013-06-12 13:50:30 +02:00
// 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
var isMainView = false ;
2013-06-17 16:25:20 +02:00
var isDisplay = false ;
2013-10-14 15:30:04 +02:00
var isCompose = false ;
2013-06-17 16:25:20 +02:00
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' :
2013-10-05 18:36:20 +02:00
this . mail _isMainWindow = isMainView = true ;
2013-09-02 17:15:35 +02:00
break ;
case 'mail.display' :
2013-10-05 18:36:20 +02:00
this . mail _isMainWindow = false ;
2013-09-02 17:15:35 +02:00
isDisplay = true ;
2014-02-04 13:51:15 +01:00
this . mail _display ( ) ;
2013-09-02 17:15:35 +02:00
break ;
2013-10-01 13:29:54 +02:00
case 'mail.compose' :
2013-10-05 18:36:20 +02:00
this . mail _isMainWindow = false ;
2013-10-14 15:30:04 +02:00
isCompose = true ;
2014-01-18 15:01:07 +01:00
this . hide _cc _compose ( ) ;
break ;
2013-09-02 17:15:35 +02:00
}
2013-06-17 16:25:20 +02:00
}
2013-09-02 17:15:35 +02:00
//alert('action about to go down');
2013-10-08 16:23:46 +02:00
if ( isMainView )
{
this . mail _disablePreviewArea ( true ) ;
2014-01-11 15:16:36 +01:00
// Bind to nextmatch refresh to update folder status
var nm = this . et2 . getWidgetById ( 'nm' ) ;
2014-01-13 18:29:27 +01:00
if ( nm != null && ( typeof jQuery . _data ( nm ) . events == 'undefined' || typeof jQuery . _data ( nm ) . events . refresh == 'undefined' ) )
2014-01-11 15:16:36 +01:00
{
var self = this ;
$j ( nm ) . on ( 'refresh' , function ( ) { self . mail _refreshFolderStatus . call ( self , undefined , undefined , false ) ; } ) ;
}
2014-01-21 14:34:02 +01:00
var tree _wdg = this . et2 . getWidgetById ( this . nm _index + '[foldertree]' ) ;
if ( tree _wdg )
{
tree _wdg . set _onopenstart ( jQuery . proxy ( this . openstart _tree , this ) ) ;
tree _wdg . set _onopenend ( jQuery . proxy ( this . openend _tree , this ) ) ;
}
2013-10-08 16:23:46 +02:00
}
2013-09-02 17:15:35 +02:00
if ( isDisplay )
{
2013-10-18 11:58:25 +02:00
var subject = this . et2 . getWidgetById ( 'mail_displaysubject' ) ;
2014-02-10 23:41:53 +01:00
var body = this . et2 . getWidgetById ( 'mailDisplayBodySrc' ) ;
2013-09-02 17:15:35 +02:00
body . node . parentNode . style . top = subject . node . offsetTop + 40 + 'px' ;
2014-02-10 23:41:53 +01:00
var app _registry = egw . link _get _registry ( 'mail' ) ;
2014-03-03 14:10:27 +01:00
var w = 870 ;
2013-09-05 16:52:11 +02:00
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 ( ) ) ;
}
2013-10-01 13:29:54 +02:00
window . resizeTo ( ( w _h [ 0 ] ? w _h [ 0 ] : 870 ) , ( w _h [ 1 ] ? w _h [ 1 ] : ( screen . availHeight > egw _getWindowOuterHeight ( ) ? screen . availHeight : egw _getWindowOuterHeight ( ) ) ) ) ;
2013-09-02 17:15:35 +02:00
}
2013-10-14 15:30:04 +02:00
if ( isCompose )
{
var app _registry = egw . link _get _registry ( 'mail' ) ; //this.appname);
//console.log(app_registry);
w = 870 ;
if ( typeof app _registry [ 'edit' ] != 'undefined' && typeof app _registry [ 'edit_popup' ] != 'undefined' )
{
var w _h = app _registry [ 'edit_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]:870)+','+(w_h[1]?w_h[1]:egw_getWindowOuterHeight()));
2013-12-17 09:47:16 +01:00
//window.resizeTo((w_h[0]?w_h[0]:870),(w_h[1]?w_h[1]:(screen.availHeight>egw_getWindowOuterHeight()?screen.availHeight:egw_getWindowOuterHeight())));
window . resizeTo ( ( w _h [ 0 ] ? w _h [ 0 ] : 870 ) , ( w _h [ 1 ] ? w _h [ 1 ] : ( screen . availHeight < 800 ? screen . availHeight : 800 ) ) ) ;
2014-01-23 14:59:10 +01:00
this . compose _cc _expander ( ) ;
2013-10-14 15:30:04 +02:00
}
2013-10-16 13:22:53 +02:00
//Vacation By_date filter
if ( typeof et2 . templates [ 'mail.sieve.vacation' ] != 'undefined' )
{
this . vacationFilterStatusChange ( ) ;
}
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-10-18 11:58:25 +02:00
//var nm = this.et2.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);
2014-03-07 11:06:04 +01:00
if ( typeof _senders == 'undefined' || _senders . length == 0 )
2013-10-05 11:03:51 +02:00
{
if ( this . et2 . getArrayMgr ( "content" ) . getEntry ( 'mail_id' ) )
{
var _senders = [ ] ;
_senders . push ( { id : this . et2 . getArrayMgr ( "content" ) . getEntry ( 'mail_id' ) || '' } ) ;
}
2014-03-07 11:06:04 +01:00
if ( ( typeof _senders == 'undefined' || _senders . length == 0 ) && this . mail _isMainWindow )
2013-10-14 15:30:04 +02:00
{
if ( this . mail _currentlyFocussed )
{
var _senders = [ ] ;
_senders . push ( { id : this . mail _currentlyFocussed } ) ;
}
}
2013-10-05 11:03:51 +02:00
}
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 ;
} ) ;
2014-02-07 15:34:04 +01:00
// THE FOLLOWING IS PROBABLY NOT NEEDED, AS THE UNEVITABLE PREVIEW IS HANDLING THE COUNTER ISSUE
var messages = { } ;
messages [ 'msg' ] = [ _id ] ;
// When body is requested, mail is marked as read by the mail server. Update UI to match.
if ( typeof dataElem != 'undefined' && typeof dataElem . data != 'undefined' && typeof dataElem . data . flags != 'undefined' && typeof dataElem . data . flags . read != 'undefined' ) dataElem . data . flags . read = 'read' ;
if ( typeof dataElem != 'undefined' && typeof dataElem . data != 'undefined' && ( dataElem . data . class . indexOf ( 'unseen' ) >= 0 || dataElem . data . class . indexOf ( 'recent' ) >= 0 ) )
{
this . mail _removeRowClass ( messages , 'recent' ) ;
this . mail _removeRowClass ( messages , 'unseen' ) ;
// reduce counter without server roundtrip
this . mail _reduceCounterWithoutServerRoundtrip ( ) ;
// not needed, as an explizit read flags the message as seen anyhow
//egw.jsonq('mail.mail_ui.ajax_flagMessages',['read', messages, false]);
}
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-10-07 12:12:18 +02:00
* @ function
* @ memberOf mail
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 )
{
2014-03-07 11:06:04 +01:00
if ( typeof _elems == 'undefined' || _elems . length == 0 )
2013-10-05 11:03:51 +02:00
{
//console.log(this.et2.getArrayMgr('content').data,this.et2.getArrayMgr("content").getEntry('mail_id'));
2013-10-07 12:12:18 +02:00
if ( this . et2 && this . et2 . getArrayMgr ( "content" ) . getEntry ( 'mail_id' ) )
2013-10-05 11:03:51 +02:00
{
var _elems = [ ] ;
_elems . push ( { id : this . et2 . getArrayMgr ( "content" ) . getEntry ( 'mail_id' ) || '' } ) ;
}
2014-03-07 11:06:04 +01:00
if ( ( typeof _elems == 'undefined' || _elems . length == 0 ) && this . mail _isMainWindow )
2013-10-14 15:30:04 +02:00
{
if ( this . mail _currentlyFocussed )
{
var _elems = [ ] ;
_elems . push ( { id : this . mail _currentlyFocussed } ) ;
}
}
2013-10-05 11:03:51 +02:00
}
2014-01-30 14:37:36 +01:00
//console.log(_action, _elems);
2013-10-04 19:45:33 +02:00
// Extra info passed to egw.open()
var settings = {
// 'Source' Mail UID
id : '' ,
// How to pull data from the Mail IDs for the compose
from : ''
} ;
2013-10-09 18:44:03 +02:00
2013-10-05 11:03:51 +02:00
// We only handle one for everything but forward
settings . id = ( typeof _elems == 'undefined' ? '' : _elems [ 0 ] . id ) ;
2013-10-09 18:44:03 +02:00
2013-10-04 19:45:33 +02:00
switch ( _action . id )
2013-05-13 16:42:42 +02:00
{
2013-10-04 19:45:33 +02:00
case 'compose' :
if ( _elems . length == 1 )
{
2013-10-05 11:03:51 +02:00
//mail_parentRefreshListRowStyle(settings.id,settings.id);
2013-10-04 19:45:33 +02:00
}
else
{
return this . mail _compose ( 'forward' , _elems ) ;
}
break ;
case 'forward' :
case 'forwardinline' :
case 'forwardasattach' :
2013-10-08 16:23:46 +02:00
if ( _elems . length > 1 || _action . id == 'forwardasattach' )
2013-10-04 19:45:33 +02:00
{
2014-01-30 14:37:36 +01:00
settings . from = 'forward' ;
settings . mode = 'forwardasattach' ;
if ( typeof _elems != 'undefined' && _elems . length > 1 )
{
for ( var j = 1 ; j < _elems . length ; j ++ )
settings . id = settings . id + ',' + _elems [ j ] . id ;
}
2013-10-04 19:45:33 +02:00
}
else
{
settings . from = 'forward' ;
settings . mode = 'forwardinline' ;
}
break ;
default :
// No further client side processing needed for these
settings . from = _action . id ;
2013-07-20 09:23:55 +02:00
}
2013-10-07 17:28:49 +02:00
var compose _list = egw . getOpenWindows ( "mail" , /^compose_/ ) ;
var window _name = 'compose_' + compose _list . length + '_' + ( settings . from || '' ) + '_' + settings . id ;
2013-10-07 12:12:18 +02:00
return egw ( ) . open ( '' , 'mail' , 'add' , settings , window _name , 'mail' ) ;
2013-10-04 19:45:33 +02:00
} ,
2013-10-09 18:44:03 +02:00
2013-10-07 12:12:18 +02:00
/ * *
* Set content into a compose window
2013-10-09 18:44:03 +02:00
*
2013-10-07 12:12:18 +02:00
* @ function
* @ memberOf mail
2013-10-09 18:44:03 +02:00
*
2013-10-07 12:12:18 +02:00
* @ param { String } window _name The name of an open content window .
* @ param content Data to set into the window ' s fields
* @ param content . to Addresses to add to the to line
* @ param content . cc Addresses to add to the CC line
* @ param content . bcc Addresses to add to the BCC line
2013-10-09 18:44:03 +02:00
*
2013-10-07 12:12:18 +02:00
* @ return { boolean } Success
* /
setCompose : function ( window _name , content )
{
// Get window
var compose = window . open ( '' , window _name ) ;
if ( ! compose || compose . closed ) return false ;
2013-10-09 18:44:03 +02:00
2013-10-07 12:12:18 +02:00
// Get etemplate of popup
var compose _et2 = compose . etemplate2 . getByApplication ( 'mail' ) ;
if ( ! compose _et2 || compose _et2 . length != 1 || ! compose _et2 [ 0 ] . widgetContainer )
{
return false ;
}
2013-10-09 18:44:03 +02:00
2013-10-07 12:12:18 +02:00
// Set each field provided
var success = true ;
for ( var field in content )
{
try
{
var widget = compose _et2 [ 0 ] . widgetContainer . getWidgetById ( field ) ;
2013-10-09 18:44:03 +02:00
2013-10-07 12:12:18 +02:00
// Merge array values, replace strings
var value = widget . getValue ( ) || content [ field ] ;
if ( jQuery . isArray ( value ) )
{
if ( jQuery . isArray ( content [ field ] ) )
{
value . concat ( content [ field ] ) ;
}
else
{
value . push ( content [ field ] ) ;
}
}
widget . set _value ( value ) ;
}
catch ( e )
{
egw . log ( "error" , "Unable to set field %s to '%s' in window '%s'" , field , content [ field ] , window _name ) ;
success = false ;
continue ;
}
}
return success ;
} ,
2013-08-21 12:47:20 +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 ) {
2013-10-18 11:58:25 +02:00
var splitter = this . et2 . 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 ( ) ;
2013-11-21 00:35:27 +01:00
if ( splitter . isDocked ( ) )
{
this . mail _previewAreaActive = false ;
}
2013-10-18 11:58:25 +02:00
//this.et2.getWidgetById('mailPreviewHeadersFrom').set_disabled(_value);
//this.et2.getWidgetById('mailPreviewHeadersTo').set_disabled(_value);
//this.et2.getWidgetById('mailPreviewHeadersDate').set_disabled(_value);
//this.et2.getWidgetById('mailPreviewHeadersSubject').set_disabled(_value);
this . et2 . getWidgetById ( 'mailPreview' ) . set _disabled ( _value ) ;
2013-05-27 15:48:55 +02:00
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
}
} ,
2014-02-04 13:51:15 +01:00
/ * *
* Create an expand on click box
*
* @ param { object } _expContent an object with at least these elements
* { build _children , data _one , data , widget , line }
*
* @ param { object } _dataElem includes data of the widget which need to be expand
*
* @ return _dataElem content of widgets
* /
url _email _expandOnClick : function ( _expContent , _dataElem )
{
for ( var j = 0 ; j < _expContent . length ; j ++ )
{
var field = _expContent [ j ] || [ ] ;
var content = _dataElem . data [ field . data ] || [ ] ;
// Add in single address, if there
if ( typeof field . data _one != 'undefined' )
{
content . unshift ( _dataElem . data [ field . data _one ] ) ;
// Unique
content = content . filter ( function ( value , index , self ) {
return self . indexOf ( value ) === index ;
} ) ;
}
// Disable whole box if there are none
var line = this . et2 . getWidgetById ( field . line ) ;
if ( line != null ) line . set _disabled ( content . length == 0 ) ;
var widget = this . et2 . getWidgetById ( field . widget ) ;
if ( widget == null ) continue ;
$j ( widget . getDOMNode ( ) ) . removeClass ( 'visible' ) ;
// Programatically build the child elements
if ( field . build _children )
{
// Remove any existing
var children = widget . getChildren ( ) ;
for ( var i = children . length - 1 ; i >= 0 ; i -- )
{
children [ i ] . destroy ( ) ;
widget . removeChild ( children [ i ] ) ;
}
// Add for current record
for ( var i = 0 ; i < content . length ; i ++ )
{
var value = content [ i ] ;
var email = et2 _createWidget ( 'url-email' , { value : value , readonly : true } , widget ) ;
email . loadingFinished ( ) ;
}
}
else
{
widget . set _value ( { content : content } ) ;
}
// Show or hide button, as needed
line . iterateOver ( function ( button ) {
// Avoid binding to any child buttons
if ( button . getParent ( ) != line ) return ;
button . set _disabled (
// Disable if only 1 address
content . length <= 1 || (
// Disable if all content is visible
$j ( widget . getDOMNode ( ) ) . innerWidth ( ) >= widget . getDOMNode ( ) . scrollWidth &&
$j ( widget . getDOMNode ( ) ) . innerHeight ( ) >= widget . getDOMNode ( ) . scrollHeight )
) ;
} , this , et2 _button ) ;
}
return _dataElem ;
} ,
/ * *
* Set values for mail dispaly From , Sender , To , Cc , and Bcc
* Additionally , apply expand on click feature on thier widgets
2014-02-05 13:23:04 +01:00
*
2014-02-04 13:51:15 +01:00
* /
mail _display : function ( )
{
var dataElem = { data : { FROM : "" , SENDER : "" , TO : "" , CC : "" , BCC : "" } } ;
var content = this . et2 . getArrayMgr ( 'content' ) . data ;
var expand _content = [
{ build _children : true , data _one : 'FROM' , data : 'FROM' , widget : 'FROM' , line : 'mailDisplayHeadersFrom' } ,
{ build _children : true , data : 'SENDER' , widget : 'SENDER' , line : 'mailDisplayHeadersSender' } ,
{ build _children : true , data : 'TO' , widget : 'TO' , line : 'mailDisplayHeadersTo' } ,
{ build _children : true , data : 'CC' , widget : 'CC' , line : 'mailDisplayHeadersCc' } ,
{ build _children : true , data : 'BCC' , widget : 'BCC' , line : 'mailDisplayHeadersBcc' }
] ;
if ( typeof content != 'undefiend' )
{
dataElem . data = jQuery . extend ( dataElem . data , content ) ;
this . url _email _expandOnClick ( expand _content , dataElem ) ;
2014-02-05 17:17:37 +01:00
var toolbaractions = ( ( typeof dataElem != 'undefined' && typeof dataElem . data != 'undefined' && typeof dataElem . data . displayToolbaractions != 'undefined' ) ? JSON . parse ( dataElem . data . displayToolbaractions ) : undefined ) ;
if ( toolbaractions ) this . et2 . getWidgetById ( 'displayToolbar' ) . set _actions ( toolbaractions ) ;
2014-02-04 13:51:15 +01:00
}
2014-02-05 13:23:04 +01:00
2014-02-04 13:51:15 +01: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 .
* /
2013-10-09 16:35:03 +02:00
mail _preview : function ( selected , nextmatch ) {
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)
2013-12-17 09:47:16 +01:00
//dataElem.data is populated, when available with fromaddress(string),toaddress(string),additionaltoaddress(array),ccaddress (array)
2014-03-03 15:56:12 +01:00
var dataElem = { data : { subject : "" , fromaddress : "" , toaddress : "" , ccaddress : "" , date : "" , attachmentsBlock : "" } } ;
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-12-17 01:26:29 +01:00
dataElem = jQuery . extend ( dataElem , egw . dataGetUIDdata ( _id ) ) ;
2013-02-19 17:30:59 +01:00
}
2013-10-01 13:29:54 +02:00
//get_class does not exist yet
2013-10-18 11:58:25 +02:00
//var pAAClass = this.et2.getWidgetById('previewAttachmentArea').get_class();
2013-10-01 13:29:54 +02:00
//console.log(pAAClass);
2014-02-10 20:52:23 +01:00
if ( this . et2 . getWidgetById ( 'previewAttachmentArea' ) && typeof _id != 'undefined' && _id != '' && typeof dataElem !== 'undefined' )
2013-10-05 18:36:20 +02:00
{
2013-10-18 11:58:25 +02:00
this . et2 . getWidgetById ( 'previewAttachmentArea' ) . set _class ( 'previewAttachmentArea' ) ;
2013-10-05 18:36:20 +02:00
}
else
{
2014-02-10 20:52:23 +01:00
// Leave if we're here and there is nothing selected, too many, or no data
this . et2 . getWidgetById ( 'previewAttachmentArea' ) . set _value ( { content : [ ] } ) ;
this . et2 . getWidgetById ( 'previewAttachmentArea' ) . set _class ( 'previewAttachmentArea noContent mail_DisplayNone' ) ;
var IframeHandle = this . et2 . getWidgetById ( 'messageIFRAME' ) ;
IframeHandle . set _src ( 'about:blank' ) ;
this . mail _disablePreviewArea ( true ) ;
2013-10-05 18:36:20 +02:00
return ;
}
2013-12-17 01:26:29 +01:00
// Widget ID:data key map of widgets we can directly set from cached data
var data _widgets = {
'previewFromAddress' : 'fromaddress' ,
'previewDate' : 'date' ,
'previewSubject' : 'subject'
} ;
// Set widget values from cached data
for ( var id in data _widgets )
{
var widget = this . et2 . getWidgetById ( id ) ;
if ( widget == null ) continue ;
widget . set _value ( dataElem . data [ data _widgets [ id ] ] || "" ) ;
}
2014-01-18 18:01:29 +01:00
// Blank first, so we don't show previous email while loading
var IframeHandle = this . et2 . getWidgetById ( 'messageIFRAME' ) ;
IframeHandle . set _src ( 'about:blank' ) ;
2013-12-23 23:37:40 +01:00
// Set up additional content that can be expanded.
// We add a new URL widget for each address, so they get all the UI
2013-12-18 19:40:01 +01:00
// TO addresses have the first one split out, not all together
2013-12-17 01:26:29 +01:00
// list of keys:
2013-12-23 23:37:40 +01:00
var expand _content = [
{ build _children : true , data _one : 'toaddress' , data : 'additionaltoaddress' , widget : 'additionalToAddress' , line : 'mailPreviewHeadersTo' } ,
{ build _children : true , data : 'ccaddress' , widget : 'additionalCCAddress' , line : 'mailPreviewHeadersCC' } ,
{ build _children : false , data : 'attachmentsBlock' , widget : 'previewAttachmentArea' , line : 'mailPreviewHeadersAttachments' }
2013-12-17 01:26:29 +01:00
] ;
2014-01-13 15:22:58 +01:00
2014-02-04 13:51:15 +01:00
dataElem = this . url _email _expandOnClick ( expand _content , dataElem ) ;
2014-02-05 13:23:04 +01:00
2014-01-13 15:22:58 +01:00
// Update the internal list of selected mails, if needed
if ( this . mail _selectedMails . indexOf ( _id ) < 0 )
{
this . mail _selectedMails . push ( _id ) ;
}
2013-05-27 15:48:55 +02:00
this . mail _disablePreviewArea ( false ) ;
2014-01-18 18:01:29 +01:00
// Request email body from server
2013-04-13 12:30:07 +02:00
IframeHandle . set _src ( egw . link ( '/index.php' , { menuaction : 'mail.mail_ui.loadEmailBody' , _messageID : _id } ) ) ;
2014-01-18 18:01:29 +01:00
2013-06-05 12:41:38 +02:00
var messages = { } ;
messages [ 'msg' ] = [ _id ] ;
2014-01-13 15:22:58 +01:00
// When body is requested, mail is marked as read by the mail server. Update UI to match.
2014-01-16 13:07:45 +01:00
if ( typeof dataElem != 'undefined' && typeof dataElem . data != 'undefined' && typeof dataElem . data . flags != 'undefined' && typeof dataElem . data . flags . read != 'undefined' ) dataElem . data . flags . read = 'read' ;
2014-02-10 10:56:40 +01:00
if ( typeof dataElem != 'undefined' && typeof dataElem . data != 'undefined' && typeof dataElem . data . class != 'undefined' && ( dataElem . data . class . indexOf ( 'unseen' ) >= 0 || dataElem . data . class . indexOf ( 'recent' ) >= 0 ) )
2014-02-07 15:34:04 +01:00
{
this . mail _removeRowClass ( messages , 'recent' ) ;
this . mail _removeRowClass ( messages , 'unseen' ) ;
// reduce counter without server roundtrip
this . mail _reduceCounterWithoutServerRoundtrip ( ) ;
egw . jsonq ( 'mail.mail_ui.ajax_flagMessages' , [ 'read' , messages , false ] ) ;
}
2014-01-18 18:01:29 +01:00
// Pre-load next email already so user gets it faster
// Browser will cache the file for us
2014-01-20 16:25:40 +01:00
/ *
2014-01-20 12:53:19 +01:00
var fO = egw _getObjectManager ( 'mail' , false , 1 ) . getObjectById ( 'nm' ) . getFocusedObject ( ) ;
var next = false ;
if ( fO ) next = fO . getNext ( 1 ) ;
2014-01-20 09:19:22 +01:00
// Stop until we get all the details worked out - server marks as seen automatically
if ( false && next && next . id )
2014-01-18 18:01:29 +01:00
{
if ( this . preview _preload . timer != null )
{
window . clearTimeout ( this . preview _preload . timer ) ;
}
// Wait 0.5s to avoid flooding server if user is scrolling through their mail
this . preview _preload . timer = window . setTimeout ( jQuery . proxy ( function ( ) {
this . preview _preload . request = jQuery . get (
egw . link ( '/index.php' , { menuaction : 'mail.mail_ui.loadEmailBody' , _messageID : next . id } )
) ;
} , this ) , 500 ) ;
}
2014-01-20 16:25:40 +01:00
* /
2013-04-13 12:30:07 +02:00
} ,
2013-05-27 15:48:55 +02:00
2013-12-03 15:38:50 +01:00
/ * *
2013-12-23 23:37:40 +01:00
* If a preview header is partially hidden , this is the handler for clicking the
* expand button that shows all the content for that header .
* The button must be directly after the widget to be expanded in the template .
* The widget to be expended is set in the event data .
*
2013-12-03 15:38:50 +01:00
* requires : mainWindow , one mail selected for preview
2014-02-12 21:12:59 +01:00
*
2014-02-11 11:45:01 +01:00
* @ param { jQuery event } event
* @ param { Object } widget
2013-12-23 23:37:40 +01:00
* @ param { DOMNode } button
2013-12-03 15:38:50 +01:00
* /
2014-02-11 11:45:01 +01:00
showAllHeader : function ( event , widget , button ) {
2013-12-18 01:37:30 +01:00
// Show list as a list
var list = jQuery ( button ) . prev ( ) ;
2014-02-11 11:45:01 +01:00
/ * i f ( l i s t . l e n g t h < = 0 )
{
list = jQuery ( button . target ) . prev ( ) ;
} * /
2014-02-12 21:12:59 +01:00
2013-12-18 01:37:30 +01:00
list . toggleClass ( 'visible' ) ;
// Revert if user clicks elsewhere
$j ( 'body' ) . one ( 'click' , list , function ( ev ) {
ev . data . removeClass ( 'visible' ) ;
2013-12-03 17:46:32 +01:00
} ) ;
2013-12-03 15:38:50 +01: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-10-18 11:58:25 +02:00
var IframeHandle = this . et2 . getWidgetById ( 'messageIFRAME' ) ;
2013-04-13 12:30:07 +02:00
IframeHandle . set _value ( '' ) ;
} ,
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
* /
2014-01-21 12:28:43 +01:00
mail _refreshFolderStatus : function ( _nodeID , mode , _refreshGridArea , _refreshQuotaDisplay ) {
2014-01-09 09:36:22 +01:00
if ( typeof _nodeID != 'undefined' && typeof _nodeID [ _nodeID ] != 'undefined' && _nodeID [ _nodeID ] )
{
_refreshGridArea = _nodeID [ _refreshGridArea ] ;
mode = _nodeID [ mode ] ;
_nodeID = _nodeID [ _nodeID ] ;
}
2013-04-13 12:30:07 +02:00
var nodeToRefresh = 0 ;
var mode2use = "none" ;
2013-11-19 16:14:36 +01:00
if ( typeof _refreshGridArea == 'undefined' ) _refreshGridArea = true ;
2014-01-21 12:28:43 +01:00
if ( typeof _refreshQuotaDisplay == 'undefined' ) _refreshQuotaDisplay = true ;
2013-04-13 12:30:07 +02:00
if ( _nodeID ) nodeToRefresh = _nodeID ;
if ( mode ) {
if ( mode == "forced" ) { mode2use = mode ; }
}
try
{
2013-10-18 11:58:25 +02:00
var tree _wdg = this . et2 . 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('#,#'));
2014-01-27 13:18:16 +01:00
this . mail _queueRefreshFolderList ( ( mode == 'thisfolderonly' && nodeToRefresh ? [ _nodeID ] : activeFolders ) ) ;
2013-11-19 16:14:36 +01:00
if ( _refreshGridArea )
{
// 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();
this . mail _refreshMessageGrid ( ) ;
}
2014-01-21 12:28:43 +01:00
if ( _refreshQuotaDisplay )
{
this . mail _refreshQuotaDisplay ( ) ;
}
2013-12-09 10:57:03 +01:00
//the two lines below are not working yet.
//var no =tree_wdg.getSelectedNode();
//tree_wdg.focusItem(no.id);
2013-04-13 12:30:07 +02:00
} catch ( e ) { } // ignore the error; maybe the template is not loaded yet
} ,
2013-07-25 17:35:44 +02:00
2013-10-18 11:58:25 +02:00
/ * *
* mail _refreshQuotaDisplay , function to call to read the quota for the active server
*
* /
mail _refreshQuotaDisplay : function ( _server )
{
egw . json ( 'mail.mail_ui.ajax_refreshQuotaDisplay' , [ _server ] )
. sendRequest ( true ) ;
} ,
/ * *
* mail _setQuotaDisplay , function to call to read the quota for the active server
*
* /
mail _setQuotaDisplay : function ( _data )
{
//this.et2 should do the same as etemplate2.getByApplication('mail')[0].widgetContainer
var quotabox = this . et2 . getWidgetById ( this . nm _index + '[quotainpercent]' ) ;
//console.log(_data,quotabox);
//try to set it via set_value and set label
this . et2 . getWidgetById ( this . nm _index + '[quotainpercent]' ) . set _class ( _data . data . quotaclass ) ;
this . et2 . getWidgetById ( this . nm _index + '[quotainpercent]' ) . set _value ( _data . data . quotainpercent ) ;
this . et2 . getWidgetById ( this . nm _index + '[quotainpercent]' ) . set _label ( _data . data . quota ) ;
} ,
2013-07-25 17:35:44 +02:00
2013-04-13 12:30:07 +02:00
/ * *
2014-01-27 13:18:16 +01:00
* Queues a refreshFolderList request for 10 ms . Actually this will just execute the
2013-04-13 12:30:07 +02:00
* code after the calling script has finished .
* /
mail _queueRefreshFolderList : function ( _folders )
2013-02-13 15:02:02 +01:00
{
2014-01-27 13:18:16 +01:00
// as jsonq is too fast wrap it to be delayed a bit, to ensure the folder actions
// are executed last of the queue
2013-04-13 12:30:07 +02:00
window . setTimeout ( function ( ) {
2014-01-27 13:18:16 +01:00
egw . jsonq ( 'mail.mail_ui.ajax_setFolderStatus' , [ _folders ] ) ;
} , 100 ) ;
2013-04-13 12:30:07 +02:00
} ,
2013-07-25 17:35:44 +02:00
2014-02-11 16:20:44 +01:00
/ * *
* mail _CheckFolderNoSelect - implementation of the mail _CheckFolderNoSelect action to control right click options on the tree
*
* @ param _action
* @ param _senders - the representation of the tree leaf to be manipulated
* /
mail _CheckFolderNoSelect : function ( action , _senders , _currentNode ) {
2014-02-12 14:10:04 +01:00
//console.log(action,_senders,_currentNode);
2014-02-11 16:20:44 +01:00
// Abort if user selected an un-selectable node
// Use image over anything else because...?
2014-02-12 14:10:04 +01:00
var ftree , node ;
ftree = this . et2 . getWidgetById ( this . nm _index + '[foldertree]' ) ;
if ( ftree )
{
node = ftree . getNode ( _senders [ 0 ] . id ) ;
}
2014-02-11 17:01:31 +01:00
2014-02-12 14:10:04 +01:00
if ( node && node . im0 . indexOf ( 'NoSelect' ) !== - 1 )
2014-02-11 16:20:44 +01:00
{
//ftree.reSelectItem(_previous);
return false ;
}
2014-02-11 17:01:31 +01:00
2014-02-11 16:20:44 +01:00
return true ;
} ,
2013-04-13 12:30:07 +02:00
/ * *
* mail _setFolderStatus , function to set the status for the visible folders
* /
mail _setFolderStatus : function ( _status ) {
2013-10-18 11:58:25 +02:00
var ftree = this . et2 . getWidgetById ( this . nm _index + '[foldertree]' ) ;
2013-11-27 14:07:54 +01:00
for ( var i in _status ) {
ftree . setLabel ( i , _status [ i ] ) ;
2014-02-05 13:23:04 +01:00
// display folder-name bold for unseen mails
ftree . setStyle ( i , 'font-weight: ' + ( _status [ i ] . match ( this . _unseen _regexp ) ? 'bold' : 'normal' ) ) ;
2013-11-27 14:07:54 +01:00
//alert(i +'->'+_status[i]);
}
2013-04-13 12:30:07 +02:00
} ,
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-10-18 11:58:25 +02:00
var ftree = this . et2 . 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
2014-01-13 14:06:29 +01:00
if ( typeof _status [ i ] [ 'olddesc' ] !== 'undefined' && _status [ i ] [ 'olddesc' ] !== '#skip-user-interaction-message#' ) egw _message ( this . egw . lang ( "Renamed Folder %1 to %2" , _status [ i ] [ 'olddesc' ] , _status [ i ] [ 'desc' ] ) ) ;
2013-04-29 16:56:33 +02:00
ftree . renameItem ( i , _status [ i ] [ 'id' ] , _status [ i ] [ 'desc' ] ) ;
2014-02-06 13:48:01 +01:00
ftree . setStyle ( i , 'font-weight: ' + ( _status [ i ] [ 'desc' ] . match ( this . _unseen _regexp ) ? 'bold' : 'normal' ) ) ;
2013-04-29 16:56:33 +02:00
//alert(i +'->'+_status[i]['id']+'+'+_status[i]['desc']);
2013-05-07 10:26:17 +02:00
if ( _status [ i ] [ 'id' ] == selectedNode . id )
{
2013-10-18 11:58:25 +02:00
var nm = this . et2 . 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-10-18 11:58:25 +02:00
var ftree = this . et2 . 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
2014-01-13 14:06:29 +01:00
if ( typeof _status [ i ] !== 'undefined' && _status [ i ] !== '#skip-user-interaction-message#' ) egw _message ( this . egw . lang ( "Removed Folder %1 " , _status [ i ] ) ) ;
2013-05-13 16:42:42 +02:00
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-10-18 11:58:25 +02:00
var nm = this . et2 . 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
2014-01-11 12:58:31 +01:00
* @ param { Object . < string , string > | Object . < string , Object } } _status
* Object with the required data ( KEY id , VALUE desc ) , or ID => { new data }
2013-05-21 10:46:54 +02:00
* /
mail _reloadNode : function ( _status ) {
2013-07-17 14:01:01 +02:00
//console.log('mail_reloadNode',_status);
2013-10-18 11:58:25 +02:00
var ftree = this . et2 . 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
2014-01-11 12:58:31 +01:00
if ( typeof _status [ i ] !== 'undefined' && _status [ i ] !== '#skip-user-interaction-message#' )
2013-05-21 10:46:54 +02:00
{
2014-02-06 13:48:01 +01:00
egw _message ( this . egw . lang ( "Reloaded Folder %1 " , typeof _status [ i ] == "string" ? _status [ i ] . replace ( this . _unseen _regexp , '' ) : _status [ i ] . text . replace ( this . _unseen _regexp , '' ) ) ) ;
2013-05-21 10:46:54 +02:00
}
2014-01-11 12:58:31 +01:00
ftree . refreshItem ( i , typeof _status [ i ] == "object" ? _status [ i ] : null ) ;
2014-02-06 13:48:01 +01:00
if ( typeof _status [ i ] == "string" ) ftree . setStyle ( i , 'font-weight: ' + ( _status [ i ] . match ( this . _unseen _regexp ) ? 'bold' : 'normal' ) ) ;
2014-01-11 12:58:31 +01:00
}
var selectedNodeAfter = ftree . getSelectedNode ( ) ;
// If selected folder changed, refresh nextmatch
if ( selectedNodeAfter != null && selectedNodeAfter . id != selectedNode . id )
{
var nm = this . et2 . getWidgetById ( this . nm _index ) ;
nm . activeFilters [ "selectedFolder" ] = selectedNodeAfter . id ;
nm . applyFilters ( ) ;
2013-05-21 10:46:54 +02:00
}
} ,
2013-04-13 12:30:07 +02:00
/ * *
* mail _refreshMessageGrid , function to call to reread ofthe current folder
* /
2013-10-05 11:03:51 +02:00
mail _refreshMessageGrid : function ( _isPopup ) {
if ( typeof _isPopup == 'undefined' ) _isPopup = false ;
var nm ;
2013-10-14 15:30:04 +02:00
if ( _isPopup && ! this . mail _isMainWindow )
2013-10-05 11:03:51 +02:00
{
nm = window . opener . etemplate2 . getByApplication ( 'mail' ) [ 0 ] . widgetContainer . getWidgetById ( this . nm _index ) ;
}
else
{
2013-10-18 11:58:25 +02:00
nm = this . et2 . getWidgetById ( this . nm _index ) ;
2013-10-05 11:03:51 +02:00
}
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
/ * *
* mail _getMsg - gets the current Message
* @ return string
* /
mail _getMsg : function ( )
2013-02-13 15:02:02 +01:00
{
2013-10-18 11:58:25 +02:00
var msg _wdg = this . et2 . getWidgetById ( 'msg' ) ;
2013-04-13 12:30:07 +02:00
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-10-18 11:58:25 +02:00
var msg _wdg = this . et2 . getWidgetById ( 'msg' ) ;
2013-04-13 12:30:07 +02:00
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-10-05 18:36:20 +02:00
var calledFromPopup = false ;
2014-03-07 11:06:04 +01:00
if ( typeof _elems == 'undefined' || _elems . length == 0 )
2013-10-05 18:36:20 +02:00
{
calledFromPopup = true ;
if ( this . et2 . getArrayMgr ( "content" ) . getEntry ( 'mail_id' ) )
{
var _elems = [ ] ;
_elems . push ( { id : this . et2 . getArrayMgr ( "content" ) . getEntry ( 'mail_id' ) || '' } ) ;
}
2014-03-07 11:06:04 +01:00
if ( ( typeof _elems == 'undefined' || _elems . length == 0 ) && this . mail _isMainWindow )
2013-10-14 15:30:04 +02:00
{
if ( this . mail _currentlyFocussed )
{
var _elems = [ ] ;
_elems . push ( { id : this . mail _currentlyFocussed } ) ;
}
}
2013-10-05 18:36:20 +02:00
}
2013-04-13 12:30:07 +02:00
var msg = this . mail _getFormData ( _elems ) ;
//alert(_action.id+','+ msg);
2013-10-05 18:36:20 +02:00
if ( ! calledFromPopup ) this . mail _setRowClass ( _elems , 'deleted' ) ;
this . mail _deleteMessages ( msg , 'no' , calledFromPopup ) ;
if ( calledFromPopup && this . mail _isMainWindow == false ) window . close ( ) ;
2013-05-27 15:48:55 +02:00
} ,
2014-02-07 15:34:04 +01:00
/ * *
* function to find ( and reduce ) unseen count from folder - name
* /
mail _reduceCounterWithoutServerRoundtrip : function ( )
{
2014-03-03 14:10:27 +01:00
var ftree = this . et2 . getWidgetById ( this . nm _index + '[foldertree]' ) ;
2014-02-07 15:34:04 +01:00
var _foldernode = ftree . getSelectedNode ( ) ;
var counter = _foldernode . label . match ( this . _unseen _regexp ) ;
2014-02-11 13:18:03 +01:00
var icounter = 0 ;
if ( counter ) icounter = parseInt ( counter [ 0 ] . replace ( ' (' , '' ) . replace ( ')' , '' ) ) ;
2014-02-07 15:34:04 +01:00
if ( icounter > 0 )
{
var newcounter = icounter - 1 ;
if ( newcounter > 0 ) _foldernode . label = _foldernode . label . replace ( ' (' + String ( icounter ) + ')' , ' (' + String ( newcounter ) + ')' ) ;
if ( newcounter == 0 ) _foldernode . label = _foldernode . label . replace ( ' (' + String ( icounter ) + ')' , '' ) ;
ftree . setLabel ( _foldernode . id , _foldernode . label ) ;
}
} ,
2014-02-05 13:23:04 +01:00
/ * *
* Regular expression to find ( and remove ) unseen count from folder - name
* /
2014-02-06 13:48:01 +01:00
_unseen _regexp : / \([0-9]+\)$/ ,
2014-02-05 13:23:04 +01:00
2014-02-12 11:56:44 +01:00
/ * *
* mail _splitRowId
* /
mail _splitRowId : function ( _rowID )
{
2014-03-03 14:10:27 +01:00
var res = _rowID . split ( '::' ) ;
2014-02-12 11:56:44 +01:00
// as a rowID is perceeded by app::, should be mail!
if ( res . length == 4 && parseInt ( res [ 0 ] ) != NaN )
{
// we have an own created rowID; prepend app=mail
res . unshift ( 'mail' ) ;
}
return res ;
} ,
2013-05-27 15:48:55 +02:00
/ * *
* Delete mails - actually calls the backend function for deletion
* takes in all arguments
* @ param _msg - message list
* @ param _action - optional action
* /
2013-10-05 18:36:20 +02:00
mail _deleteMessages : function ( _msg , _action , _calledFromPopup )
2013-05-27 15:48:55 +02:00
{
2014-02-12 11:56:44 +01:00
var message , ftree , _foldernode , displayname ;
2014-02-04 12:31:13 +01:00
ftree = this . et2 . getWidgetById ( this . nm _index + '[foldertree]' ) ;
2014-02-12 11:56:44 +01:00
if ( ftree )
{
_foldernode = ftree . getSelectedNode ( ) ;
2014-02-04 12:31:13 +01:00
2014-02-12 11:56:44 +01:00
displayname = _foldernode . label . replace ( this . _unseen _regexp , '' ) ;
}
else
{
message = this . mail _splitRowId ( _msg [ 'msg' ] [ 0 ] ) ;
if ( message [ 3 ] ) _foldernode = displayname = jQuery . base64Decode ( message [ 3 ] ) ;
}
2014-01-17 19:00:36 +01:00
// Tell server
2013-09-10 22:41:18 +02:00
egw . json ( 'mail.mail_ui.ajax_deleteMessages' , [ _msg , ( typeof _action == 'undefined' ? 'no' : _action ) ] )
2014-01-17 19:00:36 +01:00
. sendRequest ( true ) ;
// Update list
2014-02-12 11:56:44 +01:00
//var ids = [];
//for (var i = 0; i < _msg['msg'].length; i++)
//{
// ids.push(_msg['msg'][i].replace(/mail::/,''));
//}
//egw_refresh(this.egw.lang("deleted %1 messages in %2",_msg['msg'].length,(displayname?displayname:egw.lang('current folder'))),'mail',ids,'delete');
egw _message ( this . egw . lang ( "deleted %1 messages in %2" , _msg [ 'msg' ] . length , ( displayname ? displayname : egw . lang ( 'current Folder' ) ) ) ) ;
2014-01-13 14:06:29 +01:00
} ,
/ * *
* Delete mails show result - called from the backend function for display of deletionmessages
* takes in all arguments
* @ param _msg - message list
* /
mail _deleteMessagesShowResult : function ( _msg )
{
2014-02-12 11:56:44 +01:00
// Update list
var ids = [ ] ;
for ( var i = 0 ; i < _msg [ 'msg' ] . length ; i ++ )
{
ids . push ( _msg [ 'msg' ] [ i ] . replace ( /mail::/ , '' ) ) ;
}
//egw_message(_msg['egw_message']);
egw _refresh ( _msg [ 'egw_message' ] , 'mail' , ids , 'delete' ) ;
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' ] ;
2014-03-03 14:10:27 +01:00
if ( confirm ( reason ) )
2013-05-27 15:48:55 +02:00
{
this . mail _deleteMessages ( messageList , 'remove_immediately' ) ;
}
else
{
2014-01-13 14:06:29 +01:00
egw _message ( this . egw . lang ( 'canceled deletion due to userinteraction' ) ) ;
2013-05-27 15:48:55 +02:00
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
} ,
2013-07-25 17:35:44 +02:00
2013-04-13 12:30:07 +02:00
/ * *
* mail _emptyTrash
* /
2014-01-17 10:59:25 +01:00
mail _emptyTrash : function ( action , _senders ) {
var server = _senders [ 0 ] . iface . id . split ( '::' ) ;
//console.log(action,_senders,FolderName);
2014-01-13 14:06:29 +01:00
egw _message ( this . egw . lang ( 'empty trash' ) ) ;
2014-01-17 10:59:25 +01:00
egw . json ( 'mail.mail_ui.ajax_emptyTrash' , [ server [ 0 ] ] )
2013-09-10 22:41:18 +02:00
. sendRequest ( true ) ;
2014-01-17 10:59:25 +01:00
// since the json reply is using egw_refresh, we should not need to call refreshFolderStatus
// as the actions thereof are now bound to run after grid refresh
//this.mail_refreshFolderStatus();
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
* /
2014-01-17 10:59:25 +01:00
mail _compressFolder : function ( action , _senders ) {
//console.log(action,_senders,FolderName);
2014-01-13 14:06:29 +01:00
egw _message ( this . egw . lang ( 'compress folder' ) ) ;
2014-01-21 15:46:00 +01:00
egw . jsonq ( 'mail.mail_ui.ajax_compressFolder' , [ _senders [ 0 ] . iface . id ] ) ;
// .sendRequest(true);
2014-01-17 10:59:25 +01:00
// since the json reply is using egw_refresh, we should not need to call refreshFolderStatus
// as the actions thereof are now bound to run after grid refresh
2014-02-11 16:20:44 +01:00
//this.mail_refreshFolderStatus();
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
2014-01-22 10:32:18 +01:00
* @ param { boolean } getFolders Flag to indicate that the profile needs the mail
* folders . False means they 're already loaded in the tree, and we don' t need
* them again
2013-04-13 12:30:07 +02:00
* /
2014-01-22 10:32:18 +01:00
mail _changeProfile : function ( folder , _widget , getFolders ) {
if ( typeof getFolders == 'undefined' )
{
getFolders = true ;
}
2013-04-13 12:30:07 +02:00
// alert(folder);
2014-02-06 13:48:01 +01:00
egw _message ( this . egw . lang ( 'Connect to Profile %1' , _widget . getSelectedLabel ( ) . replace ( this . _unseen _regexp , '' ) ) ) ;
2014-01-22 10:32:18 +01:00
this . lock _tree ( ) ;
egw . json ( 'mail.mail_ui.ajax_changeProfile' , [ folder , getFolders ] , jQuery . proxy ( function ( ) {
// Profile changed, select inbox
var inbox = folder + '::INBOX' ;
_widget . reSelectItem ( inbox )
this . mail _changeFolder ( inbox , _widget , '' ) ;
this . unlock _tree ( ) ;
} , this ) )
. sendRequest ( true ) ;
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
2014-01-21 19:56:03 +01:00
* @ param _folder , the ID of the selected Node
2013-04-13 12:30:07 +02:00
* @ param _widget , handle to the tree widget
2014-01-21 19:56:03 +01:00
* @ param { string } _previous - Previously selected node ID
2013-04-13 12:30:07 +02:00
* /
2014-01-21 19:56:03 +01:00
mail _changeFolder : function ( _folder , _widget , _previous ) {
// Abort if user selected an un-selectable node
// Use image over anything else because...?
var img = _widget . getSelectedNode ( ) . images [ 0 ] ;
if ( img . indexOf ( 'NoSelect' ) !== - 1 )
2013-02-20 12:31:57 +01:00
{
2014-01-21 19:56:03 +01:00
_widget . reSelectItem ( _previous ) ;
return ;
2013-02-20 12:31:57 +01:00
}
2014-01-21 19:56:03 +01:00
// Check if this is a top level node and
// change profile if server has changed
var server = _folder . split ( '::' ) ;
var previousServer = _previous . split ( '::' ) ;
var profile _selected = ( _folder . indexOf ( '::' ) === - 1 ) ;
if ( server [ 0 ] != previousServer [ 0 ] && profile _selected )
{
// mail_changeProfile triggers a refresh, no need to do any more
2014-01-22 10:32:18 +01:00
return this . mail _changeProfile ( _folder , _widget , _widget . getSelectedNode ( ) . childsCount == 0 ) ;
2014-01-21 19:56:03 +01:00
}
// Apply new selected folder to list, which updates data
2013-08-21 12:47:20 +02:00
var nm = _widget . getRoot ( ) . getWidgetById ( this . nm _index ) ;
2013-12-10 19:13:28 +01:00
if ( nm )
2013-02-13 15:02:02 +01:00
{
2014-01-21 12:28:43 +01:00
this . lock _tree ( ) ;
2014-01-21 19:56:03 +01:00
nm . applyFilters ( { 'selectedFolder' : _folder } ) ;
2013-12-10 19:13:28 +01:00
}
2014-01-21 19:56:03 +01:00
// Get nice folder name for message, if selected is not a profile
if ( ! profile _selected )
2014-02-05 13:23:04 +01:00
{
2014-02-06 13:48:01 +01:00
var displayname = _widget . getSelectedLabel ( ) ;
var myMsg = ( displayname ? displayname : _folder ) . replace ( this . _unseen _regexp , '' ) + ' ' + this . egw . lang ( 'selected' ) ;
2014-01-21 19:56:03 +01:00
egw _message ( myMsg ) ;
2013-02-13 15:02:02 +01:00
}
2013-12-17 16:21:36 +01:00
2014-01-21 19:56:03 +01:00
// Update non-grid
this . mail _refreshFolderStatus ( _folder , 'forced' , false , false ) ;
2013-10-18 11:58:25 +02:00
this . mail _refreshQuotaDisplay ( server [ 0 ] ) ;
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-10-05 11:03:51 +02:00
var do _nmactions = true ;
var msg ;
2014-01-27 13:18:16 +01:00
var ftree ;
var _folder ;
if ( _action . id == 'read' )
{
ftree = this . et2 . getWidgetById ( this . nm _index + '[foldertree]' ) ;
var _foldernode = ftree . getSelectedNode ( ) ;
_folder = _foldernode . id ;
}
2014-03-07 11:06:04 +01:00
if ( typeof _elems == 'undefined' || _elems . length == 0 )
2013-10-05 11:03:51 +02:00
{
do _nmactions = false ; //indicates that this action is probably a popup?
if ( this . et2 . getArrayMgr ( "content" ) . getEntry ( 'mail_id' ) )
{
msg = { } ;
msg [ 'msg' ] = [ this . et2 . getArrayMgr ( 'content' ) . getEntry ( 'mail_id' ) || '' ] ;
}
2014-03-07 11:06:04 +01:00
if ( ( typeof _elems == 'undefined' || _elems . length == 0 ) && this . mail _isMainWindow )
2013-10-14 15:30:04 +02:00
{
if ( this . mail _currentlyFocussed )
{
msg = { } ;
msg [ 'msg' ] = [ this . mail _currentlyFocussed ] ;
2014-01-27 13:18:16 +01:00
_elems = msg ;
do _nmactions = true ; // is triggered from preview
2013-10-14 15:30:04 +02:00
}
}
2013-10-05 11:03:51 +02:00
}
2013-04-13 12:30:07 +02:00
//alert(_action.id+' - '+_elems[0].id);
2013-10-04 11:33:44 +02:00
//console.log(_action, _elems);
2013-12-06 11:35:39 +01:00
var classToProcess = _action . id ;
if ( _action . id == 'read' ) classToProcess = 'seen' ;
else if ( _action . id == 'label1' ) classToProcess = 'labelone' ;
else if ( _action . id == 'label2' ) classToProcess = 'labeltwo' ;
else if ( _action . id == 'label3' ) classToProcess = 'labelthree' ;
else if ( _action . id == 'label4' ) classToProcess = 'labelfour' ;
else if ( _action . id == 'label5' ) classToProcess = 'labelfive' ;
2013-10-05 11:03:51 +02:00
if ( do _nmactions )
{
msg = this . mail _getFormData ( _elems ) ;
if ( _action . id . substring ( 0 , 2 ) == 'un' ) {
2013-12-06 11:35:39 +01:00
//old style, only available for undelete and unlabel (no toggle)
if ( _action . id == 'unlabel' ) // this means all labels should be removed
{
var labels = [ 'labelone' , 'labeltwo' , 'labelthree' , 'labelfour' , 'labelfive' ] ;
2014-03-03 14:10:27 +01:00
for ( var i = 0 ; i < labels . length ; i ++ ) this . mail _removeRowClass ( _elems , labels [ i ] ) ;
2013-12-06 11:35:39 +01:00
this . mail _flagMessages ( _action . id , msg , ( do _nmactions ? false : true ) ) ;
}
else
{
this . mail _removeRowClass ( _elems , _action . id . substring ( 2 ) ) ;
this . mail _setRowClass ( _elems , _action . id ) ;
this . mail _flagMessages ( _action . id , msg , ( do _nmactions ? false : true ) ) ;
}
2013-10-05 11:03:51 +02:00
}
else
{
2013-12-06 11:35:39 +01:00
var msg _set = { msg : [ ] } ;
var msg _unset = { msg : [ ] } ;
var dataElem ;
var flags ;
2014-01-13 15:22:58 +01:00
var classes = '' ;
2014-03-03 14:10:27 +01:00
for ( var i = 0 ; i < msg . msg . length ; i ++ )
2013-12-06 11:35:39 +01:00
{
dataElem = egw . dataGetUIDdata ( msg . msg [ i ] ) ;
2014-01-13 15:22:58 +01:00
if ( typeof dataElem . data . flags == 'undefined' )
{
dataElem . data . flags = { } ;
}
2013-12-06 11:35:39 +01:00
flags = dataElem . data . flags ;
2014-01-13 15:22:58 +01:00
classes = dataElem . data . class || "" ;
classes = classes . split ( ' ' ) ;
2013-12-06 11:35:39 +01:00
// since we toggle we need to unset the ones already set, and set the ones not set
2014-01-13 15:22:58 +01:00
// flags is data, UI is done by class, so update both
// Flags are there or not, class names are flag or 'un'+flag
if ( classes . indexOf ( classToProcess ) >= 0 )
{
classes . splice ( classes . indexOf ( classToProcess ) , 1 ) ;
}
if ( classes . indexOf ( 'un' + classToProcess ) >= 0 )
{
classes . splice ( classes . indexOf ( 'un' + classToProcess ) , 1 ) ;
}
2013-12-06 11:35:39 +01:00
if ( flags [ _action . id ] )
{
msg _unset [ 'msg' ] . push ( msg . msg [ i ] ) ;
2014-01-13 15:22:58 +01:00
classes . push ( 'un' + classToProcess ) ;
delete flags [ _action . id ] ;
2013-12-06 11:35:39 +01:00
}
else
{
msg _set [ 'msg' ] . push ( msg . msg [ i ] ) ;
2014-01-13 15:22:58 +01:00
flags [ _action . id ] = _action . id ;
classes . push ( classToProcess ) ;
2013-12-06 11:35:39 +01:00
}
2014-01-13 15:22:58 +01:00
// Update cache & call callbacks - updates list
dataElem . data . class = classes . join ( ' ' ) ;
egw . dataStoreUID ( msg . msg [ i ] , dataElem . data ) ;
2013-12-06 11:35:39 +01:00
}
2014-01-13 15:22:58 +01:00
// Notify server of changes
2013-12-06 11:35:39 +01:00
if ( msg _unset [ 'msg' ] && msg _unset [ 'msg' ] . length )
{
2014-01-13 15:22:58 +01:00
this . mail _flagMessages ( 'un' + _action . id , msg _unset ) ;
2013-12-06 11:35:39 +01:00
}
if ( msg _set [ 'msg' ] && msg _set [ 'msg' ] . length )
{
2014-01-13 15:22:58 +01:00
this . mail _flagMessages ( _action . id , msg _set ) ;
2013-12-06 11:35:39 +01:00
}
2014-01-27 13:18:16 +01:00
// No further update needed, only in case of read, the counters should be refreshed
if ( _action . id == 'read' ) this . mail _refreshFolderStatus ( _folder , 'thisfolderonly' , false , true ) ;
2014-01-13 15:22:58 +01:00
return ;
2013-10-05 11:03:51 +02:00
}
2013-10-04 11:33:44 +02:00
}
else
{
2013-12-05 16:09:35 +01:00
this . mail _flagMessages ( _action . id , msg , ( do _nmactions ? false : true ) ) ;
2013-10-04 11:33:44 +02:00
}
2014-01-27 13:18:16 +01:00
// only refresh counter. not grid as the ajaxmethod is called asyncronously
// on flagging, only seen/unseen has effect on counterdisplay
if ( _action . id == 'read' ) this . mail _refreshFolderStatus ( _folder , 'thisfolderonly' , false , true ) ;
//this.mail_refreshFolderStatus();
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
* /
2014-01-13 15:22:58 +01:00
mail _flagMessages : function ( _flag , _elems , _isPopup )
2013-02-19 17:30:59 +01:00
{
2014-01-21 15:46:00 +01:00
egw . jsonq ( 'mail.mail_ui.ajax_flagMessages' , [ _flag , _elems ] ) ;
// .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
/ * *
* 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
2013-10-01 13:29:54 +02:00
egw _openWindowCentered ( _url , 'mail_display_headerLines' , '870' , '600' , window . outerWidth / 2 , window . outerHeight / 2 ) ;
2013-04-13 12:30:07 +02:00
} ,
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 )
{
2014-03-07 11:06:04 +01:00
if ( typeof _elems == 'undefined' || _elems . length == 0 )
2013-10-05 11:03:51 +02:00
{
if ( this . et2 . getArrayMgr ( "content" ) . getEntry ( 'mail_id' ) )
{
var _elems = [ ] ;
_elems . push ( { id : this . et2 . getArrayMgr ( "content" ) . getEntry ( 'mail_id' ) || '' } ) ;
}
2014-03-07 11:06:04 +01:00
if ( ( typeof _elems == 'undefined' || _elems . length == 0 ) && this . mail _isMainWindow )
2013-10-14 15:30:04 +02:00
{
if ( this . mail _currentlyFocussed )
{
var _elems = [ ] ;
_elems . push ( { id : this . mail _currentlyFocussed } ) ;
}
}
2013-10-05 11:03:51 +02:00
}
2013-04-13 12:30:07 +02:00
//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 )
{
2014-03-07 11:06:04 +01:00
if ( typeof _elems == 'undefined' || _elems . length == 0 )
2013-10-05 11:03:51 +02:00
{
if ( this . et2 . getArrayMgr ( "content" ) . getEntry ( 'mail_id' ) )
{
var _elems = [ ] ;
_elems . push ( { id : this . et2 . getArrayMgr ( "content" ) . getEntry ( 'mail_id' ) || '' } ) ;
}
2014-03-07 11:06:04 +01:00
if ( ( typeof _elems == 'undefined' || _elems . length == 0 ) && this . mail _isMainWindow )
2013-10-14 15:30:04 +02:00
{
if ( this . mail _currentlyFocussed )
{
var _elems = [ ] ;
_elems . push ( { id : this . mail _currentlyFocussed } ) ;
}
}
2013-10-05 11:03:51 +02:00
}
2013-04-13 12:30:07 +02:00
//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 )
{
2014-03-07 11:06:04 +01:00
if ( typeof _elems == 'undefined' || _elems . length == 0 )
2013-10-05 11:03:51 +02:00
{
if ( this . et2 . getArrayMgr ( "content" ) . getEntry ( 'mail_id' ) )
{
var _elems = [ ] ;
_elems . push ( { id : this . et2 . getArrayMgr ( "content" ) . getEntry ( 'mail_id' ) || '' } ) ;
}
2014-03-07 11:06:04 +01:00
if ( ( typeof _elems == 'undefined' || _elems . length == 0 ) && this . mail _isMainWindow )
2013-10-14 15:30:04 +02:00
{
if ( this . mail _currentlyFocussed )
{
var _elems = [ ] ;
_elems . push ( { id : this . mail _currentlyFocussed } ) ;
}
}
2013-10-05 11:03:51 +02:00
}
2013-04-13 12:30:07 +02:00
//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 )
2013-10-16 13:22:53 +02:00
*
2013-10-09 19:29:36 +02:00
* @ param object tag _info with values for attributes id , label , title , ...
* @ param et2 _taglist widget
2013-07-19 17:13:01 +02:00
* /
2013-10-09 19:29:36 +02:00
address _click : function ( tag _info , widget )
2013-07-19 17:13:01 +02:00
{
console . log ( this , arguments ) ;
} ,
2013-07-25 17:35:44 +02:00
2013-10-16 13:25:46 +02:00
/ * *
2014-01-30 10:35:56 +01:00
* displayAttachment
2013-10-16 13:25:46 +02:00
* /
2014-01-30 10:35:56 +01:00
displayAttachment : function ( tag _info , widget , calledForCompose )
2013-10-16 13:25:46 +02:00
{
//console.log(this, arguments, widget);
2013-10-21 15:07:32 +02:00
var mailid ;
var attgrid ;
2014-02-11 11:01:48 +01:00
if ( typeof calledForCompose == 'undefined' || typeof calledForCompose == 'object' ) calledForCompose = false ;
if ( calledForCompose === false )
2013-10-21 15:07:32 +02:00
{
2014-01-30 10:35:56 +01:00
if ( this . mail _isMainWindow )
{
mailid = this . mail _currentlyFocussed ; //this.et2.getArrayMgr("content").getEntry('mail_id');
var p = widget . getParent ( ) ;
var cont = p . getArrayMgr ( "content" ) . data ;
attgrid = cont [ widget . id . replace ( /\[filename\]/ , '' ) ] ;
}
else
{
mailid = this . et2 . getArrayMgr ( "content" ) . getEntry ( 'mail_id' ) ;
attgrid = this . et2 . getArrayMgr ( "content" ) . getEntry ( 'mail_displayattachments' ) [ widget . id . replace ( /\[filename\]/ , '' ) ] ;
}
2013-10-21 15:07:32 +02:00
}
2014-02-11 11:01:48 +01:00
if ( calledForCompose === true )
2013-10-21 15:07:32 +02:00
{
2014-01-31 11:21:58 +01:00
// CALLED FOR COMPOSE; processedmail_id could hold several IDs seperated by comma
2014-01-30 10:35:56 +01:00
attgrid = this . et2 . getArrayMgr ( "content" ) . getEntry ( 'attachments' ) [ widget . id . replace ( /\[name\]/ , '' ) ] ;
2014-01-31 11:21:58 +01:00
var mailids = this . et2 . getArrayMgr ( "content" ) . getEntry ( 'processedmail_id' ) ;
var mailida = mailids . split ( ',' ) ;
mailid = mailida [ widget . id . replace ( /\[name\]/ , '' ) ] ;
if ( typeof attgrid . uid != 'undefined' && attgrid . uid && mailid . indexOf ( attgrid . uid ) == - 1 )
{
2014-03-03 14:10:27 +01:00
for ( var i = 0 ; i < mailida . length ; i ++ )
2014-01-31 11:21:58 +01:00
{
if ( mailida [ i ] . indexOf ( '::' + attgrid . uid ) > - 1 ) mailid = mailida [ i ] ;
}
}
2013-10-21 15:07:32 +02:00
}
2013-10-16 13:25:46 +02:00
//console.log(mailid,attgrid.partID,attgrid.filename,attgrid.mimetype);
var url = window . egw _webserverUrl + '/index.php?' ;
var width ;
var height ;
var windowName = 'mail' ;
switch ( attgrid . type . toUpperCase ( ) )
{
case 'MESSAGE/RFC822' :
url += 'menuaction=mail.mail_ui.displayMessage' ; // todo compose for Draft folder
url += '&id=' + mailid ;
url += '&part=' + attgrid . partID ;
url += '&is_winmail=' + attgrid . winmailFlag ;
windowName = windowName + 'displayMessage_' + mailid + '_' + attgrid . partID ;
width = 870 ;
height = egw _getWindowOuterHeight ( ) ;
break ;
case 'IMAGE/JPEG' :
case 'IMAGE/PNG' :
case 'IMAGE/GIF' :
case 'IMAGE/BMP' :
case 'APPLICATION/PDF' :
case 'TEXT/PLAIN' :
case 'TEXT/HTML' :
case 'TEXT/DIRECTORY' :
/ *
$sfxMimeType = $value [ 'mimeType' ] ;
$buff = explode ( '.' , $value [ 'name' ] ) ;
$suffix = '' ;
if ( is _array ( $buff ) ) $suffix = array _pop ( $buff ) ; // take the last extension to check with ext2mime
if ( ! empty ( $suffix ) ) $sfxMimeType = mime _magic : : ext2mime ( $suffix ) ;
if ( strtoupper ( $sfxMimeType ) == 'TEXT/VCARD' || strtoupper ( $sfxMimeType ) == 'TEXT/X-VCARD' )
{
$attachments [ $key ] [ 'mimeType' ] = $sfxMimeType ;
$value [ 'mimeType' ] = strtoupper ( $sfxMimeType ) ;
}
* /
case 'TEXT/X-VCARD' :
case 'TEXT/VCARD' :
case 'TEXT/CALENDAR' :
case 'TEXT/X-VCALENDAR' :
url += 'menuaction=mail.mail_ui.getAttachment' ; // todo compose for Draft folder
url += '&id=' + mailid ;
url += '&part=' + attgrid . partID ;
url += '&is_winmail=' + attgrid . winmailFlag ;
windowName = windowName + 'displayAttachment_' + mailid + '_' + attgrid . partID ;
var reg = '800x600' ;
var reg2 ;
// handle calendar/vcard
if ( attgrid . type . toUpperCase ( ) == 'TEXT/CALENDAR' )
{
windowName = 'maildisplayEvent_' + mailid + '_' + attgrid . partID ;
reg2 = egw . link _get _registry ( 'calendar' ) ;
2014-02-10 11:25:09 +01:00
if ( typeof reg2 [ 'view' ] != 'undefined' && typeof reg2 [ 'view_popup' ] != 'undefined' )
2013-10-16 13:25:46 +02:00
{
2014-02-10 11:25:09 +01:00
reg = reg2 [ 'view_popup' ] ;
2013-10-16 13:25:46 +02:00
}
}
if ( attgrid . type . toUpperCase ( ) == 'TEXT/X-VCARD' || attgrid . type . toUpperCase ( ) == 'TEXT/VCARD' )
{
windowName = 'maildisplayContact_' + mailid + '_' + attgrid . partID ;
reg2 = egw . link _get _registry ( 'addressbook' ) ;
2014-02-10 11:25:09 +01:00
if ( typeof reg2 [ 'add' ] != 'undefined' && typeof reg2 [ 'add_popup' ] != 'undefined' )
2013-10-16 13:25:46 +02:00
{
2014-02-10 11:25:09 +01:00
reg = reg2 [ 'add_popup' ] ;
2013-10-16 13:25:46 +02:00
}
}
var w _h = reg . split ( 'x' ) ;
width = w _h [ 0 ] ;
height = w _h [ 1 ] ;
break ;
default :
url += 'menuaction=mail.mail_ui.getAttachment' ; // todo compose for Draft folder
url += '&id=' + mailid ;
url += '&part=' + attgrid . partID ;
url += '&is_winmail=' + attgrid . winmailFlag ;
windowName = windowName + 'displayAttachment_' + mailid + '_' + attgrid . partID ;
width = 870 ;
height = 600 ;
//document.location = url;
//return;
}
egw _openWindowCentered ( url , windowName , width , height ) ;
} ,
2014-01-30 10:35:56 +01:00
/ * *
* displayUploadedFile
* /
displayUploadedFile : function ( tag _info , widget )
{
//console.log(this, tag_info, widget);
var attgrid ;
attgrid = this . et2 . getArrayMgr ( "content" ) . getEntry ( 'attachments' ) [ widget . id . replace ( /\[name\]/ , '' ) ] ;
//console.log(attgrid);
2014-01-31 11:21:58 +01:00
if ( attgrid . uid && ( attgrid . partID || attgrid . folder ) )
2014-01-30 10:35:56 +01:00
{
this . displayAttachment ( tag _info , widget , true ) ;
return ;
}
var url = window . egw _webserverUrl + '/index.php?' ;
var width ;
var height ;
var windowName = 'mail' ;
switch ( attgrid . type . toUpperCase ( ) )
{
case 'IMAGE/JPEG' :
case 'IMAGE/PNG' :
case 'IMAGE/GIF' :
case 'IMAGE/BMP' :
case 'APPLICATION/PDF' :
case 'TEXT/PLAIN' :
case 'TEXT/HTML' :
case 'TEXT/DIRECTORY' :
/ *
$sfxMimeType = $value [ 'mimeType' ] ;
$buff = explode ( '.' , $value [ 'name' ] ) ;
$suffix = '' ;
if ( is _array ( $buff ) ) $suffix = array _pop ( $buff ) ; // take the last extension to check with ext2mime
if ( ! empty ( $suffix ) ) $sfxMimeType = mime _magic : : ext2mime ( $suffix ) ;
if ( strtoupper ( $sfxMimeType ) == 'TEXT/VCARD' || strtoupper ( $sfxMimeType ) == 'TEXT/X-VCARD' )
{
$attachments [ $key ] [ 'mimeType' ] = $sfxMimeType ;
$value [ 'mimeType' ] = strtoupper ( $sfxMimeType ) ;
}
* /
case 'TEXT/X-VCARD' :
case 'TEXT/VCARD' :
case 'TEXT/CALENDAR' :
case 'TEXT/X-VCALENDAR' :
url += 'menuaction=mail.mail_compose.getAttachment' ; // todo compose for Draft folder
url += '&filename=' + attgrid . file ;
url += '&tmpname=' + attgrid . tmp _name ;
url += '&name=' + attgrid . name ;
//url += '&size='+attgrid.size;
url += '&type=' + attgrid . type ;
windowName = windowName + 'displayAttachment_' + attgrid . file . replace ( /\//g , "_" ) ;
var reg = '800x600' ;
var reg2 ;
// handle calendar/vcard
if ( attgrid . type . toUpperCase ( ) == 'TEXT/CALENDAR' )
{
windowName = 'maildisplayEvent_' + attgrid . file . replace ( /\//g , "_" ) ;
reg2 = egw . link _get _registry ( 'calendar' ) ;
2014-02-10 11:25:09 +01:00
if ( typeof reg2 [ 'view' ] != 'undefined' && typeof reg2 [ 'view_popup' ] != 'undefined' )
2014-01-30 10:35:56 +01:00
{
2014-02-10 11:25:09 +01:00
reg = reg2 [ 'view_popup' ] ;
2014-01-30 10:35:56 +01:00
}
}
if ( attgrid . type . toUpperCase ( ) == 'TEXT/X-VCARD' || attgrid . type . toUpperCase ( ) == 'TEXT/VCARD' )
{
windowName = 'maildisplayContact_' + attgrid . file . replace ( /\//g , "_" ) ;
reg2 = egw . link _get _registry ( 'addressbook' ) ;
2014-02-10 11:25:09 +01:00
if ( typeof reg2 [ 'add' ] != 'undefined' && typeof reg2 [ 'add_popup' ] != 'undefined' )
2014-01-30 10:35:56 +01:00
{
2014-02-10 11:25:09 +01:00
reg = reg2 [ 'add_popup' ] ;
2014-01-30 10:35:56 +01:00
}
}
var w _h = reg . split ( 'x' ) ;
width = w _h [ 0 ] ;
height = w _h [ 1 ] ;
break ;
case 'MESSAGE/RFC822' :
/ *
url += 'menuaction=mail.mail_ui.displayMessage' ; // todo compose for Draft folder
url += '&id=' + mailid ;
url += '&part=' + attgrid . partID ;
url += '&is_winmail=' + attgrid . winmailFlag ;
windowName = windowName + 'displayMessage_' + mailid + '_' + attgrid . partID ;
width = 870 ;
height = egw _getWindowOuterHeight ( ) ;
break ;
* /
default :
url += 'menuaction=mail.mail_compose.getAttachment' ; // todo compose for Draft folder
url += '&filename=' + attgrid . file ;
url += '&tmpname=' + attgrid . tmp _name ;
url += '&name=' + attgrid . name ;
//url += '&size='+attgrid.size;
url += '&type=' + attgrid . type ;
url += '&mode=' + 'save' ;
windowName = windowName + 'displayAttachment_' + attgrid . file . replace ( /\//g , "_" ) ;
width = 870 ;
height = 600 ;
//document.location = url;
//return;
}
egw _openWindowCentered ( url , windowName , width , height ) ;
} ,
2013-10-16 13:25:46 +02:00
saveAttachment : function ( tag _info , widget )
{
//console.log(this, arguments);
2013-10-21 15:07:32 +02:00
var mailid ;
var attgrid ;
if ( this . mail _isMainWindow )
{
mailid = this . mail _currentlyFocussed ; //this.et2.getArrayMgr("content").getEntry('mail_id');
var p = widget . getParent ( ) ;
var cont = p . getArrayMgr ( "content" ) . data ;
attgrid = cont [ widget . id . replace ( /\[save\]/ , '' ) ] ;
}
else
{
mailid = this . et2 . getArrayMgr ( "content" ) . getEntry ( 'mail_id' ) ;
attgrid = this . et2 . getArrayMgr ( "content" ) . getEntry ( 'mail_displayattachments' ) [ widget . id . replace ( /\[save\]/ , '' ) ] ;
}
2013-10-16 13:25:46 +02:00
//console.log(mailid,attgrid.partID,attgrid.filename,attgrid.mimetype);
var url = window . egw _webserverUrl + '/index.php?' ;
var width ;
var height ;
var windowName = 'mail' ;
url += 'menuaction=mail.mail_ui.getAttachment' ; // todo compose for Draft folder
url += '&mode=save' ;
url += '&id=' + mailid ;
url += '&part=' + attgrid . partID ;
url += '&is_winmail=' + attgrid . winmailFlag ;
document . location = url ;
} ,
saveAttachmentToVFS : function ( tag _info , widget )
{
//console.log(this, arguments);
2013-10-21 15:07:32 +02:00
var mailid ;
var attgrid ;
if ( this . mail _isMainWindow )
{
mailid = this . mail _currentlyFocussed ; //this.et2.getArrayMgr("content").getEntry('mail_id');
var p = widget . getParent ( ) ;
var cont = p . getArrayMgr ( "content" ) . data ;
attgrid = cont [ widget . id . replace ( /\[saveAsVFS\]/ , '' ) ] ;
}
else
{
mailid = this . et2 . getArrayMgr ( "content" ) . getEntry ( 'mail_id' ) ;
attgrid = this . et2 . getArrayMgr ( "content" ) . getEntry ( 'mail_displayattachments' ) [ widget . id . replace ( /\[saveAsVFS\]/ , '' ) ] ;
}
2013-10-16 13:25:46 +02:00
//console.log(mailid,attgrid.partID,attgrid.filename,attgrid.mimetype);
var url = window . egw _webserverUrl + '/index.php?' ;
var width = 640 ;
var height = 570 ;
var windowName = 'mail' ;
url += 'menuaction=filemanager.filemanager_select.select' ; // todo compose for Draft folder
url += '&mode=saveas' ;
url += '&id=' + mailid + '::' + attgrid . partID + '::' + attgrid . winmailFlag ;
url += '&name=' + attgrid . filename ;
url += '&type=' + attgrid . type . toLowerCase ( ) ;
url += '&method=mail.mail_ui.vfsSaveAttachment' ;
url += '&label=' + egw . lang ( 'Save' ) ;
egw _openWindowCentered ( url , windowName , width , height ) ;
} ,
saveAllAttachmentsToVFS : function ( tag _info , widget )
{
2013-10-21 15:07:32 +02:00
var mailid ;
var attgrid ;
if ( this . mail _isMainWindow )
{
mailid = this . mail _currentlyFocussed ; //this.et2.getArrayMgr("content").getEntry('mail_id');
var p = widget . getParent ( ) ;
attgrid = p . getArrayMgr ( "content" ) . data ;
}
else
{
mailid = this . et2 . getArrayMgr ( "content" ) . getEntry ( 'mail_id' ) ;
attgrid = this . et2 . getArrayMgr ( "content" ) . getEntry ( 'mail_displayattachments' ) ;
}
2013-10-16 13:25:46 +02:00
console . log ( mailid , attgrid ) ;
var url = window . egw _webserverUrl + '/index.php?' ;
var width = 640 ;
var height = 570 ;
var windowName = 'mail' ;
url += 'menuaction=filemanager.filemanager_select.select' ; // todo compose for Draft folder
url += '&mode=select-dir' ;
url += '&method=mail.mail_ui.vfsSaveAttachment' ;
url += '&label=' + egw . lang ( 'Save all' ) ;
2014-03-03 14:10:27 +01:00
for ( var i = 0 ; i < attgrid . length ; i ++ )
2013-10-16 13:25:46 +02:00
{
if ( attgrid [ i ] != null ) url += '&id[' + i + ']=' + mailid + '::' + attgrid [ i ] . partID + '::' + attgrid [ i ] . winmailFlag + '::' + attgrid [ i ] . filename ;
}
egw _openWindowCentered ( url , windowName , width , height ) ;
} ,
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 )
{
2014-03-07 11:06:04 +01:00
if ( typeof _elems == 'undefined' || _elems . length == 0 )
2013-10-05 11:03:51 +02:00
{
if ( this . et2 . getArrayMgr ( "content" ) . getEntry ( 'mail_id' ) )
{
var _elems = [ ] ;
_elems . push ( { id : this . et2 . getArrayMgr ( "content" ) . getEntry ( 'mail_id' ) || '' } ) ;
}
2014-03-07 11:06:04 +01:00
if ( ( typeof _elems == 'undefined' || _elems . length == 0 ) && this . mail _isMainWindow )
2013-10-14 15:30:04 +02:00
{
if ( this . mail _currentlyFocussed )
{
var _elems = [ ] ;
_elems . push ( { id : this . mail _currentlyFocussed } ) ;
}
}
2013-10-05 11:03:51 +02:00
}
2013-04-13 12:30:07 +02:00
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
{
2014-03-07 11:06:04 +01:00
if ( typeof _elems == 'undefined' || _elems . length == 0 )
2013-10-05 11:03:51 +02:00
{
if ( this . et2 . getArrayMgr ( "content" ) . getEntry ( 'mail_id' ) )
{
var _elems = [ ] ;
_elems . push ( { id : this . et2 . getArrayMgr ( "content" ) . getEntry ( 'mail_id' ) || '' } ) ;
}
2014-03-07 11:06:04 +01:00
if ( ( typeof _elems == 'undefined' || _elems . length == 0 ) && this . mail _isMainWindow )
2013-10-14 15:30:04 +02:00
{
if ( this . mail _currentlyFocussed )
{
var _elems = [ ] ;
_elems . push ( { id : this . mail _currentlyFocussed } ) ;
}
}
if ( typeof _action . data . width == 'undefined' && typeof _action . data . height == 'undefined' && ! ( typeof _action . data . event == 'undefined' && typeof _action . data . event . popup == 'undefined' ) )
{
if ( _action . data . event . popup )
{
var app _registry = _action . data . event . popup ;
}
else
{
var app _registry = egw . link _get _registry ( 'infolog' ) ; //this.appname);
}
//console.log(app_registry);
if ( typeof app _registry [ 'edit' ] != 'undefined' && typeof app _registry [ 'edit_popup' ] != 'undefined' )
{
var w _h = app _registry [ 'edit_popup' ] . split ( 'x' ) ;
}
}
2013-10-05 11:03:51 +02:00
}
2013-04-13 12:30:07 +02:00
//alert('mail_infolog('+_elems[0].id+')');return;
2013-10-16 13:25:46 +02:00
//console.log(_action, _elems);
2013-04-13 12:30:07 +02:00
var url = window . egw _webserverUrl + '/index.php?' ;
url += 'menuaction=infolog.infolog_ui.import_mail' ; // todo compose for Draft folder
url += '&rowid=' + _elems [ 0 ] . id ;
2013-10-14 15:30:04 +02:00
egw _openWindowCentered ( url , 'import_mail_' + _elems [ 0 ] . id , ( _action . data . width ? _action . data . width : w _h [ 0 ] ) , ( _action . data . height ? _action . data . height : w _h [ 1 ] ) ) ;
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 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 )
{
2014-03-07 11:06:04 +01:00
if ( typeof _elems == 'undefined' || _elems . length == 0 )
2013-10-05 11:03:51 +02:00
{
if ( this . et2 . getArrayMgr ( "content" ) . getEntry ( 'mail_id' ) )
{
var _elems = [ ] ;
_elems . push ( { id : this . et2 . getArrayMgr ( "content" ) . getEntry ( 'mail_id' ) || '' } ) ;
}
2014-03-07 11:06:04 +01:00
if ( ( typeof _elems == 'undefined' || _elems . length == 0 ) && this . mail _isMainWindow )
2013-10-14 15:30:04 +02:00
{
if ( this . mail _currentlyFocussed )
{
var _elems = [ ] ;
_elems . push ( { id : this . mail _currentlyFocussed } ) ;
}
}
if ( typeof _action . data . width == 'undefined' && typeof _action . data . height == 'undefined' && ! ( typeof _action . data . event == 'undefined' && typeof _action . data . event . popup == 'undefined' ) )
{
if ( _action . data . event . popup )
{
var app _registry = _action . data . event . popup ;
}
else
{
var app _registry = egw . link _get _registry ( 'infolog' ) ; //this.appname);
}
//console.log(app_registry);
if ( typeof app _registry [ 'edit' ] != 'undefined' && typeof app _registry [ 'edit_popup' ] != 'undefined' )
{
var w _h = app _registry [ 'edit_popup' ] . split ( 'x' ) ;
}
}
2013-10-05 11:03:51 +02:00
}
2013-04-13 12:30:07 +02:00
//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 ;
2013-10-14 15:30:04 +02:00
egw _openWindowCentered ( url , 'import_tracker_' + _elems [ 0 ] . id , ( _action . data . width ? _action . data . width : w _h [ 0 ] ) , ( _action . data . height ? _action . data . height : w _h [ 1 ] ) ) ;
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 _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 = { } ;
2014-02-05 13:23:04 +01:00
// if
2014-01-27 13:18:16 +01:00
if ( typeof _actionObjects [ 'msg' ] != 'undefined' && _actionObjects [ 'msg' ] . length > 0 ) return _actionObjects ;
2013-04-13 12:30:07 +02:00
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
2013-12-06 11:35:39 +01:00
if ( typeof _actionObjects [ 'msg' ] == 'undefined' )
2013-04-13 12:30:07 +02:00
{
2013-12-06 11:35:39 +01:00
for ( var i = 0 ; i < _actionObjects . length ; i ++ )
{
if ( _actionObjects [ i ] . id . length > 0 )
{
var dataElem = $j ( _actionObjects [ i ] . iface . getDOMNode ( ) ) ;
dataElem . addClass ( _class ) ;
}
}
}
else
{
for ( var i = 0 ; i < _actionObjects [ 'msg' ] . length ; i ++ )
2013-04-13 12:30:07 +02:00
{
2014-01-13 15:22:58 +01:00
var mail _uid = _actionObjects [ 'msg' ] [ i ] ;
2013-07-25 17:35:44 +02:00
2014-01-13 15:22:58 +01:00
// Get the record from data cache
var dataElem = egw . dataGetUIDdata ( mail _uid ) ;
if ( dataElem == null || typeof dataElem == undefined )
{
// Unknown ID, nothing to update
return ;
2013-12-06 11:35:39 +01:00
}
2014-01-13 15:22:58 +01:00
// Update class
dataElem . data . class += ' ' + _class ;
// Update record, which updates all listeners (including nextmatch)
egw . dataStoreUID ( mail _uid , dataElem . data ) ;
2013-04-13 12:30:07 +02:00
}
}
} ,
2013-07-25 17:35:44 +02:00
2013-05-27 15:48:55 +02:00
/ * *
2014-01-13 15:22:58 +01:00
* mail _removeRowFlag
* Removes a flag and updates the CSS class . Updates the UI , but not the server .
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-07-25 17:35:44 +02:00
for ( var i = 0 ; i < _actionObjects [ 'msg' ] . length ; i ++ )
2013-05-27 15:48:55 +02:00
{
2014-01-13 15:22:58 +01:00
var mail _uid = _actionObjects [ 'msg' ] [ i ] ;
// Get the record from data cache
var dataElem = egw . dataGetUIDdata ( mail _uid ) ;
if ( dataElem == null || typeof dataElem == undefined )
2013-05-27 15:48:55 +02:00
{
2014-01-13 15:22:58 +01:00
// Unknown ID, nothing to update
return ;
}
2013-07-25 17:35:44 +02:00
2014-01-13 15:22:58 +01:00
// Update class
var classes = dataElem . data . class || "" ;
classes = classes . split ( ' ' ) ;
if ( classes . indexOf ( _class ) >= 0 )
{
classes . splice ( classes . indexOf ( _class ) , 1 ) ;
dataElem . data . class = classes . join ( ' ' ) ;
// Update record, which updates all listeners (including nextmatch)
egw . dataStoreUID ( mail _uid , dataElem . data ) ;
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>" ) ;
} ,
2014-03-10 12:13:51 +01:00
2013-04-13 12:30:07 +02:00
/ * *
* 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-12-18 11:27:27 +01:00
egw . json ( 'mail.mail_ui.ajax_copyMessages' , [ target , messages , 'move' ] )
2013-09-10 22:41:18 +02:00
. sendRequest ( ) ;
2013-10-18 11:58:25 +02:00
var nm = this . et2 . getWidgetById ( this . nm _index ) ;
2013-06-04 17:29:53 +02:00
this . mail _setRowClass ( _senders , 'deleted' ) ;
2014-02-27 01:22:25 +01:00
// Server response contains refresh
2013-04-13 12:30:07 +02:00
} ,
2014-03-10 12:13:51 +01:00
2013-04-13 12:30:07 +02:00
/ * *
* 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 ( ) ;
2014-02-27 01:22:25 +01:00
// Server response contains refresh
2013-04-13 12:30:07 +02:00
} ,
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
* /
2014-02-12 21:12:59 +01:00
mail _AddFolder : function ( _action , _senders ) {
2013-05-21 10:46:54 +02:00
//console.log(action,_senders);
//action.id == 'add'
//_senders.iface.id == target leaf / leaf to edit
2013-10-18 11:58:25 +02:00
var ftree = this . et2 . getWidgetById ( this . nm _index + '[foldertree]' ) ;
2014-03-03 14:10:27 +01:00
var OldFolderName = ftree . getLabel ( _senders [ 0 ] . id ) . replace ( this . _unseen _regexp , '' ) ;
2013-05-21 10:46:54 +02:00
//console.log(OldFolderName);
2013-12-12 16:44:47 +01:00
var buttons = [
{ text : this . egw . lang ( "Add" ) , id : "add" , class : "ui-priority-primary" , "default" : true } ,
2014-02-12 21:12:59 +01:00
{ text : this . egw . lang ( "Cancel" ) , id : "cancel" }
2013-12-12 16:44:47 +01:00
] ;
2014-02-12 21:12:59 +01:00
et2 _dialog . show _prompt ( function ( _button _id , _value ) {
2013-12-12 16:44:47 +01:00
var NewFolderName = null ;
if ( _value . length > 0 ) NewFolderName = _value ;
//alert(NewFolderName);
if ( NewFolderName && NewFolderName . length > 0 )
{
switch ( _button _id )
{
case "add" :
2014-02-12 21:12:59 +01:00
egw . json ( 'mail.mail_ui.ajax_addFolder' , [ _senders [ 0 ] . id , NewFolderName ] )
2013-12-12 16:44:47 +01:00
. sendRequest ( true ) ;
return ;
case "cancel" :
}
}
} ,
this . egw . lang ( "Enter the name for the new Folder:" ) ,
this . egw . lang ( "Add a new Folder to %1:" , OldFolderName ) ,
'' , buttons ) ;
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
* /
2014-02-12 21:12:59 +01:00
mail _RenameFolder : function ( _action , _senders ) {
2013-04-13 12:30:07 +02:00
//console.log(action,_senders);
//action.id == 'rename'
//_senders.iface.id == target leaf / leaf to edit
2013-10-18 11:58:25 +02:00
var ftree = this . et2 . getWidgetById ( this . nm _index + '[foldertree]' ) ;
2014-03-03 14:10:27 +01:00
var OldFolderName = ftree . getLabel ( _senders [ 0 ] . id ) . replace ( this . _unseen _regexp , '' ) ;
2013-04-13 12:30:07 +02:00
//console.log(OldFolderName);
2013-12-12 16:10:25 +01:00
var buttons = [
2014-02-12 21:12:59 +01:00
{ text : this . egw . lang ( "Rename" ) , id : "rename" , class : "ui-priority-primary" , image : 'edit' , "default" : true } ,
{ text : this . egw . lang ( "Cancel" ) , id : "cancel" }
2013-12-12 16:10:25 +01:00
] ;
2014-02-12 21:12:59 +01:00
et2 _dialog . show _prompt ( function ( _button _id , _value ) {
2013-12-12 16:10:25 +01:00
var NewFolderName = null ;
if ( _value . length > 0 ) NewFolderName = _value ;
//alert(NewFolderName);
if ( NewFolderName && NewFolderName . length > 0 )
{
switch ( _button _id )
{
case "rename" :
2014-02-12 21:12:59 +01:00
egw . json ( 'mail.mail_ui.ajax_renameFolder' , [ _senders [ 0 ] . id , NewFolderName ] )
2013-12-12 16:10:25 +01:00
. sendRequest ( true ) ;
return ;
case "cancel" :
}
}
} ,
this . egw . lang ( "Rename Folder %1 to:" , OldFolderName ) ,
this . egw . lang ( "Rename Folder %1 ?" , OldFolderName ) ,
OldFolderName , buttons ) ;
2013-05-13 16:42:42 +02:00
} ,
2014-01-06 10:51:24 +01:00
/ * *
2014-01-11 12:58:31 +01:00
* mail _MoveFolder - implementation of the MoveFolder action on the tree
2014-01-06 10:51:24 +01:00
*
2014-01-11 12:58:31 +01:00
* @ param { egwAction } _action
* @ param { egwActionObject [ ] } _senders - the representation of the tree leaf to be manipulated
* @ param { egwActionObject } destination Drop target egwActionObject representing the destination
2014-01-06 10:51:24 +01:00
* /
2014-01-11 12:58:31 +01:00
mail _MoveFolder : function ( _action , _senders , destination ) {
if ( ! destination || ! destination . id )
{
egw . debug ( 'warn' , "Move folder, but no target" ) ;
return ;
}
2014-01-11 13:51:45 +01:00
// Some UI feedback while the folder is moved - using just the iface DOMNode would
// put the load image in every row
var load _node = $j ( destination . iface . getDOMNode ( ) ) . closest ( 'td' ) . prev ( )
. addClass ( 'loading' ) ;
2014-01-06 10:51:24 +01:00
2014-01-11 12:58:31 +01:00
for ( var i = 0 ; i < _senders . length ; i ++ )
{
2014-02-12 21:12:59 +01:00
egw . jsonq ( 'mail.mail_ui.ajax_MoveFolder' , [ _senders [ i ] . id , destination . id ] ,
2014-01-11 12:58:31 +01:00
// Move is done (successfully or not), remove loading
2014-01-11 13:51:45 +01:00
function ( ) { load _node . removeClass ( 'loading' ) ; }
2014-01-11 12:58:31 +01:00
) ;
}
2014-01-06 10:51:24 +01: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
* /
2014-02-12 21:12:59 +01:00
mail _DeleteFolder : function ( _action , _senders ) {
2013-05-13 16:42:42 +02:00
//console.log(action,_senders);
//action.id == 'delete'
//_senders.iface.id == target leaf / leaf to edit
2013-10-18 11:58:25 +02:00
var ftree = this . et2 . getWidgetById ( this . nm _index + '[foldertree]' ) ;
2014-03-03 14:10:27 +01:00
var OldFolderName = ftree . getLabel ( _senders [ 0 ] . id ) . replace ( this . _unseen _regexp , '' ) ;
2013-05-13 16:42:42 +02:00
//console.log(OldFolderName);
2013-12-12 14:34:35 +01:00
var buttons = [
{ text : this . egw . lang ( "Yes" ) , id : "delete" , class : "ui-priority-primary" , "default" : true } ,
2014-02-12 21:12:59 +01:00
{ text : this . egw . lang ( "Cancel" ) , id : "cancel" }
2013-12-12 14:34:35 +01:00
] ;
2014-02-12 21:12:59 +01:00
et2 _dialog . show _dialog ( function ( _button _id , _value ) {
2013-12-12 14:34:35 +01:00
switch ( _button _id )
{
case "delete" :
2014-02-12 21:12:59 +01:00
egw . json ( 'mail.mail_ui.ajax_deleteFolder' , [ _senders [ 0 ] . id ] )
2013-12-12 14:34:35 +01:00
. sendRequest ( true ) ;
return ;
case "cancel" :
}
} ,
2014-02-12 21:12:59 +01:00
this . egw . lang ( "Do you really want to DELETE Folder %1 ?" , OldFolderName ) + " " + ( ftree . hasChildren ( _senders [ 0 ] . id ) ? this . egw . lang ( "All subfolders will be deleted too, and all messages in all affected folders will be lost" ) : this . egw . lang ( "All messages in the folder will be lost" ) ) ,
2013-12-12 14:34:35 +01:00
this . egw . lang ( "DELETE Folder %1 ?" , OldFolderName ) ,
OldFolderName , buttons ) ;
2013-07-25 17:35:44 +02:00
} ,
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
2013-10-09 18:44:03 +02:00
*
2013-09-02 17:15:35 +02:00
* @ param _event
* @ param _file _count
2014-02-12 21:12:59 +01:00
* @ param { string ? } _path where the file is uploaded to , default current directory
2013-09-02 17:15:35 +02:00
* /
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
2013-10-09 18:44:03 +02:00
*
2013-09-10 15:39:44 +02:00
* @ 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-10-03 18:09:25 +02:00
vfsUploadForImport : function ( _egw , _widget , _window ) {
2013-10-04 13:17:45 +02:00
//console.log(_egw, _widget, _window);
2013-11-22 14:55:09 +01:00
if ( jQuery . isEmptyObject ( _widget ) ) return ;
2013-10-03 18:09:25 +02:00
if ( ! jQuery . isEmptyObject ( _widget . getValue ( ) ) )
{
this . et2 _obj . submit ( ) ;
}
} ,
2013-10-02 16:50:24 +02:00
vfsUploadForCompose : function ( _egw , _widget , _window )
{
2013-10-04 13:17:45 +02:00
//console.log(_egw, _widget, _window);
2013-11-22 14:55:09 +01:00
if ( jQuery . isEmptyObject ( _widget ) ) return ;
2013-10-04 13:17:45 +02:00
if ( ! jQuery . isEmptyObject ( _widget . getValue ( ) ) )
{
this . et2 _obj . submit ( ) ;
}
} ,
submitOnChange : function ( _egw , _widget , _window ) {
//console.log(_egw, _widget, _window);
2013-11-22 14:55:09 +01:00
if ( ! jQuery . isEmptyObject ( _widget ) )
2013-10-02 16:50:24 +02:00
{
2013-11-22 14:55:09 +01:00
if ( ! jQuery . isEmptyObject ( _widget . getValue ( ) ) )
{
this . et2 _obj . submit ( ) ;
}
2013-10-02 16:50:24 +02:00
}
} ,
saveAsDraft : function ( _egw , _widget , _window )
{
this . et2 _obj . submit ( ) ;
} ,
2013-10-07 17:02:35 +02:00
saveAsDraftAndPrint : function ( _egw , _widget , _window )
{
this . et2 _obj . submit ( ) ;
} ,
2013-10-16 13:22:53 +02:00
2013-10-09 19:29:36 +02:00
/ * *
* Focus handler for folder , address , reject textbox / taglist to automatic check associated radio button
2014-02-27 18:47:06 +01:00
*
* @ param { event } _ev
2014-02-13 18:06:16 +01:00
* @ param { object } _widget taglist
2014-02-27 18:47:06 +01:00
*
2013-10-09 19:29:36 +02:00
* /
sieve _focus _radioBtn : function ( _ev , _widget )
2013-08-09 19:47:53 +02:00
{
2013-10-09 19:29:36 +02:00
_widget . getRoot ( ) . getWidgetById ( 'action' ) . set _value ( _widget . id . replace ( /^action_([^_]+)_text$/ , '$1' ) ) ;
2013-08-09 19:47:53 +02:00
} ,
2013-10-09 19:29:36 +02:00
2013-08-09 19:47:53 +02:00
/ * *
2014-02-13 18:06:16 +01:00
* Select all aliases
2014-02-27 18:47:06 +01:00
*
2013-08-09 19:47:53 +02:00
* /
sieve _vac _all _aliases : function ( )
{
var addr = this . et2 . getWidgetById ( 'addresses' ) ;
addr . select _all ( ) ;
} ,
2013-10-16 13:22:53 +02:00
/ * *
* Disable / Enable date widgets on vacation seive rules form when status is "by_date"
*
* /
vacationFilterStatusChange : function ( )
{
var status = this . et2 . getWidgetById ( 'status' ) ;
var s _date = this . et2 . getWidgetById ( 'start_date' ) ;
var e _date = this . et2 . getWidgetById ( 'end_date' ) ;
var by _date _label = this . et2 . getWidgetById ( 'by_date_label' ) ;
if ( status && s _date && e _date && by _date _label )
{
s _date . set _disabled ( status . get _value ( ) != "by_date" ) ;
e _date . set _disabled ( status . get _value ( ) != "by_date" ) ;
by _date _label . set _disabled ( status . get _value ( ) != "by_date" ) ;
}
} ,
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 ;
2014-02-14 10:37:59 +01:00
var linkData = '' ;
2013-07-25 17:35:44 +02:00
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 ) ;
}
}
2013-10-07 18:53:13 +02:00
var confirmDeleteDialog = et2 _dialog . show _dialog ( callbackDeleteDialog , this . egw . lang ( "Do you really want to DELETE this Rule" ) , this . egw . lang ( "Delete" ) , { } , et2 _dialog . BUTTONS _YES _NO _CANCEL , et2 _dialog . WARNING _MESSAGE ) ;
2013-07-25 17:35:44 +02:00
break ;
case 'add' :
2014-02-14 10:37:59 +01:00
linkData = "mail.mail_sieve.edit" ;
this . egw . open _link ( linkData , '_blank' , "600x480" ) ;
2013-07-25 17:35:44 +02:00
break ;
case 'edit' :
2014-02-14 10:37:59 +01:00
linkData = "mail.mail_sieve.edit&ruleID=" + ruleID ;
this . egw . open _link ( linkData , '_blank' , "600x480" ) ;
2013-07-25 17:35:44 +02:00
break ;
case 'enable' :
actionData = _type . parent . data . widget . getArrayMgr ( 'content' ) ;
this . _do _action ( typeId , actionData [ 'data' ] , ruleID ) ;
break ;
case 'disable' :
actionData = _type . parent . data . widget . getArrayMgr ( 'content' ) ;
this . _do _action ( typeId , actionData [ 'data' ] , ruleID ) ;
break ;
}
}
} ,
2014-02-13 18:06:16 +01:00
/ * *
* Send back action resault to server
2014-02-27 18:47:06 +01:00
*
2014-02-13 18:06:16 +01:00
* @ param { string } _typeId action name
* @ param { object } _data content
* @ param { string } _selectedID selected row id
* @ param { string } _msg message
2014-02-27 18:47:06 +01:00
*
2014-02-13 18:06:16 +01:00
* /
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 )
{
2014-02-13 20:00:11 +01:00
var request = egw ( ) . json ( 'mail.mail_sieve.ajax_action' , [ this . et2 _obj . etemplate _exec _id , _typeID , _selectedID , _msg ] , null , null , true ) ;
2013-08-09 19:47:53 +02:00
request . sendRequest ( ) ;
2013-07-25 17:35:44 +02:00
}
} ,
2014-02-13 18:06:16 +01:00
/ * *
2014-02-27 18:47:06 +01:00
*
2014-02-13 18:06:16 +01:00
* @ todo : Need to find a way how to refresh the grid
2014-02-27 18:47:06 +01:00
*
*
2014-02-13 18:06:16 +01:00
* /
2014-02-13 20:00:11 +01:00
sieve _refresh : function ( )
2013-07-25 17:35:44 +02:00
{
2014-02-13 20:00:11 +01:00
var request = egw ( ) . json ( 'mail.mail_sieve.ajax_sieve_egw_refresh' , [ this . et2 _obj . etemplate _exec _id ] , null , this . et2 _obj , true ) ;
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
2013-11-29 15:59:34 +01:00
/ * *
2014-02-06 13:48:01 +01:00
* Select the right combination of the rights for radio buttons from the selected common right
*
2014-02-13 18:06:16 +01:00
* @ @ param { jQuery event } event
2014-02-06 13:48:01 +01:00
* @ param { widget } widget common right selectBox
*
* /
2014-02-13 18:06:16 +01:00
acl _common _rights _selector : function ( event , widget )
2013-11-29 15:59:34 +01:00
{
2013-12-09 12:17:32 +01:00
var rowId = widget . id . replace ( /[^0-9.]+/g , '' ) ;
2014-02-28 16:39:46 +01:00
var rights = ( widget . get _value ( ) == "custom" ) ? [ ] : ( widget . get _value ( ) == "aeiklprstwx" ) ? widget . get _value ( ) . replace ( /[k,x,t,e]/g , "cd" ) . split ( "" ) : widget . get _value ( ) . split ( "" ) ;
2013-12-09 12:17:32 +01:00
for ( var i = 0 ; i < this . aclRights . length ; i ++ )
2013-11-29 15:59:34 +01:00
{
2014-02-14 10:24:52 +01:00
var rightsWidget = this . et2 . getWidgetById ( rowId + '[acl_' + this . aclRights [ i ] + ']' ) ;
2013-12-09 12:17:32 +01:00
rightsWidget . set _value ( ( jQuery . inArray ( this . aclRights [ i ] , rights ) != - 1 ) ? true : false ) ;
2013-11-29 15:59:34 +01:00
}
} ,
2013-12-09 12:17:32 +01:00
/ * *
2014-02-06 13:48:01 +01:00
*
* Choose the right common right option for common ACL selecBox
*
2014-02-13 18:06:16 +01:00
* @ param { jQuery event } event
2014-02-06 13:48:01 +01:00
* @ param { widget } widget radioButton rights
*
* /
2014-02-13 18:06:16 +01:00
acl _common _rights : function ( event , widget )
2014-02-06 13:48:01 +01:00
{
2013-12-09 12:17:32 +01:00
var rowId = widget . id . replace ( /[^0-9.]+/g , '' ) ;
var aclCommonWidget = this . et2 . getWidgetById ( rowId + '[acl]' ) ;
var rights = '' ;
2013-12-17 16:21:36 +01:00
2013-12-09 12:17:32 +01:00
for ( var i = 0 ; i < this . aclRights . length ; i ++ )
{
2014-02-14 10:24:52 +01:00
var rightsWidget = this . et2 . getWidgetById ( rowId + '[acl_' + this . aclRights [ i ] + ']' ) ;
2013-12-09 12:17:32 +01:00
if ( rightsWidget . get _value ( ) == "true" )
rights += this . aclRights [ i ] ;
}
for ( var i = 0 ; i < this . aclCommonRights . length ; i ++ )
{
if ( rights . split ( "" ) . sort ( ) . toString ( ) == this . aclCommonRights [ i ] . split ( "" ) . sort ( ) . toString ( ) )
rights = this . aclCommonRights [ i ] ;
}
2014-02-28 14:49:10 +01:00
if ( jQuery . inArray ( rights , this . aclCommonRights ) == - 1 && rights != 'lrswipcda' )
2013-12-09 12:17:32 +01:00
{
aclCommonWidget . set _value ( 'custom' ) ;
}
2014-02-28 14:49:10 +01:00
else if ( rights == 'lrswipcda' )
{
2014-02-28 16:39:46 +01:00
aclCommonWidget . set _value ( 'aeiklprstwx' ) ;
2014-02-28 14:49:10 +01:00
}
2013-12-09 12:17:32 +01:00
else
{
aclCommonWidget . set _value ( rights ) ;
}
2014-02-06 13:48:01 +01:00
} ,
/ * *
2014-02-13 20:00:11 +01:00
* Open seive filter list
2014-02-27 18:47:06 +01:00
*
2014-02-13 20:00:11 +01:00
* @ param { egwAction } action - Action user did to get here
* @ param { egwActionObject [ ] } selected - selected row ( s )
2014-02-06 13:48:01 +01:00
*
* @ todo get the account id and open the relevant sieve , ATM alway open sieve rules which is set in preferences
* /
2014-02-13 20:00:11 +01:00
edit _sieve : function ( action , selected )
2014-02-06 13:48:01 +01:00
{
2014-02-13 20:00:11 +01:00
this . egw . open _link ( this . egw . link ( '/index.php' ,
{
'menuaction' : 'mail.mail_sieve.index' ,
'ajax' : 'true'
}
) ) ;
2014-02-06 13:48:01 +01:00
} ,
2013-12-17 18:06:44 +01:00
2014-02-06 13:48:01 +01:00
/ * *
*
* @ todo get the account id and open the relevant vacation , ATM alway open vacation rules which is set in preferences
* /
edit _vacation : function ( )
{
2013-12-17 18:06:44 +01:00
this . egw . open _link ( 'mail.mail_sieve.editVacation' , '_blank' , '700x480' ) ;
2014-02-06 13:48:01 +01:00
} ,
2014-02-12 21:12:59 +01:00
2014-02-06 18:18:12 +01:00
/ * *
* Popup the subscription dialog
*
* @ param { action } _action
* @ param { sender } _senders
* /
edit _subscribe : function ( _action , _senders )
{
var acc _id = parseInt ( _senders [ 0 ] . id ) ;
this . egw . open _link ( 'mail.mail_ui.subscription&acc_id=' + acc _id , '_blank' , '720x500' ) ;
} ,
2013-12-20 17:17:12 +01:00
2014-02-06 13:48:01 +01:00
/ * *
* Subscribe selected unsubscribed folder
*
* @ param { action } _action
* @ param { sender } _senders
* /
subscribe _folder : function ( _action , _senders )
{
var mailbox = _senders [ 0 ] . id . split ( '::' ) ;
var folder = mailbox [ 1 ] , acc _id = mailbox [ 0 ] ;
var ftree = this . et2 . getWidgetById ( this . nm _index + '[foldertree]' ) ;
2014-02-07 09:33:23 +01:00
egw _message ( this . egw . lang ( 'Subscribe to Folder %1' , ftree . getLabel ( _senders [ 0 ] . id ) . replace ( this . _unseen _regexp , '' ) ) ) ;
2014-02-06 13:48:01 +01:00
egw . json ( 'mail.mail_ui.ajax_foldersubscription' , [ acc _id , folder , true ] )
2013-12-20 17:17:12 +01:00
. sendRequest ( ) ;
2014-02-06 13:48:01 +01:00
} ,
2013-12-20 17:17:12 +01:00
2014-02-06 13:48:01 +01:00
/ * *
* Unsubscribe selected subscribed folder
*
* @ param { action } _action
* @ param { sender } _senders
* /
unsubscribe _folder : function ( _action , _senders )
{
2014-02-07 09:33:23 +01:00
var mailbox = _senders [ 0 ] . id . split ( '::' ) ;
var folder = mailbox [ 1 ] , acc _id = mailbox [ 0 ] ;
var ftree = this . et2 . getWidgetById ( this . nm _index + '[foldertree]' ) ;
egw _message ( this . egw . lang ( 'Unsubscribe from Folder %1' , ftree . getLabel ( _senders [ 0 ] . id ) . replace ( this . _unseen _regexp , '' ) ) ) ;
egw . json ( 'mail.mail_ui.ajax_foldersubscription' , [ acc _id , folder , false ] )
2013-12-20 11:48:04 +01:00
. sendRequest ( ) ;
2014-02-06 13:48:01 +01:00
} ,
2013-12-20 11:48:04 +01:00
2013-11-15 18:22:46 +01:00
/ * *
* Edit a folder acl for account ( s )
*
* @ param _action
* @ param _senders - the representation of the tree leaf to be manipulated
* /
edit _acl : function ( _action , _senders )
{
2013-12-20 17:17:12 +01:00
var mailbox = _senders [ 0 ] . id . split ( '::' ) ;
var folder = mailbox [ 1 ] , acc _id = mailbox [ 0 ] ;
this . egw . open _link ( 'mail.mail_acl.edit&mailbox=' + jQuery . base64Encode ( folder ) + '&acc_id=' + acc _id , '_blank' , '640x480' ) ;
2013-11-15 18:22:46 +01:00
} ,
2013-11-03 11:24:09 +01:00
/ * *
* Edit a mail account
*
* @ param _action
* @ param _senders - the representation of the tree leaf to be manipulated
* /
edit _account : function ( _action , _senders )
{
var acc _id = parseInt ( _senders [ 0 ] . id ) ;
2013-11-17 14:31:19 +01:00
this . egw . open _link ( 'mail.mail_wizard.edit&acc_id=' + acc _id , '_blank' , '720x500' ) ;
2014-01-18 15:01:07 +01:00
} ,
/ * *
* Hide Cc and Bcc rows from the compose popup
*
* /
hide _cc _compose : function ( )
{
jQuery ( ".mailComposeJQueryCc" ) . hide ( ) ;
jQuery ( ".mailComposeJQueryBcc" ) . hide ( ) ;
} ,
/ * *
* Display Cc or Bcc fields in compose popup
*
2014-02-13 09:16:14 +01:00
* @ param { jQuery event } event
2014-01-18 15:01:07 +01:00
* @ param { widget object } widget clicked label ( Cc or Bcc ) from compose popup
*
* /
2014-02-13 09:16:14 +01:00
compose _cc _expander : function ( event , widget )
2014-01-18 15:01:07 +01:00
{
var Cc = this . et2 . getWidgetById ( 'cc_expander' ) ;
var Bcc = this . et2 . getWidgetById ( 'bcc_expander' ) ;
2014-02-13 09:16:14 +01:00
if ( typeof widget != "undefined" && widget . id == "cc_expander" )
2014-01-18 15:01:07 +01:00
{
jQuery ( ".mailComposeJQueryCc" ) . show ( ) ;
if ( typeof Cc != 'undefined' )
{
Cc . set _disabled ( true ) ;
}
}
2014-02-13 09:16:14 +01:00
else if ( typeof widget != "undefined" && widget . id == "bcc_expander" )
2014-01-18 15:01:07 +01:00
{
jQuery ( ".mailComposeJQueryBcc" ) . show ( ) ;
if ( typeof Bcc != 'undefined' )
{
Bcc . set _disabled ( true ) ;
}
}
2014-01-23 14:59:10 +01:00
else if ( typeof widget == "undefined" )
{
var CcField = this . et2 . getWidgetById ( 'cc' ) ;
var BccField = this . et2 . getWidgetById ( 'bcc' ) ;
2014-01-27 21:07:06 +01:00
if ( CcField . get _value ( ) . length )
2014-01-23 14:59:10 +01:00
{
jQuery ( ".mailComposeJQueryCc" ) . show ( ) ;
if ( typeof Cc != 'undefined' )
{
Cc . set _disabled ( true ) ;
}
}
2014-01-27 21:07:06 +01:00
if ( BccField . get _value ( ) . length )
2014-01-23 14:59:10 +01:00
{
jQuery ( ".mailComposeJQueryBcc" ) . show ( ) ;
if ( typeof Bcc != 'undefined' )
{
Bcc . set _disabled ( true ) ;
}
}
}
2014-01-18 15:01:07 +01:00
} ,
2014-01-21 11:21:59 +01:00
/ * *
* Lock tree so it does NOT receive any more mouse - clicks
* /
lock _tree : function ( )
{
if ( ! document . getElementById ( 'mail_folder_lock_div' ) )
{
var parent = jQuery ( '#mail-index_nm\\[foldertree\\]' ) ;
var lock _div = jQuery ( document . createElement ( 'div' ) ) ;
lock _div . attr ( 'id' , 'mail_folder_lock_div' )
. addClass ( 'mail_folder_lock' ) ;
parent . prepend ( lock _div ) ;
}
} ,
/ * *
* Unlock tree so it receives again mouse - clicks after calling lock _tree ( )
* /
unlock _tree : function ( )
{
jQuery ( '#mail_folder_lock_div' ) . remove ( ) ;
2014-01-21 14:34:02 +01:00
} ,
/ * *
* Called when tree opens up an account or folder
*
* @ param { String } _id account - id [ : : folder - name ]
* @ param { et2 _widget _tree } _widget
* @ param { Number } _hasChildren 0 - item has no child nodes , - 1 - item is closed , 1 - item is opened
* /
openstart _tree : function ( _id , _widget , _hasChildren )
{
if ( _id . indexOf ( '::' ) == - 1 && // it's an account, not a folder in an account
! _hasChildren )
{
this . lock _tree ( ) ;
}
return true ; // allow opening of node
} ,
/ * *
* Called when tree opens up an account or folder
*
* @ param { String } _id account - id [ : : folder - name ]
* @ param { et2 _widget _tree } _widget
* @ param { Number } _hasChildren 0 - item has no child nodes , - 1 - item is closed , 1 - item is opened
* /
openend _tree : function ( _id , _widget , _hasChildren )
{
if ( _id . indexOf ( '::' ) == - 1 && // it's an account, not a folder in an account
_hasChildren == 1 )
{
this . unlock _tree ( ) ;
}
2014-02-12 21:12:59 +01:00
} ,
/ * *
* Print a mail from list
* @ param _action
* @ param _senders - the representation of the tree leaf to be manipulated
* /
mail _print : function ( _action , _senders )
{
this . egw . message ( 'Not yet implemented ;-)' ) ;
2014-01-21 11:21:59 +01:00
}
2013-04-09 10:53:25 +02:00
} ) ;