Branch 'roundcubemail-plugins-kolab-0.7' - 2 commits - plugins/compose_addressbook

Aleksander Machniak machniak at kolabsys.com
Thu Sep 20 11:06:55 CEST 2012


 plugins/compose_addressbook/CHANGES                                                                  |   49 +
 plugins/compose_addressbook/LICENSE                                                                  |  339 +++++++++
 plugins/compose_addressbook/README                                                                   |   42 +
 plugins/compose_addressbook/compose_addressbook.js                                                   |  224 ++++++
 plugins/compose_addressbook/compose_addressbook.php                                                  |  179 +++++
 plugins/compose_addressbook/config.inc.php.dist                                                      |   21 
 plugins/compose_addressbook/localization/de_DE.inc                                                   |   11 
 plugins/compose_addressbook/localization/en_GB.inc                                                   |   10 
 plugins/compose_addressbook/localization/en_US.inc                                                   |   10 
 plugins/compose_addressbook/localization/es_ES.inc                                                   |   10 
 plugins/compose_addressbook/localization/fr_FR.inc                                                   |   10 
 plugins/compose_addressbook/localization/it_IT.inc                                                   |   10 
 plugins/compose_addressbook/localization/nl_NL.inc                                                   |   10 
 plugins/compose_addressbook/localization/pl_PL.inc                                                   |   10 
 plugins/compose_addressbook/localization/sv_SE.inc                                                   |   10 
 plugins/compose_addressbook/localization/zh_TW.inc                                                   |   10 
 plugins/compose_addressbook/skins/default/compose_addressbook.css                                    |   83 ++
 plugins/compose_addressbook/skins/default/compose_addressbook.png                                    |binary
 plugins/compose_addressbook/skins/default/searchfield.gif                                            |binary
 plugins/compose_addressbook/skins/default/smoothness/images/ui-anim_basic_16x16.gif                  |binary
 plugins/compose_addressbook/skins/default/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png           |binary
 plugins/compose_addressbook/skins/default/smoothness/images/ui-bg_flat_75_ffffff_40x100.png          |binary
 plugins/compose_addressbook/skins/default/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png          |binary
 plugins/compose_addressbook/skins/default/smoothness/images/ui-bg_glass_65_ffffff_1x400.png          |binary
 plugins/compose_addressbook/skins/default/smoothness/images/ui-bg_glass_75_dadada_1x400.png          |binary
 plugins/compose_addressbook/skins/default/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png          |binary
 plugins/compose_addressbook/skins/default/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png          |binary
 plugins/compose_addressbook/skins/default/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png |binary
 plugins/compose_addressbook/skins/default/smoothness/images/ui-icons_222222_256x240.png              |binary
 plugins/compose_addressbook/skins/default/smoothness/images/ui-icons_2e83ff_256x240.png              |binary
 plugins/compose_addressbook/skins/default/smoothness/images/ui-icons_454545_256x240.png              |binary
 plugins/compose_addressbook/skins/default/smoothness/images/ui-icons_888888_256x240.png              |binary
 plugins/compose_addressbook/skins/default/smoothness/images/ui-icons_cd0a0a_256x240.png              |binary
 plugins/compose_addressbook/skins/default/smoothness/jquery-ui-1.8.2.custom.css                      |  345 ++++++++++
 34 files changed, 1383 insertions(+)

New commits:
commit 7b808563a85b4a7014a1355dd889497c3a0cfeac
Author: Aleksander Machniak (Kolab Systems) <machniak at kolabsys.com>
Date:   Thu Sep 20 11:06:11 2012 +0200

    Fix #1000057: Duplicated display of contacts from ldap in the address book.
        Fixed duplicated entries, added autocomplete_single option support.

diff --git a/plugins/compose_addressbook/compose_addressbook.php b/plugins/compose_addressbook/compose_addressbook.php
index cb70103..eec3244 100644
--- a/plugins/compose_addressbook/compose_addressbook.php
+++ b/plugins/compose_addressbook/compose_addressbook.php
@@ -76,9 +76,10 @@ class compose_addressbook extends rcube_plugin
     $contacts = array();
     $this->load_config();
     $rcmail = rcmail::get_instance();
-    
-    $mode = $rcmail->config->get('compose_addressbook_mode', 'full');
-        
+
+    $mode   = $rcmail->config->get('compose_addressbook_mode', 'full');
+    $single = $rcmail->config->get('autocomplete_single');
+
     // get the addressbooks, or default to all address sources
     $book_types = (array) $rcmail->config->get('compose_addressbooks', array_keys($rcmail->get_address_sources()));
         
