@ -4016,7 +4016,6 @@ function rcube_webmail()
this . triggerEvent ( 'group_update' , { id : prop . id , source : prop . source , name : prop . name , li : li [ 0 ] , newid : prop . newid } ) ;
} ;
this . init _edit _field = function ( col , elem )
{
if ( ! elem )
@ -4179,21 +4178,6 @@ function rcube_webmail()
/********* user settings methods *********/
/*********************************************************/
this . init _subscription _list = function ( )
{
var p = this ;
this . subscription _list = new rcube _list _widget ( this . gui _objects . subscriptionlist ,
{ multiselect : false , draggable : true , keyboard : false , toggleselect : true } ) ;
this . subscription _list . addEventListener ( 'select' , function ( o ) { p . subscription _select ( o ) ; } ) ;
this . subscription _list . addEventListener ( 'dragstart' , function ( o ) { p . drag _active = true ; } ) ;
this . subscription _list . addEventListener ( 'dragend' , function ( o ) { p . subscription _move _folder ( o ) ; } ) ;
this . subscription _list . row _init = function ( row ) {
row . obj . onmouseover = function ( ) { p . focus _subscription ( row . id ) ; } ;
row . obj . onmouseout = function ( ) { p . unfocus _subscription ( row . id ) ; } ;
} ;
this . subscription _list . init ( ) ;
} ;
// preferences section select and load options frame
this . section _select = function ( list )
{
@ -4258,6 +4242,26 @@ function rcube_webmail()
return true ;
} ;
/*********************************************************/
/********* folder manager methods *********/
/*********************************************************/
this . init _subscription _list = function ( )
{
var p = this ;
this . subscription _list = new rcube _list _widget ( this . gui _objects . subscriptionlist ,
{ multiselect : false , draggable : true , keyboard : false , toggleselect : true } ) ;
this . subscription _list . addEventListener ( 'select' , function ( o ) { p . subscription _select ( o ) ; } ) ;
this . subscription _list . addEventListener ( 'dragstart' , function ( o ) { p . drag _active = true ; } ) ;
this . subscription _list . addEventListener ( 'dragend' , function ( o ) { p . subscription _move _folder ( o ) ; } ) ;
this . subscription _list . row _init = function ( row ) {
row . obj . onmouseover = function ( ) { p . focus _subscription ( row . id ) ; } ;
row . obj . onmouseout = function ( ) { p . unfocus _subscription ( row . id ) ; } ;
} ;
this . subscription _list . init ( ) ;
} ;
this . focus _subscription = function ( id )
{
var row , folder ,
@ -4347,91 +4351,183 @@ function rcube_webmail()
}
} ;
// add a new folder to the subscription list by cloning a folder row
this . add _folder _row = function ( name , display _name , replace , before )
// Add folder row to the table and initialize it
this . add _folder _row = function ( name , display _name , protected , subscribed , skip _init )
{
if ( ! this . gui _objects . subscriptionlist )
return false ;
// find not protected folder
var refid ;
for ( var rid in this . env . subscriptionrows ) {
if ( this . env . subscriptionrows [ rid ] != null && ! this . env . subscriptionrows [ rid ] [ 2 ] ) {
refid = rid ;
break ;
}
}
var refrow , form ,
var row , n , i , tmp , folders , len , list = [ ] , slist = [ ] ,
tbody = this . gui _objects . subscriptionlist . tBodies [ 0 ] ,
id = 'rcmrow' + ( tbody . childNodes . length + 1 ) ,
selection = this . subscription _list . get _single _selection ( ) ;
if ( replace && replace . id ) {
id = replace . id ;
refid = replace . id ;
}
refrow = $ ( 'tr' , tbody ) . get ( 0 ) ,
id = 'rcmrow' + ( ( new Date ) . getTime ( ) ) ;
if ( ! id || ! refid || ! ( refrow = document . getElementById ( refid ) ) ) {
if ( ! refrow ) {
// Refresh page if we don't have a table row to clone
this . goto _url ( 'folders' ) ;
return false ;
}
// clone a table row if there are existing rows
var row = this . clone _table _row ( refrow ) ;
row . id = id ;
row = $ ( refrow ) . clone ( true ) ;
row . attr( 'id' , id ) ;
if ( before && ( before = this . get _folder _row _id ( before ) ) )
tbody . insertBefore ( row , document . getElementById ( before ) ) ;
else
tbody . appendChild ( row ) ;
// set folder name
row . find ( 'td:first' ) . html ( display _name ) ;
if ( replace )
tbody . removeChild ( replace ) ;
// update subscription checkbox
$ ( 'input[name="_subscribed[]"]' , row ) . val ( name )
. prop ( { checked : subscribed ? true : false , disabled : protected ? true : false } ) ;
// add to folder/row-ID map
this . env . subscriptionrows [ row . id ] = [ name , display _name , 0 ] ;
this . env . subscriptionrows [ id ] = [ name , display _name , 0 ] ;
// sort folders, to find a place where to insert the row
folders = this . env . subscriptionrows ;
for ( n in folders ) {
// protected folder
if ( folders [ n ] [ 2 ] ) {
slist . push ( folders [ n ] [ 0 ] ) ;
tmp = folders [ n ] [ 0 ] + this . env . delimiter ;
}
// protected folder's child
else if ( tmp && folders [ n ] [ 0 ] . indexOf ( tmp ) == 0 )
slist . push ( folders [ n ] [ 0 ] ) ;
// other
else {
list . push ( folders [ n ] [ 0 ] ) ;
tmp = null ;
}
}
list . sort ( ) ;
// make sure protected folders (and their subs) are on top
list = slist . concat ( list ) ;
// set folder name
row . cells [ 0 ] . innerHTML = display _name ;
// find folder position after sorting
for ( n = 0 , len = list . length ; n < len ; n ++ ) {
if ( list [ n ] == name )
break ;
}
if ( ! replace ) {
// set messages count to zero
row . cells [ 1 ] . innerHTML = '*' ;
// add row to the table
if ( n && n < len )
$ ( '#' + this . get _folder _row _id ( list [ n - 1 ] ) ) . after ( row ) ;
else
row . appendTo ( tbody ) ;
// update subscription checkbox
$ ( 'input[name="_subscribed[]"]' , row ) . val ( name ) . prop ( 'checked' , true ) ;
}
// update list widget
this . subscription _list . clear _selection ( ) ;
if ( ! skip _init )
this . init _subscription _list ( ) ;
this . init _subscription _list ( ) ;
if ( selection && document . getElementById ( 'rcmrow' + selection ) )
this . subscription _list . select _row ( selection ) ;
row = row . get ( 0 ) ;
if ( row. scrollIntoView )
row . scrollIntoView ( ) ;
if ( document . getElementById ( id ) . scrollIntoView )
document . getElementById ( id ) . scrollIntoView ( ) ;
return row ;
} ;
// replace an existing table row with a new folder line
this . replace _folder _row = function ( oldfolder , newfolder , display _name , before )
// replace an existing table row with a new folder line (with subfolders)
this . replace _folder _row = function ( oldfolder , newfolder , display _name , protected )
{
var id = this . get _folder _row _id ( oldfolder ) ,
row = document . getElementById ( id ) ;
if ( ! this . gui _objects . subscriptionlist )
return false ;
// replace an existing table row (if found)
this . add _folder _row ( newfolder , display _name , row , before ) ;
var i , n , len , name , dispname , oldrow , tmprow , row , level ,
tbody = this . gui _objects . subscriptionlist . tBodies [ 0 ] ,
folders = this . env . subscriptionrows ,
id = this . get _folder _row _id ( oldfolder ) ,
regex = new RegExp ( '^' + RegExp . escape ( oldfolder ) ) ,
subscribed = $ ( 'input[name="_subscribed[]"]' , $ ( '#' + id ) ) . prop ( 'checked' ) ,
// find subfolders of renamed folder
list = this . get _subfolders ( oldfolder ) ;
// replace an existing table row
this . _remove _folder _row ( id ) ;
row = $ ( this . add _folder _row ( newfolder , display _name , protected , subscribed , true ) ) ;
// detect tree depth change
if ( len = list . length ) {
level = ( oldfolder . split ( this . env . delimiter ) ) . length - ( newfolder . split ( this . env . delimiter ) ) . length ;
}
// move subfolders to the new branch
for ( n = 0 ; n < len ; n ++ ) {
id = list [ n ] ;
name = this . env . subscriptionrows [ id ] [ 0 ] ;
dispname = this . env . subscriptionrows [ id ] [ 1 ] ;
oldrow = $ ( '#' + id ) ;
tmprow = oldrow . clone ( true ) ;
oldrow . remove ( ) ;
row . after ( tmprow ) ;
row = tmprow ;
// update folder index
name = name . replace ( regex , newfolder ) ;
$ ( 'input[name="_subscribed[]"]' , row ) . val ( name ) ;
this . env . subscriptionrows [ id ] [ 0 ] = name ;
// update the name if level is changed
if ( level != 0 ) {
if ( level > 0 ) {
for ( i = level ; i > 0 ; i -- )
dispname = dispname . replace ( /^ / , '' ) ;
}
else {
for ( i = level ; i < 0 ; i ++ )
dispname = ' ' + dispname ;
}
row . find ( 'td:first' ) . html ( dispname ) ;
this . env . subscriptionrows [ id ] [ 1 ] = dispname ;
}
}
// update list widget
this . init _subscription _list ( ) ;
} ;
// remove the table row of a specific mailbox from the table
// (the row will not be removed, just hidden)
this . remove _folder _row = function ( folder )
this . remove _folder _row = function ( folder , subs )
{
var row , id = this . get _folder _row _id ( folder ) ;
var n , len , list = [ ] , id = this . get _folder _row _id ( folder ) ;
// get subfolders if any
if ( subs )
list = this . get _subfolders ( folder ) ;
// remove old row
this . _remove _folder _row ( id ) ;
if ( id && ( row = document . getElementById ( id ) ) )
row . style . display = 'none' ;
// remove subfolders
for ( n = 0 , len = list . length ; n < len ; n ++ )
this . _remove _folder _row ( list [ n ] ) ;
} ;
this . _remove _folder _row = function ( id )
{
this . subscription _list . remove _row ( id . replace ( /^rcmrow/ , '' ) ) ;
$ ( '#' + id ) . remove ( ) ;
delete this . env . subscriptionrows [ id ] ;
}
this . get _subfolders = function ( folder )
{
var name , list = [ ] ,
regex = new RegExp ( '^' + RegExp . escape ( folder ) + RegExp . escape ( this . env . delimiter ) ) ,
row = $ ( '#' + this . get _folder _row _id ( folder ) ) . get ( 0 ) ;
while ( row = row . nextSibling ) {
if ( row . id ) {
name = this . env . subscriptionrows [ row . id ] [ 0 ] ;
if ( regex . test ( name ) ) {
list . push ( row . id ) ;
}
else
break ;
}
}
return list ;
}
this . subscribe = function ( folder )
{
if ( folder ) {
@ -4451,35 +4547,14 @@ function rcube_webmail()
// helper method to find a specific mailbox row ID
this . get _folder _row _id = function ( folder )
{
for ( var id in this . env . subscriptionrows )
if ( this . env . subscriptionrows [ id ] && this . env . subscriptionrows [ id ] [ 0 ] == folder )
var id , folders = this . env . subscriptionrows ;
for ( id in folders )
if ( folders [ id ] && folders [ id ] [ 0 ] == folder )
break ;
return id ;
} ;
// duplicate a specific table row
this . clone _table _row = function ( row )
{
var cell , td ,
new _row = document . createElement ( 'tr' ) ;
for ( var n = 0 ; n < row . cells . length ; n ++ ) {
cell = row . cells [ n ] ;
td = document . createElement ( 'td' ) ;
if ( cell . className )
td . className = cell . className ;
if ( cell . align )
td . setAttribute ( 'align' , cell . align ) ;
td . innerHTML = cell . innerHTML ;
new _row . appendChild ( td ) ;
}
return new _row ;
} ;
// when user select a folder in manager
this . show _folder = function ( folder , path , force )
{