/* Start iterating through the list of mailboxes, displaying them. */
$rows = array();
-foreach ($imptree->folderList($mask) as $val) {
+foreach ($imptree as $val) {
$poll_info = $val->polled
? $val->poll_info
: null;
exit;
}
-/* Build the folder tree. */
-$imaptree->setIteratorFilter(IMP_Imap_Tree::FLIST_CONTAINER | IMP_Imap_Tree::FLIST_VFOLDER | IMP_Imap_Tree::FLIST_EXPANDED);
-
/* Prepare the header template. */
$refresh_title = _("Reload View");
$head_template = $injector->createInstance('Horde_Template');
$a_template->set('expand_all', Horde::widget($folders_url_ob->copy()->add(array('actionID' => 'expand_all_folders', 'folders_token' => $folders_token)), _("Expand All Folders"), 'widget', '', '', _("Expand All"), true));
$a_template->set('collapse_all', Horde::widget($folders_url_ob->copy()->add(array('actionID' => 'collapse_all_folders', 'folders_token' => $folders_token)), _("Collapse All Folders"), 'widget', '', '', _("Collapse All"), true));
-/* Get the tree images. */
-$imp_ui_folder = new IMP_Ui_Folder();
-$tree_imgs = $imp_ui_folder->getTreeImages($imaptree, array('expand_url' => $folders_url_ob));
+/* Build the folder tree. */
+// TODO: Javascript JSON loading; save expanded view.
+//$imaptree->setIteratorFilter(IMP_Imap_Tree::FLIST_CONTAINER | IMP_Imap_Tree::FLIST_VFOLDER | IMP_Imap_Tree::FLIST_EXPANDED);
+$imaptree->setIteratorFilter(IMP_Imap_Tree::FLIST_CONTAINER | IMP_Imap_Tree::FLIST_VFOLDER);
+
+$tree = $imaptree->createTree('imp_folders', array(
+ 'checkbox' => true,
+ 'editvfolder' => true,
+ 'poll_info' => true
+));
-$displayNames = $fullNames = $newmsgs = $rows = array();
-$name_url = Horde::applicationUrl('mailbox.php');
-$rowct = 0;
+$displayNames = $fullNames = array();
foreach ($imaptree as $key => $val) {
$tmp = $displayNames[] = $val->display;
if ($tmp != $tmp2) {
$fullNames[$key] = $tmp2;
}
-
- $row = array();
-
- $row['nocheckbox'] = !empty($val->vfolder);
- if (!empty($val->vfolder) && $val->editvfolder) {
- $imp_search = $injector->getInstance('IMP_Search');
- $row['delvfolder'] = $imp_search->deleteUrl($val->value)->link(array('title' => _("Delete Virtual Folder"))) . _("Delete") . '</a>';
- $row['editvfolder'] = $imp_search->editUrl($val->value)->link(array('title' => _("Edit Virtual Folder"))) . _("Edit") . '</a>';
- }
-
- $row['cname'] = 'item' . (++$rowct % 2);
-
- if ($val->container) {
- $row['name'] = $val->name;
- } else {
- /* Highlight line differently if folder/mailbox is unsubscribed. */
- if ($showAll && $subscribe && !$val->sub) {
- $row['cname'] .= ' folderunsub';
- }
-
- $row['name'] = $val->name;
-
- if ($val->polled) {
- $row['polled'] = true;
-
- $poll_info = $val->poll_info;
- if ($poll_info->recent) {
- $newmsgs[$val->value] = $poll_info->recent;
- }
-
- if ($poll_info->unseen) {
- $row['name'] = '<strong>' . $val->name . '</strong>';
- }
-
- $row['msgs'] = $poll_info->msgs;
- $row['unseen'] = $poll_info->unseen;
- }
-
- $row['name'] = $name_url->copy()->add('mailbox', $val->value)->link(array('title' => $val->vfolder ? $val->label : $val->display)) . $row['name'] . '</a>';
- }
-
- $row['line'] = $tree_imgs[$key];
-
- $rows[] = $row;
}
/* Check to see if user wants new mail notification */
-if (!empty($newmsgs)) {
+if (!empty($imaptree->recent)) {
/* Open the mailbox R/W so we ensure the 'recent' flags are cleared from
* the current mailbox. */
- foreach ($newmsgs as $mbox => $nm) {
+ foreach ($imaptree->recent as $mbox => $nm) {
$injector->getInstance('IMP_Imap')->getOb()->openMailbox($mbox, Horde_Imap_Client::OPEN_READWRITE);
}
- IMP::newmailAlerts($newmsgs);
+ IMP::newmailAlerts($imaptree->recent);
}
Horde::addInlineScript(array(
'ImpFolders.fullNames = ' . Horde_Serialize::serialize($fullNames, Horde_Serialize::JSON, $charset)
));
-/* Render the rows now. */
-$template = $injector->createInstance('Horde_Template');
-$template->setOption('gettext', true);
-$template->set('rows', $rows);
-
$title = _("Folder Navigator");
IMP::prepareMenu();
Horde::metaRefresh($refresh_time, Horde::applicationUrl('folders.php', true));
echo $head_template->fetch(IMP_TEMPLATES . '/imp/folders/head.html');
echo $a_template->fetch(IMP_TEMPLATES . '/imp/folders/actions.html');
-echo $template->fetch(IMP_TEMPLATES . '/imp/folders/folders.html');
-if (count($rows) > 10) {
+$tree->renderTree();
+if (count($tree) > 10) {
$a_template->set('id', 1);
echo $a_template->fetch(IMP_TEMPLATES . '/imp/folders/actions.html');
}
// data, text
criteria: {},
saved_searches: {},
- show_unsub: false,
_getAll: function()
{
- return $('search_form').getInputs(null, 'search_folders_form[]');
+ return $('search_form').getInputs(null, 'folder_list[]');
},
selectFolders: function(checked)
});
},
- updateFolderList: function(folders)
- {
- var fragment = document.createDocumentFragment(),
- node = $($('folder_row').clone(true)).writeAttribute('id', false).show(),
- div = $('search_folders_hdr').next('DIV');
-
- folders.each(function(f) {
- var n = $(node.clone(true));
- n.down().writeAttribute({ disabled: Boolean(f.c), value: (f.co ? null : f.v.escapeHTML()) }).insert({ after: f.l });
- fragment.appendChild(n);
- });
-
- div.update('').appendChild(fragment);
- Horde.stripeElement(div);
- },
-
updateRecentSearches: function(searches)
{
var fragment = document.createDocumentFragment(),
e.stop();
return;
- case 'link_sub':
- tmp = this._getAll();
- this.show_unsub = !this.show_unsub;
- $('search_folders_hdr').next('DIV').update(this.text.loading);
- new Ajax.Request($('search_form').readAttribute('action'), {
- parameters: { show_unsub: Number(this.show_unsub) },
- onComplete: this._showFoldersCallback.bind(this, tmp)
- });
- elt.childElements().invoke('toggle');
- e.stop();
- return;
-
default:
if (elt.hasClassName('arrowExpanded') ||
elt.hasClassName('arrowCollapsed')) {
_toggleHeader: function(elt)
{
elt.down().toggle().next().toggle().up().next().toggle();
- if (elt.descendantOf('search_folders_hdr')) {
- elt.next('SPAN.searchuiFoldersActions').toggle();
+ if (elt.readAttribute('id') == 'search_folders_hdr') {
+ elt.down('SPAN.searchuiFoldersActions').toggle();
+ if (window.imp_search && elt.next().visible()) {
+ window.imp_search.stripe();
+ }
}
},
- _showFoldersCallback: function(flist, r)
- {
- this.updateFolderList(r.responseJSON);
- this.updateSelectedFolders(flist);
- },
-
calendarSelectHandler: function(e)
{
var elt = e.element();
$mask |= IMP_Imap_Tree::FLIST_NOCHILDREN;
}
} else {
- $mask |= IMP_Imap_Tree::FLIST_NOCHILDREN;
+ $mask |= IMP_Imap_Tree::FLIST_NOCHILDREN | IMP_Imap_Tree::FLIST_NOBASE;
}
}
/* Initialize the IMP_Tree object. */
$imaptree = $injector->getInstance('IMP_Imap_Tree');
$imaptree->setIteratorFilter(IMP_Imap_Tree::FLIST_CONTAINER | IMP_Imap_Tree::FLIST_VFOLDER);
-
- $unseen = 0;
-
- foreach ($imaptree as $val) {
- $label = $val->name;
-
- if ($val->polled) {
- $poll_info = $val->poll_info;
- if (!empty($poll_info->unseen)) {
- $unseen += $poll_info->unseen;
- $label = '<span dir="ltr"><strong>' . $label . '</strong> (' . $poll_info->unseen . '/' . $poll_info->msgs . ')</span>';
- }
- }
-
- $icon = $val->icon;
- $tree->addNode(
- $parent . $val->value,
- ($val->level) ? $parent . $val->parent : $parent,
- $label,
- $indent + $val->level,
- $val->is_open,
- array(
- 'icon' => $icon->icon,
- 'iconopen' => $icon->iconopen,
- 'url' => ($val->container) ? null : $name_url->add('mailbox', $val->value),
- )
- );
- }
+ $imaptree->createTree($tree, array(
+ 'indent' => $indent,
+ 'parent' => $parent,
+ 'poll_info' => true
+ ));
/* We want to rewrite the parent node of the INBOX to include new mail
* notification. */
);
$name = $registry->get('name', $parent);
- if ($unseen) {
+ if ($imaptree->unseen) {
$node_params['icon'] = Horde_Themes::img('newmail.png');
- $name = sprintf('<strong>%s</strong> (%s)', $name, $unseen);
+ $name = sprintf('<strong>%s</strong> (%s)', $name, $imaptree->unseen);
}
$tree->addNode(
const FLIST_UNSUB = 2;
const FLIST_VFOLDER = 4;
const FLIST_NOCHILDREN = 8;
- const FLIST_ANCESTORS = 16;
- const FLIST_SAMELEVEL = 32;
- const FLIST_EXPANDED = 64;
+ const FLIST_EXPANDED = 16;
+ const FLIST_ANCESTORS = 32;
+ const FLIST_SAMELEVEL = 64;
+ const FLIST_NOBASE = 128;
/* The string used to indicate the base of the tree. This must include
* null since this is the only 7-bit character not allowed in IMAP
public $changed = false;
/**
+ * Recent messages.
+ *
+ * @var array
+ */
+ public $recent = array();
+
+ /**
+ * Unseen count.
+ *
+ * @var array
+ */
+ public $unseen = 0;
+
+ /**
* Array containing the mailbox tree.
*
* @var array
/* Reset class variables to the defaults. */
$this->changed = true;
$this->_currkey = $this->_currparent = null;
- $this->_tree = $this->_parent = array();
+ $this->recent = $this->_tree = $this->_parent = array();
$this->_showunsub = $unsubmode;
unset($this->_cache['fulllist'], $this->_cache['subscribed']);
return $mbox . $new;
}
+ /**
+ * Creates a Horde_Tree representation of the current tree (respecting
+ * the current iterator filter).
+ *
+ * @param string|Horde_Tree $name Either the tree name, or a Horde_Tree
+ * object to add nodes to.
+ * @param array $opts Additional options:
+ * <pre>
+ * 'checkbox' - (boolean) Display checkboxes?
+ * DEFAULT: false
+ * 'editvfolder' - (boolean) Display vfolder edit links?
+ * DEFAULT: false
+ * 'indent' - (integer) The base level to add nodes to.
+ * DEFAULT: 0
+ * 'parent' - (string) The parent object of the current level.
+ * DEFAULT: null (add to base level)
+ * 'poll_info' - (boolean) Include poll information?
+ * DEFAULT: false
+ * </pre>
+ *
+ * @return Horde_Tree The tree object.
+ */
+ public function createTree($name, array $opts = array())
+ {
+ $this->recent = array();
+ $this->unseen = 0;
+
+ if ($name instanceof Horde_Tree) {
+ $tree = $name;
+ $indent = $opts['indent'];
+ $parent = $opts['parent'];
+ } else {
+ $tree = $GLOBALS['injector']->getInstance('Horde_Tree')->getTree($name, 'Javascript', array(
+ 'alternate' => true,
+ 'lines' => true,
+ 'lines_base' => true
+ ));
+ $indent = 0;
+ $parent = null;
+ }
+ $mailbox_url = Horde::applicationUrl('mailbox.php');
+
+ foreach ($this as $val) {
+ $after = $class = '';
+ $label = $val->name;
+ $url = null;
+
+ if (!empty($opts['poll_info']) && $val->polled) {
+ $poll_info = $val->poll_info;
+
+ if ($poll_info->unseen) {
+ $this->unseen += $poll_info->unseen;
+ if ($poll_info->recent) {
+ $recent[$val->value] = $poll_info->recent;
+ }
+
+ $label = '<strong>' . $label . '</strong>';
+ }
+
+ $after = ' (' . $poll_info->unseen . '/' . $poll_info->msgs . ')';
+ }
+
+ if (!$val->container) {
+ $url = $mailbox_url->add('mailbox', $val->value);
+
+ if ($this->_showunsub && !$val->sub) {
+ $class = 'folderunsub';
+ }
+ }
+
+ $checkbox = '<input type="checkbox" class="checkbox" name="folder_list[]" value="' . IMP::formMbox($val->value, true) . '"';
+
+ if ($val->vfolder) {
+ $checkbox .= ' disabled="disabled"';
+
+ if (!empty($opts['editvfolder']) && $val->editvfolder) {
+ $imp_search = $GLOBALS['injector']->getInstance('IMP_Search');
+ $after = ' [' .
+ $imp_search->deleteUrl($val->value)->link(array('title' => _("Delete Virtual Folder"))) . _("Delete") . '</a>'.
+ '] | |[' .
+ $imp_search->editUrl($val->value)->link(array('title' => _("Edit Virtual Folder"))) . _("Edit") . '</a>'.
+ ']';
+ exit;
+ }
+ }
+
+ $icon = $val->icon;
+ $tree->addNode(
+ strval($parent) . $val->value,
+ ($val->level) ? strval($parent) . $val->parent : $parent,
+ $label,
+ $indent + $val->level,
+ $val->is_open,
+ array(
+ 'class' => $class,
+ 'icon' => $icon->icon,
+ 'iconopen' => $icon->iconopen,
+ 'url' => $url
+ ),
+ $after,
+ empty($opts['checkbox']) ? null : $checkbox . ' />'
+ );
+ }
+
+ return $tree;
+ }
+
/* ArrayAccess methods. */
public function offsetExists($offset)
/* If showing unsubscribed, toggle subscribed flag to make sure we
* have subscribed mailbox information. */
- if (!$this->_showunsub &&
- $c['mask'] & self::FLIST_UNSUB) {
+ if (!$this->_showunsub && ($c['mask'] & self::FLIST_UNSUB)) {
$this->showUnsubscribed(true);
$this->showUnsubscribed(false);
}
$c['ancestors'][$parent[0]] = $parent[1];
$p = $parent[0];
}
+ } elseif ($c['mask'] & self::FLIST_NOBASE) {
+ $this->_currparent = $tmp->value;
+ $this->_currkey = isset($this->_parent[$tmp->value])
+ ? 0
+ : null;
+ $c['samelevel'] = $tmp->value;
} else {
$this->_currparent = $tmp->parent;
$this->_currkey = array_search($tmp->value, $this->_parent[$tmp->parent]);
* IMP_Imap_Tree::FLIST_UNSUB - Include unsubscribed elements.
* IMP_Imap_Tree::FLIST_VFOLDER - Include Virtual Folders.
* IMP_Imap_Tree::FLIST_NOCHILDREN - Don't include child elements.
+ * IMP_Imap_Tree::FLIST_EXPANDED - Only include expanded folders.
+ * ---
+ * These options require that $base be set:
* IMP_Imap_Tree::FLIST_ANCESTORS - Include ancestors of $base.
* IMP_Imap_Tree::FLIST_SAMELEVEL - Include all mailboxes at the same
* level as $base.
- * IMP_Imap_Tree::FLIST_EXPANDED - Only include expanded folders.
+ * IMP_Imap_Tree::FLIST_NOBASE - Don't include $base in the return.
* </pre>
* @param string $base Include all mailboxes below this element.
*/
+++ /dev/null
-<?php
-/**
- * The IMP_Ui_Folder:: class is designed to provide a place to store common
- * code shared among IMP's various UI views for folders.
- *
- * Copyright 2009-2010 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (GPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
- *
- * @author Michael Slusarz <slusarz@horde.org>
- * @category Horde
- * @license http://www.fsf.org/copyleft/gpl.html GPL
- * @package IMP
- */
-class IMP_Ui_Folder
-{
- /**
- * Temporary array used to determine tree levels.
- *
- * @var array
- */
- protected $_moreMbox = array();
-
- /**
- * Create the tree images for a list of folder elements.
- *
- * @param IMP_Imap_Tree $tree The tree object.
- * @param array $opts Additional options:
- * <pre>
- * 'expand_url' - (Horde_Url) The URL to use for expand/collapse links.
- * </pre>
- *
- * @return array An array of tree image strings.
- */
- public function getTreeImages(IMP_Imap_Tree $tree, $opts = array())
- {
- $this->_moreMbox = array();
- $out = array();
-
- foreach ($tree as $key => $val) {
- $out[$key] = $this->_getTreeImage($val, $opts);
- }
-
- return $out;
- }
-
- /**
- * Create a tree image from a folder element entry.
- *
- * @param IMP_Imap_Tree_Element $elt A mailbox element object.
- * @param array $opts See self::getTreeImages().
- *
- * @return string The image string.
- */
- protected function _getTreeImage($elt, $opts = array())
- {
- global $registry;
-
- $alt = $dir = null;
- $line = '';
-
- $icon = $elt->icon;
- $peek = false;
-
- $dir2 = $icon->user_icon
- ? Horde::img($icon->icon, $icon->alt)
- : '<span class="foldersImg ' . $icon->class . '"></span>';
-
- if ($elt->children && isset($opts['expand_url'])) {
- $dir = $opts['expand_url']->copy()->add('folder', $elt->value);
-
- if ($elt->is_open) {
- if (!is_null($dir)) {
- $dir->add('actionID', 'collapse_folder');
- $alt = _("Collapse Folder");
- }
-
- $tree_img = ($elt->value == 'INBOX')
- ? 5
- : ($peek ? 6 : 7);
- } else {
- if (!is_null($dir)) {
- $dir->add('actionID', 'expand_folder');
- $alt = _("Expand Folder");
- }
-
- $tree_img = ($elt->value == 'INBOX')
- ? 9
- : ($peek ? 10 : 11);
- }
-
- if (!is_null($dir)) {
- $dir = Horde::link($dir, $alt) . '<span class="treeImg treeImg' . $tree_img . '"></span></a>' . $dir2;
- }
- } else {
- if (($elt->value == 'INBOX') && !$peek) {
- $dir = '<span class="treeImg"></span>' . $dir2;
- } else {
- $tree_img = ($elt->value == 'INBOX')
- ? 3
- : ($peek ? 2 : 4);
- $dir = '<span class="treeImg treeImg' . $tree_img . '"></span>' . $dir2;
- }
- }
-
- $this->_moreMbox[$elt->level] = $peek;
- for ($i = 0; $i < $elt->level; ++$i) {
- $line .= $this->_moreMbox[$i]
- ? '<span class="treeImg treeImg1"></span>'
- : '<span class="treeImg"></span>';
- }
-
- return $line . $dir;
- }
-
-}
* 'criteria_form' - (string) JSON representation of the search query.
* 'edit_query' - (string) The search query to edit.
* 'edit_query_vfolder' - (string) The name of the vfolder being edited.
- * 'search_folders_form' - (array) The list of folders to add to the query.
+ * 'folder_list' - (array) The list of folders to add to the query.
* 'search_label' - (string) The label to use when saving the search.
* 'search_mailbox' - (string) Use this mailbox as the default value.
* DEFAULT: INBOX
- * 'search_save' - (boolean) If set, save search.
+ * 'search_save' - (integer) If set, save search.
* 'search_type' - (string) The type of saved search ('vfolder').
- * 'show_unsub' - (integer) If set, return a JSON object with folder
- * information used to create the folder list.
*
* Copyright 1999-2010 The Horde Project (http://www.horde.org/)
*
if ($vars->search_save) {
switch ($vars->search_type) {
case 'vfolder':
- $id = $imp_search->addVFolder($query, $vars->search_folders_form, $criteria, $vars->search_label, $vars->edit_query_vfolder);
+ $id = $imp_search->addVFolder($query, $vars->folder_list, $criteria, $vars->search_label, $vars->edit_query_vfolder);
$notification->push(sprintf(_("Virtual Folder \"%s\" created succesfully."), $vars->search_label), 'horde.success');
break;
}
} else {
/* Set the search in the session. */
- $id = $imp_search->createSearchQuery($query, $vars->search_folders_form, $criteria, _("Search Results"));
+ $id = $imp_search->createSearchQuery($query, $vars->folder_list, $criteria, _("Search Results"));
}
/* Redirect to the mailbox page. */
/* Generate master folder list. */
$imp_imap_tree = $injector->getInstance('IMP_Imap_Tree');
-$mask = IMP_Imap_Tree::FLIST_CONTAINER;
-
-$subscribe = $prefs->getValue('subscribe');
-if (!$subscribe || $vars->show_unsub) {
- $mask |= IMP_Imap_Tree::FLIST_UNSUB;
-}
-
-$imp_imap_tree->setIteratorFilter($mask);
-
-$imp_ui_folder = new IMP_Ui_Folder();
-$tree_imgs = $imp_ui_folder->getTreeImages($imp_imap_tree);
-
-$folders = array();
-foreach ($imp_imap_tree as $key => $val) {
- $folders[] = array(
- 'c' => intval($val->container),
- 'l' => $tree_imgs[$key] . ' ' . $val->name,
- 'v' => $val->value
- );
-}
-
-if ($vars->show_unsub) {
- Horde::sendHTTPResponse($folders, 'json');
-}
-
-$js_load = array(
- 'ImpSearch.updateFolderList(' . Horde_Serialize::serialize($folders, Horde_Serialize::JSON, $charset) . ')'
-);
+$imp_imap_tree->setIteratorFilter(IMP_Imap_Tree::FLIST_CONTAINER);
+$tree = $imp_imap_tree->createTree('imp_search', array(
+ 'checkbox' => true,
+));
/* Process list of recent searches. */
$recent_searches = $imp_search->listQueries(IMP_Search::LIST_SEARCH | IMP_Search::NO_BASIC_SEARCH, false);
$t = $injector->createInstance('Horde_Template');
$t->setOption('gettext', true);
$t->set('action', Horde::applicationUrl('search.php'));
-$t->set('subscribe', $subscribe);
$t->set('virtualfolder', $_SESSION['imp']['protocol'] != 'pop');
/* Determine if we are editing a current search folder. */
$types[$key] = 'flag';
}
$t->set('f_fields', $f_fields);
+$t->set('tree', $tree->getTree());
Horde_Core_Ui_JsCalendar::init();
+++ /dev/null
-<loop:rows>
-<div class="<tag:rows.cname />">
- <input type="checkbox" class="checkbox" name="folder_list[]" <if:rows.nocheckbox>disabled="disabled" </if:rows.nocheckbox>value="<tag:rows.mbox_val />" /> <tag:rows.line /> <tag:rows.name /><if:rows.polled> (<tag:rows.unseen />/<tag:rows.msgs />)</if:rows.polled> <if:rows.editvfolder> [<tag:rows.delvfolder />] [<tag:rows.editvfolder />]</if:rows.editvfolder>
-</div>
-</loop:rows>
<span class="searchuiFoldersActions" style="display:none">
<a id="link_sel_all" href="#"><gettext>Select all</gettext></a> |
<a id="link_sel_none" href="#"><gettext>Select none</gettext></a>
-<if:subscribe>
-| <a id="link_sub" href="#"><span><gettext>Show All</gettext></span><span style="display:none"><gettext>Show Subscribed Only</gettext></span></a>
-</if:subscribe>
</span>
</div>
- <div class="item striped" style="display:none">
+ <div class="item" id="search_folders_tree" style="display:none">
+ <tag:tree />
</div>
<if:virtualfolder>
#search_form div.item {
padding: 1px 0 1px 0;
}
-#search_form .checkbox {
- vertical-align: middle;
- margin-right: 2px;
-}
-#search_form .foldersImg {
- vertical-align: middle;
-}
#search_form em.join {
font-style: normal;
font-weight: bold;
}
+#search_folders_tree input.checkbox {
+ vertical-align: middle;
+}
.searchuiCalendar {
background-image: url("graphics/calendar.png");
}
/* Folder view. */
-#checkAll0, #checkAll1, #fmanager input.checkbox, #fmanager span.folderImg {
+#checkAll0, #checkAll1, #fmanager input.checkbox {
vertical-align: middle;
}
+
#fmanager div.folderChoose {
padding-left: 5px;
}
+
span.folderImg {
background-image: url("graphics/folders/folder.png");
}
/* Expand/Collapse graphic. */
span.arrowCollapsed {
background-image: url("graphics/arrow_collapsed.png");
+ cursor: pointer;
}
span.arrowExpanded {
background-image: url("graphics/arrow_expanded.png");
+ cursor: pointer;
}
/* Loading graphic */