@@ -89,9 +90,11 @@ class compose_addressbook extends rcube_plugin
       if($mode == 'full') {
         $result = $abook->list_records();
         while ($sql_arr = $result->iterate()) {
-          foreach ((array)$abook->get_col_values('email', $sql_arr, true) as $email) {
+          foreach (array_unique((array)$abook->get_col_values('email', $sql_arr, true)) as $email) {
             $contact = format_email_recipient($email, $sql_arr['name']);
             $contacts[] = array('name' => $sql_arr['name'] , 'email' => format_email_recipient($email, $sql_arr['name']));
+            if ($single)
+              break;
           }
         }
         $search = null;
@@ -111,9 +114,11 @@ class compose_addressbook extends rcube_plugin
         if(!empty($search)) {
           $result = $abook->search(array('name','email'),$search, false, true, true, 'email');
           while ($sql_arr = $result->iterate()) {
-            foreach ((array)$abook->get_col_values('email', $sql_arr, true) as $email) {
+            foreach (array_unique((array)$abook->get_col_values('email', $sql_arr, true)) as $email) {
               $contact = format_email_recipient($email, $sql_arr['name']);
               $contacts[] = array('name' => $sql_arr['name'] , 'email' => format_email_recipient($email, $sql_arr['name']));
+              if ($single)
+                break;
             }
           }
           if($abook->groups) {


commit c42640ffbaac892969b004acc61c214be8c3eabb
Author: Aleksander Machniak (Kolab Systems) <machniak at kolabsys.com>
Date:   Thu Sep 20 11:03:57 2012 +0200

    Initial commit of compose_addressbook plugin

diff --git a/plugins/compose_addressbook/CHANGES b/plugins/compose_addressbook/CHANGES
new file mode 100644
index 0000000..89ab48a
--- /dev/null
+++ b/plugins/compose_addressbook/CHANGES
@@ -0,0 +1,49 @@
+5.0-beta1           use with svn/0.6
+
+4.0  0.5            use with 0.5 stable
+
+3.1  0.4.2-stable   only use with 0.4.2 and up
+
+3.0  0.4-stable     release for roundcube 0.4-stable
+
+2.21                added dependancy information to README
+
+2.2  ui changes     minor ui changes
+     dependancy     IMPORTANT: as of 2.2 you need to install jqueryui plugin
+
+2.1  ui change      switched from jqmodal to jquery-ui dialog window due to incompatibility with roundcube
+     bugfix         small bug in search mode fixed
+
+2.0  new            compatible with new address groups
+     new            will use all address sources by default
+
+IMPORTANT:  only use version 2.0+ with roundcube 0.4 or newer. 
+
+1.5.1 new           allow skin override
+
+1.5.0 new           improve LDAP compatibility, create 'mode' option
+
+1.4.0 bugfix        make compatible with jquery 1.4
+
+1.3.2 translation   added spanish and polish translations
+      bugfix        typo in english translation
+
+1.3.1 translation   added french translation by bagu
+
+1.3 translation     added taiwanese translatopn by siulee88
+    ui change       changed some ui elements, patch by epinter
+
+1.2 translation     added swedish translation by Joans Nasholm 
+
+1.1 bugfix          LDAP addressbooks didnt work
+
+1.0 no changes
+
+0.3 ui change       changed toolbar icon
+
+0.2 bugfix	        config option needs to be an array
+    bugfix         	changed some variable names to not cause JS name
+		                conflict with other plugins
+    translation     german translation added (thanks to Rosali) 
+
+0.1 initial version
diff --git a/plugins/compose_addressbook/LICENSE b/plugins/compose_addressbook/LICENSE
new file mode 100644
index 0000000..d159169
--- /dev/null
+++ b/plugins/compose_addressbook/LICENSE
@@ -0,0 +1,339 @@
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                            NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/plugins/compose_addressbook/README b/plugins/compose_addressbook/README
new file mode 100644
index 0000000..625cc98
--- /dev/null
+++ b/plugins/compose_addressbook/README
@@ -0,0 +1,42 @@
++-------------------------------------------------------------------------+
+|
+|  Author:  Cor Bosman (roundcube at wa.ter.net)
+|  Plugin:  compose_addressbook
+|  Version: 5.0-beta1
+|  Purpose: Add addressbook window to compose screen
+| Required: jqueryui plugin
+|
++-------------------------------------------------------------------------+
+
+IMPORTANT: as of version 2.2 you need to install the jqueryui plugin.
+           http://underwa.ter.net/roundcube-plugins/
+
+
+compose_addressbook plugin adds a button to the compose screen allowing you
+to select contacts with the mouse. These contacts can then be added to your
+recipients (To/CC/BCC) with a mouse click. 
+
+Some features:
+
+- doubleclick to quickly add a contact to your To field
+- select multiple contacts and click one of the buttons to add to the
+  specific field
+- config option lets you select which addressbooks to use
+- set mode in config file to switch between full or search mod
+- you can drag the window using the top name bar
+- use the search field to search in your addressbook
+
+Installation
+------------
+
+- install jqueryui plugin (http://underwa.ter.net/roundcube-plugins/)
+
+- Add 'jqueryui' and 'compose_addressbook' to your plugin config in main.inc.php
+
+- if necessary edit config.php.inc in the compose_addressbook plugin
+ 
+
+Licensing:
+----------
+This plugin is distributed under the GNU General Public License Version 2.
+Please read through the file LICENSE for more information about this license.
diff --git a/plugins/compose_addressbook/compose_addressbook.js b/plugins/compose_addressbook/compose_addressbook.js
new file mode 100644
index 0000000..de5d952
--- /dev/null
+++ b/plugins/compose_addressbook/compose_addressbook.js
@@ -0,0 +1,224 @@
+var compose_addressbook_fetched = false;
+
+if(window.rcmail) {
+  rcmail.addEventListener('init', function(evt) {
+
+    // mode of operation. configure this in config.php
+    var mode = rcmail.env.compose_addressbook_mode;
+    
+    // to be able to have translated buttons, we need to predefine the buttons array
+    var cab_to  = rcmail.gettext('to');
+    var cab_cc  = rcmail.gettext('cc');
+    var cab_bcc = rcmail.gettext('bcc');
+    
+    var buttons = {};
+    buttons[cab_bcc] = function() {
+      compose_addressbook_add_recipients('_bcc');
+      $('.ui-dialog-buttonpane button').removeClass('ui-state-focus');
+    }
+    buttons[cab_cc] = function() {
+      compose_addressbook_add_recipients('_cc');
+      $('.ui-dialog-buttonpane button').removeClass('ui-state-focus');    
+    }
+    buttons[cab_to] = function() {
+      compose_addressbook_add_recipients('_to');
+      $('.ui-dialog-buttonpane button').removeClass('ui-state-focus');
+    }
+    
+    // bind the dialog functionality to the dialog div
+    $("#compose_addressbook_dialog").dialog({
+      autoOpen: false,
+      modal: false,
+      resizable: false,
+      width: 285,
+      height: 500,
+      minHeight: 400,
+      buttons: buttons,
+      position: [$(window).width()-400,50]
+    });
+    
+    // register the command associated with the toolbar button
+    rcmail.register_command('plugin.compose_addressbook', compose_addressbook_start , true);
+    
+    // add the command to the list of compose commands
+    rcmail.env.compose_commands.push('plugin.compose_addressbook');
+
+    // register the callback function 
+    rcmail.addEventListener('plugin.compose_addressbook_receive', compose_addressbook_receive);
+    
+    // register the callback function for the group expander
+    rcmail.addEventListener('plugin.compose_addressbook_receive_expand', compose_addressbook_receive_expand);
+    
+    // create an rc list object 
+    if(rcmail.gui_objects.compose_addressbook_list) {
+      rcmail.compose_addressbook_list = new rcube_list_widget(rcmail.gui_objects.compose_addressbook_list, {multiselect:true, draggable:false, keyboard:false});
+      
+      // add a listener for double click
+      rcmail.compose_addressbook_list.addEventListener('dblclick', function(o){ compose_address_dblclick(o); });
+      
+      // initialize the list
+      rcmail.compose_addressbook_list.init();  
+    }  
+    
+    // each mode of operation has a different key handler
+    if(mode == 'full') {
+      // bind keyevent handler to the search box
+      $('#compose_addressbook_filter').bind('keyup', function(evt) {
+        var search = $('#compose_addressbook_filter').val();
+        var regexp = new RegExp(search, 'i');
+        $('#compose_addressbook_table').find('td').each(function() {
+          var content = $(this).attr('title');
+          if(regexp.test(content)) {
+            $(this).parent().show();
+          } else {
+            $(this).parent().hide();
+          }
+        });
+      });
+    } else {
+      $('#compose_addressbook_filter').bind((bw.safari || bw.ie ? 'keydown' : 'keypress'), function(evt) {
+        var key = rcube_event.get_keycode(evt);
+        if(key == 13) {
+          var search = $('#compose_addressbook_filter').val();
+          $('#compose_addressbook_filter').val('');
+          compose_addressbook_search(search);
+          return false;
+        } 
+      });
+    }
+    
+    // bind click event to clear function
+    $("#compose_addressbook_searchreset").bind('click', function(e) { 
+      $('#compose_addressbook_filter').val('');
+      $('#compose_addressbook_filter').focus();
+      $('#compose_addressbook_table').find('tr').each(function() {
+        $(this).show();
+      });
+    });
+  });
+}
+
+function compose_addressbook_start() 
+{
+  compose_addressbook_fetch();
+  $('#compose_addressbook_dialog').dialog('open');
+}
+
+function compose_addressbook_fetch() 
+{
+  if(!compose_addressbook_fetched) {
+    lock = rcmail.set_busy(true, 'loading');
+    rcmail.http_post('plugin.get_addressbook', '', lock);
+    compose_addressbook_fetched = true;
+  }
+}
+
+function compose_addressbook_search(search) 
+{
+  rcmail.compose_addressbook_list.clear();
+  lock = rcmail.set_busy(true, 'loading');
+  rcmail.http_post('plugin.get_addressbook', '_search='+urlencode(search), lock);
+}
+
+function compose_addressbook_receive(data) 
+{
+  var addresses = data.addresses;
+  var name;
+  var email;
+  
+  // save the addresses for later use
+  rcmail.compose_addressbook_addresses = addresses;
+
+  for(var j=0; j<addresses.length; j++) {
+    var name = addresses[j].name;
+    
+    if(addresses[j].id) {
+      email = 'address group';
+    } else {
+      email = addresses[j].email;
+    }
+    // add address to the row
+    compose_addressbook_add(name,email,j);    
+  }
+}
+
+function compose_addressbook_add(address,email,id) {
+  var row = document.createElement('tr');
+  row.id = 'rcmrow'+id;
+  td = document.createElement('td');
+  td.innerHTML = address;
+  td.setAttribute('title', email);
+  td.style.cursor='pointer';
+  row.appendChild(td);
+  
+  // add element to the list
+  rcmail.compose_addressbook_list.insert_row(row,0);
+}
+
+function compose_address_dblclick(list) {
+  var group_ids = [];
+  var group_sources = [];
+  
+  var id = list.get_single_selection();
+  if(id == null) return;
+  
+  var uid = list.rows[id].uid;
+  if(rcmail.compose_addressbook_addresses[uid].id) {
+    group_ids[0] = rcmail.compose_addressbook_addresses[uid].id;
+    group_sources[0] = rcmail.compose_addressbook_addresses[uid].source;
+    compose_addressbook_expand(group_ids, group_sources, '_to');
+  } else {
+    $("[name='_to']").attr('value', $("[name='_to']").val() + rcmail.compose_addressbook_addresses[uid].email+", ");
+  }
+  rcmail.compose_addressbook_list.clear_selection();
+}
+
+function compose_addressbook_add_recipients(target) {
+  var group_ids = [];
+  var group_sources = [];
+  
+  if(rcmail.compose_addressbook_list.selection.length == 0) {
+    rcmail.display_message(rcmail.gettext('compose_addressbook_noselect', 'compose_addressbook'), 'error');
+    return;
+  }
+  rcmail.compose_addressbook_list.focused = false;
+  switch(target) {
+    case '_cc':
+      rcmail_ui.show_header_form('cc');
+      break;
+    case '_bcc':
+      rcmail_ui.show_header_form('bcc');
+      break;
+  }
+  
+  for (var n=0; n<rcmail.compose_addressbook_list.selection.length; n++) {
+    var id = rcmail.compose_addressbook_list.selection[n];
+    var uid = rcmail.compose_addressbook_list.rows[id].uid;
+    var form = '[name="'+target+'"]';
+    
+    if(rcmail.compose_addressbook_addresses[uid].id) {
+      group_ids[group_ids.length] = rcmail.compose_addressbook_addresses[uid].id;
+      group_sources[group_sources.length] = rcmail.compose_addressbook_addresses[uid].source;
+    } else {
+      $('#'+target).attr('value', $('#'+target).val() + rcmail.compose_addressbook_addresses[uid].email+", ");
+    }
+  }
+  compose_addressbook_expand(group_ids, group_sources,target);
+  rcmail.compose_addressbook_list.clear_selection();  
+  rcmail.display_message(rcmail.gettext('compose_addressbook_added', 'compose_addressbook'), 'confirmation');
+}
+
+function compose_addressbook_expand(group_ids, group_sources,target) {
+  if(group_ids.length > 0) {
+    lock = rcmail.set_busy(true, 'loading');
+    rcmail.http_request('plugin.expand_groups', '_groupids='+urlencode(group_ids.join(','))+'&_groupsources='+urlencode(group_sources.join(','))+'&_target='+target, lock);
+  }
+}
+
+function compose_addressbook_receive_expand(data) {
+  var form = '[name="'+data.target+'"]';
+  
+  for(var j in data.members) {
+    $(form).attr('value', $(form).val() + data.members[j]+", ");
+  }
+}
diff --git a/plugins/compose_addressbook/compose_addressbook.php b/plugins/compose_addressbook/compose_addressbook.php
new file mode 100644
index 0000000..cb70103
--- /dev/null
+++ b/plugins/compose_addressbook/compose_addressbook.php
@@ -0,0 +1,174 @@
+<?php
+
+/**
+  * This plugin lets you add addressbook entries from the compose window using the mouse
+  * 
+  * @author Cor Bosman (roundcube at wa.ter.net)
+  */
+  
+class compose_addressbook extends rcube_plugin
+{
+  public $task = 'mail';
+
+  public function init()
+  {  
+    $rcmail = rcmail::get_instance();
+    $this->require_plugin('jqueryui');
+
+    $this->register_action('plugin.get_addressbook', array($this, 'get_address'));
+    $this->register_action('plugin.expand_groups', array($this, 'expand_groups'));
+    
+    if($rcmail->action == 'compose') {      
+      $this->compose_addressbook_init();      
+    }
+  }
+
+  public function compose_addressbook_init()
+  {
+    $this->add_texts('localization', true);
+    
+    $rcmail = rcmail::get_instance();
+    
+    $skin_path = $this->local_skin_path();
+  
+    // add javascript and stylesheets
+    $this->include_script('compose_addressbook.js');
+    $this->include_stylesheet("$skin_path/compose_addressbook.css");
+    
+    // html for dialog window
+    $table = new html_table(array('id' => 'compose_addressbook_table', 'class' => 'records-table', 'cols' => 1, 'cellspacing' => 0));
+     
+    // create div for dialog window
+    $rcmail->output->add_footer(html::div(array('id' => "compose_addressbook_dialog", 'title' => Q($this->gettext('compose_addressbook_title'))),
+                                  html::div(array('id' => "compose_addressbook_quicksearchbar"),
+                                    html::img(array('id'=>'compose_addressbook_searchmod','src'=>'/images/icons/glass.png')) .
+                                    html::tag('input', array('type' => "text", 'class' => 'compose_addressbook_filter','id'=>'compose_addressbook_filter')). 
+                                    html::a(array('id' => 'compose_addressbook_searchreset', 'href'=>'#'),
+                                      html::img(array('src'=>'/images/icons/reset.gif')))
+                                  ) . 
+                                  html::div(array('id' => "compose_addressbook_container"),
+                                    $table->show()
+                                  )
+                                ));
+                  
+    // add the addressbook button
+    $this->add_button(array(
+      'command' => 'plugin.compose_addressbook', 
+      'imagepas' => $skin_path.'/compose_addressbook.png', 
+      'imageact' => $skin_path.'/compose_addressbook.png', 
+      'title' => 'compose_addressbook.compose_addressbook_buttontitle', 
+      'id' => 'rcmbtn_compose_addressbook'), 'toolbar');
+    
+    $this->load_config();    
+    $rcmail->output->set_env('compose_addressbook_mode', $rcmail->config->get('compose_addressbook_mode', 'full'));
+    $rcmail->output->add_gui_object('compose_addressbook_list', 'compose_addressbook_table');
+    
+    // add some labels 
+    $rcmail->output->add_label('cc', 'bcc', 'to');
+    
+    // add list functions
+    $rcmail->output->include_script('list.js');
+                               
+  }
+  
+  // get the addressbook entries and return them to the UI.
+  function get_address() {
+    $contacts = array();
+    $this->load_config();
+    $rcmail = rcmail::get_instance();
+    
+    $mode = $rcmail->config->get('compose_addressbook_mode', 'full');
+        
+    // get the addressbooks, or default to all address sources
+    $book_types = (array) $rcmail->config->get('compose_addressbooks', array_keys($rcmail->get_address_sources()));
+        
+    foreach ($book_types as $id) {
+      $abook = $rcmail->get_address_book($id);
+      $abook->set_pagesize(50000);
+
+      if($mode == 'full') {
+        $result = $abook->list_records();
+        while ($sql_arr = $result->iterate()) {
+          foreach ((array)$abook->get_col_values('email', $sql_arr, true) as $email) {
+            $contact = format_email_recipient($email, $sql_arr['name']);
+            $contacts[] = array('name' => $sql_arr['name'] , 'email' => format_email_recipient($email, $sql_arr['name']));
+          }
+        }
+        $search = null;
+        if($abook->groups) {
+          foreach($abook->list_groups($search) as $group) {
+            $abook->reset();
+            $abook->set_group($group['ID']);
+            $result = $abook->count();
+            if ($result->count) {
+              $contacts[] = array('name' => $group['name'] . ' (' . intval($result->count) . ')', 'id' => $group['ID'], 'source' => $id);
+            }
+          }
+        }
+      } else {
+        $search=trim(get_input_value('_search', RCUBE_INPUT_POST));
+        
+        if(!empty($search)) {
+          $result = $abook->search(array('name','email'),$search, false, true, true, 'email');
+          while ($sql_arr = $result->iterate()) {
+            foreach ((array)$abook->get_col_values('email', $sql_arr, true) as $email) {
+              $contact = format_email_recipient($email, $sql_arr['name']);
+              $contacts[] = array('name' => $sql_arr['name'] , 'email' => format_email_recipient($email, $sql_arr['name']));
+            }
+          }
+          if($abook->groups) {
+            foreach($abook->list_groups($search) as $group) {
+              $abook->reset();
+              $abook->set_group($group['ID']);
+              $result = $abook->count();
+              if ($result->count) {
+                $contacts[] = array('name' => $group['name'] . ' (' . intval($result->count) . ')', 'id' => $group['ID'], 'source' => $id);
+              }
+            }
+          }
+        } 
+      }
+    }
+    
+    sort($contacts);
+    
+    // send the addressbook back to javascript
+    $rcmail->output->command('plugin.compose_addressbook_receive', array('addresses' => $contacts));    
+  }
+  
+  // expand all the groups that we added
+  function expand_groups() {
+    $rcmail = rcmail::get_instance();
+    
+    $group_ids_input=trim(get_input_value('_groupids', RCUBE_INPUT_GET));
+    $group_sources_input=trim(get_input_value('_groupsources', RCUBE_INPUT_GET));
+    $target = trim(get_input_value('_target', RCUBE_INPUT_GET));
+    
+    if($group_ids_input == '' || $group_sources_input == '') exit;
+    
+    $group_ids = explode(',', $group_ids_input);
+    $group_sources = explode(',', $group_sources_input);
+    
+    // create a list of ids per address source
+    for($i=0; $i<count($group_sources);$i++) {
+      $address_sources[$group_sources[$i]][] = $group_ids[$i];
+    }
+    
+    // iterate over each address source and get the expanded groups
+    $members = array();
+    foreach($address_sources as $source => $groups) {
+      $abook = $rcmail->get_address_book($source);
+      foreach($groups as $group) {
+        $abook->set_group($group);
+        $abook->set_pagesize(1000);
+        $result = $abook->list_records(array('email','name'));
+        while ($result && ($sql_arr = $result->iterate())) {
+          $email = (array)$sql_arr['email'];
+          $members[] = format_email_recipient($email[0], $sql_arr['name']);
+        }
+      }
+    }
+    $rcmail->output->command('plugin.compose_addressbook_receive_expand', array('members' => array_unique($members), 'target' => $target));
+  }
+}
+?>
diff --git a/plugins/compose_addressbook/config.inc.php.dist b/plugins/compose_addressbook/config.inc.php.dist
new file mode 100644
index 0000000..b2ba8f9
--- /dev/null
+++ b/plugins/compose_addressbook/config.inc.php.dist
@@ -0,0 +1,21 @@
+<?php
+
+// which addressbook do we show. this can contain any addressbooks you use, including those set by plugins.
+// by default it's the same as the autocomplete_addressbooks setting.
+
+// $rcmail_config['compose_addressbooks'] = array('ldap');
+// $rcmail_config['compose_addressbooks'] = array('sql', 'static');
+// $rcmail_config['compose_addressbooks'] = array('sql');
+
+// which mode of operation do we use.
+//
+// full   - show the full addressbook in the popup window. this should work
+//          with most users, and is the default
+//
+// search - popup window starts up empty, and you can search for specific
+//          addresses. This is recommended for extremely large addressbooks
+//          containing thousands of addresses, and in most LDAP environments.
+
+$rcmail_config['compose_addressbook_mode'] = 'full';
+
+?>
diff --git a/plugins/compose_addressbook/localization/de_DE.inc b/plugins/compose_addressbook/localization/de_DE.inc
new file mode 100644
index 0000000..929a649
--- /dev/null
+++ b/plugins/compose_addressbook/localization/de_DE.inc
@@ -0,0 +1,11 @@
+<?php
+
+$labels = array();
+$labels['compose_addressbook_buttontitle'] = 'Adressbuch anzeigen';
+$labels['compose_addressbook_title'] = 'Adressbuch';
+$labels['compose_addressbook_close'] = 'Schließen';
+$labels['compose_addressbook_noselect'] = 'Sie haben keine Adresse ausgewählt';
+$labels['compose_addressbook_added'] = 'Adresse wurde hinzugefügt';
+
+
+?>
\ No newline at end of file
diff --git a/plugins/compose_addressbook/localization/en_GB.inc b/plugins/compose_addressbook/localization/en_GB.inc
new file mode 100644
index 0000000..a8078f4
--- /dev/null
+++ b/plugins/compose_addressbook/localization/en_GB.inc
@@ -0,0 +1,10 @@
+<?php
+
+$labels = array();
+$labels['compose_addressbook_buttontitle'] = 'Show Address Book';
+$labels['compose_addressbook_title'] = 'Address Book';
+$labels['compose_addressbook_close'] = 'Close';
+$labels['compose_addressbook_noselect'] = 'You did not select an address';
+$labels['compose_addressbook_added'] = 'Addresses added';
+
+?>
diff --git a/plugins/compose_addressbook/localization/en_US.inc b/plugins/compose_addressbook/localization/en_US.inc
new file mode 100644
index 0000000..a8078f4
--- /dev/null
+++ b/plugins/compose_addressbook/localization/en_US.inc
@@ -0,0 +1,10 @@
+<?php
+
+$labels = array();
+$labels['compose_addressbook_buttontitle'] = 'Show Address Book';
+$labels['compose_addressbook_title'] = 'Address Book';
+$labels['compose_addressbook_close'] = 'Close';
+$labels['compose_addressbook_noselect'] = 'You did not select an address';
+$labels['compose_addressbook_added'] = 'Addresses added';
+
+?>
diff --git a/plugins/compose_addressbook/localization/es_ES.inc b/plugins/compose_addressbook/localization/es_ES.inc
new file mode 100644
index 0000000..2a000f2
--- /dev/null
+++ b/plugins/compose_addressbook/localization/es_ES.inc
@@ -0,0 +1,10 @@
+<?php
+
+$labels = array();
+$labels['compose_addressbook_buttontitle'] = 'Mostrar Direcciones';
+$labels['compose_addressbook_title'] = 'Libreta de Direcciones';
+$labels['compose_addressbook_close'] = 'Cerrar';
+$labels['compose_addressbook_noselect'] = 'No has seleccionado ninguna dirección!';
+$labels['compose_addressbook_added'] = 'Dirección añadida';
+
+?>
diff --git a/plugins/compose_addressbook/localization/fr_FR.inc b/plugins/compose_addressbook/localization/fr_FR.inc
new file mode 100644
index 0000000..1f52ffe
--- /dev/null
+++ b/plugins/compose_addressbook/localization/fr_FR.inc
@@ -0,0 +1,10 @@
+<?php
+
+$labels = array();
+$labels['compose_addressbook_buttontitle'] = 'Afficher le carnet d\'adresse';
+$labels['compose_addressbook_title'] = 'Carnet d\'adresse';
+$labels['compose_addressbook_close'] = 'Fermer';
+$labels['compose_addressbook_noselect'] = 'Vous n\'avez pas sélectionné d\'adresse';
+$labels['compose_addressbook_added'] = 'Adresses ajoutées';
+
+?>
diff --git a/plugins/compose_addressbook/localization/it_IT.inc b/plugins/compose_addressbook/localization/it_IT.inc
new file mode 100644
index 0000000..d1b0c46
--- /dev/null
+++ b/plugins/compose_addressbook/localization/it_IT.inc
@@ -0,0 +1,10 @@
+<?php
+
+$labels = array();
+$labels['compose_addressbook_buttontitle'] = 'Mostra la rubrica';
+$labels['compose_addressbook_title'] = 'Rubrica';
+$labels['compose_addressbook_close'] = 'Chiudi';
+$labels['compose_addressbook_noselect'] = 'Non hai selezionato nessun indirizzo';
+$labels['compose_addressbook_added'] = 'L\'indirizzo è stato aggiunto';
+
+?>
diff --git a/plugins/compose_addressbook/localization/nl_NL.inc b/plugins/compose_addressbook/localization/nl_NL.inc
new file mode 100644
index 0000000..f5de52a
--- /dev/null
+++ b/plugins/compose_addressbook/localization/nl_NL.inc
@@ -0,0 +1,10 @@
+<?php
+
+$labels = array();
+$labels['compose_addressbook_buttontitle'] = 'Voeg adres uit adresboek toe';
+$labels['compose_addressbook_title'] = 'Adres boek';
+$labels['compose_addressbook_close'] = 'Sluiten';
+$labels['compose_addressbook_noselect'] = 'Er is geen contact adres geselecteerd';
+$labels['compose_addressbook_added'] = 'Adressen zijn toegevoegd';
+
+?>
diff --git a/plugins/compose_addressbook/localization/pl_PL.inc b/plugins/compose_addressbook/localization/pl_PL.inc
new file mode 100644
index 0000000..eb95e42
--- /dev/null
+++ b/plugins/compose_addressbook/localization/pl_PL.inc
@@ -0,0 +1,10 @@
+<?php
+
+$labels = array();
+$labels['compose_addressbook_buttontitle'] = 'Zobacz książkę adresową';
+$labels['compose_addressbook_title'] = 'Książka adresowa';
+$labels['compose_addressbook_close'] = 'Zamknij';
+$labels['compose_addressbook_noselect'] = 'Zaznacz jakiÅ› adres';
+$labels['compose_addressbook_added'] = 'Adres został dodany';
+
+?>
diff --git a/plugins/compose_addressbook/localization/sv_SE.inc b/plugins/compose_addressbook/localization/sv_SE.inc
new file mode 100644
index 0000000..6e6d49f
--- /dev/null
+++ b/plugins/compose_addressbook/localization/sv_SE.inc
@@ -0,0 +1,10 @@
+<?php
+
+$labels = array();
+$labels['compose_addressbook_buttontitle'] = 'Visa adressbok';
+$labels['compose_addressbook_title'] = 'Adressbok';
+$labels['compose_addressbook_close'] = 'Stäng';
+$labels['compose_addressbook_noselect'] = 'Ingen adress valdes';
+$labels['compose_addressbook_added'] = 'Adress tillagd';
+
+?>
diff --git a/plugins/compose_addressbook/localization/zh_TW.inc b/plugins/compose_addressbook/localization/zh_TW.inc
new file mode 100644
index 0000000..1be7b61
--- /dev/null
+++ b/plugins/compose_addressbook/localization/zh_TW.inc
@@ -0,0 +1,10 @@
+<?php
+
+$labels = array();
+$labels['compose_addressbook_buttontitle'] = '顯示地址簿';
+$labels['compose_addressbook_title'] = '地址簿';
+$labels['compose_addressbook_close'] = '關閉';
+$labels['compose_addressbook_noselect'] = '沒有選擇電郵地址';
+$labels['compose_addressbook_added'] = '已加入電郵地址';
+
+?>
\ No newline at end of file
diff --git a/plugins/compose_addressbook/skins/default/compose_addressbook.css b/plugins/compose_addressbook/skins/default/compose_addressbook.css
new file mode 100644
index 0000000..f8ec665
--- /dev/null
+++ b/plugins/compose_addressbook/skins/default/compose_addressbook.css
@@ -0,0 +1,83 @@
+#compose_addressbook_dialog {
+  display: none;
+  background-color: #FAFAFA;
+  color: #333;
+  padding: 5px 0 0 0;
+  overflow: hidden;
+}
+
+#compose_addressbook_dialog .ui-dialog {
+  padding: 0;
+}
+
+#compose_addressbook_container {
+  height: 376px;
+  overflow: auto;
+  overflow-x: hidden;
+  border-top: 1px solid #AAAAAA;
+  position: relative;
+  top: 30px;
+}
+
+#compose_addressbook_dialog table {
+  width: 100%;
+  overflow: hidden;
+}
+
+#compose_addressbook_quicksearchbar
+{
+  position: absolute;
+  left: 60px;
+  width: 182px;
+  height: 20px;
+  text-align: right;
+  background: url('searchfield.gif') top left no-repeat;
+}
+
+#compose_addressbook_searchreset
+{
+  position: absolute;
+  top: 3px;
+  right: 4px;
+  text-decoration: none;
+}
+
+#compose_addressbook_searchmod
+{
+ position: absolute;
+ top: 3px;
+ right: 160px;
+}
+
+#compose_addressbook_quicksearchbar img
+{
+  vertical-align: middle;
+}
+
+#compose_addressbook_filter
+{
+  margin-right: 4px;
+  margin-bottom: 5px;
+  position: absolute;
+  top: 2px;
+  left: 24px;
+  width: 140px;
+  height: 15px;
+  font-size: 11px;
+  padding: 0px;
+  border: none;
+}
+
+#compose_addressbook_dialog input {
+  outline: none;
+  border: none !important;
+}
+
+#compose_addressbook_filter[type=text]:focus {
+  outline: 0 none;
+}
+
+.ui-dialog-buttonpane button {
+  font-size: 10px !important;
+  width: 85px !important;
+}
\ No newline at end of file
diff --git a/plugins/compose_addressbook/skins/default/compose_addressbook.png b/plugins/compose_addressbook/skins/default/compose_addressbook.png
new file mode 100644
index 0000000..e58e4dd
Binary files /dev/null and b/plugins/compose_addressbook/skins/default/compose_addressbook.png differ
diff --git a/plugins/compose_addressbook/skins/default/searchfield.gif b/plugins/compose_addressbook/skins/default/searchfield.gif
new file mode 100644
index 0000000..756a17e
Binary files /dev/null and b/plugins/compose_addressbook/skins/default/searchfield.gif differ
diff --git a/plugins/compose_addressbook/skins/default/smoothness/images/ui-anim_basic_16x16.gif b/plugins/compose_addressbook/skins/default/smoothness/images/ui-anim_basic_16x16.gif
new file mode 100644
index 0000000..085ccae
Binary files /dev/null and b/plugins/compose_addressbook/skins/default/smoothness/images/ui-anim_basic_16x16.gif differ
diff --git a/plugins/compose_addressbook/skins/default/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png b/plugins/compose_addressbook/skins/default/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png
new file mode 100644
index 0000000..5b5dab2
Binary files /dev/null and b/plugins/compose_addressbook/skins/default/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png differ
diff --git a/plugins/compose_addressbook/skins/default/smoothness/images/ui-bg_flat_75_ffffff_40x100.png b/plugins/compose_addressbook/skins/default/smoothness/images/ui-bg_flat_75_ffffff_40x100.png
new file mode 100644
index 0000000..ac8b229
Binary files /dev/null and b/plugins/compose_addressbook/skins/default/smoothness/images/ui-bg_flat_75_ffffff_40x100.png differ
diff --git a/plugins/compose_addressbook/skins/default/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png b/plugins/compose_addressbook/skins/default/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png
new file mode 100644
index 0000000..ad3d634
Binary files /dev/null and b/plugins/compose_addressbook/skins/default/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png differ
diff --git a/plugins/compose_addressbook/skins/default/smoothness/images/ui-bg_glass_65_ffffff_1x400.png b/plugins/compose_addressbook/skins/default/smoothness/images/ui-bg_glass_65_ffffff_1x400.png
new file mode 100644
index 0000000..42ccba2
Binary files /dev/null and b/plugins/compose_addressbook/skins/default/smoothness/images/ui-bg_glass_65_ffffff_1x400.png differ
diff --git a/plugins/compose_addressbook/skins/default/smoothness/images/ui-bg_glass_75_dadada_1x400.png b/plugins/compose_addressbook/skins/default/smoothness/images/ui-bg_glass_75_dadada_1x400.png
new file mode 100644
index 0000000..5a46b47
Binary files /dev/null and b/plugins/compose_addressbook/skins/default/smoothness/images/ui-bg_glass_75_dadada_1x400.png differ
diff --git a/plugins/compose_addressbook/skins/default/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png b/plugins/compose_addressbook/skins/default/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png
new file mode 100644
index 0000000..86c2baa
Binary files /dev/null and b/plugins/compose_addressbook/skins/default/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png differ
diff --git a/plugins/compose_addressbook/skins/default/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png b/plugins/compose_addressbook/skins/default/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png
new file mode 100644
index 0000000..4443fdc
Binary files /dev/null and b/plugins/compose_addressbook/skins/default/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png differ
diff --git a/plugins/compose_addressbook/skins/default/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/plugins/compose_addressbook/skins/default/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png
new file mode 100644
index 0000000..7c9fa6c
Binary files /dev/null and b/plugins/compose_addressbook/skins/default/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png differ
diff --git a/plugins/compose_addressbook/skins/default/smoothness/images/ui-icons_222222_256x240.png b/plugins/compose_addressbook/skins/default/smoothness/images/ui-icons_222222_256x240.png
new file mode 100644
index 0000000..b273ff1
Binary files /dev/null and b/plugins/compose_addressbook/skins/default/smoothness/images/ui-icons_222222_256x240.png differ
diff --git a/plugins/compose_addressbook/skins/default/smoothness/images/ui-icons_2e83ff_256x240.png b/plugins/compose_addressbook/skins/default/smoothness/images/ui-icons_2e83ff_256x240.png
new file mode 100644
index 0000000..09d1cdc
Binary files /dev/null and b/plugins/compose_addressbook/skins/default/smoothness/images/ui-icons_2e83ff_256x240.png differ
diff --git a/plugins/compose_addressbook/skins/default/smoothness/images/ui-icons_454545_256x240.png b/plugins/compose_addressbook/skins/default/smoothness/images/ui-icons_454545_256x240.png
new file mode 100644
index 0000000..59bd45b
Binary files /dev/null and b/plugins/compose_addressbook/skins/default/smoothness/images/ui-icons_454545_256x240.png differ
diff --git a/plugins/compose_addressbook/skins/default/smoothness/images/ui-icons_888888_256x240.png b/plugins/compose_addressbook/skins/default/smoothness/images/ui-icons_888888_256x240.png
new file mode 100644
index 0000000..6d02426
Binary files /dev/null and b/plugins/compose_addressbook/skins/default/smoothness/images/ui-icons_888888_256x240.png differ
diff --git a/plugins/compose_addressbook/skins/default/smoothness/images/ui-icons_cd0a0a_256x240.png b/plugins/compose_addressbook/skins/default/smoothness/images/ui-icons_cd0a0a_256x240.png
new file mode 100644
index 0000000..2ab019b
Binary files /dev/null and b/plugins/compose_addressbook/skins/default/smoothness/images/ui-icons_cd0a0a_256x240.png differ
diff --git a/plugins/compose_addressbook/skins/default/smoothness/jquery-ui-1.8.2.custom.css b/plugins/compose_addressbook/skins/default/smoothness/jquery-ui-1.8.2.custom.css
new file mode 100644
index 0000000..401eb1d
--- /dev/null
+++ b/plugins/compose_addressbook/skins/default/smoothness/jquery-ui-1.8.2.custom.css
@@ -0,0 +1,345 @@
+/*
+* jQuery UI CSS Framework
+* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
+*/
+
+/* Layout helpers
+----------------------------------*/
+.ui-helper-hidden { display: none; }
+.ui-helper-hidden-accessible { position: absolute; left: -99999999px; }
+.ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
+.ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
+.ui-helper-clearfix { display: inline-block; }
+/* required comment for clearfix to work in Opera \*/
+* html .ui-helper-clearfix { height:1%; }
+.ui-helper-clearfix { display:block; }
+/* end clearfix */
+.ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
+
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-disabled { cursor: default !important; }
+
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Overlays */
+.ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
+
+
+/*
+* jQuery UI CSS Framework
+* Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
+* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
+* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana,Arial,sans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=01_flat.png&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=02_glass.png&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=02_glass.png&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=02_glass.png&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=02_glass.png&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorH
 ighlight=2e83ff&bgColorError=fef1ec&bgTextureError=02_glass.png&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px
+*/
+
+
+/* Component containers
+----------------------------------*/
+.ui-widget { font-family: Verdana,Arial,sans-serif; font-size: 1.1em; }
+.ui-widget .ui-widget { font-size: 1em; }
+.ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Verdana,Arial,sans-serif; font-size: 1em; }
+.ui-widget-content { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_flat_75_ffffff_40x100.png) 50% 50% repeat-x; color: #222222; }
+.ui-widget-content a { color: #222222; }
+.ui-widget-header { border: 1px solid #aaaaaa; background: #cccccc url(images/ui-bg_highlight-soft_75_cccccc_1x100.png) 50% 50% repeat-x; color: #222222; font-weight: bold; }
+.ui-widget-header a { color: #222222; }
+
+/* Interaction states
+----------------------------------*/
+.ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #d3d3d3; background: #e6e6e6 url(images/ui-bg_glass_75_e6e6e6_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #555555; }
+.ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #555555; text-decoration: none; }
+.ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #999999; background: #dadada url(images/ui-bg_glass_75_dadada_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
+.ui-state-hover a, .ui-state-hover a:hover { color: #212121; text-decoration: none; }
+.ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #aaaaaa; background: #ffffff url(images/ui-bg_glass_65_ffffff_1x400.png) 50% 50% repeat-x; font-weight: normal; color: #212121; }
+.ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #212121; text-decoration: none; }
+.ui-widget :active { outline: none; }
+
+/* Interaction Cues
+----------------------------------*/
+.ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight  {border: 1px solid #fcefa1; background: #fbf9ee url(images/ui-bg_glass_55_fbf9ee_1x400.png) 50% 50% repeat-x; color: #363636; }
+.ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #363636; }
+.ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/ui-bg_glass_95_fef1ec_1x400.png) 50% 50% repeat-x; color: #cd0a0a; }
+.ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #cd0a0a; }
+.ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #cd0a0a; }
+.ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
+.ui-priority-secondary, .ui-widget-content .ui-priority-secondary,  .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
+.ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
+
+/* Icons
+----------------------------------*/
+
+/* states and images */
+.ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-widget-content .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-widget-header .ui-icon {background-image: url(images/ui-icons_222222_256x240.png); }
+.ui-state-default .ui-icon { background-image: url(images/ui-icons_888888_256x240.png); }
+.ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
+.ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
+.ui-state-highlight .ui-icon {background-image: url(images/ui-icons_2e83ff_256x240.png); }
+.ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_cd0a0a_256x240.png); }
+
+/* positioning */
+.ui-icon-carat-1-n { background-position: 0 0; }
+.ui-icon-carat-1-ne { background-position: -16px 0; }
+.ui-icon-carat-1-e { background-position: -32px 0; }
+.ui-icon-carat-1-se { background-position: -48px 0; }
+.ui-icon-carat-1-s { background-position: -64px 0; }
+.ui-icon-carat-1-sw { background-position: -80px 0; }
+.ui-icon-carat-1-w { background-position: -96px 0; }
+.ui-icon-carat-1-nw { background-position: -112px 0; }
+.ui-icon-carat-2-n-s { background-position: -128px 0; }
+.ui-icon-carat-2-e-w { background-position: -144px 0; }
+.ui-icon-triangle-1-n { background-position: 0 -16px; }
+.ui-icon-triangle-1-ne { background-position: -16px -16px; }
+.ui-icon-triangle-1-e { background-position: -32px -16px; }
+.ui-icon-triangle-1-se { background-position: -48px -16px; }
+.ui-icon-triangle-1-s { background-position: -64px -16px; }
+.ui-icon-triangle-1-sw { background-position: -80px -16px; }
+.ui-icon-triangle-1-w { background-position: -96px -16px; }
+.ui-icon-triangle-1-nw { background-position: -112px -16px; }
+.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
+.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
+.ui-icon-arrow-1-n { background-position: 0 -32px; }
+.ui-icon-arrow-1-ne { background-position: -16px -32px; }
+.ui-icon-arrow-1-e { background-position: -32px -32px; }
+.ui-icon-arrow-1-se { background-position: -48px -32px; }
+.ui-icon-arrow-1-s { background-position: -64px -32px; }
+.ui-icon-arrow-1-sw { background-position: -80px -32px; }
+.ui-icon-arrow-1-w { background-position: -96px -32px; }
+.ui-icon-arrow-1-nw { background-position: -112px -32px; }
+.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
+.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
+.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
+.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
+.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
+.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
+.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
+.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
+.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
+.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
+.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
+.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
+.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
+.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
+.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
+.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
+.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
+.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
+.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
+.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
+.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
+.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
+.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
+.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
+.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
+.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
+.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
+.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
+.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
+.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
+.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
+.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
+.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
+.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
+.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
+.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
+.ui-icon-arrow-4 { background-position: 0 -80px; }
+.ui-icon-arrow-4-diag { background-position: -16px -80px; }
+.ui-icon-extlink { background-position: -32px -80px; }
+.ui-icon-newwin { background-position: -48px -80px; }
+.ui-icon-refresh { background-position: -64px -80px; }
+.ui-icon-shuffle { background-position: -80px -80px; }
+.ui-icon-transfer-e-w { background-position: -96px -80px; }
+.ui-icon-transferthick-e-w { background-position: -112px -80px; }
+.ui-icon-folder-collapsed { background-position: 0 -96px; }
+.ui-icon-folder-open { background-position: -16px -96px; }
+.ui-icon-document { background-position: -32px -96px; }
+.ui-icon-document-b { background-position: -48px -96px; }
+.ui-icon-note { background-position: -64px -96px; }
+.ui-icon-mail-closed { background-position: -80px -96px; }
+.ui-icon-mail-open { background-position: -96px -96px; }
+.ui-icon-suitcase { background-position: -112px -96px; }
+.ui-icon-comment { background-position: -128px -96px; }
+.ui-icon-person { background-position: -144px -96px; }
+.ui-icon-print { background-position: -160px -96px; }
+.ui-icon-trash { background-position: -176px -96px; }
+.ui-icon-locked { background-position: -192px -96px; }
+.ui-icon-unlocked { background-position: -208px -96px; }
+.ui-icon-bookmark { background-position: -224px -96px; }
+.ui-icon-tag { background-position: -240px -96px; }
+.ui-icon-home { background-position: 0 -112px; }
+.ui-icon-flag { background-position: -16px -112px; }
+.ui-icon-calendar { background-position: -32px -112px; }
+.ui-icon-cart { background-position: -48px -112px; }
+.ui-icon-pencil { background-position: -64px -112px; }
+.ui-icon-clock { background-position: -80px -112px; }
+.ui-icon-disk { background-position: -96px -112px; }
+.ui-icon-calculator { background-position: -112px -112px; }
+.ui-icon-zoomin { background-position: -128px -112px; }
+.ui-icon-zoomout { background-position: -144px -112px; }
+.ui-icon-search { background-position: -160px -112px; }
+.ui-icon-wrench { background-position: -176px -112px; }
+.ui-icon-gear { background-position: -192px -112px; }
+.ui-icon-heart { background-position: -208px -112px; }
+.ui-icon-star { background-position: -224px -112px; }
+.ui-icon-link { background-position: -240px -112px; }
+.ui-icon-cancel { background-position: 0 -128px; }
+.ui-icon-plus { background-position: -16px -128px; }
+.ui-icon-plusthick { background-position: -32px -128px; }
+.ui-icon-minus { background-position: -48px -128px; }
+.ui-icon-minusthick { background-position: -64px -128px; }
+.ui-icon-close { background-position: -80px -128px; }
+.ui-icon-closethick { background-position: -96px -128px; }
+.ui-icon-key { background-position: -112px -128px; }
+.ui-icon-lightbulb { background-position: -128px -128px; }
+.ui-icon-scissors { background-position: -144px -128px; }
+.ui-icon-clipboard { background-position: -160px -128px; }
+.ui-icon-copy { background-position: -176px -128px; }
+.ui-icon-contact { background-position: -192px -128px; }
+.ui-icon-image { background-position: -208px -128px; }
+.ui-icon-video { background-position: -224px -128px; }
+.ui-icon-script { background-position: -240px -128px; }
+.ui-icon-alert { background-position: 0 -144px; }
+.ui-icon-info { background-position: -16px -144px; }
+.ui-icon-notice { background-position: -32px -144px; }
+.ui-icon-help { background-position: -48px -144px; }
+.ui-icon-check { background-position: -64px -144px; }
+.ui-icon-bullet { background-position: -80px -144px; }
+.ui-icon-radio-off { background-position: -96px -144px; }
+.ui-icon-radio-on { background-position: -112px -144px; }
+.ui-icon-pin-w { background-position: -128px -144px; }
+.ui-icon-pin-s { background-position: -144px -144px; }
+.ui-icon-play { background-position: 0 -160px; }
+.ui-icon-pause { background-position: -16px -160px; }
+.ui-icon-seek-next { background-position: -32px -160px; }
+.ui-icon-seek-prev { background-position: -48px -160px; }
+.ui-icon-seek-end { background-position: -64px -160px; }
+.ui-icon-seek-start { background-position: -80px -160px; }
+/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
+.ui-icon-seek-first { background-position: -80px -160px; }
+.ui-icon-stop { background-position: -96px -160px; }
+.ui-icon-eject { background-position: -112px -160px; }
+.ui-icon-volume-off { background-position: -128px -160px; }
+.ui-icon-volume-on { background-position: -144px -160px; }
+.ui-icon-power { background-position: 0 -176px; }
+.ui-icon-signal-diag { background-position: -16px -176px; }
+.ui-icon-signal { background-position: -32px -176px; }
+.ui-icon-battery-0 { background-position: -48px -176px; }
+.ui-icon-battery-1 { background-position: -64px -176px; }
+.ui-icon-battery-2 { background-position: -80px -176px; }
+.ui-icon-battery-3 { background-position: -96px -176px; }
+.ui-icon-circle-plus { background-position: 0 -192px; }
+.ui-icon-circle-minus { background-position: -16px -192px; }
+.ui-icon-circle-close { background-position: -32px -192px; }
+.ui-icon-circle-triangle-e { background-position: -48px -192px; }
+.ui-icon-circle-triangle-s { background-position: -64px -192px; }
+.ui-icon-circle-triangle-w { background-position: -80px -192px; }
+.ui-icon-circle-triangle-n { background-position: -96px -192px; }
+.ui-icon-circle-arrow-e { background-position: -112px -192px; }
+.ui-icon-circle-arrow-s { background-position: -128px -192px; }
+.ui-icon-circle-arrow-w { background-position: -144px -192px; }
+.ui-icon-circle-arrow-n { background-position: -160px -192px; }
+.ui-icon-circle-zoomin { background-position: -176px -192px; }
+.ui-icon-circle-zoomout { background-position: -192px -192px; }
+.ui-icon-circle-check { background-position: -208px -192px; }
+.ui-icon-circlesmall-plus { background-position: 0 -208px; }
+.ui-icon-circlesmall-minus { background-position: -16px -208px; }
+.ui-icon-circlesmall-close { background-position: -32px -208px; }
+.ui-icon-squaresmall-plus { background-position: -48px -208px; }
+.ui-icon-squaresmall-minus { background-position: -64px -208px; }
+.ui-icon-squaresmall-close { background-position: -80px -208px; }
+.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
+.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
+.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
+.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
+.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
+.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
+
+
+/* Misc visuals
+----------------------------------*/
+
+/* Corner radius */
+.ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; }
+.ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
+.ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
+.ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
+.ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; }
+.ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
+.ui-corner-right {  -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }
+.ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }
+.ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; }
+
+/* Overlays */
+.ui-widget-overlay { background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); }
+.ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; border-radius: 8px; }/* Resizable
+----------------------------------*/
+.ui-resizable { position: relative;}
+.ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;}
+.ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
+.ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
+.ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
+.ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
+.ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
+.ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
+.ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
+.ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
+.ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* Button
+----------------------------------*/
+
+.ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
+.ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
+button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
+.ui-button-icons-only { width: 3.4em; } 
+button.ui-button-icons-only { width: 3.7em; } 
+
+/*button text element */
+.ui-button .ui-button-text { display: block; line-height: 1.4;  }
+.ui-button-text-only .ui-button-text { padding: .4em 1em; }
+.ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
+.ui-button-text-icon .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
+.ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
+/* no icon support for input elements, provide padding by default */
+input.ui-button { padding: .4em 1em; }
+
+/*button icon element(s) */
+.ui-button-icon-only .ui-icon, .ui-button-text-icon .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
+.ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
+.ui-button-text-icon .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
+.ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
+
+/*button sets*/
+.ui-buttonset { margin-right: 7px; }
+.ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
+
+/* workarounds */
+button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
+
+
+
+
+
+/* Dialog
+----------------------------------*/
+.ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
+.ui-dialog .ui-dialog-titlebar { padding: .5em 1em .3em; position: relative;  }
+.ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .2em 0; } 
+.ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
+.ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
+.ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
+.ui-dialog .ui-dialog-content { border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
+.ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
+.ui-dialog .ui-dialog-buttonpane button { float: right; margin: .5em .4em .5em 0; cursor: pointer; padding: .2em .6em .3em .6em; line-height: 1.4em; width:auto; overflow:visible; }
+.ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
+.ui-draggable .ui-dialog-titlebar { cursor: move; }





More information about the commits mailing list